product_service.go 11 KB

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