考试管理新增人工阅卷处理完成状态

master
xiaochanghai 2 weeks ago
parent 52da8b7fd9
commit eeb5ffe4ee
  1. BIN
      Lib/Tiobon.Core.Base.dll
  2. BIN
      Lib/Tiobon.Core.dll
  3. 338
      Lib/Tiobon.Core.xml
  4. 14
      Model/Tiobon.Web.pdm
  5. 6
      Tiobon.Core.Api/Controllers/Ghre/Ghre_ExamRecordController.cs
  6. 13
      Tiobon.Core.Api/Controllers/Ghre/Ghre_SurveyController.cs
  7. 6
      Tiobon.Core.Common/Helper/ExamHelper.cs
  8. 168
      Tiobon.Core.Common/Helper/NumberConverter.cs
  9. 214
      Tiobon.Core.Common/Helper/RecursionHelper.cs
  10. 34
      Tiobon.Core.Common/Helper/SerializeHelper.cs
  11. 1086
      Tiobon.Core.Common/Helper/ShaHelper.cs
  12. 293
      Tiobon.Core.Common/Helper/StringHelper.cs
  13. 45
      Tiobon.Core.Common/Helper/UnicodeHelper.cs
  14. 22
      Tiobon.Core.Common/Helper/UrlHelper.cs
  15. 59
      Tiobon.Core.Common/Helper/XmlHelper.cs
  16. 105
      Tiobon.Core.Common/Hubs/ChatHub.cs
  17. 21
      Tiobon.Core.Common/Hubs/IChatClient.cs
  18. 2
      Tiobon.Core.IServices/Ghre/IGhre_ExamRecordServices.cs
  19. 2
      Tiobon.Core.IServices/Ghre/IGhre_SurveyServices.cs
  20. 18
      Tiobon.Core.Model/ViewModels/Extend/Ghre_ESSSurvey.cs
  21. 13
      Tiobon.Core.Services/Ghre/Ghre_ExamRecordServices.cs
  22. 80
      Tiobon.Core.Services/Ghre/Ghre_SurveyServices.cs
  23. 2
      Tiobon.Core.Tasks/QuartzNet/Jobs/JobBase.cs
  24. 7
      Tiobon.Core/Tiobon.Core.Api.xml

Binary file not shown.

Binary file not shown.

@ -1742,6 +1742,276 @@
【-1 取值结束】【0 未开始】【1 无引号开始】【2 单引号开始】【3 双引号开始】 【-1 取值结束】【0 未开始】【1 无引号开始】【2 单引号开始】【3 双引号开始】
</summary> </summary>
</member> </member>
<member name="T:Tiobon.Core.Helper.NumberConverter">
<inheritdoc />
<summary>
大数据json序列化重写
</summary>
</member>
<member name="F:Tiobon.Core.Helper.NumberConverter._ship">
<summary>
转换成字符串的类型
</summary>
</member>
<member name="M:Tiobon.Core.Helper.NumberConverter.#ctor">
<summary>
大数据json序列化重写实例化
</summary>
</member>
<member name="M:Tiobon.Core.Helper.NumberConverter.#ctor(Tiobon.Core.Helper.NumberConverterShip)">
<summary>
大数据json序列化重写实例化
</summary>
<param name="ship">转换成字符串的类型</param>
</member>
<member name="M:Tiobon.Core.Helper.NumberConverter.CanConvert(System.Type)">
<inheritdoc />
<summary>
确定此实例是否可以转换指定的对象类型。
</summary>
<param name="objectType">对象的类型。</param>
<returns>如果此实例可以转换指定的对象类型,则为:<c>true</c>,否则为:<c>false</c></returns>
</member>
<member name="M:Tiobon.Core.Helper.NumberConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
<inheritdoc />
<summary>
读取对象的JSON表示。
</summary>
<param name="reader"><see cref="T:Newtonsoft.Json.JsonReader" /> 中读取。</param>
<param name="objectType">对象的类型。</param>
<param name="existingValue">正在读取的对象的现有值。</param>
<param name="serializer">调用的序列化器实例。</param>
<returns>对象值。</returns>
</member>
<member name="M:Tiobon.Core.Helper.NumberConverter.AsType(System.String,System.Type)">
<summary>
字符串格式数据转其他类型数据
</summary>
<param name="input">输入的字符串</param>
<param name="destinationType">目标格式</param>
<returns>转换结果</returns>
</member>
<member name="M:Tiobon.Core.Helper.NumberConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
<inheritdoc />
<summary>
写入对象的JSON表示形式。
</summary>
<param name="writer">要写入的 <see cref="T:Newtonsoft.Json.JsonWriter" /></param>
<param name="value">要写入对象值</param>
<param name="serializer">调用的序列化器实例。</param>
</member>
<member name="T:Tiobon.Core.Helper.NumberConverterShip">
<summary>
转换成字符串的类型
</summary>
</member>
<member name="F:Tiobon.Core.Helper.NumberConverterShip.Int64">
<summary>
长整数
</summary>
</member>
<member name="F:Tiobon.Core.Helper.NumberConverterShip.UInt64">
<summary>
无符号长整数
</summary>
</member>
<member name="F:Tiobon.Core.Helper.NumberConverterShip.Single">
<summary>
浮点数
</summary>
</member>
<member name="F:Tiobon.Core.Helper.NumberConverterShip.Double">
<summary>
双精度浮点数
</summary>
</member>
<member name="F:Tiobon.Core.Helper.NumberConverterShip.Decimal">
<summary>
大数字
</summary>
</member>
<member name="T:Tiobon.Core.Helper.RecursionHelper">
<summary>
泛型递归求树形结构
</summary>
</member>
<member name="M:Tiobon.Core.Helper.RecursionHelper.TreeToList``1(System.Collections.Generic.List{``0},System.Action{``0,``0,System.Collections.Generic.List{``0}})">
<summary>
将父子级数据结构转换为普通list
</summary>
<param name="list"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Helper.RecursionHelper.OperationChildData``1(System.Collections.Generic.List{``0},``0,System.Action{``0,``0,System.Collections.Generic.List{``0}})">
<summary>
递归子级数据
</summary>
<param name="allList">树形列表数据</param>
<param name="item">Item</param>
</member>
<member name="M:Tiobon.Core.Helper.StringHelper.GetTopDataBySeparator(System.String,System.String,System.Int32,System.Boolean)">
<summary>
根据分隔符返回前n条数据
</summary>
<param name="content">数据内容</param>
<param name="separator">分隔符</param>
<param name="top">前n条</param>
<param name="isDesc">是否倒序(默认false)</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Helper.StringHelper.GetPars(System.Collections.Generic.Dictionary{System.String,System.Object})">
<summary>
根据字段拼接get参数
</summary>
<param name="dic"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Helper.StringHelper.GetPars(System.Collections.Generic.Dictionary{System.String,System.String})">
<summary>
根据字段拼接get参数
</summary>
<param name="dic"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Helper.StringHelper.GetGUID(System.String)">
<summary>
获取一个GUID
</summary>
<param name="format">格式-默认为N</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Helper.StringHelper.GetGuidToLongID">
<summary>
根据GUID获取19位的唯一数字序列
</summary>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Helper.StringHelper.GetCusLine(System.String,System.Int32)">
<summary>
获取字符串最后X行
</summary>
<param name="resourceStr"></param>
<param name="length"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Helper.StringHelper.GetSysID">
<summary>
求系统唯一字符串,常用于ROW_ID值。
</summary>
<returns>字符串</returns>
</member>
<member name="M:Tiobon.Core.Helper.StringHelper.TrimDecimalString(System.String)">
<summary>
格式化数字字符,如传入1.24500,返回1.245
</summary>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Helper.StringHelper.TrimDecimalString(System.String,System.Int32)">
<summary>
格式化数字字符,并保留指定的小数位
</summary>
<param name="value">需要处理的值</param>
<param name="reservedDigit">保留小数点后位数</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Helper.StringHelper.TrimDecimalString(System.Object,System.Int32)">
<summary>
格式化数字字符,并保留指定的小数位
</summary>
<param name="value">需要处理的值</param>
<param name="reservedDigit">保留小数点后位数,-1时只会去除小数点后最后几位的0</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Helper.StringHelper.TrimDecimal(System.Object,System.Int32)">
<summary>
格式化数字字符,并保留指定的小数位
</summary>
<param name="value">需要处理的值</param>
<param name="reservedDigit">保留小数点后位数,-1时只会去除小数点后最后几位的0</param>
<returns></returns>
</member>
<member name="F:Tiobon.Core.Helper.StringHelper.m_FieldDesc">
<summary>
对象字段描述
</summary>
</member>
<member name="M:Tiobon.Core.Helper.StringHelper.GetFieldDesc``1">
<summary>
获取字段的描述(描述 - 列名)
</summary>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Helper.UnicodeHelper.StringToUnicode(System.String)">
<summary>
字符串转Unicode码
</summary>
<returns>The to unicode.</returns>
<param name="value">Value.</param>
</member>
<member name="M:Tiobon.Core.Helper.UnicodeHelper.UnicodeToString(System.String)">
<summary>
Unicode转字符串
</summary>
<returns>The to string.</returns>
<param name="unicode">Unicode.</param>
</member>
<member name="M:Tiobon.Core.Helper.UrlHelper.UrlEncode(System.String)">
<summary>
UrlEncode编码
</summary>
<param name="url">url</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Helper.UrlHelper.UrlDecode(System.String)">
<summary>
UrlEncode解码
</summary>
<param name="data">数据</param>
<returns></returns>
</member>
<member name="T:Tiobon.Core.Helper.XmlHelper">
<summary>
xml序列化帮助类
</summary>
</member>
<member name="F:Tiobon.Core.Helper.XmlHelper.hasTypes">
<summary>
存储序列类型,防止内存泄漏
</summary>
</member>
<member name="M:Tiobon.Core.Helper.XmlHelper.GetXML``1(System.Object,System.String)">
<summary>
转换对象为JSON格式数据
</summary>
<typeparam name="T"></typeparam>
<param name="obj">对象</param>
<returns>字符格式的JSON数据</returns>
</member>
<member name="M:Tiobon.Core.Helper.XmlHelper.ParseFormByXml``1(System.String,System.String)">
<summary>
Xml格式字符转换为T类型的对象
</summary>
<typeparam name="T"></typeparam>
<param name="xml"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.SerializeHelper.Serialize(System.Object)">
<summary>
序列化
</summary>
<param name="item"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.SerializeHelper.Deserialize``1(System.Byte[])">
<summary>
反序列化
</summary>
<typeparam name="TEntity"></typeparam>
<param name="value"></param>
<returns></returns>
</member>
<member name="T:Tiobon.Core.UtilHelper"> <member name="T:Tiobon.Core.UtilHelper">
<summary> <summary>
@ -1869,6 +2139,74 @@
<param name="accessor"></param> <param name="accessor"></param>
<param name="logger"></param> <param name="logger"></param>
</member> </member>
<member name="T:Tiobon.Core.Hubs.ChatHub">
<summary>
</summary>
</member>
<member name="M:Tiobon.Core.Hubs.ChatHub.SendMessageToGroupAsync(System.String,System.String)">
<summary>
向指定群组发送信息
</summary>
<param name="groupName">组名</param>
<param name="message">信息内容</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Hubs.ChatHub.AddToGroup(System.String)">
<summary>
加入指定组
</summary>
<param name="groupName">组名</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Hubs.ChatHub.RemoveFromGroup(System.String)">
<summary>
退出指定组
</summary>
<param name="groupName">组名</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Hubs.ChatHub.SendPrivateMessage(System.String,System.String)">
<summary>
向指定成员发送信息
</summary>
<param name="user">成员名</param>
<param name="message">信息内容</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Hubs.ChatHub.OnConnectedAsync">
<summary>
当连接建立时运行
</summary>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Hubs.ChatHub.OnDisconnectedAsync(System.Exception)">
<summary>
当链接断开时运行
</summary>
<param name="ex"></param>
<returns></returns>
</member>
<member name="T:Tiobon.Core.Hubs.IChatClient">
<summary>
</summary>
</member>
<member name="M:Tiobon.Core.Hubs.IChatClient.ReceiveMessage(System.Object)">
<summary>
SignalR接收信息
</summary>
<param name="message">信息内容</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Hubs.IChatClient.ReceiveMessage(System.String,System.String)">
<summary>
SignalR接收信息
</summary>
<param name="user">指定接收客户端</param>
<param name="message">信息内容</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.LogHelper.LogLock.ReadLog(System.String,System.String,System.Text.Encoding,Tiobon.Core.LogHelper.ReadType,System.Int32)"> <member name="M:Tiobon.Core.LogHelper.LogLock.ReadLog(System.String,System.String,System.Text.Encoding,Tiobon.Core.LogHelper.ReadType,System.Int32)">
<summary> <summary>
读取文件内容 读取文件内容

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?PowerDesigner AppLocale="UTF16" ID="{C294868A-C3F3-41AD-98CC-78B6D4E0CC40}" Label="" LastModificationDate="1749198246" Name="Tiobon" Objects="4401" Symbols="151" Target="Microsoft SQL Server 2008" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="16.5.0.3982"?> <?PowerDesigner AppLocale="UTF16" ID="{C294868A-C3F3-41AD-98CC-78B6D4E0CC40}" Label="" LastModificationDate="1749198246" Name="Tiobon" Objects="4385" Symbols="151" Target="Microsoft SQL Server 2008" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="16.5.0.3982"?>
<!-- do not edit this file --> <!-- do not edit this file -->
<Model xmlns:a="attribute" xmlns:c="collection" xmlns:o="object"> <Model xmlns:a="attribute" xmlns:c="collection" xmlns:o="object">
@ -9743,7 +9743,7 @@ DESTINATION 0 新宋体,8,N</a:FontList>
<o:ReferenceSymbol Id="o46"> <o:ReferenceSymbol Id="o46">
<a:CreationDate>1717726229</a:CreationDate> <a:CreationDate>1717726229</a:CreationDate>
<a:ModificationDate>1719381754</a:ModificationDate> <a:ModificationDate>1719381754</a:ModificationDate>
<a:Rect>((-42449,11400), (-39225,18375))</a:Rect> <a:Rect>((-42337,11400), (-39337,18375))</a:Rect>
<a:ListOfPoints>((-40837,11400),(-40837,18375))</a:ListOfPoints> <a:ListOfPoints>((-40837,11400),(-40837,18375))</a:ListOfPoints>
<a:CornerStyle>2</a:CornerStyle> <a:CornerStyle>2</a:CornerStyle>
<a:ArrowStyle>1</a:ArrowStyle> <a:ArrowStyle>1</a:ArrowStyle>
@ -9966,7 +9966,7 @@ DESTINATION 0 新宋体,8,N</a:FontList>
<o:ReferenceSymbol Id="o79"> <o:ReferenceSymbol Id="o79">
<a:CreationDate>1727337857</a:CreationDate> <a:CreationDate>1727337857</a:CreationDate>
<a:ModificationDate>1727337857</a:ModificationDate> <a:ModificationDate>1727337857</a:ModificationDate>
<a:Rect>((-54898,11250), (-48674,18150))</a:Rect> <a:Rect>((-54786,11250), (-48786,18150))</a:Rect>
<a:ListOfPoints>((-51786,18150),(-51786,11250))</a:ListOfPoints> <a:ListOfPoints>((-51786,18150),(-51786,11250))</a:ListOfPoints>
<a:CornerStyle>2</a:CornerStyle> <a:CornerStyle>2</a:CornerStyle>
<a:ArrowStyle>1</a:ArrowStyle> <a:ArrowStyle>1</a:ArrowStyle>
@ -10010,7 +10010,7 @@ DESTINATION 0 新宋体,8,N</a:FontList>
<o:ReferenceSymbol Id="o85"> <o:ReferenceSymbol Id="o85">
<a:CreationDate>1738913762</a:CreationDate> <a:CreationDate>1738913762</a:CreationDate>
<a:ModificationDate>1747275741</a:ModificationDate> <a:ModificationDate>1747275741</a:ModificationDate>
<a:Rect>((-45223,-30675), (-40499,-24525))</a:Rect> <a:Rect>((-45111,-30675), (-40611,-24525))</a:Rect>
<a:ListOfPoints>((-44099,-30675),(-44099,-27375),(-41624,-27375),(-41624,-24525))</a:ListOfPoints> <a:ListOfPoints>((-44099,-30675),(-44099,-27375),(-41624,-27375),(-41624,-24525))</a:ListOfPoints>
<a:CornerStyle>2</a:CornerStyle> <a:CornerStyle>2</a:CornerStyle>
<a:ArrowStyle>1</a:ArrowStyle> <a:ArrowStyle>1</a:ArrowStyle>
@ -10056,7 +10056,7 @@ DESTINATION 0 新宋体,8,N</a:FontList>
<o:ReferenceSymbol Id="o92"> <o:ReferenceSymbol Id="o92">
<a:CreationDate>1738915648</a:CreationDate> <a:CreationDate>1738915648</a:CreationDate>
<a:ModificationDate>1738915648</a:ModificationDate> <a:ModificationDate>1738915648</a:ModificationDate>
<a:Rect>((-43123,-23625), (-38399,-17925))</a:Rect> <a:Rect>((-43011,-23625), (-38511,-17925))</a:Rect>
<a:ListOfPoints>((-40761,-17925),(-40761,-23625))</a:ListOfPoints> <a:ListOfPoints>((-40761,-17925),(-40761,-23625))</a:ListOfPoints>
<a:CornerStyle>2</a:CornerStyle> <a:CornerStyle>2</a:CornerStyle>
<a:ArrowStyle>1</a:ArrowStyle> <a:ArrowStyle>1</a:ArrowStyle>
@ -10078,7 +10078,7 @@ DESTINATION 0 新宋体,8,N</a:FontList>
<o:ReferenceSymbol Id="o95"> <o:ReferenceSymbol Id="o95">
<a:CreationDate>1738916095</a:CreationDate> <a:CreationDate>1738916095</a:CreationDate>
<a:ModificationDate>1738916119</a:ModificationDate> <a:ModificationDate>1738916119</a:ModificationDate>
<a:Rect>((-54036,-23812), (-39449,-17325))</a:Rect> <a:Rect>((-53924,-23812), (-39449,-17325))</a:Rect>
<a:ListOfPoints>((-51674,-17325),(-51674,-23400),(-39449,-23400))</a:ListOfPoints> <a:ListOfPoints>((-51674,-17325),(-51674,-23400),(-39449,-23400))</a:ListOfPoints>
<a:CornerStyle>2</a:CornerStyle> <a:CornerStyle>2</a:CornerStyle>
<a:ArrowStyle>1</a:ArrowStyle> <a:ArrowStyle>1</a:ArrowStyle>
@ -10100,7 +10100,7 @@ DESTINATION 0 新宋体,8,N</a:FontList>
<o:ReferenceSymbol Id="o98"> <o:ReferenceSymbol Id="o98">
<a:CreationDate>1738916098</a:CreationDate> <a:CreationDate>1738916098</a:CreationDate>
<a:ModificationDate>1738916104</a:ModificationDate> <a:ModificationDate>1738916104</a:ModificationDate>
<a:Rect>((-54111,-31050), (-42899,-24863))</a:Rect> <a:Rect>((-53999,-31050), (-42899,-24863))</a:Rect>
<a:ListOfPoints>((-51749,-31050),(-51749,-25275),(-42899,-25275))</a:ListOfPoints> <a:ListOfPoints>((-51749,-31050),(-51749,-25275),(-42899,-25275))</a:ListOfPoints>
<a:CornerStyle>2</a:CornerStyle> <a:CornerStyle>2</a:CornerStyle>
<a:ArrowStyle>1</a:ArrowStyle> <a:ArrowStyle>1</a:ArrowStyle>

@ -302,4 +302,10 @@ public class Ghre_ExamRecordController : BaseController<IGhre_ExamRecordServices
{ {
return await _service.IssueCertificate(); return await _service.IssueCertificate();
} }
[HttpPost("MarkCompleteStatus/{id}")]
public async Task<ServiceResult> MarkCompleteStatus(long id)
{
return await _service.MarkCompleteStatus(id);
}
} }

@ -143,8 +143,6 @@ public class Ghre_SurveyController : BaseController<IGhre_SurveyServices, Ghre_S
#endregion #endregion
#region 记录 #region 记录
/// <summary> /// <summary>
/// 记录 /// 记录
@ -155,4 +153,15 @@ public class Ghre_SurveyController : BaseController<IGhre_SurveyServices, Ghre_S
public async Task<dynamic> QueryRecord(long id) => await _service.QueryRecord(id); public async Task<dynamic> QueryRecord(long id) => await _service.QueryRecord(id);
#endregion #endregion
#region QueryESS
/// <summary>
/// QueryESS
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("QueryESS")]
public async Task<ServicePageResult<Ghre_ESSSurvey>> QueryESS([FromBody] QueryBody id) => await _service.QueryESS(id);
#endregion
} }

@ -97,7 +97,11 @@ public class ExamHelper
{ {
if (record.ExamId != null) if (record.ExamId != null)
{ {
if (await Db.Queryable<Ghre_Exam>().Where(x => x.Id == record.ExamId && x.StudyFinishedRule == DIC_EXAM_STUDY_FINISHED_RULE.STUDY_FINISHED).AnyAsync() || await Db.Queryable<Ghre_ExamRecord>().Where(x => x.StudyRecordId == record.Id && x.IsPass == true).AnyAsync()) if (await Db.Queryable<Ghre_Exam>()
.Where(x => x.Id == record.ExamId &&
x.StudyFinishedRule == DIC_EXAM_STUDY_FINISHED_RULE.STUDY_FINISHED)
.AnyAsync() || await Db.Queryable<Ghre_ExamRecord>()
.Where(x => x.StudyRecordId == record.Id && x.IsPass == true).AnyAsync())
record.CompleteStatus = DIC_STUDY_RECORD_STUDY_COMPLETE_STATUS.FINISHED; record.CompleteStatus = DIC_STUDY_RECORD_STUDY_COMPLETE_STATUS.FINISHED;
} }
else else

@ -1,168 +0,0 @@
using Newtonsoft.Json;
using System.ComponentModel;
namespace Tiobon.Core.Common.Helper;
/// <inheritdoc />
/// <summary>
/// 大数据json序列化重写
/// </summary>
public sealed class NumberConverter : JsonConverter
{
/// <summary>
/// 转换成字符串的类型
/// </summary>
private readonly NumberConverterShip _ship;
/// <summary>
/// 大数据json序列化重写实例化
/// </summary>
public NumberConverter()
{
_ship = (NumberConverterShip)0xFF;
}
/// <summary>
/// 大数据json序列化重写实例化
/// </summary>
/// <param name="ship">转换成字符串的类型</param>
public NumberConverter(NumberConverterShip ship)
{
_ship = ship;
}
/// <inheritdoc />
/// <summary>
/// 确定此实例是否可以转换指定的对象类型。
/// </summary>
/// <param name="objectType">对象的类型。</param>
/// <returns>如果此实例可以转换指定的对象类型,则为:<c>true</c>,否则为:<c>false</c></returns>
public override bool CanConvert(Type objectType)
{
var typecode = Type.GetTypeCode(objectType.Name.Equals("Nullable`1") ? objectType.GetGenericArguments().First() : objectType);
switch (typecode)
{
case TypeCode.Decimal:
return (_ship & NumberConverterShip.Decimal) == NumberConverterShip.Decimal;
case TypeCode.Double:
return (_ship & NumberConverterShip.Double) == NumberConverterShip.Double;
case TypeCode.Int64:
return (_ship & NumberConverterShip.Int64) == NumberConverterShip.Int64;
case TypeCode.UInt64:
return (_ship & NumberConverterShip.UInt64) == NumberConverterShip.UInt64;
case TypeCode.Single:
return (_ship & NumberConverterShip.Single) == NumberConverterShip.Single;
default: return false;
}
}
/// <inheritdoc />
/// <summary>
/// 读取对象的JSON表示。
/// </summary>
/// <param name="reader">从 <see cref="T:Newtonsoft.Json.JsonReader" /> 中读取。</param>
/// <param name="objectType">对象的类型。</param>
/// <param name="existingValue">正在读取的对象的现有值。</param>
/// <param name="serializer">调用的序列化器实例。</param>
/// <returns>对象值。</returns>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return AsType(reader.Value.ObjToString(), objectType);
}
/// <summary>
/// 字符串格式数据转其他类型数据
/// </summary>
/// <param name="input">输入的字符串</param>
/// <param name="destinationType">目标格式</param>
/// <returns>转换结果</returns>
public static object AsType(string input, Type destinationType)
{
try
{
var converter = TypeDescriptor.GetConverter(destinationType);
if (converter.CanConvertFrom(typeof(string)))
{
return converter.ConvertFrom(null, null, input);
}
converter = TypeDescriptor.GetConverter(typeof(string));
if (converter.CanConvertTo(destinationType))
{
return converter.ConvertTo(null, null, input, destinationType);
}
}
catch
{
return null;
}
return null;
}
/// <inheritdoc />
/// <summary>
/// 写入对象的JSON表示形式。
/// </summary>
/// <param name="writer">要写入的 <see cref="T:Newtonsoft.Json.JsonWriter" /> 。</param>
/// <param name="value">要写入对象值</param>
/// <param name="serializer">调用的序列化器实例。</param>
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null)
{
writer.WriteNull();
}
else
{
var objectType = value.GetType();
var typeCode = Type.GetTypeCode(objectType.Name.Equals("Nullable`1") ? objectType.GetGenericArguments().First() : objectType);
switch (typeCode)
{
case TypeCode.Decimal:
writer.WriteValue(((decimal)value).ToString("f6"));
break;
case TypeCode.Double:
writer.WriteValue(((double)value).ToString("f4"));
break;
case TypeCode.Single:
writer.WriteValue(((float)value).ToString("f2"));
break;
default:
writer.WriteValue(value.ToString());
break;
}
}
}
}
/// <summary>
/// 转换成字符串的类型
/// </summary>
[Flags]
public enum NumberConverterShip
{
/// <summary>
/// 长整数
/// </summary>
Int64 = 1,
/// <summary>
/// 无符号长整数
/// </summary>
UInt64 = 2,
/// <summary>
/// 浮点数
/// </summary>
Single = 4,
/// <summary>
/// 双精度浮点数
/// </summary>
Double = 8,
/// <summary>
/// 大数字
/// </summary>
Decimal =16
}

@ -1,214 +0,0 @@
namespace Tiobon.Core.Common.Helper;
/// <summary>
/// 泛型递归求树形结构
/// </summary>
public static class RecursionHelper
{
public static void LoopToAppendChildren(List<PermissionTree> all, PermissionTree curItem, long pid, bool needbtn)
{
var subItems = all.Where(ee => ee.Pid == curItem.value).ToList();
var btnItems = subItems.Where(ss => ss.isbtn == true).ToList();
if (subItems.Count > 0)
{
curItem.btns = new List<PermissionTree>();
curItem.btns.AddRange(btnItems);
}
else
{
curItem.btns = null;
}
if (!needbtn)
{
subItems = subItems.Where(ss => ss.isbtn == false).ToList();
}
if (subItems.Count > 0)
{
curItem.children = new List<PermissionTree>();
curItem.children.AddRange(subItems);
}
else
{
curItem.children = null;
}
if (curItem.isbtn)
{
//curItem.label += "按钮";
}
foreach (var subItem in subItems)
{
if (subItem.value == pid && pid > 0)
{
//subItem.disabled = true;//禁用当前节点
}
LoopToAppendChildren(all, subItem, pid, needbtn);
}
}
public static void LoopToAppendChildren(List<DepartmentTree> all, DepartmentTree curItem, long pid)
{
var subItems = all.Where(ee => ee.Pid == curItem.value).ToList();
if (subItems.Count > 0)
{
curItem.children = new List<DepartmentTree>();
curItem.children.AddRange(subItems);
}
else
{
curItem.children = null;
}
foreach (var subItem in subItems)
{
if (subItem.value == pid && pid > 0)
{
//subItem.disabled = true;//禁用当前节点
}
LoopToAppendChildren(all, subItem, pid);
}
}
public static void LoopNaviBarAppendChildren(List<NavigationBar> all, NavigationBar curItem)
{
var subItems = all.Where(ee => ee.pid == curItem.id).ToList();
if (subItems.Count > 0)
{
curItem.children = new List<NavigationBar>();
curItem.children.AddRange(subItems);
}
else
{
curItem.children = null;
}
foreach (var subItem in subItems)
{
LoopNaviBarAppendChildren(all, subItem);
}
}
public static void LoopToAppendChildrenT<T>(List<T> all, T curItem, string parentIdName = "Pid", string idName = "value", string childrenName = "children")
{
var subItems = all.Where(ee => ee.GetType().GetProperty(parentIdName).GetValue(ee, null).ToString() == curItem.GetType().GetProperty(idName).GetValue(curItem, null).ToString()).ToList();
if (subItems.Count > 0) curItem.GetType().GetField(childrenName).SetValue(curItem, subItems);
foreach (var subItem in subItems)
{
LoopToAppendChildrenT(all, subItem);
}
}
/// <summary>
/// 将父子级数据结构转换为普通list
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
public static List<T> TreeToList<T>(List<T> list, Action<T, T, List<T>> action = null)
{
List<T> results = new List<T>();
foreach (var item in list)
{
results.Add(item);
OperationChildData(results, item, action);
}
return results;
}
/// <summary>
/// 递归子级数据
/// </summary>
/// <param name="allList">树形列表数据</param>
/// <param name="item">Item</param>
public static void OperationChildData<T>(List<T> allList, T item, Action<T, T, List<T>> action)
{
dynamic dynItem = item;
if (dynItem.Children == null) return;
if (dynItem.Children.Count <= 0) return;
allList.AddRange(dynItem.Children);
foreach (var subItem in dynItem.Children)
{
action?.Invoke(item, subItem, allList);
OperationChildData(allList, subItem, action);
}
}
}
public class PermissionTree
{
public long value { get; set; }
public long Pid { get; set; }
public string label { get; set; }
public int order { get; set; }
public bool isbtn { get; set; }
public bool disabled { get; set; }
public List<PermissionTree> children { get; set; }
public List<PermissionTree> btns { get; set; }
}
public class DepartmentTree
{
public long value { get; set; }
public long Pid { get; set; }
public string label { get; set; }
public int order { get; set; }
public bool disabled { get; set; }
public List<DepartmentTree> children { get; set; }
}
public class NavigationBar
{
public long id { get; set; }
public long pid { get; set; }
public int order { get; set; }
public string name { get; set; }
public bool IsHide { get; set; } = false;
public bool IsButton { get; set; } = false;
public string path { get; set; }
public string Func { get; set; }
public string iconCls { get; set; }
public NavigationBarMeta meta { get; set; }
public List<NavigationBar> children { get; set; }
}
public class NavigationBarMeta
{
public string title { get; set; }
public bool requireAuth { get; set; } = true;
public bool NoTabPage { get; set; } = false;
public bool keepAlive { get; set; } = false;
}
public class NavigationBarPro
{
public long id { get; set; }
public long parentId { get; set; }
public int order { get; set; }
public string name { get; set; }
public bool IsHide { get; set; } = false;
public bool IsButton { get; set; } = false;
public string path { get; set; }
public string component { get; set; }
public string Func { get; set; }
public string iconCls { get; set; }
public NavigationBarMetaPro meta { get; set; }
}
public class NavigationBarMetaPro
{
public string title { get; set; }
public string icon { get; set; }
public bool show { get; set; } = false;
}

@ -1,34 +0,0 @@
using Newtonsoft.Json;
using System.Text;
namespace Tiobon.Core.Common;
public class SerializeHelper
{
/// <summary>
/// 序列化
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public static byte[] Serialize(object item)
{
var jsonString = JsonConvert.SerializeObject(item);
return Encoding.UTF8.GetBytes(jsonString);
}
/// <summary>
/// 反序列化
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static TEntity Deserialize<TEntity>(byte[] value)
{
if (value == null)
{
return default(TEntity);
}
var jsonString = Encoding.UTF8.GetString(value);
return JsonConvert.DeserializeObject<TEntity>(jsonString);
}
}

File diff suppressed because it is too large Load Diff

@ -1,293 +0,0 @@
using System.ComponentModel;
using System.Reflection;
using System.Text;
namespace Tiobon.Core.Common.Helper;
public class StringHelper
{
/// <summary>
/// 根据分隔符返回前n条数据
/// </summary>
/// <param name="content">数据内容</param>
/// <param name="separator">分隔符</param>
/// <param name="top">前n条</param>
/// <param name="isDesc">是否倒序(默认false)</param>
/// <returns></returns>
public static List<string> GetTopDataBySeparator(string content, string separator, int top, bool isDesc = false)
{
if (string.IsNullOrEmpty(content))
{
return new List<string>() { };
}
if (string.IsNullOrEmpty(separator))
{
throw new ArgumentException("message", nameof(separator));
}
var dataArray = content.Split(separator).Where(d => !string.IsNullOrEmpty(d)).ToArray();
if (isDesc)
{
Array.Reverse(dataArray);
}
if (top > 0)
{
dataArray = dataArray.Take(top).ToArray();
}
return dataArray.ToList();
}
/// <summary>
/// 根据字段拼接get参数
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
public static string GetPars(Dictionary<string, object> dic)
{
StringBuilder sb = new StringBuilder();
string urlPars = null;
bool isEnter = false;
foreach (var item in dic)
{
sb.Append($"{(isEnter ? "&" : "")}{item.Key}={item.Value}");
isEnter = true;
}
urlPars = sb.ToString();
return urlPars;
}
/// <summary>
/// 根据字段拼接get参数
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
public static string GetPars(Dictionary<string, string> dic)
{
StringBuilder sb = new StringBuilder();
string urlPars = null;
bool isEnter = false;
foreach (var item in dic)
{
sb.Append($"{(isEnter ? "&" : "")}{item.Key}={item.Value}");
isEnter = true;
}
urlPars = sb.ToString();
return urlPars;
}
/// <summary>
/// 获取一个GUID
/// </summary>
/// <param name="format">格式-默认为N</param>
/// <returns></returns>
public static string GetGUID(string format = "N")
{
return Guid.NewGuid().ToString(format);
}
/// <summary>
/// 根据GUID获取19位的唯一数字序列
/// </summary>
/// <returns></returns>
public static long GetGuidToLongID()
{
byte[] buffer = Guid.NewGuid().ToByteArray();
return BitConverter.ToInt64(buffer, 0);
}
/// <summary>
/// 获取字符串最后X行
/// </summary>
/// <param name="resourceStr"></param>
/// <param name="length"></param>
/// <returns></returns>
public static string GetCusLine(string resourceStr, int length)
{
string[] arrStr = resourceStr.Split("\r\n");
return string.Join("", (from q in arrStr select q).Skip(arrStr.Length - length + 1).Take(length).ToArray());
}
#region 求系统唯一字符串
/// <summary>
/// 求系统唯一字符串,常用于ROW_ID值。
/// </summary>
/// <returns>字符串</returns>
public static string GetSysID()
{
string sid = string.Empty;
byte[] buffer = Guid.NewGuid().ToByteArray();
sid = DateTime.Now.ToString("yyMMddHHmmss") + BitConverter.ToInt64(buffer, 0).ToString();
return sid;
}
#endregion
#region 格式化数字字符
/// <summary>
/// 格式化数字字符,如传入1.24500,返回1.245
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string TrimDecimalString(string value)
{
try
{
string result = string.Empty;
if (!string.IsNullOrEmpty(value))
{
Decimal tmp = Decimal.Parse(value);
result = string.Format("{0:#0.##########}", tmp);
}
return result;
}
catch (Exception)
{
throw;
}
}
public static string TrimDecimalString(decimal value)
{
return TrimDecimalString(value.ToString());
}
public static string TrimDecimalString(decimal? value)
{
if (value is null) return "";
return TrimDecimalString(value.ToString());
}
/// <summary>
/// 格式化数字字符,并保留指定的小数位
/// </summary>
/// <param name="value">需要处理的值</param>
/// <param name="reservedDigit">保留小数点后位数</param>
/// <returns></returns>
public static string TrimDecimalString(string value, int reservedDigit)
{
try
{
string result = string.Empty;
if (!string.IsNullOrEmpty(value))
{
Decimal tmp = Decimal.Parse(value);
if (reservedDigit == -1)
result = string.Format("{0:#0.##########}", tmp);
else
{
result = String.Format("{0:N" + reservedDigit.ToString() + "}", tmp);
result = result.Replace(",", "");
}
}
return result;
}
catch (Exception) { throw; }
}
/// <summary>
/// 格式化数字字符,并保留指定的小数位
/// </summary>
/// <param name="value">需要处理的值</param>
/// <param name="reservedDigit">保留小数点后位数,-1时只会去除小数点后最后几位的0</param>
/// <returns></returns>
public static string TrimDecimalString(object value, int reservedDigit)
{
try
{
string result = string.Empty;
if (!string.IsNullOrEmpty(Convert.ToString(value)))
{
Decimal tmp = Decimal.Parse(Convert.ToString(value));
if (reservedDigit == -1)
result = string.Format("{0:#0.##########}", tmp);
else
{
result = String.Format("{0:N" + reservedDigit.ToString() + "}", tmp);
result = result.Replace(",", "");
}
}
return result;
}
catch (Exception) { throw; }
}
/// <summary>
/// 格式化数字字符,并保留指定的小数位
/// </summary>
/// <param name="value">需要处理的值</param>
/// <param name="reservedDigit">保留小数点后位数,-1时只会去除小数点后最后几位的0</param>
/// <returns></returns>
public static decimal TrimDecimal(object value, int reservedDigit)
{
try
{
string result = string.Empty;
if (!string.IsNullOrEmpty(Convert.ToString(value)))
{
Decimal tmp = Decimal.Parse(Convert.ToString(value));
if (reservedDigit == -1)
result = string.Format("{0:#0.##########}", tmp);
else
{
result = String.Format("{0:N" + reservedDigit.ToString() + "}", tmp);
result = result.Replace(",", "");
}
}
return Convert.ToDecimal(result);
}
catch (Exception) { throw; }
}
#endregion
#region 获取字段描述
/// <summary>
/// 对象字段描述
/// </summary>
private static Dictionary<string, Dictionary<string, string>> m_FieldDesc = new Dictionary<string, Dictionary<string, string>>();
/// <summary>
/// 获取字段的描述(描述 - 列名)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Dictionary<string, string> GetFieldDesc<T>()
{
var type = typeof(T).ToString();
lock (m_FieldDesc)
{
if (m_FieldDesc.ContainsKey(type))
return m_FieldDesc[type];
}
Dictionary<string, string> dic = new Dictionary<string, string>();
try
{
PropertyInfo[] peroperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
if (peroperties != null)
{
foreach (PropertyInfo property in peroperties)
{
object[] objs = property.GetCustomAttributes(typeof(DescriptionAttribute), true);
if (objs.Length > 0)
{
var desc = ((DescriptionAttribute)objs[0]).Description.Trim();
if (!dic.ContainsKey(desc))
{
dic.Add(desc, property.Name);
}
else
{
dic[desc] = property.Name;
}
}
}
}
}
catch //(Exception ex)
{
}
lock (m_FieldDesc)
{
if (!m_FieldDesc.ContainsKey(type))
m_FieldDesc.Add(type, dic);
}
return dic;
}
#endregion
}

@ -1,45 +0,0 @@
using System.Text;
using System.Text.RegularExpressions;
namespace Tiobon.Core.Common.Helper;
public static class UnicodeHelper
{
/// <summary>
/// 字符串转Unicode码
/// </summary>
/// <returns>The to unicode.</returns>
/// <param name="value">Value.</param>
public static string StringToUnicode(string value)
{
byte[] bytes = Encoding.Unicode.GetBytes(value);
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < bytes.Length; i += 2)
{
// 取两个字符,每个字符都是右对齐。
stringBuilder.AppendFormat("u{0}{1}", bytes[i + 1].ToString("x").PadLeft(2, '0'), bytes[i].ToString("x").PadLeft(2, '0'));
}
return stringBuilder.ToString();
}
/// <summary>
/// Unicode转字符串
/// </summary>
/// <returns>The to string.</returns>
/// <param name="unicode">Unicode.</param>
public static string UnicodeToString(string unicode)
{
unicode = unicode.Replace("%", "\\");
return new Regex(@"\\u([0-9A-F]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace(
unicode, x => string.Empty + Convert.ToChar(Convert.ToUInt16(x.Result("$1"), 16)));
//string resultStr = "";
//string[] strList = unicode.Split('u');
//for (int i = 1; i < strList.Length; i++)
//{
// resultStr += (char)int.Parse(strList[i], System.Globalization.NumberStyles.HexNumber);
//}
//return resultStr;
}
}

@ -1,22 +0,0 @@
namespace Tiobon.Core.Common.Helper;
public class UrlHelper
{
/// <summary>
/// UrlEncode编码
/// </summary>
/// <param name="url">url</param>
/// <returns></returns>
public static string UrlEncode(string url) {
return System.Web.HttpUtility.UrlEncode(url, System.Text.Encoding.UTF8);
}
/// <summary>
/// UrlEncode解码
/// </summary>
/// <param name="data">数据</param>
/// <returns></returns>
public static string UrlDecode(string data)
{
return System.Web.HttpUtility.UrlDecode(data, System.Text.Encoding.UTF8);
}
}

@ -1,59 +0,0 @@
using System.Collections.Concurrent;
using System.Xml.Serialization;
namespace Tiobon.Core.Common.Helper;
/// <summary>
/// xml序列化帮助类
/// </summary>
public class XmlHelper
{
/// <summary>
/// 存储序列类型,防止内存泄漏
/// </summary>
private static ConcurrentDictionary<Type, XmlSerializer> hasTypes = new ConcurrentDictionary<Type, XmlSerializer>();
/// <summary>
/// 转换对象为JSON格式数据
/// </summary>
/// <typeparam name="T">类</typeparam>
/// <param name="obj">对象</param>
/// <returns>字符格式的JSON数据</returns>
public static string GetXML<T>(object obj, string rootName = "root")
{
XmlSerializer xs;
var xsType = typeof(T);
hasTypes.TryGetValue(xsType, out xs);
if(xs == null)
{
xs = new XmlSerializer(typeof(T));
hasTypes.TryAdd(xsType, xs);
}
using (TextWriter tw = new StringWriter())
{
xs.Serialize(tw, obj);
return tw.ObjToString();
}
}
/// <summary>
/// Xml格式字符转换为T类型的对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xml"></param>
/// <returns></returns>
public static T ParseFormByXml<T>(string xml, string rootName = "root")
{
XmlSerializer xs;
var xsType = typeof(T);
hasTypes.TryGetValue(xsType, out xs);
if (xs == null)
{
xs = new XmlSerializer(xsType, new XmlRootAttribute(rootName));
hasTypes.TryAdd(xsType, xs);
}
using (StringReader reader = new StringReader(xml))
{
return (T)xs.Deserialize(reader);
}
}
}

@ -1,105 +0,0 @@
using Microsoft.AspNetCore.SignalR;
using System.Security.Claims;
using Tiobon.Core.LogHelper;
namespace Tiobon.Core.Hubs;
public class ChatHub : Hub<IChatClient>
{
/// <summary>
/// 向指定群组发送信息
/// </summary>
/// <param name="groupName">组名</param>
/// <param name="message">信息内容</param>
/// <returns></returns>
public async Task SendMessageToGroupAsync(string groupName, string message)
{
await Clients.Group(groupName).ReceiveMessage(message);
}
/// <summary>
/// 加入指定组
/// </summary>
/// <param name="groupName">组名</param>
/// <returns></returns>
public async Task AddToGroup(string groupName)
{
await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
}
/// <summary>
/// 退出指定组
/// </summary>
/// <param name="groupName">组名</param>
/// <returns></returns>
public async Task RemoveFromGroup(string groupName)
{
await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);
}
/// <summary>
/// 向指定成员发送信息
/// </summary>
/// <param name="user">成员名</param>
/// <param name="message">信息内容</param>
/// <returns></returns>
public async Task SendPrivateMessage(string user, string message)
{
await Clients.User(user).ReceiveMessage(message);
}
/// <summary>
/// 当连接建立时运行
/// </summary>
/// <returns></returns>
public override async Task OnConnectedAsync()
{
await base.OnConnectedAsync();
if (Context.User?.Identity?.IsAuthenticated == true)
{
//按用户分组
//是有必要的 例如多个浏览器、多个标签页使用同个用户登录 应当归属于一组
await AddToGroup(Context.User.Identity.Name);
//加入角色组
//根据角色分组 例如管理员分组发送管理员的消息
var roles = Context.User.Claims.Where(s => s.Type == ClaimTypes.Role).ToList();
foreach (var role in roles)
{
await AddToGroup(role.Value);
}
}
}
/// <summary>
/// 当链接断开时运行
/// </summary>
/// <param name="ex"></param>
/// <returns></returns>
public override Task OnDisconnectedAsync(System.Exception ex)
{
//TODO..
return base.OnDisconnectedAsync(ex);
}
public async Task SendMessage(string user, string message)
{
await Clients.All.ReceiveMessage(user, message);
}
//定于一个通讯管道,用来管理我们和客户端的连接
//1、客户端调用 GetLatestCount,就像订阅
public async Task GetLatestCount(string random)
{
//2、服务端主动向客户端发送数据,名字千万不能错
if (AppSettings.app(new string[] {"Middleware", "SignalRSendLog", "Enabled"}).ObjToBool())
{
//TODO 主动发送错误消息
await Clients.All.ReceiveUpdate(LogLock.GetLogData());
}
//3、客户端再通过 ReceiveUpdate ,来接收
}
}

@ -1,21 +0,0 @@
namespace Tiobon.Core.Hubs;
public interface IChatClient
{
/// <summary>
/// SignalR接收信息
/// </summary>
/// <param name="message">信息内容</param>
/// <returns></returns>
Task ReceiveMessage(object message);
/// <summary>
/// SignalR接收信息
/// </summary>
/// <param name="user">指定接收客户端</param>
/// <param name="message">信息内容</param>
/// <returns></returns>
Task ReceiveMessage(string user, string message);
Task ReceiveUpdate(object message);
}

@ -35,4 +35,6 @@ public interface IGhre_ExamRecordServices : IBaseServices<Ghre_ExamRecord, Ghre_
Task<ServiceResult> IssueCertificate(); Task<ServiceResult> IssueCertificate();
Task<ServiceResult<List<ExamGroup>>> QueryGroups(long examRecordId); Task<ServiceResult<List<ExamGroup>>> QueryGroups(long examRecordId);
Task<ServiceResult> MarkCompleteStatus(long id);
} }

@ -24,4 +24,6 @@ public interface IGhre_SurveyServices : IBaseServices<Ghre_Survey, Ghre_SurveyDt
Task<ServiceResult> Start(long id); Task<ServiceResult> Start(long id);
Task<dynamic> QueryRecord(long id); Task<dynamic> QueryRecord(long id);
Task<ServicePageResult<Ghre_ESSSurvey>> QueryESS(QueryBody filter);
} }

@ -0,0 +1,18 @@
namespace Tiobon.Core.Model;
public class Ghre_ESSSurvey
{
public long Id { get; set; }
public string SurveyClass { get; set; }
public string SurveyName { get; set; }
public DateTime? BeginTime { get; set; }
public DateTime? EndTime { get; set; }
public DateTime? SubmitDate { get; set; }
public string Status { get; set; }
public string SurveyStatus { get; set; }
public string BeginEndTime { get; set; }
public string IsAnonymous1 { get; set; }
public bool? IsAnonymous { get; set; }
}

@ -476,6 +476,12 @@ public class Ghre_ExamRecordServices : BaseServices<Ghre_ExamRecord, Ghre_ExamRe
.ExecuteCommandAsync(); .ExecuteCommandAsync();
} }
if (record.IsPass == true && record.StudyRecordId != null)
{
var studyRecord = await Db.Queryable<Ghre_StudyRecord>().Where(x => x.Id == record.StudyRecordId).FirstAsync();
await ExamHelper.MarkCompleteStatusAsync(Db, studyRecord);
}
return ServiceResult.OprateSuccess("提交成功!"); return ServiceResult.OprateSuccess("提交成功!");
} }
@ -1839,4 +1845,11 @@ public class Ghre_ExamRecordServices : BaseServices<Ghre_ExamRecord, Ghre_ExamRe
} }
#endregion #endregion
public async Task<ServiceResult> MarkCompleteStatus(long id)
{
var studyRecord = await Db.Queryable<Ghre_StudyRecord>().Where(x => x.Id == id).FirstAsync();
await ExamHelper.MarkCompleteStatusAsync(Db, studyRecord);
return ServiceResult.OprateSuccess();
}
} }

@ -1,4 +1,5 @@
using System.Text.RegularExpressions; using MySqlX.XDevAPI.Common;
using System.Text.RegularExpressions;
namespace Tiobon.Core.Services; namespace Tiobon.Core.Services;
@ -118,7 +119,6 @@ public class Ghre_SurveyServices : BaseServices<Ghre_Survey, Ghre_SurveyDto, Ins
} }
public async Task<ServiceResult<long>> InsertData(long id, InsertGhre_SurveyExtend insertModel) public async Task<ServiceResult<long>> InsertData(long id, InsertGhre_SurveyExtend insertModel)
{ {
@ -200,7 +200,6 @@ public class Ghre_SurveyServices : BaseServices<Ghre_Survey, Ghre_SurveyDto, Ins
return data; return data;
} }
public async Task<ServiceResult<Ghre_SurveyExtend>> QueryESSData(long id, long? openClassId = null) public async Task<ServiceResult<Ghre_SurveyExtend>> QueryESSData(long id, long? openClassId = null)
{ {
long? feedbackId = null; long? feedbackId = null;
@ -812,20 +811,67 @@ public class Ghre_SurveyServices : BaseServices<Ghre_Survey, Ghre_SurveyDto, Ins
return obj; return obj;
} }
public async Task<ServicePageResult<Ghre_ESSSurvey>> QueryESS(QueryBody filter)
{
var deptId = await Db.Queryable<Ghra_Staff>().Where(x => x.StaffID == App.User.StaffId).Select(x => x.DeptID).FirstAsync();
var sql1 = @$"SELECT A.Id,
A.SurveyClass,
A.SurveyName,
A.BeginTime,
A.EndTime, B.SubmitDate, A.CreateTime,A.Status SurveyStatus,A.IsAnonymous
FROM Ghre_Survey A
LEFT JOIN Ghre_SurveyRecord B ON A.Id = B.SurveyId AND B.IsEnable = 1 and B.StaffId=9
WHERE A.IsEnable = 1 AND A.Status ! = 'Temporary'
and ({App.User.StaffId} in (select value from openjson(A.StaffID))
or {deptId} in (select value from openjson(A.deptId)))";
if (string.IsNullOrWhiteSpace(filter.orderBy))
filter.orderBy = "CreateTime DESC";
if (filter.pageSize == 0)
filter.pageSize = 10000;
var countSql = @$" SELECT COUNT(1) FROM ({sql1}) A";
string conditions = " ";
if (filter.jsonParam != null)
foreach (JProperty jProperty in filter.jsonParam.Properties())
{
var name = jProperty.Name;
var value = jProperty.Value.ToString();
if (name == "page" || name == "pageSize")
continue;
if (!string.IsNullOrWhiteSpace(value))
conditions = DealConditions(conditions, name, value);
}
// public async Task<dynamic> QueryRecord(long id) sql1 += conditions;
// { countSql += conditions;
// var sql = @$"SELECT A.Id, int total = await Db.Ado.GetIntAsync(countSql);
// A.SurveyClass,
// A.SurveyName, var sql = "SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY " + filter.orderBy + ") NUM FROM (SELECT * FROM (" + sql1 + " ";
// A.BeginTime, sql += ") A ) B ) C";
// A.EndTime, B.SubmitDate
//FROM Ghre_Survey A sql += " WHERE NUM <= " + filter.pageNum * filter.pageSize + " AND NUM >" + (filter.pageNum - 1) * filter.pageSize;
// LEFT JOIN Ghre_SurveyRecord B ON A.Id = B.SurveyId AND B.IsEnable = 1 and B.StaffId=9 //sql = sql1 + sql;
//WHERE A.IsEnable = 1 AND A.Status ! = 'Temporary' var entitys = await Db.Ado.SqlQueryAsync<Ghre_ESSSurvey>(sql);
// and (9 in (select value from openjson(A.StaffID))
// or 41 in (select value from openjson(A.deptId)))"
// return obj; entitys.ForEach(async x =>
// } {
x.IsAnonymous1 = x.IsAnonymous == true ? "是" : "否";
x.Status = x.SubmitDate != null ? "已填" : "未填";
x.SurveyClass = await GetParaLabel("TrainSurveyClass", x.SurveyClass);
if (x.BeginTime != null && x.EndTime != null)
x.BeginEndTime = $"{DateTimeHelper.ConvertToMiniuteString(x.BeginTime)}~{DateTimeHelper.ConvertToMiniuteString(x.EndTime)}";
else
x.BeginEndTime = "长期";
});
return new ServicePageResult<Ghre_ESSSurvey>(filter.pageNum, total, filter.pageSize, entitys);
}
} }

@ -1,4 +1,4 @@
using Tiobon.Core.Common.Helper; using Tiobon.Core.Helper;
using Tiobon.Core.Model.Models; using Tiobon.Core.Model.Models;
namespace Tiobon.Core.Tasks; namespace Tiobon.Core.Tasks;

@ -1654,6 +1654,13 @@
<param name="id"></param> <param name="id"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Tiobon.Core.Api.Controllers.Ghre_SurveyController.QueryESS(Tiobon.Core.Model.Entity.QueryBody)">
<summary>
QueryESS
</summary>
<param name="id"></param>
<returns></returns>
</member>
<member name="T:Tiobon.Core.Api.Controllers.Ghre_SurveyOptionController"> <member name="T:Tiobon.Core.Api.Controllers.Ghre_SurveyOptionController">
<summary> <summary>
问卷调查选项(Controller) 问卷调查选项(Controller)

Loading…
Cancel
Save