From 62d8c4e46be005dd13733d24c2c7da57df5a5bc9 Mon Sep 17 00:00:00 2001 From: zhangxin Date: Thu, 25 Jan 2024 14:53:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=89=E7=BA=BF=E5=9B=9E=E5=86=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- etl_task/BackFlushGFrame3.go | 299 +++++++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 etl_task/BackFlushGFrame3.go diff --git a/etl_task/BackFlushGFrame3.go b/etl_task/BackFlushGFrame3.go new file mode 100644 index 0000000..d052ad4 --- /dev/null +++ b/etl_task/BackFlushGFrame3.go @@ -0,0 +1,299 @@ +package main + +import ( + dalBase "LAPP_ACURA_MOM_BACKEND/dao/base" + omModel "LAPP_ACURA_MOM_BACKEND/models/om" + + dalOm "LAPP_ACURA_MOM_BACKEND/dao/om" + "LAPP_ACURA_MOM_BACKEND/etl_task/model" + "LAPP_ACURA_MOM_BACKEND/grmi" + meta "LAPP_ACURA_MOM_BACKEND/meta/base" + omMeta "LAPP_ACURA_MOM_BACKEND/meta/om" + "LAPP_ACURA_MOM_BACKEND/utils" + "fmt" + _ "github.com/denisenkom/go-mssqldb" + _ "github.com/go-sql-driver/mysql" + "github.com/go-xorm/xorm" + "golang.org/x/text/encoding/simplifiedchinese" + "golang.org/x/text/transform" + "io/ioutil" + "os" + "path" + "strconv" + "strings" + "time" +) + +//BackFlushPackOrder.exe "server=101.201.121.115;database=LAPP_ACURA_MES;user id=sa;password=Leit2020;port=1433;encrypt=disable" "LAPP_ACURA_MES" "server=101.201.121.115;database=LAPP_ETL2;user id=sa;password=Leit2020;port=1433;encrypt=disable" "LAPP_ETL2" "98" + +func main() { + var err error + var plantNr = 300 + var userId = "BackFlush" + now := time.Now() + year, month, day := now.Date() + hour := now.Hour() + minute := now.Minute() + second := now.Second() + // init global location time zone + utils.TimezoneLocation, err = time.LoadLocation("Asia/Shanghai") + if err != nil { + fmt.Println("初始化时区错误:" + err.Error()) + return + } + if len(os.Args) < 5 { + fmt.Println("参数长度错误!") + return + } + var acuraDsn = os.Args[1] + var etlDsn = os.Args[3] + taskId, err := strconv.Atoi(os.Args[5]) + if err != nil { + fmt.Println("接收到的taskId错误, taskId:" + os.Args[5]) + return + } + //etlDsn := "server=101.201.121.115;database=LAPP_ETL;user id=sa;password=Leit2020;port=1433;encrypt=disable" + //acuraDsn := "server=101.201.121.115;database=LAPP_ACURA_MES3;user id=sa;password=Leit2020;port=1433;encrypt=disable" + //taskId := 101 + // 初始化数据库连接 + etlDB, err := xorm.NewEngine("mssql", etlDsn) + if err != nil { + fmt.Println("初始化etl数据库引擎错误:" + err.Error()) + return + } + err = etlDB.Ping() + if err != nil { + fmt.Println("连接ETL数据库失败, error:" + err.Error()) + return + } + acuraDB, err := xorm.NewEngine("mssql", acuraDsn) + if err != nil { + fmt.Println("初始化讴歌数据库引擎错误:" + err.Error()) + return + } + err = acuraDB.Ping() + if err != nil { + fmt.Println("连接讴歌数据库失败, error:" + err.Error()) + return + } + // 从etl数据库中获取参数 + var index1 string + var index2 string + var index3 string + var index5 string + var index8 string + var tempIndex9 string + var index12 string + var dir string + var suffix string + etlSession := etlDB.NewSession() + defer etlSession.Close() + shellParamLi := make([]model.ShellParam, 0) + err = etlSession.Table("ShellParam").Where("TaskId = ?", taskId).Find(&shellParamLi) + if err != nil { + fmt.Println("查询任务需要参数失败, error:" + err.Error()) + return + } + for _, param := range shellParamLi { + switch param.ParamName { + case "index1": + index1 = param.ParamValue + case "index2": + index2 = param.ParamValue + case "index3": + index3 = param.ParamValue + case "index5": + index5 = param.ParamValue + case "index8": + index8 = param.ParamValue + case "index9": + tempIndex9 = param.ParamValue + case "index12": + index12 = param.ParamValue + case "path": + dir = param.ParamValue + case "suffix": + suffix = param.ParamValue + } + } + // index1编码转换 + tempReader := transform.NewReader(strings.NewReader(index1), simplifiedchinese.GBK.NewEncoder()) + tempBytes, err := ioutil.ReadAll(tempReader) + if err != nil { + fmt.Println("转码失败, 错误:" + err.Error()) + return + } + index1 = string(tempBytes) + // index2编码转换 + tempReader = transform.NewReader(strings.NewReader(index2), simplifiedchinese.GBK.NewEncoder()) + tempBytes, err = ioutil.ReadAll(tempReader) + if err != nil { + fmt.Println("转码失败, 错误:" + err.Error()) + return + } + index2 = string(tempBytes) + // index3 编码转换 + tempReader = transform.NewReader(strings.NewReader(index3), simplifiedchinese.GBK.NewEncoder()) + tempBytes, err = ioutil.ReadAll(tempReader) + if err != nil { + fmt.Println("转码失败, 错误:" + err.Error()) + return + } + index3 = string(tempBytes) + // index5 编码转换 + tempReader = transform.NewReader(strings.NewReader(index5), simplifiedchinese.GBK.NewEncoder()) + tempBytes, err = ioutil.ReadAll(tempReader) + if err != nil { + fmt.Println("转码失败, 错误:" + err.Error()) + return + } + index5 = string(tempBytes) + // index8 编码转换 + tempReader = transform.NewReader(strings.NewReader(index8), simplifiedchinese.GBK.NewEncoder()) + tempBytes, err = ioutil.ReadAll(tempReader) + if err != nil { + fmt.Println("转码失败, 错误:" + err.Error()) + return + } + index8 = string(tempBytes) + // index12 编码转换 + tempReader = transform.NewReader(strings.NewReader(index12), simplifiedchinese.GBK.NewEncoder()) + tempBytes, err = ioutil.ReadAll(tempReader) + if err != nil { + fmt.Println("转码失败, 错误:" + err.Error()) + return + } + index12 = string(tempBytes) + filename := "bkfl" + fmt.Sprintf("%d%02d%02d%d", year, int(month), day, 3600*hour+60*minute+second) + suffix + ".csv" + filepath := path.Join(dir, filename) + acuraSession := acuraDB.NewSession() + defer acuraSession.Close() + daoArticle := dalBase.NewArticleDAO(acuraSession, plantNr, userId) + daoSerialOrder := dalOm.NewSerialOrderDAO(acuraSession, plantNr, userId) + where := fmt.Sprintf("%s = ? and %s = ? and %s = ?", + omMeta.SerialOrder_PlantNr.ColumnName, + omMeta.SerialOrder_QualityCheck.ColumnName, + omMeta.SerialOrder_BackFlushFlag.ColumnName, + ) + args := []interface{}{plantNr, "OK", false} + serialOrderLi := make([]omModel.SerialOrder, 0) + err = acuraSession.Table(omMeta.SerialOrder.TableName).Where(where, args...).Limit(1000).OrderBy(omMeta.SerialOrder_QualityCheckTime.SortColumnName).Find(&serialOrderLi) + if err != nil { + lastSql, lastArgs := acuraSession.LastSQL() + fmt.Println(fmt.Sprintf("查询工单失败,错误:%v, lastSql: %s, lastArgs: %v", err, lastSql, lastArgs)) + return + } + ArtMap := make(map[string]int) + serialOrderIdLi := make([]string, 0) + for _, serialOrder := range serialOrderLi { + qty := ArtMap[serialOrder.ArtId] + ArtMap[serialOrder.ArtId] = qty + 1 + serialOrderIdLi = append(serialOrderIdLi, serialOrder.SerialOrderId) + } + writeLi := make([]string, 0, len(ArtMap)) + for artId, qty := range ArtMap { + //article, err := daoArticle.SelectOne(artId) + articleLi, err := daoArticle.Select([]grmi.Predicate{meta.Article_ArtId.NewPredicate(grmi.Equal, artId)}, nil) + if err != nil { + _ = acuraSession.Rollback() + fmt.Println("查询物料数据失败, error:" + err.Error()) + return + } + if len(articleLi) == 0 { + _ = acuraSession.Rollback() + fmt.Println("物料不存在, 物料ID:" + artId) + return + } + article := articleLi[0] + if !article.BackFlushItemToggle { + continue + } + qadArtId := article.ArtSpec3 + if qadArtId == "" { + fmt.Println("未获取到ERP零件号, 物料ID:" + artId) + return + } + index6 := fmt.Sprintf("%02d%02d%d", int(month), day, 3600*hour+60*minute+second) + index7 := fmt.Sprintf("%02d%02d%d", int(month), day, 3600*hour+60*minute+second) + index9 := tempIndex9 + fmt.Sprintf("%d%02d%02d%d", year, int(month), day, 3600*hour+60*minute+second) + index11 := now.Format("01/02/06") + writeStr := fmt.Sprintf(`"%s","%s",%s,"%s","%s",%s,%s,"%s","%s",%s,%s,"%s",""`, + index1, + index2, + index3, + qadArtId, + index5, + index6, + index7, + index8, + index9, + strconv.Itoa(qty), + index11, + index12, + ) + writeLi = append(writeLi, writeStr) + } + if err = acuraSession.Begin(); err != nil { + fmt.Println("开启事务失败, error:" + err.Error()) + return + } + count, err := daoSerialOrder.UpdateBackFlushFlag(serialOrderIdLi) + if err != nil { + _ = acuraSession.Rollback() + fmt.Println("更新工单回冲状态失败, error:" + err.Error()) + return + } + if int(count) != len(serialOrderIdLi) { + _ = acuraSession.Rollback() + fmt.Println("更新工单回冲状态数量和查询的数量不一致, 更新数量:" + strconv.Itoa(int(count)) + ", 查询数量:" + strconv.Itoa(len(serialOrderIdLi))) + return + } + //OpenFile读取文件,不存在时则创建,使用追加模式 + File, err := os.OpenFile(filepath, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666) + if err != nil { + fmt.Println("创建csv文件失败, error:" + err.Error()) + return + } + _, err = File.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM + if err != nil { + _ = acuraSession.Rollback() + fmt.Println("写入csv文件失败, error:" + err.Error()) + return + } + for _, item := range writeLi { + _, err = File.WriteString(item) + if err != nil { + _ = acuraSession.Rollback() + fmt.Println("写入csv文件失败, error:" + err.Error()) + return + } + _, err = File.Write([]byte{'\r', '\n'}) + if err != nil { + _ = acuraSession.Rollback() + fmt.Println("写入csv文件失败, error:" + err.Error()) + return + } + } + File.Close() + //创建写入接口 + //WriterCsv := csv.NewWriter(File) + + //for _, writeItem := range writeLi { + // //写入一条数据,传入数据为切片(追加模式) + // err = WriterCsv.Write(writeItem) + // if err != nil { + // _ = acuraSession.Rollback() + // fmt.Println("写入csv文件失败, error:" + err.Error()) + // return + // } + //} + //WriterCsv.Flush() //刷新,不刷新是无法写入的 + err = acuraSession.Commit() + if err != nil { + fmt.Println("事务提交失败, error:" + err.Error()) + return + } + fmt.Println("OK") + return + +}