SJA APS后端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

338 lines
12 KiB

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