local_life_service.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909
  1. package service
  2. import (
  3. "errors"
  4. "github.com/sirupsen/logrus"
  5. "reflect"
  6. "strings"
  7. "time"
  8. "youngee_b_api/app/dao"
  9. "youngee_b_api/app/entity"
  10. "youngee_b_api/app/service/review_service"
  11. "youngee_b_api/app/util"
  12. "youngee_b_api/app/vo"
  13. )
  14. type LocalLifeService struct{}
  15. // 创建本地生活任务
  16. func (s LocalLifeService) CreateLocalLife(param *vo.LocalCreateParam) (*string, error) {
  17. // a) 生成本地生活项目id
  18. localId := string(util.GenerateUUID(10))
  19. // b) 查找关联门店信息
  20. product, err := dao.StoreDao{}.GetStoreByID(param.StoreId)
  21. if err != nil {
  22. return nil, err
  23. }
  24. if product == nil {
  25. return nil, errors.New("未找到关联门店")
  26. }
  27. // c)创建种草任务
  28. var operatorType int64
  29. if param.SubAccountId == 0 {
  30. operatorType = 1
  31. } else {
  32. operatorType = 2
  33. }
  34. // 获取定时任务配置id
  35. infoAutoTask := entity.InfoAutoTask{}
  36. infoAutoTask = dao.InfoAutoTaskDao{}.GetAutoTaskLast(param.EnterpriseId)
  37. infoAutoDefault := entity.InfoAutoDefault{}
  38. infoAutoDefault = dao.InfoAutoDefaultDao{}.GetAutoDefaultLast(param.EnterpriseId)
  39. t := time.Now()
  40. newLocalLife := entity.LocalLifeInfo{
  41. EnterpriseID: param.EnterpriseId,
  42. SubAccountID: param.SubAccountId,
  43. OperatorType: operatorType,
  44. TaskStatus: 1,
  45. LocalID: localId,
  46. LocalType: param.LocalType,
  47. LocalPlatform: param.Platform,
  48. StoreID: param.StoreId,
  49. StoreRelatedAt: time.Now(),
  50. PromoteBody: param.PromoteBody,
  51. Donate: param.Donate,
  52. TeamBuyingId: param.TeamBuyingId,
  53. TeamBuyingRelatedAt: time.Now(),
  54. CreatedAt: t,
  55. AutoTaskID: infoAutoTask.AutoTaskID,
  56. AutoDefaultID: infoAutoDefault.AutoDefaultID,
  57. }
  58. if param.LocalType == 1 {
  59. newLocalLife.ServiceChargeRate = param.ServiceChargeRate
  60. }
  61. err = dao.LocalLifeDao{}.CreateLocalLife(newLocalLife)
  62. if err != nil {
  63. return nil, err
  64. }
  65. return &localId, nil
  66. }
  67. // 更新公开本地生活任务(招募要求、执行要求)
  68. func (s LocalLifeService) UpdateLocal(localUpdateParam *vo.LocalUpdateParam) (*string, error) {
  69. // 1. 检查该项目id有无本地任务
  70. localID := localUpdateParam.LocalID
  71. localLife, err := dao.LocalLifeDao{}.GetLocalById(localID)
  72. if err != nil {
  73. return nil, err
  74. }
  75. if localLife == nil {
  76. return nil, errors.New("本地生活项目不存在")
  77. }
  78. println("更新公开本地生活任务的招募策略")
  79. // 更新公开种草任务的招募策略
  80. var totalRecruitNum int64
  81. if localUpdateParam.RecruitStrategys != nil {
  82. // 1. 删除已有的招募策略
  83. err = dao.RecruitStrategyDao{}.DeleteRecruitStrategyByProjectID(localUpdateParam.LocalID)
  84. if err != nil {
  85. return nil, err
  86. }
  87. // 2. 接收并创建新的招募策略
  88. if len(localUpdateParam.RecruitStrategys) != 0 {
  89. var recruits []entity.RecruitStrategy
  90. for _, strategy := range localUpdateParam.RecruitStrategys {
  91. recruitStrategy := entity.RecruitStrategy{
  92. FeeForm: strategy.FeeForm,
  93. StrategyID: strategy.StrategyID,
  94. FollowersLow: strategy.FollowersLow,
  95. FollowersUp: strategy.FollowersUp,
  96. RecruitNumber: strategy.RecruitNumber,
  97. ProjectID: localLife.LocalID,
  98. StrategyType: 1,
  99. ServiceRate: localLife.ServiceChargeRate,
  100. }
  101. totalRecruitNum += strategy.RecruitNumber
  102. if strategy.FeeForm == 2 {
  103. recruitStrategy.Offer = strategy.Offer
  104. recruitStrategy.ServiceCharge = strategy.Offer * localUpdateParam.ServiceChargeRate
  105. recruitStrategy.TOffer = strategy.Offer * (1 - localUpdateParam.ServiceChargeRate)
  106. }
  107. recruits = append(recruits, recruitStrategy)
  108. }
  109. err = dao.RecruitStrategyDao{}.CreateRecruitStrategy(recruits)
  110. if err != nil {
  111. return nil, err
  112. }
  113. }
  114. }
  115. // 2. 数据准备
  116. //// a) 查找关联商品信息
  117. //product, err := dao.ProductDAO{}.GetProductByID(project.ProductID)
  118. //if err != nil {
  119. // return nil, err
  120. //}
  121. //productPhotos, err := dao.ProductPhotoDAO{}.GetProductPhotoByProductID(project.ProductID)
  122. //productInfoToJson, _ := json.Marshal(product)
  123. //productPhotosToJson, _ := json.Marshal(productPhotos)
  124. // d) 任务截止时间
  125. recruitDdl := time.Time{} //赋零值
  126. recruitDdl, _ = time.ParseInLocation("2006-01-02 15:04:05", localUpdateParam.RecruitDdl, time.Local)
  127. // f) 更新选品状态
  128. if localUpdateParam.LocalStatus != 2 && localUpdateParam.LocalStatus != 8 {
  129. localUpdateParam.LocalStatus = 1
  130. }
  131. t := time.Now()
  132. updateLocalLife := entity.LocalLifeInfo{
  133. StoreID: localUpdateParam.StoreId,
  134. TeamBuyingId: localUpdateParam.TeamBuyingId,
  135. ServiceChargeRate: localUpdateParam.ServiceChargeRate,
  136. PromoteBody: localUpdateParam.PromoteBody,
  137. Donate: localUpdateParam.Donate,
  138. TaskStatus: localUpdateParam.LocalStatus,
  139. LocalName: localUpdateParam.LocalName,
  140. TalentType: localUpdateParam.TalentType,
  141. RecruitDdl: recruitDdl,
  142. TaskForm: localUpdateParam.TaskForm,
  143. ContentType: localUpdateParam.ContentType,
  144. TaskDetail: localUpdateParam.TaskDetail,
  145. UpdatedAt: t,
  146. }
  147. if localUpdateParam.LocalStatus == 2 {
  148. updateLocalLife.SubmitAt = t
  149. }
  150. // 合并传入参数和数据表中原记录,若传入参数字段值为空,则将字段赋值为原记录中值
  151. result := util.MergeStructValue(&updateLocalLife, localLife)
  152. // 利用反射机制将interface类型转换为结构体类型
  153. v := reflect.ValueOf(&result).Elem()
  154. if v.Kind() == reflect.Struct {
  155. updateLocalLife = v.Interface().(entity.LocalLifeInfo)
  156. //fmt.Println(p)
  157. }
  158. // c) 计算预估成本(如果有)
  159. /*
  160. var estimatedCost float64
  161. if conv.MustInt(updateSelection.TaskMode, 0) == 1 {
  162. estimatedCost = conv.MustFloat64(updateSelection.TaskReward, 0) * conv.MustFloat64(updateSelection.SampleNum, 0)
  163. }
  164. estimatedCostToString, _ := conv.String(estimatedCost)
  165. updateSelection.EstimatedCost = estimatedCostToString
  166. */
  167. // 3. 更新选品
  168. err = dao.LocalLifeDao{}.UpdateLocal(updateLocalLife)
  169. if err != nil {
  170. return nil, err
  171. }
  172. // 4. 更新选品brief和示例(本地生活任务补充信息)
  173. if localUpdateParam.LocalBrief != nil {
  174. // 删除已有brief
  175. err = dao.LocalLifeBriefDao{}.DeleteLocalBriefByLocalId(localLife.LocalID)
  176. if err != nil {
  177. return nil, err
  178. }
  179. // 插入新的brief
  180. for _, v := range localUpdateParam.LocalBrief {
  181. brief := entity.LocalLifeBrief{
  182. LocalID: localLife.LocalID,
  183. FileUid: v.FileUid,
  184. FileName: v.Name,
  185. FileUrl: v.FileUrl,
  186. CreatedAt: time.Now(),
  187. Type: v.Type,
  188. }
  189. err = dao.LocalLifeBriefDao{}.CreateLocalBrief(brief)
  190. if err != nil {
  191. return nil, err
  192. }
  193. }
  194. }
  195. if localUpdateParam.LocalMaterial != nil {
  196. // 删除已有示例
  197. err = dao.LocalLifeMaterialDao{}.DeleteLocalMaterialByLocalId(localLife.LocalID)
  198. if err != nil {
  199. return nil, err
  200. }
  201. // 插入新的示例
  202. for _, v := range localUpdateParam.LocalMaterial {
  203. material := entity.LocalLifeMaterial{
  204. LocalID: localLife.LocalID,
  205. FileUid: v.FileUid,
  206. FileName: v.Name,
  207. FileUrl: v.FileUrl,
  208. CreatedAt: time.Now(),
  209. Type: v.Type,
  210. }
  211. err = dao.LocalLifeMaterialDao{}.CreateLocalMaterial(material)
  212. if err != nil {
  213. return nil, err
  214. }
  215. }
  216. }
  217. return &updateLocalLife.LocalID, nil
  218. }
  219. // 更新定向本地生活任务(招募要求、执行要求)
  220. func (s LocalLifeService) UpdateLocalTarget(localUpdateParam *vo.LocalUpdateParam) (*string, error) {
  221. // 1. 检查该项目id有无本地任务
  222. localID := localUpdateParam.LocalID
  223. localLife, err := dao.LocalLifeDao{}.GetLocalById(localID)
  224. if err != nil {
  225. return nil, err
  226. }
  227. if localLife == nil {
  228. return nil, errors.New("本地生活项目不存在")
  229. }
  230. println("更新定向本地生活任务的招募策略")
  231. // 更新公开种草任务的招募策略
  232. var totalRecruitNum int64
  233. if localUpdateParam.RecruitStrategys != nil {
  234. // 1. 删除已有的招募策略
  235. err = dao.RecruitStrategyDao{}.DeleteRecruitStrategyByProjectID(localUpdateParam.LocalID)
  236. if err != nil {
  237. return nil, err
  238. }
  239. // 2. 接收并创建新的招募策略
  240. if len(localUpdateParam.RecruitStrategys) != 0 {
  241. var recruits []entity.RecruitStrategy
  242. for _, strategy := range localUpdateParam.RecruitStrategys {
  243. recruitStrategy := entity.RecruitStrategy{
  244. FeeForm: strategy.FeeForm,
  245. StrategyID: strategy.StrategyID,
  246. FollowersLow: strategy.FollowersLow,
  247. FollowersUp: strategy.FollowersUp,
  248. RecruitNumber: strategy.RecruitNumber,
  249. ProjectID: localLife.LocalID,
  250. StrategyType: 1,
  251. ServiceRate: localLife.ServiceChargeRate,
  252. }
  253. totalRecruitNum += strategy.RecruitNumber
  254. if strategy.FeeForm == 2 {
  255. recruitStrategy.Offer = strategy.Offer // 报价
  256. }
  257. recruits = append(recruits, recruitStrategy)
  258. }
  259. err = dao.RecruitStrategyDao{}.CreateRecruitStrategy(recruits)
  260. if err != nil {
  261. return nil, err
  262. }
  263. }
  264. }
  265. // 2. 数据准备
  266. // a) 查找关联商品信息
  267. //product, err := dao.ProductDAO{}.GetProductByID(project.ProductID)
  268. //if err != nil {
  269. // return nil, err
  270. //}
  271. //productPhotos, err := dao.ProductPhotoDAO{}.GetProductPhotoByProductID(project.ProductID)
  272. //productInfoToJson, _ := json.Marshal(product)
  273. //productPhotosToJson, _ := json.Marshal(productPhotos)
  274. // d) 任务截止时间
  275. recruitDdl := time.Time{} //赋零值
  276. recruitDdl, _ = time.ParseInLocation("2006-01-02 15:04:05", localUpdateParam.RecruitDdl, time.Local)
  277. // f) 更新选品状态
  278. if localUpdateParam.LocalStatus != 2 && localUpdateParam.LocalStatus != 8 {
  279. localUpdateParam.LocalStatus = 1
  280. }
  281. t := time.Now()
  282. updateLocalLife := entity.LocalLifeInfo{
  283. StoreID: localUpdateParam.StoreId,
  284. TeamBuyingId: localUpdateParam.TeamBuyingId,
  285. ServiceChargeRate: localUpdateParam.ServiceChargeRate,
  286. PromoteBody: localUpdateParam.PromoteBody,
  287. Donate: localUpdateParam.Donate,
  288. TaskStatus: localUpdateParam.LocalStatus,
  289. LocalName: localUpdateParam.LocalName,
  290. TalentType: localUpdateParam.TalentType,
  291. RecruitDdl: recruitDdl,
  292. TaskForm: localUpdateParam.TaskForm,
  293. ContentType: localUpdateParam.ContentType,
  294. TaskDetail: localUpdateParam.TaskDetail,
  295. UpdatedAt: t,
  296. Tools: localUpdateParam.Tools,
  297. }
  298. if localUpdateParam.LocalStatus == 2 {
  299. updateLocalLife.SubmitAt = t
  300. }
  301. // 合并传入参数和数据表中原记录,若传入参数字段值为空,则将字段赋值为原记录中值
  302. result := util.MergeStructValue(&updateLocalLife, localLife)
  303. // 利用反射机制将interface类型转换为结构体类型
  304. v := reflect.ValueOf(&result).Elem()
  305. if v.Kind() == reflect.Struct {
  306. updateLocalLife = v.Interface().(entity.LocalLifeInfo)
  307. //fmt.Println(p)
  308. }
  309. // c) 计算预估成本(如果有)
  310. /*
  311. var estimatedCost float64
  312. if conv.MustInt(updateSelection.TaskMode, 0) == 1 {
  313. estimatedCost = conv.MustFloat64(updateSelection.TaskReward, 0) * conv.MustFloat64(updateSelection.SampleNum, 0)
  314. }
  315. estimatedCostToString, _ := conv.String(estimatedCost)
  316. updateSelection.EstimatedCost = estimatedCostToString
  317. */
  318. // 3. 更新选品
  319. err = dao.LocalLifeDao{}.UpdateLocal(updateLocalLife)
  320. if err != nil {
  321. return nil, err
  322. }
  323. // 4. 更新选品brief和示例(本地生活任务补充信息)
  324. if localUpdateParam.LocalBrief != nil {
  325. // 删除已有brief
  326. err = dao.ProjectBriefDao{}.DeleteSecBriefBySelectionId(localLife.LocalID)
  327. if err != nil {
  328. return nil, err
  329. }
  330. // 插入新的brief
  331. for _, v := range localUpdateParam.LocalBrief {
  332. brief := entity.ProjectBrief{
  333. ProjectID: localLife.LocalID,
  334. FileUid: v.FileUid,
  335. FileName: v.Name,
  336. FileUrl: v.FileUrl,
  337. CreatedAt: time.Now(),
  338. Type: v.Type,
  339. }
  340. err = dao.ProjectBriefDao{}.CreateProjectBrief(brief)
  341. if err != nil {
  342. return nil, err
  343. }
  344. }
  345. }
  346. if localUpdateParam.LocalMaterial != nil {
  347. // 删除已有示例
  348. err = dao.ProjectMaterialDao{}.DeleteProjectMaterialByProjectId(localLife.LocalID)
  349. if err != nil {
  350. return nil, err
  351. }
  352. // 插入新的示例
  353. for _, v := range localUpdateParam.LocalMaterial {
  354. projectMaterial := entity.ProjectMaterial{
  355. ProjectID: localLife.LocalID,
  356. FileUid: v.FileUid,
  357. FileName: v.Name,
  358. FileUrl: v.FileUrl,
  359. CreatedAt: time.Now(),
  360. Type: v.Type,
  361. }
  362. err = dao.ProjectMaterialDao{}.CreateProjectMaterial(projectMaterial)
  363. if err != nil {
  364. return nil, err
  365. }
  366. }
  367. }
  368. return &updateLocalLife.LocalID, nil
  369. }
  370. // 本地生活任务预览
  371. func (s LocalLifeService) GetLocalLifeDetail(localId string) (*vo.ReLocalDetail, error) {
  372. reLocalDetail := vo.ReLocalDetail{}
  373. localLife, err := dao.LocalLifeDao{}.GetLocalById(localId)
  374. if err != nil {
  375. logrus.Errorf("[localLifeDB service] call GetLocalById error,err:%+v", err)
  376. return nil, err
  377. }
  378. // 系统信息
  379. reLocalDetail.LocalId = localId
  380. reLocalDetail.LocalStatus = localLife.TaskStatus
  381. reLocalDetail.LocalPlatform = localLife.LocalPlatform
  382. reLocalDetail.CreatedAt = localLife.CreatedAt.Format("2006-01-02 15:04:05")
  383. reLocalDetail.EstimatedCost = localLife.EstimatedCost // 预估成本
  384. reLocalDetail.ServiceChargeRate = localLife.ServiceChargeRate
  385. var creatorName, phone string
  386. if localLife.OperatorType == 1 && localLife.SubAccountID == 0 {
  387. enterprise, err := dao.EnterpriseDao{}.GetEnterprise(localLife.EnterpriseID)
  388. if err == nil && enterprise != nil {
  389. creatorName = enterprise.BusinessName
  390. phone, err = dao.UserDao{}.GetPhoneByUserId(enterprise.UserId)
  391. }
  392. } else if localLife.OperatorType == 1 && localLife.SubAccountID != 0 {
  393. subAccount, err := dao.SubAccountDao{}.GetSubAccount(localLife.SubAccountID)
  394. if err == nil && subAccount != nil {
  395. creatorName = subAccount.SubAccountName
  396. phone, err = dao.UserDao{}.GetPhoneByUserId(subAccount.UserId)
  397. }
  398. }
  399. reLocalDetail.CreatorName = creatorName
  400. reLocalDetail.Phone = phone
  401. // 关联主体
  402. var reStore vo.ReStorePreview
  403. store, err := dao.StoreDao{}.GetStoreByID(localLife.StoreID)
  404. if err == nil {
  405. photoUrl, e := dao.ProductPhotoDAO{}.GetMainPhotoByStoreID(store.StoreID)
  406. if e != nil {
  407. photoUrl = ""
  408. }
  409. reStore = vo.ReStorePreview{
  410. StoreID: store.StoreID,
  411. StoreName: store.StoreName,
  412. StoreLocation: store.StoreLocation,
  413. StoreCategory: store.StoreCategory,
  414. TeamNum: store.TeamNum,
  415. StoreDetail: store.StoreDetail,
  416. CreatedAt: store.CreatedAt.Format("2006-01-02 15:04:05"),
  417. PhotoUrl: photoUrl,
  418. }
  419. }
  420. reLocalDetail.StoreInfo = &reStore
  421. var reTeamBuying vo.ReTeamBuyingPreview
  422. teamBuying, err := dao.TeamBuyingDao{}.GetTeamBuyingByID(localLife.TeamBuyingId)
  423. if err == nil {
  424. photoUrl, e := dao.ProductPhotoDAO{}.GetMainPhotoByTeamBuyingID(teamBuying.TeamBuyingID)
  425. if e != nil {
  426. photoUrl = ""
  427. }
  428. reTeamBuying = vo.ReTeamBuyingPreview{
  429. TeamBuyingID: teamBuying.TeamBuyingID,
  430. TeamBuyingName: teamBuying.TeamBuyingName,
  431. TeamBuyingPrice: teamBuying.TeamBuyingPrice,
  432. TeamBuyingCategory: teamBuying.TeamBuyingCategory,
  433. TeamBuyingDetail: teamBuying.TeamBuyingDetail,
  434. CreatedAt: teamBuying.CreatedAt.Format("2006-01-02 15:04:05"),
  435. PhotoUrl: photoUrl,
  436. }
  437. }
  438. reLocalDetail.TeamBuyingInfo = &reTeamBuying
  439. reLocalDetail.PromoteBody = localLife.PromoteBody
  440. reLocalDetail.Donate = localLife.Donate
  441. // 招募要求
  442. reLocalDetail.TalentType = localLife.TalentType
  443. reLocalDetail.RecruitDdl = localLife.RecruitDdl.Format("2006-01-02 15:04:05")
  444. var recruitStrategysPreviews []*vo.LocalRecruitStrategy
  445. recruitStrategys, err := dao.RecruitStrategyDao{}.GetRecruitStrategyByProjectId(localId)
  446. if err != nil {
  447. logrus.Errorf("[localLifeDB service] call GetRecruitStrategy error,err:%+v", err)
  448. return nil, err
  449. }
  450. for _, recruitStrategy := range recruitStrategys {
  451. recruitStrategysPreview := &vo.LocalRecruitStrategy{
  452. StrategyId: recruitStrategy.StrategyID,
  453. FeeForm: recruitStrategy.FeeForm,
  454. FollowersLow: recruitStrategy.FollowersLow,
  455. FollowersUp: recruitStrategy.FollowersUp,
  456. RecruitNumber: recruitStrategy.RecruitNumber,
  457. Offer: recruitStrategy.Offer,
  458. TOffer: recruitStrategy.TOffer,
  459. ServiceCharge: recruitStrategy.ServiceCharge,
  460. SelectedNumber: recruitStrategy.SelectedNumber,
  461. TotalOffer: recruitStrategy.TotalOffer,
  462. }
  463. recruitStrategysPreviews = append(recruitStrategysPreviews, recruitStrategysPreview)
  464. }
  465. reLocalDetail.RecruitStrategys = recruitStrategysPreviews
  466. // 执行要求
  467. reLocalDetail.TaskForm = localLife.TaskForm
  468. reLocalDetail.ContentType = localLife.ContentType
  469. reLocalDetail.TaskDetail = localLife.TaskDetail
  470. taskBriefInfos, err := dao.ProjectBriefDao{}.GetProjectBriefInfo(localId)
  471. if err != nil {
  472. logrus.Errorf("[localLifeDB service] call GetProjectBriefInfo error,err:%+v", err)
  473. return nil, err
  474. }
  475. taskMaterials, err := dao.ProjectMaterialDao{}.GetProjectMaterialInfo(localId)
  476. if err != nil {
  477. logrus.Errorf("[localLifeDB service] call GetprojectMaterialInfo error,err:%+v", err)
  478. return nil, err
  479. }
  480. reLocalDetail.TaskBriefs = taskBriefInfos
  481. reLocalDetail.TaskMaterials = taskMaterials
  482. reLocalDetail.Tools = localLife.Tools
  483. return &reLocalDetail, nil
  484. }
  485. // 本地生活提交审核
  486. func (s LocalLifeService) LocalLifeToReview(localUpdateParam *vo.LocalUpdateParam) (*string, error) {
  487. localId := localUpdateParam.LocalID
  488. local, err := dao.LocalLifeDao{}.GetLocalById(localId)
  489. if err != nil {
  490. logrus.Errorf("[projectInfoDB service] call GetProject error,err:%+v", err)
  491. return nil, err
  492. }
  493. localName := local.LocalName // 任务标题
  494. localDetail := local.TaskDetail // 任务详情
  495. store, err := dao.StoreDao{}.GetStoreByID(local.StoreID)
  496. if err != nil {
  497. return nil, err
  498. }
  499. storeName := store.StoreName // 门店名称
  500. storeDetail := store.StoreDetail // 门店特点
  501. storeMainPhoto, err1 := dao.ProductPhotoDAO{}.GetMainPhotoByStoreID(store.StoreID)
  502. if err1 != nil {
  503. return nil, err1
  504. }
  505. teamBuying, err2 := dao.TeamBuyingDao{}.GetTeamBuyingByID(local.TeamBuyingId)
  506. if err2 != nil {
  507. return nil, err2
  508. }
  509. teamBuyingName := teamBuying.TeamBuyingName // 团购标题
  510. teamBuyingDetail := teamBuying.TeamBuyingDetail // 团购详情
  511. teamBuyingMainPhoto, err3 := dao.ProductPhotoDAO{}.GetMainPhotoByTeamBuyingID(teamBuying.TeamBuyingID)
  512. if err3 != nil {
  513. return nil, err3
  514. }
  515. var images []string
  516. var videos []string
  517. var videoJobIds []string
  518. var documents []string
  519. var documentJobIds []string
  520. reviewService := review_service.GetConfig()
  521. storePhotos, err4 := dao.ProductPhotoDAO{}.GetProductPhotoByStoreID(local.StoreID)
  522. if err4 != nil {
  523. return nil, err4
  524. }
  525. for _, storePhoto := range storePhotos {
  526. if storePhoto.Symbol == 2 || storePhoto.Symbol == 4 {
  527. images = append(images, storePhoto.PhotoUrl)
  528. } else if storePhoto.Symbol == 3 || storePhoto.Symbol == 5 {
  529. var videoJobId *string
  530. var reviewErr error
  531. i := 10
  532. for {
  533. videoJobId, reviewErr = reviewService.CheckVideo(storePhoto.PhotoUrl)
  534. if reviewErr == nil || i == 0 {
  535. break
  536. }
  537. i -= 1
  538. }
  539. if reviewErr != nil {
  540. return nil, reviewErr
  541. }
  542. videos = append(videos, storePhoto.PhotoUrl)
  543. videoJobIds = append(videoJobIds, *videoJobId)
  544. }
  545. }
  546. teamBuyingPhotos, err5 := dao.ProductPhotoDAO{}.GetProductPhotoByTeamBuyingID(local.TeamBuyingId)
  547. if err5 != nil {
  548. return nil, err5
  549. }
  550. for _, teamBuyingPhoto := range teamBuyingPhotos {
  551. if teamBuyingPhoto.Symbol == 2 || teamBuyingPhoto.Symbol == 4 {
  552. images = append(images, teamBuyingPhoto.PhotoUrl)
  553. } else if teamBuyingPhoto.Symbol == 3 || teamBuyingPhoto.Symbol == 5 {
  554. var videoJobId *string
  555. var reviewErr error
  556. i := 10
  557. for {
  558. videoJobId, reviewErr = reviewService.CheckVideo(teamBuyingPhoto.PhotoUrl)
  559. if reviewErr == nil || i == 0 {
  560. break
  561. }
  562. i -= 1
  563. }
  564. if reviewErr != nil {
  565. return nil, reviewErr
  566. }
  567. videos = append(videos, teamBuyingPhoto.PhotoUrl)
  568. videoJobIds = append(videoJobIds, *videoJobId)
  569. }
  570. }
  571. localBriefInfos, err6 := dao.LocalLifeBriefDao{}.GetLocalBriefInfo(localId)
  572. if err6 != nil {
  573. return nil, err6
  574. }
  575. for _, localBriefInfo := range localBriefInfos {
  576. if localBriefInfo.Type == 1 {
  577. images = append(images, localBriefInfo.FileUrl)
  578. } else if localBriefInfo.Type == 2 {
  579. var documentJobId *string
  580. var reviewErr error
  581. i := 10
  582. fileType := "pdf"
  583. parts := strings.Split(localBriefInfo.FileName, ".")
  584. if len(parts) > 1 {
  585. fileType = parts[len(parts)-1]
  586. }
  587. for {
  588. documentJobId, reviewErr = reviewService.CheckDocument(localBriefInfo.FileUrl, fileType)
  589. if reviewErr == nil || i == 0 {
  590. break
  591. }
  592. i -= 1
  593. }
  594. if reviewErr != nil {
  595. return nil, reviewErr
  596. }
  597. documents = append(documents, localBriefInfo.FileUrl)
  598. documentJobIds = append(documentJobIds, *documentJobId)
  599. }
  600. }
  601. localMaterials, err7 := dao.LocalLifeMaterialDao{}.GetLocalMaterialInfo(localId)
  602. if err7 != nil {
  603. return nil, err7
  604. }
  605. for _, localMaterial := range localMaterials {
  606. if localMaterial.Type == 1 {
  607. images = append(images, localMaterial.FileUrl)
  608. } else if localMaterial.Type == 2 {
  609. var videoJobId *string
  610. var reviewErr error
  611. i := 10
  612. for {
  613. videoJobId, reviewErr = reviewService.CheckVideo(localMaterial.FileUrl)
  614. if reviewErr == nil || i == 0 {
  615. break
  616. }
  617. i -= 1
  618. }
  619. if reviewErr != nil {
  620. return nil, reviewErr
  621. }
  622. videos = append(videos, localMaterial.FileUrl)
  623. videoJobIds = append(videoJobIds, *videoJobId)
  624. }
  625. }
  626. newReviewLocal := &entity.ReviewLocalLife{
  627. LocalID: localId,
  628. TaskName: localName,
  629. TaskDetail: localDetail,
  630. StoreMainPhoto: storeMainPhoto,
  631. StoreName: storeName,
  632. StoreDetail: storeDetail,
  633. TeamBuyingMainPhoto: teamBuyingMainPhoto,
  634. TeamBuyingName: teamBuyingName,
  635. TeamBuyingDetail: teamBuyingDetail,
  636. Images: strings.Join(images, ","),
  637. Videos: strings.Join(videos, ","),
  638. Documents: strings.Join(documents, ","),
  639. VideoJobIds: strings.Join(videoJobIds, ","),
  640. DocumentJobIds: strings.Join(documentJobIds, ","),
  641. Status: 1,
  642. }
  643. err8 := dao.LocalLifeReviewDao{}.Create(newReviewLocal)
  644. if err8 != nil {
  645. return nil, err8
  646. }
  647. t := time.Now()
  648. updateLocal := entity.LocalLifeInfo{
  649. LocalID: localId,
  650. TaskStatus: 2,
  651. UpdatedAt: t,
  652. }
  653. err9 := dao.LocalLifeDao{}.UpdateLocal(updateLocal)
  654. if err9 != nil {
  655. return nil, err9
  656. }
  657. return &localId, nil
  658. }
  659. // 本地生活任务列表
  660. func (s LocalLifeService) GetLocalLifeTaskList(param *vo.LocalSearchParam) (vo.ResultVO, error) {
  661. if param.Page == 0 {
  662. param.Page = 1
  663. }
  664. if param.PageSize == 0 {
  665. param.PageSize = 10
  666. }
  667. var result vo.ResultVO
  668. reLocalTaskPreviews, total, err := (&dao.LocalLifeDao{}).GetLocalPreviews(param)
  669. if err != nil {
  670. return result, err
  671. }
  672. for i := range reLocalTaskPreviews {
  673. var creatorName string
  674. var storeName string
  675. var storeLocation string
  676. var mainImage string
  677. if reLocalTaskPreviews[i].SubAccountId == 0 {
  678. enterprise, err := dao.EnterpriseDao{}.GetEnterprise(reLocalTaskPreviews[i].EnterpriseId)
  679. if err == nil && enterprise != nil {
  680. creatorName = enterprise.BusinessName
  681. }
  682. } else {
  683. subAccount, err := dao.SubAccountDao{}.GetSubAccount(reLocalTaskPreviews[i].SubAccountId)
  684. if err == nil && subAccount != nil {
  685. creatorName = subAccount.SubAccountName
  686. }
  687. }
  688. store, err := dao.StoreDao{}.GetStoreByID(reLocalTaskPreviews[i].StoreId)
  689. if err == nil && store != nil {
  690. storeName = store.StoreName
  691. storeLocation = store.StoreLocation
  692. }
  693. mainImage, err = dao.ProductPhotoDAO{}.GetMainPhotoByStoreID(reLocalTaskPreviews[i].StoreId)
  694. reLocalTaskPreviews[i].CreatorName = creatorName
  695. reLocalTaskPreviews[i].StoreName = storeName
  696. reLocalTaskPreviews[i].StoreLocation = storeLocation
  697. reLocalTaskPreviews[i].MainImage = mainImage
  698. }
  699. result = vo.ResultVO{
  700. Page: param.Page,
  701. PageSize: param.PageSize,
  702. Total: total,
  703. Data: reLocalTaskPreviews,
  704. }
  705. return result, nil
  706. }
  707. // 删除本地生活任务
  708. func (s LocalLifeService) DeleteLocalLife(localId string) (*string, error) {
  709. res, err := dao.LocalLifeDao{}.DeleteLocalLife(localId)
  710. if err != nil {
  711. logrus.Errorf("[DeleteLocalLife service] call DeleteLocalLife error,err:%+v", err)
  712. return res, err
  713. }
  714. return res, nil
  715. }
  716. // 草稿箱——本地生活
  717. func (s LocalLifeService) GetLocalLifeDraftList(param *vo.LocalDraftParam) (vo.ResultVO, error) {
  718. if param.Page == 0 {
  719. param.Page = 1
  720. }
  721. if param.PageSize == 0 {
  722. param.PageSize = 10
  723. }
  724. var result vo.ResultVO
  725. reLocalTaskPreviews, total, err := (&dao.LocalLifeDao{}).GetLocalDraftList(param)
  726. if err != nil {
  727. return result, err
  728. }
  729. for i := range reLocalTaskPreviews {
  730. var creatorName string
  731. var storeName string
  732. var storeLocation string
  733. var mainImage string
  734. if reLocalTaskPreviews[i].SubAccountId == 0 {
  735. enterprise, err := dao.EnterpriseDao{}.GetEnterprise(reLocalTaskPreviews[i].EnterpriseId)
  736. if err == nil && enterprise != nil {
  737. creatorName = enterprise.BusinessName
  738. }
  739. } else {
  740. subAccount, err := dao.SubAccountDao{}.GetSubAccount(reLocalTaskPreviews[i].SubAccountId)
  741. if err == nil && subAccount != nil {
  742. creatorName = subAccount.SubAccountName
  743. }
  744. }
  745. store, err := dao.StoreDao{}.GetStoreByID(reLocalTaskPreviews[i].StoreId)
  746. if err == nil && store != nil {
  747. storeName = store.StoreName
  748. storeLocation = store.StoreLocation
  749. }
  750. mainImage, err = dao.ProductPhotoDAO{}.GetMainPhotoByStoreID(reLocalTaskPreviews[i].StoreId)
  751. reLocalTaskPreviews[i].CreatorName = creatorName
  752. reLocalTaskPreviews[i].StoreName = storeName
  753. reLocalTaskPreviews[i].StoreLocation = storeLocation
  754. reLocalTaskPreviews[i].MainImage = mainImage
  755. }
  756. result = vo.ResultVO{
  757. Page: param.Page,
  758. PageSize: param.PageSize,
  759. Total: total,
  760. Data: reLocalTaskPreviews,
  761. }
  762. return result, nil
  763. }
  764. // 探店本地生活列表
  765. func (s LocalLifeService) GetStoreExploreList(param *vo.LocalSearchParam) (vo.ResultVO, error) {
  766. if param.Page == 0 {
  767. param.Page = 1
  768. }
  769. if param.PageSize == 0 {
  770. param.PageSize = 10
  771. }
  772. var result vo.ResultVO
  773. reLocalStoreExplorePreviews, total, err := (&dao.LocalLifeDao{}).GetLocalStoreExplorePreviews(param)
  774. if err != nil {
  775. return result, err
  776. }
  777. for i := range reLocalStoreExplorePreviews {
  778. var creatorName string
  779. var storeName string
  780. var storeLocation string
  781. var mainImage string
  782. if reLocalStoreExplorePreviews[i].SubAccountId == 0 {
  783. enterprise, err := dao.EnterpriseDao{}.GetEnterprise(reLocalStoreExplorePreviews[i].EnterpriseId)
  784. if err == nil && enterprise != nil {
  785. creatorName = enterprise.BusinessName
  786. }
  787. } else {
  788. subAccount, err := dao.SubAccountDao{}.GetSubAccount(reLocalStoreExplorePreviews[i].SubAccountId)
  789. if err == nil && subAccount != nil {
  790. creatorName = subAccount.SubAccountName
  791. }
  792. }
  793. store, err := dao.StoreDao{}.GetStoreByID(reLocalStoreExplorePreviews[i].StoreId)
  794. if err == nil && store != nil {
  795. storeName = store.StoreName
  796. storeLocation = store.StoreLocation
  797. }
  798. mainImage, err = dao.ProductPhotoDAO{}.GetMainPhotoByStoreID(reLocalStoreExplorePreviews[i].StoreId)
  799. reLocalStoreExplorePreviews[i].CreatorName = creatorName
  800. reLocalStoreExplorePreviews[i].StoreName = storeName
  801. reLocalStoreExplorePreviews[i].StoreLocation = storeLocation
  802. reLocalStoreExplorePreviews[i].MainImage = mainImage
  803. }
  804. result = vo.ResultVO{
  805. Page: param.Page,
  806. PageSize: param.PageSize,
  807. Total: total,
  808. Data: reLocalStoreExplorePreviews,
  809. }
  810. return result, nil
  811. }
  812. // 探店达人详情
  813. func (s LocalLifeService) GetStoreExploreInfo(param *vo.StoreExploreParam) (*vo.ResultVO, error) {
  814. if param.Page <= 0 {
  815. param.Page = 1
  816. }
  817. if param.PageSize <= 0 {
  818. param.PageSize = 10
  819. }
  820. var reStoreExploreTalents []*vo.ReStoreExploreTalent
  821. var total int64
  822. result := vo.ResultVO{
  823. Page: param.Page,
  824. PageSize: param.PageSize,
  825. Total: total,
  826. Data: reStoreExploreTalents,
  827. }
  828. var localLifeTaskInfos []*entity.LocalLifeTaskInfo
  829. var err error
  830. localLifeId := param.LocalLifeId
  831. if param.Status == 1 { // 待预约
  832. localLifeTaskInfos, total, err = dao.LocalLifeTaskInfoDao{}.GetListByTaskStage(localLifeId, 1, "", param.Page, param.PageSize)
  833. } else if param.Status == 2 { // 待确认
  834. localLifeTaskInfos, total, err = dao.LocalLifeTaskInfoDao{}.GetListByTaskStage(localLifeId, 2, param.SearchTime, param.Page, param.PageSize)
  835. } else if param.Status == 3 { // 待探店
  836. localLifeTaskInfos, total, err = dao.LocalLifeTaskInfoDao{}.GetListByTaskStage(localLifeId, 5, param.SearchTime, param.Page, param.PageSize)
  837. } else if param.Status == 4 { // 已探店
  838. localLifeTaskInfos, total, err = dao.LocalLifeTaskInfoDao{}.GetListByTaskStage(localLifeId, 6, param.SearchTime, param.Page, param.PageSize)
  839. }
  840. if err != nil {
  841. return nil, err
  842. }
  843. for _, localLifeTaskInfo := range localLifeTaskInfos {
  844. // 获取达人信息
  845. talentInfo, err := dao.TalentInfoDao{}.SelectTalentInfo(localLifeTaskInfo.TalentID)
  846. if err != nil {
  847. return nil, err
  848. }
  849. //regionName, err := dao.RegionInfoDao{}.SelectRegion(talentInfo.VisitStoreRegion)
  850. //if err != nil {
  851. // regionName = ""
  852. //}
  853. regionName := localLifeTaskInfo.City
  854. talentPreview := &vo.TalentPreview{
  855. TalentId: localLifeTaskInfo.TalentID,
  856. TalentPhoto: talentInfo.Avatar,
  857. TalentName: talentInfo.TalentWxNickname,
  858. Account: "",
  859. Location: regionName,
  860. }
  861. reStoreExploreTalent := &vo.ReStoreExploreTalent{
  862. ReTalentPreview: talentPreview,
  863. }
  864. if param.Status == 1 {
  865. reStoreExploreTalent.CooperateTime = localLifeTaskInfo.SelectDate.Format("2006-01-02 15:04:05")
  866. } else if param.Status == 2 {
  867. reStoreExploreTalent.ReserveTime = localLifeTaskInfo.ReserveTime.Format("2006-01-02 15:04:05")
  868. } else if param.Status == 3 {
  869. reStoreExploreTalent.ExploreTime = localLifeTaskInfo.ExploreTime.Format("2006-01-02 15:04:05")
  870. reStoreExploreTalent.Operator = ""
  871. } else if param.Status == 4 {
  872. reStoreExploreTalent.FinishExploreTime = localLifeTaskInfo.FinishExploreTime.Format("2006-01-02 15:04:05")
  873. reStoreExploreTalent.Operator = ""
  874. }
  875. reStoreExploreTalents = append(reStoreExploreTalents, reStoreExploreTalent)
  876. }
  877. result = vo.ResultVO{
  878. Page: param.Page,
  879. PageSize: param.PageSize,
  880. Total: total,
  881. Data: reStoreExploreTalents,
  882. }
  883. return &result, nil
  884. }