From 3bc3c500cfeae585fd9e66f5a3b8092a2e0eb8d9 Mon Sep 17 00:00:00 2001 From: zhangxin Date: Fri, 10 Dec 2021 14:24:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BB=8EMES=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=8A=A5=E5=B7=A5=E6=95=B0=E6=8D=AE=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/om/SerialOrderStatusRecLst.dao.go | 17 ++ .../SerialOrderStatusRecLst.dao.impl.go | 29 +++ meta/pln/CustOrderQty.meta.go | 40 ++-- models/om/const.go | 4 + models/om/om.go | 6 + models/pln/CustOrderQty.model.go | 35 ++-- models/pln/const.go | 4 + .../base/implments/WorkLine.service.impl.go | 4 +- services/pln/CustOrder.service.go | 17 ++ .../pln/implments/CustOrder.service.impl.go | 182 +++++++++++++++--- .../implments/CustOrderQty.service.impl.go | 32 +-- task/ReportFromMes.go | 23 +++ task/scheduler.go | 4 + 13 files changed, 325 insertions(+), 72 deletions(-) create mode 100644 task/ReportFromMes.go diff --git a/dao/om/SerialOrderStatusRecLst.dao.go b/dao/om/SerialOrderStatusRecLst.dao.go index e176ddd..bf15791 100644 --- a/dao/om/SerialOrderStatusRecLst.dao.go +++ b/dao/om/SerialOrderStatusRecLst.dao.go @@ -270,6 +270,23 @@ type SerialOrderStatusRecLstDAO interface { * ******************************************************************************/ GetSerialOrderToMes() ([]model.VOmSerialOrderJoinRec, error) + /****************************************************************************** + * + * @Function Name : SelectClosedEvent + *----------------------------------------------------------------------------- + * + * @Description : 获取关单事件 + * + * @Return Value : *model.SerialOrderStatusRecLst + * + * @Return Value : 执行时发生的错误 + * + * @Author : zhangxin + * + * @Date : 2021-12-10 + * + ******************************************************************************/ + SelectClosedEvent() (*model.SerialOrderWithStatusRec, error) } /****************************************************************************** diff --git a/dao/om/implments/SerialOrderStatusRecLst.dao.impl.go b/dao/om/implments/SerialOrderStatusRecLst.dao.impl.go index e2613cc..e42db5f 100644 --- a/dao/om/implments/SerialOrderStatusRecLst.dao.impl.go +++ b/dao/om/implments/SerialOrderStatusRecLst.dao.impl.go @@ -380,3 +380,32 @@ func (impl *SerialOrderStatusRecLstDAOImplement) GetSerialOrderToMes() (result [ } return result, nil } + +/****************************************************************************** + * + * @Reference LAPP_ACURA_MOM_BACKEND/dao/om/SerialOrderStatusRecLstDAO.GetMaxPos + * + ******************************************************************************/ +func (impl *SerialOrderStatusRecLstDAOImplement) SelectClosedEvent() (*model.SerialOrderWithStatusRec, error) { + where := fmt.Sprintf("%s = ? and %s = ? and %s = ? and %s = ?", + meta.SerialOrderStatusRecLst_PlantNr.ColumnName, + meta.SerialOrderStatusRecLst_TriggerEvent.ColumnName, + meta.SerialOrderStatusRecLst_OutputStatus.ColumnName, + meta.SerialOrder_OrderType.ColumnName) + condition := fmt.Sprintf("%s = %s and %s = %s", + meta.SerialOrderStatusRecLst_PlantNr.ColumnName, + meta.SerialOrder_PlantNr.ColumnName, + meta.SerialOrderStatusRecLst_SerialOrderId.ColumnName, + meta.SerialOrder_SerialOrderId.ColumnName) + session := impl.session.Table(impl.meta.TableName).Join("LEFT", meta.SerialOrder.TableName, condition) + var data model.SerialOrderWithStatusRec + parameters := []interface{}{impl.plantNr, model.ORDER_CLOSED, model.ORDER_UNDEALED, common.ODER_TYPE_SEQ} + exist, err := session.Where(where, parameters...).Asc(meta.SerialOrderStatusRecLst_CreateTime.ColumnName).Limit(1).Get(&data) + if err != nil { + return nil, err + } + if !exist { + return nil, nil + } + return &data, nil +} \ No newline at end of file diff --git a/meta/pln/CustOrderQty.meta.go b/meta/pln/CustOrderQty.meta.go index 954f678..cafa807 100644 --- a/meta/pln/CustOrderQty.meta.go +++ b/meta/pln/CustOrderQty.meta.go @@ -20,6 +20,9 @@ var CustOrderQty_PlantNr = grmi.NewField("PlantNr", "[PLN_CustOrderQty].PlantNr" var CustOrderQty_CustOrderId = grmi.NewField("CustOrderId", "[PLN_CustOrderQty].CustOrderId", "custorderid", grmi.TypeString) var CustOrderQty_PlanQty = grmi.NewField("PlanQty", "[PLN_CustOrderQty].PlanQty", "planqty", grmi.TypeInt) var CustOrderQty_ReleasedQty = grmi.NewField("ReleasedQty", "[PLN_CustOrderQty].ReleasedQty", "releasedqty", grmi.TypeInt) +var CustOrderQty_SerialOrderQty = grmi.NewField("SerialOrderQty", "[PLN_CustOrderQty].SerialOrderQty", "serialorderqty", grmi.TypeInt) +var CustOrderQty_SerialOrderActQty = grmi.NewField("SerialOrderActQty", "[PLN_CustOrderQty].SerialOrderActQty", "serialorderactqty", grmi.TypeInt) +var CustOrderQty_Running = grmi.NewField("Running", "[PLN_CustOrderQty].Running", "running", grmi.TypeInt) var CustOrderQty_ActQty = grmi.NewField("ActQty", "[PLN_CustOrderQty].ActQty", "actqty", grmi.TypeInt) var CustOrderQty_ActGoodQty = grmi.NewField("ActGoodQty", "[PLN_CustOrderQty].ActGoodQty", "actgoodqty", grmi.TypeInt) var CustOrderQty_ActScrapQty = grmi.NewField("ActScrapQty", "[PLN_CustOrderQty].ActScrapQty", "actscrapqty", grmi.TypeInt) @@ -46,22 +49,25 @@ var CustOrderQty = grmi.NewEntity( "PLN_CustOrderQty", func() interface{} { return &model.CustOrderQty{} }, map[string]grmi.Field{ - CustOrderQty_PlantNr.Name: CustOrderQty_PlantNr, - CustOrderQty_CustOrderId.Name: CustOrderQty_CustOrderId, - CustOrderQty_PlanQty.Name: CustOrderQty_PlanQty, - CustOrderQty_ReleasedQty.Name: CustOrderQty_ReleasedQty, - CustOrderQty_ActQty.Name: CustOrderQty_ActQty, - CustOrderQty_ActGoodQty.Name: CustOrderQty_ActGoodQty, - CustOrderQty_ActScrapQty.Name: CustOrderQty_ActScrapQty, - CustOrderQty_ActReworkQty.Name: CustOrderQty_ActReworkQty, - CustOrderQty_CancelQty.Name: CustOrderQty_CancelQty, - CustOrderQty_ActQty1.Name: CustOrderQty_ActQty1, - CustOrderQty_ActQty2.Name: CustOrderQty_ActQty2, - CustOrderQty_ActQty3.Name: CustOrderQty_ActQty3, - CustOrderQty_ActQty4.Name: CustOrderQty_ActQty4, - CustOrderQty_LastModify.Name: CustOrderQty_LastModify, - CustOrderQty_LastUser.Name: CustOrderQty_LastUser, - CustOrderQty_CreateTime.Name: CustOrderQty_CreateTime, + CustOrderQty_PlantNr.Name: CustOrderQty_PlantNr, + CustOrderQty_CustOrderId.Name: CustOrderQty_CustOrderId, + CustOrderQty_PlanQty.Name: CustOrderQty_PlanQty, + CustOrderQty_ReleasedQty.Name: CustOrderQty_ReleasedQty, + CustOrderQty_Running.Name: CustOrderQty_Running, + CustOrderQty_SerialOrderQty.Name: CustOrderQty_SerialOrderQty, + CustOrderQty_SerialOrderActQty.Name: CustOrderQty_SerialOrderActQty, + CustOrderQty_ActQty.Name: CustOrderQty_ActQty, + CustOrderQty_ActGoodQty.Name: CustOrderQty_ActGoodQty, + CustOrderQty_ActScrapQty.Name: CustOrderQty_ActScrapQty, + CustOrderQty_ActReworkQty.Name: CustOrderQty_ActReworkQty, + CustOrderQty_CancelQty.Name: CustOrderQty_CancelQty, + CustOrderQty_ActQty1.Name: CustOrderQty_ActQty1, + CustOrderQty_ActQty2.Name: CustOrderQty_ActQty2, + CustOrderQty_ActQty3.Name: CustOrderQty_ActQty3, + CustOrderQty_ActQty4.Name: CustOrderQty_ActQty4, + CustOrderQty_LastModify.Name: CustOrderQty_LastModify, + CustOrderQty_LastUser.Name: CustOrderQty_LastUser, + CustOrderQty_CreateTime.Name: CustOrderQty_CreateTime, }, []string{"PlantNr"}, - []string{"PlanQty", "ReleasedQty", "ActQty", "ActGoodQty", "ActScrapQty", "ActReworkQty", "CancelQty", "ActQty1", "ActQty2", "ActQty3", "ActQty4", "LastUser"}) + []string{"PlanQty", "ReleasedQty", "SerialOrderQty", "SerialOrderActQty", "ActQty", "Running", "ActGoodQty", "ActScrapQty", "ActReworkQty", "CancelQty", "ActQty1", "ActQty2", "ActQty3", "ActQty4", "LastUser"}) diff --git a/models/om/const.go b/models/om/const.go index fa09c53..33a2340 100644 --- a/models/om/const.go +++ b/models/om/const.go @@ -32,4 +32,8 @@ const ( CacheWorkOrderType = "Cache" ParseTaskTypeByTime = "ByTime" ParseTaskTypeByDay = "ByDay" + + ORDER_CLOSED = "ORDER_CLOSED" + ORDER_UNDEALED = 0 + ORDER_DEALED = 1 ) diff --git a/models/om/om.go b/models/om/om.go index 3056469..0d14ca0 100644 --- a/models/om/om.go +++ b/models/om/om.go @@ -122,3 +122,9 @@ type RecvDataWithOPC struct { SerialOrderOPDetailRecvDataLst `xorm:"extends"` baseModel.OPCComRule `xorm:"extends"` } + +// SerialOrderWithStatusRec serialOrder和状态变更记录连表查询 +type SerialOrderWithStatusRec struct { + SerialOrder `xorm:"extends"` + SerialOrderStatusRecLst `xorm:"extends"` +} diff --git a/models/pln/CustOrderQty.model.go b/models/pln/CustOrderQty.model.go index a56bc1b..9bb9c91 100644 --- a/models/pln/CustOrderQty.model.go +++ b/models/pln/CustOrderQty.model.go @@ -20,22 +20,25 @@ import ( * ******************************************************************************/ type CustOrderQty struct { - PlantNr int `xorm:"pk int 'PlantNr'" json:"PLN_CustOrderQty-PlantNr"` - CustOrderId string `xorm:"pk nvarchar(40) 'CustOrderId'" json:"PLN_CustOrderQty-CustOrderId"` - PlanQty int `xorm:"int 'PlanQty'" json:"PLN_CustOrderQty-PlanQty"` - ReleasedQty int `xorm:"int 'ReleasedQty'" json:"PLN_CustOrderQty-ReleasedQty"` - ActQty int `xorm:"int 'ActQty'" json:"PLN_CustOrderQty-ActQty"` - ActGoodQty int `xorm:"int 'ActGoodQty'" json:"PLN_CustOrderQty-ActGoodQty"` - ActScrapQty int `xorm:"int 'ActScrapQty'" json:"PLN_CustOrderQty-ActScrapQty"` - ActReworkQty int `xorm:"int 'ActReworkQty'" json:"PLN_CustOrderQty-ActReworkQty"` - CancelQty int `xorm:"int 'CancelQty' not null" json:"PLN_CustOrderQty-CancelQty"` - ActQty1 int `xorm:"int 'ActQty1'" json:"PLN_CustOrderQty-ActQty1"` - ActQty2 int `xorm:"int 'ActQty2'" json:"PLN_CustOrderQty-ActQty2"` - ActQty3 int `xorm:"int 'ActQty3'" json:"PLN_CustOrderQty-ActQty3"` - ActQty4 int `xorm:"int 'ActQty4'" json:"PLN_CustOrderQty-ActQty4"` - LastModify grmi.DateTime `xorm:"datetime 'LastModify' not null updated" json:"PLN_CustOrderQty-LastModify"` - LastUser string `xorm:"nvarchar(20) 'LastUser' not null" json:"PLN_CustOrderQty-LastUser"` - CreateTime grmi.DateTime `xorm:"datetime 'CreateTime' not null created" json:"PLN_CustOrderQty-CreateTime"` + PlantNr int `xorm:"pk int 'PlantNr'" json:"PLN_CustOrderQty-PlantNr"` + CustOrderId string `xorm:"pk nvarchar(40) 'CustOrderId'" json:"PLN_CustOrderQty-CustOrderId"` + PlanQty int `xorm:"int 'PlanQty' not null" json:"PLN_CustOrderQty-PlanQty"` + SerialOrderQty int `xorm:"int 'SerialOrderQty'" json:"PLN_CustOrderQty-SerialOrderQty"` + SerialOrderActQty int `xorm:"int 'SerialOrderActQty'" json:"PLN_CustOrderQty-SerialOrderActQty"` + ReleasedQty int `xorm:"int 'ReleasedQty'" json:"PLN_CustOrderQty-ReleasedQty"` + RunningQty int `xorm:"int 'RunningQty'" json:"PLN_CustOrderQty-RunningQty"` + ActQty int `xorm:"int 'ActQty'" json:"PLN_CustOrderQty-ActQty"` + ActGoodQty int `xorm:"int 'ActGoodQty'" json:"PLN_CustOrderQty-ActGoodQty"` + ActScrapQty int `xorm:"int 'ActScrapQty'" json:"PLN_CustOrderQty-ActScrapQty"` + ActReworkQty int `xorm:"int 'ActReworkQty'" json:"PLN_CustOrderQty-ActReworkQty"` + CancelQty int `xorm:"int 'CancelQty' not null" json:"PLN_CustOrderQty-CancelQty"` + ActQty1 int `xorm:"int 'ActQty1'" json:"PLN_CustOrderQty-ActQty1"` + ActQty2 int `xorm:"int 'ActQty2'" json:"PLN_CustOrderQty-ActQty2"` + ActQty3 int `xorm:"int 'ActQty3'" json:"PLN_CustOrderQty-ActQty3"` + ActQty4 int `xorm:"int 'ActQty4'" json:"PLN_CustOrderQty-ActQty4"` + LastModify grmi.DateTime `xorm:"datetime 'LastModify' not null updated" json:"PLN_CustOrderQty-LastModify"` + LastUser string `xorm:"nvarchar(20) 'LastUser' not null" json:"PLN_CustOrderQty-LastUser"` + CreateTime grmi.DateTime `xorm:"datetime 'CreateTime' not null created" json:"PLN_CustOrderQty-CreateTime"` } /****************************************************************************** diff --git a/models/pln/const.go b/models/pln/const.go index bdc418e..9571de8 100644 --- a/models/pln/const.go +++ b/models/pln/const.go @@ -15,4 +15,8 @@ const ( ERROR_TYPE_SYSTEM = "SYSTEM" ERROR_TYPE_DATA = "DATA" + // 状态变更类型 + STATUS_CHANGE_TYPE_REPORT = "REPORT" + STATUS__CHANGE_TYPE_SCHUDLER = "SCHUDLER" + ) diff --git a/services/base/implments/WorkLine.service.impl.go b/services/base/implments/WorkLine.service.impl.go index 91f7e98..53cf8d0 100644 --- a/services/base/implments/WorkLine.service.impl.go +++ b/services/base/implments/WorkLine.service.impl.go @@ -1030,7 +1030,7 @@ func (impl *WorkLineServiceImplement) SaveWorkLineScheduler(user *global.User, d statusHistory := &plnModel.CustOrderStatusHistory{ CustOrderId: plannedTask.TaskId, //Pos: maxPos + 1, - StatusChangeType: "SCHEDULER", + StatusChangeType: plnModel.STATUS__CHANGE_TYPE_SCHUDLER, FromStatus: model.WO_STATUS_UNPLANNED, ToStatus: model.WO_STATUS_PLANNED, ChangeTime: grmi.DateTime(time.Now()), @@ -1083,7 +1083,7 @@ func (impl *WorkLineServiceImplement) SaveWorkLineScheduler(user *global.User, d statusHistory := &plnModel.CustOrderStatusHistory{ CustOrderId: task.TaskId, //Pos: maxPos + 1, - StatusChangeType: "SCHEDULER", + StatusChangeType: plnModel.STATUS__CHANGE_TYPE_SCHUDLER, FromStatus: model.WO_STATUS_PLANNED, ToStatus: model.WO_STATUS_UNPLANNED, ChangeTime: grmi.DateTime(time.Now()), diff --git a/services/pln/CustOrder.service.go b/services/pln/CustOrder.service.go index 21d19b7..da1c897 100644 --- a/services/pln/CustOrder.service.go +++ b/services/pln/CustOrder.service.go @@ -270,6 +270,23 @@ type CustOrderService interface { * ******************************************************************************/ ReleaseCustOrder(session *xorm.Session, releaseQty int, custOrder *model.CustOrder) (*model.CustOrder, error) + /****************************************************************************** + * + * @Function Name : ReportWort + *----------------------------------------------------------------------------- + * + * @Description : ReportWork处理MES的报工数据 + * + * @Function Parameters : 当前访问人员信息 + * + * @Return Value : 执行时发生的错误 + * + * @Author : zhangxin + * + * @Date : 2021-12-10 + * + ******************************************************************************/ + ReportWort(user *global.User) } /****************************************************************************** diff --git a/services/pln/implments/CustOrder.service.impl.go b/services/pln/implments/CustOrder.service.impl.go index 5cf7843..a201a75 100644 --- a/services/pln/implments/CustOrder.service.impl.go +++ b/services/pln/implments/CustOrder.service.impl.go @@ -10,7 +10,9 @@ import ( "LAPP_ACURA_MOM_BACKEND/db" "LAPP_ACURA_MOM_BACKEND/global" "LAPP_ACURA_MOM_BACKEND/grmi" + "LAPP_ACURA_MOM_BACKEND/infra/logger" baseMeta "LAPP_ACURA_MOM_BACKEND/meta/base" + omMeta "LAPP_ACURA_MOM_BACKEND/meta/om" meta "LAPP_ACURA_MOM_BACKEND/meta/pln" baseModel "LAPP_ACURA_MOM_BACKEND/models/base" meModel "LAPP_ACURA_MOM_BACKEND/models/me" @@ -18,6 +20,7 @@ import ( model "LAPP_ACURA_MOM_BACKEND/models/pln" omSvr "LAPP_ACURA_MOM_BACKEND/services/om" "github.com/go-xorm/xorm" + uuid "github.com/iris-contrib/go.uuid" "strconv" "time" ) @@ -541,11 +544,12 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde serialOrderDao := omDal.NewSerialOrderDAO(session, user.PlantNr, user.UserId) serialOrderStatusDao := omDal.NewSerialOrderStatusDAO(session, user.PlantNr, user.UserId) productFamilyRelateDao := meDal.NewProductFamilyRelateDAO(session, user.PlantNr, user.UserId) + custOrderQtyDao := dal.NewCustOrderQtyDAO(session, user.PlantNr, user.UserId) // 用于生成工艺的serialOrder map productSerialOrderMap := make(map[string][]*omModel.SerialOrder) for _, custOrderId := range custOrderIdLi { // 校验客户订单是否存在及状态 - orderData, err := custOrderDao.SelectOneWithStatus(custOrderId) + orderData, err := custOrderDao.SelectOne(custOrderId) if err != nil { _ = session.Rollback() return grmi.NewBusinessError("查询客户订单失败, error:" + err.Error()) @@ -554,21 +558,21 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde _ = session.Rollback() return grmi.NewBusinessError("客户订单不存在, 订单ID:" + custOrderId) } - if orderData.CustOrderStatus.Status != baseModel.WO_STATUS_PLANNED { + if orderData.OrderStatus.Status != baseModel.WO_STATUS_PLANNED { _ = session.Rollback() return grmi.NewBusinessError("客户订单当前状态不是已计划, 订单ID:" + custOrderId) } - project, err := projectDao.SelectOne(orderData.CustOrder.ProjectId) + project, err := projectDao.SelectOne(orderData.ProjectId) if err != nil { _ = session.Rollback() return grmi.NewBusinessError("获取车型项目失败, error:" + err.Error()) } if project == nil { _ = session.Rollback() - return grmi.NewBusinessError("车型项目不存在, 车型项目ID:" + orderData.CustOrder.ProjectId) + return grmi.NewBusinessError("车型项目不存在, 车型项目ID:" + orderData.ProjectId) } // 获取客户订单的车型配置下的所有座椅 - productLi, err := productFamilyRelateDao.SelectProductByFamilyIdForCreateSerialOrder(orderData.CustOrder.ProjectId, orderData.CustOrder.ProductFamilyId) + productLi, err := productFamilyRelateDao.SelectProductByFamilyIdForCreateSerialOrder(orderData.ProjectId, orderData.ProductFamilyId) if err != nil { _ = session.Rollback() return grmi.NewBusinessError("通过车型配置查询关联座椅产品失败, error:" + err.Error()) @@ -582,15 +586,21 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde // 临时工单状态列表 serialOrderStatusLi := make([]omModel.SerialOrderStatus, 0) // 通过客户订单的时间间隔进行切割 分配给每一个序列工单 - duration := orderData.CustOrder.PlanEndTime.Restore().Sub(time.Now()) - totalQty := orderData.CustOrder.PlanQty * len(productLi) + duration := orderData.PlanEndTime.Restore().Sub(time.Now()) + totalQty := orderData.PlanQty * len(productLi) + orderData.OrderQty.SerialOrderQty = totalQty + err = custOrderQtyDao.UpdateOne(&orderData.OrderQty) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("更新客户订单数量失败, error:" + err.Error()) + } var current int perDuration := duration.Seconds() / float64(totalQty) workLineMap := make(map[string]*baseModel.WorkLine) var isFirstPieceToggle bool var syncKey string // 创建序列工单和工单状态 - for i := 0; i < orderData.CustOrder.PlanQty; i++ { + for i := 0; i < orderData.PlanQty; i++ { syncKey = custOrderId + "-" + strconv.Itoa(i) //serialNumberStr, err := snrDao.GetNextSnr(project.SerialOrderSnr) //if err != nil { @@ -643,8 +653,8 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde return grmi.NewBusinessError("调度Key流水号规则错误, 产线ID:" + workLine.WorkLineid) } dealedSchedKey := int64(todayInt*1000000 + schedKey*100) - planStartTime := orderData.CustOrder.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*current) * time.Second) - planEndTime := orderData.CustOrder.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*(current+1)) * time.Second) + planStartTime := orderData.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*current) * time.Second) + planEndTime := orderData.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*(current+1)) * time.Second) planStartDate := grmi.Date(planStartTime) planEndDate := grmi.Date(planEndTime) if i == 0 { @@ -653,10 +663,10 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde serialOrder := omModel.SerialOrder{ SerialOrderId: serialOrderId, ArtId: product.ProductId, - ProjectId: orderData.CustOrder.ProjectId, + ProjectId: orderData.ProjectId, Descr: product.Descr, - CustOrderId: orderData.CustOrder.CustOrderId, - OrderType: orderData.CustOrder.OrderType, + CustOrderId: orderData.CustOrderId, + OrderType: orderData.OrderType, PlanResourceId: product.DefaultWorkLineId, UsedResourceId: product.DefaultWorkLineId, SchedKey: dealedSchedKey, @@ -724,7 +734,7 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde } custOrderStatusRec := model.CustOrderStatusHistory{ CustOrderId: custOrderId, - FromStatus: orderData.CustOrderStatus.Status, + FromStatus: orderData.OrderStatus.Status, ToStatus: baseModel.WO_STATUS_RELEASED, ChangeTime: grmi.DateTime(time.Now()), } @@ -734,8 +744,8 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde return grmi.NewBusinessError("插入客户订单状态变更历史失败, error:" + err.Error()) } // 更新客户订单状态 - orderData.CustOrderStatus.Status = baseModel.WO_STATUS_RELEASED - err = custOrderStatusDao.UpdateOne(&orderData.CustOrderStatus) + orderData.OrderStatus.Status = baseModel.WO_STATUS_RELEASED + err = custOrderStatusDao.UpdateOne(&orderData.OrderStatus) if err != nil { _ = session.Rollback() return grmi.NewBusinessError("更新客户订单状态失败, error:" + err.Error()) @@ -998,7 +1008,7 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(session *xorm.Session, r userId := "scheduler" user := &global.User{ PlantNr: baseModel.PlantNr, - UserId: userId, + UserId: userId, } serialOrderDao := omDal.NewSerialOrderDAO(session, baseModel.PlantNr, userId) productFamilyRelateDao := meDal.NewProductFamilyRelateDAO(session, baseModel.PlantNr, userId) @@ -1125,7 +1135,7 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(session *xorm.Session, r opcBasicMap := make(map[int][]baseModel.OPCBasicComInfo) twMap := make(map[int][]baseModel.TightenWrenchInfo) // 进行派工 - // 1. 获取需要派工的台套SyncKey + // 1. 获取需要派工的台套SyncKey // 2. 通过SyncKey查询serialOrder 通过custOrderId和状态过滤serialOrder然后比对数量 // 3. 进行serialOrder状态变更和历史保存 // 4. 生成工艺数据 @@ -1305,10 +1315,10 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(session *xorm.Session, r statusHistory := model.CustOrderStatusHistory{ CustOrderId: custOrder.CustOrderId, //Pos: maxPos+1, - StatusChangeType: "SCHEDULER", - FromStatus: baseModel.WO_STATUS_LOCKED, - ToStatus: baseModel.WO_STATUS_RELEASED, - ChangeTime: grmi.DateTime(time.Now()), + StatusChangeType: model.STATUS__CHANGE_TYPE_SCHUDLER, + FromStatus: baseModel.WO_STATUS_LOCKED, + ToStatus: baseModel.WO_STATUS_RELEASED, + ChangeTime: grmi.DateTime(time.Now()), } err = custOrderStatusHistoryDao.InsertOne(&statusHistory) if err != nil { @@ -1322,3 +1332,131 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(session *xorm.Session, r } return custOrder, nil } + +// ReportWort 处理MES的报工数据 +func (impl *CustOrderServiceImplement) ReportWort(user *global.User) { + engine := db.Eloquent.Master() + session := engine.NewSession() + defer session.Close() + log, _ := logger.NewLogger("Schuler", "ReportWork") + uid, err := uuid.NewV1() + if err != nil { + return + } + reportId := uid.String() + log.Info("报工同步开始, 报工任务ID:" + reportId) + // 从serialOrder状态变更表中获取MES操作完成的serialOrder + serialOrderStatusRecDao := omDal.NewSerialOrderStatusRecLstDAO(session, user.PlantNr, user.UserId) + serialOrderDao := omDal.NewSerialOrderDAO(session, user.PlantNr, user.UserId) + event, err := serialOrderStatusRecDao.SelectClosedEvent() + if err != nil { + log.Error("报工同步阶段, 查询报工事件失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) + return + } + if event == nil { + log.Info("报工完成, 未获取到新的报工事件, 报工任务ID:" + reportId) + return + } + log.Info("报工同步阶段, 处理工单ID:" + event.SerialOrder.SerialOrderId + ", 报工任务ID:" + reportId) + // 查询serialOrder关联的客户订单 + custOrderDao := dal.NewCustOrderDAO(session, user.PlantNr, user.UserId) + custOrderStatusDao := dal.NewCustOrderStatusDAO(session, user.PlantNr, user.UserId) + custOrderStatusHistoryDao := dal.NewCustOrderStatusHistoryDAO(session, user.PlantNr, user.UserId) + custOrder, err := custOrderDao.SelectOne(event.SerialOrder.CustOrderId) + if err != nil { + log.Error("报工同步阶段, 查询关联的客户订单失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) + return + } + if custOrder == nil { + log.Error("报工同步阶段, 查询关联的客户订单不存在, 客户订单ID:" + event.SerialOrder.CustOrderId + ", 报工任务ID:" + reportId) + return + } + if custOrder.OrderStatus.Status >= baseModel.WO_STATUS_FINISHED { + log.Error("报工同步阶段, 关联的客户订单已完成, 客户订单ID:" + event.SerialOrder.CustOrderId + ", 报工任务ID:" + reportId) + return + } + // 开启事务 开始处理客户订单数量 + if err = session.Begin(); err != nil { + log.Error("报工同步阶段, 开启事务失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) + return + } + event.SerialOrderStatusRecLst.OutputStatus = omModel.ORDER_DEALED + err = serialOrderStatusRecDao.UpdateOne(&event.SerialOrderStatusRecLst) + if err != nil { + _ = session.Rollback() + log.Error("报工同步阶段, 更新工单状态变更记录处理状态失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) + return + } + //serialOrder := event.SerialOrder + serialOrderLi, err := serialOrderDao.Select([]grmi.Predicate{omMeta.SerialOrder_SyncKey.NewPredicate(grmi.Equal, event.SerialOrder.SyncKey)}, nil) + var carComplete = true + var completeQty int + for _, serialOrder := range serialOrderLi { + if serialOrder.SerialOrderStatus.Status < baseModel.WO_STATUS_FINISHED { + carComplete = false + } else if serialOrder.SerialOrderStatus.Status == baseModel.WO_STATUS_FINISHED { + completeQty += 1 + } + } + // 客户订单下的工单数量+1 + custOrder.OrderQty.SerialOrderActQty += 1 + // 如果客户订单下的同一台套工单都完成 ActQty +1 + if carComplete { + custOrder.OrderQty.ActQty += 1 + } + // 如果客户订单下的同一台套只完成一个 说明该工单是这个台套的第一个完成的工单 RunningQty+1 + if completeQty == 1 { + custOrder.OrderQty.RunningQty += 1 + } + // 关单 + if custOrder.OrderQty.ActQty == custOrder.OrderQty.PlanQty { + custOrderStatsusHistory := model.CustOrderStatusHistory{ + CustOrderId: custOrder.CustOrderId, + StatusChangeType: model.STATUS_CHANGE_TYPE_REPORT, + FromStatus: custOrder.OrderStatus.Status, + ToStatus: baseModel.WO_STATUS_FINISHED, + ChangeTime: grmi.DateTime(time.Now()), + } + err = custOrderStatusHistoryDao.InsertOne(&custOrderStatsusHistory) + if err != nil { + _ = session.Rollback() + log.Error("报工同步阶段, 插入客户订单状态变更记录失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) + return + } + custOrder.OrderStatus.Status = baseModel.WO_STATUS_FINISHED + err = custOrderStatusDao.UpdateOne(&custOrder.OrderStatus) + if err != nil { + _ = session.Rollback() + log.Error("报工同步阶段, 更新客户订单状态失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) + return + } + log.Info("报工同步阶段, 客户订单关闭, 处理客户订单ID:" + custOrder.CustOrderId + ", 处理工单ID:" + event.SerialOrder.SerialOrderId + ", 报工任务ID:" + reportId) + return + } + if custOrder.OrderQty.RunningQty > 0 && custOrder.OrderStatus.Status == baseModel.WO_STATUS_RELEASED { + custOrderStatsusHistory := model.CustOrderStatusHistory{ + CustOrderId: custOrder.CustOrderId, + StatusChangeType: model.STATUS_CHANGE_TYPE_REPORT, + FromStatus: custOrder.OrderStatus.Status, + ToStatus: baseModel.WO_STATUS_RUNNING, + ChangeTime: grmi.DateTime(time.Now()), + } + err = custOrderStatusHistoryDao.InsertOne(&custOrderStatsusHistory) + if err != nil { + _ = session.Rollback() + log.Error("报工同步阶段, 插入客户订单状态变更记录失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) + return + } + custOrder.OrderStatus.Status = baseModel.WO_STATUS_RUNNING + err = custOrderStatusDao.UpdateOne(&custOrder.OrderStatus) + if err != nil { + _ = session.Rollback() + log.Error("报工同步阶段, 更新客户订单状态失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) + return + } + log.Info("报工同步阶段, 客户订单已置为运行中, 处理客户订单ID:" + custOrder.CustOrderId + ", 处理工单ID:" + event.SerialOrder.SerialOrderId + ", 报工任务ID:" + reportId) + return + } + log.Info("报工同步阶段, 客户订单已经在运行中, 处理客户订单ID:" + custOrder.CustOrderId + ", 处理工单ID:" + event.SerialOrder.SerialOrderId + ", 报工任务ID:" + reportId) + return +} diff --git a/services/pln/implments/CustOrderQty.service.impl.go b/services/pln/implments/CustOrderQty.service.impl.go index d99e83d..6efc686 100644 --- a/services/pln/implments/CustOrderQty.service.impl.go +++ b/services/pln/implments/CustOrderQty.service.impl.go @@ -22,21 +22,23 @@ import ( ******************************************************************************/ var DefaultConditionOfCustOrderQty = grmi.NewCondition( map[string]grmi.ConditionItem{ - meta.CustOrderQty_CustOrderId.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_CustOrderId, grmi.Equal, true), - meta.CustOrderQty_PlanQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_PlanQty, grmi.Equal, false), - meta.CustOrderQty_ReleasedQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ReleasedQty, grmi.Equal, false), - meta.CustOrderQty_ActQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActQty, grmi.Equal, false), - meta.CustOrderQty_ActGoodQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActGoodQty, grmi.Equal, false), - meta.CustOrderQty_ActScrapQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActScrapQty, grmi.Equal, false), - meta.CustOrderQty_ActReworkQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActReworkQty, grmi.Equal, false), - meta.CustOrderQty_CancelQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_CancelQty, grmi.Equal, false), - meta.CustOrderQty_ActQty1.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActQty1, grmi.Equal, false), - meta.CustOrderQty_ActQty2.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActQty2, grmi.Equal, false), - meta.CustOrderQty_ActQty3.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActQty3, grmi.Equal, false), - meta.CustOrderQty_ActQty4.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActQty4, grmi.Equal, false), - meta.CustOrderQty_LastModify.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_LastModify, grmi.Approximate, false), - meta.CustOrderQty_LastUser.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_LastUser, grmi.Equal, false), - meta.CustOrderQty_CreateTime.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_CreateTime, grmi.Approximate, false), + meta.CustOrderQty_CustOrderId.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_CustOrderId, grmi.Equal, true), + meta.CustOrderQty_PlanQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_PlanQty, grmi.Equal, false), + meta.CustOrderQty_ReleasedQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ReleasedQty, grmi.Equal, false), + meta.CustOrderQty_SerialOrderQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_SerialOrderQty, grmi.Equal, false), + meta.CustOrderQty_SerialOrderActQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_SerialOrderActQty, grmi.Equal, false), + meta.CustOrderQty_ActQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActQty, grmi.Equal, false), + meta.CustOrderQty_ActGoodQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActGoodQty, grmi.Equal, false), + meta.CustOrderQty_ActScrapQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActScrapQty, grmi.Equal, false), + meta.CustOrderQty_ActReworkQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActReworkQty, grmi.Equal, false), + meta.CustOrderQty_CancelQty.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_CancelQty, grmi.Equal, false), + meta.CustOrderQty_ActQty1.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActQty1, grmi.Equal, false), + meta.CustOrderQty_ActQty2.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActQty2, grmi.Equal, false), + meta.CustOrderQty_ActQty3.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActQty3, grmi.Equal, false), + meta.CustOrderQty_ActQty4.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_ActQty4, grmi.Equal, false), + meta.CustOrderQty_LastModify.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_LastModify, grmi.Approximate, false), + meta.CustOrderQty_LastUser.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_LastUser, grmi.Equal, false), + meta.CustOrderQty_CreateTime.UrlParameterName: grmi.NewConditionItem(meta.CustOrderQty_CreateTime, grmi.Approximate, false), }, nil, ) diff --git a/task/ReportFromMes.go b/task/ReportFromMes.go new file mode 100644 index 0000000..dc15122 --- /dev/null +++ b/task/ReportFromMes.go @@ -0,0 +1,23 @@ +package task + +import ( + "LAPP_ACURA_MOM_BACKEND/global" + services "LAPP_ACURA_MOM_BACKEND/services/pln" +) + +var ReportStatus int + +func ReportSerialOrderFromMes() { + if ReportStatus == 1 { + return + } else { + ReportStatus = 1 + } + custOrderSvr := services.NewCustOrderService() + user := &global.User{ + PlantNr: 100, + UserId: "Scheduler", + } + custOrderSvr.ReportWort(user) + ReportStatus = 0 +} diff --git a/task/scheduler.go b/task/scheduler.go index 51a45a6..61d9d77 100644 --- a/task/scheduler.go +++ b/task/scheduler.go @@ -24,6 +24,10 @@ func Start() error { if err != nil { return err } + err = c.AddFunc("*/5 * * * * ?", ReportSerialOrderFromMes) + if err != nil { + return err + } // 传递demand cache数据到阿里云 //err = c.AddFunc("0 */5 * * * ?", TransferArtDemandCacheToPortal) //if err != nil {