selection.go 11 KB

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