Browse Source

新增从MES同步报工数据的功能

pull/81/head
zhangxin 3 years ago
parent
commit
3bc3c500cf
13 changed files with 325 additions and 72 deletions
  1. +17
    -0
      dao/om/SerialOrderStatusRecLst.dao.go
  2. +29
    -0
      dao/om/implments/SerialOrderStatusRecLst.dao.impl.go
  3. +23
    -17
      meta/pln/CustOrderQty.meta.go
  4. +4
    -0
      models/om/const.go
  5. +6
    -0
      models/om/om.go
  6. +19
    -16
      models/pln/CustOrderQty.model.go
  7. +4
    -0
      models/pln/const.go
  8. +2
    -2
      services/base/implments/WorkLine.service.impl.go
  9. +17
    -0
      services/pln/CustOrder.service.go
  10. +160
    -22
      services/pln/implments/CustOrder.service.impl.go
  11. +17
    -15
      services/pln/implments/CustOrderQty.service.impl.go
  12. +23
    -0
      task/ReportFromMes.go
  13. +4
    -0
      task/scheduler.go

+ 17
- 0
dao/om/SerialOrderStatusRecLst.dao.go View File

@ -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)
}
/******************************************************************************


+ 29
- 0
dao/om/implments/SerialOrderStatusRecLst.dao.impl.go View File

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

+ 23
- 17
meta/pln/CustOrderQty.meta.go View File

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

+ 4
- 0
models/om/const.go View File

@ -32,4 +32,8 @@ const (
CacheWorkOrderType = "Cache"
ParseTaskTypeByTime = "ByTime"
ParseTaskTypeByDay = "ByDay"
ORDER_CLOSED = "ORDER_CLOSED"
ORDER_UNDEALED = 0
ORDER_DEALED = 1
)

+ 6
- 0
models/om/om.go View File

@ -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"`
}

+ 19
- 16
models/pln/CustOrderQty.model.go View File

@ -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"`
}
/******************************************************************************


+ 4
- 0
models/pln/const.go View File

@ -15,4 +15,8 @@ const (
ERROR_TYPE_SYSTEM = "SYSTEM"
ERROR_TYPE_DATA = "DATA"
// 状态变更类型
STATUS_CHANGE_TYPE_REPORT = "REPORT"
STATUS__CHANGE_TYPE_SCHUDLER = "SCHUDLER"
)

+ 2
- 2
services/base/implments/WorkLine.service.impl.go View File

@ -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()),


+ 17
- 0
services/pln/CustOrder.service.go View File

@ -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)
}
/******************************************************************************


+ 160
- 22
services/pln/implments/CustOrder.service.impl.go View File

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

+ 17
- 15
services/pln/implments/CustOrderQty.service.impl.go View File

@ -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,
)


+ 23
- 0
task/ReportFromMes.go View File

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

+ 4
- 0
task/scheduler.go View File

@ -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 {


Loading…
Cancel
Save