Просмотр исходного кода

feat:app客服和客服组管理功能

caoliqin 3 недель назад
Родитель
Сommit
8b6a83e645

+ 37 - 0
fs-admin/src/main/java/com/fs/app/controller/AppCustomerRoleController.java

@@ -1,13 +1,18 @@
 package com.fs.app.controller;
 
 import cn.hutool.http.HttpRequest;
+import com.fs.app.cusrole.domain.AppCustomerRole;
 import com.fs.app.cusrole.dto.AppCustomerRoleDTO;
 import com.fs.app.cusrole.service.IAppCustomerRoleService;
+import com.fs.app.cusrole.vo.AppCustomerRoleManageVO;
 import com.fs.app.cusrole.vo.AppCustomerRoleVO;
 import com.fs.app.user.vo.AppUserVO;
+import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.StringUtils;
 import com.fs.im.service.OpenIMService;
 import io.swagger.annotations.ApiOperation;
@@ -15,6 +20,7 @@ import lombok.RequiredArgsConstructor;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
@@ -39,6 +45,37 @@ public class AppCustomerRoleController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 分页查询客服组(管理端)
+     */
+    @PreAuthorize("@ss.hasPermi('app:cusrole:list')")
+    @GetMapping("/pageList")
+    public TableDataInfo rolePageList(AppCustomerRoleDTO dto) {
+        startPage();
+        List<AppCustomerRoleManageVO> list = appCustomerRoleService.selectAppCustomerRoleList(dto);
+        return getDataTable(list);
+    }
+
+    /**
+     * 新增客服组
+     */
+    @PreAuthorize("@ss.hasPermi('app:cusrole:add')")
+    @Log(title = "app-客服组", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult addRole(@RequestBody AppCustomerRole appCustomerRole) {
+        return toAjax(appCustomerRoleService.insertAppCustomerRole(appCustomerRole));
+    }
+
+    /**
+     * 修改客服组
+     */
+    @PreAuthorize("@ss.hasPermi('app:cusrole:edit')")
+    @Log(title = "app-客服组", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult editRole(@RequestBody AppCustomerRole appCustomerRole) {
+        return toAjax(appCustomerRoleService.updateAppCustomerRole(appCustomerRole));
+    }
+
     @ApiOperation("校验客服是否注册新的im")
     @PostMapping("/accountCheck")
     public R accountCheck(@RequestBody Map<String, String> userIdMap){

+ 77 - 0
fs-admin/src/main/java/com/fs/app/controller/AppCustomerRoleMemberController.java

@@ -0,0 +1,77 @@
+package com.fs.app.controller;
+
+import com.fs.app.cusrole.domain.AppCustomerRoleMember;
+import com.fs.app.cusrole.service.IAppCustomerRoleMemberService;
+import com.fs.app.cusrole.vo.AppCustomerRoleMemberVO;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.StringUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * app-客服组成员管理
+ */
+@RestController
+@RequestMapping("/app/cusrole/member")
+@RequiredArgsConstructor
+public class AppCustomerRoleMemberController extends BaseController {
+
+    private final IAppCustomerRoleMemberService appCustomerRoleMemberService;
+
+    /**
+     * 分页查询客服
+     */
+    @PreAuthorize("@ss.hasPermi('app:cusrolemember:list')")
+    @GetMapping("/pageList")
+    public TableDataInfo memberPageList(
+            @RequestParam(required = false) String keyword,
+            @RequestParam(required = false) Long appCustomerId) {
+        startPage();
+        AppCustomerRoleMember query = new AppCustomerRoleMember();
+        query.setAppCustomerId(appCustomerId);
+        if (StringUtils.isNotEmpty(keyword)) {
+            query.setMemberName(keyword);
+        }
+        query.setIsDelete(0);
+        List<AppCustomerRoleMemberVO> list = appCustomerRoleMemberService.selectAppCustomerRoleMemberList(query);
+        return getDataTable(list);
+    }
+
+    /**
+     * 新增客服
+     */
+    @PreAuthorize("@ss.hasPermi('app:cusrolemember:add')")
+    @Log(title = "app-客服", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody AppCustomerRoleMember appCustomerRoleMember) {
+        return toAjax(appCustomerRoleMemberService.insertAppCustomerRoleMember(appCustomerRoleMember));
+    }
+
+    /**
+     * 修改客服
+     */
+    @PreAuthorize("@ss.hasPermi('app:cusrolemember:edit')")
+    @Log(title = "app-客服", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody AppCustomerRoleMember appCustomerRoleMember) {
+        return toAjax(appCustomerRoleMemberService.updateAppCustomerRoleMember(appCustomerRoleMember));
+    }
+
+    /**
+     * 批量删除客服(逻辑删除)
+     */
+    @PreAuthorize("@ss.hasPermi('app:cusrolemember:delete')")
+    @Log(title = "app-客服", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
+        return toAjax(appCustomerRoleMemberService.deleteAppCustomerRoleMemberByIds(ids));
+    }
+
+}

+ 7 - 0
fs-service/src/main/java/com/fs/app/cusrole/mapper/AppCustomerRoleMapper.java

@@ -3,6 +3,7 @@ package com.fs.app.cusrole.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.app.cusrole.domain.AppCustomerRole;
 import com.fs.app.cusrole.dto.AppCustomerRoleDTO;
+import com.fs.app.cusrole.vo.AppCustomerRoleManageVO;
 import com.fs.app.cusrole.vo.AppCustomerRoleVO;
 import com.fs.app.user.vo.AppUserVO;
 import com.fs.company.vo.OptionVO;
@@ -16,6 +17,12 @@ public interface AppCustomerRoleMapper extends BaseMapper<AppCustomerRole> {
 
     List<AppCustomerRoleVO> findList(AppCustomerRoleDTO dto);
 
+    List<AppCustomerRoleManageVO> selectAppCustomerRoleList(AppCustomerRoleDTO dto);
+
+    int insertAppCustomerRole(AppCustomerRole appCustomerRole);
+
+    int updateAppCustomerRole(AppCustomerRole appCustomerRole);
+
     List<Long> getCustomerIdsByUserId(@Param("userId") Long userId);
 
     List<OptionVO> getCustomerListLikeName(@Param("name") String name);

+ 2 - 1
fs-service/src/main/java/com/fs/app/cusrole/mapper/AppCustomerRoleMemberMapper.java

@@ -2,6 +2,7 @@ package com.fs.app.cusrole.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.app.cusrole.domain.AppCustomerRoleMember;
+import com.fs.app.cusrole.vo.AppCustomerRoleMemberVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -29,7 +30,7 @@ public interface AppCustomerRoleMemberMapper extends BaseMapper<AppCustomerRoleM
      * @param appCustomerRoleMember app-客服组-组员信息
      * @return app-客服组-组员信息集合
      */
-    List<AppCustomerRoleMember> selectAppCustomerRoleMemberList(AppCustomerRoleMember appCustomerRoleMember);
+    List<AppCustomerRoleMemberVO> selectAppCustomerRoleMemberList(AppCustomerRoleMember appCustomerRoleMember);
 
     /**
      * 新增app-客服组-组员信息

+ 2 - 1
fs-service/src/main/java/com/fs/app/cusrole/service/IAppCustomerRoleMemberService.java

@@ -2,6 +2,7 @@ package com.fs.app.cusrole.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.app.cusrole.domain.AppCustomerRoleMember;
+import com.fs.app.cusrole.vo.AppCustomerRoleMemberVO;
 
 import java.util.List;
 
@@ -26,7 +27,7 @@ public interface IAppCustomerRoleMemberService extends IService<AppCustomerRoleM
      * @param appCustomerRoleMember app-客服组-组员信息
      * @return app-客服组-组员信息集合
      */
-    List<AppCustomerRoleMember> selectAppCustomerRoleMemberList(AppCustomerRoleMember appCustomerRoleMember);
+    List<AppCustomerRoleMemberVO> selectAppCustomerRoleMemberList(AppCustomerRoleMember appCustomerRoleMember);
 
     /**
      * 新增app-客服组-组员信息

+ 7 - 0
fs-service/src/main/java/com/fs/app/cusrole/service/IAppCustomerRoleService.java

@@ -3,6 +3,7 @@ package com.fs.app.cusrole.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.app.cusrole.domain.AppCustomerRole;
 import com.fs.app.cusrole.dto.AppCustomerRoleDTO;
+import com.fs.app.cusrole.vo.AppCustomerRoleManageVO;
 import com.fs.app.cusrole.vo.AppCustomerRoleVO;
 import com.fs.app.user.vo.AppUserVO;
 import com.fs.company.vo.OptionVO;
@@ -16,6 +17,12 @@ public interface IAppCustomerRoleService extends IService<AppCustomerRole> {
 
     List<AppCustomerRoleVO> findList(AppCustomerRoleDTO dto);
 
+    List<AppCustomerRoleManageVO> selectAppCustomerRoleList(AppCustomerRoleDTO dto);
+
+    int insertAppCustomerRole(AppCustomerRole appCustomerRole);
+
+    int updateAppCustomerRole(AppCustomerRole appCustomerRole);
+
     List<OptionVO> getCustomerListLikeName(String name);
     AppUserVO selectById(Long id);
 }

+ 21 - 0
fs-service/src/main/java/com/fs/app/cusrole/service/impl/AppCustomerRoleImpl.java

@@ -5,12 +5,14 @@ import com.fs.app.cusrole.domain.AppCustomerRole;
 import com.fs.app.cusrole.dto.AppCustomerRoleDTO;
 import com.fs.app.cusrole.mapper.AppCustomerRoleMapper;
 import com.fs.app.cusrole.service.IAppCustomerRoleService;
+import com.fs.app.cusrole.vo.AppCustomerRoleManageVO;
 import com.fs.app.cusrole.vo.AppCustomerRoleVO;
 import com.fs.app.user.vo.AppUserVO;
 import com.fs.company.vo.OptionVO;
 import com.fs.his.vo.OptionsVO;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -34,6 +36,25 @@ public class AppCustomerRoleImpl extends ServiceImpl<AppCustomerRoleMapper, AppC
         return this.baseMapper.findList(dto);
     }
 
+    @Override
+    public List<AppCustomerRoleManageVO> selectAppCustomerRoleList(AppCustomerRoleDTO dto) {
+        return this.baseMapper.selectAppCustomerRoleList(dto);
+    }
+
+    @Override
+    public int insertAppCustomerRole(AppCustomerRole appCustomerRole) {
+        appCustomerRole.setIsDelete(0);
+        LocalDateTime now = LocalDateTime.now();
+        appCustomerRole.setCreateTime(now);
+        return this.baseMapper.insertAppCustomerRole(appCustomerRole);
+    }
+
+    @Override
+    public int updateAppCustomerRole(AppCustomerRole appCustomerRole) {
+        appCustomerRole.setUpdateTime(LocalDateTime.now());
+        return this.baseMapper.updateAppCustomerRole(appCustomerRole);
+    }
+
     @Override
     public List<OptionVO> getCustomerListLikeName(String name) {
         return this.baseMapper.getCustomerListLikeName(name);

+ 48 - 4
fs-service/src/main/java/com/fs/app/cusrole/service/impl/AppCustomerRoleMemberServiceImpl.java

@@ -3,10 +3,12 @@ package com.fs.app.cusrole.service.impl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.aiSipCall.utils.DateUtils;
 import com.fs.app.cusrole.domain.AppCustomerRoleMember;
+import com.fs.app.cusrole.vo.AppCustomerRoleMemberVO;
 import com.fs.app.cusrole.mapper.AppCustomerRoleMemberMapper;
 import com.fs.app.cusrole.service.IAppCustomerRoleMemberService;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -36,7 +38,7 @@ public class AppCustomerRoleMemberServiceImpl extends ServiceImpl<AppCustomerRol
      * @return app-客服组-组员信息
      */
     @Override
-    public List<AppCustomerRoleMember> selectAppCustomerRoleMemberList(AppCustomerRoleMember appCustomerRoleMember) {
+    public List<AppCustomerRoleMemberVO> selectAppCustomerRoleMemberList(AppCustomerRoleMember appCustomerRoleMember) {
         return baseMapper.selectAppCustomerRoleMemberList(appCustomerRoleMember);
     }
 
@@ -48,7 +50,15 @@ public class AppCustomerRoleMemberServiceImpl extends ServiceImpl<AppCustomerRol
      */
     @Override
     public int insertAppCustomerRoleMember(AppCustomerRoleMember appCustomerRoleMember) {
-        appCustomerRoleMember.setCreateTime(DateUtils.getNowDate());
+        if (appCustomerRoleMember.getMemberNo() == null && appCustomerRoleMember.getAppCustomerId() != null) {
+            appCustomerRoleMember.setMemberNo(resolveNextMemberNo(appCustomerRoleMember.getAppCustomerId()));
+        }
+        if (appCustomerRoleMember.getIsDelete() == null) {
+            appCustomerRoleMember.setIsDelete(0);
+        }
+        Date now = DateUtils.getNowDate();
+        appCustomerRoleMember.setCreateTime(now);
+        appCustomerRoleMember.setUpdateTime(now);
         return baseMapper.insertAppCustomerRoleMember(appCustomerRoleMember);
     }
 
@@ -60,19 +70,35 @@ public class AppCustomerRoleMemberServiceImpl extends ServiceImpl<AppCustomerRol
      */
     @Override
     public int updateAppCustomerRoleMember(AppCustomerRoleMember appCustomerRoleMember) {
+        if (appCustomerRoleMember.getId() != null) {
+            AppCustomerRoleMember existing = baseMapper.selectAppCustomerRoleMemberById(appCustomerRoleMember.getId());
+            if (existing != null && appCustomerRoleMember.getAppCustomerId() != null
+                    && !appCustomerRoleMember.getAppCustomerId().equals(existing.getAppCustomerId())) {
+                appCustomerRoleMember.setMemberNo(resolveNextMemberNo(appCustomerRoleMember.getAppCustomerId()));
+            }
+        }
         appCustomerRoleMember.setUpdateTime(DateUtils.getNowDate());
         return baseMapper.updateAppCustomerRoleMember(appCustomerRoleMember);
     }
 
     /**
-     * 批量删除app-客服组-组员信息
+     * 批量删除app-客服组-组员信息(逻辑删除)
      *
      * @param ids 需要删除的app-客服组-组员信息主键
      * @return 结果
      */
     @Override
     public int deleteAppCustomerRoleMemberByIds(Long[] ids) {
-        return baseMapper.deleteAppCustomerRoleMemberByIds(ids);
+        int count = 0;
+        Date now = DateUtils.getNowDate();
+        for (Long id : ids) {
+            AppCustomerRoleMember member = new AppCustomerRoleMember();
+            member.setId(id);
+            member.setIsDelete(1);
+            member.setUpdateTime(now);
+            count += baseMapper.updateAppCustomerRoleMember(member);
+        }
+        return count;
     }
 
     /**
@@ -90,4 +116,22 @@ public class AppCustomerRoleMemberServiceImpl extends ServiceImpl<AppCustomerRol
     public AppCustomerRoleMember getMaxByCustomerGroupId(Long customerGroupId) {
         return baseMapper.getMaxByCustomerGroupId(customerGroupId);
     }
+
+    /**
+     * 查询某客服组内最大的客服组内成员编号
+     * @param appCustomerId 发送的客服组id
+     * @return
+     */
+    private long resolveNextMemberNo(Long appCustomerId) {
+        AppCustomerRoleMember maxMember = lambdaQuery()
+                .eq(AppCustomerRoleMember::getAppCustomerId, appCustomerId)
+                .eq(AppCustomerRoleMember::getIsDelete, 0)
+                .orderByDesc(AppCustomerRoleMember::getMemberNo)
+                .last("limit 1")
+                .one();
+        if (maxMember == null || maxMember.getMemberNo() == null) {
+            return 1L;
+        }
+        return maxMember.getMemberNo() + 1;
+    }
 }

+ 30 - 0
fs-service/src/main/java/com/fs/app/cusrole/vo/AppCustomerRoleManageVO.java

@@ -0,0 +1,30 @@
+package com.fs.app.cusrole.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 客服组管理列表出参
+ */
+@Data
+public class AppCustomerRoleManageVO {
+
+    private Long id;
+
+    private String roleName;
+
+    private String remark;
+
+    private String avatar;
+
+    private Integer memberMaxFriendCount;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+}

+ 39 - 0
fs-service/src/main/java/com/fs/app/cusrole/vo/AppCustomerRoleMemberVO.java

@@ -0,0 +1,39 @@
+package com.fs.app.cusrole.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 客服组成员列表出参
+ */
+@Data
+public class AppCustomerRoleMemberVO {
+
+    private Long id;
+
+    private Long appCustomerId;
+
+    private String memberName;
+
+    private Long memberNo;
+
+    private String avatar;
+
+    private String remark;
+
+    private Long appFastgptRoleId;
+
+    private Integer isDelete;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /** 客服组名称 */
+    private String roleName;
+
+}

+ 1 - 0
fs-service/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java

@@ -573,6 +573,7 @@ public class AiHookServiceImpl implements AiHookService {
             redisCache.setCacheObject("msg:" + fastGptChatSession.getSessionId(),contentEmj,5,TimeUnit.MINUTES);
             log.info("等待");
             R r;
+            log.info("isNewVersion值,{}", isNewVersion);
             if(isNewVersion){
                 r= sendAiMsgNew(replyI,fastGptChatSession,role,user,qwExternalContacts.getId(),config.getAPPKey(),qwExternalContacts,sender);
             } else {

+ 53 - 0
fs-service/src/main/resources/mapper/app/AppCustomerRoleMapper.xml

@@ -72,4 +72,57 @@
         from app_customer_role where id = #{id};
     </select>
 
+    <select id="selectAppCustomerRoleList" resultType="com.fs.app.cusrole.vo.AppCustomerRoleManageVO">
+        SELECT
+            id AS id,
+            role_name AS roleName,
+            remark AS remark,
+            avatar AS avatar,
+            member_max_friend_count AS memberMaxFriendCount,
+            create_time AS createTime,
+            update_time AS updateTime
+        FROM
+            app_customer_role
+        WHERE
+            is_delete = 0
+        <if test="roleName != null and roleName != ''">
+            AND role_name LIKE CONCAT('%', #{roleName}, '%')
+        </if>
+        ORDER BY create_time DESC
+    </select>
+
+    <insert id="insertAppCustomerRole" parameterType="AppCustomerRole" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO app_customer_role
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="roleName != null and roleName != ''">role_name,</if>
+            <if test="remark != null">remark,</if>
+            <if test="avatar != null">avatar,</if>
+            <if test="memberMaxFriendCount != null">member_max_friend_count,</if>
+            <if test="isDelete != null">is_delete,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="roleName != null and roleName != ''">#{roleName},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="avatar != null">#{avatar},</if>
+            <if test="memberMaxFriendCount != null">#{memberMaxFriendCount},</if>
+            <if test="isDelete != null">#{isDelete},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+        </trim>
+    </insert>
+
+    <update id="updateAppCustomerRole" parameterType="AppCustomerRole">
+        UPDATE app_customer_role
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="roleName != null and roleName != ''">role_name = #{roleName},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="avatar != null">avatar = #{avatar},</if>
+            <if test="memberMaxFriendCount != null">member_max_friend_count = #{memberMaxFriendCount},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        WHERE id = #{id} AND is_delete = 0
+    </update>
+
 </mapper>

+ 27 - 8
fs-service/src/main/resources/mapper/app/AppCustomerRoleMemberMapper.xml

@@ -8,6 +8,7 @@
         <result property="id"    column="id"    />
         <result property="appCustomerId"    column="app_customer_id"    />
         <result property="memberName"    column="member_name"    />
+        <result property="memberNo"    column="member_no"    />
         <result property="avatar"    column="avatar"    />
         <result property="remark"    column="remark"    />
         <result property="appFastgptRoleId"    column="app_fastgpt_role_id"    />
@@ -17,18 +18,32 @@
     </resultMap>
 
     <sql id="selectAppCustomerRoleMemberVo">
-        select id, app_customer_id, member_name, avatar, remark, app_fastgpt_role_id, is_delete, create_time, update_time from app_customer_role_member
+        select id, app_customer_id, member_name, member_no, avatar, remark, app_fastgpt_role_id, is_delete, create_time, update_time from app_customer_role_member
     </sql>
 
-    <select id="selectAppCustomerRoleMemberList" parameterType="AppCustomerRoleMember" resultMap="AppCustomerRoleMemberResult">
-        <include refid="selectAppCustomerRoleMemberVo"/>
+    <select id="selectAppCustomerRoleMemberList" parameterType="AppCustomerRoleMember" resultType="com.fs.app.cusrole.vo.AppCustomerRoleMemberVO">
+        select
+            m.id,
+            m.app_customer_id as appCustomerId,
+            m.member_name as memberName,
+            m.member_no as memberNo,
+            m.avatar,
+            m.remark,
+            m.app_fastgpt_role_id as appFastgptRoleId,
+            m.is_delete as isDelete,
+            m.create_time as createTime,
+            m.update_time as updateTime,
+            r.role_name as roleName
+        from app_customer_role_member m
+        left join app_customer_role r on r.id = m.app_customer_id and r.is_delete = 0
         <where>
-            <if test="appCustomerId != null "> and app_customer_id = #{appCustomerId}</if>
-            <if test="memberName != null  and memberName != ''"> and member_name like concat('%', #{memberName}, '%')</if>
-            <if test="avatar != null  and avatar != ''"> and avatar = #{avatar}</if>
-            <if test="appFastgptRoleId != null "> and app_fastgpt_role_id = #{appFastgptRoleId}</if>
-            <if test="isDelete != null "> and is_delete = #{isDelete}</if>
+            <if test="appCustomerId != null"> and m.app_customer_id = #{appCustomerId}</if>
+            <if test="memberName != null and memberName != ''"> and m.member_name like concat('%', #{memberName}, '%')</if>
+            <if test="avatar != null and avatar != ''"> and m.avatar = #{avatar}</if>
+            <if test="appFastgptRoleId != null"> and m.app_fastgpt_role_id = #{appFastgptRoleId}</if>
+            <if test="isDelete != null"> and m.is_delete = #{isDelete}</if>
         </where>
+        order by m.create_time desc
     </select>
 
     <select id="selectAppCustomerRoleMemberById" parameterType="Long" resultMap="AppCustomerRoleMemberResult">
@@ -41,6 +56,7 @@
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="appCustomerId != null">app_customer_id,</if>
             <if test="memberName != null and memberName != ''">member_name,</if>
+            <if test="memberNo != null">member_no,</if>
             <if test="avatar != null">avatar,</if>
             <if test="remark != null">remark,</if>
             <if test="appFastgptRoleId != null">app_fastgpt_role_id,</if>
@@ -51,6 +67,7 @@
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="appCustomerId != null">#{appCustomerId},</if>
             <if test="memberName != null and memberName != ''">#{memberName},</if>
+            <if test="memberNo != null">#{memberNo},</if>
             <if test="avatar != null">#{avatar},</if>
             <if test="remark != null">#{remark},</if>
             <if test="appFastgptRoleId != null">#{appFastgptRoleId},</if>
@@ -65,6 +82,7 @@
         <trim prefix="SET" suffixOverrides=",">
             <if test="appCustomerId != null">app_customer_id = #{appCustomerId},</if>
             <if test="memberName != null and memberName != ''">member_name = #{memberName},</if>
+            <if test="memberNo != null">member_no = #{memberNo},</if>
             <if test="avatar != null">avatar = #{avatar},</if>
             <if test="remark != null">remark = #{remark},</if>
             <if test="appFastgptRoleId != null">app_fastgpt_role_id = #{appFastgptRoleId},</if>
@@ -98,4 +116,5 @@
                 SELECT MAX(id) FROM app_customer_role_member WHERE app_customer_id = #{customerGroupId}
             )
     </select>
+
 </mapper>