Refactor NoticeWorker to Enhance Tender Creation Logic

- Updated the ToTender method to accept a tender instance, allowing for direct population of tender fields from the notice entity.
- Simplified the tender creation and update process by checking if the tender ID is zero, streamlining the logic for handling tender entities.
- Removed the commented-out code related to AI translation, improving code clarity and maintainability.
- Enhanced error logging for tender creation and update failures, ensuring better visibility into potential issues during processing.
This commit is contained in:
n.nakhostin
2025-10-18 09:02:11 +03:30
parent 0747908873
commit 8e5308b70b
+66 -93
View File
@@ -2,7 +2,6 @@ package workers
import ( import (
"context" "context"
"fmt"
"tm/internal/notice" "tm/internal/notice"
"tm/internal/tender" "tm/internal/tender"
"tm/pkg/logger" "tm/pkg/logger"
@@ -54,15 +53,12 @@ func (w *NoticeWorker) Run() {
"notice": n.ID.Hex(), "notice": n.ID.Hex(),
}) })
// exists, err := w.TenderRepo.GetByNoticePublicationID(context.Background(), n.NoticePublicationID) t, err := w.TenderRepo.GetByNoticePublicationID(context.Background(), n.NoticePublicationID)
// if err != nil { if err == nil {
// w.Logger.Error("Failed to get tender", map[string]interface{}{ continue
// "error": err.Error(), }
// })
// continue
// }
t, err := w.ToTender(&n) err = w.ToTender(&n, t)
if err != nil { if err != nil {
w.Logger.Error("Failed to create tender", map[string]interface{}{ w.Logger.Error("Failed to create tender", map[string]interface{}{
"error": err.Error(), "error": err.Error(),
@@ -70,34 +66,28 @@ func (w *NoticeWorker) Run() {
continue continue
} }
err = w.TenderRepo.Create(context.Background(), t) if t.ID.IsZero() {
if err != nil { err = w.TenderRepo.Create(context.Background(), t)
w.Logger.Error("Failed to create tender", map[string]interface{}{ if err != nil {
"error": err.Error(), w.Logger.Error("Failed to create tender", map[string]interface{}{
}) "error": err.Error(),
})
}
} else {
err = w.TenderRepo.Update(context.Background(), t)
if err != nil {
w.Logger.Error("Failed to update tender", map[string]interface{}{
"error": err.Error(),
})
}
} }
} }
skip += limit skip += limit
} }
} }
func (w *NoticeWorker) translateAI(msg string) (string, error) { func (w *NoticeWorker) ToTender(n *notice.Notice, t *tender.Tender) error {
builder := w.Ollama.NewChatBuilder().SetStream(false).SetMaxTokens(200000)
chat, err := builder.AddMessage(ollama.MessageRoleUser, fmt.Sprintf("Translate the following text into fluent, natural English while keeping the original meaning and tone. Do not summarize, shorten, or add extra explanations. Just provide the translation without other additional values. %s", msg)).Build()
if err != nil {
return "", err
}
resp, err := w.Ollama.Chat(context.Background(), chat)
if err != nil {
return "", err
}
return resp.Message.Content, nil
}
func (w *NoticeWorker) ToTender(n *notice.Notice) (*tender.Tender, error) {
// Buyer Organization // Buyer Organization
buyerOrg := &tender.Organization{} buyerOrg := &tender.Organization{}
if n.BuyerOrganization != nil { if n.BuyerOrganization != nil {
@@ -234,67 +224,50 @@ func (w *NoticeWorker) ToTender(n *notice.Notice) (*tender.Tender, error) {
} }
} }
title, err := w.translateAI(n.Title) t.NoticePublicationID = n.NoticePublicationID
if err != nil { t.Title = n.Title
return nil, fmt.Errorf("failed to translate title: %w", err) t.Description = n.Description
} t.ProcurementTypeCode = n.ProcurementTypeCode
t.ProcedureCode = n.ProcedureCode
description, err := w.translateAI(n.Description) t.EstimatedValue = n.EstimatedValue
if err != nil { t.Currency = n.Currency
return nil, fmt.Errorf("failed to translate description: %w", err) t.TenderDeadline = n.TenderDeadline
} t.SubmissionURL = n.SubmissionURL
t.BuyerOrganization = buyerOrg
return &tender.Tender{ t.ReviewOrganization = reviewOrg
NoticePublicationID: n.NoticePublicationID, t.Organizations = organizations
Title: title, t.SelectionCriteria = selectionCriteria
Description: description, t.WinningTenderer = winningTenderer
ProcurementTypeCode: n.ProcurementTypeCode, t.Modifications = modifications
ProcedureCode: n.ProcedureCode, t.AwardedEntities = awardedEntities
EstimatedValue: n.EstimatedValue, t.NoticeTypeCode = n.NoticeTypeCode
Currency: n.Currency, t.NoticeSubTypeCode = n.NoticeSubTypeCode
TenderDeadline: n.TenderDeadline, t.NoticeLanguageCode = n.NoticeLanguageCode
SubmissionURL: n.SubmissionURL, t.IssueDate = n.IssueDate
BuyerOrganization: buyerOrg, t.IssueTime = n.IssueTime
ReviewOrganization: reviewOrg, t.PublicationDate = n.PublicationDate
Organizations: organizations, t.SubmissionDeadline = n.SubmissionDeadline
SelectionCriteria: selectionCriteria, t.ApplicationDeadline = n.ApplicationDeadline
Status: tender.TenderStatus(n.Status), t.GazetteID = n.GazetteID
Source: tender.TenderSource(n.Source), t.PlaceOfPerformance = n.PlaceOfPerformance
SourceFileURL: n.SourceFileURL, t.CountryCode = n.CountryCode
SourceFileName: n.SourceFileName, t.RegionCode = n.RegionCode
TenderID: n.TenderID, t.CityName = n.CityName
ContractNoticeID: n.ContractNoticeID, t.PostalCode = n.PostalCode
ContractFolderID: n.ContractFolderID, t.DocumentURI = n.DocumentURI
NoticeTypeCode: n.NoticeTypeCode, t.TenderURL = n.TenderURL
NoticeSubTypeCode: n.NoticeSubTypeCode, t.MainClassification = n.MainClassification
NoticeLanguageCode: n.NoticeLanguageCode, t.AdditionalClassifications = n.AdditionalClassifications
IssueDate: n.IssueDate, t.OfficialLanguages = n.OfficialLanguages
IssueTime: n.IssueTime, t.CancellationReason = n.CancellationReason
PublicationDate: n.PublicationDate, t.CancellationDate = n.CancellationDate
SubmissionDeadline: n.SubmissionDeadline, t.AwardDate = n.AwardDate
ApplicationDeadline: n.ApplicationDeadline, t.AwardedValue = n.AwardedValue
GazetteID: n.GazetteID, t.ContractNumber = n.ContractNumber
Duration: n.Duration, t.SuspensionReason = n.SuspensionReason
DurationUnit: n.DurationUnit, t.SuspensionDate = n.SuspensionDate
PlaceOfPerformance: n.PlaceOfPerformance, t.WinningTenderer = winningTenderer
CountryCode: n.CountryCode, t.Modifications = modifications
RegionCode: n.RegionCode, t.AwardedEntities = awardedEntities
CityName: n.CityName, return nil
PostalCode: n.PostalCode,
DocumentURI: n.DocumentURI,
TenderURL: n.TenderURL,
MainClassification: n.MainClassification,
AdditionalClassifications: n.AdditionalClassifications,
OfficialLanguages: n.OfficialLanguages,
CancellationReason: n.CancellationReason,
CancellationDate: n.CancellationDate,
AwardDate: n.AwardDate,
AwardedValue: n.AwardedValue,
ContractNumber: n.ContractNumber,
SuspensionReason: n.SuspensionReason,
SuspensionDate: n.SuspensionDate,
WinningTenderer: winningTenderer,
Modifications: modifications,
AwardedEntities: awardedEntities,
}, nil
} }