Jelajahi Sumber

补录订单

xuqiang 1 tahun lalu
induk
melakukan
090c8c1abd
78 mengubah file dengan 3263 tambahan dan 125 penghapusan
  1. 30 26
      authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java
  2. 10 0
      authentication/src/main/java/com/jzg/config/JzgUsernamePasswordAuthenticationToken.java
  3. 1 1
      authentication/src/main/java/com/jzg/config/SecurityConfig.java
  4. 163 0
      authentication/src/main/java/com/jzg/controller/AppAuthController.java
  5. 148 0
      authentication/src/main/java/com/jzg/controller/SendSmsCodeController.java
  6. 28 0
      authentication/src/main/java/com/jzg/entity/vo/AppLoginFormVo.java
  7. 23 0
      authentication/src/main/java/com/jzg/entity/vo/AppSmsCodeLogin.java
  8. 29 0
      authentication/src/main/java/com/jzg/entity/vo/ModifyAppLoginVo.java
  9. 3 0
      authentication/src/main/java/com/jzg/filter/TokenAuthenticationFilter.java
  10. 10 0
      authentication/src/main/java/com/jzg/mapper/SysUserJzgInfoMapper.java
  11. 8 0
      commons/pom.xml
  12. 76 0
      commons/src/main/java/com/jzg/commons/config/DictEnumConfig.java
  13. 28 0
      commons/src/main/java/com/jzg/commons/constants/DictEnum.java
  14. 32 0
      commons/src/main/java/com/jzg/commons/constants/DictionaryData.java
  15. 38 0
      commons/src/main/java/com/jzg/commons/constants/DictionaryManagement.java
  16. 19 0
      commons/src/main/java/com/jzg/commons/constants/IBaseEnum.java
  17. 116 0
      commons/src/main/java/com/jzg/commons/constants/OrderCacheConstant.java
  18. 11 0
      commons/src/main/java/com/jzg/commons/constants/RedisKeyConstants.java
  19. 32 0
      commons/src/main/java/com/jzg/commons/entity/dto/InsOrdersAdd.java
  20. 11 0
      commons/src/main/java/com/jzg/commons/entity/dto/InsOrdersParam.java
  21. 23 0
      commons/src/main/java/com/jzg/commons/entity/dto/InsuranceInfo.java
  22. 12 17
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrders.java
  23. 12 11
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersCarInfo.java
  24. 17 11
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersCarUserInfo.java
  25. 1 6
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersKind.java
  26. 55 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersOther.java
  27. 7 10
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersRisk.java
  28. 5 9
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersTax.java
  29. 61 0
      commons/src/main/java/com/jzg/commons/entity/vo/BusinessLicense.java
  30. 65 0
      commons/src/main/java/com/jzg/commons/entity/vo/CardUserInfo.java
  31. 93 0
      commons/src/main/java/com/jzg/commons/entity/vo/CustomerInfoVO.java
  32. 39 0
      commons/src/main/java/com/jzg/commons/entity/vo/InsOrdersVo.java
  33. 36 0
      commons/src/main/java/com/jzg/commons/util/ObjectUtil.java
  34. 1 0
      gateway/src/main/java/com/jzg/config/CorsConfig.java
  35. 4 17
      platform/src/main/java/com/jzg/service/impl/JyxConfigServiceImpl.java
  36. 0 5
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/response/InsurePremiumResponse.java
  37. 27 0
      tenant/insurance/quotation-commons/pom.xml
  38. 1 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/aggregated/InsuranceUploadImageVo.java
  39. 5 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/quote/CarInfoVo.java
  40. 157 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/AuthServiceUtils.java
  41. 66 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/BusinessLicenseRecognitionUtils.java
  42. 77 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/HttpUtil.java
  43. 151 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/Idcard.java
  44. 137 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/ImageCompressionUtils.java
  45. 224 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/MultiObjectDetectUtils.java
  46. 167 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/SnowFlakeUtil.java
  47. 12 0
      tenant/insurance/quotation-dajia/pom.xml
  48. 28 11
      tenant/insurance/quotation-summary/pom.xml
  49. 47 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/IdentifyController.java
  50. 58 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsOrdersController.java
  51. 10 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersCarInfoMapper.java
  52. 10 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersCarUserInfoMapper.java
  53. 9 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersKindMapper.java
  54. 20 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersMapper.java
  55. 10 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersOtherMapper.java
  56. 9 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersRiskMapper.java
  57. 9 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersTaxMapper.java
  58. 37 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/IdentifyService.java
  59. 7 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersCarInfoService.java
  60. 7 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersCarUserInfoService.java
  61. 7 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersKindService.java
  62. 7 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersOtherService.java
  63. 7 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersRiskService.java
  64. 25 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersService.java
  65. 7 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersTaxService.java
  66. 220 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/IdentifyServiceImpl.java
  67. 11 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersCarInfoServiceImpl.java
  68. 11 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersCarUserInfoServiceImpl.java
  69. 11 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersKindServiceImpl.java
  70. 11 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersOtherServiceImpl.java
  71. 11 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersRiskServiceImpl.java
  72. 139 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  73. 11 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersTaxServiceImpl.java
  74. 12 1
      tenant/insurance/quotation-summary/src/main/resources/application.yaml
  75. 209 0
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml
  76. 12 0
      tenant/insurance/quotation-zhongmei/pom.xml
  77. 12 0
      tenant/insurance/quotation-zijin/pom.xml
  78. 8 0
      tenant/organization/pom.xml

+ 30 - 26
authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java

@@ -24,6 +24,7 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -113,8 +114,8 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
         List<JzgGrantedAuthority> authorities = userPerms.stream()
                 .map(perms -> new JzgGrantedAuthority(perms.getSysCode(),perms.getPermsId(),perms.getPerms()))
                 .collect(Collectors.toList());
-
-        if(!authorities.stream().anyMatch(x->x.getSystem().equals(system)) && !username.equals("admin")){
+        //APP 是手机端,不进行权限校验
+        if(!authorities.stream().anyMatch(x->x.getSystem().equals(system)) && !username.equals("admin") && !StringUtils.equals("APP",system)){
             throw new SystemException("没有权限访问系统");
         }
         SysUserJzgVo jzgUserInfo = new SysUserJzgVo();
@@ -134,35 +135,38 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
 
         //角色数据权限
         List<String> roleIds = userPerms.stream().map(x -> x.getRoleId()).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
-        List<SysRoleDataScope> sysRoleDataScopes = sysRoleDataScopeMapper.selectList(new LambdaQueryWrapper<SysRoleDataScope>()
-                .in(SysRoleDataScope::getRoleId, roleIds));
         //设置角色数据权限
         SysRoleDataScopeVo sysRoleDataScopeVo = new SysRoleDataScopeVo();
-        if(!username.equals("admin") && !SystemConstants.SYSTEM_PLATFORM.getCode().equals(system)) {
-
-            String dataMark = "";
-            List<String> dataDeptIds = new ArrayList<>();
-            if (sysRoleDataScopes.stream().filter(x -> x.getDataMark().equals("2")).count() > 0) {
-                dataMark = "2";
-                sysRoleDataScopeVo.setDataMark("2");
-            } else {
-                List<SysRoleDataScope> dataScopes = sysRoleDataScopes.stream().filter(x -> x.getDataMark().equals("1")).collect(Collectors.toList());
-                dataDeptIds.add(jzgUserInfo.getDeptId());
-                if (!dataScopes.isEmpty()) {
-                    sysRoleDataScopeVo.setDataMark("1");
-                    sysRoleDataScopeVo.setDeptIds(dataDeptIds);
-                }
-                List<SysRoleDataScope> dataScopes3 = sysRoleDataScopes.stream().filter(x -> x.getDataMark().equals("3")).collect(Collectors.toList());
-                List<String> dataScopeLinkRoleIds = dataScopes3.stream().map(x -> x.getRoleId()).collect(Collectors.toList());
-                if(!dataScopeLinkRoleIds.isEmpty()) {
-                    List<SysRoleDataScopeLink> sysRoleDataScopeLinks = sysRoleDataScopeLinkMapper.selectList(new LambdaQueryWrapper<SysRoleDataScopeLink>()
-                            .in(SysRoleDataScopeLink::getRoleId, dataScopeLinkRoleIds));
-                    List<String> deptIds = sysRoleDataScopeLinks.stream().map(x -> x.getDeptId()).collect(Collectors.toList());
-                    sysRoleDataScopeVo.setDataMark("3");
-                    sysRoleDataScopeVo.setDeptIds(deptIds);
+        if (!CollectionUtils.isEmpty(roleIds)){
+            List<SysRoleDataScope> sysRoleDataScopes = sysRoleDataScopeMapper.selectList(new LambdaQueryWrapper<SysRoleDataScope>()
+                    .in(SysRoleDataScope::getRoleId, roleIds));
+            if(!username.equals("admin") && !SystemConstants.SYSTEM_PLATFORM.getCode().equals(system)) {
+
+                String dataMark = "";
+                List<String> dataDeptIds = new ArrayList<>();
+                if (sysRoleDataScopes.stream().filter(x -> x.getDataMark().equals("2")).count() > 0) {
+                    dataMark = "2";
+                    sysRoleDataScopeVo.setDataMark("2");
+                } else {
+                    List<SysRoleDataScope> dataScopes = sysRoleDataScopes.stream().filter(x -> x.getDataMark().equals("1")).collect(Collectors.toList());
+                    dataDeptIds.add(jzgUserInfo.getDeptId());
+                    if (!dataScopes.isEmpty()) {
+                        sysRoleDataScopeVo.setDataMark("1");
+                        sysRoleDataScopeVo.setDeptIds(dataDeptIds);
+                    }
+                    List<SysRoleDataScope> dataScopes3 = sysRoleDataScopes.stream().filter(x -> x.getDataMark().equals("3")).collect(Collectors.toList());
+                    List<String> dataScopeLinkRoleIds = dataScopes3.stream().map(x -> x.getRoleId()).collect(Collectors.toList());
+                    if(!dataScopeLinkRoleIds.isEmpty()) {
+                        List<SysRoleDataScopeLink> sysRoleDataScopeLinks = sysRoleDataScopeLinkMapper.selectList(new LambdaQueryWrapper<SysRoleDataScopeLink>()
+                                .in(SysRoleDataScopeLink::getRoleId, dataScopeLinkRoleIds));
+                        List<String> deptIds = sysRoleDataScopeLinks.stream().map(x -> x.getDeptId()).collect(Collectors.toList());
+                        sysRoleDataScopeVo.setDataMark("3");
+                        sysRoleDataScopeVo.setDeptIds(deptIds);
+                    }
                 }
             }
         }
+
         java.util.Map<String, Object> detailMap = new java.util.HashMap<>();
         detailMap.put("systemcode", system);
         detailMap.put("deptId",jzgUserInfo.getDeptId());

+ 10 - 0
authentication/src/main/java/com/jzg/config/JzgUsernamePasswordAuthenticationToken.java

@@ -1,5 +1,6 @@
 package com.jzg.config;
 
+import com.jzg.entity.vo.AppLoginFormVo;
 import com.jzg.entity.vo.LoginFormVo;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 
@@ -27,6 +28,13 @@ public class JzgUsernamePasswordAuthenticationToken extends UsernamePasswordAuth
         this.captcha = captcha;
     }
 
+
+    public JzgUsernamePasswordAuthenticationToken(AppLoginFormVo loginFormVo) {
+        super(loginFormVo.getMobile(),loginFormVo.getPassWord());
+        this.captchaId = loginFormVo.getCaptchaId();
+        this.system = loginFormVo.getSystem();
+    }
+
     public JzgUsernamePasswordAuthenticationToken(LoginFormVo loginFormVo){
         super(loginFormVo.getUserName(),loginFormVo.getPassWord());
         this.system = loginFormVo.getSystem();
@@ -47,4 +55,6 @@ public class JzgUsernamePasswordAuthenticationToken extends UsernamePasswordAuth
     public String getCaptcha(){
         return this.captcha;
     }
+
+
 }

+ 1 - 1
authentication/src/main/java/com/jzg/config/SecurityConfig.java

@@ -77,7 +77,7 @@ public class SecurityConfig {
         http.csrf().disable();
         http.authorizeHttpRequests(auth -> auth
                         .requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger-resources/**", "/webjars/**", "/favicon.ico",
-                                "/auth/login","/auth/captchaById","/auth/register").permitAll()
+                                "/auth/login","/auth/captchaById","/auth/register","/sendSmsCode","/appLogin","/smsCodeLogin").permitAll()
                         .anyRequest().authenticated()  // 其他接口需认证
                 )
 //                .formLogin((form) -> form

+ 163 - 0
authentication/src/main/java/com/jzg/controller/AppAuthController.java

@@ -0,0 +1,163 @@
+package com.jzg.controller;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jzg.commons.constants.RedisKeyConstants;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.po.SysUserJzgInfo;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.util.PasswordUtils;
+import com.jzg.config.JzgTokenService;
+import com.jzg.config.JzgUsernamePasswordAuthenticationToken;
+import com.jzg.entity.SysUser;
+import com.jzg.entity.vo.AppLoginFormVo;
+import com.jzg.entity.vo.AppSmsCodeLogin;
+import com.jzg.entity.vo.ModifyAppLoginVo;
+import com.jzg.handler.JzgAuthenticationSuccessHandler;
+import com.jzg.mapper.SysUserJzgInfoMapper;
+import com.jzg.service.SysUserService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.io.IOException;
+import java.util.Objects;
+import java.util.regex.Pattern;
+
+@Slf4j
+@Tag(name="APP授权接口")
+@RestController
+@RequestMapping
+public class AppAuthController {
+
+    @Autowired
+    private JzgTokenService tokenStore;
+
+    @Autowired
+    SysUserService sysUserService;
+
+    @Autowired
+    private SysUserJzgInfoMapper sysUserJzgInfoMapper;
+
+    @Autowired
+    RedissonClient redissonClient;
+
+    @Autowired
+    AuthenticationManager authenticationManager;
+
+    @Operation(summary = "登录接口",
+            description = "登录接口",
+            responses = {
+                    @ApiResponse(responseCode = "200",description = "登录成功"),
+                    @ApiResponse(responseCode = "403",description = "登录失败")
+            })
+    @PostMapping("appLogin")
+    public void login(@RequestBody AppLoginFormVo loginFormVo) throws ServletException, IOException {
+        SysUser sysUser = sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getMobile, loginFormVo.getMobile()));
+        modifyPass(loginFormVo);
+    }
+
+
+    public void modifyPass(AppLoginFormVo loginFormVo) throws ServletException, IOException {
+        loginFormVo.setSystem("APP");
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+        JzgUsernamePasswordAuthenticationToken authentication = new JzgUsernamePasswordAuthenticationToken(loginFormVo);
+        Authentication authenticate = authenticationManager.authenticate(authentication);
+        SecurityContextHolder.getContext().setAuthentication(authenticate);
+        JzgAuthenticationSuccessHandler successHandler = new JzgAuthenticationSuccessHandler(tokenStore);
+        successHandler.onAuthenticationSuccess(request, response, authenticate);
+    }
+
+
+
+    @PostMapping("modifyPass")
+    @Operation(summary = "修改密码")
+    public HttpResult modifyPass(@RequestBody ModifyAppLoginVo appLoginVo){
+        SysUser sysUser = sysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getUsername, appLoginVo.getMobile())
+                .or()
+                .eq(SysUser::getMobile, appLoginVo.getMobile()));
+        //检验密码
+        String passwordPattern = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,20}$";
+        Pattern pattern = Pattern.compile(passwordPattern);
+        if(!pattern.matcher(appLoginVo.getNewPassWord()).matches()){
+            throw new SystemException("密码格式错误");
+        }
+        //如果旧密码一致更改密码
+        if(!PasswordUtils.encode(appLoginVo.getOldPassWord(),sysUser.getSalt()).equals(sysUser.getPassword()))
+        {
+            throw new SystemException("旧密码错误");
+        }
+        sysUser.setPassword(PasswordUtils.encode(appLoginVo.getNewPassWord(),sysUser.getSalt()));
+        return sysUserService.updateById(sysUser) ? HttpResult.ok("密码修改成功") : HttpResult.error("密码修改失败");
+    }
+
+
+
+
+    @Operation(summary = "短信验证码登录")
+    @PostMapping("smsCodeLogin")
+    public HttpResult smsCodeLogin(@RequestBody AppSmsCodeLogin smsCodeLogin){
+
+        SysUser sysUser = sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getMobile, smsCodeLogin.getMobile()).or().eq(SysUser::getUsername, smsCodeLogin.getMobile()));
+        if (ObjectUtil.isNotEmpty(sysUser)){
+            return HttpResult.error("手机号已注册,请使用密码登录");
+        }
+   //     RBucket<Object> bucket = redissonClient.getBucket(RedisKeyConstants.SMS_CODE_KEY);
+//        if (Objects.isNull(bucket)){
+//            return HttpResult.error("短信验证码已过期");
+//        }
+//        String smsCode = bucket.get().toString();
+//        if (Objects.isNull(smsCode)){
+//            return HttpResult.error("短信验证码已过期");
+//        }
+//        if (!Objects.equals(smsCodeLogin.getSmsCode(), smsCode)){
+//            return HttpResult.error("短信验证码错误");
+//        }
+        register(smsCodeLogin);
+        return HttpResult.ok();
+    }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    public void register(AppSmsCodeLogin smsCodeLogin){
+        SysUser sysUser = new SysUser();
+        sysUser.setMobile(smsCodeLogin.getMobile());
+        sysUser.setUsername(smsCodeLogin.getMobile());
+        String salt = PasswordUtils.getSalt();
+        sysUser.setSalt(salt);
+        sysUser.setPassword(PasswordUtils.encode("12345678",salt));
+        sysUserService.save(sysUser);
+        SysUserJzgInfo sysUserJzgInfo = new SysUserJzgInfo();
+        sysUserJzgInfo.setName(sysUser.getMobile());
+        sysUserJzgInfo.setUserId(sysUser.getId());
+        sysUserJzgInfo.setMobile(sysUser.getMobile());
+        sysUserJzgInfo.setStatus(0);
+        sysUserJzgInfo.setSystemCode("APP");
+        sysUserJzgInfo.setTypeAttr("4");
+        sysUserJzgInfo.setIsDelete(0);
+        sysUserJzgInfo.setCreateBy(sysUser.getId());
+        sysUserJzgInfoMapper.insert(sysUserJzgInfo);
+
+    }
+
+}

+ 148 - 0
authentication/src/main/java/com/jzg/controller/SendSmsCodeController.java

@@ -0,0 +1,148 @@
+package com.jzg.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.jzg.commons.constants.RedisKeyConstants;
+import com.jzg.commons.core.page.HttpResult;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@Tag(name="授权接口")
+@RestController
+@RequestMapping
+public class SendSmsCodeController {
+
+
+    // TODO 接口请求地址
+    public static final String URL = "http://v.juhe.cn/sms/send?mobile=%s&tpl_id=%s&tpl_value=%s&key=%s";
+    // TODO: 您需要改为自己的请求key
+    public static final String KEY = "fbe7b165e9e13e52f3b1f2654eab9c0e";
+    // TODO: 您需要改为自己的模板id
+    public static final int TPL_ID = 267301;
+
+
+    @Autowired
+    RedissonClient redissonClient;
+
+
+    @GetMapping("/sendSmsCode")
+    public HttpResult send(String mobile) {
+        RBucket<Object> bucket = redissonClient.getBucket(RedisKeyConstants.SMS_CODE_KEY + mobile);
+        if (ObjectUtil.isNotEmpty(bucket)){
+            bucket.delete();
+        }
+        int min = 100000;
+        int max = 999999;
+        String code = String.valueOf((int) (Math.random()* (max - min + 1)) + min);
+        if (!print(mobile, code)){
+            return  HttpResult.error("短信验证码发送失败");
+        }
+        redissonClient.getBucket(RedisKeyConstants.SMS_CODE_KEY + mobile).set(code, 120, TimeUnit.SECONDS);
+        return HttpResult.ok();
+    }
+
+
+    /**
+     * 打印请求结果
+     * @param mobile   手机号
+     * @param variable 模板变量
+     */
+    public  boolean print(String mobile, String variable) {
+        String url = null;
+        try {
+            url = String.format(URL, mobile, TPL_ID, URLEncoder.encode("#code#=" + variable, "utf-8"), KEY);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        JSONObject jsonObject = JSONObject.parseObject(doGet(url));
+        int error_code = jsonObject.getIntValue("error_code");
+        if (error_code == 0) {
+            return true;
+        } else {
+            log.error("错误码:{}", error_code);
+            log.error("错误信息:{}", jsonObject.getString("reason"));
+            return false;
+        }
+
+    }
+
+    /**
+     * get方式的http请求
+     * @param httpUrl 请求地址
+     * @return 返回结果
+     */
+    public static String doGet(String httpUrl) {
+        HttpURLConnection connection = null;
+        InputStream inputStream = null;
+        BufferedReader bufferedReader = null;
+        String result = null;// 返回结果字符串
+        try {
+            // 创建远程url连接对象
+            java.net.URL url = new URL(httpUrl);
+            // 通过远程url连接对象打开一个连接,强转成httpURLConnection类
+            connection = (HttpURLConnection) url.openConnection();
+            // 设置连接方式:get
+            connection.setRequestMethod("GET");
+            // 设置连接主机服务器的超时时间:15000毫秒
+            connection.setConnectTimeout(15000);
+            // 设置读取远程返回的数据时间:60000毫秒
+            connection.setReadTimeout(60000);
+            // 发送请求
+            connection.connect();
+            // 通过connection连接,获取输入流
+            if (connection.getResponseCode() == 200) {
+                inputStream = connection.getInputStream();
+                // 封装输入流,并指定字符集
+                bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
+                // 存放数据
+                StringBuilder sbf = new StringBuilder();
+                String temp;
+                while ((temp = bufferedReader.readLine()) != null) {
+                    sbf.append(temp);
+                    sbf.append(System.getProperty("line.separator"));
+                }
+                result = sbf.toString();
+            }
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            // 关闭资源
+            if (null != bufferedReader) {
+                try {
+                    bufferedReader.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != inputStream) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+        return result;
+    }
+
+
+
+}

+ 28 - 0
authentication/src/main/java/com/jzg/entity/vo/AppLoginFormVo.java

@@ -0,0 +1,28 @@
+package com.jzg.entity.vo;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+@Schema(description = "APP登录表单VO")
+public class AppLoginFormVo {
+
+
+    @Schema(description = "账号")
+    @NotBlank(message = "请输入手机号")
+    private String mobile;
+
+    @Schema(description = "密码")
+    @NotBlank(message = "请输入密码")
+    private String passWord;
+
+    @Schema(description = "系统code")
+    private String system;
+
+    @Schema(description = "验证码id")
+    private String captchaId;
+
+
+}

+ 23 - 0
authentication/src/main/java/com/jzg/entity/vo/AppSmsCodeLogin.java

@@ -0,0 +1,23 @@
+package com.jzg.entity.vo;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+@Schema(description = "APP短信验证码登录表单VO")
+public class AppSmsCodeLogin {
+
+
+    @Schema(description = "手机号")
+    @NotBlank(message = "请输入手机号")
+    private String mobile;
+
+
+    @Schema(description = "短信验证码")
+    @NotBlank(message = "请输入短信验证码")
+    private String smsCode;
+
+
+}

+ 29 - 0
authentication/src/main/java/com/jzg/entity/vo/ModifyAppLoginVo.java

@@ -0,0 +1,29 @@
+package com.jzg.entity.vo;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+@Schema(description = "APP修改密码表单Vo")
+public class ModifyAppLoginVo {
+
+    @Schema(description = "手机号")
+    @NotBlank(message = "请输入手机号")
+    private String mobile;
+
+    @NotBlank(message = "请输入旧密码")
+    @Schema(description = "旧密码")
+    private String oldPassWord;
+
+    @NotBlank(message = "请输入新密码")
+    @Schema(description = "新密码")
+    private String newPassWord;
+
+    @Schema(description = "短信验证码")
+    @NotBlank(message = "请输入短信验证码")
+    private String smsCode;
+
+
+}

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

@@ -44,6 +44,9 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter {
         doList.add("/swagger-ui/");
         doList.add("/v3/api-docs");
         doList.add("/webjars/");
+        doList.add("/sendSmsCode");
+        doList.add("/appLogin");
+        doList.add("/smsCodeLogin");
         String path = request.getRequestURI();
         for (String pattern : doList) {
             // 使用正则表达式匹配  .* 匹配所有以 pattern 开头的路径

+ 10 - 0
authentication/src/main/java/com/jzg/mapper/SysUserJzgInfoMapper.java

@@ -0,0 +1,10 @@
+package com.jzg.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.po.SysUserJzgInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysUserJzgInfoMapper extends BaseMapper<SysUserJzgInfo> {
+
+}

+ 8 - 0
commons/pom.xml

@@ -68,5 +68,13 @@
             <version>3.3.2</version>
             <scope>compile</scope>
         </dependency>
+
+
+        <dependency>
+            <groupId>org.reflections</groupId>
+            <artifactId>reflections</artifactId>
+            <version>0.9.10</version>
+        </dependency>
+
     </dependencies>
 </project>

+ 76 - 0
commons/src/main/java/com/jzg/commons/config/DictEnumConfig.java

@@ -0,0 +1,76 @@
+package com.jzg.commons.config;
+
+import com.jzg.commons.constants.DictEnum;
+import com.jzg.commons.constants.DictionaryData;
+import com.jzg.commons.constants.DictionaryManagement;
+import com.jzg.commons.constants.IBaseEnum;
+import lombok.Data;
+import org.reflections.Reflections;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 枚举类  字典配置
+ *
+ * @author: lig
+ * @date: 2023年04月10日 0010
+ */
+@Component
+@Data
+public class DictEnumConfig implements InitializingBean {
+
+    private static Map<String, DictionaryManagement> dmMap = new HashMap<>();
+
+    public static Map<String, DictionaryManagement> getDmMap() {
+        return dmMap;
+    }
+
+
+    public static List<DictionaryManagement> dictManageList;
+
+
+    private static void setDmMap(Map<String, DictionaryManagement> dmMap) {
+        DictEnumConfig.dmMap = dmMap;
+    }
+
+
+    @Override
+    public void afterPropertiesSet() {
+        Reflections reflections = new Reflections("com.ydtech.constants.enums.dict");
+        Set<Class<? extends IBaseEnum>> monitorClasses = reflections.getSubTypesOf(IBaseEnum.class);
+//        List<DictionaryManagement> dmList = new ArrayList<>();
+        dictManageList = new ArrayList<DictionaryManagement>();
+        monitorClasses.forEach(m -> {
+            if (m.isAnnotationPresent(DictEnum.class)) {
+                DictEnum dictEnum = m.getAnnotation(DictEnum.class);
+                DictionaryManagement dictionaryManagement = new DictionaryManagement();
+//                dictionaryManagement.setEnumFlag(Boolean.TRUE);
+                dictionaryManagement.setDictType(dictEnum.key());
+                dictionaryManagement.setDictName(dictEnum.desc());
+//                dictionaryManagement.setStatus(0);
+//                dictionaryManagement.setSysDictFlag(Boolean.TRUE);
+
+                List<DictionaryData> ddList = new ArrayList<>();
+                DictionaryData dictionaryData;
+                IBaseEnum[] enumConstants = m.getEnumConstants();
+                for (IBaseEnum baseEnum : enumConstants) {
+                    dictionaryData = new DictionaryData();
+                    dictionaryData.setDictValue(baseEnum.getCode());
+                    dictionaryData.setDictTag(baseEnum.getDesc());
+                    dictionaryData.setSort(baseEnum.getSort());
+                    dictionaryData.setStatus(baseEnum.getStatus());
+                    ddList.add(dictionaryData);
+                }
+                dictionaryManagement.setDdList(ddList);
+                dictManageList.add(dictionaryManagement);
+            }
+        });
+
+        setDmMap(dictManageList.stream().collect(Collectors.toMap(DictionaryManagement::getDictType, Function.identity())));
+    }
+
+}

+ 28 - 0
commons/src/main/java/com/jzg/commons/constants/DictEnum.java

@@ -0,0 +1,28 @@
+package com.jzg.commons.constants;
+
+import java.lang.annotation.*;
+
+/**
+ * 枚举类  字典注解
+ *
+ * @author: lig
+ * @date: 2023年04月10日 0010
+ */
+@Target({ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+@Documented
+public @interface DictEnum {
+
+    /**
+     * 字典标识
+     */
+    String key() default "";
+
+    /**
+     * 字典标识名称
+     */
+    String desc() default "";
+
+
+}

+ 32 - 0
commons/src/main/java/com/jzg/commons/constants/DictionaryData.java

@@ -0,0 +1,32 @@
+package com.jzg.commons.constants;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(defaultValue = "DictionaryData", description = "字典数据")
+public class DictionaryData {
+
+//    @ApiModelProperty("字典id")
+//    private Long dictMgtId;
+
+    @Schema(defaultValue = "标签")
+    private String dictTag;
+
+    @Schema(defaultValue = "键值")
+    private String dictValue;
+
+    @Schema(defaultValue = "排序")
+    private Integer sort;
+
+    @Schema(defaultValue = "状态 0.启用 1.停用")
+    private Integer status;
+
+
+}

+ 38 - 0
commons/src/main/java/com/jzg/commons/constants/DictionaryManagement.java

@@ -0,0 +1,38 @@
+package com.jzg.commons.constants;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(defaultValue = "DictionaryManagement", description = "字典管理")
+public class DictionaryManagement {
+
+    @Schema(defaultValue = "名称")
+    private String dictName;
+
+    @Schema(defaultValue = "类型")
+    private String dictType;
+
+//    @ApiModelProperty("是否系统变量")
+//    private Boolean sysDictFlag;
+
+//    @ApiModelProperty("状态 0.启用 1.禁用")
+//    private Integer status;
+
+    //    @TableField(exist = false)
+    private List<DictionaryData> ddList;
+
+//    @TableField(exist = false)
+//    @ApiModelProperty("是否枚举类")
+//    private Boolean enumFlag = Boolean.FALSE;
+
+
+}

+ 19 - 0
commons/src/main/java/com/jzg/commons/constants/IBaseEnum.java

@@ -0,0 +1,19 @@
+package com.jzg.commons.constants;
+
+public interface IBaseEnum {
+
+    /**
+     * 获取枚举描述
+     *
+     * @return 枚举描述
+     */
+    String getDesc();
+
+    String getCode();
+
+    Integer getSort();
+
+    Integer getStatus();
+
+
+}

+ 116 - 0
commons/src/main/java/com/jzg/commons/constants/OrderCacheConstant.java

@@ -0,0 +1,116 @@
+package com.jzg.commons.constants;
+
+/**
+ * @description: 订单相关缓存常量
+ * @author: wenks
+ * @date: 2023/8/19 9:51
+ **/
+public class OrderCacheConstant {
+
+    private OrderCacheConstant() {
+        throw new IllegalStateException("Utility class");
+    }
+
+    /**
+     * 订单缓存
+     */
+    public static final String QUOTE_INFO_KEY = "ins:orders:";
+
+    /**
+     * 订单缓存时间
+     */
+    public static final long QUOTE_INFO_KEY_TIME = 1L;
+
+    /**
+     * 核保规则
+     */
+    public static final String QUOTE_RULES_KEY = "ins:rules:";
+
+    /**
+     * 核保规则时间
+     */
+    public static final long QUOTE_RULES_KEY_TIME = 1L;
+
+    /**
+     * VIN查询Key
+     */
+    public static final String VIN_SEARCH_KEY = "vin:search:";
+
+    /**
+     * 品牌型号查询Key
+     */
+    public static final String BRAND_MODEL_KEY = "brand:model:";
+
+    /**
+     * VIN查询Key存储时间 单位(小时)
+     */
+    public static final long VIN_SEARCH_KEY_TIME = 1L;
+
+    /**
+     * 永城意外险存储时间
+     */
+    public static final long YC_ACCIDENTAL_DRIVING_TIME = 1L;
+
+    /**
+     * 永城协议存储key
+     */
+    public static final String YC_AGREEMENT_KEY = "yc:agreement:";
+
+    /**
+     * 永城协议详情存储key
+     */
+    public static final String YC_AGREEMENT_INFO_KEY = "yc:agreement:info:";
+
+    /**
+     * 国任特别约定 key
+     */
+    public static final String GR_SPECIAL_AGREEMENT_KEY = "gr:specialAgreement:";
+
+
+    /**
+     * 图片识别 key
+     */
+    public static final String IMAGE_IDENTIFY_KEY = "image:identify:";
+
+    /**
+     * 国任特别约定 存储时间
+     */
+    public static final long GR_SPECIAL_AGREEMENT_TIME = 1L;
+
+    /**
+     * 紫金财险 为接入方提供获取token
+     */
+    public static final String ZJ_ACCESS_TOKEN = "zj:accessToken:";
+
+    /**
+     * 诚泰财险 为接入方提供获取token
+     */
+    public static final String CT_ACCESS_TOKEN = "ct:accessToken:";
+
+    /**
+     * token 锁
+     */
+    public static final String ZJ_ACCESS_LOCK = "zj:accessLock:";
+
+    /**
+     * token 锁
+     */
+    public static final String CT_ACCESS_LOCK = "ct:accessLock:";
+
+
+    /**
+     * 紫金财险 为接入方提供获取token时间
+     */
+    public static final long ZJ_ACCESS_TOKEN_TIME = 6 * 24L + 23L;
+
+    /**
+     * 诚泰财险 为接入方提供获取token时间
+     */
+    public static final long CT_ACCESS_TOKEN_TIME = 238;
+
+    /**
+     * 微信客服token
+     */
+    public static final String WECHAT_CUSTOMER_TOKEN = "wechat:customer:token";
+
+}

+ 11 - 0
commons/src/main/java/com/jzg/commons/constants/RedisKeyConstants.java

@@ -10,4 +10,15 @@ public class RedisKeyConstants {
 
     public static final String DICT_REDIS_KEY = "DICT:";
 
+    /**
+     * 短信验证码有效期(分钟)
+     */
+    public static final Integer CAPTCHA_EXPIRATION_SMS = 1;
+
+    /**
+     * 短信验证码KEY
+     */
+    public static final String SMS_CODE_KEY = "SMS_CODE_KEY:";
+
+
 }

+ 32 - 0
commons/src/main/java/com/jzg/commons/entity/dto/InsOrdersAdd.java

@@ -0,0 +1,32 @@
+package com.jzg.commons.entity.dto;
+
+
+import com.jzg.commons.entity.orders.po.InsOrders;
+import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
+import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
+import com.jzg.commons.entity.orders.po.InsOrdersOther;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@Schema(description = "订单录入保存")
+public class InsOrdersAdd {
+
+    @Schema(description = "订单信息")
+    private InsOrders insOrders;
+
+    @Schema(description = "车辆信息")
+    private InsOrdersCarInfo carInfoVo;
+
+    @Schema(description = "订单车辆人员信息")
+    private List<InsOrdersCarUserInfo> carUserInfoList;
+
+    @Schema(description = "订单险种信息")
+    private InsuranceInfo insuranceInfo;
+
+    @Schema(description = "订单其他信息")
+    private InsOrdersOther insOrdersOther;
+
+}

+ 11 - 0
commons/src/main/java/com/jzg/commons/entity/dto/InsOrdersParam.java

@@ -0,0 +1,11 @@
+package com.jzg.commons.entity.dto;
+
+
+import com.jzg.commons.core.base.PageRequest;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@Schema(description = "订单录入分页列表查询参数")
+public class InsOrdersParam extends PageRequest {
+}

+ 23 - 0
commons/src/main/java/com/jzg/commons/entity/dto/InsuranceInfo.java

@@ -0,0 +1,23 @@
+package com.jzg.commons.entity.dto;
+
+
+import com.jzg.commons.entity.orders.po.InsOrdersKind;
+import com.jzg.commons.entity.orders.po.InsOrdersRisk;
+import com.jzg.commons.entity.orders.po.InsOrdersTax;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "保险信息")
+@Data
+public class InsuranceInfo {
+
+    @Schema(description = "险种类型")
+    private InsOrdersKind insOrdersKind;
+
+    @Schema(description = "车船税")
+    private InsOrdersTax insOrdersTax;
+
+    @Schema(description = "险种信息")
+    private InsOrdersRisk insOrdersRisk;
+
+}

+ 12 - 17
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrders.java

@@ -1,21 +1,24 @@
 package com.jzg.commons.entity.orders.po;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
-import org.springframework.data.annotation.Id;
 
 import java.time.LocalDateTime;
 
 @Data
 @Schema(description = "保险订单表")
-public class InsOrders {
+public class InsOrders extends BaseModel {
 
-    @Id
     @Schema(description = "订单ID")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
     private Long id;
 
     @Schema(description = "报价订单号")
-    private String quoteNo;
+    private Long quoteNo;
 
     @Schema(description = "协议ID")
     private String agreementId;
@@ -51,12 +54,14 @@ public class InsOrders {
     private String auditName;
 
     @Schema(description = "核保时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime auditTime;
 
     @Schema(description = "核保意见")
     private String auditOpinion;
 
     @Schema(description = "支付时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime payTime;
 
     @Schema(description = "支付链接")
@@ -66,20 +71,10 @@ public class InsOrders {
     private String insOrderNo;
 
     @Schema(description = "签单时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime signingTime;
 
-    @Schema(description = "是否删除")
-    private Boolean isDelete;
+    @Schema(description = "是否暂存0-保存;1-暂存")
+    private byte isTemporarily;
 
-    @Schema(description = "创建时间")
-    private LocalDateTime createTime;
-
-    @Schema(description = "创建人")
-    private String createBy;
-
-    @Schema(description = "更新时间")
-    private LocalDateTime updateTime;
-
-    @Schema(description = "更新人")
-    private String updateBy;
 }

+ 12 - 11
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersCarInfo.java

@@ -1,22 +1,22 @@
 package com.jzg.commons.entity.orders.po;
 
-import cn.hutool.core.date.DateTime;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
-import org.springframework.data.annotation.Id;
 
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
 @Data
 @Schema(description = "订单车辆信息表")
-public class InsOrdersCarInfo {
-
-    @Id
-    @Schema(description = "主键ID")
-    private Long id;
+public class InsOrdersCarInfo extends BaseModel {
 
     @Schema(description = "订单号")
-    private String orderNo;
+    private Long orderNo;
+
+    @Schema(description = "是否已上牌")
+    private int isRegistered;
 
     @Schema(description = "车牌号")
     private String licenseNo;
@@ -76,13 +76,14 @@ public class InsOrdersCarInfo {
     private String licenseKindCode;
 
     @Schema(description = "注册日期")
-    private DateTime registerDate;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime registerDate;
 
     @Schema(description = "发证日期")
-    private DateTime issueDate;
+    private LocalDateTime issueDate;
 
     @Schema(description = "过户日期")
-    private DateTime transferDate;
+    private LocalDateTime transferDate;
 
     @Schema(description = "是否过户")
     private String transfer;

+ 17 - 11
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersCarUserInfo.java

@@ -1,17 +1,19 @@
 package com.jzg.commons.entity.orders.po;
 
-import cn.hutool.core.date.DateTime;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
-import org.springframework.data.annotation.Id;
+import lombok.Data;
 
+import java.time.LocalDateTime;
+
+
+@Data
 @Schema(description = "订单人员信息表")
-public class InsOrdersCarUserInfo {
-    @Id
-    @Schema(description = "主键ID")
-    private Long id;
+public class InsOrdersCarUserInfo extends BaseModel {
 
     @Schema(description = "订单号")
-    private String orderNo;
+    private Long orderNo;
 
     @Schema(description = "保单人员类型 1 车主 2 投保人 3 被保人")
     private Integer policyPersonType;
@@ -47,10 +49,12 @@ public class InsOrdersCarUserInfo {
     private String addr;
 
     @Schema(description = "证件有效开始时间")
-    private DateTime identifyValidDate;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime identifyValidDate;
 
     @Schema(description = "证件有效结束时间")
-    private DateTime identifyValidEndDate;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime identifyValidEndDate;
 
     @Schema(description = "手机号码")
     private String mobile;
@@ -65,10 +69,12 @@ public class InsOrdersCarUserInfo {
     private String contactIdentifyNumber;
 
     @Schema(description = "联系人证件有效开始时间")
-    private DateTime contactIdentifyValidDate;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime contactIdentifyValidDate;
 
     @Schema(description = "联系人证件有效结束时间")
-    private DateTime contactIdentifyValidEndDate;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime contactIdentifyValidEndDate;
 
     @Schema(description = "电子邮箱")
     private String email;

+ 1 - 6
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersKind.java

@@ -3,7 +3,6 @@ package com.jzg.commons.entity.orders.po;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
-import org.springframework.data.annotation.Id;
 
 import java.math.BigDecimal;
 
@@ -11,12 +10,8 @@ import java.math.BigDecimal;
 @Schema(description = "保险订单险种信息")
 public class InsOrdersKind {
 
-    @Id
-    @Schema(description = "主键 ID")
-    private Long id;
-
     @Schema(description = "订单号")
-    private String orderNo;
+    private Long orderNo;
 
     @Schema(description = "金额或数量")
     private BigDecimal amount;

+ 55 - 0
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersOther.java

@@ -0,0 +1,55 @@
+package com.jzg.commons.entity.orders.po;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Schema(description = "保险订单其他信息")
+public class InsOrdersOther {
+
+    @Schema(description = "订单号")
+    private Long orderNo;
+
+    @Schema(description = "交强评分")
+    private String jqScope;
+
+    @Schema(description = "商业评分")
+    private String syScope;
+
+    @Schema(description = "总赔付率")
+    private BigDecimal lossRation;
+
+    @Schema(description = "交强赔付率")
+    private BigDecimal jqLossRation;
+
+    @Schema(description = "商业赔付率")
+    private BigDecimal syLossRation;
+
+    @Schema(description = "交强续保")
+    private byte jqRenewal;
+
+    @Schema(description = "商业续保")
+    private byte syRenewal;
+
+    @Schema(description = "交强出险次数")
+    private byte jqClaims;
+
+    @Schema(description = "商业出险次数")
+    private byte syClaims;
+
+    @Schema(description = "是否是真假单交")
+    private byte isDjq;
+
+    @Schema(description = "交强折扣")
+    private BigDecimal jqAdjustRate;
+
+    @Schema(description = "商业折扣")
+    private BigDecimal syAdjustRate;
+
+    @Schema(description = "太平绿黄红区间评分")
+    private String tpColorScore;
+
+}

+ 7 - 10
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersRisk.java

@@ -1,24 +1,19 @@
 package com.jzg.commons.entity.orders.po;
 
 
-import cn.hutool.core.date.DateTime;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
-import org.springframework.data.annotation.Id;
 
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
 @Data
 @Schema(description = "保险订单险种信息")
 public class InsOrdersRisk {
 
-
-    @Id
-    @Schema(description = "主键 ID")
-    private Long id;
-
     @Schema(description = "订单号")
-    private String orderNo;
+    private Long orderNo;
 
     @Schema(description = "险种名称")
     private String riskName;
@@ -42,8 +37,10 @@ public class InsOrdersRisk {
     private BigDecimal commissionAmount;
 
     @Schema(description = "起保时间")
-    private DateTime startDate;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime startDate;
 
     @Schema(description = "终保时间")
-    private DateTime endDate;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime endDate;
 }

+ 5 - 9
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersTax.java

@@ -1,23 +1,18 @@
 package com.jzg.commons.entity.orders.po;
 
-import cn.hutool.core.date.DateTime;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
-import org.springframework.data.annotation.Id;
 
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
 @Data
 @Schema(description = "保险订单税务信息")
 public class InsOrdersTax {
 
-
-    @Id
-    @Schema(description = "主键 ID")
-    private Long id;
-
     @Schema(description = "订单号")
-    private String orderNo;
+    private Long orderNo;
 
     @Schema(description = "减免税凭证号(减免税时必传)")
     private String extendChar2;
@@ -35,7 +30,8 @@ public class InsOrdersTax {
     private String taxComName;
 
     @Schema(description = "完税凭证填发日期(完税时必传)")
-    private DateTime taxDocumentDate;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime taxDocumentDate;
 
     @Schema(description = "开具完税凭证地区代码(完税时必传)")
     private String taxPaidAreaCode;

+ 61 - 0
commons/src/main/java/com/jzg/commons/entity/vo/BusinessLicense.java

@@ -0,0 +1,61 @@
+package com.jzg.commons.entity.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @description: 营业执照返回实体
+ * @author: wenks
+ * @date: 2024/2/21 9:13
+ **/
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class BusinessLicense {
+
+    /**
+     * 社会信用代码
+     */
+    private String socialCreditCode;
+    /**
+     * 单位名称
+     */
+    private String company;
+
+    /**
+     * 住址
+     */
+    private String address;
+
+    /**
+     * 法定代表人
+     */
+    private String legalRepresentative;
+
+    /**
+     * 有效日期至
+     */
+    private String effectiveDate;
+
+    /**
+     * 成立日期
+     */
+    private String registerDate;
+
+    /**
+     * 类型
+     */
+    private String types;
+
+    /**
+     * 注册资本
+     */
+    private String registeredCapital;
+
+    /**
+     * 经营范围
+     */
+    private String businessScope;
+
+}

+ 65 - 0
commons/src/main/java/com/jzg/commons/entity/vo/CardUserInfo.java

@@ -0,0 +1,65 @@
+package com.jzg.commons.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @ClassName CarUserInfo
+ * @Description: TODO
+ * @Author
+ * @Date 2021/6/25
+ **/
+@Data
+@Schema(defaultValue = "行驶证用户信息")
+public class CardUserInfo {
+    @Schema(defaultValue = "总质量")
+    private String grossMass;
+    private String approvedLoad;
+    @Schema(defaultValue = "车牌号")
+    private String plateNo;
+    private String plateType;
+    private String remark;
+    private String plateNum;
+    private String noLicenseFlag;
+
+    private String inspectionRecord;
+    private String archiveNo;
+    private String energyTypes;
+    private String ocrID;
+    private String unladenMass;
+    private String engine;
+    private String overallDimension;
+    private String approvedPassengersCapacity;
+    private String backOcrID;
+    private String motorTypeCode;
+
+    private String motorUsageTypeCode;
+
+    @Schema(defaultValue = "车辆识别代号")
+    private String vIN;
+
+    @Schema(defaultValue = "发证日期")
+    private String issueDate;
+
+    private String tractionMass;
+
+    @Schema(defaultValue = "注册日期")
+    private String registerDate;
+
+    @Schema(defaultValue = "核定载质量")
+    private String limitLoad;
+
+    @Schema(defaultValue = "使用性质")
+    private String useNature;
+
+    @Schema(defaultValue = "车辆类型")
+    private String category;
+
+    @Schema(defaultValue = "车辆用途")
+    private String vehicleUse;
+
+    //add 车主 lig 2023-09-21
+    @Schema(defaultValue = "车主")
+    private String carOwner;
+
+}

+ 93 - 0
commons/src/main/java/com/jzg/commons/entity/vo/CustomerInfoVO.java

@@ -0,0 +1,93 @@
+package com.jzg.commons.entity.vo;
+
+import java.io.Serializable;
+
+/**
+ * @ClassName CustomerInfoVO
+ * @Description: TODO
+ * @Author
+ * @Date 2021/6/25
+ **/
+public class CustomerInfoVO implements Serializable {
+    private String identifyValidEndDate;
+    private String ocrID;
+    private String identifyNumber;
+    private String name;
+    private String backOcrID;
+    private String identifyValidDate;
+    private String identifyIssuedCom;
+    private String addr;
+    private String identifyType;
+
+    public String getIdentifyValidEndDate() {
+        return identifyValidEndDate;
+    }
+
+    public void setIdentifyValidEndDate(String identifyValidEndDate) {
+        this.identifyValidEndDate = identifyValidEndDate;
+    }
+
+    public String getOcrID() {
+        return ocrID;
+    }
+
+    public void setOcrID(String ocrID) {
+        this.ocrID = ocrID;
+    }
+
+    public String getIdentifyNumber() {
+        return identifyNumber;
+    }
+
+    public void setIdentifyNumber(String identifyNumber) {
+        this.identifyNumber = identifyNumber;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getBackOcrID() {
+        return backOcrID;
+    }
+
+    public void setBackOcrID(String backOcrID) {
+        this.backOcrID = backOcrID;
+    }
+
+    public String getIdentifyValidDate() {
+        return identifyValidDate;
+    }
+
+    public void setIdentifyValidDate(String identifyValidDate) {
+        this.identifyValidDate = identifyValidDate;
+    }
+
+    public String getIdentifyIssuedCom() {
+        return identifyIssuedCom;
+    }
+
+    public void setIdentifyIssuedCom(String identifyIssuedCom) {
+        this.identifyIssuedCom = identifyIssuedCom;
+    }
+
+    public String getAddr() {
+        return addr;
+    }
+
+    public void setAddr(String addr) {
+        this.addr = addr;
+    }
+
+    public String getIdentifyType() {
+        return identifyType;
+    }
+
+    public void setIdentifyType(String identifyType) {
+        this.identifyType = identifyType;
+    }
+}

+ 39 - 0
commons/src/main/java/com/jzg/commons/entity/vo/InsOrdersVo.java

@@ -0,0 +1,39 @@
+package com.jzg.commons.entity.vo;
+
+
+import com.jzg.commons.entity.dto.InsuranceInfo;
+import com.jzg.commons.entity.orders.po.InsOrders;
+import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
+import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
+import com.jzg.commons.entity.orders.po.InsOrdersOther;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@Schema(description = "订单录入VO")
+public class InsOrdersVo {
+
+    @Schema(description = "id")
+    private Long id;
+
+    @Schema(description = "订单号")
+    private Long quoteNo;
+
+    @Schema(description = "订单信息")
+    private InsOrders insOrders;
+
+    @Schema(description = "车辆信息")
+    private InsOrdersCarInfo carInfoVo;
+
+    @Schema(description = "订单车辆人员信息")
+    private List<InsOrdersCarUserInfo> carUserInfoList;
+
+    @Schema(description = "订单险种信息")
+    private InsuranceInfo insuranceInfo;
+
+    @Schema(description = "订单其他信息")
+    private InsOrdersOther insOrdersOther;
+
+}

+ 36 - 0
commons/src/main/java/com/jzg/commons/util/ObjectUtil.java

@@ -0,0 +1,36 @@
+package com.jzg.commons.util;
+
+import java.lang.reflect.Field;
+
+public class ObjectUtil {
+    /**
+     * 判断该对象是否所有属性为空
+     * 返回ture表示所有属性为null,返回false表示不是所有属性都是null
+     */
+    public static boolean isAllFieldNull(Object object) {
+        boolean flag = true;
+
+        if(object == null) return flag;
+        Class clazz = object.getClass();
+        Field[] fields = clazz.getDeclaredFields();
+
+        for (Field field : fields) {
+            //设置属性是可以访问的(私有的也可以)
+            field.setAccessible(true);
+            Object value = null;
+            try {
+                value = field.get(object);
+                // 只要有1个属性不为空,那么就不是所有的属性值都为空
+                if (value != null) {
+                    flag = false;
+                    break;
+                }
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return flag;
+    }
+}
+

+ 1 - 0
gateway/src/main/java/com/jzg/config/CorsConfig.java

@@ -30,6 +30,7 @@ public class CorsConfig {
         corsConfiguration.addAllowedOrigin("http://192.168.0.149:9000");
         corsConfiguration.addAllowedOrigin("http://192.168.0.69:9000");
         corsConfiguration.addAllowedOrigin("http://192.168.0.20:9000");
+        corsConfiguration.addAllowedOrigin("http://192.168.0.20:9001");
         corsConfiguration.addAllowedOrigin("http://192.168.0.22:9000");
         corsConfiguration.addAllowedOrigin("http://192.168.0.22:9001");
         // 允许的方法

+ 4 - 17
platform/src/main/java/com/jzg/service/impl/JyxConfigServiceImpl.java

@@ -161,34 +161,21 @@ public class JyxConfigServiceImpl extends ServiceImpl<JyxConfigMapper, JyxConfig
         try {
             List<JyxConfigVo> jyxConfigVos = Optional.ofNullable(jyxConfigMapper.jyxList(configParam)).orElse(Collections.emptyList());
             if (StringUtils.isNotEmpty(configParam.getSeats()) || StringUtils.isNotEmpty(configParam.getParams())) {
-
                 Set<String> ids = jyxConfigVos.stream().filter(v -> !ConstantsParent.PARENT_ID_ROOT.equals(v.getParentId())).map(JyxConfigVo::getParentId).collect(Collectors.toSet());
-                List<JyxConfigVo> parentConfigs = jyxConfigMapper.selectParentIds(new ArrayList<>(ids));
-                jyxConfigVos.addAll(parentConfigs);
+                if (!CollectionUtils.isEmpty(ids)){
+                    List<JyxConfigVo> parentConfigs = jyxConfigMapper.selectParentIds(new ArrayList<>(ids));
+                    jyxConfigVos.addAll(parentConfigs);
+                }
                 jyxConfigVos = jyxConfigVos.stream().collect(collectingAndThen(
                         toCollection(() -> new TreeSet<>(Comparator.comparing(JyxConfigVo::getId))), ArrayList::new
                 ));
-
-//                configParam.setParentId(ConstantsParent.PARENT_ID_ROOT);
-//                List<JyxConfigVo> additionalConfigs = Optional.ofNullable(jyxConfigMapper.jyxList(configParam)).orElse(Collections.emptyList());
-//                if (!additionalConfigs.isEmpty()) {
-//                    Set<String> ids = additionalConfigs.stream().map(JyxConfigVo::getId).collect(Collectors.toSet());
-//                    List<JyxConfigVo> parentConfigs = jyxConfigMapper.selectParentIds(new ArrayList<>(ids));
-//                    jyxConfigVos.addAll(parentConfigs);
-//                    jyxConfigVos = jyxConfigVos.stream().collect(collectingAndThen(
-//                            toCollection(() -> new TreeSet<>(Comparator.comparing(JyxConfigVo::getId))), ArrayList::new
-//                    ));
-//                }
             }
             if (jyxConfigVos.isEmpty()) {
                 return Collections.emptyList();
             }
-//            Set<String> parentIds = jyxConfigVos.stream().map(JyxConfigVo::getParentId).collect(Collectors.toSet());
-//            List<JyxConfigVo> jyxConfigs = Optional.ofNullable(jyxConfigMapper.selectIds(new ArrayList<>(parentIds))).orElse(Collections.emptyList());
             Map<String, List<JyxConfigVo>> childrenMap = jyxConfigVos.stream()
                     .filter(vo -> !ConstantsParent.PARENT_ID_ROOT.equals(vo.getParentId()))
                     .collect(Collectors.groupingBy(vo -> String.valueOf(vo.getParentId()), Collectors.mapping(Function.identity(), Collectors.toList())));
-
             List<JyxConfigVo> configVos = jyxConfigVos.stream().filter(parentConfig -> ConstantsParent.PARENT_ID_ROOT.equals(parentConfig.getParentId())).collect(Collectors.toList());
             configVos.forEach(parentConfig -> {
                 parentConfig.setChildren(childrenMap.getOrDefault(String.valueOf(parentConfig.getId()), Collections.emptyList()));

+ 0 - 5
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/response/InsurePremiumResponse.java

@@ -1,14 +1,9 @@
 package com.jzg.quotation.chengtai.api.entity.response;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.ydtech.modules.ins.model.vo.AccidentResponseVo;
-import com.ydtech.modules.order.entity.InsDrivingIntentionInsurance;
-import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
-import com.ydtech.utils.StringUtils;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import java.util.ArrayList;
 import java.util.List;
 
 @NoArgsConstructor

+ 27 - 0
tenant/insurance/quotation-commons/pom.xml

@@ -18,4 +18,31 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
+    <dependencies>
+        <!--集成微信-->
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-mp</artifactId>
+            <version>4.3.8.B</version>
+        </dependency>
+        <!--thumbnailator图片处理-->
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.8</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>14</source>
+                    <target>14</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>

+ 1 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/aggregated/InsuranceUploadImageVo.java

@@ -6,6 +6,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.List;

+ 5 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/quote/CarInfoVo.java

@@ -1,6 +1,8 @@
 package com.jzg.quotation.commons.entity.vo.quote;
 
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.springframework.util.StringUtils;
@@ -20,6 +22,9 @@ public class CarInfoVo implements Serializable {
     @Serial
     private static final long serialVersionUID = -1999956887911522472L;
 
+    @TableId(value = "order_no",type = IdType.ASSIGN_ID)
+    private String orderNo;
+
     /**
      * 车牌
      */

+ 157 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/AuthServiceUtils.java

@@ -0,0 +1,157 @@
+package com.jzg.quotation.commons.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import jakarta.annotation.PostConstruct;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName AuthService
+ * @Description: 获取token类
+ * @Author
+ * @Date 2021/6/25
+ **/
+@Slf4j
+@Component
+public class AuthServiceUtils {
+
+
+    @Autowired
+    private Environment environment;
+
+    @Autowired
+    private static Environment staticEnvironment;
+
+    @PostConstruct
+    public void init() {
+        staticEnvironment = environment;
+    }
+
+    /**
+     * 获取权限token
+     *
+     * @return 返回示例:
+     * {
+     * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
+     * "expires_in": 2592000
+     * }
+     */
+    public static String getAuth() {
+        // 官网获取的 API Key 更新为你注册的
+//        String clientId = "MN5kwB9Qvi77eTKexMG69HH1";
+//        // 官网获取的 Secret Key 更新为你注册的
+//        String clientSecret = "LIZb0viMF5833zNHhhok3Kl1wqF9qWue";
+        String clientId = staticEnvironment.getProperty("baidu.clientId");
+        String clientSecret = staticEnvironment.getProperty("baidu.clientSecret");
+
+        return getAuth(clientId, clientSecret);
+    }
+
+    /**
+     * 获取API访问token
+     * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
+     *
+     * @param ak - 百度云官网获取的 API Key
+     * @param sk - 百度云官网获取的 Securet Key
+     * @return assess_token 示例:
+     * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
+     */
+    public static String getAuth(String ak, String sk) {
+        // 获取token地址
+        String authHost = staticEnvironment.getProperty("baidu.authHost");
+        String getAccessTokenUrl = authHost
+                // 1. grant_type为固定参数
+                + "grant_type=client_credentials"
+                // 2. 官网获取的 API Key
+                + "&client_id=" + ak
+                // 3. 官网获取的 Secret Key
+                + "&client_secret=" + sk;
+        try {
+            URL realUrl = new URL(getAccessTokenUrl);
+            // 打开和URL之间的连接
+            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
+            connection.setRequestMethod("GET");
+            connection.connect();
+            // 获取所有响应头字段
+            Map<String, List<String>> map = connection.getHeaderFields();
+            // 遍历所有的响应头字段
+            for (String key : map.keySet()) {
+                log.info(key + "--->" + map.get(key));
+
+            }
+            // 定义 BufferedReader输入流来读取URL的响应
+            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+            StringBuilder result = new StringBuilder();
+            String line;
+            while ((line = in.readLine()) != null) {
+                result.append(line);
+            }
+            /**
+             * 返回结果示例
+             */
+            log.info("result:" + result);
+            JSONObject jsonObject = JSON.parseObject(result.toString());
+            return jsonObject.getString("access_token");
+        } catch (Exception e) {
+            log.info("获取token失败!");
+            e.printStackTrace(System.err);
+        }
+        return null;
+    }
+
+
+    /**
+     * 接口调用 返回json
+     *
+     * @param url
+     * @param headerMap
+     * @param content
+     * @return
+     */
+    private static JSONObject doPost(String url, Map<String, String> headerMap, JSONObject content) {
+        try (CloseableHttpClient client = HttpClients.createDefault();){
+            // 要调用的接口方法
+            HttpPost post = new HttpPost(url);
+            // 解决报文中文乱码问题
+            StringEntity s = new StringEntity(content.toString(), StandardCharsets.UTF_8);
+            s.setContentEncoding("UTF-8");
+            s.setContentType("application/json");
+            post.setEntity(s);
+
+            if (headerMap != null && headerMap.size() > 0) {
+                //循环增加header
+                for (Map.Entry<String, String> elem : headerMap.entrySet()) {
+                    post.addHeader(elem.getKey(), elem.getValue());
+                }
+            }
+
+            HttpResponse res = client.execute(post);
+            //解决返回中文乱码问题
+            String resultObj = EntityUtils.toString(res.getEntity(), StandardCharsets.UTF_8);
+
+            return JSON.parseObject(resultObj);
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+}
+

+ 66 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/BusinessLicenseRecognitionUtils.java

@@ -0,0 +1,66 @@
+package com.jzg.quotation.commons.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.jzg.commons.entity.vo.BusinessLicense;
+import me.chanjar.weixin.common.util.http.URIUtil;
+import org.apache.commons.lang3.StringUtils;
+
+public class BusinessLicenseRecognitionUtils {
+
+
+    private BusinessLicenseRecognitionUtils() {
+        throw new IllegalStateException("Utility class");
+    }
+
+    /**
+     * @param imgParam base64影像
+     * @return
+     */
+    public static JSONObject businessLicense(String imgParam) {
+        imgParam= URIUtil.encodeURIComponent(imgParam);
+        // 请求url
+        String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/business_license";
+        try {
+            String accessToken = AuthServiceUtils.getAuth();
+
+            String param = "image=" + imgParam;
+            String result = HttpUtil.post(url, accessToken, param);
+            JSONObject ja = JSON.parseObject(result);
+            String wordsResult = ja.getString("words_result");
+            return JSON.parseObject(wordsResult);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new JSONObject();
+    }
+
+
+    public static void gettingData(String images, BusinessLicense businessLicense) {
+        if (StringUtils.isEmpty(images)) {
+            return;
+        }
+
+        try {
+            JSONObject s = businessLicense(images);
+            businessLicense.setSocialCreditCode(getWords(s, "社会信用代码"));
+            businessLicense.setCompany(getWords(s, "单位名称"));
+            businessLicense.setAddress(getWords(s, "地址"));
+            businessLicense.setLegalRepresentative(getWords(s, "法人"));
+            businessLicense.setEffectiveDate(getWords(s, "有效期"));
+            businessLicense.setRegisterDate(getWords(s, "成立日期"));
+            businessLicense.setTypes(getWords(s, "类型"));
+            businessLicense.setRegisteredCapital(getWords(s, "注册资本"));
+            businessLicense.setRegisteredCapital(getWords(s, "注册资本"));
+            businessLicense.setBusinessScope(getWords(s, "经营范围"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static String getWords(JSONObject jsonObject, String name) {
+        return JSON.parseObject(jsonObject.getString(name)).getString("words");
+    }
+
+
+}

+ 77 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/HttpUtil.java

@@ -0,0 +1,77 @@
+package com.jzg.quotation.commons.utils;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * http 工具类
+ */
+public class HttpUtil {
+
+    public static String post(String requestUrl, String accessToken, String params)
+            throws Exception {
+        String contentType = "application/x-www-form-urlencoded";
+        return HttpUtil.post(requestUrl, accessToken, contentType, params);
+    }
+
+    public static String post(String requestUrl, String accessToken, String contentType, String params)
+            throws Exception {
+        String encoding = "UTF-8";
+        if (requestUrl.contains("nlp")) {
+            encoding = "GBK";
+        }
+        return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding);
+    }
+
+    public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding)
+            throws Exception {
+        String url = requestUrl + "?access_token=" + accessToken;
+        return HttpUtil.postGeneralUrl(url, contentType, params, encoding);
+    }
+
+    public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding)
+            throws Exception {
+        URL url = new URL(generalUrl);
+        // 打开和URL之间的连接
+        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+        connection.setRequestMethod("POST");
+        // 设置通用的请求属性
+        connection.setRequestProperty("Content-Type", contentType);
+        connection.setRequestProperty("Connection", "Keep-Alive");
+        connection.setUseCaches(false);
+        connection.setDoOutput(true);
+        connection.setDoInput(true);
+
+        // 得到请求的输出流对象
+        DataOutputStream out = new DataOutputStream(connection.getOutputStream());
+        out.write(params.getBytes(encoding));
+        out.flush();
+        out.close();
+
+        // 建立实际的连接
+        connection.connect();
+        // 获取所有响应头字段
+        Map<String, List<String>> headers = connection.getHeaderFields();
+        // 遍历所有的响应头字段
+        for (String key : headers.keySet()) {
+            System.err.println(key + "--->" + headers.get(key));
+        }
+        // 定义 BufferedReader输入流来读取URL的响应
+        BufferedReader in = null;
+        in = new BufferedReader(
+                new InputStreamReader(connection.getInputStream(), encoding));
+        String result = "";
+        String getLine;
+        while ((getLine = in.readLine()) != null) {
+            result += getLine;
+        }
+        in.close();
+        System.err.println("result:" + result);
+        return result;
+    }
+}

+ 151 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/Idcard.java

@@ -0,0 +1,151 @@
+package com.jzg.quotation.commons.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.vo.CustomerInfoVO;
+import jakarta.annotation.PostConstruct;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 身份证识别
+ */
+@Slf4j
+@Component
+public class Idcard {
+
+
+    @Autowired
+    private Environment environment;
+
+    @Autowired
+    private static Environment staticEnvironment;
+
+    @PostConstruct
+    public void init() {
+        staticEnvironment = environment;
+    }
+
+
+    /**
+     * 重要提示代码中所需工具类
+     * FileUtil,Base64Util,HttpUtil,GsonUtils请从
+     * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
+     * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
+     * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
+     * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
+     * 下载
+     */
+    public static HttpResult<Map<String, Object>> getIdCard(String imgs) {
+
+        //// 从redis中获取信息,redis保存时间是20天。
+        String accessToken = AuthServiceUtils.getAuth();
+        Map<String, Object> ma = new HashMap<>();
+        // 请求url
+        String url = staticEnvironment.getProperty("baidu.idcard");
+        try {
+            String imgParam = URLEncoder.encode(imgs, "UTF-8");
+            String param = "id_card_side=" + "front" + "&image=" + imgParam + "&detect_photo=true";
+
+            String result = HttpUtil.post(url, accessToken, param);
+            JSONObject ja = JSON.parseObject(result);
+            log.info(ja.toString());
+
+            String wordsResult = ja.getString("wordsResult");
+
+            CustomerInfoVO customerInfo = new CustomerInfoVO();
+            JSONObject jb = JSON.parseObject(wordsResult);
+            customerInfo.setName(JSON.parseObject(jb.getString("姓名")).getString("words"));
+            customerInfo.setIdentifyNumber(JSON.parseObject(jb.getString("公民身份号码")).getString("words"));
+            customerInfo.setAddr(JSON.parseObject(jb.getString("住址")).getString("words"));
+            customerInfo.setIdentifyType("01");
+            customerInfo.setIdentifyValidDate(JSON.parseObject(jb.getString("出生")).getString("words"));
+            customerInfo.setIdentifyIssuedCom(JSON.parseObject(jb.getString("性别")).getString("words"));
+            ma.put("customerInfo", customerInfo);
+            return HttpResult.ok("200", ma);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return HttpResult.ok("201", ma);
+    }
+
+    public static JSONObject request(String image, String idCardSide) {
+        //// 从redis中获取信息,redis保存时间是20天。
+        String accessToken = AuthServiceUtils.getAuth();
+        // 请求url
+        String url = staticEnvironment.getProperty("baidu.idcard");
+        try {
+            String imgParam = URLEncoder.encode(image, "UTF-8");
+            String param = "id_card_side=" + idCardSide + "&image=" + imgParam + "&detect_photo=true";
+            String result = HttpUtil.post(url, accessToken, param);
+            JSONObject ja = JSON.parseObject(result);
+            log.info(ja.toString());
+            String wordsResult = ja.getString("words_result");
+            return JSON.parseObject(wordsResult);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new JSONObject();
+    }
+
+
+    /**
+     * 识别身份证正面
+     *
+     * @param images
+     * @return
+     */
+    public static void getIdCardFront(String images, CustomerInfoVO customerInfo) {
+        if (StringUtils.isEmpty(images)) {
+            return;
+        }
+
+        try {
+            JSONObject jb = request(images, "front");
+            customerInfo.setName(JSON.parseObject(jb.getString("姓名")).getString("words"));
+            customerInfo.setIdentifyNumber(JSON.parseObject(jb.getString("公民身份号码")).getString("words"));
+            customerInfo.setAddr(JSON.parseObject(jb.getString("住址")).getString("words"));
+            customerInfo.setIdentifyType("01");
+            customerInfo.setIdentifyIssuedCom(JSON.parseObject(jb.getString("性别")).getString("words"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void conversionFront(CustomerInfoVO customerInfo, CustomerInfoVO customerInfoNew) {
+        customerInfo.setName(customerInfoNew.getName());
+        customerInfo.setIdentifyNumber(customerInfoNew.getIdentifyNumber());
+        customerInfo.setAddr(customerInfoNew.getAddr());
+        customerInfo.setIdentifyType(customerInfoNew.getIdentifyType());
+        customerInfo.setIdentifyIssuedCom(customerInfoNew.getIdentifyIssuedCom());
+    }
+
+
+    public static void getIdCardBack(String images, CustomerInfoVO customerInfo) {
+        if (StringUtils.isEmpty(images)) {
+            return;
+        }
+
+        try {
+            JSONObject jb = request(images, "back");
+            customerInfo.setIdentifyValidDate(JSON.parseObject(jb.getString("签发日期")).getString("words"));
+            customerInfo.setIdentifyValidEndDate(JSON.parseObject(jb.getString("失效日期")).getString("words"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void conversionBack(CustomerInfoVO customerInfo, CustomerInfoVO customerInfoNew) {
+        customerInfo.setIdentifyValidDate(customerInfoNew.getIdentifyValidDate());
+        customerInfo.setIdentifyValidEndDate(customerInfoNew.getIdentifyValidEndDate());
+    }
+
+}

+ 137 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/ImageCompressionUtils.java

@@ -0,0 +1,137 @@
+package com.jzg.quotation.commons.utils;
+
+import com.jzg.commons.exception.SystemException;
+import lombok.extern.slf4j.Slf4j;
+import net.coobird.thumbnailator.Thumbnails;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.nio.file.Files;
+
+/**
+ * @author wenks
+ * @version 0.0.2
+ * @description 文件压缩工具类
+ * @date 2023/4/11 10:27
+ */
+@Slf4j
+public class ImageCompressionUtils {
+
+    private ImageCompressionUtils() {
+        throw new IllegalStateException("Utility class");
+    }
+
+    private static final Integer ZERO = 0;
+    private static final Integer ONE_ZERO_TWO_FOUR = 1024;
+    private static final Integer NINE_ZERO_ZERO = 900;
+    private static final Integer THREE_TWO_SEVEN_FIVE = 3275;
+    private static final Integer TWO_ZERO_FOUR_SEVEN = 2047;
+    private static final Double ZERO_EIGHT_FIVE = 0.85;
+    private static final Double ZERO_SIX = 0.6;
+    private static final Double ZERO_FOUR_FOUR = 0.44;
+    private static final Double ZERO_FOUR = 0.4;
+
+    /**
+     * 压缩大小不变
+     *
+     * @param inputStream 输入流
+     * @param suffix      文件后缀名
+     * @param path        路劲
+     * @return 字节
+     */
+    public static byte[] compressPic(InputStream inputStream, String suffix, String path) throws IOException {
+        File temp = File.createTempFile("temp", suffix, new File(path));
+        try (FileOutputStream os = new FileOutputStream(temp);) {
+            BufferedImage image = ImageIO.read(inputStream);
+            int width = image.getWidth();
+            int height = image.getHeight();
+            BufferedImage bfImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+            bfImage.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
+            ImageIO.write(bfImage, suffix.replace(".", ""), os);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        byte[] bytesByFile = getBytesByFile(temp);
+
+        Files.delete(temp.getAbsoluteFile().toPath());
+
+
+
+        return bytesByFile;
+    }
+
+    /**
+     * 文件转字节
+     *
+     * @param file 文件
+     * @return 字节
+     */
+    public static byte[] getBytesByFile(File file) {
+        try (FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream(1000)) {
+            byte[] b = new byte[1000];
+            int n;
+            while ((n = fis.read(b)) != -1) {
+                bos.write(b, 0, n);
+            }
+            return bos.toByteArray();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new byte[0];
+    }
+
+    /**
+     * 根据指定大小压缩图片
+     *
+     * @param imageBytes  源图片字节数组
+     * @param desFileSize 指定图片大小,单位kb
+     * @return 压缩质量后的图片字节数组
+     */
+    public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) {
+        if (imageBytes == null || imageBytes.length <= ZERO || imageBytes.length < desFileSize * ONE_ZERO_TWO_FOUR) {
+            return imageBytes;
+        }
+        long srcSize = imageBytes.length;
+        double accuracy = getAccuracy(srcSize / ONE_ZERO_TWO_FOUR);
+        try {
+            while (imageBytes.length > desFileSize * ONE_ZERO_TWO_FOUR) {
+                ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
+                ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
+                Thumbnails.of(inputStream)
+                        .scale(accuracy)
+                        .outputQuality(accuracy)
+                        .toOutputStream(outputStream);
+                imageBytes = outputStream.toByteArray();
+            }
+            log.info("图片原大小={}kb | 压缩后大小={}kb",
+                    srcSize / ONE_ZERO_TWO_FOUR, imageBytes.length / ONE_ZERO_TWO_FOUR);
+        } catch (Exception e) {
+            log.error("【图片压缩】msg=图片压缩失败!", e);
+            throw new SystemException(e.toString());
+        }
+        return imageBytes;
+    }
+
+    /**
+     * 自动调节精度(经验数值)
+     *
+     * @param size 源图片大小
+     * @return 图片压缩质量比
+     */
+    private static double getAccuracy(long size) {
+        double accuracy;
+        if (size < NINE_ZERO_ZERO) {
+            accuracy = ZERO_EIGHT_FIVE;
+        } else if (size < TWO_ZERO_FOUR_SEVEN) {
+            accuracy = ZERO_SIX;
+        } else if (size < THREE_TWO_SEVEN_FIVE) {
+            accuracy = ZERO_FOUR_FOUR;
+        } else {
+            accuracy = ZERO_FOUR;
+        }
+        return accuracy;
+    }
+
+}

+ 224 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/MultiObjectDetectUtils.java

@@ -0,0 +1,224 @@
+package com.jzg.quotation.commons.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.vo.CardUserInfo;
+import jakarta.annotation.PostConstruct;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+
+/**
+ * @ClassName MultiObjectDetect
+ * @Description: TODO
+ * @Author
+ * @Date 2021/6/25
+ **/
+@Component
+public class MultiObjectDetectUtils {
+
+
+    @Autowired
+    private Environment environment;
+
+    @Autowired
+    private static Environment staticEnvironment;
+
+
+    @PostConstruct
+    public void init() {
+        staticEnvironment = environment;
+    }
+
+
+    public static HttpResult multiObjectDetect(String imgData) {
+        Map<String, Object> ma = new HashMap<>();
+
+        // 请求url
+        String url = staticEnvironment.getProperty("baidu.vehicle");
+        try {
+            // 本地文件路径
+            imgData = imgData.substring(imgData.indexOf(",") + 1);
+
+            String imgParam = URLEncoder.encode(imgData, "UTF-8");
+
+            String param = "image=" + imgParam;
+            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
+            String accessToken = AuthServiceUtils.getAuth();
+
+            String result = HttpUtil.post(url, accessToken, param);
+            JSONObject ja = JSON.parseObject(result);
+
+            String wordsResult = ja.getString("words_result");
+
+            CardUserInfo cardUserInfo = new CardUserInfo();
+            JSONObject jb = JSON.parseObject(wordsResult);
+            cardUserInfo.setVIN(JSON.parseObject(jb.getString("车辆识别代号")).getString("words").toString());
+            cardUserInfo.setIssueDate(JSON.parseObject(jb.getString("发证日期")).getString("words"));
+            String hpzl = JSON.parseObject(jb.getString("车辆类型")).getString("words");
+            if (hpzl != null && hpzl.equals("小型轿车")) {
+                cardUserInfo.setPlateType("02");
+            } else {
+                cardUserInfo.setPlateType("01");
+
+            }
+            cardUserInfo.setMotorUsageTypeCode("8A");
+            cardUserInfo.setMotorTypeCode("A0");
+            if (!StringUtils.isEmpty(jb.getString("注册日期"))) {
+                cardUserInfo.setRegisterDate(JSON.parseObject(jb.getString("注册日期")).getString("words"));
+            } else if (!StringUtils.isEmpty(jb.getString("注册登记日期"))) {
+                cardUserInfo.setRegisterDate(JSON.parseObject(jb.getString("注册登记日期")).getString("words"));
+            }
+
+            cardUserInfo.setEngine(JSON.parseObject(jb.getString("发动机号码")).getString("words"));
+            cardUserInfo.setPlateNo(JSON.parseObject(jb.getString("号牌号码")).getString("words"));
+            cardUserInfo.setBackOcrID(JSON.parseObject(jb.getString("品牌型号")).getString("words"));
+
+            ma.put("carInfo", cardUserInfo);
+
+            return HttpResult.ok("200", ma);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return HttpResult.ok("201", ma);
+    }
+
+
+    public static JSONObject request(String images, String vehicleLicenseSide) {
+        // 请求url
+        String url = staticEnvironment.getProperty("baidu.vehicle");
+        try {
+
+            images = images.substring(images.indexOf(",") + 1);
+            String imgParam = URLEncoder.encode(images, "UTF-8");
+            String param = "image=" + imgParam + "&vehicle_license_side=" + vehicleLicenseSide;
+
+            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
+            String accessToken = AuthServiceUtils.getAuth();
+
+            String result = HttpUtil.post(url, accessToken, param);
+            JSONObject ja = JSON.parseObject(result);
+            String wordsResult = ja.getString("words_result");
+
+            return JSON.parseObject(wordsResult);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new JSONObject();
+    }
+
+    public static void drivingPermitFront(String images, CardUserInfo cardUserInfo) {
+        if (StringUtils.isEmpty(images)) {
+            return;
+        }
+
+        try {
+            JSONObject jb = request(images, "front");
+            cardUserInfo.setVIN(JSON.parseObject(jb.getString("车辆识别代号")).getString("words").toString());
+            cardUserInfo.setIssueDate(JSON.parseObject(jb.getString("发证日期")).getString("words"));
+            //先获取使用性质
+            String useNature = JSON.parseObject(jb.getString("使用性质")).getString("words");
+            String hpzl = JSON.parseObject(jb.getString("车辆类型")).getString("words");
+            String s = Optional.ofNullable(hpzl).orElse("");
+
+            if(s.contains("货车")) {
+                cardUserInfo.setPlateType("A1");
+                if("货运".equals(useNature)){
+                    cardUserInfo.setVehicleUse("04");
+                }else if("非营运".equals(useNature)){
+                    cardUserInfo.setVehicleUse("08");
+                }
+                cardUserInfo.setCategory("H31");
+            }else {
+                cardUserInfo.setPlateType("A0");
+                cardUserInfo.setCategory("K33");
+                if("非营运".equals(useNature)){
+                    cardUserInfo.setVehicleUse("05");
+                }
+            }
+
+            //判断使用性质
+            cardUserInfo.setUseNature(JSON.parseObject(jb.getString("使用性质")).getString("words"));
+            cardUserInfo.setMotorUsageTypeCode("8A");
+            cardUserInfo.setMotorTypeCode("A0");
+            if (!StringUtils.isEmpty(jb.getString("注册日期"))) {
+                cardUserInfo.setRegisterDate(JSON.parseObject(jb.getString("注册日期")).getString("words"));
+            } else if (!StringUtils.isEmpty(jb.getString("注册登记日期"))) {
+                cardUserInfo.setRegisterDate(JSON.parseObject(jb.getString("注册登记日期")).getString("words"));
+            }
+
+            cardUserInfo.setEngine(JSON.parseObject(jb.getString("发动机号码")).getString("words"));
+            cardUserInfo.setPlateNo(JSON.parseObject(jb.getString("号牌号码")).getString("words"));
+            cardUserInfo.setBackOcrID(JSON.parseObject(jb.getString("品牌型号")).getString("words"));
+            cardUserInfo.setCarOwner(JSON.parseObject(jb.getString("所有人")).getString("words"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void conversionFront(CardUserInfo cardUserInfo, CardUserInfo cardUserInfoNew) {
+        cardUserInfo.setVIN(cardUserInfoNew.getVIN());
+        cardUserInfo.setIssueDate(cardUserInfoNew.getIssueDate());
+        cardUserInfo.setCategory(cardUserInfoNew.getCategory());
+        cardUserInfo.setPlateType(cardUserInfoNew.getPlateType());
+        cardUserInfo.setVehicleUse(cardUserInfoNew.getVehicleUse());
+        cardUserInfo.setUseNature(cardUserInfoNew.getUseNature());
+        cardUserInfo.setMotorUsageTypeCode(cardUserInfoNew.getMotorUsageTypeCode());
+        cardUserInfo.setMotorTypeCode(cardUserInfoNew.getMotorTypeCode());
+        cardUserInfo.setRegisterDate(cardUserInfoNew.getRegisterDate());
+        cardUserInfo.setEngine(cardUserInfoNew.getEngine());
+        cardUserInfo.setPlateNo(cardUserInfoNew.getPlateNo());
+        cardUserInfo.setBackOcrID(cardUserInfoNew.getBackOcrID());
+        cardUserInfo.setCarOwner(cardUserInfoNew.getCarOwner());
+    }
+
+
+    /**
+     * 行驶证背面
+     *
+     * @param images
+     * @return
+     */
+    public static void drivingPermitBack(String images, CardUserInfo cardUserInfo) {
+        if (StringUtils.isEmpty(images)) {
+            return;
+        }
+
+        try {
+            JSONObject jb = request(images, "back");
+            cardUserInfo.setGrossMass(JSON.parseObject(jb.getString("总质量")).getString("words").replace("kg", ""));
+            cardUserInfo.setApprovedPassengersCapacity(JSON.parseObject(jb.getString("核定载人数")).getString("words").replace("人", ""));
+            cardUserInfo.setUnladenMass(JSON.parseObject(jb.getString("整备质量")).getString("words").replace("kg", ""));
+            cardUserInfo.setLimitLoad(JSON.parseObject(jb.getString("核定载质量")).getString("words").replace("kg", ""));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    public static void conversion(String side, CardUserInfo cardUserInfo, CardUserInfo cachedCardUserInfo) {
+        if (side.equals("front")){
+            conversionFront(cardUserInfo, cachedCardUserInfo);
+        }else {
+            conversionBack(cardUserInfo, cachedCardUserInfo);
+        }
+    }
+
+
+    public static void conversionBack(CardUserInfo cardUserInfo, CardUserInfo cardUserInfoNew) {
+        cardUserInfo.setGrossMass(cardUserInfoNew.getGrossMass());
+        cardUserInfo.setApprovedPassengersCapacity(cardUserInfoNew.getApprovedPassengersCapacity());
+        cardUserInfo.setUnladenMass(cardUserInfoNew.getUnladenMass());
+        cardUserInfo.setLimitLoad(cardUserInfoNew.getLimitLoad());
+    }
+
+
+}

+ 167 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/SnowFlakeUtil.java

@@ -0,0 +1,167 @@
+package com.jzg.quotation.commons.utils;
+
+import java.util.Date;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @ClassName: SnowFlakeUtil
+ * @Author: jiaoxian
+ * @Date: 2022/4/24 16:34
+ * @Description:
+ */
+public class SnowFlakeUtil {
+
+    private static final SnowFlakeUtil snowFlakeUtil = new SnowFlakeUtil();
+
+    // 初始时间戳(纪年),可用雪花算法服务上线时间戳的值
+    private static final long INIT_EPOCH = 1662114496318L;
+
+    // 时间位取&
+    private static final long TIME_BIT = 0b1111111111111111111111111111111111111111110000000000000000000000L;
+
+    // 记录最后使用的毫秒时间戳,主要用于判断是否同一毫秒,以及用于服务器时钟回拨判断
+    private final AtomicLong lastTimeMillis = new AtomicLong(-1L);
+
+    // dataCenterId占用的位数
+    private static final long DATA_CENTER_ID_BITS = 5L;
+
+    // dataCenterId占用5个比特位,最大值31
+    private static final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS);
+
+    // dataCenterId
+    private final long dataCenterId;
+
+    // workId占用的位数
+    private static final long WORKER_ID_BITS = 5L;
+
+    // workId占用5个比特位,最大值31
+    private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);
+
+    // workId
+    private final long workerId;
+
+    // 最后12位,代表每毫秒内可产生最大序列号,即 2^12 - 1 = 4095
+    private static final long SEQUENCE_BITS = 12L;
+
+    // 掩码(最低12位为1,高位都为0),主要用于与自增后的序列号进行位与,如果值为0,则代表自增后的序列号超过了4095
+    private static final long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS);
+
+    // 同一毫秒内的最新序号,最大值可为 2^12 - 1 = 4095
+    private final AtomicLong sequence = new AtomicLong(0);
+
+    // workId位需要左移的位数 12
+    private static final long WORK_ID_SHIFT = SEQUENCE_BITS;
+
+    // dataCenterId位需要左移的位数 12+5
+    private static final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;
+
+    // 时间戳需要左移的位数 12+5+5
+    private static final long TIMESTAMP_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS;
+
+    /**
+     * 无参构造
+     */
+    public SnowFlakeUtil() {
+        this(1, 1);
+    }
+
+    /**
+     * 有参构造
+     *
+     * @param dataCenterId 数据中心ID
+     * @param workerId     工作节点ID
+     */
+    public SnowFlakeUtil(long dataCenterId, long workerId) {
+        if (dataCenterId < 0 || dataCenterId > MAX_DATA_CENTER_ID) {
+            throw new IllegalArgumentException(
+                    String.format("dataCenterId 值必须大于等于 0 并且小于等于 %d", MAX_DATA_CENTER_ID));
+        }
+        if (workerId < 0 || workerId > MAX_WORKER_ID) {
+            throw new IllegalArgumentException(String.format("workId 值必须大于等于 0 并且小于等于 %d", MAX_WORKER_ID));
+        }
+        this.workerId = workerId;
+        this.dataCenterId = dataCenterId;
+    }
+
+    /**
+     * 获取唯一ID
+     *
+     * @return 唯一ID
+     */
+    public static Long getSnowFlakeId() {
+        try {
+            return snowFlakeUtil.nextId();
+        } catch (Exception e) {
+            throw new RuntimeException("生成唯一ID失败", e);
+        }
+    }
+
+    /**
+     * 通过雪花算法生成下一个id,使用CAS机制保证线程安全
+     *
+     * @return 唯一id
+     */
+    public long nextId() {
+        long currentTimeMillis = System.currentTimeMillis();
+        long lastTime = lastTimeMillis.get();
+
+        // 检查时钟回拨
+        if (currentTimeMillis < lastTime) {
+            throw new RuntimeException(
+                    String.format("可能出现服务器时钟回拨问题,请检查服务器时间。当前服务器时间戳:%d,上一次使用时间戳:%d",
+                            currentTimeMillis, lastTime));
+        }
+
+        // 同一毫秒内递增序列号
+        if (currentTimeMillis == lastTime) {
+            long currentSequence = sequence.getAndIncrement();
+            if (currentSequence > SEQUENCE_MASK) {
+                // 序列号溢出,等待下一毫秒
+                currentTimeMillis = getNextMillis(lastTime);
+                sequence.set(0); // 重置序列号
+            }
+        } else {
+            // 不在同一毫秒内,重置序列号
+            sequence.set(0);
+            lastTimeMillis.set(currentTimeMillis);
+        }
+
+        // 核心算法,将不同部分的数值移动到指定的位置,然后进行或运算
+        return ((currentTimeMillis - INIT_EPOCH) << TIMESTAMP_SHIFT)
+                | (dataCenterId << DATA_CENTER_ID_SHIFT)
+                | (workerId << WORK_ID_SHIFT)
+                | sequence.get();
+    }
+
+    /**
+     * 获取指定时间戳的接下来的时间戳,也可以说是下一毫秒
+     *
+     * @param lastTimeMillis 指定毫秒时间戳
+     * @return 时间戳
+     */
+    private long getNextMillis(long lastTimeMillis) {
+        long currentTimeMillis = System.currentTimeMillis();
+        while (currentTimeMillis <= lastTimeMillis) {
+            currentTimeMillis = System.currentTimeMillis();
+        }
+        return currentTimeMillis;
+    }
+
+
+    /**
+     * 从ID中获取时间
+     *
+     * @param id 由此类生成的ID
+     * @return 对应的时间
+     */
+    public static Date getTimeBySnowFlakeId(long id) {
+        if (id < 0) {
+            throw new IllegalArgumentException("ID不能为负数");
+        }
+        long timestamp = (TIME_BIT & id) >> TIMESTAMP_SHIFT;
+        return new Date(timestamp + INIT_EPOCH);
+    }
+
+
+
+}

+ 12 - 0
tenant/insurance/quotation-dajia/pom.xml

@@ -30,5 +30,17 @@
         </dependency>
 
     </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>14</source>
+                    <target>14</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>  

+ 28 - 11
tenant/insurance/quotation-summary/pom.xml

@@ -20,19 +20,36 @@
     <dependencies>
         <dependency>
             <groupId>com.jzg</groupId>
-            <artifactId>quotation-dajia</artifactId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>com.jzg</groupId>
-            <artifactId>quotation-zhongmei</artifactId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>com.jzg</groupId>
-            <artifactId>quotation-zijin</artifactId>
+            <artifactId>quotation-commons</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.jzg</groupId>-->
+<!--            <artifactId>quotation-dajia</artifactId>-->
+<!--            <version>1.0-SNAPSHOT</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.jzg</groupId>-->
+<!--            <artifactId>quotation-zhongmei</artifactId>-->
+<!--            <version>1.0-SNAPSHOT</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.jzg</groupId>-->
+<!--            <artifactId>quotation-zijin</artifactId>-->
+<!--            <version>1.0-SNAPSHOT</version>-->
+<!--        </dependency>-->
     </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>16</source>
+                    <target>16</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

+ 47 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/IdentifyController.java

@@ -0,0 +1,47 @@
+package com.jzg.quotation.summary.controller;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.vo.BusinessLicense;
+import com.jzg.quotation.summary.service.IdentifyService;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Map;
+
+;
+
+@RestController
+@RequestMapping("/order/identify")
+@Slf4j
+public class IdentifyController {
+
+    private final IdentifyService identifyService;
+
+    public IdentifyController(IdentifyService identifyService) {
+        this.identifyService = identifyService;
+    }
+
+    @PostMapping("/idCard")
+    @Operation(operationId = "身份证正反面识别")
+    public HttpResult<Map<String, Object>> idCard(MultipartFile image1, MultipartFile image2) throws IOException {
+        return identifyService.idCard(image1, image2);
+    }
+
+    @PostMapping("/drivingPermit")
+    @Operation(operationId = "行驶证正反面识别")
+    public HttpResult<Map<String, Object>> drivingPermit(MultipartFile image1, MultipartFile image2) throws IOException {
+        return identifyService.drivingPermit(image1, image2);
+    }
+
+    @PostMapping("/businessLicense")
+    @Operation(operationId = "营业执照识别")
+    public HttpResult<BusinessLicense> businessLicense(MultipartFile image1) {
+        return identifyService.businessLicense(image1);
+    }
+
+}

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

@@ -0,0 +1,58 @@
+package com.jzg.quotation.summary.controller;
+
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.InsOrdersParam;
+import com.jzg.commons.entity.dto.InsOrdersAdd;
+import com.jzg.quotation.summary.service.InsOrdersService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import javax.validation.constraints.NotNull;
+
+@RestController
+@RequestMapping("/supplementOrder")
+@Tag(name = "补录订单录入")
+@Validated
+@RequiredArgsConstructor
+public class InsOrdersController {
+
+    @Resource
+    private InsOrdersService insOrdersService;
+
+    @Operation(summary = "录入订单新增")
+    @PostMapping("saveOrders")
+    public HttpResult saveOrUpdate(@RequestBody InsOrdersAdd ordersAdd) {
+        return insOrdersService.saveOrders(ordersAdd);
+    }
+
+
+    @Operation(summary = "录入订单修改")
+    @PostMapping("updateOrders")
+    public HttpResult updateOrders(@RequestBody InsOrdersAdd ordersAdd) {
+        return insOrdersService.updateOrders(ordersAdd);
+    }
+
+
+    @GetMapping("deleteById")
+    @Operation(summary = "删除订单")
+    public HttpResult deleteById(@RequestParam("id") Long id) {
+        return insOrdersService.removeById(id) ? HttpResult.ok("删除成功") : HttpResult.error("删除失败");
+    }
+
+    @GetMapping("selectById")
+    @Operation(summary = "通过ID查询")
+    public HttpResult selectById(@NotNull(message = "id不能为空") @RequestParam("id") Long id) {
+        return HttpResult.ok(insOrdersService.selectById(id));
+    }
+
+    @PostMapping("pageList")
+    @Operation(summary = "订单分页列表")
+    public HttpResult pageList(@RequestBody InsOrdersParam insOrdersParam) {
+        return HttpResult.ok(insOrdersService.pageList(insOrdersParam));
+    }
+
+}

+ 10 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersCarInfoMapper.java

@@ -0,0 +1,10 @@
+package com.jzg.quotation.summary.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsOrdersCarInfoMapper extends BaseMapper<InsOrdersCarInfo> {
+}

+ 10 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersCarUserInfoMapper.java

@@ -0,0 +1,10 @@
+package com.jzg.quotation.summary.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsOrdersCarUserInfoMapper extends BaseMapper<InsOrdersCarUserInfo> {
+}

+ 9 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersKindMapper.java

@@ -0,0 +1,9 @@
+package com.jzg.quotation.summary.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.orders.po.InsOrdersKind;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsOrdersKindMapper extends BaseMapper<InsOrdersKind> {
+}

+ 20 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersMapper.java

@@ -0,0 +1,20 @@
+package com.jzg.quotation.summary.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.dto.InsOrdersParam;
+import com.jzg.commons.entity.orders.po.InsOrders;
+import com.jzg.commons.entity.vo.InsOrdersVo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsOrdersMapper extends BaseMapper<InsOrders> {
+
+
+    void pageList(InsOrdersParam insOrdersParam);
+
+
+    InsOrdersVo selectById(Long id);
+
+
+}

+ 10 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersOtherMapper.java

@@ -0,0 +1,10 @@
+package com.jzg.quotation.summary.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.orders.po.InsOrdersOther;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsOrdersOtherMapper extends BaseMapper<InsOrdersOther> {
+}

+ 9 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersRiskMapper.java

@@ -0,0 +1,9 @@
+package com.jzg.quotation.summary.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.orders.po.InsOrdersRisk;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsOrdersRiskMapper extends BaseMapper<InsOrdersRisk> {
+}

+ 9 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersTaxMapper.java

@@ -0,0 +1,9 @@
+package com.jzg.quotation.summary.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.orders.po.InsOrdersTax;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsOrdersTaxMapper extends BaseMapper<InsOrdersTax> {
+}

+ 37 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/IdentifyService.java

@@ -0,0 +1,37 @@
+package com.jzg.quotation.summary.service;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.vo.BusinessLicense;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Map;
+
+public interface IdentifyService {
+
+    /**
+     * 身份证正反面识别
+     *
+     * @param image1 正面
+     * @param image2 反面
+     * @return
+     */
+    HttpResult<Map<String, Object>> idCard(MultipartFile image1, MultipartFile image2) throws IOException;
+
+
+    /**
+     * 行驶证正反面识别
+     *
+     * @param image1 正面
+     * @param image2 反面
+     * @return
+     */
+    HttpResult<Map<String, Object>> drivingPermit(MultipartFile image1, MultipartFile image2) throws IOException;
+
+    /**
+     * 营业执照识别
+     * @param image 正面信息
+     * @return
+     */
+    HttpResult<BusinessLicense> businessLicense(MultipartFile image);
+}

+ 7 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersCarInfoService.java

@@ -0,0 +1,7 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
+
+public interface InsOrdersCarInfoService extends IService<InsOrdersCarInfo> {
+}

+ 7 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersCarUserInfoService.java

@@ -0,0 +1,7 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
+
+public interface InsOrdersCarUserInfoService extends IService<InsOrdersCarUserInfo> {
+}

+ 7 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersKindService.java

@@ -0,0 +1,7 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.orders.po.InsOrdersKind;
+
+public interface InsOrdersKindService extends IService<InsOrdersKind> {
+}

+ 7 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersOtherService.java

@@ -0,0 +1,7 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.orders.po.InsOrdersOther;
+
+public interface InsOrdersOtherService extends IService<InsOrdersOther> {
+}

+ 7 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersRiskService.java

@@ -0,0 +1,7 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.orders.po.InsOrdersRisk;
+
+public interface InsOrdersRiskService extends IService<InsOrdersRisk> {
+}

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

@@ -0,0 +1,25 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.InsOrdersParam;
+import com.jzg.commons.entity.orders.po.InsOrders;
+import com.jzg.commons.entity.dto.InsOrdersAdd;
+import com.jzg.commons.entity.vo.InsOrdersVo;
+
+import java.util.List;
+
+public interface InsOrdersService extends IService<InsOrders> {
+
+
+    HttpResult saveOrders(InsOrdersAdd ordersAdd);
+
+
+    List<InsOrders> pageList(InsOrdersParam insOrdersParam);
+
+
+    InsOrdersVo selectById(Long id);
+
+
+    HttpResult updateOrders(InsOrdersAdd ordersAdd);
+}

+ 7 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersTaxService.java

@@ -0,0 +1,7 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.orders.po.InsOrdersTax;
+
+public interface InsOrdersTaxService extends IService<InsOrdersTax> {
+}

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

@@ -0,0 +1,220 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.jzg.commons.config.DictEnumConfig;
+import com.jzg.commons.constants.DictionaryData;
+import com.jzg.commons.constants.DictionaryManagement;
+import com.jzg.commons.constants.OrderCacheConstant;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.vo.BusinessLicense;
+import com.jzg.commons.entity.vo.CardUserInfo;
+import com.jzg.commons.entity.vo.CustomerInfoVO;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.util.AssertionUtils;
+import com.jzg.commons.util.ObjectUtil;
+import com.jzg.commons.util.StringUtils;
+import com.jzg.quotation.commons.utils.BusinessLicenseRecognitionUtils;
+import com.jzg.quotation.commons.utils.Idcard;
+import com.jzg.quotation.commons.utils.ImageCompressionUtils;
+import com.jzg.quotation.commons.utils.MultiObjectDetectUtils;
+import com.jzg.quotation.summary.service.IdentifyService;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author wenks
+ * @version 0.0.2
+ * @description 识别
+ * @date 2023/5/6 15:54
+ */
+@Slf4j
+@Service
+public class IdentifyServiceImpl implements IdentifyService {
+
+
+    @Resource
+    private RedissonClient redissonClient;
+
+    @Override
+    public HttpResult<Map<String, Object>> idCard(MultipartFile image1, MultipartFile image2) throws IOException {
+        Map<String, Object> resultMap = new HashMap<>();
+        CustomerInfoVO customerInfoVO = new CustomerInfoVO();
+        // 处理 image1 (身份证正面)
+        processImage(image1, "front", customerInfoVO);
+        // 处理 image2 (身份证背面)
+        processImage(image2, "back", customerInfoVO);
+        // 校验是否成功识别身份证信息
+        if (ObjectUtil.isAllFieldNull(customerInfoVO)) {
+            throw new RuntimeException("身份证识别失败");
+        }
+        resultMap.put("customerInfo", customerInfoVO);
+        return HttpResult.ok("success", resultMap);
+    }
+
+    /**
+     * 处理单张图片的逻辑
+     */
+    private void processImage(MultipartFile image, String side, CustomerInfoVO customerInfoVO) {
+        if (image == null || image.isEmpty()) {
+            return;
+        }
+        try {
+            String md5 = DigestUtils.md5Hex(image.getBytes());
+            String base64 = byteToBase64(image);
+            String cacheKey = OrderCacheConstant.IMAGE_IDENTIFY_KEY + "idCard:" + side + ":" + md5;
+            // 从缓存中获取数据
+            Object cachedData = redissonClient.getBucket(cacheKey).get();
+            if (StringUtils.isNotBlank(base64) && !ObjectUtil.isAllFieldNull(cachedData)) {
+                // 缓存命中,直接复制属性
+                CustomerInfoVO cachedVO = new CustomerInfoVO();
+                BeanUtils.copyProperties(cachedData, cachedVO);
+                if ("front".equals(side)) {
+                    Idcard.conversionFront(customerInfoVO, cachedVO);
+                } else if ("back".equals(side)) {
+                    Idcard.conversionBack(customerInfoVO, cachedVO);
+                }
+            } else {
+                // 缓存未命中,进行身份证识别
+                if ("front".equals(side)) {
+                    Idcard.getIdCardFront(base64, customerInfoVO);
+                } else if ("back".equals(side)) {
+                    Idcard.getIdCardBack(base64, customerInfoVO);
+                }
+                // 设置缓存
+                redissonClient.getBucket(cacheKey).set(customerInfoVO, 1, TimeUnit.DAYS);
+            }
+        } catch (Exception e) {
+            // 记录日志并忽略当前图片处理失败的情况
+            log.error("处理图片失败: {}", e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public HttpResult<Map<String, Object>> drivingPermit(MultipartFile image1, MultipartFile image2) throws IOException {
+        Map<String, Object> map = new HashMap<>();
+        CardUserInfo cardUserInfo = new CardUserInfo();
+        // 处理行驶证正面图片
+        processImage(image1, "front", cardUserInfo);
+        // 处理行驶证反面图片
+        processImage(image2, "back", cardUserInfo);
+        // 校验行驶证正面识别是否成功
+        AssertionUtils.isEmpty(cardUserInfo, "行驶证正面识别失败");
+        // 处理营运和非营运逻辑
+        cardUserInfo = convertUseNatureCode(cardUserInfo);
+        // 返回结果
+        map.put("carInfo", cardUserInfo);
+        return HttpResult.ok("success", map);
+    }
+
+    /**
+     * 处理单张图片的逻辑
+     */
+    private void processImage(MultipartFile image, String side, CardUserInfo cardUserInfo) {
+        if (image == null) {
+            return;
+        }
+        try {
+            String imageMD5 = DigestUtils.md5Hex(image.getBytes());
+            String imageBase64 = byteToBase64(image);
+            String cacheKey = OrderCacheConstant.IMAGE_IDENTIFY_KEY + "drivingPermit:" + side + ":" + imageMD5;
+            // 检查缓存
+            Object cachedValue = redissonClient.getBucket(cacheKey).get();
+            if (StringUtils.isNotBlank(imageBase64) && !ObjectUtil.isAllFieldNull(cachedValue)) {
+                // 走缓存
+                CardUserInfo cachedCardUserInfo = new CardUserInfo();
+                BeanUtils.copyProperties(cachedValue, cachedCardUserInfo);
+                MultiObjectDetectUtils.conversion(side, cardUserInfo, cachedCardUserInfo);
+            } else {
+                // 执行识别逻辑
+                if ("front".equals(side)) {
+                    MultiObjectDetectUtils.drivingPermitFront(imageBase64, cardUserInfo);
+                } else if ("back".equals(side)) {
+                    MultiObjectDetectUtils.drivingPermitBack(imageBase64, cardUserInfo);
+                }
+                // 设置缓存
+                redissonClient.getBucket(cacheKey).set(cardUserInfo, 1, TimeUnit.DAYS);
+            }
+        } catch (Exception e) {
+            // 记录异常日志
+            log.error("处理行驶证{}面图片时发生异常: {}", side, e.getMessage(), e);
+            throw new RuntimeException("处理行驶证" + side + "面图片时发生异常");
+        }
+    }
+
+    /**
+     * @Description  将车辆的性质做字典转换
+     * @Author  hxl
+     * @Date   2024/4/10 11:07
+     * @Param
+     * @Return
+     * @Exception
+     */
+    private CardUserInfo  convertUseNatureCode(CardUserInfo cardUserInfo) {
+        String useNature = cardUserInfo.getUseNature();
+        if(useNature!=null && !"".equals(useNature)){
+            if("营运".equals(useNature) || "货运".equals(useNature)){
+                useNature="营业";
+            }else if("非营运".equals(useNature)){
+                useNature="非营业";
+            }else{
+                useNature="";
+            }
+        }
+        String useNatureKey = getString(useNature);
+        cardUserInfo.setUseNature(useNatureKey==null?"":useNatureKey);
+        return cardUserInfo;
+    }
+
+    private static String getString(String useNature) {
+        Map<String, String> enumMap= new HashMap<>();
+        Map<String, DictionaryManagement> m = DictEnumConfig.getDmMap();
+        DictionaryManagement natureOfVehicleUse = m.get("natureOfVehicleUse");
+        List<DictionaryData> ddList = natureOfVehicleUse.getDdList();
+        if(ddList!=null && !ddList.isEmpty()){
+            for (DictionaryData dictionaryData : ddList) {
+                enumMap.put(dictionaryData.getDictTag(),dictionaryData.getDictValue());
+            }
+        }
+        String useNatureKey = enumMap.get(useNature);
+        return useNatureKey;
+    }
+
+
+    @Override
+    public HttpResult<BusinessLicense> businessLicense(MultipartFile image) {
+        String s1 = byteToBase64(image);
+        BusinessLicense businessLicense = new BusinessLicense();
+        BusinessLicenseRecognitionUtils.gettingData(s1, businessLicense);
+        return HttpResult.ok("success", businessLicense);
+    }
+
+
+    private String byteToBase64(MultipartFile file) {
+        if (ObjectUtils.isEmpty(file)) {
+            return "";
+        }        // 转换后的图片
+        try {
+            byte[] bytesBytes = ImageCompressionUtils.compressPicForScale(file.getBytes(), 2048);
+            return Base64.getEncoder().encodeToString(bytesBytes);
+        } catch (IOException e) {
+            throw new SystemException("图片压缩异常请重试.......");
+        }
+
+    }
+
+
+
+
+}

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

@@ -0,0 +1,11 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
+import com.jzg.quotation.summary.mapper.InsOrdersCarInfoMapper;
+import com.jzg.quotation.summary.service.InsOrdersCarInfoService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class InsOrdersCarInfoServiceImpl extends ServiceImpl<InsOrdersCarInfoMapper, InsOrdersCarInfo> implements InsOrdersCarInfoService {
+}

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

@@ -0,0 +1,11 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
+import com.jzg.quotation.summary.mapper.InsOrdersCarUserInfoMapper;
+import com.jzg.quotation.summary.service.InsOrdersCarUserInfoService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class InsOrdersCarUserInfoServiceImpl extends ServiceImpl<InsOrdersCarUserInfoMapper, InsOrdersCarUserInfo> implements InsOrdersCarUserInfoService {
+}

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

@@ -0,0 +1,11 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.orders.po.InsOrdersKind;
+import com.jzg.quotation.summary.mapper.InsOrdersKindMapper;
+import com.jzg.quotation.summary.service.InsOrdersKindService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class InsOrdersKindServiceImpl extends ServiceImpl<InsOrdersKindMapper, InsOrdersKind> implements InsOrdersKindService {
+}

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

@@ -0,0 +1,11 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.orders.po.InsOrdersOther;
+import com.jzg.quotation.summary.mapper.InsOrdersOtherMapper;
+import com.jzg.quotation.summary.service.InsOrdersOtherService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class InsOrdersOtherServiceImpl extends ServiceImpl<InsOrdersOtherMapper, InsOrdersOther> implements InsOrdersOtherService {
+}

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

@@ -0,0 +1,11 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.orders.po.InsOrdersRisk;
+import com.jzg.quotation.summary.mapper.InsOrdersRiskMapper;
+import com.jzg.quotation.summary.service.InsOrdersRiskService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class InsOrdersRiskServiceImpl extends ServiceImpl<InsOrdersRiskMapper, InsOrdersRisk> implements InsOrdersRiskService {
+}

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

@@ -0,0 +1,139 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.InsOrdersParam;
+import com.jzg.commons.entity.orders.po.*;
+import com.jzg.commons.entity.dto.InsOrdersAdd;
+import com.jzg.commons.entity.dto.InsuranceInfo;
+import com.jzg.commons.entity.vo.InsOrdersVo;
+import com.jzg.quotation.commons.utils.SnowFlakeUtil;
+import com.jzg.quotation.summary.mapper.InsOrdersMapper;
+import com.jzg.quotation.summary.service.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders> implements InsOrdersService {
+
+    @Autowired
+    private InsOrdersMapper insOrdersMapper;
+
+    @Autowired
+    private InsOrdersCarInfoService ordersCarInfoService;
+
+    @Autowired
+    private InsOrdersCarUserInfoService ordersCarUserInfoService;
+
+    @Autowired
+    private InsOrdersOtherService insOrdersOtherService;
+
+    @Autowired
+    private InsOrdersKindService insOrdersKindService;
+
+    @Autowired
+    private InsOrdersRiskService insOrdersRiskService;
+
+    @Autowired
+    private InsOrdersTaxService insOrdersTaxService;
+
+    /**
+     * 保存订单信息
+     *
+     * @param ordersAdd 包含订单信息、车辆信息和用户信息的综合对象
+     * @return 返回HTTP结果对象,表示保存操作的成功或失败
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult saveOrders(InsOrdersAdd ordersAdd) {
+        // 检查输入参数是否为空,如果为空则返回错误信息
+        if (ordersAdd == null || ordersAdd.getInsOrders() == null || ordersAdd.getCarInfoVo() == null
+                || ordersAdd.getCarUserInfoList() == null || ordersAdd.getInsOrdersOther() == null
+                || ordersAdd.getInsuranceInfo() == null) {
+            return HttpResult.error("参数不能为空");
+        }
+
+        try {
+            // 获取订单对象并设置引用编号
+            InsOrders insOrders = ordersAdd.getInsOrders();
+            Long quoteNo = SnowFlakeUtil.getSnowFlakeId();
+            // 如果生成的引用编号为空,则返回错误信息
+            if (quoteNo == null) {
+                return HttpResult.error("生成引用编号失败");
+            }
+            insOrders.setQuoteNo(quoteNo);
+
+            // 插入订单信息,如果插入失败,则返回错误信息
+            int insertResult = insOrdersMapper.insert(insOrders);
+            if (insertResult <= 0) {
+                log.error("订单插入失败,订单信息: {}");
+                return HttpResult.error("保存订单失败");
+            }
+
+            // 获取车辆信息对象,并设置订单编号,然后保存车辆信息
+            InsOrdersCarInfo carInfoVo = ordersAdd.getCarInfoVo();
+            carInfoVo.setOrderNo(quoteNo);
+            ordersCarInfoService.save(carInfoVo);
+
+            // 获取用户信息对象,并设置订单编号,然后保存用户信息
+            List<InsOrdersCarUserInfo> carUserInfoList = ordersAdd.getCarUserInfoList();
+            for (InsOrdersCarUserInfo carUserInfo : carUserInfoList) {
+                carUserInfo.setOrderNo(quoteNo);
+            }
+            ordersCarUserInfoService.saveBatch(carUserInfoList);
+
+            // 保险订单其他信息
+            InsOrdersOther insOrdersOther = ordersAdd.getInsOrdersOther();
+            insOrdersOther.setOrderNo(quoteNo);
+            insOrdersOtherService.save(insOrdersOther);
+
+            // 保险信息
+            InsuranceInfo insuranceInfo = ordersAdd.getInsuranceInfo();
+            // 保险种类信息
+            InsOrdersKind insOrdersKind = insuranceInfo.getInsOrdersKind();
+            insOrdersKind.setOrderNo(quoteNo);
+            insOrdersKindService.save(insOrdersKind);
+
+            // 税费信息
+            InsOrdersTax insOrdersTax = insuranceInfo.getInsOrdersTax();
+            insOrdersTax.setOrderNo(quoteNo);
+            insOrdersTaxService.save(insOrdersTax);
+
+            // 风险信息
+            InsOrdersRisk insOrdersRisk = insuranceInfo.getInsOrdersRisk();
+            insOrdersRisk.setOrderNo(quoteNo);
+            insOrdersRiskService.save(insOrdersRisk);
+
+            // 返回成功信息,表示订单、车辆和用户信息保存成功
+            return HttpResult.ok("保存成功");
+
+        } catch (Exception e) {
+            // 如果在保存过程中发生异常,则记录日志并抛出运行时异常
+            log.error("保存订单时发生异常", e);
+            throw new RuntimeException("保存订单失败,请检查输入数据", e);
+        }
+    }
+
+
+    @Override
+    public HttpResult updateOrders(InsOrdersAdd ordersAdd) {
+        return null;
+    }
+
+
+    @Override
+    public List<InsOrders> pageList(InsOrdersParam insOrdersParam) {
+        insOrdersMapper.pageList(insOrdersParam);
+        return List.of();
+    }
+
+    @Override
+    public InsOrdersVo selectById(Long id) {
+        return insOrdersMapper.selectById(id);
+    }
+
+
+}

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

@@ -0,0 +1,11 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.orders.po.InsOrdersTax;
+import com.jzg.quotation.summary.mapper.InsOrdersTaxMapper;
+import com.jzg.quotation.summary.service.InsOrdersTaxService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class InsOrdersTaxServiceImpl extends ServiceImpl<InsOrdersTaxMapper, InsOrdersTax> implements InsOrdersTaxService {
+}

+ 12 - 1
tenant/insurance/quotation-summary/src/main/resources/application.yaml

@@ -22,6 +22,9 @@ spring:
       - nacos:minio
       - nacos:mongodb
       - nacos:identify
+  servlet:
+    multipart:
+      max-file-size: 10MB
 
 mybatis-plus:
   mapper-locations: classpath*:/mapper/*Mapper.xml
@@ -59,4 +62,12 @@ rocketmq:
     # 启动后会自动在topic上拼接激活的配置文件,达到自动隔离的效果
     enabledIsolation: true
     # 隔离环境名称,拼接到topic后,topic_dev,默认空字符串
-    environment: dev
+    environment: dev
+
+#百度图片识别API
+baidu:
+  clientId: xG9M8tSjNvYPwSTNavM0ELlD
+  clientSecret: riYIRG67akE5FGVwnHE3dGBly5zmdS6t
+  authHost: https://aip.baidubce.com/oauth/2.0/token?
+  vehicle: https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_license
+  idcard: https://aip.baidubce.com/rest/2.0/ocr/v1/idcard

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

@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jzg.quotation.summary.mapper.InsOrdersMapper">
+    <resultMap id="InsOrdersMap" type="com.jzg.commons.entity.orders.po.InsOrders">
+        <id property="id" column="id" jdbcType="VARCHAR"/>
+        <result property="quoteNo" column="quote_no" jdbcType="VARCHAR"/>
+        <result property="agreementId" column="agreement_id" jdbcType="VARCHAR"/>
+        <result property="apiType" column="api_type" jdbcType="VARCHAR"/>
+        <result property="orderStatus" column="order_status" jdbcType="VARCHAR"/>
+        <result property="companyId" column="company_id" jdbcType="VARCHAR"/>
+        <result property="companyName" column="company_name" jdbcType="VARCHAR"/>
+        <result property="productId" column="product_id" jdbcType="VARCHAR"/>
+        <result property="productName" column="product_name" jdbcType="VARCHAR"/>
+        <result property="entryStatus" column="entry_status" jdbcType="VARCHAR"/>
+        <result property="orderSource" column="order_source" jdbcType="VARCHAR"/>
+        <result property="auditId" column="audit_id" jdbcType="VARCHAR"/>
+        <result property="auditName" column="audit_name" jdbcType="VARCHAR"/>
+        <result property="auditTime" column="audit_time" jdbcType="VARCHAR"/>
+        <result property="auditOpinion" column="audit_opinion" jdbcType="VARCHAR"/>
+        <result property="payTime" column="pay_time" jdbcType="VARCHAR"/>
+        <result property="payLink" column="pay_link" jdbcType="VARCHAR"/>
+        <result property="insOrderNo" column="ins_order_no" jdbcType="VARCHAR"/>
+        <result property="signingTime" column="signing_time" jdbcType="VARCHAR"/>
+        <result property="isTemporarily" column="is_temporarily" jdbcType="VARCHAR"/>
+    </resultMap>
+    <!--    订单 车辆信息-->
+    <resultMap id="carInfoMap" type="com.jzg.commons.entity.orders.po.InsOrdersCarInfo">
+        <id property="orderNo" column="order_no" jdbcType="VARCHAR"/>
+        <result property="licenseNo" column="license_no" jdbcType="VARCHAR"/>
+        <result property="isRegistered" column="is_registered" jdbcType="VARCHAR"/>
+        <result property="vinNo" column="vin_no" jdbcType="VARCHAR"/>
+        <result property="brandName" column="brand_name" jdbcType="VARCHAR"/>
+        <result property="engineNo" column="engine_no" jdbcType="VARCHAR"/>
+        <result property="carYear" column="car_year" jdbcType="VARCHAR"/>
+        <result property="seatCount" column="seat_count" jdbcType="VARCHAR"/>
+        <result property="completeKerbMass" column="complete_kerb_mass" jdbcType="VARCHAR"/>
+        <result property="limitLoad" column="limit_load" jdbcType="VARCHAR"/>
+        <result property="powerScale" column="power_scale" jdbcType="VARCHAR"/>
+        <result property="purchasePrice" column="purchase_price" jdbcType="VARCHAR"/>
+        <result property="carNatureCode" column="car_nature_code" jdbcType="VARCHAR"/>
+        <result property="vehicleUseCode" column="vehicle_use_code" jdbcType="VARCHAR"/>
+        <result property="carTypeCode" column="car_type_code" jdbcType="VARCHAR"/>
+        <result property="carKindCode" column="car_kind_code" jdbcType="VARCHAR"/>
+        <result property="energyTypeCode" column="energy_type_code" jdbcType="VARCHAR"/>
+        <result property="propertyCode" column="property_code" jdbcType="VARCHAR"/>
+        <result property="licenseColorCode" column="license_color_code" jdbcType="VARCHAR"/>
+        <result property="carKindDetailIdCode" column="car_kind_detail_id_code" jdbcType="VARCHAR"/>
+        <result property="licenseKindCode" column="license_kind_code" jdbcType="VARCHAR"/>
+        <result property="registerDate" column="register_date" jdbcType="VARCHAR"/>
+        <result property="issueDate" column="issue_date" jdbcType="VARCHAR"/>
+        <result property="transferDate" column="transfer_date" jdbcType="VARCHAR"/>
+        <result property="transfer" column="transfer" jdbcType="VARCHAR"/>
+    </resultMap>
+    <!--    订单 车辆人员信息 -->
+    <resultMap id="carUserInfoMap" type="com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo">
+        <id property="orderNo" column="order_no" jdbcType="VARCHAR"/>
+        <result property="policyPersonType" column="policy_person_type" jdbcType="VARCHAR"/>
+        <result property="personType" column="person_type" jdbcType="VARCHAR"/>
+        <result property="cerType" column="cer_type" jdbcType="VARCHAR"/>
+        <result property="name" column="name" jdbcType="VARCHAR"/>
+        <result property="identifyNumber" column="identify_number" jdbcType="VARCHAR"/>
+        <result property="age" column="age" jdbcType="VARCHAR"/>
+        <result property="gender" column="gender" jdbcType="VARCHAR"/>
+        <result property="provinceCode" column="province_code" jdbcType="VARCHAR"/>
+        <result property="cityCode" column="city_code" jdbcType="VARCHAR"/>
+        <result property="countyCode" column="county_code" jdbcType="VARCHAR"/>
+        <result property="addr" column="addr" jdbcType="VARCHAR"/>
+        <result property="identifyValidDate" column="identify_valid_date" jdbcType="VARCHAR"/>
+        <result property="identifyValidEndDate" column="identify_valid_end_date" jdbcType="VARCHAR"/>
+        <result property="mobile" column="mobile" jdbcType="VARCHAR"/>
+        <result property="landline" column="landline" jdbcType="VARCHAR"/>
+        <result property="email" column="email" jdbcType="VARCHAR"/>
+        <result property="contact" column="contact" jdbcType="VARCHAR"/>
+        <result property="contactIdentifyNumber" column="contact_identify_number" jdbcType="VARCHAR"/>
+        <result property="contactIdentifyValidDate" column="contact_identify_valid_date" jdbcType="VARCHAR"/>
+        <result property="contactIdentifyValidEndDate" column="contact_identify_valid_end_date" jdbcType="VARCHAR"/>
+        <result property="email" column="email" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <!--  费用  -->
+    <resultMap id="ordersCostsMap" type="com.jzg.commons.entity.orders.po.InsOrdersCosts">
+        <id property="orderNo" column="order_no" jdbcType="VARCHAR"/>
+        <result property="jqPremium" column="jq_premium" jdbcType="VARCHAR"/>
+        <result property="syPremium" column="sy_premium" jdbcType="VARCHAR"/>
+        <result property="jyPremium" column="jy_premium" jdbcType="VARCHAR"/>
+        <result property="sumPremium" column="sum_premium" jdbcType="VARCHAR"/>
+        <result property="taxPremium" column="tax_premium" jdbcType="VARCHAR"/>
+        <result property="jqRatio" column="jq_ratio" jdbcType="VARCHAR"/>
+        <result property="syRatio" column="sy_ratio" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <!--订单 险种表-->
+    <resultMap id="OrdersKindMap" type="com.jzg.commons.entity.orders.po.InsOrdersKind">
+        <id property="orderNo" column="order_no" jdbcType="VARCHAR"/>
+        <result property="amount" column="amount" jdbcType="VARCHAR"/>
+        <result property="kindCode" column="kind_code" />
+        <result property="kindName" column="kind_name" />
+        <result property="serviceTimes" column="service_times" />
+        <result property="unitAmount" column="unit_amount" />
+        <result property="deductibleRate" column="deductible_rate" />
+    </resultMap>
+
+    <!-- 订单 其他属性 -->
+    <resultMap id="InsOrdersOtherMap" type="com.jzg.commons.entity.orders.po.InsOrdersOther">
+        <id property="orderNo" column="order_no" jdbcType="VARCHAR"/>
+        <result property="jqScope" column="jq_scope" jdbcType="VARCHAR"/>
+        <result property="syScope" column="sy_scope" jdbcType="VARCHAR"/>
+        <result property="lossRation" column="loss_ration" jdbcType="VARCHAR"/>
+        <result property="jqLossRation" column="jq_loss_ration" jdbcType="VARCHAR"/>
+        <result property="syLossRation" column="sy_loss_ration" jdbcType="VARCHAR"/>
+        <result property="jqRenewal" column="jq_renewal" jdbcType="VARCHAR"/>
+        <result property="syRenewal" column="sy_renewal" jdbcType="VARCHAR"/>
+        <result property="jqClaims" column="jq_claims" jdbcType="VARCHAR"/>
+        <result property="syClaims" column="sy_claims" jdbcType="VARCHAR"/>
+        <result property="isDjq" column="is_djq" jdbcType="VARCHAR"/>
+        <result property="jqAdjustRate" column="jq_adjust_rate" jdbcType="VARCHAR"/>
+        <result property="syAdjustRate" column="sy_adjust_rate" jdbcType="VARCHAR"/>
+        <result property="tpColorScore" column="tp_color_score" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <!--订单 险种-->
+    <resultMap id="InsOrdersRiskMap" type="com.jzg.commons.entity.orders.po.InsOrdersRisk">
+        <id property="orderNo" column="order_no" jdbcType="VARCHAR"/>
+        <result property="riskName" column="risk_name" jdbcType="VARCHAR"/>
+        <result property="amount" column="amount" jdbcType="VARCHAR"/>
+        <result property="commissionRate" column="commission_rate" jdbcType="VARCHAR"/>
+        <result property="premium" column="premium" jdbcType="VARCHAR"/>
+        <result property="commissionAmount" column="commission_amount" jdbcType="VARCHAR"/>
+        <result property="riskCode" column="risk_code" jdbcType="VARCHAR"/>
+        <result property="noTaxPremium" column="no_tax_premium" jdbcType="VARCHAR"/>
+        <result property="startDate" column="start_date" jdbcType="VARCHAR"/>
+        <result property="endDate" column="end_date" jdbcType="VARCHAR"/>
+    </resultMap>
+
+
+    <!--订单 车船税-->
+    <resultMap id="InsOrdersTaxMap" type="com.jzg.commons.entity.orders.po.InsOrdersTax">
+        <id property="orderNo" column="order_no" jdbcType="VARCHAR"/>
+        <result property="extendChar2" column="extend_char2" jdbcType="VARCHAR"/>
+        <result property="taxRelief" column="tax_relief" jdbcType="VARCHAR"/>
+        <result property="relifReason" column="relif_reason" jdbcType="VARCHAR"/>
+        <result property="taxComCode" column="tax_com_code" jdbcType="VARCHAR"/>
+        <result property="taxComName" column="tax_com_name" jdbcType="VARCHAR"/>
+        <result property="taxDocumentDate" column="tax_document_date" jdbcType="VARCHAR"/>
+        <result property="taxPaidAreaCode" column="tax_paid_area_code" jdbcType="VARCHAR"/>
+        <result property="paidFreeCertificate" column="paid_free_certificate" jdbcType="VARCHAR"/>
+        <result property="taxpayerName" column="taxpayer_name" jdbcType="VARCHAR"/>
+        <result property="taxpayerIdentifier" column="taxpayer_identifier" jdbcType="VARCHAR"/>
+        <result property="identifyNumber" column="identify_number" jdbcType="VARCHAR"/>
+        <result property="taxRelifFlag" column="tax_relif_flag" jdbcType="VARCHAR"/>
+    </resultMap>
+
+
+    <resultMap id="InsOrdersVoMap" type="com.jzg.commons.entity.vo.InsOrdersVo">
+        <result property="id" column="id" jdbcType="VARCHAR"/>
+        <result property="quoteNo" column="quote_no" jdbcType="VARCHAR"/>
+        <association property="insOrders" column="{id=id}" select="selectOrdersById" />
+        <association property="carInfoVo" column="{orderNo  = quote_no}" select="selectOrdersCarInfoByOrderNo" />
+        <association property="insOrdersOther" column="{orderNo  = quote_no}" select="selectOrdersOtherByOrderNo" />
+        <association property="insuranceInfo"  javaType="com.jzg.commons.entity.dto.InsuranceInfo" >
+            <association property="insOrdersKind" column="{orderNo  = quote_no}" select="selectOrdersKind" />
+            <association property="insOrdersTax"  column="{orderNo  = quote_no}" select="selectOrdersTax" />
+            <association property="insOrdersRisk"  column="{orderNo  = quote_no}" select="selectOrdersRisk" />
+        </association>
+        <collection property="carUserInfoList"  column="{orderNo  = quote_no}"  select="selectCarUserInfo" />
+    </resultMap>
+
+
+    <select id="selectOrdersRisk" resultMap="InsOrdersRiskMap">
+        select  * from  ins_orders_risk where order_no = #{orderNo}
+    </select>
+
+    <select id="selectOrdersTax" resultMap="InsOrdersTaxMap">
+        select  * from  ins_orders_tax where order_no = #{orderNo}
+    </select>
+
+    <select id="selectOrdersKind" resultMap="OrdersKindMap">
+        select  * from  ins_orders_kind where order_no = #{orderNo}
+    </select>
+
+
+    <select id="pageList" resultMap="InsOrdersMap">
+    </select>
+
+    <select id="selectOrdersById" resultMap="InsOrdersMap">
+        select * from  ins_orders where id = #{id}
+    </select>
+
+    <select id="selectCarUserInfo" resultMap="carUserInfoMap">
+        select * from ins_orders_car_user_info  where order_no = #{orderNo}
+    </select>
+    
+    <select id="selectOrdersCarInfoByOrderNo" resultMap="carInfoMap">
+        select * from ins_orders_car_info where order_no = #{orderNo}
+    </select>
+
+
+    <select id="selectOrdersOtherByOrderNo" resultMap="InsOrdersOtherMap">
+        select * from ins_orders_other where order_no = #{orderNo}
+    </select>
+    
+    <select id="selectById" resultMap="InsOrdersVoMap">
+        select id, quote_no from ins_orders where id = #{id}
+    </select>
+
+
+</mapper>

+ 12 - 0
tenant/insurance/quotation-zhongmei/pom.xml

@@ -24,5 +24,17 @@
             <scope>compile</scope>
         </dependency>
     </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>14</source>
+                    <target>14</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

+ 12 - 0
tenant/insurance/quotation-zijin/pom.xml

@@ -24,5 +24,17 @@
             <scope>compile</scope>
         </dependency>
     </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>14</source>
+                    <target>14</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

+ 8 - 0
tenant/organization/pom.xml

@@ -51,6 +51,14 @@
                     <mainClass>com.jzg.organization.OrganizationApplication</mainClass>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>16</source>
+                    <target>16</target>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>