product_service.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. package product
  2. import (
  3. "errors"
  4. logger "eta/eta_mini_ht_api/common/component/log"
  5. "eta/eta_mini_ht_api/common/exception"
  6. "eta/eta_mini_ht_api/common/utils/page"
  7. permissionService "eta/eta_mini_ht_api/domian/config"
  8. merchantService "eta/eta_mini_ht_api/domian/merchant"
  9. reportDomain "eta/eta_mini_ht_api/domian/report"
  10. "eta/eta_mini_ht_api/domian/user"
  11. "eta/eta_mini_ht_api/models/config"
  12. "eta/eta_mini_ht_api/models/image"
  13. "eta/eta_mini_ht_api/models/media"
  14. configService "eta/eta_mini_ht_api/service/config"
  15. mediaService "eta/eta_mini_ht_api/service/media"
  16. "eta/eta_mini_ht_api/service/order"
  17. reportService "eta/eta_mini_ht_api/service/report"
  18. "fmt"
  19. "gorm.io/gorm"
  20. "sync"
  21. "time"
  22. )
  23. type ProductDTO struct {
  24. Id int `json:"id"`
  25. Title string `json:"title"`
  26. SourceTile string `json:"sourceTile"`
  27. Abstract string `json:"abstract"`
  28. Src string `json:"src"`
  29. PermissionNames []string `json:"permissionNames"`
  30. PermissionIds []int `json:"-"`
  31. Description string `json:"description"`
  32. Price string `json:"price"`
  33. CoverSrc int `json:"coverSrc"`
  34. CoverUrl string `json:"coverUrl"`
  35. RiskLevel string `json:"riskLevel"`
  36. Type string `json:"type"`
  37. BeginDate string `json:"beginDate"`
  38. EndDate string `json:"endDate"`
  39. SourceId int `json:"sourceId"`
  40. IsSubscribe bool `json:"isSubscribe"`
  41. ReportId int `json:"reportId"`
  42. MediaId int `json:"mediaId"`
  43. }
  44. func GetProductRiskLevel(product merchantService.MerchantProductDTO) (riskLevel, sourceTitle, sourceAbsract, coverSrc, sourceSrc string, permissionNames []string, permissionIds []int, err error) {
  45. switch product.Type {
  46. case "package":
  47. permissionRisk, permissionErr := config.PermissionsByPermissionId(product.SourceId)
  48. permissionNames = []string{permissionRisk.Name}
  49. permissionIds = []int{product.SourceId}
  50. if permissionErr != nil {
  51. logger.Error("获取权限信息失败[permissionId:%d]", product.SourceId)
  52. } else {
  53. riskLevel = permissionRisk.RiskLevel
  54. }
  55. coverSrc = product.CoverUrl
  56. case "audio", "video":
  57. mediaInfo, mediaErr := media.GetMediaById(product.Type, product.SourceId)
  58. sourceTitle, coverSrc, sourceSrc = mediaInfo.MediaName, mediaInfo.CoverSrc, mediaInfo.Src
  59. if mediaErr != nil {
  60. logger.Error("获取媒体信息失败[mediaType:%s,mediaId:%d]", product.Type, product.SourceId)
  61. }
  62. permissionIds, mediaErr = media.GetMediaPermissionMappingByMedia(product.Type, product.SourceId)
  63. if mediaErr != nil {
  64. logger.Error("获取媒体权限失败[mediaType:%s,mediaId:%d]", product.Type, product.SourceId)
  65. } else {
  66. permissions, permissionErr := permissionService.GetPermissionListByIds(permissionIds)
  67. if permissionErr != nil {
  68. logger.Error("获取权限信息失败[permissionIds:%v]", permissionIds)
  69. }
  70. permissionNames = mediaService.GetMediaPermissionNames(permissionIds)
  71. riskNum := configService.GetHighestRiskLevel(permissions)
  72. riskLevel = fmt.Sprintf("R%d", riskNum)
  73. }
  74. case "report":
  75. report, reportErr := reportDomain.GetReportById(product.SourceId)
  76. var coverSrcId int
  77. sourceAbsract, sourceTitle, coverSrcId = report.Abstract, report.Title, report.CoverSrc
  78. if coverSrcId > 0 {
  79. var imageSrc string
  80. imageSrc, coverSrcErr := image.GetImageSrc(coverSrcId)
  81. if coverSrcErr != nil {
  82. logger.Error("获取图片资源失败:%v,资源ID:%d", err, coverSrcId)
  83. } else {
  84. coverSrc = imageSrc
  85. }
  86. }
  87. if reportErr != nil {
  88. logger.Error("获取研报信息失败[reportId:%d]", product.SourceId)
  89. } else {
  90. switch report.Source {
  91. case reportDomain.SourceHT:
  92. permission, permissionErr := configService.GetPermissionByName(report.PlateName)
  93. if permissionErr != nil {
  94. logger.Error("获取板块权限失败[plateName:%s]", report.PlateName)
  95. } else {
  96. riskLevel = permission.RiskLevel
  97. permissionIds = []int{permission.PermissionId}
  98. }
  99. case reportDomain.SourceETA:
  100. permissions, permissionErr := configService.GetSecondPermissionsByClassifyId(report.ClassifyId)
  101. if permissionErr != nil {
  102. logger.Error("获取板块权限失败[plateName:%s]", report.PlateName)
  103. } else {
  104. riskNum := configService.GetHighestRiskLevel(permissions)
  105. for _, permission := range permissions {
  106. permissionIds = append(permissionIds, permission.PermissionId)
  107. }
  108. riskLevel = fmt.Sprintf("R%d", riskNum)
  109. }
  110. }
  111. _, permissionNames = reportService.GetReportPermissionNames(report.OrgId, report.Source)
  112. //permissionNames = strings.Join(permissionNamesList, ",")
  113. }
  114. default:
  115. logger.Warn("不支持的产品类型[%s]", product.Type)
  116. }
  117. return
  118. }
  119. func GetProductInfoById(productId int) (product ProductDTO, err error) {
  120. merchantProduct, err := merchantService.GetMerchantProductById(productId)
  121. if err != nil {
  122. err = exception.NewWithException(exception.ProductInfoError, err.Error())
  123. return
  124. }
  125. product = convertToProductDTO(merchantProduct)
  126. product.RiskLevel, product.SourceTile, product.Abstract, product.CoverUrl, product.Src, product.PermissionNames, _, err = GetProductRiskLevel(merchantProduct)
  127. if err != nil {
  128. logger.Error("获取风险等级失败[productId:%d]", productId)
  129. }
  130. return
  131. }
  132. func convertToProductDTO(product merchantService.MerchantProductDTO) (productDTO ProductDTO) {
  133. beginDate := time.Now()
  134. endDate := beginDate.Add(time.Duration(product.ValidDays) * 24 * time.Hour)
  135. productDTO = ProductDTO{
  136. Id: product.Id,
  137. Title: product.Title,
  138. Description: product.Description,
  139. Price: product.Price.String(),
  140. RiskLevel: product.RiskLevel,
  141. CoverSrc: product.CoverSrc,
  142. CoverUrl: product.CoverUrl,
  143. Type: product.Type,
  144. BeginDate: beginDate.Format(time.DateOnly),
  145. EndDate: endDate.Format(time.DateOnly),
  146. SourceId: product.SourceId,
  147. }
  148. if product.CoverUrl == "" && product.CoverSrc > 0 {
  149. imageSrc, err := image.GetImageSrc(product.CoverSrc)
  150. if err != nil {
  151. logger.Error("获取图片地址失败:%v,资源Id:%d", err, product.CoverSrc)
  152. } else {
  153. productDTO.CoverUrl = imageSrc
  154. }
  155. }
  156. return
  157. }
  158. // OpenProduct 开通产品
  159. func OpenProduct(templateUserId int, productOrderNo string) (err error) {
  160. proudctOrder, err := order.GetProductOrderByUser(templateUserId, productOrderNo)
  161. if err != nil {
  162. logger.Error("获取产品订单信息失败:%v", err)
  163. return
  164. }
  165. product, err := merchantService.GetMerchantProductById(proudctOrder.ProductID)
  166. if err != nil {
  167. logger.Error("获取产品信息失败:%v", err)
  168. return
  169. }
  170. return merchantService.OpenProduct(templateUserId, productOrderNo, product)
  171. }
  172. // OpenProduct 开通产品
  173. func CloseProduct(templateUserId int, productOrderNo string) (err error) {
  174. productOrder, err := order.GetProductOrderByUser(templateUserId, productOrderNo)
  175. if err != nil {
  176. logger.Error("获取产品订单信息失败:%v", err)
  177. return
  178. }
  179. product, err := merchantService.GetMerchantProductById(productOrder.ProductID)
  180. if err != nil {
  181. logger.Error("获取产品信息失败:%v", err)
  182. return
  183. }
  184. return merchantService.CloseProduct(templateUserId, productOrderNo, product)
  185. }
  186. //过期产品(套餐)
  187. // 退款关闭套餐
  188. func GetRelatePackage(info ProductDTO) (prodList []ProductDTO, err error) {
  189. switch info.Type {
  190. case "audio", "video":
  191. permissionIds, permissionErr := media.GetMediaPermissionMappingByMedia(info.Type, info.SourceId)
  192. if permissionErr != nil {
  193. logger.Error("获取媒体品种信息失败:%v", err)
  194. return
  195. }
  196. merchantProduct, pdErr := merchantService.GetProductListBySourceIds(permissionIds, "package")
  197. if pdErr != nil {
  198. return
  199. }
  200. for _, product := range merchantProduct {
  201. prodList = append(prodList, convertToProductDTO(product))
  202. }
  203. return
  204. case "report":
  205. reportInfo, reportErr := reportDomain.GetReportById(info.SourceId)
  206. if reportErr != nil {
  207. logger.Error("获取报告信息失败:%v", err)
  208. return
  209. }
  210. permissions := reportDomain.GetReportSecondPermissionsById(reportInfo.OrgId, reportInfo.Source)
  211. var permissionIds []int
  212. if len(permissions) > 0 {
  213. for _, permission := range permissions {
  214. permissionIds = append(permissionIds, permission.PermissionId)
  215. }
  216. permissionIds = append(permissionIds, permissions[0].PermissionId)
  217. }
  218. merchantProduct, pdErr := merchantService.GetProductListBySourceIds(permissionIds, "package")
  219. if pdErr != nil {
  220. return
  221. }
  222. for _, product := range merchantProduct {
  223. prodList = append(prodList, convertToProductDTO(product))
  224. }
  225. return
  226. default:
  227. err = exception.New(exception.ProductTypeError)
  228. return
  229. }
  230. }
  231. func GetProductListByProductType(productType string, permissionIds []int, templateUserId int) (total, latestId int64, productIds []int) {
  232. filterPermissionIds, riskLevel, err := reportService.CheckUserRisk(permissionIds, true, templateUserId)
  233. if err != nil {
  234. return
  235. }
  236. var dtoList []*ProductDTO
  237. productList, err := merchantService.GetProductListByProductType(productType)
  238. var wg sync.WaitGroup
  239. wg.Add(len(productList))
  240. for i := 0; i < len(productList); i++ {
  241. go func(merchantProduct merchantService.MerchantProductDTO) {
  242. defer wg.Done()
  243. product := convertToProductDTO(merchantProduct)
  244. product.RiskLevel, product.SourceTile, product.Abstract, product.CoverUrl, product.Src, product.PermissionNames, product.PermissionIds, err = GetProductRiskLevel(merchantProduct)
  245. if !compare(product.RiskLevel, riskLevel) {
  246. return
  247. }
  248. match := false
  249. for _, pdPermissionId := range product.PermissionIds {
  250. for _, permissionId := range filterPermissionIds {
  251. if pdPermissionId == permissionId {
  252. match = true
  253. break
  254. }
  255. }
  256. }
  257. if !match {
  258. return
  259. }
  260. dtoList = append(dtoList, &product)
  261. }(productList[i])
  262. }
  263. wg.Wait()
  264. total = int64(len(dtoList))
  265. var maxId int
  266. for i := 0; i < len(dtoList); i++ {
  267. productIds = append(productIds, dtoList[i].Id)
  268. if dtoList[i].Id > maxId {
  269. maxId = dtoList[i].Id
  270. }
  271. }
  272. latestId = int64(maxId)
  273. return
  274. }
  275. func compare(riskLevel, MatchRiskLevel string) bool {
  276. pRiskNum, riskErr := configService.ParseRiskLevel(riskLevel)
  277. if riskErr != nil {
  278. return false
  279. }
  280. riskLevelNum, riskErr := configService.ParseRiskLevel(MatchRiskLevel)
  281. if riskErr != nil {
  282. return false
  283. }
  284. if pRiskNum <= riskLevelNum {
  285. return true
  286. }
  287. return false
  288. }
  289. func ProductList(productIds []int, templateUserId int, info page.PageInfo) (dtoList []ProductDTO, err error) {
  290. var merchantProductList []merchantService.MerchantProductDTO
  291. merchantProductList, err = merchantService.GetProductPageByProductType(productIds, info)
  292. for _, product := range merchantProductList {
  293. productDTO := convertToProductDTO(product)
  294. productDTO.RiskLevel, productDTO.SourceTile, productDTO.Abstract, productDTO.CoverUrl, productDTO.Src, productDTO.PermissionNames, _, err = GetProductRiskLevel(product)
  295. dtoList = append(dtoList, productDTO)
  296. }
  297. var wg sync.WaitGroup
  298. wg.Add(len(dtoList))
  299. for i := 0; i < len(dtoList); i++ {
  300. go func(productDTO *ProductDTO) {
  301. defer wg.Done()
  302. subscibe, subErr := user.GetUserSubscribe(productDTO.Id, templateUserId)
  303. if subErr != nil {
  304. if errors.Is(subErr, gorm.ErrRecordNotFound) {
  305. logger.Error("用户未订阅单品,productId:%v", productDTO.Id)
  306. productDTO.IsSubscribe = false
  307. }
  308. logger.Error("获取用户订阅状态失败:%v", err)
  309. productDTO.IsSubscribe = false
  310. }
  311. }(&dtoList[i])
  312. }
  313. return
  314. }
  315. func RangeProductList(isSignal bool) (total, latestId int64, ids []int) {
  316. //return merchantService.CountProductListByProductType(isSignal)
  317. return 0, 0, nil
  318. }
  319. func ProductSearch(productType string, key string, templateUserId int, pageInfo page.PageInfo) (list []ProductDTO, err error) {
  320. var merchantProductList []merchantService.MerchantProductDTO
  321. merchantProductList, err = merchantService.GetProductListByProductType(productType)
  322. var sourceIds []int
  323. var maxId int
  324. for _, product := range merchantProductList {
  325. if product.SourceId > maxId {
  326. maxId = product.SourceId
  327. }
  328. sourceIds = append(sourceIds, product.SourceId)
  329. }
  330. //reportList, err := reportDomain.SearchReportList(key, sourceIds, 1, len(sourceIds), int64(maxId))
  331. //mediaList, err := mediaDomain.SearchMediaList(key)
  332. for _, product := range merchantProductList {
  333. productDTO := convertToProductDTO(product)
  334. list = append(list, productDTO)
  335. }
  336. return
  337. }
  338. func PackageSearch(key string, templateUserId int) (list []ProductDTO, err error) {
  339. return nil, nil
  340. }