新增公司盖章与骑缝章配置

This commit is contained in:
fuenmao
2026-10-15 17:41:55 +08:00
parent 0bb8263431
commit 83854ce901
20 changed files with 607 additions and 166 deletions
@@ -805,7 +805,10 @@ public class OnboardingElectronicSignService : IOnboardingElectronicSignService
SealId = process.SealId,
CreatorName = process.CreatorName,
CreatorMobile = process.CreatorMobile,
CallbackUrl = _setting.CallbackUrl
CallbackUrl = _setting.CallbackUrl,
RequiresCompanySign = taskContracts.Any(item =>
QiyuesuoContractRequestBuilder.RequiresCompanySign(
item.CompanySealEnabled, item.AcrossPageSealEnabled, _setting))
});
process.ProviderContractId = GetContractId(providerContract);
process.ProviderStatus = providerContract.Status ?? "DRAFT";
@@ -860,7 +863,9 @@ public class OnboardingElectronicSignService : IOnboardingElectronicSignService
DocumentSort = index + 1,
OriginalDocxFileId = originalFileId,
EmployeeSignKeyword = _setting.EmployeeSignKeyword.Trim(),
CompanySealKeyword = _setting.CompanySealKeyword.Trim(),
CompanySealKeyword = _setting.CompanySealKeyword?.Trim(),
CompanySealEnabled = QiyuesuoContractRequestBuilder.CompanySealEnabled(taskContract.CompanySealEnabled),
AcrossPageSealEnabled = QiyuesuoContractRequestBuilder.AcrossPageSealEnabled(taskContract.AcrossPageSealEnabled, _setting),
Status = CommonStatusConst.ENABLE,
CreateTime = DateTime.Now,
CreateUserId = process.CreateUserId,
@@ -879,7 +884,7 @@ public class OnboardingElectronicSignService : IOnboardingElectronicSignService
}
/// <summary>
/// 为每份文档分别配置员工签名与企业盖章位置,然后一次性发送整个流程。
/// 全部文档配置员工签名,按每份文件的快照配置企业盖章及骑缝章位置。
/// </summary>
private async Task SendProcess(
ObElectronicSignProcess process,
@@ -891,79 +896,40 @@ public class OnboardingElectronicSignService : IOnboardingElectronicSignService
var personalSignatory = providerContract.Signatories.FirstOrDefault(item =>
string.Equals(item.TenantType, "PERSONAL", StringComparison.OrdinalIgnoreCase))
?? throw Oops.Bah("契约锁草稿未返回员工签署方");
var companySignatory = providerContract.Signatories.FirstOrDefault(item =>
string.Equals(item.TenantType, "COMPANY", StringComparison.OrdinalIgnoreCase))
?? throw Oops.Bah("契约锁草稿未返回企业签署方");
var companyAction = companySignatory.Actions.FirstOrDefault(item =>
string.Equals(item.Type, "COMPANY", StringComparison.OrdinalIgnoreCase))
?? throw Oops.Bah("契约锁草稿未返回企业盖章动作");
var personalSignatoryId = GetSignatoryId(personalSignatory);
var companyActionId = GetActionId(companyAction);
var stampers = new List<QiyuesuoStamperInput>();
var orderedDocuments = documents.OrderBy(item => item.DocumentSort).ToList();
var requiresCompanySign = orderedDocuments.Any(item =>
QiyuesuoContractRequestBuilder.RequiresCompanySign(
item.CompanySealEnabled, item.AcrossPageSealEnabled, _setting));
var companyAction = providerContract.Signatories
.Where(item => string.Equals(item.TenantType, "COMPANY", StringComparison.OrdinalIgnoreCase))
.SelectMany(item => item.Actions)
.FirstOrDefault(item => string.Equals(item.Type, "COMPANY", StringComparison.OrdinalIgnoreCase));
if (requiresCompanySign && companyAction == null)
throw Oops.Bah("契约锁草稿未返回企业盖章动作");
if (!requiresCompanySign && companyAction != null)
throw Oops.Bah("本次材料仅需员工签字,但契约锁业务分类仍预设企业盖章节点,请先调整该业务分类的签署流程");
var personalSignatoryId = GetSignatoryId(personalSignatory);
var companyActionId = companyAction == null ? null : GetActionId(companyAction);
var signingDocuments = orderedDocuments.Select(item =>
new OnboardingSigningDocument(
item.ProviderDocumentId,
item.EmployeeSignKeyword,
item.CompanySealKeyword,
item.CompanySealEnabled,
item.AcrossPageSealEnabled)).ToList();
var stampers = QiyuesuoContractRequestBuilder.BuildStampers(
signingDocuments, personalSignatoryId, companyActionId, process.SealId, _setting);
foreach (var document in orderedDocuments)
{
document.EmployeeActionId = personalSignatoryId;
document.CompanyActionId = companyActionId;
document.CompanyActionId = QiyuesuoContractRequestBuilder.RequiresCompanySign(
document.CompanySealEnabled, document.AcrossPageSealEnabled, _setting)
? companyActionId
: null;
document.UpdateTime = DateTime.Now;
await _db.Updateable(document).ExecuteCommandAsync();
stampers.Add(new QiyuesuoStamperInput
{
SignatoryId = personalSignatoryId,
Type = "PERSONAL",
DocumentId = document.ProviderDocumentId,
Keyword = document.EmployeeSignKeyword,
KeywordIndex = Math.Max(1, _setting.EmployeeSignKeywordIndex)
});
stampers.Add(new QiyuesuoStamperInput
{
ActionId = companyActionId,
Type = "COMPANY",
DocumentId = document.ProviderDocumentId,
SealId = process.SealId,
Keyword = document.CompanySealKeyword,
KeywordIndex = Math.Max(1, _setting.CompanySealKeywordIndex),
OffsetX = _setting.CompanySealOffsetX,
OffsetY = _setting.CompanySealOffsetY
});
}
if (_setting.EnableAcrossPageSeal)
{
var providerDocumentIds = orderedDocuments
.Select(item => item.ProviderDocumentId)
.Where(item => !string.IsNullOrWhiteSpace(item))
.ToList();
if (providerDocumentIds.Count == 0)
throw Oops.Bah("契约锁未返回可用于骑缝章的合同文档 Id");
var acrossType = _setting.AcrossPageSealType.Trim().ToUpperInvariant();
if (acrossType == "ALL_DOCUMENT")
{
stampers.Add(new QiyuesuoStamperInput
{
ActionId = companyActionId,
Type = "ACROSS_PAGE",
DocumentId = providerDocumentIds[0],
DocumentIds = string.Join(",", providerDocumentIds),
SealId = process.SealId,
AcrossType = acrossType
});
}
else
{
foreach (var providerDocumentId in providerDocumentIds)
{
stampers.Add(new QiyuesuoStamperInput
{
ActionId = companyActionId,
Type = "ACROSS_PAGE",
DocumentId = providerDocumentId,
SealId = process.SealId,
AcrossType = acrossType
});
}
}
}
var sent = await _qiyuesuoClient.Send(new QiyuesuoSendContractInput
@@ -1179,7 +1145,9 @@ public class OnboardingElectronicSignService : IOnboardingElectronicSignService
DocumentName = item.ContractName,
DocumentSort = index + 1,
OriginalDocxFileId = item.GeneratedDocxFileId ?? 0,
SignedPdfFileId = item.GeneratedPdfFileId
SignedPdfFileId = item.GeneratedPdfFileId,
CompanySealEnabled = QiyuesuoContractRequestBuilder.CompanySealEnabled(item.CompanySealEnabled),
AcrossPageSealEnabled = QiyuesuoContractRequestBuilder.AcrossPageSealEnabled(item.AcrossPageSealEnabled, _setting)
}).ToList();
return result;
}
@@ -1219,6 +1187,8 @@ public class OnboardingElectronicSignService : IOnboardingElectronicSignService
DocumentSort = item.DocumentSort,
OriginalDocxFileId = item.OriginalDocxFileId,
SignedPdfFileId = item.SignedPdfFileId,
CompanySealEnabled = QiyuesuoContractRequestBuilder.CompanySealEnabled(item.CompanySealEnabled),
AcrossPageSealEnabled = QiyuesuoContractRequestBuilder.AcrossPageSealEnabled(item.AcrossPageSealEnabled, _setting),
EmployeeSignedPreviewed = previewedDocumentIds.Contains(item.Id)
}).ToList();
}
@@ -1236,7 +1206,9 @@ public class OnboardingElectronicSignService : IOnboardingElectronicSignService
DocumentName = item.ContractName,
DocumentSort = index + 1,
OriginalDocxFileId = item.GeneratedDocxFileId ?? 0,
SignedPdfFileId = item.GeneratedPdfFileId
SignedPdfFileId = item.GeneratedPdfFileId,
CompanySealEnabled = QiyuesuoContractRequestBuilder.CompanySealEnabled(item.CompanySealEnabled),
AcrossPageSealEnabled = QiyuesuoContractRequestBuilder.AcrossPageSealEnabled(item.AcrossPageSealEnabled, _setting)
}).ToList();
}
return result;
@@ -1431,15 +1403,7 @@ public class OnboardingElectronicSignService : IOnboardingElectronicSignService
if (status == "DRAFT")
return ElectronicSignStatus.Draft;
var personal = providerContract.Signatories.FirstOrDefault(item =>
string.Equals(item.TenantType, "PERSONAL", StringComparison.OrdinalIgnoreCase));
var employeeSigned = string.Equals(
personal?.Status,
"SIGNED",
StringComparison.OrdinalIgnoreCase);
return employeeSigned
? ElectronicSignStatus.PendingCompanySeal
: ElectronicSignStatus.PendingEmployeeSign;
return QiyuesuoContractRequestBuilder.ResolvePendingStatus(providerContract);
}
private static bool IsTerminal(string status)
@@ -1588,10 +1552,9 @@ public class OnboardingElectronicSignService : IOnboardingElectronicSignService
{
throw Oops.Bah("请配置契约锁企业成员姓名和手机号");
}
if (string.IsNullOrWhiteSpace(_setting.EmployeeSignKeyword)
|| string.IsNullOrWhiteSpace(_setting.CompanySealKeyword))
if (string.IsNullOrWhiteSpace(_setting.EmployeeSignKeyword))
{
throw Oops.Bah("请配置员工签名和企业盖章定位关键字");
throw Oops.Bah("请配置员工签名定位关键字");
}
if (_setting.CompanySealOffsetX <= -1m || _setting.CompanySealOffsetX >= 1m
|| _setting.CompanySealOffsetY <= -1m || _setting.CompanySealOffsetY >= 1m)