فهرست منبع

Merge branch 'dev_jzg_lipf_v20260423'

lipf 4 ماه پیش
والد
کامیت
fb08e70d4a
13فایلهای تغییر یافته به همراه239 افزوده شده و 26 حذف شده
  1. 7 1
      commons/src/main/java/com/jzg/commons/entity/po/SysDistributionSetting.java
  2. 53 0
      commons/src/main/java/com/jzg/commons/entity/po/SysDistributionSettingVO.java
  3. 3 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  4. 1 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  5. 9 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/component/ZiJinApiRequestComponent.java
  6. 47 2
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/service/Impl/ZiJinApiRequestImpl.java
  7. 49 14
      tenant/organization/src/main/java/com/jzg/organization/controller/AgreementController.java
  8. 8 1
      tenant/organization/src/main/java/com/jzg/organization/controller/SysDistributionSettingController.java
  9. 11 0
      tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementService.java
  10. 8 1
      tenant/organization/src/main/java/com/jzg/organization/service/SysDistributionSettingService.java
  11. 37 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementServiceImpl.java
  12. 5 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysDistributionSettingServiceImpl.java
  13. 1 3
      tenant/organization/src/main/resources/mapper/SysOrganizationUserLinkServiceMapper.xml

+ 7 - 1
commons/src/main/java/com/jzg/commons/entity/po/SysDistributionSetting.java

@@ -9,6 +9,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serial;
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.List;
 
@@ -21,7 +23,11 @@ import java.util.List;
 @TableName("sys_distribution_setting")
 @NoArgsConstructor
 @AllArgsConstructor
-public class SysDistributionSetting {
+public class SysDistributionSetting implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 5283654276005417794L;
+
     @TableId(type = IdType.ASSIGN_ID)
     private String id;
 

+ 53 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysDistributionSettingVO.java

@@ -0,0 +1,53 @@
+package com.jzg.commons.entity.po;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/8/6 11:16
+ */
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class SysDistributionSettingVO implements Serializable {
+
+
+    @Serial
+    private static final long serialVersionUID = -5860522632566061177L;
+
+    private String id;
+
+    @Schema(description = "分销模式 1-一级分销 2-二级分销 3-三级分销")
+    private String distributionMode;
+
+    @Schema(description = "一级佣金比例(%)")
+    private BigDecimal commissionRatioLevel1;
+
+    @Schema(description = "二级佣金比例(%)")
+    private BigDecimal commissionRatioLevel2;
+
+    @Schema(description = "三级佣金比例(%)")
+    private BigDecimal commissionRatioLevel3;
+
+    @Schema(description = "分销员招募方式:1-手动申请 2-加入组织自动成为分销员")
+    private String recruitmentMethod;
+
+    @Schema(description = "不参与分销的机构范围:1-全部机构 2-部分机构")
+    private String excludeDeptScope;
+
+    @Schema(description = "租户code")
+    private String systemCode;
+
+    @Schema(description = "不参与分销的机构")
+    private List<SysDept> excludeDept;
+}

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

@@ -259,8 +259,9 @@ public class UnifyOrderManager {
         } catch (Exception e) {
             log.error("车险报价异常", e);
             Throwable root = e.getCause() != null ? e.getCause() : e;
-            insOrdersService.orderAfterUpdateFailedQuote(ordersNo, root.getMessage());
-            throw new SystemException(root.getMessage());
+            String errMsg = root.getMessage() != null ? root.getMessage() : "系统异常,报价失败";
+            insOrdersService.orderAfterUpdateFailedQuote(ordersNo, errMsg);
+            throw new SystemException(errMsg);
         }
         return quoteResultsVo.getQuoteStatusEnum()
                 .equals(InsOrderStatusEnum.WAIT_AUDIT) ? HttpResult.ok(quoteResultsVo) : HttpResult.error(500, quoteResultsVo, quoteResultsVo.getErrorMessage());

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

@@ -870,6 +870,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         //设置订单状态
         StateResult stateResult = orderStateListener.statusChange(underwritingResultsVo.getUnderwritingStatus(), insOrders.getOrderStatus());
         insOrders.setOrderStatus(String.valueOf(stateResult.getCurrentState()));
+        insOrders.setErrorMessage(underwritingResultsVo.getUnderwritingResult());
 
         //如果保司订单号存在则进行更新  有的保司在核保获取订单号
         if (Objects.nonNull(underwritingResultsVo.getCompanyOrderNo())) {

+ 9 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/component/ZiJinApiRequestComponent.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.zijin.api.component;
 
+import com.alibaba.fastjson.JSON;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.component.RequestComponent;
@@ -9,6 +10,7 @@ import com.jzg.quotation.zijin.api.entity.constants.enums.ResultEnum;
 import com.jzg.quotation.zijin.api.entity.request.*;
 import com.jzg.quotation.zijin.api.entity.response.*;
 import com.jzg.quotation.zijin.api.properties.ZiJinApiProperties;
+import com.jzg.quotation.zijin.api.service.Impl.ZiJinApiRequestImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.Redisson;
@@ -16,6 +18,8 @@ import org.redisson.api.RLock;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.redisson.config.Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
@@ -32,6 +36,8 @@ import java.util.concurrent.TimeUnit;
 @RequiredArgsConstructor
 public class ZiJinApiRequestComponent {
 
+    public static final Logger logger = LoggerFactory.getLogger(ZiJinApiRequestComponent.class);
+
     private static final String USER_ID = "28317480921155536850";
 
     private final RedissonClient redissonClient;
@@ -78,6 +84,7 @@ public class ZiJinApiRequestComponent {
         httpHeaders.set(ZiJinApiCacheComponent.ZKI_API_AUTHORIZATION, queryTokenResponse.getToken());
         // 3. 缓存到数据库中
         ziJinApiCacheComponent.cacheAuthorization(accessToken.getToken(), queryTokenResponse.getToken(), ziJinApiConfigureParameters.getAppKey());
+        logger.info("紫金getToken:{}", JSON.toJSONString(httpHeaders));
         return httpHeaders;
     }
 
@@ -93,6 +100,8 @@ public class ZiJinApiRequestComponent {
         }
         number--;
         HttpHeaders httpHeaders = ziJinApiCacheComponent.getAuthorizationHeader(ziJinApiConfigureParameters.getAppKey());
+        logger.info("紫金getHttpHeaders:{}", JSON.toJSONString(httpHeaders));
+
         if (!ObjectUtils.isEmpty(httpHeaders)) {
             return httpHeaders;
         }

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

@@ -1,5 +1,6 @@
 package com.jzg.quotation.zijin.api.service.Impl;
 
+import com.alibaba.fastjson.JSON;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.constants.quote.enums.base.InsuranceImageEnum;
 import com.jzg.commons.core.page.HttpResult;
@@ -38,6 +39,8 @@ import com.jzg.quotation.zijin.api.service.ZiJinOrderService;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.io.IOUtils;
 import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpHeaders;
 
 import java.io.IOException;
@@ -56,6 +59,8 @@ import java.util.Objects;
 @RequiredArgsConstructor
 public class ZiJinApiRequestImpl implements ZiJinApiRequest {
 
+    public static final Logger logger = LoggerFactory.getLogger(ZiJinApiRequestImpl.class);
+
     private final ZiJinApiRequestComponent ziJinApiRequestComponent;
 
     private final ZiJinOrderService ziJinOrderService;
@@ -73,31 +78,37 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
 
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) {
+        logger.info("紫金quote请求参数:{}", JSON.toJSONString(quoteVo));
         OrderBase order = quoteVo.getOrder();
         AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
         // 配置信息
         ZiJinApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZiJinApiConfigureParameters.class, attributionInformationVo.getConfigInfo());
         HttpHeaders httpHeaders = ziJinApiRequestComponent.getHttpHeaders(parameters);
+        logger.info("紫金请求Header为:{}", JSON.toJSONString(httpHeaders));
         // 车型查询
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
         ModelQueryRequest modelQueryRequest = new ModelQueryRequest(parameters, carInfoVo.getVinNo(), carInfoVo.getBrandName());
         ModelQueryResponse modelQueryResponse = ziJinApiRequestComponent.modelQuery(modelQueryRequest, httpHeaders);
+        logger.info("紫金请求/modelQuery车型查询接口,结果为:{}", JSON.toJSONString(modelQueryResponse));
         // 过滤车型
         ModelQueryResponse.VehicleModelInfosDTO vehicleModelInfosDTO = CarModelsFilterUtils.to(modelQueryResponse.getVehicleModelInfos(), carInfoVo);
         // 计算车辆价格
         QueryActualValueRequest queryActualValueRequest = new QueryActualValueRequest(carInfoVo, vehicleModelInfosDTO.getPurchasePrice(), quoteVo);
         QueryActualValueResponse queryActualValueResponse = ziJinApiRequestComponent.queryActualValue(queryActualValueRequest, httpHeaders);
+        logger.info("紫金请求/queryActualValue计算车辆价格接口,结果为:{}", JSON.toJSONString(queryActualValueResponse));
         // 补全驾意险的参数
         setAccidentalDriving(quoteVo);
         // 报价
         CalculatePremiumRequest calculatePremiumRequest = new CalculatePremiumRequest(quoteVo, vehicleModelInfosDTO, queryActualValueResponse.getActualValue(), parameters, modelQueryResponse);
         CalculatePremiumResponse calculatePremiumResponse = ziJinApiRequestComponent.calculatePremium(calculatePremiumRequest, httpHeaders,modelQueryRequest,queryActualValueRequest,REPEAT_NUMBER,RETRY_NUMBER);
+        logger.info("紫金请求/calculatePremium保费计算接口,结果为:{}", JSON.toJSONString(calculatePremiumResponse));
         ziJinOrderService.saveOrderInfo(quoteVo, modelQueryResponse);
         return ZiJinAPIQuoteResultsVoBuild.buildQuoteResultsVo(order.getOrdersNo(), quoteVo, calculatePremiumResponse, modelQueryResponse.getOrderNo());
     }
 
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
+        logger.info("紫金underwriting请求参数:{}", JSON.toJSONString(underwritingVo));
         InsOrdersCosts insOrdersCosts = underwritingVo.getInsOrdersCosts();
         OrderBase orderBase = underwritingVo.getOrder();
         ZiJinApiOrder ziJinApiOrder = ziJinOrderService.getById(orderBase.getOrdersNo());
@@ -106,12 +117,14 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
                 .getAttributionInformationVo()
                 .getConfigInfo());
         HttpHeaders httpHeaders = ziJinApiRequestComponent.getHttpHeaders(parameters);
+        logger.info("紫金请求Header为:{}", JSON.toJSONString(httpHeaders));
         List<SpecialAppointmentsVo> specialAppointmentsVos = underwritingVo.getSpecialAppointmentsVos();
         SubmitVerifyRequest submitVerifyRequest = new SubmitVerifyRequest(ziJinApiOrder, specialAppointmentsVos);
 
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
         try {
             SubmitVerifyResponse submitVerifyResponse = ziJinApiRequestComponent.submitVerify(submitVerifyRequest, httpHeaders);
+            logger.info("紫金/submitVerify提交核保接口,结果为:{}", JSON.toJSONString(submitVerifyResponse));
             SubmitVerifyResponse.SubmitVerifyInfoDTO submitVerifyInfo = submitVerifyResponse.getSubmitVerifyInfo();
             underwritingResultsVo.setJqPolicyno(submitVerifyInfo.getPolicyNoCI());
             underwritingResultsVo.setJqApplyNo(submitVerifyInfo.getProposalNoCI());
@@ -122,18 +135,38 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
             String multiply = insOrdersCosts.getSumPremium().toPlainString();
             NewPayRequest newPayRequest = new NewPayRequest(multiply, ziJinApiOrder.getOrderNo(), parameters);
             NewPayRequestResponse newPayRequestResponse = ziJinApiRequestComponent.newPay(newPayRequest, httpHeaders);
+            logger.info("紫金/newPay获取新支付接口,结果为:{}", JSON.toJSONString(newPayRequestResponse));
             underwritingResultsVo.setPaymentLink(newPayRequestResponse.getTwoDimentionImageUrl());
         } catch (SystemException systemException) {
+            String uwMsg = systemException.getMessage();
+            uwMsg = (uwMsg == null || uwMsg.isBlank()) ? "核保接口异常" : uwMsg;
+
             QueryOrderDetailResponse queryOrderDetailResponse = ziJinApiRequestComponent.getOrderDetail(orderBase.getCompanyOrderNo(), httpHeaders);
+            if (queryOrderDetailResponse == null) {
+                underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+                underwritingResultsVo.setUnderwritingResult("核保失败:查询订单状态为空");
+                return underwritingResultsVo;
+            }
+
             QueryOrderDetailResponse.ResultObjDTO resultObj = queryOrderDetailResponse.getResultObj();
-            String uwMsg = systemException.getMessage();
+            logger.info("紫金/getOrderDetail订单详情查询服务接口,结果为:{}", JSON.toJSONString(queryOrderDetailResponse));
+
+            if (resultObj == null) {
+                underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+                underwritingResultsVo.setUnderwritingResult("核保失败:订单状态未返回");
+                return underwritingResultsVo;
+            }
+
             if (OrderStatusEnum.O_3.getCode().equals(resultObj.getOrderStatus())) {
                 underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
                 underwritingResultsVo.setUnderwritingResult(OrderStatusEnum.O_3.getName() + ":" + uwMsg);
-                // 人工核保
             } else if (OrderStatusEnum.O_1.getCode().equals(resultObj.getOrderStatus())) {
                 underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
                 underwritingResultsVo.setUnderwritingResult("人工核保" + ":" + uwMsg);
+            } else {
+                // 兜底:未知状态
+                underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+                underwritingResultsVo.setUnderwritingResult("核保失败:" + uwMsg);
             }
         }
         return underwritingResultsVo;
@@ -141,6 +174,7 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
 
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
+        logger.info("紫金getPaymentLink请求参数为:{}", JSON.toJSONString(paymentLinkVo));
         ZiJinApiOrder ziJinApiOrder = ziJinOrderService.getById(paymentLinkVo.getOrder().getOrdersNo());
         ZiJinApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZiJinApiConfigureParameters.class, paymentLinkVo.getOrder()
                 .getAttributionInformationVo()
@@ -148,6 +182,7 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
         HttpHeaders httpHeaders = ziJinApiRequestComponent.getHttpHeaders(parameters);
         NewPayRequest newPayRequest = new NewPayRequest("", ziJinApiOrder.getOrderNo(), parameters.getOrderOrigin(), parameters.getProposalCityCode());
         NewPayRequestResponse newPayRequestResponse = ziJinApiRequestComponent.newPay(newPayRequest, httpHeaders);
+        logger.info("紫金/newPay获取新支付接口,结果为:{}", JSON.toJSONString(newPayRequestResponse));
         PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
         paymentLinkResultsVo.setPaymentLink(newPayRequestResponse.getUrl());
         return paymentLinkResultsVo;
@@ -155,24 +190,30 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
 
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
+        logger.info("紫金uploadImage请求参数为:{}", JSON.toJSONString(insuranceUploadImageVo));
         // 获取订单信息
         OrderBase orderBase = insuranceUploadImageVo.getOrder();
         ZiJinApiOrder ziJinApiOrder = ziJinOrderService.getById(orderBase.getOrdersNo());
+        logger.info("紫金ziJinApiOrder结果为:{}", JSON.toJSONString(ziJinApiOrder));
         // 配置信息
         ZiJinApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZiJinApiConfigureParameters.class, orderBase
                 .getAttributionInformationVo()
                 .getConfigInfo());
         HttpHeaders httpHeaders = ziJinApiRequestComponent.getHttpHeaders(parameters);
+        logger.info("紫金httpHeaders:{}", JSON.toJSONString(httpHeaders));
         // 获取影像信息
         List<UploadImageInfoListRequest.ItemFileDataListDTO> itemFileDataListDTOS = uploadFile(insuranceUploadImageVo, ziJinApiOrder, httpHeaders);
+        logger.info("紫金uploadFile拼接的返回结果为:{}", JSON.toJSONString(itemFileDataListDTOS));
         // 文件信息与订单关联
         UploadImageInfoListRequest uploadImageInfoListRequest = new UploadImageInfoListRequest(itemFileDataListDTOS,
                 ziJinApiOrder.getOrderId());
         BaseResponse baseResponse = ziJinApiRequestComponent.uploadImageInfoList(uploadImageInfoListRequest, httpHeaders);
+        logger.info("紫金uploadImageInfoList文件信息与订单关联接口,结果为:{}", JSON.toJSONString(baseResponse));
     }
 
     @Override
     public void queryClauseData(ClauseDataVo clauseDataVo) {
+        logger.info("紫金queryClauseData参数为:{}", JSON.toJSONString(clauseDataVo));
         // 获取订单信息
         OrderBase orderBase = clauseDataVo.getOrder();
         ZiJinApiOrder ziJinApiOrder = ziJinOrderService.getById(orderBase.getOrdersNo());
@@ -181,6 +222,7 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
                 .getAttributionInformationVo()
                 .getConfigInfo());
         HttpHeaders httpHeaders = ziJinApiRequestComponent.getHttpHeaders(parameters);
+        logger.info("紫金httpHeaders:{}", JSON.toJSONString(httpHeaders));
         // 2 查询特约
         QueryClauseDataRequest queryClauseDataRequest = new QueryClauseDataRequest();
         queryClauseDataRequest.setOrderId(ziJinApiOrder.getOrderId());
@@ -189,6 +231,7 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
             queryClauseDataRequest.setRiskCode(RiskCodeEnum.RC_0590.getCode());
             QueryClauseDataResponse queryClauseDataResponse = ziJinApiRequestComponent.queryClauseData(queryClauseDataRequest,
                     httpHeaders);
+            logger.info("紫金queryClauseData特约查询接口1,结果为:{}", JSON.toJSONString(queryClauseDataResponse));
             System.out.println(queryClauseDataResponse);
 //            List<QueryClauseDataResponse.ClauseInfoDtoListDTO> clauseInfoDtoList = queryClauseDataResponse.getClauseInfoDtoList();
 //            for (QueryClauseDataResponse.ClauseInfoDtoListDTO clauseInfoDtoListDTO : clauseInfoDtoList) {
@@ -209,6 +252,7 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
             queryClauseDataRequest.setRiskCode(RiskCodeEnum.RC_050A.getCode());
             QueryClauseDataResponse queryClauseDataResponse = ziJinApiRequestComponent.queryClauseData(queryClauseDataRequest,
                     httpHeaders);
+            logger.info("紫金queryClauseData特约查询接口2,结果为:{}", JSON.toJSONString(queryClauseDataResponse));
 //            List<QueryClauseDataResponse.ClauseInfoDtoListDTO> clauseInfoDtoList = queryClauseDataResponse.getClauseInfoDtoList();
 //            for (QueryClauseDataResponse.ClauseInfoDtoListDTO clauseInfoDtoListDTO : clauseInfoDtoList) {
 //                InsCompanyClause clause = new InsCompanyClause();
@@ -257,6 +301,7 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
                         UploadFileRequest uploadImageRequest = new UploadFileRequest(imageBase64, imageVo.getImageCode(), ziJinApiOrder.getOrderNo());
                         // 文件上传
                         UploadFileResponse uploadFileResponse = ziJinApiRequestComponent.uploadFile(uploadImageRequest, httpHeaders);
+                        logger.info("紫金/uploadFile文件上传接口,结果为:{}", JSON.toJSONString(uploadFileResponse));
                         // 文件信息与订单关联 itemFileDataList
                         UploadImageInfoListRequest.ItemFileDataListDTO itemFileDataListDTO =
                                 new UploadImageInfoListRequest.ItemFileDataListDTO(uploadImageRequest, uploadFileResponse.getFileId());

+ 49 - 14
tenant/organization/src/main/java/com/jzg/organization/controller/AgreementController.java

@@ -77,14 +77,22 @@ public class AgreementController extends BaseController {
     @Operation(summary = "协议添加")
     @PostMapping("/agreementAdd")
     public HttpResult agreementAdd(@Validated @RequestBody AgreementAddParam param) {
-
-        boolean nameExists = agreementService.isExistsName(param.getAgreementTitle(), null, 0);
-        AssertionUtils.isFail(nameExists,"协议名称重复!");
         LocalDateTime startDate = param.getStartDate();
         LocalDateTime endDate = param.getEndDate();
+        // 1. 时间合法性校验
         if(endDate.isBefore(startDate) || startDate.isEqual(endDate)){
             AssertionUtils.isFail(false,"协议生效时间不能大于失效时间!");
         }
+        // 2. 通用名称+时间查重(内部=0)
+        boolean nameExists = agreementService.checkNameExistsWithDate(
+                param.getAgreementTitle(),
+                null,        // 新增传 null
+                0,           // 内部协议
+                startDate
+        );
+        AssertionUtils.isFail(nameExists,"协议名称已存在,请输入其他名称");
+
+        // 3. 执行新增
         agreementService.agreementAdd(param);
         return HttpResult.ok("新增成功");
     }
@@ -98,14 +106,22 @@ public class AgreementController extends BaseController {
     @Operation(summary = "协议修改")
     @PostMapping("/agreementEdit")
     public HttpResult agreementEdit(@Validated @RequestBody AgreementEditParam param) {
-
-        boolean nameExists = agreementService.isExistsName(param.getAgreementTitle(), param.getId(), 0);
-        AssertionUtils.isFail(nameExists,"协议名称重复!");
         LocalDateTime startDate = param.getStartDate();
         LocalDateTime endDate = param.getEndDate();
+        // 1. 时间合法性校验
         if(endDate.isBefore(startDate) || startDate.isEqual(endDate)){
             AssertionUtils.isFail(false,"协议生效时间不能大于失效时间!");
         }
+        // 2. 通用名称+时间查重(内部=0,编辑排除自身)
+        boolean nameExists = agreementService.checkNameExistsWithDate(
+                param.getAgreementTitle(),
+                param.getId(), // 修改传自身ID
+                0,             // 内部协议
+                startDate
+        );
+        AssertionUtils.isFail(nameExists,"协议名称已存在,请输入其他名称");
+
+        // 3. 执行修改
         agreementService.agreementEdit(param);
         return HttpResult.ok("修改成功");
     }
@@ -205,14 +221,23 @@ public class AgreementController extends BaseController {
     @Operation(summary = "外部协议添加")
     @PostMapping("/contactAdd")
     public HttpResult contactAdd(@Validated @RequestBody AgreementContactAddParam param) {
-
-        boolean nameExists = agreementService.isExistsName(param.getAgreementTitle(), null,1);
-        AssertionUtils.isFail(nameExists,"协议名称重复!");
         LocalDateTime startDate = param.getStartDate();
         LocalDateTime endDate = param.getEndDate();
+        // 1. 时间合法性校验
         if(endDate.isBefore(startDate) || startDate.isEqual(endDate)){
-            AssertionUtils.isFail(nameExists,"协议生效时间不能大于失效时间!");
+            AssertionUtils.isFail(false,"协议生效时间不能大于失效时间!");
         }
+
+        // 2. 名称+时间双重查重(外部=1)
+        boolean nameExists = agreementService.checkNameExistsWithDate(
+                param.getAgreementTitle(),
+                null,        // 新增传null
+                1,           // 外部协议
+                startDate
+        );
+        AssertionUtils.isFail(nameExists,"协议名称已存在,请输入其他名称");
+
+        // 3. 执行保存
         agreementService.contactAdd(param);
         return HttpResult.ok("新增成功");
     }
@@ -226,14 +251,24 @@ public class AgreementController extends BaseController {
     @Operation(summary = "外部协议修改")
     @PostMapping("/contactEdit")
     public HttpResult contactEdit(@Validated @RequestBody AgreementContactEditParam param) {
-
-        boolean nameExists = agreementService.isExistsName(param.getAgreementTitle(), param.getId(),1);
-        AssertionUtils.isFail(nameExists,"协议名称重复!");
         LocalDateTime startDate = param.getStartDate();
         LocalDateTime endDate = param.getEndDate();
+
+        // 1. 时间合法性校验
         if(endDate.isBefore(startDate) || startDate.isEqual(endDate)){
-            AssertionUtils.isFail(nameExists,"协议生效时间不能大于失效时间!");
+            AssertionUtils.isFail(false,"协议生效时间不能大于失效时间!");
         }
+
+        // 2. 名称+时间双重查重(外部=1,编辑排除自身)
+        boolean nameExists = agreementService.checkNameExistsWithDate(
+                param.getAgreementTitle(),
+                param.getId(), // 编辑传自身ID
+                1,            // 外部协议
+                startDate
+        );
+        AssertionUtils.isFail(nameExists,"协议名称已存在,请输入其他名称");
+
+        // 3. 执行修改
         agreementService.contactEdit(param);
         return HttpResult.ok("修改成功");
     }

+ 8 - 1
tenant/organization/src/main/java/com/jzg/organization/controller/SysDistributionSettingController.java

@@ -2,6 +2,7 @@ package com.jzg.organization.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.po.SysDistributionSettingVO;
 import com.jzg.commons.entity.vo.*;
 import com.jzg.organization.service.SysDistributionSettingService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -20,8 +21,14 @@ public class SysDistributionSettingController {
     @Resource
     private SysDistributionSettingService sysDistributionSettingService;
 
+    /**
+     * 查询租户的分销设置
+     *
+     * @author lipf
+     * @date 2026/4/23 17:38
+     */
     @GetMapping("/getSettingBySystemCode")
-    public HttpResult getSettingBySystemCode(){
+    public HttpResult<SysDistributionSettingVO> getSettingBySystemCode(){
         return sysDistributionSettingService.getSettingBySystemCode();
     }
 

+ 11 - 0
tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementService.java

@@ -11,6 +11,7 @@ import com.jzg.commons.entity.vo.AgreementUserVo;
 import com.jzg.commons.entity.vo.AgreementVo;
 import com.jzg.commons.entity.vo.UpAndDownVo;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 
@@ -59,6 +60,16 @@ public interface PtlAgreementService extends IService<PtlAgreement> {
      */
     boolean isExistsName(String agreementTitle, String id, int isExternal);
 
+    /**
+     * 通用:协议名称+有效期查重(支持新增/修改、内部/外部)
+     * @param agreementTitle 协议名称
+     * @param id 协议id(新增传null,修改传当前id)
+     * @param isExternal 内外标识 0内部 1外部
+     * @param newStartDate 新的生效时间
+     * @return true=重复不可用,false=可用
+     */
+    boolean checkNameExistsWithDate(String agreementTitle, String id, Integer isExternal, LocalDateTime newStartDate);
+
     /**
      * 协议新增
      * @param param

+ 8 - 1
tenant/organization/src/main/java/com/jzg/organization/service/SysDistributionSettingService.java

@@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.po.SysDistributionSetting;
+import com.jzg.commons.entity.po.SysDistributionSettingVO;
 import com.jzg.commons.entity.vo.*;
 
 import java.util.List;
 
 public interface SysDistributionSettingService extends IService<SysDistributionSetting> {
 
-    HttpResult getSettingBySystemCode();
+    /**
+     * 查询租户的分销设置
+     *
+     * @author lipf
+     * @date 2026/4/23 17:38
+     */
+    HttpResult<SysDistributionSettingVO> getSettingBySystemCode();
 
     HttpResult saveSetting(SysDistributionSettingVo sysDistributionSettingVo);
 

+ 37 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementServiceImpl.java

@@ -189,6 +189,43 @@ public class PtlAgreementServiceImpl extends ServiceImpl<PtlAgreementMapper, Ptl
         return count > 0;
     }
 
+    /**
+     * 通用:协议名称+有效期查重(支持新增/修改、内部/外部)
+     * @param agreementTitle 协议名称
+     * @param id 协议id(新增传null,修改传当前id)
+     * @param isExternal 内外标识 0内部 1外部
+     * @param newStartDate 新的生效时间
+     * @return true=重复不可用,false=可用
+     */
+    @Override
+    public boolean checkNameExistsWithDate(String agreementTitle, String id, Integer isExternal, LocalDateTime newStartDate) {
+        // 1. 构造查询条件:同名称、同类型、未删除
+        LambdaQueryWrapper<PtlAgreement> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(PtlAgreement::getAgreementTitle, agreementTitle)
+                .eq(PtlAgreement::getIsExternal, isExternal)
+                .eq(PtlAgreement::getIsDelete, 0);
+
+        // 2. 编辑时:排除自身ID
+        if (StringUtils.isNotNull(id)) {
+            wrapper.ne(PtlAgreement::getId, id);
+        }
+
+        // 只查一条,性能最优
+        wrapper.last("LIMIT 1");
+        PtlAgreement existAgreement = this.getOne(wrapper);
+
+        // 无重名 → 直接可用
+        if (existAgreement == null) {
+            return false;
+        }
+
+        // 3. 有重名 → 判断时间是否冲突
+        // 已存在止期 >= 新的起期 → 冲突(不可用)
+        LocalDateTime existEndDate = existAgreement.getEndDate();
+        return !existEndDate.isBefore(newStartDate);
+    }
+
+
     @Override
     @GlobalTransactional(rollbackFor = Exception.class)
     public void agreementAdd(AgreementAddParam param) {

+ 5 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysDistributionSettingServiceImpl.java

@@ -66,7 +66,7 @@ public class SysDistributionSettingServiceImpl extends ServiceImpl<SysDistributi
     @Resource
     private QuoteClient quoteClient;
 
-    public HttpResult getSettingBySystemCode() {
+    public HttpResult<SysDistributionSettingVO> getSettingBySystemCode() {
         SysDistributionSetting sysDistributionSetting = sysDistributionSettingMapper
                 .selectOne(new LambdaQueryWrapper<SysDistributionSetting>().eq(SysDistributionSetting::getSystemCode, baseController.getUserSystemCode()));
         if (sysDistributionSetting == null) {
@@ -75,7 +75,10 @@ public class SysDistributionSettingServiceImpl extends ServiceImpl<SysDistributi
         }
         List<SysDept> sysDeptList = sysDeptService.list(new LambdaQueryWrapper<SysDept>().eq(SysDept::getIsDistribution, "0").eq(SysDept::getSystemCode, baseController.getUserSystemCode()));
         sysDistributionSetting.setExcludeDept(sysDeptList);
-        return HttpResult.ok(sysDistributionSetting);
+        SysDistributionSettingVO vo = new SysDistributionSettingVO();
+        BeanUtils.copyProperties(sysDistributionSetting, vo);
+        vo.setId(String.valueOf(sysDistributionSetting.getId()));
+        return HttpResult.ok(vo);
     }
 
     @Override

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

@@ -32,9 +32,7 @@
         platform_prod.sys_organization_user_link a
         join platform_prod.sys_organization b on
         a.organization_id = b.id
-        WHERE
-        user_id = #{userId,jdbcType=VARCHAR}
-        and b.system_code = #{systemCode,jdbcType=VARCHAR}
+        WHERE user_id = #{userId,jdbcType=DECIMAL}
     </select>
 
 </mapper>