lckt-server/plugin/customerservice/api/service.go

485 lines
16 KiB
Go

package api
import (
"crypto/md5"
"encoding/hex"
"git.echol.cn/loser/lckt/global"
"git.echol.cn/loser/lckt/model/common/response"
"git.echol.cn/loser/lckt/plugin/customerservice/model"
"git.echol.cn/loser/lckt/plugin/customerservice/service"
"git.echol.cn/loser/lckt/plugin/customerservice/tools"
"github.com/gin-gonic/gin"
"strconv"
"time"
)
type AdminServiceApi struct{}
// GetServiceList
// @Tags sysService
// @Summary 客服列表
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request.PageInfo true "页码, 每页大小"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "分页客服列表,返回包括列表,总数,页码,每页数量"
// @Router /service/get_service_list [post]
func (ad *AdminServiceApi) GetServiceList(c *gin.Context) {
var pageInfo model.PageInfo
if err := c.ShouldBindQuery(&pageInfo); err != nil {
response.FailWithMessage("参数错误:"+err.Error(), c)
return
}
limit := pageInfo.Limit
offset := pageInfo.Limit * (pageInfo.Page - 1)
db := global.GVA_DB.Model(&model.SysService{})
var list []model.SysService
var total int64
db.Count(&total)
err := db.Omit("password").Order("add_time desc").Limit(limit).Offset(offset).Find(&list).Error
if err != nil {
response.FailWithMessage("查询失败:"+err.Error(), c)
return
}
response.OkWithDetailed(response.PageResult{
List: list,
Total: total,
Page: pageInfo.Page,
PageSize: pageInfo.Limit,
}, "获取成功", c)
}
// SaveService
// @Tags sysService
// @Summary 添加/更新客服
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request true ""
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} ""
// @Router /service/save_service [post]
func (ad *AdminServiceApi) SaveService(c *gin.Context) {
var serviceData model.SysService
if err := c.ShouldBindJSON(&serviceData); err != nil {
response.FailWithMessage("参数错误:"+err.Error(), c)
return
}
//校验数据
ser := service.ServiceGroupApp
if err := ser.ValidateServiceData(&serviceData); err != nil {
response.FailWithMessage("操作失败:"+err.Error(), c)
return
}
var msg string
if serviceData.Password != "" {
hash := md5.Sum([]byte("gva-service" + serviceData.Password))
serviceData.Password = hex.EncodeToString(hash[:])
}
if serviceData.Id == 0 {
serviceData.AddTime = time.Now().Unix()
if err := global.GVA_DB.Create(&serviceData).Error; err != nil {
response.FailWithMessage("添加失败:"+err.Error(), c)
return
}
msg = "添加成功"
} else {
if err := global.GVA_DB.Model(&model.SysService{}).Where("id = ?", serviceData.Id).Updates(serviceData).Error; err != nil {
response.FailWithMessage("更新失败:"+err.Error(), c)
return
}
msg = "更新成功"
}
response.OkWithMessage(msg, c)
}
// DeleteService
// @Tags sysService
// @Summary 删除客服
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request.id true "id"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "成功消息"
// @Router /service/delete_service?id=xx [delete]
func (ad *AdminServiceApi) DeleteService(c *gin.Context) {
idParam := c.Query("id")
id, err := strconv.Atoi(idParam)
if err != nil {
response.FailWithMessage("参数错误:"+err.Error(), c)
return
}
var ser model.SysService
if err := global.GVA_DB.First(&ser, id).Error; err != nil {
//if errors.Is(err, gorm.ErrRecordNotFound) {
//
//}
response.FailWithMessage("用户不存在:"+err.Error(), c)
return
}
// 删除用户
if err := global.GVA_DB.Delete(&model.SysService{}, id).Error; err != nil {
response.FailWithMessage("删除失败:"+err.Error(), c)
return
}
response.OkWithMessage("删除成功", c)
}
// FindService
// @Tags sysService
// @Summary 查找客服
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request.id true "id"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "成功消息"
// @Router /service/find_service?id=xx [get]
func (ad *AdminServiceApi) FindService(c *gin.Context) {
idParam := c.Query("id")
id, err := strconv.Atoi(idParam)
if err != nil {
response.FailWithMessage("参数错误:"+err.Error(), c)
return
}
var ser model.SysService
if err := global.GVA_DB.First(&ser, id).Error; err != nil {
response.FailWithMessage("客服不存在:"+err.Error(), c)
return
}
ser.Password = ""
response.OkWithDetailed(ser, "success", c)
}
// AdminServiceLogin
// @Tags sysService
// @Summary 进入工作台
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request.id true "id"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "成功消息"
// @Router /service/delete_reply/:id [delete]
func (ad *AdminServiceApi) AdminServiceLogin(c *gin.Context) {
idParam := c.Query("id")
var ser model.SysService
if err := global.GVA_DB.First(&ser, idParam).Error; err != nil {
response.FailWithMessage("客服不存在:"+err.Error(), c)
return
}
data := map[string]interface{}{}
expTime, token, err := tools.GenerateToken(ser.Id)
if err != nil {
response.FailWithMessage("登录失败:"+err.Error(), c)
return
}
data["token"] = token
data["exp_time"] = expTime
response.OkWithDetailed(data, "success", c)
}
// AccountServiceLogin
// @Tags sysService
// @Summary 账户密码登录
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request.id true "id"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "成功消息"
// @Router /service/admin_login?id=xx [get]
func (ad *AdminServiceApi) AccountServiceLogin(c *gin.Context) {
var loginInfo model.LoginInfo
if err := c.ShouldBindJSON(&loginInfo); err != nil {
response.FailWithMessage("参数错误:"+err.Error(), c)
return
}
if loginInfo.Account == "" || loginInfo.Password == "" {
response.FailWithMessage("账户或密码为空", c)
return
}
var serviceInfo model.SysService
if err := global.GVA_DB.Limit(1).Where("account=?", loginInfo.Account).Find(&serviceInfo).Error; err != nil {
response.FailWithMessage("客服不存在:"+err.Error(), c)
return
}
hash := md5.Sum([]byte("gva-service" + loginInfo.Password))
md5Pwd := hex.EncodeToString(hash[:])
if md5Pwd != serviceInfo.Password {
response.FailWithMessage("密码不正确", c)
return
}
data := map[string]interface{}{}
expTime, token, err := tools.GenerateToken(serviceInfo.Id)
if err != nil {
response.FailWithMessage("登录失败:"+err.Error(), c)
return
}
data["token"] = token
data["exp_time"] = expTime
response.OkWithDetailed(data, "success", c)
}
// GetScriptList
// @Tags sysService
// @Summary 客服话术列表
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request.PageInfo true "页码, 每页大小"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "分页客服列表,返回包括列表,总数,页码,每页数量"
// @Router /service/get_script_list [get]
func (ad *AdminServiceApi) GetScriptList(c *gin.Context) {
var pageInfo model.PageInfo
if err := c.ShouldBindQuery(&pageInfo); err != nil {
response.FailWithMessage("参数错误:"+err.Error(), c)
return
}
limit := pageInfo.Limit
offset := pageInfo.Limit * (pageInfo.Page - 1)
db := global.GVA_DB.Model(&model.SysServiceScript{})
var list []model.SysServiceScript
var total int64
db.Count(&total)
err := db.Order("sort desc,add_time desc").Limit(limit).Offset(offset).Find(&list).Error
if err != nil {
response.FailWithMessage("查询失败:"+err.Error(), c)
return
}
for k, v := range list {
t := time.Unix(v.AddTime, 0)
v.AddTimeStr = t.Format("2006-01-02 15:04:05")
list[k] = v
}
response.OkWithDetailed(response.PageResult{
List: list,
Total: total,
Page: pageInfo.Page,
PageSize: pageInfo.Limit,
}, "获取成功", c)
}
// SaveScript
// @Tags sysService
// @Summary 添加/更新客服话术
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request true ""
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} ""
// @Router /service/save_script [post]
func (ad *AdminServiceApi) SaveScript(c *gin.Context) {
var scriptData model.SysServiceScript
if err := c.ShouldBindJSON(&scriptData); err != nil {
response.FailWithMessage("参数错误:"+err.Error(), c)
return
}
//校验数据
ser := service.ServiceGroupApp
if err := ser.ValidateScriptData(&scriptData); err != nil {
response.FailWithMessage("操作失败:"+err.Error(), c)
return
}
var msg string
if scriptData.Id == 0 {
scriptData.AddTime = time.Now().Unix()
if err := global.GVA_DB.Create(&scriptData).Error; err != nil {
response.FailWithMessage("添加失败:"+err.Error(), c)
return
}
msg = "添加成功"
} else {
if err := global.GVA_DB.Model(&model.SysServiceScript{}).Where("id = ?", scriptData.Id).Updates(scriptData).Error; err != nil {
response.FailWithMessage("更新失败:"+err.Error(), c)
return
}
msg = "更新成功"
}
response.OkWithMessage(msg, c)
}
// DeleteScript
// @Tags sysService
// @Summary 删除客服话术
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request.id true "id"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "成功消息"
// @Router /service/delete_script?id=xxx [delete]
func (ad *AdminServiceApi) DeleteScript(c *gin.Context) {
idParam := c.Query("id")
id, err := strconv.Atoi(idParam)
if err != nil {
response.FailWithMessage("参数错误:"+err.Error(), c)
return
}
var ser model.SysServiceScript
if err := global.GVA_DB.First(&ser, id).Error; err != nil {
response.FailWithMessage("话术不存在或已删除:"+err.Error(), c)
return
}
// 删除
if err := global.GVA_DB.Delete(&model.SysServiceScript{}, id).Error; err != nil {
response.FailWithMessage("删除失败:"+err.Error(), c)
return
}
response.OkWithMessage("删除成功", c)
}
// FindScript
// @Tags sysService
// @Summary 查找话术
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request.id true "id"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "成功消息"
// @Router /service/find_script?id=xx [get]
func (ad *AdminServiceApi) FindScript(c *gin.Context) {
idParam := c.Query("id")
id, err := strconv.Atoi(idParam)
if err != nil {
response.FailWithMessage("参数错误:"+err.Error(), c)
return
}
var ser model.SysServiceScript
if err := global.GVA_DB.First(&ser, id).Error; err != nil {
response.FailWithMessage("话术不存在:"+err.Error(), c)
return
}
response.OkWithDetailed(ser, "success", c)
}
// AutoReplyList
// @Tags sysService
// @Summary 自动回复列表
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request.PageInfo true "页码, 每页大小"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "分页客服列表,返回包括列表,总数,页码,每页数量"
// @Router /service/auto_reply_list [get]
func (ad *AdminServiceApi) AutoReplyList(c *gin.Context) {
var pageInfo model.AutoPageInfo
if err := c.ShouldBindQuery(&pageInfo); err != nil {
response.FailWithMessage("参数错误:"+err.Error(), c)
return
}
limit := pageInfo.Limit
offset := pageInfo.Limit * (pageInfo.Page - 1)
db := global.GVA_DB.Model(&model.SysServiceReply{})
var list []model.SysServiceReply
var total int64
db.Count(&total)
err := db.Order("add_time desc").Limit(limit).Offset(offset).Find(&list).Error
if err != nil {
response.FailWithMessage("查询失败:"+err.Error(), c)
return
}
for k, v := range list {
t := time.Unix(v.AddTime, 0)
v.AddTimeStr = t.Format("2006-01-02 15:04:05")
list[k] = v
}
response.OkWithDetailed(response.PageResult{
List: list,
Total: total,
Page: pageInfo.Page,
PageSize: pageInfo.Limit,
}, "获取成功", c)
}
// SaveReply
// @Tags sysService
// @Summary 添加/更新自动回复
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request true ""
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} ""
// @Router /service/save_reply [post]
func (ad *AdminServiceApi) SaveReply(c *gin.Context) {
var replyData model.SysServiceReply
if err := c.ShouldBindJSON(&replyData); err != nil {
response.FailWithMessage("参数错误:"+err.Error(), c)
return
}
//校验数据
ser := service.ServiceGroupApp
if err := ser.ValidateReplyData(&replyData); err != nil {
response.FailWithMessage("操作失败:"+err.Error(), c)
return
}
var msg string
if replyData.Id == 0 {
replyData.AddTime = time.Now().Unix()
if err := global.GVA_DB.Create(&replyData).Error; err != nil {
response.FailWithMessage("添加失败:"+err.Error(), c)
return
}
msg = "添加成功"
} else {
if err := global.GVA_DB.Model(&model.SysServiceReply{}).Where("id = ?", replyData.Id).Updates(replyData).Error; err != nil {
response.FailWithMessage("更新失败:"+err.Error(), c)
return
}
msg = "更新成功"
}
response.OkWithMessage(msg, c)
}
// DeleteReply
// @Tags sysService
// @Summary 删除自动回复
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request.id true "id"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "成功消息"
// @Router /service/delete_reply?id=xx [delete]
func (ad *AdminServiceApi) DeleteReply(c *gin.Context) {
idParam := c.Query("id")
id, err := strconv.Atoi(idParam)
if err != nil {
response.FailWithMessage("参数错误:"+err.Error(), c)
return
}
var ser model.SysServiceReply
if err := global.GVA_DB.First(&ser, id).Error; err != nil {
response.FailWithMessage("内容不存在或已删除:"+err.Error(), c)
return
}
// 删除数据
if err := global.GVA_DB.Delete(&model.SysServiceReply{}, id).Error; err != nil {
response.FailWithMessage("删除失败:"+err.Error(), c)
return
}
response.OkWithMessage("删除成功", c)
}
// FindReply
// @Tags sysService
// @Summary 查找自动回复详情
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request.id true "id"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "成功消息"
// @Router /service/find_reply?id=xxx [get]
func (ad *AdminServiceApi) FindReply(c *gin.Context) {
idParam := c.Query("id")
id, err := strconv.Atoi(idParam)
if err != nil {
response.FailWithMessage("参数错误:"+err.Error(), c)
return
}
var ser model.SysServiceReply
if err := global.GVA_DB.First(&ser, id).Error; err != nil {
response.FailWithMessage("自动回复内容不存在:"+err.Error(), c)
return
}
response.OkWithDetailed(ser, "success", c)
}