BatchEditUserAmountService.cs 24 KB

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