From 57a61277fd2edd94a6dab2158554d5a230402864 Mon Sep 17 00:00:00 2001
From: khy <2908249413@qq.com>
Date: Thu, 8 May 2025 11:09:14 +0800
Subject: [PATCH 1/5] =?UTF-8?q?=E7=A7=8D=E8=8D=89=E5=B0=8F=E7=A8=8B?=
=?UTF-8?q?=E5=BA=8F=E6=8E=A5=E5=8F=A3=EF=BC=8C=E7=94=B3=E8=AF=B7=E7=BB=93?=
=?UTF-8?q?=E7=AE=97=E6=8C=89=E9=92=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../mall/trade/brokerage/withdraw/index.ts | 32 +++
.../brokerage/withdraw/ClosingRecordForm.vue | 232 ++++++++++++++++++
.../mall/trade/brokerage/withdraw/index.vue | 14 ++
.../src/views/member/config/index.vue | 23 +-
.../admin/circle/vo/CirclePageReqVO.java | 5 +-
.../admin/circle/vo/CircleRespVO.java | 5 +-
.../admin/circle/vo/CircleSaveReqVO.java | 5 +-
.../app/circle/AppCircleController.java | 31 ++-
.../dal/dataobject/circle/CircleDO.java | 7 +-
.../BrokerageWithdrawController.java | 145 ++++++++++-
.../withdraw/BrokerageSupplyInfoRespVO.java | 61 +++++
.../vo/withdraw/BrokerageWithdrawBaseVO.java | 4 +-
.../brokerage/BrokerageWithdrawConvert.java | 8 +-
.../brokerage/BrokerageWithdrawDO.java | 10 +
.../brokerage/BrokerageUserServiceImpl.java | 5 +-
.../brokerage/BrokerageWithdrawService.java | 5 +
.../BrokerageWithdrawServiceImpl.java | 38 ++-
.../admin/config/vo/MemberConfigBaseVO.java | 12 +
.../dal/dataobject/config/MemberConfigDO.java | 13 +
19 files changed, 637 insertions(+), 18 deletions(-)
create mode 100644 yudao-admin-vue3/src/views/mall/trade/brokerage/withdraw/ClosingRecordForm.vue
create mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/withdraw/BrokerageSupplyInfoRespVO.java
diff --git a/yudao-admin-vue3/src/api/mall/trade/brokerage/withdraw/index.ts b/yudao-admin-vue3/src/api/mall/trade/brokerage/withdraw/index.ts
index c93286a..33eab48 100644
--- a/yudao-admin-vue3/src/api/mall/trade/brokerage/withdraw/index.ts
+++ b/yudao-admin-vue3/src/api/mall/trade/brokerage/withdraw/index.ts
@@ -18,6 +18,28 @@ export interface BrokerageWithdrawVO {
remark: string
}
+export interface withDrawSupplyVO {
+ id: number,
+ userId: number,
+ agentPrice: number,
+ brokeragePrice: number,
+ frozenPrice: number,
+ closingType: number,
+ wechatAccountQrCodeUrl: string,
+ aliyAccountQrCodeUrl: string,
+ realName: string,
+ accountNo: string,
+ bankName: string,
+ bankCardNo: string,
+ supplyPrice: number,
+ remark: string,
+ wechatAccount: string,
+ aliyAccount: string,
+ agentId: number,
+ agentName: string,
+}
+
+
// 查询佣金提现列表
export const getBrokerageWithdrawPage = async (params: any) => {
return await request.get({ url: `/trade/brokerage-withdraw/page`, params })
@@ -37,3 +59,13 @@ export const approveBrokerageWithdraw = async (id: number) => {
export const rejectBrokerageWithdraw = async (data: BrokerageWithdrawVO) => {
return await request.put({ url: `/trade/brokerage-withdraw/reject`, data })
}
+
+// 结算申请
+export const createWithDraw = async (data: withDrawSupplyVO) => {
+ return await request.post({ url: `/trade/brokerage-withdraw/create-supply`,data })
+}
+
+// 导出佣金提现 Excel
+export const exportBrokerageWithDraw = async (params) => {
+ return await request.download({ url: `/trade/brokerage-withdraw/export-excel`, params })
+}
diff --git a/yudao-admin-vue3/src/views/mall/trade/brokerage/withdraw/ClosingRecordForm.vue b/yudao-admin-vue3/src/views/mall/trade/brokerage/withdraw/ClosingRecordForm.vue
new file mode 100644
index 0000000..dc2a868
--- /dev/null
+++ b/yudao-admin-vue3/src/views/mall/trade/brokerage/withdraw/ClosingRecordForm.vue
@@ -0,0 +1,232 @@
+
+
+
+
+
diff --git a/yudao-admin-vue3/src/views/mall/trade/brokerage/withdraw/index.vue b/yudao-admin-vue3/src/views/mall/trade/brokerage/withdraw/index.vue
index 762451f..ac0b11e 100644
--- a/yudao-admin-vue3/src/views/mall/trade/brokerage/withdraw/index.vue
+++ b/yudao-admin-vue3/src/views/mall/trade/brokerage/withdraw/index.vue
@@ -82,6 +82,12 @@
搜索
重置
+
+ 申请结算
+
@@ -184,6 +190,7 @@
+
\ No newline at end of file
+
+
diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/kefu/SupportStaffApi.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/kefu/SupportStaffApi.java
new file mode 100644
index 0000000..da99f03
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/kefu/SupportStaffApi.java
@@ -0,0 +1,13 @@
+package cn.iocoder.yudao.module.promotion.api.kefu;
+
+import cn.iocoder.yudao.module.promotion.api.kefu.dto.SupportStaffDTO;
+
+public interface SupportStaffApi {
+ /**
+ * 获得 skuId 商品匹配的的限时折扣信息
+ * @return 限时折扣信息
+ */
+ SupportStaffDTO getUserIsSupportStaff(Long userId);
+
+ Integer getUnredCount();
+}
diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/kefu/dto/SupportStaffDTO.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/kefu/dto/SupportStaffDTO.java
new file mode 100644
index 0000000..83f90fb
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/kefu/dto/SupportStaffDTO.java
@@ -0,0 +1,66 @@
+package cn.iocoder.yudao.module.promotion.api.kefu.dto;
+
+import lombok.Data;
+
+/**
+ * 客服人员 DO
+ *
+ * @author 管理员
+ */
+@Data
+public class SupportStaffDTO {
+
+ /**
+ * ID
+ */
+ private Integer id;
+ /**
+ * 客服名称
+ */
+ private String name;
+ /**
+ * 客服头像
+ */
+ private String pic;
+ /**
+ * 手机号码
+ */
+ private String phone;
+ /**
+ * 登录账号
+ */
+ private String account;
+ /**
+ * 登录密码
+ */
+ private String password;
+ /**
+ * 客服状态
+ *
+ * 枚举 {@link TODO kefu_support_staff_status 对应的类}
+ */
+ private Integer status;
+ /**
+ * 手机订单管理
+ *
+ * 枚举 {@link TODO kefu_support_staff_order_manage 对应的类}
+ */
+ private Integer orderManage;
+ /**
+ * 订单通知
+ *
+ * 枚举 {@link TODO kefu_support_staff_order_inform 对应的类}
+ */
+ private Integer orderInform;
+
+ /*
+ * 线上状态
+ * */
+ private Integer lineStatus;
+
+ /*
+ * 用户id
+ * */
+ private Long userId;
+
+}
diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
index 88dd670..de3fa95 100644
--- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
+++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
@@ -173,4 +173,6 @@ public interface ErrorCodeConstants {
ErrorCode REGISTRATION_NOT_EXISTS = new ErrorCode(1_024_000_000, "活动报名不存在");
ErrorCode ACTIVITY_INFO_NOT_EXISTS = new ErrorCode(1_025_000_000, "活动信息不存在");
+
+ ErrorCode SUPPORT_STAFF_USER_EXISTS = new ErrorCode(1_026_000_000, "客服人员绑定的用户已存在");
}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/kefu/SupportStaffApiImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/kefu/SupportStaffApiImpl.java
new file mode 100644
index 0000000..19e6ee2
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/kefu/SupportStaffApiImpl.java
@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.promotion.api.kefu;
+
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.promotion.api.kefu.dto.SupportStaffDTO;
+
+import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuConversationDO;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.supportstaff.SupportStaffDO;
+import cn.iocoder.yudao.module.promotion.service.kefu.KeFuConversationService;
+import cn.iocoder.yudao.module.promotion.service.supportstaff.SupportStaffService;
+
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Service
+@Validated
+public class SupportStaffApiImpl implements SupportStaffApi{
+ @Resource
+ private SupportStaffService staffService;
+ @Resource
+ private KeFuConversationService conversationService;
+ @Override
+ public SupportStaffDTO getUserIsSupportStaff(Long userId) {
+ SupportStaffDO staffDO = staffService.getSupportStaffByUserId(userId);
+ return BeanUtils.toBean(staffDO, SupportStaffDTO.class);
+ }
+
+ @Override
+ public Integer getUnredCount() {
+ List conversationDOS = conversationService.getKefuConversationList(null);
+ int totalAge = conversationDOS.stream()
+ .mapToInt(KeFuConversationDO::getAdminUnreadMessageCount) // 将Person对象转换为int(即age值)的Stream
+ .sum(); // 对所有age值进行累加
+ return totalAge;
+ }
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/kefu/vo/message/KeFuMessageListReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/kefu/vo/message/KeFuMessageListReqVO.java
new file mode 100644
index 0000000..dcb4e4c
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/kefu/vo/message/KeFuMessageListReqVO.java
@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 客服消息列表 Request VO")
+@Data
+public class KeFuMessageListReqVO {
+
+ private static final Integer LIMIT = 10;
+
+ @Schema(description = "会话编号", example = "12580")
+ @NotNull(message = "会话编号不能为空")
+ private Long conversationId;
+
+ @Schema(description = "发送时间", example = "2024-03-27 12:00:00")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime createTime;
+
+ @Schema(description = "每次查询条数,最大值为 100", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
+ @NotNull(message = "每次查询条数不能为空")
+ @Min(value = 1, message = "每次查询条数最小值为 1")
+ @Max(value = 100, message = "每次查询最大值为 100")
+ private Integer limit = LIMIT;
+
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffRespVO.java
index cbba878..4c94f20 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffRespVO.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffRespVO.java
@@ -56,5 +56,7 @@ public class SupportStaffRespVO {
private LocalDateTime createTime;
private Integer lineStatus;
+ @Schema(description = "用户id")
+ private Long userId;
-}
\ No newline at end of file
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffSaveReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffSaveReqVO.java
index a5e5659..313f240 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffSaveReqVO.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffSaveReqVO.java
@@ -41,4 +41,7 @@ public class SupportStaffSaveReqVO {
private Integer lineStatus;
-}
\ No newline at end of file
+ @Schema(description = "用户id")
+ private Long userId;
+
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java
index 1cb7d76..e41cf63 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java
@@ -63,6 +63,21 @@ public class AppCircleController {
return success(result);
}
+ @GetMapping("/getById")
+ @Operation(summary = "获得动态对象")
+ @PreAuthenticated
+ public CommonResult getCircleById(@RequestParam("id") Long id) {
+ CircleDO circleDO = circleService.getCircle(id);
+
+ CircleRespVO circleRespVO = BeanUtils.toBean(circleDO, CircleRespVO.class);
+ List listCircleReviewByCircleId = circleReviewService.getListCircleReviewByCircleId(circleRespVO.getId());
+ for (CircleReviewDO reviewDO : listCircleReviewByCircleId) {
+ reviewDO.setRemark(utilMethod(reviewDO.getUserId(),reviewDO.getReplyUserId()));
+ }
+ circleRespVO.setCircleList(listCircleReviewByCircleId);
+ return success(circleRespVO);
+ }
+
@PostMapping("/create")
@Operation(summary = "发表社区动态")
@PreAuthenticated
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/kefu/AppKeFuMessageController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/kefu/AppKeFuMessageController.java
index ab0a5c9..6b83c76 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/kefu/AppKeFuMessageController.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/kefu/AppKeFuMessageController.java
@@ -7,6 +7,8 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
+import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.conversation.KeFuConversationRespVO;
+import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessageListReqVO;
import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessageRespVO;
import cn.iocoder.yudao.module.promotion.controller.app.kefu.vo.message.AppKeFuMessagePageReqVO;
import cn.iocoder.yudao.module.promotion.controller.app.kefu.vo.message.AppKeFuMessageSendReqVO;
@@ -15,17 +17,30 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuMessageDO;
import cn.iocoder.yudao.module.promotion.dal.dataobject.supportstaff.SupportStaffDO;
import cn.iocoder.yudao.module.promotion.dal.mysql.kefu.KeFuConversationMapper;
import cn.iocoder.yudao.module.promotion.dal.mysql.supportstaff.SupportStaffMapper;
+import cn.iocoder.yudao.module.promotion.service.kefu.KeFuConversationService;
import cn.iocoder.yudao.module.promotion.service.kefu.KeFuMessageService;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
+import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@Tag(name = "用户 APP - 客服消息")
@@ -46,12 +61,25 @@ public class AppKeFuMessageController {
@Resource
private SupportStaffMapper supportStaffMapper;
+ @Resource
+ private KeFuConversationService conversationService;
+
+ @Resource
+ private AdminUserApi adminUserApi;
+
@PostMapping("/send")
@Operation(summary = "发送客服消息")
@PreAuthenticated
public CommonResult sendKefuMessage(@Valid @RequestBody AppKeFuMessageSendReqVO sendReqVO) {
- sendReqVO.setSenderId(getLoginUserId()).setSenderType(UserTypeEnum.MEMBER.getValue()); // 设置用户编号和类型
+ SupportStaffDO supportStaffDO = supportStaffMapper.selectOne(new LambdaQueryWrapper()
+ .eq(SupportStaffDO::getUserId, getLoginUserId()));
+ if (supportStaffDO != null && supportStaffDO.getStatus() == 1){
+ sendReqVO.setSenderId(Long.valueOf(supportStaffDO.getId())).setSenderType(UserTypeEnum.ADMIN.getValue()); // 设置用户编号和类型
+ }
+ else {
+ sendReqVO.setSenderId(getLoginUserId()).setSenderType(UserTypeEnum.MEMBER.getValue()); // 设置用户编号和类型
+ }
return success(kefuMessageService.sendKefuMessage(sendReqVO));
}
@@ -98,4 +126,34 @@ public class AppKeFuMessageController {
return true;
}
-}
\ No newline at end of file
+ @GetMapping("/listCoversation")
+ @Operation(summary = "获得客服会话列表")
+ @PreAuthenticated
+ public CommonResult> getConversationList() {
+ // 查询会话列表
+ List respList = BeanUtils.toBean(conversationService.getKefuConversationList(null),
+ KeFuConversationRespVO.class);
+
+ // 拼接数据
+ Map userMap = memberUserApi.getUserMap(convertSet(respList, KeFuConversationRespVO::getUserId));
+ respList.forEach(item -> findAndThen(userMap, item.getUserId(),
+ memberUser -> item.setUserAvatar(memberUser.getAvatar()).setUserNickname(memberUser.getNickname())));
+ return success(respList);
+ }
+
+ @GetMapping("/listMessgaebyCoversation")
+ @Operation(summary = "获取聊天列表")
+ @PreAuthenticated
+ public CommonResult> getKeFuMessageList(@Valid KeFuMessageListReqVO pageReqVO) {
+ // 获得数据
+ List list = kefuMessageService.getKeFuMessageList(pageReqVO);
+
+ // 拼接数据
+ List result = BeanUtils.toBean(list, KeFuMessageRespVO.class);
+ Map userMap = adminUserApi.getUserMap(convertSet(filterList(result,
+ item -> UserTypeEnum.ADMIN.getValue().equals(item.getSenderType())), KeFuMessageRespVO::getSenderId));
+ result.forEach(item -> findAndThen(userMap, item.getSenderId(), user -> item.setSenderAvatar(user.getAvatar())));
+ return success(result);
+ }
+
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/kefu/vo/message/AppKeFuMessageSendReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/kefu/vo/message/AppKeFuMessageSendReqVO.java
index bc25fa6..0daf261 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/kefu/vo/message/AppKeFuMessageSendReqVO.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/kefu/vo/message/AppKeFuMessageSendReqVO.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.promotion.controller.app.kefu.vo.message;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -24,4 +25,11 @@ public class AppKeFuMessageSendReqVO {
@Schema(description = "发送人类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1", hidden = true)
private Integer senderType;
-}
\ No newline at end of file
+
+ @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24571", hidden = true)
+ private Long receiverId;
+
+ @Schema(description = "接收人类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "24571", hidden = true)
+ private Integer receiverType;
+
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/supportstaff/SupportStaffDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/supportstaff/SupportStaffDO.java
index 529dd93..e85d4ee 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/supportstaff/SupportStaffDO.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/supportstaff/SupportStaffDO.java
@@ -68,4 +68,9 @@ public class SupportStaffDO extends BaseDO {
*/
private Integer lineStatus;
-}
\ No newline at end of file
+ /*
+ * 用户id
+ * */
+ private Long userId;
+
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java
index 0a9ffd0..2b8d763 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java
@@ -2,7 +2,9 @@ package cn.iocoder.yudao.module.promotion.service.kefu;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.conversation.KeFuConversationUpdatePinnedReqVO;
+import cn.iocoder.yudao.module.promotion.controller.admin.supportstaff.vo.SupportStaffPageReqVO;
import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuConversationDO;
import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuMessageDO;
import cn.iocoder.yudao.module.promotion.dal.dataobject.supportstaff.SupportStaffDO;
@@ -100,13 +102,24 @@ public class KeFuConversationServiceImpl implements KeFuConversationService {
@Override
public KeFuConversationDO getOrCreateConversation(Long userId) {
KeFuConversationDO conversation = conversationMapper.selectOne(KeFuConversationDO::getUserId, userId);
+ //查询当前后台默认客服
+ Long kefuId = null;
+ SupportStaffPageReqVO vo = new SupportStaffPageReqVO();
+ vo.setStatus(1);
+ PageResult pageResult = supportStaffMapper.selectPage(vo);
+ if (null!=pageResult&&pageResult.getTotal()>=1)
+ kefuId=Long.valueOf(pageResult.getList().get(0).getId());
// 没有历史会话,则初始化一个新会话
if (conversation == null) {
conversation = new KeFuConversationDO().setUserId(userId).setLastMessageTime(LocalDateTime.now())
.setLastMessageContent(StrUtil.EMPTY).setLastMessageContentType(KeFuMessageContentTypeEnum.TEXT.getType())
.setAdminPinned(Boolean.FALSE).setUserDeleted(Boolean.FALSE).setAdminDeleted(Boolean.FALSE)
- .setAdminUnreadMessageCount(0);
- conversationMapper.insert(conversation);
+ .setAdminUnreadMessageCount(0).setKefuId(kefuId);
+ if (userId == null) {
+ conversation = null;
+ }else {
+ conversationMapper.insert(conversation);
+ }
}
return conversation;
}
@@ -140,4 +153,4 @@ public class KeFuConversationServiceImpl implements KeFuConversationService {
return supportStaffDO.getName();
}
-}
\ No newline at end of file
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageService.java
index 81aa0b3..b4ad4ce 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageService.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageService.java
@@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.promotion.service.kefu;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessageListReqVO;
import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessagePageReqVO;
import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessageSendReqVO;
import cn.iocoder.yudao.module.promotion.controller.app.kefu.vo.message.AppKeFuMessagePageReqVO;
@@ -8,6 +9,7 @@ import cn.iocoder.yudao.module.promotion.controller.app.kefu.vo.message.AppKeFuM
import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuMessageDO;
import javax.validation.Valid;
+import java.util.List;
import java.util.Optional;
/**
@@ -73,4 +75,5 @@ public interface KeFuMessageService {
*/
Boolean getLatestMessageBySenderId(Integer senderId);
-}
\ No newline at end of file
+ List getKeFuMessageList(KeFuMessageListReqVO pageReqVO);
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageServiceImpl.java
index 8ab0ac1..c976269 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageServiceImpl.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageServiceImpl.java
@@ -8,9 +8,12 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
+import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessageListReqVO;
import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessagePageReqVO;
import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessageSendReqVO;
import cn.iocoder.yudao.module.promotion.controller.app.kefu.vo.message.AppKeFuMessagePageReqVO;
@@ -29,6 +32,7 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.dal.dataobject.notify.NotifyMessageDO;
import cn.iocoder.yudao.module.system.dal.mysql.notify.NotifyMessageMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -42,6 +46,7 @@ import java.util.concurrent.ConcurrentMap;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.KEFU_CONVERSATION_NOT_EXISTS;
import static cn.iocoder.yudao.module.promotion.enums.WebSocketMessageTypeConstants.KEFU_MESSAGE_ADMIN_READ;
import static cn.iocoder.yudao.module.promotion.enums.WebSocketMessageTypeConstants.KEFU_MESSAGE_TYPE;
@@ -107,10 +112,27 @@ public class KeFuMessageServiceImpl implements KeFuMessageService {
public Long sendKefuMessage(AppKeFuMessageSendReqVO sendReqVO) { //用户发消息
// 1.1 设置会话编号
KeFuMessageDO kefuMessage = BeanUtils.toBean(sendReqVO, KeFuMessageDO.class);
- KeFuConversationDO conversation = conversationService.getOrCreateConversation(sendReqVO.getSenderId());
+ //判断是否是客服
+ SupportStaffDO staff = supportStaffMapper.selectOne(new LambdaUpdateWrapper()
+ .eq(SupportStaffDO::getUserId,getLoginUserId()));
+ //判断客服标志
+ int a = 0;
+ KeFuConversationDO conversation = new KeFuConversationDO();
+ if (staff != null && staff.getStatus() == 1){
+ conversation = conversationService.getOrCreateConversation(sendReqVO.getReceiverId());
+ if (conversation == null){
+ return 5L;
+ }
+ a = 1;
+ }else {
+ conversation = conversationService.getOrCreateConversation(sendReqVO.getSenderId());
+ kefuMessage.setReceiverId(conversation.getUserId()).setReceiverType(UserTypeEnum.MEMBER.getValue());
+ }
+
+// KeFuConversationDO conversation = conversationService.getOrCreateConversation(sendReqVO.getSenderId());
kefuMessage.setConversationId(conversation.getId());
// 1.2 保存消息
- kefuMessage.setReceiverId(conversation.getKefuId()).setReceiverType(UserTypeEnum.ADMIN.getValue()); // 设置接收人
+// kefuMessage.setReceiverId(conversation.getKefuId()).setReceiverType(UserTypeEnum.ADMIN.getValue()); // 设置接收人
keFuMessageMapper.insert(kefuMessage);
// 2. 更新会话消息冗余
@@ -121,7 +143,7 @@ public class KeFuMessageServiceImpl implements KeFuMessageService {
//判断客服是否在线,自动回复
SupportStaffDO supportStaffDO = supportStaffMapper.selectOne("id", conversation.getKefuId());
- if (supportStaffDO.getLineStatus() == 2){ //离线
+ if (supportStaffDO.getLineStatus() == 2 && a == 0){ //离线
KeFuConfigurationDO type = keFuConfigurationMapper.selectOne("type", 1);
if (type != null){ //是否配置了客服不在线回复
if (type.getFeedback() != null){
@@ -140,7 +162,10 @@ public class KeFuMessageServiceImpl implements KeFuMessageService {
}
}
}
-
+ //判断是否是客服
+ if (null!=staff&&staff.getStatus()==1) {
+ getSelf().sendAsyncMessageToMember(sendReqVO.getReceiverId(), KEFU_MESSAGE_TYPE, kefuMessage);
+ }
// 3. 通知所有管理员更新对话
getSelf().sendAsyncMessageToAdmin(KEFU_MESSAGE_TYPE, kefuMessage);
return kefuMessage.getId();
@@ -227,6 +252,11 @@ public class KeFuMessageServiceImpl implements KeFuMessageService {
@Override
public PageResult getKeFuMessagePage(AppKeFuMessagePageReqVO pageReqVO, Long userId) {
+ //判断是否是客服
+ SupportStaffDO staff = supportStaffMapper.selectOne((new LambdaQueryWrapperX()
+ .eq(SupportStaffDO::getUserId, userId)));
+ if (null==staff) {
+// conversationService.getConversation(pageReqVO.getConversationId());
// 1. 获得客服会话
KeFuConversationDO conversation = conversationService.getConversationByUserId(userId);
if (conversation == null) {
@@ -234,6 +264,7 @@ public class KeFuMessageServiceImpl implements KeFuMessageService {
}
// 2. 设置会话编号
pageReqVO.setConversationId(conversation.getId());
+ }
return keFuMessageMapper.selectPage(pageReqVO);
}
@@ -255,4 +286,13 @@ public class KeFuMessageServiceImpl implements KeFuMessageService {
return SpringUtil.getBean(getClass());
}
-}
\ No newline at end of file
+ @Override
+ public List getKeFuMessageList(KeFuMessageListReqVO pageReqVO) {
+ return keFuMessageMapper.selectList(new QueryWrapperX()
+ .eqIfPresent("conversation_id",pageReqVO.getConversationId())
+ .ltIfPresent("create_time",pageReqVO.getCreateTime())
+ .orderByDesc("create_time")
+ .limitN(pageReqVO.getLimit()));
+ }
+
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffService.java
index 482e8d2..32e6a6c 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffService.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffService.java
@@ -55,4 +55,5 @@ public interface SupportStaffService {
*/
void updateLineStatus(String id , Integer lineStatus );
-}
\ No newline at end of file
+ SupportStaffDO getSupportStaffByUserId(Long userId);
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java
index 583c702..755b464 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java
@@ -8,6 +8,9 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.supportstaff.SupportStaf
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.promotion.dal.mysql.supportstaff.SupportStaffMapper;
+
+import java.util.List;
+
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
@@ -27,6 +30,12 @@ public class SupportStaffServiceImpl implements SupportStaffService {
public Integer createSupportStaff(SupportStaffSaveReqVO createReqVO) {
// 插入
SupportStaffDO supportStaff = BeanUtils.toBean(createReqVO, SupportStaffDO.class);
+ if(supportStaff.getUserId() != null){
+ SupportStaffDO staffDO = supportStaffMapper.selectOne("user_id", supportStaff.getUserId());
+ if(staffDO != null){
+ throw exception(SUPPORT_STAFF_USER_EXISTS);
+ }
+ }
supportStaff.setLineStatus(2);
supportStaffMapper.insert(supportStaff);
// 返回
@@ -39,6 +48,17 @@ public class SupportStaffServiceImpl implements SupportStaffService {
validateSupportStaffExists(updateReqVO.getId());
// 更新
SupportStaffDO updateObj = BeanUtils.toBean(updateReqVO, SupportStaffDO.class);
+
+ SupportStaffDO supportStaffDO = supportStaffMapper.selectOne("id", updateReqVO.getId());
+ //判断用户是否被绑定
+ if (updateObj.getUserId() != null){
+ if (supportStaffDO.getUserId() == null || !supportStaffDO.getUserId().equals(updateObj.getUserId())){
+ SupportStaffDO staffDO = supportStaffMapper.selectOne("user_id", updateObj.getUserId());
+ if(staffDO != null){
+ throw exception(SUPPORT_STAFF_USER_EXISTS);
+ }
+ }
+ }
supportStaffMapper.updateById(updateObj);
}
@@ -73,4 +93,9 @@ public class SupportStaffServiceImpl implements SupportStaffService {
supportStaffMapper.updateById(supportStaffDO);
}
-}
\ No newline at end of file
+ @Override
+ public SupportStaffDO getSupportStaffByUserId(Long userId) {
+ return supportStaffMapper.selectOne("user_id", userId);
+ }
+
+}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java
index ba7b813..45b7c64 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java
@@ -55,4 +55,10 @@ public class AppTradeOrderPageItemRespVO {
@Schema(description = "拼团记录编号", example = "100")
private Long combinationRecordId;
+ @Schema(description = "代理商id", example = "25514")
+ private Long agentId;
+
+ @Schema(description = "发票状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Integer invoiceStatus;
+
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/item/AppTradeOrderItemRespVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/item/AppTradeOrderItemRespVO.java
index 98d1820..44093fa 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/item/AppTradeOrderItemRespVO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/item/AppTradeOrderItemRespVO.java
@@ -58,4 +58,8 @@ public class AppTradeOrderItemRespVO {
@Schema(description = "售后状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer afterSaleStatus;
+ @Schema(description = "代理商id", example = "25514")
+ private Long agentId;
+
+
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java
index ed1bef3..e06a3d8 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java
@@ -177,6 +177,11 @@ public class TradeOrderItemDO extends BaseDO {
*/
private Integer afterSaleStatus;
+ /*
+ * 代理商户id
+ * */
+ private Long agentId;
+
/**
* 商品属性
*/
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.java
index a8284a2..6ec5f77 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.java
@@ -34,6 +34,8 @@ import cn.iocoder.yudao.module.member.service.transfer.TransferService;
import cn.iocoder.yudao.module.member.service.transferlog.TransferLogService;
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
import cn.iocoder.yudao.module.member.service.user.PaidMemberUserService;
+import cn.iocoder.yudao.module.promotion.api.kefu.SupportStaffApi;
+import cn.iocoder.yudao.module.promotion.api.kefu.dto.SupportStaffDTO;
import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageUserService;
import io.swagger.v3.oas.annotations.Operation;
@@ -82,6 +84,9 @@ public class AppMemberUserController {
private MemberCodeMapper memberCodeMapper;
@Resource
private PaidMemberUserService paidMemberUserService;
+ @Resource
+ private SupportStaffApi supportStaffApi;
+
@GetMapping("/get")
@Operation(summary = "获得基本信息")
@PreAuthenticated
@@ -89,10 +94,27 @@ public class AppMemberUserController {
MemberUserDO user = userService.getUser(getLoginUserId());
MemberLevelDO level = levelService.getLevel(user.getLevelId());
PaidMemberUserDO paidMemberUserDO = paidMemberUserService.getPaidMemberUserByUid(getLoginUserId());
+ AppMemberUserInfoRespVO appMemberUserInfoRespVO = new AppMemberUserInfoRespVO();
+ //判断是否是客服
+ SupportStaffDTO supportStaffDTO = supportStaffApi.getUserIsSupportStaff(getLoginUserId());
if (paidMemberUserDO == null) {
- return success(MemberUserConvert.INSTANCE.convert(user, level,null,null));
+ appMemberUserInfoRespVO = MemberUserConvert.INSTANCE.convert(user, level,null,null);
+ if (null!=supportStaffDTO&&supportStaffDTO.getStatus()==1) {
+ appMemberUserInfoRespVO.setIdKefu(true);
+ appMemberUserInfoRespVO.setKefuPic(supportStaffDTO.getPic());
+ appMemberUserInfoRespVO.setUnreadCount(supportStaffApi.getUnredCount());
+ }
+ return success(appMemberUserInfoRespVO);
+// return success(MemberUserConvert.INSTANCE.convert(user, level,null,null));
}
- return success(MemberUserConvert.INSTANCE.convert(user, level,paidMemberUserDO.getPayMemberType(),paidMemberUserDO.getCardExpirationTime()));
+ appMemberUserInfoRespVO = MemberUserConvert.INSTANCE.convert(user, level,paidMemberUserDO.getPayMemberType(),paidMemberUserDO.getCardExpirationTime());
+ if (null!=supportStaffDTO&&supportStaffDTO.getStatus()==1) {
+ appMemberUserInfoRespVO.setIdKefu(true);
+ appMemberUserInfoRespVO.setKefuPic(supportStaffDTO.getPic());
+ appMemberUserInfoRespVO.setUnreadCount(supportStaffApi.getUnredCount());
+ }
+ return success(appMemberUserInfoRespVO);
+// return success(MemberUserConvert.INSTANCE.convert(user, level,paidMemberUserDO.getPayMemberType(),paidMemberUserDO.getCardExpirationTime()));
}
@PutMapping("/update")
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppMemberUserInfoRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppMemberUserInfoRespVO.java
index e81b5bf..c7e1d3e 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppMemberUserInfoRespVO.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppMemberUserInfoRespVO.java
@@ -53,6 +53,15 @@ public class AppMemberUserInfoRespVO {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDateTime cardExpirationTime;
+ @Schema(description = "是否是客服")
+ private boolean idKefu=false;
+
+ @Schema(description = "客服图片")
+ private String kefuPic;
+
+ @Schema(description = "未读消息数量")
+ private Integer unreadCount=0;
+
@Schema(description = "用户 App - 会员等级")
@Data
public static class Level {
--
2.47.2
From 8c6fb56c3fc4bd7d80e51d8b7b272895b9e0b2dc Mon Sep 17 00:00:00 2001
From: khy <2908249413@qq.com>
Date: Fri, 6 Jun 2025 17:18:29 +0800
Subject: [PATCH 3/5] =?UTF-8?q?=E7=A7=8D=E8=8D=89=E7=82=B9=E8=B5=9E?=
=?UTF-8?q?=E4=BF=AE=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../app/circle/AppCircleController.java | 2 +-
.../dataobject/circlelike/CircleLikeDO.java | 37 +++++++++++++
.../mysql/circlelike/CircleLikeMapper.java | 19 +++++++
.../service/circle/CircleService.java | 4 +-
.../service/circle/CircleServiceImpl.java | 22 ++++++--
.../service/circlelike/CircleLikeService.java | 24 +++++++++
.../circlelike/CircleLikeServiceImpl.java | 52 +++++++++++++++++++
7 files changed, 154 insertions(+), 6 deletions(-)
create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/circlelike/CircleLikeDO.java
create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/circlelike/CircleLikeMapper.java
create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circlelike/CircleLikeService.java
create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circlelike/CircleLikeServiceImpl.java
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java
index e41cf63..2549c62 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java
@@ -112,7 +112,7 @@ public class AppCircleController {
@Operation(summary = "点赞/取消点赞")
@PreAuthenticated
public CommonResult doLike(@RequestParam("id") Long lookId){
- circleService.updateLikeCount(lookId);
+ circleService.updateLikeCount(lookId,getLoginUserId());
return success(true);
}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/circlelike/CircleLikeDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/circlelike/CircleLikeDO.java
new file mode 100644
index 0000000..dacc29d
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/circlelike/CircleLikeDO.java
@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.promotion.dal.dataobject.circlelike;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 商城动态 DO
+ *
+ * @author 管理员
+ */
+@TableName("promotion_circle_like")
+@KeySequence("promotion_circle_like_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CircleLikeDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 用户编号
+ */
+ private Long userId;
+ /**
+ * 种草id
+ */
+ private Long circleId;
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/circlelike/CircleLikeMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/circlelike/CircleLikeMapper.java
new file mode 100644
index 0000000..9c504e3
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/circlelike/CircleLikeMapper.java
@@ -0,0 +1,19 @@
+package cn.iocoder.yudao.module.promotion.dal.mysql.circlelike;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.promotion.controller.admin.circle.vo.CirclePageReqVO;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.circle.CircleDO;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.circlelike.CircleLikeDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 商城动态 Mapper
+ *
+ * @author 管理员
+ */
+@Mapper
+public interface CircleLikeMapper extends BaseMapperX {
+
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circle/CircleService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circle/CircleService.java
index 16bb754..cff5548 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circle/CircleService.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circle/CircleService.java
@@ -33,7 +33,7 @@ public interface CircleService {
void addLookCount(Long circleId);
//点赞/取消点赞
- void updateLikeCount(Long circleId);
+ void updateLikeCount(Long circleId,Long userId);
/**
* 删除商城动态
@@ -58,4 +58,4 @@ public interface CircleService {
*/
PageResult getCirclePage(CirclePageReqVO pageReqVO);
-}
\ No newline at end of file
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circle/CircleServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circle/CircleServiceImpl.java
index 06f2686..6d66f99 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circle/CircleServiceImpl.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circle/CircleServiceImpl.java
@@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.promotion.service.circle;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.circlelike.CircleLikeDO;
+import cn.iocoder.yudao.module.promotion.service.circlelike.CircleLikeService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@@ -29,6 +31,9 @@ public class CircleServiceImpl implements CircleService {
@Resource
private CircleMapper circleMapper;
+ @Resource
+ private CircleLikeService circleLikeService;
+
@Override
public Long createCircle(CircleSaveReqVO createReqVO) {
// 插入
@@ -55,9 +60,20 @@ public class CircleServiceImpl implements CircleService {
}
@Override
- public void updateLikeCount(Long circleId) {
+ public void updateLikeCount(Long circleId,Long userId) {
CircleDO circleDO = circleMapper.selectOne("id", circleId);
- circleDO.setLookCount(circleDO.getLikeCount() + 1);
+ CircleLikeDO circleLikeDO = circleLikeService.getCircleLike(circleId,userId);
+ if (circleLikeDO != null){
+ circleLikeService.deleteCircleLike(circleLikeDO.getId());
+ circleDO.setLikeCount(circleDO.getLikeCount() - 1);
+ }
+ else {
+ circleDO.setLikeCount(circleDO.getLikeCount() + 1);
+ circleLikeDO = new CircleLikeDO();
+ circleLikeDO.setCircleId(circleId);
+ circleLikeDO.setUserId(userId);
+ circleLikeService.createCircleLike(circleLikeDO);
+ }
circleMapper.updateById(circleDO);
}
@@ -85,4 +101,4 @@ public class CircleServiceImpl implements CircleService {
return circleMapper.selectPage(pageReqVO);
}
-}
\ No newline at end of file
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circlelike/CircleLikeService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circlelike/CircleLikeService.java
new file mode 100644
index 0000000..9689fbf
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circlelike/CircleLikeService.java
@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.promotion.service.circlelike;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.promotion.controller.admin.circle.vo.CirclePageReqVO;
+import cn.iocoder.yudao.module.promotion.controller.admin.circle.vo.CircleSaveReqVO;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.circle.CircleDO;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.circlelike.CircleLikeDO;
+
+import javax.validation.Valid;
+
+/**
+ * 商城动态 Service 接口
+ *
+ * @author 管理员
+ */
+public interface CircleLikeService {
+
+
+ CircleLikeDO getCircleLike(Long circleId, Long userId);
+
+ void deleteCircleLike(Long id);
+
+ void createCircleLike(CircleLikeDO circleLikeDO);
+}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circlelike/CircleLikeServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circlelike/CircleLikeServiceImpl.java
new file mode 100644
index 0000000..e97e28c
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/circlelike/CircleLikeServiceImpl.java
@@ -0,0 +1,52 @@
+package cn.iocoder.yudao.module.promotion.service.circlelike;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.promotion.controller.admin.circle.vo.CirclePageReqVO;
+import cn.iocoder.yudao.module.promotion.controller.admin.circle.vo.CircleSaveReqVO;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.circle.CircleDO;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.circlelike.CircleLikeDO;
+import cn.iocoder.yudao.module.promotion.dal.mysql.circle.CircleMapper;
+import cn.iocoder.yudao.module.promotion.dal.mysql.circlelike.CircleLikeMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.CIRCLE_NOT_EXISTS;
+
+/**
+ * 商城动态 Service 实现类
+ *
+ * @author 管理员
+ */
+@Service
+@Validated
+public class CircleLikeServiceImpl implements CircleLikeService {
+
+ @Resource
+ private CircleLikeMapper circleLikeMapper;
+
+
+ @Override
+ public CircleLikeDO getCircleLike(Long circleId, Long userId) {
+ CircleLikeDO circleLikeDO = circleLikeMapper.selectOne(new LambdaQueryWrapper()
+ .eq(CircleLikeDO::getCircleId,circleId)
+ .eq(CircleLikeDO::getUserId,userId)
+ .eq(BaseDO::getDeleted,false));
+ return circleLikeDO;
+ }
+
+ @Override
+ public void deleteCircleLike(Long id) {
+ circleLikeMapper.deleteById(id);
+ }
+
+ @Override
+ public void createCircleLike(CircleLikeDO circleLikeDO) {
+ circleLikeMapper.insert(circleLikeDO);
+ }
+}
--
2.47.2
From 59e6c4871feca01be2af3003ca407bb5d9b25112 Mon Sep 17 00:00:00 2001
From: khy <2908249413@qq.com>
Date: Fri, 6 Jun 2025 22:04:40 +0800
Subject: [PATCH 4/5] =?UTF-8?q?=E5=AE=A2=E6=9C=8D=E7=BB=91=E5=AE=9A?=
=?UTF-8?q?=E5=90=8E=E5=8F=B0=E7=94=A8=E6=88=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../kefu/KeFuConversationController.java | 19 ++++++++++
.../app/circle/AppCircleController.java | 16 ++++++++
.../service/kefu/KeFuConversationService.java | 8 ++++
.../kefu/KeFuConversationServiceImpl.java | 14 +++++++
.../service/kefu/KeFuMessageServiceImpl.java | 7 ++++
.../supportstaff/SupportStaffServiceImpl.java | 38 +++++++++++++++++++
.../service/user/AdminUserServiceImpl.java | 2 +-
7 files changed, 103 insertions(+), 1 deletion(-)
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/kefu/KeFuConversationController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/kefu/KeFuConversationController.java
index de4a906..7bdaa24 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/kefu/KeFuConversationController.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/kefu/KeFuConversationController.java
@@ -37,6 +37,25 @@ public class KeFuConversationController {
@Resource
private MemberUserApi memberUserApi;
+ @GetMapping("/get")
+ @Operation(summary = "获得客服会话")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('promotion:kefu-conversation:query')")
+ public CommonResult getConversation(@RequestParam("id") Long id) {
+ KeFuConversationDO conversation = conversationService.getConversation(id);
+ if (conversation == null) {
+ return success(null);
+ }
+
+ // 拼接数据
+ KeFuConversationRespVO result = BeanUtils.toBean(conversation, KeFuConversationRespVO.class);
+ MemberUserRespDTO memberUser = memberUserApi.getUser(conversation.getUserId());
+ if (memberUser != null) {
+ result.setUserAvatar(memberUser.getAvatar()).setUserNickname(memberUser.getNickname());
+ }
+ return success(result);
+ }
+
@PutMapping("/update-conversation-pinned")
@Operation(summary = "置顶/取消置顶客服会话")
@PreAuthorize("@ss.hasPermission('promotion:kefu-conversation:update')")
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java
index 2549c62..219092b 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java
@@ -10,8 +10,10 @@ import cn.iocoder.yudao.module.promotion.controller.admin.circle.vo.CircleRespVO
import cn.iocoder.yudao.module.promotion.controller.admin.circle.vo.CircleSaveReqVO;
import cn.iocoder.yudao.module.promotion.controller.admin.circlereview.vo.CircleReviewSaveReqVO;
import cn.iocoder.yudao.module.promotion.dal.dataobject.circle.CircleDO;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.circlelike.CircleLikeDO;
import cn.iocoder.yudao.module.promotion.dal.dataobject.circlereview.CircleReviewDO;
import cn.iocoder.yudao.module.promotion.service.circle.CircleService;
+import cn.iocoder.yudao.module.promotion.service.circlelike.CircleLikeService;
import cn.iocoder.yudao.module.promotion.service.circlereview.CircleReviewService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -37,6 +39,8 @@ public class AppCircleController {
private CircleReviewService circleReviewService;
@Resource
private MemberUserApi memberUserApi;
+ @Resource
+ private CircleLikeService circleLikeService;
public String utilMethod(Long userId,Long reviewId){
String nickname = memberUserApi.getUser(userId).getNickname();
@@ -108,6 +112,18 @@ public class AppCircleController {
return success(true);
}
+ @GetMapping("/getLike")
+ @Operation(summary = "查询是否点赞")
+ @PreAuthenticated
+ public CommonResult getLike(@RequestParam("id") Long lookId){
+ CircleLikeDO circleLikeDO = circleLikeService.getCircleLike(lookId,getLoginUserId());
+ Boolean isLike = false;
+ if (circleLikeDO != null){
+ isLike = true;
+ }
+ return success(isLike);
+ }
+
@PutMapping("/doLike")
@Operation(summary = "点赞/取消点赞")
@PreAuthenticated
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationService.java
index 52b5179..2882b39 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationService.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationService.java
@@ -13,6 +13,14 @@ import java.util.List;
*/
public interface KeFuConversationService {
+ /**
+ * 获得客服会话
+ *
+ * @param id 编号
+ * @return 客服会话
+ */
+ KeFuConversationDO getConversation(Long id);
+
/**
* 【管理员】删除客服会话
*
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java
index 2b8d763..82d1033 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java
@@ -37,6 +37,11 @@ public class KeFuConversationServiceImpl implements KeFuConversationService {
@Resource
private SupportStaffMapper supportStaffMapper;
+ @Override
+ public KeFuConversationDO getConversation(Long id) {
+ return conversationMapper.selectById(id);
+ }
+
@Override
public void deleteKefuConversation(Long id) {
// 校验存在
@@ -145,11 +150,20 @@ public class KeFuConversationServiceImpl implements KeFuConversationService {
@Override
public String transferConversation(Long id, Long kefuId) {
+ //先下线
+ KeFuConversationDO currDo = conversationMapper.selectById(id);
+ SupportStaffDO currSs = supportStaffMapper.selectById(currDo.getKefuId());
+ currSs.setStatus(0);
+ supportStaffMapper.updateById(currSs);
+ //会话转接
KeFuConversationDO keFuConversationDO = new KeFuConversationDO();
keFuConversationDO.setId(id);
keFuConversationDO.setKefuId(kefuId);
conversationMapper.updateById(keFuConversationDO);
+ //再上线新客服
SupportStaffDO supportStaffDO = supportStaffMapper.selectById(kefuId);
+ supportStaffDO.setStatus(1);
+ supportStaffMapper.updateById(supportStaffDO);
return supportStaffDO.getName();
}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageServiceImpl.java
index c976269..84e9348 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageServiceImpl.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageServiceImpl.java
@@ -194,6 +194,13 @@ public class KeFuMessageServiceImpl implements KeFuMessageService {
@Override
@Transactional(rollbackFor = Exception.class)
public void updateKeFuMessageReadStatus(Long conversationId, Long userId, Integer userType) {
+ //判断是否是客服
+ SupportStaffDO staff = supportStaffMapper.selectOne(new LambdaUpdateWrapper()
+ .eq(SupportStaffDO::getUserId,getLoginUserId()));
+ if (staff != null && staff.getStatus() == 1){
+ conversationService.updateAdminUnreadMessageCountToZero(conversationId);
+ return;
+ }
// 1.1 校验会话是否存在
KeFuConversationDO conversation = conversationService.validateKefuConversationExists(conversationId);
// 1.2 如果是会员端处理已读,需要传递 userId;万一用户模拟一个 conversationId
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java
index 755b464..e6c9d39 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java
@@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.promotion.service.supportstaff;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@@ -13,6 +15,7 @@ import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS;
/**
* 客服人员 Service 实现类
@@ -26,6 +29,9 @@ public class SupportStaffServiceImpl implements SupportStaffService {
@Resource
private SupportStaffMapper supportStaffMapper;
+ @Resource
+ private AdminUserApi adminUserApi;
+
@Override
public Integer createSupportStaff(SupportStaffSaveReqVO createReqVO) {
// 插入
@@ -36,8 +42,23 @@ public class SupportStaffServiceImpl implements SupportStaffService {
throw exception(SUPPORT_STAFF_USER_EXISTS);
}
}
+ List users = adminUserApi.getListNoArgs();
+ if(!users.isEmpty()){
+ users.forEach(user -> {
+ if(user.getUsername().equals(createReqVO.getAccount())){
+ throw exception(USER_USERNAME_EXISTS);
+ }
+ });
+ }
supportStaff.setLineStatus(2);
supportStaffMapper.insert(supportStaff);
+ AdminUserRespDTO adminUserRespDTO = new AdminUserRespDTO();
+ adminUserRespDTO.setUsername(createReqVO.getAccount());
+ adminUserRespDTO.setMobile(supportStaff.getPhone());
+ adminUserRespDTO.setPassword(createReqVO.getPassword());
+ adminUserRespDTO.setNickname(supportStaff.getName());
+
+ adminUserApi.createUserBySupportStaff(adminUserRespDTO);
// 返回
return supportStaff.getId();
}
@@ -50,6 +71,23 @@ public class SupportStaffServiceImpl implements SupportStaffService {
SupportStaffDO updateObj = BeanUtils.toBean(updateReqVO, SupportStaffDO.class);
SupportStaffDO supportStaffDO = supportStaffMapper.selectOne("id", updateReqVO.getId());
+ AdminUserRespDTO adminUser = new AdminUserRespDTO();
+ adminUser.setUsername(updateReqVO.getAccount());
+ adminUser.setMobile(updateReqVO.getPhone());
+ adminUser.setPassword(updateReqVO.getPassword());
+ adminUser.setNickname(updateReqVO.getName());
+
+ AdminUserRespDTO adminUserRespDTO = adminUserApi.getUserByUserName(supportStaffDO.getAccount());
+ if(adminUserRespDTO == null){
+ // 新建一个后台账户
+ adminUserApi.createUserBySupportStaff(adminUser);
+ }
+ else {
+ adminUserRespDTO.setUsername(adminUser.getUsername());
+ adminUserRespDTO.setPassword(adminUser.getPassword());
+ adminUserApi.updateUserBySupportStaff(adminUserRespDTO);
+ }
+
//判断用户是否被绑定
if (updateObj.getUserId() != null){
if (supportStaffDO.getUserId() == null || !supportStaffDO.getUserId().equals(updateObj.getUserId())){
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
index dd8a96f..36f6df1 100644
--- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
@@ -589,7 +589,7 @@ public class AdminUserServiceImpl implements AdminUserService {
userPostMapper.insertBatch(convertList(user.getPostIds(),
postId -> new UserPostDO().setUserId(user.getId()).setPostId(postId)));
}
- RoleDO role = roleService.getRoleByCode("support_staff");
+ RoleDO role = roleService.getRoleByCode("chat");
if (role != null){
//给后台用户关联客服角色
permissionService.assignUserRole(user.getId(), Collections.singleton(role.getId()));
--
2.47.2
From 1b4196ceeff087862113a1ee3ad52a9de2162ac5 Mon Sep 17 00:00:00 2001
From: khy <2908249413@qq.com>
Date: Mon, 9 Jun 2025 13:08:59 +0800
Subject: [PATCH 5/5] =?UTF-8?q?=E5=85=8D=E7=99=BB=E5=BD=95=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../app/auth/AppAuthController.java | 6 ++++++
.../service/auth/MemberAuthService.java | 2 ++
.../service/auth/MemberAuthServiceImpl.java | 19 +++++++++++++++++++
3 files changed, 27 insertions(+)
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java
index 5d3c936..61be636 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java
@@ -123,4 +123,10 @@ public class AppAuthController {
return success(AuthConvert.INSTANCE.convert(signature));
}
+ @PostMapping("/checkLogin")
+ @PermitAll
+ public CommonResult checkLogin(@RequestBody @Valid AppAuthSocialLoginReqVO reqVO) {
+ return success(authService.checkLogin(reqVO));
+ }
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java
index 8afc09e..fc17929 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java
@@ -85,4 +85,6 @@ public interface MemberAuthService {
*/
AppAuthLoginRespVO refreshToken(String refreshToken);
+ Integer checkLogin(AppAuthSocialLoginReqVO reqVO);
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java
index e1a8ec5..f3c74d4 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java
@@ -258,6 +258,25 @@ public class MemberAuthServiceImpl implements MemberAuthService {
return AuthConvert.INSTANCE.convert(accessTokenDO, null);
}
+ @Override
+ public Integer checkLogin(AppAuthSocialLoginReqVO reqVO) {
+ // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
+ SocialUserRespDTO socialUser = socialUserApi.getSocialUserByCode(UserTypeEnum.MEMBER.getValue(), reqVO.getType(),
+ reqVO.getCode(), reqVO.getState());
+ System.out.println(socialUser);
+ if (socialUser == null) {
+ System.out.println("111");
+ throw exception(AUTH_SOCIAL_USER_NOT_FOUND);
+ }
+
+ //判断openid是否存在
+// SocialUserRespDTO respDTO = socialUserApi.getSocialUserByOpenId(socialUser.getOpenid());
+ if (socialUser.getUserId() == null) {
+ return -1;
+ }
+ return 1;
+ }
+
private void createLogoutLog(Long userId) {
LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO();
reqDTO.setLogType(LoginLogTypeEnum.LOGOUT_SELF.getType());
--
2.47.2