package test_data import ( "gitee.com/golang-module/carbon/v2" "github.com/shopspring/decimal" "gorm.io/gorm" "math" "sort" "strconv" "testData/global" "testData/model" "testData/request" ) func PackagePassProbabilityLine(r *request.PackagePassProbabilityLine) ([]*model.Line, int, int) { var sql string if r.OrderDateStart != "" && r.OrderDateEnd != "" { sql += "tc_sfc02 BETWEEN DATE '" + r.OrderDateStart + "' AND DATE '" + r.OrderDateEnd + "'" } //else if r.OrderDateStart != "" && r.OrderDateEnd == "" { // sql += "tc_sfc02 >= DATE '" + r.OrderDateStart + "'" //} else if r.OrderDateStart == "" && r.OrderDateEnd != "" { // sql += "tc_sfc02 <= DATE '" + r.OrderDateEnd + "'" //} var factories, x []string if len(r.Factory) == 0 { global.Oracle.Model(&model.TcSfcFile{}).Where("tc_sfc08 LIKE ?", "%AB%").Where(sql). Group("tc_sfc04").Select("tc_sfc04").Find(&factories) } else { factories = r.Factory } productMap := make(map[string]int) for _, product := range r.Product { productMap[product] = 1 } lotMap := make(map[string]int) for _, lot := range r.Lot { lotMap[lot] = 1 } specificationMap := make(map[string]int) for _, specification := range r.Package { specificationMap[specification] = 1 } if r.DateSize == "天" { days := int(carbon.Parse(r.OrderDateStart).DiffAbsInDays(carbon.Parse(r.OrderDateEnd))) + 1 for i := 0; i < days; i++ { x = append(x, carbon.Parse(r.OrderDateStart).AddDays(i).Format("Y-m-d")) } } else if r.DateSize == "周" { weeks := int(carbon.Parse(r.OrderDateStart).DiffAbsInWeeks(carbon.Parse(r.OrderDateEnd))) + 1 for i := 0; i < weeks; i++ { x = append(x, carbon.Parse(r.OrderDateStart).AddWeeks(i).Format("Y-m-d")) } } else if r.DateSize == "月" { months := int(carbon.Parse(r.OrderDateStart).DiffAbsInMonths(carbon.Parse(r.OrderDateEnd))) + 1 for i := 0; i < months; i++ { x = append(x, carbon.Parse(r.OrderDateStart).AddMonths(i).Format("Y-m")) } } else if r.DateSize == "年" { years := int(carbon.Parse(r.OrderDateStart).DiffAbsInYears(carbon.Parse(r.OrderDateEnd))) + 1 for i := 0; i < years; i++ { x = append(x, carbon.Parse(r.OrderDateStart).AddYears(i).Format("Y")) } } max := math.MinInt min := math.MaxInt var line []*model.Line for _, factory := range factories { var tcSfcFile []*model.TcSfcFile global.Oracle.Where("tc_sfc08 LIKE ? AND tc_sfc04 = ?", "%AB%", factory).Where(sql). Preload("PmcFile"). Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile").Preload("RvaFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }).Order("tc_sfc02").Find(&tcSfcFile) quantityMap := make(map[string][]float64) var y []string for _, tcSfc := range tcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { if _, ok := productMap[tcSfd.ImaFile.Ima02]; !ok && len(productMap) > 0 { continue } if _, ok := specificationMap[tcSfd.ImaFile.Ima021]; !ok && len(specificationMap) > 0 { continue } var stockInQuantity, failQuantity float64 //for _, rva := range tcSfd.RvaFile { for _, idd := range tcSfd.RvaFile.IddFile { if _, ok := lotMap[idd.Idd04]; !ok && len(lotMap) > 0 { continue } stockInQuantity += idd.Idd13 if idd.Idd06 == "BIN99" { failQuantity += idd.Idd13 } } //} var s string if r.DateSize == "天" { s = carbon.Parse(r.OrderDateStart).AddDays(int(carbon.Parse(r.OrderDateStart). DiffAbsInDays(carbon.CreateFromStdTime(tcSfc.TcSfc02)))).Format("Y-m-d") } else if r.DateSize == "周" { s = carbon.Parse(r.OrderDateStart).AddWeeks(int(carbon.Parse(r.OrderDateStart). DiffAbsInWeeks(carbon.CreateFromStdTime(tcSfc.TcSfc02)))).Format("Y-m-d") } else if r.DateSize == "月" { s = carbon.Parse(r.OrderDateStart).AddMonths(int(carbon.Parse(r.OrderDateStart). DiffAbsInMonths(carbon.CreateFromStdTime(tcSfc.TcSfc02)))).Format("Y-m") } else if r.DateSize == "年" { s = carbon.Parse(r.OrderDateStart).AddYears(int(carbon.Parse(r.OrderDateStart). DiffAbsInYears(carbon.CreateFromStdTime(tcSfc.TcSfc02)))).Format("Y") } if _, ok := quantityMap[s]; !ok { quantityMap[s] = []float64{stockInQuantity - failQuantity, stockInQuantity} } else { quantityMap[s][0] += stockInQuantity - failQuantity quantityMap[s][1] += stockInQuantity } } } for _, xDate := range x { if _, ok := quantityMap[xDate]; ok { if quantityMap[xDate][1] == 0 { y = append(y, "") } else { passProbability := decimal.NewFromFloat(quantityMap[xDate][0]).Div(decimal.NewFromFloat(quantityMap[xDate][1])). Round(4).Mul(decimal.NewFromFloat(100)) passProbabilityInt, _ := strconv.Atoi(passProbability.Round(0).String()) if passProbabilityInt > max { max = passProbabilityInt + 1 } if passProbabilityInt < min { min = passProbabilityInt - 1 } y = append(y, passProbability.String()) } } else { y = append(y, "") } } line = append(line, &model.Line{ Name: factory, X: x, Y: y, }) } return line, max, min } func OrderNumberHistogram(r *request.PackagePassProbabilityLine) []*model.Histogram { var fTHistogram []*model.Histogram var sql string if r.OrderDateStart != "" && r.OrderDateEnd != "" { sql += "tc_sfc02 BETWEEN DATE '" + r.OrderDateStart + "' AND DATE '" + r.OrderDateEnd + "'" } //else if r.OrderDateStart != "" && r.OrderDateEnd == "" { // sql += "tc_sfc02 >= DATE '" + r.OrderDateStart + "'" //} else if r.OrderDateStart == "" && r.OrderDateEnd != "" { // sql += "tc_sfc02 <= DATE '" + r.OrderDateEnd + "'" //} var factories, x []string if len(r.Factory) == 0 { global.Oracle.Model(&model.TcSfcFile{}).Where("tc_sfc08 LIKE ?", "%AB%").Where(sql). Group("tc_sfc04").Select("tc_sfc04").Find(&factories) } else { factories = r.Factory } productMap := make(map[string]int) for _, product := range r.Product { productMap[product] = 1 } lotMap := make(map[string]int) for _, lot := range r.Lot { lotMap[lot] = 1 } specificationMap := make(map[string]int) for _, specification := range r.Package { specificationMap[specification] = 1 } if r.DateSize == "天" { days := int(carbon.Parse(r.OrderDateStart).DiffAbsInDays(carbon.Parse(r.OrderDateEnd))) + 1 for i := 0; i < days; i++ { x = append(x, carbon.Parse(r.OrderDateStart).AddDays(i).Format("Y-m-d")) } } else if r.DateSize == "周" { weeks := int(carbon.Parse(r.OrderDateStart).DiffAbsInWeeks(carbon.Parse(r.OrderDateEnd))) + 1 for i := 0; i < weeks; i++ { x = append(x, carbon.Parse(r.OrderDateStart).AddWeeks(i).Format("Y-m-d")) } } else if r.DateSize == "月" { months := int(carbon.Parse(r.OrderDateStart).DiffAbsInMonths(carbon.Parse(r.OrderDateEnd))) + 1 for i := 0; i < months; i++ { x = append(x, carbon.Parse(r.OrderDateStart).AddMonths(i).Format("m")) } } else if r.DateSize == "年" { years := int(carbon.Parse(r.OrderDateStart).DiffAbsInYears(carbon.Parse(r.OrderDateEnd))) + 1 for i := 0; i < years; i++ { x = append(x, carbon.Parse(r.OrderDateStart).AddYears(i).Format("Y")) } } for _, factory := range factories { var tcSfcFile []*model.TcSfcFile global.Oracle.Where("tc_sfc08 LIKE ? AND tc_sfc04 = ?", "%AB%", factory).Where(sql). Preload("PmcFile"). Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile").Preload("RvaFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }).Order("tc_sfc02").Find(&tcSfcFile) quantityMap := make(map[string]float64) var y []string for _, tcSfc := range tcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { if _, ok := productMap[tcSfd.ImaFile.Ima02]; !ok && len(productMap) > 0 { continue } if _, ok := specificationMap[tcSfd.ImaFile.Ima021]; !ok && len(specificationMap) > 0 { continue } var stockInQuantity float64 //for _, rva := range tcSfd.RvaFile { for _, idd := range tcSfd.RvaFile.IddFile { if _, ok := lotMap[idd.Idd04]; !ok && len(lotMap) > 0 { continue } stockInQuantity += idd.Idd13 } //} var s string if r.DateSize == "天" { s = carbon.Parse(r.OrderDateStart).AddDays(int(carbon.Parse(r.OrderDateStart). DiffAbsInDays(carbon.CreateFromStdTime(tcSfc.TcSfc02)))).Format("Y-m-d") } else if r.DateSize == "周" { s = carbon.Parse(r.OrderDateStart).AddWeeks(int(carbon.Parse(r.OrderDateStart). DiffAbsInWeeks(carbon.CreateFromStdTime(tcSfc.TcSfc02)))).Format("Y-m-d") } else if r.DateSize == "月" { s = carbon.Parse(r.OrderDateStart).AddMonths(int(carbon.Parse(r.OrderDateStart). DiffAbsInMonths(carbon.CreateFromStdTime(tcSfc.TcSfc02)))).Format("m") } else if r.DateSize == "年" { s = carbon.Parse(r.OrderDateStart).AddYears(int(carbon.Parse(r.OrderDateStart). DiffAbsInYears(carbon.CreateFromStdTime(tcSfc.TcSfc02)))).Format("Y") } if _, ok := quantityMap[s]; !ok { quantityMap[s] = stockInQuantity } else { quantityMap[s] += stockInQuantity } } } for _, xDate := range x { if _, ok := quantityMap[xDate]; ok { y = append(y, decimal.NewFromFloat(quantityMap[xDate]).String()) } else { y = append(y, "0") } } fTHistogram = append(fTHistogram, &model.Histogram{ Field: factory, X: x, Y: y, }) } return fTHistogram } func PassProbabilityByFactory(r *request.PassProbabilityByFactory) ([]*model.Line, []*model.Histogram, int, int) { var lines []*model.Line var histogram []*model.Histogram max := math.MinInt min := math.MaxInt startDate := carbon.Now().SubYear().StartOfMonth().Format("Y-m-d") endDate := carbon.Now().EndOfMonth().Format("Y-m-d") var factorys []string var sql string if r.Factory != "" { sql += "factory = '" + r.Factory + "'" } global.PostGreSQL.Model(&model.Report{}).Where("step = ? AND order_date BETWEEN ? AND ?", r.Type, startDate, endDate). Where(sql).Group("factory").Select("Factory").Find(&factorys) for _, factory := range factorys { var x, lineY, histogramY []string var reports []*model.Report global.PostGreSQL.Where("step = ? AND factory = ? AND order_date BETWEEN ? AND ?", r.Type, factory, startDate, endDate). Find(&reports) factoryMap := make(map[string][]string) for _, report := range reports { if _, ok := factoryMap[report.OrderDate[:7]]; !ok { factoryMap[report.OrderDate[:7]] = []string{report.TestQuantity, report.PassQuantity} } else { factoryMapTestQuantity, _ := decimal.NewFromString(factoryMap[report.OrderDate[:7]][0]) factoryMapPassQuantity, _ := decimal.NewFromString(factoryMap[report.OrderDate[:7]][1]) testQuantity, _ := decimal.NewFromString(report.TestQuantity) passQuantity, _ := decimal.NewFromString(report.PassQuantity) factoryMap[report.OrderDate[:7]] = []string{factoryMapTestQuantity.Add(testQuantity).String(), factoryMapPassQuantity.Add(passQuantity).String()} } } month := carbon.Now().SubYear().StartOfMonth().Format("Y-m") for { if month == carbon.Now().EndOfMonth().Format("Y-m") { break } x = append(x, month) if _, ok := factoryMap[month]; !ok { lineY = append(lineY, "") histogramY = append(histogramY, "") } else { testQuantity, _ := decimal.NewFromString(factoryMap[month][0]) passQuantity, _ := decimal.NewFromString(factoryMap[month][1]) passProbability := passQuantity.Div(testQuantity). Round(4).Mul(decimal.NewFromFloat(100)) passProbabilityInt, _ := strconv.Atoi(passProbability.Round(0).String()) if passProbabilityInt > max { max = passProbabilityInt + 1 } if passProbabilityInt < min { min = passProbabilityInt - 1 } lineY = append(lineY, passProbability.String()) histogramY = append(histogramY, factoryMap[month][0]) } month = carbon.Parse(month).AddMonth().Format("Y-m") } lines = append(lines, &model.Line{ Name: factory, X: x, Y: lineY, }) histogram = append(histogram, &model.Histogram{ Field: factory, X: x, Y: histogramY, }) } return lines, histogram, max, min } func FTPassProbabilityByProduct(r *request.PassProbabilityByProduct) (*model.Line, *model.Histogram, *model.Line, *model.Histogram) { var line, binLine *model.Line var histogram, binHistogram *model.Histogram max := math.MinInt min := math.MaxInt startDate := carbon.Now().SubYear().StartOfMonth().Format("Y-m-d") endDate := carbon.Now().EndOfMonth().Format("Y-m-d") var sql string if r.Factory != "" { sql += "factory = '" + r.Factory + "'" } var reports []*model.Report global.PostGreSQL.Where("step = ? AND product = ? AND order_date BETWEEN ? AND ?", r.Type, r.Product, startDate, endDate).Preload("BinFail", func(db *gorm.DB) *gorm.DB { return db.Where("report_site_id = ?", 0) }).Where(sql).Find(&reports) productMap := make(map[string][]string) binMap := make(map[string]float64) var x, lineY, histogramY []string for _, report := range reports { if _, ok := productMap[report.OrderDate[:7]]; !ok { productMap[report.OrderDate[:7]] = []string{report.TestQuantity, report.PassQuantity} } else { factoryMapTestQuantity, _ := decimal.NewFromString(productMap[report.OrderDate[:7]][0]) factoryMapPassQuantity, _ := decimal.NewFromString(productMap[report.OrderDate[:7]][1]) testQuantity, _ := decimal.NewFromString(report.TestQuantity) passQuantity, _ := decimal.NewFromString(report.PassQuantity) productMap[report.OrderDate[:7]] = []string{factoryMapTestQuantity.Add(testQuantity).String(), factoryMapPassQuantity.Add(passQuantity).String()} } for _, binFail := range report.BinFail { if _, ok := binMap[binFail.HardBin]; !ok { binMap[binFail.HardBin] = 0 } quantityDecimal, _ := decimal.NewFromString(binFail.Quantity) quantity, _ := quantityDecimal.Float64() binMap[binFail.HardBin] += quantity } } month := carbon.Now().SubYear().StartOfMonth().Format("Y-m") var testStr, passStr string for { if month == carbon.Now().EndOfMonth().Format("Y-m") { break } x = append(x, month) if _, ok := productMap[month]; !ok { lineY = append(lineY, "") histogramY = append(histogramY, "") } else { testQuantity, _ := decimal.NewFromString(productMap[month][0]) passQuantity, _ := decimal.NewFromString(productMap[month][1]) testDecimal, _ := decimal.NewFromString(testStr) passDecimal, _ := decimal.NewFromString(passStr) testStr = testDecimal.Add(testQuantity).String() passStr = passDecimal.Add(passQuantity).String() passProbability := passQuantity.Div(testQuantity). Round(4).Mul(decimal.NewFromFloat(100)) passProbabilityInt, _ := strconv.Atoi(passProbability.Round(0).String()) if passProbabilityInt > max { max = passProbabilityInt + 1 } if passProbabilityInt < min { min = passProbabilityInt - 1 } lineY = append(lineY, passProbability.String()) histogramY = append(histogramY, productMap[month][0]) } month = carbon.Parse(month).AddMonth().Format("Y-m") } var binX, binHistogramY, binLineY []string for bin := range binMap { if bin != "1" { binX = append(binX, bin) } } sort.Slice(binX, func(i, j int) bool { return binMap[binX[i]] > binMap[binX[j]] }) var accumulation float64 testDecimal, _ := decimal.NewFromString(testStr) passDecimal, _ := decimal.NewFromString(passStr) failQuantity, _ := testDecimal.Sub(passDecimal).Float64() for _, bin := range binX { binHistogramY = append(binHistogramY, decimal.NewFromFloat(binMap[bin]).String()) accumulation += binMap[bin] binLineY = append(binLineY, decimal.NewFromFloat(accumulation).Div(decimal.NewFromFloat(failQuantity)). Round(4).Mul(decimal.NewFromFloat(100)).String()) } line = &model.Line{ Name: r.Product, X: x, Y: lineY, } histogram = &model.Histogram{ Field: r.Product, X: x, Y: histogramY, } binLine = &model.Line{ Name: r.Product, X: binX, Y: binLineY, } binHistogram = &model.Histogram{ Field: r.Product, X: binX, Y: binHistogramY, } return line, histogram, binLine, binHistogram } func PassProbabilityLine(r *request.TestPassProbabilityLine) { }