附近小店
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. package svc
  2. import (
  3. "applet/app/db"
  4. "applet/app/e"
  5. "applet/app/md"
  6. "applet/app/utils"
  7. "applet/app/utils/cache"
  8. "encoding/json"
  9. "fmt"
  10. "github.com/gin-gonic/gin"
  11. "time"
  12. )
  13. func StoreOrderCate(c *gin.Context) {
  14. var cate = []map[string]string{
  15. {"name": "全部", "value": ""},
  16. {"name": "待付款", "value": "0"},
  17. {"name": "待提货", "value": "1"},
  18. {"name": "已完成", "value": "2"},
  19. {"name": "已取消", "value": "3"},
  20. }
  21. e.OutSuc(c, cate, nil)
  22. return
  23. }
  24. func StoreOrderList(c *gin.Context) {
  25. var arg map[string]string
  26. if err := c.ShouldBindJSON(&arg); err != nil {
  27. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  28. return
  29. }
  30. user := GetUser(c)
  31. arg["store_uid"] = utils.IntToStr(user.Info.Uid)
  32. data := db.GetOrderList(MasterDb(c), arg)
  33. var state = []string{"待付款", "待提货", "已完成", "已取消"}
  34. list := make([]map[string]interface{}, 0)
  35. if data != nil {
  36. now := time.Now().Unix()
  37. for _, v := range *data {
  38. store := db.GetStoreIdEg(MasterDb(c), utils.IntToStr(v.StoreUid))
  39. info := db.GetOrderInfoAllEg(MasterDb(c), utils.Int64ToStr(v.Oid))
  40. downTime := "0"
  41. if v.State == 0 {
  42. downTime = utils.IntToStr(int(v.CreateAt.Unix() + 15*60 - now))
  43. if now > v.CreateAt.Unix()+15*60 {
  44. v.State = 3
  45. }
  46. if utils.StrToInt(downTime) < 0 {
  47. downTime = "0"
  48. }
  49. }
  50. storeName := ""
  51. if store != nil {
  52. storeName = store.Name
  53. }
  54. goodsInfo := make([]map[string]string, 0)
  55. if info != nil {
  56. for _, v1 := range *info {
  57. skuData := make([]md.Sku, 0)
  58. json.Unmarshal([]byte(v1.SkuInfo), &skuData)
  59. skuStr := ""
  60. for _, v2 := range skuData {
  61. if skuStr != "" {
  62. skuStr += ";"
  63. }
  64. skuStr += v2.Value
  65. }
  66. if skuStr != "" {
  67. skuStr = "(" + skuStr + ")"
  68. }
  69. tmp := map[string]string{
  70. "title": v1.Title + skuStr,
  71. "num": utils.IntToStr(v1.Num),
  72. "img": v1.Img,
  73. }
  74. goodsInfo = append(goodsInfo, tmp)
  75. }
  76. }
  77. user1, _ := db.UserFindByID(MasterDb(c), v.Uid)
  78. userProfile, _ := db.UserProfileFindByID(MasterDb(c), v.Uid)
  79. nickname := ""
  80. headImg := ""
  81. if userProfile != nil {
  82. headImg = userProfile.AvatarUrl
  83. }
  84. if user1 != nil {
  85. if user1.Nickname != user1.Phone {
  86. user1.Nickname += " " + user1.Phone
  87. }
  88. nickname = user1.Nickname
  89. }
  90. tmp := map[string]interface{}{
  91. "goods_info": goodsInfo,
  92. "oid": utils.Int64ToStr(v.Oid),
  93. "label": "自提",
  94. "state": utils.IntToStr(v.State),
  95. "state_str": state[v.State],
  96. "store_name": storeName,
  97. "coupon": v.Coupon,
  98. "commission": v.Commission,
  99. "username": nickname,
  100. "head_img": headImg,
  101. "amount": v.Amount,
  102. "num": utils.IntToStr(v.Num),
  103. "down_time": downTime,
  104. "create_at": v.CreateAt.Format("2006-01-02 15:04:05"),
  105. "pay_at": "",
  106. "confirm_at": "",
  107. }
  108. if v.PayAt.IsZero() == false {
  109. tmp["pay_at"] = v.PayAt.Format("2006-01-02 15:04:05")
  110. }
  111. if v.ConfirmAt.IsZero() == false {
  112. tmp["confirm_at"] = v.ConfirmAt.Format("2006-01-02 15:04:05")
  113. } else {
  114. if v.IsNow == 1 {
  115. tmp["confirm_at"] = "立即提货"
  116. } else if v.Timer != "" {
  117. tmp["confirm_at"] = v.Timer
  118. }
  119. }
  120. if v.Type == 1 {
  121. tmp["label"] = "外卖"
  122. }
  123. list = append(list, tmp)
  124. }
  125. }
  126. e.OutSuc(c, list, nil)
  127. return
  128. }
  129. func StoreOrderDetail(c *gin.Context) {
  130. var arg map[string]string
  131. if err := c.ShouldBindJSON(&arg); err != nil {
  132. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  133. return
  134. }
  135. data := db.GetOrderEg(MasterDb(c), arg["oid"])
  136. var state = []string{"待付款", "待提货", "已完成", "已取消"}
  137. now := time.Now().Unix()
  138. downTime := "0"
  139. if data.State == 0 {
  140. downTime = utils.IntToStr(int(data.CreateAt.Unix() + 15*60 - now))
  141. if now > data.CreateAt.Unix()+15*60 {
  142. data.State = 3
  143. }
  144. if utils.StrToInt(downTime) < 0 {
  145. downTime = "0"
  146. }
  147. }
  148. confirmAt := ""
  149. if data.ConfirmAt.IsZero() == false {
  150. confirmAt = data.ConfirmAt.Format("2006-01-02 15:04:05")
  151. }
  152. payAt := ""
  153. if data.PayAt.IsZero() == false {
  154. payAt = data.PayAt.Format("2006-01-02 15:04:05")
  155. }
  156. timer := ""
  157. if data.IsNow == 1 {
  158. timer = "立即提货"
  159. } else if data.Timer != "" {
  160. timer = data.Timer
  161. }
  162. orderInfo := []map[string]string{
  163. {"title": "订单编号", "content": utils.Int64ToStr(data.Oid)},
  164. {"title": "提货码", "content": data.Code},
  165. {"title": "下单时间", "content": data.CreateAt.Format("2006-01-02 15:04:05")},
  166. {"title": "付款时间", "content": payAt},
  167. {"title": "预计提货时间", "content": timer},
  168. {"title": "提货时间", "content": confirmAt},
  169. {"title": "预留电话", "content": data.Phone},
  170. {"title": "备注信息", "content": data.Memo},
  171. }
  172. goodsInfo := make([]map[string]string, 0)
  173. info := db.GetOrderInfoAllEg(MasterDb(c), utils.Int64ToStr(data.Oid))
  174. if info != nil {
  175. for _, v := range *info {
  176. tmp := map[string]string{
  177. "img": v.Img,
  178. "title": v.Title,
  179. "price": v.Price,
  180. "num": utils.IntToStr(v.Num),
  181. "sku_str": "",
  182. }
  183. skuData := make([]md.Sku, 0)
  184. json.Unmarshal([]byte(v.SkuInfo), &skuData)
  185. skuStr := ""
  186. for _, v1 := range skuData {
  187. if skuStr != "" {
  188. skuStr += ";"
  189. }
  190. skuStr += v1.Value
  191. }
  192. tmp["sku_str"] = skuStr
  193. goodsInfo = append(goodsInfo, tmp)
  194. }
  195. }
  196. user1, _ := db.UserFindByID(MasterDb(c), data.Uid)
  197. userProfile, _ := db.UserProfileFindByID(MasterDb(c), data.Uid)
  198. nickname := ""
  199. headImg := ""
  200. if userProfile != nil {
  201. headImg = userProfile.AvatarUrl
  202. }
  203. if user1 != nil {
  204. if user1.Nickname != user1.Phone {
  205. user1.Nickname += " " + user1.Phone
  206. }
  207. nickname = user1.Nickname
  208. }
  209. tmp := map[string]interface{}{
  210. "oid": utils.Int64ToStr(data.Oid),
  211. "label": "自提",
  212. "username": nickname,
  213. "head_img": headImg,
  214. "commission": data.Commission,
  215. "state": utils.IntToStr(data.State),
  216. "state_str": state[data.State],
  217. "amount": data.Amount,
  218. "all_amount": utils.Float64ToStr(utils.StrToFloat64(data.Amount) + utils.StrToFloat64(data.Coupon)),
  219. "coupon": data.Coupon,
  220. "num": utils.IntToStr(data.Num),
  221. "code": data.Code,
  222. "down_time": downTime,
  223. "order_info": orderInfo,
  224. "goods_info": goodsInfo,
  225. "goods_count": utils.IntToStr(len(goodsInfo)),
  226. }
  227. if data.Type == 1 {
  228. tmp["label"] = "外卖"
  229. }
  230. e.OutSuc(c, tmp, nil)
  231. return
  232. }
  233. func StoreOrderConfirm(c *gin.Context) {
  234. var arg map[string]string
  235. if err := c.ShouldBindJSON(&arg); err != nil {
  236. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  237. return
  238. }
  239. // 加锁 防止并发提取
  240. mutexKey := fmt.Sprintf("%s:team.StoreOrderConfirm:%s", c.GetString("mid"), arg["oid"])
  241. withdrawAvailable, err := cache.Do("SET", mutexKey, 1, "EX", 5, "NX")
  242. if err != nil {
  243. e.OutErr(c, e.ERR, err)
  244. return
  245. }
  246. if withdrawAvailable != "OK" {
  247. e.OutErr(c, e.ERR, e.NewErr(400000, "请求过于频繁,请稍后再试"))
  248. return
  249. }
  250. sess := MasterDb(c).NewSession()
  251. defer sess.Close()
  252. sess.Begin()
  253. order := db.GetOrder(sess, arg["oid"])
  254. if order == nil {
  255. sess.Rollback()
  256. e.OutErr(c, 400, e.NewErr(400, "订单不存在"))
  257. return
  258. }
  259. if order.State != 1 {
  260. sess.Rollback()
  261. e.OutErr(c, 400, e.NewErr(400, "订单不能确认"))
  262. return
  263. }
  264. order.State = 2
  265. order.UpdateAt = time.Now()
  266. order.ConfirmAt = time.Now()
  267. update, err := sess.Where("id=?", order.Id).Cols("state,confirm_at,update_at").Update(order)
  268. if update == 0 || err != nil {
  269. e.OutErr(c, 400, e.NewErr(400, "订单确认失败"))
  270. return
  271. }
  272. e.OutSuc(c, "success", nil)
  273. return
  274. }