From bca800055bd3f842e19f1a0c9dc09d3b90b65b2f Mon Sep 17 00:00:00 2001 From: huangjiajun <582604932@qq.com> Date: Fri, 12 Sep 2025 17:54:53 +0800 Subject: [PATCH] 1 --- app/comm/md/app_redis_key.go | 4 +- app/comm/md/md_mq.go | 5 +- app/comm/svc/svc_redis_mutex_lock.go | 14 ++ app/custom/hdl/hdl_my_task.go | 39 +++ app/custom/hdl/hdl_order.go | 58 +++++ app/custom/hdl/hdl_project.go | 54 ++++ app/custom/hdl/hdl_task_list.go | 25 ++ app/custom/md/md_task.go | 8 + app/custom/svc/svc_my_task.go | 208 ++++++++++++++++ app/custom/svc/svc_order.go | 360 +++++++++++++++++++++++++++ app/custom/svc/svc_project.go | 154 ++++++++++++ app/custom/svc/svc_task_list.go | 304 ++++++++++++++++++++++ app/operator/svc/svc_project.go | 2 +- app/operator/svc/svc_task.go | 20 +- app/router/router.go | 33 ++- app/store/md/md_project.go | 10 +- app/store/md/md_task.go | 1 + app/store/svc/svc_project.go | 3 +- app/store/svc/svc_task.go | 42 +++- app/store/svc/svc_task_order.go | 5 +- go.mod | 8 +- 21 files changed, 1321 insertions(+), 36 deletions(-) create mode 100644 app/custom/hdl/hdl_my_task.go create mode 100644 app/custom/hdl/hdl_order.go create mode 100644 app/custom/hdl/hdl_project.go create mode 100644 app/custom/hdl/hdl_task_list.go create mode 100644 app/custom/md/md_task.go create mode 100644 app/custom/svc/svc_my_task.go create mode 100644 app/custom/svc/svc_order.go create mode 100644 app/custom/svc/svc_project.go create mode 100644 app/custom/svc/svc_task_list.go diff --git a/app/comm/md/app_redis_key.go b/app/comm/md/app_redis_key.go index 9b84da6..265e381 100644 --- a/app/comm/md/app_redis_key.go +++ b/app/comm/md/app_redis_key.go @@ -12,6 +12,6 @@ const ( AppCommLimiterLock = "%s:app_comm_limiter_lock:%s" // 限流器锁 DealAppCommLimiterRequestIdPrefix = "%s:app_comm_limiter_request_id:%s" - - CfgCacheTime = 60 * 60 * 4 + CampTaskLock = "%s:camp_task_lock:%s" // + CfgCacheTime = 60 * 60 * 4 ) diff --git a/app/comm/md/md_mq.go b/app/comm/md/md_mq.go index fff84db..6314cc9 100644 --- a/app/comm/md/md_mq.go +++ b/app/comm/md/md_mq.go @@ -1,8 +1,9 @@ package md const ( - ZhiosCampTask = "zhios.camp.task.exchange" - ZhiosCampTaskRoutKey = "camp_task_order_settle" + ZhiosCampTask = "zhios.camp.task.exchange" + ZhiosCampTaskRoutKey = "camp_task_order_settle" + ZhiosCampTaskOrderCommissionRoutKey = "camp_task_order_commission" ) type ZhiosCampOrderSettle struct { diff --git a/app/comm/svc/svc_redis_mutex_lock.go b/app/comm/svc/svc_redis_mutex_lock.go index 8a92f40..4245f34 100644 --- a/app/comm/svc/svc_redis_mutex_lock.go +++ b/app/comm/svc/svc_redis_mutex_lock.go @@ -83,7 +83,21 @@ func HandleBalanceDistributedLock(masterId, uid, requestIdPrefix string) (cb fun return cb, nil } +func HandleCampTaskLockDistributedLock(masterId, id, requestIdPrefix string) (cb func(), err error) { + // 获取余额更新锁 + balanceLockKey := fmt.Sprintf(md.CampTaskLock, masterId, id) + requestId := GetDistributedLockRequestId(requestIdPrefix) + balanceLockOk := TryGetDistributedLock(balanceLockKey, requestId, true) + if !balanceLockOk { + return nil, errors.New("系统繁忙,请稍后再试") + } + cb = func() { + _, _ = ReleaseDistributedLock(balanceLockKey, requestId) + } + + return cb, nil +} func HandleLimiterDistributedLock(masterId, ip, requestIdPrefix string) (cb func(), err error) { balanceLockKey := fmt.Sprintf(md.AppCommLimiterLock, masterId, ip) requestId := GetDistributedLockRequestId(requestIdPrefix) diff --git a/app/custom/hdl/hdl_my_task.go b/app/custom/hdl/hdl_my_task.go new file mode 100644 index 0000000..b1a1513 --- /dev/null +++ b/app/custom/hdl/hdl_my_task.go @@ -0,0 +1,39 @@ +package hdl + +import ( + "applet/app/comm/e" + "applet/app/comm/svc" + "applet/app/comm/utils" + svc2 "applet/app/custom/svc" + "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/models" + "github.com/gin-gonic/gin" +) + +func TaskMyCate(c *gin.Context) { + var cate = make([]models.CampTaskCate, 0) + svc.MasterDb(c).Where("is_show=1 and pid=0").Find(&cate) + list := make([]map[string]string, 0) + for _, v := range cate { + tmp := map[string]string{ + "name": v.Name, "value": utils.IntToStr(v.Id), + } + list = append(list, tmp) + } + e.OutSuc(c, list, nil) + return +} +func TaskMyList(c *gin.Context) { + svc2.TaskMyList(c) +} +func TaskMyTotal(c *gin.Context) { + svc2.TaskMyTotal(c) +} +func TaskIncome(c *gin.Context) { + svc2.TaskIncome(c) +} +func TaskIncomeTaskList(c *gin.Context) { + svc2.TaskIncomeTaskList(c) +} +func TaskIncomeList(c *gin.Context) { + svc2.TaskIncomeList(c) +} diff --git a/app/custom/hdl/hdl_order.go b/app/custom/hdl/hdl_order.go new file mode 100644 index 0000000..4ddc442 --- /dev/null +++ b/app/custom/hdl/hdl_order.go @@ -0,0 +1,58 @@ +package hdl + +import ( + "applet/app/comm/e" + "applet/app/comm/svc" + "applet/app/comm/utils" + svc2 "applet/app/custom/svc" + "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db/model" + "github.com/gin-gonic/gin" +) + +func City(c *gin.Context) { + var data = make([]model.RegionalAgentRegion, 0) + svc.MasterDb(c).Where("province_id=? or (province_id>? and city_id=?)", 0, 0, 0).Find(&data) + list := make([]map[string]interface{}, 0) + for _, v := range data { + tmpList := make([]map[string]string, 0) + tmp := map[string]interface{}{ + "name": v.Name, "value": utils.Int64ToStr(v.Id), "list": tmpList, + } + list = append(list, tmp) + } + for k, v := range list { + tmpList := make([]map[string]string, 0) + for _, v1 := range data { + if v1.ProvinceId == v["value"] { + tmp := map[string]string{ + "name": v1.Name, "value": utils.Int64ToStr(v1.Id), + } + tmpList = append(tmpList, tmp) + } + } + list[k]["list"] = tmpList + } + e.OutSuc(c, list, nil) + return +} +func TaskQrcodeApply(c *gin.Context) { + svc2.TaskQrcodeApply(c) +} +func TaskQrcodeList(c *gin.Context) { + svc2.TaskQrcodeList(c) +} +func TaskQrcodeDetail(c *gin.Context) { + svc2.TaskQrcodeDetail(c) +} +func TaskQrcodeSubmit(c *gin.Context) { + svc2.TaskQrcodeSubmit(c) +} +func TaskQrcodeContinueSubmit(c *gin.Context) { + svc2.TaskQrcodeContinueSubmit(c) +} +func TaskQrcodeOrderCate(c *gin.Context) { + svc2.TaskQrcodeOrderCate(c) +} +func TaskQrcodeOrder(c *gin.Context) { + svc2.TaskQrcodeOrder(c) +} diff --git a/app/custom/hdl/hdl_project.go b/app/custom/hdl/hdl_project.go new file mode 100644 index 0000000..d8bdd91 --- /dev/null +++ b/app/custom/hdl/hdl_project.go @@ -0,0 +1,54 @@ +package hdl + +import ( + "applet/app/comm/e" + svc2 "applet/app/comm/svc" + "applet/app/comm/utils" + "applet/app/custom/svc" + "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/models" + "github.com/gin-gonic/gin" +) + +func ProjectBase(c *gin.Context) { + var cate = []map[string]string{ + {"name": "全部", "value": ""}, + } + var cateMap = make([]models.CampTaskProjectCate, 0) + svc2.MasterDb(c).Where("is_show=1").OrderBy("sort desc,id desc").Find(&cateMap) + for _, v := range cateMap { + tmp := map[string]string{ + "name": v.Name, "value": utils.IntToStr(v.Id), + } + cate = append(cate, tmp) + } + res := map[string]interface{}{ + "cate": cate, + "price": []map[string]string{ + {"name": "全部", "value": ""}, + {"name": "免费合作", "value": "0_0"}, + {"name": "¥0-450万", "value": "0_450"}, + {"name": "¥450-600万", "value": "450_600"}, + {"name": "¥600-1000万", "value": "600_1000"}, + {"name": "¥1000万以上", "value": "1000_99999999"}, + }, + "sort": []map[string]string{ + {"name": "默认排序", "value": ""}, + {"name": "合作金额从低到高", "value": "money_asc"}, + {"name": "合作金额从高到低", "value": "money_desc"}, + }, + } + e.OutSuc(c, res, nil) + return +} +func ProjectList(c *gin.Context) { + svc.ProjectList(c) +} +func ProjectDetail(c *gin.Context) { + svc.ProjectDetail(c) +} +func ProjectLikeList(c *gin.Context) { + svc.ProjectLikeList(c) +} +func ProjectLike(c *gin.Context) { + svc.ProjectLike(c) +} diff --git a/app/custom/hdl/hdl_task_list.go b/app/custom/hdl/hdl_task_list.go new file mode 100644 index 0000000..0d62f70 --- /dev/null +++ b/app/custom/hdl/hdl_task_list.go @@ -0,0 +1,25 @@ +package hdl + +import ( + "applet/app/custom/svc" + "github.com/gin-gonic/gin" +) + +func IndexTaskList(c *gin.Context) { + svc.IndexTaskList(c) +} +func TaskBase(c *gin.Context) { + svc.TaskBase(c) +} +func SearchTaskList(c *gin.Context) { + svc.SearchTaskList(c) +} +func TaskDetail(c *gin.Context) { + svc.TaskDetail(c) +} +func TaskDetailNotice(c *gin.Context) { + svc.TaskDetailNotice(c) +} +func TaskDetailNoticeCate(c *gin.Context) { + svc.TaskDetailNoticeCate(c) +} diff --git a/app/custom/md/md_task.go b/app/custom/md/md_task.go new file mode 100644 index 0000000..1accede --- /dev/null +++ b/app/custom/md/md_task.go @@ -0,0 +1,8 @@ +package md + +import "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/models" + +type CampTaskListGroup struct { + models.CampTaskOperatorTask `xorm:"extends"` + models.CampTaskList `xorm:"extends"` +} diff --git a/app/custom/svc/svc_my_task.go b/app/custom/svc/svc_my_task.go new file mode 100644 index 0000000..453f051 --- /dev/null +++ b/app/custom/svc/svc_my_task.go @@ -0,0 +1,208 @@ +package svc + +import ( + "applet/app/comm/db" + "applet/app/comm/e" + "applet/app/comm/svc" + "applet/app/comm/utils" + "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/lib/comm_plan" + md2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md" + svc2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/svc" + "fmt" + "github.com/gin-gonic/gin" + "time" +) + +func TaskIncomeList(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + user := svc.GetUser(c) + sql := `SELECT SUM(ctupor.amount) as amount,ctl.name FROM camp_task_user_promotion_order_relate ctupor +LEFT JOIN camp_task_user_promotion_order ctupo on ctupo.oid=ctupor.oid +LEFT JOIN camp_task_list ctl on ctl.id=ctupo.task_id +WHERE ctupor.uid=%d and ctupo.settle_time like '2025-09%' GROUP BY ctupo.task_id ORDER BY ctupo.settle_time desc,ctupo.id desc %s` + sql = fmt.Sprintf(sql, user.Info.Uid, "limit "+utils.IntToStr((utils.StrToInt(args["p"])-1)*10)+",10") + nativeString, _ := db.QueryNativeString(svc.MasterDb(c), sql) + list := make([]map[string]string, 0) + for _, v := range nativeString { + tmp := map[string]string{ + "name": v["name"], "amount": v["amount"], + } + list = append(list, tmp) + } + res := map[string]interface{}{ + "list": list, + } + e.OutSuc(c, res, nil) +} +func TaskIncomeTaskList(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + user := svc.GetUser(c) + sql := ` +SELECT ctls.*,ct.id as op_id FROM camp_task_operator_task ct +LEFT JOIN camp_task_list ctls on ctls.id=ct.task_id +where ctls.first_cid in( +SELECT ctl.first_cid FROM camp_task_user_promotion_qrcode ctupo +LEFT JOIN camp_task_list ctl on ctl.id=ctupo.task_id +WHERE ctupo.uid=%d GROUP BY ctupo.task_id ) and ctls.up_down_state=1 and ctls.num>0 order by ctls.extend_num desc,ctls.id desc limit 5` + sql = fmt.Sprintf(sql, user.Info.Uid) + nativeString, _ := db.QueryNativeString(svc.MasterDb(c), sql) + list := make([]map[string]string, 0) + for _, v := range nativeString { + basePrice, _, _, _, _ := CommPrice(c, v["price"]) + tmp := map[string]string{ + "id": v["op_id"], + "name": v["name"], + "extend_num": v["extend_num"], + "icon": svc.ImageFormat(c, v["logo"]), + "price": basePrice, + } + list = append(list, tmp) + } + re := map[string]interface{}{ + "list": list, + } + e.OutSuc(c, re, nil) + return +} +func TaskIncome(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + user := svc.GetUser(c) + today := utils.GetTimeRange("today") + sql := `SELECT SUM(ctupor.amount) as amount,SUM(IF(and ctupo.settle_time >= '%s',ctupor.amount,0) as today_amount FROM camp_task_user_promotion_order_relate ctupor +LEFT JOIN camp_task_user_promotion_order ctupo on ctupo.oid=ctupor.oid +WHERE ctupor.uid=%d ` + sql = fmt.Sprintf(sql, time.Unix(today["start"], 0).Format("2006-01-02 15:04:05"), user.Info.Uid) + nativeString, _ := db.QueryNativeString(svc.MasterDb(c), sql) + allPayment := "0" + todayPayment := "0" + for _, v := range nativeString { + allPayment = v["amount"] + todayPayment = v["today_amount"] + } + res := map[string]interface{}{ + "total_list": []map[string]string{ + {"name": "累计总收益(元)", "value": allPayment}, + {"name": "今日收益(元)", "value": todayPayment}, + }, + } + e.OutSuc(c, res, nil) + return +} +func TaskMyTotal(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + user := svc.GetUser(c) + + sql := `SELECT COUNT(*) as count,SUM(ctupor.amount) as amount FROM camp_task_user_promotion_order_relate ctupor +LEFT JOIN camp_task_user_promotion_order ctupo on ctupo.oid=ctupor.oid +WHERE ctupor.uid=%d and ctupo.task_id=%s and ctupo.settle_time like '%s'` + sql = fmt.Sprintf(sql, user.Info.Uid, args["task_id"], args["date"]+"%") + nativeString, _ := db.QueryNativeString(svc.MasterDb(c), sql) + orderCount := "0" + settlePayment := "0" + for _, v := range nativeString { + orderCount = v["count"] + settlePayment = v["amount"] + } + sql1 := `SELECT COUNT(*) as count,SUM(ctupor.amount) as amount FROM camp_task_user_promotion_order_relate ctupor +LEFT JOIN camp_task_user_promotion_order ctupo on ctupo.oid=ctupor.oid +WHERE ctupor.uid=%d and ctupo.task_id=%s and ctupo.settle_time is null` + sql1 = fmt.Sprintf(sql1, user.Info.Uid, args["task_id"]) + nativeString1, _ := db.QueryNativeString(svc.MasterDb(c), sql) + waitPayment := "0" + for _, v := range nativeString1 { + waitPayment = v["amount"] + } + res := map[string]interface{}{ + "order_count": orderCount, + "total_list": []map[string]string{ + {"name": "已结算(元)", "value": settlePayment}, + {"name": "总待结算(元)", "value": waitPayment}, + }, + } + e.OutSuc(c, res, nil) + return +} +func TaskMyList(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + user := svc.GetUser(c) + where := "ctupo.uid=" + utils.IntToStr(user.Info.Uid) + if args["cid"] != "" { + where += " and ctl.first_cid=" + args["cid"] + } + + sql := `SELECT ctl.* FROM camp_task_user_promotion_qrcode ctupo +LEFT JOIN camp_task_list ctl on ctl.id=ctupo.task_id +WHERE %s GROUP BY ctupo.task_id ORDER BY ctl.id desc %s` + sql = fmt.Sprintf(sql, where, "limit "+utils.IntToStr((utils.StrToInt(args["p"])-1)*10)+",10") + nativeString, _ := db.QueryNativeString(svc.MasterDb(c), sql) + + list := make([]map[string]interface{}, 0) + settleType := []string{"T+1结算", "T+7结算", "T+30结算"} + for _, v := range nativeString { + //basePrice, firstPrice, secondPrice, thirdPrice, fourPrice := CommPrice(c, v["price"]) + basePrice, _, _, _, _ := CommPrice(c, v["price"]) + tmp := map[string]interface{}{ + "id": v["id"], + "name": v["name"], + "price": basePrice, + "label": []string{settleType[utils.StrToInt(v["settle_type"])]}, + "icon": svc.ImageFormat(c, v["logo"]), + } + list = append(list, tmp) + } + res := map[string]interface{}{ + "list": list, + } + e.OutSuc(c, res, nil) + return +} +func CommPrice(c *gin.Context, price string) (string, string, string, string, string) { + firstPrice := "0" + secondPrice := "0" + thirdPrice := "0" + fourPrice := "0" + basePrice := "" + plan, commission1, virtualCoinMoneyRate := svc2.GetAllPlan(svc.MasterDb(c), c.GetString("mid")) + rmd := &md2.CommissionParam{} + cfg, _ := svc2.GetPlanCfg(svc.MasterDb(c), "camp_task", c.GetString("mid"), plan, commission1, virtualCoinMoneyRate, rmd) + user, _ := svc.GetDefaultUser(c, c.GetHeader("Authorization")) + if cfg != nil { + fee, _, _, _ := svc2.CommFee(utils.StrToFloat64(price), cfg, "commission", rmd) + tmpPrice, _, _, _ := comm_plan.CalReturnAmountAndRatio(0, 0, 0, "own", fee, 0, cfg) + firstPrice = utils.Float64ToStr(tmpPrice) + tmpPrice1, _, _, _ := comm_plan.CalReturnAmountAndRatio(1, 0, 0, "own", fee, 0, cfg) + secondPrice = utils.Float64ToStr(tmpPrice1) + tmpPrice2, _, _, _ := comm_plan.CalReturnAmountAndRatio(2, 0, 0, "own", fee, 0, cfg) + thirdPrice = utils.Float64ToStr(tmpPrice2) + tmpPrice3, _, _, _ := comm_plan.CalReturnAmountAndRatio(3, 0, 0, "own", fee, 0, cfg) + fourPrice = utils.Float64ToStr(tmpPrice3) + } + if user != nil { + tmpPrice := []string{firstPrice, secondPrice, thirdPrice, fourPrice} + s := tmpPrice[user.Info.Level] + if s != "" { + basePrice = s + } + } + return basePrice, firstPrice, secondPrice, thirdPrice, fourPrice +} diff --git a/app/custom/svc/svc_order.go b/app/custom/svc/svc_order.go new file mode 100644 index 0000000..736a586 --- /dev/null +++ b/app/custom/svc/svc_order.go @@ -0,0 +1,360 @@ +package svc + +import ( + "applet/app/comm/db" + "applet/app/comm/e" + md2 "applet/app/comm/md" + "applet/app/comm/svc" + "applet/app/comm/utils" + "applet/app/comm/utils/qrcode" + "code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit" + "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/models" + "fmt" + "github.com/gin-gonic/gin" + "strings" + "time" +) + +func TaskQrcodeOrderCate(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + user, _ := svc.GetDefaultUser(c, c.GetHeader("Authorization")) + uid := 0 + if args["qrcode_id"] != "" { + var data models.CampTaskUserPromotionQrcode + svc.MasterDb(c).Where("id=?", args["id"]).Get(&data) + uid = data.Uid + } else if user != nil { + uid = user.Info.Uid + } + where := "uid=" + utils.IntToStr(uid) + if args["qrcode_id"] != "" { + where += " and qrcode_id=" + args["qrcode_id"] + } + if args["task_id"] != "" { + where += " and task_id=" + args["task_id"] + } + sql := `select count(*) as count,state,task_id from camp_task_user_promotion_order where %s group by state` + sql = fmt.Sprintf(sql, where) + nativeString, _ := db.QueryNativeString(svc.MasterDb(c), sql) + list := []map[string]string{ + {"name": "审核中", "value": "0"}, + {"name": "审核通过", "value": "1"}, + {"name": "审核驳回", "value": "2"}, + } + id := "0" + for k, v := range list { + for _, v1 := range nativeString { + id = v1["task_id"] + if v["value"] == v1["state"] { + list[k]["name"] += "(" + v1["count"] + ")" + } + } + } + var task models.CampTaskList + svc.MasterDb(c).Where("id=?", id).Get(&task) + re := map[string]interface{}{ + "list": list, + "task_name": task.Name, + } + e.OutSuc(c, re, nil) + return +} +func TaskQrcodeOrder(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + user, _ := svc.GetDefaultUser(c, c.GetHeader("Authorization")) + uid := 0 + if args["qrcode_id"] != "" { + var data models.CampTaskUserPromotionQrcode + svc.MasterDb(c).Where("id=?", args["id"]).Get(&data) + uid = data.Uid + } else if user != nil { + uid = user.Info.Uid + } + where := "uid=" + utils.IntToStr(uid) + if args["qrcode_id"] != "" { + where += " and qrcode_id=" + args["qrcode_id"] + } + if args["task_id"] != "" { + where += " and task_id=" + args["task_id"] + } + if args["state"] != "" { + where += " and state=" + args["state"] + } + sql := `select * from camp_task_user_promotion_order where %s order by id desc %s` + sql = fmt.Sprintf(sql, where, "limit "+utils.IntToStr((utils.StrToInt(args["p"])-1)*10)+",10") + nativeString, _ := db.QueryNativeString(svc.MasterDb(c), sql) + list := make([]map[string]interface{}, 0) + for _, v := range nativeString { + var task models.CampTaskList + svc.MasterDb(c).Where("id=?", v["task_id"]).Get(&task) + dataList := []map[string]string{ + {"name": "提交时间:" + v["create_time"]}, + {"name": "姓名:" + v["name"]}, + {"name": "手机号:" + v["phone"]}, + {"name": "作业地区:" + v["province"] + v["city"]}, + } + if v["state"] == "2" { + dataList = append(dataList, map[string]string{"name": "驳回原因:" + v["store_reason"]}) + } + img := strings.Split(v["img"], ",") + tmp := map[string]interface{}{ + "task_name": task.Name, + "data_list": dataList, + "img": img, + "state": v["state"], + "oid": v["oid"], + "id": v["id"], + } + list = append(list, tmp) + } + res := map[string]interface{}{ + "list": list, + } + e.OutSuc(c, res, nil) + return +} +func TaskQrcodeSubmit(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + var data models.CampTaskUserPromotionQrcode + svc.MasterDb(c).Where("id=?", args["id"]).Get(&data) + if data.Id == 0 { + e.OutErr(c, 400, e.NewErr(400, "二维码已失效")) + return + } + user, _ := db.UserFindByID(svc.MasterDb(c), data.Uid) + if user == nil { + e.OutErr(c, 400, e.NewErr(400, "二维码已失效")) + return + } + topUid := 0 + if user != nil { + sql := `select ur.parent_uid from user_relate ur + left join user u on u.uid=ur.parent_uid + where ur.uid=%d and u.level in(2,3) order by ur.level limit 1 +` + sql = fmt.Sprintf(sql, user.Uid) + nativeString, _ := db.QueryNativeString(svc.MasterDb(c), sql) + for _, v := range nativeString { + topUid = utils.StrToInt(v["parent_uid"]) + } + } + + if topUid != data.FormUid { + e.OutErr(c, 400, e.NewErr(400, "二维码已失效")) + return + } + cb, err := svc.HandleCampTaskLockDistributedLock(c.GetString("mid"), utils.IntToStr(data.TaskId), "camp_task") + if err != nil { + e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试")) + return + } + // 处理完毕释放锁 + if cb != nil { + defer cb() + } + sess := svc.MasterDb(c).NewSession() + defer sess.Close() + sess.Begin() + var campTask models.CampTaskList + sess.Where("id=?", data.TaskId).Get(&campTask) + if campTask.UpDownState == 0 { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "任务已下架")) + return + } + if campTask.Num-1 < 0 { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "任务数量不足")) + return + } + campTask.Num-- + update, err := sess.Where("id-?", campTask.Id).Cols("num").Update(&campTask) + if update == 0 || err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "任务提交失败")) + return + } + var changeLog = models.CampTaskDeductList{ + TaskId: campTask.Id, + Type: 1, + Num: 1, + AfterNum: campTask.Num, + CreateTime: time.Now(), + StoreId: campTask.StoreId, + Title: "交单扣除", + OrdType: "task_success", + } + update, err = sess.Insert(&changeLog) + if update == 0 || err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "任务提交失败")) + return + } + var order = models.CampTaskUserPromotionOrder{ + Uid: user.Uid, + TaskId: campTask.Id, + CreateTime: time.Now(), + FormUid: data.FormUid, + Name: data.Name, + Phone: data.Phone, + Province: data.Province, + City: data.City, + Code: data.Code, + Remark: data.Remark, + QrcodeId: data.Id, + Oid: utils.StrToInt64(utils.OrderUUID(user.Uid)), + Payment: campTask.Price, + StoreId: campTask.StoreId, + UserLv: user.Level, + Img: args["img"], + SettleType: campTask.SettleType, + } + update, err = sess.Insert(&order) + if update == 0 || err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "任务提交失败")) + return + } + sess.Commit() + ch, _ := rabbit.Cfg.Pool.GetChannel() + arg := md2.ZhiosCampOrderSettle{Id: utils.IntToStr(order.Id), Mid: c.GetString("mid")} + err = ch.PublishV2(md2.ZhiosCampTask, utils.SerializeStr(arg), md2.ZhiosCampTaskOrderCommissionRoutKey) + if err != nil { + err = ch.PublishV2(md2.ZhiosCampTask, utils.SerializeStr(arg), md2.ZhiosCampTaskOrderCommissionRoutKey) + } + e.OutSuc(c, "success", nil) + return +} +func TaskQrcodeContinueSubmit(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + var data models.CampTaskUserPromotionOrder + svc.MasterDb(c).Where("id=?", args["id"]).Get(&data) + if data.Id == 0 { + e.OutErr(c, 400, e.NewErr(400, "订单不存在")) + return + } + if data.State != 2 { + e.OutErr(c, 400, e.NewErr(400, "订单已审核或审核中,不可操作")) + return + } + data.Img = args["img"] + data.State = 0 + svc.MasterDb(c).Where("id=?", data.Id).Cols("img,state").Update(&data) + e.OutSuc(c, "success", nil) + return +} +func TaskQrcodeDetail(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + var data models.CampTaskUserPromotionQrcode + svc.MasterDb(c).Where("id=?", args["id"]).Get(&data) + var task models.CampTaskList + svc.MasterDb(c).Where("id=?", data.TaskId).Get(&task) + res := map[string]string{ + "name": data.Name, "task_name": task.Name, + "phone": data.Phone, + "id": utils.IntToStr(data.Id), + "address": data.Province + data.City, + } + e.OutSuc(c, res, nil) + return +} +func TaskQrcodeList(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + user := svc.GetUser(c) + var data []models.CampTaskUserPromotionQrcode + size := utils.StrToInt(args["size"]) + p := utils.StrToInt(args["p"]) + sess := svc.MasterDb(c).Where("uid=?", user.Info.Uid) + if args["id"] != "" { + sess.And("task_id=?", args["id"]) + } + sess.Limit(size, (p-1)*size).OrderBy("id desc").Find(&data) + list := make([]map[string]string, 0) + h5Domain := svc.GetWebSiteDomainInfo(c, "wap") + for _, v := range data { + var task models.CampTaskList + svc.MasterDb(c).Where("id=?", v.TaskId).Get(&task) + //TODO 要前端的链接 + QrCode := qrcode.GetPNGBase64(h5Domain + "/#/zy-landing-page/pages/push-hand-login/push-hand-login?id=" + utils.IntToStr(v.Id)) + QrCode = strings.ReplaceAll(QrCode, "\u0000", "") + tmp := map[string]string{ + "name": v.Name, + "create_time": v.CreateTime.Format("2006-01-02 15:04:05"), + "phone": v.Phone, + "address": v.Province + v.City, + "remark": v.Remark, + "id": utils.IntToStr(v.Id), + "qrcode": QrCode, + "code": utils.IntToStr(v.Id), + "task_name": task.Name, + } + list = append(list, tmp) + } + res := map[string]interface{}{ + "list": list, + } + e.OutSuc(c, res, nil) + return +} +func TaskQrcodeApply(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + user := svc.GetUser(c) + var CampTaskOperatorTask models.CampTaskOperatorTask + svc.MasterDb(c).Where("id=?", args["id"]).Get(&CampTaskOperatorTask) + if CampTaskOperatorTask.Id == 0 { + e.OutErr(c, 400, e.NewErr(400, "任务不存在")) + return + } + count, _ := svc.MasterDb(c).Where("uid=? and task_id=? and phone=?", user.Info.Uid, CampTaskOperatorTask.TaskId, args["phone"]).Count(&models.CampTaskUserPromotionQrcode{}) + if count > 0 { + e.OutErr(c, 400, e.NewErr(400, "当前号码重复,请重新输入")) + return + } + var data = models.CampTaskUserPromotionQrcode{ + Uid: user.Info.Uid, + TaskId: CampTaskOperatorTask.TaskId, + FormUid: CampTaskOperatorTask.Uid, + CreateTime: time.Now(), + Name: args["name"], + Phone: args["phone"], + Province: args["province"], + City: args["city"], + Remark: args["remark"], + State: 1, + } + insert, _ := svc.MasterDb(c).Insert(&data) + if insert == 0 { + e.OutErr(c, 400, e.NewErr(400, "申请失败")) + return + } + e.OutSuc(c, "success", nil) + return +} diff --git a/app/custom/svc/svc_project.go b/app/custom/svc/svc_project.go new file mode 100644 index 0000000..7b1e704 --- /dev/null +++ b/app/custom/svc/svc_project.go @@ -0,0 +1,154 @@ +package svc + +import ( + "applet/app/comm/e" + "applet/app/comm/svc" + "applet/app/comm/utils" + "applet/app/store/md" + "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/models" + "encoding/json" + "github.com/gin-gonic/gin" + "strings" + "time" +) + +func ProjectList(c *gin.Context) { + var args md.ProjectReq + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + res := ProjectComm(c, args) + e.OutSuc(c, res, nil) + return +} +func ProjectDetail(c *gin.Context) { + var args md.ProjectReq + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + args.P = "1" + list := ProjectComm(c, args) + res := map[string]interface{}{} + if len(list) > 0 { + res = list[0] + } + e.OutSuc(c, res, nil) + return +} +func ProjectLikeList(c *gin.Context) { + var args md.ProjectReq + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + var project models.CampTaskProject + svc.MasterDb(c).Where("id=?", project.Id).Get(&project) + args.Id = "" + args.Cid = utils.IntToStr(project.Cid) + list := ProjectComm(c, args) + res := map[string]interface{}{} + if len(list) > 0 { + res = list[0] + } + e.OutSuc(c, res, nil) + return +} +func ProjectLike(c *gin.Context) { + var args md.ProjectReq + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + user := svc.GetUser(c) + count, _ := svc.MasterDb(c).Where("uid=? and project_id=?", user.Info.Uid, args.Id).Count(&models.CampTaskProjectUserLike{}) + if count > 0 { + e.OutErr(c, 400, e.NewErr(400, "意向已提交,负责人将与您对接")) + return + } + var data = models.CampTaskProjectUserLike{ + Uid: user.Info.Uid, + ProjectId: utils.StrToInt(args.Id), + CreateTime: time.Now(), + } + svc.MasterDb(c).Insert(&data) + e.OutSuc(c, "success", nil) + return + +} +func ProjectComm(c *gin.Context, args md.ProjectReq) []map[string]interface{} { + args.Size = "10" + list := make([]map[string]interface{}, 0) + var data = make([]models.CampTaskProject, 0) + sess := svc.MasterDb(c).Where("state=?", 1) + if args.Cid != "" { + sess.And("cid=?", args.Cid) + } + if args.Id != "" { + sess.And("id=?", args.Id) + } + if args.Price != "" { + ex := strings.Split(args.Price, "_") + sess.And("money>=?", ex[0]) + sess.And("money 0 { + firstImg = img[0] + } + detailInfo := make([]string, 0) + json.Unmarshal([]byte(v.DetailInfo), &detailInfo) + label := make([]string, 0) + json.Unmarshal([]byte(v.Label), &label) + tmp := map[string]interface{}{ + "year": v.CreateTime.Format("2006") + "年", + "id": utils.IntToStr(v.Id), + "name": v.Name, + "money": utils.Comm(v.Money), + "img": firstImg, + "video_info": v.VideoInfo, + "img_list": img, + "detail_info": detailInfo, + "create_time": v.CreateTime.Format("2006-01-02 15:04:05"), + "enterprise_info": enterpriseInfo1, + "cate_name": "", + "adv_word": v.AdvWord, + "label": label, + "is_like": "0", + } + if user != nil { + count, _ := svc.MasterDb(c).Where("uid=? and project_id=?", user.Info.Uid, v.Id).Count(&models.CampTaskProjectUserLike{}) + if count > 0 { + tmp["is_like"] = "1" + } + } + for _, v1 := range cate { + if v1.Id == v.Cid { + tmp["cate_name"] = v1.Name + } + } + list = append(list, tmp) + } + + return list +} diff --git a/app/custom/svc/svc_task_list.go b/app/custom/svc/svc_task_list.go new file mode 100644 index 0000000..7532773 --- /dev/null +++ b/app/custom/svc/svc_task_list.go @@ -0,0 +1,304 @@ +package svc + +import ( + "applet/app/comm/db" + "applet/app/comm/e" + "applet/app/comm/svc" + "applet/app/comm/utils" + "applet/app/custom/md" + "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/implement" + "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/models" + "encoding/json" + "fmt" + "github.com/gin-gonic/gin" +) + +func TaskBase(c *gin.Context) { + taskCate := make([]map[string]string, 0) + taskCateList := make([]models.CampTaskCate, 0) + svc.MasterDb(c).Where("is_show_store=? and is_show=?", 1, 1).OrderBy("sort desc,id desc").Find(&taskCateList) + taskAllCate := make([]map[string]interface{}, 0) + for _, v := range taskCateList { + if v.Pid > 0 { + continue + } + tmp := map[string]string{ + "name": v.Name, "value": utils.IntToStr(v.Id), + } + taskCate = append(taskCate, tmp) + listTmp := make([]map[string]string, 0) + allTmp := map[string]interface{}{ + "name": v.Name, "value": utils.IntToStr(v.Id), "list": listTmp, + } + taskAllCate = append(taskAllCate, allTmp) + } + for k, v := range taskAllCate { + listTmp := make([]map[string]string, 0) + for _, v1 := range taskCateList { + if v["value"] != utils.IntToStr(v1.Pid) { + continue + } + allTmp := map[string]string{ + "name": v1.Name, "value": utils.IntToStr(v1.Id), + } + listTmp = append(listTmp, allTmp) + } + taskAllCate[k]["list"] = listTmp + } + res := map[string]interface{}{ + "all_cate_list": taskAllCate, + } + e.OutSuc(c, res, nil) + return +} + +func IndexTaskList(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + hotTask := make([]map[string]interface{}, 0) + args["sort"] = "camp_task_list.success_num desc,camp_task_list.id desc" + args["p"] = "1" + args["size"] = "5" + hotTaskList := CommTask(c, args) + if hotTaskList != nil { + for _, v := range *hotTaskList { + basePrice, _, secondPrice, thirdPrice, _ := CommPrice(c, v.Price) + label := make([]string, 0) + json.Unmarshal([]byte(v.Label), &label) + tmp := map[string]interface{}{ + "id": utils.IntToStr(v.CampTaskOperatorTask.Id), + "name": v.Name, + "label": label, + "base_price": basePrice, + "remark": v.Remark, + "first_price": "团长佣金: ¥" + secondPrice, + "second_price": "运营商佣金: ¥" + thirdPrice, + "icon": svc.ImageFormat(c, v.Logo), + } + hotTask = append(hotTask, tmp) + } + } + res := map[string]interface{}{ + "list": hotTask, + } + e.OutSuc(c, res, nil) + return +} +func SearchTaskList(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + hotTask := make([]map[string]interface{}, 0) + args["sort"] = "camp_task_list.success_num desc,camp_task_list.id desc" + args["size"] = "5" + hotTaskList := CommTask(c, args) + if hotTaskList != nil { + for _, v := range *hotTaskList { + basePrice, _, secondPrice, thirdPrice, _ := CommPrice(c, v.Price) + label := make([]string, 0) + json.Unmarshal([]byte(v.Label), &label) + tmp := map[string]interface{}{ + "id": utils.IntToStr(v.CampTaskOperatorTask.Id), + "name": v.Name, + "label": label, + "base_price": basePrice, + "remark": v.Remark, + "first_price": "团长佣金: ¥" + secondPrice, + "second_price": "运营商佣金: ¥" + thirdPrice, + "icon": svc.ImageFormat(c, v.Logo), + } + hotTask = append(hotTask, tmp) + } + } + res := map[string]interface{}{ + "list": hotTask, + } + e.OutSuc(c, res, nil) + return +} +func TaskDetail(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + var CampTaskOperatorTask models.CampTaskOperatorTask + svc.MasterDb(c).Where("id=?", args["id"]).Get(&CampTaskOperatorTask) + var hotTaskList models.CampTaskList + svc.MasterDb(c).Where("id=?", CampTaskOperatorTask.TaskId).Get(&hotTaskList) + label := make([]string, 0) + DetailInfo := make([]string, 0) + reward := make([]map[string]string, 0) + priceList := make([]map[string]string, 0) + count, _ := svc.MasterDb(c).Where("task_id=?", CampTaskOperatorTask.TaskId).Count(&models.CampTaskNotice{}) + noticeNum := utils.Int64ToStr(count) + tmp := map[string]interface{}{ + "id": utils.IntToStr(CampTaskOperatorTask.Id), + "name": hotTaskList.Name, + "price": hotTaskList.Price, + "num": utils.IntToStr(hotTaskList.Num), + "icon": svc.ImageFormat(c, hotTaskList.Logo), + "timer": hotTaskList.StartTime.Format("2006-01-02") + "至" + hotTaskList.EndTime.Format("2006-01-02"), + "detail_info": DetailInfo, + "label": label, + "is_can_buy": "1", + "buy_tip_str": "", + "reward_list": reward, + "price_list": priceList, + "video_course": "", + "level_name": "", + "notice": "", + "instructions": "", + "notice_num": noticeNum, + } + + taskDetailDb := implement.NewCampTaskDetailDb(svc.MasterDb(c)) + taskDetail, _ := taskDetailDb.GetCampTaskDetailById(utils.IntToStr(hotTaskList.Id)) + if taskDetail != nil { + json.Unmarshal([]byte(taskDetail.DetailInfo), &DetailInfo) + tmp["detail_info"] = DetailInfo + tmp["detail_info"] = taskDetail.VideoCourse + tmp["notice"] = taskDetail.Notice + tmp["instructions"] = taskDetail.Instructions + } + json.Unmarshal([]byte(hotTaskList.Label), &label) + tmp["label"] = label + user, _ := svc.GetDefaultUser(c, c.GetHeader("Authorization")) + _, firstPrice, secondPrice, thirdPrice, _ := CommPrice(c, hotTaskList.Price) + + settleType := []string{"T+1", "T+7", "T+30"} + priceList = []map[string]string{ + {"name": "运营商价", "price": thirdPrice, "subsidy": "-", "settle": settleType[hotTaskList.SettleType] + "结算"}, + {"name": "团长价", "price": secondPrice, "subsidy": "-", "settle": settleType[hotTaskList.SettleType] + "结算"}, + {"name": "会员价", "price": firstPrice, "subsidy": "-", "settle": settleType[hotTaskList.SettleType] + "结算"}, + } + tmp["price_list"] = priceList + extendCount := "0" + rewardValue := "0" + if user != nil { + count1, _ := svc.MasterDb(c).Where("uid=? and task_id=?", user.Info.Uid, hotTaskList.Id).Count(&models.CampTaskUserPromotionQrcode{}) + extendCount = utils.Int64ToStr(count1) + sql := `select SUN(ctupor.amount) as amount +FROM camp_task_user_promotion_order_relate ctupor +LEFT JOIN camp_task_user_promotion_order ctupo on ctupo.oid=ctupor.oid +WHERE ctupor.uid=%d and ctupo.settle_state=1 ` + sql = fmt.Sprintf(sql, user.Info.Uid) + nativeString, _ := db.QueryNativeString(svc.MasterDb(c), sql) + for _, v := range nativeString { + rewardValue = v["amount"] + } + var cate models.CampTaskCate + svc.MasterDb(c).Where("id=?", hotTaskList.FirstCid).Get(&cate) + level := user.Info.Level + if level == 2 || level == 3 { + level = 2 + } + if cate.Id > 0 { + if cate.Lv == 2 || cate.Lv == 3 { + cate.Lv = 2 + } + if level < cate.Lv { + tmp["is_can_buy"] = "0" + tmp["buy_tip_str"] = "该任务为运营商专属任务" + } + } + } + reward = []map[string]string{ + {"name": "累计收入(元)", "value": rewardValue, "type": "income"}, + {"name": "我的推广码(个)", "value": extendCount, "type": "qrcode"}, + } + if user != nil { + lvName := []string{"会员", "团长", "运营商"} + tmp["level_name"] = lvName[user.Info.Level] + count, _ := svc.MasterDb(c).Where("uid=? and task_id=?", user.Info.Uid, hotTaskList.Id).Count(&models.CampTaskUserPromotionOrder{}) + if count > 0 { + reward = append(reward, map[string]string{"name": "历史凭证(个)", "value": utils.Int64ToStr(count), "type": "history"}) + } + } + tmp["reward_list"] = reward + e.OutSuc(c, tmp, nil) + return +} +func TaskDetailNotice(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + var CampTaskOperatorTask models.CampTaskOperatorTask + svc.MasterDb(c).Where("id=?", args["id"]).Get(&CampTaskOperatorTask) + var data = make([]models.CampTaskNotice, 0) + sess := svc.MasterDb(c).Where("1=1") + sess.And("task_id=?", CampTaskOperatorTask.TaskId) + if args["type"] != "" { + sess.And("type=?", args["type"]) + } + size := utils.StrToInt(args["size"]) + p := utils.StrToInt(args["p"]) + sess.Limit(size, (p-1)*size).OrderBy("id desc").Find(&data) + list := make([]map[string]string, 0) + for _, v := range data { + tmp := map[string]string{ + "title": v.Title, + "content": v.Content, + "create_time": v.CreateTime.Format("2006-01-02 15:04:05"), + } + list = append(list, tmp) + } + res := map[string]interface{}{ + "list": list, + } + e.OutSuc(c, res, nil) + return + +} +func TaskDetailNoticeCate(c *gin.Context) { + cateType := []map[string]string{ + {"name": "任务公告", "value": "announcement", "is_list": "0"}, + {"name": "数据与结算", "value": "data_settle", "is_list": "1"}, + {"name": "变更通知", "value": "change_notice", "is_list": "1"}, + } + e.OutSuc(c, cateType, nil) + return +} +func CommTask(c *gin.Context, arg map[string]string) *[]md.CampTaskListGroup { + user, _ := svc.GetDefaultUser(c, c.GetHeader("Authorization")) + topUid := 0 + if user != nil { + sql := `select ur.parent_uid from user_relate ur + left join user u on u.uid=ur.parent_uid + where ur.uid=%d and u.level in(2,3) order by ur.level limit 1 +` + sql = fmt.Sprintf(sql, user.Info.Uid) + nativeString, _ := db.QueryNativeString(svc.MasterDb(c), sql) + for _, v := range nativeString { + topUid = utils.StrToInt(v["parent_uid"]) + } + } + var m = make([]md.CampTaskListGroup, 0) + sess := svc.MasterDb(c).Table("camp_task_operator_task").Where("camp_task_operator_task.uid=?", topUid) + sess.Join("LEFT", "camp_task_list", "camp_task_operator_task.task_id = camp_task_list.id") + sess.And("camp_task_list.up_down_state=? and camp_task_list.num>0", "1") + if arg["cid"] != "" { + sess.And("camp_task_list.first_cid=?", arg["cid"]) + } + if arg["second_cid"] != "" { + sess.And("camp_task_list.second_cid=?", arg["second_cid"]) + } + if arg["name"] != "" { + sess.And("camp_task_list.name like ?", "%"+arg["name"]+"%") + } + size := utils.StrToInt(arg["size"]) + p := utils.StrToInt(arg["p"]) + sort := arg["sort"] + err := sess.Limit(size, (p-1)*size).OrderBy(sort).Find(&m) + if err != nil { + return nil + } + return &m +} diff --git a/app/operator/svc/svc_project.go b/app/operator/svc/svc_project.go index f301e05..d8d58b7 100644 --- a/app/operator/svc/svc_project.go +++ b/app/operator/svc/svc_project.go @@ -113,7 +113,7 @@ func ProjectList(c *gin.Context) { "id": utils.IntToStr(v.Id), "name": v.Name, "cid": utils.IntToStr(v.Cid), - "money": v.Money, + "money": utils.Comm(v.Money), "img": firstImg, "video_info": v.VideoInfo, "img_list": img, diff --git a/app/operator/svc/svc_task.go b/app/operator/svc/svc_task.go index 0e22c31..00904e9 100644 --- a/app/operator/svc/svc_task.go +++ b/app/operator/svc/svc_task.go @@ -5,10 +5,8 @@ import ( "applet/app/comm/e" "applet/app/comm/svc" "applet/app/comm/utils" + svc3 "applet/app/custom/svc" "applet/app/operator/md" - "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/lib/comm_plan" - md2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md" - svc2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/svc" "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/implement" "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/models" "encoding/json" @@ -118,7 +116,7 @@ func TaskList(c *gin.Context) { "settle_type": []map[string]string{ {"name": "T+1", "value": "0"}, {"name": "T+7", "value": "1"}, - {"name": "月结", "value": "2"}, + {"name": "T+30", "value": "2"}, }, "total": total, "list": hotTask, } @@ -154,6 +152,7 @@ func TaskDetail(c *gin.Context) { tmp["detail_info"] = DetailInfo } json.Unmarshal([]byte(hotTaskList.Label), &label) + tmp["label"] = label counts, _ := svc.MasterDb(c).Where("uid=? and task_id=?", user.Info.Uid, hotTaskList.Id).Count(&models.CampTaskOperatorTask{}) if counts > 0 { tmp["is_check"] = "1" @@ -184,19 +183,8 @@ LEFT JOIN camp_task_list ctl on ctot.task_id=ctl.id WHERE ctot.uid=%d order by ctot.id desc %s` sql = fmt.Sprintf(sql, user.Info.Uid, "limit "+utils.IntToStr((utils.StrToInt(args.P)-1)*utils.StrToInt(args.Size))+","+args.Size) nativeString, _ := db.QueryNativeString(svc.MasterDb(c), sql) - plan, commission1, virtualCoinMoneyRate := svc2.GetAllPlan(svc.MasterDb(c), c.GetString("mid")) - rmd := &md2.CommissionParam{} - cfg, _ := svc2.GetPlanCfg(svc.MasterDb(c), "camp_task", c.GetString("mid"), plan, commission1, virtualCoinMoneyRate, rmd) for _, v := range nativeString { - firstPrice := "0" - secondPrice := "0" - if cfg != nil { - fee, _, _, _ := svc2.CommFee(utils.StrToFloat64(v["price"]), cfg, "commission", rmd) - tmpPrice, _, _, _ := comm_plan.CalReturnAmountAndRatio(0, 0, 0, "own", fee, 0, cfg) - firstPrice = utils.Float64ToStr(tmpPrice) - tmpPrice1, _, _, _ := comm_plan.CalReturnAmountAndRatio(1, 0, 0, "own", fee, 0, cfg) - secondPrice = utils.Float64ToStr(tmpPrice1) - } + _, firstPrice, secondPrice, _, _ := svc3.CommPrice(c, v["price"]) orderCount := "0" commission := "0" sql1 := `select COUNT(*) as count,SUM(ctupor.amount) as amount diff --git a/app/router/router.go b/app/router/router.go index d3283f8..1c806f5 100644 --- a/app/router/router.go +++ b/app/router/router.go @@ -3,6 +3,7 @@ package router import ( "applet/app/cfg" "applet/app/comm/svc" + customHdl "applet/app/custom/hdl" "applet/app/mw" operatorHdl "applet/app/operator/hdl" storeHdl "applet/app/store/hdl" @@ -60,10 +61,8 @@ func routeStore(r *gin.RouterGroup) { r.Any("/alipay/pay/callback", storeHdl.AlipayCallBack) r.POST("/img/callback", storeHdl.FileImgCallback) - r.Use(mw.DB) // 以下接口需要用到数据库 - r.Use(mw.Checker) // 以下接口需要检查Header: platform - r.PUT("/img/upload", storeHdl.ImgReqUpload) - + r.Use(mw.DB) // 以下接口需要用到数据库 + r.Use(mw.Checker) // 以下接口需要检查Header: platform r.POST("/login", storeHdl.Login) //账号密码登陆 r.POST("/sms", storeHdl.Sms) //发验证码 r.POST("/register", storeHdl.Register) //注册 @@ -116,8 +115,32 @@ func routeStore(r *gin.RouterGroup) { func routeCustom(r *gin.RouterGroup) { r.Use(mw.DB) // 以下接口需要用到数据库 r.Use(mw.Checker) // 以下接口需要检查Header: platform - + r.POST("indexTaskList", customHdl.IndexTaskList) + r.POST("searchTaskList", customHdl.SearchTaskList) + r.GET("taskBase", customHdl.TaskBase) + r.POST("taskDetail", customHdl.TaskDetail) + r.GET("taskDetailNoticeCate", customHdl.TaskDetailNoticeCate) + r.POST("taskDetailNotice", customHdl.TaskDetailNotice) + r.GET("projectBase", customHdl.ProjectBase) + r.POST("/projectList", customHdl.ProjectList) + r.POST("/projectDetail", customHdl.ProjectDetail) + r.POST("/projectLikeList", customHdl.ProjectLikeList) + r.GET("/city", customHdl.City) + r.POST("/taskQrcodeSubmit", customHdl.TaskQrcodeSubmit) + r.POST("/taskQrcodeContinueSubmit", customHdl.TaskQrcodeContinueSubmit) + r.POST("/taskQrcodeDetail", customHdl.TaskQrcodeDetail) + r.POST("/taskQrcodeOrder", customHdl.TaskQrcodeOrder) + r.POST("/taskQrcodeOrderCate", customHdl.TaskQrcodeOrderCate) + r.GET("/taskMyCate", customHdl.TaskMyCate) r.Use(mw.AuthJWT) // 以下接口需要JWT验证 + r.POST("/projectLike", customHdl.ProjectLike) + r.POST("/taskQrcodeApply", customHdl.TaskQrcodeApply) + r.POST("/taskQrcodeList", customHdl.TaskQrcodeList) + r.POST("/taskMyList", customHdl.TaskMyList) + r.POST("/taskMyTotal", customHdl.TaskMyTotal) + r.POST("/taskIncome", customHdl.TaskIncome) + r.POST("/taskIncomeList", customHdl.TaskIncomeList) + r.POST("/taskIncomeTaskList", customHdl.TaskIncomeTaskList) } func routeOperator(r *gin.RouterGroup) { diff --git a/app/store/md/md_project.go b/app/store/md/md_project.go index 889e0df..4b3bf56 100644 --- a/app/store/md/md_project.go +++ b/app/store/md/md_project.go @@ -1,9 +1,13 @@ package md type ProjectReq struct { - P string `json:"p"` - Size string `json:"size"` - Cid string `json:"cid"` + P string `json:"p"` + Size string `json:"size"` + Cid string `json:"cid"` + Keyword string `json:"keyword"` + Price string `json:"price"` + Sort string `json:"sort"` + Id string `json:"id"` } type ProjectSaveReq struct { Id string `json:"id"` diff --git a/app/store/md/md_task.go b/app/store/md/md_task.go index f5dd2dd..0c00f52 100644 --- a/app/store/md/md_task.go +++ b/app/store/md/md_task.go @@ -27,6 +27,7 @@ type TaskDetail struct { VideoCourse string `json:"video_course" xorm:"comment('视频教程') VARCHAR(255)"` Instructions string `json:"instructions" xorm:"comment('特殊说明') VARCHAR(255)"` Announcement string `json:"announcement"` + Remark string `json:"remark"` } type TaskAllDetail struct { IsCheck string `json:"is_check"` diff --git a/app/store/svc/svc_project.go b/app/store/svc/svc_project.go index c1a591e..9323a59 100644 --- a/app/store/svc/svc_project.go +++ b/app/store/svc/svc_project.go @@ -69,7 +69,7 @@ func AllProjectList(c *gin.Context) { "id": utils.IntToStr(v.Id), "name": v.Name, "cid": utils.IntToStr(v.Cid), - "money": v.Money, + "money": utils.Comm(v.Money), "img": firstImg, "video_info": v.VideoInfo, "img_list": img, @@ -131,6 +131,7 @@ func ProjectList(c *gin.Context) { "name": v.Name, "cid": utils.IntToStr(v.Cid), "money": v.Money, + "money_str": utils.Comm(v.Money), "logo": v.Logo, "video_info": v.VideoInfo, "img": img, diff --git a/app/store/svc/svc_task.go b/app/store/svc/svc_task.go index c1b68b1..052ca1c 100644 --- a/app/store/svc/svc_task.go +++ b/app/store/svc/svc_task.go @@ -68,6 +68,7 @@ func TaskList(c *gin.Context) { tmp := map[string]string{ "id": utils.IntToStr(v.Id), "name": v.Name, + "remark": v.Remark, "num": utils.IntToStr(v.Num), "success_num": utils.Int64ToStr(orderCount), "apply_time": v.ApplyTime.Format("2006-01-02 15:04:05"), @@ -158,7 +159,7 @@ func TaskBase(c *gin.Context) { "settle_type": []map[string]string{ {"name": "T+1", "value": "0"}, {"name": "T+7", "value": "1"}, - {"name": "月结", "value": "2"}, + {"name": "T+30", "value": "2"}, }, "audit_type": []map[string]string{ {"name": "待审核", "value": "0"}, @@ -185,6 +186,7 @@ func TaskDetail(c *gin.Context) { taskDetailDb := implement.NewCampTaskDetailDb(svc.MasterDb(c)) taskDetail, _ := taskDetailDb.GetCampTaskDetailById(args["id"]) res = md.TaskDetail{ + Remark: task.Remark, Id: utils.IntToStr(task.Id), Name: task.Name, Logo: svc.ImageFormat(c, task.Logo), @@ -306,6 +308,16 @@ func TaskSave(c *gin.Context) { return } } + cb, err := svc.HandleCampTaskLockDistributedLock(c.GetString("mid"), utils.IntToStr(task.Id), "camp_task") + if err != nil { + sess.Rollback() + e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试")) + return + } + // 处理完毕释放锁 + if cb != nil { + defer cb() + } task.State = 0 task.UpDownState = 0 //要先下架 task.AuditType = 2 @@ -318,6 +330,7 @@ func TaskSave(c *gin.Context) { task.UpdateTime = time.Now() task.Price = args.Price + task.Remark = args.Remark task.Name = args.Name task.Logo = args.Logo task.FirstCid = utils.StrToInt(args.FirstCid) @@ -391,6 +404,15 @@ func TaskUp(c *gin.Context) { e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试")) return } + cb, err := svc.HandleCampTaskLockDistributedLock(c.GetString("mid"), args["id"], "camp_task") + if err != nil { + e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试")) + return + } + // 处理完毕释放锁 + if cb != nil { + defer cb() + } sess := svc.MasterDb(c).NewSession() defer sess.Close() sess.Begin() @@ -469,6 +491,15 @@ func TaskDown(c *gin.Context) { e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试")) return } + cb, err := svc.HandleCampTaskLockDistributedLock(c.GetString("mid"), args["id"], "camp_task") + if err != nil { + e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试")) + return + } + // 处理完毕释放锁 + if cb != nil { + defer cb() + } task.State = 0 task.AuditType = 1 task.ApplyTime = time.Now() @@ -535,6 +566,15 @@ func TaskChangeNum(c *gin.Context) { e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试")) return } + cb, err := svc.HandleCampTaskLockDistributedLock(c.GetString("mid"), args["id"], "camp_task") + if err != nil { + e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试")) + return + } + // 处理完毕释放锁 + if cb != nil { + defer cb() + } sess := svc.MasterDb(c).NewSession() defer sess.Close() sess.Begin() diff --git a/app/store/svc/svc_task_order.go b/app/store/svc/svc_task_order.go index 8d6a0eb..e8bbd7a 100644 --- a/app/store/svc/svc_task_order.go +++ b/app/store/svc/svc_task_order.go @@ -48,7 +48,7 @@ func TaskWaitAuditOrder(c *gin.Context) { sess.Join("LEFT", "user_level", "user_level.id = camp_task_user_promotion_order.user_lv") count, _ := sess.Limit(utils.StrToInt(args.Size), (utils.StrToInt(args.P)-1)*utils.StrToInt(args.Size)).OrderBy("camp_task_user_promotion_order.id desc").FindAndCount(&data) stateType := []string{"审核中", "审核通过", "审核拒绝"} - settleType := []string{"T+1", "T+7", "月结"} + settleType := []string{"T+1", "T+7", "T+30"} settleStateType := []string{"未结算", "结算成功", "结算失败"} for _, v := range data { var detail = make([]string, 0) @@ -150,7 +150,8 @@ func TaskWaitSettleOrder(c *gin.Context) { sess.Join("LEFT", "user_level", "user_level.id = camp_task_user_promotion_order.user_lv") count, _ := sess.Limit(utils.StrToInt(args.Size), (utils.StrToInt(args.P)-1)*utils.StrToInt(args.Size)).OrderBy("camp_task_user_promotion_order.id desc").FindAndCount(&data) stateType := []string{"审核中", "审核通过", "审核拒绝"} - settleType := []string{"T+1", "T+7", "月结"} + settleType := []string{"T+1", "T+7", "T+30"} + settleStateType := []string{"未结算", "结算成功", "结算失败"} for _, v := range data { var detail = make([]string, 0) diff --git a/go.mod b/go.mod index 1c0e923..e6296a3 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module applet go 1.19 -//replace code.fnuoos.com/go_rely_warehouse/zyos_model.git => E:/company/go_rely_warehouse/zyos_model/ +replace code.fnuoos.com/go_rely_warehouse/zyos_model.git => E:/company/go_rely_warehouse/zyos_model/ require ( code.fnuoos.com/go_rely_warehouse/zyos_go_day_luck_draw.git v1.2.1 @@ -45,10 +45,12 @@ require ( xorm.io/xorm v1.3.10 ) -require code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git v1.1.21-0.20250801053019-55ac588e769e +require ( + code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git v1.1.21-0.20250801053019-55ac588e769e + code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20250912074810-4b419010bd06 +) require ( - code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20250911040453-a1190e8eb8ed // indirect github.com/KyleBanks/depth v1.2.1 // indirect github.com/PuerkitoBio/goquery v1.6.1 // indirect github.com/PuerkitoBio/purell v1.1.1 // indirect