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

Merge remote-tracking branch 'origin/test' into test

# Conflicts:
#	src/main/java/com/ydtech/modules/order/entity/InsAreaCompany.java
Qchen 1 год назад
Родитель
Сommit
72dca97a24
100 измененных файлов с 4030 добавлено и 272 удалено
  1. 25 0
      sql/Online.sql
  2. 7 4
      src/main/java/com/ydtech/aop/LogAspect.java
  3. 5 0
      src/main/java/com/ydtech/components/TokenInterceptor.java
  4. 45 0
      src/main/java/com/ydtech/constants/enums/dict/ZmTransferType.java
  5. 9 60
      src/main/java/com/ydtech/modules/admin/controller/SysLoginController.java
  6. 7 0
      src/main/java/com/ydtech/modules/admin/controller/SysSwitchConfigController.java
  7. 6 0
      src/main/java/com/ydtech/modules/admin/controller/SysUserController.java
  8. 60 40
      src/main/java/com/ydtech/modules/admin/controller/deptBalance/DeptBalanceController.java
  9. 22 0
      src/main/java/com/ydtech/modules/admin/controller/taskStatistics/TaskStatisticsController.java
  10. 86 0
      src/main/java/com/ydtech/modules/admin/dao/PartnerWalletMapper.java
  11. 3 0
      src/main/java/com/ydtech/modules/admin/dao/TaskStatisticsMapper.java
  12. 54 0
      src/main/java/com/ydtech/modules/admin/model/dto/ChannelDetailsExport.java
  13. 3 0
      src/main/java/com/ydtech/modules/admin/model/dto/QuotationDetailsExcel.java
  14. 5 0
      src/main/java/com/ydtech/modules/admin/model/dto/SysPartnerConsoleDto.java
  15. 24 0
      src/main/java/com/ydtech/modules/admin/model/dto/partner/CopartnerAndStudioNumberDTO.java
  16. 20 0
      src/main/java/com/ydtech/modules/admin/model/dto/partner/PartnerDataDTO.java
  17. 21 0
      src/main/java/com/ydtech/modules/admin/service/PartnerWalletService.java
  18. 31 0
      src/main/java/com/ydtech/modules/admin/service/SysLoginService.java
  19. 49 20
      src/main/java/com/ydtech/modules/admin/service/SysUserService.java
  20. 6 0
      src/main/java/com/ydtech/modules/admin/service/TaskStatisticsService.java
  21. 111 0
      src/main/java/com/ydtech/modules/admin/service/impl/PartnerWalletServiceImpl.java
  22. 130 0
      src/main/java/com/ydtech/modules/admin/service/impl/SysLoginServiceImpl.java
  23. 9 0
      src/main/java/com/ydtech/modules/admin/service/impl/SysUserServiceImpl.java
  24. 70 0
      src/main/java/com/ydtech/modules/admin/service/impl/TaskStatisticsServiceImpl.java
  25. 17 0
      src/main/java/com/ydtech/modules/equity/components/EquityApiConfigurationProperties.java
  26. 132 0
      src/main/java/com/ydtech/modules/equity/components/EquityRequestApiComponents.java
  27. 126 0
      src/main/java/com/ydtech/modules/equity/controller/EquityController.java
  28. 18 0
      src/main/java/com/ydtech/modules/equity/dao/InsAreaCompanyEquityMapper.java
  29. 103 0
      src/main/java/com/ydtech/modules/equity/model/InsAreaCompanyEquity.java
  30. 17 0
      src/main/java/com/ydtech/modules/equity/model/request/BaseRequest.java
  31. 23 0
      src/main/java/com/ydtech/modules/equity/model/request/ThreeOrderVo.java
  32. 21 0
      src/main/java/com/ydtech/modules/equity/model/request/ThreePointVo.java
  33. 54 0
      src/main/java/com/ydtech/modules/equity/model/request/ThreeRightsInfoPageVo.java
  34. 36 0
      src/main/java/com/ydtech/modules/equity/model/request/ThreeUserOrderListVo.java
  35. 231 0
      src/main/java/com/ydtech/modules/equity/model/request/ThreeUserOrderVo.java
  36. 24 0
      src/main/java/com/ydtech/modules/equity/model/response/BaseResponse.java
  37. 164 0
      src/main/java/com/ydtech/modules/equity/model/response/LocalEquityPackageAssociation.java
  38. 127 0
      src/main/java/com/ydtech/modules/equity/model/response/LocalEquityPackagePage.java
  39. 25 0
      src/main/java/com/ydtech/modules/equity/model/response/PageResultResponse.java
  40. 31 0
      src/main/java/com/ydtech/modules/equity/model/response/PointRatioDto.java
  41. 23 0
      src/main/java/com/ydtech/modules/equity/model/vo/AddEquityPageQueryVo.java
  42. 53 0
      src/main/java/com/ydtech/modules/equity/model/vo/EquityPackageVo.java
  43. 40 0
      src/main/java/com/ydtech/modules/equity/model/vo/EquityPageQueryVo.java
  44. 81 0
      src/main/java/com/ydtech/modules/equity/model/vo/EquitySaveVo.java
  45. 70 0
      src/main/java/com/ydtech/modules/equity/service/EquityService.java
  46. 13 0
      src/main/java/com/ydtech/modules/equity/service/InsAreaCompanyEquityService.java
  47. 334 0
      src/main/java/com/ydtech/modules/equity/service/impl/EquityServiceImpl.java
  48. 22 0
      src/main/java/com/ydtech/modules/equity/service/impl/InsAreaCompanyEquityServiceImpl.java
  49. 92 0
      src/main/java/com/ydtech/modules/equity/utils/SMCheckDataUtils.java
  50. 127 54
      src/main/java/com/ydtech/modules/fee/dto/vo/RuleAttrMappingVo.java
  51. 3 2
      src/main/java/com/ydtech/modules/fee/service/FeeRuleSchemeNewService.java
  52. 29 16
      src/main/java/com/ydtech/modules/fee/service/impl/FeeRuleSchemeServiceNewImpl.java
  53. 7 0
      src/main/java/com/ydtech/modules/fnc/service/impl/InsFeeAuditServiceImpl.java
  54. 29 8
      src/main/java/com/ydtech/modules/fnc/service/impl/InsPlyIncomeServiceImpl.java
  55. 15 0
      src/main/java/com/ydtech/modules/ins/model/vo/QuoteRespVo.java
  56. 8 1
      src/main/java/com/ydtech/modules/ins/model/yc/YcBuildData.java
  57. 19 5
      src/main/java/com/ydtech/modules/ins/model/yc/ruote/Vhl.java
  58. 17 5
      src/main/java/com/ydtech/modules/order/aop/aspect/QuoteVerificationAspect.java
  59. 1 0
      src/main/java/com/ydtech/modules/order/components/dajia/DaJiaRequestApiComponents.java
  60. 6 0
      src/main/java/com/ydtech/modules/order/constants/InsuranceTypeCorrespondence.java
  61. 54 0
      src/main/java/com/ydtech/modules/order/constants/ya/CarDamageVerification.java
  62. 11 2
      src/main/java/com/ydtech/modules/order/controller/ExternalOrderController.java
  63. 80 0
      src/main/java/com/ydtech/modules/order/controller/InsCrawlerOrderController.java
  64. 11 4
      src/main/java/com/ydtech/modules/order/controller/OrderTaskImageController.java
  65. 10 0
      src/main/java/com/ydtech/modules/order/controller/QrCodeController.java
  66. 14 3
      src/main/java/com/ydtech/modules/order/controller/QuoteController.java
  67. 2 2
      src/main/java/com/ydtech/modules/order/controller/YongChengOrderApiController.java
  68. 1 1
      src/main/java/com/ydtech/modules/order/dao/SysQuoteRecordMapper.java
  69. 6 0
      src/main/java/com/ydtech/modules/order/entity/InsAreaCompany.java
  70. 6 0
      src/main/java/com/ydtech/modules/order/entity/InsOrders.java
  71. 175 11
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/InsurePremiumRequest.java
  72. 35 6
      src/main/java/com/ydtech/modules/order/entity/api/pingan/utils/PDFUtil.java
  73. 10 0
      src/main/java/com/ydtech/modules/order/entity/crawler/request/CrawlerBaseRequest.java
  74. 25 0
      src/main/java/com/ydtech/modules/order/entity/crawler/request/CrawlerQuoteRequest.java
  75. 4 0
      src/main/java/com/ydtech/modules/order/entity/crawler/request/TsCrawlerLoginRequest.java
  76. 44 0
      src/main/java/com/ydtech/modules/order/entity/crawler/request/YaCrawlerSendSmsCodeRequest.java
  77. 36 0
      src/main/java/com/ydtech/modules/order/entity/crawler/response/CrawlerQuoteResponse.java
  78. 29 0
      src/main/java/com/ydtech/modules/order/entity/crawler/response/YaCrawlerSendSmsCodeResponse.java
  79. 66 0
      src/main/java/com/ydtech/modules/order/entity/crawler/response/YaCrawlerVerifyCodeResponse.java
  80. 5 0
      src/main/java/com/ydtech/modules/order/entity/dto/InsAreaCompanyQueryDto.java
  81. 4 0
      src/main/java/com/ydtech/modules/order/entity/po/InsUploadFiles.java
  82. 9 0
      src/main/java/com/ydtech/modules/order/entity/vo/BaseQuoteVo.java
  83. 3 0
      src/main/java/com/ydtech/modules/order/entity/vo/InsOrdersEditingVo.java
  84. 9 0
      src/main/java/com/ydtech/modules/order/entity/vo/OrderQueryVo.java
  85. 8 0
      src/main/java/com/ydtech/modules/order/entity/vo/OrderVo.java
  86. 1 1
      src/main/java/com/ydtech/modules/order/service/InsAreaCompanyService.java
  87. 30 0
      src/main/java/com/ydtech/modules/order/service/InsCrawlerOrderService.java
  88. 8 1
      src/main/java/com/ydtech/modules/order/service/InsUploadFilesService.java
  89. 18 1
      src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java
  90. 19 5
      src/main/java/com/ydtech/modules/order/service/impl/InsAreaCompanyServiceImpl.java
  91. 168 2
      src/main/java/com/ydtech/modules/order/service/impl/InsCrawlerOrderServiceImpl.java
  92. 14 2
      src/main/java/com/ydtech/modules/order/service/impl/InsOrderPdfUrlServiceImpl.java
  93. 8 2
      src/main/java/com/ydtech/modules/order/service/impl/InsOrderQrCodeServiceImpl.java
  94. 64 7
      src/main/java/com/ydtech/modules/order/service/impl/InsOrdersServiceImpl.java
  95. 68 2
      src/main/java/com/ydtech/modules/order/service/impl/InsUploadFilesServiceImpl.java
  96. 7 2
      src/main/java/com/ydtech/modules/order/service/impl/SysQuoteRedisServiceImpl.java
  97. 10 2
      src/main/java/com/ydtech/modules/protocol/controller/PtlAgreementController.java
  98. 3 1
      src/main/java/com/ydtech/modules/protocol/entity/constants/PtlCrawlerApiType.java
  99. 3 0
      src/main/java/com/ydtech/modules/protocol/entity/dto/PtlAgreementSaveDto.java
  100. 6 0
      src/main/java/com/ydtech/modules/protocol/entity/po/PtlNewCarJudgeRules.java

+ 25 - 0
sql/Online.sql

@@ -9,3 +9,28 @@ INSERT INTO `agent`.`ins_driving_intention_insurance` ( `parent_id`, `type`, `co
 INSERT INTO `agent`.`ins_driving_intention_insurance` ( `parent_id`, `type`, `company_id`, `project_name`, `project_code`, `alias`, `risk_code`, `seat_num`, `sum_amount`, `sum_premium`, `request_data`, `api_type`, `relate_code`) VALUES ( 0, 2, 'PICC1000000', '“如意行”非营运客车方案C款(升级版)(1至1年)', 'EAD0000041', NULL, NULL, NULL, 0.00, 0.00, NULL, 2, NULL);
 
 INSERT INTO `agent`.`ins_driving_intention_insurance_type_company` ( `company_id`, `type_id`, `is_multiple`, `is_enable`, `create_time`) VALUES ( 'PICC1000000', 2, 0, 1, '2025-04-17 16:29:17');
+
+
+
+ALTER TABLE `agent`.`ptl_agreement_product_costs_new`
+    ADD COLUMN `ld_proportion` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '代理人留点比例' AFTER `valid_status`;
+CREATE TABLE `ins_area_company_equity`  (
+                                            `sub_order_no` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '订单号',
+                                            `type` tinyint NULL DEFAULT NULL COMMENT '权益类型0.现金权益 1.权益包',
+                                            `status` tinyint NULL DEFAULT 0 COMMENT '0.未下单1.已下单2.已确认',
+                                            `equity_id` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权益包id',
+                                            `equity_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权益包名称',
+                                            `equity_info` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '权益包明细json',
+                                            `receive_type` tinyint NULL DEFAULT NULL COMMENT '接收人类型0.投保人 1.被保人 2.车主',
+                                            `receive_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接收人名字',
+                                            `receive_phone` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接收人电话',
+                                            `receive_identify` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接收人身份证号',
+                                            `order_money` decimal(10, 2) NULL DEFAULT NULL COMMENT '返佣金额',
+                                            `point` decimal(10, 2) NULL DEFAULT NULL COMMENT '兑换积分',
+                                            PRIMARY KEY (`sub_order_no`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '订单权益包下单表' ROW_FORMAT = Dynamic;
+
+SET FOREIGN_KEY_CHECKS = 1;
+
+INSERT INTO `agent`.`sys_switch_config` ( `project`, `function_name`, `keyword`, `enabled`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('权益包', '权益包开关', 'equityFlag', 1, 'admin', '2025-05-08 10:35:43', 'admin', '2025-05-19 09:15:06');
+

+ 7 - 4
src/main/java/com/ydtech/aop/LogAspect.java

@@ -2,7 +2,6 @@ package com.ydtech.aop;
 
 import cn.dev33.satoken.stp.StpUtil;
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.admin.model.SysLog;
 import com.ydtech.modules.admin.service.SysLogService;
@@ -37,7 +36,8 @@ public class LogAspect {
     private SysLogService sysLogService;
 
 
-    @Pointcut("execution(public * com.ydtech.modules.*.controller.*.*(..)) ")
+    @Pointcut("@within(org.springframework.stereotype.Controller) || " +
+            "@within(org.springframework.web.bind.annotation.RestController)")
     public void log() {
 
     }
@@ -50,7 +50,8 @@ public class LogAspect {
         String userId = StpUtil.getLoginId("").toString();
         //请求人 url method ip class_method
         SysLog sysLog = new SysLog(userId, request.getRequestURL().toString(), request.getMethod(),
-                joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName(), request.getRemoteAddr(), new Date());
+                joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature()
+                .getName(), request.getRemoteAddr(), new Date());
 
         try {
             //获取注解注释
@@ -60,7 +61,9 @@ public class LogAspect {
             //获取请求参数
             Object[] args = joinPoint.getArgs();
             for (Object obj : args) {
-                if (null != obj && (obj.getClass().getName().startsWith("com.ydtech.modules") || obj instanceof String)) {
+                if (null != obj && (obj.getClass()
+                        .getName()
+                        .startsWith("com.ydtech.modules") || obj instanceof String)) {
                     sysLog.setParams(JSON.toJSON(obj).toString());
                 }
             }

+ 5 - 0
src/main/java/com/ydtech/components/TokenInterceptor.java

@@ -15,6 +15,9 @@ public class TokenInterceptor {
 
     public static SaInterceptor tokenInterceptor() {
         List<String> notMatchList = new ArrayList<>();
+        notMatchList.add("/insurance/crawler/yaSendCode"); // 永安接口
+        notMatchList.add("/insurance/crawler/yaVerifySendCode");
+        notMatchList.add("/insurance/crawler/yaGetMobile");
         notMatchList.add("/favicon.ico");
         notMatchList.add("/api/demo/**"); // 演示接口
         notMatchList.add("/captcha.jpg**"); // 验证码
@@ -30,6 +33,7 @@ public class TokenInterceptor {
 
         notMatchList.add("/captchaById"); // 验证码通过ID
         notMatchList.add("/login2");//登录2  配合验证码ID的校验
+        notMatchList.add("/system/login");//登录PC
         notMatchList.add("/aapLogin");//合伙人和机构负责人登录APP接口
         notMatchList.add("/loginAPPByPhone");//合伙人和机构负责人登录APP接口
 
@@ -109,6 +113,7 @@ public class TokenInterceptor {
         notMatchList.add("/APPPartner/loginWechat");
         notMatchList.add("/APPPartner/loginAlipay");
 
+
         /**
          * 天天企赋api接口回调
          */

+ 45 - 0
src/main/java/com/ydtech/constants/enums/dict/ZmTransferType.java

@@ -0,0 +1,45 @@
+package com.ydtech.constants.enums.dict;
+
+import com.ydtech.aop.request.DictEnum;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@AllArgsConstructor
+@Getter
+@DictEnum(key = "zmTransferType", desc = "中煤过户类型")
+public enum ZmTransferType implements IBaseEnum {
+
+    ZMTR00("0", "费率浮动", 1, 0),
+    ZMTR01("01", "新车,不浮动", 2, 0),
+    ZMTR02("02", "首次投保,不浮动", 3, 0),
+    ZMTR03("03", "车辆所有权转移,不浮动", 4, 0),
+    ZMTR04("04", "临时上道或临时入境,不浮动", 5, 0),
+    ZMTR05("05", "为摩托车、拖拉机、变拖类、低速载货汽车、三轮汽车,不浮动", 6, 0),
+    ZMTR06("06", "未如实告知平台车辆信息,无法确定浮动比率,不浮动", 7, 0),
+    ZMTR07("07", "非重复投保退保的保单续保,不浮动", 8, 0),
+    ZMTR08("08", "短期保单续保不下浮", 9, 0),
+    ZMTR09("09", "短期单投保不浮动", 10, 0),
+    ZMTR10("10", "脱保,不下浮", 11, 0),
+    ZMTR11("99", "不在浮动时间范围内,不浮动", 12, 0);
+
+    // 编号
+    private final String code;
+    // 说明
+    private final String desc;
+    // 排序
+    private final Integer sort;
+    // 状态  0 启用  1 不启用
+    private final Integer status;
+
+    public static String getByCode(String code) {
+        for (ZmTransferType value : ZmTransferType.values()) {
+            if (value.getCode().equals(code)) {
+                return value.desc;
+            }
+        }
+        return null;
+    }
+}

+ 9 - 60
src/main/java/com/ydtech/modules/admin/controller/SysLoginController.java

@@ -91,6 +91,8 @@ public class SysLoginController {
 
     private final SysAgencyLeaderService sysAgencyLeaderService;
 
+    private final SysLoginService sysLoginService;
+
     @GetMapping("captcha.jpg")
     @ApiOperation(value = "获取验证码", produces = "application/octet-stream")
     public void captcha(HttpServletResponse response, HttpServletRequest request) throws IOException {
@@ -203,67 +205,14 @@ public class SysLoginController {
      */
     @PostMapping(value = "/login2")
     @ApiOperation(value = "登录2")
-    public HttpResult login2(@RequestBody LoginBean loginBean, HttpServletRequest request) {
-        String username = loginBean.getAccount();
-        String password = loginBean.getPassword();
-        String captcha = loginBean.getCaptcha();
-
-        String captchaId = loginBean.getCaptchaId();
-        if (StringUtils.isEmpty(captchaId)) return HttpResult.error("验证码不正确");
-
-        // 从redis中获取
-        String kaptcha = redisTemplate.opsForValue().get(captchaId);
-        log.info("登录校验验证码,redis取出的信息为:" + captchaId + ":" + kaptcha);
-        log.info("页面验证码:" + captcha + "===" + "redis验证码:" + kaptcha);
-        if (!captcha.equals(kaptcha)) {
-            return HttpResult.error("验证码不正确");
-        }
-//
-        // 用户信息
-        SysUser user = sysUserService.getById(username);
-        /**
-         *  多个系统登录  添加默认参数解决手机端登陆问题
-         * */
-        if (StringUtils.isBlank(loginBean.getSysId())) {
-            loginBean.setSysId("1");
-        }
-        if (!SysConstants.ADMIN.equalsIgnoreCase(username) && !"1".equals(loginBean.getSysId())) {
-            LambdaQueryWrapper<SysUserLinkSys> sysLambdaQueryWrapper = new LambdaQueryWrapper<>();
-            sysLambdaQueryWrapper.eq(SysUserLinkSys::getUserId, user.getId());
-            sysLambdaQueryWrapper.eq(SysUserLinkSys::getSysId, loginBean.getSysId());
-            List<SysUserLinkSys> list = sysUserLinkSysService.list(sysLambdaQueryWrapper);
-            if (list == null || list.size() == 0) {
-                throw new SystemException("该用户未授权");
-            }
-        }
-        SysUser sysUser = sysUserService.getByUserId(user.getId());
-        if ("2".equals(sysUser.getManagementSource())){
-            user.setIsLock(0);
-        }
-        //验证用户
-        SysUser.verifyUser(user);
-        SysPassword sysPassword = sysPasswordService.getOne(new LambdaQueryWrapper<SysPassword>().eq(SysPassword::getCode, SysPasswordEnum.GENERAL.getCode()));
-        // 万能密码设置
-        if (!"admin".equals(username) && PasswordUtils.matches(sysPassword.getSalt(), password,
-                sysPassword.getPassword())) {
-            log.info("万能密码登录系统");
-        } else {
-            if (!PasswordUtils.matches(user.getSalt(), password, user.getPassword())) {
-                return HttpResult.error("密码不正确");
-            }
-        }
-        //查询用户角色
-        SysRole sysRole = sysUserRoleService.gainRoleByUserId(user.getId());
-        //设置用户角色
-        user.setRoleId(sysRole.getId().toString());
-        user.setRoleName(sysRole.getName());
-        // 获取这个人的token
-        String token = StpUtil.createLoginSession(user.getId());
-        StpUtil.getSessionByLoginId(user.getId()).set(SaSession.USER, user);
-        // 保存登录信息
-        //sysUserService.saveLoginIpAddr(loginBean.getSystemType(),user);
-        return HttpResult.ok("登录成功", token);
+    public HttpResult login2(@RequestBody LoginBean loginBean) {
+        return sysLoginService.loginApp(loginBean);
+    }
 
+    @PostMapping(value = "/system/login")
+    @ApiOperation(value = "登录2")
+    public HttpResult loginPc(@RequestBody LoginBean loginBean) {
+        return sysLoginService.loginPC(loginBean);
     }
 
     /**

+ 7 - 0
src/main/java/com/ydtech/modules/admin/controller/SysSwitchConfigController.java

@@ -57,4 +57,11 @@ public class SysSwitchConfigController {
         return HttpResult.ok(display);
     }
 
+    @GetMapping("/isEnabled")
+    @ApiOperation(value = "开关是否开启")
+    public HttpResult<Boolean> isEnabled(String keyWord) {
+        boolean display = sysSwitchConfigService.isEnabled(keyWord);
+        return HttpResult.ok(display);
+    }
+
 }

+ 6 - 0
src/main/java/com/ydtech/modules/admin/controller/SysUserController.java

@@ -534,6 +534,12 @@ public class SysUserController extends BaseController {
         return HttpResult.ok(sysUserService.findBackUserList(sysUserDto));
     }
 
+    @ApiOperation(value = "获取财务人员")
+    @PostMapping(value = "/getFinanceUser")
+    public HttpResult getFinanceUser() {
+        return HttpResult.ok(sysUserService.getFinanceUser());
+    }
+
     @ApiOperation(value = "后线用户查询不分页(编辑时查询领导人)")
     @PostMapping(value = "/findBackUserList1")
     public HttpResult findBackUserList1(@RequestBody SysUserDto sysUserDto) {

+ 60 - 40
src/main/java/com/ydtech/modules/admin/controller/deptBalance/DeptBalanceController.java

@@ -6,18 +6,22 @@ import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.admin.model.dto.DeptBalanceDto;
 import com.ydtech.modules.admin.model.dto.SysPartnerConsoleDto;
 import com.ydtech.modules.admin.model.dto.SysPartnerInfoConsoleDto;
-import com.ydtech.modules.admin.model.vo.AppSysPartnerVo;
 import com.ydtech.modules.admin.model.vo.DeptBalanceVo;
 import com.ydtech.modules.admin.model.vo.KztGetDeptUtilsDto;
 import com.ydtech.modules.admin.model.vo.PartnerBalanceVo;
 import com.ydtech.modules.admin.service.DeptBalanceService;
+import com.ydtech.modules.admin.service.PartnerWalletService;
 import com.ydtech.modules.admin.utils.KztGetDeptUtils;
 import com.ydtech.modules.admin.utils.SliceUpDateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+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 javax.servlet.http.HttpServletRequest;
 import java.util.Date;
@@ -27,11 +31,12 @@ import java.util.List;
 @Api(tags = "机构管理费统计")
 @RequestMapping("/deptBalance")
 @RestController
+@RequiredArgsConstructor
 public class DeptBalanceController {
 
-    @Autowired
-    private DeptBalanceService deptBalanceService;
+    private final DeptBalanceService deptBalanceService;
 
+    private final PartnerWalletService partnerWalletService;
 
     /**
      * @version
@@ -46,9 +51,10 @@ public class DeptBalanceController {
         deptBalanceVo.setBeginDate(map.get("startDate"));
         deptBalanceVo.setEndDate(map.get("endDate"));
         KztGetDeptUtils kztGetDeptUtils = new KztGetDeptUtils();
-        KztGetDeptUtilsDto kztGetDeptUtilsDto = kztGetDeptUtils.KztGetDeptIds(httpServerRequest.getRequestURL().toString());
-        if(ObjectUtils.isNotEmpty(kztGetDeptUtilsDto)){
-            if("1".equals(kztGetDeptUtilsDto.getType())){
+        KztGetDeptUtilsDto kztGetDeptUtilsDto = kztGetDeptUtils.KztGetDeptIds(httpServerRequest.getRequestURL()
+                .toString());
+        if (ObjectUtils.isNotEmpty(kztGetDeptUtilsDto)) {
+            if ("1".equals(kztGetDeptUtilsDto.getType())) {
                 deptBalanceVo.setDeptIds(kztGetDeptUtilsDto.getIds());
             } else if ("2".equals(kztGetDeptUtilsDto.getType())) {
                 deptBalanceVo.setUserIds(kztGetDeptUtilsDto.getIds());
@@ -71,16 +77,16 @@ public class DeptBalanceController {
         deptBalanceVo.setBeginDate(map.get("startDate"));
         deptBalanceVo.setEndDate(map.get("endDate"));
         KztGetDeptUtils kztGetDeptUtils = new KztGetDeptUtils();
-        KztGetDeptUtilsDto kztGetDeptUtilsDto = kztGetDeptUtils.KztGetDeptIds(httpServerRequest.getRequestURL().toString());
-        if(ObjectUtils.isNotEmpty(kztGetDeptUtilsDto)){
-            if("1".equals(kztGetDeptUtilsDto.getType())){
+        KztGetDeptUtilsDto kztGetDeptUtilsDto = kztGetDeptUtils.KztGetDeptIds(httpServerRequest.getRequestURL()
+                .toString());
+        if (ObjectUtils.isNotEmpty(kztGetDeptUtilsDto)) {
+            if ("1".equals(kztGetDeptUtilsDto.getType())) {
                 deptBalanceVo.setDeptIds(kztGetDeptUtilsDto.getIds());
             } else if ("2".equals(kztGetDeptUtilsDto.getType())) {
                 deptBalanceVo.setUserIds(kztGetDeptUtilsDto.getIds());
             }
         }
-        HttpResult<IPage<SysPartnerConsoleDto>> result = deptBalanceService.queryPartnerStatistics(deptBalanceVo);
-        return result;
+        return partnerWalletService.queryPartnerStatistics(deptBalanceVo);
     }
 
 
@@ -92,6 +98,9 @@ public class DeptBalanceController {
     @PostMapping("queryPartnerInfo")
     @ApiOperation(value = "合伙人详情")
     public HttpResult<List<SysPartnerConsoleDto>> queryPartnerInfo(@RequestBody DeptBalanceVo deptBalanceVo) {
+        HashMap<String, String> map = getDateMapByType(deptBalanceVo.getDays(), deptBalanceVo.getBeginDate(), deptBalanceVo.getEndDate());
+        deptBalanceVo.setBeginDate(map.get("startDate"));
+        deptBalanceVo.setEndDate(map.get("endDate"));
         List<SysPartnerConsoleDto> result = deptBalanceService.queryPartnerInfo(deptBalanceVo);
         return HttpResult.ok(result);
     }
@@ -104,12 +113,14 @@ public class DeptBalanceController {
     @PostMapping("queryStudioInfo")
     @ApiOperation(value = "工作室详情")
     public HttpResult<List<SysPartnerConsoleDto>> queryStudioInfo(@RequestBody DeptBalanceVo deptBalanceVo) {
+        HashMap<String, String> map = getDateMapByType(deptBalanceVo.getDays(), deptBalanceVo.getBeginDate(), deptBalanceVo.getEndDate());
+        deptBalanceVo.setBeginDate(map.get("startDate"));
+        deptBalanceVo.setEndDate(map.get("endDate"));
         List<SysPartnerConsoleDto> result = deptBalanceService.queryPartnerInfo(deptBalanceVo);
         return HttpResult.ok(result);
     }
 
 
-
     /**
      * @version
      * @author: whp
@@ -118,6 +129,9 @@ public class DeptBalanceController {
     @PostMapping("info")
     @ApiOperation(value = "合伙人详情")
     public HttpResult<SysPartnerInfoConsoleDto> queryInfo(@RequestBody DeptBalanceVo deptBalanceVo) {
+        HashMap<String, String> map = getDateMapByType(deptBalanceVo.getDays(), deptBalanceVo.getBeginDate(), deptBalanceVo.getEndDate());
+        deptBalanceVo.setBeginDate(map.get("startDate"));
+        deptBalanceVo.setEndDate(map.get("endDate"));
         SysPartnerInfoConsoleDto result = deptBalanceService.queryInfo(deptBalanceVo);
         return HttpResult.ok(result);
     }
@@ -131,6 +145,9 @@ public class DeptBalanceController {
     @PostMapping("/getTeamInfo")
     @ApiOperation(value = "查看机构下团队信息")
     public HttpResult<SysPartnerInfoConsoleDto> getTeamInfo(@RequestBody DeptBalanceVo deptBalanceVo) {
+        HashMap<String, String> map = getDateMapByType(deptBalanceVo.getDays(), deptBalanceVo.getBeginDate(), deptBalanceVo.getEndDate());
+        deptBalanceVo.setBeginDate(map.get("startDate"));
+        deptBalanceVo.setEndDate(map.get("endDate"));
         SysPartnerInfoConsoleDto result = deptBalanceService.getTeamInfo(deptBalanceVo);
         return HttpResult.ok(result);
     }
@@ -144,6 +161,9 @@ public class DeptBalanceController {
     @PostMapping("/getTeamUserInfo")
     @ApiOperation(value = "查看团队下人员信息")
     public HttpResult<SysPartnerInfoConsoleDto> getTeamUserInfo(@RequestBody DeptBalanceVo deptBalanceVo) {
+        HashMap<String, String> map = getDateMapByType(deptBalanceVo.getDays(), deptBalanceVo.getBeginDate(), deptBalanceVo.getEndDate());
+        deptBalanceVo.setBeginDate(map.get("startDate"));
+        deptBalanceVo.setEndDate(map.get("endDate"));
         SysPartnerInfoConsoleDto result = deptBalanceService.getTeamUserInfo(deptBalanceVo);
         return HttpResult.ok(result);
     }
@@ -162,7 +182,6 @@ public class DeptBalanceController {
     }
 
 
-
     /**
      * @version
      * @author: whp
@@ -176,9 +195,10 @@ public class DeptBalanceController {
         deptBalanceVo.setBeginDate(map.get("startDate"));
         deptBalanceVo.setEndDate(map.get("endDate"));
         KztGetDeptUtils kztGetDeptUtils = new KztGetDeptUtils();
-        KztGetDeptUtilsDto kztGetDeptUtilsDto = kztGetDeptUtils.KztGetDeptIds(httpServerRequest.getRequestURL().toString());
-        if(ObjectUtils.isNotEmpty(kztGetDeptUtilsDto)){
-            if("1".equals(kztGetDeptUtilsDto.getType())){
+        KztGetDeptUtilsDto kztGetDeptUtilsDto = kztGetDeptUtils.KztGetDeptIds(httpServerRequest.getRequestURL()
+                .toString());
+        if (ObjectUtils.isNotEmpty(kztGetDeptUtilsDto)) {
+            if ("1".equals(kztGetDeptUtilsDto.getType())) {
                 deptBalanceVo.setDeptIds(kztGetDeptUtilsDto.getIds());
             } else if ("2".equals(kztGetDeptUtilsDto.getType())) {
                 deptBalanceVo.setUserIds(kztGetDeptUtilsDto.getIds());
@@ -190,35 +210,35 @@ public class DeptBalanceController {
 
 
     /**
-     *  @version
-     *  @author: hxl
-     *  @Date: 2024/6/19 11:57
-     *  @Description:  通过时间类型判断
+     * @version
+     * @author: hxl
+     * @Date: 2024/6/19 11:57
+     * @Description: 通过时间类型判断
      */
-    private static HashMap<String,String> getDateMapByType(String type, String startDate, String endDate) {
-        HashMap<String,String> map =new HashMap<>();
-        String  startDateStr="";
-        String  endDateStr="";
-        if(org.apache.commons.lang3.StringUtils.isNotBlank(startDate) && org.apache.commons.lang3.StringUtils.isNotBlank(endDate)){
-            startDateStr= org.apache.commons.lang3.StringUtils.isNotBlank(startDate)?startDate+" 00:00:00":null;
-            endDateStr= org.apache.commons.lang3.StringUtils.isNotBlank(endDate)?endDate+" 23:59:59":null;
-        }else{
-            if("1".equals(type)){
+    private static HashMap<String, String> getDateMapByType(String type, String startDate, String endDate) {
+        HashMap<String, String> map = new HashMap<>();
+        String startDateStr = "";
+        String endDateStr = "";
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(startDate) && org.apache.commons.lang3.StringUtils.isNotBlank(endDate)) {
+            startDateStr = org.apache.commons.lang3.StringUtils.isNotBlank(startDate) ? startDate + " 00:00:00" : null;
+            endDateStr = org.apache.commons.lang3.StringUtils.isNotBlank(endDate) ? endDate + " 23:59:59" : null;
+        } else {
+            if ("1".equals(type)) {
                 // 近1天
-                startDateStr= SliceUpDateUtil.getBeforeDay(new Date(),0)+" 00:00:00";
-                endDateStr=SliceUpDateUtil.getBeforeDay(new Date(),0)+" 23:59:59";
-            }else if("2".equals(type)){
+                startDateStr = SliceUpDateUtil.getBeforeDay(new Date(), 0) + " 00:00:00";
+                endDateStr = SliceUpDateUtil.getBeforeDay(new Date(), 0) + " 23:59:59";
+            } else if ("2".equals(type)) {
                 // 近7天
-                startDateStr=SliceUpDateUtil.getBeforeDay(new Date(),1)+" 00:00:00";
-                endDateStr=SliceUpDateUtil.getBeforeDay(new Date(),0)+" 23:59:59";
-            }else if("3".equals(type)){
+                startDateStr = SliceUpDateUtil.getBeforeDay(new Date(), 1) + " 00:00:00";
+                endDateStr = SliceUpDateUtil.getBeforeDay(new Date(), 0) + " 23:59:59";
+            } else if ("3".equals(type)) {
                 // 近30天
-                startDateStr=SliceUpDateUtil.getBeforeDay(new Date(),6)+" 00:00:00";
-                endDateStr=SliceUpDateUtil.getBeforeDay(new Date(),0)+" 23:59:59";
+                startDateStr = SliceUpDateUtil.getBeforeDay(new Date(), 6) + " 00:00:00";
+                endDateStr = SliceUpDateUtil.getBeforeDay(new Date(), 0) + " 23:59:59";
             }
         }
-        map.put("startDate",startDateStr);
-        map.put("endDate",endDateStr);
+        map.put("startDate", startDateStr);
+        map.put("endDate", endDateStr);
         return map;
     }
 

+ 22 - 0
src/main/java/com/ydtech/modules/admin/controller/taskStatistics/TaskStatisticsController.java

@@ -530,6 +530,27 @@ public class TaskStatisticsController {
         }
     }
 
+
+    /**
+     * @description:   控制台 - 业务数据 -渠道明细导出
+     * @author: whp
+     **/
+    @PostMapping("/detailExport")
+    @ApiOperation(value = "任务统计-代理人导出")
+    public HttpResult detailExport(@RequestBody TaskStatisticsVo taskStatisticsVo, HttpServletRequest httpServerRequest) {
+        KztGetDeptUtils kztGetDeptUtils = new KztGetDeptUtils();
+        KztGetDeptUtilsDto kztGetDeptUtilsDto = kztGetDeptUtils.KztGetDeptIds(httpServerRequest.getRequestURL().toString());
+        if(ObjectUtils.isNotEmpty(kztGetDeptUtilsDto)){
+            if("1".equals(kztGetDeptUtilsDto.getType())){
+                taskStatisticsVo.setDeptIds(kztGetDeptUtilsDto.getIds());
+            } else if ("2".equals(kztGetDeptUtilsDto.getType())) {
+                taskStatisticsVo.setUserIds(kztGetDeptUtilsDto.getIds());
+            }
+        }
+        taskStatisticsVo.filterTime();
+        return this.taskStatisticsService.detailExport(taskStatisticsVo);
+    }
+
     /**
      * @description:   控制台 - 业务数据 -代理人导出
      * @author: whp
@@ -643,6 +664,7 @@ public class TaskStatisticsController {
         }
     }
 
+
     /**
      *
      * @param taskStatisticsVo

+ 86 - 0
src/main/java/com/ydtech/modules/admin/dao/PartnerWalletMapper.java

@@ -0,0 +1,86 @@
+package com.ydtech.modules.admin.dao;
+
+import com.ydtech.modules.admin.model.dto.partner.CopartnerAndStudioNumberDTO;
+import com.ydtech.modules.admin.model.dto.partner.PartnerDataDTO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface PartnerWalletMapper {
+
+    /**
+     * 获取会员总人数
+     *
+     * @param userIdList 用户列表
+     * @return 会员总人数
+     */
+    List<PartnerDataDTO> getMemberNumber(@Param("userIdList") List<String> userIdList);
+
+    /**
+     * 获取总保费
+     *
+     * @param userIdList 用户列表
+     * @return 总保费
+     */
+    List<PartnerDataDTO> getTotalPremiums(@Param("userIdList") List<String> userIdList, @Param("beginDate") String beginDate, @Param("endDate") String endDate);
+
+    /**
+     * 获取总佣金
+     *
+     * @param userIdList 用户列表
+     * @return 佣金
+     */
+    List<PartnerDataDTO> getCommission(@Param("userIdList") List<String> userIdList, @Param("beginDate") String beginDate, @Param("endDate") String endDate);
+
+    /**
+     * 获取合伙人工作室数量
+     *
+     * @param userIdList 人员列表
+     * @return 合伙人 工作室数量
+     */
+    List<CopartnerAndStudioNumberDTO> getCopartnerAndStudioNumber(@Param("userIdList") List<String> userIdList);
+
+
+    /**
+     * 获取各个等级下合伙人的会员数
+     *
+     * @param userId 用户id
+     * @return
+     */
+    List<PartnerDataDTO> getPartnerRankMemberNumber(@Param("userId") String userId);
+
+
+    /**
+     * 获取各个等级下合伙人 总保费
+     *
+     * @param userId 用户id
+     * @return 总保费
+     */
+    List<PartnerDataDTO> getPartnerRankTotalPremiums(@Param("userId") String userId, @Param("beginDate") String beginDate, @Param("endDate") String endDate);
+
+    /**
+     * 获取各个等级下合伙人 总佣金
+     *
+     * @param userId 用户id
+     * @return 佣金
+     */
+    List<PartnerDataDTO> getPartnerRankCommission(@Param("userId") String userId, @Param("beginDate") String beginDate, @Param("endDate") String endDate);
+
+    /**
+     * 各个等级下合伙人 合伙人数
+     *
+     * @param userId 用户id
+     * @return 合伙人数
+     */
+    List<PartnerDataDTO> getPartnerRankCopartnerNumber(@Param("userId") String userId);
+
+    /**
+     * 各个等级下合伙人 工作室数
+     *
+     * @param userId 用户id
+     * @return 工作室数
+     */
+    List<PartnerDataDTO> getPartnerRankStudioNumber(@Param("userId") String userId);
+}

+ 3 - 0
src/main/java/com/ydtech/modules/admin/dao/TaskStatisticsMapper.java

@@ -3,6 +3,7 @@ package com.ydtech.modules.admin.dao;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.admin.model.dto.ChannelDetailsExport;
 import com.ydtech.modules.admin.model.dto.OrdersDetailsExcel;
 import com.ydtech.modules.admin.model.vo.BusinessAgentData;
 import com.ydtech.modules.admin.model.vo.BusinessOrderData;
@@ -65,4 +66,6 @@ public interface TaskStatisticsMapper extends BaseMapper<TaskStatisticsDto> {
      */
     List<OrdersDetailsExcel> ordersDetailsExcel(@Param("taskStatisticsVo") TaskStatisticsVo taskStatisticsVo);
 
+    List<ChannelDetailsExport> getAgentDataDetails(@Param("vo") TaskStatisticsVo taskStatisticsVo);
+
 }

+ 54 - 0
src/main/java/com/ydtech/modules/admin/model/dto/ChannelDetailsExport.java

@@ -0,0 +1,54 @@
+package com.ydtech.modules.admin.model.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class ChannelDetailsExport  implements Serializable {
+    @ExcelProperty(value = "姓名", index = 0)
+    private String userName;
+
+    @ExcelProperty(value = "工号", index = 1)
+    private String userId;
+
+    @ExcelProperty(value = "归属机构", index = 2)
+    private String deptName;
+
+    @ExcelProperty(value = "管理人", index = 3)
+    private String leaderName;
+
+    @ExcelProperty(value = "机构来源", index = 4)
+    private String managementSource;
+
+
+    @ExcelProperty(value = "保险公司名称", index = 5)
+    private String insuranceCompany;
+
+    @ExcelProperty(value = "签单日期", index = 6)
+    private LocalDateTime signingTime;
+
+    @ExcelProperty(value = "车牌号", index = 7)
+    private String licenseno;
+
+
+    @ExcelProperty(value = "交强险保费", index = 8)
+    private BigDecimal jqpremium;
+
+    @ExcelProperty(value = "商业险保费", index = 9)
+    private BigDecimal sypremium;
+
+    @ExcelProperty(value = "非车险保费", index = 10)
+    private BigDecimal jypremium;
+
+
+    @ExcelIgnore
+    private String deptId;
+
+
+}

+ 3 - 0
src/main/java/com/ydtech/modules/admin/model/dto/QuotationDetailsExcel.java

@@ -71,6 +71,9 @@ public class QuotationDetailsExcel {
     @ExcelProperty(value = "大订单号",index = 20)
     private String bigOrderno;
 
+    @ExcelProperty(value = "险种",index = 21)
+    private String product;
+
     @ExcelIgnore
     private String auditstatus;
 

+ 5 - 0
src/main/java/com/ydtech/modules/admin/model/dto/SysPartnerConsoleDto.java

@@ -4,7 +4,11 @@ import com.ydtech.modules.admin.model.PartnerInfoVo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.models.auth.In;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -12,6 +16,7 @@ import java.util.List;
 
 @Data
 @ApiModel(value = "合伙人控制台")
+@Accessors(chain = true)
 public class SysPartnerConsoleDto implements Serializable {
     /**
      * 员工id

+ 24 - 0
src/main/java/com/ydtech/modules/admin/model/dto/partner/CopartnerAndStudioNumberDTO.java

@@ -0,0 +1,24 @@
+package com.ydtech.modules.admin.model.dto.partner;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class CopartnerAndStudioNumberDTO {
+
+    private String userId;
+    /**
+     * 推荐等级(0:直接推荐;1:间接推荐)
+     */
+    private String source;
+    /**
+     * 推荐类型(0:合伙人  1:机构负责人 2:团队长  3:成员)
+     */
+    private String type;
+
+    private String count;
+
+}

+ 20 - 0
src/main/java/com/ydtech/modules/admin/model/dto/partner/PartnerDataDTO.java

@@ -0,0 +1,20 @@
+package com.ydtech.modules.admin.model.dto.partner;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class PartnerDataDTO implements Serializable {
+
+    private static final long serialVersionUID = 5947804961787692481L;
+
+    private String userId;
+
+    private String data;
+
+}

+ 21 - 0
src/main/java/com/ydtech/modules/admin/service/PartnerWalletService.java

@@ -0,0 +1,21 @@
+package com.ydtech.modules.admin.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.admin.model.dto.SysPartnerConsoleDto;
+import com.ydtech.modules.admin.model.vo.DeptBalanceVo;
+
+import java.util.List;
+
+public interface PartnerWalletService {
+
+    /**
+     * 控制台 钱包管理 合伙人 首页查询
+     *
+     * @param deptBalanceVo 查询条件
+     * @return 分页结果
+     */
+    HttpResult<IPage<SysPartnerConsoleDto>> queryPartnerStatistics(DeptBalanceVo deptBalanceVo);
+
+
+}

+ 31 - 0
src/main/java/com/ydtech/modules/admin/service/SysLoginService.java

@@ -0,0 +1,31 @@
+package com.ydtech.modules.admin.service;
+
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.admin.model.vo.LoginBean;
+
+/**
+ * @description: 系统登陆接口
+ * @author: wenks
+ * @date: 2025/6/6 14:20
+ **/
+public interface SysLoginService {
+
+    /**
+     * 登录App
+     *
+     * @param loginBean 登陆信息
+     * @return token
+     */
+    HttpResult<String> loginApp(LoginBean loginBean);
+
+
+    /**
+     * 登录PC
+     *
+     * @param loginBean 登陆信息
+     * @return token
+     */
+    HttpResult<String> loginPC(LoginBean loginBean);
+
+
+}

+ 49 - 20
src/main/java/com/ydtech/modules/admin/service/SysUserService.java

@@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.core.page.PageResult;
+import com.ydtech.exception.SystemException;
 import com.ydtech.extension.BaseIService;
+import com.ydtech.modules.admin.constants.UserWorkStatus;
 import com.ydtech.modules.admin.model.QuTeamNum;
 import com.ydtech.modules.admin.model.QuUserNum;
 import com.ydtech.modules.admin.model.SysUser;
@@ -37,6 +39,9 @@ public interface SysUserService extends BaseIService<SysUser> {
 //    Set<String> findPermissions(String userName);
     Set<String> findPermissions(SysUser sysUser);
 
+    List<SysUser> getFinanceUser();
+
+
     /**
      * 查找用户的角色集合
      *
@@ -126,6 +131,7 @@ public interface SysUserService extends BaseIService<SysUser> {
     boolean saveUser(SysUser sysUser);
 
     HttpResult saveUserInfo(SysUser2Vo sysUserVo);
+
     SysUser saveUserJzgInfo(SysUser2Vo sysUserVo);
 
     HttpResult saveUserInfoByPartner(SysUser2Vo sysUserVo);
@@ -251,8 +257,10 @@ public interface SysUserService extends BaseIService<SysUser> {
      * @return
      */
     List<String> getTelemarketingPersonnelData();
+
     /**
      * 获取当前用户的下级所有人员
+     *
      * @return
      */
     List<SysUser> findNextTree();
@@ -264,29 +272,31 @@ public interface SysUserService extends BaseIService<SysUser> {
 
     /**
      * 获取当前用户的所有代理人
+     *
      * @return
      */
     List<SysUser> findNextAgentTree(String pid);
 
     /**
-     *  @version
-     *  @author: hxl
-     *  @Date: 2024/9/24 17:35
-     *  @Description:  查询电销的管理人列表
+     * @version
+     * @author: hxl
+     * @Date: 2024/9/24 17:35
+     * @Description: 查询电销的管理人列表
      */
     List<SysUser> findDxUserList(String type);
 
-    List<Map<String,String>>  selectHxUserList(SysUserDto sysUserDto);
+    List<Map<String, String>> selectHxUserList(SysUserDto sysUserDto);
 
     HttpResult cancelManagementPersonnel(UpdateManagementDto managementDto);
 
     /**
-     *  @version
-     *  @author: hxl
-     *  @Date: 2024/9/25 19:23
-     *  @Description: 查询用户管理的电销组员
+     * @version
+     * @author: hxl
+     * @Date: 2024/9/25 19:23
+     * @Description: 查询用户管理的电销组员
      */
     List<String> getGroupByUserId(String userId);
+
     /**
      * @version
      * @author: whp
@@ -297,6 +307,7 @@ public interface SysUserService extends BaseIService<SysUser> {
 
     /**
      * 获取人员数
+     *
      * @return
      */
     List<SysUser> getTreeUser();
@@ -307,7 +318,7 @@ public interface SysUserService extends BaseIService<SysUser> {
     /**
      * 个代注册
      *
-     * @param dto 注册dto
+     * @param dto         注册dto
      * @param recommender 推荐人信息
      * @return
      */
@@ -317,12 +328,13 @@ public interface SysUserService extends BaseIService<SysUser> {
      * 个代认证
      *
      * @param sysUser 用户信息
-     * @param dto 认证dto
+     * @param dto     认证dto
      */
     SysUserAgentVo agentAuth(SysUser sysUser, AgentAuthDto dto);
 
     /**
      * 个代(认证/审核)结果获取
+     *
      * @param sysUser
      * @param dto
      */
@@ -330,6 +342,7 @@ public interface SysUserService extends BaseIService<SysUser> {
 
     /**
      * 个代资料提交
+     *
      * @param sysUser
      * @param dto
      * @return
@@ -337,7 +350,6 @@ public interface SysUserService extends BaseIService<SysUser> {
     void agentSubmit(SysUser sysUser, AgentSubmitDto dto);
 
     /**
-     *
      * @param roleId 角色id
      * @param deptId 机构id
      * @return 用户信息
@@ -351,22 +363,39 @@ public interface SysUserService extends BaseIService<SysUser> {
     List<SysUser> selectByUserId(List<String> ids);
 
     HttpResult userLogout(String userId);
+
     /**
-     *  @version
-     *  @author: hxl
-     *  @Date: 2025/1/18 18:16
-     *  @Description: 转岗
+     * @version
+     * @author: hxl
+     * @Date: 2025/1/18 18:16
+     * @Description: 转岗
      */
     String transferPost(TransferUserVo transferUserVo);
 
 
     /**
-     *  @version
-     *  @author: hxl
-     *  @Date: 2025/1/21 9:31
-     *  @Description: 获取最大的id
+     * @version
+     * @author: hxl
+     * @Date: 2025/1/21 9:31
+     * @Description: 获取最大的id
      */
     String findNewMaxId(String deptId);
+
+
+    /**
+     * 校验用户是否在职
+     *
+     * @param id 用户id
+     * @return 用户
+     */
+    default SysUser judgmentIncumbency(String id) {
+        SysUser user = getById(id);
+        if (!UserWorkStatus.UWS_1.getCode().equals(user.getStatus())) {
+            throw new SystemException("审核未通过、请联系管理员");
+        }
+        return user;
+    }
+
 }
 
 

+ 6 - 0
src/main/java/com/ydtech/modules/admin/service/TaskStatisticsService.java

@@ -201,4 +201,10 @@ public interface TaskStatisticsService {
      **/
     IPage<TaskStatisticsDto> costReviewer(TaskStatisticsVo taskStatisticsVo);
 
+    /**
+     *  控制台 - 业务数据 -渠道明细导出
+     * @param taskStatisticsVo
+     * @return
+     */
+    HttpResult detailExport(TaskStatisticsVo taskStatisticsVo);
 }

+ 111 - 0
src/main/java/com/ydtech/modules/admin/service/impl/PartnerWalletServiceImpl.java

@@ -0,0 +1,111 @@
+package com.ydtech.modules.admin.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.admin.dao.PartnerWalletMapper;
+import com.ydtech.modules.admin.dao.SysPartnerMapper;
+import com.ydtech.modules.admin.dao.SysRelationPersonMapper;
+import com.ydtech.modules.admin.model.SysPartner;
+import com.ydtech.modules.admin.model.SysRelationPerson;
+import com.ydtech.modules.admin.model.dto.SysPartnerConsoleDto;
+import com.ydtech.modules.admin.model.dto.partner.CopartnerAndStudioNumberDTO;
+import com.ydtech.modules.admin.model.dto.partner.PartnerDataDTO;
+import com.ydtech.modules.admin.model.vo.DeptBalanceVo;
+import com.ydtech.modules.admin.service.PartnerWalletService;
+import com.ydtech.modules.base.controller.BaseController;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+/**
+ * @description: 控制台 钱包管理 合伙人
+ * @author: wenks
+ * @date: 2025/6/13 15:56
+ **/
+@Service
+@RequiredArgsConstructor
+public class PartnerWalletServiceImpl implements PartnerWalletService {
+
+    private final SysPartnerMapper sysPartnerMapper;
+
+    private final PartnerWalletMapper partnerWalletMapper;
+
+    private final SysRelationPersonMapper sysRelationPersonMapper;
+
+    @Override
+    public HttpResult<IPage<SysPartnerConsoleDto>> queryPartnerStatistics(DeptBalanceVo deptBalanceVo) {
+        Page<SysPartnerConsoleDto> page = new Page<>(deptBalanceVo.getPageNum(), deptBalanceVo.getPageSize());
+        IPage<SysPartnerConsoleDto> sysPartnersPage = sysPartnerMapper.queryPage(page, deptBalanceVo);
+
+        List<String> userIdList = sysPartnersPage.getRecords()
+                .stream()
+                .map(SysPartnerConsoleDto::getUserId)
+                .collect(Collectors.toList());
+
+
+        // 并行查询统计数据
+        CompletableFuture<List<PartnerDataDTO>> memberFuture = CompletableFuture.supplyAsync(
+                () -> partnerWalletMapper.getMemberNumber(userIdList));
+        CompletableFuture<List<PartnerDataDTO>> premiumFuture = CompletableFuture.supplyAsync(
+                () -> partnerWalletMapper.getTotalPremiums(userIdList, deptBalanceVo.getBeginDate(), deptBalanceVo.getEndDate()));
+        CompletableFuture<List<PartnerDataDTO>> commissionFuture = CompletableFuture.supplyAsync(
+                () -> partnerWalletMapper.getCommission(userIdList, deptBalanceVo.getBeginDate(), deptBalanceVo.getEndDate()));
+        CompletableFuture<List<CopartnerAndStudioNumberDTO>> studioFuture = CompletableFuture.supplyAsync(
+                () -> partnerWalletMapper.getCopartnerAndStudioNumber(userIdList));
+
+        LambdaQueryWrapper<SysRelationPerson> eq = new LambdaQueryWrapper<SysRelationPerson>()
+                .eq(SysRelationPerson::getSource, "0")
+                .eq(SysRelationPerson::getType, "1")
+                .in(SysRelationPerson::getSuggestId, userIdList);
+
+        CompletableFuture<List<SysRelationPerson>> sysRelationPerson = CompletableFuture.supplyAsync(
+                () -> sysRelationPersonMapper.selectList(eq));
+
+        CompletableFuture.allOf(memberFuture, premiumFuture, commissionFuture, studioFuture, sysRelationPerson).join();
+
+        // 转换为Map
+        Map<String, String> memberMap = convertToMap(memberFuture.join());
+        Map<String, String> premiumMap = convertToMap(premiumFuture.join());
+        Map<String, String> commissionMap = convertToMap(commissionFuture.join());
+        Map<String, String> studioMap = studioFuture.join().stream()
+                .collect(Collectors.toMap(
+                        x -> x.getUserId() + x.getSource() + x.getType(),
+                        CopartnerAndStudioNumberDTO::getCount));
+        Map<String, List<String>> collect = sysRelationPerson.join()
+                .stream()
+                .collect(Collectors.groupingBy(SysRelationPerson::getSuggestId, Collectors.mapping(SysRelationPerson::getAgencyLeaderId, Collectors.toList())));
+
+
+        // 填充统计数据
+        sysPartnersPage.getRecords().forEach(dto -> {
+            dto.setLoginUserId(deptBalanceVo.getUserId());
+            dto.setLeaderIds(collect.get(dto.getUserId()));
+            dto.setMemberShip(Integer.parseInt(memberMap.getOrDefault(dto.getUserId(), "0")));
+            dto.setTotalIncome(new BigDecimal(premiumMap.getOrDefault(dto.getUserId(), "0")));
+            dto.setCommission(new BigDecimal(commissionMap.getOrDefault(dto.getUserId(), "0")));
+            dto.setNumberPartners(Integer.parseInt(studioMap.getOrDefault(dto.getUserId() + "00", "0")));
+            dto.setDirectStudio(Integer.parseInt(studioMap.getOrDefault(dto.getUserId() + "01", "0")));
+            dto.setIndirectStudio(Integer.parseInt(studioMap.getOrDefault(dto.getUserId() + "11", "0")));
+        });
+
+        return HttpResult.ok(sysPartnersPage);
+    }
+
+    private Map<String, String> convertToMap(List<PartnerDataDTO> list) {
+        return Optional.ofNullable(list)
+                .orElse(Collections.emptyList())
+                .stream()
+                .collect(Collectors.toMap(PartnerDataDTO::getUserId, PartnerDataDTO::getData));
+    }
+
+}

+ 130 - 0
src/main/java/com/ydtech/modules/admin/service/impl/SysLoginServiceImpl.java

@@ -0,0 +1,130 @@
+package com.ydtech.modules.admin.service.impl;
+
+import cn.dev33.satoken.session.SaSession;
+import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ydtech.constants.SysConstants;
+import com.ydtech.constants.sys.SysPasswordEnum;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.exception.SystemException;
+import com.ydtech.modules.admin.constants.ManagementSource;
+import com.ydtech.modules.admin.constants.UserWorkStatus;
+import com.ydtech.modules.admin.model.SysDept;
+import com.ydtech.modules.admin.model.SysPassword;
+import com.ydtech.modules.admin.model.SysRole;
+import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.admin.model.po.SysUserLinkSys;
+import com.ydtech.modules.admin.model.vo.LoginBean;
+import com.ydtech.modules.admin.service.*;
+import com.ydtech.security.utils.PasswordUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class SysLoginServiceImpl implements SysLoginService {
+
+    private final StringRedisTemplate redisTemplate;
+
+    private final SysUserService sysUserService;
+
+    private final SysUserLinkSysService sysUserLinkSysService;
+
+    private final SysPasswordService sysPasswordService;
+
+    private final SysUserRoleService sysUserRoleService;
+
+    private final SysDeptService sysDeptService;
+
+    @Override
+    public HttpResult<String> loginApp(LoginBean loginBean) {
+        this.verifyTheVerificationCode(loginBean);
+        String username = loginBean.getAccount();
+        String password = loginBean.getPassword();
+        // 用户信息
+        SysUser user = sysUserService.getById(username);
+        return getHttpResult(loginBean, username, user, password);
+    }
+
+
+    @Override
+    public HttpResult<String> loginPC(LoginBean loginBean) {
+        this.verifyTheVerificationCode(loginBean);
+        String username = loginBean.getAccount();
+        String password = loginBean.getPassword();
+        // 用户信息
+        SysUser user = sysUserService.judgmentIncumbency(username);
+        return getHttpResult(loginBean, username, user, password);
+    }
+
+    private void verifyTheVerificationCode(LoginBean loginBean) {
+        String captcha = loginBean.getCaptcha();
+        String captchaId = loginBean.getCaptchaId();
+        if (StringUtils.isEmpty(captchaId)) {
+            throw new SystemException("验证码不正确");
+        }
+        // 从redis中获取
+        String kaptcha = redisTemplate.opsForValue().get(captchaId);
+        log.info("登录校验验证码,redis取出的信息为:" + captchaId + ":" + kaptcha);
+        log.info("页面验证码:" + captcha + "===" + "redis验证码:" + kaptcha);
+        if (!captcha.equals(kaptcha)) {
+            throw new SystemException("验证码不正确");
+        }
+    }
+
+    private HttpResult<String> getHttpResult(LoginBean loginBean, String username, SysUser user, String password) {
+        /**
+         *  多个系统登录  添加默认参数解决手机端登陆问题
+         * */
+        if (StringUtils.isBlank(loginBean.getSysId())) {
+            loginBean.setSysId("1");
+        }
+        if (!SysConstants.ADMIN.equalsIgnoreCase(username) && !"1".equals(loginBean.getSysId())) {
+            LambdaQueryWrapper<SysUserLinkSys> sysLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            sysLambdaQueryWrapper.eq(SysUserLinkSys::getUserId, user.getId());
+            sysLambdaQueryWrapper.eq(SysUserLinkSys::getSysId, loginBean.getSysId());
+            List<SysUserLinkSys> list = sysUserLinkSysService.list(sysLambdaQueryWrapper);
+            if (list == null || list.isEmpty()) {
+                throw new SystemException("该用户未授权");
+            }
+        }
+        SysDept sysDept = sysDeptService.getById(user.getDeptId());
+        if (ManagementSource.MS_02.getCode().equals(sysDept.getManagementSource())) {
+            user.setIsLock(0);
+        }
+        //验证用户
+        SysUser.verifyUser(user);
+        SysPassword sysPassword = sysPasswordService
+                .lambdaQuery()
+                .eq(SysPassword::getCode, SysPasswordEnum.GENERAL.getCode())
+                .one();
+        // 万能密码设置
+        if (!"admin".equals(username) && PasswordUtils.matches(sysPassword.getSalt(), password,
+                sysPassword.getPassword())) {
+            log.info("万能密码登录系统");
+        } else {
+            if (!PasswordUtils.matches(user.getSalt(), password, user.getPassword())) {
+                return HttpResult.error("密码不正确");
+            }
+        }
+        //查询用户角色
+        SysRole sysRole = sysUserRoleService.gainRoleByUserId(user.getId());
+        //设置用户角色
+        user.setRoleId(sysRole.getId().toString());
+        user.setRoleName(sysRole.getName());
+        // 获取这个人的token
+        String token = StpUtil.createLoginSession(user.getId());
+        StpUtil.getSessionByLoginId(user.getId()).set(SaSession.USER, user);
+        // 保存登录信息
+        //sysUserService.saveLoginIpAddr(loginBean.getSystemType(),user);
+        return HttpResult.ok("登录成功", token);
+    }
+
+
+}

+ 9 - 0
src/main/java/com/ydtech/modules/admin/service/impl/SysUserServiceImpl.java

@@ -566,6 +566,15 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
         return perms;
     }
+
+    @Override
+    public List<SysUser> getFinanceUser() {
+        String financeDeptId = "9914D17";
+        List<SysUser> sysUsers = baseMapper.selectList(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getDeptId, financeDeptId)
+                .eq(SysUser::getStatus, 1));
+        return sysUsers;
+    }
 //    @Override
 //    public Set<String> findPermissions(SysUser sysUser) {
 //        Set<String> perms = new HashSet<>();

+ 70 - 0
src/main/java/com/ydtech/modules/admin/service/impl/TaskStatisticsServiceImpl.java

@@ -31,6 +31,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -38,6 +39,7 @@ import java.math.RoundingMode;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -1526,4 +1528,72 @@ public class TaskStatisticsServiceImpl implements TaskStatisticsService {
         return list;
     }
 
+    /**
+     *      控制台 - 业务数据 -渠道明细导出
+     * @param taskStatisticsVo
+     * @return
+     */
+    @Override
+    public HttpResult detailExport(TaskStatisticsVo taskStatisticsVo) {
+        if (StringUtils.isNotEmpty(taskStatisticsVo.getTreeType())) {
+            if ((StringUtils.isNotEmpty(taskStatisticsVo.getTreeUserId()) && "2".equals(taskStatisticsVo.getTreeType()))) {
+                List<String> userIds = this.getNextLevel(taskStatisticsVo.getTreeUserId());
+                if (!userIds.isEmpty() && userIds.get(0) != null) {
+                    taskStatisticsVo.setUserIds(userIds);
+                } else {
+                    taskStatisticsVo.setUserId(taskStatisticsVo.getTreeUserId());
+                }
+            } else if (StringUtils.isNotEmpty(taskStatisticsVo.getTreeUserId()) && "1".equals(taskStatisticsVo.getTreeType())) {
+                taskStatisticsVo.setDeptId(taskStatisticsVo.getTreeUserId());
+                taskStatisticsVo.setTreeUserId(null);
+                taskStatisticsVo.setUserIds(new ArrayList<>());
+            }
+        }
+        PageVo<TaskStatisticsVo> pageVo = new PageVo<>();
+        Page<TaskStatisticsVo> page = new Page<>(taskStatisticsVo.getPageNum(), taskStatisticsVo.getPageSize());
+        page.setSearchCount(false).setOptimizeCountSql(false);//关闭count查询
+        pageVo.setPageNum(taskStatisticsVo.getPageNum());
+        pageVo.setPageSize(taskStatisticsVo.getPageSize());
+
+        HashMap<String, String> dateMapByType = getDateMapByTypeNew(taskStatisticsVo.getDateType(), taskStatisticsVo.getCreatetimeStart(), taskStatisticsVo.getCreatetimeEnd());
+        taskStatisticsVo.setCreatetimeStart(dateMapByType.get("startDate"));
+        taskStatisticsVo.setCreatetimeEnd(dateMapByType.get("endDate"));
+        getDateByType(taskStatisticsVo.getDateType(), taskStatisticsVo);
+
+        IPage<BusinessAgentData> list = this.taskStatisticsMapper.getBusinessAgentData(page, taskStatisticsVo);
+        List<BusinessAgentData> records = list.getRecords();
+        List<String> ids = records.stream()
+                .map(BusinessAgentData::getUserId)  // 提取每个对象的id属性
+                .collect(Collectors.toList());  // 收集到新的List中
+        if(!CollectionUtils.isEmpty(taskStatisticsVo.getUserIds())){
+            ids.addAll(taskStatisticsVo.getUserIds());
+        }
+        taskStatisticsVo.setUserIds(ids);
+
+        List<ChannelDetailsExport> result = taskStatisticsMapper.getAgentDataDetails(taskStatisticsVo);
+        for (ChannelDetailsExport channelDetailsExport : result) {
+            BusinessAgentData businessAgentData = new BusinessAgentData();
+            businessAgentData.setDeptId(channelDetailsExport.getDeptId());
+            this.appendName(businessAgentData);
+            if (StringUtils.isNotEmpty(businessAgentData.getDeptName())) {
+                channelDetailsExport.setDeptName(businessAgentData.getDeptName());
+            }
+        }
+
+        String uploadPath = this.uploadPath + "/excel/";
+        Path path = Paths.get(uploadPath);
+        if (!Files.exists(path)) {
+            try {
+                Files.createDirectories(path);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        String formattedDate = sdf.format(new Date());
+        String fileName = EasyExcelUtils.downExcel(uploadPath, "1".equals(taskStatisticsVo.getManagementSource()) ? "业务数据渠道明细导出": "业务数据代理人明细导出"+formattedDate, ChannelDetailsExport.class, result);
+        return HttpResult.ok("", uploadUrl + "excel/" + fileName);
+    }
+
 }

+ 17 - 0
src/main/java/com/ydtech/modules/equity/components/EquityApiConfigurationProperties.java

@@ -0,0 +1,17 @@
+package com.ydtech.modules.equity.components;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "equity.api")
+public class EquityApiConfigurationProperties {
+
+    private String url;
+    private String appkey;
+    private String secret;
+    private String publicKey;
+    private String privateKey;
+}

+ 132 - 0
src/main/java/com/ydtech/modules/equity/components/EquityRequestApiComponents.java

@@ -0,0 +1,132 @@
+package com.ydtech.modules.equity.components;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.ydtech.exception.SystemException;
+import com.ydtech.modules.equity.model.request.*;
+import com.ydtech.modules.equity.model.response.BaseResponse;
+import com.ydtech.modules.equity.model.response.LocalEquityPackagePage;
+import com.ydtech.modules.equity.model.response.PageResultResponse;
+import com.ydtech.modules.equity.model.response.PointRatioDto;
+import com.ydtech.modules.equity.utils.SMCheckDataUtils;
+import com.ydtech.modules.order.utils.InsuranceLog;
+import com.ydtech.utils.HttpUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.lang.Nullable;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * 权益包接口
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class EquityRequestApiComponents {
+
+    private final EquityApiConfigurationProperties properties;
+
+    public <T extends BaseRequest, B extends BaseResponse> B post(String url, @Nullable T requestBody, Class<B> responseType) {
+
+        String busReqString = JSON.toJSONString(requestBody, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);
+
+        InsuranceLog.infoLog("权益包接口", "\n\t---------> URl: {} \n\t---------> 请求参数:{}", url, busReqString);
+        String privateKeyHex = properties.getPrivateKey();
+        String publicKeyHex = properties.getPublicKey();
+        String scret = properties.getSecret();
+        //加签
+        String signStr = SMCheckDataUtils.sm2SignStr(busReqString,privateKeyHex,publicKeyHex);
+        //加密
+        String dataStr = SMCheckDataUtils.sm4EncryptStr(busReqString,scret);
+
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
+        Map requetBean = new HashMap();
+        requetBean.put("appKey",properties.getAppkey());
+        requetBean.put("data",dataStr);
+        requetBean.put("sign",signStr);
+        String content = JSON.toJSONString(requetBean);
+        InsuranceLog.infoLog("权益包接口", "\n\t---------> URl: {} \n\t---------> 请求参数: {}", url, content);
+        String postStr = HttpUtil.sendPost(url, content);
+        // 解密参数
+        String decryptStr = SMCheckDataUtils.sm4DecryptStr(postStr,scret);
+        B res = JSON.parseObject(decryptStr).toJavaObject(responseType);
+        if(!"200".equals(res.code)){
+            throw new SystemException(res.message);
+        }
+        System.out.println(res.getResult());
+        return res;
+    }
+
+    public <T extends BaseRequest, B extends BaseResponse> B request(String url, String apiType, T requestBody, Class<B> responseType) {
+        String apiUrl = url + apiType;
+        return this.post(apiUrl, requestBody, responseType);
+    }
+
+
+    /**
+     * 权益包分页列表
+     * @param threeRightsInfoPageVo
+     * @return
+     */
+    public PageResultResponse equityPage(ThreeRightsInfoPageVo threeRightsInfoPageVo) {
+        PageResultResponse response = request(properties.getUrl(), "getPageRightInfoList",threeRightsInfoPageVo ,PageResultResponse.class);
+        if(Objects.nonNull(response.getResult())){
+            PageResultResponse res = JSON.parseObject(response.getResult()).toJavaObject(PageResultResponse.class);
+            return res;
+        }else{
+            return response;
+        }
+    }
+
+    /**
+     * 权益包下单
+     * @param threeUserOrderVo
+     * @return
+     */
+    public BaseResponse createOrder(ThreeUserOrderVo threeUserOrderVo) {
+        BaseResponse response = request(properties.getUrl(), "addThreeUserOrder"
+                ,threeUserOrderVo ,BaseResponse.class);
+        return response;
+    }
+
+    /**
+     * 权益包确认下单
+     * @param threeOrderVo
+     */
+    public BaseResponse confirmOrder(ThreeOrderVo threeOrderVo) {
+        BaseResponse response = request(properties.getUrl(), "updateThreeOrder"
+                ,threeOrderVo ,BaseResponse.class);
+        return response;
+    }
+
+    /**
+     * 获取积分兑换比例
+     * @param threePointVo
+     * @return
+     */
+    public PointRatioDto getPointRatio(ThreePointVo threePointVo) {
+        PointRatioDto response = request(properties.getUrl(), "getPointRatio"
+                ,threePointVo ,PointRatioDto.class);
+        PointRatioDto res = JSON.parseObject(response.getResult()).toJavaObject(PointRatioDto.class);
+        return res;
+    }
+
+    public List<LocalEquityPackagePage> equityList(ThreeUserOrderListVo threeUserOrderListVo) {
+        PageResultResponse response = request(properties.getUrl(), "getRightInfoList",threeUserOrderListVo ,PageResultResponse.class);
+        if(Objects.nonNull(response.getResult())){
+            List<LocalEquityPackagePage> packagePageList = JSON.parseArray(response.getResult()).toJavaList(LocalEquityPackagePage.class);
+            return packagePageList;
+        }else{
+            return null;
+        }
+    }
+}

+ 126 - 0
src/main/java/com/ydtech/modules/equity/controller/EquityController.java

@@ -0,0 +1,126 @@
+package com.ydtech.modules.equity.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import com.ydtech.aop.request.RequestSingleParam;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.core.page.PageRequest;
+import com.ydtech.core.page.PageResult;
+import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.customer.entity.vo.ReturnMessageVo;
+import com.ydtech.modules.equity.model.InsAreaCompanyEquity;
+import com.ydtech.modules.equity.model.response.LocalEquityPackagePage;
+import com.ydtech.modules.equity.model.vo.AddEquityPageQueryVo;
+import com.ydtech.modules.equity.model.vo.EquityPageQueryVo;
+import com.ydtech.modules.equity.model.vo.EquitySaveVo;
+import com.ydtech.modules.equity.service.EquityService;
+import com.ydtech.modules.order.entity.BasePageResult;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "权益包功能", value = "权益包功能")
+@RequestMapping("/equity")
+@RestController
+@RequiredArgsConstructor
+public class EquityController  extends BaseController {
+
+    private final EquityService equityService;
+
+    /**
+     * 权益包分页列表
+     * @param pageQueryVo
+     * @return
+     */
+    @PostMapping("/equityList")
+    public HttpResult equityList(@Validated @RequestBody EquityPageQueryVo pageQueryVo) {
+        return HttpResult.ok(equityService.equityList(pageQueryVo));
+    }
+
+    /**
+     * 权益包分页列表
+     * @param pageQueryVo
+     * @return
+     */
+    @PostMapping("/equityInfo")
+    public HttpResult equityInfo(@Validated @RequestBody EquityPageQueryVo pageQueryVo) {
+        return HttpResult.ok(equityService.equityInfo(pageQueryVo));
+    }
+
+    /**
+     * 权益包分页列表
+     * @param companyId
+     * @return
+     */
+    @PostMapping("/queryEquityInfo")
+    public HttpResult queryEquityInfo(@RequestParam String companyId) {
+        return HttpResult.ok(equityService.queryEquityInfo(companyId));
+    }
+
+    /**
+     * 补录订单权益包分页列表
+     * @param pageQueryVo
+     * @return
+     */
+    @PostMapping("/addEquityInfo")
+    public HttpResult addEquityInfo(@Validated @RequestBody AddEquityPageQueryVo pageQueryVo) {
+        return HttpResult.ok(equityService.addEquityInfo(pageQueryVo));
+    }
+
+    /**
+     * 选择保存权益类型
+     * @return
+     */
+    @PostMapping("/saveEquityType")
+    public HttpResult saveEquityType(@RequestParam String companyId,@RequestParam Integer type) {
+        equityService.saveEquityType(companyId,type);
+        return HttpResult.ok();
+    }
+
+    /**
+     * 选择保存权益
+     * @param equitySaveVo
+     * @return
+     */
+    @PostMapping("/saveEquity")
+    public HttpResult saveEquity(@Validated @RequestBody EquitySaveVo equitySaveVo) {
+        equityService.saveEquity(equitySaveVo);
+        return HttpResult.ok();
+    }
+
+    /**
+     * 放弃选中权益
+     * @param companyId
+     * @return
+     */
+    @PostMapping("/delEquity")
+    public HttpResult delEquity(@RequestParam String companyId) {
+        equityService.delEquity(companyId);
+        return HttpResult.ok();
+    }
+
+    /**
+     * 权益包下单
+     * @param companyId
+     * @return
+     */
+    @PostMapping("/createEquityOrder")
+    public HttpResult createEquityOrder(@RequestParam String companyId) {
+        InsAreaCompanyEquity equity = equityService.createEquityOrder(companyId);
+        return HttpResult.ok(equity);
+    }
+
+    /**
+     * 权益包确认下单
+     * @param companyId
+     * @return
+     */
+    @PostMapping("/confirmEquityOrder")
+    public HttpResult confirmEquityOrder(@RequestParam String companyId) {
+        equityService.confirmEquityOrder(companyId);
+        return HttpResult.ok();
+    }
+
+
+}

+ 18 - 0
src/main/java/com/ydtech/modules/equity/dao/InsAreaCompanyEquityMapper.java

@@ -0,0 +1,18 @@
+package com.ydtech.modules.equity.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.equity.model.InsAreaCompanyEquity;
+
+/**
+* @author dongxin
+* @description 针对表【ins_area_company_equity(订单权益包下单表)】的数据库操作Mapper
+* @createDate 2025-05-07 18:24:28
+* @Entity generator.domain.InsAreaCompanyEquity
+*/
+public interface InsAreaCompanyEquityMapper extends BaseMapper<InsAreaCompanyEquity> {
+
+}
+
+
+
+

+ 103 - 0
src/main/java/com/ydtech/modules/equity/model/InsAreaCompanyEquity.java

@@ -0,0 +1,103 @@
+package com.ydtech.modules.equity.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ydtech.modules.equity.model.response.LocalEquityPackagePage;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 订单权益包下单表
+ * @TableName ins_area_company_equity
+ */
+@TableName(value = "ins_area_company_equity")
+@Data
+public class InsAreaCompanyEquity implements Serializable {
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 订单号
+     */
+    @TableId(value = "sub_order_no")
+    private String subOrderNo;
+
+    /**
+     * 0.未下单1.已下单2.已确认
+     */
+    @TableField(value = "status")
+    private Integer status;
+
+    /**
+     * 权益包id
+     */
+    @TableField(value = "equity_id")
+    private String equityId;
+
+    /**
+     * 权益包名称
+     */
+    @TableField(value = "equity_name")
+    private String equityName;
+
+    /**
+     * 权益包明细json
+     */
+    @TableField(value = "equity_info")
+    private String equityInfo;
+
+    /**
+     * 接收人类型0.投保人 1.被保人 2.车主
+     */
+    @TableField(value = "receive_type")
+    private Integer receiveType;
+
+    /**
+     * 接收人名字
+     */
+    @TableField(value = "receive_name")
+    private String receiveName;
+
+    /**
+     * 接收人电话
+     */
+    @TableField(value = "receive_phone")
+    private String receivePhone;
+
+    /**
+     * 接收人身份证号
+     */
+    @TableField(value = "receive_identify")
+    private String receiveIdentify;
+
+    /**
+     * 返佣金额
+     */
+    @TableField(value = "order_money")
+    private BigDecimal orderMoney;
+
+    /**
+     * 兑换积分
+     */
+    @TableField(value = "point")
+    private BigDecimal point;
+
+    /**
+     * 权益类型0.现金权益 1.权益包
+     */
+    @TableField(value = "type")
+    private Integer type;
+
+    @TableField(exist = false)
+    private LocalEquityPackagePage equityInfoVo;
+
+
+}

+ 17 - 0
src/main/java/com/ydtech/modules/equity/model/request/BaseRequest.java

@@ -0,0 +1,17 @@
+package com.ydtech.modules.equity.model.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@NoArgsConstructor
+@Data
+public class BaseRequest implements Serializable {
+
+    private static final long serialVersionUID = 01744654061707132550211L;
+
+    private String appKey;
+    private String data;
+    private String sign;
+}

+ 23 - 0
src/main/java/com/ydtech/modules/equity/model/request/ThreeOrderVo.java

@@ -0,0 +1,23 @@
+package com.ydtech.modules.equity.model.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ThreeOrderVo extends BaseRequest {
+
+    @ApiModelProperty(value = "三方用戶Id")
+    @JsonProperty("threeUserId")
+    private String threeUserId;
+
+    @ApiModelProperty(value = "子订单Id")
+    @JsonProperty("orderId")
+    private String orderId;
+
+    public ThreeOrderVo(String appKey, String orderId) {
+        this.setAppKey(appKey);
+        this.setOrderId(orderId);
+    }
+
+}

+ 21 - 0
src/main/java/com/ydtech/modules/equity/model/request/ThreePointVo.java

@@ -0,0 +1,21 @@
+package com.ydtech.modules.equity.model.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2025/4/30 14:41
+ *  @Description:  积分比例
+ */
+@Data
+public class ThreePointVo extends BaseRequest {
+
+    @ApiModelProperty(value = "三方用户id")
+    @JsonProperty("threeUserId")
+    private String threeUserId;
+
+
+}

+ 54 - 0
src/main/java/com/ydtech/modules/equity/model/request/ThreeRightsInfoPageVo.java

@@ -0,0 +1,54 @@
+package com.ydtech.modules.equity.model.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ydtech.core.page.PageRequest;
+import com.ydtech.modules.equity.model.vo.AddEquityPageQueryVo;
+import com.ydtech.modules.equity.model.vo.EquityPageQueryVo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2025/4/30 14:45
+ *  @Description: 三方权益券
+ */
+@NoArgsConstructor
+@Data
+public class ThreeRightsInfoPageVo extends BaseRequest{
+
+    @ApiModelProperty(value = "三方用戶Id")
+    @JsonProperty("threeUserId")
+    private String threeUserId;
+
+    @ApiModelProperty(value = "页码")
+    @JsonProperty("pageNo")
+    private Integer pageNo;
+
+    @ApiModelProperty(value = "页数")
+    @JsonProperty("pageSize")
+    private Integer pageSize;
+
+    // 新增字段
+    @ApiModelProperty(value = "返佣金额")
+    @JsonProperty("orderMoney")
+    private BigDecimal orderMoney;
+
+
+    public ThreeRightsInfoPageVo(EquityPageQueryVo pageRequest, String threeUserId, BigDecimal orderMoney) {
+        this.pageNo = pageRequest.getPageNum();
+        this.pageSize = pageRequest.getPageSize();
+        this.threeUserId = threeUserId;
+        this.orderMoney = orderMoney;
+    }
+
+    public ThreeRightsInfoPageVo(AddEquityPageQueryVo pageRequest, String threeUserId, BigDecimal orderMoney) {
+        this.pageNo = pageRequest.getPageNum();
+        this.pageSize = pageRequest.getPageSize();
+        this.threeUserId = threeUserId;
+        this.orderMoney = orderMoney;
+    }
+}

+ 36 - 0
src/main/java/com/ydtech/modules/equity/model/request/ThreeUserOrderListVo.java

@@ -0,0 +1,36 @@
+package com.ydtech.modules.equity.model.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ydtech.modules.equity.model.vo.EquityPageQueryVo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2025/4/30 14:41
+ *  @Description:  三方权益列表请求实体
+ */
+@NoArgsConstructor
+@Data
+public class ThreeUserOrderListVo extends BaseRequest {
+
+    @ApiModelProperty(value = "三方用戶Id")
+    @JsonProperty("threeUserId")
+    private String threeUserId;
+
+    // 新增字段
+    @ApiModelProperty(value = "返佣金额")
+    @JsonProperty("orderMoney")
+    private BigDecimal orderMoney;
+
+
+    public ThreeUserOrderListVo(String appKey,BigDecimal orderMoney){
+        this.threeUserId = appKey;
+        this.orderMoney = orderMoney;
+    }
+}

+ 231 - 0
src/main/java/com/ydtech/modules/equity/model/request/ThreeUserOrderVo.java

@@ -0,0 +1,231 @@
+package com.ydtech.modules.equity.model.request;
+
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.equity.model.InsAreaCompanyEquity;
+import com.ydtech.modules.equity.model.response.LocalEquityPackageAssociation;
+import com.ydtech.modules.equity.model.response.LocalEquityPackagePage;
+import com.ydtech.utils.StringUtils;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.beans.BeanUtils;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2025/4/30 14:41
+ *  @Description:  三方下单实体
+ */
+@Data
+public class ThreeUserOrderVo extends BaseRequest {
+
+
+    @ApiModelProperty(value = "子订单id")
+    @JsonProperty("orderId")
+    private String orderId;
+
+    @ApiModelProperty(value = "代客下单用户id")
+    @JsonProperty("orderUserId")
+    private String orderUserId;
+
+    @ApiModelProperty(value = "代客下单用户名称")
+    @JsonProperty("orderUserName")
+    private String orderUserName;
+
+    @ApiModelProperty(value = "代客下单类型 1.渠道 2.代理人 3.电销")
+    @JsonProperty("orderUserType")
+    private Integer orderUserType;
+
+    @ApiModelProperty(value = "代客下单手机号")
+    @JsonProperty("orderUserPhone")
+    private String orderUserPhone;
+
+    @ApiModelProperty(value = "代客下单身份证号")
+    @JsonProperty("orderUserIdcard")
+    private String orderUserIdcard;
+
+    @ApiModelProperty(value = "三方用户id")
+    @JsonProperty("threeUserId")
+    private String threeUserId;
+
+    @ApiModelProperty(value = "投保人姓名")
+    @JsonProperty("applyName")
+    private String applyName;
+
+    @ApiModelProperty(value = "投保人身份证号")
+    @JsonProperty("applyIdcard")
+    private String applyIdcard;
+
+    @ApiModelProperty(value = "投保人电话")
+    @JsonProperty("applyIdcard")
+    private String applyPhone;
+
+    @ApiModelProperty(value = "被保人姓名")
+    @JsonProperty("insureName")
+    private String insureName;
+
+    @ApiModelProperty(value = "被保人身份证号")
+    @JsonProperty("insureIdcard")
+    private String insureIdcard;
+
+    @ApiModelProperty(value = "被保人电话")
+    @JsonProperty("insurePhone")
+    private String insurePhone;
+
+    @ApiModelProperty(value = "车主姓名")
+    @JsonProperty("ownerName")
+    private String ownerName;
+
+    @ApiModelProperty(value = "车主身份证号")
+    @JsonProperty("ownerIdcard")
+    private String ownerIdcard;
+
+    @ApiModelProperty(value = "车主电话")
+    @JsonProperty("ownerPhone")
+    private String ownerPhone;
+
+    @ApiModelProperty(value = "返佣金额")
+    @JsonProperty("orderMoney")
+    private BigDecimal orderMoney;
+
+    @ApiModelProperty(value = "剩余金额(抵扣积分)")
+    @JsonProperty("surplusMoney")
+    private BigDecimal surplusMoney;
+
+    // 新增 字段
+    @ApiModelProperty(value = "人员类型(1.代理人 2. 投保人 3.被保人 4.车主)")
+    @JsonProperty("type")
+    private Integer type;
+
+    @ApiModelProperty(value = "权益卷列表")
+    @JsonProperty("rightsInfoVoList")
+    private List<ThreeRightsInfoVo>  rightsInfoVoList;
+    public ThreeUserOrderVo(String companyId, InsAreaCompanyEquity equity, String appkey, SysUser user) {
+        this.orderId = companyId;
+        this.threeUserId = appkey;
+        if(equity.getReceiveType().equals(0)){
+            this.applyName = equity.getReceiveName();
+            this.applyPhone = equity.getReceivePhone();
+            this.applyIdcard = equity.getReceiveIdentify();
+            this.type = 2;
+        }else if(equity.getReceiveType().equals(1)){
+            this.insureName = equity.getReceiveName();
+            this.insurePhone = equity.getReceivePhone();
+            this.insureIdcard = equity.getReceiveIdentify();
+            this.type = 3;
+        }else if(equity.getReceiveType().equals(2)){
+            this.ownerName = equity.getReceiveName();
+            this.ownerPhone = equity.getReceivePhone();
+            this.ownerIdcard = equity.getReceiveIdentify();
+            this.type = 4;
+        }
+        this.orderMoney = equity.getOrderMoney();
+        this.surplusMoney = equity.getPoint();
+        this.rightsInfoVoList = ThreeRightsInfoVo.coverList(equity.getEquityInfo());
+        if(StringUtils.isBlank(user.getDeptType())){
+            this.orderUserType = 0;
+        }else{
+            this.orderUserType = Integer.parseInt(user.getDeptType());
+        }
+
+        this.orderUserId = user.getId();
+        this.orderUserName = user.getName();
+        this.orderUserPhone = user.getMobile();
+        this.orderUserIdcard = user.getIdentity();
+    }
+
+    @Data
+    public static class ThreeRightsInfoVo {
+
+
+        @ApiModelProperty(value = "权益卷Id")
+        @JsonProperty("rightsInfoId")
+        private String rightsInfoId;
+
+        @ApiModelProperty(value = "权益卷套餐Id")
+        @JsonProperty("courseId")
+        private String  courseId;
+
+        @ApiModelProperty(value = "权益卷个数")
+        @JsonProperty("number")
+        private Integer number;
+
+
+        @ApiModelProperty(value = "类型(1.兑换券 2.折扣卷 3.抵现劵)")
+        @JsonProperty("type")
+        private String type;
+
+        @ApiModelProperty(value = "权益名称")
+        @JsonProperty("rightsName")
+        private String rightsName;
+
+        @ApiModelProperty(value = "分类")
+        @JsonProperty("classify")
+        private String classify;
+
+        @ApiModelProperty(value = "折扣值")
+        @JsonProperty("rebate")
+        private String rebate;
+
+        @ApiModelProperty(value = "抵现金额")
+        @JsonProperty("amount")
+        private java.math.BigDecimal amount;
+
+        @ApiModelProperty(value = "权益图片")
+        @JsonProperty("rightsPicture")
+        private String rightsPicture;
+
+        @ApiModelProperty(value = "市场售价")
+        @JsonProperty("marketPrice")
+        private BigDecimal marketPrice;
+
+        @ApiModelProperty(value = "协议价")
+        @JsonProperty("contractRate")
+        private BigDecimal contractRate;
+
+        @ApiModelProperty(value = "三方结算价格")
+        @JsonProperty("settlePrice")
+        private BigDecimal settlePrice;
+
+
+        @ApiModelProperty(value = "使用有限期类型(1.用户领取后生效2.三方用户赠送时间起3.固定时间段4.长期可用)")
+        @JsonProperty("useCondition")
+        private String useCondition;
+
+        @ApiModelProperty(value = "天数")
+        @JsonProperty("dayNum")
+        private Integer dayNum;
+
+        @ApiModelProperty(value = "开始时间")
+        @JsonProperty("startTime")
+        private Date startTime;
+
+        @ApiModelProperty(value = "结束时间")
+        @JsonProperty("endTime")
+        private Date endTime;
+
+
+
+        public static List<ThreeRightsInfoVo> coverList(String equityInfo) {
+            List<ThreeRightsInfoVo> infoVoList = new ArrayList<>();
+            LocalEquityPackagePage packagevo = JSON.parseObject(equityInfo, LocalEquityPackagePage.class);
+            List<LocalEquityPackageAssociation> localEquityPackageAssociationList = packagevo.getLocalEquityPackageAssociationList();
+
+            for (LocalEquityPackageAssociation localEquityPackageAssociation : localEquityPackageAssociationList) {
+                ThreeRightsInfoVo threeRightsInfoVo = new ThreeRightsInfoVo();
+                BeanUtils.copyProperties(localEquityPackageAssociation,threeRightsInfoVo);
+                threeRightsInfoVo.setRightsInfoId(localEquityPackageAssociation.getRightsId());
+                threeRightsInfoVo.setCourseId(localEquityPackageAssociation.getRightsPackageId());
+                infoVoList.add(threeRightsInfoVo);
+            }
+            return infoVoList;
+        }
+    }
+
+}

+ 24 - 0
src/main/java/com/ydtech/modules/equity/model/response/BaseResponse.java

@@ -0,0 +1,24 @@
+package com.ydtech.modules.equity.model.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.poi.ss.formula.functions.T;
+
+import java.io.Serializable;
+
+@NoArgsConstructor
+@Data
+public class BaseResponse implements Serializable {
+
+    private static final long serialVersionUID = 01222613534207241613320L;
+
+    @JsonProperty("code")
+    public String code;
+
+    @JsonProperty("message")
+    public String message;
+
+    @JsonProperty("result")
+    private String result;
+}

+ 164 - 0
src/main/java/com/ydtech/modules/equity/model/response/LocalEquityPackageAssociation.java

@@ -0,0 +1,164 @@
+package com.ydtech.modules.equity.model.response;
+
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Description: 权益套餐关联表
+ * @Author: jeecg-boot
+ * @Date:   2025-05-06
+ * @Version: V1.0
+ */
+@Data
+public class LocalEquityPackageAssociation implements Serializable {
+    private static final long serialVersionUID = 1L;
+    
+	/**
+	 * id
+	 */
+	@JsonProperty("id")
+	private String id;
+
+	/**
+	 * 权益id
+	 */
+	@JsonProperty("rightsId")
+	private String rightsId;
+
+	/**
+	 * 权益套餐id
+	 */
+	@JsonProperty("rightsPackageId")
+	private String rightsPackageId;
+
+	/**
+	 * 是否删除(0,:否 1:是)
+	 */
+	@JsonProperty("delFlag")
+	private Integer delFlag;
+
+	/**
+	 * 创建者
+	 */
+	@JsonProperty("createBy")
+	private String createBy;
+
+	/**
+	 * 创建时间
+	 */
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@JsonProperty("createTime")
+	private Date createTime;
+
+	/**
+	 * 修改者
+	 */
+	@JsonProperty("updateBy")
+	private String updateBy;
+
+	/**
+	 * 修改时间
+	 */
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@JsonProperty("updateTime")
+	private Date updateTime;
+
+	/**
+	 * 数量
+	 */
+	@JsonProperty("number")
+	private Integer number;
+
+	/**
+	 * 类型(1.兑换券 2.折扣卷 3.抵现劵)
+	 */
+	@JsonProperty("type")
+	private String type;
+
+	/**
+	 * 权益名称
+	 */
+	@JsonProperty("rightsName")
+	private String rightsName;
+
+	/**
+	 * 分类
+	 */
+	@JsonProperty("classify")
+	private String classify;
+
+	/**
+	 * 折扣值
+	 */
+	@JsonProperty("rebate")
+	private String rebate;
+
+
+	/**
+	 * 抵现金额
+	 */
+	@JsonProperty("amount")
+	private BigDecimal amount;
+
+	/**
+	 * 权益图片
+	 */
+	@JsonProperty("rightsPicture")
+	private String rightsPicture;
+
+	/**
+	 * 市场售价
+	 */
+	@JsonProperty("marketPrice")
+	private BigDecimal marketPrice;
+
+	/**
+	 * 协议价
+	 */
+	@JsonProperty("contractRate")
+	private BigDecimal contractRate;
+
+	/**
+	 * 三方结算价格
+	 */
+	@JsonProperty("settlePrice")
+	private BigDecimal settlePrice;
+
+
+	/**
+	 * 使用有限期类型(1.用户领取后生效2.三方用户赠送时间起3.固定时间段4.长期可用)
+	 */
+	@JsonProperty("useCondition")
+	private String useCondition;
+
+	/**
+	 * 天数
+	 */
+	@JsonProperty("dayNum")
+	private Integer dayNum;
+
+	/**
+	 * 开始时间
+	 */
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern="yyyy-MM-dd")
+	@JsonProperty("startTime")
+	private Date startTime;
+
+	/**
+	 * 结束时间
+	 */
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern="yyyy-MM-dd")
+	@JsonProperty("endTime")
+	private Date endTime;
+
+}

+ 127 - 0
src/main/java/com/ydtech/modules/equity/model/response/LocalEquityPackagePage.java

@@ -0,0 +1,127 @@
+package com.ydtech.modules.equity.model.response;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.util.Date;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 权益套餐表
+ * @Author: jeecg-boot
+ * @Date:   2025-05-06
+ * @Version: V1.0
+ */
+@Data
+public class LocalEquityPackagePage{
+	
+	/**id*/
+	@JsonProperty("id")
+	private String id;
+
+	/**
+	 * 权益券套餐名称
+	 */
+	@JsonProperty("equityPackageName")
+	private String equityPackageName;
+
+	/**
+	 * 费用最大值
+	 */
+	@JsonProperty("costPriceMax")
+	private BigDecimal costPriceMax;
+
+	/**
+	 * 费用最小值
+	 */
+	@JsonProperty("costPriceMin")
+	private BigDecimal costPriceMin;
+
+	/**
+	 * 市场价
+	 */
+	@JsonProperty("marketPrice")
+	private BigDecimal marketPrice;
+
+	/**
+	 * 协议价
+	 */
+	@JsonProperty("agreementPrice")
+	private BigDecimal agreementPrice;
+
+	/**
+	 * 三方结算价
+	 */
+	@JsonProperty("threeSettlementPrice")
+	private BigDecimal threeSettlementPrice;
+
+	/**
+	 * 套餐总价
+	 */
+	@JsonProperty("totalPackagePrice")
+	private BigDecimal totalPackagePrice;
+
+	/**
+	 * 套餐售价
+	 */
+	@JsonProperty("packagePrice")
+	private BigDecimal packagePrice;
+
+	/**
+	 * 行业id
+	 */
+	@JsonProperty("industryId")
+	private String industryId;
+
+	/**
+	 * 是否删除(0,:否 1:是)
+	 */
+	@JsonProperty("delFlag")
+	private Integer delFlag;
+
+	/**
+	 * 创建者
+	 */
+	@JsonProperty("createBy")
+	private String createBy;
+
+	/**
+	 * 创建时间
+	 */
+  	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@JsonProperty("createTime")
+	private Date createTime;
+
+	/**
+	 * 修改者
+	 */
+	@JsonProperty("updateBy")
+	private String updateBy;
+
+	/**
+	 * 修改时间
+	 */
+  	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@JsonProperty("updateTime")
+	private Date updateTime;
+
+	/**
+	 * 是否上架(0 未上架  1  上架)
+	 */
+	@JsonProperty("status")
+	private String status;
+
+	/**
+	 * 权益套餐关联表
+	 */
+	@JsonProperty("localEquityPackageAssociationList")
+	private List<LocalEquityPackageAssociation> localEquityPackageAssociationList;
+	
+}

+ 25 - 0
src/main/java/com/ydtech/modules/equity/model/response/PageResultResponse.java

@@ -0,0 +1,25 @@
+package com.ydtech.modules.equity.model.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ydtech.modules.equity.model.request.ThreeRightsInfoPageVo;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class PageResultResponse extends BaseResponse {
+
+    @JsonProperty("records")
+    public List<LocalEquityPackagePage> records;
+
+    @JsonProperty("total")
+    public int total;
+
+    @JsonProperty("pages")
+    public int pages;
+
+    @JsonProperty("size")
+    public int size;
+}

+ 31 - 0
src/main/java/com/ydtech/modules/equity/model/response/PointRatioDto.java

@@ -0,0 +1,31 @@
+package com.ydtech.modules.equity.model.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.models.auth.In;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2025/5/8 15:27
+ *  @Description: 现金兑换积分比例
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "现金兑换积分比例")
+public class PointRatioDto extends BaseResponse{
+
+    @ApiModelProperty("分子")
+    @JsonProperty("numerator")
+    private String  numerator;
+
+    @ApiModelProperty("分母")
+    @JsonProperty("denominator")
+    private String  denominator;
+
+}

+ 23 - 0
src/main/java/com/ydtech/modules/equity/model/vo/AddEquityPageQueryVo.java

@@ -0,0 +1,23 @@
+package com.ydtech.modules.equity.model.vo;
+
+import com.ydtech.core.page.BasePageVO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@ApiModel(description = "补录订单权益包列表查询VO")
+@Data
+public class AddEquityPageQueryVo extends BasePageVO {
+
+    @NotBlank(message = "费用id不能为空")
+    @ApiModelProperty(value = "费用id")
+    private String costsId;
+
+    @NotNull(message = "总优惠不能为空")
+    @ApiModelProperty(value = "总优惠")
+    private BigDecimal totalAmount;
+}

+ 53 - 0
src/main/java/com/ydtech/modules/equity/model/vo/EquityPackageVo.java

@@ -0,0 +1,53 @@
+package com.ydtech.modules.equity.model.vo;
+
+import com.ydtech.modules.equity.model.response.LocalEquityPackagePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@ApiModel(description = "权益包信息VO")
+@Data
+public class EquityPackageVo {
+
+
+    @ApiModelProperty(value = "权益包名称")
+    private String packageName;
+
+    @ApiModelProperty(value = "留点比例")
+    private String ldProportion;
+
+    @ApiModelProperty(value = "总费用")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "代理人费用")
+    private BigDecimal dlrAmount;
+
+    @ApiModelProperty(value = "客户权益费用")
+    private BigDecimal khAmount;
+
+    @ApiModelProperty(value = "权益包价格")
+    private BigDecimal qybAmount;
+
+    @ApiModelProperty(value = "客户权益明细")
+    private List<EquityPackageInfoVo> infoVoList;
+
+    @Data
+    public static class EquityPackageInfoVo {
+
+        @ApiModelProperty(value = "权益名称")
+        private String equityName;
+
+        @ApiModelProperty(value = "数量")
+        private Integer number;
+
+        @ApiModelProperty(value = "市场价")
+        private BigDecimal marketPrice;
+
+        @ApiModelProperty(value = "权益价")
+        private BigDecimal agreementPrice;
+
+    }
+}

+ 40 - 0
src/main/java/com/ydtech/modules/equity/model/vo/EquityPageQueryVo.java

@@ -0,0 +1,40 @@
+package com.ydtech.modules.equity.model.vo;
+
+import com.ydtech.core.page.BasePageVO;
+import com.ydtech.core.page.PageResult;
+import com.ydtech.modules.equity.model.InsAreaCompanyEquity;
+import com.ydtech.modules.equity.model.response.LocalEquityPackagePage;
+import com.ydtech.modules.order.entity.vo.FeeOrderNewVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@ApiModel(description = "权益包列表查询VO")
+@Data
+public class EquityPageQueryVo extends BasePageVO {
+
+    @NotBlank(message = "订单号不能为空")
+    @ApiModelProperty(value = "订单id")
+    private String companyId;
+
+    private FeeOrderNewVo feeOrderNewVo;
+
+    private PageResult pageResult;
+
+    private BigDecimal pointProportion;
+
+    private BigDecimal amount;
+
+    private BigDecimal maxPackagePrice;
+
+    private LocalEquityPackagePage equityInfoVo;
+
+    private InsAreaCompanyEquity equity;
+
+
+
+}

+ 81 - 0
src/main/java/com/ydtech/modules/equity/model/vo/EquitySaveVo.java

@@ -0,0 +1,81 @@
+package com.ydtech.modules.equity.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ydtech.modules.equity.model.response.LocalEquityPackagePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@ApiModel(description = "权益包新增VO")
+@Data
+public class EquitySaveVo {
+
+    @NotBlank(message = "订单号不能为空")
+    @ApiModelProperty(value = "订单id")
+    private String companyId;
+
+    @NotNull(message = "选中权益包不能为空")
+    @ApiModelProperty(value = "权益包列表")
+    private LocalEquityPackagePage equityInfo;
+
+    /**
+     * 接收人类型0.投保人 1.被保人 2.车主
+     */
+    @NotNull(message = "接收人类型不能为空")
+    @ApiModelProperty(value = "接收人类型0.投保人 1.被保人 2.车主")
+    private Integer receiveType;
+
+    /**
+     * 接收人名字
+     */
+    @NotBlank(message = "接收人名字不能为空")
+    @ApiModelProperty(value = "接收人名字")
+    private String receiveName;
+
+    /**
+     * 接收人电话
+     */
+    @NotBlank(message = "接收人电话不能为空")
+    @ApiModelProperty(value = "接收人电话")
+    private String receivePhone;
+
+    /**
+     * 接收人身份证号
+     */
+    @ApiModelProperty(value = "接收人身份证号")
+    @NotBlank(message = "接收人身份证号不能为空")
+    private String receiveIdentify;
+
+    /**
+     * 返佣金额
+     */
+    @NotNull(message = "返佣金额不能为空")
+    @ApiModelProperty(value = "返佣金额")
+    private BigDecimal orderMoney;
+
+    @NotNull(message = "兑换积分不能为空")
+    @ApiModelProperty(value = "兑换积分")
+    private BigDecimal point;
+
+    @ApiModelProperty(value = "代客下单用户id")
+    private String orderUserId;
+
+    @ApiModelProperty(value = "代客下单用户名称")
+    private String orderUserName;
+
+    @ApiModelProperty(value = "代客下单类型 1.渠道 2.代理人 3.电销")
+    private Integer orderUserType;
+
+    @ApiModelProperty(value = "代客下单手机号")
+    private String orderUserPhone;
+
+    @ApiModelProperty(value = "代客下单身份证号")
+    private String orderUserIdcard;
+
+
+}

+ 70 - 0
src/main/java/com/ydtech/modules/equity/service/EquityService.java

@@ -0,0 +1,70 @@
+package com.ydtech.modules.equity.service;
+
+import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.equity.model.InsAreaCompanyEquity;
+import com.ydtech.modules.equity.model.vo.AddEquityPageQueryVo;
+import com.ydtech.modules.equity.model.vo.EquityPageQueryVo;
+import com.ydtech.modules.equity.model.vo.EquitySaveVo;
+
+public interface EquityService {
+
+    /**
+     * 权益包分页列表
+     * @param pageQueryVo
+     * @return
+     */
+    EquityPageQueryVo equityInfo(EquityPageQueryVo pageQueryVo);
+
+    /**
+     * 补录订单权益包分页列表
+     * @param pageQueryVo
+     * @return
+     */
+    EquityPageQueryVo addEquityInfo(AddEquityPageQueryVo pageQueryVo);
+
+    /**
+     * 保存选中的权益包
+     * @param equitySaveVo
+     */
+    void saveEquity(EquitySaveVo equitySaveVo);
+
+    /**
+     * 权益包下单
+     *
+     * @param companyId
+     */
+    InsAreaCompanyEquity createEquityOrder(String companyId);
+
+    /**
+     * 权益包确认下单
+     * @param companyId
+     */
+    void confirmEquityOrder(String companyId);
+
+    /**
+     * 放弃选中权益
+     * @param companyId
+     */
+    void delEquity(String companyId);
+
+    /**
+     * 保存权益类型
+     * @param companyId
+     * @param type
+     */
+    void saveEquityType(String companyId, Integer type);
+
+    /**
+     * 获取权益金额
+     * @param pageQueryVo
+     * @return
+     */
+    EquityPageQueryVo equityList(EquityPageQueryVo pageQueryVo);
+
+    /**
+     * 通过订单id获取信息
+     * @param companyId
+     * @return
+     */
+    InsAreaCompanyEquity queryEquityInfo(String companyId);
+}

+ 13 - 0
src/main/java/com/ydtech/modules/equity/service/InsAreaCompanyEquityService.java

@@ -0,0 +1,13 @@
+package com.ydtech.modules.equity.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ydtech.modules.equity.model.InsAreaCompanyEquity;
+
+/**
+* @author dongxin
+* @description 针对表【ins_area_company_equity(订单权益包下单表)】的数据库操作Service
+* @createDate 2025-05-07 18:24:28
+*/
+public interface InsAreaCompanyEquityService extends IService<InsAreaCompanyEquity> {
+
+}

+ 334 - 0
src/main/java/com/ydtech/modules/equity/service/impl/EquityServiceImpl.java

@@ -0,0 +1,334 @@
+package com.ydtech.modules.equity.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ydtech.core.page.PageResult;
+import com.ydtech.exception.SystemException;
+import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.admin.service.SysUserService;
+import com.ydtech.modules.equity.components.EquityApiConfigurationProperties;
+import com.ydtech.modules.equity.components.EquityRequestApiComponents;
+import com.ydtech.modules.equity.model.InsAreaCompanyEquity;
+import com.ydtech.modules.equity.model.request.*;
+import com.ydtech.modules.equity.model.response.LocalEquityPackagePage;
+import com.ydtech.modules.equity.model.response.PageResultResponse;
+import com.ydtech.modules.equity.model.response.PointRatioDto;
+import com.ydtech.modules.equity.model.vo.AddEquityPageQueryVo;
+import com.ydtech.modules.equity.model.vo.EquityPageQueryVo;
+import com.ydtech.modules.equity.model.vo.EquitySaveVo;
+import com.ydtech.modules.equity.service.EquityService;
+import com.ydtech.modules.equity.service.InsAreaCompanyEquityService;
+import com.ydtech.modules.order.constants.BusinessConstant;
+import com.ydtech.modules.order.entity.InsAreaCompany;
+import com.ydtech.modules.order.entity.InsOrders;
+import com.ydtech.modules.order.entity.vo.FeeOrderNewVo;
+import com.ydtech.modules.order.service.InsAreaCompanyService;
+import com.ydtech.modules.order.service.InsOrdersService;
+import com.ydtech.modules.protocols.entity.po.InsFeeOrderNew;
+import com.ydtech.modules.protocols.entity.po.PtlAgreementProductCostsNew;
+import com.ydtech.modules.protocols.service.InsFeeOrderNewService;
+import com.ydtech.modules.protocols.service.PtlAgreementProductCostsNewService;
+import com.ydtech.utils.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+@Service
+public class EquityServiceImpl implements EquityService {
+
+    @Autowired
+    private EquityRequestApiComponents equityRequestApiComponents;
+
+    @Autowired
+    private InsFeeOrderNewService insFeeOrderNewService;
+
+    @Autowired
+    private InsAreaCompanyService insAreaCompanyService;
+
+    @Autowired
+    private InsOrdersService insOrdersService;
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    @Autowired
+    private PtlAgreementProductCostsNewService agreementProductCostsNewService;
+
+    @Autowired
+    private InsAreaCompanyEquityService insAreaCompanyEquityService;
+
+    @Autowired
+    private EquityApiConfigurationProperties properties;
+
+    @Override
+    public EquityPageQueryVo equityList(EquityPageQueryVo pageQueryVo) {
+        // 通过订单号获取优惠信息
+        InsFeeOrderNew insFeeOrderNew = insFeeOrderNewService.getOne(new LambdaQueryWrapper<InsFeeOrderNew>()
+                .eq(InsFeeOrderNew::getInsOrderNo, pageQueryVo.getCompanyId()));
+        // 获取费用信息
+        LambdaQueryWrapper<PtlAgreementProductCostsNew> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(PtlAgreementProductCostsNew::getId, insFeeOrderNew.getCostsId());
+        PtlAgreementProductCostsNew agreementProductCostsNew = agreementProductCostsNewService.getOne(wrapper);
+        if(Objects.isNull(agreementProductCostsNew)){
+            throw new SystemException("费用信息异常!");
+        }
+        if(StringUtils.isBlank(agreementProductCostsNew.getLdProportion())){
+            throw new SystemException("先去设置代理人的留点比例!");
+        }
+
+        FeeOrderNewVo feeOrderNewVo = this.newConvertOrderFeeVoData(insFeeOrderNew,agreementProductCostsNew);
+        // 获取佣金
+        List<FeeOrderNewVo.ExportFee> feeList = feeOrderNewVo.getExportFee();
+        BigDecimal totalAmount = BigDecimal.valueOf(0);
+        for (FeeOrderNewVo.ExportFee fee : feeList) {
+            if(BusinessConstant.FEE_INSURANCE_TYPE_4.equals(fee.getInsuranceType())){
+                totalAmount = fee.getTotalAmount();
+            }
+        }
+        ThreeUserOrderListVo threeUserOrderListVo = new ThreeUserOrderListVo( properties.getAppkey(), totalAmount);
+        List<LocalEquityPackagePage> packagePageList = equityRequestApiComponents.equityList(threeUserOrderListVo);
+        Optional<LocalEquityPackagePage> oldestPackage = packagePageList.stream().max(Comparator.comparingDouble(p -> p.getTotalPackagePrice().doubleValue()));
+        pageQueryVo.setAmount(totalAmount);
+        oldestPackage.ifPresent(packages -> pageQueryVo.setMaxPackagePrice(packages.getTotalPackagePrice()));
+        return pageQueryVo;
+    }
+
+    @Override
+    public InsAreaCompanyEquity queryEquityInfo(String companyId) {
+        InsAreaCompanyEquity equity = insAreaCompanyEquityService.getById(companyId);
+        return equity;
+    }
+
+    @Override
+    public EquityPageQueryVo equityInfo(EquityPageQueryVo pageQueryVo) {
+
+        // 通过订单号获取优惠信息
+        InsFeeOrderNew insFeeOrderNew = insFeeOrderNewService.getOne(new LambdaQueryWrapper<InsFeeOrderNew>()
+                .eq(InsFeeOrderNew::getInsOrderNo, pageQueryVo.getCompanyId()));
+        // 获取费用信息
+        LambdaQueryWrapper<PtlAgreementProductCostsNew> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(PtlAgreementProductCostsNew::getId, insFeeOrderNew.getCostsId());
+        PtlAgreementProductCostsNew agreementProductCostsNew = agreementProductCostsNewService.getOne(wrapper);
+        if(Objects.isNull(agreementProductCostsNew)){
+            throw new SystemException("费用信息异常!");
+        }
+        if(StringUtils.isBlank(agreementProductCostsNew.getLdProportion())){
+            throw new SystemException("先去设置代理人的留点比例!");
+        }
+
+        FeeOrderNewVo feeOrderNewVo = this.newConvertOrderFeeVoData(insFeeOrderNew,agreementProductCostsNew);
+        // 获取佣金
+        List<FeeOrderNewVo.ExportFee> feeList = feeOrderNewVo.getExportFee();
+        BigDecimal totalAmount = BigDecimal.valueOf(0);
+        for (FeeOrderNewVo.ExportFee fee : feeList) {
+            if(BusinessConstant.FEE_INSURANCE_TYPE_4.equals(fee.getInsuranceType())){
+                totalAmount = fee.getTotalAmount();
+            }
+        }
+        int pageNum = pageQueryVo.getPageNum();
+        int pageSize = pageQueryVo.getPageSize();
+        PageResult pageResult = new PageResult();
+        ThreeRightsInfoPageVo threeRightsInfoPageVo = new ThreeRightsInfoPageVo(pageQueryVo, properties.getAppkey(), totalAmount);
+        PageResultResponse response = equityRequestApiComponents.equityPage(threeRightsInfoPageVo);
+        pageResult.setPageNum(pageNum);
+        pageResult.setPageSize(pageSize);
+        pageResult.setTotalSize(response.total);
+        pageResult.setContent(response.getRecords());
+        pageQueryVo.setPageResult(pageResult);
+        pageQueryVo.setFeeOrderNewVo(feeOrderNewVo);
+        // 获取积分兑换比例(接口获取)
+        ThreePointVo threePointVo = new ThreePointVo();
+        threePointVo.setThreeUserId(properties.getAppkey());
+        PointRatioDto pointRatioDto = equityRequestApiComponents.getPointRatio(threePointVo);
+        pageQueryVo.setPointProportion(new BigDecimal(pointRatioDto.getDenominator()));
+
+        // 获取权益包
+        InsAreaCompanyEquity equity = insAreaCompanyEquityService.getById(pageQueryVo.getCompanyId());
+        if(Objects.nonNull(equity)){
+            String equityInfo = equity.getEquityInfo();
+            LocalEquityPackagePage packagevo = JSON.parseObject(equityInfo, LocalEquityPackagePage.class);
+            pageQueryVo.setEquityInfoVo(packagevo);
+            pageQueryVo.setEquity(equity);
+        }
+        return pageQueryVo;
+    }
+
+    @Override
+    public EquityPageQueryVo addEquityInfo(AddEquityPageQueryVo pageQueryVo) {
+        EquityPageQueryVo pageQueryDto = new EquityPageQueryVo();
+        // 获取费用信息
+        LambdaQueryWrapper<PtlAgreementProductCostsNew> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(PtlAgreementProductCostsNew::getId, pageQueryVo.getCostsId());
+        PtlAgreementProductCostsNew agreementProductCostsNew = agreementProductCostsNewService.getOne(wrapper);
+        if(Objects.isNull(agreementProductCostsNew)){
+            throw new SystemException("费用信息异常!");
+        }
+        if(StringUtils.isBlank(agreementProductCostsNew.getLdProportion())){
+            throw new SystemException("先去设置代理人的留点比例!");
+        }
+        BigDecimal amount = pageQueryVo.getTotalAmount().subtract(pageQueryVo.getTotalAmount().multiply(new BigDecimal(agreementProductCostsNew.getLdProportion()).divide(new BigDecimal(100))));
+        int pageNum = pageQueryVo.getPageNum();
+        int pageSize = pageQueryVo.getPageSize();
+        PageResult pageResult = new PageResult();
+        ThreeRightsInfoPageVo threeRightsInfoPageVo = new ThreeRightsInfoPageVo(pageQueryVo, properties.getAppkey(), amount);
+        PageResultResponse response = equityRequestApiComponents.equityPage(threeRightsInfoPageVo);
+        pageResult.setPageNum(pageNum);
+        pageResult.setPageSize(pageSize);
+        pageResult.setTotalSize(response.total);
+        pageResult.setContent(response.getRecords());
+        pageQueryDto.setPageResult(pageResult);
+        // 获取积分兑换比例(接口获取)
+        ThreePointVo threePointVo = new ThreePointVo();
+        threePointVo.setThreeUserId(properties.getAppkey());
+        PointRatioDto pointRatioDto = equityRequestApiComponents.getPointRatio(threePointVo);
+        pageQueryDto.setPointProportion(new BigDecimal(pointRatioDto.getDenominator()));
+        pageQueryDto.setAmount(amount);
+        return pageQueryDto;
+    }
+
+    @Override
+    public void saveEquity(EquitySaveVo equitySaveVo) {
+
+        InsAreaCompanyEquity equity = insAreaCompanyEquityService.getById(equitySaveVo.getCompanyId());
+        if (Objects.isNull(equity)) {
+            equity = new InsAreaCompanyEquity();
+            equity.setType(1);
+        }
+        BeanUtils.copyProperties(equitySaveVo, equity);
+        equity.setSubOrderNo(equitySaveVo.getCompanyId());
+        equity.setStatus(0);
+        LocalEquityPackagePage packagevo = equitySaveVo.getEquityInfo();
+        equity.setEquityInfo(JSON.toJSONString(packagevo));
+        equity.setEquityId(packagevo.getId());
+        equity.setEquityName(packagevo.getEquityPackageName());
+        insAreaCompanyEquityService.saveOrUpdate(equity);
+    }
+
+    @Override
+    public InsAreaCompanyEquity createEquityOrder(String companyId) {
+        // 获取权益包
+        InsAreaCompanyEquity equity = insAreaCompanyEquityService.getById(companyId);
+        if(Objects.isNull(equity)){
+            throw new SystemException("客户权益未保存成功!");
+        }
+        InsAreaCompany insAreaCompany = insAreaCompanyService.getById(companyId);
+        InsOrders orders = insOrdersService.getById(insAreaCompany.getOrderno());
+        SysUser user = sysUserService.getByUserId(orders.getUserid());
+        if(Objects.isNull(equity)){return null;}
+        if(!equity.getStatus().equals(1)){
+            ThreeUserOrderVo threeUserOrderVo = new ThreeUserOrderVo(companyId, equity,properties.getAppkey(),user);
+            equityRequestApiComponents.createOrder(threeUserOrderVo);
+            equity.setStatus(1);
+            insAreaCompanyEquityService.updateById(equity);
+        }
+        return equity;
+    }
+
+    @Override
+    public void confirmEquityOrder(String companyId) {
+        // 获取权益包
+        InsAreaCompanyEquity equity = insAreaCompanyEquityService.getById(companyId);
+        if(Objects.isNull(equity) || !equity.getStatus().equals(1)){throw new SystemException("权益包订单异常");}
+        ThreeOrderVo threeOrderVo = new ThreeOrderVo(properties.getAppkey(), companyId);
+        equityRequestApiComponents.confirmOrder(threeOrderVo);
+        equity.setStatus(2);
+        insAreaCompanyEquityService.updateById(equity);
+    }
+
+    @Override
+    public void delEquity(String companyId) {
+        insAreaCompanyEquityService.removeById(companyId);
+    }
+
+    @Override
+    public void saveEquityType(String companyId, Integer type) {
+        InsAreaCompanyEquity equity = new InsAreaCompanyEquity();
+        equity.setSubOrderNo(companyId);
+        equity.setType(type);
+        insAreaCompanyEquityService.save(equity);
+    }
+
+
+    /**
+     * 计算费用
+     *
+     * @param insFeeOrderNew
+     * @param agreementProductCostsNew
+     * @return
+     */
+    private FeeOrderNewVo newConvertOrderFeeVoData(InsFeeOrderNew insFeeOrderNew, PtlAgreementProductCostsNew agreementProductCostsNew) {
+
+        FeeOrderNewVo feeOrderNewVo = new FeeOrderNewVo();
+        List<FeeOrderNewVo.ExportFee> exportFeeList = new ArrayList<>();
+        // 出口费用
+        // 交强
+        FeeOrderNewVo.ExportFee jqExportFee = this.assignExportFee(BusinessConstant.FEE_INSURANCE_TYPE_1,
+                insFeeOrderNew.getJqExportSuperviseCostsPremiums(), insFeeOrderNew.getJqExportOtherCostsPremiums(),
+                new BigDecimal(agreementProductCostsNew.getLdProportion())
+        );
+
+        //商业
+        FeeOrderNewVo.ExportFee syExportFee = this.assignExportFee(BusinessConstant.FEE_INSURANCE_TYPE_2,
+                insFeeOrderNew.getSyExportSuperviseCostsPremiums(), insFeeOrderNew.getSyExportOtherCostsPremiums(),
+                new BigDecimal(agreementProductCostsNew.getLdProportion())
+        );
+
+        //非车
+        FeeOrderNewVo.ExportFee noExportFee = this.assignExportFee(BusinessConstant.FEE_INSURANCE_TYPE_3,
+                insFeeOrderNew.getNoExportSuperviseCostsPremiums(), insFeeOrderNew.getNoExportOtherCostsPremiums(),
+                new BigDecimal(agreementProductCostsNew.getLdProportion()));
+
+        exportFeeList.add(jqExportFee);
+        exportFeeList.add(syExportFee);
+        exportFeeList.add(noExportFee);
+        //出口费用合计
+        FeeOrderNewVo.ExportFee exportFeeTotal = assignExportFeeTotal(exportFeeList);
+        exportFeeList.add(exportFeeTotal);
+
+        feeOrderNewVo.setExportFee(exportFeeList);
+        return feeOrderNewVo;
+
+    }
+
+    /**
+     * 费用合计
+     * @param exportFeeList
+     * @return
+     */
+    private FeeOrderNewVo.ExportFee assignExportFeeTotal(List<FeeOrderNewVo.ExportFee> exportFeeList) {
+        FeeOrderNewVo.ExportFee exportFee = new FeeOrderNewVo.ExportFee();
+        exportFee.setInsuranceType(BusinessConstant.FEE_INSURANCE_TYPE_4);
+        //总费用合计
+        BigDecimal totalAmount = exportFeeList.stream().map(FeeOrderNewVo.ExportFee::getTotalAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        exportFee.setTotalAmount(Optional.of(totalAmount).orElse(BigDecimal.ZERO));
+        return exportFee;
+    }
+
+    /**
+     * 费用计算
+     *
+     * @param title
+     * @param superviseCostsPremiums
+     * @param otherCostsPremiums
+     * @param ldProportion
+     * @return
+     */
+    public FeeOrderNewVo.ExportFee assignExportFee(String title,
+                                                   BigDecimal superviseCostsPremiums,
+                                                   BigDecimal otherCostsPremiums,
+                                                   BigDecimal ldProportion) {
+        FeeOrderNewVo.ExportFee exportFee = new FeeOrderNewVo.ExportFee();
+        exportFee.setInsuranceType(title);
+        //手续费
+        exportFee.setSuperviseCostsPremiums(superviseCostsPremiums);
+        //跟单费
+        exportFee.setOtherCostsPremiums(otherCostsPremiums);
+        //总费用
+        BigDecimal totalAmount = superviseCostsPremiums.add(otherCostsPremiums);
+        exportFee.setTotalAmount(totalAmount.subtract(totalAmount.multiply(ldProportion.divide(new BigDecimal(100)))));
+        return exportFee;
+    }
+}

+ 22 - 0
src/main/java/com/ydtech/modules/equity/service/impl/InsAreaCompanyEquityServiceImpl.java

@@ -0,0 +1,22 @@
+package com.ydtech.modules.equity.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ydtech.modules.equity.dao.InsAreaCompanyEquityMapper;
+import com.ydtech.modules.equity.model.InsAreaCompanyEquity;
+import com.ydtech.modules.equity.service.InsAreaCompanyEquityService;
+import org.springframework.stereotype.Service;
+
+/**
+* @author dongxin
+* @description 针对表【ins_area_company_equity(订单权益包下单表)】的数据库操作Service实现
+* @createDate 2025-05-07 18:24:28
+*/
+@Service
+public class InsAreaCompanyEquityServiceImpl extends ServiceImpl<InsAreaCompanyEquityMapper, InsAreaCompanyEquity>
+    implements InsAreaCompanyEquityService {
+
+}
+
+
+
+

+ 92 - 0
src/main/java/com/ydtech/modules/equity/utils/SMCheckDataUtils.java

@@ -0,0 +1,92 @@
+package com.ydtech.modules.equity.utils;
+
+import cn.hutool.core.util.HexUtil;
+import cn.hutool.crypto.SmUtil;
+import cn.hutool.crypto.asymmetric.SM2;
+import cn.hutool.crypto.symmetric.SM4;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2025/2/25 10:05
+ *  @Description: 国密算法
+ */
+public class SMCheckDataUtils {
+    public static void main(String[] args) {
+        String privateKeyHex = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgL4JFOA+0iymPbYi9ek5kHJ+BBjkdJV6GERmWnW1pAuugCgYIKoEcz1UBgi2hRANCAASfzrZzeAfaZR5nCLLA28F1sRdhUfyaQMbE+QlK62trsGH9F77GyeF7vFu4fx/BnZaCQQYA2cyBbPLXM1gL9aZV";
+        String publicKeyHex = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEn862c3gH2mUeZwiywNvBdbEXYVH8mkDGxPkJSutra7Bh/Re+xsnhe7xbuH8fwZ2WgkEGANnMgWzy1zNYC/WmVQ==";
+        String scret = "7eb6c2063bb2d2ce3bdacebc6ecad8df";
+//        User user =new User("1","张三");
+//        String userStr = JSON.toJSONString(user);
+        //加签
+//        String signStr =  sm2SignStr(userStr,privateKeyHex,publicKeyHex);
+//        //加密
+//        String dataStr = sm4EncryptStr(userStr,scret);
+//        System.out.println("sm2签名: " + signStr);
+//        System.out.println("sm4加密: " + dataStr);
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2025/2/25 9:53
+     *  @scret  秘钥
+     *  @plainText   待解密的字符串
+     *  @Description:  sm4 解密
+     */
+    public static String sm4DecryptStr(String plainText,String scret){
+        SM4 sm4 = SmUtil.sm4(HexUtil.decodeHex(scret));
+        String decryptedText = sm4.decryptStr(plainText);
+        System.out.println("解密后的文本: " + decryptedText);
+        return decryptedText;
+    }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2025/2/25 9:56
+     *   @scret 秘钥
+     *   @plainText 待加密的字符串
+     *  @Description:加密
+     */
+    public  static String sm4EncryptStr(String plainText,String scret){
+        SM4 sm4 = SmUtil.sm4(HexUtil.decodeHex(scret));
+        String encryptText = sm4.encryptHex(plainText);
+        System.out.println("加密后的文本: " + encryptText);
+        return encryptText;
+    }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2025/2/25 9:53
+     *  @privateKeyHex  私钥
+     *  @publicKeyHex  公钥
+     *  @plainText   待加签的字符串
+     *  @Description:  sm2 加签
+     */
+    public static String sm2SignStr(String plainText,String privateKeyHex,String publicKeyHex){
+        SM2 sm2 =  SmUtil.sm2(privateKeyHex,publicKeyHex);
+        //加签
+        String signStr = sm2.signHex(HexUtil.encodeHexStr(plainText));
+        System.out.println("加签后的文本: " + signStr);
+        return signStr;
+    }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2025/2/25 9:53
+     *  @privateKeyHex  私钥
+     *  @publicKeyHex  公钥
+     *  @plainText   待验签的字符串
+     *  @signature  签名
+     *  @Description:  sm2 加签
+     */
+    public static boolean sm2VerifyHexStr(String plainText, String signature, String privateKeyHex, String publicKeyHex){
+        SM2 sm2 =  SmUtil.sm2(privateKeyHex,publicKeyHex);
+        //验签
+        boolean flag = sm2.verifyHex(HexUtil.encodeHexStr(plainText), signature);
+        System.out.println("验证是否通过: " + flag);
+        return flag;
+    }
+}

+ 127 - 54
src/main/java/com/ydtech/modules/fee/dto/vo/RuleAttrMappingVo.java

@@ -1,13 +1,14 @@
 package com.ydtech.modules.fee.dto.vo;
 
 import com.ydtech.constants.enums.InsurKind;
+import com.ydtech.constants.enums.dict.ZmTransferType;
 import com.ydtech.constants.enums.dict.insurance.VehicleType;
 import com.ydtech.modules.ins.model.vo.CarInfoVo;
 import com.ydtech.modules.ins.model.vo.CustomerInfoVo;
 import com.ydtech.modules.ins.model.vo.KindInfoVo;
+import com.ydtech.modules.ins.model.vo.QuoteRespVo;
 import com.ydtech.modules.order.entity.InsAreaCompany;
 import com.ydtech.modules.order.entity.InsOrders;
-import com.ydtech.modules.order.entity.api.bohai.constants.VehicleUsage;
 import com.ydtech.modules.order.entity.api.dajia.constants.TypeVehicleMapping;
 import com.ydtech.modules.protocol.entity.po.PtlNewCarJudgeRules;
 import com.ydtech.modules.protocols.entity.po.PtlAgreementUndwrtRulesAttr;
@@ -22,6 +23,7 @@ import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.regex.Pattern;
 
 /**
@@ -42,7 +44,7 @@ public class RuleAttrMappingVo {
         this.value = value;
     }
 
-    public static List<RuleAttrMappingVo> getRuleAttrMappingVoList(InsAreaCompany insAreaCompany, InsOrders insOrders,
+    public static List<RuleAttrMappingVo> getRuleAttrMappingVoList(QuoteRespVo quoteRespVo, InsAreaCompany insAreaCompany, InsOrders insOrders,
                                                                    List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList,
                                                                    PtlNewCarJudgeRules carJudgeRule) {
         List<RuleAttrMappingVo> ruleAttrMappingVoList = new ArrayList<>();
@@ -79,7 +81,8 @@ public class RuleAttrMappingVo {
         LocalDate currentDate = LocalDate.now();
 
         //特种车判断
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("SpecialVehicle", Objects.nonNull(carInfo.getImportFlag()) && carInfo.getImportFlag().equals("特种车类") ? "1" : "0"));
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("SpecialVehicle", Objects.nonNull(carInfo.getImportFlag()) && carInfo.getImportFlag()
+                .equals("特种车类") ? "1" : "0"));
 
         //交强起保日期
         ruleAttrMappingVoList.add(new RuleAttrMappingVo("JqStartTime", insAreaCompany.getJqStartDate()));
@@ -87,6 +90,12 @@ public class RuleAttrMappingVo {
         //商业起保日期
         ruleAttrMappingVoList.add(new RuleAttrMappingVo("SyStartTime", insAreaCompany.getSyStartDate()));
 
+        // 中煤不浮动原因
+        if (Objects.nonNull(quoteRespVo)) {
+            String rateFloatFlag = ZmTransferType.getByCode(quoteRespVo.getRateFloatFlag());
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("RateFloatFlag", rateFloatFlag == null ? "null" : rateFloatFlag));
+        }
+
         boolean isNoLicenseFlag = false;
         if (carJudgeRule != null) {
             if (carJudgeRule.getUnitTypeCode().equals("天")) {
@@ -110,7 +119,6 @@ public class RuleAttrMappingVo {
         ruleAttrMappingVoList.add(new RuleAttrMappingVo("VehicleAge", String.valueOf(between)));
 
 
-
         //发证日期
         ruleAttrMappingVoList.add(new RuleAttrMappingVo("DateofIssuance", carInfo.getIssueDate()));
         //车长
@@ -121,17 +129,20 @@ public class RuleAttrMappingVo {
         ruleAttrMappingVoList.add(new RuleAttrMappingVo("SyRenewalOfInsurance", insAreaCompany.getSyRenewal()));
 
         CustomerInfoVo ownerInfo = insOrders.getOwnerinfo().toJavaObject(CustomerInfoVo.class);
-        if(StringUtils.isBlank(ownerInfo.getProperty()) || !"0".equals(ownerInfo.getProperty())) {
+        if (StringUtils.isBlank(ownerInfo.getProperty()) || !"0".equals(ownerInfo.getProperty())) {
             //车主 证件号码(前6位)
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersIDNumber", ownerInfo.getIdentifyNumber()));
             //车主 年龄
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersAge", ownerInfo.getAge()));
             //车主 性别
-            ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersSex", ownerInfo.getGender().equals("男") ? "1" : "2"));
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersSex", ownerInfo.getGender()
+                    .equals("男") ? "1" : "2"));
             //车主地址
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersAddress", ownerInfo.getAddr()));
             // 车主生日
-            String carOwnersBirthday = ownerInfo.getIdentifyNumber().substring(6,10) + "-" + ownerInfo.getIdentifyNumber().substring(10,12) + "-" + ownerInfo.getIdentifyNumber().substring(12,14);
+            String carOwnersBirthday = ownerInfo.getIdentifyNumber()
+                    .substring(6, 10) + "-" + ownerInfo.getIdentifyNumber()
+                    .substring(10, 12) + "-" + ownerInfo.getIdentifyNumber().substring(12, 14);
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersBirthday", carOwnersBirthday));
 
         }
@@ -139,81 +150,103 @@ public class RuleAttrMappingVo {
         ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnerName", ownerInfo.getName()));
 
         CustomerInfoVo policyHolderInfo = insOrders.getApplyinfo().toJavaObject(CustomerInfoVo.class);
-        if(StringUtils.isBlank(policyHolderInfo.getProperty()) || !"0".equals(policyHolderInfo.getProperty())) {
+        if (StringUtils.isBlank(policyHolderInfo.getProperty()) || !"0".equals(policyHolderInfo.getProperty())) {
             //投保人 证件号码(前6位)
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("ApplicantIDNumber", policyHolderInfo.getIdentifyNumber()));
             //投保人 年龄
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("ApplicantAge", policyHolderInfo.getAge()));
             //投保人 性别
-            ruleAttrMappingVoList.add(new RuleAttrMappingVo("ApplicantSex", policyHolderInfo.getGender().equals("男") ? "1" : "2"));
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("ApplicantSex", policyHolderInfo.getGender()
+                    .equals("男") ? "1" : "2"));
             //投保人地址
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("ApplicantAddress", policyHolderInfo.getAddr()));
             // 投保人生日
-            String applicantBirthday = policyHolderInfo.getIdentifyNumber().substring(6,10) + "-" + policyHolderInfo.getIdentifyNumber().substring(10,12) + "-" + policyHolderInfo.getIdentifyNumber().substring(12,14);
+            String applicantBirthday = policyHolderInfo.getIdentifyNumber()
+                    .substring(6, 10) + "-" + policyHolderInfo.getIdentifyNumber()
+                    .substring(10, 12) + "-" + policyHolderInfo.getIdentifyNumber().substring(12, 14);
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("ApplicantBirthday", applicantBirthday));
         }
 
         CustomerInfoVo insuredPersonInfo = insOrders.getInsureinfo().toJavaObject(CustomerInfoVo.class);
-        if(StringUtils.isBlank(insuredPersonInfo.getProperty()) || !"0".equals(insuredPersonInfo.getProperty())) {
+        if (StringUtils.isBlank(insuredPersonInfo.getProperty()) || !"0".equals(insuredPersonInfo.getProperty())) {
             //被保人 证件号码(前6位)
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredIDNumber", insuredPersonInfo.getIdentifyNumber()));
             //被保人 年龄
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredAge", insuredPersonInfo.getAge()));
             //被保人 性别
-            ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredSex", insuredPersonInfo.getGender().equals("男") ? "1" : "2"));
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredSex", insuredPersonInfo.getGender()
+                    .equals("男") ? "1" : "2"));
             //被保人地址
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredAddress", insuredPersonInfo.getAddr()));
             //被保人生日
-            String insuredBirthday = insuredPersonInfo.getIdentifyNumber().substring(6,10) + "-" + insuredPersonInfo.getIdentifyNumber().substring(10,12) + "-" + insuredPersonInfo.getIdentifyNumber().substring(12,14);
+            String insuredBirthday = insuredPersonInfo.getIdentifyNumber()
+                    .substring(6, 10) + "-" + insuredPersonInfo.getIdentifyNumber()
+                    .substring(10, 12) + "-" + insuredPersonInfo.getIdentifyNumber().substring(12, 14);
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredBirthday", insuredBirthday));
         }
         String OPIConsistent = "0";
-        if(StringUtils.isNotBlank(ownerInfo.getProperty())){
-            boolean boo = ownerInfo.getProperty().equals(insuredPersonInfo.getProperty()) && insuredPersonInfo.getProperty().equals(policyHolderInfo.getProperty());
-            if(boo){
-                if("0".equals(ownerInfo.getProperty())){
-                    if((ownerInfo.getName().equals(insuredPersonInfo.getName()) && insuredPersonInfo.getName().equals(policyHolderInfo.getName())) &&
-                            (ownerInfo.getOrganizationCode().equals(insuredPersonInfo.getOrganizationCode()) && insuredPersonInfo.getOrganizationCode().equals(policyHolderInfo.getOrganizationCode()))){
+        if (StringUtils.isNotBlank(ownerInfo.getProperty())) {
+            boolean boo = ownerInfo.getProperty()
+                    .equals(insuredPersonInfo.getProperty()) && insuredPersonInfo.getProperty()
+                    .equals(policyHolderInfo.getProperty());
+            if (boo) {
+                if ("0".equals(ownerInfo.getProperty())) {
+                    if ((ownerInfo.getName().equals(insuredPersonInfo.getName()) && insuredPersonInfo.getName()
+                            .equals(policyHolderInfo.getName())) &&
+                            (ownerInfo.getOrganizationCode()
+                                    .equals(insuredPersonInfo.getOrganizationCode()) && insuredPersonInfo.getOrganizationCode()
+                                    .equals(policyHolderInfo.getOrganizationCode()))) {
                         OPIConsistent = "1";
                     }
-                }else{
-                    if((ownerInfo.getName().equals(insuredPersonInfo.getName()) && insuredPersonInfo.getName().equals(policyHolderInfo.getName())) &&
-                            (ownerInfo.getIdentifyNumber().equals(insuredPersonInfo.getIdentifyNumber()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber()))){
+                } else {
+                    if ((ownerInfo.getName().equals(insuredPersonInfo.getName()) && insuredPersonInfo.getName()
+                            .equals(policyHolderInfo.getName())) &&
+                            (ownerInfo.getIdentifyNumber()
+                                    .equals(insuredPersonInfo.getIdentifyNumber()) && insuredPersonInfo.getIdentifyNumber()
+                                    .equals(policyHolderInfo.getIdentifyNumber()))) {
                         OPIConsistent = "1";
                     }
                 }
             }
-        }else {
-            if ((ownerInfo.getName().equals(insuredPersonInfo.getName()) && insuredPersonInfo.getName().equals(policyHolderInfo.getName())) &&
-                    (ownerInfo.getIdentifyNumber().equals(insuredPersonInfo.getIdentifyNumber()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber()))) {
+        } else {
+            if ((ownerInfo.getName().equals(insuredPersonInfo.getName()) && insuredPersonInfo.getName()
+                    .equals(policyHolderInfo.getName())) &&
+                    (ownerInfo.getIdentifyNumber()
+                            .equals(insuredPersonInfo.getIdentifyNumber()) && insuredPersonInfo.getIdentifyNumber()
+                            .equals(policyHolderInfo.getIdentifyNumber()))) {
                 OPIConsistent = "1";
             }
         }
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("OPIConsistent",OPIConsistent));
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("OPIConsistent", OPIConsistent));
         String PIConsistent = "0";
 
-        if(StringUtils.isNotBlank(insuredPersonInfo.getProperty())){
+        if (StringUtils.isNotBlank(insuredPersonInfo.getProperty())) {
             boolean boo = insuredPersonInfo.getProperty().equals(policyHolderInfo.getProperty());
-            if(boo){
-                if("0".equals(insuredPersonInfo.getProperty())){
+            if (boo) {
+                if ("0".equals(insuredPersonInfo.getProperty())) {
                     //投被保人是否一致
-                    if(insuredPersonInfo.getName().equals(policyHolderInfo.getName()) && insuredPersonInfo.getOrganizationCode().equals(policyHolderInfo.getOrganizationCode())){
+                    if (insuredPersonInfo.getName()
+                            .equals(policyHolderInfo.getName()) && insuredPersonInfo.getOrganizationCode()
+                            .equals(policyHolderInfo.getOrganizationCode())) {
                         PIConsistent = "1";
                     }
-                }else{
+                } else {
                     //投被保人是否一致
-                    if(insuredPersonInfo.getName().equals(policyHolderInfo.getName()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber())){
+                    if (insuredPersonInfo.getName()
+                            .equals(policyHolderInfo.getName()) && insuredPersonInfo.getIdentifyNumber()
+                            .equals(policyHolderInfo.getIdentifyNumber())) {
                         PIConsistent = "1";
                     }
                 }
             }
-        }else{
+        } else {
             //投被保人是否一致
-            if(insuredPersonInfo.getName().equals(policyHolderInfo.getName()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber())){
+            if (insuredPersonInfo.getName().equals(policyHolderInfo.getName()) && insuredPersonInfo.getIdentifyNumber()
+                    .equals(policyHolderInfo.getIdentifyNumber())) {
                 PIConsistent = "1";
             }
-       }
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("PIConsistent",PIConsistent));
+        }
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("PIConsistent", PIConsistent));
 
         //2024-06-20 起保日期 月份判断
         if (insAreaCompany.getJqStartDate() != null && !insAreaCompany.getJqStartDate().equals("")) {
@@ -229,69 +262,86 @@ public class RuleAttrMappingVo {
         //险别信息
         kindInfoVos.forEach(kindInfoVo -> {
             //机动车损失险
-            if (InsurKind.A.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.A.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("MotorVehicleDamageInsurance", String.valueOf(kindInfoVo.getAmount())));
+            }
             //第三者责任险
-            if (InsurKind.B.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.B.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("ThirdPartyLiabilityInsurance",
                         String.valueOf(Double.valueOf(kindInfoVo.getAmount()).intValue())));
+            }
             //司机责任险
-            if (InsurKind.D3.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.D3.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("DriverLiabilityInsurance", String.valueOf(kindInfoVo.getAmount())));
+            }
             //乘客责任险
-            if (InsurKind.D4.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.D4.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("PassengerLiabilityInsurance", String.valueOf(kindInfoVo.getUnitAmount())));
+            }
             //车身划痕险
-            if (InsurKind.L.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.L.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarScratchInsurance", String.valueOf(kindInfoVo.getAmount())));
+            }
             //绝对免赔率特约险(车损)
-            if (InsurKind.MJ1.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.MJ1.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("VehicleDamageAbsoluteDeductibleSpecialInsurance",
                         String.valueOf(kindInfoVo.getAmount())));
+            }
             //绝对免赔率特约险(三者)
-            if (InsurKind.MJ2.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.MJ2.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("ThirdAbsoluteDeductibleSpecialInsurance",
                         String.valueOf(kindInfoVo.getAmount())));
+            }
             //绝对免赔率特约险(司机)
-            if (InsurKind.MJ3.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.MJ3.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("DriverAbsoluteDeductibleSpecialInsurance",
                         String.valueOf(kindInfoVo.getAmount())));
+            }
             //绝对免赔率特约险(乘客)
-            if (InsurKind.MJ4.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.MJ4.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("PassengerAbsoluteDeductibleSpecialInsurance",
                         String.valueOf(kindInfoVo.getAmount())));
+            }
             //附加医保-三者
-            if (InsurKind.SY_FJ_YBW1.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.SY_FJ_YBW1.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("ThirdPartyAdditionalMedicalInsurance",
                         String.valueOf(kindInfoVo.getAmount())));
+            }
             //附加医保-座位险(乘客)
-            if (InsurKind.SY_FJ_YBW2.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.SY_FJ_YBW2.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("PassengerAdditionalMedicalInsurance",
                         String.valueOf(kindInfoVo.getAmount())));
+            }
             //附加医保-座位险(司机)
-            if (InsurKind.SY_FJ_YBW3.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.SY_FJ_YBW3.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("DriverAdditionalMedicalInsurance",
                         String.valueOf(kindInfoVo.getAmount())));
+            }
             //法定节假日限额翻倍险
-            if (InsurKind.BD.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.BD.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("LegalHolidayLimitDoublingInsurance",
                         String.valueOf(kindInfoVo.getAmount())));
+            }
             //道路救援服务特约条款
-            if (InsurKind.TY1.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.TY1.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("RoadsideAssistanceServiceSpecialClause",
                         String.valueOf(kindInfoVo.getServiceTimes())));
+            }
             //车辆安全检测特约条款
-            if (InsurKind.TY2.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.TY2.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("VehicleSafetyInspectionSpecialClause",
                         String.valueOf(kindInfoVo.getServiceTimes())));
+            }
             //代为驾驶服务特约条款
-            if (InsurKind.TY3.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.TY3.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("SubstituteDrivingServiceSpecialClause",
                         String.valueOf(kindInfoVo.getServiceTimes())));
+            }
             //代为送检服务特约条款
-            if (InsurKind.TY4.getCode().equals(kindInfoVo.getKindCode()))
+            if (InsurKind.TY4.getCode().equals(kindInfoVo.getKindCode())) {
                 ruleAttrMappingVoList.add(new RuleAttrMappingVo("SubstituteInspectionServiceSpecialClause",
                         String.valueOf(kindInfoVo.getServiceTimes())));
+            }
         });
 
         //交强保费
@@ -307,6 +357,28 @@ public class RuleAttrMappingVo {
         ruleAttrMappingVoList.add(new RuleAttrMappingVo("CompulsoryInsuranceDiscount", String.valueOf(insAreaCompany.getJqAdjustRate())));
         //商业折扣
         ruleAttrMappingVoList.add(new RuleAttrMappingVo("CommercialDiscount", String.valueOf(insAreaCompany.getSyAdjustRate())));
+
+        //永安评分
+        Optional.ofNullable(quoteRespVo)
+                .map(quoteRespVo1 -> quoteRespVo.getYaScore())
+                .ifPresent(x -> {
+                    ruleAttrMappingVoList.add(new RuleAttrMappingVo("YaScore", x));
+                });
+
+        //永安交强费用浮动
+        Optional.ofNullable(quoteRespVo)
+                .map(quoteRespVo1 -> quoteRespVo.getCifeeFloat())
+                .ifPresent(x -> {
+                    ruleAttrMappingVoList.add(new RuleAttrMappingVo("CifeeFloat", x));
+                });
+
+        //永安商业费用浮动
+        Optional.ofNullable(quoteRespVo)
+                .map(quoteRespVo1 -> quoteRespVo.getBifeeFloat())
+                .ifPresent(x -> {
+                    ruleAttrMappingVoList.add(new RuleAttrMappingVo("BifeeFloat", x));
+                });
+
         //数值型总评分
         Pattern pattern = Pattern.compile("[0-9]*");
         if (insAreaCompany.getScore() != null) {
@@ -351,7 +423,8 @@ public class RuleAttrMappingVo {
         ruleAttrMappingVoList.add(new RuleAttrMappingVo("GreenYellowAndRedAreas", insAreaCompany.getTpColorScore()));
         if (insAreaCompany.getAccidentalDriving() != null) {
             //非车名称
-            ruleAttrMappingVoList.add(new RuleAttrMappingVo("NonCarName", insAreaCompany.getAccidentalDriving().getRideRiskName()));
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("NonCarName", insAreaCompany.getAccidentalDriving()
+                    .getRideRiskName()));
             //非车份数
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("NonCarQuantity",
                     String.valueOf(insAreaCompany.getAccidentalDriving().getQuantity())));

+ 3 - 2
src/main/java/com/ydtech/modules/fee/service/FeeRuleSchemeNewService.java

@@ -3,6 +3,7 @@ package com.ydtech.modules.fee.service;
 
 import com.ydtech.modules.fee.dto.vo.ReCalcuLateProportion;
 import com.ydtech.modules.fee.dto.vo.RetailProportion;
+import com.ydtech.modules.ins.model.vo.QuoteRespVo;
 import com.ydtech.modules.order.entity.InsAreaCompany;
 import com.ydtech.modules.order.entity.InsOrders;
 import com.ydtech.modules.order.entity.vo.ExternalOrderFeeVo;
@@ -56,7 +57,7 @@ public interface FeeRuleSchemeNewService {
      * @param insAreaCompany
      * @param insOrders
      */
-    void verificationCostFactor(InsAreaCompany insAreaCompany, InsOrders insOrders, StringBuilder logs);
+    void verificationCostFactor(QuoteRespVo quoteRespVo, InsAreaCompany insAreaCompany, InsOrders insOrders, StringBuilder logs, boolean isInternalAgreement);
 
     /**
      * 查找匹配承保规则的因子
@@ -95,7 +96,7 @@ public interface FeeRuleSchemeNewService {
      *
      * @param costsId
      */
-    void calcCosts(String costsId, InsAreaCompany insAreaCompany);
+    void calcCosts(String costsId, InsAreaCompany insAreaCompany, boolean isInternalAgreement);
 
 
     void calcCostsTest(String costsId, InsAreaCompany insAreaCompany);

+ 29 - 16
src/main/java/com/ydtech/modules/fee/service/impl/FeeRuleSchemeServiceNewImpl.java

@@ -24,6 +24,7 @@ import com.ydtech.modules.fee.service.FeeRuleSchemeNewService;
 import com.ydtech.modules.fee.service.FeeRuleSchemeService;
 import com.ydtech.modules.fee.service.InsFeeOrderConfigService;
 import com.ydtech.modules.fee.service.InsFeeOrderNewHistoryService;
+import com.ydtech.modules.ins.model.vo.QuoteRespVo;
 import com.ydtech.modules.order.entity.InsAreaCompany;
 import com.ydtech.modules.order.entity.InsOrders;
 import com.ydtech.modules.order.entity.api.dajia.constants.TypeVehicleMapping;
@@ -47,6 +48,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.math.RoundingMode;
 import java.text.DateFormat;
 import java.time.LocalDate;
@@ -137,7 +139,7 @@ public class FeeRuleSchemeServiceNewImpl implements FeeRuleSchemeNewService {
      * 校验费用因子
      */
     @Override
-    public void verificationCostFactor(InsAreaCompany insAreaCompany, InsOrders insOrders, StringBuilder logs) {
+    public void verificationCostFactor(QuoteRespVo quoteRespVo, InsAreaCompany insAreaCompany, InsOrders insOrders, StringBuilder logs, boolean isInternalAgreement) {
 
         List<AgreementProductCosts> agreementProductCostsNoMatched =
                 ptlAgreementProductCostsNewService.costsGetList(insAreaCompany.getAgreementId(), insAreaCompany.getProductid());
@@ -157,7 +159,7 @@ public class FeeRuleSchemeServiceNewImpl implements FeeRuleSchemeNewService {
                     }
                 }
 
-                //使用性质 营业  非营业
+                //使用性质 营业 非营业
                 if(attr.getAttrCode().equals("NatureOfUse")){
                     String[] split = attr.getMin().split(",");
                     boolean isPipei = false;
@@ -195,9 +197,9 @@ public class FeeRuleSchemeServiceNewImpl implements FeeRuleSchemeNewService {
             //按优先级进行排序
             Collections.sort(agreementProductCosts, Comparator.comparingInt(AgreementProductCosts::getPriorityLevel));
             //遍历费用因子
-            String costsId = verificationCosts(agreementProductCosts, insAreaCompany, insOrders, logs);
+            String costsId = verificationCosts(agreementProductCosts, quoteRespVo, insAreaCompany, insOrders, logs);
             if (costsId != null) {
-                calcCosts(costsId, insAreaCompany);
+                calcCosts(costsId, insAreaCompany, isInternalAgreement);
                 log.debug("费用因子校验通过,子订单id:" + insAreaCompany.getId() + ",费用id:" + costsId);
             }
         } else {
@@ -334,7 +336,7 @@ public class FeeRuleSchemeServiceNewImpl implements FeeRuleSchemeNewService {
      * @param insAreaCompany
      */
     @Override
-    public void calcCosts(String costsId, InsAreaCompany insAreaCompany) {
+    public void calcCosts(String costsId, InsAreaCompany insAreaCompany, boolean isInternalAgreement) {
         //获取协议信息
         PtlAgreement ptlAgreement = ptlAgreementService.getById(insAreaCompany.getAgreementId());
         InsOrders insOrders = insOrdersService.getById(insAreaCompany.getOrderno());
@@ -467,8 +469,13 @@ public class FeeRuleSchemeServiceNewImpl implements FeeRuleSchemeNewService {
                 .add(retailProportion.getNoRetailLevel2Proportion())
                 .add(retailProportion.getNoRetailLevel3Proportion());
 
-        // 外部订单比例
-        BigDecimal enterProportion = sysSwitchConfigService.getEnterProportion(insOrders.getDeptid(), insOrders.getEntryStatus());
+        BigDecimal enterProportion = new BigDecimal(BigInteger.ZERO);
+        
+        // 待客录单订单比例 根据前端传值 判断是否使用待客录单比例
+        if(!isInternalAgreement){
+            enterProportion = sysSwitchConfigService.getEnterProportion(insOrders.getDeptid(), insOrders.getEntryStatus());
+        }
+        
 
         //重新计算比例  入口是否超出支付的比例
         ReCalcuLateProportion jqReCalcuLateProportion = recalculateProportion(
@@ -2786,15 +2793,15 @@ public class FeeRuleSchemeServiceNewImpl implements FeeRuleSchemeNewService {
      * @param insOrders
      * @return
      */
-    private String verificationCosts(List<AgreementProductCosts> agreementProductCosts, InsAreaCompany insAreaCompany,
+    private String verificationCosts(List<AgreementProductCosts> agreementProductCosts, QuoteRespVo quoteRespVo, InsAreaCompany insAreaCompany,
                                      InsOrders insOrders, StringBuilder logs) {
         //匹配费用因子
         //获取所有费用属性
         List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList = ptlAgreementUndwrtRulesAttrService.getUndwrtRulesAttrList();
         //获取新旧车信息
-        PtlNewCarJudgeRules carJudgeRule = getCarJudgeRule(insAreaCompany.getCompanyId());
+        PtlNewCarJudgeRules carJudgeRule = getCarJudgeRule(insAreaCompany.getCompanyId(), insOrders.getCarinfo().getString("cimodelclass"));
         //获取所有费用属性关联
-        List<RuleAttrMappingVo> ruleAttrMappingVoList = RuleAttrMappingVo.getRuleAttrMappingVoList(insAreaCompany, insOrders,
+        List<RuleAttrMappingVo> ruleAttrMappingVoList = RuleAttrMappingVo.getRuleAttrMappingVoList(quoteRespVo, insAreaCompany, insOrders,
                 undwrtRulesAttrList, carJudgeRule);
 
         for (int i = 0; i < agreementProductCosts.size(); i++) {
@@ -2824,8 +2831,8 @@ public class FeeRuleSchemeServiceNewImpl implements FeeRuleSchemeNewService {
         //获取所有承保规则属性
         List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList = ptlAgreementUndwrtRulesAttrService.getUndwrtRulesAttrList();
         //获取所有费用属性关联
-        List<RuleAttrMappingVo> ruleAttrMappingVoList = RuleAttrMappingVo.getRuleAttrMappingVoList(insAreaCompany, insOrders,
-                undwrtRulesAttrList, getCarJudgeRule(insAreaCompany.getCompanyId()));
+        List<RuleAttrMappingVo> ruleAttrMappingVoList = RuleAttrMappingVo.getRuleAttrMappingVoList(null,insAreaCompany, insOrders,
+                undwrtRulesAttrList, getCarJudgeRule(insAreaCompany.getCompanyId(),insOrders.getCarinfo().getString("cimodelclass")));
 
 
         for (int i = 0; i < ptlAgreementUndwrtRulesNews.size(); i++) {
@@ -3282,7 +3289,12 @@ public class FeeRuleSchemeServiceNewImpl implements FeeRuleSchemeNewService {
      * @return
      */
     private boolean selectEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink, String value) {
-        if (ptlAgreementProductCostsAttrLink.getMin() != null && ptlAgreementProductCostsAttrLink.getMin().contains(value)) {
+        // 包含情况
+        if (ptlAgreementProductCostsAttrLink.getMin() != null && ptlAgreementProductCostsAttrLink.getMin().contains(value) && ptlAgreementProductCostsAttrLink.getOperator().equals("0")) {
+            return true;
+        }
+        // 不包含的情况
+        if (ptlAgreementProductCostsAttrLink.getMin()!= null && !ptlAgreementProductCostsAttrLink.getMin().contains(value) && ptlAgreementProductCostsAttrLink.getOperator().equals("1")) {
             return true;
         }
         return false;
@@ -3518,11 +3530,12 @@ public class FeeRuleSchemeServiceNewImpl implements FeeRuleSchemeNewService {
      * @param companyId
      * @return
      */
-    private PtlNewCarJudgeRules getCarJudgeRule(String companyId) {
+    private PtlNewCarJudgeRules getCarJudgeRule(String companyId, String vehicleType) {
         //获取车辆新旧车信息
         List<PtlNewCarJudgeRules> list =
-                ptlNewCarJudgeRulesService.list(new LambdaQueryWrapper<PtlNewCarJudgeRules>().eq(PtlNewCarJudgeRules::getCompanyId,
-                        companyId));
+                ptlNewCarJudgeRulesService.list(new LambdaQueryWrapper<PtlNewCarJudgeRules>()
+                        .eq(PtlNewCarJudgeRules::getCompanyId,companyId)
+                        .eq(PtlNewCarJudgeRules::getVehicleType,vehicleType));
         if (list.size() > 0) {
             return list.get(0);
         }

+ 7 - 0
src/main/java/com/ydtech/modules/fnc/service/impl/InsFeeAuditServiceImpl.java

@@ -196,6 +196,8 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
 
             //生成机构费用
             gene_deptfee(order, insFeeOrderNew, insAreaCompany);
+
+
             //结算费用生成
             insPlyIncomeService.saveBalanceNew(order, insFeeOrderNew, insAreaCompany, user.getLeaderId(), user.getLeaderName());
 
@@ -248,6 +250,10 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
                     sysUserAccount.setDocumentaryStatus("2");  // 收入
                     sysUserAccount.setSuborderId(insAreaCompany.getId());  // 订单Id
                     sysUserAccountService.addOrUpdate(sysUserAccount);
+
+
+
+
                     if (insFeeOrderNew.getDistributionStatus() != null) {
                         createInsFeeOrderNewDistribution(insFeeOrderNew, insAreaCompany, order, order.getUserid(), BigDecimal.ZERO, BigDecimal.ZERO, "0");
                         if (insFeeOrderNew.getFirstLevelUserId() != null) {
@@ -433,6 +439,7 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
             // 审核完成之后 清空锁
             redisTemplate.delete("FEE_AUDIT:"+insOrderNo);
         } catch (Exception e) {
+            e.printStackTrace();
             throw new SystemException("当前业务繁忙,请稍后重试");
         } finally {
             //释放锁

+ 29 - 8
src/main/java/com/ydtech/modules/fnc/service/impl/InsPlyIncomeServiceImpl.java

@@ -538,9 +538,17 @@ public class InsPlyIncomeServiceImpl extends ServiceImpl<InsPlyIncomeMapper, Ins
         insPlyIncome.setNoNoTaxPremium(insFeeOrderNew.getNoNoTaxPremium());
         insPlyIncome.setUserId(insFeeOrderNew.getUserId());
         insPlyIncome.setJqStartDate(StringOperations.emptyStringToNull(insAreaCompany.getJqStartDate()));
-        insPlyIncome.setJqEndDate(StringOperations.emptyStringToNull(insAreaCompany.getJqEndDate()));
+        insPlyIncome.setJqEndDate(
+                StringOperations.emptyStringToNull(
+                        fixDateTime(insAreaCompany.getJqEndDate())
+                )
+        );
         insPlyIncome.setSyStartDate(StringOperations.emptyStringToNull(insAreaCompany.getSyStartDate()));
-        insPlyIncome.setSyEndDate(StringOperations.emptyStringToNull(insAreaCompany.getSyEndDate()));
+        insPlyIncome.setSyEndDate(
+                StringOperations.emptyStringToNull(
+                        fixDateTime(insAreaCompany.getSyEndDate())
+                )
+        );
         insPlyIncome.setLeaderId(leaderId);
         insPlyIncome.setLeaderName(leaderName);
         this.getDeptId(insPlyIncome);
@@ -560,6 +568,19 @@ public class InsPlyIncomeServiceImpl extends ServiceImpl<InsPlyIncomeMapper, Ins
 
     }
 
+    public static String fixDateTime(String dateTimeStr) {
+        if (dateTimeStr == null || !dateTimeStr.endsWith("24:00:00")) {
+            return dateTimeStr;
+        }
+        try {
+            String[] parts = dateTimeStr.split(" ");
+            LocalDate date = LocalDate.parse(parts[0]);
+            return date.plusDays(1).toString() + " 00:00:00";
+        } catch (Exception e) {
+            return dateTimeStr; // 异常就原样返回
+        }
+    }
+
     private void getDeptId(InsPlyIncome insPlyIncome) {
         PtlAgreement ptlAgreement = ptlAgreementService.getById(insPlyIncome.getAgreementId());
         String deptId = ptlAgreement.getDeptId();
@@ -2269,12 +2290,12 @@ public class InsPlyIncomeServiceImpl extends ServiceImpl<InsPlyIncomeMapper, Ins
             }
             List<SettlementDocumentaryFeesEntity> settleInsPlyIncomes = settlementDocumentaryFeesService.queryAmount(params);  //金额总数
             for (SettlementDocumentaryFeesEntity settleInsPlyIncome : settleInsPlyIncomes) {
-                BigDecimal settleIcommissionFeevalue = settleInsPlyIncome.getSettlementAmount();// 已结算金额
-                readyCommissionFeevalue = readyCommissionFeevalue.add(settleIcommissionFeevalue);  //已结算总
-
-                BigDecimal divide = new BigDecimal(100).subtract(settleInsPlyIncome.getTaxPoints()).divide(new BigDecimal(100));
-                expendAmount = expendAmount.add(settleInsPlyIncome.getSettlementAmount().multiply(divide));
-
+                if(ObjectUtils.isNotEmpty(settleInsPlyIncome)){
+                    BigDecimal settleIcommissionFeevalue = settleInsPlyIncome.getSettlementAmount().compareTo(BigDecimal.ZERO) > 0 ? settleInsPlyIncome.getSettlementAmount() : BigDecimal.ZERO;// 已结算金额
+                    readyCommissionFeevalue = readyCommissionFeevalue.add(settleIcommissionFeevalue);  //已结算总
+                    BigDecimal divide = new BigDecimal(100).subtract(settleInsPlyIncome.getTaxPoints()).divide(new BigDecimal(100));
+                    expendAmount = expendAmount.add(settleInsPlyIncome.getSettlementAmount().multiply(divide));
+                }
             }
             params.put("settlementStatus", 0);  //未开票金额
             List<SettlementDocumentaryFeesEntity> noInvoicInsPlyIncomes = settlementDocumentaryFeesService.queryNew(params);  //金额总数

+ 15 - 0
src/main/java/com/ydtech/modules/ins/model/vo/QuoteRespVo.java

@@ -226,6 +226,21 @@ public class QuoteRespVo {
     @TableField(value = "syappoint")
     private String syappoint;
 
+    @ApiModelProperty("中煤浮动")
+    private String rateFloatFlag;
+
+    @ApiModelProperty("永安评分")
+    private String yaScore;
+
+    @ApiModelProperty("永安交强费用浮动")
+    private String cifeeFloat;
+
+    @ApiModelProperty("永安商业费用浮动")
+    private String bifeeFloat;
+
+    @ApiModelProperty("人保商业折扣")
+    private String preDiscount;
+
     @ApiModelProperty("报价记录")
     private List<SysQuoteRecord> quoteRecords;
 

+ 8 - 1
src/main/java/com/ydtech/modules/ins/model/yc/YcBuildData.java

@@ -68,7 +68,14 @@ public class YcBuildData {
         rd.getCvrgListSY().getCvrgSY().forEach(a -> {
 
             String kindcode = a.getCCvrgNo();
-            int i = ArrayUtil.indexOf(InsuranceTypeCorrespondence.getYongchengConnectInsuranceType(), kindcode);
+            int i = -1;
+            // 燃油
+            if(rd.getVhl().getFuelType().equals("32773001")){
+                i = ArrayUtil.indexOf(InsuranceTypeCorrespondence.getYongchengConnectInsuranceType(), kindcode);
+            }else{
+                // 新能源
+                i = ArrayUtil.indexOf(InsuranceTypeCorrespondence.getYongchengConnectInsuranceTypeNewEmergy(), kindcode);
+            }
             InsurKind insurKind = Enum.valueOf(InsurKind.class, InsuranceTypeCorrespondence.getJinZhangGuiType()[i]);
 
             double premium = StringUtils.parseDouble(a.getNPrm());

+ 19 - 5
src/main/java/com/ydtech/modules/ins/model/yc/ruote/Vhl.java

@@ -8,6 +8,7 @@ import com.ydtech.utils.StringUtils;
 import lombok.Data;
 import org.apache.http.client.utils.DateUtils;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.Date;
 
@@ -122,11 +123,12 @@ public class Vhl {
      */
     @JacksonXmlProperty(localName = "CRegVhlTyp")
     private String CRegVhlTyp;
-//    /**
-//     * 吨位
-//     */
-//    @JacksonXmlProperty(localName = "NTonage")
-//    private String NTonage;
+
+    /**
+     * 吨位
+     */
+    @JacksonXmlProperty(localName = "NTonage")
+    private String NTonage;
     /**
      * 功率
      */
@@ -195,6 +197,10 @@ public class Vhl {
      */
     @JacksonXmlProperty(localName = "NPoWeight")
     private String NPoWeight;
+
+    @JacksonXmlProperty(localName = "WholeWeight")
+    private String WholeWeight;
+
     /**
      * 折旧价
      */
@@ -368,6 +374,7 @@ public class Vhl {
         vhl.setCBusType("0");
         vhl.setCMortgageMrk("0");
         vhl.setNPoWeight(carInfo.getCompleteKerbMass());
+        vhl.setWholeWeight(carInfo.getCompleteKerbMass());
         //305005001:未验 305005002:已验车 305005003:免验车 305005004:需验车
         vhl.setCInspectionCde("305005003");
         vhl.setCDevice8Mrk("0");
@@ -422,6 +429,10 @@ public class Vhl {
 
         //车辆用于是否是 营业  非营业货运
         if(carInfo.getVehicleUse().equals("04") || carInfo.getVehicleUse().equals("08")){
+            //货车 吨位
+            BigDecimal limitLoad = new BigDecimal(carInfo.getLimitLoad());
+            vhl.setNTonage(limitLoad.divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP).toString());
+
             //货车
             //2吨以下
             if(Integer.parseInt(carInfo.getLimitLoad()) < 2000){
@@ -451,6 +462,9 @@ public class Vhl {
 
         vhl.setCQryCdeJQ(cQryCdeJQ);
         vhl.setCQryCdeSY(cQryCdeSY);
+
+
+
         return vhl;
     }
 

+ 17 - 5
src/main/java/com/ydtech/modules/order/aop/aspect/QuoteVerificationAspect.java

@@ -35,11 +35,9 @@ import com.ydtech.modules.protocol.constants.TaxSourceStatusConstants;
 import com.ydtech.modules.protocol.dao.PtlTaxSourceNewMapper;
 import com.ydtech.modules.protocol.entity.dto.TaxSourceExcludeDto;
 import com.ydtech.modules.protocol.entity.po.PtlAgreement;
+import com.ydtech.modules.protocol.entity.po.PtlAgreementGroupLinkAgreement;
 import com.ydtech.modules.protocol.entity.po.PtlTaxSourceNew;
-import com.ydtech.modules.protocol.service.ITaxSourceExcludeService;
-import com.ydtech.modules.protocol.service.PtlAgreementDeptService;
-import com.ydtech.modules.protocol.service.PtlAgreementService;
-import com.ydtech.modules.protocol.service.PtlTaxSourceNewService;
+import com.ydtech.modules.protocol.service.*;
 import com.ydtech.modules.protocol.service.impl.TaxSourceServiceImpl;
 import com.ydtech.modules.protocols.entity.po.InsFeeOrderNew;
 import com.ydtech.modules.protocols.service.InsFeeOrderNewService;
@@ -111,6 +109,8 @@ public class QuoteVerificationAspect {
 
     private final SysQuoteRedisService sysQuoteRedisService;
 
+    private final PtlAgreementGroupLinkAgreementService ptlAgreementGroupLinkAgreementService;
+
     @AfterReturning(pointcut = "@annotation(com.ydtech.modules.order.aop.QuoteVerification)", returning = "result")
     public void doAfter(HttpResult<QuoteRespVo> result) {
         //计算费用因子
@@ -120,6 +120,15 @@ public class QuoteVerificationAspect {
                     insAreaCompanyAccidentalDrivingService.getByCompanyId(insAreaCompany.getId());
             insAreaCompany.setAccidentalDriving(insAreaCompanyAccidentalDriving);
             InsOrders insOrders = insOrdersService.getById(insAreaCompany.getOrderno());
+            String agreementId = insAreaCompany.getAgreementId();
+            boolean isInternalAgreement = false;
+            // 查找是否是内部协议
+            PtlAgreementGroupLinkAgreement ptlAgreementGroupLinkAgreement = ptlAgreementGroupLinkAgreementService.getOne(new LambdaQueryWrapper<PtlAgreementGroupLinkAgreement>()
+                    .eq(PtlAgreementGroupLinkAgreement::getPtlAgreementId, agreementId)
+                    .eq(PtlAgreementGroupLinkAgreement::getPtlAgreementGroupId, 2));
+            if (ptlAgreementGroupLinkAgreement != null){
+                isInternalAgreement = true;
+            }
             // 更新数据
             if (StringUtils.isNotEmpty(insAreaCompany.getLeaderId())) {
                 SysUser sysUser = sysUserService.getById(insOrders.getUserid());
@@ -132,7 +141,7 @@ public class QuoteVerificationAspect {
             StringBuilder logs = new StringBuilder();
             //再进行费用因子判断
             try {
-                feeRuleSchemeNewService.verificationCostFactor(insAreaCompany, insOrders, logs);
+                feeRuleSchemeNewService.verificationCostFactor(result.getData(), insAreaCompany, insOrders, logs, isInternalAgreement);
                 InsFeeOrderNew insFeeOrderNew = insFeeOrderNewService.getInsFeeOrderNewByCompanyId(insAreaCompany.getId());
                 if (insFeeOrderNew != null) {
                     //出口
@@ -178,6 +187,9 @@ public class QuoteVerificationAspect {
         Object[] args = point.getArgs();
         for (Object arg : args) {
             if (arg instanceof BaseQuoteVo) {
+                // 校验用户在职状态(审核通过之后才可以报价)
+                sysUserService.judgmentIncumbency(BaseController.getUserId());
+
                 String companyId = ((BaseQuoteVo<?>) arg).getCompanyId();
                 String agreementId = ((BaseQuoteVo<?>) arg).getAgreementId();
                 String orderno = ((BaseQuoteVo<?>) arg).getOrderNo();

+ 1 - 0
src/main/java/com/ydtech/modules/order/components/dajia/DaJiaRequestApiComponents.java

@@ -65,6 +65,7 @@ public class DaJiaRequestApiComponents {
 
         InsuranceLog.infoLog(InsuranceEnum.DJPC.getPinyin(), "\n\t---------> URl: {} \n---------> 保险公司:{} {}\n---------> 请求参数:{}", url, InsuranceEnum.DJPC.getName(), tradeCode.getDesc(), JSONObject.toJSONString(q));
         String encrypt = AESEncrypt.encrypt(JSON.toJSONString(q), encryptKey);
+        System.out.println(encrypt);
         HttpEntity<String> httpEntity = new HttpEntity<>(encrypt, httpHeaders);
         ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST,  httpEntity, String.class);
         String body = response.getBody();

+ 6 - 0
src/main/java/com/ydtech/modules/order/constants/InsuranceTypeCorrespondence.java

@@ -57,6 +57,12 @@ public class InsuranceTypeCorrespondence {
     //司机
     protected static final String[] DRIVER = {"D3", "SY_FJ_YBW3"};
 
+    // 诚泰乘客
+    protected static final String[] CT_PASSENGER = {"D12", "YD12"};
+
+    // 诚泰司机
+    protected static final String[] CT_DRIVER = {"D11", "YD11"};
+
     // 绝对免赔
     protected static final String[] ABSOLUTE_DEDUCTIBLE = {"MJ1", "MJ2", "MJ3", "MJ4"};
 

+ 54 - 0
src/main/java/com/ydtech/modules/order/constants/ya/CarDamageVerification.java

@@ -0,0 +1,54 @@
+package com.ydtech.modules.order.constants.ya;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 永安车损校验字典
+ */
+@Getter
+@AllArgsConstructor
+public enum CarDamageVerification {
+
+
+    CarDamage01(1, "按期续保,未增加损失类险种"),
+    CarDamage02(2,"已验车,验车合格"),
+    CarDamage03(3,"未投保损失类险种"),
+    CarDamage04(4,"新车免验车"),
+    CarDamage05(5,"已验车,验车不合格"),
+    CarDamage06(6,"需验车,验车资料后补"),
+    CarDamage07(7,"团单免验"),
+    CarDamage08(8,"新车本地上牌"),
+    CarDamage09(9,"已提供完税证明"),
+    CarDamage10(10,"其他"),;
+
+    private final Integer code;
+
+    private final String desc;
+
+    public static String getDesc(Integer code){
+        for( CarDamageVerification carDamageVerification : CarDamageVerification.values()){
+            if(carDamageVerification.getCode().equals(code)){
+                return carDamageVerification.getDesc();
+            }
+        }
+        return "";
+    }
+
+    public static List<Map<String, Object>> getAllList() {
+        List<Map<String, Object>> list = new ArrayList<>();
+        for (CarDamageVerification item : CarDamageVerification.values()) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("code", item.getCode());
+            map.put("desc", item.getDesc());
+            list.add(map);
+        }
+        return list;
+    }
+}
+

+ 11 - 2
src/main/java/com/ydtech/modules/order/controller/ExternalOrderController.java

@@ -1,5 +1,6 @@
 package com.ydtech.modules.order.controller;
 
+import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ydtech.constants.enums.InsuranceRisk;
@@ -78,7 +79,7 @@ public class ExternalOrderController {
     @ApiOperation("保存子订单")
     public HttpResult<QuoteRespVo> saveSubOrder(@RequestBody BaseQuoteVo<AccidentalDrivingVo> quoteVo) {
         BaseQuoteInfoVo quoteInfo = this.insOrdersComponents.getQuoteInfo(quoteVo.getOrderNo(), quoteVo.getAgreementId(),quoteVo.getKinds());
-        boolean result = this.insAreaCompanyService.saveSubOrder(quoteInfo, quoteVo);
+        String companyId = this.insAreaCompanyService.saveSubOrder(quoteInfo, quoteVo);
         String successMsg="";
         String errorMsg ="";
         if(quoteVo.getStageFlag()==1){
@@ -88,7 +89,15 @@ public class ExternalOrderController {
             successMsg="暂存订单成功";
             errorMsg="暂存订单失败";
         }
-        return result  ? HttpResult.ok(successMsg) : HttpResult.error(errorMsg);
+        if(StringUtils.isNotBlank(companyId)){
+            HttpResult httpResult = new HttpResult();
+            httpResult.setData(companyId);
+            httpResult.setMsg(successMsg);
+            httpResult.setCode(200);
+            return httpResult;
+        }else{
+            return HttpResult.error(errorMsg);
+        }
     }
     @PostMapping("/updateExternalOrder")
     @ApiOperation("更新外部订单")

+ 80 - 0
src/main/java/com/ydtech/modules/order/controller/InsCrawlerOrderController.java

@@ -1,6 +1,7 @@
 package com.ydtech.modules.order.controller;
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.ydtech.aop.request.RequestSingleParam;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.base.controller.BaseController;
@@ -8,18 +9,28 @@ import com.ydtech.modules.ins.model.vo.QuoteRespVo;
 import com.ydtech.modules.order.aop.AuditVerification;
 import com.ydtech.modules.order.aop.QuoteVerification;
 import com.ydtech.modules.order.components.InsOrdersComponents;
+import com.ydtech.modules.order.constants.ya.CarDamageVerification;
+import com.ydtech.modules.order.entity.InsAreaCompany;
+import com.ydtech.modules.order.entity.InsOrders;
+import com.ydtech.modules.order.entity.crawler.response.YaCrawlerSendSmsCodeResponse;
+import com.ydtech.modules.order.entity.crawler.response.YaCrawlerVerifyCodeResponse;
 import com.ydtech.modules.order.entity.crawler.vo.CrawlerPolicyPrintVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
 import com.ydtech.modules.order.entity.vo.QuoteAccidentalDrivingVo;
+import com.ydtech.modules.order.service.InsAreaCompanyService;
 import com.ydtech.modules.order.service.InsCrawlerOrderService;
 import com.ydtech.modules.order.service.InsOrdersService;
+import com.ydtech.modules.protocol.entity.dto.PtlAgreementAttributionDto;
+import com.ydtech.modules.protocol.entity.vo.PtlAgreementSaveVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Objects;
+
 @Api(tags = "爬虫对接")
 @RequestMapping("/insurance/crawler")
 @RestController
@@ -32,6 +43,8 @@ public class InsCrawlerOrderController extends BaseController {
 
     private final InsOrdersService insOrdersService;
 
+    private final InsAreaCompanyService insAreaCompanyService;
+
 
     @QuoteVerification("报价授权")
     @PostMapping("/quote")
@@ -94,6 +107,18 @@ public class InsCrawlerOrderController extends BaseController {
         return HttpResult.ok("发送成功!");
     }
 
+    /**
+     * 泰山发送验证码
+     * @param attributionDto
+     * @return
+     */
+    @PostMapping(value = "/sendTscode")
+    @ApiOperation(value = "泰山发送验证码")
+    public HttpResult sendTscode(@RequestBody PtlAgreementAttributionDto attributionDto) {
+        insuranceCrawlerOrderService.sendcode(attributionDto);
+        return HttpResult.ok("发送成功!");
+    }
+
     /**
      * 泰山登录
      * @param agreementId
@@ -107,6 +132,61 @@ public class InsCrawlerOrderController extends BaseController {
         return HttpResult.ok("登录成功!");
     }
 
+    /**
+     * 泰山登录
+     * @param agreement
+     * @return
+     */
+    @PostMapping(value = "/loginTs")
+    @ApiOperation(value = "泰山登录")
+    public HttpResult loginTs(@RequestBody PtlAgreementSaveVo agreement) {
+        insuranceCrawlerOrderService.taishanLogin(agreement);
+        return HttpResult.ok("登录成功!");
+    }
+
+
+    @GetMapping(value = "/yaGetMobile")
+    @ApiOperation(value = "永安获取订单验证码")
+    public HttpResult yaGetMobile(String companyId) {
+        InsAreaCompany insAreaCompany = insAreaCompanyService.getById(companyId);
+        InsOrders insOrders = insOrdersService.getById(insAreaCompany.getOrderno());
+        if(Objects.isNull(insOrders)){
+            return HttpResult.error("订单不存在");
+        }
+        JSONObject applyinfo = insOrders.getApplyinfo();
+        String mobile = applyinfo.get("mobile").toString();
+
+        return HttpResult.ok(mobile);
+    }
+
+    @PostMapping(value = "/yaSendCode")
+    @ApiOperation(value = "永安发送客户信息确认验证码")
+    public HttpResult yaSendCode(@RequestBody JSONObject jsonObject) {
+
+        YaCrawlerSendSmsCodeResponse result = insuranceCrawlerOrderService.yaSendCode(jsonObject.getString("companyId"),jsonObject.getString("smsCode"));
+        if(result.getCode() == 200){
+            return HttpResult.ok("发送成功!");
+        }else{
+            return HttpResult.error(result.getMessage());
+        }
+    }
+
+    @PostMapping(value = "/yaVerifySendCode")
+    @ApiOperation(value = "永安发送客户信息校验验证码")
+    public HttpResult yaVerifySendCode(@RequestBody JSONObject jsonObject) throws Exception {
 
+        YaCrawlerVerifyCodeResponse result = insuranceCrawlerOrderService.yaVerifyCode(jsonObject.getString("companyId"),jsonObject.getString("smsCode"));
+        if(result.getCode() == 200){
+            return HttpResult.ok("验证成功",result.getPay_url());
+        }else{
+            return HttpResult.error("验证失败");
+        }
+    }
+
+    @GetMapping(value = "getYaCarDamageVerificationDict")
+    @ApiOperation(value = "永安车损验证字典获取")
+    public HttpResult getYaCarDamageVerificationDict() {
+        return HttpResult.ok(CarDamageVerification.getAllList());
+    }
 
 }

+ 11 - 4
src/main/java/com/ydtech/modules/order/controller/OrderTaskImageController.java

@@ -137,8 +137,15 @@ public class OrderTaskImageController extends BaseController {
     }
 
 
-
-
-
-
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2025/6/25 8:46
+     *  @Description:  交强保单和商业保单上传解析签单时间
+     */
+    @PostMapping("/uploadFileToTraferSignDateTime")
+    @ApiOperation(value = "文件上传并解析签单时间")
+    public HttpResult<InsUploadFiles> uploadFileToTraferSignDateTime(@CheckObjectNotNull(message = "上传文件不能为空") MultipartFile multipartFile, String type, String companyId,String fileType,HttpServletRequest request) throws IOException {
+        return insUploadFilesService.uploadFileToTraferSignDateTime(multipartFile, getUserName(), type,companyId,fileType);
+    }
 }

+ 10 - 0
src/main/java/com/ydtech/modules/order/controller/QrCodeController.java

@@ -108,6 +108,14 @@ public class QrCodeController {
             }
             QrCodeVo qrCodeVo = new QrCodeVo();
             String qrCodeUrl = qrCodeGenAddress + "?areaCompanyId=" + areaCompanyId;
+            if(insAreaCompany.getCompanyId().equals("YAIC1000000")){
+                if(insAreaCompany.getPaymentLink() == null || insAreaCompany.getPaymentLink().contains("pages/orders/verificationPage")) {
+                    qrCodeUrl = "https://sxzgkj.baoxianzhanggui.com/h5/#/pages/orders/verificationPage" + "?companyId=" + areaCompanyId;
+                }else{
+                    qrCodeUrl = insAreaCompany.getPaymentLink();
+                }
+            }
+
             qrCodeVo.setQrCodeUrl(qrCodeUrl);
             qrCodeVo.setInscompany(insAreaCompany.getInscompany());//保险公司
             qrCodeVo.setSumpremium(insAreaCompany.getSumpremium());//总保费
@@ -137,6 +145,7 @@ public class QrCodeController {
         return modelAndView;
     }
 
+
     @PostMapping(value = "/destructionQrCode")
     @ApiOperation(value = "销毁二维码")
     public ModelAndView destructionQrCode(String areaCompanyId) {
@@ -261,6 +270,7 @@ public class QrCodeController {
         }
     }
 
+
     private static List<SysBarcodeConfig> getConfigs(List<SysBarcodeConfig> configs) {
         return configs;
     }

+ 14 - 3
src/main/java/com/ydtech/modules/order/controller/QuoteController.java

@@ -141,9 +141,20 @@ public class QuoteController extends BaseController {
 
         if (PtlApiType.PTL_API_2.getCode() == ptlAgreementAttribution.getApiType()) {
             BaseQuoteVo<QuoteAccidentalDrivingVo> quoteVo1 = new BaseQuoteVo<>();
-            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(quoteVo.getAccidentalDrivingVo()));
-            QuoteAccidentalDrivingVo javaObject = jsonObject.toJavaObject(QuoteAccidentalDrivingVo.class);
-            BeanUtils.copyProperties(quoteVo, quoteVo1);
+            QuoteAccidentalDrivingVo javaObject = new QuoteAccidentalDrivingVo();
+            if(quoteVo.getCompanyId().equals("ZKIC1000000")){
+                JSONArray objects = JSONArray.parseArray(JSONArray.toJSONString(quoteVo.getAccidentalDrivingVo()));
+                JSONObject jsonObject = new JSONObject();
+                if(objects.size()> 0){
+                    jsonObject = objects.getJSONObject(0);
+                }
+                javaObject = jsonObject.toJavaObject(QuoteAccidentalDrivingVo.class);
+                BeanUtils.copyProperties(quoteVo, quoteVo1);
+            }else {
+                JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(quoteVo.getAccidentalDrivingVo()));
+                javaObject = jsonObject.toJavaObject(QuoteAccidentalDrivingVo.class);
+                BeanUtils.copyProperties(quoteVo, quoteVo1);
+            }
             quoteVo1.setAccidentalDrivingVo(javaObject);
             quoteVo1.setSeatNum(quoteInfo.getCarInfo().getSeatCount());
             BaseQuoteVo baseQuoteVo = insOrdersService.convertDriving(quoteVo1);

+ 2 - 2
src/main/java/com/ydtech/modules/order/controller/YongChengOrderApiController.java

@@ -63,8 +63,8 @@ public class YongChengOrderApiController {
     @ApiOperation(value = "永诚API方式 - 影像上传")
     @PostMapping(value = "/uploadImage")
     public HttpResult uploadImageApi(@RequestSingleParam(value = "companyId") String companyId) {
-//        return yongchengOrderApiService.uploadImageApi(companyId);
-        return HttpResult.ok("ok");
+        return yongchengOrderApiService.uploadImageApi(companyId);
+//        return HttpResult.ok("ok");
     }
 
     @ApiOperation(value = "永诚API方式 -电子保单")

+ 1 - 1
src/main/java/com/ydtech/modules/order/dao/SysQuoteRecordMapper.java

@@ -26,5 +26,5 @@ public interface SysQuoteRecordMapper extends BaseMapper<SysQuoteRecord> {
 
     public Page<QuoteDetailsVo> getQuoteDetails(Page page, @Param("param") QuoteDetailsQueryVo quoteDetailsQueryVo);
 
-    public BigDecimal getQuoteRatio(@Param("userId") String userId, @Param("companyId") String companyId);
+    public BigDecimal getQuoteRatio(@Param("userId") String userId, @Param("companyId") String companyId, String startTime,String endTime);
 }

+ 6 - 0
src/main/java/com/ydtech/modules/order/entity/InsAreaCompany.java

@@ -589,6 +589,12 @@ public class InsAreaCompany implements Serializable {
     @TableField(value = "merge_cost_rate")
     private String mergeCostRate;
 
+    /**
+     * 对接人
+     */
+    @TableField(value = "docking_person")
+    private String dockingPerson;
+
     /**
      * 红黄蓝车系(仅电车返回有值) (阳光使用)
      */

+ 6 - 0
src/main/java/com/ydtech/modules/order/entity/InsOrders.java

@@ -382,6 +382,12 @@ public class InsOrders implements Serializable {
     @ApiModelProperty("更新时间")
     @TableField(exist = false)
     private String updateStatusTime;
+
+    @ApiModelProperty("权益类型 0.现金券 1.权益包")
+    @TableField(exist = false)
+    private Integer type;
+
+
     public InsOrders(SysUser user, SysDept dept, BaseQuoteInfoVo quoteInfoVo) {
         // 2. 组装订单
         this.setQuoteno(String.valueOf(quoteInfoVo.getQuoteno()));

+ 175 - 11
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/InsurePremiumRequest.java

@@ -3,10 +3,10 @@ package com.ydtech.modules.order.entity.api.chengtai.request;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ArrayUtil;
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ydtech.constants.enums.InsuranceRisk;
 import com.ydtech.exception.SystemException;
+import com.ydtech.modules.admin.model.vo.PersonAreaVo;
 import com.ydtech.modules.ins.model.vo.CarInfoVo;
 import com.ydtech.modules.ins.model.vo.CustomerInfoVo;
 import com.ydtech.modules.ins.model.vo.KindInfoVo;
@@ -50,12 +50,171 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
     private String orderId;
     @JsonProperty("handlerCode")
     private String handlerCode;
+    @JsonProperty("applicant")
+    private ApplicantDTO applicant;
+    @JsonProperty("insured")
+    private InsuredDTO insured;
+
+    @Data
+    public static class InsuredDTO {
+        @JsonProperty("type")
+        private String type;
+        @JsonProperty("name")
+        private String name;
+        @JsonProperty("identifyTypeCode")
+        private String identifyTypeCode;
+        @JsonProperty("identifyNumber")
+        private String identifyNumber;
+        @JsonProperty("identifyValidDate")
+        private String identifyValidDate;
+        @JsonProperty("identifyValidEndDate")
+        private String identifyValidEndDate;
+        @JsonProperty("identifyTypeName")
+        private String identifyTypeName;
+        @JsonProperty("sex")
+        private String sex;
+        @JsonProperty("age")
+        private Integer age;
+        @JsonProperty("birthday")
+        private String birthday;
+        @JsonProperty("longTerm")
+        private String longTerm;
+        @JsonProperty("province")
+        private String province;
+        @JsonProperty("city")
+        private String city;
+        @JsonProperty("district")
+        private String district;
+        @JsonProperty("addr")
+        private String addr;
+        @JsonProperty("mobile")
+        private String mobile;
+        @JsonProperty("relationWithInsured")
+        private String relationWithInsured;
+        @JsonProperty("relationWithCar")
+        private String relationWithCar;
+        @JsonProperty("organizationCode")
+        private String organizationCode;
+        @JsonProperty("tel")
+        private String tel;
+        @JsonProperty("linkerName")
+        private String linkerName;
+        @JsonProperty("unitTypeCode")
+        private String unitTypeCode;
+
+        public InsuredDTO(BaseQuoteInfoVo quoteInfoVo, PersonAreaVo personAreaVo){
+            // 获取投保人信息
+            CustomerInfoVo insureInfo = quoteInfoVo.getInsuredPersonInfo();
+            if("0".equals(insureInfo.getProperty())){
+                this.type = "2";
+                this.identifyTypeCode = "4";
+                this.identifyNumber = insureInfo.getOrganizationCode();
+                this.organizationCode = insureInfo.getOrganizationCode();
+                this.tel = insureInfo.getTel();
+                this.linkerName = insureInfo.getName();
+                this.unitTypeCode = "900"; // 单位性质 900:其他
+            }else{
+                this.type = "1";
+                this.identifyTypeCode = "01";
+                this.identifyNumber = insureInfo.getIdentifyNumber();
+                this.sex = IDCardUtils.GetSex(identifyNumber).equalsIgnoreCase("FEMALE") ? "2" : "1";
+                this.birthday = IDCardUtils.GetBirthday(insureInfo.getIdentifyNumber());
+                this.relationWithInsured = "0";
+                this.relationWithCar = "1";
+            }
+            this.name = insureInfo.getName();
+            this.province = personAreaVo.getProvinceCode();
+            this.city = personAreaVo.getCityCode();
+            this.district = personAreaVo.getCountyCode();
+            this.addr = insureInfo.getAddr();
+            this.mobile = insureInfo.getMobile();
+            this.identifyValidDate = insureInfo.getIdentifyValidDate();
+            this.identifyValidEndDate = insureInfo.getIdentifyValidEndDate();
+            this.longTerm = "0";
+        }
+    }
+
+    @Data
+    public static class ApplicantDTO {
+        @JsonProperty("type")
+        private String type;
+        @JsonProperty("name")
+        private String name;
+        @JsonProperty("identifyTypeCode")
+        private String identifyTypeCode;
+        @JsonProperty("identifyNumber")
+        private String identifyNumber;
+        @JsonProperty("identifyValidDate")
+        private String identifyValidDate;
+        @JsonProperty("identifyValidEndDate")
+        private String identifyValidEndDate;
+        @JsonProperty("identifyTypeName")
+        private String identifyTypeName;
+        @JsonProperty("sex")
+        private String sex;
+        @JsonProperty("age")
+        private Integer age;
+        @JsonProperty("birthday")
+        private String birthday;
+        @JsonProperty("longTerm")
+        private String longTerm;
+        @JsonProperty("province")
+        private String province;
+        @JsonProperty("city")
+        private String city;
+        @JsonProperty("district")
+        private String district;
+        @JsonProperty("addr")
+        private String addr;
+        @JsonProperty("mobile")
+        private String mobile;
+        @JsonProperty("organizationCode")
+        private String organizationCode;
+        @JsonProperty("tel")
+        private String tel;
+        @JsonProperty("linkerName")
+        private String linkerName;
+        @JsonProperty("unitTypeCode")
+        private String unitTypeCode;
+
+
+        public ApplicantDTO(BaseQuoteInfoVo quoteInfoVo, PersonAreaVo applyPersonAreaVo){
+            // 获取投保人信息
+            CustomerInfoVo applyInfo = quoteInfoVo.getPolicyHolderInfo();
+            if("0".equals(applyInfo.getProperty())){
+                this.type = "2";
+                this.identifyTypeCode = "4";
+                this.identifyNumber = applyInfo.getOrganizationCode();
+                this.organizationCode = applyInfo.getOrganizationCode();
+                this.tel = applyInfo.getTel();
+                this.linkerName = applyInfo.getName();
+                this.unitTypeCode = "900"; // 单位性质 900:其他
+            }else{
+                this.type = "1";
+                this.identifyTypeCode = "01";
+                this.identifyNumber = applyInfo.getIdentifyNumber();
+                this.sex = IDCardUtils.GetSex(identifyNumber).equalsIgnoreCase("FEMALE") ? "2" : "1";
+                this.birthday = IDCardUtils.GetBirthday(applyInfo.getIdentifyNumber());
+            }
+            this.name = applyInfo.getName();
+            this.province = applyPersonAreaVo.getProvinceCode();
+            this.city = applyPersonAreaVo.getCityCode();
+            this.district = applyPersonAreaVo.getCountyCode();
+            this.addr = applyInfo.getAddr();
+            this.mobile = applyInfo.getMobile();
+            this.identifyValidDate = applyInfo.getIdentifyValidDate();
+            this.identifyValidEndDate = applyInfo.getIdentifyValidEndDate();
+            this.longTerm = "0";
+        }
+    }
 
     public InsurePremiumRequest(BaseQuoteInfoVo quoteInfoVo,
                                 CarInfoResponse.CarModelListDTO carModelListDTO,
                                 QueryCarActualValueResponse carActualValueResponse,
                                 ChengTaiConfigureParameters parameters,
-                                BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo){
+                                BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo,
+                                PersonAreaVo applyPersonAreaVo,
+                                PersonAreaVo insurePersonAreaVo){
         super(parameters.getPartnerCode());
         // 标的信息
         InsuredObjectDTO insuredObject = new InsuredObjectDTO(quoteInfoVo, carModelListDTO,carActualValueResponse);
@@ -97,7 +256,10 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
         }
 
         this.handlerCode = parameters.getUserId();
-
+        InsuredDTO insured = new InsuredDTO(quoteInfoVo,insurePersonAreaVo);
+        this.insured = insured;
+        ApplicantDTO applicant = new ApplicantDTO(quoteInfoVo, applyPersonAreaVo);
+        this.applicant = applicant;
     }
 
     @NoArgsConstructor
@@ -202,14 +364,16 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
                 coverageDTO2.setShortRateType("2");
                 coverageDTO2.setShortRate("100");
                 coverageDTOS.add(coverageDTO2);
-                CoverageDTO coverageDTO3 = new CoverageDTO();
-                coverageDTO3.setKindCode("ct_111603");
-                coverageDTO3.setIfMainKind("2");
-                coverageDTO3.setQuantity(0);
-                coverageDTO3.setCalculateFlag("1");
-                coverageDTO3.setShortRateType("2");
-                coverageDTO3.setShortRate("100");
-                coverageDTOS.add(coverageDTO3);
+                if(!ctQuoteAccidentVo.getProjectName().contains("1座")){
+                    CoverageDTO coverageDTO3 = new CoverageDTO();
+                    coverageDTO3.setKindCode("ct_111603");
+                    coverageDTO3.setIfMainKind("2");
+                    coverageDTO3.setQuantity(0);
+                    coverageDTO3.setCalculateFlag("1");
+                    coverageDTO3.setShortRateType("2");
+                    coverageDTO3.setShortRate("100");
+                    coverageDTOS.add(coverageDTO3);
+                }
                 return coverageDTOS;
             }
         }

+ 35 - 6
src/main/java/com/ydtech/modules/order/entity/api/pingan/utils/PDFUtil.java

@@ -445,11 +445,17 @@ public class PDFUtil {
             payDate = payDate.replaceAll("\\s+", "");
             payDate = payDate.replaceAll("[\u4e00-\u9fa5]", "");
             System.out.println(payDate.length());
-            if(payDate.length() == 18){
+            if(payDate.length() == 18 ){
                 payDate = payDate.substring(0,10)+" "+ payDate.substring(10,18);
             }else if(payDate.length() == 15){
-                    payDate = payDate.substring(0,10)+" "+ payDate.substring(10,15)+":00";
-            }else if(payDate.length() == 10){
+                payDate = payDate.substring(0,10)+" "+ payDate.substring(10,15)+":00";
+            }else if(payDate.length() == 16 || payDate.length() == 17){
+               //截取后8位
+                String minutes_str = payDate.substring(payDate.length() - 8);
+                String day_str = payDate.replaceAll(minutes_str, "");
+                payDate = getContentStrByLine(day_str,1)+" "+minutes_str;
+            }
+            else if(payDate.length() == 10){
                 payDate = payDate+" 00:00:00";
             }
             return LocalDateTime.parse(payDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
@@ -494,7 +500,24 @@ public class PDFUtil {
     }
 
     public static String  getContentStr(String input){
-        Pattern pattern = Pattern.compile("(\\d{4})年(\\d{1,2})月(\\d{1,2})日");
+        Pattern pattern =  Pattern.compile("(\\d{4})年(\\d{1,2})月(\\d{1,2})日");
+        Matcher matcher = pattern.matcher(input);
+        if (matcher.matches()) {
+            String year = matcher.group(1);
+            String month = matcher.group(2);
+            String day = matcher.group(3);
+            return year+"-"+((Integer.parseInt(month)<10 && month.length()==1) ?"0"+month:month)+"-"+((Integer.parseInt(day)<10 && day.length()==1)  ?"0"+day:day);
+        } else {
+            return null;
+        }
+    }
+    public static String  getContentStrByLine(String input,int type){
+        Pattern pattern = null;
+        if(type == 1){
+            pattern = Pattern.compile("(\\d{4})-(\\d{1,2})-(\\d{1,2})");
+        }else if(type == 2){
+            pattern = Pattern.compile("(\\d{4})/(\\d{1,2})/(\\d{1,2})");
+        }
         Matcher matcher = pattern.matcher(input);
         if (matcher.matches()) {
             String year = matcher.group(1);
@@ -505,7 +528,6 @@ public class PDFUtil {
             return null;
         }
     }
-
     public static String  getContentStr(String input, String beginStr, String endStr){
         // 创建正则表达式,其中"(?s)"表示忽略换行符,"."匹配任何字符(包括换行符)
         String regex = "(?s)" + Pattern.quote(beginStr) + "(.+?)" + Pattern.quote(endStr);
@@ -513,7 +535,14 @@ public class PDFUtil {
         Matcher matcher = pattern.matcher(input);
 
         if (matcher.find()) {
-            return matcher.group(1);
+            String groupStr = matcher.group(1);
+            //String regexNew = "[\\u4e00-\\u9fa5&&[^年月日时]]";
+            String regexNew = "[a-zA-Z]|[\u4E00-\u9FFF&&[^年月日时]]";
+            //去除年月日时之外的汉字
+            if(groupStr!=null && !"".equals(groupStr)){
+                return groupStr.replaceAll(regexNew, "");
+            }
+            return null;
         } else {
             return null;
         }

+ 10 - 0
src/main/java/com/ydtech/modules/order/entity/crawler/request/CrawlerBaseRequest.java

@@ -26,4 +26,14 @@ public class CrawlerBaseRequest implements Serializable {
     @JsonProperty(value = "username")
     private String username;
 
+    /**
+     * 紫金核保需要的订单id
+     */
+    @JsonProperty(value = "proposalCheckNo")
+    private String proposalCheckNo;
+
+    public CrawlerBaseRequest(String orderNo, String username){
+        this.orderNo = orderNo;
+        this.username = username;
+    }
 }

+ 25 - 0
src/main/java/com/ydtech/modules/order/entity/crawler/request/CrawlerQuoteRequest.java

@@ -61,4 +61,29 @@ public class CrawlerQuoteRequest extends BaseQuoteInfoVo {
      */
     List<CrawlerImageRequest.B64phoListDTO> b64pho_list;
 
+    /**
+     * 人保车损保额折扣
+     */
+    private String pricecoefficient;
+
+    /**
+     * 中煤网点代码
+     */
+    private String netpointcode;
+
+    /**
+     * 永安车损验车事项
+     */
+    private String carChecker;
+
+    /**
+     * 人保赔付优化申请
+     */
+    private String preDiscount;
+
+    /**
+     * 太平传递 applyNo   决策单元代码
+     */
+    private String applyNo;
+
 }

+ 4 - 0
src/main/java/com/ydtech/modules/order/entity/crawler/request/TsCrawlerLoginRequest.java

@@ -3,6 +3,7 @@ package com.ydtech.modules.order.entity.crawler.request;
 import cn.hutool.core.collection.CollUtil;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ydtech.modules.protocol.entity.dto.PtlAgreementAttributionDto;
+import com.ydtech.utils.StringUtils;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -69,6 +70,9 @@ public class TsCrawlerLoginRequest  implements Serializable {
         this.username = attribution.getUsername();
         this.pwd = attribution.getPassword();
         this.smscode = sendcode;
+        if(StringUtils.isBlank(sendcode)){
+            this.smscode = "save";
+        }
         this.token = request.getToken();
         this.secretKey = request.getSecretKey();
         this.pointJson = request.getPointJson();

+ 44 - 0
src/main/java/com/ydtech/modules/order/entity/crawler/request/YaCrawlerSendSmsCodeRequest.java

@@ -0,0 +1,44 @@
+package com.ydtech.modules.order.entity.crawler.request;
+
+import cn.hutool.core.collection.CollUtil;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ydtech.modules.protocol.entity.dto.PtlAgreementAttributionDto;
+import com.ydtech.utils.StringUtils;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+
+@Data
+@NoArgsConstructor
+public class YaCrawlerSendSmsCodeRequest implements Serializable {
+
+    private static final long serialVersionUID = 01404102263425770704306L;
+
+    /**
+     * 账号
+     */
+    @JsonProperty(value = "username")
+    private String username;
+
+    /**
+     * 订单号
+     */
+    @JsonProperty(value = "plyappno")
+    private String plyappno;
+
+    /**
+     * 验证码
+     */
+    @JsonProperty(value = "smsCode")
+    private String smsCode;
+
+    public YaCrawlerSendSmsCodeRequest(PtlAgreementAttributionDto attribution,String plyappno,String smsCode) {
+        this.username = attribution.getUsername();
+        this.plyappno = plyappno;
+        this.smsCode = smsCode;
+
+    }
+
+}

+ 36 - 0
src/main/java/com/ydtech/modules/order/entity/crawler/response/CrawlerQuoteResponse.java

@@ -222,6 +222,12 @@ public class CrawlerQuoteResponse extends CrawlerBaseResponse {
 
         private static final long serialVersionUID = -7644262314380189512L;
 
+        /**
+         * 紫金订单号
+         */
+        @JsonProperty("proposalCheckNo")
+        private String proposalCheckNo;
+
         /**
          * 总评分
          */
@@ -329,6 +335,35 @@ public class CrawlerQuoteResponse extends CrawlerBaseResponse {
         @JsonProperty("maxQuoteNum")
         private String maxQuoteNum;
 
+        @JsonProperty("rateFloatFlag")
+        private String rateFloatFlag;
+
+        // 永安交强费用浮动
+        @JsonProperty("cifeefloat")
+        private String cifeeFloat;
+
+        // 永安交强费用浮动
+        @JsonProperty("bifeefloat")
+        private String bifeeFloat;
+
+        // 永安评分
+        @JsonProperty("score")
+        private String score;
+
+        /**
+         * 人保交强折扣
+         */
+        @JsonProperty("CiDiscount")
+        private String ciDiscount;
+
+        /**
+         * 人保商业折扣
+         */
+        @JsonProperty("BiDiscount")
+        private String biDiscount;
+
+
+
         public String getDiscount() {
             return StringUtils.isEmpty(discount) ? "0" : discount;
         }
@@ -405,6 +440,7 @@ public class CrawlerQuoteResponse extends CrawlerBaseResponse {
         @JsonProperty("seatCount")
         private String seatCount;
 
+
         public CoreModelsVo toCoreModelsVo() {
             CoreModelsVo coreModelsVo = new CoreModelsVo();
             coreModelsVo.setModelCode(this.modelCode);

+ 29 - 0
src/main/java/com/ydtech/modules/order/entity/crawler/response/YaCrawlerSendSmsCodeResponse.java

@@ -0,0 +1,29 @@
+package com.ydtech.modules.order.entity.crawler.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ydtech.modules.protocol.entity.dto.PtlAgreementAttributionDto;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+public class YaCrawlerSendSmsCodeResponse implements Serializable {
+
+    private static final long serialVersionUID = 01404102263425770704306L;
+
+    /**
+     * 账号
+     */
+    @JsonProperty(value = "code")
+    private int code;
+
+    /**
+     * 订单号
+     */
+    @JsonProperty(value = "message")
+    private String message;
+
+
+}

+ 66 - 0
src/main/java/com/ydtech/modules/order/entity/crawler/response/YaCrawlerVerifyCodeResponse.java

@@ -0,0 +1,66 @@
+package com.ydtech.modules.order.entity.crawler.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+public class YaCrawlerVerifyCodeResponse implements Serializable {
+
+    private static final long serialVersionUID = 01404102263425770704306L;
+
+    /**
+     * 账号
+     */
+    @JsonProperty(value = "code")
+    private int code;
+
+    /**
+     * 订单号
+     */
+    @JsonProperty(value = "message")
+    private String message;
+
+    /**
+     * 订单号
+     */
+    @JsonProperty(value = "JQ_Policy")
+    private String JQ_Policy;
+
+    /**
+     * 订单号
+     */
+    @JsonProperty(value = "JYX_Policy")
+    private String JYX_Policy;
+
+    /**
+     * 订单号
+     */
+    @JsonProperty(value = "SY_Policy")
+    private String SY_Policy;
+
+    /**
+     * 订单号
+     */
+    @JsonProperty(value = "pay_url")
+    private String pay_url;
+
+    /**
+     * 订单号
+     */
+    @JsonProperty(value = "Application")
+    private String Application;
+
+    /**
+     * 订单号
+     */
+    @JsonProperty(value = "payenddata")
+    private String payenddata;
+
+
+
+
+}

+ 5 - 0
src/main/java/com/ydtech/modules/order/entity/dto/InsAreaCompanyQueryDto.java

@@ -21,4 +21,9 @@ public class InsAreaCompanyQueryDto extends InsAreaCompany {
      */
     private String fileStatus;
 
+    /**
+     * 权益类型
+     */
+    private Integer equityType;
+
 }

+ 4 - 0
src/main/java/com/ydtech/modules/order/entity/po/InsUploadFiles.java

@@ -56,4 +56,8 @@ public class InsUploadFiles implements Serializable {
 
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
+
+    //add  by  hxl  2025-06-25  添加签单时间
+    @TableField(exist = false)
+    private String signTime;
 }

+ 9 - 0
src/main/java/com/ydtech/modules/order/entity/vo/BaseQuoteVo.java

@@ -179,4 +179,13 @@ public class BaseQuoteVo<T> {
     @ApiModelProperty("是否现询 1.是 2.否")
     private String costFlag;
 
+    // 人保车损保额折扣
+    private String priceCoefficient;
+
+    @ApiModelProperty("永安车损验车事项")
+    private String carChecker;
+
+    @ApiModelProperty("人保赔付优化申请")
+    private String preDiscount;
+
 }

+ 3 - 0
src/main/java/com/ydtech/modules/order/entity/vo/InsOrdersEditingVo.java

@@ -287,6 +287,8 @@ public class InsOrdersEditingVo extends InsOrders implements Serializable {
         @ApiModelProperty("接口类型")
         private String apiType;
 
+        @ApiModelProperty("权益类型")
+        private Integer equityType;
 
 
         public void feeVacant() {
@@ -339,6 +341,7 @@ public class InsOrdersEditingVo extends InsOrders implements Serializable {
             if(!Objects.isNull(insAreaCompany.getApiType())) {
                 this.apiType = insAreaCompany.getApiType().toString();
             }
+            this.equityType = insAreaCompany.getEquityType();
         }
     }
 

+ 9 - 0
src/main/java/com/ydtech/modules/order/entity/vo/OrderQueryVo.java

@@ -196,6 +196,15 @@ public class OrderQueryVo {
     @ApiModelProperty("合作公司编号")
     private String partnerCompaniesId;
 
+    @ApiModelProperty("费用类型 0.现金 1.权益包")
+    private String type;
+
+    @ApiModelProperty("审核时间开始时间")
+    private String auditTimeStart;
+
+    @ApiModelProperty("审核时间结束时间")
+    private String auditTimeEnd;
+
 
 
     public LocalDate getEndDatePlusOneDay() {

+ 8 - 0
src/main/java/com/ydtech/modules/order/entity/vo/OrderVo.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ydtech.modules.equity.model.vo.EquityPackageVo;
 import com.ydtech.modules.protocol.entity.po.PtlAgreement;
 import com.ydtech.modules.protocols.entity.vo.AgreementProductCostsSave;
 import io.swagger.annotations.ApiModelProperty;
@@ -536,4 +537,11 @@ public class OrderVo implements Serializable {
     @ApiModelProperty("录入来源")
     private String entryStatus;
 
+    @ApiModelProperty("权益包信息")
+    private EquityPackageVo equityPackageVo;
+
+    @ApiModelProperty("权益类型")
+    private Integer equityType;
+
+
 }

+ 1 - 1
src/main/java/com/ydtech/modules/order/service/InsAreaCompanyService.java

@@ -160,7 +160,7 @@ public interface InsAreaCompanyService extends IService<InsAreaCompany> {
      *
      * @return
      */
-    boolean saveSubOrder(BaseQuoteInfoVo quoteInfo, BaseQuoteVo<AccidentalDrivingVo> quoteVo);
+    String saveSubOrder(BaseQuoteInfoVo quoteInfo, BaseQuoteVo<AccidentalDrivingVo> quoteVo);
 
     /**
      * 根据订单id 获取已承保的子订单信息

+ 30 - 0
src/main/java/com/ydtech/modules/order/service/InsCrawlerOrderService.java

@@ -3,9 +3,12 @@ package com.ydtech.modules.order.service;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.order.entity.InsAreaCompany;
 import com.ydtech.modules.order.entity.InsOrders;
+import com.ydtech.modules.order.entity.crawler.response.YaCrawlerSendSmsCodeResponse;
+import com.ydtech.modules.order.entity.crawler.response.YaCrawlerVerifyCodeResponse;
 import com.ydtech.modules.order.entity.crawler.vo.CrawlerPolicyPrintVo;
 import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
 import com.ydtech.modules.protocol.entity.dto.PtlAgreementAttributionDto;
+import com.ydtech.modules.protocol.entity.vo.PtlAgreementSaveVo;
 
 public interface InsCrawlerOrderService extends BaseOrderService<Object> {
 
@@ -99,10 +102,37 @@ public interface InsCrawlerOrderService extends BaseOrderService<Object> {
      */
     void sendcode(String agreementId);
 
+    /**
+     * 泰山发送验证码
+     * @param attributionDto
+     */
+    void sendcode(PtlAgreementAttributionDto attributionDto);
+
+    /**
+     * 泰山登录
+     *
+     * @param agreement
+     */
+    void taishanLogin(PtlAgreementSaveVo agreement);
+
     /**
      * 泰山登录
      * @param agreementId
      * @param smscode
      */
     void taishanLogin(String agreementId, String smscode);
+
+    /**
+     * 永安发送客户确认验证码
+     * @param companyId
+     */
+    YaCrawlerSendSmsCodeResponse yaSendCode(String companyId, String smsCode);
+
+    /**
+     * 永安校验客户验证码
+     * @param companyId
+     * @param smsCode
+     * @return
+     */
+    YaCrawlerVerifyCodeResponse yaVerifyCode(String companyId, String smsCode) throws Exception;
 }

+ 8 - 1
src/main/java/com/ydtech/modules/order/service/InsUploadFilesService.java

@@ -2,6 +2,7 @@ package com.ydtech.modules.order.service;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.order.entity.po.InsUploadFiles;
 import com.ydtech.modules.protocol.utils.AssertionUtils;
 import org.springframework.web.multipart.MultipartFile;
@@ -42,5 +43,11 @@ public interface InsUploadFilesService extends IService<InsUploadFiles> {
         return insUploadFiles;
     }
 
-
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2025/6/25 8:50
+     *  @Description: 上传文件并解析签单时间
+     */
+    HttpResult uploadFileToTraferSignDateTime(MultipartFile multipartFile, String userName, String type, String companyId,String fileType) throws IOException;
 }

+ 18 - 1
src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java

@@ -138,8 +138,25 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         QueryCarActualValueRequest carActualValueRequest = new QueryCarActualValueRequest(quoteInfoVo,carModelListDTO, parameters);
         QueryCarActualValueResponse carActualValueResponse = chengTaiRequestApiComponents.queryActualValue(carActualValueRequest,httpHeaders);
 
+        CustomerInfoVo applyInfo = quoteInfoVo.getPolicyHolderInfo();
+        CustomerInfoVo insureInfo = quoteInfoVo.getInsuredPersonInfo();
+        String applyProperty = applyInfo.getProperty();
+        String insureProperty = insureInfo.getProperty();
+        PersonAreaVo applyPersonAreaVo;
+        PersonAreaVo insurePersonAreaVo;
+        if ("0".equals(applyProperty)) {
+            applyPersonAreaVo = new PersonAreaVo(applyInfo);
+        }else{
+            applyPersonAreaVo = sysAreaService.queryByAddressYc(applyInfo.getAddr(), applyInfo.getIdentifyNumber());
+        }
+        if ("0".equals(insureProperty)) {
+            insurePersonAreaVo = new PersonAreaVo(insureInfo);
+        }else{
+            insurePersonAreaVo = sysAreaService.queryByAddressYc(insureInfo.getAddr(), insureInfo.getIdentifyNumber());
+        }
+
         /** 4. 报价 */
-        InsurePremiumRequest insurePremiumRequest = new InsurePremiumRequest(quoteInfoVo,carModelListDTO, carActualValueResponse,parameters,quoteVo);
+        InsurePremiumRequest insurePremiumRequest = new InsurePremiumRequest(quoteInfoVo,carModelListDTO, carActualValueResponse,parameters,quoteVo,applyPersonAreaVo,insurePersonAreaVo);
         // 重复报价
         InsurePremiumResponse insurePremiumResponse = this.getResponse(insurePremiumRequest, httpHeaders,quoteInfoVo, quoteVo,maxQuoteNum,sysQuoteRecords);
 

+ 19 - 5
src/main/java/com/ydtech/modules/order/service/impl/InsAreaCompanyServiceImpl.java

@@ -186,6 +186,11 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
     @Override
     @Transactional
     public String insertCompanyAndOrders(InsAreaCompany insAreaCompany, InsAreaCompanyAccidentalDriving insAreaCompanyAccidentalDriving) {
+        // 添加协议里的对接人字段
+        String agreementId = insAreaCompany.getAgreementId();
+        PtlAgreement byAgreementIdNew = ptlAgreementService.getByAgreementIdNew(agreementId);
+        insAreaCompany.setDockingPerson(byAgreementIdNew.getDockingPerson());
+
         //add by hxl   解决部分数据更新不了险种信息
         insAreaCompany = updateEntityPruductAndPruductid(insAreaCompany);
 
@@ -219,6 +224,11 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
 
     @Override
     public String insertCompanyAndOrders(String subOrderNo, InsAreaCompany insAreaCompany, InsAreaCompanyAccidentalDriving insAreaCompanyAccidentalDriving) {
+        // 添加协议里的对接人字段
+        String agreementId = insAreaCompany.getAgreementId();
+        PtlAgreement byAgreementIdNew = ptlAgreementService.getByAgreementIdNew(agreementId);
+        insAreaCompany.setDockingPerson(byAgreementIdNew.getDockingPerson());
+
         insAreaCompany = updateEntityPruductAndPruductid(insAreaCompany);
 
         //更新主订单的投保时间
@@ -588,7 +598,7 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
 
     @Override
     @Transactional
-    public boolean saveSubOrder(BaseQuoteInfoVo quoteInfo, BaseQuoteVo<AccidentalDrivingVo> quoteVo) {
+    public String saveSubOrder(BaseQuoteInfoVo quoteInfo, BaseQuoteVo<AccidentalDrivingVo> quoteVo) {
         //添加暂存标志   add by  hxl  2024-07-10  0 暂存 1 保存
         if (quoteVo.getStageFlag() == null) {
             throw new SystemException("暂存标志为空");
@@ -615,9 +625,12 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
         InsOrdersEditingVo insOrdersEditingVo = new InsOrdersEditingVo();
         insOrdersEditingVo.setJqpolicyno(quoteVo.getJqpolicyno());
         insOrdersEditingVo.setSypolicyno(quoteVo.getSypolicyno());
-        InsOrders externalOrder = insOrdersService.getExternalOrder(insOrdersEditingVo);
-        if (!Objects.isNull(externalOrder)) {
-            throw new SystemException("已存在订单");
+        // 处理单独驾意险
+        if(quoteVo.getJqpolicyno() != null || quoteVo.getSypolicyno() != null) {
+            InsOrders externalOrder = insOrdersService.getExternalOrder(insOrdersEditingVo);
+            if (!Objects.isNull(externalOrder)) {
+                throw new SystemException("已存在订单");
+            }
         }
 
         InsOrders insOrders = insOrdersService.getById(quoteInfo.getOrderNo());
@@ -736,6 +749,7 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
         insAreaCompany.setApplyInfo(JSON.toJSONString(quoteInfo.getPolicyHolderInfo()));
         insAreaCompany.setOwnerInfo(JSON.toJSONString(quoteInfo.getOwnerInfo()));
         insAreaCompany.setInsureInfo(JSON.toJSONString(quoteInfo.getInsuredPersonInfo()));
+        insAreaCompany.setDockingPerson(ptlAgreement.getDockingPerson());
         //保存子订单
         this.insertCompanyAndOrders(insAreaCompany);
 
@@ -829,7 +843,7 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
         if(InsOrderStatusEnum.ACCEPT_INSURANCE.getCode().equals(insAreaCompany.getOrderstatus())){
             insOrderPushMsgService.getPushSignInsAreaCompanyList(insAreaCompany.getId());
         }
-        return true;
+        return insAreaCompany.getId();
     }
 
     /**

+ 168 - 2
src/main/java/com/ydtech/modules/order/service/impl/InsCrawlerOrderServiceImpl.java

@@ -1,8 +1,10 @@
 package com.ydtech.modules.order.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ydtech.constants.InsuranceEnum;
 import com.ydtech.constants.enums.InsurKind;
 import com.ydtech.constants.enums.InsuranceOrderPdf;
 import com.ydtech.constants.enums.dict.InsOrderStatusEnum;
@@ -28,10 +30,12 @@ import com.ydtech.modules.order.entity.po.SysQuoteRecord;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
 import com.ydtech.modules.order.service.*;
+import com.ydtech.modules.order.utils.QrCodeGenerator;
 import com.ydtech.modules.protocol.entity.constants.PtlCrawlerApiType;
 import com.ydtech.modules.protocol.entity.dto.PtlAgreementAttributionDto;
 import com.ydtech.modules.protocol.entity.dto.PtlAttributionTemplateDto;
 import com.ydtech.modules.protocol.entity.po.PtlAgreementAttribution;
+import com.ydtech.modules.protocol.entity.vo.PtlAgreementSaveVo;
 import com.ydtech.modules.protocol.service.PtlAgreementAttributionService;
 import com.ydtech.modules.protocol.service.PtlCrawlerApiService;
 import com.ydtech.modules.protocol.utils.AssertionUtils;
@@ -47,8 +51,12 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ObjectUtils;
 
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.net.URL;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
@@ -135,6 +143,10 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
         BeanUtils.copyProperties(quoteInfoVo, crawlerQuoteRequest);
         crawlerQuoteRequest.setMaxQuoteNum(maxQuoteNum);
         crawlerQuoteRequest.setUsername(ptlAgreementAttribution.getUsername());
+        // 人保赔付优化申请
+        crawlerQuoteRequest.setPreDiscount(t.getPreDiscount());
+        // 永安验车事项
+        crawlerQuoteRequest.setCarChecker(t.getCarChecker());
         // 前端传入的驾意险信息
         crawlerQuoteRequest.setAccidentalDriving(t.getAccidentalDrivingVo());
         //  自主定价系数
@@ -164,6 +176,29 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
             String quoteNo = order.getQuoteno();
             List<InsTaskImagesBase64> insTaskImagesBase64List = insTaskImagesService.findByQuoteNoToBase64(quoteNo, ptlAgreementAttribution.getInsCompanyId());
             crawlerQuoteRequest.setB64pho_list(CrawlerImageRequest.toB64phoListDTO(insTaskImagesBase64List));
+            crawlerQuoteRequest.setPricecoefficient(t.getPriceCoefficient() == null ? "1" : t.getPriceCoefficient());
+        }
+
+        // 太平添加applyNo参数
+        if (ptlAgreementAttribution.getInsCompanyId().equals("TPIC1000000")){
+            JSONArray fields = ptlAgreementAttribution.getFields();
+            for(int k=0;k<fields.size();k++){
+                JSONObject jsonObject = fields.getJSONObject(k);
+                if("applyNo".equals(jsonObject.getString("field"))){
+                    crawlerQuoteRequest.setApplyNo(jsonObject.getString("value"));
+                }
+            }
+        }
+
+        // 中煤添加netpointcode 代码
+        if (ptlAgreementAttribution.getInsCompanyId().equals("ZMBX1000000")){
+            JSONArray fields = ptlAgreementAttribution.getFields();
+            for(int k=0;k<fields.size();k++){
+                JSONObject jsonObject = fields.getJSONObject(k);
+                if("netpointcode".equals(jsonObject.getString("field"))){
+                    crawlerQuoteRequest.setNetpointcode(jsonObject.getString("value"));
+                }
+            }
         }
 
         // 发送请求
@@ -243,6 +278,8 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
                 BigDecimal rounded = total.setScale(2, RoundingMode.HALF_UP);
                 quoteRespVo.setJyPremium(rounded.doubleValue());
             }
+        } else if (t.getCompanyId().equals("PICC000000")) {
+            quoteRespVo.setPreDiscount(response.getOther().getBiDiscount());
         }
 
         //处理订单信息
@@ -323,7 +360,15 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
         // 请求地址
         String apiUrl = ptlCrawlerApiService.getApiUrl(insAreaCompany.getAgreementId(), PtlCrawlerApiType.API_4);
         //组装参数
-        CrawlerBaseRequest crawlerBaseRequest = new CrawlerBaseRequest(insAreaCompany.getInsOrderNo(), ptlAgreementAttribution.getUsername());
+        CrawlerBaseRequest crawlerBaseRequest;
+        if(insAreaCompany.getCompanyId().equals("ZKIC1000000")) {
+            String extendInfoStr = String.valueOf(insAreaCompany.getExtendInfo());
+            JSONObject extendInfo = JSONObject.parseObject(extendInfoStr);
+            crawlerBaseRequest = new CrawlerBaseRequest(insAreaCompany.getInsOrderNo(),
+                    ptlAgreementAttribution.getUsername(), extendInfo.getString("proposalCheckNo"));
+        }else {
+            crawlerBaseRequest = new CrawlerBaseRequest(insAreaCompany.getInsOrderNo(), ptlAgreementAttribution.getUsername());
+        }
         CrawlerAuditResponse crawlerAuditResponse = insCrawlerOrderComponents.request(apiUrl, insAreaCompany.getCompanyId(),
                 PtlCrawlerApiType.API_4.getDesc(), crawlerBaseRequest, CrawlerAuditResponse.class);
 
@@ -524,6 +569,15 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
         quoteRespVo.setJqScore(other.getJqMark());
         quoteRespVo.setSyScore(other.getSyMark());
 
+
+        //永安
+        // 评分
+        quoteRespVo.setYaScore(other.getScore());
+        // 交强费用浮动
+        quoteRespVo.setCifeeFloat(other.getCifeeFloat());
+        // 商业费用浮动
+        quoteRespVo.setBifeeFloat(other.getBifeeFloat());
+
         quoteRespVo.setTotalAdjustRate(StringUtils.toDouble(other.getDiscount()));
         quoteRespVo.setJqAdjustRate(other.getJqDiscount());
         quoteRespVo.setSyAdjustRate(other.getSyDiscount());
@@ -573,6 +627,14 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
         quoteRespVo.setJqClaims(other.getJqAccident());
         // 商业出险次数
         quoteRespVo.setSyClaims(other.getSyAccident());
+        // 中煤是否浮动
+        if(other.getRateFloatFlag() != null && !other.getRateFloatFlag().isEmpty()){
+            quoteRespVo.setRateFloatFlag(other.getRateFloatFlag());
+        }
+        // 人保商业折扣
+        if(other.getBiDiscount() != null && !other.getBiDiscount().isEmpty()){
+            quoteRespVo.setPreDiscount(other.getBiDiscount());
+        }
         return quoteRespVo;
     }
 
@@ -630,13 +692,34 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
             }
         }
 
+//        if(Objects.nonNull(response.getOther().getScore())){
+//            insAreaCompany.setYaScore(response.getOther().getScore());
+//        }
+//
+//        if(Objects.nonNull(response.getOther().getCifeeFloat())){
+//            insAreaCompany.setCifeeFloat(response.getOther().getCifeeFloat());
+//        }
+//
+//        if(Objects.nonNull(response.getOther().getBifeeFloat())){
+//            insAreaCompany.setBifeeFloat(response.getOther().getBifeeFloat());
+//        }
+
         // 保险公司订单号
         insAreaCompany.setInsOrderNo(response.getOrderNo());
+        // 紫金 爬虫 添加订单id 到扩展字段中
+        if(insAreaCompany.getApiType() == 2 && insAreaCompany.getCompanyId().equals("ZKIC1000000")){
+            JSONObject extendInfo = new JSONObject();
+            extendInfo.put("proposalCheckNo",response.getOther().getProposalCheckNo());
+            insAreaCompany.setExtendInfo(extendInfo.toString());
+        }
+
+
+
         insAreaCompanyService.insertCompanyAndOrders(insAreaCompany, insAreaCompanyAccidentalDriving);
         //清空驾意险信息 重新复制
 //        quoteRespVo.getAccident().clear();
-
         quoteRespVo.setCompanyId(insAreaCompany.getId());
+
         return quoteRespVo;
     }
 
@@ -847,6 +930,39 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
                         TimeUnit.SECONDS);
     }
 
+    @Override
+    public void sendcode(PtlAgreementAttributionDto attributionDto) {
+        String apiUrl = ptlCrawlerApiService.getByTemplateId(attributionDto.getTemplateId(), PtlCrawlerApiType.API_11);
+        TsCrawlerLoginRequest crawlerLoginRequest = new TsCrawlerLoginRequest(attributionDto);
+        TsCrawlerBaseResponse response = insCrawlerOrderComponents.request(apiUrl, InsuranceEnum.TSBX.getCode(), "获取验证码",
+                crawlerLoginRequest, TsCrawlerBaseResponse.class);
+        if (!response.getCode().equals(200)) {
+            throw new SystemException(response.getMessage());
+        }
+        // 将返回参数放入redis
+        redisTemplate.opsForValue().set(OrderCacheConstant.TS_ACCESS_TOKEN + attributionDto.getUsername(), JSON.toJSONString(response.getData()), OrderCacheConstant.TS_ACCESS_TOKEN_TIME,
+                TimeUnit.SECONDS);
+    }
+
+    @Override
+    public void taishanLogin(PtlAgreementSaveVo agreement) {
+        // 获取协议的用户名密码
+
+        String apiUrl = ptlCrawlerApiService.getByTemplateId(agreement.getAttribution().getTemplateId(), PtlCrawlerApiType.API_1);
+        String token = redisTemplate.opsForValue().get(OrderCacheConstant.TS_ACCESS_TOKEN + agreement.getAttribution().getUsername());
+        if (StringUtils.isNotBlank(token)) {
+            TsCrawlerLoginRequest request = JSON.parseObject(token).toJavaObject(TsCrawlerLoginRequest.class);
+            TsCrawlerLoginRequest tsRequest = new TsCrawlerLoginRequest(agreement.getAttribution(), agreement.getAgreement().getSmsCode(), request);
+            TsCrawlerBaseResponse response = insCrawlerOrderComponents.request(apiUrl, agreement.getAgreement().getPartnerCompaniesId(), "登录",
+                    tsRequest, TsCrawlerBaseResponse.class);
+            if (!response.getCode().equals(200)) {
+                throw new SystemException("泰山登录失败:" + response.getMessage());
+            }
+        } else {
+            throw new SystemException("验证码已失效!请重新发送!");
+        }
+    }
+
     @Override
     public void taishanLogin(String agreementId, String smscode) {
         // 获取协议的用户名密码
@@ -871,6 +987,56 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
         } else {
             throw new SystemException("验证码已失效!请重新发送!");
         }
+    }
 
+    @Override
+    public YaCrawlerSendSmsCodeResponse yaSendCode(String companyId,String smsCode) {
+        InsAreaCompany insAreaCompany = insAreaCompanyService.getById(companyId);
+        PtlAgreementAttribution attribution = ptlAgreementAttributionService.getById(insAreaCompany.getAgreementId());
+        PtlAgreementAttributionDto attributionDto = new PtlAgreementAttributionDto();
+        BeanUtils.copyProperties(attribution, attributionDto);
+        String apiUrl = ptlCrawlerApiService.getByTemplateId(attributionDto.getTemplateId(), PtlCrawlerApiType.API_12);
+        YaCrawlerSendSmsCodeRequest crawlerSendSmsCodeRequest = new YaCrawlerSendSmsCodeRequest(attributionDto,insAreaCompany.getInsOrderNo(),"" );
+        YaCrawlerSendSmsCodeResponse response = insCrawlerOrderComponents.request(apiUrl, InsuranceEnum.YAIC.getCode(), "获取验证码",
+                crawlerSendSmsCodeRequest, YaCrawlerSendSmsCodeResponse.class);
+        return response;
+    }
+
+
+    @Override
+    public YaCrawlerVerifyCodeResponse yaVerifyCode(String companyId,String smsCode) throws Exception {
+        InsAreaCompany insAreaCompany = insAreaCompanyService.getById(companyId);
+        PtlAgreementAttribution attribution = ptlAgreementAttributionService.getById(insAreaCompany.getAgreementId());
+        PtlAgreementAttributionDto attributionDto = new PtlAgreementAttributionDto();
+        BeanUtils.copyProperties(attribution, attributionDto);
+        String apiUrl = ptlCrawlerApiService.getByTemplateId(attributionDto.getTemplateId(), PtlCrawlerApiType.API_13);
+        YaCrawlerSendSmsCodeRequest crawlerSendSmsCodeRequest = new YaCrawlerSendSmsCodeRequest(attributionDto,insAreaCompany.getInsOrderNo(),smsCode );
+        YaCrawlerVerifyCodeResponse response = insCrawlerOrderComponents.request(apiUrl, InsuranceEnum.YAIC.getCode(), "校验验证码",
+                crawlerSendSmsCodeRequest, YaCrawlerVerifyCodeResponse.class);
+        if (response.getCode() == 200){
+            //回写订单数据
+            insAreaCompany.setJqapplyno(response.getJQ_Policy());
+            insAreaCompany.setSyapplyno(response.getSY_Policy());
+            BufferedImage bufferedImage = ImageFromUrl(response.getPay_url());
+            if (bufferedImage != null) {
+                String pay_url = QrCodeGenerator.decodeQrCode(bufferedImage);
+                insAreaCompany.setPaymentLink(pay_url);
+            }
+            insAreaCompanyService.updateById(insAreaCompany);
+        }
+
+        return response;
+    }
+
+
+    public BufferedImage ImageFromUrl(String urlAddr) {
+        try {
+            URL url = new URL(urlAddr); // 网络图片URL
+            BufferedImage image = ImageIO.read(url);
+            return image;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
     }
 }

+ 14 - 2
src/main/java/com/ydtech/modules/order/service/impl/InsOrderPdfUrlServiceImpl.java

@@ -221,7 +221,8 @@ public class InsOrderPdfUrlServiceImpl extends ServiceImpl<InsOrderPdfUrlMapper,
         }
         //永安财险 YAIC   无驾意险保单
         else if(subOrder.getCompanyId().contains(InsuranceEnum.YAIC.getCode())){
-            throw  new SystemException("永安财险报价暂不支持获取保单");
+//            throw  new SystemException("永安财险报价暂不支持获取保单");
+            return insCrawlerOrderService.getPolicyByCompanyIdPdfList(subOrder,insOrders,flag);
             //return yongAnOrderService.getPolicyByCompanyIdPdfList(subOrder,null,flag);
         }
         //华泰财险 HTIC 无驾意险保单
@@ -250,7 +251,12 @@ public class InsOrderPdfUrlServiceImpl extends ServiceImpl<InsOrderPdfUrlMapper,
         }
         //紫金财险 ZKIC  测试通过
         else if(subOrder.getCompanyId().contains(InsuranceEnum.ZKIC.getCode())){
-            return zijinOrderApiService.getPolicyByCompanyIdPdfList(subOrder,insOrders,flag);
+            if(subOrder.getApiType()!=null && subOrder.getApiType()==1){
+                return zijinOrderApiService.getPolicyByCompanyIdPdfList(subOrder,insOrders,flag);
+                //爬虫 测试通过
+            }else if(subOrder.getApiType()!=null && subOrder.getApiType()==2){
+                return insCrawlerOrderService.getPolicyByCompanyIdPdfList(subOrder,insOrders,flag);
+            }
         }
         //诚泰财险 ZKIC  测试通过
         else if(subOrder.getCompanyId().contains(InsuranceEnum.CHAC.getCode())){
@@ -322,6 +328,12 @@ public class InsOrderPdfUrlServiceImpl extends ServiceImpl<InsOrderPdfUrlMapper,
                 return insCrawlerOrderService.getPolicyByCompanyIdPdfList(subOrder,insOrders,flag);
             }
         }
+        //人保
+        else if(subOrder.getCompanyId().contains(InsuranceEnum.PICC.getCode())){
+            if (subOrder.getApiType()!=null && subOrder.getApiType() == 2) {
+                return insCrawlerOrderService.getPolicyByCompanyIdPdfList(subOrder,insOrders,flag);
+            }
+        }
 
         return null;
     }

+ 8 - 2
src/main/java/com/ydtech/modules/order/service/impl/InsOrderQrCodeServiceImpl.java

@@ -65,8 +65,14 @@ public class InsOrderQrCodeServiceImpl extends ServiceImpl<InsOrderQrCodeMapper,
         if (Objects.isNull(insOrderQrCode)) {
             //如果订单状态等于 待缴费 或 撤销二维码
             if (insAreaCompany.getOrderstatus().equals(InsOrderStatusEnum.WAIT_PAY.getCode())) {
-                if (Objects.isNull(insAreaCompany.getPaymentLink())) {
-                    throw new SystemException("该订单没有缴费链接");
+                if(!insAreaCompany.getCompanyId().equals("YAIC1000000")) {
+                    if (Objects.isNull(insAreaCompany.getPaymentLink())) {
+                        throw new SystemException("该订单没有缴费链接");
+                    }
+                }else{
+                    // 永安目前还没有获取到缴费连接  需要默认给一个url 过下一步判断
+                    String qrCodeUrl = "https://sxzgkj.baoxianzhanggui.com/h5/#/pages/orders/verificationPage" + "?companyId=" + companyId;
+                    insAreaCompany.setPaymentLink(qrCodeUrl);
                 }
                 save(insAreaCompany.getOrderno(), insAreaCompany.getId(), insAreaCompany.getCompanyId(),
                         insAreaCompany.getPaymentLink(), isWx);

+ 64 - 7
src/main/java/com/ydtech/modules/order/service/impl/InsOrdersServiceImpl.java

@@ -30,6 +30,11 @@ import com.ydtech.modules.admin.model.*;
 import com.ydtech.modules.admin.model.po.SysUserIsDial;
 import com.ydtech.modules.admin.service.*;
 import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.equity.model.InsAreaCompanyEquity;
+import com.ydtech.modules.equity.model.response.LocalEquityPackageAssociation;
+import com.ydtech.modules.equity.model.response.LocalEquityPackagePage;
+import com.ydtech.modules.equity.model.vo.EquityPackageVo;
+import com.ydtech.modules.equity.service.InsAreaCompanyEquityService;
 import com.ydtech.modules.esm.model.EsmUserReferrer;
 import com.ydtech.modules.esm.service.EsmUserReferrerService;
 import com.ydtech.modules.fee.service.CostsCalcService;
@@ -150,6 +155,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
     @Autowired
     private PtlAgreementProductCostsNewService ptlAgreementProductCostsNewService;
 
+    @Autowired
+    private InsAreaCompanyEquityService insAreaCompanyEquityService;
+
     @Autowired
     private InsAreaCompanyAccidentalDrivingService insAreaCompanyAccidentalDrivingService;
 
@@ -998,13 +1006,13 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         // 永安财险
         if (InsuranceEnum.YAIC.getCode().equals(orderAndAreaCompany.getCompanyId().substring(0, 4)) && orderAndAreaCompany.getIsExternal() == 0) {
             JSONObject reptxt = orderAndAreaCompany.getReptxt();
-            ResponseDataC2 responseDataC2 = JSON.toJavaObject(reptxt, ResponseDataC2.class);
-            List<ExtendInfoDto> extendInfoDtos = responseDataC2.getResponseBody().getExtendInfo();
-            Map<String, String> stringStringMap = extendInfoDtos.stream().collect(LinkedHashMap::new,
-                    (m, v) -> m.put(v.getKey(),
-                            v.getValue()), LinkedHashMap::putAll);
-            yaExtendInfoDto = new YaExtendInfoDto(stringStringMap);
-            orderAndAreaCompany.setExtendInfo(yaExtendInfoDto);
+//            ResponseDataC2 responseDataC2 = JSON.toJavaObject(reptxt, ResponseDataC2.class);
+//            List<ExtendInfoDto> extendInfoDtos = responseDataC2.getResponseBody().getExtendInfo();
+//            Map<String, String> stringStringMap = extendInfoDtos.stream().collect(LinkedHashMap::new,
+//                    (m, v) -> m.put(v.getKey(),
+//                            v.getValue()), LinkedHashMap::putAll);
+//            yaExtendInfoDto = new YaExtendInfoDto(stringStringMap);
+//            orderAndAreaCompany.setExtendInfo(yaExtendInfoDto);
         }
         InsAreaCompany iac = insAreaCompanyService.getById(companyId);
         yaExtendInfoDto.setInsAreaCompany(iac);
@@ -1034,6 +1042,43 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             orderAndAreaCompany.setSumFee(sum.toString());
             List<DistributionLevelVo> distributionLevelVoList = feeRuleSchemeService.converDistrbutionData(insFeeOrderNew);
             orderAndAreaCompany.setDistributionLevelVoList(distributionLevelVoList);
+
+            // 获取客户权益信息
+            List<FeeOrderNewVo.ExportFee> exportFee = feeOrderNewVo.getExportFee();
+            BigDecimal totalAmount = BigDecimal.valueOf(0);
+            for (FeeOrderNewVo.ExportFee fee : exportFee) {
+                if(BusinessConstant.FEE_INSURANCE_TYPE_4.equals(fee.getInsuranceType())){
+                    totalAmount = fee.getTotalAmount();
+                }
+            }
+            // 获取权益包
+            InsAreaCompanyEquity equity = insAreaCompanyEquityService.getById(companyId);
+            if(Objects.nonNull(equity) && equity.getType().equals(1)){
+                EquityPackageVo packageVo = new EquityPackageVo();
+                packageVo.setPackageName(equity.getEquityName());
+                packageVo.setLdProportion(ptlAgreementProductCostsNew.getLdProportion());
+                packageVo.setTotalAmount(totalAmount);
+                packageVo.setKhAmount(totalAmount.subtract(
+                        totalAmount.multiply(new BigDecimal(ptlAgreementProductCostsNew.getLdProportion())
+                                .divide(new BigDecimal(100)))));
+                packageVo.setDlrAmount(totalAmount.multiply(new BigDecimal(ptlAgreementProductCostsNew.getLdProportion()).divide(new BigDecimal(100))));
+
+                String equityInfo = equity.getEquityInfo();
+                LocalEquityPackagePage packagevo = JSON.parseObject(equityInfo, LocalEquityPackagePage.class);
+                List<LocalEquityPackageAssociation> infoList = packagevo.getLocalEquityPackageAssociationList();
+                packageVo.setQybAmount(packagevo.getTotalPackagePrice());
+                List<EquityPackageVo.EquityPackageInfoVo> infoVoList = new ArrayList<>();
+                for (LocalEquityPackageAssociation localEquityPackageAssociation : infoList) {
+                    EquityPackageVo.EquityPackageInfoVo infoVo = new EquityPackageVo.EquityPackageInfoVo();
+                    infoVo.setNumber(localEquityPackageAssociation.getNumber());
+                    infoVo.setEquityName(localEquityPackageAssociation.getRightsName());
+                    infoVo.setAgreementPrice(localEquityPackageAssociation.getSettlePrice());
+                    infoVo.setMarketPrice(localEquityPackageAssociation.getMarketPrice());
+                    infoVoList.add(infoVo);
+                }
+                packageVo.setInfoVoList(infoVoList);
+                orderAndAreaCompany.setEquityPackageVo(packageVo);
+            }
         }
         //查询费用审核状态
         List<InsFeeAudit> feeAuditList = insFeeAuditService.query().eq("ins_order_no", companyId).list();
@@ -1102,6 +1147,8 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         } else {
             orderAndAreaCompany.setJqInsuranceType(new JSONArray());
         }
+
+
         // 获取协议信息、 录入来源
         PtlAgreement ptlAgreement = ptlAgreementService.getById(orderAndAreaCompany.getAgreementId());
         orderAndAreaCompany.setPtlAgreement(ptlAgreement);
@@ -2031,6 +2078,16 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             ygQuoteAccidentVo.setQuantityCasualty(String.valueOf(accidentalDrivingVo.getQuantity()));
             yangguangBaseQuoteVo.setAccidentalDrivingVo(Collections.singletonList(ygQuoteAccidentVo));
             return yangguangBaseQuoteVo;
+        } else if (baseQuoteVo.getCompanyId().equals("ZKIC1000000")) {
+            //紫金财险
+            BaseQuoteVo<Object> ziJinYangBaseQuoteVo = new BaseQuoteVo<>();
+            BeanUtils.copyProperties(baseQuoteVo, ziJinYangBaseQuoteVo);
+            JSONObject accidentObject = JSONObject.parseObject(JSONObject.toJSONString(ziJinYangBaseQuoteVo.getAccidentalDrivingVo()));
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("planId", accidentObject.getString("projectCode"));
+            jsonObject.put("rideRiskCode", accidentObject.getString("riskCode"));
+            ziJinYangBaseQuoteVo.setAccidentalDrivingVo(jsonObject);
+            return ziJinYangBaseQuoteVo;
         }
 
         return null;

+ 68 - 2
src/main/java/com/ydtech/modules/order/service/impl/InsUploadFilesServiceImpl.java

@@ -2,16 +2,24 @@ package com.ydtech.modules.order.service.impl;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ydtech.constants.enums.FileType;
+import com.ydtech.core.page.HttpResult;
 import com.ydtech.exception.SystemException;
 import com.ydtech.modules.order.dao.InsUploadFilesMapper;
+import com.ydtech.modules.order.entity.api.pingan.utils.PDFUtil;
+import com.ydtech.modules.order.entity.po.InsOrderReadPdf;
 import com.ydtech.modules.order.entity.po.InsUploadFiles;
+import com.ydtech.modules.order.service.InsOrderReadPdfService;
 import com.ydtech.modules.order.service.InsUploadFilesService;
 import com.ydtech.utils.ImageCompressionUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -19,7 +27,11 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
 
 /**
  * @author wenks
@@ -39,6 +51,10 @@ public class InsUploadFilesServiceImpl extends ServiceImpl<InsUploadFilesMapper,
 
     private static final int desFileSize = 300;
 
+    @Lazy
+    @Autowired
+    private InsOrderReadPdfService insOrderReadPdfService;
+
     @Override
     public InsUploadFiles uploadFile(MultipartFile multipartFile, String username, String type) throws IOException {
         String fileMD5 = DigestUtils.md5Hex(multipartFile.getBytes());
@@ -99,8 +115,6 @@ public class InsUploadFilesServiceImpl extends ServiceImpl<InsUploadFilesMapper,
             throw new SystemException("上传过程中出错" + e.getMessage());
         }
     }
-
-
     /**
      * 自动生成目录
      *
@@ -126,6 +140,58 @@ public class InsUploadFilesServiceImpl extends ServiceImpl<InsUploadFilesMapper,
         return stringBuilder.toString();
     }
 
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2025/6/25 8:52
+     *  @Description:  上传文件并解析签单时间
+     */
+    @Override
+    public HttpResult uploadFileToTraferSignDateTime(MultipartFile multipartFile, String userName, String type, String companyId,String fileType) {
+
+        InsUploadFiles insUploadFiles =null;
+        try {
+            insUploadFiles = uploadFile(multipartFile, userName, type);
+        }catch (Exception e){
+            return HttpResult.error("上传文件失败!");
+        }
+        if(StringUtils.isNotBlank(fileType) &&("1".equals(fileType) || "2".equals(fileType))){
+             if(StringUtils.isBlank(companyId)){
+                 return HttpResult.error("保险公司不能为空!");
+             }
+             if(StringUtils.isBlank(fileType)){
+                 return HttpResult.error("保单类型不能为空!");
+             }
+            if(insUploadFiles!=null){
+                //通过保险公司配置读取截取的前缀和后缀
+                LambdaQueryWrapper<InsOrderReadPdf> qws = new LambdaQueryWrapper<>();
+                qws.eq(InsOrderReadPdf::getCompanyId, companyId);
+                qws.eq(InsOrderReadPdf::getType, fileType);
+                List<InsOrderReadPdf> list = insOrderReadPdfService.list(qws);
+                HashMap<String, LocalDateTime> map = new HashMap<>();
+                String pdfText = PDFUtil.getPdfText(insUploadFiles.getFilePath());
+                if (StringUtils.isNotBlank(pdfText)) {
+                    if (list != null && list.size() > 0) {
+                        for (InsOrderReadPdf insOrderReadPdf : list) {
+                            LocalDateTime pdfContentDate =null;
+                            try{
+                                pdfContentDate = PDFUtil.getPdfContentDate(pdfText, insOrderReadPdf.getReadBegin(), insOrderReadPdf.getReadEnd(), insOrderReadPdf.getReadType());
+                            }catch (Exception e){
+
+                            }
+                            map.put(insOrderReadPdf.getOrderMsg(), pdfContentDate);
+                        }
+                    }
+                }
+                if(map.get("signingTime")!=null){
+                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                    String  signingTimeStr = map.get("signingTime").format(formatter);
+                    insUploadFiles.setSignTime(signingTimeStr);
+                }
+            }
+        }
+        return HttpResult.ok(insUploadFiles);
+    }
 }
 
 

+ 7 - 2
src/main/java/com/ydtech/modules/order/service/impl/SysQuoteRedisServiceImpl.java

@@ -30,6 +30,8 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -370,8 +372,11 @@ public class SysQuoteRedisServiceImpl implements SysQuoteRedisService {
 
     @Override
     public BigDecimal getQuoteRatio(String companyId, String userId) {
-        BigDecimal quoteRatio = sysQuoteRecordMapper.getQuoteRatio(userId, companyId);
-        return quoteRatio;
+        LocalDateTime todayMidnight = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
+        LocalDateTime tomorrowMidnight = LocalDateTime.of(LocalDate.now().plusDays(1), LocalTime.MIN);
+        String startTime = todayMidnight.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        String endTime = tomorrowMidnight.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        return sysQuoteRecordMapper.getQuoteRatio(userId, companyId, startTime, endTime);
     }
 
     /**

+ 10 - 2
src/main/java/com/ydtech/modules/protocol/controller/PtlAgreementController.java

@@ -105,6 +105,14 @@ public class PtlAgreementController extends BaseController {
         return ptlAgreementService.reviseAgreement(userName, agreementId, agreement);
     }
 
+    @PostMapping("/checkLogin")
+    @ApiOperation("校验登录")
+    public HttpResult<Object> checkLogin(@RequestBody PtlAgreementSaveVo agreement) {
+        String userName = getUserName();
+        boolean result = ptlAgreementService.checkLogin(userName, agreement.getAgreementId(), agreement);
+        return result ? HttpResult.ok("登录成功") : HttpResult.error("登录失败");
+    }
+
     @PostMapping("/batch")
     @ApiOperation("批量修改协议是否启用状态")
     public HttpResult<Object> batchRevise(@RequestBody PltAgreementBatchVo pltAgreementBatchVo) {
@@ -260,10 +268,10 @@ public class PtlAgreementController extends BaseController {
     @PostMapping("/updateFeeFile")
     @ApiOperation("上传费用文件")
     public HttpResult updateFeeFile(@CheckObjectNotNull(message = "上传文件不能为空") MultipartFile multipartFile, String agreementId) throws IOException {
-        agreementId = agreementId.replace(",","");
+        agreementId = agreementId.replace(",", "");
         InsUploadFiles insUploadFiles = insUploadFilesService.uploadFile(multipartFile, getUserName(), "file");
         PtlAgreement byId = ptlAgreementService.getById(agreementId);
-        if(Objects.isNull(byId)){
+        if (Objects.isNull(byId)) {
             throw new SystemException("找不到协议");
         }
         byId.setFeeFileId(insUploadFiles.getId());

+ 3 - 1
src/main/java/com/ydtech/modules/protocol/entity/constants/PtlCrawlerApiType.java

@@ -17,7 +17,9 @@ public enum PtlCrawlerApiType {
     API_8(8, "人工核保状态刷新"),
     API_9(9, "撤销订单"),
     API_10(10, "验车码"),
-    API_11(11, "验证码配置");
+    API_11(11, "验证码配置"),
+    API_12(12, "客户信息确认验证码"),
+    API_13(13, "客户信息校验验证码");
 
     private final int code;
 

+ 3 - 0
src/main/java/com/ydtech/modules/protocol/entity/dto/PtlAgreementSaveDto.java

@@ -89,4 +89,7 @@ public class PtlAgreementSaveDto implements Serializable {
 
     @ApiModelProperty("对接管理人")
     private String custodianId;
+
+    @ApiModelProperty("验证码")
+    private String smsCode;
 }

+ 6 - 0
src/main/java/com/ydtech/modules/protocol/entity/po/PtlNewCarJudgeRules.java

@@ -31,6 +31,12 @@ public class PtlNewCarJudgeRules implements Serializable {
     @TableField(value = "company_id")
     private String companyId;
 
+    /**
+     * 车辆类型
+     */
+    @TableField(value = "vehicle_type")
+    private String vehicleType;
+
     /**
      * 单位  month-月 day-天
      */

Некоторые файлы не были показаны из-за большого количества измененных файлов