Procházet zdrojové kódy

分词管理,智能关键词,智能回复,发送人图标

lihai %!s(int64=5) %!d(string=před) roky
rodič
revize
c5ad92fe5b

+ 29 - 20
CallCenterApi/CallCenterApi.DAL/T_Chat_IM_ReplyList.cs

@@ -50,12 +50,13 @@ namespace CallCenterApi.DAL
50 50
         {
51 51
             StringBuilder strSql = new StringBuilder();
52 52
             strSql.Append("insert into T_Chat_IM_ReplyList(");
53
-            strSql.Append("F_ReplyContent,F_UseNum,F_CollectionNum,F_CreateBy,F_CreateTime,F_IsDelete,F_DeleteBy,F_DeleteTime)");
53
+            strSql.Append("F_ReplyContent,F_ClassId,F_UseNum,F_CollectionNum,F_CreateBy,F_CreateTime,F_IsDelete,F_DeleteBy,F_DeleteTime)");
54 54
             strSql.Append(" values (");
55
-            strSql.Append("@F_ReplyContent,@F_UseNum,@F_CollectionNum,@F_CreateBy,@F_CreateTime,@F_IsDelete,@F_DeleteBy,@F_DeleteTime)");
55
+            strSql.Append("@F_ReplyContent,@F_ClassId,@F_UseNum,@F_CollectionNum,@F_CreateBy,@F_CreateTime,@F_IsDelete,@F_DeleteBy,@F_DeleteTime)");
56 56
             strSql.Append(";select @@IDENTITY");
57 57
             SqlParameter[] parameters = {
58 58
                     new SqlParameter("@F_ReplyContent", SqlDbType.NVarChar,500),
59
+                    new SqlParameter("@F_ClassId", SqlDbType.Int,4),
59 60
                     new SqlParameter("@F_UseNum", SqlDbType.Int,4),
60 61
                     new SqlParameter("@F_CollectionNum", SqlDbType.Int,4),
61 62
                     new SqlParameter("@F_CreateBy", SqlDbType.VarChar,50),
@@ -64,13 +65,14 @@ namespace CallCenterApi.DAL
64 65
                     new SqlParameter("@F_DeleteBy", SqlDbType.VarChar,50),
65 66
                     new SqlParameter("@F_DeleteTime", SqlDbType.DateTime)};
66 67
             parameters[0].Value = model.F_ReplyContent;
67
-            parameters[1].Value = model.F_UseNum;
68
-            parameters[2].Value = model.F_CollectionNum;
69
-            parameters[3].Value = model.F_CreateBy;
70
-            parameters[4].Value = model.F_CreateTime;
71
-            parameters[5].Value = model.F_IsDelete;
72
-            parameters[6].Value = model.F_DeleteBy;
73
-            parameters[7].Value = model.F_DeleteTime;
68
+            parameters[1].Value = model.F_ClassId;
69
+            parameters[3].Value = model.F_UseNum;
70
+            parameters[4].Value = model.F_CollectionNum;
71
+            parameters[5].Value = model.F_CreateBy;
72
+            parameters[6].Value = model.F_CreateTime;
73
+            parameters[7].Value = model.F_IsDelete;
74
+            parameters[8].Value = model.F_DeleteBy;
75
+            parameters[9].Value = model.F_DeleteTime;
74 76
 
75 77
             object obj = DbHelperSQL.GetSingle(strSql.ToString(), parameters);
76 78
             if (obj == null)
@@ -90,6 +92,7 @@ namespace CallCenterApi.DAL
90 92
             StringBuilder strSql = new StringBuilder();
91 93
             strSql.Append("update T_Chat_IM_ReplyList set ");
92 94
             strSql.Append("F_ReplyContent=@F_ReplyContent,");
95
+            strSql.Append("F_ClassId=@F_ClassId,");
93 96
             strSql.Append("F_UseNum=@F_UseNum,");
94 97
             strSql.Append("F_CollectionNum=@F_CollectionNum,");
95 98
             strSql.Append("F_CreateBy=@F_CreateBy,");
@@ -101,6 +104,7 @@ namespace CallCenterApi.DAL
101 104
             SqlParameter[] parameters = {
102 105
                     new SqlParameter("@F_ReplyContent", SqlDbType.NVarChar,500),
103 106
                     new SqlParameter("@F_UseNum", SqlDbType.Int,4),
107
+                    new SqlParameter("@F_ClassId", SqlDbType.Int,4),
104 108
                     new SqlParameter("@F_CollectionNum", SqlDbType.Int,4),
105 109
                     new SqlParameter("@F_CreateBy", SqlDbType.VarChar,50),
106 110
                     new SqlParameter("@F_CreateTime", SqlDbType.DateTime),
@@ -109,14 +113,15 @@ namespace CallCenterApi.DAL
109 113
                     new SqlParameter("@F_DeleteTime", SqlDbType.DateTime),
110 114
                     new SqlParameter("@F_Id", SqlDbType.Int,4)};
111 115
             parameters[0].Value = model.F_ReplyContent;
112
-            parameters[1].Value = model.F_UseNum;
113
-            parameters[2].Value = model.F_CollectionNum;
114
-            parameters[3].Value = model.F_CreateBy;
115
-            parameters[4].Value = model.F_CreateTime;
116
-            parameters[5].Value = model.F_IsDelete;
117
-            parameters[6].Value = model.F_DeleteBy;
118
-            parameters[7].Value = model.F_DeleteTime;
119
-            parameters[8].Value = model.F_Id;
116
+            parameters[1].Value = model.F_ClassId;
117
+            parameters[2].Value = model.F_UseNum;
118
+            parameters[3].Value = model.F_CollectionNum;
119
+            parameters[4].Value = model.F_CreateBy;
120
+            parameters[5].Value = model.F_CreateTime;
121
+            parameters[6].Value = model.F_IsDelete;
122
+            parameters[7].Value = model.F_DeleteBy;
123
+            parameters[8].Value = model.F_DeleteTime;
124
+            parameters[9].Value = model.F_Id;
120 125
 
121 126
             int rows = DbHelperSQL.ExecuteSql(strSql.ToString(), parameters);
122 127
             if (rows > 0)
@@ -180,7 +185,7 @@ namespace CallCenterApi.DAL
180 185
         {
181 186
 
182 187
             StringBuilder strSql = new StringBuilder();
183
-            strSql.Append("select  top 1 F_Id,F_ReplyContent,F_UseNum,F_CollectionNum,F_CreateBy,F_CreateTime,F_IsDelete,F_DeleteBy,F_DeleteTime from T_Chat_IM_ReplyList ");
188
+            strSql.Append("select  top 1 F_Id,F_ReplyContent,F_ClassId,F_UseNum,F_CollectionNum,F_CreateBy,F_CreateTime,F_IsDelete,F_DeleteBy,F_DeleteTime from T_Chat_IM_ReplyList ");
184 189
             strSql.Append(" where F_Id=@F_Id");
185 190
             SqlParameter[] parameters = {
186 191
                     new SqlParameter("@F_Id", SqlDbType.Int,4)
@@ -216,6 +221,10 @@ namespace CallCenterApi.DAL
216 221
                 {
217 222
                     model.F_ReplyContent = row["F_ReplyContent"].ToString();
218 223
                 }
224
+                if (row["F_ClassId"] != null && row["F_ClassId"].ToString() != "")
225
+                {
226
+                    model.F_ClassId = int.Parse(row["F_ClassId"].ToString());
227
+                }
219 228
                 if (row["F_UseNum"] != null && row["F_UseNum"].ToString() != "")
220 229
                 {
221 230
                     model.F_UseNum = int.Parse(row["F_UseNum"].ToString());
@@ -254,7 +263,7 @@ namespace CallCenterApi.DAL
254 263
         public DataSet GetList(string strWhere)
255 264
         {
256 265
             StringBuilder strSql = new StringBuilder();
257
-            strSql.Append("select F_Id,F_ReplyContent,F_UseNum,F_CollectionNum,F_CreateBy,F_CreateTime,F_IsDelete,F_DeleteBy,F_DeleteTime ");
266
+            strSql.Append("select F_Id,F_ReplyContent,F_ClassId,F_UseNum,F_CollectionNum,F_CreateBy,F_CreateTime,F_IsDelete,F_DeleteBy,F_DeleteTime ");
258 267
             strSql.Append(" FROM T_Chat_IM_ReplyList ");
259 268
             if (strWhere.Trim() != "")
260 269
             {
@@ -274,7 +283,7 @@ namespace CallCenterApi.DAL
274 283
             {
275 284
                 strSql.Append(" top " + Top.ToString());
276 285
             }
277
-            strSql.Append(" F_Id,F_ReplyContent,F_UseNum,F_CollectionNum,F_CreateBy,F_CreateTime,F_IsDelete,F_DeleteBy,F_DeleteTime ");
286
+            strSql.Append(" F_Id,F_ReplyContent,F_ClassId,F_UseNum,F_CollectionNum,F_CreateBy,F_CreateTime,F_IsDelete,F_DeleteBy,F_DeleteTime ");
278 287
             strSql.Append(" FROM T_Chat_IM_ReplyList ");
279 288
             if (strWhere.Trim() != "")
280 289
             {

+ 33 - 24
CallCenterApi/CallCenterApi.DAL/T_Chat_Message.cs

@@ -38,15 +38,16 @@ namespace CallCenterApi.DAL
38 38
         {
39 39
             StringBuilder strSql = new StringBuilder();
40 40
             strSql.Append("insert into T_Chat_Message(");
41
-            strSql.Append("F_FromUser,F_ToUser,F_Message,F_File,F_IP,F_SourceType,F_MessageType,F_State,F_CreateUser,F_CreateTime,F_IsDelete,F_DeleteUser,F_DeleteTime)");
41
+            strSql.Append("F_FromUser,F_ToUser,F_Message,F_File,F_HumanClass,F_IP,F_SourceType,F_MessageType,F_State,F_CreateUser,F_CreateTime,F_IsDelete,F_DeleteUser,F_DeleteTime)");
42 42
             strSql.Append(" values (");
43
-            strSql.Append("@F_FromUser,@F_ToUser,@F_Message,@F_File,@F_IP,@F_SourceType,@F_MessageType,@F_State,@F_CreateUser,@F_CreateTime,@F_IsDelete,@F_DeleteUser,@F_DeleteTime)");
43
+            strSql.Append("@F_FromUser,@F_ToUser,@F_Message,@F_File,@F_HumanClass,@F_IP,@F_SourceType,@F_MessageType,@F_State,@F_CreateUser,@F_CreateTime,@F_IsDelete,@F_DeleteUser,@F_DeleteTime)");
44 44
             strSql.Append(";select @@IDENTITY");
45 45
             SqlParameter[] parameters = {
46 46
                     new SqlParameter("@F_FromUser", SqlDbType.VarChar,500),
47 47
                     new SqlParameter("@F_ToUser", SqlDbType.VarChar,500),
48 48
                     new SqlParameter("@F_Message", SqlDbType.NVarChar,-1),
49 49
                     new SqlParameter("@F_File", SqlDbType.VarChar,-1),
50
+                    new SqlParameter("@F_HumanClass", SqlDbType.Int,4),
50 51
                     new SqlParameter("@F_IP", SqlDbType.VarChar,50),
51 52
                     new SqlParameter("@F_SourceType", SqlDbType.Int,4),
52 53
                     new SqlParameter("@F_MessageType", SqlDbType.Int,4),
@@ -60,15 +61,16 @@ namespace CallCenterApi.DAL
60 61
             parameters[1].Value = model.F_ToUser;
61 62
             parameters[2].Value = model.F_Message;
62 63
             parameters[3].Value = model.F_File;
63
-            parameters[4].Value = model.F_IP;
64
-            parameters[5].Value = model.F_SourceType;
65
-            parameters[6].Value = model.F_MessageType;
66
-            parameters[7].Value = model.F_State;
67
-            parameters[8].Value = model.F_CreateUser;
68
-            parameters[9].Value = model.F_CreateTime;
69
-            parameters[10].Value = model.F_IsDelete;
70
-            parameters[11].Value = model.F_DeleteUser;
71
-            parameters[12].Value = model.F_DeleteTime;
64
+            parameters[4].Value = model.F_HumanClass;
65
+            parameters[5].Value = model.F_IP;
66
+            parameters[6].Value = model.F_SourceType;
67
+            parameters[7].Value = model.F_MessageType;
68
+            parameters[8].Value = model.F_State;
69
+            parameters[9].Value = model.F_CreateUser;
70
+            parameters[10].Value = model.F_CreateTime;
71
+            parameters[11].Value = model.F_IsDelete;
72
+            parameters[12].Value = model.F_DeleteUser;
73
+            parameters[13].Value = model.F_DeleteTime;
72 74
 
73 75
             object obj = DbHelperSQL.GetSingle(strSql.ToString(), parameters);
74 76
             if (obj == null)
@@ -91,6 +93,7 @@ namespace CallCenterApi.DAL
91 93
             strSql.Append("F_ToUser=@F_ToUser,");
92 94
             strSql.Append("F_Message=@F_Message,");
93 95
             strSql.Append("F_File=@F_File,");
96
+            strSql.Append("F_HumanClass=@F_HumanClass,");
94 97
             strSql.Append("F_IP=@F_IP,");
95 98
             strSql.Append("F_SourceType=@F_SourceType,");
96 99
             strSql.Append("F_MessageType=@F_MessageType,");
@@ -106,6 +109,7 @@ namespace CallCenterApi.DAL
106 109
                     new SqlParameter("@F_ToUser", SqlDbType.VarChar,500),
107 110
                     new SqlParameter("@F_Message", SqlDbType.NVarChar,-1),
108 111
                     new SqlParameter("@F_File", SqlDbType.VarChar,-1),
112
+                    new SqlParameter("@F_HumanClass", SqlDbType.Int,4),
109 113
                     new SqlParameter("@F_IP", SqlDbType.VarChar,50),
110 114
                     new SqlParameter("@F_SourceType", SqlDbType.Int,4),
111 115
                     new SqlParameter("@F_MessageType", SqlDbType.Int,4),
@@ -120,16 +124,17 @@ namespace CallCenterApi.DAL
120 124
             parameters[1].Value = model.F_ToUser;
121 125
             parameters[2].Value = model.F_Message;
122 126
             parameters[3].Value = model.F_File;
123
-            parameters[4].Value = model.F_IP;
124
-            parameters[5].Value = model.F_SourceType;
125
-            parameters[6].Value = model.F_MessageType;
126
-            parameters[7].Value = model.F_State;
127
-            parameters[8].Value = model.F_CreateUser;
128
-            parameters[9].Value = model.F_CreateTime;
129
-            parameters[10].Value = model.F_IsDelete;
130
-            parameters[11].Value = model.F_DeleteUser;
131
-            parameters[12].Value = model.F_DeleteTime;
132
-            parameters[13].Value = model.F_Id;
127
+            parameters[4].Value = model.F_HumanClass;
128
+            parameters[5].Value = model.F_IP;
129
+            parameters[6].Value = model.F_SourceType;
130
+            parameters[7].Value = model.F_MessageType;
131
+            parameters[8].Value = model.F_State;
132
+            parameters[9].Value = model.F_CreateUser;
133
+            parameters[10].Value = model.F_CreateTime;
134
+            parameters[11].Value = model.F_IsDelete;
135
+            parameters[12].Value = model.F_DeleteUser;
136
+            parameters[13].Value = model.F_DeleteTime;
137
+            parameters[14].Value = model.F_Id;
133 138
 
134 139
             int rows = DbHelperSQL.ExecuteSql(strSql.ToString(), parameters);
135 140
             if (rows > 0)
@@ -193,7 +198,7 @@ namespace CallCenterApi.DAL
193 198
         {
194 199
 
195 200
             StringBuilder strSql = new StringBuilder();
196
-            strSql.Append("select  top 1 F_Id,F_FromUser,F_ToUser,F_Message,F_File,F_IP,F_SourceType,F_MessageType,F_State,F_CreateUser,F_CreateTime,F_IsDelete,F_DeleteUser,F_DeleteTime from T_Chat_Message ");
201
+            strSql.Append("select  top 1 F_Id,F_FromUser,F_ToUser,F_Message,F_File,F_HumanClass,F_IP,F_SourceType,F_MessageType,F_State,F_CreateUser,F_CreateTime,F_IsDelete,F_DeleteUser,F_DeleteTime from T_Chat_Message ");
197 202
             strSql.Append(" where F_Id=@F_Id");
198 203
             SqlParameter[] parameters = {
199 204
                     new SqlParameter("@F_Id", SqlDbType.BigInt)
@@ -241,6 +246,10 @@ namespace CallCenterApi.DAL
241 246
                 {
242 247
                     model.F_File = row["F_File"].ToString();
243 248
                 }
249
+                if (row["F_HumanClass"] != null && row["F_HumanClass"].ToString() != "")
250
+                {
251
+                    model.F_HumanClass = int.Parse(row["F_HumanClass"].ToString());
252
+                }
244 253
                 if (row["F_IP"] != null)
245 254
                 {
246 255
                     model.F_IP = row["F_IP"].ToString();
@@ -287,7 +296,7 @@ namespace CallCenterApi.DAL
287 296
         public DataSet GetList(string strWhere)
288 297
         {
289 298
             StringBuilder strSql = new StringBuilder();
290
-            strSql.Append("select F_Id,F_FromUser,F_ToUser,F_Message,F_File,F_IP,F_SourceType,F_MessageType,F_State,F_CreateUser,F_CreateTime,F_IsDelete,F_DeleteUser,F_DeleteTime ");
299
+            strSql.Append("select F_Id,F_FromUser,F_ToUser,F_Message,F_File,F_HumanClass,F_IP,F_SourceType,F_MessageType,F_State,F_CreateUser,F_CreateTime,F_IsDelete,F_DeleteUser,F_DeleteTime ");
291 300
             strSql.Append(" FROM T_Chat_Message ");
292 301
             if (strWhere.Trim() != "")
293 302
             {
@@ -307,7 +316,7 @@ namespace CallCenterApi.DAL
307 316
             {
308 317
                 strSql.Append(" top " + Top.ToString());
309 318
             }
310
-            strSql.Append(" F_Id,F_FromUser,F_ToUser,F_Message,F_File,F_IP,F_SourceType,F_MessageType,F_State,F_CreateUser,F_CreateTime,F_IsDelete,F_DeleteUser,F_DeleteTime ");
319
+            strSql.Append(" F_Id,F_FromUser,F_ToUser,F_Message,F_File,F_HumanClass,F_IP,F_SourceType,F_MessageType,F_State,F_CreateUser,F_CreateTime,F_IsDelete,F_DeleteUser,F_DeleteTime ");
311 320
             strSql.Append(" FROM T_Chat_Message ");
312 321
             if (strWhere.Trim() != "")
313 322
             {

+ 10 - 0
CallCenterApi/CallCenterApi.Model/T_Chat_IM_ReplyList.cs

@@ -16,6 +16,7 @@ namespace CallCenterApi.Model
16 16
         { }
17 17
         #region Model
18 18
         private int _f_id;
19
+        private int? _f_classid;
19 20
         private string _f_replycontent;
20 21
         private int? _f_usenum;
21 22
         private int? _f_collectionnum;
@@ -32,6 +33,15 @@ namespace CallCenterApi.Model
32 33
             set { _f_id = value; }
33 34
             get { return _f_id; }
34 35
         }
36
+
37
+        /// <summary>
38
+        /// 分类
39
+        /// </summary>
40
+        public int? F_ClassId
41
+        {
42
+            set { _f_classid = value; }
43
+            get { return _f_classid; }
44
+        }
35 45
         /// <summary>
36 46
         /// 回复内容
37 47
         /// </summary>

+ 9 - 0
CallCenterApi/CallCenterApi.Model/T_Chat_Message.cs

@@ -15,6 +15,7 @@ namespace CallCenterApi.Model
15 15
         private string _f_touser;
16 16
         private string _f_message;
17 17
         private string _f_file;
18
+        private int? _f_humanclass;
18 19
         private string _f_ip;
19 20
         private int? _f_sourcetype;
20 21
         private int? _f_messagetype;
@@ -65,6 +66,14 @@ namespace CallCenterApi.Model
65 66
             get { return _f_file; }
66 67
         }
67 68
         /// <summary>
69
+        /// 发送人(判断图像 0不知 1客服 2客户 3机器人)
70
+        /// </summary>
71
+        public int? F_HumanClass
72
+        {
73
+            set { _f_humanclass = value; }
74
+            get { return _f_humanclass; }
75
+        }
76
+        /// <summary>
68 77
         /// IP
69 78
         /// </summary>
70 79
         public string F_IP

+ 7 - 2
CallCenterCommon/CallCenter.WebChatServer/App.config

@@ -20,9 +20,14 @@
20 20
     <add key="busy" value="客服不在线,请稍后咨询!"/>
21 21
     <!--客户ip是黑名单-->
22 22
     <add key="black" value="当前状态异常,请电话联系!"/>
23
+    
24
+    <!--提示欢迎词(默认)-->
25
+    <add key="welcome" value="你好,见到你很开心"/>
26
+    <!--提示欢迎词时间间隔(秒)-->
27
+    <add key="welcome_maxtime" value="60"/>
23 28
 
24
-    <!--IP获取地址url-->
25
-    <add key="ipurl" value="http://ip.taobao.com/service/getIpInfo2.php"/>
29
+    <!--IP获取地址url 没有用-->
30
+    <!--<add key="ipurl" value="http://ip.taobao.com/service/getIpInfo2.php"/>-->
26 31
   </appSettings>
27 32
 
28 33
   <connectionStrings>

+ 2 - 0
CallCenterCommon/CallCenter.WebChatServer/CallCenter.WebChatServer.csproj

@@ -85,6 +85,7 @@
85 85
     <Reference Include="System" />
86 86
     <Reference Include="System.Configuration" />
87 87
     <Reference Include="System.Core" />
88
+    <Reference Include="System.Web" />
88 89
     <Reference Include="System.Xml.Linq" />
89 90
     <Reference Include="System.Data.DataSetExtensions" />
90 91
     <Reference Include="Microsoft.CSharp" />
@@ -99,6 +100,7 @@
99 100
     <Compile Include="ChatSql.cs" />
100 101
     <Compile Include="Program.cs" />
101 102
     <Compile Include="Properties\AssemblyInfo.cs" />
103
+    <Compile Include="KeywordSpliter.cs" />
102 104
   </ItemGroup>
103 105
   <ItemGroup>
104 106
     <None Include="App.config">

+ 7 - 0
CallCenterCommon/CallCenter.WebChatServer/ChatClass.cs

@@ -45,7 +45,14 @@ namespace CallCenter.WebChatServer
45 45
             public string code { get; set; }
46 46
             public string name { get; set; }
47 47
             public string headimgurl { get; set; }
48
+            /// <summary>
49
+            /// 发送人(判断图像 0不知 1客服 2客户 3机器人)
50
+            /// </summary>
51
+            public int humanclass { get; set; } = 0;
48 52
             public object data { get; set; }
53
+            /// <summary>
54
+            /// 状态(1右边,0中间)
55
+            /// </summary>
49 56
             public int state { get; set; }
50 57
             public string time { get; set; }
51 58
         }

+ 177 - 19
CallCenterCommon/CallCenter.WebChatServer/ChatServer.cs

@@ -10,20 +10,24 @@ using SuperWebSocket;
10 10
 using SuperSocket.SocketBase.Config;
11 11
 using Newtonsoft.Json;
12 12
 using Newtonsoft.Json.Linq;
13
+using System.Threading;
13 14
 
14 15
 namespace CallCenter.WebChatServer
15 16
 {
16 17
     public class ChatServer
17 18
     {
18 19
         WebSocketServer server = new WebSocketServer();
19
-        ChatSql cs = new ChatSql();
20
+        public ChatSql cs = new ChatSql();
20 21
         public List<ChatClass.Servicer> Servicers = new List<ChatClass.Servicer>();
21 22
         public List<ChatClass.Customer> Customers = new List<ChatClass.Customer>();
23
+        private List<ChatSql.T_Chat_Message> Messages = new List<ChatSql.T_Chat_Message>();
22 24
 
23 25
         public ChatServer()
24 26
         {
25 27
         }
26 28
 
29
+        #region 服务初始化管理
30
+
27 31
         /// <summary>
28 32
         /// 初始化服务
29 33
         /// </summary>
@@ -96,7 +100,7 @@ namespace CallCenter.WebChatServer
96 100
         }
97 101
 
98 102
         /// <summary>
99
-        /// 关闭服务
103
+        /// 获取服务状态
100 104
         /// </summary>
101 105
         /// <returns></returns>
102 106
         public ServerState State()
@@ -104,6 +108,8 @@ namespace CallCenter.WebChatServer
104 108
             return server.State;
105 109
         }
106 110
 
111
+        #endregion
112
+
107 113
         /// <summary>
108 114
         /// 接收到消息
109 115
         /// </summary>
@@ -116,6 +122,8 @@ namespace CallCenter.WebChatServer
116 122
                 var ip = session.RemoteEndPoint.Address.ToString();
117 123
                 ChatClass.Message msg = JsonConvert.DeserializeObject<ChatClass.Message>(value);
118 124
                 msg.state = 1;
125
+                msg.humanclass = 0;
126
+
119 127
                 switch (msg.action.ToLower())
120 128
                 {
121 129
                     case "cusconn":
@@ -182,6 +190,7 @@ namespace CallCenter.WebChatServer
182 190
 
183 191
                                 if (Servicers.Count > 0)
184 192
                                 {
193
+                                    // 分配客户给客服
185 194
                                     cus.ServicerSessionID = SplitCustomer(cus);
186 195
                                 }
187 196
 
@@ -239,9 +248,53 @@ namespace CallCenter.WebChatServer
239 248
                                 serntcmsg.msg = cus.Name + " 上线";
240 249
                                 serntcmsg.code = cus.Code;
241 250
                                 serntcmsg.name = cus.Name;
251
+                                //serntcmsg.humanclass = 0;
242 252
                                 serntcmsg.data = ipmodel;
243 253
                                 serntcmsg.state = 0;
244 254
                                 SendMsgToRemotePoint(cus.ServicerSessionID, serntcmsg);
255
+
256
+                                #region 发送消息到 - 欢迎词 IM
257
+                                bool b_cus = false;
258
+                                int maxTime = int.Parse(ConfigurationManager.AppSettings["welcome_maxtime"]);
259
+                                string welcome = ConfigurationManager.AppSettings["welcome"];
260
+                                string MaxDate = cs.GetMessageDateByCode(cus.Code);
261
+                                DateTime NowDate = DateTime.Now;
262
+                                if (string.IsNullOrEmpty(MaxDate))
263
+                                    b_cus = true;
264
+                                else
265
+                                    b_cus = (Convert.ToDateTime(MaxDate)).AddSeconds(maxTime) < NowDate;
266
+                                if (b_cus)
267
+                                {
268
+                                    var sersend = Servicers.Where(p => p.SessionID == cus.ServicerSessionID).FirstOrDefault();
269
+                                    // 欢迎词2
270
+                                    string welcome_Content = cs.GetReplyContenByCId(2);
271
+                                    //serntcmsg.action = "cusreceive";
272
+                                    //serntcmsg.msg = "你好,有什么可以帮你的吗?";
273
+                                    //serntcmsg.code = sersend.Code;  // sersend != null ? sersend.Code : "";
274
+                                    //serntcmsg.name = sersend.Name;  // sersend != null ? sersend.Name : "";
275
+                                    //serntcmsg.headimgurl = sersend != null ? sersend.HeadImgUrl : "";
276
+                                    //serntcmsg.data = "";
277
+                                    //serntcmsg.state = 0;
278
+                                    //SendMsgToRemotePoint(cus.SessionID, serntcmsg);
279
+
280
+                                    ChatSql.T_Chat_Message sermsg = new ChatSql.T_Chat_Message();
281
+                                    sermsg.F_FromUser = sersend == null ? "" : sersend.Code;
282
+                                    sermsg.F_ToUser = cus.Code;
283
+                                    sermsg.F_Message = string.IsNullOrEmpty(welcome_Content) ? welcome : welcome_Content;     //"你好,有什么可以帮你的吗?";
284
+                                    sermsg.F_HumanClass = 3;
285
+                                    sermsg.F_IP = ip;
286
+                                    sermsg.F_SourceType = 1;
287
+                                    sermsg.F_MessageType = 1;
288
+                                    sermsg.F_State = 0;
289
+                                    sermsg.F_IsDelete = 0;
290
+                                    sermsg.F_CreateTime = DateTime.Now;
291
+                                    sermsg.F_CreateUser = sersend == null ? "" : sersend.Code;
292
+
293
+                                    cs.AddMsg(sermsg);
294
+                                }
295
+
296
+
297
+                                #endregion
245 298
                             }
246 299
                             else
247 300
                             {
@@ -249,6 +302,7 @@ namespace CallCenter.WebChatServer
249 302
                                 msg.state = 0;
250 303
                                 msg.msg = "请不要打开多个聊天窗口";
251 304
                             }
305
+
252 306
                         }
253 307
                         else
254 308
                         {
@@ -262,19 +316,81 @@ namespace CallCenter.WebChatServer
262 316
                         if (!cs.IsBlack(ip))
263 317
                         {
264 318
                             var cussend = Customers.Where(p => p.SessionID == session.SessionID).FirstOrDefault();
319
+                            //var serreceive = new ChatClass.Servicer();
265 320
                             if (cussend != null)
266 321
                             {
322
+                                #region 客服发送消息 - 智能机器人IM(客服在线和不在线都要发送和保存)1
323
+                                msg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
324
+                                msg.humanclass = 2;
325
+                                session.Send(JsonConvert.SerializeObject(msg));
326
+
327
+                                #region 客服不在线是发送
328
+                                ChatSql.T_Chat_Message cusmsg = new ChatSql.T_Chat_Message();
329
+                                cusmsg.F_FromUser = cussend.Code;  //msg.code
330
+                                //cusmsg.F_ToUser = "";
331
+                                cusmsg.F_Message = msg.msg;  // "智能机器人IM,能查到很多信息"
332
+                                cusmsg.F_HumanClass = 2;
333
+                                cusmsg.F_IP = ip;
334
+                                cusmsg.F_HumanClass = 2;
335
+                                cusmsg.F_SourceType = 1;
336
+                                cusmsg.F_MessageType = 1;
337
+                                cusmsg.F_State = 0;
338
+                                cusmsg.F_IsDelete = 0;
339
+                                cusmsg.F_CreateTime = DateTime.Now;
340
+                                cusmsg.F_CreateUser = msg.code;
341
+                                //cs.AddMsg(cusmsg);
342
+                                #endregion
343
+
344
+                                #endregion
345
+
346
+
267 347
                                 if (Servicers.Count <= 0)
268 348
                                 {
269 349
                                     cussend.IsSend = 1;
270 350
 
271
-                                    msg.state = 0;
272
-                                    msg.msg = ConfigurationManager.AppSettings["busy"];
351
+                                    //msg.state = 0;
352
+                                    //msg.msg = ConfigurationManager.AppSettings["busy"];
353
+
354
+                                    #region 发送消息->客户 - 智能机器人IM(客服都不在线时发送)                                    
355
+                                    cusmsg.F_ToUser = "";   //客服都不在线
356
+                                    cs.AddMsg(cusmsg);
357
+
358
+                                    // 客服不在线时,启动 智能机器人IM
359
+                                    string strContent = cs.GetSmartRobotByKey(msg.msg);
360
+                                    if (string.IsNullOrEmpty(strContent))
361
+                                        strContent = "抱歉,我已经很努力了,请试试其他信息吧";
362
+                                    Thread.Sleep(500);
363
+                                    ChatClass.Message cusrecmsg = new ChatClass.Message();
364
+                                    cusrecmsg.action = "cusreceive";
365
+                                    cusrecmsg.msg = strContent; // "智能机器人IM,能查到很多信息"
366
+                                    cusrecmsg.humanclass = 3;
367
+                                    cusrecmsg.code = cussend.Code;
368
+                                    cusrecmsg.name = cussend.Name;
369
+                                    cusrecmsg.headimgurl = cussend.HeadImgUrl;
370
+                                    cusrecmsg.state = 0;
371
+                                    if (SendMsgToRemotePoint(cussend.SessionID, cusrecmsg))
372
+                                    {
373
+                                        ChatSql.T_Chat_Message sermsg = new ChatSql.T_Chat_Message();
374
+                                        sermsg.F_FromUser = ""; // serreceive.Code;
375
+                                        sermsg.F_ToUser = cussend.Code;
376
+                                        sermsg.F_Message = strContent;  // "智能机器人IM,能查到很多信息"
377
+                                        sermsg.F_HumanClass = 3;
378
+                                        sermsg.F_IP = ip;
379
+                                        sermsg.F_SourceType = 1;
380
+                                        sermsg.F_MessageType = 1;
381
+                                        sermsg.F_State = 0;
382
+                                        sermsg.F_IsDelete = 0;
383
+                                        sermsg.F_CreateTime = DateTime.Now;
384
+                                        sermsg.F_CreateUser = cussend.Code;
385
+                                        cs.AddMsg(sermsg);
386
+                                    }
387
+                                    #endregion
273 388
                                 }
274 389
                                 else
275 390
                                 {
276 391
                                     if (string.IsNullOrEmpty(cussend.ServicerSessionID))
277 392
                                     {
393
+                                        // 分配客户给客服
278 394
                                         cussend.ServicerSessionID = SplitCustomer(cussend);
279 395
                                     }
280 396
                                     ChatClass.Message serrecmsg = new ChatClass.Message();
@@ -283,24 +399,29 @@ namespace CallCenter.WebChatServer
283 399
                                     serrecmsg.code = cussend.Code;
284 400
                                     serrecmsg.name = cussend.Name;
285 401
                                     serrecmsg.headimgurl = cussend.HeadImgUrl;
402
+                                    serrecmsg.humanclass = 2;
286 403
                                     serrecmsg.state = 1;
404
+
287 405
                                     if (SendMsgToRemotePoint(cussend.ServicerSessionID, serrecmsg))
288 406
                                     {
289
-                                        var serreceive = Servicers.Where(p => p.SessionID == cussend.ServicerSessionID).FirstOrDefault();
290 407
 
291
-                                        ChatSql.T_Chat_Message cusmsg = new ChatSql.T_Chat_Message();
292
-                                        cusmsg.F_FromUser = cussend.Code;
293
-                                        cusmsg.F_ToUser = serreceive.Code;
294
-                                        cusmsg.F_Message = msg.msg;
295
-                                        cusmsg.F_IP = ip;
296
-                                        cusmsg.F_SourceType = 1;
297
-                                        cusmsg.F_MessageType = 1;
298
-                                        cusmsg.F_State = 0;
299
-                                        cusmsg.F_IsDelete = 0;
300
-                                        cusmsg.F_CreateTime = DateTime.Now;
301
-                                        cusmsg.F_CreateUser = serreceive.Code;
408
+                                        var serreceive = Servicers.Where(p => p.SessionID == cussend.ServicerSessionID).FirstOrDefault();
302 409
 
410
+                                        cusmsg.F_ToUser = serreceive.Code;  //客服都在线
303 411
                                         cs.AddMsg(cusmsg);
412
+
413
+                                        //ChatSql.T_Chat_Message cusmsg = new ChatSql.T_Chat_Message();
414
+                                        //cusmsg.F_FromUser = cussend.Code;
415
+                                        //cusmsg.F_ToUser = serreceive.Code;
416
+                                        //cusmsg.F_Message = msg.msg;
417
+                                        //cusmsg.F_IP = ip;
418
+                                        //cusmsg.F_SourceType = 1;
419
+                                        //cusmsg.F_MessageType = 1;
420
+                                        //cusmsg.F_State = 0;
421
+                                        //cusmsg.F_IsDelete = 0;
422
+                                        //cusmsg.F_CreateTime = DateTime.Now;
423
+                                        //cusmsg.F_CreateUser = serreceive.Code;
424
+                                        //cs.AddMsg(cusmsg);                                        
304 425
                                     }
305 426
                                     else
306 427
                                     {
@@ -312,6 +433,7 @@ namespace CallCenter.WebChatServer
312 433
                                         msg.state = 0;
313 434
                                         msg.msg = "发送失败";
314 435
                                     }
436
+                                    
315 437
                                 }
316 438
                             }
317 439
                             else
@@ -446,6 +568,7 @@ namespace CallCenter.WebChatServer
446 568
                             recmsg.code = sersend.Code;
447 569
                             recmsg.name = sersend.Name;
448 570
                             recmsg.headimgurl = sersend.HeadImgUrl;
571
+                            recmsg.humanclass = 1;
449 572
 
450 573
                             if (SendMsgToRemotePoint(cusreceive.SessionID, recmsg))
451 574
                             {
@@ -453,6 +576,7 @@ namespace CallCenter.WebChatServer
453 576
                                 sermsg.F_FromUser = sersend.Code;
454 577
                                 sermsg.F_ToUser = cusreceive.Code;
455 578
                                 sermsg.F_Message = msg.msg;
579
+                                sermsg.F_HumanClass = 1;
456 580
                                 sermsg.F_IP = ip;
457 581
                                 sermsg.F_SourceType = 1;
458 582
                                 sermsg.F_MessageType = 1;
@@ -462,6 +586,35 @@ namespace CallCenter.WebChatServer
462 586
                                 sermsg.F_CreateUser = sersend.Code;
463 587
 
464 588
                                 cs.AddMsg(sermsg);
589
+
590
+                                #region 发送消息到 - 智能机器人IM
591
+
592
+                                //ChatClass.Message cusrecmsg = new ChatClass.Message();
593
+                                //cusrecmsg.action = "cusreceive";
594
+                                //cusrecmsg.msg = "智能机器人IM,能查到很多信息222";
595
+                                //cusrecmsg.code = sersend.Code;
596
+                                //cusrecmsg.name = sersend.Name;
597
+                                //cusrecmsg.headimgurl = sersend.HeadImgUrl;
598
+                                //cusrecmsg.state = 0;
599
+                                //if (SendMsgToRemotePoint(cusreceive.SessionID, cusrecmsg))
600
+                                //{
601
+                                //    //var cussend = Customers.Where(p => p.SessionID == cussend.SessionID).FirstOrDefault();
602
+
603
+                                //    ChatSql.T_Chat_Message sermsg1 = new ChatSql.T_Chat_Message();
604
+                                //    sermsg1.F_FromUser = sersend.Code;
605
+                                //    sermsg1.F_ToUser = cusreceive.Code;
606
+                                //    sermsg1.F_Message = "智能机器人IM,能查到很多信息222";
607
+                                //    sermsg1.F_IP = ip;
608
+                                //    sermsg1.F_SourceType = 1;
609
+                                //    sermsg1.F_MessageType = 1;
610
+                                //    sermsg1.F_State = 0;
611
+                                //    sermsg1.F_IsDelete = 0;
612
+                                //    sermsg1.F_CreateTime = DateTime.Now;
613
+                                //    sermsg1.F_CreateUser = sersend.Code;
614
+
615
+                                //    cs.AddMsg(sermsg);
616
+                                //}
617
+                                #endregion
465 618
                             }
466 619
                             else
467 620
                             {
@@ -501,6 +654,7 @@ namespace CallCenter.WebChatServer
501 654
                             recmsg.code = cuss.Code;
502 655
                             recmsg.name = cuss.Name;
503 656
                             recmsg.headimgurl = cuss.HeadImgUrl;
657
+                            recmsg.humanclass = 1;
504 658
                             recmsg.state = 0;
505 659
 
506 660
                             if (SendMsgToRemotePoint(cuss.SessionID, recmsg))
@@ -539,6 +693,7 @@ namespace CallCenter.WebChatServer
539 693
                             recmsg.code = sers.Code;
540 694
                             recmsg.name = sers.Name;
541 695
                             recmsg.headimgurl = sers.HeadImgUrl;
696
+                            recmsg.humanclass = 2;
542 697
                             recmsg.state = 0;
543 698
 
544 699
                             if (SendMsgToRemotePoint(sers.SessionID, recmsg))
@@ -593,6 +748,7 @@ namespace CallCenter.WebChatServer
593 748
                             newmsg.msg = yser.Name + " 转移给你 " + scus.Name;
594 749
                             newmsg.code = scus.Code;
595 750
                             newmsg.name = scus.Name;
751
+                            newmsg.humanclass = 2;
596 752
                             newmsg.state = 0;
597 753
                             SendMsgToRemotePoint(scus.ServicerSessionID, newmsg);//向客服发送客户转移通知
598 754
                         }
@@ -612,19 +768,19 @@ namespace CallCenter.WebChatServer
612 768
                         break;
613 769
 
614 770
                 }
615
-                if (msg.action.ToLower() != "serconn")
771
+                if (msg.action.ToLower() != "serconn" && msg.action.ToLower() != "cussend")
616 772
                 {
617 773
                     msg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
618 774
                     session.Send(JsonConvert.SerializeObject(msg));
619 775
                 }
620 776
             }
621
-            catch
777
+            catch(Exception ex)
622 778
             {
623 779
                 try
624 780
                 {
625 781
                     ChatClass.Message msg = JsonConvert.DeserializeObject<ChatClass.Message>(value);
626 782
                     msg.state = 0;
627
-                    msg.msg = "操作失败";
783
+                    msg.msg = "操作失败:"+ ex.Message;
628 784
                     msg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
629 785
                     session.Send(JsonConvert.SerializeObject(msg));
630 786
                 }
@@ -654,6 +810,7 @@ namespace CallCenter.WebChatServer
654 810
                 msg.name = ses.Name;
655 811
                 msg.state = 0;
656 812
                 msg.msg = ses.Name+" 下线";
813
+                //msg.humanclass = 0;
657 814
                 SendMsgToRemotePoint(ses.ServicerSessionID, msg);
658 815
 
659 816
                 cs.UpdateOutTime(ses.Code);
@@ -679,6 +836,7 @@ namespace CallCenter.WebChatServer
679 836
                             newmsg.msg = ses1.Name + " 下线," + cus.Name + " 转移给你";
680 837
                             newmsg.code = cus.Code;
681 838
                             newmsg.name = cus.Name;
839
+                            //newmsg.humanclass = 0;
682 840
                             newmsg.state = 0;
683 841
                             SendMsgToRemotePoint(cus.ServicerSessionID, newmsg);//向客服发送客户转移通知
684 842
                         }

+ 95 - 14
CallCenterCommon/CallCenter.WebChatServer/ChatSql.cs

@@ -135,15 +135,16 @@ namespace CallCenter.WebChatServer
135 135
         {
136 136
             StringBuilder strSql = new StringBuilder();
137 137
             strSql.Append("insert into T_Chat_Message(");
138
-            strSql.Append("F_FromUser,F_ToUser,F_Message,F_File,F_IP,F_SourceType,F_MessageType,F_State,F_CreateUser,F_CreateTime,F_IsDelete,F_DeleteUser,F_DeleteTime)");
138
+            strSql.Append("F_FromUser,F_ToUser,F_Message,F_File,F_HumanClass,F_IP,F_SourceType,F_MessageType,F_State,F_CreateUser,F_CreateTime,F_IsDelete,F_DeleteUser,F_DeleteTime)");
139 139
             strSql.Append(" values (");
140
-            strSql.Append("@F_FromUser,@F_ToUser,@F_Message,@F_File,@F_IP,@F_SourceType,@F_MessageType,@F_State,@F_CreateUser,@F_CreateTime,@F_IsDelete,@F_DeleteUser,@F_DeleteTime)");
140
+            strSql.Append("@F_FromUser,@F_ToUser,@F_Message,@F_File,@F_HumanClass,@F_IP,@F_SourceType,@F_MessageType,@F_State,@F_CreateUser,@F_CreateTime,@F_IsDelete,@F_DeleteUser,@F_DeleteTime)");
141 141
             strSql.Append(";select @@IDENTITY");
142 142
             SqlParameter[] parameters = {
143 143
                     new SqlParameter("@F_FromUser", SqlDbType.VarChar,500),
144 144
                     new SqlParameter("@F_ToUser", SqlDbType.VarChar,500),
145 145
                     new SqlParameter("@F_Message", SqlDbType.NVarChar,-1),
146 146
                     new SqlParameter("@F_File", SqlDbType.VarChar,-1),
147
+                    new SqlParameter("@F_HumanClass", SqlDbType.Int,4),
147 148
                     new SqlParameter("@F_IP", SqlDbType.VarChar,50),
148 149
                     new SqlParameter("@F_SourceType", SqlDbType.Int,4),
149 150
                     new SqlParameter("@F_MessageType", SqlDbType.Int,4),
@@ -157,15 +158,16 @@ namespace CallCenter.WebChatServer
157 158
             parameters[1].Value = model.F_ToUser;
158 159
             parameters[2].Value = model.F_Message;
159 160
             parameters[3].Value = model.F_File;
160
-            parameters[4].Value = model.F_IP;
161
-            parameters[5].Value = model.F_SourceType;
162
-            parameters[6].Value = model.F_MessageType;
163
-            parameters[7].Value = model.F_State;
164
-            parameters[8].Value = model.F_CreateUser;
165
-            parameters[9].Value = model.F_CreateTime;
166
-            parameters[10].Value = model.F_IsDelete;
167
-            parameters[11].Value = model.F_DeleteUser;
168
-            parameters[12].Value = model.F_DeleteTime;
161
+            parameters[4].Value = model.F_HumanClass;
162
+            parameters[5].Value = model.F_IP;
163
+            parameters[6].Value = model.F_SourceType;
164
+            parameters[7].Value = model.F_MessageType;
165
+            parameters[8].Value = model.F_State;
166
+            parameters[9].Value = model.F_CreateUser;
167
+            parameters[10].Value = model.F_CreateTime;
168
+            parameters[11].Value = model.F_IsDelete;
169
+            parameters[12].Value = model.F_DeleteUser;
170
+            parameters[13].Value = model.F_DeleteTime;
169 171
 
170 172
             object obj = DbHelperSQL.GetSingle(strSql.ToString(), parameters);
171 173
             if (obj == null)
@@ -353,6 +355,20 @@ namespace CallCenter.WebChatServer
353 355
         }
354 356
 
355 357
         /// <summary>
358
+        /// 获取最近记录的时间
359
+        /// </summary>
360
+        /// <returns></returns>
361
+        public string GetMessageDateByCode(string code)
362
+        {
363
+            string sql = "select MAX(F_CreateTime) from T_Chat_Message where (F_FromUser='" + code + "' or F_ToUser='" + code + "')";
364
+            object obj = DbHelperSQL.GetSingle(sql);
365
+            if (obj == null)
366
+                return "";
367
+            else
368
+                return obj.ToString();
369
+        }
370
+
371
+        /// <summary>
356 372
         /// 获取客户信息
357 373
         /// </summary>
358 374
         /// <returns></returns>
@@ -533,7 +549,7 @@ namespace CallCenter.WebChatServer
533 549
         public string GetUserName(string usercode)
534 550
         {
535 551
             string sql = "select F_UserName  from T_Sys_UserAccount where F_UserCode='" + usercode + "'";
536
-            string name = DbHelperSQL.GetSingle(sql).ToString();
552
+            string name = DbHelperSQL.GetSingle(sql).ToString();           
537 553
             return name;
538 554
         }
539 555
 
@@ -599,6 +615,60 @@ namespace CallCenter.WebChatServer
599 615
             }
600 616
         }
601 617
 
618
+        #region 快速回复 - 例如:欢迎词,结束语,常用语等
619
+
620
+        /// <summary>
621
+        /// 获取最近记录的时间
622
+        /// </summary>
623
+        /// <returns></returns>
624
+        public string GetReplyContenByCId(int classid)
625
+        {
626
+            string sql = "SELECT TOP 1 F_ReplyContent FROM dbo.T_Chat_IM_ReplyList WHERE  F_IsDelete = 0 AND F_ClassId=" + classid + " ";
627
+            object obj = DbHelperSQL.GetSingle(sql);
628
+            if (obj == null)
629
+                return "";
630
+            else
631
+                return obj.ToString();
632
+        }
633
+        #endregion
634
+
635
+        #region 智能机器人 - 关键词
636
+
637
+        /// <summary>
638
+        /// 获取最近记录的时间
639
+        /// </summary>
640
+        /// <returns></returns>
641
+        public string GetSmartRobotByKey(string keyword)
642
+        {
643
+            string keyWords = KeywordSpliter.DoGetKeyword(keyword);
644
+            string[] sArrayKey = keyWords.Trim().Split(',');
645
+            string sqlStr = "";
646
+            object obj = null;
647
+
648
+            foreach (string key in sArrayKey)
649
+            {
650
+                if (key.Trim() != "")
651
+                    sqlStr += " or F_KeyWord like '%" + key + "%'";
652
+            }
653
+            if (!string.IsNullOrEmpty(sqlStr))
654
+            {
655
+                // 去掉前面的or,且拼接()
656
+                StringBuilder sb = new StringBuilder(sqlStr);
657
+                sb.Replace(" or ", " AND (", 0, 4);
658
+                sqlStr = sb.ToString();
659
+                sqlStr += ")";
660
+                string sql = "SELECT TOP 1 F_Content FROM dbo.T_Chat_IM_SmartRobot WHERE 1=1 AND F_IsDelete = 0 AND F_State = 1 " + sqlStr + " ";
661
+                obj = DbHelperSQL.GetSingle(sql);
662
+            }            
663
+            if (obj == null)
664
+                return "";
665
+            else
666
+                return obj.ToString();
667
+        }
668
+        #endregion
669
+
670
+        #region 对象 类
671
+
602 672
         /// <summary>
603 673
         /// 客户类
604 674
         /// </summary>
@@ -760,6 +830,7 @@ namespace CallCenter.WebChatServer
760 830
             private string _f_message;
761 831
             private string _f_file;
762 832
             private string _f_ip;
833
+            private int? _f_humanclass = 0;
763 834
             private int? _f_sourcetype;
764 835
             private int? _f_messagetype;
765 836
             private int? _f_state;
@@ -809,6 +880,14 @@ namespace CallCenter.WebChatServer
809 880
                 get { return _f_file; }
810 881
             }
811 882
             /// <summary>
883
+            /// 发送人(判断图像 0不知 1客服 2客户 3机器人)
884
+            /// </summary>
885
+            public int? F_HumanClass
886
+            {
887
+                set { _f_humanclass = value; }
888
+                get { return _f_humanclass; }
889
+            }
890
+            /// <summary>
812 891
             /// IP
813 892
             /// </summary>
814 893
             public string F_IP
@@ -825,7 +904,7 @@ namespace CallCenter.WebChatServer
825 904
                 get { return _f_sourcetype; }
826 905
             }
827 906
             /// <summary>
828
-            /// 消息类型
907
+            /// 消息类型(1文字消息,2列表消息,3图片/视频/语音)
829 908
             /// </summary>
830 909
             public int? F_MessageType
831 910
             {
@@ -1104,7 +1183,7 @@ namespace CallCenter.WebChatServer
1104 1183
                 get { return _f_outtime; }
1105 1184
             }
1106 1185
             /// <summary>
1107
-            /// 
1186
+            /// 用户类型(1客服,2游客)
1108 1187
             /// </summary>
1109 1188
             public int? F_Type
1110 1189
             {
@@ -1114,5 +1193,7 @@ namespace CallCenter.WebChatServer
1114 1193
             #endregion Model
1115 1194
 
1116 1195
         }
1196
+        #endregion
1197
+
1117 1198
     }
1118 1199
 }

+ 392 - 0
CallCenterCommon/CallCenter.WebChatServer/KeywordSpliter.cs

@@ -0,0 +1,392 @@
1
+using System;
2
+using System.Collections;
3
+using System.Collections.Generic;
4
+using System.IO;
5
+using System.Linq;
6
+using System.Text;
7
+using System.Text.RegularExpressions;
8
+using System.Threading.Tasks;
9
+
10
+namespace CallCenter.WebChatServer
11
+{
12
+    public class KeywordSpliter
13
+    {
14
+        #region 属性
15
+        private static string _SplitChar = " ";//分隔符
16
+
17
+        //用于移除停止词
18
+        private readonly static string[] _StopWordsList = new string[] { "的", "我们", "要", "自己", "之", "将", "“", "”", ",", "(", ")", "后", "应", "到", "某", "后", "个", "是", "位", "新", "一", "两", "在", "中", "或", "有", "更", "好" };
19
+        #endregion
20
+
21
+        //加载keywords_default.dic文本文件数据缓存
22
+        private static SortedList _KeywordsCacheDefault = null;
23
+
24
+        //加载keywords_baidu.dic文本文件数据缓存,自定义dic文件(百度关键词,或自定义关键词)
25
+        private static SortedList _KeywordsCacheBaidu = null;
26
+
27
+        /// <summary>
28
+        /// 得到分词关键字,以逗号隔开
29
+        /// </summary>
30
+        /// <param name="keyText"></param>
31
+        /// <returns></returns>
32
+        public static string DoGetKeyword(string keyText)
33
+        {
34
+            if (String.IsNullOrEmpty(keyText)) return "";
35
+
36
+            LoadDict();
37
+            LoadDictBaidu();
38
+
39
+            #region 默认词库分词
40
+            StringBuilder sb = new StringBuilder();
41
+            ArrayList _key = SplitToList(keyText);
42
+            Dictionary<string, int> distinctDict = SortByDuplicateCount(_key);
43
+            foreach (KeyValuePair<string, int> pair in distinctDict)
44
+            {
45
+                sb.Append(pair.Key + ",");
46
+            }
47
+            #endregion
48
+
49
+            #region 添加百度关键词,或自定义关键词
50
+            //若是单个长词关键词, 添加百度关键词,或自定义关键词
51
+            //bool baidu = _KeywordsCacheBaidu.ContainsKey(keyText);
52
+            if (!distinctDict.ContainsKey(keyText) && _KeywordsCacheBaidu.ContainsKey(keyText))
53
+            {
54
+                sb.Insert(0, keyText + ",");//前置关键词,seo较好
55
+            }
56
+            else //枚举自定义词库
57
+            {
58
+                string value;
59
+                foreach (DictionaryEntry key in _KeywordsCacheBaidu)
60
+                {
61
+                    value = key.Value.ToString();
62
+                    if (keyText.IndexOf(value) >= 0 && !distinctDict.ContainsKey(value))
63
+                        sb.Insert(0, value + ",");//前置关键词,seo较好
64
+                }
65
+            }
66
+            #endregion
67
+
68
+            return sb.ToString();
69
+        }
70
+
71
+        //
72
+        #region 读取文本
73
+
74
+        private static SortedList LoadDictFile(string FilePath)
75
+        {
76
+            Encoding encoding = Encoding.GetEncoding("utf-8");
77
+            SortedList arrText = new SortedList();
78
+            //
79
+            try
80
+            {
81
+                if (!File.Exists(FilePath))
82
+                {
83
+                    arrText.Add("0", "文件" + FilePath + "不存在...");
84
+                }
85
+                else
86
+                {
87
+                    StreamReader objReader = new StreamReader(FilePath, encoding);
88
+                    string sLine = "";
89
+                    while (sLine != null)
90
+                    {
91
+                        sLine = objReader.ReadLine();
92
+                        if (!String.IsNullOrEmpty(sLine))
93
+                            arrText.Add(sLine, sLine);
94
+                    }
95
+
96
+                    objReader.Close();
97
+                    objReader.Dispose();
98
+                }
99
+            }
100
+            catch (Exception ex)
101
+            {
102
+            }
103
+
104
+            return arrText;
105
+        }
106
+
107
+
108
+        #endregion
109
+
110
+        #region 载入词典
111
+
112
+        /// <summary>
113
+        /// 加载字典文件,并缓存到变量
114
+        /// </summary>
115
+        /// <returns></returns>
116
+        private static SortedList LoadDict()
117
+        {
118
+            string filePath = GetPhysicalFilePath("keywords_default.dic");
119
+            if (_KeywordsCacheDefault == null) _KeywordsCacheDefault = LoadDictFile(filePath);
120
+            return _KeywordsCacheDefault;
121
+        }
122
+
123
+        private static SortedList LoadDictBaidu()
124
+        {
125
+            string filePath = GetPhysicalFilePath("keywords_baidu.dic");
126
+            if (_KeywordsCacheBaidu == null) _KeywordsCacheBaidu = LoadDictFile(filePath);
127
+            return _KeywordsCacheBaidu;
128
+        }
129
+
130
+        /// <summary>
131
+        /// 获取物理文件路径
132
+        /// </summary>
133
+        /// <param name="dictFileName">文件名,如:keywords_baidu.dic</param>
134
+        /// <returns></returns>
135
+        /// <returns></returns>
136
+        private static string GetPhysicalFilePath(string dictFileName)
137
+        {
138
+            //判断是Web服务器环境
139
+            if (System.Web.HttpContext.Current != null)
140
+            {
141
+                string filePath = System.Web.HttpContext.Current.Server.MapPath("~/bin/" + dictFileName);
142
+                return filePath;
143
+            }
144
+            else//其他环境,Winform环境
145
+            {
146
+                string dir = Path.GetDirectoryName(typeof(KeywordSpliter).Assembly.Location);
147
+                string filePath = Path.Combine(dir, dictFileName);
148
+                return filePath;
149
+            }
150
+        }
151
+
152
+        #endregion
153
+
154
+        //
155
+        #region 正则检测
156
+        private static bool IsMatch(string str, string reg)
157
+        {
158
+            return new Regex(reg).IsMatch(str);
159
+        }
160
+        #endregion
161
+        //
162
+        #region 首先格式化字符串(粗分)
163
+        private static string FormatStr(string val)
164
+        {
165
+            string result = "";
166
+            if (val == null || val == "")
167
+                return "";
168
+            //
169
+            char[] CharList = val.ToCharArray();
170
+            //
171
+            string Spc = _SplitChar;//分隔符
172
+            int StrLen = CharList.Length;
173
+            int CharType = 0; //0-空白 1-英文 2-中文 3-符号
174
+                              //
175
+            for (int i = 0; i < StrLen; i++)
176
+            {
177
+                string StrList = CharList[i].ToString();
178
+                if (StrList == null || StrList == "")
179
+                    continue;
180
+                //
181
+                if (CharList[i] < 0x81)
182
+                {
183
+                    #region
184
+                    if (CharList[i] < 33)
185
+                    {
186
+                        if (CharType != 0 && StrList != "\n" && StrList != "\r")
187
+                        {
188
+                            result += " ";
189
+                            CharType = 0;
190
+                        }
191
+                        continue;
192
+                    }
193
+                    else if (IsMatch(StrList, "[^0-9a-zA-Z@\\.%#:/\\&_-]"))//排除这些字符
194
+                    {
195
+                        if (CharType == 0)
196
+                            result += StrList;
197
+                        else
198
+                            result += Spc + StrList;
199
+                        CharType = 3;
200
+                    }
201
+                    else
202
+                    {
203
+                        if (CharType == 2 || CharType == 3)
204
+                        {
205
+                            result += Spc + StrList;
206
+                            CharType = 1;
207
+                        }
208
+                        else
209
+                        {
210
+                            if (IsMatch(StrList, "[@%#:]"))
211
+                            {
212
+                                result += StrList;
213
+                                CharType = 3;
214
+                            }
215
+                            else
216
+                            {
217
+                                result += StrList;
218
+                                CharType = 1;
219
+                            }//end if No.4
220
+                        }//end if No.3
221
+                    }//end if No.2
222
+                    #endregion
223
+                }//if No.1
224
+                else
225
+                {
226
+                    //如果上一个字符为非中文和非空格,则加一个空格
227
+                    if (CharType != 0 && CharType != 2)
228
+                        result += Spc;
229
+                    //如果是中文标点符号
230
+                    if (!IsMatch(StrList, "^[\u4e00-\u9fa5]+$"))
231
+                    {
232
+                        if (CharType != 0)
233
+                            result += Spc + StrList;
234
+                        else
235
+                            result += StrList;
236
+                        CharType = 3;
237
+                    }
238
+                    else //中文
239
+                    {
240
+                        result += StrList;
241
+                        CharType = 2;
242
+                    }
243
+                }
244
+                //end if No.1
245
+
246
+            }//exit for
247
+             //
248
+            return result;
249
+        }
250
+        #endregion
251
+        //
252
+        #region 分词
253
+        /// <summary>
254
+        /// 分词
255
+        /// </summary>
256
+        /// <param name="key">关键词</param>
257
+        /// <returns></returns>
258
+        private static ArrayList StringSpliter(string[] key)
259
+        {
260
+            ArrayList List = new ArrayList();
261
+            try
262
+            {
263
+                SortedList dict = LoadDict();//载入词典
264
+                                             //
265
+                for (int i = 0; i < key.Length; i++)
266
+                {
267
+                    if (IsMatch(key[i], @"^(?!^\.$)([a-zA-Z0-9\.\u4e00-\u9fa5]+)$")) //中文、英文、数字
268
+                    {
269
+                        if (IsMatch(key[i], "^[\u4e00-\u9fa5]+$"))//如果是纯中文
270
+                        {
271
+                            int keyLen = key[i].Length;
272
+                            if (keyLen < 2)
273
+                                continue;
274
+                            else if (keyLen <= 7)
275
+                                List.Add(key[i]);
276
+                            //
277
+                            //开始分词
278
+                            for (int x = 0; x < keyLen; x++)
279
+                            {
280
+                                //x:起始位置//y:结束位置
281
+                                for (int y = x; y < keyLen; y++)
282
+                                {
283
+                                    string val = key[i].Substring(x, keyLen - y);
284
+                                    if (val == null || val.Length < 2)
285
+                                        break;
286
+                                    else if (val.Length > 10)
287
+                                        continue;
288
+                                    if (dict.Contains(val))
289
+                                        List.Add(val);
290
+                                }
291
+                                //
292
+                            }
293
+                            //
294
+                        }
295
+                        else if (!IsMatch(key[i], @"^(\.*)$"))//不全是小数点
296
+                        {
297
+                            List.Add(key[i]);
298
+                        }
299
+                    }
300
+                }
301
+            }
302
+            catch (Exception ex)
303
+            {
304
+
305
+            }
306
+            return List;
307
+        }
308
+        #endregion
309
+
310
+        #region 得到分词结果
311
+
312
+        /// <summary>
313
+        /// 得到分词结果
314
+        /// </summary>
315
+        /// <param name="keyText"></param>
316
+        /// <returns></returns>
317
+        private static ArrayList SplitToList(string keyText)
318
+        {
319
+            ArrayList KeyList = StringSpliter(FormatStr(keyText).Split(_SplitChar.ToCharArray()));
320
+
321
+            //去掉没用的词
322
+            for (int i = 0; i < KeyList.Count; i++)
323
+            {
324
+                if (IsStopword(KeyList[i].ToString()))
325
+                {
326
+                    KeyList.RemoveAt(i);
327
+                }
328
+            }
329
+
330
+            return KeyList;
331
+        }
332
+
333
+        /// <summary>
334
+        /// 把一个集合按重复次数排序
335
+        /// </summary>
336
+        /// <param name="inputList"></param>
337
+        /// <returns></returns>
338
+        private static Dictionary<string, int> SortByDuplicateCount(ArrayList inputList)
339
+        {
340
+            //用于计算每个元素出现的次数,key是元素,value是出现次数
341
+            Dictionary<string, int> distinctDict = new Dictionary<string, int>();
342
+            for (int i = 0; i < inputList.Count; i++)
343
+            {
344
+
345
+                //这里没用trygetvalue,会计算两次hash
346
+                if (distinctDict.ContainsKey(inputList[i].ToString()))
347
+                    distinctDict[inputList[i].ToString()]++;
348
+                else
349
+                    distinctDict.Add(inputList[i].ToString(), 1);
350
+            }
351
+
352
+            Dictionary<string, int> sortByValueDict = GetSortByValueDict(distinctDict);
353
+            return sortByValueDict;
354
+        }
355
+
356
+        /// <summary>
357
+        /// 把一个字典value的顺序排序
358
+        /// </summary>
359
+        /// <typeparam name="K"></typeparam>
360
+        /// <typeparam name="V"></typeparam>
361
+        /// <param name="distinctDict"></param>
362
+        /// <returns></returns>
363
+        private static Dictionary<K, V> GetSortByValueDict<K, V>(IDictionary<K, V> distinctDict)
364
+        {
365
+            //用于给tempDict.Values排序的临时数组
366
+            V[] tempSortList = new V[distinctDict.Count];
367
+            distinctDict.Values.CopyTo(tempSortList, 0);
368
+            Array.Sort(tempSortList); //给数据排序
369
+            Array.Reverse(tempSortList);//反转
370
+
371
+            //用于保存按value排序的字典
372
+            Dictionary<K, V> sortByValueDict = new Dictionary<K, V>(distinctDict.Count);
373
+            for (int i = 0; i < tempSortList.Length; i++)
374
+            {
375
+                foreach (KeyValuePair<K, V> pair in distinctDict)
376
+                {
377
+                    //比较两个泛型是否相当要用Equals,不能用==操作符
378
+                    if (pair.Value.Equals(tempSortList[i]) && !sortByValueDict.ContainsKey(pair.Key))
379
+                        sortByValueDict.Add(pair.Key, pair.Value);
380
+                }
381
+            }
382
+            return sortByValueDict;
383
+        }
384
+
385
+        #endregion
386
+
387
+        private static bool IsStopword(string str)
388
+        {
389
+            return _StopWordsList.Contains(str);
390
+        }
391
+    }
392
+}

+ 5 - 1
CallCenterCommon/CallCenter.WebChatServer/Program.cs

@@ -10,8 +10,12 @@ namespace CallCenter.WebChatServer
10 10
     {
11 11
         static void Main(string[] args)
12 12
         {
13
-            ChatServer sr = new ChatServer();
13
+            ////测试案例 - 关键词
14
+            //string strContent = new ChatSql().GetSmartRobotByKey("商丘是国家历史文化名城");
15
+            //Console.WriteLine(strContent + "\r\n");
16
+            //Console.ReadKey();
14 17
 
18
+            ChatServer sr = new ChatServer();
15 19
             if (sr.Setup())
16 20
             {
17 21
                 bind();

binární
CallCenterCommon/CallCenter.WebChatServer/bin/Debug/CallCenter.WebChatServer.pdb


+ 13 - 0
CallCenterCommon/CallCenter.WebChatServer/bin/Debug/keywords_baidu.dic

@@ -0,0 +1,13 @@
1
+你好
2
+物业
3
+快速
4
+开发
5
+系统
6
+新闻
7
+呼叫系统
8
+呼叫
9
+简介
10
+支付
11
+产品
12
+公司
13
+地址

+ 5 - 0
CallCenterCommon/CallCenter.WebChatServer/bin/keywords_baidu.dic

@@ -0,0 +1,5 @@
1
+你好
2
+物业
3
+快速
4
+开发
5
+系统

+ 4 - 0
项目其他/sql/T_Chat_IM_ReplyList.sql

@@ -15,6 +15,7 @@ GO
15 15
 
16 16
 CREATE TABLE [dbo].[T_Chat_IM_ReplyList](
17 17
 	[F_Id] [int] IDENTITY(1,1) NOT NULL,
18
+	[F_ClassId] [int] NULL,
18 19
 	[F_ReplyContent] [nvarchar](500) NOT NULL,
19 20
 	[F_UseNum] [int] NULL,
20 21
 	[F_CollectionNum] [int] NULL,
@@ -37,6 +38,9 @@ GO
37 38
 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'id' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'T_Chat_IM_ReplyList', @level2type=N'COLUMN',@level2name=N'F_Id'
38 39
 GO
39 40
 
41
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'·ÖÀà' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'T_Chat_IM_ReplyList', @level2type=N'COLUMN',@level2name=N'F_ClassId'
42
+GO
43
+
40 44
 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'»Ø¸´ÄÚÈÝ' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'T_Chat_IM_ReplyList', @level2type=N'COLUMN',@level2name=N'F_ReplyContent'
41 45
 GO
42 46
 

+ 5 - 1
项目其他/sql/T_Chat_Message.sql

@@ -1,7 +1,7 @@
1 1
 USE [IM12345]
2 2
 GO
3 3
 
4
-/****** Object:  Table [dbo].[T_Chat_Message]    Script Date: 03/05/2020 12:36:28 ******/
4
+/****** Object:  Table [dbo].[T_Chat_Message]    Script Date: 03/11/2020 10:51:23 ******/
5 5
 SET ANSI_NULLS ON
6 6
 GO
7 7
 
@@ -26,6 +26,7 @@ CREATE TABLE [dbo].[T_Chat_Message](
26 26
 	[F_IsDelete] [int] NULL,
27 27
 	[F_DeleteUser] [varchar](50) NULL,
28 28
 	[F_DeleteTime] [datetime] NULL,
29
+	[F_HumanClass] [int] NULL,
29 30
 PRIMARY KEY CLUSTERED 
30 31
 (
31 32
 	[F_Id] ASC
@@ -61,4 +62,7 @@ GO
61 62
 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'状态' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'T_Chat_Message', @level2type=N'COLUMN',@level2name=N'F_State'
62 63
 GO
63 64
 
65
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'发送人(判断图像 0不知 1客服 2客户 3机器人)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'T_Chat_Message', @level2type=N'COLUMN',@level2name=N'F_HumanClass'
66
+GO
67
+
64 68