diff --git a/app/agent/hdl/hdl_store.go b/app/agent/hdl/hdl_store.go index 21e4f9b..5948284 100644 --- a/app/agent/hdl/hdl_store.go +++ b/app/agent/hdl/hdl_store.go @@ -1,6 +1,7 @@ package hdl import ( + agentSvc "applet/app/agent/svc" "applet/app/db" "applet/app/db/model" "applet/app/e" @@ -298,3 +299,19 @@ func UserStoreTotal(c *gin.Context) { e.OutSuc(c, res, nil) return } + +func StoreWithdrawFlow(c *gin.Context) { + agentSvc.StoreWithdrawFlow(c) +} +func StoreWithdrawTotal(c *gin.Context) { + agentSvc.StoreWithdrawTotal(c) +} +func StoreWithdrawAudit(c *gin.Context) { + agentSvc.StoreWithdrawAudit(c) +} +func StoreWithdrawAuditAll(c *gin.Context) { + agentSvc.StoreWithdrawAuditAll(c) +} +func StoreWithdrawOutPut(c *gin.Context) { + agentSvc.StoreWithdrawOutPut(c) +} diff --git a/app/agent/svc/svc_store.go b/app/agent/svc/svc_store.go index b3463c0..2748a65 100644 --- a/app/agent/svc/svc_store.go +++ b/app/agent/svc/svc_store.go @@ -1 +1,160 @@ package svc + +import ( + "applet/app/db" + "applet/app/db/model" + "applet/app/e" + "applet/app/svc" + "applet/app/utils" + "github.com/gin-gonic/gin" + "strings" +) + +func StoreWithdrawFlow(c *gin.Context) { + var req map[string]string + if err := c.ShouldBindJSON(&req); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + user := svc.GetUser(c) + req["agent_uid"] = utils.IntToStr(user.Info.Uid) + withdraw, total := db.GetStoreWithdraw(svc.MasterDb(c), req) + list := make([]map[string]string, 0) + if withdraw != nil { + var stateList = []string{"审核中", "审核通过", "审核通过", "审核拒绝"} + for _, v := range *withdraw { + name := "" + store := db.GetStoreIdEg(svc.MasterDb(c), utils.IntToStr(v.Uid)) + if store != nil { + name = store.Name + } + tmp := map[string]string{ + "id": utils.Int64ToStr(v.Id), + "name": name, + "amount": v.Amount, + "alipay_account": v.WithdrawAccount, + "alipay_name": v.WithdrawName, + "state_str": stateList[v.State], + "state": utils.IntToStr(v.State), + "time": v.CreateAt.Format("2006-01-02 15:04:05"), + "end_time": "", + "memo": v.Memo, + } + if v.PaymentDate != "" { + tmp["end_time"] = v.PaymentDate + } + list = append(list, tmp) + } + } + res := map[string]interface{}{ + "total": total, + "list": list, + "state": []map[string]string{ + {"name": "审核中", "value": "0"}, + {"name": "审核通过", "value": "1"}, + {"name": "审核拒绝", "value": "3"}, + }, + } + e.OutSuc(c, res, nil) + return +} +func StoreWithdrawTotal(c *gin.Context) { + var req map[string]string + if err := c.ShouldBindJSON(&req); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + user := svc.GetUser(c) + var allAmount float64 = 0 + var waitAmount float64 = 0 + var failAmount float64 = 0 + allAmount, _ = svc.MasterDb(c).Where("parent_uid=?", user.Info.Uid).And("state=?", 1).Sum(&model.CommunityTeamStoreWithdrawApply{}, "amount") + waitAmount, _ = svc.MasterDb(c).Where("parent_uid=?", user.Info.Uid).And("state=?", 0).Sum(&model.CommunityTeamStoreWithdrawApply{}, "amount") + failAmount, _ = svc.MasterDb(c).Where("parent_uid=?", user.Info.Uid).And("state=?", 3).Sum(&model.CommunityTeamStoreWithdrawApply{}, "amount") + res := []map[string]string{ + {"name": "累计提现金额(元):" + utils.Float64ToStr(allAmount), "tip": "统计提现成功的金额"}, + {"name": "审核中金额(元):" + utils.Float64ToStr(waitAmount), "tip": "统计正在审核中的金额"}, + {"name": "审核拒绝金额(元):" + utils.Float64ToStr(failAmount), "tip": "统计审核拒绝的金额"}, + } + e.OutSuc(c, res, nil) + return +} +func StoreWithdrawAudit(c *gin.Context) { + var req map[string]string + if err := c.ShouldBindJSON(&req); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + sess := svc.MasterDb(c).NewSession() + defer sess.Close() + sess.Begin() + data := db.GetStoreWithdrawById(sess, req["id"]) + if data == nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "记录不存在")) + return + } + if data.State > 0 { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "记录已处理")) + return + } + if req["state"] == "3" { + bools := svc.MoneyCheck(c, sess, data.Uid, 0, 3, utils.StrToFloat64(data.Amount), "提现审核拒绝退回", utils.StrToInt64(utils.OrderUUID(data.Uid))) + if bools == false { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "审核失败")) + return + } + } + data.State = utils.StrToInt(req["state"]) + data.Memo = req["memo"] + update, err := sess.Where("id=?", data.Id).Cols("state,memo").Update(data) + if update == 0 || err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "审核失败")) + return + } + sess.Commit() + e.OutSuc(c, "success", nil) + return +} +func StoreWithdrawAuditAll(c *gin.Context) { + var req map[string]string + if err := c.ShouldBindJSON(&req); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + count, _ := svc.MasterDb(c).In("id", strings.Split(req["ids"], ",")).And("state>0").Count(&model.CommunityTeamStoreWithdrawApply{}) + if count > 0 { + e.OutErr(c, 400, e.NewErr(400, "存在已处理的记录")) + return + } + svc.MasterDb(c).In("id", strings.Split(req["ids"], ",")).Cols("state").Update(&model.CommunityTeamStoreWithdrawApply{State: 1}) + e.OutSuc(c, "success", nil) + return +} +func StoreWithdrawOutPut(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, 200, e.ERR_INVALID_ARGS) + return + } + name := "提现记录_" + args["p"] + args["state"] = "0" + args["size"] = "3000" + if args["ids"] != "" { + args["size"] = "0" + } + user := svc.GetUser(c) + args["parent_uid"] = utils.IntToStr(user.Info.Uid) + data, _ := db.GetStoreWithdraw(svc.MasterDb(c), args) + file := utils.OutputSecond(c, name, data) + filename := name + ".xls" + r := map[string]string{ + "file": file, + "filename": filename, + } + e.OutSuc(c, r, nil) + return +} diff --git a/app/db/db_goods.go b/app/db/db_goods.go index 04b450f..b161c69 100644 --- a/app/db/db_goods.go +++ b/app/db/db_goods.go @@ -8,10 +8,13 @@ import ( func GetGoods(eg *xorm.Engine, arg map[string]string) *[]model.CommunityTeamGoods { var data []model.CommunityTeamGoods - sess := eg.Where("store_type=0 and state=0") + sess := eg.Where("store_type=? and state=0", arg["store_type"]) if arg["cid"] != "" { sess.And("cid=?", arg["cid"]) } + if arg["uid"] != "" { + sess.And("uid=?", arg["uid"]) + } if arg["title"] != "" { sess.And("title like ?", "%"+arg["title"]+"%") } diff --git a/app/db/db_store.go b/app/db/db_store.go index 22eb2c1..41f84aa 100644 --- a/app/db/db_store.go +++ b/app/db/db_store.go @@ -26,7 +26,7 @@ func GetStore(eg *xorm.Engine, arg map[string]string) []map[string]string { if arg["parent_uid"] != "" { where += " and store_type=2 and parent_uid=" + arg["parent_uid"] } else if arg["uid"] != "" { - where += " and store_type=1 and uid=" + arg["parent_uid"] + where += " and store_type=1 and uid=" + arg["uid"] } else { if arg["store_type"] == "3" { where += " and store_type in(1,2)" @@ -34,6 +34,9 @@ func GetStore(eg *xorm.Engine, arg map[string]string) []map[string]string { where += " and store_type=" + arg["store_type"] } } + if arg["store_id"] != "" { + where += " and uid = '" + arg["store_id"] + "'" + } if arg["city"] != "" { where += " and city like '%" + arg["city"] + "%'" } @@ -81,6 +84,9 @@ where %s %s` where += " and cts.store_type=" + arg["store_type"] } } + if arg["store_id"] != "" { + where += " and cts.uid = '" + arg["store_id"] + "'" + } if arg["city"] != "" { where += " and cts.city='" + arg["city"] + "'" } diff --git a/app/db/db_store_amount.go b/app/db/db_store_amount.go new file mode 100644 index 0000000..8353b69 --- /dev/null +++ b/app/db/db_store_amount.go @@ -0,0 +1,53 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/utils" + "xorm.io/xorm" +) + +func GetStoreAmount(sess *xorm.Session, storeId int, agentUid int) *model.CommunityTeamStoreAmount { + var data model.CommunityTeamStoreAmount + get, err := sess.Where("uid=? and parent_uid=?", storeId, agentUid).Get(&data) + if get == false || err != nil { + return nil + } + return &data +} +func GetStoreAmountEg(eg *xorm.Engine, storeId int, agentUid int) *model.CommunityTeamStoreAmount { + var data model.CommunityTeamStoreAmount + get, err := eg.Where("uid=? and parent_uid=?", storeId, agentUid).Get(&data) + if get == false || err != nil { + return nil + } + return &data +} +func GetStoreAmountFlowList(eg *xorm.Engine, arg map[string]string) (*[]model.CommunityTeamStoreAmountFlow, int64) { + var data []model.CommunityTeamStoreAmountFlow + sess := eg.Where("1=1") + if arg["store_uid"] != "" { + sess.And("uid=?", arg["store_uid"]) + } + if arg["parent_uid"] != "" { + sess.And("parent_uid=?", arg["parent_uid"]) + } + if arg["title"] != "" { + sess.And("title like ?", "%"+arg["title"]+"%") + } + if arg["oid"] != "" { + sess.And("oid like ?", "%"+arg["oid"]+"%") + } + if arg["start_time"] != "" { + sess.And("create_at>=?", arg["start_time"]) + } + if arg["end_time"] != "" { + sess.And("create_at<=?", arg["end_time"]) + } + limit := utils.StrToInt(arg["size"]) + start := (utils.StrToInt(arg["p"]) - 1) * limit + count, err := sess.Desc("id").Limit(limit, start).FindAndCount(&data) + if err != nil { + return nil, count + } + return &data, count +} diff --git a/app/db/db_store_withdraw.go b/app/db/db_store_withdraw.go new file mode 100644 index 0000000..dd9707c --- /dev/null +++ b/app/db/db_store_withdraw.go @@ -0,0 +1,71 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/utils" + "strings" + "xorm.io/xorm" +) + +func GetStoreWithdraw(eg *xorm.Engine, arg map[string]string) (*[]model.CommunityTeamStoreWithdrawApply, int64) { + var data []model.CommunityTeamStoreWithdrawApply + sess := eg.Where("1=1") + if arg["store_uid"] != "" { + sess.And("uid=?", arg["store_uid"]) + } + if arg["parent_uid"] != "" { + sess.And("parent_uid=?", arg["parent_uid"]) + } + if arg["state"] != "" { + sess.And("state=?", arg["state"]) + } + if arg["ids"] != "" { + sess.In("id", strings.Split(arg["ids"], ",")) + } + if arg["alipay_account"] != "" { + sess.And("withdraw_account like ?", "%"+arg["alipay_account"]+"%") + } + if arg["alipay_name"] != "" { + sess.And("withdraw_name like ?", "%"+arg["alipay_name"]+"%") + } + if arg["store_name"] != "" { + var data1 []model.CommunityTeamStore + eg.Where("name like ?", "%"+arg["store_name"]+"%").Find(&data1) + uid := []int{-1} + for _, v := range data1 { + uid = append(uid, v.Uid) + } + sess.In("uid", uid) + } + if arg["start_time"] != "" { + sess.And("create_at>=?", arg["start_time"]) + } + if arg["end_time"] != "" { + sess.And("create_at<=?", arg["end_time"]) + } + if arg["payment_start_time"] != "" { + sess.And("payment_date>=?", arg["payment_start_time"]) + } + if arg["payment_end_time"] != "" { + sess.And("payment_date<=?", arg["payment_end_time"]) + } + limit := utils.StrToInt(arg["size"]) + start := (utils.StrToInt(arg["p"]) - 1) * limit + if limit > 0 { + sess.Limit(limit, start) + } + count, err := sess.Desc("id").FindAndCount(&data) + if err != nil { + return nil, count + } + return &data, count +} + +func GetStoreWithdrawById(sess *xorm.Session, id string) *model.CommunityTeamStoreWithdrawApply { + var data model.CommunityTeamStoreWithdrawApply + get, err := sess.Where("id=?", id).Get(&data) + if get == false || err != nil { + return nil + } + return &data +} diff --git a/app/db/model/community_team_store_amount.go b/app/db/model/community_team_store_amount.go new file mode 100644 index 0000000..c8af54a --- /dev/null +++ b/app/db/model/community_team_store_amount.go @@ -0,0 +1,9 @@ +package model + +type CommunityTeamStoreAmount struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uid int `json:"uid" xorm:"default 0 INT(11)"` + StoreType int `json:"store_type" xorm:"default 0 comment('0官方自营店 1加盟店 2连锁店') INT(11)"` + ParentUid int `json:"parent_uid" xorm:"default 0 comment('上级代理') INT(11)"` + Amount string `json:"amount" xorm:"default 0.00 DECIMAL(20,2)"` +} diff --git a/app/db/model/community_team_store_amount_flow.go b/app/db/model/community_team_store_amount_flow.go new file mode 100644 index 0000000..7b09b80 --- /dev/null +++ b/app/db/model/community_team_store_amount_flow.go @@ -0,0 +1,20 @@ +package model + +import ( + "time" +) + +type CommunityTeamStoreAmountFlow struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uid int `json:"uid" xorm:"default 0 INT(11)"` + StoreType int `json:"store_type" xorm:"default 0 comment('0官方自营店 1加盟店 2连锁店') INT(11)"` + ParentUid int `json:"parent_uid" xorm:"default 0 comment('上级代理') INT(11)"` + Amount string `json:"amount" xorm:"default 0.00 DECIMAL(20,2)"` + BeforeAmount string `json:"before_amount" xorm:"default 0.00 DECIMAL(20,2)"` + AfterAmount string `json:"after_amount" xorm:"default 0.00 DECIMAL(20,2)"` + Oid int64 `json:"oid" xorm:"default 0 BIGINT(20)"` + Type int `json:"type" xorm:"default 0 INT(1)"` + Title string `json:"title" xorm:"VARCHAR(255)"` + OrdType int `json:"ord_type" xorm:"default 0 INT(11)"` + CreateAt time.Time `json:"create_at" xorm:"DATETIME"` +} diff --git a/app/db/model/community_team_store_withdraw_apply.go b/app/db/model/community_team_store_withdraw_apply.go new file mode 100644 index 0000000..023afb4 --- /dev/null +++ b/app/db/model/community_team_store_withdraw_apply.go @@ -0,0 +1,23 @@ +package model + +import ( + "time" +) + +type CommunityTeamStoreWithdrawApply struct { + Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"` + Uid int `json:"uid" xorm:"not null default 0 comment('用户ID') index INT(10)"` + Amount string `json:"amount" xorm:"not null default 0.00 comment('提现金额') DECIMAL(10,2)"` + Memo string `json:"memo" xorm:"not null default '' comment('备注,失败请备注原因') VARCHAR(500)"` + Type int `json:"type" xorm:"not null default 1 comment('提现类型;1:手动;2:自动') TINYINT(1)"` + ParentUid int `json:"parent_uid" xorm:"not null default 1 comment('提现类型;1:手动;2:自动') TINYINT(1)"` + WithdrawAccount string `json:"withdraw_account" xorm:"not null default '' comment('提现账号') VARCHAR(64)"` + WithdrawName string `json:"withdraw_name" xorm:"not null default '' comment('提现人姓名') VARCHAR(12)"` + Reason int `json:"reason" xorm:"not null default 0 comment('审核失败(驳回理由);1:当前账号不满足提现规则;2:账号异常;3:资金异常') TINYINT(1)"` + PaymentDate string `json:"payment_date" xorm:"not null default '0000-00-00 00:00:00' comment('到账时间') VARCHAR(50)"` + CreateAt time.Time `json:"create_at" xorm:"not null default CURRENT_TIMESTAMP comment('申请时间') index TIMESTAMP"` + UpdateAt time.Time `json:"update_at" xorm:"not null default CURRENT_TIMESTAMP comment('处理时间') TIMESTAMP"` + State int `json:"state" xorm:"not null default 0 comment('0申请中,1通过,2完成,3失败') TINYINT(1)"` + Oid int64 `json:"oid" xorm:"not null default 0 comment('0申请中,1通过,2完成,3失败') TINYINT(1)"` + Platform string `json:"platform" xorm:"VARCHAR(255)"` +} diff --git a/app/db/model/county.go b/app/db/model/county.go new file mode 100644 index 0000000..9b915e9 --- /dev/null +++ b/app/db/model/county.go @@ -0,0 +1,7 @@ +package model + +type County struct { + Name string `json:"name" xorm:"VARCHAR(64)"` + Id string `json:"id" xorm:"not null pk VARCHAR(12)"` + CityId string `json:"city_id" xorm:"index VARCHAR(12)"` +} diff --git a/app/db/model/province.go b/app/db/model/province.go new file mode 100644 index 0000000..651b5bf --- /dev/null +++ b/app/db/model/province.go @@ -0,0 +1,6 @@ +package model + +type Province struct { + Id string `json:"id" xorm:"not null pk VARCHAR(12)"` + Name string `json:"name" xorm:"VARCHAR(64)"` +} diff --git a/app/router/router.go b/app/router/router.go index b82bfdb..44227cf 100644 --- a/app/router/router.go +++ b/app/router/router.go @@ -78,6 +78,11 @@ func routeCommunityTeamAgent(r *gin.RouterGroup) { r.POST("/goods/cate/save", agentHdl.GoodsCateSave) r.POST("/goods/cate/show", agentHdl.GoodsCateShow) r.POST("/goods/cate/del", agentHdl.GoodsCateDel) + r.POST("/store/withdraw/flow", agentHdl.StoreWithdrawFlow) + r.POST("/store/withdraw/total", agentHdl.StoreWithdrawTotal) + r.POST("/store/withdraw/audit", agentHdl.StoreWithdrawAudit) + r.POST("/store/withdraw/all/audit", agentHdl.StoreWithdrawAuditAll) + r.POST("/store/withdraw/output", agentHdl.StoreWithdrawOutPut) } func routeCommunityTeamOwnStore(r *gin.RouterGroup) { @@ -87,6 +92,8 @@ func routeCommunityTeamOwnStore(r *gin.RouterGroup) { r.POST("/login/send_sms", storeHdl.LoginSendSms) r.POST("/login/fast_in", storeHdl.LoginFastIn) r.Use(mw.AuthJWT) + r.GET("/sub_region_list", storeHdl.GetRegionChildNode) + r.POST("/sms", storeHdl.Sms) r.POST("/img/upload", storeHdl.ImgReqUpload) r.GET("/user", storeHdl.User) r.GET("/base", storeHdl.Base) @@ -101,6 +108,12 @@ func routeCommunityTeamOwnStore(r *gin.RouterGroup) { r.POST("/audit/doing", storeHdl.AuditDoing) r.POST("/store/order", storeHdl.UserStoreOrder) r.POST("/store/order/detail", storeHdl.UserStoreOrderDetail) + r.POST("/store/order/confirm", storeHdl.StoreOrderConfirm) + r.GET("/store/amount/base", storeHdl.StoreAmountBase) + r.POST("/store/amount/flow", storeHdl.StoreAmountFlow) + r.POST("/store/withdraw/flow", storeHdl.StoreWithdrawFlow) + r.POST("/store/withdraw/doing", storeHdl.StoreWithdrawDoing) + r.POST("/store/withdraw/bind/alipay", storeHdl.StoreWithdrawBindAlipay) r.POST("/goods/list", storeHdl.Goods) r.POST("/goods/save", storeHdl.GoodsSave) r.POST("/goods/detail", storeHdl.GoodsDetail) @@ -109,7 +122,6 @@ func routeCommunityTeamOwnStore(r *gin.RouterGroup) { r.POST("/goods/cate/save", storeHdl.GoodsCateSave) r.POST("/goods/cate/show", storeHdl.GoodsCateShow) r.POST("/goods/cate/del", storeHdl.GoodsCateDel) - r.POST("/agent/goods/list", storeHdl.AgentGoods) r.POST("/agent/goods/detail", storeHdl.AgentGoodsDetail) r.POST("/agent/goods/copy", storeHdl.AgentGoodsCopy) diff --git a/app/store/hdl/hdl_login.go b/app/store/hdl/hdl_login.go index 0bce125..8014c3d 100644 --- a/app/store/hdl/hdl_login.go +++ b/app/store/hdl/hdl_login.go @@ -1,6 +1,9 @@ package hdl import ( + "applet/app/db" + "applet/app/db/model" + "applet/app/e" "applet/app/store/svc" "github.com/gin-gonic/gin" ) @@ -21,6 +24,72 @@ func Login(c *gin.Context) { func LoginSendSms(c *gin.Context) { svc.LoginSendSms(c) } +func Sms(c *gin.Context) { + svc.Sms(c) +} func LoginFastIn(c *gin.Context) { svc.LoginFastIn(c) } + +type resultItem struct { + Id string `json:"id" example:"440100000000"` + Name string `json:"name" example:"city"` +} + +func GetRegionChildNode(c *gin.Context) { + parent, has := c.GetQuery("parent") + if !has { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + id, has := c.GetQuery("id") + if parent != "root" && !has { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + + var nodeList []interface{} + var err error + + switch parent { + case "root": + var provinceList []*model.Province + err = db.Db.Find(&provinceList) + for _, item := range provinceList { + nodeList = append(nodeList, resultItem{ + Id: item.Id, + Name: item.Name, + }) + } + case "province": + var cityList []*model.City + err = db.Db.Where("province_id=?", id).Find(&cityList) + for _, item := range cityList { + nodeList = append(nodeList, resultItem{ + Id: item.Id, + Name: item.Name, + }) + } + case "city": + var countyList []*model.County + err = db.Db.Where("city_id=?", id).Find(&countyList) + for _, item := range countyList { + nodeList = append(nodeList, resultItem{ + Id: item.Id, + Name: item.Name, + }) + } + default: + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + if err != nil { + e.OutErr(c, e.ERR_DB_ORM, err) + return + } + if len(nodeList) == 0 { + e.OutSuc(c, []interface{}{}, nil) + return + } + e.OutSuc(c, nodeList, nil) +} diff --git a/app/store/hdl/hdl_store.go b/app/store/hdl/hdl_store.go index 9c081ff..7b8a055 100644 --- a/app/store/hdl/hdl_store.go +++ b/app/store/hdl/hdl_store.go @@ -5,6 +5,7 @@ import ( "applet/app/db/model" "applet/app/e" "applet/app/md" + storeSvc "applet/app/store/svc" "applet/app/svc" "applet/app/utils" "encoding/json" @@ -255,7 +256,9 @@ func UserStoreOrderDetail(c *gin.Context) { e.OutSuc(c, res, nil) return } - +func StoreOrderConfirm(c *gin.Context) { + storeSvc.StoreOrderConfirm(c) +} func UserStoreInfo(c *gin.Context) { var arg map[string]string if err := c.ShouldBindJSON(&arg); err != nil { diff --git a/app/store/hdl/hdl_store_amount.go b/app/store/hdl/hdl_store_amount.go new file mode 100644 index 0000000..1357e59 --- /dev/null +++ b/app/store/hdl/hdl_store_amount.go @@ -0,0 +1,13 @@ +package hdl + +import ( + "applet/app/store/svc" + "github.com/gin-gonic/gin" +) + +func StoreAmountBase(c *gin.Context) { + svc.StoreAmountBase(c) +} +func StoreAmountFlow(c *gin.Context) { + svc.StoreAmountFlow(c) +} diff --git a/app/store/hdl/hdl_store_withdraw.go b/app/store/hdl/hdl_store_withdraw.go new file mode 100644 index 0000000..efe0c8f --- /dev/null +++ b/app/store/hdl/hdl_store_withdraw.go @@ -0,0 +1,16 @@ +package hdl + +import ( + "applet/app/store/svc" + "github.com/gin-gonic/gin" +) + +func StoreWithdrawFlow(c *gin.Context) { + svc.StoreWithdrawFlow(c) +} +func StoreWithdrawDoing(c *gin.Context) { + svc.StoreWithdrawDoing(c) +} +func StoreWithdrawBindAlipay(c *gin.Context) { + svc.StoreWithdrawBindAlipay(c) +} diff --git a/app/store/svc/svc_login.go b/app/store/svc/svc_login.go index 21e4046..e764c54 100644 --- a/app/store/svc/svc_login.go +++ b/app/store/svc/svc_login.go @@ -383,6 +383,96 @@ func LoginSendSms(c *gin.Context) { e.OutSuc(c, "验证码已发送,3分钟内有效", nil) return } +func Sms(c *gin.Context) { + var req map[string]string + if err := c.ShouldBindJSON(&req); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + user := svc.GetUser(c) + req["phone"] = user.Info.Phone + types := "bind_alipay" + var err error + smsType := svc.SysCfgGet(c, "sms_type") + c.Set("sms_type", smsType) + if c.GetString("sms_type") == "1" { + count := sms2.SmsNumGetSmsNum(db.Db, "putong", c.GetString("mid")) + if count-1 < 0 { + e.OutErr(c, e.ERR_MOB_SMS_NO_AVA, err) + return + } + } else { + count, _ := zhimeng.SmsNum(db.Db, c.GetString("mid"), c.GetString("sms_type"), db.SysCfgGet(c, "third_zm_sms_key"), db.SysCfgGet(c, "third_zm_sms_secret")) + if count-1 < 0 { + e.OutErr(c, e.ERR_MOB_SMS_NO_AVA, err) + return + } + } + appName := db.SysCfgGet(c, "sms_push_sign") + captcha := createCaptcha() + content := fmt.Sprintf("【%s】验证码:%s", appName, captcha) + key := fmt.Sprintf("%s_SMS_%s", db.SysCfgGet(c, "app_name"), req["phone"]) + templateCode := "" + switch types { + case "login": + content = fmt.Sprintf("【%s】快捷登录验证码:%s", appName, captcha) + key = fmt.Sprintf("%s_SMS_FastLogin_%s", db.SysCfgGet(c, "app_name"), req["phone"]) + templateCode = "login" + case "bind_alipay": + content = fmt.Sprintf("【%s】绑定支付宝验证码:%s", appName, captcha) + key = fmt.Sprintf("%s_SMS_FastLogin_%s", db.SysCfgGet(c, "app_name"), req["phone"]) + templateCode = "bind_alipay" + case "register": + content = fmt.Sprintf("【%s】注册验证码:%s", appName, captcha) + key = fmt.Sprintf("%s_SMS_FastLogin_%s", db.SysCfgGet(c, "app_name"), req["phone"]) + templateCode = "register" + } + marshal, _ := json.Marshal(c.Request.Header) + waykeys := "app_" + c.ClientIP() + "_" + utils.IntToStr(utils.GetApiVersion(c)) + "_" + c.Request.RequestURI + "_" + string(marshal) + postData := map[string]interface{}{ + "content": content, + "mobile": req["phone"], + "templateCode": templateCode, + "way": php2go.Base64Encode(waykeys), + } + requestBody := new(md.Register) + requestBody.Mobile = req["phone"] + requestBody.Captcha = captcha + if requestBody.Zone == "" { + requestBody.Zone = "86" + } + err = sms.GetSmsConfig(c, requestBody.Zone, postData) + if err != nil { + e.OutErr(c, 400, err) + return + } + tmp := struct { + Data md.Register `json:"data"` + CacheTime int64 `json:"cache_time"` + }{ + Data: *requestBody, + CacheTime: time.Now().Unix(), + } + if _, err := cache.SetEx(key, utils.Serialize(tmp), 180); err != nil { + e.OutErr(c, e.ERR, err) + return + } + //存入一个缓存 用于邀请码注册时候判断 + keys := fmt.Sprintf("%s_SMSCHECK_%s", c.GetString("mid"), requestBody.Mobile) + tmps := struct { + Check int `json:"check"` + CacheTime int64 `json:"cache_time"` + }{ + Check: 1, + CacheTime: time.Now().Unix(), + } + if _, err := cache.SetEx(keys, utils.Serialize(tmps), 3600); err != nil { + e.OutErr(c, e.ERR, err) + return + } + e.OutSuc(c, "验证码已发送,3分钟内有效", nil) + return +} func createCaptcha() string { return fmt.Sprintf("%05v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000)) } diff --git a/app/store/svc/svc_store.go b/app/store/svc/svc_store.go index b3463c0..8328abd 100644 --- a/app/store/svc/svc_store.go +++ b/app/store/svc/svc_store.go @@ -1 +1,65 @@ package svc + +import ( + "applet/app/db" + "applet/app/e" + "applet/app/svc" + "applet/app/utils" + "applet/app/utils/cache" + "fmt" + "github.com/gin-gonic/gin" + "time" +) + +func StoreOrderConfirm(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + // 加锁 防止并发提取 + mutexKey := fmt.Sprintf("%s:team.StoreOrderConfirm:%s", c.GetString("mid"), arg["oid"]) + withdrawAvailable, err := cache.Do("SET", mutexKey, 1, "EX", 5, "NX") + if err != nil { + e.OutErr(c, e.ERR, err) + return + } + if withdrawAvailable != "OK" { + e.OutErr(c, e.ERR, e.NewErr(400000, "请求过于频繁,请稍后再试")) + return + } + sess := svc.MasterDb(c).NewSession() + defer sess.Close() + sess.Begin() + order := db.GetOrder(sess, arg["oid"]) + if order == nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单不存在")) + return + } + if order.State != 1 { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单不能确认")) + return + } + order.State = 2 + order.UpdateAt = time.Now() + order.ConfirmAt = time.Now() + update, err := sess.Where("id=?", order.Id).Cols("state,confirm_at,update_at").Update(order) + if update == 0 || err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单确认失败")) + return + } + //给商家余额 + money := utils.StrToFloat64(order.Amount) - utils.StrToFloat64(order.AgentCommission) + bools := svc.MoneyCheck(c, sess, order.StoreUid, 0, 1, money, "订单核销", order.Oid) + if bools == false { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单确认失败")) + return + } + sess.Commit() + e.OutSuc(c, "success", nil) + return +} diff --git a/app/store/svc/svc_store_amount.go b/app/store/svc/svc_store_amount.go new file mode 100644 index 0000000..01fe223 --- /dev/null +++ b/app/store/svc/svc_store_amount.go @@ -0,0 +1,67 @@ +package svc + +import ( + "applet/app/db" + "applet/app/db/model" + "applet/app/e" + "applet/app/svc" + "applet/app/utils" + "github.com/gin-gonic/gin" +) + +func StoreAmountBase(c *gin.Context) { + user := svc.GetUser(c) + var res = map[string]string{ + "is_bind": "0", + "amount": "0", + "wait_amount": "0", + "alipay_account": user.Profile.AccAlipay, + "alipay_name": user.Profile.AccAlipayRealName, + } + if user.Profile.AccAlipay != "" { + res["is_bind"] = "1" + } + amount, _ := svc.MasterDb(c).Where("store_uid=? and parent_uid>0 and state=1", user.Info.Uid).Sum(&model.CommunityTeamOrder{}, "amount-agent_commission") + res["wait_amount"] = utils.Float64ToStr(amount) + store := db.GetStoreIdEg(svc.MasterDb(c), utils.IntToStr(user.Info.Uid)) + if store != nil { + amountData := db.GetStoreAmountEg(svc.MasterDb(c), user.Info.Uid, store.ParentUid) + if amountData != nil { + res["amount"] = amountData.Amount + } + } + e.OutSuc(c, res, nil) + return +} +func StoreAmountFlow(c *gin.Context) { + var req map[string]string + if err := c.ShouldBindJSON(&req); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + user := svc.GetUser(c) + req["store_uid"] = utils.IntToStr(user.Info.Uid) + withdraw, total := db.GetStoreAmountFlowList(svc.MasterDb(c), req) + list := make([]map[string]string, 0) + if withdraw != nil { + var stateList = []string{"收入", "支出"} + for _, v := range *withdraw { + tmp := map[string]string{ + "amount": v.Amount, + "type_str": stateList[v.Type], + "type": utils.IntToStr(v.Type), + "title": v.Title, + "oid": utils.Int64ToStr(v.Oid), + "after_amount": v.AfterAmount, + "time": v.CreateAt.Format("2006-01-02 15:04:05"), + } + list = append(list, tmp) + } + } + res := map[string]interface{}{ + "total": total, + "list": list, + } + e.OutSuc(c, res, nil) + return +} diff --git a/app/store/svc/svc_store_withdraw.go b/app/store/svc/svc_store_withdraw.go new file mode 100644 index 0000000..143f6c2 --- /dev/null +++ b/app/store/svc/svc_store_withdraw.go @@ -0,0 +1,168 @@ +package svc + +import ( + "applet/app/db" + "applet/app/db/model" + "applet/app/e" + "applet/app/lib/mob" + "applet/app/lib/sms" + "applet/app/svc" + "applet/app/utils" + "applet/app/utils/cache" + "fmt" + "github.com/gin-gonic/gin" + "github.com/tidwall/gjson" + "time" +) + +func StoreWithdrawFlow(c *gin.Context) { + var req map[string]string + if err := c.ShouldBindJSON(&req); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + user := svc.GetUser(c) + req["store_uid"] = utils.IntToStr(user.Info.Uid) + withdraw, total := db.GetStoreWithdraw(svc.MasterDb(c), req) + list := make([]map[string]string, 0) + if withdraw != nil { + var stateList = []string{"审核中", "审核通过", "审核通过", "审核拒绝"} + for _, v := range *withdraw { + tmp := map[string]string{ + "amount": v.Amount, + "alipay_account": v.WithdrawAccount, + "alipay_name": v.WithdrawName, + "state_str": stateList[v.State], + "state": utils.IntToStr(v.State), + "memo": v.Memo, + "time": v.CreateAt.Format("2006-01-02 15:04:05"), + } + list = append(list, tmp) + } + } + res := map[string]interface{}{ + "total": total, + "list": list, + } + e.OutSuc(c, res, nil) + return +} +func StoreWithdrawDoing(c *gin.Context) { + var req map[string]string + if err := c.ShouldBindJSON(&req); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + user := svc.GetUser(c) + if user.Profile.AccAlipay == "" || user.Profile.AccAlipayRealName == "" { + e.OutErr(c, 400, e.NewErr(400, "未绑定支付宝")) + return + } + if utils.StrToFloat64(req["amount"]) <= 0 { + e.OutErr(c, 400, e.NewErr(400, "金额不正确")) + return + } + sess := svc.MasterDb(c).NewSession() + defer sess.Close() + sess.Begin() + oid := utils.StrToInt64(utils.OrderUUID(user.Info.Uid)) + store := db.GetStoreId(sess, utils.IntToStr(user.Info.Uid)) + if store == nil { + e.OutErr(c, 400, e.NewErr(400, "提现失败")) + return + } + if store.ParentUid == 0 { + e.OutErr(c, 400, e.NewErr(400, "提现失败")) + return + } + bools := svc.MoneyCheck(c, sess, user.Info.Uid, 1, 2, utils.StrToFloat64(req["amount"]), "提现", oid) + if bools == false { + e.OutErr(c, 400, e.NewErr(400, "提现失败")) + return + } + var flow = &model.CommunityTeamStoreWithdrawApply{ + Uid: user.Info.Uid, + ParentUid: store.ParentUid, + Amount: req["amount"], + Type: 1, + WithdrawAccount: user.Profile.AccAlipay, + WithdrawName: user.Profile.AccAlipayRealName, + CreateAt: time.Now(), + UpdateAt: time.Now(), + Oid: oid, + } + insert, err := sess.Insert(flow) + if insert == 0 || err != nil { + e.OutErr(c, 400, e.NewErr(400, "提现失败")) + return + } + sess.Commit() + e.OutSuc(c, "success", nil) + return +} + +func StoreWithdrawBindAlipay(c *gin.Context) { + var req map[string]string + if err := c.ShouldBindJSON(&req); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + if req["alipay_account"] == "" { + e.OutErr(c, 400, e.NewErr(400, "支付宝不能为空")) + return + } + if req["alipay_name"] == "" { + e.OutErr(c, 400, e.NewErr(400, "真实姓名不能为空")) + return + } + mob1, errr := mob.GetMobSDK(c.GetString("mid")) + if errr != nil { + e.OutErr(c, e.ERR_MOB_CONFIG, errr) + return + } + user := svc.GetUser(c) + req["phone"] = user.Info.Phone + if req["zone"] == "" { + req["zone"] = "86" + } + send := map[string]interface{}{ + "phone": req["phone"], + "zone": req["zone"], + "code": req["captcha"], + } + var ok bool + var err error + // h5(wap) 登录 + smsPlatform := sms.GetSmsPlatform(c) + key := fmt.Sprintf("%s_SMS_FastLogin_%s", db.SysCfgGet(c, "app_name"), req["phone"]) + if smsPlatform == "ljioe" { + b, err := cache.GetBytes(key) + if err != nil { + e.OutErr(c, e.ERR_MOB_SMS_NO_EXISTS, err) + return + } + if req["captcha"] != gjson.GetBytes(b, "data.captcha").String() { + e.OutErr(c, e.ERR_MOB_SMS_NO_SAME, err) + return + } + ok = true + } else { + c.Set("not_deduction_doing", "1") + ok, err = mob1.MobSMS(c, send) + if err != nil { + e.OutErr(c, 400, err.Error()) + return + } + } + + if ok { + user.Profile.AccAlipay = req["alipay_account"] + user.Profile.AccAlipayRealName = req["alipay_name"] + svc.MasterDb(c).Where("uid=?", user.Profile.Uid).Cols("acc_alipay,acc_alipay_real_name").Update(user.Profile) + e.OutSuc(c, "success", nil) + return + } + // 验证码无效或者过期,验证码错误 + e.OutErr(c, e.ERR_SMS_AUTH, err) + return +} diff --git a/app/svc/svc_cate.go b/app/svc/svc_cate.go index 1b02dbe..718b6f8 100644 --- a/app/svc/svc_cate.go +++ b/app/svc/svc_cate.go @@ -8,7 +8,11 @@ import ( ) func Cate(c *gin.Context) { - cate := db.GetCate(MasterDb(c), "0") + storeId := c.GetHeader("store_id") + if storeId == "" { + storeId = "0" + } + cate := db.GetCate(MasterDb(c), storeId) cateList := make([]map[string]string, 0) if cate != nil { for _, v := range *cate { diff --git a/app/svc/svc_goods.go b/app/svc/svc_goods.go index dcebbde..4ca16fb 100644 --- a/app/svc/svc_goods.go +++ b/app/svc/svc_goods.go @@ -14,6 +14,12 @@ func Goods(c *gin.Context) { e.OutErr(c, e.ERR_INVALID_ARGS, err) return } + storeId := c.GetHeader("store_id") + arg["store_type"] = "0" + if utils.StrToInt(storeId) > 0 { + arg["store_id"] = storeId + arg["store_type"] = "1" + } goods := db.GetGoods(MasterDb(c), arg) goodsList := make([]map[string]interface{}, 0) diff --git a/app/svc/svc_order.go b/app/svc/svc_order.go index 3763636..0f27b08 100644 --- a/app/svc/svc_order.go +++ b/app/svc/svc_order.go @@ -232,6 +232,15 @@ func OrderCoupon(c *gin.Context) { return } func CommCoupon(c *gin.Context, totalPrice string) map[string]interface{} { + couponList := make([]md.CouponList, 0) + storeId := c.GetHeader("store_id") + if utils.StrToInt(storeId) > 0 { + returnData := map[string]interface{}{ + "total": "0", + "coupon_list": couponList, + } + return returnData + } var err error engine := MasterDb(c) user := GetUser(c) @@ -255,7 +264,6 @@ func CommCoupon(c *gin.Context, totalPrice string) map[string]interface{} { merchantSchemeMap[v.Id] = v } - couponList := make([]md.CouponList, 0) notCouponList := make([]md.CouponList, 0) count := 0 for _, item := range ActCouponUserList { @@ -439,9 +447,25 @@ func OrderConfirm(c *gin.Context) { update, err := sess.Where("id=?", order.Id).Cols("state,confirm_at,update_at").Update(order) if update == 0 || err != nil { sess.Rollback() - e.OutErr(c, 400, e.NewErr(400, "订单取消失败")) + e.OutErr(c, 400, e.NewErr(400, "订单确认失败")) + return + } + //给商家余额 + store := db.GetStoreId(sess, utils.IntToStr(order.StoreUid)) + if store == nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单确认失败")) return } + if store.ParentUid > 0 { + money := utils.StrToFloat64(order.Amount) - utils.StrToFloat64(order.AgentCommission) + bools := MoneyCheck(c, sess, order.StoreUid, 0, 1, money, "订单核销", order.Oid) + if bools == false { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单确认失败")) + return + } + } sess.Commit() e.OutSuc(c, "success", nil) return diff --git a/app/svc/svc_store.go b/app/svc/svc_store.go index 66490d0..65e247e 100644 --- a/app/svc/svc_store.go +++ b/app/svc/svc_store.go @@ -87,18 +87,20 @@ func NewStore(c *gin.Context) { v["km"] = "-" } tmp := map[string]interface{}{ - "lat": v["lat"], - "lng": v["lng"], - "address": v["address"], - "name": v["name"], - "id": v["id"], - "km": v["km"], - "time_str": v["timer"], - "uid": v["uid"], - "phone": v["phone"], - "logo": v["logo"], - "is_like": "0", - "fan": "", + "lat": v["lat"], + "lng": v["lng"], + "address": v["address"], + "name": v["name"], + "id": v["id"], + "km": v["km"], + "time_str": v["timer"], + "uid": v["uid"], + "store_id": v["uid"], + "store_type": v["store_type"], + "phone": v["phone"], + "logo": v["logo"], + "is_like": "0", + "fan": "", } if user != nil { count, _ := MasterDb(c).Where("uid=? and store_id=?", user.Info.Uid, v["id"]).Count(&model.CommunityTeamStoreLike{}) @@ -118,6 +120,11 @@ func StoreLike(c *gin.Context) { return } arg["store_type"] = "0" + storeId := c.GetHeader("store_id") + if utils.StrToInt(storeId) > 0 { + arg["store_id"] = storeId + arg["store_type"] = "1" + } user, _ := GetDefaultUser(c, c.GetHeader("Authorization")) store := db.GetStoreLike(MasterDb(c), arg) storeList := make([]map[string]interface{}, 0) @@ -166,7 +173,11 @@ func Store(c *gin.Context) { return } arg["store_type"] = "0" - + storeId := c.GetHeader("store_id") + if utils.StrToInt(storeId) > 0 { + arg["store_id"] = storeId + arg["store_type"] = "1" + } user, _ := GetDefaultUser(c, c.GetHeader("Authorization")) store := db.GetStore(MasterDb(c), arg) storeList := make([]map[string]interface{}, 0) diff --git a/app/svc/svc_store_order.go b/app/svc/svc_store_order.go index 6ca49e3..b020672 100644 --- a/app/svc/svc_store_order.go +++ b/app/svc/svc_store_order.go @@ -2,6 +2,7 @@ package svc import ( "applet/app/db" + "applet/app/db/model" "applet/app/e" "applet/app/md" "applet/app/utils" @@ -10,6 +11,7 @@ import ( "fmt" "github.com/gin-gonic/gin" "time" + "xorm.io/xorm" ) func StoreOrderCate(c *gin.Context) { @@ -272,9 +274,79 @@ func StoreOrderConfirm(c *gin.Context) { order.ConfirmAt = time.Now() update, err := sess.Where("id=?", order.Id).Cols("state,confirm_at,update_at").Update(order) if update == 0 || err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单确认失败")) + return + } + //给商家余额 + store := db.GetStoreId(sess, utils.IntToStr(order.StoreUid)) + if store == nil { + sess.Rollback() e.OutErr(c, 400, e.NewErr(400, "订单确认失败")) return } + if store.ParentUid > 0 { + money := utils.StrToFloat64(order.Amount) - utils.StrToFloat64(order.AgentCommission) + bools := MoneyCheck(c, sess, order.StoreUid, 0, 1, money, "订单核销", order.Oid) + if bools == false { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单确认失败")) + return + } + } + sess.Commit() e.OutSuc(c, "success", nil) return } +func MoneyCheck(c *gin.Context, sess *xorm.Session, storeId, types, ordType int, money float64, title string, oid int64) bool { + store := db.GetStoreId(sess, utils.IntToStr(storeId)) + if store == nil { + return false + } + if store.ParentUid == 0 { + return false + } + amountData := db.GetStoreAmount(sess, storeId, store.ParentUid) + if amountData == nil { + amountData = &model.CommunityTeamStoreAmount{ + Uid: storeId, + ParentUid: store.ParentUid, + StoreType: store.StoreType, + } + insert, err := sess.Insert(amountData) + if insert == 0 || err != nil { + return false + } + } + before := amountData.Amount + if types == 1 { + amountData.Amount = utils.Float64ToStr(utils.StrToFloat64(amountData.Amount) - money) + if utils.StrToFloat64(amountData.Amount) < 0 { + return false + } + } else { + amountData.Amount = utils.Float64ToStr(utils.StrToFloat64(amountData.Amount) + money) + } + update, err := sess.Where("id=?", amountData.Id).Cols("amount").Update(amountData) + if update == 0 || err != nil { + return false + } + var flow = &model.CommunityTeamStoreAmountFlow{ + Uid: storeId, + StoreType: store.StoreType, + ParentUid: store.ParentUid, + Amount: utils.Float64ToStr(money), + BeforeAmount: before, + AfterAmount: amountData.Amount, + Oid: oid, + Type: types, + Title: title, + OrdType: ordType, + CreateAt: time.Now(), + } + insert, err := sess.Insert(flow) + if insert == 0 || err != nil { + return false + } + return true +} diff --git a/app/utils/xls.go b/app/utils/xls.go new file mode 100644 index 0000000..511e652 --- /dev/null +++ b/app/utils/xls.go @@ -0,0 +1,79 @@ +package utils + +import ( + "applet/app/db/model" + "bytes" + "encoding/csv" + "fmt" + "github.com/360EntSecGroup-Skylar/excelize" + "github.com/gin-gonic/gin" + "io/ioutil" +) + +func Output(c *gin.Context, name string, data map[string]string) string { + //创建excel文件 + xlsx := excelize.NewFile() + //创建新表单 + index := xlsx.NewSheet(name) + for k, v := range data { + //设置单元格的值 + xlsx.SetCellValue(name, k, v) + } + //设置默认打开的表单 + xlsx.SetActiveSheet(index) + ////保存文件到指定路径 + //err := xlsx.SaveAs("./" + name + ".xlsx") + //if err != nil { + // log.Fatal(err) + //} + //_ = file.Save(fileName) + c.Header("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, name+".xlsx")) + c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + var buffer bytes.Buffer + _ = xlsx.Write(&buffer) + r := bytes.NewReader(buffer.Bytes()) + fSrc, _ := ioutil.ReadAll(r) + str := "data:application/vnd.ms-excel;base64," + Base64RawStdEncode(string(fSrc)) + return str +} +func OutputSecond(c *gin.Context, name string, data *[]model.CommunityTeamStoreWithdrawApply) string { + bytesBuffer := &bytes.Buffer{} + _, _ = bytesBuffer.WriteString("\xEF\xBB\xBF") //写入UTF-8 BOM 防止乱码 + writer := csv.NewWriter(bytesBuffer) + writer.Write([]string{"支付宝批量付款文件模板"}) + writer.Write([]string{"序号(必填)", "收款方支付宝账号(必填)", "收款方姓名(必填)", "金额(必填,单位:元)", "备注(选填)"}) + if data != nil { + for _, v := range *data { + writer.Write([]string{Int64ToStr(v.Id), v.WithdrawAccount, v.WithdrawName, v.Amount, "门店提现"}) + } + } + + writer.Flush() // 此时才会将缓冲区数据写入 + c.Header("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, name+".csv")) + c.Header("Content-Type", "application/force-download") + c.Header("Accept-Ranges", "bytes") + r := bytes.NewReader(bytesBuffer.Bytes()) + fSrc, _ := ioutil.ReadAll(r) + str := "data:text/csv;charset=utf-8;base64," + Base64RawStdEncode(string(fSrc)) + fmt.Println(str) + + return str +} + +//func OutputSecond(c *gin.Context, name string, data []map[string]string) string { +// bytesBuffer := &bytes.Buffer{} +// _, _ = bytesBuffer.WriteString("\xEF\xBB\xBF") //写入UTF-8 BOM 防止乱码 +// writer := csv.NewWriter(bytesBuffer) +// writer.Write([]string{"支付宝批量付款文件模板"}) +// writer.Write([]string{"序号(必填)", "收款方支付宝账号(必填)", "收款方姓名(必填)", "金额(必填,单位:元)", "备注(选填)"}) +// for _, v := range data { +// writer.Write([]string{v["id"], v["alipay"], v["alipay_name"], v["real_amount"], "聚合联盟"}) +// } +// writer.Flush() // 此时才会将缓冲区数据写入 +// c.Header("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, name+".csv")) +// r := bytes.NewReader(bytesBuffer.Bytes()) +// fSrc, _ := ioutil.ReadAll(r) +// str := "data:text/csv;charset=utf-8;base64," + Base64RawStdEncode(string(fSrc)) +// fmt.Println(str) +// return str +//} diff --git a/go.mod b/go.mod index 88a4cc5..fc51503 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,6 @@ require ( code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git v1.9.10-0.20240823083437-5a9b1907d83c code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git v1.6.2-0.20240105031805-d6d481cf00c0 github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 - github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 github.com/boombuler/barcode v1.0.1 github.com/dchest/uniuri v0.0.0-20200228104902-7aecb25e1fe5 github.com/dgrijalva/jwt-go v3.2.0+incompatible @@ -39,6 +38,7 @@ require ( code.fnuoos.com/go_rely_warehouse/zyos_go_es.git v1.0.1-0.20230113125201-a16543b7da1d code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git v0.0.5 code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git v1.1.21-0.20240830072333-a1980ffb256e + github.com/360EntSecGroup-Skylar/excelize v1.4.1 github.com/andybalholm/cascadia v1.2.0 // indirect github.com/antchfx/htmlquery v1.2.3 // indirect github.com/antchfx/xmlquery v1.3.5 // indirect diff --git a/go.sum b/go.sum index 6467cad..26def1f 100644 --- a/go.sum +++ b/go.sum @@ -38,6 +38,8 @@ git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGy gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU= gitee.com/travelliu/dm v1.8.11192/go.mod h1:DHTzyhCrM843x9VdKVbZ+GKXGRbKM2sJ4LxihRxShkE= +github.com/360EntSecGroup-Skylar/excelize v1.4.1 h1:l55mJb6rkkaUzOpSsgEeKYtS6/0gHwBYyfo5Jcjv/Ks= +github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE= github.com/Azure/azure-sdk-for-go v32.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= @@ -76,7 +78,6 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia github.com/akamai/AkamaiOPEN-edgegrid-golang v0.9.0/go.mod h1:zpDJeKyp9ScW4NNrbdr+Eyxvry3ilGPewKoXw3XGN1k= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -647,6 +648,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -863,6 +866,7 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.3-0.20181224173747-660f15d67dbb/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=