RepositoryExtension.UEBill.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. using static JiaZhiQuan.Common.Models.MallGoodsModel.RefundModel;
  2. using System.Data;
  3. using System.Threading.Tasks;
  4. using Wicture.DbRESTFul.Infrastructure.Repository;
  5. using JiaZhiQuan.Common.JuheAPI.HuiFu;
  6. using System.Runtime.CompilerServices;
  7. using System;
  8. using JiaZhiQuan.Common.Models.PO;
  9. using JiaZhiQuan.Common.Models.VO.UE;
  10. using JiaZhiQuan.Common.Config;
  11. using MailKit;
  12. using Elasticsearch.Net;
  13. using Newtonsoft.Json;
  14. using System.Collections.Generic;
  15. using Wicture.DbRESTFul;
  16. using System.Net.Http.Headers;
  17. using NPOI.SS.UserModel;
  18. using JiaZhiQuan.Common.Response;
  19. namespace JiaZhiQuan.Common {
  20. public partial class RepositoryExtension {
  21. #region 账户逻辑
  22. //插入支出锁定表
  23. public static async Task<InsertResult> AddUserExpend(this DbRESTFulRepository repository,
  24. UEUserExpend info, IDbConnection conn, IDbTransaction trans) {
  25. info.state = 1;
  26. var expend = await repository.QuerySingleOrDefaultAsync<UEUserExpend>(
  27. $@"select * from ue_user_expend where orgId=@orgId",
  28. new { info.orgId,info.expendType });
  29. if (expend == null) {
  30. return await repository.SimpleInsert("ue_user_expend", info, conn, trans);
  31. } else {
  32. var cnt= await repository.SimpleUpdate("ue_user_expend", new { info.expend,state=1 },
  33. new { info.orgId, info.expendType }, conn, trans);
  34. return new InsertResult { count= cnt.count };
  35. }
  36. }
  37. /// <summary>
  38. /// 查询用户支出中的数据
  39. /// </summary>
  40. /// <param name="repository"></param>
  41. /// <param name="userId"></param>
  42. /// <param name="expendType">支出类型(1,平台账户支出,2,价值币支出)</param>
  43. /// <param name="conn"></param>
  44. /// <param name="trans"></param>
  45. /// <returns></returns>
  46. public static async Task<int> UserExpending(this DbRESTFulRepository repository,
  47. long userId,int expendType,
  48. IDbConnection conn=null, IDbTransaction trans= null) {
  49. return await repository.QuerySingleOrDefaultAsync<int?>(
  50. @$"select sum(expend) expend from ue_user_expend
  51. where state in(1,3) and userId={userId} and expendType={expendType}", null, conn, trans)??0;
  52. }
  53. /// <summary>
  54. /// 更新支出为支出结束状态
  55. /// </summary>
  56. /// <param name="repository"></param>
  57. /// <param name="orgId"></param>
  58. /// <param name="expendType">1:平台账号,2:价值币</param>
  59. /// <param name="conn"></param>
  60. /// <param name="trans"></param>
  61. /// <returns></returns>
  62. public static async Task<OperateResult> UserExpendEnd(this DbRESTFulRepository repository,
  63. string orgId,int expendType, IDbConnection conn = null, IDbTransaction trans = null) {
  64. return await repository.SimpleUpdate("ue_user_expend", new {state=2 }, new { orgId, expendType });
  65. }
  66. public static async Task<OperateResult> UserExpendExcept(this DbRESTFulRepository repository,
  67. string orgId, int expendType, IDbConnection conn = null, IDbTransaction trans = null) {
  68. return await repository.SimpleUpdate("ue_user_expend", new { state = 3 }, new { orgId, expendType });
  69. }
  70. //插入平台流水表
  71. public static async Task<InsertResult> AddPlatformBill(this DbRESTFulRepository repository,
  72. UEPlatformBill info, IDbConnection conn, IDbTransaction trans) {
  73. return await repository.SimpleInsert("ue_platform_bill", info, conn, trans); ;
  74. }
  75. //插入个人钱包表
  76. public static async Task<InsertResult> AddWalletDetail(this DbRESTFulRepository repository,
  77. UEWalletDetail info, IDbConnection conn, IDbTransaction trans) {
  78. var oldWallet= await repository.QuerySingleOrDefaultAsync<dynamic>(
  79. $@"select id,balance from ue_wallet where userId=@userId",
  80. new { info.userId }, conn, trans);
  81. var oldBalance = oldWallet?.balance ?? 0;
  82. var wallet = new {
  83. info.userId,
  84. balance = (info.detailType == 1 ?
  85. info.amount : -info.amount) + oldBalance
  86. };
  87. if (wallet.balance < 0) {
  88. throw new Exception("平台账号资金不支持此操作");
  89. }
  90. info.balance = wallet.balance;
  91. var cnt =await repository.SimpleInsert("ue_wallet_detail",info,conn,trans);
  92. if(cnt.count>0 ) {
  93. if (oldWallet != null) {
  94. await repository.SimpleUpdate("ue_wallet", new { wallet.balance },
  95. new { oldWallet.id }, conn, trans);
  96. } else {
  97. await repository.SimpleInsert("ue_wallet",wallet,conn,trans);
  98. }
  99. }
  100. return cnt;
  101. }
  102. //查询个人钱包可用的钱
  103. public static async Task<int> QueryAccountAmount(this DbRESTFulRepository repository,
  104. long userId) {
  105. var exist = await repository.QuerySingleOrDefaultAsync<int>(
  106. $"select balance from ue_wallet where userId={userId}");
  107. var expending = await repository.UserExpending(userId, 1);
  108. var canUse = exist - expending;
  109. if (canUse < 0) {
  110. canUse = 0;
  111. }
  112. return canUse;
  113. }
  114. #endregion
  115. //汇付接口请求插入
  116. public static async Task<InsertResult> AddHuiFuReq(this DbRESTFulRepository repository,
  117. HuiFuReqBase info, IDbConnection conn=null, IDbTransaction trans = null) {
  118. return await repository.SimpleInsert("ue_huifu_req",
  119. new {
  120. info.reqId,
  121. info.orgId, reqType = (int)info.ReqType(),
  122. billEventType=info.eventType,dealResult=0,
  123. info.orderId,info.userId }, conn, trans);
  124. }
  125. #region 退款逻辑
  126. /// <summary>
  127. /// 发起退款
  128. /// </summary>
  129. /// <param name="repository"></param>
  130. /// <param name="order"></param>
  131. /// <param name="takeoutEarnest">是否扣除保证金</param>
  132. /// <param name="info">发起请求的基础信息,如 orderId,userId,eventType等</param>
  133. /// <returns></returns>
  134. public static async Task<dynamic> LaunchRefund(this DbRESTFulRepository repository,
  135. ConfigFromDb config, UEOrderHang order, bool? takeoutEarnest, HuiFuReqBase info) {
  136. //order.earnestMoneyRefunded==1 表示已支付保证金,其他状态表示未支付。
  137. //takeoutEarnest==false 表示要退保证金
  138. order = await repository.QuerySingleOrDefaultAsync<UEOrderHang>(
  139. $@"select * from ue_order_hang where orderId=@orderId", new { order.orderId});
  140. var hastEarnest = true;
  141. if (order.earnestAmount <= 0 ||
  142. order.earnestMoneyRefunded != 1) {
  143. takeoutEarnest = null;
  144. hastEarnest = false;
  145. }
  146. //仅退保证金
  147. var onlyEarnest = order.orderState == 5 && hastEarnest && takeoutEarnest == false;
  148. if(!onlyEarnest) {
  149. if (order.orderState != -1) {
  150. throw new Exception("订单状态不正常,不能退款");
  151. }
  152. }
  153. //仅退保证金
  154. var refundAmt = onlyEarnest ? order.earnestAmount :
  155. order.payAmount - (hastEarnest&&takeoutEarnest==true ? order.earnestAmount : 0);
  156. //更改保证金的状态为待退回 ,不扣除,是需要退回的
  157. if (takeoutEarnest == false && hastEarnest) {
  158. await repository.SimpleUpdate("ue_order_hang",
  159. new { earnestMoneyRefunded = 4 }, new { order.orderId, earnestMoneyRefunded = 1 });
  160. }
  161. if (refundAmt + order.refundAmount > order.payAmount) {
  162. throw new Exception("不支持此操作,退款金额大于支付金额");
  163. }
  164. if (refundAmt <= 0) {
  165. var baseResp=new HuiFuRespBase();
  166. baseResp.CopyBaseInfo(info);
  167. return await repository.RefundSuccess(baseResp, null,order) ;
  168. }
  169. //查询原先的支付信息。
  170. var payReqInfo = await repository.QuerySingleOrDefaultAsync<UEHuiFuReq>(
  171. $@"select * from ue_huifu_req where orderId=@orderId
  172. and billEventType=1 and reqType=1 and dealResult=1 ",new { order.orderId })??
  173. throw new Exception("不存在支付信息,无法申请退款");
  174. //生成请求参数
  175. var reqInfo = new HuiFuRefundInfo {
  176. ord_amt = refundAmt,
  177. org_req_date = payReqInfo.createAt.ToString("yyyyMMdd"),
  178. org_req_seq_id = payReqInfo.reqId
  179. };
  180. reqInfo.CopyBaseInfo(info);
  181. //发起汇付请求。
  182. var resp= await repository.HuiFuRequest<HuiFuRefundResp>(config, reqInfo);
  183. return resp;
  184. }
  185. public static async Task<dynamic> RefundCallback(this DbRESTFulRepository repository,
  186. HuiFuRespBase info,HuiFuRefundAsyncResp orgResp) {
  187. var rst = new { count = 0 };
  188. try {
  189. var exist = await repository.QuerySingleOrDefaultAsync<UEHuiFuReq>(
  190. @"select * from ue_huifu_req as r
  191. where r.reqId=@reqId limit 1",
  192. new { info.reqId });
  193. if (exist==null) {
  194. LoggerManager.Logger.Error($"存在退款回调伪造嫌疑 - 源id:{info.orgId}" +
  195. $" - extra:{JsonConvert.SerializeObject(info.extra)}");
  196. return rst;
  197. }
  198. info.orderId = exist.orderId.ToString();
  199. info.orgId = exist.orgId;
  200. using var conn = repository.ConnectionManager.GetConnection();
  201. conn.Open();
  202. var trans = conn.BeginTransaction();
  203. try {
  204. //更新流水表状态,因为同一个orgId可能会有多次请求,所以要更新reqId
  205. await repository.SimpleUpdate("ue_huifu_req", new {
  206. info.dealResult,
  207. info.hfSeqId
  208. }, new { info.reqId, dealResult = new List<int> { 0, 2, 3 } }, conn, trans);
  209. //退款成功,更新相关状态
  210. if (info.dealResult == 1) {
  211. await repository.RefundSuccess(info, orgResp,null, conn, trans);
  212. }
  213. trans.Commit();
  214. } catch (Exception ex) {
  215. trans.Rollback();
  216. throw;
  217. }
  218. } catch (Exception ex) {
  219. LoggerManager.Logger.Error("处理逻辑出错:" + ex.Message + ex.StackTrace);
  220. }
  221. return rst;
  222. }
  223. //退款成功操作
  224. public static async Task<bool> RefundSuccess(this DbRESTFulRepository repository,
  225. HuiFuRespBase info, HuiFuRefundAsyncResp orgResp, UEOrderHang saleOrder,
  226. IDbConnection conn = null, IDbTransaction trans = null) {
  227. var rst = new InsertResult() { count = 0 };
  228. //更新订单退款金额。
  229. var order = saleOrder ?? await repository.QuerySingleOrDefaultAsync<UEOrderHang>(
  230. $@"select * from ue_order_hang where orderId=@orderId ",
  231. new { info.orderId }) ?? throw new Exception("订单不存在");
  232. var now = DateTime.Now;
  233. //仅退保证金
  234. var onlyEarnest = order.orderState == 5 && order.earnestMoneyRefunded == 4;
  235. if (!onlyEarnest) {
  236. if (order.payPoints > 0) {
  237. //退回价值币
  238. var canPoints = order.payPoints;
  239. var count = await repository.QuerySingleOrDefaultAsync<int>(
  240. @$"update n_user_statistic set points=points+{canPoints}
  241. where userId={order.buyerId};select row_count() as count;",
  242. null, conn, trans);
  243. if (count > 0) {
  244. // 添加价值币变动记录
  245. await repository.QueryAsync<dynamic>(@$"insert into n_user_points_record
  246. (userId, points, `way`, extra, description, createAt, createAtDate)
  247. values({order.buyerId}, {canPoints}, 'UORDER', '{order.orderId}',
  248. '交易取消-订单{order.orderId}', now(), now())", null, conn, trans);
  249. }
  250. }
  251. //退回平台账户抵扣金额。
  252. if (order.accountDeductionAmount > 0) {
  253. //钱包金额增加
  254. var detail = new UEWalletDetail {
  255. detailId = Guid.NewGuid().ToString("N"),
  256. detailType = 1,//收入
  257. detailEvent = 11,
  258. orderId = order.orderId,
  259. amount = order.accountDeductionAmount.Value,
  260. payway = 1,
  261. userId = order.buyerId,
  262. createAt = now,
  263. };
  264. await repository.AddWalletDetail(detail, conn, trans);
  265. }
  266. }
  267. //添加平台流水
  268. var refundAmt = double.Parse(orgResp?.actual_ref_amt ?? "0") * 100;
  269. if (refundAmt > 0) {
  270. var bill = new UEPlatformBill {
  271. billId = Guid.NewGuid().ToString("N"),
  272. billType = 2,
  273. billEvent = onlyEarnest ? 20 : 21,
  274. orderId = order.orderId,
  275. amount = (int)refundAmt,
  276. payway = 1,
  277. userId = order.buyerId,
  278. createAt = now,
  279. };
  280. await repository.AddPlatformBill(bill, conn, trans);
  281. var cnt = await repository.SimpleUpdate("ue_order_hang",
  282. new {
  283. refundAmount = order.refundAmount + refundAmt
  284. },
  285. new { order.orderId }, conn, trans);
  286. }
  287. await repository.SimpleUpdate("ue_order_hang",
  288. new {
  289. earnestMoneyRefunded = 2
  290. },
  291. new { order.orderId, earnestMoneyRefunded = 4 }, conn, trans);
  292. return true;
  293. }
  294. #endregion
  295. /// <summary>
  296. /// 请求汇付接口
  297. /// </summary>
  298. /// <typeparam name="TResp"></typeparam>
  299. /// <param name="repository"></param>
  300. /// <param name="config"></param>
  301. /// <param name="info"></param>
  302. /// <param name="isOrgIdUnique">源id在记录表里是否唯一</param>
  303. /// <param name="conn"></param>
  304. /// <param name="trans"></param>
  305. /// <returns></returns>
  306. public static async Task<TResp> HuiFuRequest<TResp>(this DbRESTFulRepository repository,
  307. ConfigFromDb config, HuiFuReqBase info,bool isOrgIdUnique=false,
  308. IDbConnection conn=null,IDbTransaction trans = null) {
  309. info.InitNoticeUrl(config);
  310. HuiFuUtil.InitReqId(info);
  311. //插入请求记录
  312. if (isOrgIdUnique) {
  313. //查询库中的记录。
  314. var reqRecord = await repository.QuerySingleOrDefaultAsync<UEHuiFuReq>(
  315. $@"select orgId from ue_huifu_req where orgId=@orgId limit 1",
  316. new { info.orgId });
  317. if (reqRecord != null) {
  318. await repository.SimpleUpdate("ue_huifu_req", new { info.reqId },
  319. new { info.orgId });
  320. } else {
  321. await repository.AddHuiFuReq(info);
  322. }
  323. } else {
  324. await repository.AddHuiFuReq(info);
  325. }
  326. //插入请求内容
  327. await repository.SimpleInsert("ue_huifu_req_result", new {
  328. info.reqId,
  329. reqInfo = JsonConvert.SerializeObject(info),
  330. }, conn, trans);
  331. var resp = HuiFuUtil.Request<TResp>(config.HuiFuConfig,info);
  332. //状态要改成处理中,失败改成失败
  333. var dealResult = 3;
  334. if (resp == null) {
  335. dealResult = 2;
  336. } else {
  337. //请求成功,处理结果为处理中
  338. if(resp is HuiFuIndvResp indvResp&&
  339. !string.IsNullOrEmpty(indvResp.huifu_id)) {
  340. dealResult = 1;
  341. } else {
  342. dealResult = 3;
  343. }
  344. await repository.SimpleUpdate("ue_huifu_req_result",
  345. new { respInfo = JsonConvert.SerializeObject(resp) },
  346. new { info.reqId }, conn, trans);
  347. }
  348. //更新处理结果
  349. await repository.SimpleUpdate("ue_huifu_req", new { dealResult },
  350. new {
  351. dealResult = 0,
  352. info.reqId
  353. }, conn, trans);
  354. return resp;
  355. }
  356. public class UEUserExpend {
  357. /// <summary>
  358. /// 主键ID
  359. /// </summary>
  360. /// <remarks>
  361. /// 非空
  362. /// </remarks>
  363. public int id { get; set; }
  364. /// <summary>
  365. /// 操作源id(如支付id,退款id,或提现id等)
  366. /// </summary>
  367. /// <remarks>
  368. /// 非空
  369. /// </remarks>
  370. public string orgId { get; set; }
  371. /// <summary>
  372. /// 支出数量(货币单位是分,价值币单位是1价值币)
  373. /// </summary>
  374. public int expend { get; set; }
  375. /// <summary>
  376. /// 支出类型
  377. /// </summary>
  378. /// <remarks>
  379. /// 1,平台账户支出,2,价值币支出
  380. /// </remarks>
  381. public int expendType { get; set; }
  382. /// <summary>
  383. /// 支出状态
  384. /// </summary>
  385. /// <remarks>
  386. /// 1,支出中,2支出完成,默认1
  387. /// </remarks>
  388. public int state { get; set; }
  389. /// <summary>
  390. /// 用户id
  391. /// </summary>
  392. public long userId { get; set; }
  393. /// <summary>
  394. /// 创建时间
  395. /// </summary>
  396. /// <remarks>
  397. /// 非空
  398. /// </remarks>
  399. public DateTime createAt { get; set; }
  400. /// <summary>
  401. /// 修改时间
  402. /// </summary>
  403. public DateTime? updateAt { get; set; }
  404. }
  405. public class UEHuiFuReq {
  406. /// <summary>
  407. /// 主键ID
  408. /// </summary>
  409. /// <remarks>
  410. /// 非空
  411. /// </remarks>
  412. public int id { get; set; }
  413. /// <summary>
  414. /// 请求流水号(由原始id加前缀组成,reqType为1,前缀加P,2加I,3加O,4加C,5加R,6加RQ,后缀加随机4位,方便同样的orgId可以多次请求)
  415. /// </summary>
  416. /// <remarks>
  417. /// 非空
  418. /// </remarks>
  419. public string reqId { get; set; }
  420. /// <summary>
  421. /// 原始id(如果是支付,就是支付id,如果是退款,就是退款id,如果没有,就为空)
  422. /// </summary>
  423. public string orgId { get; set; }
  424. /// <summary>
  425. /// 汇付流水号(全局流水号)
  426. /// </summary>
  427. public string hfSeqId { get; set; }
  428. /// <summary>
  429. /// 请求类型(1,聚合正扫,2,用户开户3,用户入驻4,用户提现5,取消订单退款6,取消订单退款查询)
  430. /// </summary>
  431. public sbyte reqType { get; set; }
  432. /// <summary>
  433. /// 处理结果(0待处理,1成功,2失败,3处理中)
  434. /// </summary>
  435. public sbyte dealResult { get; set; }
  436. /// <summary>
  437. /// 事件类型(0无,1,订单支付,2商品取回,仓储费支付,3订单取消退款,4,取货保证金退款,5,下单抵扣,6,提现)
  438. /// </summary>
  439. public sbyte billEventType { get; set; }
  440. /// <summary>
  441. /// 订单编号
  442. /// </summary>
  443. public long orderId { get; set; }
  444. /// <summary>
  445. /// 用户id
  446. /// </summary>
  447. public long userId { get; set; }
  448. /// <summary>
  449. /// 原交易流水号
  450. /// </summary>
  451. public string orgReqSeqId { get; set; }
  452. /// <summary>
  453. /// 创建时间
  454. /// </summary>
  455. /// <remarks>
  456. /// 非空
  457. /// </remarks>
  458. public DateTime createAt { get; set; }
  459. }
  460. public class UEPlatformBill {
  461. /// <summary>
  462. /// 主键ID,流水编号
  463. /// </summary>
  464. /// <remarks>
  465. /// 非空
  466. /// </remarks>
  467. public string billId { get; set; }
  468. /// <summary>
  469. /// 流水类型
  470. /// </summary>
  471. /// <remarks>
  472. /// 1: 收入,2: 支出
  473. /// 非空
  474. /// </remarks>
  475. public int billType { get; set; }
  476. /// <summary>
  477. /// 流水事件
  478. /// </summary>
  479. /// <remarks>
  480. /// 收入类型范围在[10-19],支出类型范围在[20-29]
  481. /// 例如:收入:10-订单收入,11-仓储费收入;支出:20-取货保证金退款,21-订单退款,22-提现
  482. /// </remarks>
  483. public int billEvent { get; set; }
  484. /// <summary>
  485. /// 订单编号
  486. /// </summary>
  487. public long? orderId { get; set; }
  488. /// <summary>
  489. /// 流水金额单位分
  490. /// </summary>
  491. public int amount { get; set; }
  492. /// <summary>
  493. /// 支付方式
  494. /// </summary>
  495. /// <remarks>
  496. /// 1: 支付宝,2: 银行卡
  497. /// </remarks>
  498. public int payway { get; set; }
  499. /// <summary>
  500. /// 用户id
  501. /// </summary>
  502. public long userId { get; set; }
  503. /// <summary>
  504. /// 创建时间
  505. /// </summary>
  506. /// <remarks>
  507. /// 非空
  508. /// </remarks>
  509. public DateTime createAt { get; set; }
  510. /// <summary>
  511. /// 修改时间
  512. /// </summary>
  513. public DateTime? updateAt { get; set; }
  514. }
  515. public class UEWalletDetail {
  516. /// <summary>
  517. /// 主键ID,明细编号
  518. /// </summary>
  519. /// <remarks>
  520. /// 非空
  521. /// </remarks>
  522. public string detailId { get; set; }
  523. /// <summary>
  524. /// 明细类型
  525. /// </summary>
  526. /// <remarks>
  527. /// 1: 收入,2: 支出
  528. /// 非空
  529. /// </remarks>
  530. public int detailType { get; set; }
  531. /// <summary>
  532. /// 流水事件
  533. /// </summary>
  534. /// <remarks>
  535. /// 收入类型范围在[10-19],支出类型范围在[20-29]
  536. /// 例如:收入:10-卖货收入,11-撤单退回,12-取货保证金退回;
  537. /// 支出:20-下单抵扣,21-提现
  538. /// </remarks>
  539. public int detailEvent { get; set; }
  540. /// <summary>
  541. /// 订单编号
  542. /// </summary>
  543. public long? orderId { get; set; }
  544. /// <summary>
  545. /// 流水金额 单位分
  546. /// </summary>
  547. public int amount { get; set; }
  548. /// <summary>
  549. /// 当前结存
  550. /// </summary>
  551. public int balance { get; set; }
  552. /// <summary>
  553. /// 支付方式
  554. /// </summary>
  555. /// <remarks>
  556. /// 1: 支付宝,2: 银行卡
  557. /// </remarks>
  558. public int payway { get; set; }
  559. /// <summary>
  560. /// 用户id
  561. /// </summary>
  562. public long userId { get; set; }
  563. /// <summary>
  564. /// 创建时间
  565. /// </summary>
  566. /// <remarks>
  567. /// 非空
  568. /// </remarks>
  569. public DateTime createAt { get; set; }
  570. /// <summary>
  571. /// 修改时间
  572. /// </summary>
  573. public DateTime? updateAt { get; set; }
  574. }
  575. }
  576. }