package test_data import ( "errors" "gitee.com/golang-module/carbon/v2" "github.com/shopspring/decimal" "gorm.io/gorm" "strings" "testData/global" "testData/model" ) func CronWaferList() { //var waferLists []*model.WaferList var pbis []string global.PostGreSQL.Model(&model.WaferList{}).Where("status != ?", "结案").Select("pbi").Order("pbi").Find(&pbis) //.Find(&waferLists) //for i := 0; i < 10; i++ { // var a []string // if i != 9 { // a = pbis[i*100 : (i+1)*100] // } else { // a = pbis[i*100:] // } var oldPmms []*model.PmmFile global.Oracle.Where("pmm01 IN ? AND pmm02 = ?", pbis, "WB0"). Preload("PmnFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }).Preload("PmcFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile").Preload("IddFile").Order("rvb12 desc") }).Order("pmm01 desc").Find(&oldPmms) for _, pmm := range oldPmms { var status string if pmm.Pmm25 == "6" { status = "结案" } else { status = "未结案" } for _, pmn := range pmm.PmnFile { var returnQuantity, dieQuantity float64 for _, rvb := range pmm.RvbFile { if rvb.Rvb03 == pmn.Pmn02 { returnQuantity += rvb.Rvb82 dieQuantity += rvb.Rvb85 } } var waferList *model.WaferList global.PostGreSQL.Where("pbi = ? AND product = ? AND wafer_size = ?", pmm.Pmm01, pmn.ImaFile.Ima02, pmn.ImaFile.Ima021).Preload("WaferStock").Find(&waferList) global.PostGreSQL.Model(&waferList).Updates(map[string]interface{}{ "status": status, "online_quantity": pmn.Pmn20 - returnQuantity, "return_quantity": returnQuantity, "die_quantity": dieQuantity, }) var waferStocks []*model.WaferStock rvbMap := make(map[string][]interface{}) for _, rvb := range pmm.RvbFile { name := rvb.Rvb38 + "~" + rvb.Rvb12.Format("2006-01-02") if rvb.Rvb03 == pmn.Pmn02 { if _, ok := rvbMap[name]; !ok { var waferID string for _, idd := range rvb.IddFile { if rvb.Rvb38 == idd.Idd04 { if !strings.Contains(waferID, "#"+idd.Idd05) { waferID += "#" + idd.Idd05 } } } rvbMap[name] = []interface{}{rvb.Rvb82, rvb.Rvb85, waferID, rvb.ImaFile.Ima02, rvb.ImaFile.Ima021} } else { waferID := rvbMap[name][2].(string) for _, idd := range rvb.IddFile { if rvb.Rvb38 == idd.Idd04 { if !strings.Contains(waferID, "#"+idd.Idd05) { waferID += "#" + idd.Idd05 } } } rvbMap[name][0] = rvbMap[name][0].(float64) + rvb.Rvb82 rvbMap[name][1] = rvbMap[name][1].(float64) + rvb.Rvb85 } } } for k, v := range rvbMap { lot := strings.Split(k, "~")[0] returnDate := strings.Split(k, "~")[1] var isExist bool for _, waferStock := range waferList.WaferStock { if waferStock.Lot == lot && waferStock.WaferID == v[2].(string) && waferStock.ReturnDate == returnDate { isExist = true break } } if !isExist { waferStocks = append(waferStocks, &model.WaferStock{ WaferListID: waferList.ID, PBI: waferList.PBI, Product: v[3].(string), Specification: v[4].(string), ReturnDate: returnDate, Lot: lot, WaferID: v[2].(string), ReturnQuantity: v[0].(float64), DieQuantity: v[1].(float64), }) } } global.PostGreSQL.Create(&waferStocks) } } //} var newPmms []*model.PmmFile global.Oracle.Where("pmm02 = ? AND pmm25 != ?", "WB0", "6").Order("pmm01"). Preload("PmnFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }).Preload("PmcFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile").Preload("IddFile").Order("rvb12 desc") }).Find(&newPmms) for _, pmm := range newPmms { var status string if pmm.Pmm25 == "6" { status = "结案" } else { status = "未结案" } for _, pmn := range pmm.PmnFile { var returnQuantity, dieQuantity float64 for _, rvb := range pmm.RvbFile { if rvb.Rvb03 == pmn.Pmn02 { returnQuantity += rvb.Rvb82 dieQuantity += rvb.Rvb85 } } var waferList *model.WaferList if errors.Is(global.PostGreSQL.Where("pbi = ? AND product = ? AND wafer_size = ?", pmm.Pmm01, pmn.ImaFile.Ima02, pmn.ImaFile.Ima021).First(&waferList).Error, gorm.ErrRecordNotFound) { global.PostGreSQL.Create(&model.WaferList{ Status: status, OrderDate: pmm.Pmm04.Format("2006-01-02"), PBI: pmm.Pmm01, Product: pmn.ImaFile.Ima02, Factory: pmm.PmcFile.Pmc03, WaferSize: pmn.ImaFile.Ima021, Quantity: pmn.Pmn20, OnlineQuantity: pmn.Pmn20 - returnQuantity, ReturnQuantity: returnQuantity, DieQuantity: dieQuantity, }) } else { global.PostGreSQL.Model(&waferList).Updates(map[string]interface{}{ "status": status, "online_quantity": pmn.Pmn20 - returnQuantity, "return_quantity": returnQuantity, "die_quantity": dieQuantity, }) } global.PostGreSQL.Where("pbi = ? AND product = ? AND wafer_size = ?", pmm.Pmm01, pmn.ImaFile.Ima02, pmn.ImaFile.Ima021).Preload("WaferStock").Find(&waferList) var waferStocks []*model.WaferStock rvbMap := make(map[string][]interface{}) for _, rvb := range pmm.RvbFile { name := rvb.Rvb38 + "~" + rvb.Rvb12.Format("2006-01-02") if rvb.Rvb03 == pmn.Pmn02 { if _, ok := rvbMap[name]; !ok { var waferID string for _, idd := range rvb.IddFile { if rvb.Rvb38 == idd.Idd04 { if !strings.Contains(waferID, "#"+idd.Idd05) { waferID += "#" + idd.Idd05 } } } rvbMap[name] = []interface{}{rvb.Rvb82, rvb.Rvb85, waferID, rvb.ImaFile.Ima02, rvb.ImaFile.Ima021} } else { waferID := rvbMap[name][2].(string) for _, idd := range rvb.IddFile { if rvb.Rvb38 == idd.Idd04 { if !strings.Contains(waferID, "#"+idd.Idd05) { waferID += "#" + idd.Idd05 } } } rvbMap[name][0] = rvbMap[name][0].(float64) + rvb.Rvb82 rvbMap[name][1] = rvbMap[name][1].(float64) + rvb.Rvb85 } } } for k, v := range rvbMap { lot := strings.Split(k, "~")[0] returnDate := strings.Split(k, "~")[1] var isExist bool for _, waferStock := range waferList.WaferStock { if waferStock.Lot == lot && waferStock.WaferID == v[2].(string) && waferStock.ReturnDate == returnDate { isExist = true break } } if !isExist { waferStocks = append(waferStocks, &model.WaferStock{ WaferListID: waferList.ID, PBI: waferList.PBI, Product: v[3].(string), Specification: v[4].(string), ReturnDate: returnDate, Lot: lot, WaferID: v[2].(string), ReturnQuantity: v[0].(float64), DieQuantity: v[1].(float64), }) } } global.PostGreSQL.Create(&waferStocks) } } } func CronABList() { var oldTcSfcFile []*model.TcSfcFile var abListIDs []string global.PostGreSQL.Model(&model.ABList{}).Where("status = ?", "未结案"). Select("pbi").Group("pbi").Find(&abListIDs) _ = global.Oracle.Transaction(func(tx *gorm.DB) error { page := len(abListIDs)/200 + 1 for i := 0; i < page; i++ { var pageTcSfcFile []*model.TcSfcFile var s []string if i == page-1 { s = abListIDs[i*200:] } else { s = abListIDs[i*200 : (i+1)*200] } tx.Where("tc_sfc01 IN ? AND tc_sfc08 LIKE ?", s, "%AB%"). Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("SfbFile").Preload("ImaFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile").Preload("RvaFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }). Preload("PmcFile").Find(&pageTcSfcFile) oldTcSfcFile = append(oldTcSfcFile, pageTcSfcFile...) } return nil }) for _, tcSfc := range oldTcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { status := "未结案" if tcSfd.SfbFile.Sfb04 == "8" { status = "结案" } else if tcSfd.SfbFile.Sfb04 == "0" { continue } var quantity float64 //, stockOutQuantity for _, tcSfe := range tcSfc.TcSfeFile { if tcSfe.TcSfe01 == tcSfc.TcSfc01 && tcSfe.TcSfe02 == tcSfd.TcSfd02 { quantity += tcSfe.TcSfe12 //stockOutQuantity += tcSfe.TcSfe14 } } var returnQuantity, failQuantity, passQuantity float64 orderDateStockMap := make(map[string][]float64) for _, rvb := range tcSfd.RvbFile { if _, ok := orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")]; !ok { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")] = []float64{0, 0} } for _, idd := range rvb.IddFile { if idd.Idd11 == rvb.Rvb02 { returnQuantity += idd.Idd13 if idd.Idd06 == "BIN99" { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][1] += idd.Idd13 failQuantity += idd.Idd13 } else { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][0] += idd.Idd13 passQuantity += idd.Idd13 } } } } quantity, _ = decimal.NewFromFloat(quantity).Round(6).Float64() var passProbability string if strings.Contains(tcSfc.TcSfc01, "M596") && passQuantity == 0 { var reports []*model.Report global.PostGreSQL.Where("pbi = ? AND product = ? AND lot = ?", tcSfc.TcSfc01, tcSfd.ImaFile.Ima02, tcSfd.TcSfd06).Find(&reports) for _, report := range reports { testQuantityDecimal, _ := decimal.NewFromString(report.TestQuantity) testQuantityFloat, _ := testQuantityDecimal.Float64() passQuantity += testQuantityFloat } } //if stockOutQuantity != 0 { // passProbability = decimal.NewFromFloat(passQuantity).Div(decimal.NewFromFloat(stockOutQuantity)). // Round(4).Mul(decimal.NewFromFloat(100)).String() //} passProbability = decimal.NewFromFloat(passQuantity).Div(decimal.NewFromFloat(tcSfd.TcSfd05)). Round(4).Mul(decimal.NewFromFloat(100)).String() global.PostGreSQL.Transaction(func(tx *gorm.DB) error { var abList *model.ABList tx.Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Find(&abList) tx.Model(&abList).Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Updates(map[string]interface{}{ "status": status, "quantity": quantity, //"stock_out_quantity": stockOutQuantity, "stock_out_quantity": tcSfd.TcSfd05, "stock_in_quantity": returnQuantity, "pass_quantity": passQuantity, "fail_quantity": failQuantity, "online_quantity": tcSfd.TcSfd05 - returnQuantity, "pass_probability": passProbability + "%", }) tx.Where("ab_list_id = ?", abList.ID).Delete(&model.ABListStock{}) for k, v := range orderDateStockMap { tx.Create(&model.ABListStock{ ABListID: abList.ID, ReturnDate: k, PassQuantity: v[0], FailQuantity: v[1], }) } //for k, v := range orderDateStockMap { // var abListStock *model.ABListStock // if errors.Is(global.PostGreSQL.Where("ab_list_id = ? AND return_date = ?", abList.ID, k). // First(&abListStock).Error, gorm.ErrRecordNotFound) { // global.PostGreSQL.Create(&model.ABListStock{ // ABListID: abList.ID, // ReturnDate: k, // PassQuantity: v[0], // FailQuantity: v[1], // }) // } else { // global.PostGreSQL.Model(&abListStock).Where("ab_list_id = ? AND return_date = ?", abList.ID, k). // Updates(map[string]interface{}{ // "pass_quantity": v[0], // "fail_quantity": v[1], // }) // } //} return nil }) } } var newTcSfcFile []*model.TcSfcFile global.PostGreSQL.Model(&model.ABList{}).Where("order_date BETWEEN ? AND ?", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d")). Select("pbi").Group("pbi").Find(&abListIDs) _ = global.Oracle.Transaction(func(tx *gorm.DB) error { var tcSfcFilePBIs []string if len(abListIDs) == 0 { tx.Model(&model.TcSfcFile{}).Debug().Where("tc_sfc08 LIKE ? AND tc_sfc10 = ? AND tc_sfcconf != ? AND "+ "tc_sfc02 BETWEEN TO_DATE(?,'yyyy-mm-dd') AND TO_DATE(?,'yyyy-mm-dd')", "%AB%", "N", "0", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d")). Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) } else { tx.Model(&model.TcSfcFile{}).Where("tc_sfc01 NOT IN ? AND tc_sfc08 LIKE ? AND tc_sfc10 = ? AND tc_sfcconf != ? AND "+ "tc_sfc02 BETWEEN TO_DATE(?,'yyyy-mm-dd') AND TO_DATE(?,'yyyy-mm-dd')", abListIDs, "%AB%", "N", "0", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d")). Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) } //tx.Model(&model.TcSfcFile{}).Where("tc_sfc08 LIKE ?", "%AB%"). // Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) page := len(tcSfcFilePBIs)/200 + 1 for i := 0; i < page; i++ { var pageTcSfcFile []*model.TcSfcFile var s []string if i == page-1 { s = tcSfcFilePBIs[i*200:] } else { s = tcSfcFilePBIs[i*200 : (i+1)*200] } tx.Where("tc_sfc01 IN ? AND tc_sfc08 LIKE ?", s, "%AB%"). // AND tc_sfc10 = ?, "N" Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("SfbFile").Preload("ImaFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile").Preload("RvaFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }).Preload("PmcFile").Find(&pageTcSfcFile) newTcSfcFile = append(newTcSfcFile, pageTcSfcFile...) } return nil }) for _, tcSfc := range newTcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { status := "未结案" if tcSfd.SfbFile.Sfb04 == "8" { status = "结案" } else if tcSfd.SfbFile.Sfb04 == "0" { continue } var waferProduct, waferID string var quantity float64 //, stockOutQuantity for _, tcSfe := range tcSfc.TcSfeFile { if tcSfe.TcSfe01 == tcSfc.TcSfc01 && tcSfe.TcSfe02 == tcSfd.TcSfd02 { quantity += tcSfe.TcSfe12 //stockOutQuantity += tcSfe.TcSfe14 if tcSfe.TcSfe17 == "Y" { waferProduct = tcSfe.ImaFile.Ima02 waferID = tcSfe.TcSfe15 } } } if waferProduct == "" && len(tcSfc.TcSfeFile) > 0 { waferProduct = tcSfc.TcSfeFile[0].ImaFile.Ima02 } var returnQuantity, failQuantity, passQuantity float64 orderDateStockMap := make(map[string][]float64) for _, rvb := range tcSfd.RvbFile { if _, ok := orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")]; !ok { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")] = []float64{0, 0} } for _, idd := range rvb.IddFile { if idd.Idd11 == rvb.Rvb02 { returnQuantity += idd.Idd13 if idd.Idd06 == "BIN99" { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][1] += idd.Idd13 failQuantity += idd.Idd13 } else { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][0] += idd.Idd13 passQuantity += idd.Idd13 } } } } quantity, _ = decimal.NewFromFloat(quantity).Round(6).Float64() var passProbability string if strings.Contains(tcSfc.TcSfc01, "M596") && passQuantity == 0 { var reports []*model.Report global.PostGreSQL.Where("pbi = ? AND product = ? AND lot = ?", tcSfc.TcSfc01, tcSfd.ImaFile.Ima02, tcSfd.TcSfd06).Find(&reports) for _, report := range reports { testQuantityDecimal, _ := decimal.NewFromString(report.TestQuantity) testQuantityFloat, _ := testQuantityDecimal.Float64() passQuantity += testQuantityFloat } } //if stockOutQuantity != 0 { // passProbability = decimal.NewFromFloat(passQuantity).Div(decimal.NewFromFloat(stockOutQuantity)). // Round(4).Mul(decimal.NewFromFloat(100)).String() //} passProbability = decimal.NewFromFloat(passQuantity).Div(decimal.NewFromFloat(tcSfd.TcSfd05)). Round(4).Mul(decimal.NewFromFloat(100)).String() global.PostGreSQL.Create(&model.ABList{ Status: status, OrderDate: tcSfc.TcSfc02.Format("2006-01-02"), PBI: tcSfc.TcSfc01, OutsourcingPBI: tcSfd.TcSfd13, Product: strings.ReplaceAll(strings.ReplaceAll(tcSfd.ImaFile.Ima02, "管装", ""), "白板", ""), WaferProduct: waferProduct, Package: tcSfd.ImaFile.Ima021, Factory: tcSfc.PmcFile.Pmc03, Lot: tcSfd.TcSfd06, Seal: tcSfd.TcSfdUd02, WaferID: waferID, Quantity: quantity, //StockOutQuantity: stockOutQuantity, StockOutQuantity: tcSfd.TcSfd05, StockInQuantity: returnQuantity, PassQuantity: passQuantity, FailQuantity: failQuantity, OnlineQuantity: tcSfd.TcSfd05 - returnQuantity, PassProbability: passProbability + "%", }) var abList *model.ABList global.PostGreSQL.Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Find(&abList) var abListStock []*model.ABListStock for k, v := range orderDateStockMap { abListStock = append(abListStock, &model.ABListStock{ ABListID: abList.ID, ReturnDate: k, PassQuantity: v[0], FailQuantity: v[1], }) } global.PostGreSQL.Create(&abListStock) } } } func CronBPList() { var oldTcSfcFile []*model.TcSfcFile var bpListIDs []string global.PostGreSQL.Model(&model.BPList{}).Where("status = ?", "未结案"). Select("pbi").Group("pbi").Find(&bpListIDs) _ = global.Oracle.Transaction(func(tx *gorm.DB) error { page := len(bpListIDs)/200 + 1 for i := 0; i < page; i++ { var pageTcSfcFile []*model.TcSfcFile var s []string if i == page-1 { s = bpListIDs[i*200:] } else { s = bpListIDs[i*200 : (i+1)*200] } tx.Where("tc_sfc01 IN ? AND tc_sfc08 LIKE ?", s, "%MH%"). Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("SfbFile").Preload("ImaFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile").Preload("RvaFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }). Preload("PmcFile").Find(&pageTcSfcFile) oldTcSfcFile = append(oldTcSfcFile, pageTcSfcFile...) } return nil }) for _, tcSfc := range oldTcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { if tcSfd.TcSfd13 == "" { continue } status := "未结案" if tcSfd.SfbFile.Sfb04 == "8" { status = "结案" } else if tcSfd.SfbFile.Sfb04 == "0" { continue } var returnQuantity, dieQuantity float64 orderDateStockMap := make(map[string][]float64) for _, rvb := range tcSfd.RvbFile { if _, ok := orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")]; !ok { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")] = []float64{0, 0} } returnQuantity += rvb.Rvb30 dieQuantity += rvb.Rvb85 orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][0] += rvb.Rvb30 orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][1] += rvb.Rvb85 } var bpList *model.BPList global.PostGreSQL.Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Find(&bpList) global.PostGreSQL.Transaction(func(tx *gorm.DB) error { global.PostGreSQL.Model(&bpList).Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Updates(map[string]interface{}{ "status": status, "online_quantity": tcSfd.TcSfd05 - returnQuantity, "return_quantity": returnQuantity, "die_quantity": dieQuantity, }) for k, v := range orderDateStockMap { var bpListStock *model.BPListStock if errors.Is(global.PostGreSQL.Where("bp_list_id = ? AND return_date = ?", bpList.ID, k). First(&bpListStock).Error, gorm.ErrRecordNotFound) { global.PostGreSQL.Create(&model.BPListStock{ BPListID: bpList.ID, ReturnDate: k, Quantity: v[0], DieQuantity: v[1], }) } else { global.PostGreSQL.Model(&bpListStock).Where("bp_list_id = ? AND return_date = ?", bpList.ID, k). Updates(map[string]interface{}{ "quantity": v[0], "die_quantity": v[1], }) } } return nil }) } } var newTcSfcFile []*model.TcSfcFile global.PostGreSQL.Model(&model.BPList{}).Where("order_date BETWEEN ? AND ?", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d")). Select("pbi").Group("pbi").Find(&bpListIDs) _ = global.Oracle.Transaction(func(tx *gorm.DB) error { var tcSfcFilePBIs []string if len(bpListIDs) == 0 { tx.Model(&model.TcSfcFile{}).Where("tc_sfc08 LIKE ? AND tc_sfcconf != ? AND "+ "tc_sfc02 BETWEEN TO_DATE(?,'yyyy-mm-dd') AND TO_DATE(?,'yyyy-mm-dd')", "%MH%", "0", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d")). Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) } else { tx.Model(&model.TcSfcFile{}).Where("tc_sfc01 NOT IN ? AND tc_sfc08 LIKE ? AND tc_sfcconf != ? AND "+ "tc_sfc02 BETWEEN TO_DATE(?,'yyyy-mm-dd') AND TO_DATE(?,'yyyy-mm-dd')", bpListIDs, "%MH%", "0", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d")). Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) } //tx.Model(&model.TcSfcFile{}).Where("tc_sfc08 LIKE ?", "%MH%"). // Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) page := len(tcSfcFilePBIs)/200 + 1 for i := 0; i < page; i++ { var pageTcSfcFile []*model.TcSfcFile var s []string if i == page-1 { s = tcSfcFilePBIs[i*200:] } else { s = tcSfcFilePBIs[i*200 : (i+1)*200] } tx.Where("tc_sfc01 IN ? AND tc_sfc08 LIKE ?", s, "%MH%"). // AND tc_sfc10 = ?, "N" Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("SfbFile").Preload("ImaFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile").Preload("RvaFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }).Preload("PmcFile").Find(&pageTcSfcFile) newTcSfcFile = append(newTcSfcFile, pageTcSfcFile...) } return nil }) for _, tcSfc := range newTcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { if tcSfd.TcSfd13 == "" { continue } status := "未结案" if tcSfd.SfbFile.Sfb04 == "8" { status = "结案" } else if tcSfd.SfbFile.Sfb04 == "0" { continue } var waferID string for _, tcSfe := range tcSfc.TcSfeFile { if tcSfe.TcSfe01 == tcSfc.TcSfc01 && tcSfe.TcSfe02 == tcSfd.TcSfd02 { waferID = tcSfe.TcSfe15 } } var returnQuantity, dieQuantity float64 orderDateStockMap := make(map[string][]float64) for _, rvb := range tcSfd.RvbFile { if _, ok := orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")]; !ok { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")] = []float64{0, 0} } returnQuantity += rvb.Rvb30 dieQuantity += rvb.Rvb85 orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][0] += rvb.Rvb30 orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][1] += rvb.Rvb85 } global.PostGreSQL.Create(&model.BPList{ Status: status, OrderDate: tcSfc.TcSfc02.Format("2006-01-02"), PBI: tcSfc.TcSfc01, OutsourcingPBI: tcSfd.TcSfd13, Product: tcSfd.ImaFile.Ima02, Package: tcSfd.ImaFile.Ima021, Factory: tcSfc.PmcFile.Pmc03, Lot: tcSfd.TcSfd06, WaferID: waferID, Quantity: tcSfd.TcSfd05, OnlineQuantity: tcSfd.TcSfd05 - returnQuantity, ReturnQuantity: returnQuantity, DieQuantity: dieQuantity, }) var bpList *model.BPList global.PostGreSQL.Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Find(&bpList) var bpListStock []*model.BPListStock for k, v := range orderDateStockMap { bpListStock = append(bpListStock, &model.BPListStock{ BPListID: bpList.ID, ReturnDate: k, Quantity: v[0], DieQuantity: v[1], }) } global.PostGreSQL.Create(&bpListStock) } } } func CronCPList() { var cpListIDs []string var oldTcSfcFile []*model.TcSfcFile global.PostGreSQL.Model(&model.CPList{}).Where("status = ?", "未结案"). Select("pbi").Group("pbi").Find(&cpListIDs) _ = global.Oracle.Transaction(func(tx *gorm.DB) error { page := len(cpListIDs)/200 + 1 for i := 0; i < page; i++ { var pageTcSfcFile []*model.TcSfcFile var s []string if i == page-1 { s = cpListIDs[i*200:] } else { s = cpListIDs[i*200 : (i+1)*200] } tx.Where("tc_sfc01 IN ? AND tc_sfc08 = ?", s, "CP"). Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("SfbFile").Preload("ImaFile").Preload("TcImbFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile").Preload("RvaFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }). Preload("PmcFile").Find(&pageTcSfcFile) oldTcSfcFile = append(oldTcSfcFile, pageTcSfcFile...) } return nil }) for _, tcSfc := range oldTcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { if tcSfd.TcSfd13 == "" { continue } status := "未结案" if tcSfd.SfbFile.Sfb04 == "8" { status = "结案" } else if tcSfd.SfbFile.Sfb04 == "0" { continue } var returnQuantity, dieQuantity float64 orderDateStockMap := make(map[string][]float64) for _, rvb := range tcSfd.RvbFile { if _, ok := orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")]; !ok { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")] = []float64{0, 0} } returnQuantity += rvb.Rvb30 dieQuantity += rvb.Rvb85 orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][0] += rvb.Rvb30 orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][1] += rvb.Rvb85 } var cpList *model.CPList global.PostGreSQL.Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Find(&cpList) global.PostGreSQL.Transaction(func(tx *gorm.DB) error { global.PostGreSQL.Model(&cpList).Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Updates(map[string]interface{}{ "status": status, "online_quantity": tcSfd.TcSfd05 - returnQuantity, "return_quantity": returnQuantity, "die_quantity": dieQuantity, }) for k, v := range orderDateStockMap { var cpListStock *model.CPListStock if errors.Is(global.PostGreSQL.Where("cp_list_id = ? AND return_date = ?", cpList.ID, k). First(&cpListStock).Error, gorm.ErrRecordNotFound) { global.PostGreSQL.Create(&model.CPListStock{ CPListID: cpList.ID, ReturnDate: k, Quantity: v[0], DieQuantity: v[1], }) } else { global.PostGreSQL.Model(&cpListStock).Where("cp_list_id = ? AND return_date = ?", cpList.ID, k). Updates(map[string]interface{}{ "quantity": v[0], "die_quantity": v[1], }) } } return nil }) } } var newTcSfcFile []*model.TcSfcFile global.PostGreSQL.Model(&model.CPList{}).Where("order_date BETWEEN ? AND ?", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d")). Select("pbi").Group("pbi").Find(&cpListIDs) _ = global.Oracle.Transaction(func(tx *gorm.DB) error { var tcSfcFilePBIs []string if len(cpListIDs) == 0 { tx.Model(&model.TcSfcFile{}).Where("tc_sfc08 = ? AND tc_sfcconf != ? AND"+ " tc_sfc02 BETWEEN TO_DATE(?,'yyyy-mm-dd') AND TO_DATE(?,'yyyy-mm-dd')", "CP", "0", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d")). Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) } else { tx.Model(&model.TcSfcFile{}).Where("tc_sfc01 NOT IN ? AND tc_sfc08 = ? AND tc_sfcconf != ? AND"+ " tc_sfc02 BETWEEN TO_DATE(?,'yyyy-mm-dd') AND TO_DATE(?,'yyyy-mm-dd')", cpListIDs, "CP", "0", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d")). Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) } //tx.Model(&model.TcSfcFile{}).Where("tc_sfc08 = ?", "CP"). // Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) page := len(tcSfcFilePBIs)/200 + 1 for i := 0; i < page; i++ { var pageTcSfcFile []*model.TcSfcFile var s []string if i == page-1 { s = tcSfcFilePBIs[i*200:] } else { s = tcSfcFilePBIs[i*200 : (i+1)*200] } tx.Where("tc_sfc01 IN ? AND tc_sfc08 = ?", s, "CP"). Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("SfbFile").Preload("ImaFile").Preload("TcImbFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile").Preload("RvaFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile").Preload("BmbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }) }).Preload("PmcFile").Find(&pageTcSfcFile) newTcSfcFile = append(newTcSfcFile, pageTcSfcFile...) } return nil }) for _, tcSfc := range newTcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { if tcSfd.TcSfd13 == "" { continue } status := "未结案" if tcSfd.SfbFile.Sfb04 == "8" { status = "结案" } else if tcSfd.SfbFile.Sfb04 == "0" { continue } var waferID string for _, tcSfe := range tcSfc.TcSfeFile { if tcSfe.TcSfe01 == tcSfc.TcSfc01 && tcSfe.TcSfe02 == tcSfd.TcSfd02 { waferID = tcSfe.TcSfe15 } } var returnQuantity, dieQuantity float64 orderDateStockMap := make(map[string][]float64) for _, rvb := range tcSfd.RvbFile { if _, ok := orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")]; !ok { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")] = []float64{0, 0} } returnQuantity += rvb.Rvb30 dieQuantity += rvb.Rvb85 orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][0] += rvb.Rvb30 orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][1] += rvb.Rvb85 } global.PostGreSQL.Create(&model.CPList{ Status: status, OrderDate: tcSfc.TcSfc02.Format("2006-01-02"), PBI: tcSfc.TcSfc01, OutsourcingPBI: tcSfd.TcSfd13, Product: tcSfd.ImaFile.Ima02, Package: tcSfd.ImaFile.Ima021, Factory: tcSfc.PmcFile.Pmc03, Lot: tcSfd.TcSfd06, WaferID: waferID, TestProgram: tcSfd.TcImbFile.TcImb03, TestProgramVersion: tcSfd.TcImbFile.TcImb04, Quantity: tcSfd.TcSfd05, OnlineQuantity: tcSfd.TcSfd05 - returnQuantity, ReturnQuantity: returnQuantity, DieQuantity: dieQuantity, }) var cpList *model.CPList global.PostGreSQL.Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Find(&cpList) var cpListStock []*model.CPListStock for k, v := range orderDateStockMap { cpListStock = append(cpListStock, &model.CPListStock{ CPListID: cpList.ID, ReturnDate: k, Quantity: v[0], DieQuantity: v[1], }) } global.PostGreSQL.Create(&cpListStock) } } } func CronCheckCPList() { var cpListIDs []string var oldTcSfcFile []*model.TcSfcFile global.PostGreSQL.Model(&model.CPList{}).Where("status = ? AND online_quantity != ?", "结案", 0). Select("pbi").Group("pbi").Find(&cpListIDs) _ = global.Oracle.Transaction(func(tx *gorm.DB) error { page := len(cpListIDs)/200 + 1 for i := 0; i < page; i++ { var pageTcSfcFile []*model.TcSfcFile var s []string if i == page-1 { s = cpListIDs[i*200:] } else { s = cpListIDs[i*200 : (i+1)*200] } tx.Where("tc_sfc01 IN ? AND tc_sfc08 = ?", s, "CP"). Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("SfbFile").Preload("ImaFile").Preload("TcImbFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile").Preload("RvaFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }). Preload("PmcFile").Find(&pageTcSfcFile) oldTcSfcFile = append(oldTcSfcFile, pageTcSfcFile...) } return nil }) for _, tcSfc := range oldTcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { if tcSfd.TcSfd13 == "" { continue } status := "未结案" if tcSfd.SfbFile.Sfb04 == "8" { status = "结案" } else if tcSfd.SfbFile.Sfb04 == "0" { continue } var returnQuantity, dieQuantity float64 orderDateStockMap := make(map[string][]float64) for _, rvb := range tcSfd.RvbFile { if _, ok := orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")]; !ok { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")] = []float64{0, 0} } returnQuantity += rvb.Rvb30 dieQuantity += rvb.Rvb85 orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][0] += rvb.Rvb30 orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][1] += rvb.Rvb85 } var cpList *model.CPList global.PostGreSQL.Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Find(&cpList) global.PostGreSQL.Transaction(func(tx *gorm.DB) error { global.PostGreSQL.Model(&cpList).Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Updates(map[string]interface{}{ "status": status, "online_quantity": tcSfd.TcSfd05 - returnQuantity, "return_quantity": returnQuantity, "die_quantity": dieQuantity, }) for k, v := range orderDateStockMap { var cpListStock *model.CPListStock if errors.Is(global.PostGreSQL.Where("cp_list_id = ? AND return_date = ?", cpList.ID, k). First(&cpListStock).Error, gorm.ErrRecordNotFound) { global.PostGreSQL.Create(&model.CPListStock{ CPListID: cpList.ID, ReturnDate: k, Quantity: v[0], DieQuantity: v[1], }) } else { global.PostGreSQL.Model(&cpListStock).Where("cp_list_id = ? AND return_date = ?", cpList.ID, k). Updates(map[string]interface{}{ "quantity": v[0], "die_quantity": v[1], }) } } return nil }) } } } func CronFTList() { var oldTcSfcFile []*model.TcSfcFile var ftListIDs []string global.PostGreSQL.Model(&model.FTList{}).Where("status = ?", "未结案"). Select("pbi").Group("pbi").Find(&ftListIDs) _ = global.Oracle.Transaction(func(tx *gorm.DB) error { page := len(ftListIDs)/200 + 1 for i := 0; i < page; i++ { var pageTcSfcFile []*model.TcSfcFile var s []string if i == page-1 { s = ftListIDs[i*200:] } else { s = ftListIDs[i*200 : (i+1)*200] } tx.Where("tc_sfc01 IN ? AND tc_sfc08 LIKE ?", s, "%FT%"). Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("SfbFile").Preload("ImaFile").Preload("TcImbFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile").Preload("RvaFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("BmbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }).Preload("ImaFile") }). Preload("PmcFile").Find(&pageTcSfcFile) oldTcSfcFile = append(oldTcSfcFile, pageTcSfcFile...) } return nil }) for _, tcSfc := range oldTcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { if tcSfd.TcSfd13 == "" { continue } status := "未结案" if tcSfd.SfbFile.Sfb04 == "8" { status = "结案" } else if tcSfd.SfbFile.Sfb04 == "0" { continue } var waferProduct string for _, tcSfe := range tcSfc.TcSfeFile { if tcSfe.TcSfe01 == tcSfc.TcSfc01 && tcSfe.TcSfe02 == tcSfd.TcSfd02 { if (tcSfc.TcSfc08 == "FT" || (tcSfc.TcSfc08 == "ABFT" && tcSfc.TcSfc10 == "Y")) && !strings.Contains(tcSfc.TcSfc01, "M599") { waferProduct = tcSfe.BmbFile.ImaFile.Ima02 } else { waferProduct = tcSfe.ImaFile.Ima02 } if tcSfe.TcSfe17 == "Y" { break } } } var returnQuantity, passQuantity, failQuantity float64 orderDateStockMap := make(map[string][]float64) for _, rvb := range tcSfd.RvbFile { if _, ok := orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")]; !ok { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")] = []float64{0, 0} } returnQuantity += rvb.Rvb30 for _, idd := range rvb.IddFile { if idd.Idd11 == rvb.Rvb02 { if idd.Idd06 == "BIN99" { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][1] += idd.Idd13 failQuantity += idd.Idd13 } else { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][0] += idd.Idd13 passQuantity += idd.Idd13 } } } } var ftList *model.FTList global.PostGreSQL.Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Find(&ftList) global.PostGreSQL.Transaction(func(tx *gorm.DB) error { global.PostGreSQL.Model(&ftList).Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Updates(map[string]interface{}{ "wafer_product": waferProduct, "status": status, "online_quantity": tcSfd.TcSfd05 - returnQuantity, "return_quantity": returnQuantity, "pass_quantity": passQuantity, "fail_quantity": failQuantity, "test_program_version": tcSfd.TcImbFile.TcImb04, }) for k, v := range orderDateStockMap { var ftListStock *model.FTListStock if errors.Is(global.PostGreSQL.Where("ft_list_id = ? AND return_date = ?", ftList.ID, k). First(&ftListStock).Error, gorm.ErrRecordNotFound) { global.PostGreSQL.Create(&model.FTListStock{ FTListID: ftList.ID, ReturnDate: k, PassQuantity: v[0], FailQuantity: v[1], }) } else { global.PostGreSQL.Model(&ftListStock).Where("ft_list_id = ? AND return_date = ?", ftList.ID, k). Updates(map[string]interface{}{ "pass_quantity": v[0], "fail_quantity": v[1], }) } } return nil }) } } var newTcSfcFile []*model.TcSfcFile global.PostGreSQL.Model(&model.FTList{}).Where("order_date BETWEEN ? AND ?", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d")). Select("pbi").Group("pbi").Find(&ftListIDs) _ = global.Oracle.Transaction(func(tx *gorm.DB) error { var tcSfcFilePBIs []string if len(ftListIDs) == 0 { tx.Model(&model.TcSfcFile{}).Where("tc_sfcconf != ? AND tc_sfc02 BETWEEN TO_DATE(?,'yyyy-mm-dd') AND "+ "TO_DATE(?,'yyyy-mm-dd') AND ((tc_sfc01 LIKE ? AND tc_sfc08 = ?) OR (tc_sfc08 = ?))", "0", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d"), "M596%", "ABFT", "FT"). Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) } else { tx.Model(&model.TcSfcFile{}).Where("(tc_sfc01 NOT IN ? AND tc_sfcconf != ? AND tc_sfc02 BETWEEN TO_DATE(?,'yyyy-mm-dd') AND "+ "TO_DATE(?,'yyyy-mm-dd')) AND ((tc_sfc01 LIKE ? AND tc_sfc08 = ?) OR (tc_sfc08 = ?))", ftListIDs, "0", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d"), "M596%", "ABFT", "FT"). Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) } //tx.Model(&model.TcSfcFile{}).Where("(tc_sfc01 LIKE ? AND tc_sfc08 = ?) OR (tc_sfc08 = ?)", "M596%", "ABFT", "FT"). // Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) page := len(tcSfcFilePBIs)/200 + 1 for i := 0; i < page; i++ { var pageTcSfcFile []*model.TcSfcFile var s []string if i == page-1 { s = tcSfcFilePBIs[i*200:] } else { s = tcSfcFilePBIs[i*200 : (i+1)*200] } tx.Where("tc_sfc01 IN ? AND tc_sfc08 LIKE ?", s, "%FT%"). Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("SfbFile").Preload("ImaFile").Preload("TcImbFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile").Preload("RvaFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("BmbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }).Preload("ImaFile") }).Preload("PmcFile").Find(&pageTcSfcFile) newTcSfcFile = append(newTcSfcFile, pageTcSfcFile...) } return nil }) for _, tcSfc := range newTcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { if tcSfd.TcSfd13 == "" { continue } status := "未结案" if tcSfd.SfbFile.Sfb04 == "8" { status = "结案" } else if tcSfd.SfbFile.Sfb04 == "0" { continue } var waferProduct string for _, tcSfe := range tcSfc.TcSfeFile { if tcSfe.TcSfe01 == tcSfc.TcSfc01 && tcSfe.TcSfe02 == tcSfd.TcSfd02 { if (tcSfc.TcSfc08 == "FT" || (tcSfc.TcSfc08 == "ABFT" && tcSfc.TcSfc10 == "Y")) && !strings.Contains(tcSfc.TcSfc01, "M599") { waferProduct = tcSfe.BmbFile.ImaFile.Ima02 } else { waferProduct = tcSfe.ImaFile.Ima02 } if tcSfe.TcSfe17 == "Y" { break } } } var returnQuantity, passQuantity, failQuantity float64 orderDateStockMap := make(map[string][]float64) for _, rvb := range tcSfd.RvbFile { if _, ok := orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")]; !ok { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")] = []float64{0, 0} } returnQuantity += rvb.Rvb30 for _, idd := range rvb.IddFile { if idd.Idd11 == rvb.Rvb02 { if idd.Idd06 == "BIN99" { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][1] += idd.Idd13 failQuantity += idd.Idd13 } else { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][0] += idd.Idd13 passQuantity += idd.Idd13 } } } } global.PostGreSQL.Create(&model.FTList{ Status: status, OrderDate: tcSfc.TcSfc02.Format("2006-01-02"), PBI: tcSfc.TcSfc01, OutsourcingPBI: tcSfd.TcSfd13, Product: strings.ReplaceAll(strings.ReplaceAll(tcSfd.ImaFile.Ima02, "管装", ""), "白板", ""), WaferProduct: waferProduct, Package: tcSfd.ImaFile.Ima021, Factory: tcSfc.PmcFile.Pmc03, Lot: tcSfd.TcSfd06, Seal: tcSfd.TcSfdUd02, TestProgram: tcSfd.TcImbFile.TcImb03, TestProgramVersion: tcSfd.TcImbFile.TcImb04, Quantity: tcSfd.TcSfd05, OnlineQuantity: tcSfd.TcSfd05 - returnQuantity, ReturnQuantity: returnQuantity, PassQuantity: passQuantity, FailQuantity: failQuantity, }) var ftList *model.FTList global.PostGreSQL.Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Find(&ftList) var ftListStock []*model.FTListStock for k, v := range orderDateStockMap { ftListStock = append(ftListStock, &model.FTListStock{ FTListID: ftList.ID, ReturnDate: k, PassQuantity: v[0], FailQuantity: v[1], }) } global.PostGreSQL.Create(&ftListStock) } } } func CronCheckFTList() { var ftListIDs []string var oldTcSfcFile []*model.TcSfcFile global.PostGreSQL.Model(&model.FTList{}).Where("wafer_product = ?", ""). Select("pbi").Group("pbi").Find(&ftListIDs) _ = global.Oracle.Transaction(func(tx *gorm.DB) error { page := len(ftListIDs)/200 + 1 for i := 0; i < page; i++ { var pageTcSfcFile []*model.TcSfcFile var s []string if i == page-1 { s = ftListIDs[i*200:] } else { s = ftListIDs[i*200 : (i+1)*200] } tx.Where("tc_sfc01 IN ? AND tc_sfc08 LIKE ?", s, "%FT%"). Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("SfbFile").Preload("ImaFile").Preload("TcImbFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile").Preload("RvaFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }). Preload("PmcFile").Find(&pageTcSfcFile) oldTcSfcFile = append(oldTcSfcFile, pageTcSfcFile...) } return nil }) for _, tcSfc := range oldTcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { if tcSfd.TcSfd13 == "" { continue } status := "未结案" if tcSfd.SfbFile.Sfb04 == "8" { status = "结案" } else if tcSfd.SfbFile.Sfb04 == "0" { continue } var returnQuantity, passQuantity, failQuantity float64 orderDateStockMap := make(map[string][]float64) for _, rvb := range tcSfd.RvbFile { if _, ok := orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")]; !ok { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")] = []float64{0, 0} } returnQuantity += rvb.Rvb30 for _, idd := range rvb.IddFile { if idd.Idd11 == rvb.Rvb02 { if idd.Idd06 == "BIN99" { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][1] += idd.Idd13 failQuantity += idd.Idd13 } else { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][0] += idd.Idd13 passQuantity += idd.Idd13 } } } } var ftList *model.FTList global.PostGreSQL.Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Find(&ftList) global.PostGreSQL.Transaction(func(tx *gorm.DB) error { global.PostGreSQL.Model(&ftList).Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Updates(map[string]interface{}{ "status": status, "online_quantity": tcSfd.TcSfd05 - returnQuantity, "return_quantity": returnQuantity, "pass_quantity": passQuantity, "fail_quantity": failQuantity, }) for k, v := range orderDateStockMap { var ftListStock *model.FTListStock if errors.Is(global.PostGreSQL.Where("ft_list_id = ? AND return_date = ?", ftList.ID, k). First(&ftListStock).Error, gorm.ErrRecordNotFound) { global.PostGreSQL.Create(&model.FTListStock{ FTListID: ftList.ID, ReturnDate: k, PassQuantity: v[0], FailQuantity: v[1], }) } else { global.PostGreSQL.Model(&ftListStock).Where("ft_list_id = ? AND return_date = ?", ftList.ID, k). Updates(map[string]interface{}{ "pass_quantity": v[0], "fail_quantity": v[1], }) } } return nil }) } } } func CronTRList() { var oldTcSfcFile []*model.TcSfcFile var trListIDs []string global.PostGreSQL.Model(&model.TRList{}).Where("status = ?", "未结案"). Select("pbi").Group("pbi").Find(&trListIDs) _ = global.Oracle.Transaction(func(tx *gorm.DB) error { page := len(trListIDs)/200 + 1 for i := 0; i < page; i++ { var pageTcSfcFile []*model.TcSfcFile var s []string if i == page-1 { s = trListIDs[i*200:] } else { s = trListIDs[i*200 : (i+1)*200] } tx.Where("tc_sfc01 IN ? AND tc_sfc08 LIKE ?", s, "%TR%"). Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("SfbFile").Preload("ImaFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile").Preload("RvaFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }). Preload("PmcFile").Find(&pageTcSfcFile) oldTcSfcFile = append(oldTcSfcFile, pageTcSfcFile...) } return nil }) for _, tcSfc := range oldTcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { if tcSfd.TcSfd13 == "" { continue } status := "未结案" if tcSfd.SfbFile.Sfb04 == "8" { status = "结案" } else if tcSfd.SfbFile.Sfb04 == "0" { continue } var returnQuantity, failQuantity, passQuantity float64 orderDateStockMap := make(map[string][]float64) for _, rvb := range tcSfd.RvbFile { if _, ok := orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")]; !ok { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")] = []float64{0, 0} } for _, idd := range rvb.IddFile { if idd.Idd11 == rvb.Rvb02 { returnQuantity += idd.Idd13 if idd.Idd06 == "BIN99" { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][1] += idd.Idd13 failQuantity += idd.Idd13 } else { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][0] += idd.Idd13 passQuantity += idd.Idd13 } } } } var trList *model.TRList global.PostGreSQL.Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Find(&trList) global.PostGreSQL.Transaction(func(tx *gorm.DB) error { global.PostGreSQL.Model(&trList).Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Updates(map[string]interface{}{ "status": status, "online_quantity": tcSfd.TcSfd05 - returnQuantity, "pass_quantity": passQuantity, "fail_quantity": failQuantity, }) for k, v := range orderDateStockMap { var trListStock *model.TRListStock if errors.Is(global.PostGreSQL.Where("tr_list_id = ? AND return_date = ?", trList.ID, k). First(&trListStock).Error, gorm.ErrRecordNotFound) { global.PostGreSQL.Create(&model.TRListStock{ TRListID: trList.ID, ReturnDate: k, PassQuantity: v[0], FailQuantity: v[1], }) } else { global.PostGreSQL.Model(&trListStock).Where("tr_list_id = ? AND return_date = ?", trList.ID, k). Updates(map[string]interface{}{ "pass_quantity": v[0], "fail_quantity": v[1], }) } } return nil }) } } var newTcSfcFile []*model.TcSfcFile global.PostGreSQL.Model(&model.ABList{}).Where("order_date BETWEEN ? AND ?", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d")). Select("pbi").Group("pbi").Find(&trListIDs) _ = global.Oracle.Transaction(func(tx *gorm.DB) error { var tcSfcFilePBIs []string if len(trListIDs) == 0 { tx.Model(&model.TcSfcFile{}).Where("tc_sfc08 LIKE ? AND tc_sfc10 = ? AND tc_sfcconf != ? AND "+ "tc_sfc02 BETWEEN TO_DATE(?,'yyyy-mm-dd') AND TO_DATE(?,'yyyy-mm-dd')", "%TR%", "N", "0", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d")). Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) } else { tx.Model(&model.TcSfcFile{}).Where("tc_sfc01 NOT IN ? AND tc_sfc08 LIKE ? AND tc_sfc10 = ? AND tc_sfcconf != ? AND"+ "tc_sfc02 BETWEEN TO_DATE(?,'yyyy-mm-dd') AND TO_DATE(?,'yyyy-mm-dd')", trListIDs, "%TR%", "N", "0", carbon.Now().SubMonths(2).Format("Y-m-d"), carbon.Now().Format("Y-m-d")). Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) } //tx.Model(&model.TcSfcFile{}).Where("tc_sfc08 LIKE ?", "%TR%"). // Order("tc_sfc01").Select("tc_sfc01").Find(&tcSfcFilePBIs) page := len(tcSfcFilePBIs)/200 + 1 for i := 0; i < page; i++ { var pageTcSfcFile []*model.TcSfcFile var s []string if i == page-1 { s = tcSfcFilePBIs[i*200:] } else { s = tcSfcFilePBIs[i*200 : (i+1)*200] } tx.Where("tc_sfc01 IN ? AND tc_sfc08 LIKE ?", s, "%TR%"). // AND tc_sfc10 = ?, "N" Preload("TcSfdFile", func(db *gorm.DB) *gorm.DB { return db.Preload("SfbFile").Preload("ImaFile").Preload("RvbFile", func(db *gorm.DB) *gorm.DB { return db.Preload("IddFile").Preload("RvaFile") }) }).Preload("TcSfeFile", func(db *gorm.DB) *gorm.DB { return db.Preload("ImaFile") }).Preload("PmcFile").Find(&pageTcSfcFile) newTcSfcFile = append(newTcSfcFile, pageTcSfcFile...) } return nil }) for _, tcSfc := range newTcSfcFile { for _, tcSfd := range tcSfc.TcSfdFile { if tcSfd.TcSfd13 == "" { continue } status := "未结案" if tcSfd.SfbFile.Sfb04 == "8" { status = "结案" } else if tcSfd.SfbFile.Sfb04 == "0" { continue } var waferProduct string for _, tcSfe := range tcSfc.TcSfeFile { if tcSfe.TcSfe01 == tcSfc.TcSfc01 && tcSfe.TcSfe02 == tcSfd.TcSfd02 { waferProduct = tcSfe.ImaFile.Ima02 } } var returnQuantity, failQuantity, passQuantity float64 orderDateStockMap := make(map[string][]float64) for _, rvb := range tcSfd.RvbFile { if _, ok := orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")]; !ok { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")] = []float64{0, 0} } for _, idd := range rvb.IddFile { if idd.Idd11 == rvb.Rvb02 { returnQuantity += idd.Idd13 if idd.Idd06 == "BIN99" { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][1] += idd.Idd13 failQuantity += idd.Idd13 } else { orderDateStockMap[rvb.RvaFile.Rva06.Format("2006-01-02")][0] += idd.Idd13 passQuantity += idd.Idd13 } } } } global.PostGreSQL.Create(&model.TRList{ Status: status, OrderDate: tcSfc.TcSfc02.Format("2006-01-02"), PBI: tcSfc.TcSfc01, OutsourcingPBI: tcSfd.TcSfd13, Product: tcSfd.ImaFile.Ima02, WaferProduct: waferProduct, Package: tcSfd.ImaFile.Ima021, Factory: tcSfc.PmcFile.Pmc03, Lot: tcSfd.TcSfd06, Seal: tcSfd.TcSfdUd02, Quantity: tcSfd.TcSfd05, OnlineQuantity: tcSfd.TcSfd05 - returnQuantity, PassQuantity: passQuantity, FailQuantity: failQuantity, }) var trList *model.TRList global.PostGreSQL.Where("pbi = ? AND outsourcing_pbi = ?", tcSfc.TcSfc01, tcSfd.TcSfd13).Find(&trList) var trListStock []*model.TRListStock for k, v := range orderDateStockMap { trListStock = append(trListStock, &model.TRListStock{ TRListID: trList.ID, ReturnDate: k, PassQuantity: v[0], FailQuantity: v[1], }) } global.PostGreSQL.Create(&trListStock) } } }