Kaynağa Gözat

解决冲突

lipf 4 ay önce
ebeveyn
işleme
5d67c6a5c5
19 değiştirilmiş dosya ile 563 ekleme ve 61 silme
  1. 1 0
      commons/src/main/java/com/jzg/commons/core/base/BaseController.java
  2. 24 0
      commons/src/main/java/com/jzg/commons/entity/Constant.java
  3. 30 1
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java
  4. 73 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/IncomeDataVO.java
  5. 3 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/ReceivableQueryVo.java
  6. 24 0
      commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfoSalesmanBO.java
  7. 8 1
      platform/src/main/java/com/jzg/controller/UserRoleController.java
  8. 3 1
      platform/src/main/java/com/jzg/service/impl/UserRoleServiceImpl.java
  9. 2 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  10. 1 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  11. 14 2
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  12. 8 2
      tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java
  13. 13 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoSalesmanMapper.java
  14. 9 0
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  15. 9 0
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoSalesmanService.java
  16. 206 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  17. 35 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoSalesmanServiceImpl.java
  18. 80 51
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml
  19. 20 0
      tenant/organization/src/main/resources/mapper/SysUserJzgInfoSalesmanMapper.xml

+ 1 - 0
commons/src/main/java/com/jzg/commons/core/base/BaseController.java

@@ -115,6 +115,7 @@ public class BaseController {
 
         List<String> userPerms = new ArrayList<>();
         String userJsonStr = redissonClient.getBucket(authorizationHeader).get().toString();
+        log.info("获取平台权限:authorizationHeader=[{}],userJsonStr=[{}]",authorizationHeader, userJsonStr);
         JSONObject userInfo = JSONObject.parseObject(userJsonStr);
         JSONArray auths = userInfo.getJSONArray("auths");
         auths.forEach(auth->{

+ 24 - 0
commons/src/main/java/com/jzg/commons/entity/Constant.java

@@ -0,0 +1,24 @@
+package com.jzg.commons.entity;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 常量池
+ * @author lipf
+ * @date 2026/5/13 14:37
+ */
+public class Constant {
+
+
+    public static final Map<String, String> ywyAttrTypeMap = new HashMap<>();
+
+    static {
+        ywyAttrTypeMap.put("5","团队");
+        ywyAttrTypeMap.put("6","个代");
+        ywyAttrTypeMap.put("7","渠道");
+        ywyAttrTypeMap.put("8","电销");
+    }
+
+
+}

+ 30 - 1
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java

@@ -53,6 +53,14 @@ public class InsPlyIncome extends BaseModel {
     @ExcelProperty("签单时间")
     private String signingTime;
 
+    @Schema(description = "签单年份")
+    @TableField(exist = false)
+    private String signYear;
+
+    @Schema(description = "签单日期 yyyy-mm-dd 格式")
+    @TableField(exist = false)
+    private String signDate;
+
     @Schema(description = "保司ID")
     @ExcelProperty("保司ID")
     private String companyId;
@@ -243,4 +251,25 @@ public class InsPlyIncome extends BaseModel {
     @Schema(description = "订单类型")
     @ExcelProperty("订单类型")
     private String orderType;
-}
+
+    @TableField(exist = false)
+    @Schema(description = "订单类型(code)")
+    private String entryStatus;
+
+    @TableField(exist = false)
+    @Schema(description = "业务员类型 团队/渠道/电销/个代 5:团队 6:个代 7:渠道 8 :电销")
+    private String typeAttr;
+
+    @TableField(exist = false)
+    @Schema(description = "业务员类型 团队/渠道/电销/个代 5:团队 6:个代 7:渠道 8 :电销")
+    private String typeAttrName;
+
+    @TableField(exist = false)
+    @Schema(description = "实际签单用户手机号2")
+    private String realQuoteUserId;
+
+    @TableField(exist = false)
+    @Schema(description = "实际签单用户手机号")
+    private String realQuoteUserName;
+
+}

+ 73 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/IncomeDataVO.java

@@ -0,0 +1,73 @@
+package com.jzg.commons.entity.finance.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ * @author lipf
+ * @date 2026/5/12 14:16
+ */
+@Data
+public class IncomeDataVO implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -3396833203930686221L;
+
+    /**
+     * 订单号
+     */
+    private List<String> orderNos;
+
+    /**
+     * 保险公司的id
+     */
+    private String companyId;
+
+    /**
+     * 具体的查询条件
+     */
+    private List<SearchVO> searchList;
+
+    /**
+     * 逻辑判断
+     * and 并且
+     * or 或者
+     */
+    private String logicJudge;
+
+
+    @Data
+    public static class SearchVO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 6474246099964388105L;
+
+        public static final String companyId = "companyId";
+        public static final String signDate = "signDate";
+        public static final String ptlAgreement = "ptlAgreement";
+        public static final String orderType = "orderType";
+        public static final String signYear = "signYear";
+
+        /**
+         * 查询条件
+         * companyId: 表示保险公司(序号)
+         * signDate: 表示签单日期(yyyy-mm-dd)
+         * ptlAgreement: 表示出单协议
+         * orderType: 表示订单类型 (车险订单,补录订单, 代客录单), 传对应的字典码即可
+         * signYear: 表示签单年份
+         */
+        private String name;
+        /**
+         * 查询条件的操作符号
+         */
+        private String type;
+
+        /**
+         * 条件值1
+         */
+        private String search;
+
+    }
+}

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

@@ -107,5 +107,8 @@ public class ReceivableQueryVo extends PageRequest {
     @Schema(description = "增加类型")
     private String addType;
 
+    @Schema(description = "业务员类型 团队/渠道/电销/个代 5:团队 6:个代 7:渠道 8 :电销")
+    private String typeAttr;
+
 
 }

+ 24 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfoSalesmanBO.java

@@ -0,0 +1,24 @@
+package com.jzg.commons.entity.po;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+@Data
+public class SysUserJzgInfoSalesmanBO extends SysUserJzgInfoSalesman implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 4445597727858843519L;
+
+
+    /**
+     * 租户代码
+     */
+    private String systemCode;
+
+    /**
+     * 用户登录手机号
+     */
+    private String userName;
+}

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

@@ -1,5 +1,6 @@
 package com.jzg.controller;
 
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.jzg.commons.aop.OperatorTrajectory;
 import com.jzg.commons.constants.OperationTypeEnum;
@@ -14,6 +15,8 @@ import com.jzg.mapper.SysRoleMapper;
 import com.jzg.service.UserRoleService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -28,6 +31,8 @@ import java.util.Objects;
 @RequestMapping("/userRole")
 public class UserRoleController extends BaseController {
 
+    private static final Logger log = LoggerFactory.getLogger(UserRoleController.class);
+
     @Autowired
     UserRoleService userRoleService;
 
@@ -67,7 +72,8 @@ public class UserRoleController extends BaseController {
     @OperatorTrajectory(moduleName = "组织架构/角色管理/修改角色",OperationDict = OperationTypeEnum.UPDATE, mapperClass = SysRoleMapper.class,type = "U",entityClass = SysRoleVo.class )
     @Operation(summary = "角色修改")
     @PostMapping("/roleUpdate")
-    public HttpResult roleUpdate(@Validated @RequestBody SysRoleVo sysRoleVo){
+    public HttpResult<String> roleUpdate(@Validated @RequestBody SysRoleVo sysRoleVo){
+        log.info("修改角色信息:sysRoleVo=[{}]", JSONUtil.toJsonStr(sysRoleVo));
         //如果不是平台则校验数据权限
         if(!getUserSystemCode().equals(SystemConstants.SYSTEM_PLATFORM.getCode())){
             //从用户信息中获取租户code
@@ -78,6 +84,7 @@ public class UserRoleController extends BaseController {
             }
         }
         if(userRoleService.isExist(sysRoleVo.getName(),sysRoleVo.getId())){
+            log.info("角色名称已存在,请修改后重新提交。sysRoleVo.getName()=[{}],sysRoleVo.getId()=[{}]",sysRoleVo.getName(),sysRoleVo.getId());
             throw new ValidateException("角色名称已存在,请修改后重新提交");
         }
         return userRoleService.roleUpdate(sysRoleVo)? HttpResult.ok("修改角色成功") : HttpResult.error("修改角色失败");

+ 3 - 1
platform/src/main/java/com/jzg/service/impl/UserRoleServiceImpl.java

@@ -1,5 +1,6 @@
 package com.jzg.service.impl;
 
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.annotation.IgnoreTenant;
@@ -142,6 +143,8 @@ public class UserRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> imp
     @Transactional
     @Override
     public boolean roleUpdate(SysRoleVo sysRoleVo) {
+        String systemCOde = baseController.getUserSystemCode();
+        log.info("修改角色信息:sysRoleVo=[{}],systemCode=[{}]", JSONUtil.toJsonStr(sysRoleVo),systemCOde);
         SysRole sysRole = sysRoleVo.getSysRole();
         List<SysRolePerms> sysRolePermsList = new ArrayList<>();
         sysRoleVo.getPerms().forEach(item->{
@@ -161,7 +164,6 @@ public class UserRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> imp
                .eq(SysRoleDataScope::getRoleId,sysRole.getId()));
         sysRoleDataScopeLinkMapper.delete(new LambdaQueryWrapper<SysRoleDataScopeLink>()
               .eq(SysRoleDataScopeLink::getRoleId,sysRole.getId()));
-
         //保存角色数据权限  如果是平台则直接跳过
         if(!baseController.getUserSystemCode().equals(SystemConstants.SYSTEM_PLATFORM.getCode())) {
             SysRoleDataScope sysRoleDataScope = new SysRoleDataScope();

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

@@ -283,6 +283,8 @@ public class UnifyOrderManager {
                 costs.setVvTax(formatPremium(costs.getVvTax()));               // 车船税
                 costs.setSumPremium(formatPremium(costs.getSumPremium()));     // 总保费
             }
+            quoteResultsVo.setCiRiskInfoVo(quoteVo.getCiRiskInfoVo());
+            quoteResultsVo.setBiRiskInfoVo(quoteVo.getBiRiskInfoVo());
             quoteResultsVo.setQuoteStatus(quoteResultsVo.getQuoteStatusEnum().getCode());
             quoteResultsVo.setOrdersNo(ordersNo);
             // 报价后更新订单

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

@@ -1043,7 +1043,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         insOrders.setCompanyName(companyName);
         insOrders.setProductId(quoteVo.getOrder().getProductId());
         insOrders.setProductName(ProductsType.getProductNameByCode(quoteVo.getOrder().getProductId()));
-        // 如果和报价人和登录人 不一致则判断为代课录单
+        // 如果和报价人和登录人 不一致则判断为代客录单
         if (!baseController.getUserName().equals(quoteVo.getOrder().getRealQuoteUserId())) {
             insOrders.setEntryStatus(2);
         } else {

+ 14 - 2
tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java

@@ -79,6 +79,18 @@ public class ReceivableController {
         return HttpResult.ok(receivableService.getReceivablePage(receivableQueryVo));
     }
 
+    /**
+     *
+     * @author lipf
+     * @date 2026/5/12 14:15
+     */
+    @Operation(summary = "应收数据二次过滤")
+    //@PostMapping("/income/queryIncomeDatas")
+    @PostMapping("getSelectedReceivableList")
+    public HttpResult<List<InsPlyIncome>> queryIncomeDatas(@RequestBody IncomeDataVO incomeDataVO){
+        return receivableService.queryIncomeDatas(incomeDataVO);
+    }
+
     @PostMapping("getOtherReceivableList")
     @Operation(summary = "获取私有协议跟单费列表")
     public HttpResult getOtherReceivableList(@RequestBody ReceivableQueryVo receivableQueryVo){
@@ -103,7 +115,7 @@ public class ReceivableController {
         return HttpResult.ok(receivableService.getReceivablePage(receivableQueryVo));
     }
 
-    @PostMapping("getSelectedReceivableList")
+    //@PostMapping("getSelectedReceivableList")
     @Operation(summary = "获取选中应收列表")
     public HttpResult getSelectedReceivableList(@RequestBody ReceivableQueryVo receivableQueryVo){
         return HttpResult.ok(receivableService.getReceivableList(receivableQueryVo));
@@ -235,7 +247,7 @@ public class ReceivableController {
 
     @PostMapping("/invoiceRecord")
     @Operation(summary = "获取开票记录")
-    public HttpResult getInvoiceRecord(@RequestBody InvoiceRecordQueryVo invoiceRecordQueryVo){
+    public HttpResult<Page<InvoiceRecordResult>> getInvoiceRecord(@RequestBody InvoiceRecordQueryVo invoiceRecordQueryVo){
         return HttpResult.ok(receivableService.getInvoiceRecordList(invoiceRecordQueryVo));
     }
 //    @PostMapping("batchModify")

+ 8 - 2
tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java

@@ -3,7 +3,6 @@ package com.jzg.organization.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.entity.finance.dto.*;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.entity.finance.po.InsPlyIncome;
 import com.jzg.commons.entity.finance.vo.InvoiceRecordQueryVo;
 import com.jzg.commons.entity.finance.vo.InvoiceRecordResult;
@@ -15,7 +14,6 @@ import com.jzg.commons.entity.po.EsmInsCompany;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
-import java.math.BigDecimal;
 import java.util.List;
 
 @Mapper
@@ -46,6 +44,14 @@ public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
      */
     Page<InsPlyIncome> getReceivablePage(Page page,@Param("receivableQueryVo") ReceivableQueryVo receivableQueryVo);
 
+    /**
+     *
+     * @author lipf
+     * @date 2026/5/12 14:50
+     */
+    List<InsPlyIncome> queryIncomeDatasByOrderIds(@Param("orderNos") List<String> orderNos,
+                                                  @Param("companyId") String companyId);
+
     List<InsPlyIncome> getReceivableList(@Param("receivableQueryVo") ReceivableQueryVo receivableQueryVo);
 
     /**

+ 13 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoSalesmanMapper.java

@@ -2,8 +2,21 @@ package com.jzg.organization.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.jzg.commons.entity.po.SysUserJzgInfoSalesman;
+import com.jzg.commons.entity.po.SysUserJzgInfoSalesmanBO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 @Mapper
 public interface SysUserJzgInfoSalesmanMapper extends BaseMapper<SysUserJzgInfoSalesman> {
+
+    /**
+     * 查询指定租户下业务员的岗位信息
+     *
+     * @param systemCode 租户信息
+     * @author lipf
+     * @date 2026/5/13 11:13
+     */
+    List<SysUserJzgInfoSalesmanBO> queryYwyTypeAttrInfo(@Param("systemCode") String systemCode);
 }

+ 9 - 0
tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java

@@ -2,6 +2,7 @@ package com.jzg.organization.service;
 
 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.finance.dto.*;
 import com.jzg.commons.entity.finance.po.InsPlyIncome;
 import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceSettlement;
@@ -283,4 +284,12 @@ public interface ReceivableService extends IService<InsPlyIncome> {
      */
     void restockInsPlyIncome(InsOrderAdjust insOrderAdjust);
 
+    /**
+     * 应收数据二次过滤
+     *
+     * @param incomeDataVO 过滤条件
+     * @author lipf
+     * @date 2026/5/12 14:22
+     */
+    HttpResult<List<InsPlyIncome>> queryIncomeDatas(IncomeDataVO incomeDataVO);
 }

+ 9 - 0
tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoSalesmanService.java

@@ -15,4 +15,13 @@ public interface SysUserJzgInfoSalesmanService extends IService<SysUserJzgInfoSa
      * @date 2026/4/24 11:32
      */
     Map<String, String> queryAllTypeAttrMap();
+
+    /**
+     * 查询业务员的身份信息
+     *
+     * @return Map<String, String> key 表示sys_user 表的username, value 标识多个岗位的标识
+     * @author lipf
+     * @date 2026/5/13 11:05
+     */
+    Map<String, String> queryYwyTypeAttrMap();
 }

+ 206 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -3,6 +3,7 @@ package com.jzg.organization.service.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.nacos.common.utils.CollectionUtils;
@@ -13,6 +14,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.Constant;
 import com.jzg.commons.entity.finance.dto.*;
 import com.jzg.commons.entity.finance.po.*;
 import com.jzg.commons.entity.finance.vo.*;
@@ -33,6 +35,7 @@ import com.jzg.organization.excel.listener.ReceivbleExcelListener;
 import com.jzg.organization.excel.listener.SuperviseExcelListener;
 import com.jzg.organization.mapper.*;
 import com.jzg.organization.service.ReceivableService;
+import com.jzg.organization.service.SysUserJzgInfoSalesmanService;
 import org.redisson.api.RBucket;
 import org.redisson.api.RKeys;
 import org.redisson.api.RedissonClient;
@@ -61,6 +64,7 @@ import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.function.BiConsumer;
 import java.util.function.Function;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 /**
@@ -102,6 +106,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
     @Autowired
     private ExportBaseServiceImpl exportBaseService;
+    @Autowired
+    private SysUserJzgInfoSalesmanService sysUserJzgInfoSalesmanService;
 
     @Value("${upload.file.path}")
     private String uploadPath;
@@ -170,7 +176,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
      */
     @Override
     public Page<InsPlyIncome> getReceivablePage(ReceivableQueryVo receivableQueryVo) {
-        log.info("获取私有协议手续费列表。receivableQueryVo=[{}]", JSONUtil.toJsonStr(receivableQueryVo));
+        log.info("获取私有协议手续费应收列表。receivableQueryVo=[{}]", JSONUtil.toJsonStr(receivableQueryVo));
         Page<InsPlyIncome> page = baseMapper.getReceivablePage(receivableQueryVo.getPage(), receivableQueryVo);
         List<InsPlyIncome> records = page.getRecords();
         records = this.fillOtherInfo(records);
@@ -178,6 +184,200 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         return page;
     }
 
+    /**
+     * 应收数据二次过滤
+     *
+     * @param incomeDataVO 过滤条件
+     * @author lipf
+     * @date 2026/5/12 14:22
+     */
+    @Override
+    public HttpResult<List<InsPlyIncome>> queryIncomeDatas(IncomeDataVO incomeDataVO) {
+        log.info("应收数据的二次过滤:incomeDataVO=[{}]", JSONUtil.toJsonStr(incomeDataVO));
+        List<String> orderNos = incomeDataVO.getOrderNos();
+        String companyId = incomeDataVO.getCompanyId();
+//        if(CollUtil.isEmpty(orderNos)){
+//            log.info("应收数据的二次过滤: 订单号不能为空");
+//            return HttpResult.error("请勾选要处理的订单信息");
+//        }
+//        if (StrUtil.isEmpty(companyId)) {
+//            log.info("应收数据的二次过滤. 保司不能为空");
+//            return HttpResult.error("保司不能为空");
+//        }
+//        if(!"and".equalsIgnoreCase(incomeDataVO.getLogicJudge()) && "20".equalsIgnoreCase(incomeDataVO.getLogicJudge())){
+//            log.info("应收数据的二次过滤. 逻辑条件必须是and或or");
+//            return HttpResult.error("逻辑条件必须是and或or");
+//        }
+        List<InsPlyIncome> incomes =  baseMapper.queryIncomeDatasByOrderIds(orderNos,companyId);
+        log.info("根据订单号和保司id查询出[{}]条记录。 orderNos =[{}],companyId=[{}]",CollUtil.size(incomes), JSONUtil.toJsonStr(orderNos), companyId);
+        List<InsPlyIncome> filterIncomes = new ArrayList<>();
+        if(CollUtil.isEmpty(incomeDataVO.getSearchList())){
+            filterIncomes = incomes;
+        }else{
+            List<IncomeDataVO.SearchVO> searchParams = incomeDataVO.getSearchList();
+            if(CollUtil.isNotEmpty(searchParams)){
+                Map<String, IncomeDataVO.SearchVO> searchVOMap = searchParams.stream()
+                        .filter(action -> StrUtil.isNotEmpty(action.getName()))
+                        .collect(Collectors.toMap(IncomeDataVO.SearchVO::getName, Function.identity(), (ole_item, new_item) -> ole_item));
+                Set<String> names =searchVOMap.keySet();
+
+                // 保险公司
+                Predicate<InsPlyIncome> companyIdPredicate = insPlyIncome -> {
+                    if(!names.contains(IncomeDataVO.SearchVO.companyId)){
+                        return true;
+                    }
+                    IncomeDataVO.SearchVO searchVO = searchVOMap.get(IncomeDataVO.SearchVO.companyId);
+                    String type = searchVO.getType();
+                    String search = searchVO.getSearch();
+                    if("为空".equals(type)|| "不为空".equals(type)){
+                        return true;
+                    }
+                    // 如果填写的查询条件,不完善,则该条件不进行过滤
+                    if(StrUtil.isEmpty(search)){
+                        return true;
+                    }
+                    if("等于".equalsIgnoreCase(type) || "包含".equalsIgnoreCase(type)){
+                        List<String> companyIds = Arrays.asList(search.split(","));
+                        return companyIds.contains(insPlyIncome.getCompanyId());
+                    }
+                    if("不等于".equalsIgnoreCase(type) || "不包含".equalsIgnoreCase(type)){
+                        List<String> companyIds = Arrays.asList(search.split(","));
+                        return !companyIds.contains(insPlyIncome.getCompanyId());
+                    }
+                    return true;
+                };
+                // 签单时间
+                Predicate<InsPlyIncome> signDatePredicate = insPlyIncome -> {
+                    String signingTime = insPlyIncome.getSigningTime();
+                    if(StrUtil.isEmpty(signingTime)){
+                        // 签单时间如果为空,说明是数据问题 先返回去,让业务去处理
+                        return true;
+                    }
+                    if(!names.contains(IncomeDataVO.SearchVO.signDate)){
+                        return true;
+                    }
+                    IncomeDataVO.SearchVO searchVO = searchVOMap.get(IncomeDataVO.SearchVO.signDate);
+                    String type = searchVO.getType();
+                    String search = searchVO.getSearch();
+                    if("为空".equals(type)|| "不为空".equals(type)){
+                        return true;
+                    }
+                    // 如果填写的查询条件,不完善,则该条件不进行过滤
+                    if(StrUtil.isEmpty(search)){
+                        return true;
+                    }
+                    if(StrUtil.isEmpty(insPlyIncome.getSignDate())){
+                        return true;
+                    }
+                    String[] split = search.split(",");
+                    String signDateStart = split.length>=1 && StrUtil.isNotEmpty(split[0]) ? split[0].substring(0,10):"";
+                    String signDateEnd = split.length>=2 && StrUtil.isNotEmpty(split[1]) ? split[1].substring(0,10):"";
+                    if("大于等于".equals(type)){
+                        return insPlyIncome.getSignDate().compareTo(signDateStart) >=0;
+                    }
+                    if("小于等于".equals(type)){
+                        return insPlyIncome.getSignDate().compareTo(signDateEnd) <=0;
+                    }
+                    if("固定范围".equals(type)){
+                        return insPlyIncome.getSignDate().compareTo(signDateStart) >=0 && insPlyIncome.getSignDate().compareTo(signDateEnd) <=0;
+                    }
+                    if("不在固定范围".equals(type)){
+                        return insPlyIncome.getSignDate().compareTo(signDateStart) <0 || insPlyIncome.getSignDate().compareTo(signDateEnd) > 0;
+                    }
+                    return true;
+                };
+                // 出单协议
+                Predicate<InsPlyIncome> ptlAgreementPredicate = insPlyIncome -> {
+                    if(!names.contains(IncomeDataVO.SearchVO.ptlAgreement)){
+                        return true;
+                    }
+                    IncomeDataVO.SearchVO searchVO = searchVOMap.get(IncomeDataVO.SearchVO.ptlAgreement);
+                    String type = searchVO.getType();
+                    String search = searchVO.getSearch();
+                    if("为空".equals(type)|| "不为空".equals(type)){
+                        return true;
+                    }
+                    // 如果填写的查询条件,不完善,则该条件不进行过滤
+                    if(StrUtil.isEmpty(search)){
+                        return true;
+                    }
+                    if("等于".equalsIgnoreCase(type) || "包含".equalsIgnoreCase(type)){
+                        List<String> ptlAgrements = Arrays.asList(search.split(","));
+                        return ptlAgrements.contains(insPlyIncome.getAgreementId());
+                    }
+                    if("不等于".equalsIgnoreCase(type) || "不包含".equalsIgnoreCase(type)){
+                        List<String> ptlAgrements = Arrays.asList(search.split(","));
+                        return !ptlAgrements.contains(insPlyIncome.getAgreementId());
+                    }
+                    return true;
+                };
+
+                // 订单类型 entryStatus/orderType
+                Predicate<InsPlyIncome> orderTypePredicate = insPlyIncome -> {
+                    if(!names.contains(IncomeDataVO.SearchVO.orderType)){
+                        return true;
+                    }
+                    IncomeDataVO.SearchVO searchVO = searchVOMap.get(IncomeDataVO.SearchVO.orderType);
+                    String type = searchVO.getType();
+                    String search = searchVO.getSearch();
+                    if("为空".equals(type)|| "不为空".equals(type)){
+                        return true;
+                    }
+                    // 如果填写的查询条件,不完善,则该条件不进行过滤
+                    if(StrUtil.isEmpty(search)){
+                        return true;
+                    }
+                    if("等于".equalsIgnoreCase(type) || "包含".equalsIgnoreCase(type)){
+                        List<String> entryStatus = Arrays.asList(search.split(","));
+                        return entryStatus.contains(insPlyIncome.getEntryStatus());
+                    }
+                    if("不等于".equalsIgnoreCase(type) || "不包含".equalsIgnoreCase(type)){
+                        List<String> entryStatus = Arrays.asList(search.split(","));
+                        return !entryStatus.contains(insPlyIncome.getEntryStatus());
+                    }
+                    return true;
+                };
+
+                // 签单年份
+                Predicate<InsPlyIncome> signYearPredicate = insPlyIncome ->{
+                    if(!names.contains(IncomeDataVO.SearchVO.signYear)){
+                        return true;
+                    }
+                    IncomeDataVO.SearchVO searchVO = searchVOMap.get(IncomeDataVO.SearchVO.signYear);
+                    String type = searchVO.getType();
+                    String search = searchVO.getSearch();
+                    if("为空".equals(type)|| "不为空".equals(type)){
+                        return true;
+                    }
+                    // 如果填写的查询条件,不完善,则该条件不进行过滤
+                    if(StrUtil.isEmpty(search)){
+                        return true;
+                    }
+                    if("等于".equalsIgnoreCase(type) || "包含".equalsIgnoreCase(type)){
+                        List<String> signYears = Arrays.asList(search.split(","));
+                        return signYears.contains(insPlyIncome.getSignYear());
+                    }
+                    if("不等于".equalsIgnoreCase(type) || "不包含".equalsIgnoreCase(type)){
+                        List<String> signYears = Arrays.asList(search.split(","));
+                        return !signYears.contains(insPlyIncome.getSigningTime());
+                    }
+                    return true;
+                };
+                if("and".equalsIgnoreCase(incomeDataVO.getLogicJudge())){
+                    Predicate<InsPlyIncome> and = companyIdPredicate.and(signDatePredicate).and(ptlAgreementPredicate).and(orderTypePredicate).and(signYearPredicate);
+                    filterIncomes = incomes.stream().filter(and).toList();
+                }else if ("or".equalsIgnoreCase(incomeDataVO.getLogicJudge())){
+                    Predicate<InsPlyIncome> or = companyIdPredicate.or(signDatePredicate).or(ptlAgreementPredicate).or(orderTypePredicate).or(signYearPredicate);
+                    filterIncomes = incomes.stream().filter(or).toList();
+                }
+            }
+        }
+
+        filterIncomes = this.fillOtherInfo(filterIncomes);
+        return HttpResult.ok(filterIncomes);
+    }
+
+
 
     /**
      * 填充必要的字段
@@ -187,6 +387,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
      */
     List<InsPlyIncome> fillOtherInfo(List<InsPlyIncome> records){
         if(CollUtil.isNotEmpty(records)){
+            Map<String, String> typeAttrMaps = sysUserJzgInfoSalesmanService.queryYwyTypeAttrMap();
             records.forEach(insPlyIncome -> {
                 if("0".equals(insPlyIncome.getSettlementStatus())){
                     insPlyIncome.setSettlementStatusName("未结算");
@@ -195,8 +396,11 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 }else{
                     insPlyIncome.setSettlementStatusName(insPlyIncome.getSettlementStatus());
                 }
+                String typeAttr = typeAttrMaps.getOrDefault(Objects.toString(insPlyIncome.getRealQuoteUserName(),""),"");
+                String typeAttrName = Constant.ywyAttrTypeMap.get(typeAttr);
+                insPlyIncome.setTypeAttr(typeAttr);
+                insPlyIncome.setTypeAttrName(typeAttrName);
             });
-
         }
         return records;
     }

+ 35 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoSalesmanServiceImpl.java

@@ -4,7 +4,9 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.entity.Constant;
 import com.jzg.commons.entity.po.SysUserJzgInfoSalesman;
+import com.jzg.commons.entity.po.SysUserJzgInfoSalesmanBO;
 import com.jzg.organization.mapper.SysUserJzgInfoSalesmanMapper;
 import com.jzg.organization.service.SysUserJzgInfoSalesmanService;
 import org.slf4j.Logger;
@@ -12,8 +14,11 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.io.Serial;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -57,4 +62,34 @@ public class SysUserJzgInfoSalesmanServiceImpl extends ServiceImpl<SysUserJzgInf
         log.info("按照jzg_info表的序号进行划分后。数据个数[{}]", CollectionUtil.size(resultMap));
         return resultMap;
     }
+
+    /**
+     * 查询业务员的身份信息
+     *
+     * @return Map<String, String> key 表示sys_user 表的username, value 标识多个岗位的标识
+     * @author lipf
+     * @date 2026/5/13 11:05
+     */
+    @Override
+    public Map<String, String> queryYwyTypeAttrMap() {
+        String systemCode = baseController.getSystemCode();
+        Set<String> attrTypes = Set.of("5", "6", "7","8");
+        List<SysUserJzgInfoSalesmanBO> sysUserJzgInfoSalesmen = sysUserJzgInfoSalesmanMapper.queryYwyTypeAttrInfo(systemCode);
+        log.info("查询出[{}]个业务员的类型信息。systemCode=[{}]", CollectionUtil.size(sysUserJzgInfoSalesmen), systemCode);
+        Map<String, String> resultMap = sysUserJzgInfoSalesmen.stream()
+                .filter(action-> StrUtil.isNotEmpty(action.getSysUserJzgInfoId()) && StrUtil.isNotEmpty(action.getTypeAttr()))
+                .filter(action-> action.getSysUserJzgInfoId() != null && action.getTypeAttr() != null)
+                .filter(action-> StrUtil.isNotEmpty(action.getUserName()))
+                .filter(action-> Constant.ywyAttrTypeMap.containsKey(action.getTypeAttr()))
+                .collect(Collectors.toMap(
+                        // 1. Key 映射:先获取 String,再转为 Long
+                        SysUserJzgInfoSalesmanBO::getUserName,
+                        // 2. Value 映射:直接获取 typeAttr
+                        SysUserJzgInfoSalesmanBO::getTypeAttr,
+                        // 3. 合并策略:遇到重复 Key,将 value 用逗号拼接
+                        (existingValue, newValue) -> existingValue + "," + newValue
+                ));
+        log.info("按照sys_user表的username进行划分后。数据个数[{}]", CollectionUtil.size(resultMap));
+        return resultMap;
+    }
 }

+ 80 - 51
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -197,59 +197,88 @@
         </if>
     </select>
 
-    <select id="getReceivablePage" resultType="com.jzg.commons.entity.finance.po.InsPlyIncome">
+    <sql id="query">
         SELECT
-            io.signing_time,
-            ipi.id,
-            io.id as 'orderNo',
-            io.company_name,
-            ipi.dept_name,
-            ipi.agreement_name,
-            io.product_name,
-            CASE io.entry_status
-            WHEN 1 THEN '车险出单'
-            WHEN 2 THEN '代客录单'
-            WHEN 3 THEN '补录订单'
-            ELSE '未知状态'
-            END AS order_type,
-            ipi.license_no,
-            (ipi.jq_receivable_premium + ipi.sy_receivable_premium + ipi.jy_receivable_premium) as receivableAmount,  -- 总应收金额
-            (ipi.jq_supervise_costs_premiums + ipi.sy_supervise_costs_premiums + ipi.jy_supervise_costs_premiums) as superviseCostsPremiums, -- 总应收手续费
-            (ipi.jq_other_costs_premiums + ipi.sy_other_costs_premiums + ipi.jy_other_costs_premiums) as otherCostsPremiums,  -- 总应收跟单费
-            io.product_name,
-            iocui.name AS insuredPerson,
-            ipi.jq_premium,
-            ipi.sy_premium,
-            ipi.jy_premium,
-            ipi.tax_premium,
-            ipi.jq_supervise_costs_proportion,
-            ipi.sy_supervise_costs_proportion,
-            ipi.jy_supervise_costs_proportion,
-            ipi.jq_other_costs_proportion,
-            ipi.sy_other_costs_proportion,
-            ipi.jy_other_costs_proportion,
-            ipi.business_source,
-            ipi.settlement_status,
-            ipi.add_type,
-            ior1.start_date as jq_start_date,
-            ior2.start_date as sy_start_date,
-            io.product_name AS productName,
-            iop.jq_policy_no, -- 交强保单号
-            iop.sy_policy_no, -- 商业保单号
-            iop.jy_policy_no, -- 非车险保单号
-            io.company_name,
-            io.create_time,
-            io.docking_person
-
+        io.real_quote_user_id,
+        io.real_quote_user_id as real_quote_user_name,
+        io.signing_time,
+        date(io.signing_time ) as sign_date,
+        year(io.signing_time) as sign_year,
+        ipi.id,
+        io.id as 'orderNo',
+        io.company_name,
+        ipi.dept_name,
+        ipi.agreement_name,
+        ipi.agreement_id,
+        io.product_name,
+        io.entry_status,
+        CASE io.entry_status
+        WHEN 1 THEN '车险出单'
+        WHEN 2 THEN '代客录单'
+        WHEN 3 THEN '补录订单'
+        ELSE '未知状态'
+        END AS order_type,
+        ipi.license_no,
+        (ipi.jq_receivable_premium + ipi.sy_receivable_premium + ipi.jy_receivable_premium) as receivableAmount,  -- 总应收金额
+        (ipi.jq_supervise_costs_premiums + ipi.sy_supervise_costs_premiums + ipi.jy_supervise_costs_premiums) as superviseCostsPremiums, -- 总应收手续费
+        (ipi.jq_other_costs_premiums + ipi.sy_other_costs_premiums + ipi.jy_other_costs_premiums) as otherCostsPremiums,  -- 总应收跟单费
+        io.product_name,
+        iocui.name AS insuredPerson,
+        ipi.jq_premium,
+        ipi.sy_premium,
+        ipi.jy_premium,
+        ipi.tax_premium,
+        ipi.jq_supervise_costs_proportion,
+        ipi.sy_supervise_costs_proportion,
+        ipi.jy_supervise_costs_proportion,
+        ipi.jq_other_costs_proportion,
+        ipi.sy_other_costs_proportion,
+        ipi.jy_other_costs_proportion,
+        ipi.business_source,
+        ipi.settlement_status,
+        ipi.add_type,
+        ior1.start_date as jq_start_date,
+        ior2.start_date as sy_start_date,
+        io.product_name AS productName,
+        iop.jq_policy_no, -- 交强保单号
+        iop.sy_policy_no, -- 商业保单号
+        iop.jy_policy_no, -- 非车险保单号
+        io.company_name,
+        io.company_id,
+        io.create_time,
+        io.docking_person
         FROM
-            ins_ply_income ipi
-            LEFT JOIN ins_orders io ON ipi.order_no = io.id
-            LEFT JOIN ins_orders_car_user_info iocui ON ipi.order_no = iocui.order_no and iocui.policy_person_type = '3'
-            LEFT JOIN ins_orders_risk ior1 ON ipi.order_no = ior1.order_no and ior1.risk_code = '0507'
-            LEFT JOIN ins_orders_risk ior2 ON ipi.order_no = ior2.order_no and ior2.risk_code = '0510'
-            LEFT JOIN ins_orders_policy iop ON ipi.order_no = iop.order_no
-        WHERE 1=1
+        ins_ply_income ipi
+        LEFT JOIN ins_orders io ON ipi.order_no = io.id
+        LEFT JOIN ins_orders_car_user_info iocui ON ipi.order_no = iocui.order_no and iocui.policy_person_type = '3'
+        LEFT JOIN ins_orders_risk ior1 ON ipi.order_no = ior1.order_no and ior1.risk_code = '0507'
+        LEFT JOIN ins_orders_risk ior2 ON ipi.order_no = ior2.order_no and ior2.risk_code = '0510'
+        LEFT JOIN ins_orders_policy iop ON ipi.order_no = iop.order_no
+        WHERE 1=1 and ipi.settlement_status = '0'
         AND NOT EXISTS ( SELECT 1 FROM ins_ply_income_invoice_link ipil WHERE ipil.income_id = ipi.id )
+    </sql>
+
+    <!--根据保司id和订单号进行过滤 2026年5月12日15:06:40  lipf  -->
+    <select id="queryIncomeDatasByOrderIds" resultType="com.jzg.commons.entity.finance.po.InsPlyIncome">
+        <include refid="query"/>
+        <if test="companyId != null and companyId != ''">
+            and io.company_id = #{companyId}
+        </if>
+        <if test="orderNos != null and orderNos.size() > 0">
+            and io.id in
+            <foreach collection="orderNos" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+    </select>
+    
+    <select id="getReceivablePage" resultType="com.jzg.commons.entity.finance.po.InsPlyIncome">
+        <include refid="query"/>
+        <if test="receivableQueryVo.typeAttr != null and receivableQueryVo.typeAttr != ''">
+            and io.real_quote_user_id  in (select su.username  from sys_user_jzg_info_salesman sujis left join sys_user_jzg_info suji on sujis.sys_user_jzg_info_id = suji.id
+            left join sys_user su on su.id = suji.user_id
+            where sujis.type_attr =#{receivableQueryVo.typeAttr})
+        </if>
         <if test = "receivableQueryVo.agreementType != null and receivableQueryVo.agreementType == 1">
             AND ipi.agreement_type = #{receivableQueryVo.agreementType}
         </if>
@@ -1006,7 +1035,7 @@
             sum( ipiis.actual_received_amount ) AS actual_received_amount,
             CASE
                 WHEN ipii.receivable_supervise_premium = SUM( ipiis.actual_received_amount ) THEN
-                    '已结清' ELSE '未结清'
+                    '已结清' ELSE '已开票未结算'
                 END AS settlement_status
         FROM
             ins_ply_income_invoice ipii

+ 20 - 0
tenant/organization/src/main/resources/mapper/SysUserJzgInfoSalesmanMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jzg.organization.mapper.SysUserJzgInfoSalesmanMapper">
+
+    <!-- 查询指定租户下业务员的岗位信息 lipf 2026年5月13日11:16:58-->
+    <select id="queryYwyTypeAttrInfo" resultType="com.jzg.commons.entity.po.SysUserJzgInfoSalesmanBO">
+        select
+        su.username,
+        suji.system_code ,
+        sujis.*
+        from
+        sys_user_jzg_info_salesman sujis
+        left join sys_user_jzg_info suji on
+        sujis.sys_user_jzg_info_id = suji.id
+        left join sys_user su on
+        suji.user_id = su.id
+        where su.username  is not null
+        and suji.system_code  = #{systemCode}
+    </select>
+</mapper>