order.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. package talent_service
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gogf/gf/database/gdb"
  6. "github.com/gogf/gf/encoding/gjson"
  7. "github.com/gogf/gf/frame/g"
  8. "github.com/gogf/gf/net/ghttp"
  9. "github.com/gogf/gf/os/gtime"
  10. "youngmini_server/app/dao"
  11. "youngmini_server/app/model"
  12. "youngmini_server/app/model/talent_model"
  13. "youngmini_server/app/utils"
  14. )
  15. type platformExamineState int
  16. const (
  17. waitForExamine platformExamineState = iota + 1
  18. examineSuccess
  19. examineFailed
  20. )
  21. const buySamplesTypeYounggee = 1
  22. // GetOrderList 获取达人已接订单列表,如果有search_name参数则根据此信息对已接订单进行搜索,否则获取所有已接订单
  23. func GetOrderList(r *ghttp.Request) *TalentHttpResult {
  24. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  25. if err != nil {
  26. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  27. }
  28. taskOrBrandName := r.GetQueryString("search_name", "nil")
  29. whereStr := fmt.Sprintf("talent_id = %d", tid)
  30. if taskOrBrandName != "nil" {
  31. taskOrBrandName = "%" + taskOrBrandName + "%"
  32. whereStr += " and (task_name like '" + taskOrBrandName + "' or task_brand_name like '" + taskOrBrandName + "')"
  33. }
  34. var orderList []*model.OrderInfo
  35. err = g.DB().Model(dao.OrderInfo.Table).Where(whereStr).
  36. Order(dao.OrderInfo.Columns.CompleteStatus).Scan(&orderList)
  37. if err != nil {
  38. return &TalentHttpResult{Code: -2, Msg: "get order info failed"}
  39. }
  40. classifiedOrderList := talent_model.ClassifiedOrderInfoBriefList{}
  41. for _, v := range orderList {
  42. // 获取任务招募等级信息
  43. levelRec, err1 := g.DB().Model(dao.TaskRecruitTalentLevel.Table).Where("trt_id", v.TaskLevelId).One()
  44. if err1 != nil || levelRec == nil {
  45. return &TalentHttpResult{Code: -4, Msg: "query task level failed"}
  46. }
  47. // 获取任务信息
  48. taskRec, err1 := g.DB().Model(dao.TaskBaseInfo.Table).Where("task_id", v.TaskId).One()
  49. if err1 != nil || taskRec == nil {
  50. return &TalentHttpResult{Code: -5, Msg: "query task info failed"}
  51. }
  52. // 获取任务关联的商品的主图
  53. productPhoto, err1 := g.DB().Model(dao.ProductPhoto.Table).One("product_id = ? and symbol = 1", taskRec[dao.TaskBaseInfo.Columns.ProductId])
  54. if err1 != nil {
  55. return &TalentHttpResult{Code: -6, Msg: "query product photo info failed"}
  56. }
  57. // 获取平台信息
  58. platRec, err1 := g.DB().Model(dao.InfoThirdPlatform.Table).One("platform_id", taskRec[dao.TaskBaseInfo.Columns.TaskPlatform].Int())
  59. if err1 != nil || platRec == nil {
  60. return &TalentHttpResult{Code: -7, Msg: "query platform info failed"}
  61. }
  62. // 获取平台昵称
  63. nickNameRet, err1 := g.DB().Model(platRec[dao.InfoThirdPlatform.Columns.PlatformTableName].String()).
  64. Fields("platform_nickname").
  65. Where("talent_id", v.TalentId).One()
  66. if err1 != nil || nickNameRet == nil {
  67. return &TalentHttpResult{Code: -8, Msg: "query platform nickname failed"}
  68. }
  69. // 获取订单执行进度
  70. procedureRec, err1 := g.DB().Model(dao.WorkflowNodeContainer.Table).
  71. One("order_id = ? and sort_id = ?", v.OrderId, v.OrderStatus)
  72. if err1 != nil || procedureRec == nil {
  73. return &TalentHttpResult{Code: -9, Msg: "query order procedure info failed"}
  74. }
  75. var procedureName string
  76. if procedureRec[dao.WorkflowNodeContainer.Columns.CurExecutionTimes].Int() < 2 {
  77. procedureName = procedureRec[dao.WorkflowNodeContainer.Columns.NodeNameFirst].String()
  78. } else {
  79. procedureName = procedureRec[dao.WorkflowNodeContainer.Columns.NodeNameAfterSecond].String()
  80. }
  81. orderInfoBrief := &talent_model.OrderInfoBrief{
  82. OrderId: v.OrderId,
  83. PlatformIconUrl: platRec[dao.InfoThirdPlatform.Columns.PlatformIcon].String(),
  84. PlatformName: platRec[dao.InfoThirdPlatform.Columns.PlatformName].String(),
  85. PlatformNickName: nickNameRet["platform_nickname"].String(),
  86. OrderProcedure: procedureName,
  87. TaskName: taskRec[dao.TaskBaseInfo.Columns.TaskName].String(),
  88. RecruitLevel: levelRec,
  89. ProcedureNote: procedureRec[dao.WorkflowNodeContainer.Columns.Tip].String(),
  90. ProductImgUrl: productPhoto[dao.ProductPhoto.Columns.PhotoUrl].String(),
  91. OrderCompleteStatus: v.CompleteStatus,
  92. OrderCompleteDate: v.CompleteDate,
  93. }
  94. classifiedOrderList.AllOrderInfoList = append(classifiedOrderList.AllOrderInfoList, orderInfoBrief)
  95. if v.CompleteStatus < 2 {
  96. if v.OrderStatus == 1 {
  97. classifiedOrderList.SelectOrderInfoList = append(classifiedOrderList.SelectOrderInfoList, orderInfoBrief)
  98. }
  99. if v.OrderStatus > 1 {
  100. classifiedOrderList.GoingOnOrderInfoList = append(classifiedOrderList.GoingOnOrderInfoList, orderInfoBrief)
  101. }
  102. } else {
  103. classifiedOrderList.CompletedOrderInfoList = append(classifiedOrderList.CompletedOrderInfoList, orderInfoBrief)
  104. }
  105. }
  106. return &TalentHttpResult{Code: 0, Msg: "success", Data: classifiedOrderList}
  107. }
  108. // GetOrderDetail 获取订单详情
  109. func GetOrderDetail(r *ghttp.Request) *TalentHttpResult {
  110. orderId := r.GetQueryInt("oid", 0)
  111. if orderId == 0 {
  112. return &TalentHttpResult{Code: -1, Msg: "未找到订单号信息"}
  113. }
  114. var orderDetail *talent_model.OrderDetailInfo
  115. err := g.DB().Model(dao.OrderInfo.Table).WithAll().Scan(&orderDetail, dao.OrderInfo.Columns.OrderId, orderId)
  116. if err != nil {
  117. return &TalentHttpResult{Code: -2, Msg: "查询数据失败"}
  118. }
  119. //if orderDetail.TaskInfo.Conditions.BuySamplesType == buySamplesTypeYounggee {
  120. // // 拍单方式为样叽拍单,获取拍单详细信息
  121. // rec, err1 := g.DB().Model(dao.TaskProcedureBuySamplesInfo.Table).One(dao.TaskProcedureBuySamplesInfo.Columns.TaskBaseId, orderDetail.TaskId)
  122. // if err1 != nil {
  123. // return &TalentHttpResult{Code: -3, Msg: "查询拍单信息失败"}
  124. // }
  125. //
  126. // orderDetail.BuySamplesInfo = rec
  127. //} else {
  128. // orderDetail.BuySamplesInfo = nil
  129. //}
  130. return &TalentHttpResult{Code: 0, Msg: "success", Data: orderDetail}
  131. }
  132. // SignupTask 达人报名任务(产生订单)
  133. func SignupTask(r *ghttp.Request) *TalentHttpResult {
  134. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  135. if err != nil {
  136. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  137. }
  138. // 获取达人信息
  139. talentRec, err := g.DB().Model(dao.TalentInfo.Table).One("id", tid)
  140. if err != nil || talentRec == nil {
  141. return &TalentHttpResult{Code: -13, Msg: "query talent info failed"}
  142. }
  143. // 如果达人在黑名单则不允许报名
  144. if talentRec[dao.TalentInfo.Columns.InBlacklist].Int() >= 1 {
  145. return &TalentHttpResult{Code: -2, Msg: "talent in blacklist"}
  146. }
  147. var signupInfo *talent_model.SignupInfo
  148. err = r.ParseForm(&signupInfo)
  149. if err != nil {
  150. return &TalentHttpResult{Code: -3, Msg: err.Error()}
  151. }
  152. taskId := signupInfo.TaskId
  153. var taskDetail *talent_model.TaskDetail
  154. err = g.DB().Model(talent_model.TaskDetail{}).WithAll().Where("task_id", taskId).Scan(&taskDetail)
  155. if err != nil {
  156. return &TalentHttpResult{Code: -4, Msg: "data query failed"}
  157. }
  158. // 校验任务是否已过报名截止时间
  159. if taskDetail.DeadlineTime.Before(gtime.Now()) {
  160. return &TalentHttpResult{Code: -5, Msg: "task has close sign up"}
  161. }
  162. // 校验达人是否已经报名过该任务
  163. rec, err := g.DB().Model(dao.OrderInfo.Table).One("task_id = ? and talent_id = ?", taskId, tid)
  164. if err != nil || rec != nil {
  165. return &TalentHttpResult{Code: -6, Msg: "talent have signed up task"}
  166. }
  167. // 校验达人是否拥有任务要求的平台账号
  168. rec, err = g.DB().Model(dao.RTalentPlatformTable.Table).One("tid = ? and p_id = ?", tid, taskDetail.TaskPlatform)
  169. if err != nil {
  170. return &TalentHttpResult{Code: -7, Msg: "query talent platform info failed"}
  171. }
  172. // 达人没有任务要求的平台账号,返回
  173. if rec == nil {
  174. return &TalentHttpResult{Code: -8, Msg: "talent have no platform account"}
  175. }
  176. // 达人平台账号审核未通过,返回
  177. if rec[dao.RTalentPlatformTable.Columns.ExamineState].Int() != int(examineSuccess) {
  178. return &TalentHttpResult{Code: -9, Msg: "talent platform account examine failed"}
  179. }
  180. // 获取任务要求的平台对应的平台信息
  181. rec, err = g.DB().Model(dao.InfoThirdPlatform.Table).One(dao.InfoThirdPlatform.Columns.PlatformId, taskDetail.TaskPlatform)
  182. if err != nil || rec == nil {
  183. return &TalentHttpResult{Code: -10, Msg: "query platform table name failed"}
  184. }
  185. // 获取达人的平台账号信息
  186. platformRec, err := g.DB().Model(rec[dao.InfoThirdPlatform.Columns.PlatformTableName].String()).One("talent_id", tid)
  187. if err != nil || platformRec == nil {
  188. return &TalentHttpResult{Code: -11, Msg: "query talent platform info failed"}
  189. }
  190. var remuneration int64
  191. found := false
  192. for _, v := range taskDetail.NeedTalentCount {
  193. if v.TrtId == signupInfo.TaskRecruitLevelId {
  194. if platformRec["fans_count"].Int() < v.FansCountMin {
  195. return &TalentHttpResult{Code: -12, Msg: "fans count not match recruit level"}
  196. }
  197. remuneration = v.RewardRoyalties
  198. found = true
  199. break
  200. }
  201. }
  202. if !found {
  203. return &TalentHttpResult{Code: -13, Msg: "recruit level info error"}
  204. }
  205. //// 校验达人粉丝数量是否符合要求
  206. //if platformRec["fans_count"].Int() < taskDetail.NeedTalentCount[signupInfo.TaskRecruitLevelId].FansCountMin {
  207. // return &TalentHttpResult{Code: -10, Msg: "fans count not match recruit level"}
  208. //}
  209. // 获取收货地址信息
  210. var addrInfo *model.TalentDeliveryAddress
  211. err = g.DB().Model(dao.TalentDeliveryAddress.Table).
  212. Where(dao.TalentDeliveryAddress.Columns.AddressId, signupInfo.DeliveryAddrId).Scan(&addrInfo)
  213. if err != nil || addrInfo == nil {
  214. return &TalentHttpResult{Code: -14, Msg: "query delivery address failed"}
  215. }
  216. // 生成达人平台账号信息和达人信息的快照
  217. platformSnap, err := gjson.Encode(platformRec)
  218. if err != nil {
  219. return &TalentHttpResult{Code: -15, Msg: "encode platform snap failed"}
  220. }
  221. // 生成达人信息快照
  222. talentSnap, err := gjson.Encode(talentRec)
  223. if err != nil {
  224. return &TalentHttpResult{Code: -16, Msg: "encode talent info snap failed"}
  225. }
  226. // 生成收货地址快照
  227. addrSnap, err := gjson.Encode(addrInfo)
  228. if err != nil {
  229. return &TalentHttpResult{Code: -17, Msg: "encode delivery address snap failed"}
  230. }
  231. var productMainImg string
  232. for _, v := range taskDetail.ProductInfo.ProductImages {
  233. if productMainImg == "" {
  234. productMainImg = v.PhotoUrl
  235. }
  236. if v.Symbol == 1 {
  237. productMainImg = v.PhotoUrl
  238. break
  239. }
  240. }
  241. err = g.DB().Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  242. // 报名信息存入报名信息(订单)表
  243. orderId, err1 := tx.Ctx(ctx).Model(dao.OrderInfo.Table).Data(model.OrderInfo{
  244. TaskId: taskId,
  245. TaskName: taskDetail.TaskName,
  246. TaskBrandName: taskDetail.TaskBrandInfo.BrandName,
  247. ProductName: taskDetail.ProductInfo.ProductName,
  248. ProductMainImg: productMainImg,
  249. TalentId: tid,
  250. TalentPlatformInfoSnap: string(platformSnap),
  251. TalentPersonalInfoSnap: string(talentSnap),
  252. TalentPostAddrSnap: string(addrSnap),
  253. TaskLevelId: signupInfo.TaskRecruitLevelId,
  254. SettleAmount: remuneration,
  255. ProdSpecificationId: signupInfo.ProductSpecificationIndex,
  256. ProdNote: signupInfo.ProductNote,
  257. OrderStatus: 1,
  258. CompleteStatus: 1,
  259. CreateDate: gtime.Now(),
  260. }).InsertAndGetId()
  261. if err1 != nil {
  262. return err1
  263. }
  264. // 产生订单流程
  265. err1 = utils.OrderProcedureManager.GenOrderWorkflowList(taskId, int(orderId), ctx, tx)
  266. if err1 != nil {
  267. return err1
  268. }
  269. // 将达人收货信息写入order_delivery_info表,供后台查看和操作
  270. _, err1 = tx.Ctx(ctx).Model(dao.OrderDeliveryInfo.Table).Insert(model.OrderDeliveryInfo{
  271. OrderId: orderId,
  272. OrderAddressee: addrInfo.ReceiverName,
  273. OrderPhone: addrInfo.PhoneNumber,
  274. RegionCode: addrInfo.RegionCode,
  275. OrderAddress: addrInfo.DetailAddr,
  276. LogisticsCompany: "",
  277. TrackingNum: "",
  278. CreatedAt: gtime.Now(),
  279. ConfirmTime: nil,
  280. DeliveryTime: nil,
  281. DeliveryStatus: 1,
  282. })
  283. if err1 != nil {
  284. return err1
  285. }
  286. // 将订单状态插入订单状态表
  287. _, err1 = tx.Ctx(ctx).Model(dao.OrderStatusRecord.Table).Insert(model.OrderStatusRecord{
  288. OrderId: int(orderId),
  289. AlterBefore: 0,
  290. AlterAfter: 1,
  291. RoleTag: 2,
  292. RecordId: tid,
  293. RecordName: talentRec[dao.TalentInfo.Columns.TalentWxNickname].String(),
  294. CreatedAt: gtime.Now(),
  295. })
  296. return err1
  297. })
  298. if err != nil {
  299. return &TalentHttpResult{Code: -18, Msg: "add order data failed"}
  300. }
  301. return &TalentHttpResult{Code: 0, Msg: "success"}
  302. }
  303. // GetOrderSignUpPlatformInfo 获取报名信息里的平台信息快照
  304. func GetOrderSignUpPlatformInfo(r *ghttp.Request) *TalentHttpResult {
  305. orderId := r.GetQueryInt("order_id", 0)
  306. if orderId == 0 {
  307. return &TalentHttpResult{Code: -1, Msg: "need order id"}
  308. }
  309. rec, err := g.DB().Model(dao.OrderInfo.Table).Fields(dao.OrderInfo.Columns.TalentPlatformInfoSnap).One(dao.OrderInfo.Columns.OrderId, orderId)
  310. if err != nil || rec == nil {
  311. return &TalentHttpResult{Code: -2, Msg: "query order info failed"}
  312. }
  313. return &TalentHttpResult{Code: 0, Msg: "success", Data: rec[dao.OrderInfo.Columns.TalentPlatformInfoSnap]}
  314. }
  315. // GetOrderBriefInfo 获取订单帮助信息里的brief列表
  316. func GetOrderBriefInfo(r *ghttp.Request) *TalentHttpResult {
  317. orderId := r.GetQueryInt("order_id", 0)
  318. if orderId == 0 {
  319. return &TalentHttpResult{Code: -1, Msg: "must input order id"}
  320. }
  321. var briefList *talent_model.OrderBriefInfo
  322. err := g.DB().Model(dao.OrderInfo.Table).WithAll().Scan(&briefList, dao.OrderInfo.Columns.OrderId, orderId)
  323. if err != nil {
  324. return &TalentHttpResult{Code: -2, Msg: "query data failed"}
  325. }
  326. return &TalentHttpResult{Code: 0, Msg: "success", Data: briefList}
  327. }