|
package main
|
|
|
|
import (
|
|
"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"
|
|
baseModel "LAPP_ACURA_MOM_BACKEND/models/base"
|
|
omModel "LAPP_ACURA_MOM_BACKEND/models/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 = 100
|
|
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 gaasDsn = 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
|
|
}
|
|
gaasDB, err := xorm.NewEngine("mssql", gaasDsn)
|
|
if err != nil {
|
|
fmt.Println("初始化讴歌数据库引擎错误:" + err.Error())
|
|
return
|
|
}
|
|
err = gaasDB.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
|
|
}
|
|
}
|
|
// INT SEQ 300
|
|
// 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)
|
|
gaasSession := gaasDB.NewSession()
|
|
defer gaasSession.Close()
|
|
sql := `select * from OM_SerialOrder as a INNER JOIN OM_SerialOrderStatus as b on
|
|
a.PlantNr = b.PlantNr and a.SerialOrderId = b.SerialOrderId LEFT JOIN Article as c on a.PlantNr = c.PlantNr and a.ArtId
|
|
where a.BackFlushToggle = 0 and b.Status = 80`
|
|
condition := fmt.Sprintf("%s = %s and %s = %s",
|
|
omMeta.SerialOrder_PlantNr.ColumnName, omMeta.SerialOrderStatus_PlantNr.ColumnName,
|
|
omMeta.SerialOrder_SerialOrderId.ColumnName, omMeta.SerialOrderStatus_SerialOrderId.ColumnName,
|
|
)
|
|
artCondition := fmt.Sprintf("%s = %s and %s = %s",
|
|
meta.Article_PlantNr.ColumnName, omMeta.SerialOrder_PlantNr.ColumnName,
|
|
meta.Article_ArtId.ColumnName, omMeta.SerialOrder_ArtId.ColumnName,
|
|
)
|
|
where := fmt.Sprintf("%s = %d and %s = %d and %s = %d and %s = %d and %s = %d and %s != '%s'",
|
|
omMeta.SerialOrder_PlantNr.ColumnName, plantNr, omMeta.SerialOrder_BackFlushFlag.ColumnName, 0,
|
|
omMeta.SerialOrder_GenerateFlag.ColumnName, 0, omMeta.SerialOrderStatus_Status.ColumnName, baseModel.WO_STATUS_FINISHED,
|
|
meta.Article_BackFlushItemToggle.ColumnName, 1, omMeta.SerialOrder_OrderType.ColumnName, baseModel.ORDER_TYPE_PRE,
|
|
)
|
|
type SerialOrderWithArt struct {
|
|
omModel.SerialOrder `xorm:"extends"`
|
|
omModel.SerialOrderStatus `xorm:"extends"`
|
|
baseModel.Article `xorm:"extends"`
|
|
}
|
|
serialOrderModelLi := make([]SerialOrderWithArt, 0)
|
|
err = gaasSession.Table(omMeta.SerialOrder.TableName).Join("INNER", omMeta.SerialOrderStatus.TableName, condition).
|
|
Join("LEFT", meta.Article.TableName, artCondition).Where(where).Find(&serialOrderModelLi)
|
|
if err != nil {
|
|
lastSql, LastArgs := gaasSession.LastSQL()
|
|
fmt.Println(fmt.Sprintf("查询工单失败, Sql:%s, args:%v, 错误:%v", lastSql, LastArgs, err))
|
|
return
|
|
}
|
|
ArtMap := make(map[string]int)
|
|
for _, serialOrderModel := range serialOrderModelLi {
|
|
if serialOrderModel.SerialOrder.LinkSerialOrderId != "" {
|
|
var serialOrder *omModel.SerialOrder
|
|
serialOrder, err = serialOrderDao.SelectOne(serialOrderModel.SerialOrder.LinkSerialOrderId)
|
|
if err != nil {
|
|
lastSql, LastArgs := gaasSession.LastSQL()
|
|
fmt.Println(fmt.Sprintf("查询工单失败, Sql:%s, args:%v, 错误:%v", lastSql, LastArgs, err))
|
|
return
|
|
}
|
|
if serialOrder != nil && serialOrder.BackFlushFlag {
|
|
continue
|
|
}
|
|
serialOrderLi := make([]omModel.SerialOrder, 0)
|
|
serialOrderLi, err = serialOrderDao.Select([]grmi.Predicate{
|
|
omMeta.SerialOrder_LinkSerialOrderId.NewPredicate(grmi.Equal, serialOrderModel.SerialOrder.LinkSerialOrderId)}, nil)
|
|
if err != nil {
|
|
lastSql, LastArgs := gaasSession.LastSQL()
|
|
fmt.Println(fmt.Sprintf("查询工单失败, Sql:%s, args:%v, 错误:%v", lastSql, LastArgs, err))
|
|
return
|
|
}
|
|
var alreadyBackFlush bool
|
|
for _, item := range serialOrderLi {
|
|
if item.BackFlushFlag {
|
|
alreadyBackFlush = true
|
|
break
|
|
}
|
|
}
|
|
if alreadyBackFlush {
|
|
continue
|
|
}
|
|
}
|
|
if serialOrderModel.Article.ArtSpec3 == "" {
|
|
fmt.Println("未获取到ERP零件号, 物料ID:" + serialOrderModel.Article.ArtId)
|
|
return
|
|
}
|
|
_, exist := ArtMap[serialOrderModel.SerialOrder.ArtId]
|
|
if !exist {
|
|
ArtMap[serialOrderModel.Article.ArtSpec3] = 1
|
|
} else {
|
|
ArtMap[serialOrderModel.Article.ArtSpec3] += 1
|
|
}
|
|
}
|
|
if len(serialOrderModelLi) == 0 {
|
|
fmt.Println("OK")
|
|
return
|
|
}
|
|
writeLi := make([]string, 0, len(ArtMap))
|
|
for artId, qty := range ArtMap {
|
|
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,
|
|
artId,
|
|
index5,
|
|
index6,
|
|
index7,
|
|
index8,
|
|
index9,
|
|
strconv.Itoa(qty),
|
|
index11,
|
|
index12,
|
|
)
|
|
writeLi = append(writeLi, writeStr)
|
|
}
|
|
if err = gaasSession.Begin(); err != nil {
|
|
fmt.Println("开启事务失败, error:" + err.Error())
|
|
return
|
|
}
|
|
defer func() {
|
|
if err != nil {
|
|
_ = gaasSession.Rollback()
|
|
} else {
|
|
_ = gaasSession.Commit()
|
|
}
|
|
}()
|
|
sql := fmt.Sprintf(`update %s set %s = 1 from %s INNER JOIN %s on %s LEFT JOIN %s on %s where %s`,
|
|
omMeta.SerialOrder.TableName, omMeta.SerialOrder_BackFlushFlag.Name, omMeta.SerialOrder.TableName,
|
|
omMeta.SerialOrderStatus.TableName, condition, meta.Article.TableName, artCondition, where,
|
|
)
|
|
_, err = gaasSession.Exec(sql)
|
|
if err != nil {
|
|
lastSql, LastArgs := gaasSession.LastSQL()
|
|
fmt.Println(fmt.Sprintf("更新工单回冲状态失败, Sql:%s, args:%v, 错误:%v", lastSql, LastArgs, err))
|
|
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 {
|
|
fmt.Println("写入csv文件失败, error:" + err.Error())
|
|
return
|
|
}
|
|
for _, item := range writeLi {
|
|
_, err = File.WriteString(item)
|
|
if err != nil {
|
|
fmt.Println("写入csv文件失败, error:" + err.Error())
|
|
return
|
|
}
|
|
_, err = File.Write([]byte{'\r', '\n'})
|
|
if err != nil {
|
|
fmt.Println("写入csv文件失败, error:" + err.Error())
|
|
return
|
|
}
|
|
}
|
|
_ = File.Close()
|
|
fmt.Println("OK")
|
|
return
|
|
|
|
}
|