|
|
@ -0,0 +1,223 @@ |
|
|
|
package main |
|
|
|
|
|
|
|
import ( |
|
|
|
dalBase "LAPP_ACURA_MOM_BACKEND/dao/base" |
|
|
|
dalJit "LAPP_ACURA_MOM_BACKEND/dao/jit" |
|
|
|
"LAPP_ACURA_MOM_BACKEND/etl_task/model" |
|
|
|
"LAPP_ACURA_MOM_BACKEND/grmi" |
|
|
|
"LAPP_ACURA_MOM_BACKEND/utils" |
|
|
|
"encoding/csv" |
|
|
|
"fmt" |
|
|
|
"github.com/go-xorm/xorm" |
|
|
|
"os" |
|
|
|
"strconv" |
|
|
|
"time" |
|
|
|
) |
|
|
|
|
|
|
|
const ( |
|
|
|
plantNr = 100 |
|
|
|
userId = "BackFlush" |
|
|
|
) |
|
|
|
|
|
|
|
func main() { |
|
|
|
now := time.Now() |
|
|
|
year, month, day := now.Date() |
|
|
|
hour := now.Hour() |
|
|
|
minute := now.Minute() |
|
|
|
second := now.Second() |
|
|
|
// init global location time zone
|
|
|
|
var err error |
|
|
|
utils.TimezoneLocation, err = time.LoadLocation("Asia/Shanghai") |
|
|
|
if err != nil { |
|
|
|
fmt.Println("初始化时区错误:" + err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
if len(os.Args) < 5 { |
|
|
|
fmt.Println("参数长度错误!") |
|
|
|
return |
|
|
|
} |
|
|
|
//fmt.Println("shellPath:", shellPath)
|
|
|
|
//fmt.Println("sourceDsn:", sourceDsn)
|
|
|
|
//fmt.Println("targetDsn:", targetDsn)
|
|
|
|
//fmt.Println("global.DatabaseDsn:", global.DatabaseDsn)
|
|
|
|
//fmt.Println("global.MongoDsn:", global.MongoDsn)
|
|
|
|
//fmt.Println("strconv.Itoa(task.TaskId):", strconv.Itoa(task.TaskId))
|
|
|
|
var acuraDsn = os.Args[2] |
|
|
|
var etlDsn = os.Args[3] |
|
|
|
taskId, err := strconv.Atoi(os.Args[4]) |
|
|
|
if err != nil { |
|
|
|
fmt.Println("接收到的taskId错误, taskId:" + os.Args[4]) |
|
|
|
return |
|
|
|
} |
|
|
|
// 初始化数据库连接
|
|
|
|
etlDB, err := xorm.NewEngine("mssql", etlDsn) |
|
|
|
if err != nil { |
|
|
|
fmt.Println("初始化讴歌数据库引擎错误:" + err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
err = etlDB.Ping() |
|
|
|
if err != nil { |
|
|
|
fmt.Println("连接ETL数据库失败, error:" + err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
acraDB, err := xorm.NewEngine("mssql", acuraDsn) |
|
|
|
if err != nil { |
|
|
|
fmt.Println("初始化讴歌数据库引擎错误:" + err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
err = acraDB.Ping() |
|
|
|
if err != nil { |
|
|
|
fmt.Println("连接讴歌数据库失败, error:" + err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
// 从etl数据库中获取参数
|
|
|
|
var index1 string |
|
|
|
var index2 string |
|
|
|
var index3 string |
|
|
|
var index5 string |
|
|
|
var index7 string |
|
|
|
var index8 string |
|
|
|
var index11 string |
|
|
|
var path string |
|
|
|
etlSession := etlDB.NewSession() |
|
|
|
shellParamLi := make([]model.ShellParam, 0) |
|
|
|
err = etlSession.Table("Shell").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.CtlParam1 |
|
|
|
case "index2": |
|
|
|
index2 = param.CtlParam1 |
|
|
|
case "index3": |
|
|
|
index3 = param.CtlParam1 |
|
|
|
case "index5": |
|
|
|
index5 = param.CtlParam1 |
|
|
|
case "index7": |
|
|
|
index7 = param.CtlParam1 |
|
|
|
case "index8": |
|
|
|
index8 = param.CtlParam1 |
|
|
|
case "index11": |
|
|
|
index11 = param.CtlParam1 |
|
|
|
case "path": |
|
|
|
path = param.CtlParam1 |
|
|
|
} |
|
|
|
} |
|
|
|
filepath := path + "/" + "bkfl" + fmt.Sprintf("%d%02d%02d%d", year, int(month), day, 3600*hour+60*minute+second) + "2TU.csv" |
|
|
|
acuraSession := acraDB.NewSession() |
|
|
|
|
|
|
|
nowStr := now.Format(grmi.DateTimeOutFormat) |
|
|
|
daoPackOrderItem := dalJit.NewPackOrderItemLstDAO(acuraSession, plantNr, userId) |
|
|
|
daoArticle := dalBase.NewArticleDAO(acuraSession, plantNr, userId) |
|
|
|
backFlushLi, err := daoPackOrderItem.GetUnFlushBackData(nowStr) |
|
|
|
if err != nil { |
|
|
|
fmt.Println("查询和更新包装单状态失败, error:" + err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
if len(backFlushLi) == 0 { |
|
|
|
fmt.Println("OK") |
|
|
|
return |
|
|
|
} |
|
|
|
ArtMap := make(map[string]int) |
|
|
|
serialOrderIdLi := make([]string, 0) |
|
|
|
packOrderIdLi := make([]string, 0) |
|
|
|
serialOrderStartTime := time.Now() |
|
|
|
serialOrderEndTime := time.Now() |
|
|
|
packOrderStartTime := time.Now() |
|
|
|
packOrderEndTime := time.Now() |
|
|
|
for index, item := range backFlushLi { |
|
|
|
_, exist := ArtMap[item.SerialOrder.ArtId] |
|
|
|
if !exist { |
|
|
|
ArtMap[item.SerialOrder.ArtId] = 1 |
|
|
|
} else { |
|
|
|
ArtMap[item.SerialOrder.ArtId] += 1 |
|
|
|
} |
|
|
|
if index == 0 { |
|
|
|
serialOrderStartTime = item.SerialOrder.CreateTime.Restore() |
|
|
|
serialOrderEndTime = item.SerialOrder.CreateTime.Restore() |
|
|
|
packOrderStartTime = item.PackOrderStatus.CreateTime.Restore() |
|
|
|
packOrderEndTime = item.PackOrderStatus.CreateTime.Restore() |
|
|
|
} |
|
|
|
if item.SerialOrder.CreateTime.Restore().Sub(serialOrderEndTime) > 0 { |
|
|
|
serialOrderEndTime = item.SerialOrder.CreateTime.Restore() |
|
|
|
} |
|
|
|
if item.SerialOrder.CreateTime.Restore().Sub(serialOrderStartTime) < 0 { |
|
|
|
serialOrderEndTime = item.SerialOrder.CreateTime.Restore() |
|
|
|
} |
|
|
|
if item.PackOrderStatus.CreateTime.Restore().Sub(packOrderStartTime) < 0 { |
|
|
|
packOrderStartTime = item.PackOrderStatus.CreateTime.Restore() |
|
|
|
} |
|
|
|
if item.PackOrderStatus.CreateTime.Restore().Sub(packOrderEndTime) > 0 { |
|
|
|
packOrderEndTime = item.PackOrderStatus.CreateTime.Restore() |
|
|
|
} |
|
|
|
serialOrderIdLi = append(serialOrderIdLi, item.SerialOrder.SerialOrderId) |
|
|
|
packOrderIdLi = append(packOrderIdLi, item.PackOrderStatus.PackOrderId) |
|
|
|
|
|
|
|
} |
|
|
|
if err = acuraSession.Begin(); err != nil { |
|
|
|
fmt.Println("开启事务失败, error:" + err.Error()) |
|
|
|
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()) |
|
|
|
} |
|
|
|
defer File.Close() |
|
|
|
//创建写入接口
|
|
|
|
WriterCsv := csv.NewWriter(File) |
|
|
|
for artId, qty := range ArtMap { |
|
|
|
article, err := daoArticle.SelectOne(artId) |
|
|
|
if err != nil { |
|
|
|
fmt.Println("查询物料数据失败, error:" + err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
if article == nil { |
|
|
|
fmt.Println("物料不存在, 物料ID:" + artId) |
|
|
|
return |
|
|
|
} |
|
|
|
qadArtId := article.ArtSpec3 |
|
|
|
if qadArtId == "" { |
|
|
|
fmt.Println("未获取到ERP零件号, 物料ID:" + artId) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
index6 := fmt.Sprintf("%02d%02d%d,%02d%02d%d", int(month), day, 3600*hour+60*minute+second, int(month), day, 3600*hour+60*minute+second) |
|
|
|
index8 = index8 + fmt.Sprintf("%d%02d%02d%d", year, int(month), day, 3600*hour+60*minute+second) |
|
|
|
index10 := now.Format("02/01/06") |
|
|
|
record := fmt.Sprintf(`"%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s"`, |
|
|
|
index1, |
|
|
|
index2, |
|
|
|
index3, |
|
|
|
qadArtId, |
|
|
|
index5, |
|
|
|
index6, |
|
|
|
index7, |
|
|
|
index8, |
|
|
|
strconv.Itoa(qty), |
|
|
|
index10, |
|
|
|
index11, |
|
|
|
) |
|
|
|
str := []string{record} //需要写入csv的数据,切片类型
|
|
|
|
|
|
|
|
//写入一条数据,传入数据为切片(追加模式)
|
|
|
|
err = WriterCsv.Write(str) |
|
|
|
if err != nil { |
|
|
|
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 |
|
|
|
|
|
|
|
} |