Compare commits
3 Commits
422b426c37
...
b9ca6c67ef
Author | SHA1 | Date | |
---|---|---|---|
b9ca6c67ef | |||
3890d74c0c | |||
b5ec90382f |
File diff suppressed because it is too large
Load Diff
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
package accountFiee;
|
package accountFiee;
|
||||||
import "github.com/mwitkow/go-proto-validators/validator.proto";
|
import "github.com/mwitkow/go-proto-validators@v0.3.2/validator.proto";
|
||||||
option go_package = "./;accountFiee";
|
option go_package = "./;accountFiee";
|
||||||
|
|
||||||
//protoc -I . -I C:\Users\lenovo\go\src --go_out=. --go-triple_out=. ./accountFiee.proto
|
//protoc -I . -I C:\Users\lenovo\go\src --go_out=. --go-triple_out=. ./accountFiee.proto
|
||||||
@ -207,6 +207,7 @@ message UserInfoResponse{
|
|||||||
string subscriberNumber = 16;
|
string subscriberNumber = 16;
|
||||||
string nickName = 17;
|
string nickName = 17;
|
||||||
string telNum = 18;
|
string telNum = 18;
|
||||||
|
string telAreaCode = 19;
|
||||||
}
|
}
|
||||||
message RealNameResponse{
|
message RealNameResponse{
|
||||||
uint64 id = 1;
|
uint64 id = 1;
|
||||||
@ -869,7 +870,7 @@ enum MsgType{
|
|||||||
ImageMsgType = 2 ;//图片
|
ImageMsgType = 2 ;//图片
|
||||||
AudioMsgType = 3 ;//音频
|
AudioMsgType = 3 ;//音频
|
||||||
VideoMsgType = 4 ;//视频
|
VideoMsgType = 4 ;//视频
|
||||||
FileType = 5 ;//文件
|
CardType = 5 ;//卡片
|
||||||
}
|
}
|
||||||
message ChatRecordData{
|
message ChatRecordData{
|
||||||
int64 ID=1;
|
int64 ID=1;
|
||||||
@ -886,6 +887,7 @@ message ChatRecordData{
|
|||||||
int32 waiterRead=12;//客服是否已读 1=已读 2=未读 (被任意客服读取过均为已读)
|
int32 waiterRead=12;//客服是否已读 1=已读 2=未读 (被任意客服读取过均为已读)
|
||||||
int64 localStamp = 13; //本地时间戳 用户端的消息唯一值,用于用户本地的一些逻辑处理
|
int64 localStamp = 13; //本地时间戳 用户端的消息唯一值,用于用户本地的一些逻辑处理
|
||||||
string domain =14;//域
|
string domain =14;//域
|
||||||
|
int32 role=15;//用户角色: 1=用户 2=客服 3=机器人
|
||||||
}
|
}
|
||||||
message CreateChatRecordResp{
|
message CreateChatRecordResp{
|
||||||
ChatRecordData data=1;
|
ChatRecordData data=1;
|
||||||
@ -967,13 +969,15 @@ message GetChatUserListRequest2{
|
|||||||
string where=3;
|
string where=3;
|
||||||
string name=4;
|
string name=4;
|
||||||
repeated int64 userIdIn=5;
|
repeated int64 userIdIn=5;
|
||||||
|
string account=6;
|
||||||
|
repeated int32 roleIn=7;
|
||||||
}
|
}
|
||||||
message ChatUser2{
|
message ChatUser2{
|
||||||
int64 userId=1;
|
int64 userId=1;
|
||||||
string name=2;
|
string name=2;
|
||||||
string avatar=3;
|
string avatar=3;
|
||||||
string origin=4;
|
string origin=4;
|
||||||
string originId=5;
|
int64 originId=5;
|
||||||
}
|
}
|
||||||
message GetChatUserListResp2{
|
message GetChatUserListResp2{
|
||||||
repeated ChatUser2 list=1;
|
repeated ChatUser2 list=1;
|
||||||
@ -1024,7 +1028,7 @@ message ChatUserData{
|
|||||||
int64 deletedAt = 4; //
|
int64 deletedAt = 4; //
|
||||||
string nickName = 5; //昵称
|
string nickName = 5; //昵称
|
||||||
string account = 6; //账号
|
string account = 6; //账号
|
||||||
int32 role = 7; //聊天角色 1=用户 2=客服
|
int32 role = 7; //聊天角色 1=用户 2=客服 3=机器人
|
||||||
string origin = 8; //数据来源
|
string origin = 8; //数据来源
|
||||||
int64 originId = 9; //数据来源对应的用户ID
|
int64 originId = 9; //数据来源对应的用户ID
|
||||||
string avatar = 10; //头像
|
string avatar = 10; //头像
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -443,6 +443,8 @@ func (m *UpdateMediaAccountReq) validate(all bool) error {
|
|||||||
|
|
||||||
// no validation rules for ManagerUserName
|
// no validation rules for ManagerUserName
|
||||||
|
|
||||||
|
// no validation rules for ArtistPhoneAreaCode
|
||||||
|
|
||||||
if len(errors) > 0 {
|
if len(errors) > 0 {
|
||||||
return UpdateMediaAccountReqMultiError(errors)
|
return UpdateMediaAccountReqMultiError(errors)
|
||||||
}
|
}
|
||||||
@ -1062,6 +1064,8 @@ func (m *UpdateWorkImageReq) validate(all bool) error {
|
|||||||
|
|
||||||
// no validation rules for ArtistName
|
// no validation rules for ArtistName
|
||||||
|
|
||||||
|
// no validation rules for ArtistPhoneAreaCode
|
||||||
|
|
||||||
if len(errors) > 0 {
|
if len(errors) > 0 {
|
||||||
return UpdateWorkImageReqMultiError(errors)
|
return UpdateWorkImageReqMultiError(errors)
|
||||||
}
|
}
|
||||||
@ -1485,6 +1489,8 @@ func (m *UpdateWorkVideoReq) validate(all bool) error {
|
|||||||
|
|
||||||
// no validation rules for ArtistName
|
// no validation rules for ArtistName
|
||||||
|
|
||||||
|
// no validation rules for ArtistPhoneAreaCode
|
||||||
|
|
||||||
if len(errors) > 0 {
|
if len(errors) > 0 {
|
||||||
return UpdateWorkVideoReqMultiError(errors)
|
return UpdateWorkVideoReqMultiError(errors)
|
||||||
}
|
}
|
||||||
@ -2459,6 +2465,8 @@ func (m *UpdateStatusReq) validate(all bool) error {
|
|||||||
|
|
||||||
// no validation rules for ConfirmStatus
|
// no validation rules for ConfirmStatus
|
||||||
|
|
||||||
|
// no validation rules for ApprovalReply
|
||||||
|
|
||||||
if len(errors) > 0 {
|
if len(errors) > 0 {
|
||||||
return UpdateStatusReqMultiError(errors)
|
return UpdateStatusReqMultiError(errors)
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"fonchain-fiee/cmd/config"
|
"fonchain-fiee/cmd/config"
|
||||||
"fonchain-fiee/pkg/cache"
|
"fonchain-fiee/pkg/cache"
|
||||||
|
"fonchain-fiee/pkg/logger"
|
||||||
"fonchain-fiee/pkg/router"
|
"fonchain-fiee/pkg/router"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -44,6 +45,7 @@ func bootstrap() (err error) {
|
|||||||
fmt.Println(configEnv)
|
fmt.Println(configEnv)
|
||||||
fmt.Println(config.AppConfig)
|
fmt.Println(config.AppConfig)
|
||||||
|
|
||||||
|
logger.LogInit(config.AppConfig)
|
||||||
////redis
|
////redis
|
||||||
redisConfig := cache.RedisConfig{
|
redisConfig := cache.RedisConfig{
|
||||||
RedisDB: configEnv.Redis.RedisDB,
|
RedisDB: configEnv.Redis.RedisDB,
|
||||||
|
@ -124,6 +124,14 @@ type Oss struct {
|
|||||||
BaseDir string
|
BaseDir string
|
||||||
CdnHost string
|
CdnHost string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ZapLog struct {
|
||||||
|
Level string
|
||||||
|
Filename string
|
||||||
|
MaxSize int
|
||||||
|
MaxAge int
|
||||||
|
MaxBackups int
|
||||||
|
}
|
||||||
type Mobile struct {
|
type Mobile struct {
|
||||||
SK string
|
SK string
|
||||||
AK string
|
AK string
|
||||||
@ -143,6 +151,7 @@ type Config struct {
|
|||||||
Mobile Mobile `toml:"mobile"`
|
Mobile Mobile `toml:"mobile"`
|
||||||
Ai Ai `toml:"ai"`
|
Ai Ai `toml:"ai"`
|
||||||
Oss Oss `toml:"oss"`
|
Oss Oss `toml:"oss"`
|
||||||
|
ZapLog ZapLog `toml:"zapLog"`
|
||||||
}
|
}
|
||||||
|
|
||||||
/********start-配置信息*********/
|
/********start-配置信息*********/
|
||||||
|
@ -34,3 +34,10 @@ Password = "Gy.123456"
|
|||||||
|
|
||||||
[stripe]
|
[stripe]
|
||||||
Webhookkey = "whsec_uOQpG6IZTqtfLuePIDtfLCGJPqedSCCN"
|
Webhookkey = "whsec_uOQpG6IZTqtfLuePIDtfLCGJPqedSCCN"
|
||||||
|
|
||||||
|
[zapLog]
|
||||||
|
level = "info"
|
||||||
|
filename = "logs/fiee_zap.log"
|
||||||
|
max_size = 5
|
||||||
|
max_age = 30
|
||||||
|
max_backups = 30
|
||||||
|
@ -34,3 +34,10 @@ CdnHost = "https://e-cdn.fontree.cn"
|
|||||||
|
|
||||||
[stripe]
|
[stripe]
|
||||||
Webhookkey = "whsec_Mol32WD1KcKHUdYsSwap0LR03q2g9qNY"
|
Webhookkey = "whsec_Mol32WD1KcKHUdYsSwap0LR03q2g9qNY"
|
||||||
|
|
||||||
|
[zapLog]
|
||||||
|
level = "info"
|
||||||
|
filename = "logs/fiee_zap.log"
|
||||||
|
max_size = 5
|
||||||
|
max_age = 30
|
||||||
|
max_backups = 30
|
||||||
|
@ -34,3 +34,10 @@ Password = "Gy.123456"
|
|||||||
|
|
||||||
[stripe]
|
[stripe]
|
||||||
Webhookkey = "whsec_uOQpG6IZTqtfLuePIDtfLCGJPqedSCCN"
|
Webhookkey = "whsec_uOQpG6IZTqtfLuePIDtfLCGJPqedSCCN"
|
||||||
|
|
||||||
|
[zapLog]
|
||||||
|
level = "info"
|
||||||
|
filename = "logs/fiee_zap.log"
|
||||||
|
max_size = 5
|
||||||
|
max_age = 30
|
||||||
|
max_backups = 30
|
||||||
|
54
pkg/logger/zap_logger.go
Normal file
54
pkg/logger/zap_logger.go
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
package logger
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fonchain-fiee/cmd/config"
|
||||||
|
"github.com/natefinch/lumberjack"
|
||||||
|
"go.uber.org/zap"
|
||||||
|
"go.uber.org/zap/zapcore"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func LogInit(appConfig *config.Config) *zap.Logger {
|
||||||
|
var err error
|
||||||
|
writeSyncer := getLogWriter(appConfig.ZapLog.Filename, appConfig.ZapLog.MaxSize, appConfig.ZapLog.MaxBackups, appConfig.ZapLog.MaxAge)
|
||||||
|
encoder := getEncoder()
|
||||||
|
var l = new(zapcore.Level)
|
||||||
|
err = l.UnmarshalText([]byte(appConfig.ZapLog.Level))
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var core zapcore.Core
|
||||||
|
//if appConfig.System.Mode == "dev" {
|
||||||
|
// 进入开发模式,日志输出到终端
|
||||||
|
consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())
|
||||||
|
core = zapcore.NewTee(
|
||||||
|
zapcore.NewCore(encoder, writeSyncer, l),
|
||||||
|
zapcore.NewCore(consoleEncoder, zapcore.Lock(os.Stdout), zapcore.DebugLevel),
|
||||||
|
)
|
||||||
|
//} else {
|
||||||
|
// core = zapcore.NewCore(encoder, writeSyncer, l)
|
||||||
|
//}
|
||||||
|
lg := zap.New(core, zap.AddCaller())
|
||||||
|
zap.ReplaceGlobals(lg)
|
||||||
|
return lg
|
||||||
|
}
|
||||||
|
|
||||||
|
func getEncoder() zapcore.Encoder {
|
||||||
|
encoderConfig := zap.NewProductionEncoderConfig()
|
||||||
|
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
|
||||||
|
encoderConfig.TimeKey = "time"
|
||||||
|
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
|
||||||
|
encoderConfig.EncodeDuration = zapcore.SecondsDurationEncoder
|
||||||
|
encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder
|
||||||
|
return zapcore.NewJSONEncoder(encoderConfig)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getLogWriter(filename string, maxSize, maxBackup, maxAge int) zapcore.WriteSyncer {
|
||||||
|
lumberJackLogger := &lumberjack.Logger{
|
||||||
|
Filename: filename,
|
||||||
|
MaxSize: maxSize,
|
||||||
|
MaxBackups: maxBackup,
|
||||||
|
MaxAge: maxAge,
|
||||||
|
}
|
||||||
|
return zapcore.AddSync(lumberJackLogger)
|
||||||
|
}
|
@ -21,4 +21,5 @@ type Item struct {
|
|||||||
ID int `json:"ID"`
|
ID int `json:"ID"`
|
||||||
Domain string `json:"Domain"`
|
Domain string `json:"Domain"`
|
||||||
Status int `json:"Status"`
|
Status int `json:"Status"`
|
||||||
|
Reply string `json:"Reply"`
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ import (
|
|||||||
type CastService struct {
|
type CastService struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *CastService) ApprovalDetail(approvalIds []int) (data map[int]int, err error) {
|
func (c *CastService) ApprovalDetail(approvalIds []int) (data map[int]modelCast.Item, err error) {
|
||||||
type ApprovalDetailRequest struct {
|
type ApprovalDetailRequest struct {
|
||||||
ID []int `json:"ID"`
|
ID []int `json:"ID"`
|
||||||
}
|
}
|
||||||
@ -33,9 +33,9 @@ func (c *CastService) ApprovalDetail(approvalIds []int) (data map[int]int, err e
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if respDetail.Status == 0 && len(respDetail.Data.Data) > 0 {
|
if respDetail.Status == 0 && len(respDetail.Data.Data) > 0 {
|
||||||
data = make(map[int]int, len(respDetail.Data.Data))
|
data = make(map[int]modelCast.Item, len(respDetail.Data.Data))
|
||||||
for _, v := range respDetail.Data.Data {
|
for _, v := range respDetail.Data.Data {
|
||||||
data[v.ID] = v.Status
|
data[v.ID] = v
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err = errors.New(e.GetMsg(e.ErrorHttp))
|
err = errors.New(e.GetMsg(e.ErrorHttp))
|
||||||
|
@ -2,7 +2,6 @@ package cast
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"dubbo.apache.org/dubbo-go/v3/common/logger"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fonchain-fiee/api/accountFiee"
|
"fonchain-fiee/api/accountFiee"
|
||||||
"fonchain-fiee/api/bundle"
|
"fonchain-fiee/api/bundle"
|
||||||
@ -12,6 +11,7 @@ import (
|
|||||||
modelCast "fonchain-fiee/pkg/model/cast"
|
modelCast "fonchain-fiee/pkg/model/cast"
|
||||||
"fonchain-fiee/pkg/service"
|
"fonchain-fiee/pkg/service"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.uber.org/zap"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ func UnbindManager(ctx *gin.Context) {
|
|||||||
service.Error(ctx, err)
|
service.Error(ctx, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
logger.Error("UnbindManager resp" + resp.OldBindArtistUuid)
|
zap.L().Info("UnbindManager resp", zap.Any("resp", resp))
|
||||||
if resp.OldBindArtistUuid != "" {
|
if resp.OldBindArtistUuid != "" {
|
||||||
userID, _ := strconv.ParseInt(resp.OldBindArtistUuid, 10, 64)
|
userID, _ := strconv.ParseInt(resp.OldBindArtistUuid, 10, 64)
|
||||||
_, err = service.BundleProvider.AddBundleBalance(context.Background(), &bundle.AddBundleBalanceReq{
|
_, err = service.BundleProvider.AddBundleBalance(context.Background(), &bundle.AddBundleBalanceReq{
|
||||||
@ -121,6 +121,7 @@ func UpdateMediaAccount(ctx *gin.Context) {
|
|||||||
}
|
}
|
||||||
req.ArtistName = infoResp.Name
|
req.ArtistName = infoResp.Name
|
||||||
req.ArtistPhone = infoResp.TelNum
|
req.ArtistPhone = infoResp.TelNum
|
||||||
|
req.ArtistPhoneAreaCode = infoResp.TelAreaCode
|
||||||
if _, ok := cast.PlatformIDENUM_name[int32(req.PlatformID)]; !ok {
|
if _, ok := cast.PlatformIDENUM_name[int32(req.PlatformID)]; !ok {
|
||||||
service.Error(ctx, errors.New(e.GetMsg(e.InvalidParams)))
|
service.Error(ctx, errors.New(e.GetMsg(e.InvalidParams)))
|
||||||
return
|
return
|
||||||
|
@ -36,12 +36,14 @@ func UpdateWorkImage(ctx *gin.Context) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
infoResp = &accountFiee.UserInfoResponse{
|
infoResp = &accountFiee.UserInfoResponse{
|
||||||
Name: "小波",
|
Name: "小波",
|
||||||
TelNum: "18288888888",
|
TelNum: "18288888888",
|
||||||
|
TelAreaCode: "86",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req.ArtistName = infoResp.Name
|
req.ArtistName = infoResp.Name
|
||||||
req.ArtistPhone = infoResp.TelNum
|
req.ArtistPhone = infoResp.TelNum
|
||||||
|
req.ArtistPhoneAreaCode = infoResp.TelAreaCode
|
||||||
artistID, _ := strconv.ParseUint(req.ArtistUuid, 10, 64)
|
artistID, _ := strconv.ParseUint(req.ArtistUuid, 10, 64)
|
||||||
if err = CheckUserBundleBalance(int32(artistID), modelCast.BalanceTypeImageValue); err != nil {
|
if err = CheckUserBundleBalance(int32(artistID), modelCast.BalanceTypeImageValue); err != nil {
|
||||||
service.Error(ctx, err)
|
service.Error(ctx, err)
|
||||||
@ -77,8 +79,9 @@ func UpdateWorkVideo(ctx *gin.Context) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
infoResp = &accountFiee.UserInfoResponse{
|
infoResp = &accountFiee.UserInfoResponse{
|
||||||
Name: "小波",
|
Name: "小波",
|
||||||
TelNum: "18288888888",
|
TelNum: "18288888888",
|
||||||
|
TelAreaCode: "86",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
artistID, _ := strconv.ParseUint(req.ArtistUuid, 10, 64)
|
artistID, _ := strconv.ParseUint(req.ArtistUuid, 10, 64)
|
||||||
@ -88,6 +91,7 @@ func UpdateWorkVideo(ctx *gin.Context) {
|
|||||||
}
|
}
|
||||||
req.ArtistName = infoResp.Name
|
req.ArtistName = infoResp.Name
|
||||||
req.ArtistPhone = infoResp.TelNum
|
req.ArtistPhone = infoResp.TelNum
|
||||||
|
req.ArtistPhoneAreaCode = infoResp.TelAreaCode
|
||||||
newCtx := NewCtxWithUserInfo(ctx)
|
newCtx := NewCtxWithUserInfo(ctx)
|
||||||
resp, err := service.CastProvider.UpdateWorkVideo(newCtx, req)
|
resp, err := service.CastProvider.UpdateWorkVideo(newCtx, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -238,7 +242,7 @@ func UserBundleBalanceCost() {
|
|||||||
|
|
||||||
func RefreshWorkApprovalStatus(approvalIDWorkUuidMap map[int]string) (err error) {
|
func RefreshWorkApprovalStatus(approvalIDWorkUuidMap map[int]string) (err error) {
|
||||||
var castS = new(CastService)
|
var castS = new(CastService)
|
||||||
var data = make(map[int]int)
|
var data = make(map[int]modelCast.Item)
|
||||||
var approvalIDs []int
|
var approvalIDs []int
|
||||||
for approvalId, _ := range approvalIDWorkUuidMap {
|
for approvalId, _ := range approvalIDWorkUuidMap {
|
||||||
approvalIDs = append(approvalIDs, approvalId)
|
approvalIDs = append(approvalIDs, approvalId)
|
||||||
@ -249,19 +253,20 @@ func RefreshWorkApprovalStatus(approvalIDWorkUuidMap map[int]string) (err error)
|
|||||||
data, err = castS.ApprovalDetail(approvalIDs)
|
data, err = castS.ApprovalDetail(approvalIDs)
|
||||||
// status: 1待审批 2审批通过 3审批不通过 6撤销发其中 7撤销完成
|
// status: 1待审批 2审批通过 3审批不通过 6撤销发其中 7撤销完成
|
||||||
if len(data) > 0 {
|
if len(data) > 0 {
|
||||||
for approvalId, approvalStatus := range data {
|
for approvalId, v := range data {
|
||||||
var workAction cast.WorkActionENUM
|
var workAction cast.WorkActionENUM
|
||||||
if approvalStatus == 2 {
|
if v.Status == 2 {
|
||||||
workAction = cast.WorkActionENUM_APPROVAL_PASS
|
workAction = cast.WorkActionENUM_APPROVAL_PASS
|
||||||
} else if approvalStatus == 3 {
|
} else if v.Status == 3 {
|
||||||
workAction = cast.WorkActionENUM_APPROVAL_REJECT
|
workAction = cast.WorkActionENUM_APPROVAL_REJECT
|
||||||
} else {
|
} else {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
_, _ = service.CastProvider.UpdateStatus(context.Background(), &cast.UpdateStatusReq{
|
_, _ = service.CastProvider.UpdateStatus(context.Background(), &cast.UpdateStatusReq{
|
||||||
WorkAction: workAction,
|
WorkAction: workAction,
|
||||||
WorkUuid: approvalIDWorkUuidMap[approvalId],
|
WorkUuid: approvalIDWorkUuidMap[approvalId],
|
||||||
ApprovalID: fmt.Sprint(approvalId),
|
ApprovalID: fmt.Sprint(approvalId),
|
||||||
|
ApprovalReply: v.Reply,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user