Files
jx-callback/business/jxstore/event/event.go
苏尹岚 396e46636a table
2020-11-11 15:19:52 +08:00

337 lines
9.6 KiB
Go

package event
import (
"encoding/json"
"fmt"
"regexp"
"strings"
"time"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxstore/financial"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
)
var (
NoUseEventMap = map[string]string{
"CreateQrOrBarCode": "CreateQrOrBarCode",
"StatisticsReportForOrders": "StatisticsReportForOrders",
}
regexpToken = regexp.MustCompile(`,"token":".*"`)
)
func AddOperateEvent(ctx *jxcontext.Context, accessUUID, jsonData string, errCode, errMsg string, useTime int, apiFunctionSpec string) (err error) {
var (
apiFunction string
db = dao.GetDB()
)
// if ctx.GetRequest() == nil {
// return nil
// }
if apiFunctionSpec == "" {
url := ctx.GetRequest().URL.Path
if url != "" {
apiFunction = url[strings.LastIndex(url, "/")+1 : len(url)]
}
} else {
apiFunction = apiFunctionSpec
}
if apiFunction != "" {
if apiFunction[0:3] == "Get" || NoUseEventMap[apiFunction] != "" {
return err
}
}
if accessUUID != "" {
accessUUID = accessUUID[0:strings.Index(accessUUID, ",")]
}
jsonData = strings.ReplaceAll(jsonData, regexpToken.FindString(jsonData), "")
jsonData = utils.LimitUTF8StringLen(jsonData, 3200)
errMsg = utils.LimitUTF8StringLen(errMsg, 9999)
event := &model.OperateEvent{
CreatedAt: time.Now(),
LastOperator: ctx.GetUserName(),
APIFunction: apiFunction,
UserID: ctx.GetUserID(),
AccessUUID: accessUUID,
JsonData: jsonData,
ErrCode: errCode,
ErrMsg: errMsg,
UseTime: useTime,
}
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
err = dao.CreateEntity(db, event)
dao.Commit(db)
return err
}
func AddOperateEventDetail(db *dao.DaoDB, operateEventDetail *model.OperateEventDetail) (err error) {
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
operateEventDetail.BeforeData = utils.LimitUTF8StringLen(operateEventDetail.BeforeData, 3200)
operateEventDetail.AfterData = utils.LimitUTF8StringLen(operateEventDetail.AfterData, 3200)
err = dao.CreateEntity(db, operateEventDetail)
dao.Commit(db)
return err
}
func DeleteOperateEventAndDetail(ctx *jxcontext.Context, deleteTime time.Time) (err error) {
db := dao.GetDB()
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
dao.DeleteOperateEventDetail(db, deleteTime)
dao.DeleteOperateEvent(db, deleteTime)
dao.Commit(db)
return err
}
func GetOperateEvents(ctx *jxcontext.Context, name string, apiFunctions []string, operateTypes, skuIDs, storeIDs []int, fromTime, toTime, keyword string, errType, offset, pageSize int) (pageInfo *model.PagedInfo, err error) {
var (
fromTimeP time.Time
toTimeP time.Time
)
db := dao.GetDB()
if fromTime != "" {
fromTimeP = utils.Str2Time(fromTime)
}
if toTime != "" {
toTimeP = utils.Str2Time(toTime)
}
pageSize = jxutils.FormalizePageSize(pageSize)
offset = jxutils.FormalizePageOffset(offset)
operateEventExt, totalCount, err := dao.GetOperateEvents(db, name, apiFunctions, operateTypes, skuIDs, storeIDs, fromTimeP, toTimeP, keyword, errType, offset, pageSize)
if err != nil {
return pageInfo, err
}
pageInfo = &model.PagedInfo{
Data: operateEventExt,
TotalCount: totalCount,
}
return pageInfo, err
}
func CreateMessageGroup(ctx *jxcontext.Context, userID, userID2, groupName string, dividePercentage, quitPrice int) (messageGroupResult *dao.GetMessageGroupsResult, err error) {
var (
db = dao.GetDB()
groupID int
)
if userID2 != "" {
messageGroups, err := dao.GetMessageGroups(db, userID, model.GroupTypeSingle, true, userID2)
if len(messageGroups) > 0 && len(messageGroups[0].MessageGroupMembers) > 0 {
return messageGroups[0], err
}
user, err := dao.GetUserByID(db, "user_id", userID2)
if err != nil {
return nil, err
}
if user == nil {
return nil, fmt.Errorf("无法找到要联系的用户!")
}
for {
groupID = jxutils.GenRand6()
temp := &model.MessageGroup{
GroupID: groupID,
}
dao.GetEntity(db, temp, "GroupID")
if temp.UserID == "" {
break
}
}
messageGroup := &model.MessageGroup{
GroupID: groupID,
UserID: userID,
// Name: user.Name,
Type: model.GroupTypeSingle,
MaxCount: 2,
}
messageGroupMember := &model.MessageGroupMember{
GroupID: groupID,
MemberUserID: userID2,
Type: model.GroupMemberTypeNormal,
}
dao.WrapAddIDCULDEntity(messageGroup, ctx.GetUserName())
dao.WrapAddIDCULDEntity(messageGroupMember, ctx.GetUserName())
dao.CreateEntity(db, messageGroup)
dao.CreateEntity(db, messageGroupMember)
if data, err := json.Marshal(messageGroup); err == nil {
json.Unmarshal(data, &messageGroupResult)
messageGroupResult.Name = user.Name
messageGroupResult.MessageGroupMembers = append(messageGroupResult.MessageGroupMembers, messageGroupMember)
}
} else {
userMembers, err := dao.GetUserMember(db, userID, model.MemberTypeNormal)
if err != nil {
return nil, err
}
if len(userMembers) == 0 {
return nil, fmt.Errorf("抱歉,只有会员才能创建群聊!")
}
messageGroup := &model.MessageGroup{
GroupID: groupID,
UserID: userID,
Name: groupName,
Type: model.GroupTypeMulit,
MaxCount: 50,
DividePercentage: dividePercentage,
QuitPrice: quitPrice,
}
user, err := dao.GetUserByID(db, "user_id", userID)
if groupName == "" {
messageGroup.Name = user.Name + "的集团"
}
dao.WrapAddIDCULDEntity(messageGroup, ctx.GetUserName())
dao.CreateEntity(db, messageGroup)
messageGroupResult.MessageGroup = *messageGroup
}
return messageGroupResult, err
}
func GetMessageGroupByUser(ctx *jxcontext.Context, userID string) (messageGroupResult []*dao.GetMessageGroupsResult, err error) {
var (
db = dao.GetDB()
)
messageGroups, err := dao.GetMessageGroups(db, userID, 0, false, "")
for _, v := range messageGroups {
var messageMemberGroups []*model.MessageGroupMember
sql := `
SELECT * FROM message_group_member WHERE group_id = ?
`
sqlParams := []interface{}{v.GroupID}
if err = dao.GetRows(db, &messageMemberGroups, sql, sqlParams); err == nil {
if v.Type == model.GroupTypeSingle {
user, err := dao.GetUserByID(db, "user_id", messageMemberGroups[0].MemberUserID)
if err == nil {
v.Name = user.Name
}
}
}
}
return messageGroups, err
}
func AddMessageGroup(ctx *jxcontext.Context, groupID int, userID string) (err error) {
var (
db = dao.GetDB()
)
messageGroupMembers, err := dao.GetMessageGroupMembers(db, groupID, userID)
if err != nil {
return err
}
if len(messageGroupMembers) > 0 {
return fmt.Errorf("此用户已经在该群组中了,请不要重复邀请!")
}
messageGroupMember := &model.MessageGroupMember{
GroupID: groupID,
MemberUserID: userID,
Type: model.GroupMemberTypeNormal,
}
dao.WrapAddIDCULDEntity(messageGroupMember, ctx.GetUserName())
dao.CreateEntity(db, messageGroupMember)
return err
}
func UpdateMessageGroup(ctx *jxcontext.Context, groupID int, payload map[string]interface{}) (num int64, err error) {
var (
db = dao.GetDB()
messageGroup = &model.MessageGroup{
GroupID: groupID,
}
)
if err = dao.GetEntity(db, messageGroup, "GroupID"); err != nil {
return 0, err
}
valid := dao.StrictMakeMapByStructObject(payload, messageGroup, ctx.GetUserName())
if len(valid) > 0 {
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
if num, err = dao.UpdateEntityLogically(db, messageGroup, valid, ctx.GetUserName(), nil); err != nil {
dao.Rollback(db)
return 0, err
}
dao.Commit(db)
}
return num, err
}
func DeleteMessageGroup(ctx *jxcontext.Context, groupID int, userID string) (errCode string, err error) {
var (
db = dao.GetDB()
messageGroup = &model.MessageGroup{
GroupID: groupID,
}
)
if err = dao.GetEntity(db, messageGroup, "GroupID"); err != nil {
return errCode, err
}
//token中用户与传入user不一致就判定为踢人
if ctx.GetUserID() != userID {
if messageGroup.UserID != ctx.GetUserID() {
messageGroupMembers, err := dao.GetMessageGroupMembers(db, groupID, ctx.GetUserID())
if err != nil {
return errCode, err
}
if messageGroupMembers[0].Type == model.GroupMemberTypeNormal {
return errCode, fmt.Errorf("只有创建者和管理员才能踢人!")
}
}
messageGroupMembers, err := dao.GetMessageGroupMembers(db, groupID, userID)
if err != nil {
return errCode, err
}
messageGroupMembers[0].DeletedAt = time.Now()
messageGroupMembers[0].LastOperator = ctx.GetUserName()
dao.UpdateEntity(db, messageGroupMembers[0], "DeletedAt", "LastOperator")
} else {
quitPrice := messageGroup.QuitPrice
userBill, err := dao.GetUserBill(db, userID, "")
if err != nil {
return errCode, err
}
if userBill.AccountBalance < quitPrice {
return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("用户余额不足,请充值!")
}
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
//账户支出明细
//1、账户支出增加一条记录
if err = financial.AddBillExpend(db, userBill.BillID, model.BillTypeQuitGroup, quitPrice); err != nil {
dao.Rollback(db)
}
//2、账户表余额减少相应值
userBill.AccountBalance -= quitPrice
if _, err = dao.UpdateEntity(db, userBill, "AccountBalance"); err != nil {
dao.Rollback(db)
}
dao.Commit(db)
}
return errCode, err
}