Browse Source

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

yfh 11 tháng 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>