Commit 14486c09842df2f9452a28788ece37052ac67450

Authored by 李宇
2 parents 2eaf4fdc ed462a62

Merge branch 'master' of http://39.98.150.180/antissoft/lvqianmeiye_ERP

antis-ncc-admin/.env.development
1 1 # 开发
2 2  
3 3 VUE_CLI_BABEL_TRANSPILE_MODULES = true
4   -VUE_APP_BASE_API = 'http://lvqian.antissoft.com'
5   -# VUE_APP_BASE_API = 'http://localhost:2011'
  4 +# VUE_APP_BASE_API = 'http://lvqian.antissoft.com'
  5 +VUE_APP_BASE_API = 'http://localhost:2011'
6 6 VUE_APP_BASE_WSS = 'ws://192.168.110.45:2011/websocket'
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs
... ... @@ -34,6 +34,7 @@ namespace NCC.Extend.Entitys.Dto.LqEvent
34 34 /// </summary>
35 35 public string eventCoordinator { get; set; }
36 36  
  37 +
37 38 /// <summary>
38 39 /// 活动编号
39 40 /// </summary>
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListOutput.cs
... ... @@ -32,6 +32,12 @@ namespace NCC.Extend.Entitys.Dto.LqEvent
32 32 /// </summary>
33 33 public string eventCoordinator { get; set; }
34 34  
  35 +
  36 + /// <summary>
  37 + /// 活动负责人姓名
  38 + /// </summary>
  39 + public string eventCoordinatorName { get; set; }
  40 +
35 41 /// <summary>
36 42 /// 活动编号
37 43 /// </summary>
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxCrInput.cs
... ... @@ -32,28 +32,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
32 32 /// 性别
33 33 /// </summary>
34 34 public string xb { get; set; }
35   -
36   - /// <summary>
37   - /// 公众号状态
38   - /// </summary>
39   - public string gzhzt { get; set; }
40   -
41   - /// <summary>
42   - /// 微信昵称
43   - /// </summary>
44   - public string wxnc { get; set; }
45   -
46   - /// <summary>
47   - /// 微信小程序状态
48   - /// </summary>
49   - public string wxxcxzt { get; set; }
50   -
51   - /// <summary>
52   - /// 最近登录时间
53   - /// </summary>
54   - public string zjdlsj { get; set; }
55   -
56   -
57 35 /// <summary>
58 36 /// 归属门店
59 37 /// </summary>
... ... @@ -90,16 +68,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
90 68 public string tjr { get; set; }
91 69  
92 70 /// <summary>
93   - /// 负责顾问
94   - /// </summary>
95   - public string fzgw { get; set; }
96   -
97   - /// <summary>
98   - /// 美容师
99   - /// </summary>
100   - public string mrs { get; set; }
101   -
102   - /// <summary>
103 71 /// 进店渠道
104 72 /// </summary>
105 73 public string jdqd { get; set; }
... ... @@ -124,9 +92,20 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
124 92 /// </summary>
125 93 public DateTime? yinlsr { get; set; }
126 94  
  95 +
  96 + /// <summary>
  97 + /// 拓客人员
  98 + /// </summary>
  99 + public string expandUser { get; set; }
  100 +
  101 + /// <summary>
  102 + /// 主健康师
  103 + /// </summary>
  104 + public string mainHealthUser { get; set; }
  105 +
127 106 /// <summary>
128   - /// 年龄
  107 + /// 副健康师
129 108 /// </summary>
130   - public string ml { get; set; }
  109 + public string subHealthUser { get; set; }
131 110 }
132 111 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxInfoOutput.cs
... ... @@ -33,26 +33,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
33 33 /// </summary>
34 34 public string xb { get; set; }
35 35  
36   - /// <summary>
37   - /// 公众号状态
38   - /// </summary>
39   - public string gzhzt { get; set; }
40   -
41   - /// <summary>
42   - /// 微信昵称
43   - /// </summary>
44   - public string wxnc { get; set; }
45   -
46   - /// <summary>
47   - /// 微信小程序状态
48   - /// </summary>
49   - public string wxxcxzt { get; set; }
50   -
51   - /// <summary>
52   - /// 最近登录时间
53   - /// </summary>
54   - public DateTime? zjdlsj { get; set; }
55   -
56 36  
57 37 /// <summary>
58 38 /// 归属门店
... ... @@ -90,14 +70,10 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
90 70 public string tjr { get; set; }
91 71  
92 72 /// <summary>
93   - /// 负责顾问
  73 + /// 推荐人名称
94 74 /// </summary>
95   - public string fzgw { get; set; }
  75 + public string tjrName { get; set; }
96 76  
97   - /// <summary>
98   - /// 美容师
99   - /// </summary>
100   - public string mrs { get; set; }
101 77  
102 78 /// <summary>
103 79 /// 进店渠道
... ... @@ -125,13 +101,40 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
125 101 public DateTime? yinlsr { get; set; }
126 102  
127 103 /// <summary>
128   - /// 年龄
  104 + /// 添加时间
129 105 /// </summary>
130   - public string ml { get; set; }
  106 + public string createTime { get; set; }
131 107  
132 108 /// <summary>
133   - /// 添加时间
  109 + /// 拓客人员
134 110 /// </summary>
135   - public string createTime { get; set; }
  111 + public string expandUser { get; set; }
  112 +
  113 + /// <summary>
  114 + /// 拓客人员名称
  115 + /// </summary>
  116 + public string expandUserName { get; set; }
  117 +
  118 + /// <summary>
  119 + /// 主健康师
  120 + /// </summary>
  121 + public string mainHealthUser { get; set; }
  122 +
  123 + /// <summary>
  124 + /// 主健康师名称
  125 + /// </summary>
  126 + public string mainHealthUserName { get; set; }
  127 +
  128 + /// <summary>
  129 + /// 副健康师
  130 + /// </summary>
  131 + public string subHealthUser { get; set; }
  132 +
  133 + /// <summary>
  134 + /// 副健康师名称
  135 + /// </summary>
  136 + public string subHealthUserName { get; set; }
  137 +
  138 +
136 139 }
137 140 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListOutput.cs
... ... @@ -35,26 +35,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
35 35 public string xb { get; set; }
36 36  
37 37 /// <summary>
38   - /// 公众号状态
39   - /// </summary>
40   - public string gzhzt { get; set; }
41   -
42   - /// <summary>
43   - /// 微信昵称
44   - /// </summary>
45   - public string wxnc { get; set; }
46   -
47   - /// <summary>
48   - /// 微信小程序状态
49   - /// </summary>
50   - public string wxxcxzt { get; set; }
51   -
52   - /// <summary>
53   - /// 最近登录时间
54   - /// </summary>
55   - public DateTime? zjdlsj { get; set; }
56   -
57   - /// <summary>
58 38 /// 归属门店
59 39 /// </summary>
60 40 public string gsmd { get; set; }
... ... @@ -111,19 +91,11 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
111 91 public string tjr { get; set; }
112 92  
113 93 /// <summary>
114   - /// 负责顾问
  94 + /// 推荐人名称
115 95 /// </summary>
116   - public string fzgw { get; set; }
  96 + public string tjrName { get; set; }
117 97  
118   - /// <summary>
119   - /// 美容师
120   - /// </summary>
121   - public string mrs { get; set; }
122 98  
123   - /// <summary>
124   - /// 美容师名称
125   - /// </summary>
126   - public string mrsName { get; set; }
127 99  
128 100 /// <summary>
129 101 /// 进店渠道
... ... @@ -159,5 +131,35 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
159 131 /// 添加时间
160 132 /// </summary>
161 133 public DateTime createTime { get; set; }
  134 +
  135 + /// <summary>
  136 + /// 拓客人员
  137 + /// </summary>
  138 + public string expandUser { get; set; }
  139 +
  140 + /// <summary>
  141 + /// 拓客人员名称
  142 + /// </summary>
  143 + public string expandUserName { get; set; }
  144 +
  145 + /// <summary>
  146 + /// 主健康师
  147 + /// </summary>
  148 + public string mainHealthUser { get; set; }
  149 +
  150 + /// <summary>
  151 + /// 主健康师名称
  152 + /// </summary>
  153 + public string mainHealthUserName { get; set; }
  154 +
  155 + /// <summary>
  156 + /// 副健康师
  157 + /// </summary>
  158 + public string subHealthUser { get; set; }
  159 +
  160 + /// <summary>
  161 + /// 副健康师名称
  162 + /// </summary>
  163 + public string subHealthUserName { get; set; }
162 164 }
163 165 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs
... ... @@ -48,20 +48,7 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
48 48 /// </summary>
49 49 public string xb { get; set; }
50 50  
51   - /// <summary>
52   - /// 公众号状态
53   - /// </summary>
54   - public string gzhzt { get; set; }
55   -
56   - /// <summary>
57   - /// 微信昵称
58   - /// </summary>
59   - public string wxnc { get; set; }
60 51  
61   - /// <summary>
62   - /// 微信小程序状态
63   - /// </summary>
64   - public string wxxcxzt { get; set; }
65 52  
66 53 /// <summary>
67 54 /// 归属门店
... ... @@ -98,15 +85,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
98 85 /// </summary>
99 86 public string tjr { get; set; }
100 87  
101   - /// <summary>
102   - /// 负责顾问
103   - /// </summary>
104   - public string fzgw { get; set; }
105   -
106   - /// <summary>
107   - /// 美容师
108   - /// </summary>
109   - public string mrs { get; set; }
110 88  
111 89 /// <summary>
112 90 /// 进店渠道
... ... @@ -132,10 +110,5 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
132 110 /// 阴历生日
133 111 /// </summary>
134 112 public string yinlsr { get; set; }
135   -
136   - /// <summary>
137   - /// 年龄
138   - /// </summary>
139   - public string ml { get; set; }
140 113 }
141 114 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_khxx/LqKhxxEntity.cs
... ... @@ -42,30 +42,6 @@ namespace NCC.Extend.Entitys.lq_khxx
42 42 public string Xb { get; set; }
43 43  
44 44 /// <summary>
45   - /// 公众号状态
46   - /// </summary>
47   - [SugarColumn(ColumnName = "gzhzt")]
48   - public string Gzhzt { get; set; }
49   -
50   - /// <summary>
51   - /// 微信昵称
52   - /// </summary>
53   - [SugarColumn(ColumnName = "wxnc")]
54   - public string Wxnc { get; set; }
55   -
56   - /// <summary>
57   - /// 微信小程序状态
58   - /// </summary>
59   - [SugarColumn(ColumnName = "wxxcxzt")]
60   - public string Wxxcxzt { get; set; }
61   -
62   - /// <summary>
63   - /// 最近登录时间
64   - /// </summary>
65   - [SugarColumn(ColumnName = "zjdlsj")]
66   - public DateTime? Zjdlsj { get; set; }
67   -
68   - /// <summary>
69 45 /// 归属门店
70 46 /// </summary>
71 47 [SugarColumn(ColumnName = "gsmd")]
... ... @@ -107,17 +83,6 @@ namespace NCC.Extend.Entitys.lq_khxx
107 83 [SugarColumn(ColumnName = "tjr")]
108 84 public string Tjr { get; set; }
109 85  
110   - /// <summary>
111   - /// 负责顾问
112   - /// </summary>
113   - [SugarColumn(ColumnName = "fzgw")]
114   - public string Fzgw { get; set; }
115   -
116   - /// <summary>
117   - /// 美容师
118   - /// </summary>
119   - [SugarColumn(ColumnName = "mrs")]
120   - public string Mrs { get; set; }
121 86  
122 87 /// <summary>
123 88 /// 进店渠道
... ... @@ -150,15 +115,30 @@ namespace NCC.Extend.Entitys.lq_khxx
150 115 public DateTime? Yinlsr { get; set; }
151 116  
152 117 /// <summary>
153   - /// 年龄
154   - /// </summary>
155   - [SugarColumn(ColumnName = "ml")]
156   - public string Ml { get; set; }
157   -
158   - /// <summary>
159 118 /// 添加时间
160 119 /// </summary>
161 120 [SugarColumn(ColumnName = "F_CreateTime")]
162 121 public DateTime CreateTime { get; set; } = DateTime.Now;
  122 +
  123 +
  124 + /// <summary>
  125 + /// 拓客人员
  126 + /// </summary>
  127 + [SugarColumn(ColumnName = "F_ExpandUser")]
  128 + public string ExpandUser { get; set; }
  129 +
  130 +
  131 + /// <summary>
  132 + /// 主健康师
  133 + /// </summary>
  134 + [SugarColumn(ColumnName = "F_MainHealthUser")]
  135 + public string MainHealthUser { get; set; }
  136 +
  137 + /// <summary>
  138 + /// 副健康师
  139 + /// </summary>
  140 + [SugarColumn(ColumnName = "F_SubHealthUser")]
  141 + public string SubHealthUser { get; set; }
  142 +
163 143 }
164 144 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs
... ... @@ -99,6 +99,7 @@ namespace NCC.Extend.LqEvent
99 99 eventNumber = e.EventNumber,
100 100 memberCount = SqlFunc.Subqueryable<LqEventUserEntity>().Where(u => u.EventId == e.Id).Count(),
101 101 eventType = e.EventType,
  102 + eventCoordinatorName = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == e.EventCoordinator).Select(u => u.RealName),
102 103 })
103 104 .MergeTable()
104 105 .OrderBy(sidx + " " + sord)
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
... ... @@ -176,7 +176,7 @@ namespace NCC.Extend.LqKdKdjlb
176 176 [HttpGet("")]
177 177 public async Task<dynamic> GetList([FromQuery] LqKdKdjlbListQueryInput input)
178 178 {
179   - var sidx = input.sidx == null ? "id" : input.sidx;
  179 + var sidx = input.sidx == null ? "kdrq" : input.sidx;
180 180 List<string> queryKdrq = input.kdrq != null ? input.kdrq.Split(',').ToObeject<List<string>>() : null;
181 181 DateTime? startKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.First()) : null;
182 182 DateTime? endKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.Last()) : null;
... ... @@ -1077,6 +1077,152 @@ namespace NCC.Extend.LqKdKdjlb
1077 1077 }
1078 1078 #endregion
1079 1079  
  1080 + #region 历史会员权益数据导入
  1081 + /// <summary>
  1082 + /// 导入历史会员权益数据到开单记录表和开单品项明细表
  1083 + /// </summary>
  1084 + /// <remarks>
  1085 + /// 将历史会员权益表的数据导入到开单记录表和开单品项明细表中
  1086 + ///
  1087 + /// 导入规则:
  1088 + /// 1. 逐条处理历史会员权益数据,每条记录生成一个开单记录和一个品项明细
  1089 + /// 2. 开单时间和创建时间统一设置为 2025-06-01 00:00:00
  1090 + /// 3. 使用YitIdHelper生成所有ID
  1091 + /// 4. 直接使用F_StoreId作为门店ID
  1092 + ///
  1093 + /// 字段映射:
  1094 + /// - F_MemberId/会员编号 -> kdhy (开单会员,优先使用会员ID)
  1095 + /// - 会员名称 -> kdhyc (开单会员名称)
  1096 + /// - 会员电话 -> kdhysjh (开单会员手机号)
  1097 + /// - F_StoreId -> djmd (单据门店ID)
  1098 + /// - 整单业绩 -> zdyj (整单业绩)
  1099 + /// - 实付业绩 -> sfyj (实付业绩)
  1100 + /// - 欠款 -> qk (欠款)
  1101 + /// - 来源 -> khly (客户来源)
  1102 + /// - 品项名称 -> pxmc (品项名称)
  1103 + /// - 品项价格 -> pxjg (品项价格)
  1104 + /// - 品项次数 -> F_ProjectNumber (项目次数)
  1105 + /// - F_MemberId/会员编号 -> F_MemberId (品项明细会员ID,优先使用会员ID)
  1106 + /// </remarks>
  1107 + /// <returns>导入结果统计</returns>
  1108 + /// <response code="200">导入成功</response>
  1109 + /// <response code="500">服务器内部错误</response>
  1110 + [HttpPost("import-history-member-rights")]
  1111 + public async Task<dynamic> ImportHistoryMemberRights()
  1112 + {
  1113 + try
  1114 + {
  1115 + _db.BeginTran();
  1116 +
  1117 + // 设置固定的时间
  1118 + var fixedDateTime = new DateTime(2025, 6, 1, 0, 0, 0);
  1119 +
  1120 + // 1. 查询历史会员权益数据
  1121 + var historyData = await _db.Ado.SqlQueryAsync<dynamic>(@"
  1122 + SELECT
  1123 + 会员编号,
  1124 + 会员名称,
  1125 + 会员电话,
  1126 + 开单门店,
  1127 + 开单时间,
  1128 + 整单业绩,
  1129 + 实付业绩,
  1130 + 欠款,
  1131 + 来源,
  1132 + 品项名称,
  1133 + 品项价格,
  1134 + 品项次数,
  1135 + F_StoreId,
  1136 + F_ProjectId,
  1137 + F_MemberId
  1138 + FROM `历史会员权益`");
  1139 +
  1140 + int successCount = 0;
  1141 + int errorCount = 0;
  1142 + var errorMessages = new List<string>();
  1143 +
  1144 + // 2. 逐条处理历史会员权益数据
  1145 + foreach (var item in historyData)
  1146 + {
  1147 + try
  1148 + {
  1149 + // 3. 生成开单记录ID
  1150 + string kdjlbId = YitIdHelper.NextId().ToString();
  1151 +
  1152 + // 4. 创建开单记录
  1153 + var kdjlbEntity = new LqKdKdjlbEntity
  1154 + {
  1155 + Id = kdjlbId,
  1156 + Djmd = item.F_StoreId, // 直接使用F_StoreId
  1157 + Kdhy = item.F_MemberId,
  1158 + Kdhyc = item.会员名称,
  1159 + Jsj = "暂无",
  1160 + Kdhysjh = item.会员电话,
  1161 + Kdrq = fixedDateTime,
  1162 + Zdyj = Convert.ToDecimal(item.整单业绩 ?? 0),
  1163 + Sfyj = Convert.ToDecimal(item.实付业绩 ?? 0),
  1164 + Qk = Convert.ToDecimal(item.欠款 ?? 0),
  1165 + CreateTime = fixedDateTime,
  1166 + UpdateTime = fixedDateTime,
  1167 + Sfskdd = "否",
  1168 + IsEffective = 1,
  1169 + Bz = "导入历史会员权益数据"
  1170 + };
  1171 +
  1172 + await _db.Insertable(kdjlbEntity).ExecuteCommandAsync();
  1173 +
  1174 + // 5. 创建品项明细
  1175 + string pxmxId = YitIdHelper.NextId().ToString();
  1176 +
  1177 + var pxmxEntity = new LqKdPxmxEntity
  1178 + {
  1179 + Id = pxmxId,
  1180 + Glkdbh = kdjlbId,
  1181 + Px = item.F_ProjectId,
  1182 + Pxmc = item.品项名称,
  1183 + Pxjg = Convert.ToDecimal(item.品项价格 ?? 0),
  1184 + ProjectNumber = Convert.ToDecimal(item.品项次数 ?? 0),
  1185 + SourceType = item.来源,
  1186 + MemberId = item.F_MemberId,
  1187 + Yjsj = fixedDateTime,
  1188 + CreateTIme = fixedDateTime,
  1189 + IsEffective = 1,
  1190 + IsEnabled = 0,
  1191 + TotalPrice = Convert.ToDecimal(item.品项价格 ?? 0) * Convert.ToDecimal(item.品项次数 ?? 0),
  1192 + ActualPrice = Convert.ToDecimal(item.品项价格 ?? 0) * Convert.ToDecimal(item.品项次数 ?? 0)
  1193 + };
  1194 +
  1195 + await _db.Insertable(pxmxEntity).ExecuteCommandAsync();
  1196 +
  1197 + successCount++;
  1198 + }
  1199 + catch (Exception ex)
  1200 + {
  1201 + errorCount++;
  1202 + errorMessages.Add($"处理记录 {item.会员编号}-{item.品项名称} 时出错: {ex.Message}");
  1203 + }
  1204 + }
  1205 +
  1206 + _db.CommitTran();
  1207 +
  1208 + return new
  1209 + {
  1210 + success = true,
  1211 + message = "历史会员权益数据导入完成",
  1212 + totalRecords = historyData.Count,
  1213 + successCount = successCount,
  1214 + errorCount = errorCount,
  1215 + errorMessages = errorMessages.Take(10).ToList(), // 只返回前10个错误信息
  1216 + importTime = DateTime.Now
  1217 + };
  1218 + }
  1219 + catch (Exception ex) when (!(ex is NCCException))
  1220 + {
  1221 + _db.RollbackTran();
  1222 + throw NCCException.Oh($"导入历史会员权益数据失败: {ex.Message}");
  1223 + }
  1224 + }
  1225 + #endregion
1080 1226  
1081 1227 }
1082 1228 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs
... ... @@ -71,6 +71,28 @@ namespace NCC.Extend.LqKhxx
71 71 {
72 72 var entity = await _db.Queryable<LqKhxxEntity>().FirstAsync(p => p.Id == id);
73 73 var output = entity.Adapt<LqKhxxInfoOutput>();
  74 + if (!string.IsNullOrEmpty(entity.ExpandUser))
  75 + {
  76 + var expandUser = await _db.Queryable<UserEntity>().Where(u => u.Id == entity.ExpandUser).FirstAsync();
  77 + output.expandUserName = expandUser?.RealName ?? "";
  78 + }
  79 +
  80 + if (!string.IsNullOrEmpty(entity.MainHealthUser))
  81 + {
  82 + var mainHealthUser = await _db.Queryable<UserEntity>().Where(u => u.Id == entity.MainHealthUser).FirstAsync();
  83 + output.mainHealthUserName = mainHealthUser?.RealName ?? "";
  84 + }
  85 +
  86 + if (!string.IsNullOrEmpty(entity.SubHealthUser))
  87 + {
  88 + var subHealthUser = await _db.Queryable<UserEntity>().Where(u => u.Id == entity.SubHealthUser).FirstAsync();
  89 + output.subHealthUserName = subHealthUser?.RealName ?? "";
  90 + }
  91 + if (!string.IsNullOrEmpty(entity.Tjr))
  92 + {
  93 + var tjr = await _db.Queryable<UserEntity>().Where(u => u.Id == entity.Tjr).FirstAsync();
  94 + output.tjrName = tjr?.RealName ?? "";
  95 + }
74 96 return output;
75 97 }
76 98 #endregion
... ... @@ -92,21 +114,15 @@ namespace NCC.Extend.LqKhxx
92 114 .WhereIF(!string.IsNullOrEmpty(input.sjh), p => p.Sjh.Contains(input.sjh))
93 115 .WhereIF(!string.IsNullOrEmpty(input.dah), p => p.Dah.Contains(input.dah))
94 116 .WhereIF(!string.IsNullOrEmpty(input.xb), p => p.Xb.Equals(input.xb))
95   - .WhereIF(!string.IsNullOrEmpty(input.gzhzt), p => p.Gzhzt.Equals(input.gzhzt))
96   - .WhereIF(!string.IsNullOrEmpty(input.wxnc), p => p.Wxnc.Contains(input.wxnc))
97   - .WhereIF(!string.IsNullOrEmpty(input.wxxcxzt), p => p.Wxxcxzt.Equals(input.wxxcxzt))
98 117 .WhereIF(!string.IsNullOrEmpty(input.gsmd), p => p.Gsmd.Contains(input.gsmd))
99 118 .WhereIF(!string.IsNullOrEmpty(input.khlx), p => p.Khlx.Equals(input.khlx))
100 119 .WhereIF(!string.IsNullOrEmpty(input.khjd), p => p.Khjd.Equals(input.khjd))
101 120 .WhereIF(!string.IsNullOrEmpty(input.khxf), p => p.Khxf.Contains(input.khxf))
102 121 .WhereIF(!string.IsNullOrEmpty(input.xfpc), p => p.Xfpc.Equals(input.xfpc))
103 122 .WhereIF(!string.IsNullOrEmpty(input.tjr), p => p.Tjr.Contains(input.tjr))
104   - .WhereIF(!string.IsNullOrEmpty(input.fzgw), p => p.Fzgw.Contains(input.fzgw))
105   - .WhereIF(!string.IsNullOrEmpty(input.mrs), p => p.Mrs.Contains(input.mrs))
106 123 .WhereIF(!string.IsNullOrEmpty(input.jdqd), p => p.Jdqd.Contains(input.jdqd))
107 124 .WhereIF(!string.IsNullOrEmpty(input.lxdz), p => p.Lxdz.Contains(input.lxdz))
108 125 .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz))
109   - .WhereIF(!string.IsNullOrEmpty(input.ml), p => p.Ml.Contains(input.ml))
110 126 .Select(it => new LqKhxxListOutput
111 127 {
112 128 id = it.Id,
... ... @@ -114,9 +130,6 @@ namespace NCC.Extend.LqKhxx
114 130 sjh = it.Sjh,
115 131 dah = it.Dah,
116 132 xb = it.Xb,
117   - gzhzt = it.Gzhzt,
118   - wxnc = it.Wxnc,
119   - wxxcxzt = it.Wxxcxzt,
120 133 gsmd = it.Gsmd,
121 134 gsmdName = SqlFunc.Subqueryable<LqMdxxEntity>().Where(u => u.Id == it.Gsmd).Select(u => u.Dm),
122 135 zcsj = it.Zcsj,
... ... @@ -125,16 +138,19 @@ namespace NCC.Extend.LqKhxx
125 138 khxf = it.Khxf,
126 139 xfpc = it.Xfpc,
127 140 tjr = it.Tjr,
128   - fzgw = it.Fzgw,
129   - mrs = it.Mrs,
130   - mrsName = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == it.Mrs).Select(u => u.RealName),
131 141 jdqd = it.Jdqd,
132 142 lxdz = it.Lxdz,
133 143 bz = it.Bz,
134 144 yanglsr = it.Yanglsr,
135 145 yinlsr = it.Yinlsr,
136   - ml = it.Ml,
137 146 createTime = it.CreateTime,
  147 + expandUser = it.ExpandUser,
  148 + mainHealthUser = it.MainHealthUser,
  149 + subHealthUser = it.SubHealthUser,
  150 + expandUserName = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == it.ExpandUser).Select(u => u.RealName),
  151 + mainHealthUserName = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == it.MainHealthUser).Select(u => u.RealName),
  152 + subHealthUserName = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == it.SubHealthUser).Select(u => u.RealName),
  153 + tjrName = SqlFunc.Subqueryable<LqKhxxEntity>().Where(u => u.Id == it.Tjr).Select(u => u.Khmc),
138 154 })
139 155 .MergeTable()
140 156 .OrderBy(sidx + " " + input.sort)
... ... @@ -198,9 +214,6 @@ namespace NCC.Extend.LqKhxx
198 214 .WhereIF(!string.IsNullOrEmpty(input.sjh), p => p.Sjh.Contains(input.sjh))
199 215 .WhereIF(!string.IsNullOrEmpty(input.dah), p => p.Dah.Contains(input.dah))
200 216 .WhereIF(!string.IsNullOrEmpty(input.xb), p => p.Xb.Equals(input.xb))
201   - .WhereIF(!string.IsNullOrEmpty(input.gzhzt), p => p.Gzhzt.Equals(input.gzhzt))
202   - .WhereIF(!string.IsNullOrEmpty(input.wxnc), p => p.Wxnc.Contains(input.wxnc))
203   - .WhereIF(!string.IsNullOrEmpty(input.wxxcxzt), p => p.Wxxcxzt.Equals(input.wxxcxzt))
204 217 .WhereIF(!string.IsNullOrEmpty(input.gsmd), p => p.Gsmd.Contains(input.gsmd))
205 218 .WhereIF(queryZcsj != null, p => p.Zcsj >= new DateTime(startZcsj.ToDate().Year, startZcsj.ToDate().Month, startZcsj.ToDate().Day, 0, 0, 0))
206 219 .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
209 222 .WhereIF(!string.IsNullOrEmpty(input.khxf), p => p.Khxf.Equals(input.khxf))
210 223 .WhereIF(!string.IsNullOrEmpty(input.xfpc), p => p.Xfpc.Equals(input.xfpc))
211 224 .WhereIF(!string.IsNullOrEmpty(input.tjr), p => p.Tjr.Contains(input.tjr))
212   - .WhereIF(!string.IsNullOrEmpty(input.fzgw), p => p.Fzgw.Contains(input.fzgw))
213   - .WhereIF(!string.IsNullOrEmpty(input.mrs), p => p.Mrs.Contains(input.mrs))
214 225 .WhereIF(!string.IsNullOrEmpty(input.jdqd), p => p.Jdqd.Contains(input.jdqd))
215 226 .WhereIF(!string.IsNullOrEmpty(input.lxdz), p => p.Lxdz.Contains(input.lxdz))
216 227 .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz))
... ... @@ -218,7 +229,6 @@ namespace NCC.Extend.LqKhxx
218 229 .WhereIF(queryYanglsr != null, p => p.Yanglsr <= new DateTime(endYanglsr.ToDate().Year, endYanglsr.ToDate().Month, endYanglsr.ToDate().Day, 23, 59, 59))
219 230 .WhereIF(queryYinlsr != null, p => p.Yinlsr >= new DateTime(startYinlsr.ToDate().Year, startYinlsr.ToDate().Month, startYinlsr.ToDate().Day, 0, 0, 0))
220 231 .WhereIF(queryYinlsr != null, p => p.Yinlsr <= new DateTime(endYinlsr.ToDate().Year, endYinlsr.ToDate().Month, endYinlsr.ToDate().Day, 23, 59, 59))
221   - .WhereIF(!string.IsNullOrEmpty(input.ml), p => p.Ml.Contains(input.ml))
222 232 .Select(it => new LqKhxxListOutput
223 233 {
224 234 id = it.Id,
... ... @@ -226,10 +236,6 @@ namespace NCC.Extend.LqKhxx
226 236 sjh = it.Sjh,
227 237 dah = it.Dah,
228 238 xb = it.Xb,
229   - gzhzt = it.Gzhzt,
230   - wxnc = it.Wxnc,
231   - wxxcxzt = it.Wxxcxzt,
232   - zjdlsj = it.Zjdlsj,
233 239 gsmd = it.Gsmd,
234 240 zcsj = it.Zcsj,
235 241 khlx = it.Khlx,
... ... @@ -237,14 +243,11 @@ namespace NCC.Extend.LqKhxx
237 243 khxf = it.Khxf,
238 244 xfpc = it.Xfpc,
239 245 tjr = it.Tjr,
240   - fzgw = it.Fzgw,
241   - mrs = it.Mrs,
242 246 jdqd = it.Jdqd,
243 247 lxdz = it.Lxdz,
244 248 bz = it.Bz,
245 249 yanglsr = it.Yanglsr,
246 250 yinlsr = it.Yinlsr,
247   - ml = it.Ml,
248 251 createTime = it.CreateTime,
249 252 })
250 253 .MergeTable()
... ... @@ -281,9 +284,6 @@ namespace NCC.Extend.LqKhxx
281 284 .WhereIF(!string.IsNullOrEmpty(input.sjh), p => p.Sjh.Contains(input.sjh))
282 285 .WhereIF(!string.IsNullOrEmpty(input.dah), p => p.Dah.Contains(input.dah))
283 286 .WhereIF(!string.IsNullOrEmpty(input.xb), p => p.Xb.Equals(input.xb))
284   - .WhereIF(!string.IsNullOrEmpty(input.gzhzt), p => p.Gzhzt.Equals(input.gzhzt))
285   - .WhereIF(!string.IsNullOrEmpty(input.wxnc), p => p.Wxnc.Contains(input.wxnc))
286   - .WhereIF(!string.IsNullOrEmpty(input.wxxcxzt), p => p.Wxxcxzt.Equals(input.wxxcxzt))
287 287 .WhereIF(!string.IsNullOrEmpty(input.gsmd), p => p.Gsmd.Contains(input.gsmd))
288 288 .WhereIF(queryZcsj != null, p => p.Zcsj >= new DateTime(startZcsj.ToDate().Year, startZcsj.ToDate().Month, startZcsj.ToDate().Day, 0, 0, 0))
289 289 .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
292 292 .WhereIF(!string.IsNullOrEmpty(input.khxf), p => p.Khxf.Contains(input.khxf))
293 293 .WhereIF(!string.IsNullOrEmpty(input.xfpc), p => p.Xfpc.Equals(input.xfpc))
294 294 .WhereIF(!string.IsNullOrEmpty(input.tjr), p => p.Tjr.Contains(input.tjr))
295   - .WhereIF(!string.IsNullOrEmpty(input.fzgw), p => p.Fzgw.Contains(input.fzgw))
296   - .WhereIF(!string.IsNullOrEmpty(input.mrs), p => p.Mrs.Contains(input.mrs))
297 295 .WhereIF(!string.IsNullOrEmpty(input.jdqd), p => p.Jdqd.Contains(input.jdqd))
298 296 .WhereIF(!string.IsNullOrEmpty(input.lxdz), p => p.Lxdz.Contains(input.lxdz))
299 297 .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz))
... ... @@ -301,7 +299,6 @@ namespace NCC.Extend.LqKhxx
301 299 .WhereIF(queryYanglsr != null, p => p.Yanglsr <= new DateTime(endYanglsr.ToDate().Year, endYanglsr.ToDate().Month, endYanglsr.ToDate().Day, 23, 59, 59))
302 300 .WhereIF(queryYinlsr != null, p => p.Yinlsr >= new DateTime(startYinlsr.ToDate().Year, startYinlsr.ToDate().Month, startYinlsr.ToDate().Day, 0, 0, 0))
303 301 .WhereIF(queryYinlsr != null, p => p.Yinlsr <= new DateTime(endYinlsr.ToDate().Year, endYinlsr.ToDate().Month, endYinlsr.ToDate().Day, 23, 59, 59))
304   - .WhereIF(!string.IsNullOrEmpty(input.ml), p => p.Ml.Contains(input.ml))
305 302 .Select(it => new LqKhxxListOutput
306 303 {
307 304 id = it.Id,
... ... @@ -309,10 +306,6 @@ namespace NCC.Extend.LqKhxx
309 306 sjh = it.Sjh,
310 307 dah = it.Dah,
311 308 xb = it.Xb,
312   - gzhzt = it.Gzhzt,
313   - wxnc = it.Wxnc,
314   - wxxcxzt = it.Wxxcxzt,
315   - zjdlsj = it.Zjdlsj,
316 309 gsmd = it.Gsmd,
317 310 zcsj = it.Zcsj,
318 311 khlx = it.Khlx,
... ... @@ -320,15 +313,15 @@ namespace NCC.Extend.LqKhxx
320 313 khxf = it.Khxf,
321 314 xfpc = it.Xfpc,
322 315 tjr = it.Tjr,
323   - fzgw = it.Fzgw,
324   - mrs = it.Mrs,
325 316 jdqd = it.Jdqd,
326 317 lxdz = it.Lxdz,
327 318 bz = it.Bz,
328 319 yanglsr = it.Yanglsr,
329 320 yinlsr = it.Yinlsr,
330   - ml = it.Ml,
331 321 createTime = it.CreateTime,
  322 + expandUser = it.ExpandUser,
  323 + mainHealthUser = it.MainHealthUser,
  324 + subHealthUser = it.SubHealthUser,
332 325 })
333 326 .MergeTable()
334 327 .OrderBy(sidx + " " + input.sort)
... ... @@ -637,5 +630,133 @@ namespace NCC.Extend.LqKhxx
637 630 }
638 631 #endregion
639 632  
  633 + #region 导入客户信息
  634 + /// <summary>
  635 + /// 从"清理跨店的重复"表导入客户信息
  636 + /// </summary>
  637 + /// <remarks>
  638 + /// 将"清理跨店的重复"表中的数据导入到客户表中,客户类型设置为"潜客"
  639 + ///
  640 + /// 导入规则:
  641 + /// 1. 根据客户电话去重,避免重复导入
  642 + /// 2. 客户类型统一设置为"潜客"
  643 + /// 3. 使用YitIdHelper生成客户ID
  644 + /// 4. 根据门店ID设置归属门店
  645 + /// 5. 根据拓客员工设置拓客人员
  646 + ///
  647 + /// 字段映射:
  648 + /// - 客户姓名 -> khmc (客户名称)
  649 + /// - 客户电话 -> sjh (手机号)
  650 + /// - F_StoreId -> gsmd (归属门店)
  651 + /// - 拓客员工 -> F_ExpandUser (拓客人员)
  652 + /// - 日期 -> zcsj (注册时间)
  653 + /// </remarks>
  654 + /// <returns>导入结果</returns>
  655 + /// <response code="200">导入成功</response>
  656 + /// <response code="500">服务器内部错误</response>
  657 + [HttpPost("import-customers-from-cleanup")]
  658 + public async Task<dynamic> ImportCustomersFromCleanup()
  659 + {
  660 + try
  661 + {
  662 + _db.BeginTran();
  663 +
  664 + // 1. 查询"清理跨店的重复"表数据,按客户电话去重
  665 + var cleanupData = await _db.Ado.SqlQueryAsync<dynamic>(@"
  666 + SELECT
  667 + F_Id,
  668 + 客户姓名,
  669 + 客户电话,
  670 + 归属门店,
  671 + 拓客员工,
  672 + 日期,
  673 + F_StoreId,
  674 + F_UserId
  675 + FROM `清理跨店的重复`
  676 + WHERE 客户电话 IS NOT NULL
  677 + AND 客户电话 != ''
  678 + AND 客户姓名 IS NOT NULL
  679 + AND 客户姓名 != ''
  680 + GROUP BY 客户电话
  681 + ORDER BY 日期 DESC");
  682 +
  683 + int successCount = 0;
  684 + int skipCount = 0;
  685 + int errorCount = 0;
  686 + var errorMessages = new List<string>();
  687 +
  688 + foreach (var item in cleanupData)
  689 + {
  690 + try
  691 + {
  692 + // 2. 检查客户是否已存在(根据手机号)
  693 + string phoneNumber = (string)item.客户电话;
  694 + var existingCustomer = await _db.Queryable<LqKhxxEntity>()
  695 + .Where(x => x.Sjh == phoneNumber)
  696 + .FirstAsync();
  697 +
  698 + if (existingCustomer != null)
  699 + {
  700 + skipCount++;
  701 + continue;
  702 + }
  703 +
  704 + // 3. 生成客户ID
  705 + string customerId = YitIdHelper.NextId().ToString();
  706 +
  707 + // 4. 创建客户实体
  708 + var customerEntity = new LqKhxxEntity
  709 + {
  710 + Id = customerId,
  711 + Khmc = (string)item.客户姓名,
  712 + Sjh = (string)item.客户电话,
  713 + Dah = $"GK{DateTime.Now:yyyyMMdd}{customerId.Substring(customerId.Length - 6)}", // 生成档案号
  714 + Xb = "未知", // 默认性别
  715 + Gsmd = (string)item.F_StoreId, // 使用门店ID
  716 + Zcsj = DateTime.TryParse((string)item.日期, out DateTime regDate) ? regDate : DateTime.Now,
  717 + Khlx = MemberTypeEnum.线索.GetHashCode().ToString(), // 客户类型设置为潜客
  718 + Jdqd = "", // 进店渠道
  719 + Lxdz = "", // 联系地址
  720 + Bz = "历史潜客导入",
  721 + CreateTime = DateTime.Now,
  722 + ExpandUser = (string)item.拓客员工, // 拓客人员
  723 + MainHealthUser = null,
  724 + SubHealthUser = null
  725 + };
  726 +
  727 + // 5. 插入客户记录
  728 + await _db.Insertable(customerEntity).ExecuteCommandAsync();
  729 +
  730 + successCount++;
  731 + }
  732 + catch (Exception ex)
  733 + {
  734 + errorCount++;
  735 + errorMessages.Add($"处理客户 {(string)item.客户姓名}({(string)item.客户电话}) 时出错: {ex.Message}");
  736 + }
  737 + }
  738 +
  739 + _db.CommitTran();
  740 +
  741 + return new
  742 + {
  743 + success = true,
  744 + message = "客户信息导入完成",
  745 + totalRecords = cleanupData.Count,
  746 + successCount = successCount,
  747 + skipCount = skipCount,
  748 + errorCount = errorCount,
  749 + errorMessages = errorMessages.Take(10).ToList(), // 只返回前10个错误信息
  750 + importTime = DateTime.Now
  751 + };
  752 + }
  753 + catch (Exception ex) when (!(ex is NCCException))
  754 + {
  755 + _db.RollbackTran();
  756 + throw NCCException.Oh($"导入客户信息失败: {ex.Message}");
  757 + }
  758 + }
  759 + #endregion
  760 +
640 761 }
641 762 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs
... ... @@ -121,7 +121,7 @@ namespace NCC.Extend.LqTkjlb
121 121 id = it.Id,
122 122 expansionTime = it.ExpansionTime,
123 123 expansionUserId = it.ExpansionUserId,
124   - expansionUserName = SqlFunc.Subqueryable<UserEntity>().Where(u => u.MobilePhone == it.ExpansionUserId).Select(u => u.RealName),
  124 + expansionUserName = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == it.ExpansionUserId).Select(u => u.RealName),
125 125 customerName = it.CustomerName,
126 126 customerPhone = it.CustomerPhone,
127 127 buyNumber = it.BuyNumber,
... ... @@ -186,12 +186,13 @@ namespace NCC.Extend.LqTkjlb
186 186 MemberInfo.Sjh = input.customerPhone; // 设置手机号
187 187 MemberInfo.Khlx = MemberTypeEnum.线索.GetHashCode().ToString();
188 188 MemberInfo.Dah = "GK" + DateTime.Now.ToString("yyyyMMddHHmmss");
  189 + MemberInfo.Jdqd = "19.9卡";
189 190 //找到input.expansionUserId的用户信息
190 191 var userInfo = await _db.Queryable<UserEntity>().Where(u => u.Id == input.expansionUserId).FirstAsync();
191   - //判断 岗位是否为健康师,如果是健康师,则设置健康师为负责人
  192 + //判断 岗位是否为健康师,如果是健康师,则设置拓客人员是健康师
192 193 if (userInfo.Gw == "健康师")
193 194 {
194   - MemberInfo.Mrs = input.expansionUserId;
  195 + MemberInfo.ExpandUser = input.expansionUserId;
195 196 }
196 197 MemberInfo.Gsmd = eventUserInfo.StoreId;
197 198 var memberResult = await _db.Insertable(MemberInfo).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
... ...