local_life_service.go 32 KB

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