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