劲创营---任务项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

718 rivejä
22 KiB

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