product_service.go 12 KB

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