Fix product performance grouped JSON build

This commit is contained in:
M_Kececi
2026-08-28 20:45:11 +03:00
parent 945868d83d
commit b7131ac6ce
3 changed files with 102 additions and 31 deletions
+56 -23
View File
@@ -799,42 +799,68 @@ type ArgeBaggiDepotEntryTotals struct {
Yelek float64
}
type ArgeBaggiDepotEntryLookup struct {
WorkOrder string
ModelCode string
}
func ArgeBaggiDepotEntryKey(workOrder string, modelCode string) string {
return strings.TrimSpace(workOrder) + "\x1f" + normalizeArgeBaggiModelCode(modelCode)
}
func normalizeArgeBaggiModelCode(modelCode string) string {
normalizedModelCode := strings.ToUpper(strings.TrimSpace(modelCode))
if separatorIndex := strings.LastIndex(normalizedModelCode, "-"); separatorIndex >= 0 && separatorIndex+1 < len(normalizedModelCode) {
return strings.TrimSpace(normalizedModelCode[separatorIndex+1:])
}
return normalizedModelCode
}
// GetArgeBaggiDepotEntryTotals returns operation 985/986/987 quantities keyed
// by production work order. The requested work orders are queried in one batch
// to avoid an ArgeBAGGI round trip for every list row.
func GetArgeBaggiDepotEntryTotals(ctx context.Context, argeDB *sql.DB, workOrders []string) (map[string]ArgeBaggiDepotEntryTotals, error) {
// by production work order AND product model. A row contributes only when both
// MN.model_adi (work order) and MD.model_code (model) match the requested pair.
func GetArgeBaggiDepotEntryTotals(ctx context.Context, argeDB *sql.DB, lookups []ArgeBaggiDepotEntryLookup) (map[string]ArgeBaggiDepotEntryTotals, error) {
out := make(map[string]ArgeBaggiDepotEntryTotals)
if argeDB == nil || len(workOrders) == 0 {
if argeDB == nil || len(lookups) == 0 {
return out, nil
}
seen := make(map[string]struct{}, len(workOrders))
values := make([]string, 0, len(workOrders))
for _, raw := range workOrders {
value := strings.TrimSpace(raw)
if value == "" || value == "0" {
seen := make(map[string]struct{}, len(lookups))
values := make([]ArgeBaggiDepotEntryLookup, 0, len(lookups))
for _, lookup := range lookups {
workOrder := strings.TrimSpace(lookup.WorkOrder)
modelCode := normalizeArgeBaggiModelCode(lookup.ModelCode)
if workOrder == "" || workOrder == "0" || modelCode == "" {
continue
}
if _, exists := seen[value]; exists {
key := ArgeBaggiDepotEntryKey(workOrder, modelCode)
if _, exists := seen[key]; exists {
continue
}
seen[value] = struct{}{}
values = append(values, value)
seen[key] = struct{}{}
values = append(values, ArgeBaggiDepotEntryLookup{WorkOrder: workOrder, ModelCode: modelCode})
}
if len(values) == 0 {
return out, nil
}
placeholders := make([]string, 0, len(values))
args := make([]any, 0, len(values))
valueRows := make([]string, 0, len(values))
args := make([]any, 0, len(values)*2)
for i, value := range values {
placeholders = append(placeholders, fmt.Sprintf("@p%d", i+1))
args = append(args, value)
workOrderParam := i*2 + 1
modelCodeParam := workOrderParam + 1
valueRows = append(valueRows, fmt.Sprintf("(@p%d, @p%d)", workOrderParam, modelCodeParam))
args = append(args, value.WorkOrder, value.ModelCode)
}
sqlText := fmt.Sprintf(`
WITH RequestedPairs (IsEmriNo, ModelKodu) AS (
SELECT V.IsEmriNo, V.ModelKodu
FROM (VALUES %s) V (IsEmriNo, ModelKodu)
)
SELECT
LTRIM(RTRIM(CONVERT(VARCHAR(64), MN.model_adi))) AS IsEmriNo,
RP.IsEmriNo,
RP.ModelKodu,
SUM(CASE WHEN O.oper_num = 985 THEN CONVERT(float, B.adet) ELSE 0 END) AS CeketDepoGiris,
SUM(CASE WHEN O.oper_num = 986 THEN CONVERT(float, B.adet) ELSE 0 END) AS PantolonDepoGiris,
SUM(CASE WHEN O.oper_num = 987 THEN CONVERT(float, B.adet) ELSE 0 END) AS YelekDepoGiris
@@ -846,12 +872,14 @@ INNER JOIN dbo.model_num MN ON I.model_num = MN.model_num
INNER JOIN dbo.bant_no BN ON I.bant_num = BN.bant_no
INNER JOIN dbo.model_oper MO ON O.oper_num = MO.oper_num AND MD.mdef_num = MO.model_num
INNER JOIN dbo.model_oper_tkp_def TD ON MO.tkp_cik = TD.tkp_cik
INNER JOIN RequestedPairs RP
ON RP.IsEmriNo = LTRIM(RTRIM(CONVERT(VARCHAR(64), MN.model_adi)))
AND RP.ModelKodu = UPPER(LTRIM(RTRIM(CONVERT(VARCHAR(64), MD.model_code))))
WHERE B.tarih >= '2025-01-01'
AND TD.tkp_cik IN (1,2,3,4,5)
AND O.oper_num IN (985,986,987)
AND LTRIM(RTRIM(CONVERT(VARCHAR(64), MN.model_adi))) IN (%s)
GROUP BY LTRIM(RTRIM(CONVERT(VARCHAR(64), MN.model_adi)))
`, strings.Join(placeholders, ","))
GROUP BY RP.IsEmriNo, RP.ModelKodu
`, strings.Join(valueRows, ","))
rows, err := argeDB.QueryContext(ctx, sqlText, args...)
if err != nil {
@@ -860,13 +888,18 @@ GROUP BY LTRIM(RTRIM(CONVERT(VARCHAR(64), MN.model_adi)))
defer rows.Close()
for rows.Next() {
var workOrder string
var modelCode string
var totals ArgeBaggiDepotEntryTotals
if err := rows.Scan(&workOrder, &totals.Ceket, &totals.Pantolon, &totals.Yelek); err != nil {
if err := rows.Scan(&workOrder, &modelCode, &totals.Ceket, &totals.Pantolon, &totals.Yelek); err != nil {
return nil, err
}
out[strings.TrimSpace(workOrder)] = totals
out[ArgeBaggiDepotEntryKey(workOrder, modelCode)] = totals
}
return out, rows.Err()
if err := rows.Err(); err != nil {
return nil, err
}
return out, nil
}
func GetProductionHasCostProducts(