电子签基础功能

This commit is contained in:
fuenmao
2026-09-07 16:17:49 +08:00
parent 384eaff444
commit da777327f5
31 changed files with 3992 additions and 61 deletions
@@ -19,7 +19,7 @@ public class OnboardingContractDocumentController
}
/// <summary>
/// 创建入职任务前,按人事当前填写的参数下载 DOCX 合同预览。
/// 创建入职任务前,按人事当前填写的参数下载指定 DOCX 合同预览。
/// </summary>
[HttpPost("preview-before-create")]
[DisplayName("创建入职任务前预览合同")]
@@ -35,6 +35,21 @@ public class OnboardingContractDocumentController
};
}
/// <summary>
/// 创建入职任务前,将全部 DOCX 合同预览打包下载。
/// </summary>
[HttpPost("preview-all-before-create")]
[DisplayName("创建入职任务前预览全部合同")]
public async Task<FileContentResult> PreviewAllBeforeCreate(
[FromBody] OnboardingContractPreviewInput input)
{
var preview = await _service.PreviewAllBeforeCreate(input);
return new FileContentResult(preview.FileBytes, "application/zip")
{
FileDownloadName = preview.FileName
};
}
/// <summary>
/// 生成入职合同文件
/// </summary>
@@ -0,0 +1,80 @@
using System.Text;
namespace SimpleAdmin.Web.Core;
/// <summary>
/// 接收契约锁服务器状态通知;第一版按平台要求使用明文回调。
/// </summary>
[ApiDescriptionSettings("Application", Tag = "入职电子签回调")]
[Route("open/onboarding/qiyuesuo")]
[AllowAnonymous]
public class OnboardingElectronicSignCallbackController
{
private readonly IOnboardingElectronicSignService _service;
private readonly IHttpContextAccessor _httpContextAccessor;
public OnboardingElectronicSignCallbackController(
IOnboardingElectronicSignService service,
IHttpContextAccessor httpContextAccessor)
{
_service = service;
_httpContextAccessor = httpContextAccessor;
}
/// <summary>
/// 接收契约锁回调并返回平台可识别的非统一响应。
/// </summary>
[HttpPost("callback")]
[NonUnify]
public async Task<IActionResult> Callback()
{
try
{
var request = _httpContextAccessor.HttpContext?.Request
?? throw new InvalidOperationException("当前请求上下文不存在");
var payloadJson = await ReadPayload(request);
await _service.HandleCallback(payloadJson);
return new OkObjectResult(new
{
code = 0,
message = "success"
});
}
catch (global::System.Exception exception)
{
// 契约锁按 HTTP 状态码判断回调是否成功;返回 500 后平台会继续重试。
return new ObjectResult(new
{
code = -1,
message = exception.Message
})
{
StatusCode = StatusCodes.Status500InternalServerError
};
}
}
/// <summary>
/// 契约锁明文回调使用表单格式;同时兼容测试工具直接发送 JSON。
/// </summary>
private static async Task<string> ReadPayload(HttpRequest request)
{
if (request.HasFormContentType)
{
var form = await request.ReadFormAsync();
var values = form
.OrderBy(item => item.Key, StringComparer.Ordinal)
.ToDictionary(
item => item.Key,
item => item.Value.ToString());
return global::System.Text.Json.JsonSerializer.Serialize(values);
}
using var reader = new StreamReader(
request.Body,
Encoding.UTF8,
true,
leaveOpen: true);
return await reader.ReadToEndAsync();
}
}
@@ -0,0 +1,97 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core;
/// <summary>
/// 提供入职任务电子签管理接口。
/// </summary>
[ApiDescriptionSettings("Application", Tag = "入职电子签约")]
[Route("biz/onboarding/electronic-sign")]
[RolePermission]
public class OnboardingElectronicSignController
{
private readonly IOnboardingElectronicSignService _service;
public OnboardingElectronicSignController(
IOnboardingElectronicSignService service)
{
_service = service;
}
/// <summary>
/// 查询入职任务的电子签状态和合同文件。
/// </summary>
[HttpGet("detail")]
[DisplayName("查看入职电子签详情")]
public async Task<OnboardingElectronicSignDetailOutput> Detail(
[FromQuery] BaseIdInput input)
{
return await _service.Detail(input);
}
/// <summary>
/// 手动发起或继续上次失败的契约锁流程。
/// </summary>
[HttpPost("initiate")]
[DisplayName("发起入职电子签")]
public async Task<OnboardingElectronicSignDetailOutput> Initiate(
[FromBody] OnboardingElectronicSignTaskInput input)
{
return await _service.Initiate(input);
}
/// <summary>
/// 保留原流程记录并创建一次全新的契约锁签约流程。
/// </summary>
[HttpPost("reinitiate")]
[DisplayName("重新发起入职电子签")]
public async Task<OnboardingElectronicSignDetailOutput> Reinitiate(
[FromBody] OnboardingElectronicSignReinitiateInput input)
{
return await _service.Reinitiate(input);
}
/// <summary>
/// 主动同步契约锁状态,完成后自动归档。
/// </summary>
[HttpPost("sync")]
[DisplayName("同步入职电子签状态")]
public async Task<OnboardingElectronicSignDetailOutput> Sync(
[FromBody] OnboardingElectronicSignTaskInput input)
{
return await _service.Sync(input);
}
/// <summary>
/// 获取仍然有效的员工签署地址,过期则重新生成。
/// </summary>
[HttpPost("get-link")]
[DisplayName("获取员工电子签链接")]
public async Task<OnboardingElectronicSignDetailOutput> GetSignLink(
[FromBody] OnboardingElectronicSignTaskInput input)
{
return await _service.GetSignLink(input);
}
/// <summary>
/// 催办当前待签员工。
/// </summary>
[HttpPost("notice")]
[DisplayName("催办员工电子签")]
public async Task Notice(
[FromBody] OnboardingElectronicSignTaskInput input)
{
await _service.Notice(input);
}
/// <summary>
/// 作废尚未结束的电子签流程。
/// </summary>
[HttpPost("invalid")]
[DisplayName("作废入职电子签")]
public async Task Invalid(
[FromBody] OnboardingElectronicSignInvalidInput input)
{
await _service.Invalid(input);
}
}