Commit 8f5f946d authored by 吴春's avatar 吴春

1

parent 4433dfa8
using Edu.Common.Plugin;
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.Enum.AI
{
/// <summary>
/// 供应商分类
/// </summary>
public enum SupplierTypeEnum
{
/// <summary>
/// ChatGPT
/// </summary>
[EnumField("ChatGPT")]
OpenAI = 1,
/// <summary>
/// 有道云
/// </summary>
[EnumField("有道云")]
YouDaoNote = 2,
}
}
using System;
using System.Text;
using System.Security.Cryptography;
using System.Collections.Generic;
namespace Edu.Common.YouDao
{
public class AuthV3Util
{
/*
添加鉴权相关参数 -
appKey : 应用ID
salt : 随机值
curtime : 当前时间戳(秒)
signType : 签名版本
sign : 请求签名
@param appKey 您的应用ID
@param appSecret 您的应用密钥
@param paramsMap 请求参数表
*/
public static void addAuthParams(string appKey, string appSecret, Dictionary<string, string[]> paramsMap)
{
string q = "";
string[] qArray;
if (paramsMap.ContainsKey("q"))
{
qArray = paramsMap["q"];
}
else
{
qArray = paramsMap["img"];
}
foreach (var item in qArray)
{
q += item;
}
string salt = System.Guid.NewGuid().ToString();
string curtime = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds() + "";
string sign = calculateSign(appKey, appSecret, q, salt, curtime);
paramsMap.Add("appKey", new string[] { appKey });
paramsMap.Add("salt", new string[] { salt });
paramsMap.Add("curtime", new string[] { curtime });
paramsMap.Add("signType", new string[] { "v3" });
paramsMap.Add("sign", new string[] { sign });
}
/*
计算鉴权签名 -
计算方式 : sign = sha256(appKey + input(q) + salt + curtime + appSecret)
@param appKey 您的应用ID
@param appSecret 您的应用密钥
@param q 请求内容
@param salt 随机值
@param curtime 当前时间戳(秒)
@return 鉴权签名sign
*/
public static string calculateSign(string appKey, string appSecret, string q, string salt, string curtime)
{
string strSrc = appKey + getInput(q) + salt + curtime + appSecret;
return encrypt(strSrc);
}
private static string encrypt(string strSrc)
{
Byte[] inputBytes = Encoding.UTF8.GetBytes(strSrc);
HashAlgorithm algorithm = new SHA256CryptoServiceProvider();
Byte[] hashedBytes = algorithm.ComputeHash(inputBytes);
return BitConverter.ToString(hashedBytes).Replace("-", "");
}
private static string getInput(string q)
{
if (q == null)
{
return "";
}
int len = q.Length;
return len <= 20 ? q : q.Substring(0, 10) + len + q.Substring(len - 10, 10);
}
}
}
using System;
using System.Text;
using System.Security.Cryptography;
using System.Collections.Generic;
namespace Edu.Common.YouDao
{
public class AuthV4Util
{
/*
添加v4鉴权相关参数 -
appKey : 应用ID
salt : 随机值
curtime : 当前时间戳(秒)
signType : 签名版本
sign : 请求签名
@param appKey 您的应用ID
@param appSecret 您的应用密钥
@param paramsMap 请求参数表
*/
public static void addAuthParams(string appKey, string appSecret, Dictionary<string, string[]> paramsMap)
{
string salt = System.Guid.NewGuid().ToString();
string curtime = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds() + "";
string sign = calculateSign(appKey, appSecret, salt, curtime);
paramsMap.Add("appKey", new string[] { appKey });
paramsMap.Add("salt", new string[] { salt });
paramsMap.Add("curtime", new string[] { curtime });
paramsMap.Add("signType", new string[] { "v4" });
paramsMap.Add("sign", new string[] { sign });
}
/*
计算v4鉴权签名 -
计算方式 : sign = sha256(appKey + salt + curtime + appSecret)
@param appKey 您的应用ID
@param appSecret 您的应用密钥
@param salt 随机值
@param curtime 当前时间戳(秒)
@return 鉴权签名sign
*/
public static string calculateSign(string appKey, string appSecret, string salt, string curtime)
{
string strSrc = appKey + salt + curtime + appSecret;
return encrypt(strSrc);
}
private static string encrypt(string strSrc)
{
Byte[] inputBytes = Encoding.UTF8.GetBytes(strSrc);
HashAlgorithm algorithm = new SHA256CryptoServiceProvider();
Byte[] hashedBytes = algorithm.ComputeHash(inputBytes);
return BitConverter.ToString(hashedBytes).Replace("-", "");
}
}
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
namespace Edu.Common.YouDao
{
public class HttpUtil
{
public static byte[] doGet(string url, Dictionary<String, String[]> header, Dictionary<String, String[]> param, string expectContentType)
{
try
{
StringBuilder content = new StringBuilder();
content.Append(url);
using (HttpClient client = new HttpClient())
{
if (param != null)
{
content.Append("?");
int i = 0;
foreach (var p in param)
{
foreach (var v in p.Value)
{
if (i > 0)
{
content.Append("&");
}
content.AppendFormat("{0}={1}", p.Key, System.Web.HttpUtility.UrlEncode(v));
i++;
}
}
}
if (header != null)
{
client.DefaultRequestHeaders.Clear();
foreach (var h in header)
{
foreach (var v in h.Value)
{
client.DefaultRequestHeaders.TryAddWithoutValidation(h.Key, v);
}
}
}
var res = client.GetAsync(content.ToString()).Result;
IEnumerable<string> contentTypeHeader;
var suc = res.Content.Headers.TryGetValues("Content-Type", out contentTypeHeader);
if (suc && !((string[])contentTypeHeader)[0].Contains(expectContentType))
{
Console.WriteLine(res.Content.ReadAsStringAsync().Result);
return null;
}
return res.Content.ReadAsByteArrayAsync().Result;
}
}
catch (Exception ex)
{
Console.WriteLine("http request error: " + ex);
return null;
}
}
public static byte[] doPost(string url, Dictionary<String, String[]> header, Dictionary<String, String[]> param, string expectContentType)
{
try
{
StringBuilder content = new StringBuilder();
using (HttpClient client = new HttpClient())
{
if (param != null)
{
int i = 0;
foreach (var p in param)
{
foreach (var v in p.Value)
{
if (i > 0)
{
content.Append("&");
}
content.AppendFormat("{0}={1}", p.Key, System.Web.HttpUtility.UrlEncode(v));
i++;
}
}
}
var para = new StringContent(content.ToString());
if (header != null)
{
para.Headers.Clear();
foreach (var h in header)
{
foreach (var v in h.Value)
{
para.Headers.Add(h.Key, v);
}
}
}
var res = client.PostAsync(url, para).Result;
IEnumerable<string> contentTypeHeader;
var suc = res.Content.Headers.TryGetValues("Content-Type", out contentTypeHeader);
if (suc && !((string[])contentTypeHeader)[0].Contains(expectContentType))
{
Console.WriteLine(res.Content.ReadAsStringAsync().Result);
return null;
}
return res.Content.ReadAsByteArrayAsync().Result;
}
}
catch (Exception ex)
{
Console.WriteLine("http request error: " + ex);
return null;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Net.WebSockets;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace Edu.Common.YouDao
{
public class WebsocketUtil
{
// 初始化websocket连接
private static ClientWebSocket? client;
public static Task initConnection(string url)
{
var client = new ClientWebSocket();
client.ConnectAsync(new Uri(url), CancellationToken.None).Wait();
WebsocketUtil.client = client;
// 监听返回结果
return messageHandler(client);
}
public static Task initConnectionWithParams(string url, Dictionary<String, String[]> paramsMap)
{
StringBuilder content = new StringBuilder();
content.Append(url);
if (paramsMap != null)
{
content.Append("?");
int i = 0;
foreach (var p in paramsMap)
{
foreach (var v in p.Value)
{
if (i > 0)
{
content.Append("&");
}
content.AppendFormat("{0}={1}", p.Key, System.Web.HttpUtility.UrlEncode(v));
i++;
}
}
}
return initConnection(content.ToString());
}
// 发送text message
public static void sendTextMessage(string textMsg)
{
if (WebsocketUtil.client == null || WebsocketUtil.client.State != WebSocketState.Open)
{
throw new Exception("websocket connection not established");
}
byte[] bytes = Encoding.UTF8.GetBytes(textMsg);
WebsocketUtil.client.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Text, true, CancellationToken.None);
Console.WriteLine("send text message: " + textMsg);
}
// 发送binary message
public static void sendBinaryMessage(byte[] binaryMessage)
{
if (WebsocketUtil.client == null || WebsocketUtil.client.State != WebSocketState.Open)
{
throw new Exception("websocket connection not established");
}
WebsocketUtil.client.SendAsync(new ArraySegment<byte>(binaryMessage), WebSocketMessageType.Binary, true, CancellationToken.None);
Console.WriteLine("send binary message length: " + binaryMessage.Length);
}
public static async Task messageHandler(ClientWebSocket client)
{
string msg = "";
while (true)
{
while (client == null || client.State != WebSocketState.Open)
{
Thread.Sleep(1000);
}
var buffer = new byte[1024 * 1024];
var message = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (message.MessageType == WebSocketMessageType.Text)
{
var res = Encoding.UTF8.GetString(buffer, 0, message.Count);
// 消息过大时可能接收不全
if (!res.Contains("\"errorCode\""))
{
msg += res;
continue;
}
msg += res;
Console.WriteLine("received text message: " + msg);
msg = "";
if (!res.Contains("\"errorCode\":\"0\""))
{
client.Dispose();
break;
}
}
else if (message.MessageType == WebSocketMessageType.Binary)
{
Console.WriteLine("received binary message length: " + message.Count);
}
else if (message.MessageType == WebSocketMessageType.Close)
{
Console.WriteLine("connection closed.");
break;
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
namespace Edu.Common.YouDao
{
/// <summary>
/// 返回信息
/// </summary>
public class YouDaoHelper
{
public static Dictionary<String, String[]> createRequestParams(string keyWord = "")
{
// note: 将下列变量替换为需要请求的参数
// 取值参考文档: https://ai.youdao.com/DOCSIRMA/html/%E4%BD%9C%E6%96%87%E6%89%B9%E6%94%B9/API%E6%96%87%E6%A1%A3/%E8%8B%B1%E8%AF%AD%E4%BD%9C%E6%96%87%E6%89%B9%E6%94%B9%EF%BC%88%E5%9B%BE%E5%83%8F%E8%AF%86%E5%88%AB%EF%BC%89/%E8%8B%B1%E8%AF%AD%E4%BD%9C%E6%96%87%E6%89%B9%E6%94%B9%EF%BC%88%E5%9B%BE%E5%83%8F%E8%AF%86%E5%88%AB%EF%BC%89-API%E6%96%87%E6%A1%A3.html
return new Dictionary<string, string[]>() {
{ "q", new string[]{keyWord}},
};
}
public static string readFileAsBaes64_V2(string path)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);
byte[] bytes;
using (Stream stream = request.GetResponse().GetResponseStream())
{
using (MemoryStream mstream = new MemoryStream())
{
int count = 0;
byte[] buffer = new byte[1024];
int readNum = 0;
while ((readNum = stream.Read(buffer, 0, 1024)) > 0)
{
count = count + readNum;
mstream.Write(buffer, 0, readNum);
}
mstream.Position = 0;
using (BinaryReader br = new BinaryReader(mstream))
{
bytes = br.ReadBytes(count);
}
}
}
return Convert.ToBase64String(bytes);
}
/// <summary>
/// 判断远程文件是否存在
/// </summary>
/// <param name="fileUrl"></param>
/// <returns></returns>
public static bool RemoteFileExists(string fileUrl)
{
HttpWebRequest re = null;
HttpWebResponse res = null;
try
{
re = (HttpWebRequest)WebRequest.Create(fileUrl);
res = (HttpWebResponse)re.GetResponse();
if (res.ContentLength != 0)
{
return true;
}
}
catch (Exception ex)
{
}
return false;
}
public static string readFileAsBaes64(string path)
{
try
{
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
using (BinaryReader br = new BinaryReader(fs))
{
var length = br.BaseStream.Length;
var bytes = br.ReadBytes((int)length);
return Convert.ToBase64String(bytes);
}
}
catch
{
Console.WriteLine("read file error");
return null;
}
}
}
}
using Edu.Common.Enum;
using System;
using System.Collections.Generic;
using System.Text;
using VT.FW.DB;
namespace Edu.Model.Entity.AI
{
/// <summary>
/// AI应用授权实体类
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_AI_AuthorizeStudent
{
/// <summary>
/// 编号
/// </summary>
public int ID { get; set; }
/// <summary>
/// 学生id
/// </summary>
public int StudentId { get; set; }
/// <summary>
/// 预设应用id
/// </summary>
public int ApplicationId { get; set; }
/// <summary>
/// 1-有有效期,2-永久
/// </summary>
public int DateType { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime StartDate { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime EndDate { get; set; }
/// <summary>
/// 创建人
/// </summary>
public int CreateBy { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 修改人
/// </summary>
public int UpdateBy { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime UpdateTime { get; set; }
/// <summary>
/// 学校Id
/// </summary>
public int School_Id { get; set; }
/// <summary>
/// 集团编号
/// </summary>
public int Group_Id { get; set; }
/// <summary>
/// 删除状态
/// </summary>
public DateStateEnum Status { get; set; }
}
}
using Edu.Common.Enum;
using System;
using System.Collections.Generic;
using System.Text;
using VT.FW.DB;
namespace Edu.Model.Entity.AI
{
/// <summary>
/// AI预设应用实体类
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_AI_PresetsApplication
{
/// <summary>
/// 编号
/// </summary>
public int ID { get; set; }
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// /LOGO
/// </summary>
public string Logo { get; set; }
/// <summary>
/// 预制内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 适用范围
/// </summary>
public string Range { get; set; }
/// <summary>
/// 适用地区
/// </summary>
public string Area { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Describe { get; set; }
/// <summary>
/// 供应商id
/// </summary>
public int SupplierId { get; set; }
/// <summary>
/// 创建人
/// </summary>
public int CreateBy { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 修改人
/// </summary>
public int UpdateBy { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime UpdateTime { get; set; }
/// <summary>
/// 学校Id
/// </summary>
public int School_Id { get; set; }
/// <summary>
/// 集团编号
/// </summary>
public int Group_Id { get; set; }
/// <summary>
/// 删除状态
/// </summary>
public DateStateEnum Status { get; set; }
/// <summary>
/// 是否启用 1-启用,2-禁用
/// </summary>
public int Enable { get; set; }
}
}
using Edu.Common.Enum;
using Edu.Common.Enum.AI;
using System;
using System.Collections.Generic;
using System.Text;
using VT.FW.DB;
namespace Edu.Model.Entity.AI
{
/// <summary>
/// AI供应商实体类
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_AI_Supplier
{
/// <summary>
/// 编号
/// </summary>
public int ID { get; set; }
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// /LOGO
/// </summary>
public string Logo { get; set; }
/// <summary>
/// 供应商分类
/// </summary>
public SupplierTypeEnum SupplierType { get; set; }
/// <summary>
/// 基础配置信息
/// </summary>
public string BasicConfigure { get; set; }
/// <summary>
/// 创建人
/// </summary>
public int CreateBy { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 修改人
/// </summary>
public int UpdateBy { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime UpdateTime { get; set; }
/// <summary>
/// 学校Id
/// </summary>
public int School_Id { get; set; }
/// <summary>
/// 集团编号
/// </summary>
public int Group_Id { get; set; }
/// <summary>
/// 删除状态
/// </summary>
public DateStateEnum Status { get; set; }
/// <summary>
/// 是否启用 1-启用,2-禁用
/// </summary>
public int Enable { get; set; }
}
}
using Edu.Common.Enum;
using Edu.Common.Enum.AI;
using System;
using System.Collections.Generic;
using System.Text;
using VT.FW.DB;
namespace Edu.Model.Entity.AI
{
/// <summary>
/// AI调用记录实体类
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_AI_UseLog
{
/// <summary>
/// 编号
/// </summary>
public int ID { get; set; }
/// <summary>
/// 供应商Id
/// </summary>
public int SupplierId { get; set; }
/// <summary>
/// 学生id
/// </summary>
public int StudentId { get; set; }
/// <summary>
/// 扣费
/// </summary>
public string Charging { get; set; }
/// <summary>
/// token数量
/// </summary>
public string TokenNum { get; set; }
/// <summary>
/// 创建人
/// </summary>
public int CreateBy { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 学校Id
/// </summary>
public int School_Id { get; set; }
/// <summary>
/// 集团编号
/// </summary>
public int Group_Id { get; set; }
/// <summary>
/// 删除状态
/// </summary>
public DateStateEnum Status { get; set; }
}
}
using Edu.Model.Entity.AI;
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Model.ViewModel.AI
{
/// <summary>
/// 应用授权扩展表
/// </summary>
public class RB_AI_AuthorizeStudent_ViewModel : RB_AI_AuthorizeStudent
{
/// <summary>
/// 应用名称
/// </summary>
public string PresetsApplicationName { get; set; }
/// <summary>
/// 供应商id
/// </summary>
public int SupplierId { get; set; }
/// <summary>
/// 学生名称
/// </summary>
public string StuName { get; set; }
/// <summary>
/// 是否启用 1-启用,2-禁用
/// </summary>
public int Enable { get; set; }
/// <summary>
/// =1 查询有效的应用
/// </summary>
public int IsEffective { get; set; }
}
}
using Edu.Model.Entity.AI;
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Model.ViewModel.AI
{
/// <summary>
/// 预设应用扩展表
/// </summary>
public class RB_AI_PresetsApplication_ViewModel : RB_AI_PresetsApplication
{
/// <summary>
/// 供应商名称
/// </summary>
public string SupplierName { get; set; }
/// <summary>
/// 供应商启用/禁用状态1-启用,2-禁用
/// </summary>
public int SEnable { get; set; }
}
}
using Edu.Model.Entity.AI;
using System;
using System.Collections.Generic;
using System.Text;
using VT.FW.DB;
namespace Edu.Model.ViewModel.AI
{
/// <summary>
/// AI供应商扩展类
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_AI_Supplier_ViewModel : RB_AI_Supplier
{
/// <summary>
/// 配置基础信息
/// </summary>
public object BasicConfigureModel { get; set; }
}
public class BasicConfigureModel
{
/// <summary>
/// apikey
/// </summary>
public string ApiKey { get; set; }
}
}
using Edu.Model.Entity.AI;
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Model.ViewModel.AI
{
/// <summary>
/// 调用记录扩展类
/// </summary>
public class RB_AI_UseLog_ViewModel : RB_AI_UseLog
{
/// <summary>
/// 供应商名称
/// </summary>
public string SupplierName { get; set; }
/// <summary>
/// 学生名称
/// </summary>
public string StuName { get; set; }
}
}
using Edu.Common.Enum;
using Edu.Common.Plugin;
using Edu.Model.Entity.AI;
using Edu.Model.ViewModel.AI;
using Edu.Model.ViewModel.Grade;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using VT.FW.DB.Dapper;
namespace Edu.Repository.AI
{
/// <summary>
/// 应用授权仓储层
/// </summary>
public class RB_AI_AuthorizeStudentRepository : BaseRepository<RB_AI_AuthorizeStudent>
{
/// <summary>
/// 获取AI应用授权列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_AI_AuthorizeStudent_ViewModel> GetAIAuthorizeStudentList(RB_AI_AuthorizeStudent_ViewModel query)
{
StringBuilder builder = new StringBuilder();
var parameters = new DynamicParameters();
builder.AppendFormat(@" SELECT A.*,b.StuName ,c.Name as PresetsApplicationName,c.SupplierId FROM RB_AI_AuthorizeStudent as A left join rb_student as b on a.StudentId= b.StuId
left join RB_AI_PresetsApplication as c on a.ApplicationId= c.ID WHERE 1=1 ");
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_AuthorizeStudent_ViewModel.Status), (int)DateStateEnum.Normal);
builder.AppendFormat(" AND c.{0}={1} ", nameof(RB_AI_PresetsApplication.Status), (int)DateStateEnum.Normal);
if (query != null)
{
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_AuthorizeStudent_ViewModel.Group_Id), query.Group_Id);
}
if (query.ID > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_AuthorizeStudent_ViewModel.ID), query.ID);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_AuthorizeStudent_ViewModel.School_Id), query.School_Id);
}
if (query.Enable > 0)
{
builder.AppendFormat(" AND C.{0}={1} ", nameof(RB_AI_PresetsApplication.Enable), query.Enable);
}
if (query.StudentId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_AuthorizeStudent_ViewModel.StudentId), query.StudentId);
}
if (query.ApplicationId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_AuthorizeStudent_ViewModel.ApplicationId), query.ApplicationId);
}
if (query.IsEffective == 1)
{
builder.AppendFormat(" AND (A.{0}=2 or (A.{0} =1 AND DATE_FORMAT('{1}','%y-%m-%d')>=DATE_FORMAT(A.{2},'%y-%m-%d') AND DATE_FORMAT('{1}','%y-%m-%d')<=DATE_FORMAT(A.{3},'%y-%m-%d')) ) ", nameof(RB_AI_AuthorizeStudent_ViewModel.DateType), StringHelper.FormatDate(DateTime.Now), nameof(RB_AI_AuthorizeStudent_ViewModel.StartDate) , nameof(RB_AI_AuthorizeStudent_ViewModel.EndDate));
}
//if (!string.IsNullOrEmpty(query.StartTime))
//{
// where.AppendFormat(" AND DATE_FORMAT(A.{0},'%y-%m-%d')>=DATE_FORMAT('{1}','%y-%m-%d') ", nameof(RB_Class_Plan_ViewModel.ClassDate), query.StartTime);
//}
//if (!string.IsNullOrEmpty(query.EndTime))
//{
// where.AppendFormat(" AND DATE_FORMAT(A.{0},'%y-%m-%d')<=DATE_FORMAT('{1}','%y-%m-%d') ", nameof(RB_Class_Plan_ViewModel.ClassDate), query.EndTime);
//}
}
return Get<RB_AI_AuthorizeStudent_ViewModel>(builder.ToString(), parameters).ToList();
}
/// <summary>
/// 获取AI应用授权分页列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_AI_AuthorizeStudent_ViewModel> GetAIAuthorizeStudentPageList(int pageIndex, int pageSize, out long rowsCount, RB_AI_AuthorizeStudent_ViewModel query)
{
StringBuilder builder = new StringBuilder();
var parameters = new DynamicParameters();
builder.AppendFormat(@" SELECT A.*,b.StuName ,c.Name as PresetsApplicationName ,c.SupplierId FROM RB_AI_AuthorizeStudent as A left join rb_student as b on a.StudentId= b.StuId
left join RB_AI_PresetsApplication as c on a.ApplicationId= c.ID WHERE 1=1 ");
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_AuthorizeStudent_ViewModel.Status), (int)DateStateEnum.Normal);
builder.AppendFormat(" AND c.{0}={1} ", nameof(RB_AI_PresetsApplication.Status), (int)DateStateEnum.Normal);
if (query != null)
{
if (query.ID > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_AuthorizeStudent_ViewModel.ID), query.ID);
}
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_AuthorizeStudent_ViewModel.Group_Id), query.Group_Id);
}
if (query.Enable > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_PresetsApplication.Enable), query.Enable);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_AuthorizeStudent_ViewModel.School_Id), query.School_Id);
}
if (query.StudentId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_AuthorizeStudent_ViewModel.StudentId), query.StudentId);
}
if (query.ApplicationId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_AuthorizeStudent_ViewModel.ApplicationId), query.ApplicationId);
}
}
return GetPage<RB_AI_AuthorizeStudent_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString(), parameters).ToList();
}
}
}
using Edu.Common.Enum;
using Edu.Model.Entity.AI;
using Edu.Model.ViewModel.AI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using VT.FW.DB.Dapper;
namespace Edu.Repository.AI
{
/// <summary>
/// 预设应用仓储类
/// </summary>
public class RB_AI_PresetsApplicationRepository : BaseRepository<RB_AI_PresetsApplication>
{
/// <summary>
/// 获取AI预设应用列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_AI_PresetsApplication_ViewModel> GetAIPresetsApplicationList(RB_AI_PresetsApplication_ViewModel query)
{
StringBuilder builder = new StringBuilder();
var parameters = new DynamicParameters();
builder.AppendFormat(@" SELECT A.*,b.Name as SupplierName, b.Enable as SEnable FROM RB_AI_PresetsApplication as A left join RB_AI_Supplier as b on a.SupplierId=b.Id WHERE 1=1 ");
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_PresetsApplication_ViewModel.Status), (int)DateStateEnum.Normal);
if (query != null)
{
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_PresetsApplication_ViewModel.Group_Id), query.Group_Id);
}
if (query.ID > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_PresetsApplication_ViewModel.ID), query.ID);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_PresetsApplication_ViewModel.School_Id), query.School_Id);
}
if (query.SupplierId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_PresetsApplication_ViewModel.SupplierId), query.SupplierId);
}
if (query.Enable > 0)
{
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_PresetsApplication_ViewModel.Enable), query.Enable);
}
if (!string.IsNullOrWhiteSpace(query.Name))
{
builder.AppendFormat(" AND A.{0} LIKE @Name ", nameof(RB_AI_PresetsApplication_ViewModel.Name));
parameters.Add("Name", "%" + query.Name.Trim() + "%");
}
}
return Get<RB_AI_PresetsApplication_ViewModel>(builder.ToString(), parameters).ToList();
}
/// <summary>
/// 获取AI预设应用分页列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_AI_PresetsApplication_ViewModel> GetAIPresetsApplicationPageList(int pageIndex, int pageSize, out long rowsCount, RB_AI_PresetsApplication_ViewModel query)
{
StringBuilder builder = new StringBuilder();
var parameters = new DynamicParameters();
builder.AppendFormat(@" SELECT A.*,b.Name as SupplierName FROM RB_AI_PresetsApplication as A left join RB_AI_Supplier as b on a.SupplierId=b.Id WHERE 1=1 ");
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_PresetsApplication_ViewModel.Status), (int)DateStateEnum.Normal);
if (query != null)
{
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_PresetsApplication_ViewModel.Group_Id), query.Group_Id);
}
if (query.ID > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_PresetsApplication_ViewModel.ID), query.ID);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_PresetsApplication_ViewModel.School_Id), query.School_Id);
}
if (query.SupplierId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_PresetsApplication_ViewModel.SupplierId), query.SupplierId);
}
if (query.Enable > 0)
{
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_PresetsApplication_ViewModel.Enable), query.Enable);
}
if (!string.IsNullOrWhiteSpace(query.Name))
{
builder.AppendFormat(" AND A.{0} LIKE @Name ", nameof(RB_AI_PresetsApplication_ViewModel.Name));
parameters.Add("Name", "%" + query.Name.Trim() + "%");
}
}
return GetPage<RB_AI_PresetsApplication_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString(), parameters).ToList();
}
}
}
using Edu.Common.Enum;
using Edu.Model.Entity.AI;
using Edu.Model.ViewModel.AI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using VT.FW.DB.Dapper;
namespace Edu.Repository.AI
{
/// <summary>
/// AI供应商仓储层
/// </summary>
public class RB_AI_SupplierRepository : BaseRepository<RB_AI_Supplier>
{
/// <summary>
/// 获取AI供应商列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_AI_Supplier_ViewModel> GetAISupplierList(RB_AI_Supplier_ViewModel query)
{
StringBuilder builder = new StringBuilder();
var parameters = new DynamicParameters();
builder.AppendFormat(@" SELECT * FROM RB_AI_Supplier WHERE 1=1 ");
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_Supplier_ViewModel.Status), (int)DateStateEnum.Normal);
if (query != null)
{
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_Supplier_ViewModel.Group_Id), query.Group_Id);
}
if (query.ID > 0)
{
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_Supplier_ViewModel.ID), query.ID);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_Supplier_ViewModel.School_Id), query.School_Id);
}
if (query.Enable > 0)
{
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_Supplier_ViewModel.Enable), query.Enable);
}
if (query.SupplierType > 0)
{
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_Supplier_ViewModel.SupplierType), (int)query.SupplierType);
}
if (!string.IsNullOrWhiteSpace(query.Name))
{
builder.AppendFormat(" AND {0} LIKE @Name ", nameof(RB_AI_Supplier_ViewModel.Name));
parameters.Add("Name", "%" + query.Name.Trim() + "%");
}
}
return Get<RB_AI_Supplier_ViewModel>(builder.ToString(), parameters).ToList();
}
/// <summary>
/// 获取AI供应商分页列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_AI_Supplier_ViewModel> GetAISupplierPageList(int pageIndex, int pageSize, out long rowsCount, RB_AI_Supplier_ViewModel query)
{
StringBuilder builder = new StringBuilder();
var parameters = new DynamicParameters();
builder.AppendFormat(@" SELECT * FROM RB_AI_Supplier WHERE 1=1 ");
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_Supplier_ViewModel.Status), (int)DateStateEnum.Normal);
if (query != null)
{
if (query.ID > 0)
{
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_Supplier_ViewModel.ID), query.ID);
}
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_Supplier_ViewModel.Group_Id), query.Group_Id);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_Supplier_ViewModel.School_Id), query.School_Id);
}
if (query.SupplierType > 0)
{
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_Supplier_ViewModel.SupplierType), (int)query.SupplierType);
}
if (query.Enable > 0)
{
builder.AppendFormat(" AND {0}={1} ", nameof(RB_AI_Supplier_ViewModel.Enable), query.Enable);
}
if (!string.IsNullOrWhiteSpace(query.Name))
{
builder.AppendFormat(" AND {0} LIKE @Name ", nameof(RB_AI_Supplier_ViewModel.Name));
parameters.Add("Name", "%" + query.Name.Trim() + "%");
}
}
return GetPage<RB_AI_Supplier_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString(), parameters).ToList();
}
}
}
using Edu.Common.Enum;
using Edu.Model.Entity.AI;
using Edu.Model.ViewModel.AI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using VT.FW.DB.Dapper;
namespace Edu.Repository.AI
{
/// <summary>
/// 调用记录仓储类
/// </summary>
public class RB_AI_UseLogRepository : BaseRepository<RB_AI_UseLog>
{
/// <summary>
/// 获取AI调用记录列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_AI_UseLog_ViewModel> GetAIUseLogList(RB_AI_UseLog_ViewModel query)
{
StringBuilder builder = new StringBuilder();
var parameters = new DynamicParameters();
builder.AppendFormat(@" SELECT A.*,b.Name as SupplierName FROM RB_AI_UseLog as A left join RB_AI_Supplier as b on a.SupplierId=b.Id
left join rb_student as c on a.StudentId= c.StuId WHERE 1=1 ");
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_UseLog_ViewModel.Status), (int)DateStateEnum.Normal);
if (query != null)
{
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_UseLog_ViewModel.Group_Id), query.Group_Id);
}
if (query.ID > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_UseLog_ViewModel.ID), query.ID);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_UseLog_ViewModel.School_Id), query.School_Id);
}
if (query.SupplierId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_UseLog_ViewModel.SupplierId), query.SupplierId);
}
if (query.StudentId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_UseLog_ViewModel.StudentId), query.StudentId);
}
}
return Get<RB_AI_UseLog_ViewModel>(builder.ToString(), parameters).ToList();
}
/// <summary>
/// 获取AI调用记录分页列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_AI_UseLog_ViewModel> GetAIUseLogPageList(int pageIndex, int pageSize, out long rowsCount, RB_AI_UseLog_ViewModel query)
{
StringBuilder builder = new StringBuilder();
var parameters = new DynamicParameters();
builder.AppendFormat(@" SELECT A.*,b.Name as SupplierName FROM RB_AI_UseLog as A left join RB_AI_Supplier as b on a.SupplierId=b.Id
left join rb_student as c on a.StudentId= c.StuId WHERE 1=1 ");
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_UseLog_ViewModel.Status), (int)DateStateEnum.Normal);
if (query != null)
{
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_UseLog_ViewModel.Group_Id), query.Group_Id);
}
if (query.ID > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_UseLog_ViewModel.ID), query.ID);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_UseLog_ViewModel.School_Id), query.School_Id);
}
if (query.SupplierId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_UseLog_ViewModel.SupplierId), query.SupplierId);
}
if (query.StudentId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_AI_UseLog_ViewModel.StudentId), query.StudentId);
}
}
return GetPage<RB_AI_UseLog_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString(), parameters).ToList();
}
}
}
This diff is collapsed.
using Edu.Common.API;
using Edu.Common.Plugin;
using Edu.Model.ViewModel.AI;
using Edu.Module.User;
using Edu.WebApi.Filter;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Org.BouncyCastle.Asn1.Cmp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Ubiety.Dns.Core;
using OpenAI_API;
using OpenAI_API.Completions;
using Microsoft.AspNetCore.Authorization;
using System.IO;
using Spire.Pdf.Exporting.XPS.Schema;
using Edu.Common.YouDao;
using Newtonsoft.Json.Linq;
using System.Net;
using System.Security.Policy;
using Polly.Caching;
using System.IO.Compression;
using SharpCompress.Common;
using System.Collections;
using System.Reflection;
namespace Edu.WebApi.Controllers.AI
{
[Route("api/[controller]/[action]")]
[ApiExceptionFilter]
[ApiController]
[EnableCors("AllowCors")]
public class AIStudentController : AppletBaseController
{
/// <summary>
/// AI供应商处理类
/// </summary>
private readonly AIModule aiModule = new AIModule();
/// <summary>
/// 根据学生id获取对应的应用
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetAuthorizeStudentBySIdList()
{
var query = new RB_AI_AuthorizeStudent_ViewModel();// Common.Plugin.JsonHelper.DeserializeObject<RB_AI_AuthorizeStudent_ViewModel>(RequestParm.Msg.ToString());
query.Group_Id = base.AppletUserInfo.Group_Id;
query.School_Id = base.AppletUserInfo.School_Id;
query.StudentId = this.AppletUserInfo.AccountId;
query.Enable = 1;
query.IsEffective = 1;
if (this.AppletUserInfo.AccountType != Common.Enum.User.AccountTypeEnum.Student)
{
return ApiResult.Failed("请用正确的账号登录");
}
var list = aiModule.GetAuthorizeStudentListModule(query);
var result = list.Select(extModel => new
{
ID = extModel?.ID ?? 0,
StuName = extModel?.StuName ?? "",
PresetsApplicationName = extModel?.PresetsApplicationName ?? "",
ApplicationId = extModel?.ApplicationId ?? 0,
StudentId = extModel?.StudentId ?? 0,
DateType = extModel?.DateType ?? 0,
SupplierId = extModel?.SupplierId ?? 0,
StartDate = StringHelper.FormatDateTimeStr(extModel.StartDate),
EndDate = StringHelper.FormatDateTimeStr(extModel.EndDate),
CreateTime = StringHelper.FormatDateTimeStr(extModel.CreateTime),
});
return ApiResult.Success(data: result);
}
/// <summary>
/// 根据内容以及供应商获取ai内容
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetAIContentByKeyWord()
{
string keyWord = base.ParmJObj.GetStringValue("KeyWord");
int supplierId = base.ParmJObj.GetInt("SupplierId", 0);
int Type = base.ParmJObj.GetInt("Type", 0);//1-英语作文批改(图像识别),2-英语作文批改(文本输入),3-中文作文批改(图像识别),4-中文作文批改(文本输入)
var supplierModel = aiModule.GetAI_SupplierEntity(supplierId);
string imgUrl = base.ParmJObj.GetStringValue("ImgUrl");
RB_AI_UseLog_ViewModel userLogModel = new RB_AI_UseLog_ViewModel();
userLogModel.CreateBy = base.AppletUserInfo.Id;
userLogModel.Group_Id = base.AppletUserInfo.Group_Id;
userLogModel.School_Id = base.AppletUserInfo.School_Id;
userLogModel.CreateTime = DateTime.Now;
userLogModel.StudentId = this.AppletUserInfo.AccountId;
userLogModel.SupplierId = supplierId;
userLogModel.TokenNum = "";
userLogModel.Charging = "";
userLogModel.Status = Common.Enum.DateStateEnum.Normal;
if ((supplierModel?.ID ?? 0) == 0)
{
return ApiResult.Failed("请选择应用");
}
if (supplierModel.Enable != 1)
{
return ApiResult.Failed("当前应用供应商未启用");
}
if (supplierId == 0)
{
return ApiResult.Failed("请选择应用");
}
if (string.IsNullOrWhiteSpace(keyWord))
{
return ApiResult.Failed("请输入关键字");
}
if ((Type == 1 || Type == 3) && string.IsNullOrWhiteSpace(imgUrl))
{
return ApiResult.Failed("请上传图片信息");
}
var basicConfigureModel = new BasicConfigureModel();
if (!string.IsNullOrWhiteSpace(supplierModel.BasicConfigure))
{
var info = JObject.Parse(supplierModel.BasicConfigure);
basicConfigureModel.ApiKey = info.GetStringValue("ApiKey");
}
if (supplierModel.SupplierType == Common.Enum.AI.SupplierTypeEnum.YouDaoNote)
{
if (!string.IsNullOrWhiteSpace(basicConfigureModel.ApiKey))
{
string postUrl = "";
if (Type == 1 || Type == 3)//1-英语作文批改(图像识别)
{
userLogModel.Charging = "0.13(元/次)";
postUrl = (Type == 1 ? "https://openapi.youdao.com/v2/correct_writing_image" : "https://openapi.youdao.com/correct_writing_cn_image");
if (YouDaoHelper.RemoteFileExists(imgUrl))
{
keyWord = YouDaoHelper.readFileAsBaes64_V2(imgUrl);
}
else
{
return ApiResult.Failed("图片获取失败,请稍后再试");
}
}
else if (Type == 2 || Type == 4)
{
userLogModel.Charging = "0.08(元/次)";
postUrl = (Type == 2 ? "https://openapi.youdao.com/v2/correct_writing_text" : "https://openapi.youdao.com/correct_writing_cn_text");
}
// 添加请求参数
Dictionary<String, String[]> paramsMap = YouDaoHelper.createRequestParams(keyWord: keyWord);
// 添加鉴权相关参数
AuthV4Util.addAuthParams("4427e2bed8595678", basicConfigureModel.ApiKey, paramsMap);
Dictionary<String, String[]> header = new Dictionary<string, string[]>() { { "Content-Type", new String[] { "application/x-www-form-urlencoded" } } };
// 请求api服务
byte[] result = HttpUtil.doPost(postUrl, header, paramsMap, "application/json");
// 打印返回结果
if (result != null)
{
string resStr = System.Text.Encoding.UTF8.GetString(result);
JObject jsonObject = JObject.Parse(resStr);
if (jsonObject.GetStringValue("errorCode") == "0")
{
Task.Run(() => { aiModule.SetAIUseLogModule(userLogModel); });
return ApiResult.Success(data: resStr);
}
}
return ApiResult.Failed("获取失败");
}
return ApiResult.Success();
}
else if (supplierModel.SupplierType == Common.Enum.AI.SupplierTypeEnum.OpenAI)
{
string answer = string.Empty;
var openai = new OpenAIAPI(basicConfigureModel.ApiKey);
CompletionRequest completion = new CompletionRequest();
completion.Prompt = keyWord;
completion.Model = "gpt-4o-mini";//OpenAI_API.Models.Model.DavinciText;
completion.MaxTokens = 4000;
var result = openai.Completions.CreateCompletionAsync(completion);
if (result != null)
{
foreach (var item in result.Result.Completions)
{
answer = item.Text;
}
}
return ApiResult.Success(data: result.Result.Completions);
}
return ApiResult.Success();
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment