Browse Source

1、调整云联重粉小程序更换会员归属业务逻辑
2、更改查询标签业务逻辑
3、新增查询有会员信息的项目接口
4、调整标签项目查询会员接口业务逻辑
5、确定更换会员归属业务逻辑接口调整

yfh 3 ngày trước cách đây
mục cha
commit
8c3a0fb765
16 tập tin đã thay đổi với 297 bổ sung25 xóa
  1. 23 10
      fs-company-app/src/main/java/com/fs/app/controller/CompanyTagController.java
  2. 85 15
      fs-company-app/src/main/java/com/fs/app/controller/CompanyUserController.java
  3. 12 0
      fs-company-app/src/main/java/com/fs/app/param/CompanyUserChangeApplyParam.java
  4. 24 0
      fs-company-app/src/main/java/com/fs/app/param/TagProjectParam.java
  5. 2 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyTagMapper.java
  6. 2 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyTagUserMapper.java
  7. 2 0
      fs-service-system/src/main/java/com/fs/company/service/ICompanyTagService.java
  8. 8 0
      fs-service-system/src/main/java/com/fs/company/service/ICompanyTagUserService.java
  9. 10 0
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanyTagServiceImpl.java
  10. 21 0
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanyTagUserServiceImpl.java
  11. 3 0
      fs-service-system/src/main/java/com/fs/store/mapper/FsUserCompanyUserMapper.java
  12. 8 0
      fs-service-system/src/main/java/com/fs/store/service/IFsUserCompanyUserService.java
  13. 13 0
      fs-service-system/src/main/java/com/fs/store/service/impl/FsUserCompanyUserServiceImpl.java
  14. 32 0
      fs-service-system/src/main/resources/mapper/company/CompanyTagMapper.xml
  15. 32 0
      fs-service-system/src/main/resources/mapper/company/CompanyTagUserMapper.xml
  16. 20 0
      fs-service-system/src/main/resources/mapper/store/FsUserCompanyUserMapper.xml

+ 23 - 10
fs-company-app/src/main/java/com/fs/app/controller/CompanyTagController.java

@@ -3,6 +3,7 @@ package com.fs.app.controller;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.app.annotation.Login;
+import com.fs.app.param.TagProjectParam;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.StringUtils;
@@ -15,6 +16,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.HashMap;
@@ -39,8 +41,9 @@ public class CompanyTagController extends AppBaseController {
     @ApiOperation("查询公司标签列表")
     public R list(@RequestParam(required = false) String keyword,
                   @RequestParam(required = false, defaultValue = "1") Integer pageNum,
-                  @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
-        log.debug("查询公司标签列表 keyword: {}, pageNum: {}, pageSize: {}", keyword, pageNum, pageSize);
+                  @RequestParam(required = false, defaultValue = "10") Integer pageSize,
+                  @RequestParam(required = false) Long companyUserId) {
+        log.debug("查询公司标签列表 keyword: {}, pageNum: {}, pageSize: {}", keyword, pageNum, pageSize,companyUserId);
 
         Map<String, Object> params = new HashMap<>();
         params.put("companyId", getCompanyId());
@@ -49,8 +52,15 @@ public class CompanyTagController extends AppBaseController {
         }
 
         PageHelper.startPage(pageNum, pageSize);
-        List<CompanyTag> list = companyTagService.selectCompanyTagListByMap(params);
-        return R.ok().put("data", new PageInfo<>(list));
+        if (ObjectUtil.isNotEmpty(companyUserId)){
+            params.put("companyUserId",companyUserId);
+            List<CompanyTag> list = companyTagService.selectCompanyTagByList(params);
+            return R.ok().put("data", new PageInfo<>(list));
+        }else {
+            List<CompanyTag> list = companyTagService.selectCompanyTagListByMap(params);
+            return R.ok().put("data", new PageInfo<>(list));
+        }
+
     }
 
     /**
@@ -79,16 +89,19 @@ public class CompanyTagController extends AppBaseController {
     }
 
     @Login
-    @GetMapping("/tagSubUsers")
+    @PostMapping("/tagSubUsers")
     @ApiOperation("标签下会员列表")
-    public R tagSubUsers(@RequestParam(required = false) List<Long> tagId,Long companyUserId) {
+    public R tagSubUsers(@RequestBody TagProjectParam tagProjectParam) {
         Map<String, Object> params = new HashMap<>();
-        params.put("tagIds", tagId);
-        if (ObjectUtil.isEmpty(companyUserId)){
+        params.put("tagIds", tagProjectParam.getTagIds());
+        if (CollectionUtils.isNotEmpty(tagProjectParam.getProjectIds())){
+            params.put("projectIds", tagProjectParam.getProjectIds());
+        }
+        if (ObjectUtil.isEmpty(tagProjectParam.getCompanyUserId())){
             params.put("companyUserId", getCompanyUserId());
         }else {
-            params.put("companyUserId", companyUserId);
+            params.put("companyUserId", tagProjectParam.getCompanyUserId());
         }
-        return R.ok().put("data", companyTagUserService.selectUserListByMap(params));
+        return R.ok().put("data", companyTagUserService.selectUserByMap(params));
     }
 }

+ 85 - 15
fs-company-app/src/main/java/com/fs/app/controller/CompanyUserController.java

@@ -1,13 +1,11 @@
 package com.fs.app.controller;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.app.annotation.Login;
-import com.fs.app.param.ChangeUserDeptAndPostParam;
-import com.fs.app.param.CompanyUserChangeApplyParam;
-import com.fs.app.param.CompanyUserParam;
-import com.fs.app.param.CompanyUserUpdateParam;
+import com.fs.app.param.*;
 import com.fs.app.service.IAppService;
 import com.fs.app.vo.CompanySubUserVO;
 import com.fs.common.annotation.RepeatSubmit;
@@ -17,15 +15,18 @@ import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.PatternUtils;
 import com.fs.common.utils.bean.BeanUtils;
 import com.fs.company.domain.*;
+import com.fs.company.dto.UserProjectDTO;
 import com.fs.company.mapper.CompanyRoleMapper;
-import com.fs.company.service.ICompanyDeptService;
-import com.fs.company.service.ICompanyService;
-import com.fs.company.service.ICompanyUserChangeApplyService;
-import com.fs.company.service.ICompanyUserService;
+import com.fs.company.service.*;
+import com.fs.company.vo.CompanyTagUserVO;
 import com.fs.company.vo.CompanyUserChangeApplyVO;
 import com.fs.core.security.SecurityUtils;
 import com.fs.course.service.IFsCourseRedPacketLogService;
 import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.store.domain.FsUserCompanyUser;
+import com.fs.store.service.IFsUserCompanyUserService;
+import com.fs.system.service.ISysDictDataService;
+import com.fs.system.vo.DictVO;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -33,6 +34,8 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -57,7 +60,10 @@ public class CompanyUserController extends AppBaseController {
     private final ICompanyUserChangeApplyService companyUserChangeApplyService;
     private final CompanyRoleMapper companyRoleMapper;
     private final IAppService appService;
-
+    private final IFsUserCompanyUserService fsUserCompanyUserService;
+    private final ICompanyTagUserService companyTagUserService;
+    @Autowired
+    private ISysDictDataService dictDataService;
     @Login
     @ApiOperation("查询用户列表")
     @GetMapping("/getCompanyUserList")
@@ -227,7 +233,7 @@ public class CompanyUserController extends AppBaseController {
     @RepeatSubmit
     @ApiOperation("更换会员归属申请")
     @PostMapping("/changeUserParentApply")
-    public R changeVipUser(@Valid @RequestBody CompanyUserChangeApplyParam param) {
+    public R changeVipUser(@RequestBody CompanyUserChangeApplyParam param) {
         // 参数校验
         CompanyUser fromUser = companyUserService.selectCompanyUserById(param.getFrom());
         if (Objects.isNull(fromUser)) {
@@ -247,8 +253,10 @@ public class CompanyUserController extends AppBaseController {
             throw new ServiceException("类型不正确");
         }
 
-        if (param.getType() == 1 && (Objects.isNull(param.getIds()) || param.getIds().isEmpty())) {
-            throw new ServiceException("请先选择会员");
+        if (param.getType() == 1 && (Objects.isNull(param.getIds()) || param.getIds().isEmpty())
+                &&Objects.isNull(param.getProject()) || param.getProject().isEmpty()
+        &&Objects.isNull(param.getTagList()) || param.getTagList().isEmpty()) {
+            throw new ServiceException("请先选择会员!");
         }
 
         // 存在待审核的申请不能再次申请
@@ -258,14 +266,57 @@ public class CompanyUserController extends AppBaseController {
         if (companyUserChangeApplyService.count(applyWrapper) > 0) {
             throw new ServiceException("存在待审核申请");
         }
-
         CompanyUser companyUser = companyUserService.selectCompanyUserById(Long.parseLong(getUserId()));
-
+        List<UserProjectDTO> list = param.getIds();
+        List<UserProjectDTO> userProjectDTOS = addUserId(param.getProject(),param.getTagList(),param.getFrom());
+        if (CollectionUtils.isNotEmpty(userProjectDTOS)){
+            list.addAll(userProjectDTOS);
+        }
         // 添加申请
-        companyUserChangeApplyService.apply(param.getFrom(), param.getTo(), param.getType(), param.getIds(), companyUser.getCompanyId(), companyUser.getUserName());
+        companyUserChangeApplyService.apply(param.getFrom(), param.getTo(), param.getType(),list, companyUser.getCompanyId(), companyUser.getUserName());
         return R.ok();
     }
 
+    /**
+     * 查询标签和项目中的会员添加
+     * @param project
+     * @param tagList
+     * @param companyUserId
+     * @return
+     */
+    private List<UserProjectDTO> addUserId(List<Long> projects, List<Long> tagList, Long companyUserId) {
+        // Prepare parameters map
+        Map<String, Object> params = new HashMap<>();
+
+        if (CollectionUtils.isNotEmpty(projects)) {
+            params.put("projectIds", projects);
+        } else {
+            params.put("tagIds", tagList);
+        }
+
+        // Set company user ID
+        Long effectiveCompanyUserId = ObjectUtil.isNotEmpty(companyUserId)
+                ? companyUserId
+                : getCompanyUserId();
+        params.put("companyUserId", effectiveCompanyUserId);
+
+        // Get data from service
+        List<CompanyTagUserVO> voList = companyTagUserService.selectUserByMap(params);
+        if (CollectionUtils.isEmpty(voList)) {
+            return Collections.emptyList();
+        }
+
+        // Transform data
+        return voList.stream()
+                .map(vo -> {
+                    UserProjectDTO dto = new UserProjectDTO();
+                    dto.setUserId(vo.getUserId());
+                    dto.setProjectId(vo.getProjectId());
+                    return dto;
+                })
+                .collect(Collectors.toList());
+    }
+
     @Login
     @ApiOperation("申请列表")
     @GetMapping("/applyList")
@@ -319,4 +370,23 @@ public class CompanyUserController extends AppBaseController {
         appService.changeUserDeptAndPost(param);
         return R.ok();
     }
+
+    @ApiOperation("查询指定公司中存在会员的项目")
+    @PostMapping("/getDictByKeyByProject")
+    public R getDictByKey(
+            @RequestBody TagProjectParam tagProjectParam){
+        List<DictVO> dictVOS=dictDataService.selectDictDataListByType("sys_course_project");
+        Map<String,Object> param = new HashMap<>();
+        param.put("tagIds",tagProjectParam.getTagIds());
+        param.put("companyUserId",tagProjectParam.getCompanyUserId());
+        List<Long> projectIds =fsUserCompanyUserService.selectFsUserCompanyUserList(param);
+        if (CollectionUtils.isEmpty(projectIds)){
+            return R.ok().put("data",new ArrayList<DictVO>());
+        }
+
+        List<DictVO> filteredDictVOS = dictVOS.stream()
+                .filter(dictVO -> projectIds.contains(Long.parseLong(dictVO.getDictValue())))
+                .collect(Collectors.toList());
+        return R.ok().put("data",filteredDictVOS);
+    }
 }

+ 12 - 0
fs-company-app/src/main/java/com/fs/app/param/CompanyUserChangeApplyParam.java

@@ -23,6 +23,18 @@ public class CompanyUserChangeApplyParam {
      */
     @NotNull(message = "类型不能为空")
     private Integer type;
+
+    /**
+     * 项目id
+     */
+    private List<Long> project;
+
+
+    /**
+     * 标签id
+     */
+    private List<Long> tagList;
+
     /**
      * 需更换归属会员id集合
      */

+ 24 - 0
fs-company-app/src/main/java/com/fs/app/param/TagProjectParam.java

@@ -0,0 +1,24 @@
+package com.fs.app.param;
+
+import lombok.Data;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+@Data
+public class TagProjectParam {
+    /**
+     * 销售id
+     */
+    private Long companyUserId;
+
+    /**
+     * 标签id
+     */
+    private List<Long> tagIds;
+
+    /**
+     * 项目id
+     */
+    private List<Long> projectIds;
+}

+ 2 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyTagMapper.java

@@ -81,4 +81,6 @@ public interface CompanyTagMapper
     String findUserTagByUserId(@Param("userId") Long userId,@Param("companyUserId") Long companyUserId);
     @MapKey("tagId")
     Map<Long,CompanyTag> queryAllTagMap();
+
+    List<CompanyTag> selectCompanyTagByList(@Param("params") Map<String, Object> params);
 }

+ 2 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyTagUserMapper.java

@@ -79,4 +79,6 @@ public interface CompanyTagUserMapper
      * @param params    条件
      */
     void deleteCompanyTagUserByMap(@Param("params") Map<String, Object> params);
+
+    List<CompanyTagUserVO> selectUserByMap(@Param("params") Map<String, Object> params);
 }

+ 2 - 0
fs-service-system/src/main/java/com/fs/company/service/ICompanyTagService.java

@@ -79,4 +79,6 @@ public interface ICompanyTagService
     Map<Long,CompanyTag> queryAllTagMap();
 
     String findUserTagByUserId(Long userId,Long companyUserId);
+
+    List<CompanyTag> selectCompanyTagByList(Map<String, Object> params);
 }

+ 8 - 0
fs-service-system/src/main/java/com/fs/company/service/ICompanyTagUserService.java

@@ -87,4 +87,12 @@ public interface ICompanyTagUserService
      * @param companyUserId 销售ID
      */
     void changeUserTags(List<Long> fsUserIds, List<Long> tagIds, Long companyId, Long companyUserId);
+
+    /**
+     * 根据条件查询标签下用户
+     *
+     * @param params
+     * @return
+     */
+    List<CompanyTagUserVO> selectUserByMap(Map<String, Object> params);
 }

+ 10 - 0
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyTagServiceImpl.java

@@ -128,4 +128,14 @@ public class CompanyTagServiceImpl implements ICompanyTagService
     public String findUserTagByUserId(Long key,Long companyUserId) {
         return companyTagMapper.findUserTagByUserId(key,companyUserId);
     }
+
+    /**
+     * 查询标签列表
+     * @param params 条件
+     * @return list
+     */
+    @Override
+    public List<CompanyTag> selectCompanyTagByList(Map<String, Object> params) {
+        return companyTagMapper.selectCompanyTagByList(params);
+    }
 }

+ 21 - 0
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyTagUserServiceImpl.java

@@ -192,4 +192,25 @@ public class CompanyTagUserServiceImpl implements ICompanyTagUserService
             }
         });
     }
+
+
+    /**
+     * 根据条件查询标签下用户
+     * @param params    条件
+     * @return  list
+     */
+    @Override
+    public List<CompanyTagUserVO> selectUserByMap(Map<String, Object> params) {
+        List<CompanyTagUserVO> companyTagUserVOS = companyTagUserMapper.selectUserByMap(params);
+
+        // 项目
+        List<SysDictData> courseProject = dictDataMapper.selectDictDataByType("sys_course_project");
+        companyTagUserVOS.forEach(vo -> courseProject.stream()
+                .filter(c -> c.getDictValue().equals(vo.getProjectId().toString()))
+                .findFirst()
+                .ifPresent(c -> vo.setUserName(vo.getUserName() + "-" + (c.getDictLabel()))));
+
+        return companyTagUserVOS;
+    }
+
 }

+ 3 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsUserCompanyUserMapper.java

@@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 微信用户和销售关系Mapper接口
@@ -90,4 +91,6 @@ public interface FsUserCompanyUserMapper extends BaseMapper<FsUserCompanyUser>{
     int changeUserProjectStatus(@Param("ids") List<UserProjectDTO> ids, @Param("status") int status);
 
     int batchUpdateStatus(@Param("ids") List<Long> ids, @Param("status") int status);
+
+    List<Long> selectFsUserCompanyUserListByMap(@Param("param") Map<String, Object> param);
 }

+ 8 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsUserCompanyUserService.java

@@ -5,6 +5,7 @@ import com.fs.company.dto.UserProjectDTO;
 import com.fs.store.domain.FsUserCompanyUser;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 微信用户和销售关系Service接口
@@ -29,6 +30,13 @@ public interface IFsUserCompanyUserService extends IService<FsUserCompanyUser>{
      */
     List<FsUserCompanyUser> selectFsUserCompanyUserList(FsUserCompanyUser fsUserCompanyUser);
 
+    /**
+     * 根据销售id查询出项目id
+     * @param param
+     * @return
+     */
+    List<Long> selectFsUserCompanyUserList(Map<String,Object> param );
+
     /**
      * 新增微信用户和销售关系
      *

+ 13 - 0
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserCompanyUserServiceImpl.java

@@ -12,7 +12,9 @@ import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 微信用户和销售关系Service业务层处理
@@ -47,6 +49,17 @@ public class FsUserCompanyUserServiceImpl extends ServiceImpl<FsUserCompanyUserM
         return baseMapper.selectFsUserCompanyUserList(fsUserCompanyUser);
     }
 
+    /**
+     * 根据销售id查询出项目id
+     *
+     * @param companyUserId 销售id
+     * @return 微信用户和销售关系
+     */
+    @Override
+    public List<Long> selectFsUserCompanyUserList(Map<String,Object> param) {
+
+        return baseMapper.selectFsUserCompanyUserListByMap(param);
+    }
     /**
      * 新增微信用户和销售关系
      *

+ 32 - 0
fs-service-system/src/main/resources/mapper/company/CompanyTagMapper.xml

@@ -99,4 +99,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </delete>
 
+
+    <!-- 查询标签列表 -->
+    <select id="selectCompanyTagByList" resultType="com.fs.company.domain.CompanyTag">
+        select ct.*,fu.nickname from company_tag ct
+       inner join fs_user_project_tag ft on ct.tag_id =ft.tag_id
+       inner join fs_user_company_user fucu on fucu.id = ft.user_company_user_id
+       inner join fs_user fu on fu.user_id =fucu.user_id
+        <where>
+            <if test="params.keyword != null and params.keyword.length > 0">
+                and
+                <foreach collection="params.keyword" item="item"  open="(" separator="or" close=")">
+                    ct.tag like concat('%',#{item},'%')
+                </foreach>
+            </if>
+            <if test="params.companyId != null">
+                and ct.company_id = #{params.companyId}
+            </if>
+
+            <if test="params.companyUserId != null">
+                and fucu.company_user_id = #{params.companyUserId}
+            </if>
+            <if test="params.tagName != null">
+                and ct.tag = #{params.tagName}
+            </if>
+            <if test="params.tagName != null">
+                and ct.tag = #{params.tagName}
+            </if>
+        </where>
+        group by ct.tag_id
+    </select>
+
+
 </mapper>

+ 32 - 0
fs-service-system/src/main/resources/mapper/company/CompanyTagUserMapper.xml

@@ -118,6 +118,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </foreach>
             )
         </if>
+
+        <if test="params.projectIds != null and params.projectIds.size() > 0">
+            AND (
+            <foreach collection="params.projectIds" item="projectId" separator="OR">
+                FIND_IN_SET(#{projectId}, ucu.project_id)
+            </foreach>
+            )
+        </if>
+    </select>
+
+    <select id="selectUserByMap" resultType="com.fs.company.vo.CompanyTagUserVO">
+        select fu.user_id,
+        fucu.project_id,
+        fu.nickname as userName from company_tag ct
+        inner join fs_user_project_tag ft on ct.tag_id =ft.tag_id
+        inner join fs_user_company_user fucu on fucu.id = ft.user_company_user_id
+        inner join fs_user fu on fu.user_id =fucu.user_id
+        where fucu.company_user_id = #{params.companyUserId}
+        <if test="params.tagIds != null and params.tagIds.size() > 0">
+            and ft.tag_id in
+            <foreach collection="param.tagIds" item="item" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+
+        <if test="params.projectIds != null and params.projectIds.size() > 0">
+            and fucu.project_id in
+            <foreach collection="param.projectIds" item="item" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        group by fucu.user_id
     </select>
 
 </mapper>

+ 20 - 0
fs-service-system/src/main/resources/mapper/store/FsUserCompanyUserMapper.xml

@@ -152,4 +152,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         GROUP BY
             fs_user_company_user.user_id
     </select>
+
+    <select id="selectFsUserCompanyUserListByMap" resultType="java.lang.Long">
+        select fucu.project_id from company_tag ct
+        inner join fs_user_project_tag ft on ct.tag_id =ft.tag_id
+        inner join fs_user_company_user fucu on fucu.id = ft.user_company_user_id
+        <where>
+            <if test="param.tagIds != null and param.tagIds.size() > 0">
+                and ct.tag_id in
+                <foreach collection="param.tagIds" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="param.companyUserId != null">
+               and fucu.company_user_id = #{param.companyUserId}
+            </if>
+        </where>
+        group by fucu.project_id
+    </select>
+
+
 </mapper>