From 51cd5f9388657f8f32c43905a1c018aac825e3b9 Mon Sep 17 00:00:00 2001 From: chfei Date: Sun, 20 Sep 2026 17:09:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E8=BF=94=E5=88=A9?= =?UTF-8?q?=E9=80=BB=E8=BE=91=20OEM=E8=BF=94=E5=88=A9=E6=8C=89=E7=85=A7?= =?UTF-8?q?=E6=88=90=E4=B8=BAOEM=E7=9A=84=E6=97=B6=E9=97=B4=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=20=E7=94=A8=E6=88=B7=E5=8F=98=E4=B8=BAOEM=E4=B8=8B?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E7=BB=93=E7=AE=97=E6=97=A7=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=20=E9=80=80=E5=87=BAOEM=E4=B8=8B=E8=B4=A6=E5=8F=B7=20OEM?= =?UTF-8?q?=E7=BB=93=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KJD_WebService/ContainerConfig.cs | 92 ++++++++++++ .../Controllers/WX/WXUserController.cs | 77 +++++++++- .../Controllers/WX/WXUser_N_Controller.cs | 65 ++++++++- KJD_WebService/Entitys/UserEntity.cs | 8 ++ KJD_WebService/Global.asax.cs | 74 +--------- KJD_WebService/KJD_WebService.csproj | 3 + KJD_WebService/Requests/RequestBase.cs | 2 +- .../Requests/Users/CUUserInfoRequest.cs | 63 ++++++++ .../Services/Users/UserService.Admin.cs | 15 ++ .../Services/Users/UserService.FeeRecord.cs | 69 ++++++--- .../Services/Users/UserService.OEM.cs | 33 ++++- KJD_WebService/Services/Users/UserService.cs | 135 ++++++++++++++++++ KJD_WebService/Web.config | 4 +- test/WebServiceTest/UnitTest1.cs | 3 + test/WebServiceTest/UserTest.cs | 71 +++++++++ test/WebServiceTest/WebServiceTest.csproj | 5 +- 16 files changed, 605 insertions(+), 114 deletions(-) create mode 100644 KJD_WebService/ContainerConfig.cs create mode 100644 KJD_WebService/Requests/Users/CUUserInfoRequest.cs create mode 100644 KJD_WebService/Services/Users/UserService.Admin.cs create mode 100644 test/WebServiceTest/UserTest.cs diff --git a/KJD_WebService/ContainerConfig.cs b/KJD_WebService/ContainerConfig.cs new file mode 100644 index 0000000..ffb007b --- /dev/null +++ b/KJD_WebService/ContainerConfig.cs @@ -0,0 +1,92 @@ +using Autofac; +using Autofac.Integration.WebApi; +using FreeSql; +using KJD_Web.Repository; +using MAX.Core.DependencyInjection; +using MAX.Core.Logger; +using MAX.Framework.Logger; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Reflection; +using System.Web; + +namespace KJD_Web; + +public class ContainerConfig +{ + + public static IContainer BuildContainer() + { + var builder = new ContainerBuilder(); + var appAssembly = Assembly.GetExecutingAssembly(); + + var connection = ConfigurationManager.ConnectionStrings["ConnKJD"]; + if (connection == null || string.IsNullOrWhiteSpace(connection.ConnectionString)) + { + throw new ConfigurationErrorsException("未配置连接字符串:ConnKJD"); + } + + // ImageCacheService 使用独立的 imagecache 数据库。 + builder.Register(_ => + { + return new FreeSqlBuilder() + .UseConnectionString( + DataType.MySql, + connection.ConnectionString) + .Build(); + }) + .As() + .SingleInstance(); + + builder.RegisterGeneric(typeof(AutofacRepository<>)) + .As(typeof(IBaseRepository<>)) + .UsingConstructor(typeof(IFreeSql)) + .InstancePerRequest(); + + + // 注册 Web API 所有 Controller + builder.RegisterApiControllers(appAssembly); + builder.RegisterInstance(NLogger.Instance).As().SingleInstance(); + + + + + #region 注册所有IOC接口 + + Type typeSingleton = typeof(ISingletonDependency); + builder.RegisterAssemblyTypes(appAssembly) + .Where(a => + typeSingleton.IsAssignableFrom(a) + && a.IsClass + && !a.IsAbstract + ) + .AsImplementedInterfaces() + .AsSelf() + .SingleInstance(); + + Type typeTransient = typeof(ITransientDependency); + builder.RegisterAssemblyTypes(appAssembly) + .Where(a => + typeTransient.IsAssignableFrom(a) + && a.IsClass + && !a.IsAbstract + ) + .AsImplementedInterfaces() + .AsSelf() + .InstancePerDependency(); + + Type typeScoped = typeof(IScopedDependency); + builder.RegisterAssemblyTypes(appAssembly) + .Where(a => typeScoped.IsAssignableFrom(a) && a.IsClass && !a.IsAbstract) + .AsImplementedInterfaces() + .AsSelf() + .InstancePerRequest(); + + #endregion + + return builder.Build(); + } + +} \ No newline at end of file diff --git a/KJD_WebService/Controllers/WX/WXUserController.cs b/KJD_WebService/Controllers/WX/WXUserController.cs index f42970f..fe14e1d 100644 --- a/KJD_WebService/Controllers/WX/WXUserController.cs +++ b/KJD_WebService/Controllers/WX/WXUserController.cs @@ -1,5 +1,8 @@ using KJD_Web.BLL.WXXD; +using KJD_Web.Model; using KJD_Web.Requests; +using KJD_Web.Requests.Users; +using KJD_Web.Utils; using NaiBa.Util.Extension; using System; using System.Collections.Generic; @@ -115,16 +118,74 @@ namespace KJD_Web.Controllers return JsonString(result); } - + /// + /// 更新用户 + /// + /// public IHttpActionResult update_user() { - string jsontext = GetRequestJsonString(); - var result = jsontext; - result = new WXUserManage().UpdateUser(jsontext); + string inputData = GetRequestJsonString(); - return JsonString(result); + + var uu = RegexUtils.GetStringQuery(ref inputData, "uu")?.Replace("'", "\\'").ParseToBool(); + + if (uu != true) + { + var result = new WXUserManage().UpdateUser(inputData); + return JsonString(result); + } + else + { + try + { + var id = RegexUtils.GetStringQuery(ref inputData, "id")?.Replace("'", "\\'").ParseToInt(); + var nick_name = HtmlUtils.UrlDecodeUtf8(RegexUtils.GetStringQuery(ref inputData, "add_nick_name"))?.Replace("'", "\\'"); + var user_name = HtmlUtils.UrlDecodeUtf8(RegexUtils.GetStringQuery(ref inputData, "add_user_name"))?.Replace("'", "\\'"); + var mobile = HtmlUtils.UrlDecodeUtf8(RegexUtils.GetStringQuery(ref inputData, "add_mobile"))?.Replace("'", "\\'"); + var company_name = HtmlUtils.UrlDecodeUtf8(RegexUtils.GetStringQuery(ref inputData, "add_company"))?.Replace("'", "\\'"); + var password = RegexUtils.GetStringQuery(ref inputData, "add_password")?.Replace("'", "\\'"); + var group_id = RegexUtils.GetStringQuery(ref inputData, "group_id")?.Replace("'", "\\'").ParseToNullableInt(); + var card_id = RegexUtils.GetStringQuery(ref inputData, "card_id")?.Replace("'", "\\'"); + var notes = RegexUtils.GetStringQuery(ref inputData, "notes")?.Replace("'", "\\'"); + var sa_level = RegexUtils.GetStringQuery(ref inputData, "sa_level")?.Replace("'", "\\'").ParseToNullableInt(); ; + var authority = RegexUtils.GetStringQuery(ref inputData, "authority")?.Replace("'", "\\'"); + var forbidden_page = RegexUtils.GetStringQuery(ref inputData, "forbidden_page")?.Replace("'", "\\'"); + var shop_points_per_month = RegexUtils.GetStringQuery(ref inputData, "shop_points_per_month")?.Replace("'", "\\'").ParseToDecimal(); + var postage_per_order = RegexUtils.GetStringQuery(ref inputData, "postage_per_order")?.Replace("'", "\\'").ParseToDecimal(); + var refund_postage_per_order = RegexUtils.GetStringQuery(ref inputData, "refund_postage_per_order")?.Replace("'", "\\'").ParseToDecimal(); + var gift_oem_amount_per_order = RegexUtils.GetStringQuery(ref inputData, "gift_oem_amount_per_order")?.Replace("'", "\\'").ParseToDecimal(); + var oem_id = RegexUtils.GetStringQuery(ref inputData, "oem_id")?.Replace("'", "\\'"); + + CUUserInfoRequest request = new CUUserInfoRequest + { + Id = id, + NickName = nick_name, + UserName = user_name, + Mobile = mobile, + CompanyName = company_name, + Password = password, + GroupId = group_id, + CardId = card_id, + Notes = notes, + SaLevel = sa_level, + Authority = authority, + ForbiddenPage = forbidden_page, + ShopPointsPerMonth = shop_points_per_month, + PostagePerOrder = postage_per_order, + RefundPostagePerOrder = refund_postage_per_order, + GiftOemAmountPerOrder = gift_oem_amount_per_order, + OemId = oem_id, + }; + _userService.UpdateUser(request); + return Ok(ApiResult.Success(true)); + } + catch (Exception ex) + { + return Ok(ApiResult.Fail(ex.Message)); + } + } } @@ -280,7 +341,11 @@ namespace KJD_Web.Controllers return JsonString(result); } - + /// + /// oem结算 失效 + /// + /// + [Obsolete] public IHttpActionResult oem_settle_flows() { string jsontext = GetRequestJsonString(); diff --git a/KJD_WebService/Controllers/WX/WXUser_N_Controller.cs b/KJD_WebService/Controllers/WX/WXUser_N_Controller.cs index c6afe2b..0b86116 100644 --- a/KJD_WebService/Controllers/WX/WXUser_N_Controller.cs +++ b/KJD_WebService/Controllers/WX/WXUser_N_Controller.cs @@ -1,7 +1,11 @@ -using KJD_Web.Model; +using KJD_Web.BLL.WXXD; +using KJD_Web.Model; +using KJD_Web.Requests; using KJD_Web.Requests.Users; using KJD_Web.Services.Users; using MAX.Core.Logger; +using NaiBa.Util.Extension; +using Org.BouncyCastle.Ocsp; using System; using System.Web.Http; @@ -17,6 +21,57 @@ namespace KJD_Web.Controllers _userService = userService ?? throw new ArgumentNullException(nameof(userService)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } + /// + /// 查询 + /// + /// + [HttpPost] + public IHttpActionResult GetOemAmount(SignRequestBase request) + { + try + { + var oem = _userService.GetOEMByUserName(request.UserName, false); + if (oem == null) + { + throw new Exception("错误的账号"); + } + return Ok(ApiResult.Success(new + { + oem.AvailableBalance, + oem.TotalRebateAmount, + oem.TotalWithdrawAmount + })); + } + catch (Exception ex) + { + return Ok(ApiResult.Fail(ex.Message)); + } + + } + /// + /// 流水结算 + /// + /// + [HttpPost] + [Route("oem_settle_flows")] + public IHttpActionResult OEMSettleFlows(SignRequestBase request) + { + try + { + var oem = _userService.SettleOemFlows(request.UserName); + return Ok(ApiResult.Success(new + { + oem.AvailableBalance, + oem.TotalRebateAmount, + oem.TotalWithdrawAmount + })); + } + catch (Exception ex) + { + return Ok(ApiResult.Fail(ex.Message)); + } + + } /// /// 用户续费商铺。 @@ -47,5 +102,13 @@ namespace KJD_Web.Controllers return Ok(ApiResult.Fail("续费失败,请稍后重试", ResultCode.ServerError)); } } + + /// + /// 用户结算流水 + /// + private void UserSettleFlows(string userName, string oemId) + { + + } } } diff --git a/KJD_WebService/Entitys/UserEntity.cs b/KJD_WebService/Entitys/UserEntity.cs index e38387b..041de86 100644 --- a/KJD_WebService/Entitys/UserEntity.cs +++ b/KJD_WebService/Entitys/UserEntity.cs @@ -152,5 +152,13 @@ namespace KJD_Web.Entitys /// [Column(Name = "gift_oem_amount_per_order")] public decimal? GiftOemAmountPerOrder { get; set; } + + /// + /// 是否主账户 + /// + public bool IsMainUser + { + get => string.IsNullOrWhiteSpace(ParentUserName); + } } } \ No newline at end of file diff --git a/KJD_WebService/Global.asax.cs b/KJD_WebService/Global.asax.cs index c744a28..0b766d2 100644 --- a/KJD_WebService/Global.asax.cs +++ b/KJD_WebService/Global.asax.cs @@ -25,7 +25,7 @@ namespace KJD_Web protected void Application_Start(object sender, EventArgs e) { NLogger.Instance.Info("应用程序启动"); - var container = BuildContainer(); + var container = ContainerConfig.BuildContainer(); // 让 Web API 用 Autofac 解析 Controller GlobalConfiguration.Configuration.DependencyResolver = @@ -33,77 +33,7 @@ namespace KJD_Web GlobalConfiguration.Configure(WebApiConfig.Register); } - internal static IContainer BuildContainer() - { - var builder = new ContainerBuilder(); - var appAssembly = Assembly.GetExecutingAssembly(); - - var connection = ConfigurationManager.ConnectionStrings["ConnKJD"]; - if (connection == null || string.IsNullOrWhiteSpace(connection.ConnectionString)) - { - throw new ConfigurationErrorsException("未配置连接字符串:ConnKJD"); - } - - // ImageCacheService 使用独立的 imagecache 数据库。 - builder.Register(_ => - { - return new FreeSqlBuilder() - .UseConnectionString( - DataType.MySql, - connection.ConnectionString) - .Build(); - }) - .As() - .SingleInstance(); - - builder.RegisterGeneric(typeof(AutofacRepository<>)) - .As(typeof(IBaseRepository<>)) - .UsingConstructor(typeof(IFreeSql)) - .InstancePerRequest(); - - - // 注册 Web API 所有 Controller - builder.RegisterApiControllers(appAssembly); - builder.RegisterInstance(NLogger.Instance).As().SingleInstance(); - - - - - #region 注册所有IOC接口 - - Type typeSingleton = typeof(ISingletonDependency); - builder.RegisterAssemblyTypes(appAssembly) - .Where(a => - typeSingleton.IsAssignableFrom(a) - && a.IsClass - && !a.IsAbstract - ) - .AsImplementedInterfaces() - .AsSelf() - .SingleInstance(); - - Type typeTransient = typeof(ITransientDependency); - builder.RegisterAssemblyTypes(appAssembly) - .Where(a => - typeTransient.IsAssignableFrom(a) - && a.IsClass - && !a.IsAbstract - ) - .AsImplementedInterfaces() - .AsSelf() - .InstancePerDependency(); - - Type typeScoped = typeof(IScopedDependency); - builder.RegisterAssemblyTypes(appAssembly) - .Where(a => typeScoped.IsAssignableFrom(a) && a.IsClass && !a.IsAbstract) - .AsImplementedInterfaces() - .AsSelf() - .InstancePerRequest(); - - #endregion - - return builder.Build(); - } + private static IFreeSql CreateImageCacheFreeSql() { var connection = ConfigurationManager.ConnectionStrings["ConnKJD"]; diff --git a/KJD_WebService/KJD_WebService.csproj b/KJD_WebService/KJD_WebService.csproj index 2b33bac..4a99835 100644 --- a/KJD_WebService/KJD_WebService.csproj +++ b/KJD_WebService/KJD_WebService.csproj @@ -189,6 +189,7 @@ + @@ -223,6 +224,7 @@ + @@ -334,6 +336,7 @@ + Web.config diff --git a/KJD_WebService/Requests/RequestBase.cs b/KJD_WebService/Requests/RequestBase.cs index 77cc3f2..baa57ad 100644 --- a/KJD_WebService/Requests/RequestBase.cs +++ b/KJD_WebService/Requests/RequestBase.cs @@ -4,7 +4,7 @@ using System; namespace KJD_Web.Requests; /// -/// 卡名请求 +/// Sign签名 /// public class SignRequestBase { diff --git a/KJD_WebService/Requests/Users/CUUserInfoRequest.cs b/KJD_WebService/Requests/Users/CUUserInfoRequest.cs new file mode 100644 index 0000000..83e057a --- /dev/null +++ b/KJD_WebService/Requests/Users/CUUserInfoRequest.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace KJD_Web.Requests.Users; + +/// +/// 添加和修改用户 Dto +/// +public class CUUserInfoRequest : SignRequestBase +{ + /// 主键 ID + public int? Id { get; set; } + + /// 昵称(URL 解码) + public string NickName { get; set; } + + /// 用户名(URL 解码) + public string UserName { get; set; } + + /// 手机号(URL 解码) + public string Mobile { get; set; } + + /// 公司名称(URL 解码) + public string CompanyName { get; set; } + + /// 密码 + public string Password { get; set; } + + /// 分组 ID + public int? GroupId { get; set; } + + /// 卡 ID + public string CardId { get; set; } + + /// 备注 + public string Notes { get; set; } + + /// SA 等级 + public int? SaLevel { get; set; } + + /// 权限 + public string Authority { get; set; } + + /// 禁止访问的页面 + public string ForbiddenPage { get; set; } + + /// 每月店铺积分 + public decimal? ShopPointsPerMonth { get; set; } + + /// 每单邮费 + public decimal? PostagePerOrder { get; set; } + + /// 每单退邮费 + public decimal? RefundPostagePerOrder { get; set; } + + /// 每单赠送 OEM 金额 + public decimal? GiftOemAmountPerOrder { get; set; } + + /// OEM ID + public string OemId { get; set; } +} \ No newline at end of file diff --git a/KJD_WebService/Services/Users/UserService.Admin.cs b/KJD_WebService/Services/Users/UserService.Admin.cs new file mode 100644 index 0000000..92bca56 --- /dev/null +++ b/KJD_WebService/Services/Users/UserService.Admin.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace KJD_Web.Services.Users +{ + public partial class UserService + { + public UserService() + { + + } + } +} \ No newline at end of file diff --git a/KJD_WebService/Services/Users/UserService.FeeRecord.cs b/KJD_WebService/Services/Users/UserService.FeeRecord.cs index 5275772..b9bf3fe 100644 --- a/KJD_WebService/Services/Users/UserService.FeeRecord.cs +++ b/KJD_WebService/Services/Users/UserService.FeeRecord.cs @@ -3,7 +3,10 @@ using KJD_Web.Model.WxModel; using MySqlX.XDevAPI; using System; using System.Collections.Generic; +using System.Data.Common; +using System.Diagnostics; using System.Linq; +using System.Text; using System.Web; namespace KJD_Web.Services.Users @@ -21,7 +24,7 @@ namespace KJD_Web.Services.Users /// /// 结算OEM流水 /// - public OEMEntity SettleOemFlows(string userName) + public OEMEntity SettleOemFlows(string userName, DbTransaction tarn = null) { var oem = GetOEMByUserName(userName); @@ -29,10 +32,8 @@ namespace KJD_Web.Services.Users { throw new Exception("错误的账号"); } - - using var work = _freeSql.CreateUnitOfWork(); + using var work = tarn != null ? _freeSql.CreateUnitOfWork(tarn) : _freeSql.CreateUnitOfWork(); var trFreeSql = work.Orm; - // 获取OEM下面的所有用户 var users = GetOEMUsers(oem.OemId, true); @@ -58,7 +59,7 @@ namespace KJD_Web.Services.Users trFreeSql, userNames, oem.AddTime); - + long rebateFen = totalFen; @@ -84,24 +85,31 @@ namespace KJD_Web.Services.Users } work.Commit(); - + oem = GetOEMByUserName(userName, false); return oem; } + /// /// 结算用户流水 /// /// - public void SettleUserFlows(string userName) + public long SettleUserFlows(string userName, DbTransaction tarn = null) { - var user = GetUserByUserName(userName); if (user == null) { throw new Exception("错误的账号"); } - using var work = _freeSql.CreateUnitOfWork(); - var trFreeSql = work.Orm; - var userNames = new List { user.UserName }; - /* * 普通用户没有OEM创建时间限制。 * * 所以这里传null。 */ - long totalAmount = SettleFlowsInternal(trFreeSql, userNames, null); - /* * 普通用户没有余额, * 所以不做任何金额更新。 */ + var user = GetUserAndSubUser(userName); + if (user == null) + { + throw new Exception("错误的账号"); + } + using var work = tarn != null ? _freeSql.CreateUnitOfWork(tarn) : _freeSql.CreateUnitOfWork(); + var trFreeSql = work.Orm; + var userNames = user.Select(a => a.UserName).ToList(); + /* * 普通用户没有OEM创建时间限制。 * * 所以这里传null。 */ + long totalAmount = SettleFlowsInternal(trFreeSql, userNames, null); + /* * 普通用户没有余额, * 所以不做任何金额更新。 */ + Debug.WriteLine($"用户流水结算:{totalAmount}"); work.Commit(); + return totalAmount; } /// @@ -127,10 +135,15 @@ namespace KJD_Web.Services.Users .Where(a => a.Settlement == 0) .Where(a => a.IsDeleted == 0); //只有OEM结算才限制OEM创建时间。 - if (oemAddTime.HasValue) { paymentQuery = paymentQuery.Where(a => a.CreateTime > oemAddTime.Value); } + if (oemAddTime.HasValue) + { + paymentQuery = paymentQuery.Where(a => a.CreateTime > oemAddTime.Value); + } + paymentQuery.OrderBy(a => a.Id); var userPayments = paymentQuery.ToList(); if (userPayments.Count > 0) { + Debug.WriteLine(userPayments.Where(a => a.Type == 20).Sum(a => a.OemAmount)); ///原始流水ID。 List ids = userPayments.Select(a => a.Id).ToList(); @@ -139,7 +152,7 @@ namespace KJD_Web.Services.Users { a.Type, a.OrderId - }).Select(a => a.First()); + }).Select(a => a.First()).ToList(); //经过计算过滤后的列表 List userPaymentCalculated = new List(); @@ -148,29 +161,40 @@ namespace KJD_Web.Services.Users { if (item.Type == 20) { - item.OemAmount = item.Amount - 2.2m; + //item.OemAmount = item.Amount - 2.2m; + item.OemAmount = item.OemAmount; } else if (item.Type == 26) { - item.OemAmount = item.Amount - 2.5m; + //item.OemAmount = item.Amount - 2.5m; + item.OemAmount = item.OemAmount; } if (item.Type == 23) { var temp = userPaymentCalculated.FirstOrDefault(a => a.Type == 20 && a.OrderId == item.OrderId); if (temp != null) - userPaymentCalculated.Remove(temp);//23 移除 20 + { + userPaymentCalculated.Remove(temp);//23 移除 20 + } + continue; } else if (item.Type == 34) { - item.OemAmount = -item.OemAmount; + item.OemAmount = item.OemAmount * -1; } userPaymentCalculated.Add(item); } decimal userPaymentAmount = userPaymentCalculated.Sum(x => x.OemAmount ?? 0);//累计返利 + //StringBuilder sb = new StringBuilder(); + //sb.AppendLine("id,order_id,type,amount,oem_amount,time"); + //foreach (var item in userPayments) + //{ + // sb.AppendLine($"{item.Id},{item.OrderId},{item.Type},{item.Amount},{item.OemAmount},{item.CreateTime}"); + //} total_amount += userPaymentAmount; rebate_amount += userPaymentAmount; - + Debug.WriteLine($"运费流水返利:{userPaymentAmount}"); var settlementCount = tr_freeSql.Update() .Set(a => a.Settlement, (byte)1) .Set(a => a.SettlementTime, now) @@ -196,13 +220,12 @@ namespace KJD_Web.Services.Users { return x.DeltaPoints * 1 - ShopRenewFee; //比例1:1 减去固定收取费用 });//累计返利 - userPointsAmount *= 1;//比例1:1 total_amount += userPointsAmount; rebate_amount += userPointsAmount; - + Debug.WriteLine($"商铺月费返利:{userPointsAmount}"); var settlementCount = tr_freeSql.Update() .Set(a => a.Settlement, true) .Set(a => a.SettlementTime, now) diff --git a/KJD_WebService/Services/Users/UserService.OEM.cs b/KJD_WebService/Services/Users/UserService.OEM.cs index bf5c8df..6297637 100644 --- a/KJD_WebService/Services/Users/UserService.OEM.cs +++ b/KJD_WebService/Services/Users/UserService.OEM.cs @@ -14,16 +14,37 @@ public partial class UserService { private static List OEMData = null; - public OEMEntity GetOEMByUserName(string userName) + public OEMEntity GetOEMByUserName(string userName, bool isCache = true) { if (string.IsNullOrEmpty(userName)) return null; - - if (OEMData == null) + if (isCache) { - OEMData = _freeSql.Select().ToList(); - + if (OEMData == null) + { + OEMData = _freeSql.Select().ToList(); + } + return OEMData.FirstOrDefault(a => a.OemOwner == userName); + } + else + { + return _freeSql.Select().Where(a => a.OemOwner == userName).First(); + } + } + public OEMEntity GetOEMByOemId(string oemId, bool isCache = true) + { + if (string.IsNullOrEmpty(oemId)) return null; + if (isCache) + { + if (OEMData == null) + { + OEMData = _freeSql.Select().ToList(); + } + return OEMData.FirstOrDefault(a => a.OemId == oemId); + } + else + { + return _freeSql.Select().Where(a => a.OemId == oemId).First(); } - return OEMData.FirstOrDefault(a => a.OemOwner == userName); } /// /// 获取所有OEM用户包含子用户 diff --git a/KJD_WebService/Services/Users/UserService.cs b/KJD_WebService/Services/Users/UserService.cs index fe65dc7..c53e8fa 100644 --- a/KJD_WebService/Services/Users/UserService.cs +++ b/KJD_WebService/Services/Users/UserService.cs @@ -6,7 +6,11 @@ using KJD_Web.Model.ShopModel; using KJD_Web.Requests.Users; using KJD_Web.Utils; using MAX.Core.DependencyInjection; +using NaiBa.Util.Extension; using System; +using System.Collections.Generic; +using System.Linq; +using Ubiety.Dns.Core; using YourNamespace; namespace KJD_Web.Services.Users @@ -40,6 +44,30 @@ namespace KJD_Web.Services.Users return _freeSql.Select().Where(a => a.UserName == userName).First(); } /// + /// 获取用户包含子账户 + /// + /// + /// + public List GetUserAndSubUser(string userName) + { + if (string.IsNullOrEmpty(userName)) return null; + var mainUser = _freeSql.Select().Where(a => a.UserName == userName).First(); + if (mainUser == null) return null; + List allUsers = [mainUser]; + // 3. 这些主账号对应的子账号 + var subUsers = _freeSql.Select() + .Where(u => u.ParentUserName == mainUser.UserName) + .ToList(); + + // 4. 合并,去重 + allUsers = allUsers + .Concat(subUsers) + .Distinct() + .ToList(); + + return allUsers; + } + /// /// 商铺续费 /// /// 续费请求 @@ -230,5 +258,112 @@ namespace KJD_Web.Services.Users return TimeUtils.DateTimeToTimestampSeconds(newExpireDateTime); } + + + + /// + /// 更新用户 + /// + /// + /// + + public void UpdateUser(CUUserInfoRequest userinfo) + { + using var work = _freeSql.CreateUnitOfWork(); + var trFreeSql = work.Orm; + var oldUser = trFreeSql.Select() + .Where(a => a.Id == userinfo.Id) + .First(); + + if (oldUser == null) throw new Exception("错误的用户"); + + if (string.IsNullOrEmpty(userinfo.NickName) || string.IsNullOrEmpty(userinfo.Mobile)) throw new Exception("信息不正确"); + if (userinfo.Mobile.Length != 11) throw new Exception("信息不正确"); + + var update = trFreeSql.Update(); + if (!string.IsNullOrEmpty(userinfo.NickName)) + update = update.Set(a => a.NickName, userinfo.NickName); + + if (!string.IsNullOrEmpty(userinfo.UserName)) + update = update.Set(a => a.UserName, userinfo.UserName); + + if (!string.IsNullOrEmpty(userinfo.Mobile)) + update = update.Set(a => a.Mobile, userinfo.Mobile); + + if (!string.IsNullOrEmpty(userinfo.CompanyName)) + update = update.Set(a => a.CompanyName, userinfo.CompanyName); + + if (!string.IsNullOrEmpty(userinfo.Password)) + update = update.Set(a => a.Password, userinfo.Password); + + if (userinfo.GroupId.HasValue) + update = update.Set(a => a.GroupId, userinfo.GroupId.Value); + + if (string.IsNullOrEmpty(userinfo.CardId)) + update = update.Set(a => a.CardId, userinfo.CardId); + + if (!string.IsNullOrEmpty(userinfo.Notes)) + update = update.Set(a => a.Notes, userinfo.Notes); + + if (userinfo.SaLevel.HasValue) + update = update.Set(a => a.SaLevel, (short)userinfo.SaLevel.Value); + + if (userinfo.Authority != null) + update = update.Set(a => a.Authority, userinfo.Authority); + + if (userinfo.ForbiddenPage != null) + update = update.Set(a => a.ForbiddenPage, userinfo.ForbiddenPage); + + if (userinfo.ShopPointsPerMonth.HasValue) + update = update.Set(a => a.ShopPointsPerMonth, userinfo.ShopPointsPerMonth.Value); + + if (userinfo.PostagePerOrder.HasValue) + update = update.Set(a => a.PostagePerOrder, userinfo.PostagePerOrder.Value); + + if (userinfo.RefundPostagePerOrder.HasValue) + update = update.Set(a => a.RefundPostagePerOrder, userinfo.RefundPostagePerOrder.Value); + + if (userinfo.GiftOemAmountPerOrder.HasValue) + update = update.Set(a => a.GiftOemAmountPerOrder, userinfo.GiftOemAmountPerOrder.Value); + + //主账户允许修改OEM + if (oldUser.IsMainUser) + { + update = update.Set(a => a.OemId, userinfo.OemId); + } + string sql = update.Where(a => a.Id == userinfo.Id).ToSql(); + var updateCount = update + .Where(a => a.Id == userinfo.Id) + .ExecuteAffrows(); + + if (updateCount != 1) + { + throw new Exception("修改失败"); + } + + if (oldUser.IsMainUser)//主账号允许结算 + { + if (oldUser.OemId != userinfo.OemId) + { + //更换oem 需要结算 + if (string.IsNullOrEmpty(oldUser.OemId) == false) + { + //移除旧Oem + var oem = GetOEMByOemId(oldUser.OemId); + if (oem != null) + { + SettleOemFlows(oem.OemOwner, work.GetOrBeginTransaction()); + } + } + else + { + //空OEM 转非空 + SettleUserFlows(userinfo.UserName, work.GetOrBeginTransaction()); + } + } + } + + work.Commit(); + } } } diff --git a/KJD_WebService/Web.config b/KJD_WebService/Web.config index 4759219..5a5d82d 100644 --- a/KJD_WebService/Web.config +++ b/KJD_WebService/Web.config @@ -5,8 +5,8 @@ --> - - + + diff --git a/test/WebServiceTest/UnitTest1.cs b/test/WebServiceTest/UnitTest1.cs index b391069..f30e788 100644 --- a/test/WebServiceTest/UnitTest1.cs +++ b/test/WebServiceTest/UnitTest1.cs @@ -95,5 +95,8 @@ namespace WebServiceTest var user = new WXUserManage().GetUserByUserName("18990991234"); Console.WriteLine(user.sa_level); } + + + } } \ No newline at end of file diff --git a/test/WebServiceTest/UserTest.cs b/test/WebServiceTest/UserTest.cs new file mode 100644 index 0000000..cb7c1bd --- /dev/null +++ b/test/WebServiceTest/UserTest.cs @@ -0,0 +1,71 @@ +using Autofac; +using Autofac.Integration.WebApi; +using KJD_Web; +using KJD_Web.Services.Users; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Timers; +using System.Web.Http; + +namespace WebServiceTest; + +public sealed class NUnitDebugListener : TraceListener +{ + public override void Write(string? message) + { + TestContext.Write(message); + } + + public override void WriteLine(string? message) + { + TestContext.WriteLine(message); + } +} +internal class UserTest +{ + private static NUnitDebugListener? _listener; + private IContainer _container; + [SetUp] + public void Setup() + { + _listener = new NUnitDebugListener(); + Debug.Listeners.Add(_listener); + var config = new HttpConfiguration(); + _container = ContainerConfig.BuildContainer(); + config.DependencyResolver = new AutofacWebApiDependencyResolver(_container); + WebApiConfig.Register(config); + } + [TearDown] + public void TearDown() + { + _container?.Dispose(); + _listener.Dispose(); + } + + [Test] + public void SettleOEM() + { + var userService = _container.Resolve(); + var oem = userService.SettleOemFlows("13938677077"); + Console.WriteLine(new + { + oem.AvailableBalance, + oem.TotalRebateAmount, + oem.TotalWithdrawAmount + }); + + } + + [Test] + public void SettleUser() + { + var userService = _container.Resolve(); + var count = userService.SettleUserFlows("15938489009"); + Console.WriteLine(count); + + } +} diff --git a/test/WebServiceTest/WebServiceTest.csproj b/test/WebServiceTest/WebServiceTest.csproj index 4234933..48552a9 100644 --- a/test/WebServiceTest/WebServiceTest.csproj +++ b/test/WebServiceTest/WebServiceTest.csproj @@ -10,6 +10,8 @@ + + @@ -22,9 +24,6 @@ - - ..\..\packages\Autofac.9.3.2\lib\netstandard2.0\Autofac.dll - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.10.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll