Commit 14486c09842df2f9452a28788ece37052ac67450
Merge branch 'master' of http://39.98.150.180/antissoft/lvqianmeiye_ERP
Showing
12 changed files
with
420 additions
and
207 deletions
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
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(); | ... | ... |