feat: add WeCom outbox management features including retry and ignore actions, permissions, and UI integration

This commit is contained in:
mlogclub
2026-08-02 14:03:23 +08:00
parent c69b30a659
commit 1d6c0e37db
16 changed files with 457 additions and 1 deletions
@@ -6,8 +6,10 @@ import (
"agent-desk/internal/pkg/dto/request"
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/pkg/enums"
"agent-desk/internal/pkg/errorsx"
"agent-desk/internal/pkg/httpx"
"agent-desk/internal/services"
"strings"
"agent-desk/internal/pkg/httpx/params"
@@ -63,6 +65,74 @@ func ChannelAnyWxworkKfAccounts(ctx *gin.Context) {
httpx.WriteJSON(ctx, list)
}
func ChannelAnyWxworkOutboxFailedList(ctx *gin.Context) {
if _, err := services.AuthService.RequirePermission(ctx, constants.PermissionWxWorkOutboxView); err != nil {
httpx.WriteJSON(ctx, err)
return
}
cnd := params.NewPagedSqlCnd(ctx,
params.QueryFilter{ParamName: "conversationId"},
params.QueryFilter{ParamName: "messageId"},
).Eq("channel_type", enums.ChannelTypeWxWorkKF)
status := strings.TrimSpace(params.FormValue(ctx, "sendStatus"))
switch status {
case "":
cnd.Eq("send_status", string(enums.ChannelMessageOutboxStatusFailed))
case "all":
cnd.In("send_status", []string{
string(enums.ChannelMessageOutboxStatusFailed),
string(enums.ChannelMessageOutboxStatusIgnored),
})
case string(enums.ChannelMessageOutboxStatusFailed), string(enums.ChannelMessageOutboxStatusIgnored):
cnd.Eq("send_status", status)
default:
httpx.WriteJSON(ctx, errorsx.InvalidParam("invalid sendStatus"))
return
}
list, paging := services.ChannelMessageOutboxService.FindPageByCnd(cnd.Desc("id"))
results := make([]response.ChannelMessageOutboxResponse, 0, len(list))
for _, item := range list {
results = append(results, response.BuildChannelMessageOutboxResponse(&item))
}
httpx.WriteJSON(ctx, &web.PageResult{Results: results, Page: paging})
}
func ChannelPostWxworkOutboxRetry(ctx *gin.Context) {
operator, err := services.AuthService.RequirePermission(ctx, constants.PermissionWxWorkOutboxUpdate)
if err != nil {
httpx.WriteJSON(ctx, err)
return
}
req := request.ChannelMessageOutboxActionRequest{}
if err := params.ReadJSON(ctx, &req); err != nil {
httpx.WriteJSON(ctx, err)
return
}
if err := services.ChannelMessageOutboxService.RetryWxWorkFailure(req.ID, operator); err != nil {
httpx.WriteJSON(ctx, err)
return
}
httpx.WriteJSON(ctx, nil)
}
func ChannelPostWxworkOutboxIgnore(ctx *gin.Context) {
operator, err := services.AuthService.RequirePermission(ctx, constants.PermissionWxWorkOutboxUpdate)
if err != nil {
httpx.WriteJSON(ctx, err)
return
}
req := request.ChannelMessageOutboxActionRequest{}
if err := params.ReadJSON(ctx, &req); err != nil {
httpx.WriteJSON(ctx, err)
return
}
if err := services.ChannelMessageOutboxService.IgnoreWxWorkFailure(req.ID, operator); err != nil {
httpx.WriteJSON(ctx, err)
return
}
httpx.WriteJSON(ctx, nil)
}
func ChannelPostCreate(ctx *gin.Context) {
operator, err := services.AuthService.RequirePermission(ctx, constants.PermissionChannelCreate)
if err != nil {