diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysServiceTopicController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysServiceTopicController.java index 45b74e292..399d4fefe 100644 --- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysServiceTopicController.java +++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysServiceTopicController.java @@ -20,10 +20,16 @@ public class SysServiceTopicController extends BaseController { @GetMapping("/list") public TableDataInfo list(SysServicesTopic topic) { - startPage(); - return getDataTable(servicesTopicService.selectSysServicesTopicByUserIdAndRole(topic)); + return getDataTable(servicesTopicService.selectTopicListByUid(topic)); } + @GetMapping("/customers") + public TableDataInfo customers(SysServicesTopic topic) { + startPage(); + return getDataTable(servicesTopicService.selectCustomerListByUserIdAndRole(topic)); + } + + // @PutMapping("/update/status") // public AjaxResult status(@RequestBody SysServicesQuestion sysServicesQuestion) { // return toAjax(sysServicesQuestionService.updateSysServicesQuestionStatus(sysServicesQuestion)); diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomer.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomer.java index 072923305..a29e915ad 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomer.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomer.java @@ -71,18 +71,26 @@ public class SysCustomer extends BaseEntity /** 主营养师 */ @Excel(name = "主营养师") + private String dietitianName; + private Long mainDietitian; /** 营养师助理 */ @Excel(name = "营养师助理") + private String assDietitianName; + private Long assistantDietitian; /** 售后营养师 */ @Excel(name = "售后营养师") + private String afterDietitianName; + private Long afterDietitian; /** 销售人员 */ @Excel(name = "销售人员") + private String salesName; + private Long salesman; /** 负责人 */ diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysServicesTopicMapper.java b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysServicesTopicMapper.java index 0217a94e8..eb910321f 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysServicesTopicMapper.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysServicesTopicMapper.java @@ -7,6 +7,8 @@ import java.util.List; public interface SysServicesTopicMapper { List<SysServicesTopic> selectSysServicesTopicByUserIdAndRole(SysServicesTopic topic); + List<SysServicesTopic> selectCustomerListByUserIdAndRole(SysServicesTopic topic); + int insertSysServicesTopic(SysServicesTopic topic); int insertSysServicesTopicStatus(List<SysServicesTopic> topics); @@ -20,4 +22,6 @@ public interface SysServicesTopicMapper { List<SysServicesTopic> selectSysServicesTopicSessionByTopicId(String topicId); List<SysServicesTopic> selectUnreadTopicCount(List<SysServicesTopic> topics); + + List<SysServicesTopic> selectTopicListByUid(SysServicesTopic topic); } diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/server/WebSocketServer.java b/stdiet-custom/src/main/java/com/stdiet/custom/server/WebSocketServer.java index 7bc506c04..0cc9f0217 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/server/WebSocketServer.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/server/WebSocketServer.java @@ -27,7 +27,7 @@ public class WebSocketServer { //private static ConcurrentHashMap<String,WebSocketServer> websocketList = new ConcurrentHashMap<>(); // 与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; - // 接收sid + // 接收sidw private String sid = ""; public static CopyOnWriteArraySet<WebSocketServer> getWebSocketSet() { diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysServicesTopicService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysServicesTopicService.java index 054424584..e8059405e 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysServicesTopicService.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysServicesTopicService.java @@ -8,6 +8,8 @@ public interface ISysServicesTopicService { List<SysServicesTopic> selectSysServicesTopicByUserIdAndRole(SysServicesTopic topic); + List<SysServicesTopic> selectCustomerListByUserIdAndRole(SysServicesTopic topic); + SysServicesTopic insertSysServicesTopic(SysServicesTopic topic); int updateSysServicesTopicStatus(SysServicesTopic topic); @@ -19,4 +21,6 @@ public interface ISysServicesTopicService { List<SysServicesTopic> selectSysServicesTopicSessionByTopicId(String topicId); List<SysServicesTopic> selectUnreadTopicCount(List<SysServicesTopic> topic); + + List<SysServicesTopic> selectTopicListByUid(SysServicesTopic topic); } diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysServicesTopicServiceImp.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysServicesTopicServiceImp.java index 1e57ffabd..10496bdd3 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysServicesTopicServiceImp.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysServicesTopicServiceImp.java @@ -30,6 +30,10 @@ public class SysServicesTopicServiceImp implements ISysServicesTopicService { return servicesTopicMapper.selectSysServicesTopicByUserIdAndRole(topic); } + @Override + public List<SysServicesTopic> selectCustomerListByUserIdAndRole(SysServicesTopic topic) { + return servicesTopicMapper.selectCustomerListByUserIdAndRole(topic); + } @Override public SysServicesTopic insertSysServicesTopic(SysServicesTopic topic) { @@ -187,4 +191,9 @@ public class SysServicesTopicServiceImp implements ISysServicesTopicService { public List<SysServicesTopic> selectUnreadTopicCount(List<SysServicesTopic> statusList) { return servicesTopicMapper.selectUnreadTopicCount(statusList); } + + @Override + public List<SysServicesTopic> selectTopicListByUid(SysServicesTopic topic) { + return servicesTopicMapper.selectTopicListByUid(topic); + } } diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysCustomerMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysCustomerMapper.xml index ff5a0fa16..756e76742 100644 --- a/stdiet-custom/src/main/resources/mapper/custom/SysCustomerMapper.xml +++ b/stdiet-custom/src/main/resources/mapper/custom/SysCustomerMapper.xml @@ -5,38 +5,50 @@ <mapper namespace="com.stdiet.custom.mapper.SysCustomerMapper"> <resultMap type="SysCustomer" id="SysCustomerResult"> - <result property="id" column="id" /> - <result property="name" column="name" /> - <result property="phone" column="phone" /> - <result property="email" column="email" /> - <result property="address" column="address" /> - <result property="payDate" column="pay_date" /> - <result property="startDate" column="start_date" /> - <result property="fansTime" column="fans_time" /> - <result property="fansChannel" column="fans_channel" /> - <result property="purchaseNum" column="purchase_num" /> - <result property="payTotal" column="pay_total" /> - <result property="mainDietitian" column="main_dietitian" /> - <result property="assistantDietitian" column="assistant_dietitian" /> - <result property="afterDietitian" column="after_dietitian" /> - <result property="salesman" column="salesman" /> - <result property="chargePerson" column="charge_person" /> - <result property="followStatus" column="follow_status" /> - <result property="createTime" column="create_time" /> - <result property="createBy" column="create_by" /> - <result property="updateTime" column="update_time" /> - <result property="updateBy" column="update_by" /> - <result property="channelId" column="channel_id" /> + <result property="id" column="id"/> + <result property="name" column="name"/> + <result property="phone" column="phone"/> + <result property="email" column="email"/> + <result property="address" column="address"/> + <result property="payDate" column="pay_date"/> + <result property="startDate" column="start_date"/> + <result property="fansTime" column="fans_time"/> + <result property="fansChannel" column="fans_channel"/> + <result property="purchaseNum" column="purchase_num"/> + <result property="payTotal" column="pay_total"/> + <result property="chargePerson" column="charge_person"/> + <result property="followStatus" column="follow_status"/> + <result property="createTime" column="create_time"/> + <result property="createBy" column="create_by"/> + <result property="updateTime" column="update_time"/> + <result property="updateBy" column="update_by"/> + <result property="channelId" column="channel_id"/> + + <result property="mainDietitian" column="main_dietitian"/> + <result property="assistantDietitian" column="assistant_dietitian"/> + <result property="afterDietitian" column="after_dietitian"/> + <result property="salesman" column="salesman"/> + + <association property="dietitianName" column="{id=main_dietitian}" select="selectUserName"/> + <association property="assDietitianName" column="{id=assistant_dietitian}" select="selectUserName"/> + <association property="afterDietitianName" column="{id=after_dietitian}" select="selectUserName"/> + <association property="salesName" column="{id=salesman}" select="selectUserName"/> </resultMap> + <select id="selectUserName" parameterType="java.util.Map" resultType="String"> + select nick_name from sys_user where user_id = #{id} + </select> + <sql id="selectSysCustomerVo"> select id, name, phone, email, fans_time, fans_channel, address, pay_date, start_date, purchase_num, pay_total, main_dietitian, assistant_dietitian, after_dietitian, salesman, charge_person, follow_status, create_time, create_by, update_time, update_by, channel_id from sys_customer </sql> <select id="selectSysCustomerList" parameterType="SysCustomer" resultMap="SysCustomerResult"> select - sc.id, sc.name, sc.phone, sc.email, sc.fans_time, sc.fans_channel, sc.address, sc.pay_date, sc.start_date, sc.purchase_num, sc.pay_total, sc.main_dietitian, - sc.assistant_dietitian, sc.after_dietitian, sc.salesman, sc.charge_person, sc.follow_status, sc.create_time,sc.channel_id + sc.id, sc.name, sc.phone, sc.email, sc.fans_time, sc.fans_channel, sc.address, sc.pay_date, sc.start_date, + sc.purchase_num, sc.pay_total, sc.main_dietitian, + sc.assistant_dietitian, sc.after_dietitian, sc.salesman, sc.charge_person, sc.follow_status, + sc.create_time,sc.channel_id from sys_customer sc left join sys_customer_healthy as sch on sch.customer_id = sc.id and sch.del_flag = 0 @@ -44,16 +56,18 @@ <if test="name != null and name != ''"> and (sc.name like concat('%', #{name}, '%') or sc.phone like concat('%', #{name}, '%')) </if> - <if test="mainDietitian != null and mainDietitian != ''"> and sc.main_dietitian = #{mainDietitian}</if> - <if test="mainDietitian == 0"> and (isnull(sc.main_dietitian) or sc.main_dietitian=0)</if> - <if test="salesman != null and salesman != ''"> and sc.salesman = #{salesman}</if> - <if test="salesman == 0"> and (isnull(sc.salesman) or sc.salesman=0)</if> - <if test="afterDietitian != null and afterDietitian != ''"> and sc.after_dietitian = #{afterDietitian}</if> - <if test="afterDietitian == 0"> and (isnull(sc.after_dietitian) or sc.after_dietitian=0)</if> - <if test="assistantDietitian != null and assistantDietitian != ''"> and sc.assistant_dietitian = #{assistantDietitian}</if> - <if test="assistantDietitian == 0"> and (isnull(sc.assistant_dietitian) or sc.assistant_dietitian=0)</if> - <if test="fansChannel != null "> and sc.fans_channel = #{fansChannel}</if> - <if test="channelId != null "> and sc.channel_id = #{channelId}</if> + <if test="mainDietitian != null and mainDietitian != ''">and sc.main_dietitian = #{mainDietitian}</if> + <if test="mainDietitian == 0">and (isnull(sc.main_dietitian) or sc.main_dietitian=0)</if> + <if test="salesman != null and salesman != ''">and sc.salesman = #{salesman}</if> + <if test="salesman == 0">and (isnull(sc.salesman) or sc.salesman=0)</if> + <if test="afterDietitian != null and afterDietitian != ''">and sc.after_dietitian = #{afterDietitian}</if> + <if test="afterDietitian == 0">and (isnull(sc.after_dietitian) or sc.after_dietitian=0)</if> + <if test="assistantDietitian != null and assistantDietitian != ''">and sc.assistant_dietitian = + #{assistantDietitian} + </if> + <if test="assistantDietitian == 0">and (isnull(sc.assistant_dietitian) or sc.assistant_dietitian=0)</if> + <if test="fansChannel != null ">and sc.fans_channel = #{fansChannel}</if> + <if test="channelId != null ">and sc.channel_id = #{channelId}</if> <if test="channels != null"> and sc.channel_id in <foreach collection="channels" item="cn" separator="," open="(" close=")"> diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysServicesTopicMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysServicesTopicMapper.xml index 4afeb6edb..02171af65 100644 --- a/stdiet-custom/src/main/resources/mapper/custom/SysServicesTopicMapper.xml +++ b/stdiet-custom/src/main/resources/mapper/custom/SysServicesTopicMapper.xml @@ -16,8 +16,57 @@ <result column="create_time" property="createTime"/> <result column="update_time" property="updateTime"/> <association column="{uid=uid,role=role}" property="name" select="selectUserInfo"/> + <association property="avatar" column="{uid=uid,role=role}" select="selectUserAvatar"/> </resultMap> + <select id="selectCustomerListByUserIdAndRole" parameterType="SysServicesTopic" resultMap="SysServicesTopicResult"> + SELECT DISTINCT(uid)AS uid, MAX(update_time) AS update_time, MIN(create_time) AS create_time, MIN(`read`) AS + `read`, role FROM ( + SELECT * FROM ( + SELECT topic_id, `read`, create_time, update_time, 'customer' AS role FROM sys_services_topic_status + <choose> + <when test="role == 'admin' or role == 'manager' or role == 'admin-dev'"> + WHERE role = 'dietician' + </when> + <otherwise> + WHERE role = #{role} AND uid = #{uid} + </otherwise> + </choose> + + ) AS status + LEFT JOIN (SELECT topic_id, uid, del_flag FROM sys_services_topic ) AS topic USING(topic_id) + WHERE del_flag = 0 + ORDER BY `read` ASC, update_time DESC + ) AS userList GROUP BY uid + </select> + + <select id="selectTopicListByUid" parameterType="SysServicesTopic" resultMap="SysServicesTopicResult"> + SELECT * FROM( + SELECT topic_id, topic_type, content, uid, img, 'customer' AS role FROM sys_services_topic + WHERE uid = #{fromUid} AND del_flag = 0 + ) AS topic + LEFT JOIN (SELECT topic_id, create_time, update_time, `read`, + <choose> + <when test="role == 'admin' or role == 'manager' or role == 'admin-dev'"> + '0' AS id + </when> + <otherwise> + id + </otherwise> + </choose> + FROM sys_services_topic_status + <choose> + <when test="role == 'admin' or role == 'manager' or role == 'admin-dev'"> + WHERE role = 'dietician' + </when> + <otherwise> + WHERE role = #{role} AND uid = #{uid} + </otherwise> + </choose> + ) AS state + USING(topic_id) + ORDER BY `read` ASC, update_time DESC + </select> <!-- 根据userId和角色查询问题列表--> <select id="selectSysServicesTopicByUserIdAndRole" parameterType="SysServicesTopic" @@ -36,8 +85,6 @@ ORDER BY `read` ASC, update_time DESC </otherwise> </choose> - - </select> <!-- 查询主题--> diff --git a/stdiet-ui/src/api/custom/message.js b/stdiet-ui/src/api/custom/message.js index 7b81d2223..a29d6772a 100644 --- a/stdiet-ui/src/api/custom/message.js +++ b/stdiet-ui/src/api/custom/message.js @@ -1,5 +1,13 @@ import request from "@/utils/request"; +export function fetchCustomerList(query) { + return request({ + url: "/services/topic/customers", + method: "get", + params: query + }); +} + export function fetchTopicList(query) { return request({ url: "/services/topic/list", diff --git a/stdiet-ui/src/store/modules/message.js b/stdiet-ui/src/store/modules/message.js index 168bf4cbb..5dbfcd752 100644 --- a/stdiet-ui/src/store/modules/message.js +++ b/stdiet-ui/src/store/modules/message.js @@ -1,4 +1,7 @@ -import { getCustomerPhysicalSignsByCusId } from "@/api/custom/customer"; +import { + getCustomerPhysicalSignsByCusId, + getCustomer +} from "@/api/custom/customer"; import { dealHealthy } from "@/utils/healthyData"; import { listRecipesPlanByCusId, @@ -6,6 +9,7 @@ import { } from "@/api/custom/recipesPlan"; import { + fetchCustomerList, fetchTopicList, postTopicReply, fetchTopicDetail, @@ -14,14 +18,24 @@ import { const oriState = { pageNum: 1, + cusLoading: false, + customerList: [], + selCusId: "", + // topicList: [], - detailData: {}, + topicLoading: false, selTopicId: "", + // + detailData: {}, + detailLoading: false, + // healthyData: {}, healthDataLoading: false, healthyDataType: 0, avoidFoodIds: [], // + customerData: {}, + // planList: [], planListLoading: false }; @@ -44,42 +58,71 @@ const mutations = { const actions = { async init({ dispatch }, payload) { - dispatch("fetchTopicListApi", {}); + dispatch("fetchCustomerListActions", {}); }, - async fetchTopicListApi({ dispatch, commit, rootGetters, state }, payload) { - const { - roles: [role], - userId - } = rootGetters; - const { detailData, pageNum, topicList } = state; - const result = await fetchTopicList({ + + async fetchCustomerListActions( + { dispatch, commit, rootGetters, state }, + payload + ) { + // prettier-ignore + const { roles: [role], userId } = rootGetters; + const { customerList, pageNum } = state; + commit("save", { cusLoading: true }); + const result = await fetchCustomerList({ role, uid: userId, pageSize: 20, pageNum }); - if (result.code === 200) { - if (!detailData.topicId) { - // 默认展示第一个 - const [defTopic] = result.rows; - dispatch("fetchTopicDetailActions", { - topicId: defTopic.topicId, - id: defTopic.id, - uid: defTopic.uid - }); - } - if (result.rows.length) { - commit("save", { - pageNum: pageNum + 1, - topicList: [...topicList, ...result.rows] - }); + let mPageNum = pageNum, + mCustomerList = customerList; + if (result.code === 200 && result.rows.length) { + // + if (!customerList.length) { + const [defCustomer] = result.rows; + dispatch("fetchTopicListApi", { fromUid: defCustomer.uid }); } + // + mPageNum += 1; + mCustomerList = [...customerList, ...result.rows]; } + commit("save", { + pageNum: mPageNum, + cusLoading: false, + customerList: mCustomerList + }); + }, + async fetchTopicListApi({ dispatch, commit, rootGetters, state }, payload) { + // prettier-ignore + const { roles: [role], userId } = rootGetters; + const { fromUid } = payload; + commit("save", { selCusId: fromUid, topicLoading: true }); + const result = await fetchTopicList({ + role, + uid: userId, + fromUid + }); + let mTopicList = []; + if (result.code === 200 && result.rows.length) { + // 默认展示第一个 + const [defTopic] = result.rows; + dispatch("fetchTopicDetailActions", { + topicId: defTopic.topicId, + id: defTopic.id, + uid: defTopic.uid + }); + mTopicList = result.rows; + } + commit("save", { + topicList: mTopicList, + topicLoading: false + }); }, async fetchTopicDetailActions({ commit, dispatch, state }, payload) { - const { topicId, id, uid } = payload; - const { healthyData, planList } = state; - commit("save", { selTopicId: topicId }); + const { topicId, id = 0, uid } = payload; + const { healthyData, planList, customerData } = state; + commit("save", { selTopicId: topicId, detailLoading: true }); // 客户信息 if (healthyData.customerId !== parseInt(uid)) { dispatch("getHealthyData", { cusId: uid, callback: payload.callback }); @@ -88,11 +131,20 @@ const actions = { if (!planList.length || planList[0].cusId !== parseInt(uid)) { dispatch("getRecipesPlanActions", { cusId: uid }); } - + // 客户档案 + if (customerData.id !== parseInt(uid)) { + dispatch("getCustomerFileActions", { cusId: uid }); + } // const result = await fetchTopicDetail({ topicId, id }); if (result.code === 200) { - commit("save", { detailData: result.data[0] }); + commit("save", { detailData: result.data[0], detailLoading: false }); + } + }, + async getCustomerFileActions({ commit }, payload) { + const result = await getCustomer(payload.cusId); + if (result.code === 200) { + commit("save", { customerData: result.data }); } }, async postTopicReplyActions( diff --git a/stdiet-ui/src/views/custom/message/messageBrowser/Comment.vue b/stdiet-ui/src/views/custom/message/messageBrowser/Comment.vue index e60aaa6f4..4ede7df5e 100644 --- a/stdiet-ui/src/views/custom/message/messageBrowser/Comment.vue +++ b/stdiet-ui/src/views/custom/message/messageBrowser/Comment.vue @@ -1,8 +1,8 @@ <template> <div class="topic_comment_item" @click="handOnClick(data)"> <div class="comment_avatar"> - <el-avatar size="medium" :src="data.fromAvatar || ''">{{ - data.fromName.substr(-1) + <el-avatar size="medium" :src="data.fromAvatar">{{ + data.fromName && data.fromName.substr(-1) }}</el-avatar> </div> <div class="comment_content"> diff --git a/stdiet-ui/src/views/custom/message/messageBrowser/index.vue b/stdiet-ui/src/views/custom/message/messageBrowser/index.vue index f90b80429..d0606d10e 100644 --- a/stdiet-ui/src/views/custom/message/messageBrowser/index.vue +++ b/stdiet-ui/src/views/custom/message/messageBrowser/index.vue @@ -1,6 +1,25 @@ <template> <div class="message_browser_wrapper"> - <div class="topic_list" @scroll="handleOnScroll"> + <div class="customers_list" @scroll="handleOnScroll" v-loading="cusLoading"> + <div v-if="customerList && customerList.length"> + <div + v-for="customer in customerList" + :key="customer.uid" + :class="`customer_item ${ + customer.uid === selCusId ? 'customer_item_sel' : '' + }`" + @click="handleOnCustomerClick(customer)" + > + <el-avatar size="medium" :src="customer.avatar"> + {{ customer.name && customer.name.substr(-1) }} + </el-avatar> + <span class="customer_name"> + {{ customer.name }} + </span> + </div> + </div> + </div> + <div class="topic_list" v-loading="topicLoading"> <div v-if="topicList && topicList.length"> <div v-for="topic in topicList" @@ -29,7 +48,7 @@ </div> <div v-else class="topic_list_empty">暂无消息</div> </div> - <div class="topic_detail"> + <div class="topic_detail" v-loading="detailLoading"> <div class="topic_detail_list"> <div class="topic_detail_title" @@ -125,7 +144,16 @@ export default { window.removeEventListener("message", this.handleOnMessage); }, computed: { - ...mapState(["topicList", "selTopicId", "detailData"]), + ...mapState([ + "cusLoading", + "topicLoading", + "detailLoading", + "topicList", + "selCusId", + "selTopicId", + "detailData", + "customerList", + ]), }, methods: { handleOnScroll({ target }) { @@ -133,7 +161,7 @@ export default { target.clientHeight + parseInt(target.scrollTop) === target.scrollHeight ) { - this.fetchTopicListApi(); + this.fetchCustomerListActions(); } }, handleOnMessage({ data }) { @@ -181,6 +209,14 @@ export default { formatDate(date) { return dayjs(date).format("MM-DD HH:mm"); }, + handleOnCustomerClick(data) { + if (this.selCusId !== data.uid) { + this.replyTarget = ""; + this.replyContent = ""; + this.replyObj = {}; + this.fetchTopicListApi({ fromUid: data.uid }); + } + }, handleOnTopicClick(data) { if (data.topicId !== this.selTopicId) { this.replyTarget = ""; @@ -242,6 +278,7 @@ export default { "fetchTopicDetailActions", "postTopicReplyActions", "fetchTopicListApi", + "fetchCustomerListActions", ]), ...mapMutations(["clean", "save"]), ...globalMapActions(["updateUnreadCount"]), @@ -251,13 +288,40 @@ export default { <style lang="scss" scoped> .message_browser_wrapper { display: flex; + + .customers_list { + flex: 1; + overflow: auto; + border-right: 1px solid #f0f0f0; + + .customer_item { + padding: 8px 12px; + cursor: pointer; + display: flex; + align-items: center; + + &:hover { + background: #dedede; + } + + .customer_name { + margin-left: 8px; + } + } + + .customer_item_sel { + background: #f0f0f0; + } + } + .topic_list { flex: 2; overflow: auto; + border-right: 1px solid #f0f0f0; .topic_item { display: flex; - padding: 8px 16px; + padding: 8px 12px; cursor: pointer; &:hover { @@ -318,7 +382,7 @@ export default { } .topic_item_sel { - background: #dedede; + background: #f0f0f0; } .topic_list_empty { diff --git a/stdiet-ui/src/views/custom/message/userInfo/index.vue b/stdiet-ui/src/views/custom/message/userInfo/index.vue index 304299003..e7d69b176 100644 --- a/stdiet-ui/src/views/custom/message/userInfo/index.vue +++ b/stdiet-ui/src/views/custom/message/userInfo/index.vue @@ -1,5 +1,5 @@ <template> - <el-tabs v-model="activeName"> + <el-tabs v-model="activeName" class="message_userinfo_wrapper"> <el-tab-pane label="客户信息" name="health"> <div v-loading="healthDataLoading" @@ -15,6 +15,22 @@ :data="healthyDataType === 1 ? healthyData : {}" v-show="healthyDataType === 1" /> + <div v-if="customerData.id" class="customer_service_info"> + <div class="info_item"> + <span>主任营养师:</span> + <span> + {{ customerData.dietitianName || "无" }} + </span> + </div> + <div class="info_item"> + <span>营养师助理:</span> + <span>{{ customerData.assDietitianName || "无" }}</span> + </div> + <div class="info_item"> + <span>售后营养师:</span> + <span>{{ customerData.afterDietitianName || "无" }}</span> + </div> + </div> </div> </el-tab-pane> <el-tab-pane label="食谱计划" name="plan"> @@ -53,9 +69,30 @@ export default { }, }, computed: { - ...mapState(["healthyData", "healthyDataType", "healthDataLoading"]), + ...mapState([ + "healthyData", + "healthyDataType", + "healthDataLoading", + "customerData", + ]), }, }; </script> <style lang="scss" scoped> +.message_userinfo_wrapper { + .customer_service_info { + position: absolute; + right: 30%; + top: 68px; + + .info_item { + margin-bottom: 10px; + font-size: 14px; + + & > span:nth-child(1) { + color: #8c8c8c; + } + } + } +} </style>