test_data/repository/test.data/report.list.cron.go
2024-08-30 16:27:39 +08:00

1648 lines
62 KiB
Go

package test_data
import (
"errors"
"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") {
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
global.PostGreSQL.Where("pbi = ? AND outsourcing_pbi = ?",
tcSfc.TcSfc01, tcSfd.TcSfd13).Find(&abList)
global.PostGreSQL.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 + "%",
})
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{}).Select("pbi").Group("pbi").Find(&abListIDs)
_ = global.Oracle.Transaction(func(tx *gorm.DB) error {
var tcSfcFilePBIs []string
tx.Model(&model.TcSfcFile{}).Where("tc_sfc01 NOT IN ? AND tc_sfc08 LIKE ? AND tc_sfc10 = ?", abListIDs, "%AB%").
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") {
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 {
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{}).Select("pbi").Group("pbi").Find(&bpListIDs)
_ = global.Oracle.Transaction(func(tx *gorm.DB) error {
var tcSfcFilePBIs []string
tx.Model(&model.TcSfcFile{}).Where("tc_sfc01 NOT IN ? AND tc_sfc08 LIKE ?", bpListIDs, "%MH%").
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 {
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 oldTcSfcFile []*model.TcSfcFile
var cpListIDs []string
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 {
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{}).Select("pbi").Group("pbi").Find(&cpListIDs)
_ = global.Oracle.Transaction(func(tx *gorm.DB) error {
var tcSfcFilePBIs []string
tx.Model(&model.TcSfcFile{}).Where("tc_sfc01 NOT IN ? AND tc_sfc08 = ?", cpListIDs, "CP").
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("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 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 CronFTList() {
var oldTcSfcFile []*model.TcSfcFile
var cpListIDs []string
global.PostGreSQL.Model(&model.FTList{}).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 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 {
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
})
}
}
var newTcSfcFile []*model.TcSfcFile
global.PostGreSQL.Model(&model.FTList{}).Select("pbi").Group("pbi").Find(&cpListIDs)
_ = global.Oracle.Transaction(func(tx *gorm.DB) error {
var tcSfcFilePBIs []string
tx.Model(&model.TcSfcFile{}).Where("tc_sfc01 NOT IN ? AND (tc_sfc01 LIKE ? AND tc_sfc08 = ?) OR (tc_sfc08 = ?)",
cpListIDs, "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("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 string
for _, tcSfe := range tcSfc.TcSfeFile {
if tcSfe.TcSfe01 == tcSfc.TcSfc01 && tcSfe.TcSfe02 == tcSfd.TcSfd02 {
waferProduct = tcSfe.ImaFile.Ima02
}
}
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 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 {
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{}).Select("pbi").Group("pbi").Find(&trListIDs)
_ = global.Oracle.Transaction(func(tx *gorm.DB) error {
var tcSfcFilePBIs []string
tx.Model(&model.TcSfcFile{}).Where("tc_sfc01 NOT IN ? AND tc_sfc08 LIKE ? AND tc_sfc10 = ?", trListIDs, "%TR%", "N").
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 {
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)
}
}
}
//func OldFTList(r *request.FTList) ([]*model.ReportList, int64) {
// var sql string
// if r.Product != "" {
// sql += "product = '" + r.Product + "'"
// }
// if r.Lot != "" {
// if sql == "" {
// sql += "lot ='" + r.Lot + "'"
// } else {
// sql += " AND lot = '" + r.Lot + "'"
// }
// }
// if r.Factory != "" {
// if sql == "" {
// sql += "factory ='" + r.Factory + "'"
// } else {
// sql += " AND factory = '" + r.Factory + "'"
// }
// }
// if r.TestProgram != "" {
// if sql == "" {
// sql += "test_program ='" + r.TestProgram + "'"
// } else {
// sql += " AND test_program = '" + r.TestProgram + "'"
// }
// }
// if r.PBI != "" {
// if sql == "" {
// sql += "pbi ='" + r.PBI + "'"
// } else {
// sql += " AND pbi = '" + r.PBI + "'"
// }
// }
// if r.OrderDate != "" {
// if sql == "" {
// sql += "order_date ='" + r.OrderDate + "'"
// } else {
// sql += " AND order_date = '" + r.OrderDate + "'"
// }
// }
// if r.Seal != "" {
// if sql == "" {
// sql += "seal ='" + r.Seal + "'"
// } else {
// sql += " AND seal = '" + r.Seal + "'"
// }
// }
// if r.Page > 0 {
// r.Page--
// }
// var reportList []*model.ReportList
// var total int64
// if r.QueryType == "List" {
// var reports []*model.Report
// global.PostGreSQL.Where("step = ?", "FT").Order("pbi").Find(&reports).Count(&total).
// Offset(r.Page * r.PageSize).Limit(r.PageSize).Find(&reports)
// for _, report := range reports {
// var finalReports []*model.FinalReport
// global.PostGreSQL.Where("pbi = ? AND product = ? AND lot = ? AND step = ?",
// report.PBI, report.Product, report.Lot, "FT").Find(&finalReports)
// var reportTestQuantity, reportPassQuantity, reportPassProbability string
// for _, finalReport := range finalReports {
// reportTestQuantityDecimal, _ := decimal.NewFromString(reportTestQuantity)
// reportPassQuantityDecimal, _ := decimal.NewFromString(reportPassQuantity)
// finalReportTestQuantityDecimal, _ := decimal.NewFromString(finalReport.ReportTestQuantity)
// finalReportPassQuantityDecimal, _ := decimal.NewFromString(finalReport.ReportPassQuantity)
// reportTestQuantity = reportTestQuantityDecimal.Add(finalReportTestQuantityDecimal).String()
// reportPassQuantity = reportPassQuantityDecimal.Add(finalReportPassQuantityDecimal).String()
// }
// reportTestQuantityDecimal, _ := decimal.NewFromString(reportTestQuantity)
// reportPassQuantityDecimal, _ := decimal.NewFromString(reportPassQuantity)
// if !reportTestQuantityDecimal.IsZero() {
// reportPassProbability = reportPassQuantityDecimal.Div(reportTestQuantityDecimal).
// Mul(decimal.NewFromInt(100)).Round(2).String() + "%"
// }
// isAppend := true
// for _, list := range reportList {
// if list.PBI == report.PBI {
// firstPassQuantity, _ := decimal.NewFromString(report.FirstPassQuantity)
// listFirstPassQuantity, _ := decimal.NewFromString(list.PassQuantity)
// testQuantity, _ := decimal.NewFromString(report.TestQuantity)
// passQuantity, _ := decimal.NewFromString(report.PassQuantity)
// listTestQuantity, _ := decimal.NewFromString(list.TestQuantity)
// listPassQuantity, _ := decimal.NewFromString(list.PassQuantity)
// list.TestQuantity = testQuantity.Add(listTestQuantity).String()
// list.PassQuantity = passQuantity.Add(listPassQuantity).String()
// list.PassProbability = passQuantity.Add(listPassQuantity).Div(testQuantity.Add(listTestQuantity)).
// Round(4).Mul(decimal.NewFromInt(100)).String() + "%"
//
// list.FirstPassQuantity = firstPassQuantity.Add(listFirstPassQuantity).String()
// list.PassProbability = firstPassQuantity.Add(listFirstPassQuantity).Div(testQuantity.Add(listTestQuantity)).
// Round(4).Mul(decimal.NewFromInt(100)).String() + "%"
//
// //reportTestQuantity, _ := decimal.NewFromString(finalReport.ReportTestQuantity)
// //reportPassQuantity, _ := decimal.NewFromString(finalReport.ReportPassQuantity)
// //listReportTestQuantity, _ := decimal.NewFromString(list.ReportTestQuantity)
// //listReportPassQuantity, _ := decimal.NewFromString(list.ReportPassQuantity)
// //if !reportTestQuantity.Add(listReportTestQuantity).IsZero() {
// // list.ReportTestQuantity = reportTestQuantity.Add(listReportTestQuantity).String()
// // list.ReportPassQuantity = reportPassQuantity.Add(listReportPassQuantity).String()
// // list.PassProbability = reportPassQuantity.Add(listReportPassQuantity).Div(reportTestQuantity.Add(listReportTestQuantity)).
// // Round(4).Mul(decimal.NewFromInt(100)).String() + "%"
// //}
// isAppend = false
// break
// }
// }
// if isAppend {
// reportList = append(reportList, &model.ReportList{
// Product: report.Product,
// Lot: report.Lot,
// Factory: report.Factory,
// TestMachine: report.TestMachine,
// TestProgram: report.TestProgram,
// PBI: report.PBI,
// OrderDate: report.OrderDate,
// Seal: report.Seal,
// TestQuantity: report.TestQuantity,
// FirstPassQuantity: report.FirstPassQuantity,
// FirstPassProbability: report.FirstPassProbability,
// PassQuantity: report.PassQuantity,
// PassProbability: report.PassProbability,
// ReportTestQuantity: reportTestQuantity,
// ReportPassQuantity: reportPassQuantity,
// ReportPassProbability: reportPassProbability,
// TestTime: report.TestTime,
// Step: "FT",
// StackingMaterials: report.StackingMaterials,
// })
// }
// }
// for _, reportlist := range reportList {
// var testQuantityDiffLabel, passQuantityDiffLabel, returnProbabilityLabel bool
// testQuantityDecimal, _ := decimal.NewFromString(reportlist.TestQuantity)
// reportTestQuantityDecimal, _ := decimal.NewFromString(reportlist.ReportTestQuantity)
// firstPassQuantityDecimal, _ := decimal.NewFromString(reportlist.FirstPassQuantity)
// passQuantityDecimal, _ := decimal.NewFromString(reportlist.PassQuantity)
// reportPassQuantityDecimal, _ := decimal.NewFromString(reportlist.ReportPassQuantity)
// if !testQuantityDecimal.IsZero() {
// diff := reportTestQuantityDecimal.Sub(testQuantityDecimal).Div(testQuantityDecimal).Round(4).
// Mul(decimal.NewFromInt(100))
// if reportTestQuantityDecimal.Sub(testQuantityDecimal).LessThan(decimal.NewFromInt(0)) ||
// decimal.NewFromInt(5).LessThanOrEqual(diff) {
// testQuantityDiffLabel = true
// }
// reportlist.TestQuantityDiff = diff.String() + "%"
// reportlist.TestQuantityDiffLabel = testQuantityDiffLabel
// probability := passQuantityDecimal.Sub(firstPassQuantityDecimal).Div(testQuantityDecimal).Round(4).
// Mul(decimal.NewFromInt(100))
// if probability.LessThan(decimal.NewFromInt(0)) ||
// decimal.NewFromInt(5).LessThanOrEqual(probability) {
// returnProbabilityLabel = true
// }
// reportlist.ReturnProbability = probability.String() + "%"
// reportlist.ReturnProbabilityLabel = returnProbabilityLabel
// }
// if !reportPassQuantityDecimal.IsZero() {
// diff := passQuantityDecimal.Sub(reportPassQuantityDecimal).Div(reportPassQuantityDecimal).Round(4).
// Mul(decimal.NewFromInt(100))
// if passQuantityDecimal.Sub(reportPassQuantityDecimal).LessThan(decimal.NewFromInt(0)) ||
// decimal.NewFromInt(5).LessThanOrEqual(diff) {
// passQuantityDiffLabel = true
// }
// reportlist.PassQuantityDiff = diff.String() + "%"
// reportlist.PassQuantityDiffLabel = passQuantityDiffLabel
// }
// }
// } else if r.QueryType == "Bin" {
// var reports []*model.Report
// global.PostGreSQL.Where("step = ?", "FT").Where(sql).
// Preload("BinFail", func(db *gorm.DB) *gorm.DB {
// return db.Where("report_site_id = ?", "0")
// }).Preload("Site", func(db *gorm.DB) *gorm.DB {
// return db.Preload("BinFail")
// }).Order("pbi").Find(&reports)
// for _, report := range reports {
// isAppend := true
// for _, list := range reportList {
// if list.PBI == report.PBI {
// reportTestQuantity, _ := decimal.NewFromString(report.TestQuantity)
// reportPassQuantity, _ := decimal.NewFromString(report.PassQuantity)
// listTestQuantity, _ := decimal.NewFromString(list.TestQuantity)
// listPassQuantity, _ := decimal.NewFromString(list.PassQuantity)
// list.TestQuantity = reportTestQuantity.Add(listTestQuantity).String()
// list.PassQuantity = reportPassQuantity.Add(listPassQuantity).String()
// list.PassProbability = reportPassQuantity.Add(listPassQuantity).Div(reportTestQuantity.Add(listTestQuantity)).
// Round(4).Mul(decimal.NewFromInt(100)).String() + "%"
// isAppend = false
// for _, binFail := range report.BinFail {
// quantityDecimal, _ := decimal.NewFromString(binFail.Quantity)
// quantity, _ := quantityDecimal.Float64()
// list.SoftBinFailMap[binFail.SoftBin] += quantity
// list.HardBinFailMap[binFail.HardBin] += quantity
// }
// for _, site := range report.Site {
// for _, reportSite := range list.Site {
// if reportSite.Site == site.Site {
// siteTestQuantity, _ := decimal.NewFromString(site.TestQuantity)
// sitePassQuantity, _ := decimal.NewFromString(site.PassQuantity)
// reportSiteTestQuantity, _ := decimal.NewFromString(reportSite.TestQuantity)
// reportSitePassQuantity, _ := decimal.NewFromString(reportSite.PassQuantity)
// reportSite.TestQuantity = siteTestQuantity.Add(reportSiteTestQuantity).String()
// reportSite.PassQuantity = sitePassQuantity.Add(reportSitePassQuantity).String()
// reportSite.PassProbability = sitePassQuantity.Add(reportSitePassQuantity).Div(siteTestQuantity.Add(reportSiteTestQuantity)).
// Round(4).Mul(decimal.NewFromInt(100)).String() + "%"
// for _, binFail := range site.BinFail {
// quantityDecimal, _ := decimal.NewFromString(binFail.Quantity)
// quantity, _ := quantityDecimal.Float64()
// reportSite.SoftBinFailMap[binFail.SoftBin] += quantity
// reportSite.HardBinFailMap[binFail.HardBin] += quantity
// }
// break
// }
// }
// }
// break
// }
// }
// if isAppend {
// softBinFail, hardBinFail := make(map[string]float64), make(map[string]float64)
// for _, binFail := range report.BinFail {
// quantityDecimal, _ := decimal.NewFromString(binFail.Quantity)
// quantity, _ := quantityDecimal.Float64()
// softBinFail[binFail.SoftBin] += quantity
// hardBinFail[binFail.HardBin] += quantity
// }
// var reportListSites []*model.ReportListSites
// for _, site := range report.Site {
// siteSoftBinFail, siteHardBinFail := make(map[string]float64), make(map[string]float64)
// for _, binFail := range site.BinFail {
// quantityDecimal, _ := decimal.NewFromString(binFail.Quantity)
// quantity, _ := quantityDecimal.Float64()
// siteSoftBinFail[binFail.SoftBin] += quantity
// siteHardBinFail[binFail.HardBin] += quantity
// }
// reportListSites = append(reportListSites, &model.ReportListSites{
// ID: site.ID,
// ReportID: site.ReportID,
// Site: site.Site,
// TestQuantity: site.TestQuantity,
// PassQuantity: site.PassQuantity,
// PassProbability: site.PassProbability,
// SoftBinFailMap: siteSoftBinFail,
// HardBinFailMap: siteHardBinFail,
// })
// }
// //var finalReport *model.FinalReport
// //if errors.Is(global.PostGreSQL.Where("pbi = ? AND product = ? AND lot = ?",
// // report.PBI, report.Product, report.Lot).Find(&finalReport).Error, gorm.ErrRecordNotFound) {
// // //finalReport.ReportTestQuantity = ""
// // //finalReport.ReportPassQuantity = ""
// // //finalReport.ReportPassProbability = ""
// //}
// reportList = append(reportList, &model.ReportList{
// Product: report.Product,
// Lot: report.Lot,
// Factory: report.Factory,
// TestMachine: report.TestMachine,
// TestProgram: report.TestProgram,
// PBI: report.PBI,
// OrderDate: report.OrderDate,
// Seal: report.Seal,
// TestQuantity: report.TestQuantity,
// FirstPassQuantity: report.FirstPassQuantity,
// FirstPassProbability: report.FirstPassProbability,
// PassQuantity: report.PassQuantity,
// PassProbability: report.PassProbability,
// //ReportTestQuantity: finalReport.ReportTestQuantity,
// //ReportPassQuantity: finalReport.ReportPassQuantity,
// //ReportPassProbability: finalReport.ReportPassProbability,
// TestTime: report.TestTime,
// Step: report.Step,
// SoftBinFailMap: softBinFail,
// HardBinFailMap: hardBinFail,
// Site: reportListSites,
// })
// }
// }
// for _, list := range reportList {
// testQuantity, _ := decimal.NewFromString(list.TestQuantity)
//
// var softBinFail, hardBinFail []*model.ReportBinFail
// for softBin, softBinQuantity := range list.SoftBinFailMap {
// softBinQuantityDecimal := decimal.NewFromFloat(softBinQuantity)
// softBinFail = append(softBinFail, &model.ReportBinFail{
// Bin: softBin,
// Quantity: softBinQuantity,
// Proportion: softBinQuantityDecimal.Div(testQuantity).Round(4).Mul(decimal.NewFromInt(100)).String() + "%",
// })
// }
// sort.Slice(softBinFail, func(i, j int) bool {
// return softBinFail[i].Quantity > softBinFail[j].Quantity
// })
// for hardBin, hardBinQuantity := range list.HardBinFailMap {
// hardBinQuantityDecimal := decimal.NewFromFloat(hardBinQuantity)
// hardBinFail = append(hardBinFail, &model.ReportBinFail{
// Bin: hardBin,
// Quantity: hardBinQuantity,
// Proportion: hardBinQuantityDecimal.Div(testQuantity).Round(4).Mul(decimal.NewFromInt(100)).String() + "%",
// })
// }
// sort.Slice(hardBinFail, func(i, j int) bool {
// return hardBinFail[i].Quantity > hardBinFail[j].Quantity
// })
// for _, site := range list.Site {
// var siteSoftBinFail, siteHardBinFail []*model.ReportBinFail
// for softBin, softBinQuantity := range site.SoftBinFailMap {
// siteSoftBinFail = append(siteSoftBinFail, &model.ReportBinFail{
// Bin: softBin,
// Quantity: softBinQuantity,
// })
// }
// sort.Slice(siteSoftBinFail, func(i, j int) bool {
// return siteSoftBinFail[i].Quantity > siteSoftBinFail[j].Quantity
// })
// for hardBin, hardBinQuantity := range site.HardBinFailMap {
// siteHardBinFail = append(siteHardBinFail, &model.ReportBinFail{
// Bin: hardBin,
// Quantity: hardBinQuantity,
// })
// }
// sort.Slice(siteHardBinFail, func(i, j int) bool {
// return siteHardBinFail[i].Quantity > siteHardBinFail[j].Quantity
// })
// site.SoftBinFail = siteSoftBinFail
// site.HardBinFail = siteHardBinFail
// }
// sort.Slice(list.Site, func(i, j int) bool {
// iDecimal, _ := decimal.NewFromString(list.Site[i].PassProbability[:len(list.Site[i].PassProbability)-1])
// jDecimal, _ := decimal.NewFromString(list.Site[j].PassProbability[:len(list.Site[j].PassProbability)-1])
// return jDecimal.LessThan(iDecimal)
// })
// list.SoftBinFail = softBinFail
// list.HardBinFail = hardBinFail
// }
// } else if r.QueryType == "SubBatch" {
// var reports []*model.Report
// global.PostGreSQL.Where("step = ?", "FT").Where(sql).
// Preload("BinFail", func(db *gorm.DB) *gorm.DB {
// return db.Where("report_site_id = ?", "0")
// }).Preload("Site", func(db *gorm.DB) *gorm.DB {
// return db.Preload("BinFail")
// }).Order("pbi").Find(&reports)
// for _, report := range reports {
// softBinFailMap, hardBinFailMap := make(map[string]float64), make(map[string]float64)
// for _, binFail := range report.BinFail {
// quantityDecimal, _ := decimal.NewFromString(binFail.Quantity)
// quantity, _ := quantityDecimal.Float64()
// softBinFailMap[binFail.SoftBin] += quantity
// hardBinFailMap[binFail.HardBin] += quantity
// }
// var reportListSites []*model.ReportListSites
// for _, site := range report.Site {
// siteSoftBinFailMap, siteHardBinFailMap := make(map[string]float64), make(map[string]float64)
// for _, binFail := range site.BinFail {
// quantityDecimal, _ := decimal.NewFromString(binFail.Quantity)
// quantity, _ := quantityDecimal.Float64()
// siteSoftBinFailMap[binFail.SoftBin] += quantity
// siteHardBinFailMap[binFail.HardBin] += quantity
// }
// var siteSoftBinFail, siteHardBinFail []*model.ReportBinFail
// for softBin, softBinQuantity := range siteSoftBinFailMap {
// siteSoftBinFail = append(siteSoftBinFail, &model.ReportBinFail{
// Bin: softBin,
// Quantity: softBinQuantity,
// })
// }
// sort.Slice(siteSoftBinFail, func(i, j int) bool {
// return siteSoftBinFail[i].Quantity > siteSoftBinFail[j].Quantity
// })
// for hardBin, hardBinQuantity := range siteHardBinFailMap {
// siteHardBinFail = append(siteHardBinFail, &model.ReportBinFail{
// Bin: hardBin,
// Quantity: hardBinQuantity,
// })
// }
// sort.Slice(siteHardBinFail, func(i, j int) bool {
// return siteHardBinFail[i].Quantity > siteHardBinFail[j].Quantity
// })
// reportListSites = append(reportListSites, &model.ReportListSites{
// ID: site.ID,
// ReportID: site.ReportID,
// Site: site.Site,
// TestQuantity: site.TestQuantity,
// PassQuantity: site.PassQuantity,
// PassProbability: site.PassProbability,
// SoftBinFailMap: siteSoftBinFailMap,
// HardBinFailMap: siteHardBinFailMap,
// SoftBinFail: siteSoftBinFail,
// HardBinFail: siteHardBinFail,
// })
// }
// sort.Slice(reportListSites, func(i, j int) bool {
// iDecimal, _ := decimal.NewFromString(reportListSites[i].PassProbability[:len(reportListSites[i].PassProbability)-1])
// jDecimal, _ := decimal.NewFromString(reportListSites[j].PassProbability[:len(reportListSites[j].PassProbability)-1])
// return jDecimal.LessThan(iDecimal)
// })
// testQuantityDecimal, _ := decimal.NewFromString(report.TestQuantity)
// var softBinFail, hardBinFail []*model.ReportBinFail
// for softBin, softBinQuantity := range softBinFailMap {
// softBinQuantityDecimal := decimal.NewFromFloat(softBinQuantity)
// softBinFail = append(softBinFail, &model.ReportBinFail{
// Bin: softBin,
// Quantity: softBinQuantity,
// Proportion: softBinQuantityDecimal.Div(testQuantityDecimal).Round(4).Mul(decimal.NewFromInt(100)).String() + "%",
// })
// }
// sort.Slice(softBinFail, func(i, j int) bool {
// return softBinFail[i].Quantity > softBinFail[j].Quantity
// })
// for hardBin, hardBinQuantity := range hardBinFailMap {
// hardBinQuantityDecimal := decimal.NewFromFloat(hardBinQuantity)
// hardBinFail = append(hardBinFail, &model.ReportBinFail{
// Bin: hardBin,
// Quantity: hardBinQuantity,
// Proportion: hardBinQuantityDecimal.Div(testQuantityDecimal).Round(4).Mul(decimal.NewFromInt(100)).String() + "%",
// })
// }
// sort.Slice(hardBinFail, func(i, j int) bool {
// return hardBinFail[i].Quantity > hardBinFail[j].Quantity
// })
// reportList = append(reportList, &model.ReportList{
// Product: report.Product,
// Lot: report.Lot,
// SubBatch: report.SubBatch,
// Factory: report.Factory,
// TestMachine: report.TestMachine,
// TestProgram: report.TestProgram,
// PBI: report.PBI,
// OrderDate: report.OrderDate,
// Seal: report.Seal,
// TestQuantity: report.TestQuantity,
// FirstPassQuantity: report.FirstPassQuantity,
// FirstPassProbability: report.FirstPassProbability,
// PassQuantity: report.PassQuantity,
// PassProbability: report.PassProbability,
// TestTime: report.TestTime,
// Step: report.Step,
// SoftBinFailMap: softBinFailMap,
// HardBinFailMap: hardBinFailMap,
// StackingMaterials: report.StackingMaterials,
// SoftBinFail: softBinFail,
// HardBinFail: hardBinFail,
// Site: reportListSites,
// })
// }
// sort.Slice(reportList, func(i, j int) bool {
// iDecimal, _ := decimal.NewFromString(reportList[i].PassProbability[:len(reportList[i].PassProbability)-1])
// jDecimal, _ := decimal.NewFromString(reportList[j].PassProbability[:len(reportList[j].PassProbability)-1])
// return jDecimal.LessThan(iDecimal)
// })
// }
// return reportList, total
//}