OpExcelHelper.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. using System;
  2. using System.Threading;
  3. using System.Linq;
  4. using System.Data;
  5. using Library;
  6. using MySystem.OpModels;
  7. using System.Collections.Generic;
  8. namespace MySystem
  9. {
  10. public class OpExcelHelper
  11. {
  12. public readonly static OpExcelHelper Instance = new OpExcelHelper();
  13. private OpExcelHelper()
  14. {
  15. }
  16. public void Start()//启动
  17. {
  18. Thread thread = new Thread(ImportPostDo);
  19. thread.IsBackground = true;
  20. thread.Start();
  21. }
  22. public void ImportPostDo()
  23. {
  24. while (true)
  25. {
  26. string data = RedisDbconn.Instance.RPop<string>("ExcelImportV3");
  27. if (!string.IsNullOrEmpty(data))
  28. {
  29. string[] dataList = data.Split("#cut#");
  30. string _ExcelPath = dataList[0];
  31. string _Kind = dataList[1];
  32. string checkKey = dataList[2];
  33. string Operator = dataList[3]; // 操作人
  34. int SuccessCount = 0;
  35. int DoCount = 0;
  36. string FullExcelPath = function.getPath(_ExcelPath);
  37. FullExcelPath = FullExcelPath.Replace("//", "/");
  38. DataTable list = new PublicFunction().ExcelToDataTable(FullExcelPath);
  39. int TotalCount = list.Rows.Count;
  40. while (DoCount < list.Rows.Count)
  41. {
  42. WebCMSEntities db = new WebCMSEntities();
  43. if (_Kind == "OpUserCashRecord")
  44. {
  45. using (var tran = db.Database.BeginTransaction())
  46. {
  47. try
  48. {
  49. int Size = 100;
  50. if (list.Rows.Count - DoCount < 100)
  51. {
  52. Size = list.Rows.Count - DoCount;
  53. }
  54. for (int i = DoCount; i < DoCount + Size; i++)
  55. {
  56. DataRow dr = list.Rows[i];
  57. string CashOrderNo = dr[2].ToString(); // 提现单号
  58. decimal Amount = decimal.Parse(function.CheckNum(dr[3].ToString())); // 发佣金额
  59. int Status = int.Parse(function.CheckInt(dr[4].ToString())); // 提现状态
  60. string Remark = dr[5].ToString(); // 备注
  61. CashOrderNo = CashOrderNo.Replace(" ", "");
  62. UserCashRecord edit = db.UserCashRecord.FirstOrDefault(m => m.CashOrderNo == CashOrderNo && m.ActualTradeAmount == Amount && m.Status == 0);
  63. if (edit != null)
  64. {
  65. if (edit.TradeType == 4)
  66. {
  67. edit.Status = Status;
  68. edit.Remark = Remark;
  69. edit.UpdateMan = Operator;
  70. if (Status == 2)
  71. {
  72. UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == edit.UserId);
  73. if (account != null)
  74. {
  75. decimal TradeAmount = edit.TradeAmount;
  76. decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
  77. decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
  78. decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
  79. account.BalanceAmount += TradeAmount;
  80. account.FreezeAmount -= TradeAmount;
  81. decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
  82. decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
  83. decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
  84. db.UserAccountRecord.Add(new UserAccountRecord()
  85. {
  86. CreateDate = DateTime.Now,
  87. UpdateDate = DateTime.Now,
  88. UserId = edit.UserId, //创客
  89. ChangeType = 6, //变动类型
  90. ProductType = 99, //产品类型
  91. ChangeAmount = TradeAmount, //变更金额
  92. BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
  93. AfterTotalAmount = AfterTotalAmount, //变更后总金额
  94. BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
  95. AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
  96. BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
  97. AfterBalanceAmount = AfterBalanceAmount, //变更后余额
  98. });
  99. db.SaveChanges();
  100. RedisDbconn.Instance.Set("OpUserAccount:" + edit.UserId, account);
  101. }
  102. }
  103. db.SaveChanges();
  104. RedisDbconn.Instance.Clear("OpUserCashRecord:" + edit.Id);
  105. SuccessCount += 1;
  106. RedisDbconn.Instance.Set("OpCheckImport:" + checkKey, SuccessCount + " / " + TotalCount);
  107. }
  108. else
  109. {
  110. edit.Status = Status;
  111. edit.Remark = Remark;
  112. edit.UpdateMan = Operator;
  113. if (Status == 1)
  114. {
  115. UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == edit.UserId);
  116. if (account != null)
  117. {
  118. account.QueryCount = 1;
  119. decimal TradeAmount = edit.TradeAmount;
  120. decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
  121. decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
  122. decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
  123. account.WithdrawAmount += edit.TradeAmount;
  124. account.FreezeAmount -= edit.TradeAmount;
  125. decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
  126. decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
  127. decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
  128. db.UserAccountRecord.Add(new UserAccountRecord()
  129. {
  130. CreateDate = DateTime.Now,
  131. UpdateDate = DateTime.Now,
  132. UserId = edit.UserId, //创客
  133. ChangeType = 3, //变动类型
  134. ProductType = 99, //产品类型
  135. ChangeAmount = edit.ActualTradeAmount, //变更金额
  136. BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
  137. AfterTotalAmount = AfterTotalAmount, //变更后总金额
  138. BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
  139. AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
  140. BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
  141. AfterBalanceAmount = AfterBalanceAmount, //变更后余额
  142. });
  143. db.UserAccountRecord.Add(new UserAccountRecord()
  144. {
  145. CreateDate = DateTime.Now,
  146. UpdateDate = DateTime.Now,
  147. UserId = edit.UserId, //创客
  148. ChangeType = 4, //变动类型
  149. ProductType = 99, //产品类型
  150. ChangeAmount = edit.TradeFee, //变更金额
  151. BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
  152. AfterTotalAmount = AfterTotalAmount, //变更后总金额
  153. BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
  154. AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
  155. BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
  156. AfterBalanceAmount = AfterBalanceAmount, //变更后余额
  157. });
  158. db.UserAccountRecord.Add(new UserAccountRecord()
  159. {
  160. CreateDate = DateTime.Now,
  161. UpdateDate = DateTime.Now,
  162. UserId = edit.UserId, //创客
  163. ChangeType = 5, //变动类型
  164. ProductType = 99, //产品类型
  165. ChangeAmount = edit.ManageFee, //变更金额
  166. BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
  167. AfterTotalAmount = AfterTotalAmount, //变更后总金额
  168. BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
  169. AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
  170. BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
  171. AfterBalanceAmount = AfterBalanceAmount, //变更后余额
  172. });
  173. db.SaveChanges();
  174. RedisDbconn.Instance.Set("OpUserAccount:" + edit.UserId, account);
  175. }
  176. }
  177. else if (Status == 2)
  178. {
  179. UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == edit.UserId);
  180. if (account != null)
  181. {
  182. decimal TradeAmount = edit.TradeAmount;
  183. if(account.FreezeAmount < TradeAmount)
  184. {
  185. // TODO: 需要返回错误提示消息
  186. // RedisDbconn.Instance.AddList("ErrList" + checkKey, "提现记录单号为" + CashOrderNo + "的创客冻结金额异常");
  187. }
  188. else
  189. {
  190. decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
  191. decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
  192. decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
  193. account.BalanceAmount += TradeAmount;
  194. account.FreezeAmount -= TradeAmount;
  195. decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
  196. decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
  197. decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
  198. db.UserAccountRecord.Add(new UserAccountRecord()
  199. {
  200. CreateDate = DateTime.Now,
  201. UpdateDate = DateTime.Now,
  202. UserId = edit.UserId, //创客
  203. ChangeType = 6, //变动类型
  204. ProductType = 99, //产品类型
  205. ChangeAmount = TradeAmount, //变更金额
  206. BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
  207. AfterTotalAmount = AfterTotalAmount, //变更后总金额
  208. BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
  209. AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
  210. BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
  211. AfterBalanceAmount = AfterBalanceAmount, //变更后余额
  212. });
  213. db.SaveChanges();
  214. RedisDbconn.Instance.Set("OpUserAccount:" + edit.UserId, account);
  215. }
  216. }
  217. }
  218. db.SaveChanges();
  219. RedisDbconn.Instance.Clear("OpUserCashRecord:" + edit.Id);
  220. SuccessCount += 1;
  221. RedisDbconn.Instance.Set("OpCheckImport:" + checkKey, SuccessCount + " / " + TotalCount);
  222. }
  223. }
  224. }
  225. DoCount += Size;
  226. db.SaveChanges();
  227. tran.Commit();
  228. RedisDbconn.Instance.Set("OpCheckImport:" + checkKey, "success|" + SuccessCount);
  229. RedisDbconn.Instance.SetExpire("OpCheckImport:" + checkKey, 60000);
  230. }
  231. catch (Exception ex)
  232. {
  233. DoCount = list.Rows.Count;
  234. tran.Rollback();
  235. ErrorMsg msg = new ErrorMsg()
  236. {
  237. Time = DateTime.Now,
  238. ErrorContent = ex.ToString(),
  239. };
  240. function.WriteLog(Newtonsoft.Json.JsonConvert.SerializeObject(msg), "导入Excel文件异常");
  241. }
  242. }
  243. }
  244. db.Dispose();
  245. }
  246. }
  247. else
  248. {
  249. Thread.Sleep(5000);
  250. }
  251. // return "success|" + SuccessCount;
  252. }
  253. }
  254. }
  255. }