劲创营---任务项目
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

svc_task.go 21 KiB

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