|
|
@ -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 |
|
|
|
|
|
|
|
} |