BICouponController.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. using Microsoft.AspNetCore.Hosting;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.Extensions.Configuration;
  4. using Microsoft.Extensions.Options;
  5. using System.Net.Http;
  6. using TEAMModelOS.SDK.DI;
  7. using TEAMModelOS.SDK;
  8. using TEAMModelOS.Models;
  9. using System.Text.Json;
  10. using System.Threading.Tasks;
  11. using System.Collections.Generic;
  12. using System.Text;
  13. using TEAMModelOS.SDK.Extension;
  14. using System;
  15. using System.Net.Http.Json;
  16. using System.ComponentModel.DataAnnotations;
  17. using System.Net;
  18. using System.Net.Http.Headers;
  19. using Newtonsoft.Json;
  20. using System.Text.Encodings.Web;
  21. namespace TEAMModelBI.Controllers.BICommon
  22. {
  23. [Route("coupon")]
  24. [ApiController]
  25. public class BICouponController : ControllerBase
  26. {
  27. private readonly DingDing _dingDing;
  28. private readonly Option _option;
  29. private readonly IConfiguration _configuration;
  30. private readonly AzureServiceBusFactory _serviceBus;
  31. private readonly IHttpClientFactory _http;
  32. private readonly CoreAPIHttpService _coreAPIHttpService;
  33. private readonly IWebHostEnvironment _environment; //读取文件
  34. private readonly HttpClient _httpClient;
  35. public BICouponController(DingDing dingDing, IOptionsSnapshot<Option> option, IConfiguration configuration, AzureServiceBusFactory serviceBus, IHttpClientFactory http, CoreAPIHttpService coreAPIHttpService, IWebHostEnvironment hostingEnvironment, HttpClient httpClient)
  36. {
  37. _dingDing = dingDing;
  38. _option = option?.Value;
  39. _configuration = configuration;
  40. _serviceBus = serviceBus;
  41. _http = http;
  42. _coreAPIHttpService = coreAPIHttpService;
  43. _environment = hostingEnvironment;
  44. _httpClient = httpClient;
  45. }
  46. /// <summary>
  47. /// 建立優惠券
  48. /// </summary>
  49. /// <param name="GenerateCouponRequest"></param>
  50. /// <returns></returns>
  51. //[AuthToken(Roles = "admin,rdc,assist,sales")]
  52. [HttpPost("create-coupon")]
  53. public async Task<IActionResult> CreateCoupon(GenerateCouponRequest request)
  54. {
  55. try
  56. {
  57. //string url = _configuration.GetValue<string>("HaBookAuth:CoreAPI");
  58. string url = "https://api2.teammodel.net";
  59. if (request.srvAdr == "China") url = "https://api2.teammodel.cn";
  60. string AccessToken = await getCoreAccessToken(request.srvAdr);
  61. var client = _http.CreateClient();
  62. client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
  63. HttpResponseMessage response = await client.PostAsJsonAsync($"{url}/Service/GenerateCoupon", request);
  64. if (response.StatusCode == HttpStatusCode.OK)
  65. {
  66. string jsonStr = await response.Content.ReadAsStringAsync();
  67. var options1 = new JsonSerializerOptions
  68. {
  69. Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
  70. };
  71. await _dingDing.SendBotMsg(System.Text.Json.JsonSerializer.Serialize(request, options1), GroupNames.高飛);
  72. return Ok(jsonStr.ToObject<JsonElement>());
  73. }
  74. else {
  75. return BadRequest();
  76. }
  77. }
  78. catch (Exception ex) {
  79. return BadRequest();
  80. }
  81. }
  82. /// <summary>
  83. /// 歸戶
  84. /// </summary>
  85. /// <param name="GenerateCouponRequest"></param>
  86. /// <returns></returns>
  87. //[AuthToken(Roles = "admin,rdc,assist,sales")]
  88. [HttpPost("consolidation-coupon")]
  89. public async Task<IActionResult> ConsolidationCoupon(ConsolidationCouponRequest request)
  90. {
  91. try
  92. {
  93. string HaBookAuthString = (_option.Location.Contains("Global") && request.srvAdr.Equals("China")) ? "HaBookAuthCN" : "HaBookAuth";
  94. //string url = "https://api2.teammodel.net";
  95. //if (request.srvAdr == "China") url = "https://api2.teammodel.cn";
  96. string url = _configuration.GetValue<string>($"{HaBookAuthString}:CoreAPI");
  97. string AccessToken = await getCoreAccessToken(request.srvAdr);
  98. var client = _http.CreateClient();
  99. client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
  100. HttpResponseMessage response = await client.PostAsJsonAsync($"{url}/Service/CouponConsolidation", request);
  101. if (response.StatusCode == HttpStatusCode.OK)
  102. {
  103. return Ok(new { state = 0, msg = "歸戶成功" });
  104. }
  105. else
  106. {
  107. return BadRequest();
  108. }
  109. }
  110. catch (Exception ex)
  111. {
  112. return BadRequest();
  113. }
  114. }
  115. /// <summary>
  116. /// 通知
  117. /// </summary>
  118. /// <param name="GenerateCouponRequest"></param>
  119. /// <returns></returns>
  120. //[AuthToken(Roles = "admin,rdc,assist,sales")]
  121. [HttpPost("push-notify")]
  122. public async Task<IActionResult> PushNotify(PushNotifyRequest request)
  123. {
  124. try
  125. {
  126. string HaBookAuthString = (_option.Location.Contains("Global") && request.srvAdr.Equals("China")) ? "HaBookAuthCN" : "HaBookAuth";
  127. //string url = "https://api2.teammodel.net";
  128. //if (request.srvAdr == "China") url = "https://api2.teammodel.cn";
  129. string url = _configuration.GetValue<string>($"{HaBookAuthString}:CoreAPI");
  130. string AccessToken = await getCoreAccessToken(request.srvAdr);
  131. var client = _http.CreateClient();
  132. client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
  133. HttpResponseMessage response = await client.PostAsJsonAsync($"{url}/Service/PushNotify", request);
  134. if (response.StatusCode == HttpStatusCode.OK)
  135. {
  136. return Ok(new { state = 0, msg = "發送成功" });
  137. }
  138. else
  139. {
  140. return BadRequest();
  141. }
  142. }
  143. catch (Exception ex)
  144. {
  145. return BadRequest();
  146. }
  147. }
  148. private async Task<string> getCoreAccessToken(string srvAdr)
  149. {
  150. string AccessToken = "";
  151. try
  152. {
  153. string HaBookAuthString = (_option.Location.Contains("Global") && srvAdr.Equals("China")) ? "HaBookAuthCN" : "HaBookAuth"; //GL站點 => 可取得GL、CN兩站點設定資料 CN站點 => 只取自身站點資料
  154. string Url = _configuration.GetValue<string>($"{HaBookAuthString}:CoreAPI") + "/oauth2/token";
  155. string GrantType = "device";
  156. string ClientID = _configuration.GetValue<string>($"{HaBookAuthString}:CoreService:clientID");
  157. string Secret = _configuration.GetValue<string>($"{HaBookAuthString}:CoreService:clientSecret");
  158. var content = new { grant_type = GrantType, client_id = ClientID, client_secret = Secret };
  159. var response = await _http.CreateClient().PostAsJsonAsync($"{Url}", content);
  160. if (response.IsSuccessStatusCode)
  161. {
  162. string responseBody = response.Content.ReadAsStringAsync().Result;
  163. using (JsonDocument document = JsonDocument.Parse(responseBody.ToString()))
  164. {
  165. if (document.RootElement.TryGetProperty("access_token", out JsonElement AccessTokenObj))
  166. {
  167. AccessToken = AccessTokenObj.ToString();
  168. }
  169. }
  170. }
  171. return AccessToken;
  172. }
  173. catch (Exception ex)
  174. {
  175. return AccessToken;
  176. }
  177. }
  178. }
  179. public class info
  180. {
  181. public string l { get; set; }
  182. public string n { get; set; }
  183. public string u { get; set; }
  184. }
  185. public class CouponRule
  186. {
  187. public string q { get; set; }
  188. //可獲得的權益
  189. public string b { get; set; }
  190. //若已有權益 則給積分
  191. public int p { get; set; } = 0;
  192. }
  193. public record GenerateCouponRequest([Required] string srvAdr, [Required] string CouponType, List<string> targets, string couponName, int quantity, [Required] long expire, [Required] List<CouponRule> rule, string eventName, List<info> info, int maxTaker = -1);
  194. public record ConsolidationCouponRequest([Required] string srvAdr, [Required] string coupon, [Required] List<string> ids);
  195. public record PushNotifyRequest([Required] string srvAdr, [Required] string title, [Required] string body, [Required] List<string> tags, [Required] string sender, [Required] string hubName, string data = null);
  196. }