diff --git a/antis-ncc-admin/src/views/lqKhxx/Form.vue b/antis-ncc-admin/src/views/lqKhxx/Form.vue index 75bbd02..cae33c4 100644 --- a/antis-ncc-admin/src/views/lqKhxx/Form.vue +++ b/antis-ncc-admin/src/views/lqKhxx/Form.vue @@ -207,30 +207,6 @@ - - -
- - 到店记录 -
-
- - - -
- - 消费信息 -
-
- - - -
- - 余额信息 -
-
-
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxOrderTypeOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxOrderTypeOutput.cs new file mode 100644 index 0000000..d26770c --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxOrderTypeOutput.cs @@ -0,0 +1,30 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqKhxx +{ + /// + /// 客户订单类型输出 + /// + public class LqKhxxOrderTypeOutput + { + /// + /// 客户ID + /// + public string CustomerId { get; set; } + + /// + /// 订单类型 (first_order: 首单, repeat_order: 升单) + /// + public string OrderType { get; set; } + + /// + /// 是否有开单记录 + /// + public bool HasOrderRecord { get; set; } + + /// + /// 开单记录数量 + /// + public int OrderCount { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbCrInput.cs index 9c6ad08..cbbfd13 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbCrInput.cs @@ -12,56 +12,50 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb /// 拓客编号 /// public string id { get; set; } - + /// /// 拓客时间 /// public DateTime? tksj { get; set; } - - /// - /// 拓客人员 - /// - public string tkry { get; set; } - + /// /// 顾客姓名 /// public string gkxm { get; set; } - + /// /// 电话号码 /// public string dhhm { get; set; } - + /// /// 购买张数 /// public int? gmzs { get; set; } - + /// /// 支付方式 /// public string zffs { get; set; } - + /// /// 是否加微信 /// public string sfjwx { get; set; } - + /// /// 备注 /// public string bz { get; set; } - + /// - /// 所属门店 + /// 拓客人员 /// - public string ssmd { get; set; } - + public string tkry { get; set; } + /// - /// 所属战队 + /// 拓客活动id /// - public string sszd { get; set; } - + public string eventId { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_khxx/LqKhxxEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_khxx/LqKhxxEntity.cs index c0f68f9..4337b6c 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_khxx/LqKhxxEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_khxx/LqKhxxEntity.cs @@ -160,5 +160,11 @@ namespace NCC.Extend.Entitys.lq_khxx /// [SugarColumn(ColumnName = "ml")] public string Ml { get; set; } + + /// + /// 添加时间 + /// + [SugarColumn(ColumnName = "F_CreateTime")] + public DateTime CreateTime { get; set; } = DateTime.Now; } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_tkjlb/LqTkjlbEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_tkjlb/LqTkjlbEntity.cs index 68a2683..61b05fd 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_tkjlb/LqTkjlbEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_tkjlb/LqTkjlbEntity.cs @@ -64,7 +64,13 @@ namespace NCC.Extend.Entitys.lq_tkjlb public string Bz { get; set; } /// - /// 所属门店 + /// 拓客活动id + /// + [SugarColumn(ColumnName = "F_EventId")] + public string EventId { get; set; } + + /// + /// 所属组织 /// [SugarColumn(ColumnName = "ssmd")] public string Ssmd { get; set; } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/ILqKhxxService.cs b/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/ILqKhxxService.cs index 015a5fa..6694ad6 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/ILqKhxxService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/ILqKhxxService.cs @@ -1,6 +1,23 @@ -namespace NCC.Extend.Interfaces.LqKhxx +using System.Threading.Tasks; +using NCC.Common.Filter; +using NCC.Extend.Entitys.Dto.LqKhxx; + +namespace NCC.Extend.Interfaces.LqKhxx { public interface ILqKhxxService { + /// + /// 获取线索池客户列表 + /// + /// 查询参数 + /// 线索池客户列表 + Task> GetLeadsPoolList(LqKhxxListQueryInput input); + + /// + /// 获取客户订单类型(首单/升单) + /// + /// 客户ID + /// 客户订单类型信息 + Task GetCustomerOrderType(string customerId); } -} \ No newline at end of file +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs index 6c40d4f..fd6f1c3 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs @@ -148,6 +148,12 @@ namespace NCC.Extend.LqKhxx public async Task Create([FromBody] LqKhxxCrInput input) { var userInfo = await _userManager.GetUserInfo(); + //判断手机号是否存在 + var user = _db.Queryable().Where(u => u.Sjh == input.sjh).Any(); + if (user) + { + throw NCCException.Oh("该会员已存在"); + } var entity = input.Adapt(); entity.Id = YitIdHelper.NextId().ToString(); var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync(); @@ -243,6 +249,131 @@ namespace NCC.Extend.LqKhxx } #endregion + #region 获取线索池客户列表 + /// + /// 获取线索池客户列表 + /// + /// 查询参数 + /// 线索池客户列表 + [HttpGet("leads-pool")] + public async Task> GetLeadsPoolList([FromQuery] LqKhxxListQueryInput input) + { + var sidx = input.sidx == null ? "id" : input.sidx; + List queryZjdlsj = input.zjdlsj != null ? input.zjdlsj.Split(',').ToObeject>() : null; + DateTime? startZjdlsj = queryZjdlsj != null ? Ext.GetDateTime(queryZjdlsj.First()) : null; + DateTime? endZjdlsj = queryZjdlsj != null ? Ext.GetDateTime(queryZjdlsj.Last()) : null; + List queryZcsj = input.zcsj != null ? input.zcsj.Split(',').ToObeject>() : null; + DateTime? startZcsj = queryZcsj != null ? Ext.GetDateTime(queryZcsj.First()) : null; + DateTime? endZcsj = queryZcsj != null ? Ext.GetDateTime(queryZcsj.Last()) : null; + List queryYanglsr = input.yanglsr != null ? input.yanglsr.Split(',').ToObeject>() : null; + DateTime? startYanglsr = queryYanglsr != null ? Ext.GetDateTime(queryYanglsr.First()) : null; + DateTime? endYanglsr = queryYanglsr != null ? Ext.GetDateTime(queryYanglsr.Last()) : null; + List queryYinlsr = input.yinlsr != null ? input.yinlsr.Split(',').ToObeject>() : null; + DateTime? startYinlsr = queryYinlsr != null ? Ext.GetDateTime(queryYinlsr.First()) : null; + DateTime? endYinlsr = queryYinlsr != null ? Ext.GetDateTime(queryYinlsr.Last()) : null; + + var data = await _db.Queryable() + .Where(p => p.Khmqgs == "线索池") // 固定查询线索池客户 + .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id)) + .WhereIF(!string.IsNullOrEmpty(input.khmc), p => p.Khmc.Contains(input.khmc)) + .WhereIF(!string.IsNullOrEmpty(input.sjh), p => p.Sjh.Contains(input.sjh)) + .WhereIF(!string.IsNullOrEmpty(input.dah), p => p.Dah.Contains(input.dah)) + .WhereIF(!string.IsNullOrEmpty(input.xb), p => p.Xb.Equals(input.xb)) + .WhereIF(!string.IsNullOrEmpty(input.gzhzt), p => p.Gzhzt.Equals(input.gzhzt)) + .WhereIF(!string.IsNullOrEmpty(input.wxnc), p => p.Wxnc.Contains(input.wxnc)) + .WhereIF(!string.IsNullOrEmpty(input.wxxcxzt), p => p.Wxxcxzt.Equals(input.wxxcxzt)) + .WhereIF(!string.IsNullOrEmpty(input.khmqgs), p => p.Khmqgs.Equals(input.khmqgs)) + .WhereIF(!string.IsNullOrEmpty(input.gsmd), p => p.Gsmd.Contains(input.gsmd)) + .WhereIF(queryZcsj != null, p => p.Zcsj >= new DateTime(startZcsj.ToDate().Year, startZcsj.ToDate().Month, startZcsj.ToDate().Day, 0, 0, 0)) + .WhereIF(queryZcsj != null, p => p.Zcsj <= new DateTime(endZcsj.ToDate().Year, endZcsj.ToDate().Month, endZcsj.ToDate().Day, 23, 59, 59)) + .WhereIF(!string.IsNullOrEmpty(input.khlx), p => p.Khlx.Equals(input.khlx)) + .WhereIF(!string.IsNullOrEmpty(input.khjd), p => p.Khjd.Equals(input.khjd)) + .WhereIF(!string.IsNullOrEmpty(input.khxf), p => p.Khxf.Contains(input.khxf)) + .WhereIF(!string.IsNullOrEmpty(input.xfpc), p => p.Xfpc.Equals(input.xfpc)) + .WhereIF(!string.IsNullOrEmpty(input.tjr), p => p.Tjr.Contains(input.tjr)) + .WhereIF(!string.IsNullOrEmpty(input.fzgw), p => p.Fzgw.Contains(input.fzgw)) + .WhereIF(!string.IsNullOrEmpty(input.mrs), p => p.Mrs.Contains(input.mrs)) + .WhereIF(!string.IsNullOrEmpty(input.jdqd), p => p.Jdqd.Contains(input.jdqd)) + .WhereIF(!string.IsNullOrEmpty(input.lxdz), p => p.Lxdz.Contains(input.lxdz)) + .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz)) + .WhereIF(queryYanglsr != null, p => p.Yanglsr >= new DateTime(startYanglsr.ToDate().Year, startYanglsr.ToDate().Month, startYanglsr.ToDate().Day, 0, 0, 0)) + .WhereIF(queryYanglsr != null, p => p.Yanglsr <= new DateTime(endYanglsr.ToDate().Year, endYanglsr.ToDate().Month, endYanglsr.ToDate().Day, 23, 59, 59)) + .WhereIF(queryYinlsr != null, p => p.Yinlsr >= new DateTime(startYinlsr.ToDate().Year, startYinlsr.ToDate().Month, startYinlsr.ToDate().Day, 0, 0, 0)) + .WhereIF(queryYinlsr != null, p => p.Yinlsr <= new DateTime(endYinlsr.ToDate().Year, endYinlsr.ToDate().Month, endYinlsr.ToDate().Day, 23, 59, 59)) + .WhereIF(!string.IsNullOrEmpty(input.ml), p => p.Ml.Contains(input.ml)) + .Select(it => new LqKhxxListOutput + { + id = it.Id, + khmc = it.Khmc, + sjh = it.Sjh, + dah = it.Dah, + xb = it.Xb, + gzhzt = it.Gzhzt, + wxnc = it.Wxnc, + wxxcxzt = it.Wxxcxzt, + zjdlsj = it.Zjdlsj, + khmqgs = it.Khmqgs, + gsmd = it.Gsmd, + zcsj = it.Zcsj, + khlx = it.Khlx, + khjd = it.Khjd, + khxf = it.Khxf, + xfpc = it.Xfpc, + tjr = it.Tjr, + fzgw = it.Fzgw, + mrs = it.Mrs, + jdqd = it.Jdqd, + lxdz = it.Lxdz, + bz = it.Bz, + yanglsr = it.Yanglsr, + yinlsr = it.Yinlsr, + ml = it.Ml, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToPagedListAsync(input.currentPage, input.pageSize); + return PageResult.SqlSugarPageResult(data); + } + #endregion + + #region 获取客户订单类型 + /// + /// 获取客户订单类型(首单/升单) + /// + /// 客户ID + /// 客户订单类型信息 + [HttpGet("order-type/{customerId}")] + public async Task GetCustomerOrderType(string customerId) + { + if (string.IsNullOrEmpty(customerId)) + { + throw NCCException.Oh("客户ID不能为空"); + } + + // 查询客户是否存在 + var customerExists = await _db.Queryable().Where(c => c.Id == customerId).AnyAsync(); + + if (!customerExists) + { + throw NCCException.Oh("客户不存在"); + } + + // 查询开单记录数量 + var orderCount = await _db.Queryable().Where(o => o.Kdhy == customerId).CountAsync(); + + var hasOrderRecord = orderCount > 0; + var orderType = hasOrderRecord ? "repeat_order" : "first_order"; + + return new LqKhxxOrderTypeOutput + { + CustomerId = customerId, + OrderType = orderType, + HasOrderRecord = hasOrderRecord, + OrderCount = orderCount, + }; + } + #endregion + #region 导出客户资料 /// /// 导出客户资料 diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs index 677b6f4..2e75879 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs @@ -16,6 +16,8 @@ using NCC.DataEncryption; using NCC.Dependency; using NCC.DynamicApiController; using NCC.Extend.Entitys.Dto.LqTkjlb; +using NCC.Extend.Entitys.lq_eventuser; +using NCC.Extend.Entitys.lq_khxx; using NCC.Extend.Entitys.lq_ryzl; using NCC.Extend.Entitys.lq_tkjlb; using NCC.Extend.Interfaces.LqTkjlb; @@ -123,19 +125,41 @@ namespace NCC.Extend.LqTkjlb public async Task Create([FromBody] LqTkjlbCrInput input) { var userInfo = await _userManager.GetUserInfo(); - var entity = input.Adapt(); - entity.Id = YitIdHelper.NextId().ToString(); - string mobile = _db.Queryable().Where(u => u.Id == input.tkry).Select(u => u.MobilePhone).First(); - var ry = _db.Queryable().Where(u => u.Sjh == mobile).First(); - if (ry != null) + //通过input.dhhm去查询用户信息 + var user = _db.Queryable().Where(u => u.Sjh == input.dhhm).Any(); + if (user) { - entity.Ssmd = ry.Dm == null ? "" : ry.Dm; - entity.Sszd = ry.Zd == null ? "" : ry.Zd; + throw NCCException.Oh("该手机号码已存在于会员或线索池中"); } + // 使用事务确保数据一致性 + var result = await _db.Ado.UseTranAsync(async () => + { + //通过input.eventId去查询拓客活动信息 + var eventUserInfo = await _db.Queryable().Where(u => u.EventId == input.eventId && u.UserId == input.tkry).FirstAsync(); + // 创建拓客记录 + var entity = input.Adapt(); + entity.Id = YitIdHelper.NextId().ToString(); + entity.Sszd = eventUserInfo.TeamName; + var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync(); + if (!(isOk > 0)) + throw NCCException.Oh("创建拓客记录失败"); + // 创建客户信息 + LqKhxxEntity MemberInfo = new LqKhxxEntity(); + MemberInfo.Id = YitIdHelper.NextId().ToString(); + MemberInfo.Khmc = entity.Gkxm; + MemberInfo.Sjh = input.dhhm; // 设置手机号 + MemberInfo.Khmqgs = "线索池"; + MemberInfo.Dah = "GK" + DateTime.Now.ToString("yyyyMMddHHmmss"); + var memberResult = await _db.Insertable(MemberInfo).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync(); + if (!(memberResult > 0)) + throw NCCException.Oh("创建客户信息失败"); + return true; + }); - var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync(); - if (!(isOk > 0)) - throw NCCException.Oh(ErrorCode.COM1000); + if (!result.IsSuccess) + { + throw NCCException.Oh($"创建拓客记录失败:{result.ErrorMessage}"); + } } #endregion diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs index 9c1dd9e..132eb52 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs @@ -1,31 +1,31 @@ -using NCC.Common.Core.Manager; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Threading.Tasks; +using Mapster; +using Microsoft.AspNetCore.Mvc; +using NCC.ClayObject; +using NCC.Common.Configuration; +using NCC.Common.Core.Manager; using NCC.Common.Enum; using NCC.Common.Extension; using NCC.Common.Filter; +using NCC.Common.Helper; +using NCC.Common.Model.NPOI; +using NCC.DataEncryption; using NCC.Dependency; using NCC.DynamicApiController; -using NCC.FriendlyException; -using NCC.Extend.Interfaces.LqYcsdJsj; -using Mapster; -using Microsoft.AspNetCore.Mvc; -using SqlSugar; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Threading.Tasks; -using NCC.Extend.Entitys.lq_ycsd_jsj; +using NCC.Extend.Entitys.Dto.LqYcsdJsj; using NCC.Extend.Entitys.lq_jinsanjiao_user; -using NCC.Extend.Entitys.lq_mdxx; using NCC.Extend.Entitys.lq_kd_jksyj; -using NCC.Extend.Entitys.Dto.LqYcsdJsj; -using Yitter.IdGenerator; -using NCC.Common.Helper; +using NCC.Extend.Entitys.lq_mdxx; +using NCC.Extend.Entitys.lq_ycsd_jsj; +using NCC.Extend.Interfaces.LqYcsdJsj; +using NCC.FriendlyException; using NCC.JsonSerialization; -using NCC.Common.Model.NPOI; -using NCC.Common.Configuration; -using NCC.DataEncryption; -using NCC.ClayObject; +using SqlSugar; +using Yitter.IdGenerator; namespace NCC.Extend.LqYcsdJsj { @@ -43,7 +43,7 @@ namespace NCC.Extend.LqYcsdJsj /// /// 初始化一个类型的新实例 /// - public LqYcsdJsjService(ISqlSugarRepository lqYcsdJsjRepository,IUserManager userManager) + public LqYcsdJsjService(ISqlSugarRepository lqYcsdJsjRepository, IUserManager userManager) { _lqYcsdJsjRepository = lqYcsdJsjRepository; _db = _lqYcsdJsjRepository.Context; @@ -75,7 +75,8 @@ namespace NCC.Extend.LqYcsdJsj public async Task GetDetail(string id) { var entity = await _db.Queryable().FirstAsync(p => p.Id == id); - if (entity == null) throw NCCException.Oh(ErrorCode.COM1005); + if (entity == null) + throw NCCException.Oh(ErrorCode.COM1005); var output = entity.Adapt(); @@ -90,24 +91,20 @@ namespace NCC.Extend.LqYcsdJsj userName = x.UserName, isLeader = x.IsLeader, sortOrder = x.SortOrder, - status = x.Status + status = x.Status, }) .ToListAsync(); - return new - { - jsj = output, - members = members - }; + return new { jsj = output, members = members }; } #endregion #region 获取金三角设定列表 /// - /// 获取金三角设定列表 - /// - /// 请求参数 - /// + /// 获取金三角设定列表 + /// + /// 请求参数 + /// [HttpGet("")] public async Task GetList([FromQuery] LqYcsdJsjListQueryInput input) { @@ -122,8 +119,11 @@ namespace NCC.Extend.LqYcsdJsj id = it.Id, yf = it.Yf, md = it.Md, - jsj = it.Jsj - }).MergeTable().OrderBy(sidx + " " + input.sort).ToPagedListAsync(input.currentPage, input.pageSize); + jsj = it.Jsj, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToPagedListAsync(input.currentPage, input.pageSize); return PageResult.SqlSugarPageResult(data); } #endregion @@ -143,8 +143,10 @@ namespace NCC.Extend.LqYcsdJsj id = it.Id, yf = it.Yf, md = it.Md, - jsj = it.Jsj - }).MergeTable().ToListAsync(); + jsj = it.Jsj, + }) + .MergeTable() + .ToListAsync(); return data; } #endregion @@ -168,15 +170,15 @@ namespace NCC.Extend.LqYcsdJsj if (jsjUser == null) { return null; - } + } // 查询金三角信息 - var jsj = await _db.Queryable().Where(x => x.Id == jsjUser.JsjId && x.Yf == currentMonth).FirstAsync(); + var jsj = await _db.Queryable().Where(x => x.Id == jsjUser.JsjId && x.Yf == currentMonth).FirstAsync(); if (jsj == null) { return null; } // 查询门店信息 - var store = await _db.Queryable() .Where(x => x.Id == jsj.Md).FirstAsync(); + var store = await _db.Queryable().Where(x => x.Id == jsj.Md).FirstAsync(); return new { jsjId = jsj.Id, @@ -187,7 +189,7 @@ namespace NCC.Extend.LqYcsdJsj userName = jsjUser.UserName, isLeader = jsjUser.IsLeader, status = jsjUser.Status, - sortOrder = jsjUser.SortOrder + sortOrder = jsjUser.SortOrder, }; } #endregion @@ -228,9 +230,7 @@ namespace NCC.Extend.LqYcsdJsj } // 验证金三角名称是否已存在 - var existingJsj = await _db.Queryable() - .Where(x => x.Yf == input.yf && x.Md == input.md && x.Jsj == input.jsj) - .FirstAsync(); + var existingJsj = await _db.Queryable().Where(x => x.Yf == input.yf && x.Md == input.md && x.Jsj == input.jsj).FirstAsync(); if (existingJsj != null) { throw NCCException.Oh(ErrorCode.COM1000, "该门店该月份已存在同名金三角"); @@ -239,19 +239,18 @@ namespace NCC.Extend.LqYcsdJsj { // 开启事务 _db.BeginTran(); - // 1. 创建门店T区(如果不存在) - await CreateOrUpdateStoreTArea(input.yf, input.md, userInfo.userId); - // 2. 创建金三角基础信息 + // 1. 创建金三角基础信息 var entity = input.Adapt(); entity.Id = YitIdHelper.NextId().ToString(); var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync(); - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000); - // 3. 创建金三角成员绑定关系 + if (!(isOk > 0)) + throw NCCException.Oh(ErrorCode.COM1000); + // 2 创建金三角成员绑定关系 if (input.members != null && input.members.Count > 0) { await CreateJsjMembers(entity.Id, input.members, userInfo.userId); } - // 4. 创建站点战队T区(如果金三角不是T区且不是单人) + // 3. 创建站点战队T区(如果金三角不是T区且不是单人) if (!input.jsj.EndsWith("T区") && input.members != null && input.members.Count > 1) { await CreateOrUpdateTeamTArea(input.yf, input.jsj, input.md, userInfo.userId); @@ -270,10 +269,10 @@ namespace NCC.Extend.LqYcsdJsj #region 获取金三角设定无分页列表 /// - /// 获取金三角设定无分页列表 - /// - /// 请求参数 - /// + /// 获取金三角设定无分页列表 + /// + /// 请求参数 + /// [NonAction] public async Task GetNoPagingList([FromQuery] LqYcsdJsjListQueryInput input) { @@ -288,18 +287,21 @@ namespace NCC.Extend.LqYcsdJsj id = it.Id, yf = it.Yf, md = it.Md, - jsj = it.Jsj - }).MergeTable().OrderBy(sidx + " " + input.sort).ToListAsync(); + jsj = it.Jsj, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToListAsync(); return data; } #endregion #region 导出金三角设定 /// - /// 导出金三角设定 - /// - /// 请求参数 - /// + /// 导出金三角设定 + /// + /// 请求参数 + /// [HttpGet("Actions/Export")] public async Task Export([FromQuery] LqYcsdJsjListQueryInput input) { @@ -314,7 +316,8 @@ namespace NCC.Extend.LqYcsdJsj { exportData = await this.GetNoPagingList(input); } - List paramList = "[{\"value\":\"主键\",\"field\":\"id\"},{\"value\":\"月份\",\"field\":\"yf\"},{\"value\":\"门店\",\"field\":\"md\"},{\"value\":\"金三角\",\"field\":\"jsj\"}]".ToList(); + List paramList = + "[{\"value\":\"主键\",\"field\":\"id\"},{\"value\":\"月份\",\"field\":\"yf\"},{\"value\":\"门店\",\"field\":\"md\"},{\"value\":\"金三角\",\"field\":\"jsj\"}]".ToList(); ExcelConfig excelconfig = new ExcelConfig(); excelconfig.FileName = "金三角设定.xls"; excelconfig.HeadFont = "微软雅黑"; @@ -333,11 +336,7 @@ namespace NCC.Extend.LqYcsdJsj var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName; ExcelExportHelper.Export(exportData, excelconfig, addPath); var fileName = _userManager.UserId + "|" + addPath + "|xls"; - var output = new - { - name = excelconfig.FileName, - url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") - }; + var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") }; return output; } #endregion @@ -385,10 +384,11 @@ namespace NCC.Extend.LqYcsdJsj { var entity = input.Adapt(); var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001); + if (!(isOk > 0)) + throw NCCException.Oh(ErrorCode.COM1001); } #endregion - + #region 删除金三角设定 /// /// 删除金三角设定 @@ -400,7 +400,8 @@ namespace NCC.Extend.LqYcsdJsj var entity = await _db.Queryable().FirstAsync(p => p.Id == id); _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005); var isOk = await _db.Deleteable().Where(d => d.Id == id).ExecuteCommandAsync(); - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002); + if (!(isOk > 0)) + throw NCCException.Oh(ErrorCode.COM1002); } #endregion @@ -424,20 +425,33 @@ namespace NCC.Extend.LqYcsdJsj .WhereIF(!string.IsNullOrEmpty(month), (jsj, jksyj, md) => jsj.Yf == month) .WhereIF(!string.IsNullOrEmpty(jsjId), (jsj, jksyj, md) => jsj.Id == jsjId) .WhereIF(!string.IsNullOrEmpty(storeId), (jsj, jksyj, md) => jsj.Md == storeId) - .GroupBy((jsj, jksyj, md) => new { jsj.Id, jsj.Jsj, jsj.Yf, jsj.Md, md.Dm }) - .Select((jsj, jksyj, md) => new - { - jsjId = jsj.Id, - jsjName = jsj.Jsj, - month = jsj.Yf, - storeId = jsj.Md, - storeName = md.Dm, - totalPerformance = SqlFunc.AggregateSum(SqlFunc.ToDecimal(jksyj.Jksyj)), - orderCount = SqlFunc.AggregateCount(jksyj.Id), - avgPerformance = SqlFunc.AggregateAvg(SqlFunc.ToDecimal(jksyj.Jksyj)), - lastOrderDate = SqlFunc.AggregateMax(jksyj.Yjsj), - firstOrderDate = SqlFunc.AggregateMin(jksyj.Yjsj) - }) + .GroupBy( + (jsj, jksyj, md) => + new + { + jsj.Id, + jsj.Jsj, + jsj.Yf, + jsj.Md, + md.Dm, + } + ) + .Select( + (jsj, jksyj, md) => + new + { + jsjId = jsj.Id, + jsjName = jsj.Jsj, + month = jsj.Yf, + storeId = jsj.Md, + storeName = md.Dm, + totalPerformance = SqlFunc.AggregateSum(SqlFunc.ToDecimal(jksyj.Jksyj)), + orderCount = SqlFunc.AggregateCount(jksyj.Id), + avgPerformance = SqlFunc.AggregateAvg(SqlFunc.ToDecimal(jksyj.Jksyj)), + lastOrderDate = SqlFunc.AggregateMax(jksyj.Yjsj), + firstOrderDate = SqlFunc.AggregateMin(jksyj.Yjsj), + } + ) .OrderBy(jsj => jsj.month, OrderByType.Desc) .OrderBy(jsj => jsj.totalPerformance, OrderByType.Desc); @@ -465,35 +479,53 @@ namespace NCC.Extend.LqYcsdJsj .Where((jsj, jksyj, md) => jsj.Yf == month) .Where((jsj, jksyj, md) => jksyj.Yjsj != null) .Where((jsj, jksyj, md) => jksyj.Jksyj != null && jksyj.Jksyj != "" && jksyj.Jksyj != "0") - .GroupBy((jsj, jksyj, md) => new { jsj.Id, jsj.Jsj, jsj.Yf, jsj.Md, md.Dm }) - .Select((jsj, jksyj, md) => new - { - jsjId = jsj.Id, - jsjName = jsj.Jsj, - month = jsj.Yf, - storeId = jsj.Md, - storeName = md.Dm, - totalPerformance = SqlFunc.AggregateSum(SqlFunc.ToDecimal(jksyj.Jksyj)), - orderCount = SqlFunc.AggregateCount(jksyj.Id), - ranking = 0 // 排名将在后续计算 - }) + .GroupBy( + (jsj, jksyj, md) => + new + { + jsj.Id, + jsj.Jsj, + jsj.Yf, + jsj.Md, + md.Dm, + } + ) + .Select( + (jsj, jksyj, md) => + new + { + jsjId = jsj.Id, + jsjName = jsj.Jsj, + month = jsj.Yf, + storeId = jsj.Md, + storeName = md.Dm, + totalPerformance = SqlFunc.AggregateSum(SqlFunc.ToDecimal(jksyj.Jksyj)), + orderCount = SqlFunc.AggregateCount(jksyj.Id), + ranking = 0, // 排名将在后续计算 + } + ) .OrderBy(jsj => jsj.totalPerformance, OrderByType.Desc) .Take(topCount); var result = await query.ToListAsync(); - + // 创建包含排名的结果 - var rankedResult = result.Select((item, index) => new - { - item.jsjId, - item.jsjName, - item.month, - item.storeId, - item.storeName, - item.totalPerformance, - item.orderCount, - ranking = index + 1 - }).ToList(); + var rankedResult = result + .Select( + (item, index) => + new + { + item.jsjId, + item.jsjName, + item.month, + item.storeId, + item.storeName, + item.totalPerformance, + item.orderCount, + ranking = index + 1, + } + ) + .ToList(); return rankedResult; } @@ -515,9 +547,7 @@ namespace NCC.Extend.LqYcsdJsj var tAreaName = $"{storeName}T区"; // 检查该门店该月份是否已有T区 - var existingTArea = await _db.Queryable() - .Where(x => x.Yf == yf && x.Md == mdId && x.Jsj == tAreaName) - .FirstAsync(); + var existingTArea = await _db.Queryable().Where(x => x.Yf == yf && x.Md == mdId && x.Jsj == tAreaName).FirstAsync(); if (existingTArea == null) { @@ -527,7 +557,7 @@ namespace NCC.Extend.LqYcsdJsj Id = YitIdHelper.NextId().ToString(), Yf = yf, Md = mdId, - Jsj = tAreaName + Jsj = tAreaName, }; await _db.Insertable(tAreaEntity).ExecuteCommandAsync(); @@ -547,9 +577,7 @@ namespace NCC.Extend.LqYcsdJsj var tAreaName = $"{teamName}T区"; // 检查该战队该月份是否已有T区 - var existingTArea = await _db.Queryable() - .Where(x => x.Yf == yf && x.Md == mdId && x.Jsj == tAreaName) - .FirstAsync(); + var existingTArea = await _db.Queryable().Where(x => x.Yf == yf && x.Md == mdId && x.Jsj == tAreaName).FirstAsync(); if (existingTArea == null) { @@ -559,7 +587,7 @@ namespace NCC.Extend.LqYcsdJsj Id = YitIdHelper.NextId().ToString(), Yf = yf, Md = mdId, - Jsj = tAreaName + Jsj = tAreaName, }; await _db.Insertable(tAreaEntity).ExecuteCommandAsync(); @@ -592,7 +620,7 @@ namespace NCC.Extend.LqYcsdJsj CreatorTime = DateTime.Now, CreatorUserId = creatorUserId, DeleteMark = 0, - Month = DateTime.Now.ToString("yyyyMM") + Month = DateTime.Now.ToString("yyyyMM"), }; memberEntities.Add(memberEntity); @@ -613,10 +641,7 @@ namespace NCC.Extend.LqYcsdJsj { try { - var storeName = await _db.Queryable() - .Where(x => x.Id == mdId) - .Select(x => x.Dm) - .FirstAsync(); + var storeName = await _db.Queryable().Where(x => x.Id == mdId).Select(x => x.Dm).FirstAsync(); return string.IsNullOrEmpty(storeName) ? "未知门店" : storeName; } catch