劲创营---任务项目
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

svc_task.go 22 KiB

3 veckor sedan
6 dagar sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
6 dagar sedan
3 veckor sedan
6 dagar sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
4 dagar sedan
3 veckor sedan
4 dagar sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
2 veckor sedan
3 veckor sedan
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. package svc
  2. import (
  3. "applet/app/comm/db"
  4. "applet/app/comm/e"
  5. "applet/app/comm/svc"
  6. "applet/app/comm/utils"
  7. "applet/app/comm/utils/cache"
  8. "applet/app/store/md"
  9. "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/implement"
  10. "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/models"
  11. "encoding/json"
  12. "fmt"
  13. "github.com/gin-gonic/gin"
  14. "strings"
  15. "time"
  16. )
  17. func TaskList(c *gin.Context) {
  18. var args md.TaskReq
  19. if err := c.ShouldBindJSON(&args); err != nil {
  20. e.OutErr(c, e.ERR_INVALID_ARGS)
  21. return
  22. }
  23. store := svc.GetCampStore(c)
  24. storeId := svc.GetCampStoreId(c)
  25. list := make([]map[string]string, 0)
  26. var data = make([]models.CampTaskList, 0)
  27. contact := []string{"0"}
  28. if store.Pid > 0 {
  29. contact = append(contact, utils.IntToStr(store.Id))
  30. }
  31. sess := svc.MasterDb(c).Where("store_id=? and is_delete=0", storeId).In("contact", contact)
  32. if args.TaskType != "" {
  33. sess.And("first_cid=?", args.TaskType)
  34. }
  35. if args.ApplyType != "" {
  36. sess.And("audit_type=?", args.ApplyType)
  37. }
  38. if args.StartTime != "" {
  39. sess.And("apply_time>=?", args.StartTime)
  40. }
  41. if args.EndTime != "" {
  42. sess.And("apply_time<=?", args.EndTime)
  43. }
  44. count, _ := sess.Limit(utils.StrToInt(args.Size), (utils.StrToInt(args.P)-1)*utils.StrToInt(args.Size)).OrderBy("apply_time desc,id desc").FindAndCount(&data)
  45. applyType := []string{"", "下架申请", "上架申请"}
  46. stateType := []string{"审核中", "审核通过", "审核拒绝"}
  47. taskCate := make([]map[string]string, 0)
  48. taskCateList := make([]models.CampTaskCate, 0)
  49. svc.MasterDb(c).Where("is_show_store=? and is_show=?", 1, 1).OrderBy("sort desc,id desc").Find(&taskCateList)
  50. taskAllCate := make([]map[string]interface{}, 0)
  51. for _, v := range taskCateList {
  52. if v.Pid > 0 {
  53. continue
  54. }
  55. tmp := map[string]string{
  56. "name": v.Name, "value": utils.IntToStr(v.Id),
  57. }
  58. taskCate = append(taskCate, tmp)
  59. listTmp := make([]map[string]string, 0)
  60. allTmp := map[string]interface{}{
  61. "name": v.Name, "value": utils.IntToStr(v.Id), "list": listTmp,
  62. }
  63. taskAllCate = append(taskAllCate, allTmp)
  64. }
  65. for _, v := range data {
  66. orderCount, _ := svc.MasterDb(c).Where("store_id=? and state=1 and task_id=?", v.StoreId, v.Id).Count(&models.CampTaskUserPromotionOrder{})
  67. tmp := map[string]string{
  68. "id": utils.IntToStr(v.Id),
  69. "name": v.Name,
  70. "remark": v.Remark,
  71. "num": utils.IntToStr(v.Num),
  72. "success_num": utils.Int64ToStr(orderCount),
  73. "apply_time": v.ApplyTime.Format("2006-01-02 15:04:05"),
  74. "price": v.Price,
  75. "task_type": "",
  76. "apply_type": applyType[v.AuditType],
  77. "state": utils.IntToStr(v.State),
  78. "state_str": stateType[v.State],
  79. "reason": v.Reason,
  80. }
  81. for _, v1 := range taskCate {
  82. if v1["value"] == utils.IntToStr(v.FirstCid) {
  83. tmp["task_type"] = v1["name"]
  84. }
  85. }
  86. if v.State != 2 {
  87. tmp["reason"] = ""
  88. }
  89. list = append(list, tmp)
  90. }
  91. for k, v := range taskAllCate {
  92. listTmp := make([]map[string]string, 0)
  93. for _, v1 := range taskCateList {
  94. if v["value"] != utils.IntToStr(v1.Pid) {
  95. continue
  96. }
  97. allTmp := map[string]string{
  98. "name": v1.Name, "value": utils.IntToStr(v1.Id),
  99. }
  100. listTmp = append(listTmp, allTmp)
  101. }
  102. taskAllCate[k]["list"] = listTmp
  103. }
  104. director_list_map := make([]models.CampTaskStoreUser, 0)
  105. director_list := make([]map[string]string, 0)
  106. svc.MasterDb(c).Where("pid=?", storeId).Find(&director_list_map)
  107. for _, v := range director_list_map {
  108. tmp := map[string]string{"name": v.Name, "value": utils.IntToStr(v.Id)}
  109. director_list = append(director_list, tmp)
  110. }
  111. res := map[string]interface{}{
  112. "list": list,
  113. "task_type": taskCate,
  114. "director_list": director_list,
  115. "apply_type": []map[string]string{
  116. {"name": "上架申请", "value": "2"},
  117. {"name": "下架申请", "value": "1"},
  118. },
  119. "total": count,
  120. }
  121. e.OutSuc(c, res, nil)
  122. return
  123. }
  124. func TaskBase(c *gin.Context) {
  125. taskCate := make([]map[string]string, 0)
  126. taskCateList := make([]models.CampTaskCate, 0)
  127. svc.MasterDb(c).Where("is_show_store=? and is_show=?", 1, 1).OrderBy("sort desc,id desc").Find(&taskCateList)
  128. taskAllCate := make([]map[string]interface{}, 0)
  129. for _, v := range taskCateList {
  130. if v.Pid > 0 {
  131. continue
  132. }
  133. tmp := map[string]string{
  134. "name": v.Name, "value": utils.IntToStr(v.Id),
  135. }
  136. taskCate = append(taskCate, tmp)
  137. listTmp := make([]map[string]string, 0)
  138. allTmp := map[string]interface{}{
  139. "name": v.Name, "value": utils.IntToStr(v.Id), "list": listTmp,
  140. }
  141. taskAllCate = append(taskAllCate, allTmp)
  142. }
  143. for k, v := range taskAllCate {
  144. listTmp := make([]map[string]string, 0)
  145. for _, v1 := range taskCateList {
  146. if v["value"] != utils.IntToStr(v1.Pid) {
  147. continue
  148. }
  149. allTmp := map[string]string{
  150. "name": v1.Name, "value": utils.IntToStr(v1.Id),
  151. }
  152. listTmp = append(listTmp, allTmp)
  153. }
  154. taskAllCate[k]["list"] = listTmp
  155. }
  156. storeId := svc.GetCampStoreId(c)
  157. var store models.CampTaskStoreUser
  158. svc.MasterDb(c).Where("id=?", storeId).Get(&store)
  159. settleType := []map[string]string{
  160. {"name": "T+1", "value": "0"},
  161. }
  162. if strings.Contains(store.TaskType, "1") {
  163. settleType = append(settleType, map[string]string{"name": "T+7", "value": "1"})
  164. }
  165. if strings.Contains(store.TaskType, "2") {
  166. settleType = append(settleType, map[string]string{"name": "T+30", "value": "2"})
  167. }
  168. res := map[string]interface{}{
  169. "all_cate_list": taskAllCate,
  170. "settle_type": settleType,
  171. "audit_type": []map[string]string{
  172. {"name": "待审核", "value": "0"},
  173. {"name": "审核通过", "value": "1"},
  174. {"name": "审核拒绝", "value": "2"},
  175. },
  176. }
  177. e.OutSuc(c, res, nil)
  178. return
  179. }
  180. func TaskDetail(c *gin.Context) {
  181. var args map[string]string
  182. if err := c.ShouldBindJSON(&args); err != nil {
  183. e.OutErr(c, e.ERR_INVALID_ARGS)
  184. return
  185. }
  186. taskDb := implement.NewCampTaskListDb(svc.MasterDb(c))
  187. task, _ := taskDb.GetCampTaskById(args["id"])
  188. res := md.TaskDetail{}
  189. res.Contact = ""
  190. res.Label = make([]string, 0)
  191. res.DetailInfo = make([]string, 0)
  192. if task != nil {
  193. taskDetailDb := implement.NewCampTaskDetailDb(svc.MasterDb(c))
  194. taskDetail, _ := taskDetailDb.GetCampTaskDetailById(args["id"])
  195. res = md.TaskDetail{
  196. Remark: task.Remark,
  197. Id: utils.IntToStr(task.Id),
  198. Name: task.Name,
  199. Logo: svc.ImageFormat(c, task.Logo),
  200. Price: task.Price,
  201. Contact: task.Contact,
  202. Num: utils.IntToStr(task.Num),
  203. FirstCid: utils.IntToStr(task.FirstCid),
  204. SecondCid: utils.IntToStr(task.SecondCid),
  205. SettleType: utils.IntToStr(task.SettleType),
  206. StartTime: task.StartTime.Format("2006-01-02 15:04:05"),
  207. EndTime: task.EndTime.Format("2006-01-02 15:04:05"),
  208. }
  209. if taskDetail != nil {
  210. DetailInfo := make([]string, 0)
  211. json.Unmarshal([]byte(taskDetail.DetailInfo), &DetailInfo)
  212. res.DetailInfo = DetailInfo
  213. res.VideoCourse = taskDetail.VideoCourse
  214. res.Notice = taskDetail.Notice
  215. res.Instructions = taskDetail.Instructions
  216. }
  217. NewCampTaskNoticeDb := implement.NewCampTaskNoticeDb(svc.MasterDb(c))
  218. CampTaskNotice, _ := NewCampTaskNoticeDb.GetCampTaskNoticeByTaskId(args["id"])
  219. if CampTaskNotice != nil {
  220. res.Announcement = CampTaskNotice.Content
  221. }
  222. label := make([]string, 0)
  223. json.Unmarshal([]byte(task.Label), &label)
  224. res.Label = label
  225. }
  226. e.OutSuc(c, res, nil)
  227. return
  228. }
  229. func TaskSave(c *gin.Context) {
  230. var args md.TaskDetail
  231. if err := c.ShouldBindJSON(&args); err != nil {
  232. e.OutErr(c, e.ERR_INVALID_ARGS)
  233. return
  234. }
  235. store := svc.GetCampStore(c)
  236. storeId := svc.GetCampStoreId(c)
  237. if store.Pid > 0 {
  238. args.Contact = utils.IntToStr(store.Id)
  239. }
  240. if utils.StrToFloat64(args.Num) <= 0 || utils.StrToFloat64(args.Price) <= 0 {
  241. e.OutErr(c, e.ERR, e.NewErr(400000, "单价或数量不能为空"))
  242. return
  243. }
  244. amountDb := implement.NewCampTaskStoreUserAmountDb(svc.MasterDb(c))
  245. userAmount, _ := amountDb.GetCampTaskAmountByStoreId(utils.IntToStr(storeId))
  246. if userAmount == nil {
  247. e.OutErr(c, e.ERR, e.NewErr(400000, "预存余额不足"))
  248. return
  249. }
  250. // 加锁 防止并发提取
  251. mutexKey := fmt.Sprintf("%s:camp_task:%d", c.GetString("mid"), storeId)
  252. withdrawAvailable, err := cache.Do("SET", mutexKey, 1, "EX", 5, "NX")
  253. if err != nil {
  254. e.OutErr(c, e.ERR, err)
  255. return
  256. }
  257. if withdrawAvailable != "OK" {
  258. e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试"))
  259. return
  260. }
  261. sess := svc.MasterDb(c).NewSession()
  262. defer sess.Close()
  263. sess.Begin()
  264. var task *models.CampTaskList
  265. var taskDetail *models.CampTaskDetail
  266. var taskNotice *models.CampTaskNotice
  267. if utils.StrToInt(args.Id) > 0 {
  268. taskDb := implement.NewCampTaskListDb(svc.MasterDb(c))
  269. task, _ = taskDb.GetCampTaskByIdSess(sess, args.Id)
  270. taskDetailDb := implement.NewCampTaskDetailDb(svc.MasterDb(c))
  271. taskDetail, _ = taskDetailDb.GetCampTaskDetailByIdSess(sess, args.Id)
  272. taskNoticeDb := implement.NewCampTaskNoticeDb(svc.MasterDb(c))
  273. taskNotice, _ = taskNoticeDb.GetCampTaskNoticeByTaskIdSess(sess, args.Id)
  274. if task.State == 0 {
  275. sess.Rollback()
  276. e.OutErr(c, 400, e.NewErr(400, "任务审核中"))
  277. return
  278. }
  279. } else {
  280. task = &models.CampTaskList{
  281. CreateTime: time.Now(),
  282. UpdateTime: time.Now(),
  283. StoreId: storeId,
  284. Contact: "0",
  285. Sum: utils.StrToInt(args.Num),
  286. Num: utils.StrToInt(args.Num),
  287. }
  288. insert, _ := sess.Insert(task)
  289. if insert == 0 {
  290. sess.Rollback()
  291. e.OutErr(c, 400, e.NewErr(400, "发布失败"))
  292. return
  293. }
  294. taskDetail = &models.CampTaskDetail{
  295. TaskId: task.Id,
  296. }
  297. insert, _ = sess.Insert(taskDetail)
  298. if insert == 0 {
  299. sess.Rollback()
  300. e.OutErr(c, 400, e.NewErr(400, "发布失败"))
  301. return
  302. }
  303. taskNotice = &models.CampTaskNotice{
  304. TaskId: task.Id,
  305. StoreId: storeId,
  306. Title: "任务公告",
  307. Type: "announcement",
  308. CreateTime: time.Now(),
  309. SendTime: time.Now(),
  310. }
  311. insert, _ = sess.Insert(taskNotice)
  312. if insert == 0 {
  313. sess.Rollback()
  314. e.OutErr(c, 400, e.NewErr(400, "发布失败"))
  315. return
  316. }
  317. }
  318. cb, err := svc.HandleCampTaskLockDistributedLock(c.GetString("mid"), utils.IntToStr(task.Id), "camp_task")
  319. if err != nil {
  320. sess.Rollback()
  321. e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试"))
  322. return
  323. }
  324. // 处理完毕释放锁
  325. if cb != nil {
  326. defer cb()
  327. }
  328. task.State = 0
  329. task.UpDownState = 0 //要先下架
  330. task.AuditType = 2
  331. //判断下要不要改数量
  332. if task.Num != utils.StrToInt(args.Num) {
  333. task.AuditType = 3
  334. task.OldNum = task.Num
  335. }
  336. task.Num = utils.StrToInt(args.Num)
  337. task.UpdateTime = time.Now()
  338. task.Price = args.Price
  339. task.Remark = args.Remark
  340. task.Name = args.Name
  341. task.Logo = args.Logo
  342. task.FirstCid = utils.StrToInt(args.FirstCid)
  343. task.SecondCid = utils.StrToInt(args.SecondCid)
  344. task.SettleType = utils.StrToInt(args.SettleType)
  345. task.StartTime = utils.TimeParseStd(args.StartTime)
  346. task.EndTime = utils.TimeParseStd(args.EndTime)
  347. task.Label = utils.SerializeStr(args.Label)
  348. if args.Contact == "" {
  349. args.Contact = "0"
  350. }
  351. task.Contact = args.Contact
  352. task.UpdateTime = time.Now()
  353. task.ApplyTime = time.Now()
  354. taskDetail.Notice = args.Notice
  355. taskDetail.DetailInfo = utils.SerializeStr(args.DetailInfo)
  356. taskDetail.VideoCourse = args.VideoCourse
  357. taskDetail.Instructions = args.Instructions
  358. taskNotice.Content = args.Announcement
  359. _, err = sess.Where("id=?", task.Id).Update(task)
  360. if err != nil {
  361. sess.Rollback()
  362. e.OutErr(c, 400, e.NewErr(400, "发布失败"))
  363. return
  364. }
  365. _, err = sess.Where("id=?", taskNotice.Id).Update(taskNotice)
  366. if err != nil {
  367. sess.Rollback()
  368. e.OutErr(c, 400, e.NewErr(400, "发布失败"))
  369. return
  370. }
  371. _, err = sess.Where("id=?", taskDetail.Id).Update(taskDetail)
  372. if err != nil {
  373. sess.Rollback()
  374. e.OutErr(c, 400, e.NewErr(400, "发布失败"))
  375. return
  376. }
  377. if task.SettleType == 0 {
  378. sql := `select SUM(price*num) as amount from camp_task_list where is_delete=0 and store_id=? and state in(0,1) and settle_type=0 and audit_type in(2,3)`
  379. nativeString, _ := db.QueryNativeStringWithSession(sess, sql, storeId)
  380. var amount float64 = 0
  381. for _, v := range nativeString {
  382. amount = utils.StrToFloat64(v["amount"])
  383. }
  384. if utils.StrToFloat64(userAmount.Amount) < amount {
  385. sess.Rollback()
  386. e.OutErr(c, e.ERR, e.NewErr(400000, "预存余额不足"))
  387. return
  388. }
  389. }
  390. sess.Commit()
  391. e.OutSuc(c, "success", nil)
  392. return
  393. }
  394. func TaskUp(c *gin.Context) {
  395. var args map[string]string
  396. if err := c.ShouldBindJSON(&args); err != nil {
  397. e.OutErr(c, e.ERR_INVALID_ARGS)
  398. return
  399. }
  400. storeId := svc.GetCampStoreId(c)
  401. // 加锁 防止并发提取
  402. mutexKey := fmt.Sprintf("%s:camp_task_up:%d", c.GetString("mid"), storeId)
  403. withdrawAvailable, err := cache.Do("SET", mutexKey, 1, "EX", 5, "NX")
  404. if err != nil {
  405. e.OutErr(c, e.ERR, err)
  406. return
  407. }
  408. if withdrawAvailable != "OK" {
  409. e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试"))
  410. return
  411. }
  412. cb, err := svc.HandleCampTaskLockDistributedLock(c.GetString("mid"), args["id"], "camp_task")
  413. if err != nil {
  414. e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试"))
  415. return
  416. }
  417. // 处理完毕释放锁
  418. if cb != nil {
  419. defer cb()
  420. }
  421. sess := svc.MasterDb(c).NewSession()
  422. defer sess.Close()
  423. sess.Begin()
  424. taskDb := implement.NewCampTaskListDb(svc.MasterDb(c))
  425. task, _ := taskDb.GetCampTaskByIdSess(sess, args["id"])
  426. if task.UpDownState == 1 {
  427. sess.Rollback()
  428. e.OutErr(c, 400, e.NewErr(400, "该任务已上架"))
  429. return
  430. }
  431. if task.State == 0 {
  432. sess.Rollback()
  433. e.OutErr(c, 400, e.NewErr(400, "该任务正在审核"))
  434. return
  435. }
  436. task.State = 0
  437. task.AuditType = 2
  438. task.ApplyTime = time.Now()
  439. task.UpdateTime = time.Now()
  440. update, _ := sess.Where("id=?", task.Id).Cols("state,audit_type,apply_time,update_time").Update(task)
  441. if update == 0 {
  442. sess.Rollback()
  443. e.OutErr(c, 400, e.NewErr(400, "上架申请失败"))
  444. return
  445. }
  446. if task.SettleType == 0 {
  447. sql := `select SUM(price*num) as amount from camp_task_list where is_delete=0 and store_id=? and state in(0,1) and settle_type=0 and audit_type in(2,3)`
  448. nativeString, _ := db.QueryNativeStringWithSession(sess, sql, storeId)
  449. var amount float64 = 0
  450. for _, v := range nativeString {
  451. amount = utils.StrToFloat64(v["amount"])
  452. }
  453. amountDb := implement.NewCampTaskStoreUserAmountDb(svc.MasterDb(c))
  454. userAmount, _ := amountDb.GetCampTaskAmountByStoreId(utils.IntToStr(storeId))
  455. if userAmount == nil {
  456. sess.Rollback()
  457. e.OutErr(c, e.ERR, e.NewErr(400000, "预存余额不足"))
  458. return
  459. }
  460. if utils.StrToFloat64(userAmount.Amount) < amount {
  461. sess.Rollback()
  462. e.OutErr(c, e.ERR, e.NewErr(400000, "预存余额不足"))
  463. return
  464. }
  465. }
  466. sess.Commit()
  467. e.OutSuc(c, "success", nil)
  468. return
  469. }
  470. func TaskDown(c *gin.Context) {
  471. var args map[string]string
  472. if err := c.ShouldBindJSON(&args); err != nil {
  473. e.OutErr(c, e.ERR_INVALID_ARGS)
  474. return
  475. }
  476. taskDb := implement.NewCampTaskListDb(svc.MasterDb(c))
  477. task, _ := taskDb.GetCampTaskById(args["id"])
  478. if task.UpDownState == 0 {
  479. e.OutErr(c, 400, e.NewErr(400, "该任务已下架"))
  480. return
  481. }
  482. if task.State == 0 {
  483. e.OutErr(c, 400, e.NewErr(400, "该任务正在审核"))
  484. return
  485. }
  486. storeId := svc.GetCampStoreId(c)
  487. // 加锁 防止并发提取
  488. mutexKey := fmt.Sprintf("%s:camp_task_down:%d", c.GetString("mid"), storeId)
  489. withdrawAvailable, err := cache.Do("SET", mutexKey, 1, "EX", 5, "NX")
  490. if err != nil {
  491. e.OutErr(c, e.ERR, err)
  492. return
  493. }
  494. if withdrawAvailable != "OK" {
  495. e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试"))
  496. return
  497. }
  498. cb, err := svc.HandleCampTaskLockDistributedLock(c.GetString("mid"), args["id"], "camp_task")
  499. if err != nil {
  500. e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试"))
  501. return
  502. }
  503. // 处理完毕释放锁
  504. if cb != nil {
  505. defer cb()
  506. }
  507. task.State = 0
  508. task.AuditType = 1
  509. task.ApplyTime = time.Now()
  510. task.UpdateTime = time.Now()
  511. update, _ := svc.MasterDb(c).Where("id=?", task.Id).Cols("state,audit_type,apply_time,update_time").Update(task)
  512. if update == 0 {
  513. e.OutErr(c, 400, e.NewErr(400, "上架申请失败"))
  514. return
  515. }
  516. e.OutSuc(c, "success", nil)
  517. return
  518. }
  519. func TaskUpList(c *gin.Context) {
  520. var args md.TaskReq
  521. if err := c.ShouldBindJSON(&args); err != nil {
  522. e.OutErr(c, e.ERR_INVALID_ARGS)
  523. return
  524. }
  525. storeId := svc.GetCampStoreId(c)
  526. list := make([]map[string]string, 0)
  527. var data = make([]models.CampTaskList, 0)
  528. sess := svc.MasterDb(c).Where("store_id=? and is_delete=0", storeId)
  529. sess.And("up_down_state=?", 1)
  530. count, _ := sess.Limit(utils.StrToInt(args.Size), (utils.StrToInt(args.P)-1)*utils.StrToInt(args.Size)).OrderBy("apply_time desc,id desc").FindAndCount(&data)
  531. for _, v := range data {
  532. orderCount, _ := svc.MasterDb(c).Where("store_id=? and task_id=?", v.StoreId, v.Id).Count(&models.CampTaskUserPromotionOrder{})
  533. orderWaitCount, _ := svc.MasterDb(c).Where("store_id=? and state=0 and task_id=?", v.StoreId, v.Id).Count(&models.CampTaskUserPromotionOrder{})
  534. tmp := map[string]string{
  535. "id": utils.IntToStr(v.Id),
  536. "name": v.Name,
  537. "num": utils.IntToStr(v.Num),
  538. "sum": utils.IntToStr(v.Num + int(orderCount)),
  539. "success_num": utils.Int64ToStr(orderCount),
  540. "wait_num": utils.Int64ToStr(orderWaitCount),
  541. "up_time": v.AuditTime.Format("2006-01-02 15:04:05"),
  542. "price": v.Price,
  543. }
  544. list = append(list, tmp)
  545. }
  546. res := map[string]interface{}{
  547. "list": list,
  548. "total": count,
  549. }
  550. e.OutSuc(c, res, nil)
  551. return
  552. }
  553. func TaskChangeNum(c *gin.Context) {
  554. var args map[string]string
  555. if err := c.ShouldBindJSON(&args); err != nil {
  556. e.OutErr(c, e.ERR_INVALID_ARGS)
  557. return
  558. }
  559. storeId := svc.GetCampStoreId(c)
  560. // 加锁 防止并发提取
  561. mutexKey := fmt.Sprintf("%s:camp_task_change_num:%d", c.GetString("mid"), storeId)
  562. withdrawAvailable, err := cache.Do("SET", mutexKey, 1, "EX", 5, "NX")
  563. if err != nil {
  564. e.OutErr(c, e.ERR, err)
  565. return
  566. }
  567. if withdrawAvailable != "OK" {
  568. e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试"))
  569. return
  570. }
  571. cb, err := svc.HandleCampTaskLockDistributedLock(c.GetString("mid"), args["id"], "camp_task")
  572. if err != nil {
  573. e.OutErr(c, e.ERR, e.NewErr(400000, "操作过快,请稍后再试"))
  574. return
  575. }
  576. // 处理完毕释放锁
  577. if cb != nil {
  578. defer cb()
  579. }
  580. sess := svc.MasterDb(c).NewSession()
  581. defer sess.Close()
  582. sess.Begin()
  583. taskDb := implement.NewCampTaskListDb(svc.MasterDb(c))
  584. task, _ := taskDb.GetCampTaskByIdSess(sess, args["id"])
  585. if task.State == 0 {
  586. sess.Rollback()
  587. e.OutErr(c, 400, e.NewErr(400, "该任务正在审核"))
  588. return
  589. }
  590. if task.Num == utils.StrToInt(args["num"]) {
  591. sess.Rollback()
  592. e.OutErr(c, 400, e.NewErr(400, "数量未变化,修改失败"))
  593. return
  594. }
  595. task.OldNum = task.Num
  596. task.Num = utils.StrToInt(args["num"])
  597. task.State = 0
  598. task.UpDownState = 0
  599. task.AuditType = 3
  600. task.ApplyTime = time.Now()
  601. task.UpdateTime = time.Now()
  602. update, _ := sess.Where("id=?", task.Id).Cols("state,audit_type,apply_time,update_time,old_num").Update(task)
  603. if update == 0 {
  604. sess.Rollback()
  605. e.OutErr(c, 400, e.NewErr(400, "上架申请失败"))
  606. return
  607. }
  608. if task.SettleType == 0 {
  609. sql := `select SUM(price*num) as amount from camp_task_list where is_delete=0 and store_id=? and state in(0,1) and settle_type=0 and audit_type in(2,3)`
  610. nativeString, _ := db.QueryNativeStringWithSession(sess, sql, storeId)
  611. var amount float64 = 0
  612. for _, v := range nativeString {
  613. amount = utils.StrToFloat64(v["amount"])
  614. }
  615. amountDb := implement.NewCampTaskStoreUserAmountDb(svc.MasterDb(c))
  616. userAmount, _ := amountDb.GetCampTaskAmountByStoreId(utils.IntToStr(storeId))
  617. if userAmount == nil {
  618. sess.Rollback()
  619. e.OutErr(c, e.ERR, e.NewErr(400000, "预存余额不足"))
  620. return
  621. }
  622. if utils.StrToFloat64(userAmount.Amount) < amount {
  623. sess.Rollback()
  624. e.OutErr(c, e.ERR, e.NewErr(400000, "预存余额不足"))
  625. return
  626. }
  627. }
  628. sess.Commit()
  629. e.OutSuc(c, "success", nil)
  630. return
  631. }
  632. func TaskAllList(c *gin.Context) {
  633. var args md.TaskReq
  634. if err := c.ShouldBindJSON(&args); err != nil {
  635. e.OutErr(c, e.ERR_INVALID_ARGS)
  636. return
  637. }
  638. list := make([]map[string]string, 0)
  639. var data = make([]models.CampTaskList, 0)
  640. sess := svc.MasterDb(c).Where("up_down_state=? and is_delete=0", 1)
  641. if args.TaskType != "" {
  642. sess.And("first_cid=?", args.TaskType)
  643. }
  644. if args.SettleType != "" {
  645. sess.And("settle_type=?", args.SettleType)
  646. }
  647. count, _ := sess.Limit(utils.StrToInt(args.Size), (utils.StrToInt(args.P)-1)*utils.StrToInt(args.Size)).OrderBy("success_num desc,id desc").FindAndCount(&data)
  648. for _, v := range data {
  649. tmp := map[string]string{
  650. "id": utils.IntToStr(v.Id),
  651. "name": v.Name,
  652. "price": v.Price,
  653. "num": utils.IntToStr(v.Num),
  654. "icon": svc.ImageFormat(c, v.Logo),
  655. "timer": v.StartTime.Format("2006-01-02") + "至" + v.EndTime.Format("2006-01-02"),
  656. }
  657. list = append(list, tmp)
  658. }
  659. res := map[string]interface{}{
  660. "list": list,
  661. "total": count,
  662. }
  663. e.OutSuc(c, res, nil)
  664. return
  665. }
  666. func TaskAllDetail(c *gin.Context) {
  667. var args map[string]string
  668. if err := c.ShouldBindJSON(&args); err != nil {
  669. e.OutErr(c, e.ERR_INVALID_ARGS)
  670. return
  671. }
  672. taskDb := implement.NewCampTaskListDb(svc.MasterDb(c))
  673. task, _ := taskDb.GetCampTaskById(args["id"])
  674. res := md.TaskAllDetail{}
  675. res.Label = make([]string, 0)
  676. res.DetailInfo = make([]string, 0)
  677. if task != nil {
  678. taskDetailDb := implement.NewCampTaskDetailDb(svc.MasterDb(c))
  679. taskDetail, _ := taskDetailDb.GetCampTaskDetailById(args["id"])
  680. res = md.TaskAllDetail{
  681. Id: utils.IntToStr(task.Id),
  682. Name: task.Name,
  683. Icon: svc.ImageFormat(c, task.Logo),
  684. Price: task.Price,
  685. Num: utils.IntToStr(task.Num),
  686. Timer: task.StartTime.Format("2006-01-02") + "至" + task.EndTime.Format("2006-01-02"),
  687. }
  688. if taskDetail != nil {
  689. DetailInfo := make([]string, 0)
  690. json.Unmarshal([]byte(taskDetail.DetailInfo), &DetailInfo)
  691. res.DetailInfo = DetailInfo
  692. }
  693. label := make([]string, 0)
  694. json.Unmarshal([]byte(task.Label), &label)
  695. res.Label = label
  696. }
  697. e.OutSuc(c, res, nil)
  698. return
  699. }