package service
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"github.com/go-xorm/xorm"
|
|
"leit.com/leit_seat_aps/common"
|
|
"leit.com/leit_seat_aps/db"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// 生产订单业务对象
|
|
type BL_WorkOrder struct {
|
|
Workordernr string // 生产订单号
|
|
Custordernr string // 客户订单号
|
|
Projnr string
|
|
Ordertype string // 生产订单类型
|
|
Partfamilyid string // 零件族ID
|
|
Supplygroupid string
|
|
Status int
|
|
Preschedseq int
|
|
Schedseq int
|
|
Oemseq int
|
|
Shippable int
|
|
Swet time.Time
|
|
Worklineid string // 产线
|
|
Bl_wopartdict map[string]BL_WorkOrder_Part // 订单零件清单
|
|
Bl_ordattrdict map[int]BL_OrdAttribute // 订单属性字典
|
|
Bl_verrlist []BL_VerifyError // 校验报错信息
|
|
Workordertab db.Pln_workorder // 生产订单记录本身
|
|
}
|
|
|
|
type BL_WorkOrder_Part struct {
|
|
Partid string
|
|
Qty int
|
|
Workordernr string
|
|
Parttab db.Me_part // 零件自身
|
|
Workordertab db.Pln_workorder // 生产订单记录本身
|
|
}
|
|
|
|
// 创建生产订单头
|
|
func (bl_wo *BL_WorkOrder) CreateHead(session *xorm.Session, tp *TodProject) (err error) {
|
|
var (
|
|
wonr string
|
|
wotab db.Pln_workorder
|
|
woppakstatab db.Prod_wo_packstatus
|
|
)
|
|
|
|
// 填充生产订单信息
|
|
if strings.TrimSpace(tp.Projecttab.Workorder_snr) != "" {
|
|
if wonr, err = SN_GetNextSnrBySession(strings.TrimSpace(tp.Projecttab.Workorder_snr), session); err != nil {
|
|
return
|
|
}
|
|
} else {
|
|
if wonr, err = SN_GetNextSnrBySession("WORKORDER", session); err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
wotab = db.Pln_workorder{}
|
|
wotab.Finr = db.G_FINR
|
|
wotab.Workordernr = wonr
|
|
wotab.Projnr = bl_wo.Projnr
|
|
wotab.Custordernr = bl_wo.Custordernr
|
|
wotab.Supplygroupid = bl_wo.Supplygroupid
|
|
wotab.Partfamilyid = bl_wo.Partfamilyid
|
|
wotab.Status = common.WO_STATUS_UNPLANED
|
|
wotab.Shippable = bl_wo.Shippable
|
|
wotab.Worklineid = bl_wo.Worklineid
|
|
wotab.Planqty = 1
|
|
wotab.Ordertype = "SEQ"
|
|
wotab.Lastuser = "service"
|
|
wotab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
|
|
if err = wotab.Insert(session); err != nil {
|
|
return err
|
|
}
|
|
bl_wo.Workordernr = wonr
|
|
bl_wo.Workordertab = wotab
|
|
|
|
// 创建生产工单的包装状态数据
|
|
woppakstatab = db.Prod_wo_packstatus{}
|
|
woppakstatab.Finr = db.G_FINR
|
|
woppakstatab.Workordernr = wotab.Workordernr
|
|
woppakstatab.Projnr = wotab.Projnr
|
|
woppakstatab.Packstatus = 0
|
|
woppakstatab.Lastuser = "tod_service"
|
|
woppakstatab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
if err = woppakstatab.Insert(session); err != nil {
|
|
return err
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 保存客户订单的零件和属性清单( 删除原有的)
|
|
func (bl_wo *BL_WorkOrder) SavePartAndAtcodList(session *xorm.Session) (err error) {
|
|
var (
|
|
wotab db.Pln_workorder
|
|
bl_wopt BL_WorkOrder_Part
|
|
bl_ordattr BL_OrdAttribute
|
|
woptlst db.Pln_workorder_partlst
|
|
woatlst db.Pln_workorder_atcodlst
|
|
attrval string
|
|
idx int
|
|
)
|
|
|
|
// 删除原有的零件和属性清单
|
|
wotab = db.Pln_workorder{Workordernr: bl_wo.Workordernr}
|
|
if !wotab.DelPartlst(session) {
|
|
err = errors.New(fmt.Sprintf("Failed to delete workorder: %s part list!", wotab.Workordernr))
|
|
return
|
|
}
|
|
if !wotab.DelAttributelst(session) {
|
|
err = errors.New(fmt.Sprintf("Failed to delete workorder: %s attribute list!", wotab.Workordernr))
|
|
return
|
|
}
|
|
|
|
// 遍历生产订单零件列表
|
|
for _, bl_wopt = range bl_wo.Bl_wopartdict {
|
|
woptlst = db.Pln_workorder_partlst{}
|
|
woptlst.Finr = db.G_FINR
|
|
woptlst.Workordernr = bl_wo.Workordernr
|
|
woptlst.Partid = bl_wopt.Partid
|
|
woptlst.Partqty = bl_wopt.Qty
|
|
woptlst.Lastuser = "service"
|
|
woptlst.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
if err = woptlst.Insert(session); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
// 遍历属性列表并存储
|
|
idx = 0
|
|
for _, bl_ordattr = range bl_wo.Bl_ordattrdict {
|
|
woatlst = db.Pln_workorder_atcodlst{}
|
|
woatlst.Finr = db.G_FINR
|
|
woatlst.Workordernr = bl_wo.Workordernr
|
|
woatlst.Attrcode = bl_ordattr.Attrcode
|
|
for _, attrval = range bl_ordattr.Attrvaldict {
|
|
idx++
|
|
woatlst.Pos = idx
|
|
woatlst.Attrvalue = attrval
|
|
woatlst.Lastuser = "service"
|
|
woatlst.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
if err = woatlst.Insert(session); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 更新工单的拣料状态
|
|
func (bl_wo *BL_WorkOrder) SetPickingStatus(session *xorm.Session, picked int) (err error) {
|
|
bl_wo.Workordertab.Pickstatus = picked
|
|
bl_wo.Workordertab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
if err = bl_wo.Workordertab.UpdateFields(session, "pickstatus, lastmodif"); err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|