package asn
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/tealeg/xlsx"
|
|
"io/ioutil"
|
|
"leit.com/leit_seat_aps/common"
|
|
"leit.com/leit_seat_aps/db"
|
|
"leit.com/leit_seat_aps/glog"
|
|
"leit.com/leit_seat_aps/service"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func LoadAsnToLandingData() {
|
|
for {
|
|
var (
|
|
ald AsnLandData
|
|
projtab db.Me_project
|
|
projtablst []db.Me_project
|
|
rd []os.FileInfo
|
|
fi os.FileInfo
|
|
edi_file string
|
|
//matched bool
|
|
err error
|
|
)
|
|
|
|
projtab = db.Me_project{}
|
|
if projtablst, err = projtab.GetAllActive(); err != nil {
|
|
glog.InfoExtln("Asn解析", "Failed to get project list!")
|
|
return
|
|
}
|
|
|
|
for i, _ := range projtablst {
|
|
// 加载项目数据
|
|
if !common.IsExists(projtablst[i].Tier2_folder) {
|
|
glog.InfoExtln("Asn解析", "读取ASN失败:", projtablst[i].Projectid, projtablst[i].Tier2_folder, err)
|
|
continue
|
|
}
|
|
// 读取文件夹内的文件并解析
|
|
if rd, err = ioutil.ReadDir(projtablst[i].Tier2_folder + "/inbox"); err != nil {
|
|
glog.InfoExtln("Asn解析", "读取ASN失败:", projtablst[i].Projectid, projtablst[i].Tier2_folder, err)
|
|
return
|
|
}
|
|
rds := common.SortByTime(rd)
|
|
for _, fi = range rds {
|
|
if fi.IsDir() {
|
|
glog.InfoExtln("Asn解析", "读取ASN失败:", err)
|
|
continue
|
|
}
|
|
|
|
edi_file = projtablst[i].Tier2_folder + "/inbox" + "/" + fi.Name()
|
|
fmt.Println(edi_file)
|
|
|
|
// 判断文件的合规性
|
|
//if matched, err = regexp.MatchString(projtablst[i].Asn_file_prefix, fi.Name()); err != nil {
|
|
// glog.InfoExtln("Asn解析", "Failed to match EDI file name: due to: ", fi.Name(), err)
|
|
// return
|
|
//}
|
|
//if !matched {
|
|
// glog.InfoExtln("Asn解析", "The specified EDI file: doesn't match the required name specification!", fi.Name())
|
|
// os.Rename(edi_file, projtablst[i].Asn_folder+"/errbox"+"/"+fi.Name())
|
|
// return
|
|
//}
|
|
|
|
ald = AsnLandData{}
|
|
if err = ald.ReadAsnData(edi_file); err != nil {
|
|
glog.InfoExtln("Asn解析", "读取ASN失败:", err)
|
|
return
|
|
}
|
|
|
|
if err = ald.SaveAsnData(); err != nil {
|
|
glog.InfoExtln("Asn解析", "保存ASN失败:", err)
|
|
return
|
|
}
|
|
|
|
// 将文件移到outbox
|
|
os.Rename(edi_file, projtablst[i].Tier2_folder+"/outbox"+"/"+fi.Name())
|
|
}
|
|
}
|
|
time.Sleep(10 * time.Second)
|
|
}
|
|
}
|
|
|
|
// 基于ASN数据更新对应生产订单
|
|
func ParseAsnLandingData() {
|
|
for {
|
|
var (
|
|
asnheadtab db.Jit_asnhead_landing
|
|
asnheadtablst []db.Jit_asnhead_landing
|
|
i int
|
|
bt service.BL_Tier2ASN
|
|
err error
|
|
)
|
|
|
|
// 获取未解析的ASN数据
|
|
asnheadtab = db.Jit_asnhead_landing{}
|
|
if asnheadtablst, err = asnheadtab.GetUnparsedAsnLandingData(); err != nil {
|
|
glog.InfoExtln("RecieveAsn解析", "获取ASN解析数据失败,原因:", err)
|
|
return
|
|
}
|
|
// 基于ASN数据更新扶手相关订单状态
|
|
for i = 0; i < len(asnheadtablst); i++ {
|
|
bt = service.BL_Tier2ASN{}
|
|
bt.Asnheadtab = asnheadtablst[i]
|
|
if err = bt.SortAsnByOrder(); err != nil {
|
|
glog.InfoExtln("RecieveAsn解析", "获取ASN解析数据失败,原因:", err)
|
|
continue
|
|
}
|
|
if err = bt.CLoseTier2WorkOrder(); err != nil {
|
|
glog.InfoExtln("RecieveAsn解析", "获取ASN解析数据失败,原因:", err)
|
|
continue
|
|
}
|
|
if err = bt.SetParsedStatus(); err != nil {
|
|
glog.InfoExtln("RecieveAsn解析", "SetParsedStatus失败,原因:", err)
|
|
continue
|
|
}
|
|
}
|
|
time.Sleep(60 * time.Second)
|
|
|
|
}
|
|
}
|
|
|
|
type AsnData struct {
|
|
Bol string
|
|
Asn string
|
|
Oemordernr string
|
|
Partid string
|
|
Partqty int
|
|
}
|
|
|
|
//生成发运单
|
|
func CreateAsnFile() {
|
|
for {
|
|
var (
|
|
projtab db.Me_project
|
|
projtablst []db.Me_project
|
|
data []db.Jit_bbaasn
|
|
err error
|
|
)
|
|
// 加载项目数据
|
|
//第一步:查询5条asn的文件
|
|
e := db.G_DbEngine
|
|
projtab = db.Me_project{}
|
|
if projtablst, err = projtab.GetAllActive(); err != nil {
|
|
glog.InfoExtln("Asn解析", "Failed to get project list!")
|
|
return
|
|
}
|
|
|
|
for i, _ := range projtablst {
|
|
|
|
err = e.Table("jit_bbaasn").Where("finr =? and shipfileflag != ? and projnr = ?", db.G_FINR, 1, projtablst[i].Projectid).Asc("asn").Limit(5).Find(&data)
|
|
if err != nil {
|
|
glog.InfoExtln("jit_bbaasn 发运单", "jit_bbaasn err :", err)
|
|
return
|
|
}
|
|
for _, v := range data {
|
|
bbaasn_itemlst := make([]db.Jit_bbaasn_itemlst, 0)
|
|
packorder_itemlst := make([]db.Jit_packorderJit_packorder_itemlst, 0)
|
|
workorder_partlst := make([]db.VWorkorderCustorderPartlst, 0)
|
|
temData := make([]AsnData, 0)
|
|
//1. 基于bbaasn消息提供的asn号检索到jit_bbaasn的行记录,获取bol和asn栏位信息;
|
|
bol := v.Bol
|
|
asn := v.Asn
|
|
//2. 基于asn号遍历jit_bbaasn_itemlst, 获取所有packorderid
|
|
err = e.Table("jit_bbaasn_itemlst").Select("packorderid").Where("finr = ? and asn = ?", db.G_FINR, asn).Find(&bbaasn_itemlst)
|
|
if err != nil {
|
|
glog.InfoExtln("jit_bbaasn 发运单", "jit_bbaasn err :", err)
|
|
continue
|
|
}
|
|
var Packorderids []string
|
|
for _, v := range bbaasn_itemlst {
|
|
Packorderids = append(Packorderids, v.Packorderid)
|
|
}
|
|
//3. 基于packordered 查询表jit_packorder和jit_packorder_itemlst
|
|
err = e.Table("jit_packorder").Select("jit_packorder_itemlst.workordernr").Join("INNER", "jit_packorder_itemlst", "jit_packorder.finr = jit_packorder_itemlst.finr and jit_packorder.packorderid = jit_packorder_itemlst.packorderid").In("jit_packorder.packorderid", Packorderids).Where("jit_packorder.finr = ? and jit_packorder.projnr = ?", db.G_FINR, projtablst[i].Projectid).Find(&packorder_itemlst)
|
|
if err != nil {
|
|
glog.InfoExtln("jit_bbaasn 发运单", "jit_bbaasn err :", err)
|
|
continue
|
|
}
|
|
var workordernrs []string
|
|
for _, itemlst := range packorder_itemlst {
|
|
workordernrs = append(workordernrs, itemlst.Workordernr)
|
|
}
|
|
//4. 基于jit_packorder_itemlst.workordernr 查询表pln_workorder 和表pln_workorder_partlst
|
|
err = e.Table("pln_workorder").Join("INNER", "pln_custorder", "pln_workorder.finr = pln_custorder.finr and pln_workorder.custordernr = pln_custorder.custordernr").Join("INNER", "pln_workorder_partlst", "pln_workorder.finr = pln_workorder_partlst.finr and pln_workorder.workordernr = pln_workorder_partlst.workordernr").In("pln_workorder.workordernr", workordernrs).Where("pln_workorder.finr = ? and pln_workorder.projnr = ?", db.G_FINR, projtablst[i].Projectid).Find(&workorder_partlst)
|
|
if err != nil {
|
|
glog.InfoExtln("jit_bbaasn 发运单", "jit_bbaasn err :", err)
|
|
continue
|
|
}
|
|
//基于jit_packorder_itemlst.workordernr 查询表pln_workorder 获取它的partfamilyid 和当前的jit_bbaasn的零件族匹配
|
|
|
|
//如果不相等,则取出该工单客户订单对应零件族的通用件供应组的零件清单,将属于该供应组的零件从当前工单的零件清单中排除即可
|
|
//查询出sg共用件的集合,根据pln_custorder_supplygroup_partst和me_supplygroup联查出共用件
|
|
sgtypePartid := make(map[string]int)
|
|
sgPartid := make(map[string]int)
|
|
for _, vv := range workorder_partlst {
|
|
if strings.TrimSpace(vv.Pln_workorder.Partfamilyid) != strings.TrimSpace(v.Partfamilyid) {
|
|
sgtype_partlst := make([]db.CustorderSupplyPartlst, 0)
|
|
e.Table("pln_custorder_supplygroup_partlst").Join("INNER", "pln_custorder", "pln_custorder_supplygroup_partlst.finr = pln_custorder.finr and pln_custorder_supplygroup_partlst.custordernr = pln_custorder.custordernr").Join("INNER", "me_supplygroup", "pln_custorder_supplygroup_partlst.finr = me_supplygroup.finr and pln_custorder_supplygroup_partlst.supplygroupid = me_supplygroup.supplygroupid").Where("pln_custorder_supplygroup_partlst.finr = ? and me_supplygroup.sgtype = ? and pln_custorder_supplygroup_partlst.custordernr = ? and pln_custorder.projnr = ?", db.G_FINR, "N", vv.Pln_custorder.Custordernr,projtablst[i].Projectid).Find(&sgtype_partlst)
|
|
for _, sg := range sgtype_partlst {
|
|
sg.Pln_custorder_supplygroup_partlst.Clipped()
|
|
sg.Pln_custorder.Clipped()
|
|
key := sg.Pln_custorder.Oemordernr + ";" + sg.Pln_custorder_supplygroup_partlst.Partid
|
|
sgtypePartid[key] = sg.Pln_custorder_supplygroup_partlst.Partqty
|
|
}
|
|
} else {
|
|
sgtype_partlst := make([]db.CustorderSupplyPartlst, 0)
|
|
e.Table("pln_custorder_supplygroup_partlst").Join("INNER", "pln_custorder", "pln_custorder_supplygroup_partlst.finr = pln_custorder.finr and pln_custorder_supplygroup_partlst.custordernr = pln_custorder.custordernr").Join("INNER", "me_supplygroup", "pln_custorder_supplygroup_partlst.finr = me_supplygroup.finr and pln_custorder_supplygroup_partlst.supplygroupid = me_supplygroup.supplygroupid").Where("pln_custorder_supplygroup_partlst.finr = ? and me_supplygroup.sgtype = ? and pln_custorder_supplygroup_partlst.custordernr = ? and pln_custorder.projnr = ?", db.G_FINR, "N", vv.Pln_custorder.Custordernr,projtablst[i].Projectid).Find(&sgtype_partlst)
|
|
for _, sg := range sgtype_partlst {
|
|
sg.Pln_custorder_supplygroup_partlst.Clipped()
|
|
sg.Pln_custorder.Clipped()
|
|
key := sg.Pln_custorder.Oemordernr + ";" + sg.Pln_custorder_supplygroup_partlst.Partid
|
|
sgPartid[key] = sg.Pln_custorder_supplygroup_partlst.Partqty
|
|
}
|
|
}
|
|
}
|
|
//6.构造零件字典
|
|
partids := make(map[string]int)
|
|
for _, vst := range workorder_partlst {
|
|
vst.Pln_workorder_partlst.Clipped()
|
|
vst.Pln_custorder.Clipped()
|
|
key := vst.Pln_custorder.Oemordernr + ";" + vst.Pln_workorder_partlst.Partid
|
|
_, ok := sgtypePartid[key]
|
|
if ok {
|
|
continue
|
|
}
|
|
partqty := vst.Pln_workorder_partlst.Partqty
|
|
val, ok := partids[key]
|
|
if ok {
|
|
//存在的话,数量叠加
|
|
partids[key] = partqty + val
|
|
} else {
|
|
//不存在的话,添加
|
|
partids[key] = partqty
|
|
}
|
|
}
|
|
//融合两个map
|
|
for key, val := range sgPartid {
|
|
_, ok := partids[key]
|
|
if !ok {
|
|
partids[key] = val
|
|
}
|
|
}
|
|
//5. 对照上面前3个栏位,对应的字段分别是:pln_workorder.custordernr / pln_workorder_partlst.partid / pln_workorder_partlst.partqty 信息
|
|
for key, val := range partids {
|
|
keys := strings.Split(key, ";")
|
|
if len(keys) >= 2 {
|
|
one := AsnData{}
|
|
one.Asn = asn
|
|
one.Bol = bol
|
|
one.Partid = keys[1]
|
|
one.Oemordernr = keys[0]
|
|
one.Partqty = val
|
|
temData = append(temData, one)
|
|
}
|
|
|
|
}
|
|
//第三步:生成发运单
|
|
//Asnflushnr, err := service.SN_GetNextSnr(projtablst[i].Shipfile_snr)
|
|
Asnflushnr := strings.TrimSpace(v.Asn)
|
|
if err != nil {
|
|
glog.InfoExtln("jit_bbaasn 发运单", "jit_bbaasn err :", err)
|
|
continue
|
|
}
|
|
var pln db.Jit_bbaasn
|
|
pln.Finr = db.G_FINR
|
|
pln.Shipfileflag = 1
|
|
_, err = e.Table("jit_bbaasn").Cols("shipfileflag").Where("finr = ? and asn =?", db.G_FINR, asn).Update(&pln)
|
|
if err != nil {
|
|
glog.InfoExtln("jit_bbaasn 发运单", "jit_bbaasn err :", err)
|
|
continue
|
|
}
|
|
//4.生产对应的excel文件
|
|
var file *xlsx.File
|
|
var sheet *xlsx.Sheet
|
|
var row *xlsx.Row
|
|
var cell *xlsx.Cell
|
|
|
|
file = xlsx.NewFile()
|
|
sheet, err = file.AddSheet("Sheet1")
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
tableHead := true
|
|
|
|
for _, val := range temData {
|
|
|
|
if tableHead {
|
|
//添加表头
|
|
row = sheet.AddRow()
|
|
|
|
cell = row.AddCell()
|
|
cell.Value = "ORDER NUMBER"
|
|
|
|
cell = row.AddCell()
|
|
cell.Value = "PART NUMBER"
|
|
|
|
cell = row.AddCell()
|
|
cell.Value = "TRANSFER QTY"
|
|
|
|
cell = row.AddCell()
|
|
cell.Value = "BOL"
|
|
|
|
cell = row.AddCell()
|
|
cell.Value = "ASN"
|
|
|
|
tableHead = false
|
|
}
|
|
row = sheet.AddRow()
|
|
|
|
cell = row.AddCell()
|
|
cell.Value = common.ValueToString(val.Oemordernr, "")
|
|
|
|
cell = row.AddCell()
|
|
cell.Value = common.ValueToString(val.Partid, "")
|
|
|
|
cell = row.AddCell()
|
|
cell.Value = common.ValueToString(val.Partqty, "")
|
|
|
|
cell = row.AddCell()
|
|
cell.Value = common.ValueToString(val.Bol, "")
|
|
|
|
cell = row.AddCell()
|
|
cell.Value = common.ValueToString(val.Asn, "")
|
|
}
|
|
|
|
filename := Asnflushnr + ".xlsx" //文件名
|
|
exceldir := strings.TrimSpace(projtablst[i].Shipfile_folder) // 目录+文件名
|
|
excelfile := exceldir + "/" + filename
|
|
err = file.Save(excelfile)
|
|
}
|
|
time.Sleep(5 * time.Second)
|
|
}
|
|
}
|
|
}
|