diff --git a/antis-ncc-admin/.env.development b/antis-ncc-admin/.env.development index 50e2ca9..2f8e237 100644 --- a/antis-ncc-admin/.env.development +++ b/antis-ncc-admin/.env.development @@ -1,6 +1,6 @@ # 开发 VUE_CLI_BABEL_TRANSPILE_MODULES = true -VUE_APP_BASE_API = 'http://lvqian.antissoft.com' -# VUE_APP_BASE_API = 'http://localhost:2011' +# VUE_APP_BASE_API = 'http://lvqian.antissoft.com' +VUE_APP_BASE_API = 'http://localhost:2011' VUE_APP_BASE_WSS = 'ws://192.168.110.45:2011/websocket' diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs index 894963b..355f67c 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs @@ -34,6 +34,7 @@ namespace NCC.Extend.Entitys.Dto.LqEvent /// public string eventCoordinator { get; set; } + /// /// 活动编号 /// diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListOutput.cs index c924279..06807d6 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListOutput.cs @@ -32,6 +32,12 @@ namespace NCC.Extend.Entitys.Dto.LqEvent /// public string eventCoordinator { get; set; } + + /// + /// 活动负责人姓名 + /// + public string eventCoordinatorName { get; set; } + /// /// 活动编号 /// diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxCrInput.cs index 5a3e6d2..913412e 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxCrInput.cs @@ -32,28 +32,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx /// 性别 /// public string xb { get; set; } - - /// - /// 公众号状态 - /// - public string gzhzt { get; set; } - - /// - /// 微信昵称 - /// - public string wxnc { get; set; } - - /// - /// 微信小程序状态 - /// - public string wxxcxzt { get; set; } - - /// - /// 最近登录时间 - /// - public string zjdlsj { get; set; } - - /// /// 归属门店 /// @@ -90,16 +68,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx public string tjr { get; set; } /// - /// 负责顾问 - /// - public string fzgw { get; set; } - - /// - /// 美容师 - /// - public string mrs { get; set; } - - /// /// 进店渠道 /// public string jdqd { get; set; } @@ -124,9 +92,20 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx /// public DateTime? yinlsr { get; set; } + + /// + /// 拓客人员 + /// + public string expandUser { get; set; } + + /// + /// 主健康师 + /// + public string mainHealthUser { get; set; } + /// - /// 年龄 + /// 副健康师 /// - public string ml { get; set; } + public string subHealthUser { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxInfoOutput.cs index 4776a96..821309e 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxInfoOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxInfoOutput.cs @@ -33,26 +33,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx /// public string xb { get; set; } - /// - /// 公众号状态 - /// - public string gzhzt { get; set; } - - /// - /// 微信昵称 - /// - public string wxnc { get; set; } - - /// - /// 微信小程序状态 - /// - public string wxxcxzt { get; set; } - - /// - /// 最近登录时间 - /// - public DateTime? zjdlsj { get; set; } - /// /// 归属门店 @@ -90,14 +70,10 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx public string tjr { get; set; } /// - /// 负责顾问 + /// 推荐人名称 /// - public string fzgw { get; set; } + public string tjrName { get; set; } - /// - /// 美容师 - /// - public string mrs { get; set; } /// /// 进店渠道 @@ -125,13 +101,40 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx public DateTime? yinlsr { get; set; } /// - /// 年龄 + /// 添加时间 /// - public string ml { get; set; } + public string createTime { get; set; } /// - /// 添加时间 + /// 拓客人员 /// - public string createTime { get; set; } + public string expandUser { get; set; } + + /// + /// 拓客人员名称 + /// + public string expandUserName { get; set; } + + /// + /// 主健康师 + /// + public string mainHealthUser { get; set; } + + /// + /// 主健康师名称 + /// + public string mainHealthUserName { get; set; } + + /// + /// 副健康师 + /// + public string subHealthUser { get; set; } + + /// + /// 副健康师名称 + /// + public string subHealthUserName { get; set; } + + } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListOutput.cs index 8906310..1991964 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListOutput.cs @@ -35,26 +35,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx public string xb { get; set; } /// - /// 公众号状态 - /// - public string gzhzt { get; set; } - - /// - /// 微信昵称 - /// - public string wxnc { get; set; } - - /// - /// 微信小程序状态 - /// - public string wxxcxzt { get; set; } - - /// - /// 最近登录时间 - /// - public DateTime? zjdlsj { get; set; } - - /// /// 归属门店 /// public string gsmd { get; set; } @@ -111,19 +91,11 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx public string tjr { get; set; } /// - /// 负责顾问 + /// 推荐人名称 /// - public string fzgw { get; set; } + public string tjrName { get; set; } - /// - /// 美容师 - /// - public string mrs { get; set; } - /// - /// 美容师名称 - /// - public string mrsName { get; set; } /// /// 进店渠道 @@ -159,5 +131,35 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx /// 添加时间 /// public DateTime createTime { get; set; } + + /// + /// 拓客人员 + /// + public string expandUser { get; set; } + + /// + /// 拓客人员名称 + /// + public string expandUserName { get; set; } + + /// + /// 主健康师 + /// + public string mainHealthUser { get; set; } + + /// + /// 主健康师名称 + /// + public string mainHealthUserName { get; set; } + + /// + /// 副健康师 + /// + public string subHealthUser { get; set; } + + /// + /// 副健康师名称 + /// + public string subHealthUserName { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs index 1f97e27..a79029e 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs @@ -48,20 +48,7 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx /// public string xb { get; set; } - /// - /// 公众号状态 - /// - public string gzhzt { get; set; } - - /// - /// 微信昵称 - /// - public string wxnc { get; set; } - /// - /// 微信小程序状态 - /// - public string wxxcxzt { get; set; } /// /// 归属门店 @@ -98,15 +85,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx /// public string tjr { get; set; } - /// - /// 负责顾问 - /// - public string fzgw { get; set; } - - /// - /// 美容师 - /// - public string mrs { get; set; } /// /// 进店渠道 @@ -132,10 +110,5 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx /// 阴历生日 /// public string yinlsr { get; set; } - - /// - /// 年龄 - /// - public string ml { 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 cd4b4c9..b6427f1 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 @@ -42,30 +42,6 @@ namespace NCC.Extend.Entitys.lq_khxx public string Xb { get; set; } /// - /// 公众号状态 - /// - [SugarColumn(ColumnName = "gzhzt")] - public string Gzhzt { get; set; } - - /// - /// 微信昵称 - /// - [SugarColumn(ColumnName = "wxnc")] - public string Wxnc { get; set; } - - /// - /// 微信小程序状态 - /// - [SugarColumn(ColumnName = "wxxcxzt")] - public string Wxxcxzt { get; set; } - - /// - /// 最近登录时间 - /// - [SugarColumn(ColumnName = "zjdlsj")] - public DateTime? Zjdlsj { get; set; } - - /// /// 归属门店 /// [SugarColumn(ColumnName = "gsmd")] @@ -107,17 +83,6 @@ namespace NCC.Extend.Entitys.lq_khxx [SugarColumn(ColumnName = "tjr")] public string Tjr { get; set; } - /// - /// 负责顾问 - /// - [SugarColumn(ColumnName = "fzgw")] - public string Fzgw { get; set; } - - /// - /// 美容师 - /// - [SugarColumn(ColumnName = "mrs")] - public string Mrs { get; set; } /// /// 进店渠道 @@ -150,15 +115,30 @@ namespace NCC.Extend.Entitys.lq_khxx public DateTime? Yinlsr { get; set; } /// - /// 年龄 - /// - [SugarColumn(ColumnName = "ml")] - public string Ml { get; set; } - - /// /// 添加时间 /// [SugarColumn(ColumnName = "F_CreateTime")] public DateTime CreateTime { get; set; } = DateTime.Now; + + + /// + /// 拓客人员 + /// + [SugarColumn(ColumnName = "F_ExpandUser")] + public string ExpandUser { get; set; } + + + /// + /// 主健康师 + /// + [SugarColumn(ColumnName = "F_MainHealthUser")] + public string MainHealthUser { get; set; } + + /// + /// 副健康师 + /// + [SugarColumn(ColumnName = "F_SubHealthUser")] + public string SubHealthUser { get; set; } + } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs index 080fbad..78364c4 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs @@ -99,6 +99,7 @@ namespace NCC.Extend.LqEvent eventNumber = e.EventNumber, memberCount = SqlFunc.Subqueryable().Where(u => u.EventId == e.Id).Count(), eventType = e.EventType, + eventCoordinatorName = SqlFunc.Subqueryable().Where(u => u.Id == e.EventCoordinator).Select(u => u.RealName), }) .MergeTable() .OrderBy(sidx + " " + sord) diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs index e8a6067..4433755 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs @@ -176,7 +176,7 @@ namespace NCC.Extend.LqKdKdjlb [HttpGet("")] public async Task GetList([FromQuery] LqKdKdjlbListQueryInput input) { - var sidx = input.sidx == null ? "id" : input.sidx; + var sidx = input.sidx == null ? "kdrq" : input.sidx; List queryKdrq = input.kdrq != null ? input.kdrq.Split(',').ToObeject>() : null; DateTime? startKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.First()) : null; DateTime? endKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.Last()) : null; @@ -1077,6 +1077,152 @@ namespace NCC.Extend.LqKdKdjlb } #endregion + #region 历史会员权益数据导入 + /// + /// 导入历史会员权益数据到开单记录表和开单品项明细表 + /// + /// + /// 将历史会员权益表的数据导入到开单记录表和开单品项明细表中 + /// + /// 导入规则: + /// 1. 逐条处理历史会员权益数据,每条记录生成一个开单记录和一个品项明细 + /// 2. 开单时间和创建时间统一设置为 2025-06-01 00:00:00 + /// 3. 使用YitIdHelper生成所有ID + /// 4. 直接使用F_StoreId作为门店ID + /// + /// 字段映射: + /// - F_MemberId/会员编号 -> kdhy (开单会员,优先使用会员ID) + /// - 会员名称 -> kdhyc (开单会员名称) + /// - 会员电话 -> kdhysjh (开单会员手机号) + /// - F_StoreId -> djmd (单据门店ID) + /// - 整单业绩 -> zdyj (整单业绩) + /// - 实付业绩 -> sfyj (实付业绩) + /// - 欠款 -> qk (欠款) + /// - 来源 -> khly (客户来源) + /// - 品项名称 -> pxmc (品项名称) + /// - 品项价格 -> pxjg (品项价格) + /// - 品项次数 -> F_ProjectNumber (项目次数) + /// - F_MemberId/会员编号 -> F_MemberId (品项明细会员ID,优先使用会员ID) + /// + /// 导入结果统计 + /// 导入成功 + /// 服务器内部错误 + [HttpPost("import-history-member-rights")] + public async Task ImportHistoryMemberRights() + { + try + { + _db.BeginTran(); + + // 设置固定的时间 + var fixedDateTime = new DateTime(2025, 6, 1, 0, 0, 0); + + // 1. 查询历史会员权益数据 + var historyData = await _db.Ado.SqlQueryAsync(@" + SELECT + 会员编号, + 会员名称, + 会员电话, + 开单门店, + 开单时间, + 整单业绩, + 实付业绩, + 欠款, + 来源, + 品项名称, + 品项价格, + 品项次数, + F_StoreId, + F_ProjectId, + F_MemberId + FROM `历史会员权益`"); + + int successCount = 0; + int errorCount = 0; + var errorMessages = new List(); + + // 2. 逐条处理历史会员权益数据 + foreach (var item in historyData) + { + try + { + // 3. 生成开单记录ID + string kdjlbId = YitIdHelper.NextId().ToString(); + + // 4. 创建开单记录 + var kdjlbEntity = new LqKdKdjlbEntity + { + Id = kdjlbId, + Djmd = item.F_StoreId, // 直接使用F_StoreId + Kdhy = item.F_MemberId, + Kdhyc = item.会员名称, + Jsj = "暂无", + Kdhysjh = item.会员电话, + Kdrq = fixedDateTime, + Zdyj = Convert.ToDecimal(item.整单业绩 ?? 0), + Sfyj = Convert.ToDecimal(item.实付业绩 ?? 0), + Qk = Convert.ToDecimal(item.欠款 ?? 0), + CreateTime = fixedDateTime, + UpdateTime = fixedDateTime, + Sfskdd = "否", + IsEffective = 1, + Bz = "导入历史会员权益数据" + }; + + await _db.Insertable(kdjlbEntity).ExecuteCommandAsync(); + + // 5. 创建品项明细 + string pxmxId = YitIdHelper.NextId().ToString(); + + var pxmxEntity = new LqKdPxmxEntity + { + Id = pxmxId, + Glkdbh = kdjlbId, + Px = item.F_ProjectId, + Pxmc = item.品项名称, + Pxjg = Convert.ToDecimal(item.品项价格 ?? 0), + ProjectNumber = Convert.ToDecimal(item.品项次数 ?? 0), + SourceType = item.来源, + MemberId = item.F_MemberId, + Yjsj = fixedDateTime, + CreateTIme = fixedDateTime, + IsEffective = 1, + IsEnabled = 0, + TotalPrice = Convert.ToDecimal(item.品项价格 ?? 0) * Convert.ToDecimal(item.品项次数 ?? 0), + ActualPrice = Convert.ToDecimal(item.品项价格 ?? 0) * Convert.ToDecimal(item.品项次数 ?? 0) + }; + + await _db.Insertable(pxmxEntity).ExecuteCommandAsync(); + + successCount++; + } + catch (Exception ex) + { + errorCount++; + errorMessages.Add($"处理记录 {item.会员编号}-{item.品项名称} 时出错: {ex.Message}"); + } + } + + _db.CommitTran(); + + return new + { + success = true, + message = "历史会员权益数据导入完成", + totalRecords = historyData.Count, + successCount = successCount, + errorCount = errorCount, + errorMessages = errorMessages.Take(10).ToList(), // 只返回前10个错误信息 + importTime = DateTime.Now + }; + } + catch (Exception ex) when (!(ex is NCCException)) + { + _db.RollbackTran(); + throw NCCException.Oh($"导入历史会员权益数据失败: {ex.Message}"); + } + } + #endregion } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs index 74b3f10..a16c2fe 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs @@ -71,6 +71,28 @@ namespace NCC.Extend.LqKhxx { var entity = await _db.Queryable().FirstAsync(p => p.Id == id); var output = entity.Adapt(); + if (!string.IsNullOrEmpty(entity.ExpandUser)) + { + var expandUser = await _db.Queryable().Where(u => u.Id == entity.ExpandUser).FirstAsync(); + output.expandUserName = expandUser?.RealName ?? ""; + } + + if (!string.IsNullOrEmpty(entity.MainHealthUser)) + { + var mainHealthUser = await _db.Queryable().Where(u => u.Id == entity.MainHealthUser).FirstAsync(); + output.mainHealthUserName = mainHealthUser?.RealName ?? ""; + } + + if (!string.IsNullOrEmpty(entity.SubHealthUser)) + { + var subHealthUser = await _db.Queryable().Where(u => u.Id == entity.SubHealthUser).FirstAsync(); + output.subHealthUserName = subHealthUser?.RealName ?? ""; + } + if (!string.IsNullOrEmpty(entity.Tjr)) + { + var tjr = await _db.Queryable().Where(u => u.Id == entity.Tjr).FirstAsync(); + output.tjrName = tjr?.RealName ?? ""; + } return output; } #endregion @@ -92,21 +114,15 @@ namespace NCC.Extend.LqKhxx .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.gsmd), p => p.Gsmd.Contains(input.gsmd)) .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(!string.IsNullOrEmpty(input.ml), p => p.Ml.Contains(input.ml)) .Select(it => new LqKhxxListOutput { id = it.Id, @@ -114,9 +130,6 @@ namespace NCC.Extend.LqKhxx sjh = it.Sjh, dah = it.Dah, xb = it.Xb, - gzhzt = it.Gzhzt, - wxnc = it.Wxnc, - wxxcxzt = it.Wxxcxzt, gsmd = it.Gsmd, gsmdName = SqlFunc.Subqueryable().Where(u => u.Id == it.Gsmd).Select(u => u.Dm), zcsj = it.Zcsj, @@ -125,16 +138,19 @@ namespace NCC.Extend.LqKhxx khxf = it.Khxf, xfpc = it.Xfpc, tjr = it.Tjr, - fzgw = it.Fzgw, - mrs = it.Mrs, - mrsName = SqlFunc.Subqueryable().Where(u => u.Id == it.Mrs).Select(u => u.RealName), jdqd = it.Jdqd, lxdz = it.Lxdz, bz = it.Bz, yanglsr = it.Yanglsr, yinlsr = it.Yinlsr, - ml = it.Ml, createTime = it.CreateTime, + expandUser = it.ExpandUser, + mainHealthUser = it.MainHealthUser, + subHealthUser = it.SubHealthUser, + expandUserName = SqlFunc.Subqueryable().Where(u => u.Id == it.ExpandUser).Select(u => u.RealName), + mainHealthUserName = SqlFunc.Subqueryable().Where(u => u.Id == it.MainHealthUser).Select(u => u.RealName), + subHealthUserName = SqlFunc.Subqueryable().Where(u => u.Id == it.SubHealthUser).Select(u => u.RealName), + tjrName = SqlFunc.Subqueryable().Where(u => u.Id == it.Tjr).Select(u => u.Khmc), }) .MergeTable() .OrderBy(sidx + " " + input.sort) @@ -198,9 +214,6 @@ namespace NCC.Extend.LqKhxx .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.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)) @@ -209,8 +222,6 @@ namespace NCC.Extend.LqKhxx .WhereIF(!string.IsNullOrEmpty(input.khxf), p => p.Khxf.Equals(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)) @@ -218,7 +229,6 @@ namespace NCC.Extend.LqKhxx .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, @@ -226,10 +236,6 @@ namespace NCC.Extend.LqKhxx sjh = it.Sjh, dah = it.Dah, xb = it.Xb, - gzhzt = it.Gzhzt, - wxnc = it.Wxnc, - wxxcxzt = it.Wxxcxzt, - zjdlsj = it.Zjdlsj, gsmd = it.Gsmd, zcsj = it.Zcsj, khlx = it.Khlx, @@ -237,14 +243,11 @@ namespace NCC.Extend.LqKhxx 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, createTime = it.CreateTime, }) .MergeTable() @@ -281,9 +284,6 @@ namespace NCC.Extend.LqKhxx .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.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)) @@ -292,8 +292,6 @@ namespace NCC.Extend.LqKhxx .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)) @@ -301,7 +299,6 @@ namespace NCC.Extend.LqKhxx .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, @@ -309,10 +306,6 @@ namespace NCC.Extend.LqKhxx sjh = it.Sjh, dah = it.Dah, xb = it.Xb, - gzhzt = it.Gzhzt, - wxnc = it.Wxnc, - wxxcxzt = it.Wxxcxzt, - zjdlsj = it.Zjdlsj, gsmd = it.Gsmd, zcsj = it.Zcsj, khlx = it.Khlx, @@ -320,15 +313,15 @@ namespace NCC.Extend.LqKhxx 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, createTime = it.CreateTime, + expandUser = it.ExpandUser, + mainHealthUser = it.MainHealthUser, + subHealthUser = it.SubHealthUser, }) .MergeTable() .OrderBy(sidx + " " + input.sort) @@ -637,5 +630,133 @@ namespace NCC.Extend.LqKhxx } #endregion + #region 导入客户信息 + /// + /// 从"清理跨店的重复"表导入客户信息 + /// + /// + /// 将"清理跨店的重复"表中的数据导入到客户表中,客户类型设置为"潜客" + /// + /// 导入规则: + /// 1. 根据客户电话去重,避免重复导入 + /// 2. 客户类型统一设置为"潜客" + /// 3. 使用YitIdHelper生成客户ID + /// 4. 根据门店ID设置归属门店 + /// 5. 根据拓客员工设置拓客人员 + /// + /// 字段映射: + /// - 客户姓名 -> khmc (客户名称) + /// - 客户电话 -> sjh (手机号) + /// - F_StoreId -> gsmd (归属门店) + /// - 拓客员工 -> F_ExpandUser (拓客人员) + /// - 日期 -> zcsj (注册时间) + /// + /// 导入结果 + /// 导入成功 + /// 服务器内部错误 + [HttpPost("import-customers-from-cleanup")] + public async Task ImportCustomersFromCleanup() + { + try + { + _db.BeginTran(); + + // 1. 查询"清理跨店的重复"表数据,按客户电话去重 + var cleanupData = await _db.Ado.SqlQueryAsync(@" + SELECT + F_Id, + 客户姓名, + 客户电话, + 归属门店, + 拓客员工, + 日期, + F_StoreId, + F_UserId + FROM `清理跨店的重复` + WHERE 客户电话 IS NOT NULL + AND 客户电话 != '' + AND 客户姓名 IS NOT NULL + AND 客户姓名 != '' + GROUP BY 客户电话 + ORDER BY 日期 DESC"); + + int successCount = 0; + int skipCount = 0; + int errorCount = 0; + var errorMessages = new List(); + + foreach (var item in cleanupData) + { + try + { + // 2. 检查客户是否已存在(根据手机号) + string phoneNumber = (string)item.客户电话; + var existingCustomer = await _db.Queryable() + .Where(x => x.Sjh == phoneNumber) + .FirstAsync(); + + if (existingCustomer != null) + { + skipCount++; + continue; + } + + // 3. 生成客户ID + string customerId = YitIdHelper.NextId().ToString(); + + // 4. 创建客户实体 + var customerEntity = new LqKhxxEntity + { + Id = customerId, + Khmc = (string)item.客户姓名, + Sjh = (string)item.客户电话, + Dah = $"GK{DateTime.Now:yyyyMMdd}{customerId.Substring(customerId.Length - 6)}", // 生成档案号 + Xb = "未知", // 默认性别 + Gsmd = (string)item.F_StoreId, // 使用门店ID + Zcsj = DateTime.TryParse((string)item.日期, out DateTime regDate) ? regDate : DateTime.Now, + Khlx = MemberTypeEnum.线索.GetHashCode().ToString(), // 客户类型设置为潜客 + Jdqd = "", // 进店渠道 + Lxdz = "", // 联系地址 + Bz = "历史潜客导入", + CreateTime = DateTime.Now, + ExpandUser = (string)item.拓客员工, // 拓客人员 + MainHealthUser = null, + SubHealthUser = null + }; + + // 5. 插入客户记录 + await _db.Insertable(customerEntity).ExecuteCommandAsync(); + + successCount++; + } + catch (Exception ex) + { + errorCount++; + errorMessages.Add($"处理客户 {(string)item.客户姓名}({(string)item.客户电话}) 时出错: {ex.Message}"); + } + } + + _db.CommitTran(); + + return new + { + success = true, + message = "客户信息导入完成", + totalRecords = cleanupData.Count, + successCount = successCount, + skipCount = skipCount, + errorCount = errorCount, + errorMessages = errorMessages.Take(10).ToList(), // 只返回前10个错误信息 + importTime = DateTime.Now + }; + } + catch (Exception ex) when (!(ex is NCCException)) + { + _db.RollbackTran(); + throw NCCException.Oh($"导入客户信息失败: {ex.Message}"); + } + } + #endregion + } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs index e025ff6..3bc9e1c 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs @@ -121,7 +121,7 @@ namespace NCC.Extend.LqTkjlb id = it.Id, expansionTime = it.ExpansionTime, expansionUserId = it.ExpansionUserId, - expansionUserName = SqlFunc.Subqueryable().Where(u => u.MobilePhone == it.ExpansionUserId).Select(u => u.RealName), + expansionUserName = SqlFunc.Subqueryable().Where(u => u.Id == it.ExpansionUserId).Select(u => u.RealName), customerName = it.CustomerName, customerPhone = it.CustomerPhone, buyNumber = it.BuyNumber, @@ -186,12 +186,13 @@ namespace NCC.Extend.LqTkjlb MemberInfo.Sjh = input.customerPhone; // 设置手机号 MemberInfo.Khlx = MemberTypeEnum.线索.GetHashCode().ToString(); MemberInfo.Dah = "GK" + DateTime.Now.ToString("yyyyMMddHHmmss"); + MemberInfo.Jdqd = "19.9卡"; //找到input.expansionUserId的用户信息 var userInfo = await _db.Queryable().Where(u => u.Id == input.expansionUserId).FirstAsync(); - //判断 岗位是否为健康师,如果是健康师,则设置健康师为负责人 + //判断 岗位是否为健康师,如果是健康师,则设置拓客人员是健康师 if (userInfo.Gw == "健康师") { - MemberInfo.Mrs = input.expansionUserId; + MemberInfo.ExpandUser = input.expansionUserId; } MemberInfo.Gsmd = eventUserInfo.StoreId; var memberResult = await _db.Insertable(MemberInfo).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();