f
This commit is contained in:
@@ -9,7 +9,6 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/shopspring/decimal"
|
||||
"tyapi-server/internal/application/certification/dto/commands"
|
||||
"tyapi-server/internal/application/certification/dto/queries"
|
||||
"tyapi-server/internal/application/certification/dto/responses"
|
||||
@@ -19,11 +18,11 @@ import (
|
||||
certification_value_objects "tyapi-server/internal/domains/certification/entities/value_objects"
|
||||
"tyapi-server/internal/domains/certification/enums"
|
||||
"tyapi-server/internal/domains/certification/repositories"
|
||||
"tyapi-server/internal/domains/certification/services"
|
||||
finance_entities "tyapi-server/internal/domains/finance/entities"
|
||||
finance_repositories "tyapi-server/internal/domains/finance/repositories"
|
||||
"tyapi-server/internal/domains/certification/services"
|
||||
subordinate_repositories "tyapi-server/internal/domains/subordinate/repositories"
|
||||
finance_service "tyapi-server/internal/domains/finance/services"
|
||||
subordinate_repositories "tyapi-server/internal/domains/subordinate/repositories"
|
||||
user_entities "tyapi-server/internal/domains/user/entities"
|
||||
user_service "tyapi-server/internal/domains/user/services"
|
||||
"tyapi-server/internal/infrastructure/external/notification"
|
||||
@@ -32,6 +31,8 @@ import (
|
||||
"tyapi-server/internal/shared/esign"
|
||||
sharedOCR "tyapi-server/internal/shared/ocr"
|
||||
|
||||
"github.com/shopspring/decimal"
|
||||
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
@@ -726,7 +727,7 @@ func (s *CertificationApplicationServiceImpl) HandleEsignCallback(
|
||||
}
|
||||
|
||||
// 生成合同
|
||||
err = s.generateAndAddContractFile(txCtx, cert, record.CompanyName, record.LegalPersonName, record.UnifiedSocialCode, record.EnterpriseAddress, record.LegalPersonPhone, record.LegalPersonID)
|
||||
err = s.generateAndAddContractFile(txCtx, cert, record.CompanyName, record.UnifiedSocialCode, record.EnterpriseAddress, pickAuthorizedRepName(record, record.LegalPersonName))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -1287,6 +1288,25 @@ func (s *CertificationApplicationServiceImpl) validateContractApplicationPrecond
|
||||
return nil
|
||||
}
|
||||
|
||||
// pickAuthorizedRepName 合同模板「客户授权代表」: 优先企业提交记录中的授权代表, 否则为法定代表人
|
||||
func pickAuthorizedRepName(record *entities.EnterpriseInfoSubmitRecord, legalPersonName string) string {
|
||||
if record != nil && strings.TrimSpace(record.AuthorizedRepName) != "" {
|
||||
return strings.TrimSpace(record.AuthorizedRepName)
|
||||
}
|
||||
return legalPersonName
|
||||
}
|
||||
|
||||
// pickEnterpriseString 优先用户域企业表字段,为空则用最近一次认证提交记录(避免 enterprise_infos 未同步导致合同控件无值)
|
||||
func pickEnterpriseString(primary string, record *entities.EnterpriseInfoSubmitRecord, fromRecord func(*entities.EnterpriseInfoSubmitRecord) string) string {
|
||||
if strings.TrimSpace(primary) != "" {
|
||||
return strings.TrimSpace(primary)
|
||||
}
|
||||
if record == nil {
|
||||
return ""
|
||||
}
|
||||
return strings.TrimSpace(fromRecord(record))
|
||||
}
|
||||
|
||||
// generateContractAndSignURL 生成合同和签署链接
|
||||
func (s *CertificationApplicationServiceImpl) generateContractAndSignURL(ctx context.Context, cert *entities.Certification, enterpriseInfo *user_entities.EnterpriseInfo) (*certification_value_objects.ContractInfo, error) {
|
||||
// 发起签署流程
|
||||
@@ -1361,7 +1381,7 @@ func (s *CertificationApplicationServiceImpl) completeEnterpriseVerification(
|
||||
}
|
||||
|
||||
// 生成合同
|
||||
err = s.generateAndAddContractFile(ctx, cert, record.CompanyName, record.LegalPersonName, record.UnifiedSocialCode, record.EnterpriseAddress, record.LegalPersonPhone, record.LegalPersonID)
|
||||
err = s.generateAndAddContractFile(ctx, cert, record.CompanyName, record.UnifiedSocialCode, record.EnterpriseAddress, pickAuthorizedRepName(record, record.LegalPersonName))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -1383,27 +1403,41 @@ func (s *CertificationApplicationServiceImpl) generateAndAddContractFile(
|
||||
ctx context.Context,
|
||||
cert *entities.Certification,
|
||||
companyName string,
|
||||
legalPersonName string,
|
||||
unifiedSocialCode string,
|
||||
enterpriseAddress string,
|
||||
legalPersonPhone string,
|
||||
legalPersonID string,
|
||||
authorizedRepName string,
|
||||
) error {
|
||||
s.logger.Info("合同生成-步骤1-开始填充合同模板",
|
||||
zap.String("user_id", cert.UserID),
|
||||
zap.String("company_name", companyName))
|
||||
|
||||
// 协议编号:已有则复用,否则新生成
|
||||
if cert.ContractCode == "" {
|
||||
cert.SetContractCode(user_entities.GenerateContractCode(user_entities.ContractTypeCooperation))
|
||||
}
|
||||
agreementNo := cert.ContractCode
|
||||
|
||||
// e签宝日期控件格式必须与模板预设一致(本模板为 yyyy年MM月dd日)
|
||||
signDate := time.Now().Format("2006年01月02日")
|
||||
|
||||
if strings.TrimSpace(unifiedSocialCode) == "" {
|
||||
s.logger.Warn("合同模板控件 jftyshxydm:统一社会信用代码为空;若 PDF 上该处空白,请核对 enterprise_infos.unified_social_code、提交记录或 e签宝模板控件 componentKey 是否与代码键名一致",
|
||||
zap.String("user_id", cert.UserID))
|
||||
}
|
||||
|
||||
// 控件 key 须与 e签宝控制台该控件「控件编码/componentKey」完全一致(区分大小写)
|
||||
fileComponent := map[string]string{
|
||||
"YFCompanyName": companyName,
|
||||
"YFCompanyName2": companyName,
|
||||
"YFLegalPersonName": legalPersonName,
|
||||
"YFLegalPersonName2": legalPersonName,
|
||||
"YFUnifiedSocialCode": unifiedSocialCode,
|
||||
"YFEnterpriseAddress": enterpriseAddress,
|
||||
"YFContactPerson": legalPersonName,
|
||||
"YFMobile": legalPersonPhone,
|
||||
"SignDate": time.Now().Format("2006年01月02日"),
|
||||
"SignDate2": time.Now().Format("2006年01月02日"),
|
||||
"SignDate3": time.Now().Format("2006年01月02日"),
|
||||
"jfqym": companyName,
|
||||
"jfqym2": companyName,
|
||||
"jfsqdb": authorizedRepName,
|
||||
"jftyshxydm": unifiedSocialCode,
|
||||
"jflxdz": enterpriseAddress,
|
||||
// 甲方
|
||||
"xybh": agreementNo,
|
||||
"qsrq1": signDate,
|
||||
"qsrq3": signDate,
|
||||
// 乙方
|
||||
"qsrq2": signDate,
|
||||
}
|
||||
fillTemplateResp, err := s.esignClient.FillTemplate(fileComponent)
|
||||
if err != nil {
|
||||
@@ -1412,7 +1446,8 @@ func (s *CertificationApplicationServiceImpl) generateAndAddContractFile(
|
||||
}
|
||||
s.logger.Info("合同生成-步骤1-模板填充成功",
|
||||
zap.String("user_id", cert.UserID),
|
||||
zap.String("file_id", fillTemplateResp.FileID))
|
||||
zap.String("file_id", fillTemplateResp.FileID),
|
||||
zap.String("contract_code", agreementNo))
|
||||
err = cert.AddContractFileID(fillTemplateResp.FileID, fillTemplateResp.FileDownloadUrl)
|
||||
if err != nil {
|
||||
s.logger.Error("加入合同文件ID链接失败", zap.Error(err))
|
||||
@@ -1432,9 +1467,26 @@ func (s *CertificationApplicationServiceImpl) updateContractFile(ctx context.Con
|
||||
s.logger.Error("获取企业信息失败", zap.Error(err))
|
||||
return fmt.Errorf("获取企业信息失败: %w", err)
|
||||
}
|
||||
if enterpriseInfo.EnterpriseInfo == nil {
|
||||
return fmt.Errorf("用户企业信息不存在")
|
||||
}
|
||||
|
||||
ei := enterpriseInfo.EnterpriseInfo
|
||||
submitRec, recErr := s.enterpriseInfoSubmitRecordRepo.FindLatestByUserID(ctx, cert.UserID)
|
||||
if recErr != nil {
|
||||
s.logger.Warn("更新合同时加载企业提交记录失败,统一社会信用代码等仅以用户域为准",
|
||||
zap.String("user_id", cert.UserID),
|
||||
zap.Error(recErr))
|
||||
submitRec = nil
|
||||
}
|
||||
authRep := pickAuthorizedRepName(submitRec, ei.LegalPersonName)
|
||||
|
||||
company := pickEnterpriseString(ei.CompanyName, submitRec, func(r *entities.EnterpriseInfoSubmitRecord) string { return r.CompanyName })
|
||||
uscc := pickEnterpriseString(ei.UnifiedSocialCode, submitRec, func(r *entities.EnterpriseInfoSubmitRecord) string { return r.UnifiedSocialCode })
|
||||
addr := pickEnterpriseString(ei.EnterpriseAddress, submitRec, func(r *entities.EnterpriseInfoSubmitRecord) string { return r.EnterpriseAddress })
|
||||
|
||||
// 生成合同
|
||||
err = s.generateAndAddContractFile(ctx, cert, enterpriseInfo.EnterpriseInfo.CompanyName, enterpriseInfo.EnterpriseInfo.LegalPersonName, enterpriseInfo.EnterpriseInfo.UnifiedSocialCode, enterpriseInfo.EnterpriseInfo.EnterpriseAddress, enterpriseInfo.EnterpriseInfo.LegalPersonPhone, enterpriseInfo.EnterpriseInfo.LegalPersonID)
|
||||
err = s.generateAndAddContractFile(ctx, cert, company, uscc, addr, authRep)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -1571,16 +1623,29 @@ func (s *CertificationApplicationServiceImpl) handleContractAfterSignComplete(ct
|
||||
|
||||
s.logger.Info("合同文件已上传七牛云", zap.String("file_name", fileName), zap.String("qiniu_url", qiniuURL))
|
||||
|
||||
// 4. 保存到合同聚合根
|
||||
_, err = s.contractAggregateService.CreateContract(
|
||||
ctx,
|
||||
user.EnterpriseInfo.ID,
|
||||
cert.UserID,
|
||||
fileName,
|
||||
user_entities.ContractTypeCooperation,
|
||||
fileId,
|
||||
qiniuURL,
|
||||
)
|
||||
// 4. 保存到合同聚合根(复用认证阶段生成的合同编号;旧数据无编号时退回自动生成)
|
||||
if strings.TrimSpace(cert.ContractCode) != "" {
|
||||
_, err = s.contractAggregateService.CreateContractWithCode(
|
||||
ctx,
|
||||
user.EnterpriseInfo.ID,
|
||||
cert.UserID,
|
||||
fileName,
|
||||
user_entities.ContractTypeCooperation,
|
||||
fileId,
|
||||
qiniuURL,
|
||||
strings.TrimSpace(cert.ContractCode),
|
||||
)
|
||||
} else {
|
||||
_, err = s.contractAggregateService.CreateContract(
|
||||
ctx,
|
||||
user.EnterpriseInfo.ID,
|
||||
cert.UserID,
|
||||
fileName,
|
||||
user_entities.ContractTypeCooperation,
|
||||
fileId,
|
||||
qiniuURL,
|
||||
)
|
||||
}
|
||||
if err != nil {
|
||||
s.logger.Error("保存合同信息到聚合根失败", zap.String("file_name", fileName), zap.Error(err))
|
||||
continue
|
||||
|
||||
1733
internal/application/certification/new.md
Normal file
1733
internal/application/certification/new.md
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user