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.

1269 lines
43 KiB

package service
import (
"container/list"
"errors"
"fmt"
"leit.com/leit_seat_aps/common"
conf "leit.com/leit_seat_aps/config"
"leit.com/leit_seat_aps/db"
"leit.com/leit_seat_aps/etcd"
"leit.com/leit_seat_aps/glog"
"strconv"
"strings"
"time"
)
// 产线对象
type BL_Workline struct {
WorklineId string
MixSort bool // 是否混线
SortMode string // 不混线排序方式
MixSortMode string // 混线排序方式
MixSortRule string // 混线规则
ReleaseMode string // 派工下达模式
ReleaseValue int // 下达参数
ProjList []string // 解析出来的项目号数组,顺序排序
ProjTaskDict map[string]BL_Workline_ProjTask // 如果混线,项目任务字典
Bl_wolst []BL_WorkOrder // 不混线任务队列
PickTmpDict map[string]BL_PickingTemplate // 分配的拣料单模板
Worklinetab db.Workline
}
// 调度到产线的任务
type BL_Workline_ProjTask struct {
Projnr string
MixRatioQty int // 按数量混线,指定的数量
Bl_wolst *list.List // 用链表来存储产线的计划任务
}
// 解析产线的混线逻辑
func (bl_wl *BL_Workline) ParseMixRule() (err error) {
var (
kvlist, kv []string
i int
bl_wlpt BL_Workline_ProjTask
)
bl_wl.ProjTaskDict = make(map[string]BL_Workline_ProjTask)
bl_wl.ProjList = []string{}
kvlist = strings.Split(bl_wl.MixSortRule, ";")
if len(kvlist) < 2 {
// 报错
err = errors.New("Workline: " + bl_wl.WorklineId + " mixsortrule: " + bl_wl.MixSortRule + " parameters are less than 2!")
return
} else {
for i = 0; i < len(kvlist); i++ {
kv = strings.Split(strings.TrimSpace(kvlist[i]), ":")
if len(kv) < 2 {
// 报错
err = errors.New("Workline: " + bl_wl.WorklineId + " parameter: " + kvlist[i] + " values are less than 2!")
return
}
bl_wlpt = BL_Workline_ProjTask{}
bl_wlpt.Projnr = kv[0]
bl_wlpt.MixRatioQty, _ = strconv.Atoi(kv[1])
bl_wl.ProjTaskDict[bl_wlpt.Projnr] = bl_wlpt
bl_wl.ProjList = append(bl_wl.ProjList, kv[0])
}
}
return
}
// 加载产线的计划任务队列
func (bl_wl *BL_Workline) LoadPlannedTask() (err error) {
var (
bl_wlpt BL_Workline_ProjTask
wotab db.Pln_workorder
wotablst []db.Pln_workorder
bl_wo BL_WorkOrder
i int
)
wotab = db.Pln_workorder{}
if bl_wl.MixSort {
// 如果产线是混线排序,按项目加载已计划未下达生产订单
// 初始化项目任务列表,然后加载项目的生产订单
for _, bl_wlpt = range bl_wl.ProjTaskDict {
bl_wlpt.Bl_wolst = list.New()
// 按产线项目加载已计划未下达的生产订单
if wotablst, err = wotab.GetLineProjectPlannedTasks(bl_wlpt.Projnr, bl_wl.WorklineId); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s project: %s due to: %v", bl_wl.WorklineId, bl_wlpt.Projnr, err))
return
}
for i = 0; i < len(wotablst); i++ {
wotablst[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst[i].Workordernr
bl_wo.Custordernr = wotablst[i].Custordernr
bl_wo.Worklineid = wotablst[i].Worklineid
bl_wo.Projnr = wotablst[i].Projnr
bl_wo.Ordertype = wotablst[i].Ordertype
bl_wo.Status = wotablst[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst[i].Partfamilyid
bl_wo.Supplygroupid = wotablst[i].Supplygroupid
bl_wo.Workordertab = wotablst[i]
bl_wlpt.Bl_wolst.PushBack(bl_wo)
}
bl_wl.ProjTaskDict[bl_wlpt.Projnr] = bl_wlpt
}
} else {
// 非混线排序,则正常加载已计划未下达生产订单
if wotablst, err = wotab.GetLinePlannedTasks(bl_wl.WorklineId); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
bl_wl.Bl_wolst = []BL_WorkOrder{}
for i = 0; i < len(wotablst); i++ {
wotablst[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst[i].Workordernr
bl_wo.Custordernr = wotablst[i].Custordernr
bl_wo.Worklineid = wotablst[i].Worklineid
bl_wo.Projnr = wotablst[i].Projnr
bl_wo.Ordertype = wotablst[i].Ordertype
bl_wo.Status = wotablst[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst[i].Partfamilyid
bl_wo.Supplygroupid = wotablst[i].Supplygroupid
bl_wo.Workordertab = wotablst[i]
bl_wl.Bl_wolst = append(bl_wl.Bl_wolst, bl_wo)
}
}
return
}
// 基于指定派工数量获取产线需派工生产订单
// 返回需要派工下达的排好序的生产订单
func (bl_wl *BL_Workline) GetTaskToReleaseByQty() (bl_wolst []BL_WorkOrder, err error) {
var (
totalRelQty int
toRelQty int
wotablst []db.Pln_workorder
bl_wo BL_WorkOrder
i int
wotablst1 []db.Pln_workorder
wotablst2 []db.Pln_workorder
swet1, swet2 string
)
LOOP:
// 获取产线已派工未开始的订单数
if totalRelQty, err = bl_wl.GetReleasedTaskQty(); err != nil {
glog.InfoExtln("排序调度", "GetReleasedTaskQty err: ", err)
// 报错并返回
time.Sleep(5 * time.Millisecond)
goto LOOP
}
// 遍历队列,去重获取剩余下达数
toRelQty = bl_wl.ReleaseValue - totalRelQty
if toRelQty <= 0 {
return
}
//查询需要下单的工单
if bl_wl.MixSort {
// 如果产线是混线排序,按项目加载已计划未下达生产订单
// 混线模式
switch bl_wl.MixSortMode {
case common.LINE_MIXSORT_IN_SWET:
// 按交货时间紧急度
case common.LINE_MIXSORT_IN_SWET_RATIO:
// 按交付时间和比例
//解析数据(G38:2;G18:1 )
data := strings.Split(bl_wl.Worklinetab.Mixsortlogic, ";")
if len(data) >= 2 {
/* 获取锁 */
MixLOCK:
err = etcd.G_jobLock.TryLock("lock")
if err != nil {
fmt.Println("seq groutine lock fail!")
time.Sleep(10 * time.Millisecond)
goto MixLOCK
}
//项目1
info1 := strings.Split(data[0], ":")
if len(info1) >= 2 {
projnr1 := info1[0]
value1 := common.ValueToInt(info1[1], 0)
if common.ValueIsEmpty(value1) {
value1 = 1
}
if wotablst1, err = bl_wl.GetLineProjectTaskWorkordersBySwet(projnr1, bl_wl.WorklineId, value1); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
etcd.G_jobLock.UnLock()
return
}
} else {
etcd.G_jobLock.UnLock()
return
}
info2 := strings.Split(data[1], ":")
if len(info2) >= 2 {
projnr2 := info2[0]
value2 := common.ValueToInt(info2[1], 0)
if common.ValueIsEmpty(value2) {
value2 = 1
}
if wotablst2, err = bl_wl.GetLineProjectTaskWorkordersBySwet(projnr2, bl_wl.WorklineId, value2); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
etcd.G_jobLock.UnLock()
return
}
} else {
etcd.G_jobLock.UnLock()
return
}
etcd.G_jobLock.UnLock()
//比较swet时间
if len(wotablst1) > 0 {
swet1 = wotablst1[0].Swet
}
if len(wotablst2) > 0 {
swet2 = wotablst2[0].Swet
}
//记录日志
glog.InfoExtln("scheduler", "swet1", swet1)
glog.InfoExtln("scheduler", "swet2", swet2)
if common.ValueIsEmpty(swet1) {
if common.ValueIsEmpty(swet2) {
etcd.G_jobLock.UnLock()
return
} else {
for i = 0; i < len(wotablst2); i++ {
wotablst2[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst2[i].Workordernr
bl_wo.Custordernr = wotablst2[i].Custordernr
bl_wo.Worklineid = wotablst2[i].Worklineid
bl_wo.Projnr = wotablst2[i].Projnr
bl_wo.Ordertype = wotablst2[i].Ordertype
bl_wo.Status = wotablst2[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst2[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst2[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst2[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst2[i].Partfamilyid
bl_wo.Supplygroupid = wotablst2[i].Supplygroupid
bl_wo.Workordertab = wotablst2[i]
bl_wolst = append(bl_wolst, bl_wo)
}
}
} else {
if common.ValueIsEmpty(swet2) {
for i = 0; i < len(wotablst1); i++ {
wotablst1[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst1[i].Workordernr
bl_wo.Custordernr = wotablst1[i].Custordernr
bl_wo.Worklineid = wotablst1[i].Worklineid
bl_wo.Projnr = wotablst1[i].Projnr
bl_wo.Ordertype = wotablst1[i].Ordertype
bl_wo.Status = wotablst1[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst1[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst1[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst1[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst1[i].Partfamilyid
bl_wo.Supplygroupid = wotablst1[i].Supplygroupid
bl_wo.Workordertab = wotablst1[i]
bl_wolst = append(bl_wolst, bl_wo)
}
} else {
//比较swet1和swet2
if swet1 <= swet2 {
for i = 0; i < len(wotablst1); i++ {
wotablst1[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst1[i].Workordernr
bl_wo.Custordernr = wotablst1[i].Custordernr
bl_wo.Worklineid = wotablst1[i].Worklineid
bl_wo.Projnr = wotablst1[i].Projnr
bl_wo.Ordertype = wotablst1[i].Ordertype
bl_wo.Status = wotablst1[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst1[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst1[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst1[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst1[i].Partfamilyid
bl_wo.Supplygroupid = wotablst1[i].Supplygroupid
bl_wo.Workordertab = wotablst1[i]
bl_wolst = append(bl_wolst, bl_wo)
}
} else {
for i = 0; i < len(wotablst2); i++ {
wotablst2[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst2[i].Workordernr
bl_wo.Custordernr = wotablst2[i].Custordernr
bl_wo.Worklineid = wotablst2[i].Worklineid
bl_wo.Projnr = wotablst2[i].Projnr
bl_wo.Ordertype = wotablst2[i].Ordertype
bl_wo.Status = wotablst2[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst2[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst2[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst2[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst2[i].Partfamilyid
bl_wo.Supplygroupid = wotablst2[i].Supplygroupid
bl_wo.Workordertab = wotablst2[i]
bl_wolst = append(bl_wolst, bl_wo)
}
}
}
}
} else if len(data) == 1 {
//项目1
info1 := strings.Split(data[0], ":")
if len(info1) >= 2 {
projnr1 := info1[0]
value1 := common.ValueToInt(info1[1], 0)
if common.ValueIsEmpty(value1) {
value1 = 1
}
if wotablst1, err = bl_wl.GetLineProjectTaskWorkordersBySwet(projnr1, bl_wl.WorklineId, value1); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
} else {
return
}
for i = 0; i < len(wotablst1); i++ {
wotablst1[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst1[i].Workordernr
bl_wo.Custordernr = wotablst1[i].Custordernr
bl_wo.Worklineid = wotablst1[i].Worklineid
bl_wo.Projnr = wotablst1[i].Projnr
bl_wo.Ordertype = wotablst1[i].Ordertype
bl_wo.Status = wotablst1[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst1[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst1[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst1[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst1[i].Partfamilyid
bl_wo.Supplygroupid = wotablst1[i].Supplygroupid
bl_wo.Workordertab = wotablst1[i]
bl_wolst = append(bl_wolst, bl_wo)
}
} else {
return
}
}
} else {
//非混线逻辑
// 获取待下达任务数
// 非混线排序,则正常加载已计划未下达生产订单
/* 获取锁 */
LOCK:
err = etcd.G_jobLock.TryLock("lock")
if err != nil {
fmt.Println("seq groutine lock fail!")
time.Sleep(10 * time.Millisecond)
goto LOCK
}
if wotablst, err = bl_wl.GetLineTaskWorkorders(bl_wl.WorklineId, toRelQty); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
etcd.G_jobLock.UnLock()
for i = 0; i < len(wotablst); i++ {
wotablst[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst[i].Workordernr
bl_wo.Custordernr = wotablst[i].Custordernr
bl_wo.Worklineid = wotablst[i].Worklineid
bl_wo.Projnr = wotablst[i].Projnr
bl_wo.Ordertype = wotablst[i].Ordertype
bl_wo.Status = wotablst[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst[i].Partfamilyid
bl_wo.Supplygroupid = wotablst[i].Supplygroupid
bl_wo.Workordertab = wotablst[i]
bl_wolst = append(bl_wolst, bl_wo)
}
}
return
}
// 基于指定时间点获取产线需派工生产订单
// 返回需要派工下达的排好序的生产订单
func (bl_wl *BL_Workline) GetTaskToReleaseByTime() (bl_wolst []BL_WorkOrder, err error) {
var (
i int
wotablst []db.Pln_workorder
wotablst1 []db.Pln_workorder
wotablst2 []db.Pln_workorder
bl_wo BL_WorkOrder
swet1, swet2 string
)
// 基于产线派工模式分别处理
if bl_wl.MixSort {
// 混线模式
switch bl_wl.MixSortMode {
case common.LINE_MIXSORT_IN_SWET:
// 按交货时间紧急度
case common.LINE_MIXSORT_IN_SWET_RATIO:
// 按交付时间和比例
//解析数据(G38:2;G18:1 )
data := strings.Split(bl_wl.Worklinetab.Mixsortlogic, ";")
//oemseq 数据限制(G38:123456;G18:123456789)bl_wl.Worklinetab.Releasetparameter
oemseqs := strings.Split(bl_wl.Worklinetab.Releasetparameter, ";")
if len(oemseqs) == 2 {
//两条线都限制
projnr1info := strings.Split(oemseqs[0], ":")
if len(projnr1info) < 2 {
return
}
projnr2info := strings.Split(oemseqs[1], ":")
if len(projnr2info) < 2 {
return
}
if len(data) >= 2 {
//项目1
info1 := strings.Split(data[0], ":")
if len(info1) >= 2 {
projnr1 := info1[0]
value1 := common.ValueToInt(info1[1], 0)
if common.ValueIsEmpty(value1) {
value1 = 1
}
if projnr1 == projnr1info[0] {
if wotablst1, err = bl_wl.GetLineProjectTaskWorkordersBySwetLimitOemseq(projnr1, bl_wl.WorklineId, value1, common.ValueToFloat(projnr1info[1], 0.0)); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
} else {
if wotablst1, err = bl_wl.GetLineProjectTaskWorkordersBySwetLimitOemseq(projnr1, bl_wl.WorklineId, value1, common.ValueToFloat(projnr2info[1], 0.0)); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
}
} else {
return
}
info2 := strings.Split(data[1], ":")
if len(info2) >= 2 {
projnr2 := info2[0]
value2 := common.ValueToInt(info2[1], 0)
if common.ValueIsEmpty(value2) {
value2 = 1
}
if projnr2 == projnr1info[0] {
if wotablst2, err = bl_wl.GetLineProjectTaskWorkordersBySwetLimitOemseq(projnr2, bl_wl.WorklineId, value2, common.ValueToFloat(projnr1info[1], 0.0)); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
} else {
if wotablst2, err = bl_wl.GetLineProjectTaskWorkordersBySwetLimitOemseq(projnr2, bl_wl.WorklineId, value2, common.ValueToFloat(projnr2info[1], 0.0)); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
}
} else {
return
}
//比较swet时间
if len(wotablst1) > 0 {
swet1 = wotablst1[0].Swet
}
if len(wotablst2) > 0 {
swet2 = wotablst2[0].Swet
}
if common.ValueIsEmpty(swet1) {
if common.ValueIsEmpty(swet2) {
return
} else {
for i = 0; i < len(wotablst2); i++ {
wotablst2[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst2[i].Workordernr
bl_wo.Custordernr = wotablst2[i].Custordernr
bl_wo.Worklineid = wotablst2[i].Worklineid
bl_wo.Projnr = wotablst2[i].Projnr
bl_wo.Ordertype = wotablst2[i].Ordertype
bl_wo.Status = wotablst2[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst2[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst2[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst2[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst2[i].Partfamilyid
bl_wo.Supplygroupid = wotablst2[i].Supplygroupid
bl_wo.Workordertab = wotablst2[i]
bl_wolst = append(bl_wolst, bl_wo)
}
}
} else {
if common.ValueIsEmpty(swet2) {
for i = 0; i < len(wotablst1); i++ {
wotablst1[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst1[i].Workordernr
bl_wo.Custordernr = wotablst1[i].Custordernr
bl_wo.Worklineid = wotablst1[i].Worklineid
bl_wo.Projnr = wotablst1[i].Projnr
bl_wo.Ordertype = wotablst1[i].Ordertype
bl_wo.Status = wotablst1[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst1[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst1[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst1[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst1[i].Partfamilyid
bl_wo.Supplygroupid = wotablst1[i].Supplygroupid
bl_wo.Workordertab = wotablst1[i]
bl_wolst = append(bl_wolst, bl_wo)
}
} else {
//比较swet1和swet2
if swet1 <= swet2 {
for i = 0; i < len(wotablst1); i++ {
wotablst1[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst1[i].Workordernr
bl_wo.Custordernr = wotablst1[i].Custordernr
bl_wo.Worklineid = wotablst1[i].Worklineid
bl_wo.Projnr = wotablst1[i].Projnr
bl_wo.Ordertype = wotablst1[i].Ordertype
bl_wo.Status = wotablst1[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst1[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst1[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst1[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst1[i].Partfamilyid
bl_wo.Supplygroupid = wotablst1[i].Supplygroupid
bl_wo.Workordertab = wotablst1[i]
bl_wolst = append(bl_wolst, bl_wo)
}
} else {
for i = 0; i < len(wotablst2); i++ {
wotablst2[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst2[i].Workordernr
bl_wo.Custordernr = wotablst2[i].Custordernr
bl_wo.Worklineid = wotablst2[i].Worklineid
bl_wo.Projnr = wotablst2[i].Projnr
bl_wo.Ordertype = wotablst2[i].Ordertype
bl_wo.Status = wotablst2[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst2[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst2[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst2[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst2[i].Partfamilyid
bl_wo.Supplygroupid = wotablst2[i].Supplygroupid
bl_wo.Workordertab = wotablst2[i]
bl_wolst = append(bl_wolst, bl_wo)
}
}
}
}
} else {
return
}
} else if len(oemseqs) == 1 {
//只限制一条产线
projnrinfo := strings.Split(oemseqs[0], ":")
if len(projnrinfo) < 2 {
return
}
if len(data) >= 2 {
//项目1
info1 := strings.Split(data[0], ":")
if len(info1) >= 2 {
projnr1 := info1[0]
value1 := common.ValueToInt(info1[1], 0)
if common.ValueIsEmpty(value1) {
value1 = 1
}
//判断是否有限制
if projnrinfo[0] == projnr1 {
if wotablst1, err = bl_wl.GetLineProjectTaskWorkordersBySwetLimitOemseq(projnr1, bl_wl.WorklineId, value1, common.ValueToFloat(projnrinfo[1], 0.0)); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
} else {
if wotablst1, err = bl_wl.GetLineProjectTaskWorkordersBySwet(projnr1, bl_wl.WorklineId, value1); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
}
} else {
return
}
info2 := strings.Split(data[1], ":")
if len(info2) >= 2 {
projnr2 := info2[0]
value2 := common.ValueToInt(info2[1], 0)
if common.ValueIsEmpty(value2) {
value2 = 1
}
//判断是否有限制
if projnrinfo[0] == projnr2 {
if wotablst1, err = bl_wl.GetLineProjectTaskWorkordersBySwetLimitOemseq(projnr2, bl_wl.WorklineId, value2, common.ValueToFloat(projnrinfo[1], 0.0)); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
} else {
if wotablst2, err = bl_wl.GetLineProjectTaskWorkordersBySwet(projnr2, bl_wl.WorklineId, value2); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
}
} else {
return
}
//比较swet时间
if len(wotablst1) > 0 {
swet1 = wotablst1[0].Swet
}
if len(wotablst2) > 0 {
swet2 = wotablst2[0].Swet
}
if common.ValueIsEmpty(swet1) {
if common.ValueIsEmpty(swet2) {
return
} else {
for i = 0; i < len(wotablst2); i++ {
wotablst2[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst2[i].Workordernr
bl_wo.Custordernr = wotablst2[i].Custordernr
bl_wo.Worklineid = wotablst2[i].Worklineid
bl_wo.Projnr = wotablst2[i].Projnr
bl_wo.Ordertype = wotablst2[i].Ordertype
bl_wo.Status = wotablst2[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst2[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst2[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst2[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst2[i].Partfamilyid
bl_wo.Supplygroupid = wotablst2[i].Supplygroupid
bl_wo.Workordertab = wotablst2[i]
bl_wolst = append(bl_wolst, bl_wo)
}
}
} else {
if common.ValueIsEmpty(swet2) {
for i = 0; i < len(wotablst1); i++ {
wotablst1[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst1[i].Workordernr
bl_wo.Custordernr = wotablst1[i].Custordernr
bl_wo.Worklineid = wotablst1[i].Worklineid
bl_wo.Projnr = wotablst1[i].Projnr
bl_wo.Ordertype = wotablst1[i].Ordertype
bl_wo.Status = wotablst1[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst1[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst1[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst1[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst1[i].Partfamilyid
bl_wo.Supplygroupid = wotablst1[i].Supplygroupid
bl_wo.Workordertab = wotablst1[i]
bl_wolst = append(bl_wolst, bl_wo)
}
} else {
//比较swet1和swet2
if swet1 <= swet2 {
for i = 0; i < len(wotablst1); i++ {
wotablst1[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst1[i].Workordernr
bl_wo.Custordernr = wotablst1[i].Custordernr
bl_wo.Worklineid = wotablst1[i].Worklineid
bl_wo.Projnr = wotablst1[i].Projnr
bl_wo.Ordertype = wotablst1[i].Ordertype
bl_wo.Status = wotablst1[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst1[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst1[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst1[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst1[i].Partfamilyid
bl_wo.Supplygroupid = wotablst1[i].Supplygroupid
bl_wo.Workordertab = wotablst1[i]
bl_wolst = append(bl_wolst, bl_wo)
}
} else {
for i = 0; i < len(wotablst2); i++ {
wotablst2[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst2[i].Workordernr
bl_wo.Custordernr = wotablst2[i].Custordernr
bl_wo.Worklineid = wotablst2[i].Worklineid
bl_wo.Projnr = wotablst2[i].Projnr
bl_wo.Ordertype = wotablst2[i].Ordertype
bl_wo.Status = wotablst2[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst2[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst2[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst2[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst2[i].Partfamilyid
bl_wo.Supplygroupid = wotablst2[i].Supplygroupid
bl_wo.Workordertab = wotablst2[i]
bl_wolst = append(bl_wolst, bl_wo)
}
}
}
}
} else {
return
}
} else {
glog.InfoExtln("LINE_REL_BY_OEMSEQ", "len(data): ", len(data))
//没有oemseq限制
if len(data) >= 2 {
//项目1
info1 := strings.Split(data[0], ":")
if len(info1) >= 2 {
projnr1 := info1[0]
value1 := common.ValueToInt(info1[1], 0)
if common.ValueIsEmpty(value1) {
value1 = 1
}
if wotablst1, err = bl_wl.GetLineProjectTaskWorkordersBySwet(projnr1, bl_wl.WorklineId, value1); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
} else {
return
}
info2 := strings.Split(data[1], ":")
if len(info2) >= 2 {
projnr2 := info2[0]
value2 := common.ValueToInt(info2[1], 0)
if common.ValueIsEmpty(value2) {
value2 = 1
}
if wotablst2, err = bl_wl.GetLineProjectTaskWorkordersBySwet(projnr2, bl_wl.WorklineId, value2); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
} else {
return
}
//比较swet时间
if len(wotablst1) > 0 {
swet1 = wotablst1[0].Swet
}
if len(wotablst2) > 0 {
swet2 = wotablst2[0].Swet
}
if common.ValueIsEmpty(swet1) {
if common.ValueIsEmpty(swet2) {
return
} else {
for i = 0; i < len(wotablst2); i++ {
wotablst2[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst2[i].Workordernr
bl_wo.Custordernr = wotablst2[i].Custordernr
bl_wo.Worklineid = wotablst2[i].Worklineid
bl_wo.Projnr = wotablst2[i].Projnr
bl_wo.Ordertype = wotablst2[i].Ordertype
bl_wo.Status = wotablst2[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst2[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst2[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst2[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst2[i].Partfamilyid
bl_wo.Supplygroupid = wotablst2[i].Supplygroupid
bl_wo.Workordertab = wotablst2[i]
bl_wolst = append(bl_wolst, bl_wo)
}
}
} else {
if common.ValueIsEmpty(swet2) {
for i = 0; i < len(wotablst1); i++ {
wotablst1[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst1[i].Workordernr
bl_wo.Custordernr = wotablst1[i].Custordernr
bl_wo.Worklineid = wotablst1[i].Worklineid
bl_wo.Projnr = wotablst1[i].Projnr
bl_wo.Ordertype = wotablst1[i].Ordertype
bl_wo.Status = wotablst1[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst1[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst1[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst1[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst1[i].Partfamilyid
bl_wo.Supplygroupid = wotablst1[i].Supplygroupid
bl_wo.Workordertab = wotablst1[i]
bl_wolst = append(bl_wolst, bl_wo)
}
} else {
//比较swet1和swet2
if swet1 <= swet2 {
for i = 0; i < len(wotablst1); i++ {
wotablst1[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst1[i].Workordernr
bl_wo.Custordernr = wotablst1[i].Custordernr
bl_wo.Worklineid = wotablst1[i].Worklineid
bl_wo.Projnr = wotablst1[i].Projnr
bl_wo.Ordertype = wotablst1[i].Ordertype
bl_wo.Status = wotablst1[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst1[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst1[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst1[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst1[i].Partfamilyid
bl_wo.Supplygroupid = wotablst1[i].Supplygroupid
bl_wo.Workordertab = wotablst1[i]
bl_wolst = append(bl_wolst, bl_wo)
}
} else {
for i = 0; i < len(wotablst2); i++ {
wotablst2[i].Clipped()
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst2[i].Workordernr
bl_wo.Custordernr = wotablst2[i].Custordernr
bl_wo.Worklineid = wotablst2[i].Worklineid
bl_wo.Projnr = wotablst2[i].Projnr
bl_wo.Ordertype = wotablst2[i].Ordertype
bl_wo.Status = wotablst2[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst2[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst2[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst2[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst2[i].Partfamilyid
bl_wo.Supplygroupid = wotablst2[i].Supplygroupid
bl_wo.Workordertab = wotablst2[i]
bl_wolst = append(bl_wolst, bl_wo)
}
}
}
}
} else {
return
}
}
}
} else {
// 非混线模式
// 非混线排序,则正常加载已计划未下达生产订单
if wotablst, err = bl_wl.GetLineTaskWorkordersBySwet(bl_wl.WorklineId); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
return
}
for i = 0; i < len(wotablst); i++ {
wotablst[i].Clipped()
if common.ValueToInt(wotablst[i].Oemseq, 0) <= common.ValueToInt(bl_wl.Worklinetab.Releasetparameter, 0) {
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst[i].Workordernr
bl_wo.Custordernr = wotablst[i].Custordernr
bl_wo.Worklineid = wotablst[i].Worklineid
bl_wo.Projnr = wotablst[i].Projnr
bl_wo.Ordertype = wotablst[i].Ordertype
bl_wo.Status = wotablst[i].Status
bl_wo.Preschedseq = common.ValueToInt(wotablst[i].Preschedseq, 0)
bl_wo.Schedseq = wotablst[i].Schedseq
bl_wo.Oemseq = common.ValueToInt(wotablst[i].Oemseq, 0)
bl_wo.Partfamilyid = wotablst[i].Partfamilyid
bl_wo.Supplygroupid = wotablst[i].Supplygroupid
bl_wo.Workordertab = wotablst[i]
bl_wolst = append(bl_wolst, bl_wo)
} else {
return
}
}
}
return
}
// 基于指定时长获取产线需派工生产订单
// 返回需要派工下达的排好序的生产订单
func (bl_wl *BL_Workline) GetTaskToReleaseByDuration(bl_wolst *[]BL_WorkOrder) (err error) {
// 基于产线派工模式分别处理
if bl_wl.MixSort {
// 混线模式
switch bl_wl.MixSortMode {
case common.LINE_MIXSORT_IN_SWET:
// 按交货时间紧急度
case common.LINE_MIXSORT_IN_SWET_RATIO:
// 按交付时间和比例
}
} else {
// 非混线模式
}
return
}
// 获取产线需要下达的工单数
func (bl_wl *BL_Workline) GetLineTaskWorkorders(lineid string, relQty int) (wotabs []db.Pln_workorder, err error) {
var (
wotab db.Pln_workorder
)
if wotabs, err = wotab.GetLineUnfinishedTaskWorkorders(lineid, relQty); err != nil {
return
}
return
}
// 获取产线需要下达的工单数
func (bl_wl *BL_Workline) GetLineProjectTaskWorkorders(projnr string, lineid string, relQty int) (wotabs []db.Pln_workorder, err error) {
var (
wotab db.Pln_workorder
)
// 基于产线设置的参考状态
if wotabs, err = wotab.GetLineProjectUnfinishedTaskWorkorders(projnr, lineid, relQty); err != nil {
return
}
return
}
// 获取产线需要下达的工单数(混线逻辑,按照swet方式下达)
func (bl_wl *BL_Workline) GetLineProjectTaskWorkordersBySwet(projnr string, lineid string, relQty int) (wotabs []db.Pln_workorder, err error) {
var (
wotab db.Pln_workorder
)
// 基于产线设置的参考状态
if wotabs, err = wotab.GetLineProjectUnfinishedTaskWorkordersBySwet(projnr, lineid, relQty); err != nil {
return
}
return
}
// 获取产线需要下达的工单数(混线逻辑,按照swet方式下达)但是有oemseq限制
func (bl_wl *BL_Workline) GetLineProjectTaskWorkordersBySwetLimitOemseq(projnr string, lineid string, relQty int, oemseq float64) (wotabs []db.Pln_workorder, err error) {
var (
wotab db.Pln_workorder
)
// 基于产线设置的参考状态
if wotabs, err = wotab.GetLineProjectUnfinishedTaskWorkordersBySwetLimitOemseq(projnr, lineid, relQty, oemseq); err != nil {
return
}
return
}
// 按照oemseq号排序,查询100条数据
func (bl_wl *BL_Workline) GetLineTaskWorkordersBySwet(lineid string) (wotabs []db.Pln_workorder, err error) {
var (
wotab db.Pln_workorder
)
if wotabs, err = wotab.GetLineUnfinishedTaskWorkordersBySwet(lineid); err != nil {
return
}
return
}
// 混线排序派工,基于最早swet下达
func (bl_wl *BL_Workline) GetTaskFromMixQueueToReleaseBySwet(bl_wolst *[]BL_WorkOrder, relQty int) (err error) {
var (
bl_wlpt BL_Workline_ProjTask
node *list.Element
bl_wo *BL_WorkOrder
key, tkey string
t time.Time
loadQty int
)
// 先判断一下所有项目可派工的任务数,如果数量小于等于relQty,则将所有的都派工下去
loadQty = 0
for key, bl_wlpt = range bl_wl.ProjTaskDict {
loadQty = loadQty + bl_wlpt.Bl_wolst.Len()
}
if loadQty < relQty {
relQty = loadQty
}
for {
if relQty <= 0 {
break
}
// 初始化,默认比较时间是1年后
tkey = ""
t = time.Now().Add(24 * 365 * time.Hour)
// 遍历产线上的多个项目的任务队列,取列头比较,时间最早的取走
for key, bl_wlpt = range bl_wl.ProjTaskDict {
// 取每个项目任务队列的队首,对Swet做比较,最小的优先处理
node = bl_wlpt.Bl_wolst.Front()
bl_wo = node.Value.(*BL_WorkOrder)
if bl_wo.Swet.Unix() < t.Unix() {
tkey = key
t = bl_wo.Swet
}
}
// 从项目任务队列中移除指定节点
if tkey != "" {
node = bl_wl.ProjTaskDict[tkey].Bl_wolst.Front()
bl_wo = node.Value.(*BL_WorkOrder)
*bl_wolst = append(*bl_wolst, *bl_wo)
bl_wl.ProjTaskDict[tkey].Bl_wolst.Remove(node)
}
relQty--
}
return
}
// 混线排序派工,基于项目指定的比例数量下达
func (bl_wl *BL_Workline) GetTaskFromMixQueueToReleaseByRatio(bl_wolst *[]BL_WorkOrder, relQty int) (err error) {
var (
bl_wlpt BL_Workline_ProjTask
node *list.Element
bl_wo *BL_WorkOrder
i, j int
projnr string
loadQty int
flag bool
)
// 先判断一下所有项目可派工的任务数,如果数量小于等于relQty,则将所有的都派工下去
loadQty = 0
for _, bl_wlpt = range bl_wl.ProjTaskDict {
loadQty = loadQty + bl_wlpt.Bl_wolst.Len()
}
if loadQty < relQty {
relQty = loadQty
}
// 循环遍历项目,派工
for {
if relQty <= 0 {
break
}
// 先判断一下所有项目一次循环可派工的任务数是否足够,如果不够则跳出循环
flag = true
for i = 0; i < len(bl_wl.ProjList); i++ {
projnr = bl_wl.ProjList[i]
if bl_wl.ProjTaskDict[projnr].Bl_wolst.Len() < bl_wl.ProjTaskDict[projnr].MixRatioQty {
flag = false
break
}
}
if !flag {
break
}
// 遍历混线项目
for i = 0; i < len(bl_wl.ProjList); i++ {
projnr = bl_wl.ProjList[i]
// 先判断一下所有项目一次循环可派工的任务数是否足够,如果不够则跳出循环
if bl_wl.ProjTaskDict[projnr].Bl_wolst.Len() < bl_wl.ProjTaskDict[projnr].MixRatioQty {
flag = false
break
}
for j = 0; j < bl_wl.ProjTaskDict[projnr].MixRatioQty; j++ {
node = bl_wl.ProjTaskDict[projnr].Bl_wolst.Front()
bl_wo = node.Value.(*BL_WorkOrder)
*bl_wolst = append(*bl_wolst, *bl_wo)
bl_wl.ProjTaskDict[projnr].Bl_wolst.Remove(node)
relQty--
}
}
}
return
}
// 获取产线已派工的订单数
func (bl_wl *BL_Workline) GetReleasedTaskQty() (retQty int, err error) {
var (
istat int
wotab db.Pln_workorder
)
// 基于产线设置的参考状态
if istat, err = strconv.Atoi(bl_wl.Worklinetab.Releasecparameter); err != nil {
glog.InfoExtln("排序调度", "GetReleasedTaskQty4 err: ", err)
//默认是未下线(完成)订单数
istat = 80
}
switch istat {
case 40:
if retQty, err = wotab.GetLineReleasedTaskQty(bl_wl.WorklineId); err != nil {
glog.InfoExtln("排序调度", "GetReleasedTaskQty5 err: ", err)
return
}
break
case 80:
if retQty, err = wotab.GetLineUnfinishedTaskQty(bl_wl.WorklineId); err != nil {
glog.InfoExtln("排序调度", "GetReleasedTaskQty6 err: ", err)
return
}
break
default:
if retQty, err = wotab.GetLineUnfinishedTaskQty(bl_wl.WorklineId); err != nil {
glog.InfoExtln("排序调度", "GetReleasedTaskQty7 err: ", err)
return
}
}
return
}
// 将指定序列的生产订单下达,更新状态为26
func (bl_wl *BL_Workline) ReleaseTasks(bl_wolst []BL_WorkOrder, se *SchedEngine) (err error) {
var (
i, startseq int
wotablst []db.Pln_workorder
wotab db.Pln_workorder
intstatus db.Pln_workorder_intstatus
cotab db.Pln_custorder
looptime int
)
looptime = 0
LOOPTIME:
// 获取产线最大的排序号
if err = db.G_DbEngine.Where("finr = ? and worklineid = ?", db.G_FINR,
bl_wl.WorklineId).Desc("schedseq").Limit(1, 0).Find(&wotablst); err != nil {
return
}
looptime++
if len(wotablst) > 0 {
startseq = wotablst[0].Schedseq + 1
} else if looptime >= 100 {
startseq = 1
} else {
glog.InfoExtln("排序调度", "LOOP起始排序号 = ", bl_wl.WorklineId, startseq)
time.Sleep(100 * time.Millisecond)
goto LOOPTIME
}
// 遍历下达订单,依次更新内部排序号和状态
glog.InfoExtln("排序调度", "起始排序号 = ", bl_wl.WorklineId, startseq)
fmt.Println(bl_wl.WorklineId, "起始排序号 = ", startseq)
for i = 0; i < len(bl_wolst); i++ {
/* 获取锁 */
LOOP:
err = etcd.G_jobLock.TryLock("lock")
if err != nil {
fmt.Println("seq groutine lock fail!")
if conf.ConfValue.TimeInterval < 1 {
time.Sleep(10 * time.Millisecond)
} else {
time.Sleep(time.Duration(conf.ConfValue.TimeInterval) * time.Millisecond)
}
glog.InfoExtln("排序调度", "conf.ConfValue.TimeInterval = ",conf.ConfValue.TimeInterval)
goto LOOP
}
//开启事务
session := db.G_DbEngine.NewSession()
if err = session.Begin(); err != nil {
session.Close()
etcd.G_jobLock.UnLock()
return
}
wotab = db.Pln_workorder{}
wotab = bl_wolst[i].Workordertab
wotab.Schedseq = startseq
wotab.Status = common.WO_STATUS_RELEASED
wotab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
// 处理生产订单的拣料零件
if err = wotab.UpdateFields(session, "schedseq,status,pickstatus,lastmodif"); err != nil {
glog.InfoExtln("排序调度", "err is : ", err)
session.Rollback()
session.Close()
etcd.G_jobLock.UnLock()
return
}
//下达的订单放到缓存数据表里,为接口数据做准备
intstatus = db.Pln_workorder_intstatus{}
intstatus.Finr = db.G_FINR
intstatus.Workordernr = wotab.Workordernr
intstatus.Releaseflag = 0
intstatus.Runningflag = 0
intstatus.Finishflag = 0
intstatus.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
intstatus.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
intstatus.Lastuser = "scheduler"
err = intstatus.Insert(session)
if err != nil {
glog.InfoExtln("排序调度", "err is : ", err)
session.Rollback()
session.Close()
etcd.G_jobLock.UnLock()
return
}
startseq = startseq + 1
// 更新客户订单状态
cotab = db.Pln_custorder{Finr: db.G_FINR, Custordernr: wotab.Custordernr, Status: common.WO_STATUS_RELEASED}
err = cotab.UpdateToFields(session, "status")
if err != nil {
glog.InfoExtln("排序调度", "err is : ", err)
session.Rollback()
session.Close()
etcd.G_jobLock.UnLock()
return
}
session.Commit()
session.Close()
etcd.G_jobLock.UnLock()
}
return
}
// 获取指定产线未拣料的生产订单
func (bl_wl *BL_Workline) GetUnpickedWorkorderList() (bl_wolst []BL_WorkOrder, err error) {
var (
bl_wo BL_WorkOrder
bl_wopt BL_WorkOrder_Part
bl_woattr BL_OrdAttribute
wotab db.Pln_workorder
wotablst []db.Pln_workorder
i, j, k int
)
// 获取产线所有未拣料(status = 26)生产订单
wotab = db.Pln_workorder{}
if wotablst, err = wotab.GetLineUnpickedTasksFullData(bl_wl.WorklineId); err != nil {
return
}
if len(wotablst) == 0 {
return
}
bl_wolst = []BL_WorkOrder{}
for i = 0; i < len(wotablst); i++ {
bl_wo = BL_WorkOrder{}
bl_wo.Workordernr = wotablst[i].Workordernr
bl_wo.Custordernr = wotablst[i].Custordernr
bl_wo.Projnr = wotablst[i].Projnr
bl_wo.Partfamilyid = wotablst[i].Partfamilyid
bl_wo.Supplygroupid = wotablst[i].Supplygroupid
bl_wo.Oemseq = common.ValueToInt(wotablst[i].Oemseq, 0)
bl_wo.Schedseq = wotablst[i].Schedseq
bl_wo.Status = wotablst[i].Status
bl_wo.Workordertab = wotablst[i]
// 加载生产订单的零件清单
bl_wo.Bl_wopartdict = make(map[string]BL_WorkOrder_Part)
for j = 0; j < len(wotablst[i].Partlst); j++ {
bl_wopt = BL_WorkOrder_Part{}
bl_wopt.Workordernr = bl_wo.Workordernr
bl_wopt.Partid = wotablst[i].Partlst[j].Partid
bl_wopt.Qty = wotablst[i].Partlst[j].Partqty
bl_wo.Bl_wopartdict[bl_wopt.Partid] = bl_wopt
}
// 加载生产订单的属性清单
bl_wo.Bl_ordattrdict = make(map[int]BL_OrdAttribute)
for k = 0; k < len(wotablst[i].Attrlst); k++ {
bl_woattr = BL_OrdAttribute{}
bl_woattr.Attrcode = wotablst[i].Attrlst[k].Attrcode
bl_wo.Bl_ordattrdict[bl_woattr.Attrcode] = bl_woattr
}
bl_wolst = append(bl_wolst, bl_wo)
}
return
}
//查询产线信息
func (bl_wl *BL_Workline) SelectWorkline() (data db.Workline, err error) {
var bl_wo db.Workline
bl_wo.Finr = db.G_FINR
bl_wo.Worklineid = bl_wl.WorklineId
data, err = bl_wo.SelectOne()
if err != nil {
return
}
return
}