From 85a0e9a9b1ba9e28659223064bf6ef57a311633f Mon Sep 17 00:00:00 2001 From: sonjinyon <2476687577@qq.com> Date: Mon, 21 Oct 2024 10:09:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E5=8F=B0=E6=B7=BB=E5=8A=A0=E5=AE=A2?= =?UTF-8?q?=E6=9C=8D=E4=BA=BA=E5=91=98=EF=BC=8C=E8=AF=9D=E6=9C=AF=EF=BC=8C?= =?UTF-8?q?=E7=95=99=E8=A8=80=EF=BC=8C=E8=87=AA=E5=8A=A8=E5=9B=9E=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/mall/promotion/autoresponse/index.ts | 43 + .../src/api/mall/promotion/leaveword/index.ts | 51 ++ .../api/mall/promotion/supportstaff/index.ts | 47 + .../api/mall/promotion/verbaltrick/index.ts | 47 + yudao-admin-vue3/src/utils/dict.ts | 15 + .../autoresponse/AutoResponseForm.vue | 125 +++ .../mall/promotion/autoresponse/index.vue | 232 +++++ .../kefu/components/KeFuMessageList.vue | 865 +++++++++--------- .../src/views/mall/promotion/kefu/index.vue | 3 +- .../promotion/leaveword/LeaveWordForm.vue | 73 ++ .../views/mall/promotion/leaveword/index.vue | 223 +++++ .../point/activity/PointActivityForm.vue | 6 +- .../supportstaff/SupportStaffForm.vue | 159 ++++ .../mall/promotion/supportstaff/index.vue | 301 ++++++ .../promotion/verbaltrick/VerbalTrickForm.vue | 111 +++ .../mall/promotion/verbaltrick/index.vue | 211 +++++ .../promotion/enums/ErrorCodeConstants.java | 12 + .../autoresponse/AutoResponseController.java | 95 ++ .../vo/AutoResponsePageReqVO.java | 34 + .../autoresponse/vo/AutoResponseRespVO.java | 43 + .../vo/AutoResponseSaveReqVO.java | 31 + .../admin/leaveword/LeaveWordController.java | 101 ++ .../leaveword/vo/LeaveWordPageReqVO.java | 36 + .../admin/leaveword/vo/LeaveWordRespVO.java | 44 + .../leaveword/vo/LeaveWordSaveReqVO.java | 33 + .../supportstaff/SupportStaffController.java | 94 ++ .../vo/SupportStaffPageReqVO.java | 45 + .../supportstaff/vo/SupportStaffRespVO.java | 58 ++ .../vo/SupportStaffSaveReqVO.java | 42 + .../verbaltrick/VerbalTrickController.java | 123 +++ .../verbaltrick/vo/VerbalTrickPageReqVO.java | 31 + .../verbaltrick/vo/VerbalTrickRespVO.java | 38 + .../verbaltrick/vo/VerbalTrickSaveReqVO.java | 26 + .../autoresponse/AutoResponseDO.java | 51 ++ .../dal/dataobject/leaveword/LeaveWordDO.java | 50 + .../supportstaff/SupportStaffDO.java | 66 ++ .../dataobject/verbaltrick/VerbalTrickDO.java | 42 + .../autoresponse/AutoResponseMapper.java | 30 + .../dal/mysql/leaveword/LeaveWordMapper.java | 29 + .../supportstaff/SupportStaffMapper.java | 32 + .../mysql/verbaltrick/VerbalTrickMapper.java | 29 + .../autoresponse/AutoResponseService.java | 55 ++ .../autoresponse/AutoResponseServiceImpl.java | 74 ++ .../service/leaveword/LeaveWordService.java | 67 ++ .../leaveword/LeaveWordServiceImpl.java | 86 ++ .../supportstaff/SupportStaffService.java | 53 ++ .../supportstaff/SupportStaffServiceImpl.java | 68 ++ .../verbaltrick/VerbalTrickService.java | 61 ++ .../verbaltrick/VerbalTrickServiceImpl.java | 79 ++ .../channel/PayChannelServiceImpl.java | 1 + .../vo/LitemallReservationRespVO.java | 3 - .../app/brand/AppBrandController.java | 46 - .../reservation/AppReservationController.java | 59 -- .../technician/AppTechnicianController.java | 86 -- .../reservation/LitemallReservationDO.java | 5 - 55 files changed, 3845 insertions(+), 625 deletions(-) create mode 100644 yudao-admin-vue3/src/api/mall/promotion/autoresponse/index.ts create mode 100644 yudao-admin-vue3/src/api/mall/promotion/leaveword/index.ts create mode 100644 yudao-admin-vue3/src/api/mall/promotion/supportstaff/index.ts create mode 100644 yudao-admin-vue3/src/api/mall/promotion/verbaltrick/index.ts create mode 100644 yudao-admin-vue3/src/views/mall/promotion/autoresponse/AutoResponseForm.vue create mode 100644 yudao-admin-vue3/src/views/mall/promotion/autoresponse/index.vue create mode 100644 yudao-admin-vue3/src/views/mall/promotion/leaveword/LeaveWordForm.vue create mode 100644 yudao-admin-vue3/src/views/mall/promotion/leaveword/index.vue create mode 100644 yudao-admin-vue3/src/views/mall/promotion/supportstaff/SupportStaffForm.vue create mode 100644 yudao-admin-vue3/src/views/mall/promotion/supportstaff/index.vue create mode 100644 yudao-admin-vue3/src/views/mall/promotion/verbaltrick/VerbalTrickForm.vue create mode 100644 yudao-admin-vue3/src/views/mall/promotion/verbaltrick/index.vue create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/autoresponse/AutoResponseController.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/autoresponse/vo/AutoResponsePageReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/autoresponse/vo/AutoResponseRespVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/autoresponse/vo/AutoResponseSaveReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/leaveword/LeaveWordController.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/leaveword/vo/LeaveWordPageReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/leaveword/vo/LeaveWordRespVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/leaveword/vo/LeaveWordSaveReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/SupportStaffController.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffPageReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffRespVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffSaveReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/verbaltrick/VerbalTrickController.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/verbaltrick/vo/VerbalTrickPageReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/verbaltrick/vo/VerbalTrickRespVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/verbaltrick/vo/VerbalTrickSaveReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/autoresponse/AutoResponseDO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/leaveword/LeaveWordDO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/supportstaff/SupportStaffDO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/verbaltrick/VerbalTrickDO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/autoresponse/AutoResponseMapper.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/leaveword/LeaveWordMapper.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/supportstaff/SupportStaffMapper.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/verbaltrick/VerbalTrickMapper.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/autoresponse/AutoResponseService.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/autoresponse/AutoResponseServiceImpl.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/leaveword/LeaveWordService.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/leaveword/LeaveWordServiceImpl.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffService.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/verbaltrick/VerbalTrickService.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/verbaltrick/VerbalTrickServiceImpl.java diff --git a/yudao-admin-vue3/src/api/mall/promotion/autoresponse/index.ts b/yudao-admin-vue3/src/api/mall/promotion/autoresponse/index.ts new file mode 100644 index 0000000..ab10b57 --- /dev/null +++ b/yudao-admin-vue3/src/api/mall/promotion/autoresponse/index.ts @@ -0,0 +1,43 @@ +import request from '@/config/axios' + +// 自动回复 VO +export interface AutoResponseVO { + id: number // id + keyword: string // 关键字 + type: number // 回复类型,文字消息/0,图片消息/1 + content: string // 回复内容 + status: number // 是否开启,开启/1,关闭/0 +} + +// 自动回复 API +export const AutoResponseApi = { + // 查询自动回复分页 + getAutoResponsePage: async (params: any) => { + return await request.get({ url: `/promotion/auto-response/page`, params }) + }, + + // 查询自动回复详情 + getAutoResponse: async (id: number) => { + return await request.get({ url: `/promotion/auto-response/get?id=` + id }) + }, + + // 新增自动回复 + createAutoResponse: async (data: AutoResponseVO) => { + return await request.post({ url: `/promotion/auto-response/create`, data }) + }, + + // 修改自动回复 + updateAutoResponse: async (data: AutoResponseVO) => { + return await request.put({ url: `/promotion/auto-response/update`, data }) + }, + + // 删除自动回复 + deleteAutoResponse: async (id: number) => { + return await request.delete({ url: `/promotion/auto-response/delete?id=` + id }) + }, + + // 导出自动回复 Excel + exportAutoResponse: async (params) => { + return await request.download({ url: `/promotion/auto-response/export-excel`, params }) + } +} \ No newline at end of file diff --git a/yudao-admin-vue3/src/api/mall/promotion/leaveword/index.ts b/yudao-admin-vue3/src/api/mall/promotion/leaveword/index.ts new file mode 100644 index 0000000..a4d3f5c --- /dev/null +++ b/yudao-admin-vue3/src/api/mall/promotion/leaveword/index.ts @@ -0,0 +1,51 @@ +import request from '@/config/axios' + +// 用户留言 VO +export interface LeaveWordVO { + id: number // id + name: string // 昵称 + phone: string // 电话 + content: string // 内容 + response: string //回复内容 + status: number // 状态 +} + +// 用户留言 API +export const LeaveWordApi = { + // 查询用户留言分页 + getLeaveWordPage: async (params: any) => { + return await request.get({ url: `/promotion/leave-word/page`, params }) + }, + + // 查询用户留言详情 + getLeaveWord: async (id: number) => { + return await request.get({ url: `/promotion/leave-word/get?id=` + id }) + }, + + // 新增用户留言 + createLeaveWord: async (data: LeaveWordVO) => { + return await request.post({ url: `/promotion/leave-word/create`, data }) + }, + + // 修改用户留言 + updateLeaveWord: async (data: LeaveWordVO) => { + return await request.put({ url: `/promotion/leave-word/update`, data }) + }, + + // 删除用户留言 + deleteLeaveWord: async (id: number) => { + return await request.delete({ url: `/promotion/leave-word/delete?id=` + id }) + }, + + // 导出用户留言 Excel + exportLeaveWord: async (params) => { + return await request.download({ url: `/promotion/leave-word/export-excel`, params }) + }, + + // 添加回复内容 + addResponse: async (id: number, content: string) => { + return await request.get({ url: `/promotion/leave-word/addResponse?id=` + id +`&&response=` + content }) + }, + + +} \ No newline at end of file diff --git a/yudao-admin-vue3/src/api/mall/promotion/supportstaff/index.ts b/yudao-admin-vue3/src/api/mall/promotion/supportstaff/index.ts new file mode 100644 index 0000000..b8e7424 --- /dev/null +++ b/yudao-admin-vue3/src/api/mall/promotion/supportstaff/index.ts @@ -0,0 +1,47 @@ +import request from '@/config/axios' + +// 客服人员 VO +export interface SupportStaffVO { + id: number // ID + name: string // 客服名称 + pic: string //头像 + phone: string // 手机号码 + account: string // 登录账号 + password: string // 登录密码 + status: number // 客服状态 + orderManage: number // 手机订单管理 + orderInform: number // 订单通知 +} + +// 客服人员 API +export const SupportStaffApi = { + // 查询客服人员分页 + getSupportStaffPage: async (params: any) => { + return await request.get({ url: `/promotion/support-staff/page`, params }) + }, + + // 查询客服人员详情 + getSupportStaff: async (id: number) => { + return await request.get({ url: `/promotion/support-staff/get?id=` + id }) + }, + + // 新增客服人员 + createSupportStaff: async (data: SupportStaffVO) => { + return await request.post({ url: `/promotion/support-staff/create`, data }) + }, + + // 修改客服人员 + updateSupportStaff: async (data: SupportStaffVO) => { + return await request.put({ url: `/promotion/support-staff/update`, data }) + }, + + // 删除客服人员 + deleteSupportStaff: async (id: number) => { + return await request.delete({ url: `/promotion/support-staff/delete?id=` + id }) + }, + + // 导出客服人员 Excel + exportSupportStaff: async (params) => { + return await request.download({ url: `/promotion/support-staff/export-excel`, params }) + } +} diff --git a/yudao-admin-vue3/src/api/mall/promotion/verbaltrick/index.ts b/yudao-admin-vue3/src/api/mall/promotion/verbaltrick/index.ts new file mode 100644 index 0000000..a751a23 --- /dev/null +++ b/yudao-admin-vue3/src/api/mall/promotion/verbaltrick/index.ts @@ -0,0 +1,47 @@ +import request from '@/config/axios' + +// 客服话术 VO +export interface VerbalTrickVO { + id: number // id + type: number // 分类 + title: string // 标题 + details: string // 详情 +} + +// 客服话术 API +export const VerbalTrickApi = { + // 查询客服话术分页 + getVerbalTrickPage: async (params: any) => { + return await request.get({ url: `/promotion/verbal-trick/page`, params }) + }, + + // 查询客服话术详情 + getVerbalTrick: async (id: number) => { + return await request.get({ url: `/promotion/verbal-trick/get?id=` + id }) + }, + + // 新增客服话术 + createVerbalTrick: async (data: VerbalTrickVO) => { + return await request.post({ url: `/promotion/verbal-trick/create`, data }) + }, + + // 修改客服话术 + updateVerbalTrick: async (data: VerbalTrickVO) => { + return await request.put({ url: `/promotion/verbal-trick/update`, data }) + }, + + // 删除客服话术 + deleteVerbalTrick: async (id: number) => { + return await request.delete({ url: `/promotion/verbal-trick/delete?id=` + id }) + }, + + // 导出客服话术 Excel + exportVerbalTrick: async (params) => { + return await request.download({ url: `/promotion/verbal-trick/export-excel`, params }) + }, + + // 查询客服话术 + getVerbalTrickList: async () => { + return await request.get({ url: `/promotion/verbal-trick/getVerbalTrickList` }) + } +} \ No newline at end of file diff --git a/yudao-admin-vue3/src/utils/dict.ts b/yudao-admin-vue3/src/utils/dict.ts index 98cea3c..e1f4f05 100644 --- a/yudao-admin-vue3/src/utils/dict.ts +++ b/yudao-admin-vue3/src/utils/dict.ts @@ -138,6 +138,21 @@ export enum DICT_TYPE { //预约:机构管理 ORGANIZATION_STATUS = 'organization_status', + + //客服:自动回复 + KEFU_AUTO_RESPONSE_TYPE = 'kefu_auto_response_type', + KEFU_AUTO_RESPONSE_STATUS = 'kefu_auto_response_status', + + //客服:留言 + KEFU_LEAVE_WORD_STATUS = 'kefu_leave_word_status', + + //客服:话术 + KEFU_VERBAL_TRICK_TYPE = 'kefu_verbal_trick_type', + + //客服人员管理 + KEFU_SUPPORT_STAFF_STATUS = 'kefu_support_staff_status', + KEFU_SUPPORT_STAFF_ORDER_MANAGE = 'kefu_support_staff_order_manage', + KEFU_SUPPORT_STAFF_ORDER_INFORM = 'kefu_support_staff_order_inform', // ========== SYSTEM 模块 ========== SYSTEM_USER_SEX = 'system_user_sex', diff --git a/yudao-admin-vue3/src/views/mall/promotion/autoresponse/AutoResponseForm.vue b/yudao-admin-vue3/src/views/mall/promotion/autoresponse/AutoResponseForm.vue new file mode 100644 index 0000000..ca0fbf5 --- /dev/null +++ b/yudao-admin-vue3/src/views/mall/promotion/autoresponse/AutoResponseForm.vue @@ -0,0 +1,125 @@ + + diff --git a/yudao-admin-vue3/src/views/mall/promotion/autoresponse/index.vue b/yudao-admin-vue3/src/views/mall/promotion/autoresponse/index.vue new file mode 100644 index 0000000..9ec5718 --- /dev/null +++ b/yudao-admin-vue3/src/views/mall/promotion/autoresponse/index.vue @@ -0,0 +1,232 @@ + + + diff --git a/yudao-admin-vue3/src/views/mall/promotion/kefu/components/KeFuMessageList.vue b/yudao-admin-vue3/src/views/mall/promotion/kefu/components/KeFuMessageList.vue index 483fdc2..0a59b0f 100644 --- a/yudao-admin-vue3/src/views/mall/promotion/kefu/components/KeFuMessageList.vue +++ b/yudao-admin-vue3/src/views/mall/promotion/kefu/components/KeFuMessageList.vue @@ -1,467 +1,488 @@ + .chat-tools { + width: 100%; + border: var(--el-border-color) solid 1px; + border-radius: 10px; + height: 44px; + } + + ::v-deep(textarea) { + resize: none; + } + } + \ No newline at end of file diff --git a/yudao-admin-vue3/src/views/mall/promotion/kefu/index.vue b/yudao-admin-vue3/src/views/mall/promotion/kefu/index.vue index ccda0ba..325bd32 100644 --- a/yudao-admin-vue3/src/views/mall/promotion/kefu/index.vue +++ b/yudao-admin-vue3/src/views/mall/promotion/kefu/index.vue @@ -8,7 +8,7 @@ - + @@ -21,6 +21,7 @@ + diff --git a/yudao-admin-vue3/src/views/mall/promotion/leaveword/index.vue b/yudao-admin-vue3/src/views/mall/promotion/leaveword/index.vue new file mode 100644 index 0000000..fe9a4cd --- /dev/null +++ b/yudao-admin-vue3/src/views/mall/promotion/leaveword/index.vue @@ -0,0 +1,223 @@ + + + diff --git a/yudao-admin-vue3/src/views/mall/promotion/point/activity/PointActivityForm.vue b/yudao-admin-vue3/src/views/mall/promotion/point/activity/PointActivityForm.vue index 48c49a8..b80aa3f 100644 --- a/yudao-admin-vue3/src/views/mall/promotion/point/activity/PointActivityForm.vue +++ b/yudao-admin-vue3/src/views/mall/promotion/point/activity/PointActivityForm.vue @@ -1,5 +1,5 @@ - + diff --git a/yudao-admin-vue3/src/views/mall/promotion/supportstaff/SupportStaffForm.vue b/yudao-admin-vue3/src/views/mall/promotion/supportstaff/SupportStaffForm.vue new file mode 100644 index 0000000..5af56d3 --- /dev/null +++ b/yudao-admin-vue3/src/views/mall/promotion/supportstaff/SupportStaffForm.vue @@ -0,0 +1,159 @@ + + \ No newline at end of file diff --git a/yudao-admin-vue3/src/views/mall/promotion/supportstaff/index.vue b/yudao-admin-vue3/src/views/mall/promotion/supportstaff/index.vue new file mode 100644 index 0000000..ebb7a82 --- /dev/null +++ b/yudao-admin-vue3/src/views/mall/promotion/supportstaff/index.vue @@ -0,0 +1,301 @@ + + + + \ No newline at end of file diff --git a/yudao-admin-vue3/src/views/mall/promotion/verbaltrick/VerbalTrickForm.vue b/yudao-admin-vue3/src/views/mall/promotion/verbaltrick/VerbalTrickForm.vue new file mode 100644 index 0000000..53d01e1 --- /dev/null +++ b/yudao-admin-vue3/src/views/mall/promotion/verbaltrick/VerbalTrickForm.vue @@ -0,0 +1,111 @@ + + diff --git a/yudao-admin-vue3/src/views/mall/promotion/verbaltrick/index.vue b/yudao-admin-vue3/src/views/mall/promotion/verbaltrick/index.vue new file mode 100644 index 0000000..087d715 --- /dev/null +++ b/yudao-admin-vue3/src/views/mall/promotion/verbaltrick/index.vue @@ -0,0 +1,211 @@ + + + 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 fd3d07f..7224bd0 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 @@ -154,4 +154,16 @@ public interface ErrorCodeConstants { ErrorCode TIME_FORMAT_ERROR = new ErrorCode(1_019_007_008, "秒杀时间段格式化错误"); + // ========== 客服话术 TODO 补充编号 ========== + ErrorCode VERBAL_TRICK_NOT_EXISTS = new ErrorCode(1_020_00_001, "客服话术不存在"); + + // ========== 用户留言 TODO 补充编号 ========== + ErrorCode LEAVE_WORD_NOT_EXISTS = new ErrorCode(1_021_001_001, "用户留言不存在"); + + // ========== 自动回复 TODO 补充编号 ========== + ErrorCode AUTO_RESPONSE_NOT_EXISTS = new ErrorCode(1_022_000_000, "自动回复不存在"); + + // ========== 客服人员 TODO 补充编号 ========== + ErrorCode SUPPORT_STAFF_NOT_EXISTS = new ErrorCode(1_023_000_000, "客服人员不存在"); + } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/autoresponse/AutoResponseController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/autoresponse/AutoResponseController.java new file mode 100644 index 0000000..ff88c75 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/autoresponse/AutoResponseController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.autoresponse; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.promotion.controller.admin.autoresponse.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.autoresponse.AutoResponseDO; +import cn.iocoder.yudao.module.promotion.service.autoresponse.AutoResponseService; + +@Tag(name = "管理后台 - 自动回复") +@RestController +@RequestMapping("/promotion/auto-response") +@Validated +public class AutoResponseController { + + @Resource + private AutoResponseService autoResponseService; + + @PostMapping("/create") + @Operation(summary = "创建自动回复") + @PreAuthorize("@ss.hasPermission('promotion:auto-response:create')") + public CommonResult createAutoResponse(@Valid @RequestBody AutoResponseSaveReqVO createReqVO) { + return success(autoResponseService.createAutoResponse(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新自动回复") + @PreAuthorize("@ss.hasPermission('promotion:auto-response:update')") + public CommonResult updateAutoResponse(@Valid @RequestBody AutoResponseSaveReqVO updateReqVO) { + autoResponseService.updateAutoResponse(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除自动回复") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('promotion:auto-response:delete')") + public CommonResult deleteAutoResponse(@RequestParam("id") Long id) { + autoResponseService.deleteAutoResponse(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得自动回复") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('promotion:auto-response:query')") + public CommonResult getAutoResponse(@RequestParam("id") Long id) { + AutoResponseDO autoResponse = autoResponseService.getAutoResponse(id); + return success(BeanUtils.toBean(autoResponse, AutoResponseRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得自动回复分页") + @PreAuthorize("@ss.hasPermission('promotion:auto-response:query')") + public CommonResult> getAutoResponsePage(@Valid AutoResponsePageReqVO pageReqVO) { + PageResult pageResult = autoResponseService.getAutoResponsePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, AutoResponseRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出自动回复 Excel") + @PreAuthorize("@ss.hasPermission('promotion:auto-response:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportAutoResponseExcel(@Valid AutoResponsePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = autoResponseService.getAutoResponsePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "自动回复.xls", "数据", AutoResponseRespVO.class, + BeanUtils.toBean(list, AutoResponseRespVO.class)); + } + +} \ 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/autoresponse/vo/AutoResponsePageReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/autoresponse/vo/AutoResponsePageReqVO.java new file mode 100644 index 0000000..5839d36 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/autoresponse/vo/AutoResponsePageReqVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.autoresponse.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +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 +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AutoResponsePageReqVO extends PageParam { + + @Schema(description = "关键字") + private String keyword; + + @Schema(description = "回复类型,文字消息/0,图片消息/1", example = "2") + private Integer type; + + @Schema(description = "回复内容") + private String content; + + @Schema(description = "是否开启,开启/1,关闭/0", example = "2") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ 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/autoresponse/vo/AutoResponseRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/autoresponse/vo/AutoResponseRespVO.java new file mode 100644 index 0000000..3cf61a7 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/autoresponse/vo/AutoResponseRespVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.autoresponse.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; + +@Schema(description = "管理后台 - 自动回复 Response VO") +@Data +@ExcelIgnoreUnannotated +public class AutoResponseRespVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13888") + @ExcelProperty("id") + private Long id; + + @Schema(description = "关键字", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("关键字") + private String keyword; + + @Schema(description = "回复类型,文字消息/0,图片消息/1", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty(value = "回复类型,文字消息/0,图片消息/1", converter = DictConvert.class) + @DictFormat("kefu_auto_response_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer type; + + @Schema(description = "回复内容", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("回复内容") + private String content; + + @Schema(description = "是否开启,开启/1,关闭/0", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty(value = "是否开启,开启/1,关闭/0", converter = DictConvert.class) + @DictFormat("kefu_auto_response_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer status; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ 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/autoresponse/vo/AutoResponseSaveReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/autoresponse/vo/AutoResponseSaveReqVO.java new file mode 100644 index 0000000..f560e51 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/autoresponse/vo/AutoResponseSaveReqVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.autoresponse.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 自动回复新增/修改 Request VO") +@Data +public class AutoResponseSaveReqVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13888") + private Long id; + + @Schema(description = "关键字", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "关键字不能为空") + private String keyword; + + @Schema(description = "回复类型,文字消息/0,图片消息/1", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "回复类型,文字消息/0,图片消息/1不能为空") + private Integer type; + + @Schema(description = "回复内容", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "回复内容不能为空") + private String content; + + @Schema(description = "是否开启,开启/1,关闭/0", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "是否开启,开启/1,关闭/0不能为空") + private Integer status; + +} \ 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/leaveword/LeaveWordController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/leaveword/LeaveWordController.java new file mode 100644 index 0000000..565d655 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/leaveword/LeaveWordController.java @@ -0,0 +1,101 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.leaveword; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.promotion.controller.admin.leaveword.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.leaveword.LeaveWordDO; +import cn.iocoder.yudao.module.promotion.service.leaveword.LeaveWordService; + +@Tag(name = "管理后台 - 用户留言") +@RestController +@RequestMapping("/promotion/leave-word") +@Validated +public class LeaveWordController { + + @Resource + private LeaveWordService leaveWordService; + + @PostMapping("/create") + @Operation(summary = "创建用户留言") + @PreAuthorize("@ss.hasPermission('promotion:leave-word:create')") + public CommonResult createLeaveWord(@Valid @RequestBody LeaveWordSaveReqVO createReqVO) { + return success(leaveWordService.createLeaveWord(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新用户留言") + @PreAuthorize("@ss.hasPermission('promotion:leave-word:update')") + public CommonResult updateLeaveWord(@Valid @RequestBody LeaveWordSaveReqVO updateReqVO) { + leaveWordService.updateLeaveWord(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除用户留言") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('promotion:leave-word:delete')") + public CommonResult deleteLeaveWord(@RequestParam("id") Long id) { + leaveWordService.deleteLeaveWord(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得用户留言") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('promotion:leave-word:query')") + public CommonResult getLeaveWord(@RequestParam("id") Long id) { + LeaveWordDO leaveWord = leaveWordService.getLeaveWord(id); + return success(BeanUtils.toBean(leaveWord, LeaveWordRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得用户留言分页") + @PreAuthorize("@ss.hasPermission('promotion:leave-word:query')") + public CommonResult> getLeaveWordPage(@Valid LeaveWordPageReqVO pageReqVO) { + PageResult pageResult = leaveWordService.getLeaveWordPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, LeaveWordRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出用户留言 Excel") + @PreAuthorize("@ss.hasPermission('promotion:leave-word:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportLeaveWordExcel(@Valid LeaveWordPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = leaveWordService.getLeaveWordPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "用户留言.xls", "数据", LeaveWordRespVO.class, + BeanUtils.toBean(list, LeaveWordRespVO.class)); + } + + + //回复留言信息 + @GetMapping("/addResponse") + public boolean addResponse(String id,String response){ + return leaveWordService.addResponse(id,response); + } + +} \ 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/leaveword/vo/LeaveWordPageReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/leaveword/vo/LeaveWordPageReqVO.java new file mode 100644 index 0000000..679a69d --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/leaveword/vo/LeaveWordPageReqVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.leaveword.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +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 +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LeaveWordPageReqVO extends PageParam { + + @Schema(description = "昵称", example = "芋艿") + private String name; + + @Schema(description = "电话") + private String phone; + + @Schema(description = "回复内容") + private String response; + + @Schema(description = "内容") + private String content; + + @Schema(description = "状态", example = "2") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ 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/leaveword/vo/LeaveWordRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/leaveword/vo/LeaveWordRespVO.java new file mode 100644 index 0000000..31aa35f --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/leaveword/vo/LeaveWordRespVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.leaveword.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; + +@Schema(description = "管理后台 - 用户留言 Response VO") +@Data +@ExcelIgnoreUnannotated +public class LeaveWordRespVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "25658") + @ExcelProperty("id") + private Long id; + + @Schema(description = "昵称", example = "芋艿") + @ExcelProperty("昵称") + private String name; + + @Schema(description = "电话", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("电话") + private String phone; + + @Schema(description = "回复内容", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("回复内容") + private String response; + + @Schema(description = "留言内容", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("留言内容") + private String content; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat("kefu_leave_word_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer status; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ 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/leaveword/vo/LeaveWordSaveReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/leaveword/vo/LeaveWordSaveReqVO.java new file mode 100644 index 0000000..36145ce --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/leaveword/vo/LeaveWordSaveReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.leaveword.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 用户留言新增/修改 Request VO") +@Data +public class LeaveWordSaveReqVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "25658") + private Long id; + + @Schema(description = "昵称", example = "芋艿") + private String name; + + @Schema(description = "电话", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "电话不能为空") + private String phone; + + @Schema(description = "回复内容", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "回复内容不能为空") + private String response; + + @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "内容不能为空") + private String content; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "状态不能为空") + private Integer status; + +} \ 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/SupportStaffController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/SupportStaffController.java new file mode 100644 index 0000000..352c6c3 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/SupportStaffController.java @@ -0,0 +1,94 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.supportstaff; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.promotion.controller.admin.supportstaff.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.supportstaff.SupportStaffDO; +import cn.iocoder.yudao.module.promotion.service.supportstaff.SupportStaffService; + +@Tag(name = "管理后台 - 客服人员") +@RestController +@RequestMapping("/promotion/support-staff") +@Validated +public class SupportStaffController { + + @Resource + private SupportStaffService supportStaffService; + + @PostMapping("/create") + @Operation(summary = "创建客服人员") + @PreAuthorize("@ss.hasPermission('promotion:support-staff:create')") + public CommonResult createSupportStaff(@Valid @RequestBody SupportStaffSaveReqVO createReqVO) { + return success(supportStaffService.createSupportStaff(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新客服人员") + @PreAuthorize("@ss.hasPermission('promotion:support-staff:update')") + public CommonResult updateSupportStaff(@Valid @RequestBody SupportStaffSaveReqVO updateReqVO) { + supportStaffService.updateSupportStaff(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除客服人员") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('promotion:support-staff:delete')") + public CommonResult deleteSupportStaff(@RequestParam("id") Integer id) { + supportStaffService.deleteSupportStaff(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得客服人员") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('promotion:support-staff:query')") + public CommonResult getSupportStaff(@RequestParam("id") Integer id) { + SupportStaffDO supportStaff = supportStaffService.getSupportStaff(id); + return success(BeanUtils.toBean(supportStaff, SupportStaffRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得客服人员分页") + @PreAuthorize("@ss.hasPermission('promotion:support-staff:query')") + public CommonResult> getSupportStaffPage(@Valid SupportStaffPageReqVO pageReqVO) { + PageResult pageResult = supportStaffService.getSupportStaffPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, SupportStaffRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出客服人员 Excel") + @PreAuthorize("@ss.hasPermission('promotion:support-staff:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportSupportStaffExcel(@Valid SupportStaffPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = supportStaffService.getSupportStaffPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "客服人员.xls", "数据", SupportStaffRespVO.class, + BeanUtils.toBean(list, SupportStaffRespVO.class)); + } + +} \ 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/SupportStaffPageReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffPageReqVO.java new file mode 100644 index 0000000..f8904ea --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffPageReqVO.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.supportstaff.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +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 +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SupportStaffPageReqVO extends PageParam { + + @Schema(description = "客服名称", example = "张三") + private String name; + + @Schema(description = "头像",example = "https://www.iocoder.cn") + private String pic; + + @Schema(description = "手机号码") + private String phone; + + @Schema(description = "登录账号", example = "31355") + private String account; + + @Schema(description = "登录密码") + private String password; + + @Schema(description = "客服状态", example = "2") + private Integer status; + + @Schema(description = "手机订单管理") + private Integer orderManage; + + @Schema(description = "订单通知") + private Integer orderInform; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ 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/SupportStaffRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffRespVO.java new file mode 100644 index 0000000..a39c1e2 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffRespVO.java @@ -0,0 +1,58 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.supportstaff.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; + +@Schema(description = "管理后台 - 客服人员 Response VO") +@Data +@ExcelIgnoreUnannotated +public class SupportStaffRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "432") + @ExcelProperty("ID") + private Integer id; + + @Schema(description = "客服名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @ExcelProperty("客服名称") + private String name; + + @Schema(description = "头像", example = "https://www.iocoder.cn") + @ExcelProperty("头像") + private String pic; + + @Schema(description = "手机号码", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("手机号码") + private String phone; + + @Schema(description = "登录账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31355") + @ExcelProperty("登录账号") + private String account; + + @Schema(description = "登录密码", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("登录密码") + private String password; + + @Schema(description = "客服状态", example = "2") + @ExcelProperty(value = "客服状态", converter = DictConvert.class) + @DictFormat("kefu_support_staff_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer status; + + @Schema(description = "手机订单管理") + @ExcelProperty(value = "手机订单管理", converter = DictConvert.class) + @DictFormat("kefu_support_staff_order_manage") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer orderManage; + + @Schema(description = "订单通知") + @ExcelProperty(value = "订单通知", converter = DictConvert.class) + @DictFormat("kefu_support_staff_order_inform") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer orderInform; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ 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 new file mode 100644 index 0000000..68b448e --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/supportstaff/vo/SupportStaffSaveReqVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.supportstaff.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 客服人员新增/修改 Request VO") +@Data +public class SupportStaffSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "432") + private Integer id; + + @Schema(description = "客服名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @NotEmpty(message = "客服名称不能为空") + private String name; + + @Schema(description = "头像", example = "https://www.iocoder.cn") + private String pic; + + @Schema(description = "手机号码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "手机号码不能为空") + private String phone; + + @Schema(description = "登录账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31355") + @NotEmpty(message = "登录账号不能为空") + private String account; + + @Schema(description = "登录密码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "登录密码不能为空") + private String password; + + @Schema(description = "客服状态", example = "2") + private Integer status; + + @Schema(description = "手机订单管理") + private Integer orderManage; + + @Schema(description = "订单通知") + private Integer orderInform; + +} \ 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/verbaltrick/VerbalTrickController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/verbaltrick/VerbalTrickController.java new file mode 100644 index 0000000..25e9829 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/verbaltrick/VerbalTrickController.java @@ -0,0 +1,123 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.verbaltrick; + +import cn.iocoder.yudao.module.system.api.dict.DictDataApi; +import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.promotion.controller.admin.verbaltrick.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.verbaltrick.VerbalTrickDO; +import cn.iocoder.yudao.module.promotion.service.verbaltrick.VerbalTrickService; + +@Tag(name = "管理后台 - 客服话术") +@RestController +@RequestMapping("/promotion/verbal-trick") +@Validated +public class VerbalTrickController { + + @Resource + private VerbalTrickService verbalTrickService; + + @Resource + public DictDataApi dictDataApi; + + @PostMapping("/create") + @Operation(summary = "创建客服话术") + @PreAuthorize("@ss.hasPermission('promotion:verbal-trick:create')") + public CommonResult createVerbalTrick(@Valid @RequestBody VerbalTrickSaveReqVO createReqVO) { + return success(verbalTrickService.createVerbalTrick(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新客服话术") + @PreAuthorize("@ss.hasPermission('promotion:verbal-trick:update')") + public CommonResult updateVerbalTrick(@Valid @RequestBody VerbalTrickSaveReqVO updateReqVO) { + verbalTrickService.updateVerbalTrick(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除客服话术") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('promotion:verbal-trick:delete')") + public CommonResult deleteVerbalTrick(@RequestParam("id") Long id) { + verbalTrickService.deleteVerbalTrick(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得客服话术") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('promotion:verbal-trick:query')") + public CommonResult getVerbalTrick(@RequestParam("id") Long id) { + VerbalTrickDO verbalTrick = verbalTrickService.getVerbalTrick(id); + return success(BeanUtils.toBean(verbalTrick, VerbalTrickRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得客服话术分页") + @PreAuthorize("@ss.hasPermission('promotion:verbal-trick:query')") + public CommonResult> getVerbalTrickPage(@Valid VerbalTrickPageReqVO pageReqVO) { + PageResult pageResult = verbalTrickService.getVerbalTrickPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, VerbalTrickRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出客服话术 Excel") + @PreAuthorize("@ss.hasPermission('promotion:verbal-trick:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportVerbalTrickExcel(@Valid VerbalTrickPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = verbalTrickService.getVerbalTrickPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "客服话术.xls", "数据", VerbalTrickRespVO.class, + BeanUtils.toBean(list, VerbalTrickRespVO.class)); + } + + + @GetMapping("/getVerbalTrickList") + @Operation(summary = "获得客服话术数据") + @PreAuthorize("@ss.hasPermission('promotion:verbal-trick:query')") + public CommonResult> getVerbalTrickList() { + List result = verbalTrickService.getVerbalTrickList(); + return success(result); + } + + /** + * 根据字典类型查询字典数据信息,分类 + */ +// @GetMapping(value = "/type") +// public CommonResult dictType() { +// List dictDataList = dictDataApi.getDictDataList("types"); +// if (!dictDataList.isEmpty()) { +// dictDataList = new ArrayList(); +// } +// return CommonResult.success(dictDataList); +// } + + +} \ 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/verbaltrick/vo/VerbalTrickPageReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/verbaltrick/vo/VerbalTrickPageReqVO.java new file mode 100644 index 0000000..b46d294 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/verbaltrick/vo/VerbalTrickPageReqVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.verbaltrick.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +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 +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class VerbalTrickPageReqVO extends PageParam { + + @Schema(description = "分类", example = "1") + private Integer type; + + @Schema(description = "标题") + private String title; + + @Schema(description = "详情") + private String details; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ 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/verbaltrick/vo/VerbalTrickRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/verbaltrick/vo/VerbalTrickRespVO.java new file mode 100644 index 0000000..892ebbe --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/verbaltrick/vo/VerbalTrickRespVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.verbaltrick.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; + +@Schema(description = "管理后台 - 客服话术 Response VO") +@Data +@ExcelIgnoreUnannotated +public class VerbalTrickRespVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19467") + @ExcelProperty("id") + private Long id; + + @Schema(description = "分类", example = "1") + @ExcelProperty(value = "分类", converter = DictConvert.class) + @DictFormat("kefu_verbal_trick_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer type; + + @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("标题") + private String title; + + @Schema(description = "详情", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("详情") + private String details; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ 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/verbaltrick/vo/VerbalTrickSaveReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/verbaltrick/vo/VerbalTrickSaveReqVO.java new file mode 100644 index 0000000..3f58f4b --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/verbaltrick/vo/VerbalTrickSaveReqVO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.verbaltrick.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 客服话术新增/修改 Request VO") +@Data +public class VerbalTrickSaveReqVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19467") + private Long id; + + @Schema(description = "分类", example = "1") + private Integer type; + + @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "标题不能为空") + private String title; + + @Schema(description = "详情", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "详情不能为空") + private String details; + +} \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/autoresponse/AutoResponseDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/autoresponse/AutoResponseDO.java new file mode 100644 index 0000000..0ec6cc9 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/autoresponse/AutoResponseDO.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.promotion.dal.dataobject.autoresponse; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 自动回复 DO + * + * @author 管理员 + */ +@TableName("promotion_kefu_auto_response") +@KeySequence("promotion_kefu_auto_response_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AutoResponseDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 关键字 + */ + private String keyword; + /** + * 回复类型,文字消息/0,图片消息/1 + * + * 枚举 {@link TODO kefu_auto_response_type 对应的类} + */ + private Integer type; + /** + * 回复内容 + */ + private String content; + /** + * 是否开启,开启/1,关闭/0 + * + * 枚举 {@link TODO kefu_auto_response_status 对应的类} + */ + private Integer status; + +} \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/leaveword/LeaveWordDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/leaveword/LeaveWordDO.java new file mode 100644 index 0000000..a3276b4 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/leaveword/LeaveWordDO.java @@ -0,0 +1,50 @@ +package cn.iocoder.yudao.module.promotion.dal.dataobject.leaveword; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 用户留言 DO + * + * @author 管理员 + */ +@TableName("promotion_kefu_leave_word") +@KeySequence("promotion_kefu_leave_word_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LeaveWordDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 昵称 + */ + private String name; + /** + * 电话 + */ + private String phone; + /** + * 留言内容 + */ + private String content; + /** + * 回复内容 + */ + private String response; + /** + * 状态 + * + * 枚举 {@link TODO kefu_leave_word_status 对应的类} + */ + private Integer status; + +} \ No newline at end of file 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 new file mode 100644 index 0000000..20c6cf5 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/supportstaff/SupportStaffDO.java @@ -0,0 +1,66 @@ +package cn.iocoder.yudao.module.promotion.dal.dataobject.supportstaff; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 客服人员 DO + * + * @author 管理员 + */ +@TableName("promotion_kefu_support_staff") +@KeySequence("promotion_kefu_support_staff_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SupportStaffDO extends BaseDO { + + /** + * ID + */ + @TableId + 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; + +} \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/verbaltrick/VerbalTrickDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/verbaltrick/VerbalTrickDO.java new file mode 100644 index 0000000..7a85541 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/verbaltrick/VerbalTrickDO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.promotion.dal.dataobject.verbaltrick; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 客服话术 DO + * + * @author 管理员 + */ +@TableName("promotion_kefu_verbal_trick") +@KeySequence("promotion_kefu_verbal_trick_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class VerbalTrickDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 分类 + * + * 枚举 {@link TODO kefu_verbal_trick_type 对应的类} + */ + private Integer type; + /** + * 标题 + */ + private String title; + /** + * 详情 + */ + private String details; + +} \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/autoresponse/AutoResponseMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/autoresponse/AutoResponseMapper.java new file mode 100644 index 0000000..a6d8f86 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/autoresponse/AutoResponseMapper.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.promotion.dal.mysql.autoresponse; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.promotion.dal.dataobject.autoresponse.AutoResponseDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.promotion.controller.admin.autoresponse.vo.*; + +/** + * 自动回复 Mapper + * + * @author 管理员 + */ +@Mapper +public interface AutoResponseMapper extends BaseMapperX { + + default PageResult selectPage(AutoResponsePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(AutoResponseDO::getKeyword, reqVO.getKeyword()) + .eqIfPresent(AutoResponseDO::getType, reqVO.getType()) + .eqIfPresent(AutoResponseDO::getContent, reqVO.getContent()) + .eqIfPresent(AutoResponseDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(AutoResponseDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(AutoResponseDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/leaveword/LeaveWordMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/leaveword/LeaveWordMapper.java new file mode 100644 index 0000000..c01b1cc --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/leaveword/LeaveWordMapper.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.promotion.dal.mysql.leaveword; + + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.promotion.dal.dataobject.leaveword.LeaveWordDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.promotion.controller.admin.leaveword.vo.*; + +/** + * 用户留言 Mapper + * + * @author 管理员 + */ +@Mapper +public interface LeaveWordMapper extends BaseMapperX { + + default PageResult selectPage(LeaveWordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(LeaveWordDO::getName, reqVO.getName()) + .eqIfPresent(LeaveWordDO::getPhone, reqVO.getPhone()) + .eqIfPresent(LeaveWordDO::getContent, reqVO.getContent()) + .eqIfPresent(LeaveWordDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(LeaveWordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(LeaveWordDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/supportstaff/SupportStaffMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/supportstaff/SupportStaffMapper.java new file mode 100644 index 0000000..c4e8088 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/supportstaff/SupportStaffMapper.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.promotion.dal.mysql.supportstaff; + + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.promotion.dal.dataobject.supportstaff.SupportStaffDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.promotion.controller.admin.supportstaff.vo.*; + +/** + * 客服人员 Mapper + * + * @author 管理员 + */ +@Mapper +public interface SupportStaffMapper extends BaseMapperX { + + default PageResult selectPage(SupportStaffPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(SupportStaffDO::getName, reqVO.getName()) + .eqIfPresent(SupportStaffDO::getPhone, reqVO.getPhone()) + .eqIfPresent(SupportStaffDO::getAccount, reqVO.getAccount()) + .eqIfPresent(SupportStaffDO::getPassword, reqVO.getPassword()) + .eqIfPresent(SupportStaffDO::getStatus, reqVO.getStatus()) + .eqIfPresent(SupportStaffDO::getOrderManage, reqVO.getOrderManage()) + .eqIfPresent(SupportStaffDO::getOrderInform, reqVO.getOrderInform()) + .betweenIfPresent(SupportStaffDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SupportStaffDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/verbaltrick/VerbalTrickMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/verbaltrick/VerbalTrickMapper.java new file mode 100644 index 0000000..f6dd22c --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/verbaltrick/VerbalTrickMapper.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.promotion.dal.mysql.verbaltrick; + + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; + +import cn.iocoder.yudao.module.promotion.dal.dataobject.verbaltrick.VerbalTrickDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.promotion.controller.admin.verbaltrick.vo.*; + +/** + * 客服话术 Mapper + * + * @author 管理员 + */ +@Mapper +public interface VerbalTrickMapper extends BaseMapperX { + + default PageResult selectPage(VerbalTrickPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(VerbalTrickDO::getType, reqVO.getType()) + .eqIfPresent(VerbalTrickDO::getTitle, reqVO.getTitle()) + .eqIfPresent(VerbalTrickDO::getDetails, reqVO.getDetails()) + .betweenIfPresent(VerbalTrickDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(VerbalTrickDO::getId)); + } + +} \ 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/autoresponse/AutoResponseService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/autoresponse/AutoResponseService.java new file mode 100644 index 0000000..284ba90 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/autoresponse/AutoResponseService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.promotion.service.autoresponse; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.promotion.controller.admin.autoresponse.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.autoresponse.AutoResponseDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 自动回复 Service 接口 + * + * @author 管理员 + */ +public interface AutoResponseService { + + /** + * 创建自动回复 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createAutoResponse(@Valid AutoResponseSaveReqVO createReqVO); + + /** + * 更新自动回复 + * + * @param updateReqVO 更新信息 + */ + void updateAutoResponse(@Valid AutoResponseSaveReqVO updateReqVO); + + /** + * 删除自动回复 + * + * @param id 编号 + */ + void deleteAutoResponse(Long id); + + /** + * 获得自动回复 + * + * @param id 编号 + * @return 自动回复 + */ + AutoResponseDO getAutoResponse(Long id); + + /** + * 获得自动回复分页 + * + * @param pageReqVO 分页查询 + * @return 自动回复分页 + */ + PageResult getAutoResponsePage(AutoResponsePageReqVO 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/autoresponse/AutoResponseServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/autoresponse/AutoResponseServiceImpl.java new file mode 100644 index 0000000..4338ce6 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/autoresponse/AutoResponseServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.promotion.service.autoresponse; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.promotion.controller.admin.autoresponse.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.autoresponse.AutoResponseDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.promotion.dal.mysql.autoresponse.AutoResponseMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; + +/** + * 自动回复 Service 实现类 + * + * @author 管理员 + */ +@Service +@Validated +public class AutoResponseServiceImpl implements AutoResponseService { + + @Resource + private AutoResponseMapper autoResponseMapper; + + @Override + public Long createAutoResponse(AutoResponseSaveReqVO createReqVO) { + // 插入 + AutoResponseDO autoResponse = BeanUtils.toBean(createReqVO, AutoResponseDO.class); + autoResponseMapper.insert(autoResponse); + // 返回 + return autoResponse.getId(); + } + + @Override + public void updateAutoResponse(AutoResponseSaveReqVO updateReqVO) { + // 校验存在 + validateAutoResponseExists(updateReqVO.getId()); + // 更新 + AutoResponseDO updateObj = BeanUtils.toBean(updateReqVO, AutoResponseDO.class); + autoResponseMapper.updateById(updateObj); + } + + @Override + public void deleteAutoResponse(Long id) { + // 校验存在 + validateAutoResponseExists(id); + // 删除 + autoResponseMapper.deleteById(id); + } + + private void validateAutoResponseExists(Long id) { + if (autoResponseMapper.selectById(id) == null) { + throw exception(AUTO_RESPONSE_NOT_EXISTS); + } + } + + @Override + public AutoResponseDO getAutoResponse(Long id) { + return autoResponseMapper.selectById(id); + } + + @Override + public PageResult getAutoResponsePage(AutoResponsePageReqVO pageReqVO) { + return autoResponseMapper.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/leaveword/LeaveWordService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/leaveword/LeaveWordService.java new file mode 100644 index 0000000..bfe19d2 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/leaveword/LeaveWordService.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.promotion.service.leaveword; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.promotion.controller.admin.leaveword.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.leaveword.LeaveWordDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 用户留言 Service 接口 + * + * @author 管理员 + */ +public interface LeaveWordService { + + /** + * 创建用户留言 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createLeaveWord(@Valid LeaveWordSaveReqVO createReqVO); + + /** + * 更新用户留言 + * + * @param updateReqVO 更新信息 + */ + void updateLeaveWord(@Valid LeaveWordSaveReqVO updateReqVO); + + /** + * 删除用户留言 + * + * @param id 编号 + */ + void deleteLeaveWord(Long id); + + /** + * 获得用户留言 + * + * @param id 编号 + * @return 用户留言 + */ + LeaveWordDO getLeaveWord(Long id); + + /** + * 获得用户留言分页 + * + * @param pageReqVO 分页查询 + * @return 用户留言分页 + */ + PageResult getLeaveWordPage(LeaveWordPageReqVO pageReqVO); + + + /** + * 回复用户留言 + * @param id + * @param response + * @return + */ + boolean addResponse(String id,String response); + + + + +} \ 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/leaveword/LeaveWordServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/leaveword/LeaveWordServiceImpl.java new file mode 100644 index 0000000..a51ec2c --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/leaveword/LeaveWordServiceImpl.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.promotion.service.leaveword; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.promotion.controller.admin.leaveword.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.leaveword.LeaveWordDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.promotion.dal.mysql.leaveword.LeaveWordMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; + +/** + * 用户留言 Service 实现类 + * + * @author 管理员 + */ +@Service +@Validated +public class LeaveWordServiceImpl implements LeaveWordService { + + @Resource + private LeaveWordMapper leaveWordMapper; + + @Override + public Long createLeaveWord(LeaveWordSaveReqVO createReqVO) { + // 插入 + LeaveWordDO leaveWord = BeanUtils.toBean(createReqVO, LeaveWordDO.class); + leaveWordMapper.insert(leaveWord); + // 返回 + return leaveWord.getId(); + } + + @Override + public void updateLeaveWord(LeaveWordSaveReqVO updateReqVO) { + // 校验存在 + validateLeaveWordExists(updateReqVO.getId()); + // 更新 + LeaveWordDO updateObj = BeanUtils.toBean(updateReqVO, LeaveWordDO.class); + leaveWordMapper.updateById(updateObj); + } + + @Override + public void deleteLeaveWord(Long id) { + // 校验存在 + validateLeaveWordExists(id); + // 删除 + leaveWordMapper.deleteById(id); + } + + private void validateLeaveWordExists(Long id) { + if (leaveWordMapper.selectById(id) == null) { + throw exception(LEAVE_WORD_NOT_EXISTS); + } + } + + @Override + public LeaveWordDO getLeaveWord(Long id) { + return leaveWordMapper.selectById(id); + } + + @Override + public PageResult getLeaveWordPage(LeaveWordPageReqVO pageReqVO) { + return leaveWordMapper.selectPage(pageReqVO); + } + + @Override + public boolean addResponse(String id, String response) { + LeaveWordDO leaveWordDO = leaveWordMapper.selectOne("id", id); + leaveWordDO.setResponse(leaveWordDO.getResponse()); + leaveWordDO.setStatus(1); + int i = leaveWordMapper.updateById(leaveWordDO); + if (i >= 1){ + return true; + } + return false; + } + +} \ 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/supportstaff/SupportStaffService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffService.java new file mode 100644 index 0000000..8a67fb0 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffService.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.module.promotion.service.supportstaff; + +import javax.validation.*; +import cn.iocoder.yudao.module.promotion.controller.admin.supportstaff.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.supportstaff.SupportStaffDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +/** + * 客服人员 Service 接口 + * + * @author 管理员 + */ +public interface SupportStaffService { + + /** + * 创建客服人员 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createSupportStaff(@Valid SupportStaffSaveReqVO createReqVO); + + /** + * 更新客服人员 + * + * @param updateReqVO 更新信息 + */ + void updateSupportStaff(@Valid SupportStaffSaveReqVO updateReqVO); + + /** + * 删除客服人员 + * + * @param id 编号 + */ + void deleteSupportStaff(Integer id); + + /** + * 获得客服人员 + * + * @param id 编号 + * @return 客服人员 + */ + SupportStaffDO getSupportStaff(Integer id); + + /** + * 获得客服人员分页 + * + * @param pageReqVO 分页查询 + * @return 客服人员分页 + */ + PageResult getSupportStaffPage(SupportStaffPageReqVO 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/supportstaff/SupportStaffServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java new file mode 100644 index 0000000..523514f --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.promotion.service.supportstaff; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import cn.iocoder.yudao.module.promotion.controller.admin.supportstaff.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.supportstaff.SupportStaffDO; +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 static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; + +/** + * 客服人员 Service 实现类 + * + * @author 管理员 + */ +@Service +@Validated +public class SupportStaffServiceImpl implements SupportStaffService { + + @Resource + private SupportStaffMapper supportStaffMapper; + + @Override + public Integer createSupportStaff(SupportStaffSaveReqVO createReqVO) { + // 插入 + SupportStaffDO supportStaff = BeanUtils.toBean(createReqVO, SupportStaffDO.class); + supportStaffMapper.insert(supportStaff); + // 返回 + return supportStaff.getId(); + } + + @Override + public void updateSupportStaff(SupportStaffSaveReqVO updateReqVO) { + // 校验存在 + validateSupportStaffExists(updateReqVO.getId()); + // 更新 + SupportStaffDO updateObj = BeanUtils.toBean(updateReqVO, SupportStaffDO.class); + supportStaffMapper.updateById(updateObj); + } + + @Override + public void deleteSupportStaff(Integer id) { + // 校验存在 + validateSupportStaffExists(id); + // 删除 + supportStaffMapper.deleteById(id); + } + + private void validateSupportStaffExists(Integer id) { + if (supportStaffMapper.selectById(id) == null) { + throw exception(SUPPORT_STAFF_NOT_EXISTS); + } + } + + @Override + public SupportStaffDO getSupportStaff(Integer id) { + return supportStaffMapper.selectById(id); + } + + @Override + public PageResult getSupportStaffPage(SupportStaffPageReqVO pageReqVO) { + return supportStaffMapper.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/verbaltrick/VerbalTrickService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/verbaltrick/VerbalTrickService.java new file mode 100644 index 0000000..ac55dd0 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/verbaltrick/VerbalTrickService.java @@ -0,0 +1,61 @@ +package cn.iocoder.yudao.module.promotion.service.verbaltrick; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.promotion.controller.admin.verbaltrick.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.verbaltrick.VerbalTrickDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 客服话术 Service 接口 + * + * @author 管理员 + */ +public interface VerbalTrickService { + + /** + * 创建客服话术 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createVerbalTrick(@Valid VerbalTrickSaveReqVO createReqVO); + + /** + * 更新客服话术 + * + * @param updateReqVO 更新信息 + */ + void updateVerbalTrick(@Valid VerbalTrickSaveReqVO updateReqVO); + + /** + * 删除客服话术 + * + * @param id 编号 + */ + void deleteVerbalTrick(Long id); + + /** + * 获得客服话术 + * + * @param id 编号 + * @return 客服话术 + */ + VerbalTrickDO getVerbalTrick(Long id); + + /** + * 获得客服话术分页 + * + * @param pageReqVO 分页查询 + * @return 客服话术分页 + */ + PageResult getVerbalTrickPage(VerbalTrickPageReqVO pageReqVO); + + /** + * 获取话术数据 + * @return + */ + List getVerbalTrickList(); + +} \ 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/verbaltrick/VerbalTrickServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/verbaltrick/VerbalTrickServiceImpl.java new file mode 100644 index 0000000..fc3b8b0 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/verbaltrick/VerbalTrickServiceImpl.java @@ -0,0 +1,79 @@ +package cn.iocoder.yudao.module.promotion.service.verbaltrick; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.promotion.controller.admin.verbaltrick.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.verbaltrick.VerbalTrickDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.promotion.dal.mysql.verbaltrick.VerbalTrickMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; + +/** + * 客服话术 Service 实现类 + * + * @author 管理员 + */ +@Service +@Validated +public class VerbalTrickServiceImpl implements VerbalTrickService { + + @Resource + private VerbalTrickMapper verbalTrickMapper; + + @Override + public Long createVerbalTrick(VerbalTrickSaveReqVO createReqVO) { + // 插入 + VerbalTrickDO verbalTrick = BeanUtils.toBean(createReqVO, VerbalTrickDO.class); + verbalTrickMapper.insert(verbalTrick); + // 返回 + return verbalTrick.getId(); + } + + @Override + public void updateVerbalTrick(VerbalTrickSaveReqVO updateReqVO) { + // 校验存在 + validateVerbalTrickExists(updateReqVO.getId()); + // 更新 + VerbalTrickDO updateObj = BeanUtils.toBean(updateReqVO, VerbalTrickDO.class); + verbalTrickMapper.updateById(updateObj); + } + + @Override + public void deleteVerbalTrick(Long id) { + // 校验存在 + validateVerbalTrickExists(id); + // 删除 + verbalTrickMapper.deleteById(id); + } + + private void validateVerbalTrickExists(Long id) { + if (verbalTrickMapper.selectById(id) == null) { + throw exception(VERBAL_TRICK_NOT_EXISTS); + } + } + + @Override + public VerbalTrickDO getVerbalTrick(Long id) { + return verbalTrickMapper.selectById(id); + } + + @Override + public PageResult getVerbalTrickPage(VerbalTrickPageReqVO pageReqVO) { + return verbalTrickMapper.selectPage(pageReqVO); + } + + @Override + public List getVerbalTrickList() { + return verbalTrickMapper.selectList(); + } + +} \ No newline at end of file diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/channel/PayChannelServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/channel/PayChannelServiceImpl.java index 2fe495a..00adedd 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/channel/PayChannelServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/channel/PayChannelServiceImpl.java @@ -42,6 +42,7 @@ import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; @Validated public class PayChannelServiceImpl implements PayChannelService { + /** * {@link PayClient} 缓存,通过它异步清空 smsClientFactory */ diff --git a/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/admin/reservation/vo/LitemallReservationRespVO.java b/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/admin/reservation/vo/LitemallReservationRespVO.java index df02dcb..0ecdf14 100644 --- a/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/admin/reservation/vo/LitemallReservationRespVO.java +++ b/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/admin/reservation/vo/LitemallReservationRespVO.java @@ -2,13 +2,10 @@ package cn.iocoder.yudao.module.srbscribe.controller.admin.reservation.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; -import java.util.*; -import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; import com.alibaba.excel.annotation.*; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; - @Schema(description = "管理后台 - 预约订单 Response VO") @Data @ExcelIgnoreUnannotated diff --git a/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/app/brand/AppBrandController.java b/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/app/brand/AppBrandController.java index af4a3aa..b2906b4 100644 --- a/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/app/brand/AppBrandController.java +++ b/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/app/brand/AppBrandController.java @@ -38,50 +38,4 @@ public class AppBrandController { return success(BeanUtils.toBean(pageResult, LitemallBrandRespVO.class)); } - /** - * 导出医馆管理列表 - */ -// @PostMapping("/export") -// public void export(HttpServletResponse response, LitemallBrand litemallBrand) throws IOException { -// List list = litemallBrandService.selectLitemallBrandList(litemallBrand); -// ExcelUtil util = new ExcelUtil(LitemallBrand.class); -// util.exportExcel(response, list, "医馆管理数据"); -// } - - /** - * 获取医馆管理详细信息 - */ -// @GetMapping(value = "/{id}") -// public AjaxResult getInfo(@PathVariable("id") Integer id) { -// OrganizationDO organization = organizationService.getOrganization(id); -// return AjaxResult.success(organization); -// } - - /** - * 新增医馆管理 - */ -// @PostMapping -// public CommonResult add(@RequestBody OrganizationSaveReqVO createReqVO) { -// return success(organizationService.createOrganization(createReqVO)); -// } - - /** - * 修改医馆管理 - */ -// @PutMapping -// public AjaxResult edit(@RequestBody LitemallBrand litemallBrand) -// { -// return toAjax(litemallBrandService.updateLitemallBrand(litemallBrand)); -// } - - /** - * 删除医馆管理 - */ -// @DeleteMapping("/{ids}") -// public AjaxResult remove(@PathVariable Long[] ids) -// { -// return toAjax(litemallBrandService.deleteLitemallBrandByIds(ids)); -// } - - } diff --git a/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/app/reservation/AppReservationController.java b/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/app/reservation/AppReservationController.java index 0e6e82f..fb91f47 100644 --- a/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/app/reservation/AppReservationController.java +++ b/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/app/reservation/AppReservationController.java @@ -7,18 +7,15 @@ import cn.iocoder.yudao.module.srbscribe.controller.admin.reservation.vo.Litemal import cn.iocoder.yudao.module.srbscribe.controller.admin.reservation.vo.LitemallReservationRespVO; import cn.iocoder.yudao.module.srbscribe.controller.admin.reservation.vo.LitemallReservationSaveReqVO; import cn.iocoder.yudao.module.srbscribe.dal.dataobject.reservation.LitemallReservationDO; -import cn.iocoder.yudao.module.srbscribe.dal.dataobject.technician.LitemallTechnicianDO; import cn.iocoder.yudao.module.srbscribe.service.reservation.LitemallReservationService; import cn.iocoder.yudao.module.srbscribe.util.AjaxResult; import cn.iocoder.yudao.module.srbscribe.util.StringUtils; import cn.iocoder.yudao.module.system.api.dict.DictDataApi; import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO; import org.springframework.web.bind.annotation.*; - import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; - import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -49,7 +46,6 @@ public class AppReservationController { */ @GetMapping(value = "/type") public AjaxResult dictType() { -// List data = dictTypeService.selectDictDataByType("tech_type"); List dictDataList = dictDataApi.getDictDataList("types"); if (StringUtils.isNull(dictDataList)) { dictDataList = new ArrayList(); @@ -58,43 +54,6 @@ public class AppReservationController { } - /** - * 导出预约管理列表 - */ -// @PostMapping("/export") -// public void export(HttpServletResponse response, LitemallReservation litemallReservation) throws IOException -// { -// List list = litemallReservationService.selectLitemallReservationList(litemallReservation); -// ExcelUtil util = new ExcelUtil(LitemallReservation.class); -// util.exportExcel(response, list, "预约管理数据"); -// } - -// /** -// * 获取预约管理详细信息 -// */ -// @GetMapping(value = "/{id}") -// public CommonResult getManage(@PathVariable("id") Long id) { -// SubscribeManageDO manage = subscribeManageService.getManage(id); -// return success(BeanUtils.toBean(manage, SubscribeManageRespVO.class)); -// } -// - -// /** -// * 新增预约管理 -// */ -// @PostMapping -// public CommonResult createLitemallReservation(@RequestBody LitemallReservationSaveReqVO createReqVO) { -// return success(litemallReservationService.createLitemallReservation(createReqVO)); -// } - -// /** -// * 新增预约管理 -// */ -// @PostMapping("/add") -// public CommonResult createLitemallReservation(@RequestBody LitemallReservationSaveReqVO litemallReservationDO) { -// return success(litemallReservationService.createReservation(litemallReservationDO)); -// } - /** * 新增预约管理 */ @@ -113,24 +72,6 @@ public class AppReservationController { } -// /** -// * 修改预约管理 -// */ -// @PutMapping -// public CommonResult updateManage( @RequestBody SubscribeManageSaveReqVO updateReqVO) { -// subscribeManageService.updateManage(updateReqVO); -// return success(true); -// } -// -// /** -// * 删除预约管理 -// */ -// @DeleteMapping("/{ids}") -// public CommonResult deleteManage(@PathVariable("ids") Long[] ids) { -// subscribeManageService.deleteList(ids); -// return success(true); -// } - } diff --git a/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/app/technician/AppTechnicianController.java b/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/app/technician/AppTechnicianController.java index adabeed..52086e6 100644 --- a/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/app/technician/AppTechnicianController.java +++ b/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/controller/app/technician/AppTechnicianController.java @@ -4,11 +4,8 @@ package cn.iocoder.yudao.module.srbscribe.controller.app.technician; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.srbscribe.controller.admin.reservation.vo.LitemallReservationPageReqVO; -import cn.iocoder.yudao.module.srbscribe.controller.admin.reservation.vo.LitemallReservationRespVO; import cn.iocoder.yudao.module.srbscribe.controller.admin.technician.vo.LitemallTechnicianPageReqVO; import cn.iocoder.yudao.module.srbscribe.controller.admin.technician.vo.LitemallTechnicianRespVO; -import cn.iocoder.yudao.module.srbscribe.controller.admin.technician.vo.LitemallTechnicianSaveReqVO; import cn.iocoder.yudao.module.srbscribe.dal.dataobject.reservation.LitemallReservationDO; import cn.iocoder.yudao.module.srbscribe.dal.dataobject.technician.LitemallTechnicianDO; import cn.iocoder.yudao.module.srbscribe.service.reservation.LitemallReservationService; @@ -16,12 +13,8 @@ import cn.iocoder.yudao.module.srbscribe.service.technician.LitemallTechnicianSe import org.json.JSONException; import org.springframework.web.bind.annotation.*; import org.json.JSONArray; - import javax.annotation.Resource; -import javax.validation.Valid; - import com.alibaba.fastjson.JSON; - import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -53,39 +46,6 @@ public class AppTechnicianController { return success(BeanUtils.toBean(pageResult, LitemallTechnicianRespVO.class)); } - -// /** -// * 首页查询技师管理列表(名称去重) -// */ -// @GetMapping("/listmain") -// public CommonResult> listmain(LitemallTechnicianPageReqVO pageReqVO) { -// PageResult pageResult = litemallTechnicianService.getLitemallTechnicianPage(pageReqVO); -// return success(BeanUtils.toBean(pageResult, LitemallTechnicianRespVO.class)); -// } - - -// /** -// * 查询技师管理列表 -// */ -// @GetMapping("/list") -// public TableDataInfo list(LitemallTechnician litemallTechnician) -// { -// startPage(); -// List list = litemallTechnicianService.selectLitemallTechnicianList(litemallTechnician); -// return getDataTable(list); -// } -// /** -// * 首页查询技师管理列表(名称去重) -// */ -// @GetMapping("/listmain") -// public TableDataInfo listmain(LitemallTechnician litemallTechnician) -// { -// startPage(); -// List list = litemallTechnicianService.selectLitemallTechnicianListmian(litemallTechnician); -// return getDataTable(list); -// } - - /** * 查询技师管理详情 */ @@ -119,52 +79,6 @@ public class AppTechnicianController { } - /** - * 导出技师管理列表 - */ -// @PostMapping("/export") -// public void export(HttpServletResponse response, LitemallTechnician litemallTechnician) throws IOException -// { -// List list = litemallTechnicianService.selectLitemallTechnicianList(litemallTechnician); -// ExcelUtil util = new ExcelUtil(LitemallTechnician.class); -// util.exportExcel(response, list, "技师管理数据"); -// } - -// /** -// * 获取技师管理详细信息 -// */ -// @GetMapping(value = "/{id}") -// public CommonResult getInfo(@PathVariable("id") Long id) { -// StaffDO staff = staffService.getStaff(id); -// return success(BeanUtils.toBean(staff, StaffRespVO.class)); -// } -// -// /** -// * 新增技师管理 -// */ -// @PostMapping -// public CommonResult add(@Valid @RequestBody StaffSaveReqVO createReqVO) { -// return success(staffService.createStaff(createReqVO)); -// } -// -// /** -// * 修改技师管理 -// */ -// @PutMapping -// public CommonResult updateStaff( @RequestBody StaffSaveReqVO updateReqVO) { -// staffService.updateStaff(updateReqVO); -// return success(true); -// } -// -// /** -// * 删除技师管理 -// */ -// @DeleteMapping("/{ids}") -// public CommonResult deleteStaff(@PathVariable("ids") Long id) { -// staffService.deleteStaff(id); -// return success(true); -// } - } diff --git a/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/dal/dataobject/reservation/LitemallReservationDO.java b/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/dal/dataobject/reservation/LitemallReservationDO.java index 407ed74..34e6136 100644 --- a/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/dal/dataobject/reservation/LitemallReservationDO.java +++ b/yudao-module-subscribe/yudao-module-subscribe-biz/src/main/java/cn/iocoder/yudao/module/srbscribe/dal/dataobject/reservation/LitemallReservationDO.java @@ -1,11 +1,6 @@ package cn.iocoder.yudao.module.srbscribe.dal.dataobject.reservation; -import com.fasterxml.jackson.annotation.JsonFormat; import lombok.*; -import java.util.*; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.*; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;