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 }