Bläddra i källkod

区域业绩管理

haoyu 2 år sedan
förälder
incheckning
62af8ac0d4

+ 31 - 1
src/main/java/com/ydtech/modules/admin/controller/SysUserController.java

@@ -15,6 +15,7 @@ import com.ydtech.modules.admin.constants.RoleConstants;
 import com.ydtech.modules.admin.model.*;
 import com.ydtech.modules.admin.model.dto.AgentUserDto;
 import com.ydtech.modules.admin.model.dto.QuTeamNumDto;
+import com.ydtech.modules.admin.model.dto.QuUserNumDto;
 import com.ydtech.modules.admin.model.dto.SysUserDto;
 import com.ydtech.modules.admin.model.vo.*;
 import com.ydtech.modules.admin.service.*;
@@ -277,6 +278,15 @@ public class SysUserController extends BaseController {
         return HttpResult.ok(sysUserService.findByReferrerId(deptId));
     }
 
+    /**
+     * 根据部门id查询后线人员的所有人信息
+     */
+    @ApiOperation(value = "获取后线人员信息")
+    @GetMapping("/findBackListByDeptId")
+    public HttpResult findBackListByDeptId(String deptId) {
+        return HttpResult.ok(sysUserService.findBackListByDeptId(deptId));
+    }
+
     /**
      * 根据部门id查询该部门的所有人信息
      */
@@ -499,7 +509,6 @@ public class SysUserController extends BaseController {
     public HttpResult getAllUsers(@RequestParam(required = false) String userId) {
         List<SysUser> userList = sysUserService.findAllAgentRoleUser(userId, "20");
         return HttpResult.ok(userList);
-
     }
 
     @ApiOperation(value = "(new)是否绑定微信")
@@ -699,4 +708,25 @@ public class SysUserController extends BaseController {
     public HttpResult findUserList(String deptId) {
         return HttpResult.ok(sysUserService.findUserList(deptId));
     }
+
+
+    @ApiOperation(value = "获取树结构")
+    @GetMapping(value = "/findTree")
+    public HttpResult<List<SysUser>> findTree() {
+        List<SysUser> list = sysUserService.findTree();
+        return HttpResult.ok(list);
+    }
+
+    @ApiOperation(value = "区域数据管理")
+    @PostMapping(value = "/quUserNum")
+    public HttpResult quUserNum(@RequestBody QuUserNumDto quUserNumDto) {
+        return HttpResult.ok("", sysUserService.quUserNum(quUserNumDto));
+    }
+
+    @ApiOperation(value = "区域数据管理详情")
+    @PostMapping(value = "/quUserNumDetail")
+    public HttpResult quUserNumDetail(@RequestBody QuUserNumDto quUserNumDto) {
+        return HttpResult.ok("", sysUserService.getQuUserByCompany(quUserNumDto));
+    }
+
 }

+ 55 - 0
src/main/java/com/ydtech/modules/admin/model/QuUserNum.java

@@ -0,0 +1,55 @@
+package com.ydtech.modules.admin.model;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class QuUserNum {
+
+    @ApiModelProperty(value = "成员名称")
+    private String userName;
+
+    @ApiModelProperty(value = "成员ID")
+    private String userId;
+
+    @ApiModelProperty(value = "订单状态")
+    private String orderStatus;
+
+    @ApiModelProperty(value = "保险公司编号")
+    private String companyId;
+
+    @ApiModelProperty(value = "保险公司名称")
+    private String insCompany;
+
+    @ApiModelProperty(value = "该订单状态下次数")
+    private String count;
+
+    @ApiModelProperty(value = "报价次数")
+    private String quoteNum;
+
+    @ApiModelProperty(value = "提交核保次数")
+    private String submitNum;
+
+    @ApiModelProperty(value = "已承保数量")
+    private String hasInsuredNum;
+
+    @ApiModelProperty(value = "总承保保费总数")
+    private String totalSumpremium;
+
+    @ApiModelProperty(value = "交强险费用")
+    private String jqPremiumSum;
+
+    @ApiModelProperty(value = "商业险费用")
+    private String syPremiumSum;
+
+    @ApiModelProperty(value = "车船税")
+    private String taxaMountSum;
+
+    @ApiModelProperty(value = "省市区")
+    private String areaCode;
+
+    @ApiModelProperty(value = "省市区名称")
+    private String areaName;
+
+}

+ 47 - 0
src/main/java/com/ydtech/modules/admin/model/dto/QuUserNumDto.java

@@ -0,0 +1,47 @@
+package com.ydtech.modules.admin.model.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.util.List;
+
+
+@Data
+public class QuUserNumDto {
+
+    @ApiModelProperty(value = "成员名称")
+    private String userName;
+
+    @ApiModelProperty(value = "成员ID")
+    private String userId;
+
+    @ApiModelProperty(value = "创建时间开始")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate createTimeStart;
+
+    @ApiModelProperty(value = "创建时间结束")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate createTimeEnd;
+
+    @ApiModelProperty(value = "省市区")
+    private String areaCode;
+
+    @ApiModelProperty(value = "省市区等级")
+    private String level;
+
+    @ApiModelProperty(value = "分组条件")
+    private Integer grouping;
+
+    @ApiModelProperty(value = "下属ID")
+    private List<String> userIds;
+
+    @TableField(exist = false)
+    private int pageNo;
+
+    @TableField(exist = false)
+    private int pageSize;
+
+}

+ 248 - 4
src/main/java/com/ydtech/modules/admin/service/impl/SysUserServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ydtech.constants.SysConstants;
@@ -15,11 +16,9 @@ import com.ydtech.modules.admin.constants.RoleConstants;
 import com.ydtech.modules.admin.dao.SysUserMapper;
 import com.ydtech.modules.admin.model.*;
 import com.ydtech.modules.admin.model.dto.QuTeamNumDto;
+import com.ydtech.modules.admin.model.dto.QuUserNumDto;
 import com.ydtech.modules.admin.model.dto.SysUserDto;
-import com.ydtech.modules.admin.model.vo.SysUser2Vo;
-import com.ydtech.modules.admin.model.vo.SysUserBaseVO;
-import com.ydtech.modules.admin.model.vo.SysUserInternalVO;
-import com.ydtech.modules.admin.model.vo.SysUserVO;
+import com.ydtech.modules.admin.model.vo.*;
 import com.ydtech.modules.admin.service.*;
 import com.ydtech.modules.base.model.dto.PageDto;
 import com.ydtech.modules.base.model.vo.PageVo;
@@ -66,6 +65,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Autowired
     private EsmUserImageService esmUserImageService;
 
+    @Autowired
+    private SysAreaService sysAreaService;
 
     @Override
     public IPage<SysUserBaseVO> findUserList(PageDto<SysUserDto> pageDto) {
@@ -700,6 +701,249 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         lqw.eq(SysUser::getDeptId, deptId);
         return list(lqw);
     }
+
+    @Override
+    public List<SysUser> findTree() {
+        //获取所有被领导的人ID
+        List<SysUser> list1 = lambdaQuery().isNotNull(SysUser::getLeaderId).list();
+        List<String> collect1 = list1.stream().map(SysUser::getLeaderId).collect(Collectors.toList());
+
+        List<SysUser> sysUsers = new ArrayList<>();
+        List<SysUser> list2 = lambdaQuery().in(SysUser::getId, collect1).list();
+        for (SysUser sysUser : list2) {
+            if (Objects.isNull(sysUser.getLeaderId())) {
+                sysUsers.add(sysUser);
+            }
+        }
+        for (SysUser sysUser : sysUsers) {
+            List<SysUser> chils = new ArrayList<>();
+            for (SysUser user : list2) {
+                if (sysUser.getId().equals(user.getLeaderId())) {
+                    chils.add(user);
+                }
+            }
+            sysUser.setChildren(chils);
+        }
+        return sysUsers;
+    }
+
+
+
+    /**
+     * 根据部门ID查询后台用户列表。
+     *
+     * @param deptId 部门ID,用于筛选指定部门的用户。
+     * @return 返回一个SysUser类型的列表,包含指定部门的所有后台用户。
+     */
+    @Override
+    public List<SysUser> findBackListByDeptId(String deptId) {
+        return baseMapper.findBackListByDeptId(deptId);
+    }
+
+
+    /**
+     * 查询用户订单数量进行区域统计信息
+     *
+     * @param quUserNumDto 包含查询条件和分页信息的数据传输对象
+     * @return IPage<QuUserNum> 返回用户数量统计信息的分页对象
+     */
+    @Override
+    public IPage<QuUserNum> quUserNum(QuUserNumDto quUserNumDto) {
+
+        //获取所有用户
+        List<SysUser> users = list();
+
+        // 根据用户ID查询一级下屬
+        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysUser::getId, quUserNumDto.getUserId());
+        List<SysUser> usersLevel1 = list(queryWrapper);
+
+        //递归获取1级下属下所有的下属ID
+        List<String> strIds = new ArrayList<>();
+        findChildren(usersLevel1, users, strIds);
+
+        // 根据区域编码和级别查询符合条件的区域
+        LambdaQueryWrapper<SysArea> wrapper = new LambdaQueryWrapper<>();
+        if (quUserNumDto.getAreaCode() != null && !"".equals(quUserNumDto.getAreaCode())) {
+            String area = quUserNumDto.getAreaCode();
+            switch (quUserNumDto.getLevel()) {
+                case "1": { // 省级查询逻辑
+                    quUserNumDto.setGrouping(4);
+                    String prefix = area.substring(0, 2);
+                    strIds.removeIf(id -> !id.contains("99" + prefix));
+                    quUserNumDto.setLevel("2");
+                    wrapper.eq(SysArea::getLevel, "2");
+                    wrapper.likeRight(SysArea::getAreaCode, prefix);
+                    break;
+                }
+                case "2": {  // 市级查询逻辑
+                    quUserNumDto.setGrouping(6);
+                    String prefix = area.substring(0, 4);
+                    strIds.removeIf(id -> !id.contains("99" + prefix));
+                    quUserNumDto.setLevel("3");
+                    wrapper.eq(SysArea::getLevel, "3");
+                    wrapper.likeRight(SysArea::getAreaCode, prefix);
+                    break;
+                }
+                case "3": {  // 区县级查询逻辑
+                    quUserNumDto.setGrouping(6);
+                    String prefix = area.substring(0, 6);
+                    strIds.removeIf(id -> !id.contains("99" + prefix));
+                    quUserNumDto.setLevel("3");
+                    wrapper.eq(SysArea::getLevel, "3");
+                    wrapper.likeRight(SysArea::getAreaCode, prefix);
+                    break;
+                }
+            }
+        } else { // 默认查询省级区域
+            quUserNumDto.setGrouping(2);
+            quUserNumDto.setLevel("1");
+            wrapper.eq(SysArea::getLevel, "1");
+        }
+
+        // 如果没有查询到用户ID,则直接返回空的分页对象
+        if (strIds.size() == 0) {
+            return new Page<>();
+        }
+
+        // 根据查询条件获取用户数量统计信息
+        quUserNumDto.setUserIds(strIds);
+        List<QuUserNum> userNums = sysUserMapper.getUserNum(quUserNumDto);
+
+        //遍历匹配区域名称
+        List<SysArea> areaList = sysAreaService.list(wrapper);
+
+        // 根据区域名称匹配用户数量统计信息,并构造最终返回的结果列表
+        List<QuUserNum> quUserNums = new ArrayList<>();
+        for (QuUserNum quUserNum : userNums) {
+            for (SysArea sysArea : areaList) {
+                if (!Objects.isNull(sysArea.getAreaCode())) {
+                    // 匹配区域名称
+                    String substring = sysArea.getAreaCode().substring(0, quUserNumDto.getGrouping());
+                    if (quUserNum.getAreaCode().equals(substring)) {
+                        quUserNum.setAreaName(sysArea.getAreaCname());
+                        quUserNums.add(quUserNum);
+                    }
+                }
+            }
+        }
+
+        // 为每个区域生成未匹配到的统计信息
+        for (SysArea sysArea : areaList) {
+            if (exists(quUserNums, sysArea)) {
+                QuUserNum userNum = new QuUserNum();
+                // 设置未匹配到的区域的默认统计信
+                userNum.setAreaName(sysArea.getAreaCname());
+                userNum.setQuoteNum("0");
+                userNum.setSubmitNum("0");
+                userNum.setHasInsuredNum("0");
+                userNum.setTotalSumpremium("0");
+                userNum.setJqPremiumSum("0");
+                userNum.setSyPremiumSum("0");
+                userNum.setTaxaMountSum("0");
+                quUserNums.add(userNum);
+            }
+        }
+
+        // 构造返回的分页对象
+        IPage<QuUserNum> recordsPage = new Page<>(quUserNumDto.getPageNo(), quUserNumDto.getPageSize());
+        recordsPage.setRecords(quUserNums);
+        recordsPage.setTotal(quUserNums.size());
+        return recordsPage;
+    }
+
+
+
+
+    /**
+     * 查询用户订单数量进行区域统计详细信息
+     *
+     * @param quUserNumDto 包含查询条件和分页信息的数据传输对象
+     * @return IPage<QuUserNum> 返回用户数量统计信息的分页对象
+     */
+    @Override
+    public IPage<QuUserNum> getQuUserByCompany(QuUserNumDto quUserNumDto) {
+
+        // 获取系统中的所有用户
+        List<SysUser> users = list();
+
+        // 创建查询包装器,用于查询指定用户ID的用
+        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysUser::getId, quUserNumDto.getUserId());
+        // 查询指定用户ID的用户,即第一级下属
+        List<SysUser> usersLevel1 = list(queryWrapper);
+
+        // 用于存储所有下属的ID
+        List<String> strIds = new ArrayList<>();
+        // 递归获取第一级下属及其所有下属的ID
+        findChildren(usersLevel1, users, strIds);
+
+        // 如果未指定区域码,返回空分页对
+        if (Objects.isNull(quUserNumDto.getAreaCode())) {
+            return new Page<>();
+        }
+
+        // 根据区域码筛选有效的下属ID
+        strIds.removeIf(id -> !id.contains("99" + quUserNumDto.getAreaCode()));
+
+        // 如果筛选后没有有效的下属ID,返回空分页对象
+        if (strIds.size() == 0) {
+            return new Page<>();
+        }
+
+        // 设置查询条件中的用户ID列表
+        quUserNumDto.setUserIds(strIds);
+
+        // 根据公司和用户ID列表查询用户数量统计信息
+        List<QuUserNum> deptByCompany = sysUserMapper.getUserByCompany(quUserNumDto);
+
+        // 创建并设置分页信息
+        IPage<QuUserNum> page = new Page<>(quUserNumDto.getPageNo(), quUserNumDto.getPageSize());
+        page.setRecords(deptByCompany);
+        page.setTotal(deptByCompany.size());
+        return page;
+    }
+
+
+
+    private void findChildren(List<SysUser> SysUsers, List<SysUser> users, List<String> strIds) {
+        for (SysUser sysUser : SysUsers) {
+            List<SysUser> children = new ArrayList<>();
+            for (SysUser user : users) {
+                if (sysUser.getId() != null && sysUser.getId().equals(user.getLeaderId())) {
+                    if (!exists(children, user)) {
+                        children.add(user);
+                        strIds.add(user.getId());
+                    }
+                }
+            }
+            sysUser.setChildren(children);
+//            children.sort((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()));
+            findChildren(children, users, strIds);
+        }
+    }
+
+    private boolean exists(List<QuUserNum> quUserNums, SysArea sysArea) {
+        boolean exist = true;
+        for (QuUserNum quUserNum1 : quUserNums) {
+            if (quUserNum1.getAreaName().equals(sysArea.getAreaCname())) {
+                exist = false;
+                break;
+            }
+        }
+        return exist;
+    }
+    private boolean exists(List<SysUser> sysUsers, SysUser sysUser) {
+        boolean exist = false;
+        for (SysUser user : sysUsers) {
+            if (user.getId().equals(sysUser.getId())) {
+                exist = true;
+            }
+        }
+        return exist;
+    }
+
+
 }
 
 

+ 57 - 0
src/main/resources/mapper/modules/admin/SysUserMapper.xml

@@ -376,4 +376,61 @@
             and su.id != #{sysUser.id}
         </if>
     </select>
+    <select id="getUserNum" resultType="com.ydtech.modules.admin.model.QuUserNum">
+        SELECT
+        SUBSTRING(io.userid, 3, #{quUserNumDto.grouping}) AS areacode,
+        COUNT(*) AS quoteNum,
+        SUM(CASE WHEN iac.orderstatus = 2 THEN 1 ELSE 0 END + CASE WHEN iac.orderstatus = 1 THEN 1 ELSE 0 END) AS submitNum,
+        SUM(CASE WHEN iac.orderstatus = 3 THEN 1 ELSE 0 END) AS hasInsuredNum,
+        SUM(CASE WHEN iac.orderstatus = 3 THEN iac.jqpremium ELSE 0 END) AS jqpremiumsum,
+        SUM(CASE WHEN iac.orderstatus = 3 THEN iac.sypremium ELSE 0 END) AS sypremiumsum,
+        SUM(CASE WHEN iac.orderstatus = 3 THEN iac.taxamount ELSE 0 END) AS taxamountsum,
+        SUM(CASE WHEN iac.orderstatus = 3 THEN iac.jqpremium ELSE 0 END + CASE WHEN iac.orderstatus = 3 THEN iac.sypremium ELSE 0 END) AS totalSumpremium
+        FROM
+        ins_orders io
+        RIGHT JOIN ins_area_company iac ON iac.orderno = io.orderno
+        WHERE
+        iac.orderstatus IN ( 1, 2, 3 )
+        <if test="quUserNumDto.createTimeStart != null">
+            and io.createtime &gt;= #{quUserNumDto.createTimeStart}
+        </if>
+        <if test="quUserNumDto.createTimeEnd != null">
+            and io.createtime &lt;= #{quUserNumDto.createTimeEnd}
+        </if>
+        <if test="quUserNumDto.userIds != null">
+            and io.userid IN
+            <foreach collection="quUserNumDto.userIds" item="id" index="index" open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+        </if>
+        GROUP BY
+        SUBSTRING(io.userid, 3, #{quUserNumDto.grouping})
+    </select>
+
+    <select id="getUserByCompany" resultType="com.ydtech.modules.admin.model.QuUserNum">
+        SELECT
+        iac.company_id as companyId,
+        iac.inscompany as insCompany,
+        COUNT(*) AS quoteNum,
+        SUM(CASE WHEN iac.orderstatus = 2 THEN 1 ELSE 0 END + CASE WHEN iac.orderstatus = 1 THEN 1 ELSE 0 END) AS submitNum,
+        SUM(CASE WHEN iac.orderstatus = 3 THEN 1 ELSE 0 END) AS hasInsuredNum,
+        SUM(CASE WHEN iac.orderstatus = 3 THEN iac.jqpremium ELSE 0 END) AS jqpremiumsum,
+        SUM(CASE WHEN iac.orderstatus = 3 THEN iac.sypremium ELSE 0 END) AS sypremiumsum,
+        SUM(CASE WHEN iac.orderstatus = 3 THEN iac.taxamount ELSE 0 END) AS taxamountsum,
+        SUM(CASE WHEN iac.orderstatus = 3 THEN iac.jqpremium ELSE 0 END + CASE WHEN iac.orderstatus = 3 THEN iac.sypremium ELSE 0 END) AS totalSumpremium
+        FROM
+        ins_orders io
+        RIGHT JOIN ins_area_company iac ON iac.orderno = io.orderno
+        WHERE
+        iac.orderstatus IN ( 1, 2, 3 )
+        <if test="quUserNumDto.userIds != null">
+            and io.userid IN
+            <foreach collection="quUserNumDto.userIds" item="id" index="index" open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+        </if>
+        GROUP BY
+        iac.company_id,
+        iac.inscompany
+    </select>
 </mapper>