selection.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "reflect"
  7. "time"
  8. "youngee_m_api/db"
  9. "youngee_m_api/model/common_model"
  10. "youngee_m_api/model/gorm_model"
  11. "youngee_m_api/model/http_model"
  12. "youngee_m_api/pack"
  13. "youngee_m_api/util"
  14. "github.com/gin-gonic/gin"
  15. "github.com/sirupsen/logrus"
  16. "github.com/caixw/lib.go/conv"
  17. )
  18. var Selection *selection
  19. type selection struct {
  20. }
  21. func (*selection) Create(ctx context.Context, request http_model.CreateSelectionRequest) (*http_model.CreateSelectionData, error) {
  22. enterpriseId := request.EnterpriseId
  23. // 1. 检查该企业id和商品id有无选品
  24. //selectionInfo, err := db.GetSelectionByEnterpiseIdAndProductId(ctx, enterpriseId, conv.MustInt(request.ProductId, 0))
  25. //if err != nil {
  26. // return nil, err
  27. //}
  28. //if selectionInfo != nil {
  29. // return nil, errors.New("该商品下选品已存在")
  30. //}
  31. // 2. 数据准备
  32. // a) 生成选品id
  33. selectionId := util.GetSelectionID()
  34. // b) 查找关联商品信息
  35. product, err := db.GetProductByID(ctx, conv.MustInt64(request.ProductId, 0))
  36. if err != nil {
  37. return nil, err
  38. }
  39. productPhotos, err := db.GetProductPhotoByProductID(ctx, conv.MustInt64(request.ProductId, 0))
  40. productInfoToJson, _ := json.Marshal(product)
  41. productPhotosToJson, _ := json.Marshal(productPhotos)
  42. // c) 选品名称
  43. selectionName := product.BrandName + "-" + product.ProductName
  44. // 3. 创建选品
  45. taskDdl := time.Time{} //赋零值
  46. taskDdl, _ = time.ParseInLocation("2006-01-02 15:04:05", "2026-01-01 08:00:00", time.Local)
  47. newSelection := gorm_model.YounggeeSelectionInfo{
  48. SelectionID: selectionId,
  49. SelectionName: selectionName,
  50. ProductID: conv.MustInt(request.ProductId, 0),
  51. EnterpriseID: enterpriseId,
  52. Platform: conv.MustInt(request.Platform, 0),
  53. ProductSnap: string(productInfoToJson),
  54. ProductPhotoSnap: string(productPhotosToJson),
  55. CreatedAt: time.Now(),
  56. TaskDdl: taskDdl,
  57. EstimatedCost: "0",
  58. TaskReward: "0",
  59. SettlementAmount: "0",
  60. }
  61. //Selection := gorm_model.YounggeeSelectionInfo{}
  62. err = db.CreateSelection(ctx, newSelection)
  63. if err != nil {
  64. return nil, err
  65. }
  66. res := &http_model.CreateSelectionData{
  67. SelectionId: selectionId,
  68. }
  69. return res, nil
  70. }
  71. func (*selection) Update(ctx context.Context, request http_model.UpdateSelectionRequest, enterpriseId string) (*http_model.UpdateSelectionData, error) {
  72. // 1. 检查该企业id和商品id有无选品
  73. selectionInfo, err := db.GetSelectionById(ctx, request.SelectionID)
  74. if err != nil {
  75. return nil, err
  76. }
  77. if selectionInfo == nil {
  78. return nil, errors.New("选品不存在")
  79. }
  80. // 2. 数据准备
  81. // a) 查找关联商品信息
  82. product, err := db.GetProductByID(ctx, conv.MustInt64(request.ProductId, 0))
  83. if err != nil {
  84. return nil, err
  85. }
  86. productPhotos, err := db.GetProductPhotoByProductID(ctx, conv.MustInt64(request.ProductId, 0))
  87. productInfoToJson, _ := json.Marshal(product)
  88. productPhotosToJson, _ := json.Marshal(productPhotos)
  89. // b) 选品名称
  90. selectionName := product.BrandName + "-" + product.ProductName
  91. // d) 任务截止时间
  92. taskDdl := time.Time{} //赋零值
  93. taskDdl, _ = time.ParseInLocation("2006-01-02 15:04:05", request.TaskDdl, time.Local)
  94. // f) 更新选品状态
  95. if request.SelectionStatus != 2 && request.SelectionStatus != 7 {
  96. request.SelectionStatus = 1
  97. }
  98. updateSelection := gorm_model.YounggeeSelectionInfo{
  99. SelectionID: request.SelectionID,
  100. SelectionStatus: request.SelectionStatus,
  101. SelectionName: selectionName,
  102. EnterpriseID: enterpriseId,
  103. ProductID: conv.MustInt(request.ProductId, 0),
  104. ContentType: conv.MustInt(request.ContentType, 0),
  105. TaskMode: conv.MustInt(request.TaskMode, 0),
  106. Platform: conv.MustInt(request.Platform, 0),
  107. SampleMode: conv.MustInt(request.SampleMode, 0),
  108. ProductUrl: request.ProductUrl,
  109. SampleNum: conv.MustInt(request.SampleNum, 0),
  110. RemainNum: conv.MustInt(request.SampleNum, 0),
  111. CommissionRate: conv.MustInt(request.CommissionRate, 0),
  112. TaskReward: conv.MustString(request.TaskReward, "0"),
  113. SettlementAmount: conv.MustString(request.SettlementAmount, "0"),
  114. EstimatedCost: selectionInfo.EstimatedCost,
  115. SampleCondition: request.SampleCondition,
  116. RewardCondition: request.RewardCondition,
  117. TaskDdl: taskDdl,
  118. Detail: request.Detail,
  119. ProductSnap: string(productInfoToJson),
  120. ProductPhotoSnap: string(productPhotosToJson),
  121. CreatedAt: selectionInfo.CreatedAt,
  122. UpdatedAt: time.Now(),
  123. SubmitAt: time.Now(),
  124. }
  125. // 合并传入参数和数据表中原记录,若传入参数字段值为空,则将字段赋值为原记录中值
  126. result := util.MergeStructValue(&updateSelection, selectionInfo)
  127. // 利用反射机制将interface类型转换为结构体类型
  128. v := reflect.ValueOf(&result).Elem()
  129. if v.Kind() == reflect.Struct {
  130. updateSelection = v.Interface().(gorm_model.YounggeeSelectionInfo)
  131. //fmt.Println(p)
  132. }
  133. // c) 计算预估成本(如果有)
  134. var estimatedCost float64
  135. if conv.MustInt(updateSelection.TaskMode, 0) == 1 {
  136. estimatedCost = conv.MustFloat64(updateSelection.TaskReward, 0) * conv.MustFloat64(updateSelection.SampleNum, 0)
  137. }
  138. estimatedCostToString, _ := conv.String(estimatedCost)
  139. updateSelection.EstimatedCost = estimatedCostToString
  140. // 3. 更新选品
  141. err = db.UpdateSelection(ctx, updateSelection)
  142. if err != nil {
  143. return nil, err
  144. }
  145. // 4. 更新选品brief和示例
  146. if request.SecBrief != nil {
  147. // 删除已有brief
  148. err = db.DeleteSecBriefBySelectionId(ctx, selectionInfo.SelectionID)
  149. if err != nil {
  150. return nil, err
  151. }
  152. // 插入新的brief
  153. for _, v := range request.SecBrief {
  154. brief := gorm_model.YounggeeSecBrief{
  155. SelectionID: selectionInfo.SelectionID,
  156. FileUid: v.PhotoUid,
  157. FileName: v.Name,
  158. FileUrl: v.PhotoUrl,
  159. CreatedAt: time.Now(),
  160. }
  161. err = db.CreateSecBrief(ctx, brief)
  162. if err != nil {
  163. return nil, err
  164. }
  165. }
  166. }
  167. if request.SecExample != nil {
  168. // 删除已有示例
  169. err = db.DeleteSecExampleBySelectionId(ctx, selectionInfo.SelectionID)
  170. if err != nil {
  171. return nil, err
  172. }
  173. // 插入新的示例
  174. for _, v := range request.SecExample {
  175. Example := gorm_model.YounggeeSecExample{
  176. SelectionID: selectionInfo.SelectionID,
  177. FileUid: v.PhotoUid,
  178. FileName: v.Name,
  179. FileUrl: v.PhotoUrl,
  180. CreatedAt: time.Now(),
  181. }
  182. err = db.CreateSecExample(ctx, Example)
  183. if err != nil {
  184. return nil, err
  185. }
  186. }
  187. }
  188. res := &http_model.UpdateSelectionData{
  189. SelectionId: updateSelection.SelectionID,
  190. }
  191. return res, nil
  192. }
  193. func (*selection) Pay(ctx context.Context, request http_model.PaySelectionRequest, enterpriseId string) (*http_model.PaySelectionData, error) {
  194. // 校验
  195. // 1. 账户余额是否足够
  196. enterprise, err := db.GetEnterpriseByEnterpriseID(ctx, enterpriseId)
  197. if err != nil {
  198. return nil, err
  199. }
  200. if enterprise.AvailableBalance < request.PayMoney {
  201. return nil, errors.New("账户余额不足")
  202. }
  203. // 2. 选品项目状态是否正确
  204. selectionInfo, err := db.GetSelectionById(ctx, request.SelectionId)
  205. if err != nil {
  206. return nil, err
  207. }
  208. if selectionInfo == nil {
  209. return nil, errors.New("选品不存在")
  210. }
  211. if selectionInfo.SelectionStatus != 4 {
  212. return nil, errors.New("选品状态有误")
  213. }
  214. // 支付
  215. err = db.PaySelection(ctx, enterpriseId, request.PayMoney, request.SelectionId)
  216. if err != nil {
  217. return nil, err
  218. }
  219. res := &http_model.PaySelectionData{
  220. SelectionId: request.SelectionId,
  221. }
  222. return res, nil
  223. }
  224. func (*selection) Submit(ctx context.Context, request http_model.SubmitSelectionRequest) (*http_model.SubmitSelectionData, error) {
  225. updateSelection := gorm_model.YounggeeSelectionInfo{
  226. SelectionID: request.SelectionId,
  227. SelectionStatus: request.SelectionStatus,
  228. SubmitAt: time.Now(),
  229. }
  230. err := db.UpdateSelection(ctx, updateSelection)
  231. if err != nil {
  232. return nil, err
  233. }
  234. res := &http_model.SubmitSelectionData{}
  235. return res, nil
  236. }
  237. func (s *selection) GetAllSelection(ctx context.Context, enterpriseID string, pageSize, pageNum int64, conditions *common_model.SelectionConditions) (*http_model.SelectionData, error) {
  238. SelectionList, total, err := db.GetSelectionList(ctx, enterpriseID, pageSize, pageNum, conditions)
  239. if err != nil {
  240. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetAllSelection error,err:%+v", err)
  241. return nil, err
  242. }
  243. SelectionListData := new(http_model.SelectionData)
  244. SelectionListData.SelectionInfo = pack.MGormSelectionToHttpSelectionPreview(SelectionList)
  245. SelectionListData.Total = conv.MustString(total, "")
  246. return SelectionListData, nil
  247. }
  248. func (s *selection) GetSelectionDetail(ctx *gin.Context, selectionId string, enterpriseId string) (*http_model.SelectionDetail, error) {
  249. selectionDetail := http_model.SelectionDetail{}
  250. selectionInfo, err := db.GetSelectionById(ctx, selectionId)
  251. if err != nil {
  252. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionInfo error,err:%+v", err)
  253. return nil, err
  254. }
  255. selectionBriefInfo, err := db.GetSelectionBriefInfo(ctx, selectionId)
  256. if err != nil {
  257. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionBriefInfo error,err:%+v", err)
  258. return nil, err
  259. }
  260. selectionExampleInfo, err := db.GetSelectionExampleInfo(ctx, selectionId)
  261. if err != nil {
  262. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionExampleInfo error,err:%+v", err)
  263. return nil, err
  264. }
  265. productInfo, err := db.GetProductInfoBySelectionId(ctx, selectionId)
  266. if err != nil {
  267. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetProductInfo error,err:%+v", err)
  268. return nil, err
  269. }
  270. productPhotoInfo, err := db.GetProductPhotoInfoBySelectionId(ctx, selectionId)
  271. if err != nil {
  272. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetProductPhotoInfo error,err:%+v", err)
  273. return nil, err
  274. }
  275. selectionDetail.SelectionBrief = selectionBriefInfo
  276. selectionDetail.SelectionInfo = selectionInfo
  277. selectionDetail.SelectionExample = selectionExampleInfo
  278. selectionDetail.ProductInfo = productInfo
  279. selectionDetail.ProductPhotoInfo = productPhotoInfo
  280. return &selectionDetail, nil
  281. }
  282. func (*selection) Review(ctx context.Context, request http_model.ReviewSelectionRequest) (*http_model.ReviewSelectionData, error) {
  283. // 根据选品id查询选品信息
  284. selectionInfo, err := db.GetSelectionById(ctx, request.SelectionId)
  285. if err != nil {
  286. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionById error,err:%+v", err)
  287. return nil, err
  288. }
  289. // 计算预估成本
  290. var estimatedCost float64 = 0.0
  291. var estimatedCostToString string = ""
  292. if conv.MustInt(selectionInfo.TaskMode, 0) == 1 {
  293. estimatedCost = conv.MustFloat64(selectionInfo.TaskReward, 0) * conv.MustFloat64(selectionInfo.SampleNum, 0)
  294. estimatedCostToString, _ = conv.String(estimatedCost)
  295. }
  296. // 若审核通过则更新选品阶段为待支付,否则更新为失效并赋值失效原因
  297. if request.IsPass == 1 {
  298. updateSelection := gorm_model.YounggeeSelectionInfo{
  299. SelectionID: request.SelectionId,
  300. SelectionStatus: 4,
  301. PassAt: time.Now(),
  302. EstimatedCost: estimatedCostToString,
  303. }
  304. err = db.UpdateSelection(ctx, updateSelection)
  305. if err != nil {
  306. logrus.WithContext(ctx).Errorf("[selectionDB service] call UpdateSelection error,err:%+v", err)
  307. return nil, err
  308. }
  309. } else {
  310. updateSelection := gorm_model.YounggeeSelectionInfo{
  311. SelectionID: request.SelectionId,
  312. SelectionStatus: 7,
  313. FailReason: 2,
  314. PassAt: time.Now(),
  315. EstimatedCost: estimatedCostToString,
  316. }
  317. err = db.UpdateSelection(ctx, updateSelection)
  318. if err != nil {
  319. logrus.WithContext(ctx).Errorf("[selectionDB service] call UpdateSelection error,err:%+v", err)
  320. return nil, err
  321. }
  322. }
  323. res := &http_model.ReviewSelectionData{}
  324. return res, nil
  325. }