diff --git a/go.mod b/go.mod index 770f140..251efd0 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.16 require ( git.oa00.com/go/alipay v1.0.0 git.oa00.com/go/mysql v1.0.0 - git.oa00.com/go/wxpay v1.0.0 github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.0 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 github.com/alibabacloud-go/opensearch-util v1.0.1 diff --git a/go.sum b/go.sum index 814387b..cfc676a 100644 --- a/go.sum +++ b/go.sum @@ -6,10 +6,6 @@ git.oa00.com/go/alipay v1.0.0 h1:/qVT7lKc1FbVnCzpXwsHOZODamsiZzhhCFxjgez1+2o= git.oa00.com/go/alipay v1.0.0/go.mod h1:GCFXgnZofi69vtV8fMOsHGWZqp958lyXlKfCwvhVBL8= git.oa00.com/go/mysql v1.0.0 h1:E9H6MF0eYgFovLmVYgyCiwjIestp/wRPWjwKyayg3LI= git.oa00.com/go/mysql v1.0.0/go.mod h1:pQm9xCn8iFew9egnEPvzAlggGykmAlwV1nqTX5KIXiQ= -git.oa00.com/go/rsa v1.0.0 h1:cscSyfYeNxqUjEt/rUiPjPlqeZW/pdLDqVTrS64llJM= -git.oa00.com/go/rsa v1.0.0/go.mod h1:y4272MGmgvdEGcXIcPRBwteDo/zeqTEtRpqJBpK1Luk= -git.oa00.com/go/wxpay v1.0.0 h1:A/XT7/8fYs1hPujItAh/B2/ymRLkMAh4jzKUIzWQasQ= -git.oa00.com/go/wxpay v1.0.0/go.mod h1:RyvSqgH+If78a7QLe+7r+D3R5F+E/WyNRsCVWQ6hmGM= github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.0 h1:tDWYNCJrpNnlNg8mVdlzAzPjlPaRbsA/kS8H9LczleQ= github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.0/go.mod h1:Uwb0d1GgxJieUWZG5WylTrgQ2SrldfjagAxheU8W6MQ= github.com/Azure/azure-sdk-for-go v32.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= @@ -43,8 +39,6 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/agiledragon/gomonkey v2.0.2+incompatible h1:eXKi9/piiC3cjJD1658mEE2o3NjkJ5vDLgYjCQu0Xlw= -github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw= github.com/akamai/AkamaiOPEN-edgegrid-golang v0.9.0/go.mod h1:zpDJeKyp9ScW4NNrbdr+Eyxvry3ilGPewKoXw3XGN1k= github.com/alangpierce/go-forceexport v0.0.0-20160317203124-8f1d6941cd75/go.mod h1:uAXEEpARkRhCZfEvy/y0Jcc888f9tHCc1W7/UeEtreE= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= @@ -589,8 +583,6 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/vultr/govultr v0.1.4/go.mod h1:9H008Uxr/C4vFNGLqKx232C206GL0PBHzOP0809bGNA= -github.com/wechatpay-apiv3/wechatpay-go v0.2.11 h1:KEVmn6VxFeoCdnTno4yLOWMmdG/wS7KWURzeuVXH6RU= -github.com/wechatpay-apiv3/wechatpay-go v0.2.11/go.mod h1:W8ucVAOCKOii933cWROLaDLmRQ2cg/vHHVF4vGAVq9Q= github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= diff --git a/internal/v2/controller/manage/setting/invite.go b/internal/v2/controller/manage/setting/invite.go new file mode 100644 index 0000000..c918a15 --- /dev/null +++ b/internal/v2/controller/manage/setting/invite.go @@ -0,0 +1,70 @@ +package setting + +import ( + "github.com/gin-gonic/gin" + "recook/internal/libs/bean" + "recook/internal/v2/lib/back" + "recook/internal/v2/logic/manage/setting" + "recook/tools" +) + +type Invite struct { +} +type PageItem struct { +} + +// Lists 返回邀请码 +func (*Invite) Lists(c *gin.Context) { + args := bean.Page{} + err := tools.Params(&args, c) + if err != nil { + back.Fail(c, err.Error()) + return + } + lists, total := setting.InviteLogic.Lists(args) + back.Suc(c, "操作成功", bean.ResultLists{ + List: lists, + Total: int(total), + }) +} + +type arsgInviteCreateInvite struct { + NowTime string +} + +// Gen 创建邀请码 +func (*Invite) Gen(c *gin.Context) { + args := arsgInviteCreateInvite{} + err := tools.Params(&args, c) + if err != nil { + back.Fail(c, err.Error()) + return + } + if err := setting.InviteLogic.Gen(args.NowTime); err != nil { + back.Fail(c, err.Error()) + return + } + back.Suc(c, "操作成功", nil) +} + +type arsgInviteCancellation struct { + InviteId int64 +} + +func (*Invite) Cancellation(c *gin.Context) { + args := arsgInviteCancellation{} + err := tools.Params(&args, c) + if err != nil { + back.Fail(c, err.Error()) + return + } + if args.InviteId == 0 { + back.Fail(c, "参数错误") + return + } + if err := setting.InviteLogic.Cancellation(args.InviteId); err != nil { + back.Fail(c, err.Error()) + return + } + back.Suc(c, "操作成功", nil) +} diff --git a/internal/v2/controller/wxapp/company/company.go b/internal/v2/controller/wxapp/company/company.go new file mode 100644 index 0000000..509f078 --- /dev/null +++ b/internal/v2/controller/wxapp/company/company.go @@ -0,0 +1,25 @@ +package company + +import ( + "github.com/gin-gonic/gin" + "recook/internal/back" + "recook/internal/v2/logic/wxapp/company" + "recook/tools" +) + +type Company struct { +} + +// Add @Title 添加合伙人 +func (*Company) Add(c *gin.Context) { + var args company.CompanyInfo + if err := tools.Params(&args, c); err != nil { + back.Fail(c, err.Error()) + return + } + if err := company.CompanyLogic.Add(args); err != nil { + back.Fail(c, err.Error()) + } else { + back.Suc(c, "ok", "") + } +} diff --git a/internal/v2/logic/command/command.go b/internal/v2/logic/command/command.go index f0a6bee..2c8d752 100644 --- a/internal/v2/logic/command/command.go +++ b/internal/v2/logic/command/command.go @@ -1,8 +1,10 @@ package command import ( + "math/rand" command2 "recook/internal/v2/model/recook/command" "recook/tools" + "time" ) var CommandLogic = &commandLogic{} @@ -10,6 +12,18 @@ var CommandLogic = &commandLogic{} type commandLogic struct { } +// Random @Title 生成随机数 +func (*commandLogic) Random(length int) string { + var strByte = []byte("QWERTYUIOPLKJHGFDSAZXCVBNMqweasdzxcrtyfghvbnuiojklmop123456789") + strByteLen := len(strByte) + result := "" + r := rand.New(rand.NewSource(time.Now().UnixNano())) + for i := 0; i < length; i++ { + result += string(strByte[r.Intn(strByteLen)]) + } + return result +} + // @Style 生成瑞口令 func (*commandLogic) Generate(value string) string { command := tools.RandStr(12) diff --git a/internal/v2/logic/manage/setting/invite.go b/internal/v2/logic/manage/setting/invite.go new file mode 100644 index 0000000..9b444e0 --- /dev/null +++ b/internal/v2/logic/manage/setting/invite.go @@ -0,0 +1,70 @@ +package setting + +import ( + "errors" + "git.oa00.com/go/mysql" + "recook/internal/libs/bean" + "recook/internal/model/user" + "recook/internal/v2/logic/command" + "time" +) + +var InviteLogic = &inviteLogic{} + +type inviteLogic struct { +} +type inviteItem struct { + Id int64 `json:"id"` + Code string `json:"code"` + CreateTime int64 `json:"create_time"` + EndTime int64 `json:"end_time"` +} + +// Lists @Title 返回邀请码列表 +func (i *inviteLogic) Lists(page bean.Page) (lists []inviteItem, total int64) { + lists = []inviteItem{} + var inviteCodes []user.InviteCode + mysql.Db.Model(&inviteCodes).Count(&total) + if page.HasPage(total) { + mysql.Db.Offset(page.GetStart()).Limit(page.Limit).Find(&inviteCodes) + for _, inviteCode := range inviteCodes { + lists = append(lists, inviteItem{ + Id: inviteCode.ID, + Code: inviteCode.InviterCode, + CreateTime: inviteCode.CreatedAt.Unix(), + EndTime: inviteCode.ExpiredAt.Unix(), + }) + } + } + return +} + +// Gen @Title 创建生成码 +func (i *inviteLogic) Gen(nowTime string) error { + random := command.CommandLogic.Random(6) + location, err := time.ParseInLocation("2006-01-02 15:04:05", nowTime, time.Local) + if err != nil { + return errors.New("时间格式错误") + } + inviete := user.InviteCode{ + InviterCode: random, + CreatedAt: time.Now(), + ExpiredAt: location, + } + if mysql.Db.Create(&inviete).Error != nil { + return errors.New("生成失败") + } + return nil +} + +// Cancellation @Title 作废邀请码 +func (i *inviteLogic) Cancellation(inviteId int64) error { + inviete := user.InviteCode{} + if mysql.Db.Where("id = ?", inviteId).First(&inviete).Error != nil { + return errors.New("邀请码不存在") + } + if mysql.Db.Model(&inviete).Update("end_time", time.Now()).Error != nil { + return errors.New("作废失败") + } + return nil +} diff --git a/internal/v2/logic/wxapp/company/company.go b/internal/v2/logic/wxapp/company/company.go new file mode 100644 index 0000000..d4fef38 --- /dev/null +++ b/internal/v2/logic/wxapp/company/company.go @@ -0,0 +1,66 @@ +package company + +import ( + "errors" + "fmt" + "git.oa00.com/go/mysql" + "github.com/golangkit/formatime" + "github.com/shopspring/decimal" + "gorm.io/gorm" + "recook/internal/v2/model/company" + "recook/internal/v2/model/recook/user" +) + +var CompanyLogic = &companyLogic{} + +type companyLogic struct { +} +type CompanyInfo struct { + PcType uint //个人或者企业 0 == 个人 1 == 企业 + Phone string `binding:"required,len=11,startswith=1" label:"手机号"` //手机号 + NikeName string `binding:"required" label:"昵称"` //昵称 + BusinessLicense string `binding:"required" label:"印业执照"` //营业执照 + CorporationName string `binding:"required" label:"企业名"` //企业名 + TaxBillType string `binding:"required" label:"纳税类型"` //纳税类型 + Taxpayer string `binding:"required" label:"纳税识别号"` //纳税识别号 + OpeningBank string `binding:"required" label:"开户行"` //开户行 + BankAccount string `binding:"required" label:"银行账户"` //银行账户 + MakeTax decimal.Decimal `binding:"required" label:"开票税率"` //开票税率 + Linkman string `binding:"required" label:"联系人"` //联系人 + PEmail string `binding:"required" label:"联系人手机号或者邮箱"` //联系人手机号或者邮箱 +} + +// Add @Title 添加合伙人 +func (c *companyLogic) Add(data CompanyInfo) error { + userInfoModel := user.RecookUserInfoModel{Mobile: data.Phone} + mysql.Db.Where(&userInfoModel).First(&userInfoModel) + if userInfoModel.Id > 0 { + return fmt.Errorf("手机已存在") + } + userInfo := user.RecookUserInfoModel{Nickname: data.NikeName} + mysql.Db.Where(&userInfo).First(&userInfoModel) + if userInfo.Id > 0 { + return fmt.Errorf("昵称已存在") + } + companyInfo := company.Info{ + ShopName: data.NikeName, + Mobile: data.Phone, + BusinessPhoto: data.BusinessLicense, + TaxBank: data.OpeningBank, + TaxAccount: data.BankAccount, + Tax: data.MakeTax, + TaxType: data.TaxBillType, + ContractEmail: data.PEmail, + TaxNumber: data.Taxpayer, + ContractName: data.Linkman, + CompanyName: data.CorporationName, + State: company.Wait, + CreatedAt: formatime.NewSecondNow(), + } + return mysql.Db.Transaction(func(tx *gorm.DB) error { + if tx.Create(&companyInfo).Error != nil { + return errors.New("提交失败") + } + return nil + }) +} diff --git a/internal/v2/model/inviteCode.go b/internal/v2/model/inviteCode.go new file mode 100644 index 0000000..e176e71 --- /dev/null +++ b/internal/v2/model/inviteCode.go @@ -0,0 +1,16 @@ +package user + +import "time" + +// 邀请人的历史记录 +type InviteCode struct { + ID int64 `gorm:"column:id" json:"id"` + InviterUserID uint `gorm:"inviter_user_id" json:"inviterUserId"` + InviterCode string `gorm:"column:inviter_code" json:"userId"` + ExpiredAt time.Time `gorm:"column:expired_at" json:"expiredAt"` + CreatedAt time.Time `gorm:"column:created_at" json:"createdAt"` +} + +func (r *InviteCode) TableName() string { + return "recook_invite_code" +} diff --git a/internal/v2/router/manage.go b/internal/v2/router/manage.go index d9a6290..b204efd 100644 --- a/internal/v2/router/manage.go +++ b/internal/v2/router/manage.go @@ -21,6 +21,7 @@ import ( "recook/internal/v2/controller/manage/message" operationController2 "recook/internal/v2/controller/manage/operationController" "recook/internal/v2/controller/manage/order" + "recook/internal/v2/controller/manage/setting" "recook/internal/v2/controller/manage/special_sale" "recook/internal/v2/controller/manage/upgrade" "recook/internal/v2/controller/manage/user" @@ -500,6 +501,16 @@ func routerManage(manageRouter *gin.RouterGroup) { operationRouter.POST("ce_se/rate", operationController.CeSeRate) //测试 } + // 配置 + settingRouter := manageRouter.Group("setting", authorize) + { + inviteController := setting.Invite{} + { + settingRouter.POST("invite/list", inviteController.Lists) // 获取邀请码 + settingRouter.POST("invite/gen", inviteController.Gen) // 生成邀请码 + settingRouter.POST("invite/Cancellation", inviteController.Cancellation) // 作废邀请码 + } + } //活动位模块 { activeBitRouter := manageRouter.Group("active_bit", authorize) @@ -782,7 +793,7 @@ func routerManage(manageRouter *gin.RouterGroup) { companyRouter.POST("all", proxy.All) companyRouter.POST("sure", proxy.Sure) companyRouter.POST("reject", proxy.Reject) - companyRouter.POST("apply", proxy.Apply) + companyRouter.POST("apply", proxy.Apply) // 创建合伙人 } } } diff --git a/internal/v2/router/router.go b/internal/v2/router/router.go index 0b68a83..da4c9cd 100644 --- a/internal/v2/router/router.go +++ b/internal/v2/router/router.go @@ -16,4 +16,6 @@ func Router(router *gin.RouterGroup) { // app端路由 routerApp(router.Group("app")) + // app端路由 + routerWxapp(router.Group("wxapp")) } diff --git a/internal/v2/router/wxapp.go b/internal/v2/router/wxapp.go new file mode 100644 index 0000000..622adeb --- /dev/null +++ b/internal/v2/router/wxapp.go @@ -0,0 +1,20 @@ +package router + +import ( + "github.com/gin-gonic/gin" + "recook/internal/v2/controller/wxapp/company" + "recook/internal/v2/router/middleware" +) + +// @Style recook总后台 +func routerWxapp(wxappRouter *gin.RouterGroup) { + authorize := middleware.AppAuthorize() + + companyRouter := wxappRouter.Group("company", authorize) + { + companyController := company.Company{} + { + companyRouter.POST("add", companyController.Add) //wxapp添加合伙人 + } + } +}