BatchEditUserAmountService.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. using System;
  2. using System.Threading;
  3. using System.Linq;
  4. using System.Data;
  5. using Library;
  6. using MySystem.Models;
  7. using System.Collections.Generic;
  8. /// <summary>
  9. /// 创客信息相关数据导入
  10. /// </summary>
  11. namespace MySystem
  12. {
  13. public class BatchEditUserAmountService
  14. {
  15. public readonly static BatchEditUserAmountService Instance = new BatchEditUserAmountService();
  16. private BatchEditUserAmountService()
  17. {
  18. }
  19. public void Start()//启动
  20. {
  21. Thread thread = new Thread(ImportPostDo);
  22. thread.IsBackground = true;
  23. thread.Start();
  24. }
  25. public void ImportPostDo()
  26. {
  27. while (true)
  28. {
  29. try
  30. {
  31. string data = RedisDbconn.Instance.RPop<string>("BatchEditUserAmountQueue");
  32. if (!string.IsNullOrEmpty(data))
  33. {
  34. string[] dataList = data.Split("#cut#");
  35. string _ExcelPath = dataList[0];
  36. string _Kind = dataList[1];
  37. string checkKey = dataList[2];
  38. string Operator = dataList[3]; // 操作人
  39. int SuccessCount = 0;
  40. int DoCount = 0;
  41. string FullExcelPath = function.getPath(_ExcelPath);
  42. FullExcelPath = FullExcelPath.Replace("//", "/");
  43. DataTable list = new PublicFunction().ExcelToDataTable(FullExcelPath);
  44. int TotalCount = list.Rows.Count;
  45. while (DoCount < list.Rows.Count)
  46. {
  47. WebCMSEntities db = new WebCMSEntities();
  48. //导入结算金额
  49. if (_Kind == "1")
  50. {
  51. var tran = db.Database.BeginTransaction();
  52. try
  53. {
  54. int Size = 100;
  55. if (list.Rows.Count - DoCount < 100)
  56. {
  57. Size = list.Rows.Count - DoCount;
  58. }
  59. Dictionary<string, int> storeData = new Dictionary<string, int>();
  60. for (int i = DoCount; i < DoCount + Size; i++)
  61. {
  62. DataRow dr = list.Rows[i];
  63. string MakerCode = dr[0].ToString(); //创客编号
  64. string RealName = dr[1].ToString(); //创客姓名
  65. string SettleAmount = dr[2].ToString(); //提现结算金额(元)
  66. UserForMakerCode UserCode = db.UserForMakerCode.FirstOrDefault(m => m.MakerCode == MakerCode);
  67. if (UserCode.UserId > 0)
  68. {
  69. var user = db.Users.FirstOrDefault(m => m.Id == UserCode.UserId) ?? new Users();
  70. if (user.Id > 0)
  71. {
  72. SuccessCount += 1;
  73. user.SettleAmount = decimal.Parse(function.CheckInt(SettleAmount));
  74. }
  75. else
  76. {
  77. RedisDbconn.Instance.AddList("ErrList" + checkKey, "未找到" + MakerCode + " " + RealName + "创客信息");
  78. }
  79. }
  80. else
  81. {
  82. RedisDbconn.Instance.AddList("ErrList" + checkKey, "未找到" + MakerCode + "编号关联信息");
  83. }
  84. }
  85. DoCount += Size;
  86. db.SaveChanges();
  87. tran.Commit();
  88. if (DoCount >= list.Rows.Count)
  89. {
  90. RedisDbconn.Instance.Set("BatchEditUserAmountCheckImport:" + checkKey, "success|" + SuccessCount);
  91. RedisDbconn.Instance.SetExpire("BatchEditUserAmountCheckImport:" + checkKey, 60000);
  92. }
  93. }
  94. catch (Exception ex)
  95. {
  96. DoCount = list.Rows.Count;
  97. function.WriteLog(ex.ToString(), "导入结算金额");
  98. tran.Rollback();
  99. ErrorMsg msg = new ErrorMsg()
  100. {
  101. Time = DateTime.Now,
  102. ErrorContent = ex.ToString(),
  103. };
  104. function.WriteLog(Newtonsoft.Json.JsonConvert.SerializeObject(msg), "导入结算金额Excel文件异常");
  105. }
  106. tran.Dispose();
  107. }
  108. //导入冻结金额
  109. if (_Kind == "2")
  110. {
  111. var tran = db.Database.BeginTransaction();
  112. try
  113. {
  114. int Size = 100;
  115. if (list.Rows.Count - DoCount < 100)
  116. {
  117. Size = list.Rows.Count - DoCount;
  118. }
  119. Dictionary<string, int> storeData = new Dictionary<string, int>();
  120. for (int i = DoCount; i < DoCount + Size; i++)
  121. {
  122. DataRow dr = list.Rows[i];
  123. string MakerCode = dr[0].ToString(); //创客编号
  124. string RealName = dr[1].ToString(); //创客姓名
  125. string CashFreezeAmt = dr[2].ToString(); //提现结算金额(元)
  126. UserForMakerCode UserCode = db.UserForMakerCode.FirstOrDefault(m => m.MakerCode == MakerCode);
  127. if (UserCode.UserId > 0)
  128. {
  129. var user = db.Users.FirstOrDefault(m => m.Id == UserCode.UserId) ?? new Users();
  130. if (user.Id > 0)
  131. {
  132. SuccessCount += 1;
  133. user.CashFreezeAmt = decimal.Parse(function.CheckInt(CashFreezeAmt));
  134. }
  135. else
  136. {
  137. RedisDbconn.Instance.AddList("ErrList" + checkKey, "未找到" + MakerCode + " " + RealName + "创客信息");
  138. }
  139. }
  140. else
  141. {
  142. RedisDbconn.Instance.AddList("ErrList" + checkKey, "未找到" + MakerCode + "编号关联信息");
  143. }
  144. }
  145. DoCount += Size;
  146. db.SaveChanges();
  147. tran.Commit();
  148. if (DoCount >= list.Rows.Count)
  149. {
  150. RedisDbconn.Instance.Set("BatchEditUserAmountCheckImport:" + checkKey, "success|" + SuccessCount);
  151. RedisDbconn.Instance.SetExpire("BatchEditUserAmountCheckImport:" + checkKey, 60000);
  152. }
  153. }
  154. catch (Exception ex)
  155. {
  156. DoCount = list.Rows.Count;
  157. function.WriteLog(ex.ToString(), "导入冻结金额");
  158. tran.Rollback();
  159. ErrorMsg msg = new ErrorMsg()
  160. {
  161. Time = DateTime.Now,
  162. ErrorContent = ex.ToString(),
  163. };
  164. function.WriteLog(Newtonsoft.Json.JsonConvert.SerializeObject(msg), "导入冻结金额Excel文件异常");
  165. }
  166. tran.Dispose();
  167. }
  168. //导入风控数据
  169. if (_Kind == "3")
  170. {
  171. var tran = db.Database.BeginTransaction();
  172. try
  173. {
  174. int Size = 100;
  175. if (list.Rows.Count - DoCount < 100)
  176. {
  177. Size = list.Rows.Count - DoCount;
  178. }
  179. Dictionary<string, int> storeData = new Dictionary<string, int>();
  180. for (int i = DoCount; i < DoCount + Size; i++)
  181. {
  182. DataRow dr = list.Rows[i];
  183. string MakerCode = dr[0].ToString(); //创客编号
  184. string RealName = dr[1].ToString(); //创客姓名
  185. string RiskFlag = dr[2].ToString(); //风控标记(0 否 1 是)
  186. string RiskNote = dr[3].ToString(); //风控备注
  187. UserForMakerCode UserCode = db.UserForMakerCode.FirstOrDefault(m => m.MakerCode == MakerCode);
  188. if (UserCode.UserId > 0)
  189. {
  190. var user = db.Users.FirstOrDefault(m => m.Id == UserCode.UserId && m.RealName == RealName) ?? new Users();
  191. if (user.Id > 0)
  192. {
  193. SuccessCount += 1;
  194. user.RiskFlag = ulong.Parse(function.CheckInt(RiskFlag));
  195. user.RiskRemark = RiskNote;
  196. }
  197. else
  198. {
  199. RedisDbconn.Instance.AddList("ErrList" + checkKey, "未找到" + MakerCode + " " + RealName + "创客信息");
  200. }
  201. }
  202. else
  203. {
  204. RedisDbconn.Instance.AddList("ErrList" + checkKey, "未找到" + MakerCode + "编号关联信息");
  205. }
  206. }
  207. DoCount += Size;
  208. db.SaveChanges();
  209. tran.Commit();
  210. if (DoCount >= list.Rows.Count)
  211. {
  212. RedisDbconn.Instance.Set("BatchEditUserAmountCheckImport:" + checkKey, "success|" + SuccessCount);
  213. RedisDbconn.Instance.SetExpire("BatchEditUserAmountCheckImport:" + checkKey, 60000);
  214. }
  215. }
  216. catch (Exception ex)
  217. {
  218. DoCount = list.Rows.Count;
  219. function.WriteLog(ex.ToString(), "导入风控数据");
  220. tran.Rollback();
  221. ErrorMsg msg = new ErrorMsg()
  222. {
  223. Time = DateTime.Now,
  224. ErrorContent = ex.ToString(),
  225. };
  226. function.WriteLog(Newtonsoft.Json.JsonConvert.SerializeObject(msg), "导入风控数据Excel文件异常");
  227. }
  228. tran.Dispose();
  229. }
  230. //批量修改账户金额
  231. if (_Kind == "4")
  232. {
  233. var tran = db.Database.BeginTransaction();
  234. try
  235. {
  236. int Size = 100;
  237. if (list.Rows.Count - DoCount < 100)
  238. {
  239. Size = list.Rows.Count - DoCount;
  240. }
  241. Dictionary<string, int> storeData = new Dictionary<string, int>();
  242. for (int i = DoCount; i < DoCount + Size; i++)
  243. {
  244. DataRow dr = list.Rows[i];
  245. string MakerCode = dr[0].ToString(); //创客编号
  246. string RealName = dr[1].ToString(); //创客姓名
  247. string OperationAmt = dr[2].ToString();//操作金额
  248. string OperationType = dr[3].ToString();//操作类型(1-冻结 2-解冻 3-扣减 4-增加)
  249. UserForMakerCode UserCode = db.UserForMakerCode.FirstOrDefault(m => m.MakerCode == MakerCode);
  250. if (UserCode.UserId > 0)
  251. {
  252. var user = db.Users.FirstOrDefault(m => m.Id == UserCode.UserId && m.RealName == RealName) ?? new Users();
  253. if (user.Id > 0)
  254. {
  255. UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == user.Id) ?? new UserAccount();
  256. if (account.Id == 0)
  257. {
  258. account = db.UserAccount.Add(new UserAccount()
  259. {
  260. Id = user.Id,
  261. UserId = user.Id,
  262. }).Entity;
  263. db.SaveChanges();
  264. }
  265. if (account.Id > 0)
  266. {
  267. decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
  268. decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
  269. decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
  270. int ChangeType = 0;
  271. if (OperationType == "1" && Convert.ToDecimal(OperationAmt) > account.BalanceAmount)
  272. {
  273. RedisDbconn.Instance.AddList("ErrList" + checkKey, "以下操作失败" + user.MakerCode + ',' + user.RealName + "冻结金额大于余额");
  274. }
  275. if (OperationType == "2" && Convert.ToDecimal(OperationAmt) > account.FreezeAmount)
  276. {
  277. RedisDbconn.Instance.AddList("ErrList" + checkKey, "以下操作失败" + user.MakerCode + ',' + user.RealName + "解冻金额大于冻结金额");
  278. }
  279. if (OperationType == "3" && Convert.ToDecimal(OperationAmt) > account.BalanceAmount)
  280. {
  281. RedisDbconn.Instance.AddList("ErrList" + checkKey, "以下操作失败" + user.MakerCode + ',' + user.RealName + "扣减金额大于余额");
  282. }
  283. if ((OperationType == "1" && Convert.ToDecimal(OperationAmt) <= account.BalanceAmount) || (OperationType == "2" && Convert.ToDecimal(OperationAmt) <= account.FreezeAmount) || (OperationType == "3" && Convert.ToDecimal(OperationAmt) <= account.BalanceAmount) || (OperationType == "4"))
  284. {
  285. if (OperationType == "1" && Convert.ToDecimal(OperationAmt) <= account.BalanceAmount)
  286. {
  287. account.BalanceAmount -= Convert.ToDecimal(OperationAmt);
  288. account.FreezeAmount += Convert.ToDecimal(OperationAmt);
  289. ChangeType = 61;
  290. }
  291. if (OperationType == "2" && Convert.ToDecimal(OperationAmt) <= account.FreezeAmount)
  292. {
  293. account.BalanceAmount += Convert.ToDecimal(OperationAmt);
  294. account.FreezeAmount -= Convert.ToDecimal(OperationAmt);
  295. ChangeType = 62;
  296. }
  297. if (OperationType == "3" && Convert.ToDecimal(OperationAmt) <= account.BalanceAmount)
  298. {
  299. account.TotalAmount -= Convert.ToDecimal(OperationAmt);
  300. account.BalanceAmount -= Convert.ToDecimal(OperationAmt);
  301. ChangeType = 63;
  302. }
  303. if (OperationType == "4")
  304. {
  305. account.TotalAmount += Convert.ToDecimal(OperationAmt);
  306. account.BalanceAmount += Convert.ToDecimal(OperationAmt);
  307. ChangeType = 64;
  308. }
  309. decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
  310. decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
  311. decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
  312. UserAccountRecord userAccountRecord = db.UserAccountRecord.Add(new UserAccountRecord()
  313. {
  314. CreateDate = DateTime.Now,
  315. UpdateDate = DateTime.Now,
  316. UserId = user.Id, //创客
  317. ChangeType = ChangeType, //变动类型
  318. ChangeAmount = Convert.ToDecimal(OperationAmt), //变更金额
  319. BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
  320. AfterTotalAmount = AfterTotalAmount, //变更后总金额
  321. BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
  322. AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
  323. BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
  324. AfterBalanceAmount = AfterBalanceAmount, //变更后余额
  325. Remark = dr[4].ToString(),
  326. }).Entity;
  327. db.SaveChanges();
  328. SuccessCount += 1;
  329. function.WriteLog(DateTime.Now.ToString() + "\n" + user.Id.ToString(), "批量修改账户金额");
  330. }
  331. }
  332. }
  333. else
  334. {
  335. RedisDbconn.Instance.AddList("ErrList" + checkKey, "未找到" + MakerCode + " " + RealName + "创客信息");
  336. }
  337. }
  338. else
  339. {
  340. RedisDbconn.Instance.AddList("ErrList" + checkKey, "未找到" + MakerCode + "编号关联信息");
  341. }
  342. }
  343. DoCount += Size;
  344. db.SaveChanges();
  345. tran.Commit();
  346. if (DoCount >= list.Rows.Count)
  347. {
  348. RedisDbconn.Instance.Set("BatchEditUserAmountCheckImport:" + checkKey, "success|" + SuccessCount);
  349. RedisDbconn.Instance.SetExpire("BatchEditUserAmountCheckImport:" + checkKey, 60000);
  350. }
  351. }
  352. catch (Exception ex)
  353. {
  354. DoCount = list.Rows.Count;
  355. function.WriteLog(ex.ToString(), "批量修改账户金额");
  356. tran.Rollback();
  357. ErrorMsg msg = new ErrorMsg()
  358. {
  359. Time = DateTime.Now,
  360. ErrorContent = ex.ToString(),
  361. };
  362. function.WriteLog(Newtonsoft.Json.JsonConvert.SerializeObject(msg), "批量修改账户金额Excel文件异常");
  363. }
  364. tran.Dispose();
  365. }
  366. }
  367. }
  368. else
  369. {
  370. Thread.Sleep(5000);
  371. }
  372. }
  373. catch (Exception ex)
  374. {
  375. function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "后台导入Excel文件队列异常");
  376. }
  377. }
  378. }
  379. }
  380. }