diff --git a/conf/config.yaml b/conf/config.yaml index 21e3a23..3191a64 100644 --- a/conf/config.yaml +++ b/conf/config.yaml @@ -11,7 +11,7 @@ masterdbdrivername: mssql masterdbserver: 101.201.121.115 masterdbuser: sa masterdbpassword: Leit2020 -masterdbname: GAAS +masterdbname: LAPP_LF_MOM masterdbport: 1433 # 打印模板文件夹路径 diff --git a/dao/om/SerialOrder.dao.go b/dao/om/SerialOrder.dao.go index d557e40..07a3195 100644 --- a/dao/om/SerialOrder.dao.go +++ b/dao/om/SerialOrder.dao.go @@ -326,6 +326,44 @@ type SerialOrderDAO interface { * ******************************************************************************/ GetLineWIPQty(string) (int, error) + /****************************************************************************** + * + * @Function Name : GetWorkOrderUnCompleted + *----------------------------------------------------------------------------- + * + * @Description : 通过workOrderId查询80状态以下的serialOrder + * + * @Function Parameters : workOrderId + * + * @Return Value : 查找到的SerialOrder + * + * @Return Value : 执行时发生的错误 + * + * @Author : zhangxin + * + * @Date : 2021-09-26 + * + ******************************************************************************/ + GetWorkOrderUnCompleted(workOrderId string) (result *[]model.VOmSerialorder, err error) + /****************************************************************************** + * + * @Function Name : GetWorkOrderUnCompleted + *----------------------------------------------------------------------------- + * + * @Description : 通过serialOrderIdLi查询serialOrder + * + * @Function Parameters : serialOrderIdLi []string + * + * @Return Value : 查找到的SerialOrder + * + * @Return Value : 执行时发生的错误 + * + * @Author : zhangxin + * + * @Date : 2021-09-26 + * + ******************************************************************************/ + GetSerialOrderByIDLi(serialOrderIdLi []string) (result *[]model.VOmSerialorder, err error) } /****************************************************************************** diff --git a/dao/om/SerialOrderPOLst.dao.go b/dao/om/SerialOrderPOLst.dao.go index ed258ab..bbdd1f0 100644 --- a/dao/om/SerialOrderPOLst.dao.go +++ b/dao/om/SerialOrderPOLst.dao.go @@ -246,6 +246,27 @@ type SerialOrderPOLstDAO interface { * ******************************************************************************/ SelectDisplaySerialOrder(workLineId string, workOrderId string, serialOrderId string, date string, status int) ([]model.SerialOrderPOData, error) + /****************************************************************************** + * + * @Function Name : GetSerialOrderPOData + *----------------------------------------------------------------------------- + * + * @Description : 查询展示的serialOrderPOLst和process关联的相关数据 + * + * @Function Parameters : 序列工单id + * + * @Function Parameters : 产线id状态 + * + * @Return Value : *[]model.SerialOrderPOWithProcess + * + * @Return Value : 执行时发生的错误 + * + * @Author : zhangxin + * + * @Date : 2021-09-26 + * + ******************************************************************************/ + GetSerialOrderPOData(serialOrderId string, workLineId string) (*[]model.SerialOrderPOWithProcess, error) } /****************************************************************************** diff --git a/dao/om/implments/SerialOrder.dao.impl.go b/dao/om/implments/SerialOrder.dao.impl.go index 73cc444..8fadf68 100644 --- a/dao/om/implments/SerialOrder.dao.impl.go +++ b/dao/om/implments/SerialOrder.dao.impl.go @@ -427,3 +427,61 @@ func (impl *SerialOrderDAOImplement) GetLineWIPQty(lineid string) (wipqty int, e wipqty = int(totalrow) return } + +/****************************************************************************** + * + * @Reference LAPP_LF_MOM_BACKEND/dao/om/SerialOrderDAO.GetWorkOrderUnCompleted + * + ******************************************************************************/ +func (impl *SerialOrderDAOImplement) GetWorkOrderUnCompleted(workOrderId string) (result *[]model.VOmSerialorder, err error) { + data := make([]model.VOmSerialorder, 0) + + session := impl.session.Table(impl.meta.TableName) + condition := fmt.Sprintf("%s = %s and %s = %s", + meta.SerialOrder_PlantNr.ColumnName, + meta.SerialOrderStatus_PlantNr.ColumnName, + meta.SerialOrder_SerialOrderId.ColumnName, + meta.SerialOrderStatus_SerialOrderId.ColumnName) + where := fmt.Sprintf("%s = ? and %s = ? and %s < ? and %s >= ?", + meta.SerialOrder_PlantNr.ColumnName, + meta.SerialOrder_WorkOrderId.ColumnName, + meta.SerialOrderStatus_Status.ColumnName, + meta.SerialOrderStatus_Status.ColumnName) + err = session.Join("LEFT", meta.SerialOrderStatus.TableName, condition).Where(where, impl.plantNr, workOrderId, common.WO_STATUS_FINISHED, common.WO_STATUS_RELEASED).Asc(meta.SerialOrder_Sort.ColumnName).Find(&data) + if err != nil { + return nil, err + } + + return &data, nil +} + +/****************************************************************************** + * + * @Reference LAPP_LF_MOM_BACKEND/dao/om/SerialOrderDAO.GetSerialOrderByIDLi + * + ******************************************************************************/ +func (impl *SerialOrderDAOImplement) GetSerialOrderByIDLi(serialOrderIdLi []string) (result *[]model.VOmSerialorder, err error) { + data := make([]model.VOmSerialorder, 0) + + session := impl.session.Table(impl.meta.TableName) + condition := fmt.Sprintf("%s = %s and %s = %s", + meta.SerialOrder_PlantNr.ColumnName, + meta.SerialOrderStatus_PlantNr.ColumnName, + meta.SerialOrder_SerialOrderId.ColumnName, + meta.SerialOrderStatus_SerialOrderId.ColumnName) + where := fmt.Sprintf("%s = ?", meta.SerialOrder_PlantNr.ColumnName) + idSearch := fmt.Sprintf(" and %s in ( ", meta.SerialOrder_SerialOrderId.ColumnName) + for index, serialOrderId := range serialOrderIdLi { + if index != 0 { + idSearch += ", " + } + idSearch += fmt.Sprintf(`'%s'`, serialOrderId) + } + where += idSearch + ")" + err = session.Join("LEFT", meta.SerialOrderStatus.TableName, condition).Where(where, impl.plantNr).Asc(meta.SerialOrder_Sort.ColumnName).Find(&data) + if err != nil { + return nil, err + } + + return &data, nil +} diff --git a/dao/om/implments/SerialOrderPOLst.dao.impl.go b/dao/om/implments/SerialOrderPOLst.dao.impl.go index 29552a7..fc15a4e 100644 --- a/dao/om/implments/SerialOrderPOLst.dao.impl.go +++ b/dao/om/implments/SerialOrderPOLst.dao.impl.go @@ -353,4 +353,34 @@ func (impl *SerialOrderPOLstDAOImplement) SelectDisplaySerialOrder(workLineId st } err := session.Join("LEFT", meta.SerialOrder.TableName, orderCondition).Join("LEFT", meta.SerialOrderStatus.TableName, condition).Join("LEFT", baseMeta.Process.TableName, processCondition).Where(where, parameters...).Asc(meta.SerialOrder_SerialId.ColumnName).Asc(baseMeta.Process_PO.ColumnName).Find(&result) return result, err +} + +/****************************************************************************** + * + * @Reference LAPP_LF_MOM_BACKEND/dao/om/SerialOrderDAO.GetSerialOrderPOData + * + ******************************************************************************/ +func (impl *SerialOrderPOLstDAOImplement) GetSerialOrderPOData(serialOrderId string, workLineId string) (*[]model.SerialOrderPOWithProcess, error) { + result := make([]model.SerialOrderPOWithProcess, 0) + serialOrderCondition := fmt.Sprintf("%s = %s and %s = %s", + meta.SerialOrderPOLst_PlantNr.ColumnName, + meta.SerialOrder_PlantNr.ColumnName, + meta.SerialOrderPOLst_SerialOrderId.ColumnName, + meta.SerialOrder_SerialOrderId.ColumnName) + processCondition := fmt.Sprintf("%s = %s and %s = %s and %s = %s", + meta.SerialOrderPOLst_PlantNr.ColumnName, + baseMeta.Process_PlantNr.ColumnName, + meta.SerialOrderPOLst_PO.ColumnName, + baseMeta.Process_PO.ColumnName, + meta.SerialOrder_UsedResourceId.ColumnName, + baseMeta.Process_WorkLineId.ColumnName) + session := impl.session.Table(impl.meta.TableName).Join("LEFT", meta.SerialOrder.TableName, serialOrderCondition).Join("LEFT", baseMeta.Process.TableName, processCondition) + where := fmt.Sprintf("%s = ? and %s = ? and %s = ?", + meta.SerialOrderPOLst_PlantNr.ColumnName, + meta.SerialOrderPOLst_SerialOrderId.ColumnName, + meta.SerialOrder_UsedResourceId.ColumnName) + parameters := []interface{}{impl.plantNr, serialOrderId, workLineId} + err := session.Where(where, parameters...).Asc(meta.SerialOrderPOLst_PO.ColumnName).Find(&result) + return &result, err + } \ No newline at end of file diff --git a/db/db.go b/db/db.go index c407aec..8b0672f 100644 --- a/db/db.go +++ b/db/db.go @@ -100,7 +100,7 @@ func InitDb() error { if err != nil { return err } - Eloquent.ShowSQL(true) + //Eloquent.ShowSQL(true) return nil } diff --git a/meta/base/OPCComValueCheckRuleDetail.meta.go b/meta/base/OPCComValueCheckRuleDetail.meta.go index 48d3fbe..de3803a 100644 --- a/meta/base/OPCComValueCheckRuleDetail.meta.go +++ b/meta/base/OPCComValueCheckRuleDetail.meta.go @@ -19,6 +19,7 @@ import ( var OPCComValueCheckRuleDetail_PlantNr = grmi.NewField("PlantNr", "OPCComValueCheckRuleDetail.PlantNr", "plantnr", grmi.TypeInt) var OPCComValueCheckRuleDetail_Id = grmi.NewField("Id", "OPCComValueCheckRuleDetail.Id", "id", grmi.TypeInt) var OPCComValueCheckRuleDetail_DetailId = grmi.NewField("DetailId", "OPCComValueCheckRuleDetail.DetailId", "detailid", grmi.TypeInt) +var OPCComValueCheckRuleDetail_ObjectPO = grmi.NewField("ObjectPO", "OPCComValueCheckRuleDetail.ObjectPO", "objectpo", grmi.TypeInt) var OPCComValueCheckRuleDetail_CheckOperationId = grmi.NewField("CheckOperationId", "OPCComValueCheckRuleDetail.CheckOperationId", "checkoperationid", grmi.TypeInt) var OPCComValueCheckRuleDetail_CheckPO = grmi.NewField("CheckPO", "OPCComValueCheckRuleDetail.CheckPO", "checkpo", grmi.TypeInt) var OPCComValueCheckRuleDetail_CheckStepNo = grmi.NewField("CheckStepNo", "OPCComValueCheckRuleDetail.CheckStepNo", "checkstepno", grmi.TypeInt) @@ -53,6 +54,7 @@ var OPCComValueCheckRuleDetail = grmi.NewEntity( OPCComValueCheckRuleDetail_PlantNr.Name: OPCComValueCheckRuleDetail_PlantNr, OPCComValueCheckRuleDetail_Id.Name: OPCComValueCheckRuleDetail_Id, OPCComValueCheckRuleDetail_DetailId.Name: OPCComValueCheckRuleDetail_DetailId, + OPCComValueCheckRuleDetail_ObjectPO.Name: OPCComValueCheckRuleDetail_ObjectPO, OPCComValueCheckRuleDetail_CheckOperationId.Name: OPCComValueCheckRuleDetail_CheckOperationId, OPCComValueCheckRuleDetail_CheckPO.Name: OPCComValueCheckRuleDetail_CheckPO, OPCComValueCheckRuleDetail_CheckStepNo.Name: OPCComValueCheckRuleDetail_CheckStepNo, @@ -72,4 +74,4 @@ var OPCComValueCheckRuleDetail = grmi.NewEntity( OPCComValueCheckRuleDetail_CreateTime.Name: OPCComValueCheckRuleDetail_CreateTime, }, []string{"PlantNr"}, - []string{"CheckOperationId", "CheckPO", "CheckStepNo", "CheckStepDesc", "CheckPos", "CheckProjectId", "CheckWorkPlaceNr", "ObjectStepNo", "ObjectPos", "ObjectOPCDesc", "OperatorSimbol", "CheckValue", "DoWhenOK", "DoWhenNOK", "LastUser"}) + []string{"ObjectPO", "CheckOperationId", "CheckPO", "CheckStepNo", "CheckStepDesc", "CheckPos", "CheckProjectId", "CheckWorkPlaceNr", "ObjectStepNo", "ObjectPos", "ObjectOPCDesc", "OperatorSimbol", "CheckValue", "DoWhenOK", "DoWhenNOK", "LastUser"}) diff --git a/models/base/OPCComValueCheckRuleDetail.model.go b/models/base/OPCComValueCheckRuleDetail.model.go index 69cd282..e3a956c 100644 --- a/models/base/OPCComValueCheckRuleDetail.model.go +++ b/models/base/OPCComValueCheckRuleDetail.model.go @@ -23,6 +23,7 @@ type OPCComValueCheckRuleDetail struct { Id int `xorm:"pk int 'Id'" json:"OPCComValueCheckRuleDetail-Id"` PlantNr int `xorm:"pk int 'PlantNr'" json:"OPCComValueCheckRuleDetail-PlantNr"` DetailId int `xorm:"pk int 'DetailId'" json:"OPCComValueCheckRuleDetail-DetailId"` + ObjectPO int `xorm:"pk int 'ObjectPO'" json:"OPCComValueCheckRuleDetail-ObjectPO"` CheckOperationId int `xorm:"int 'CheckOperationId' not null" json:"OPCComValueCheckRuleDetail-CheckOperationId"` CheckPO int `xorm:"int 'CheckPO' not null" json:"OPCComValueCheckRuleDetail-CheckPO"` CheckStepNo int `xorm:"int 'CheckStepNo' not null" json:"OPCComValueCheckRuleDetail-CheckStepNo"` diff --git a/models/me/BomLst.model.go b/models/me/BomLst.model.go index b0abf02..275f1ab 100644 --- a/models/me/BomLst.model.go +++ b/models/me/BomLst.model.go @@ -81,15 +81,19 @@ func (t *BomLst) GetPage() (Menus []BomLst, err error) { if t.BomId != "" { table = table.And("BomId = ?", t.BomId) } - if err = table.Asc("FmatNr").Find(&Menus); err != nil { + if err = table.Asc("FmatNr").Asc("Position").Find(&Menus); err != nil { return } + return } //递归查询侧边栏 func (t *BomLst) SetMenu(FmatNr string) (m []BomLst, err error) { menulist, err := t.GetPage() + if err != nil { + return nil, err + } m = make([]BomLst, 0) for i := 0; i < len(menulist); i++ { //menulist[i].Clipped() diff --git a/models/om/om.go b/models/om/om.go index 0c1271c..cb6393d 100644 --- a/models/om/om.go +++ b/models/om/om.go @@ -147,3 +147,9 @@ type SerialOrderOPData struct { baseModel.OPCComRule `xorm:"extends"` baseModel.Operation `xorm:"extends"` } + +type SerialOrderPOWithProcess struct { + SerialOrderPOLst `xorm:"extends"` + SerialOrder `xorm:"extends"` + baseModel.Process `xorm:"extends"` +} diff --git a/services/base/implments/OPCComValueCheckRuleDetail.service.impl.go b/services/base/implments/OPCComValueCheckRuleDetail.service.impl.go index 2c0d720..a770b6b 100644 --- a/services/base/implments/OPCComValueCheckRuleDetail.service.impl.go +++ b/services/base/implments/OPCComValueCheckRuleDetail.service.impl.go @@ -24,6 +24,7 @@ var DefaultConditionOfOPCComValueCheckRuleDetail = grmi.NewCondition( map[string]grmi.ConditionItem{ meta.OPCComValueCheckRuleDetail_Id.UrlParameterName: grmi.NewConditionItem(meta.OPCComValueCheckRuleDetail_Id, grmi.Equal, true), meta.OPCComValueCheckRuleDetail_DetailId.UrlParameterName: grmi.NewConditionItem(meta.OPCComValueCheckRuleDetail_DetailId, grmi.Equal, true), + meta.OPCComValueCheckRuleDetail_ObjectPO.UrlParameterName: grmi.NewConditionItem(meta.OPCComValueCheckRuleDetail_ObjectPO, grmi.Equal, false), meta.OPCComValueCheckRuleDetail_CheckOperationId.UrlParameterName: grmi.NewConditionItem(meta.OPCComValueCheckRuleDetail_CheckOperationId, grmi.Equal, false), meta.OPCComValueCheckRuleDetail_CheckPO.UrlParameterName: grmi.NewConditionItem(meta.OPCComValueCheckRuleDetail_CheckPO, grmi.Equal, false), meta.OPCComValueCheckRuleDetail_CheckStepNo.UrlParameterName: grmi.NewConditionItem(meta.OPCComValueCheckRuleDetail_CheckStepNo, grmi.Equal, false), diff --git a/services/om/WorkOrder.service.go b/services/om/WorkOrder.service.go index 59a0ba8..0853057 100644 --- a/services/om/WorkOrder.service.go +++ b/services/om/WorkOrder.service.go @@ -308,6 +308,46 @@ type WorkOrderService interface { * ******************************************************************************/ SelectUnReleaseWorkOrder(user *models.Usertab, workLineId string) (*[]model.VOmWorkorder, error) + /****************************************************************************** + * + * @Function Name : SelectWorkOrderUnCompletedSerialOrder + *----------------------------------------------------------------------------- + * + * @Description : 获取大于等于26小于80的序列工单 + * + * @Function Parameters : 当前访问人员信息 + * + * @Function Parameters : workOrderId + * + * @Return Value : *[]model.VOmSerialorder + * + * @Return Value : 执行时发生的错误 + * + * @Author : zhangxin + * + * @Date : 2021-09-26 + * + ******************************************************************************/ + SelectWorkOrderUnCompletedSerialOrder(user *models.Usertab, workOrderId string) (*[]model.VOmSerialorder, error) + /****************************************************************************** + * + * @Function Name : CancelUnCompletedSerialOrder + *----------------------------------------------------------------------------- + * + * @Description : 取消未完成的序列工单 + * + * @Function Parameters : 当前访问人员信息 + * + * @Function Parameters : serialOrderIdLi + * + * @Return Value : 执行时发生的错误 + * + * @Author : zhangxin + * + * @Date : 2021-09-26 + * + ******************************************************************************/ + CancelUnCompletedSerialOrder(user *models.Usertab, serialOrderIdLi []string) error } /****************************************************************************** diff --git a/services/om/implments/WorkOrder.service.impl.go b/services/om/implments/WorkOrder.service.impl.go index 38a353b..87c11f9 100644 --- a/services/om/implments/WorkOrder.service.impl.go +++ b/services/om/implments/WorkOrder.service.impl.go @@ -5,22 +5,19 @@ package implments import ( baseDal "LAPP_LF_MOM_BACKEND/dao/base" meDal "LAPP_LF_MOM_BACKEND/dao/me" - baseMeta "LAPP_LF_MOM_BACKEND/meta/base" - meModel "LAPP_LF_MOM_BACKEND/models/me" - "github.com/go-xorm/xorm" - //logDal "LAPP_LF_MOM_BACKEND/dao/log" dal "LAPP_LF_MOM_BACKEND/dao/om" "LAPP_LF_MOM_BACKEND/db" "LAPP_LF_MOM_BACKEND/grmi" "LAPP_LF_MOM_BACKEND/infra/logger" + baseMeta "LAPP_LF_MOM_BACKEND/meta/base" meMeta "LAPP_LF_MOM_BACKEND/meta/me" - //logMeta "LAPP_LF_MOM_BACKEND/meta/log" meta "LAPP_LF_MOM_BACKEND/meta/om" baseModel "LAPP_LF_MOM_BACKEND/models/base" - //logModel "LAPP_LF_MOM_BACKEND/models/log" + meModel "LAPP_LF_MOM_BACKEND/models/me" model "LAPP_LF_MOM_BACKEND/models/om" "LAPP_LF_MOM_BACKEND/utils" "LAPP_LF_MOM_BACKEND/web/models" + "github.com/go-xorm/xorm" "strconv" "time" ) @@ -1428,7 +1425,7 @@ func (impl *WorkOrderServiceImplement) OPCCommunication(user *models.Usertab, se value += workOrderId } else if detail.DataType == baseModel.DATA_TYPE_PARTNO { value += serialOrderStep.SubArtId - } else if detail.DataType == baseModel.DATA_TYPE_SERIALID { + } else if detail.DataType == baseModel.DATA_TYPE_SERIALID { value += strconv.Itoa(serialId) } else { return nil, grmi.NewBusinessError("不支持的OPC通信细则中的DATA TYPE, DATA TYPE:" + detail.DataType) @@ -1644,7 +1641,25 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, month := int(now.Month()) yearStr := baseModel.YEAR_MAP[year] monthStr := baseModel.MONTH_MAP[month] - + today := now.Format(grmi.DateOutFormat) + shiftStartStr := today + " 07:00:00" + shiftEndStr := today + " 19:30:00" + shiftStart, err := time.ParseInLocation(grmi.DatetimeOutFormat, shiftStartStr, utils.TimezoneLocation) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("解析班组时间失败, error:" + err.Error()) + } + shiftEnd, err := time.ParseInLocation(grmi.DatetimeOutFormat, shiftEndStr, utils.TimezoneLocation) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("解析班组时间失败, error:" + err.Error()) + } + var shift string + if now.Before(shiftStart) || now.After(shiftEnd) { + shift = "N" + } else { + shift = "E" + } article, err := articleDao.SelectOne(entity.ArtId) if err != nil { _ = session.Rollback() @@ -1692,7 +1707,7 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, _ = session.Rollback() return grmi.NewBusinessError("不存在对应的物料BOM,artId:" + article.ArtId) } - bomLstLi, err := bomLstDao.Select([]grmi.Predicate{meMeta.BomLst_BomId.NewPredicate(grmi.Equal, bomHead.BomId)}, nil) + bomLstLi, err := bomLstDao.Select([]grmi.Predicate{meMeta.BomLst_BomId.NewPredicate(grmi.Equal, bomHead.BomId)}, []grmi.Field{meMeta.BomLst_Position}) if err != nil { _ = session.Rollback() return grmi.NewBusinessError("获取BOM细则失败, error:" + err.Error()) @@ -1833,11 +1848,12 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, ArtId: article.ArtId, CustArtId: article.CustArtId, OrderType: baseModel.ODER_TYPE_INTERVAL, + OrderType1: shift, OrderInfo: article.Descr1, PlanResourceGroupId: article.PlanResourceGroupId, PlanResourceId: entity.WorkLineId, UsedResourceId: entity.WorkLineId, - PlanQty: float64(entity.Qty), + PlanQty: float64(productQty), QtyUomId: article.UomId, RatePerHourToggle: article.RatePerHourToggle, TimePerItemToggle: article.TimePerItemToggle, @@ -1894,18 +1910,23 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, serialOrderLi := make([]model.SerialOrder, 0, entity.Qty) serialOrderStatusLi := make([]model.SerialOrderStatus, 0, entity.Qty) custArtMap := make(map[string]string) - for artId := range countMap { - art, err := articleDao.SelectOne(artId) - if err != nil { - _ = session.Rollback() - return grmi.NewBusinessError("获取物料数据失败, error:" + err.Error()) - } - if art == nil { - _ = session.Rollback() - return grmi.NewBusinessError("未获取到物料数据, artID:" + artId) + if article.ArtSpec1 == baseModel.ART_TYPE_VIRTUAL { + for artId := range countMap { + art, err := articleDao.SelectOne(artId) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("获取物料数据失败, error:" + err.Error()) + } + if art == nil { + _ = session.Rollback() + return grmi.NewBusinessError("未获取到物料数据, artID:" + artId) + } + custArtMap[artId] = art.CustArtId } - custArtMap[artId] = art.CustArtId + } else { + custArtMap[article.ArtId] = article.CustArtId } + // 进行批次工单的时间拆解到序列工单的计划时间上 var serialNum string // 生成序列工单 @@ -2234,7 +2255,7 @@ func (impl *WorkOrderServiceImplement) SplitWorkOrder(user *models.Usertab, work if bomHead == nil { return grmi.NewBusinessError("不存在对应的物料BOM,artId:" + article.ArtId) } - bomLstLi, err := bomLstDao.Select([]grmi.Predicate{meMeta.BomLst_BomId.NewPredicate(grmi.Equal, bomHead.BomId)}, nil) + bomLstLi, err := bomLstDao.Select([]grmi.Predicate{meMeta.BomLst_BomId.NewPredicate(grmi.Equal, bomHead.BomId)}, []grmi.Field{meMeta.BomLst_Position}) if err != nil { return grmi.NewBusinessError("获取BOM细则失败, error:" + err.Error()) } @@ -2249,7 +2270,7 @@ func (impl *WorkOrderServiceImplement) SplitWorkOrder(user *models.Usertab, work bMap[bomLst.CmatNr] = int(bomLst.CmatQty) count += int(bomLst.CmatQty) } - if qty % count != 0 { + if qty%count != 0 { _ = session.Rollback() return grmi.NewBusinessError("因为总成为虚拟总成,拆分工单不符合BOM配置比例关系") } @@ -2414,19 +2435,41 @@ func (impl *WorkOrderServiceImplement) CreateSplitWorkOrder(session *xorm.Sessio month := int(now.Month()) yearStr := baseModel.YEAR_MAP[year] monthStr := baseModel.MONTH_MAP[month] - + today := now.Format(grmi.DateOutFormat) + shiftStartStr := today + " 07:00:00" + shiftEndStr := today + " 19:30:00" + shiftStart, err := time.ParseInLocation(grmi.DatetimeOutFormat, shiftStartStr, utils.TimezoneLocation) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("解析班组时间失败, error:" + err.Error()) + } + shiftEnd, err := time.ParseInLocation(grmi.DatetimeOutFormat, shiftEndStr, utils.TimezoneLocation) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("解析班组时间失败, error:" + err.Error()) + } + var shift string + if now.Before(shiftStart) || now.After(shiftEnd) { + shift = "N" + } else { + shift = "E" + } article, err := articleDao.SelectOne(artId) if err != nil { + _ = session.Rollback() return grmi.NewBusinessError("查询物料数据失败, error:" + err.Error()) } if article == nil { + _ = session.Rollback() return grmi.NewBusinessError("不存在对应的物料数据") } if article.ArtSpec1 != baseModel.ART_TYPE_FINISHED && article.ArtSpec1 != baseModel.ART_TYPE_VIRTUAL { + _ = session.Rollback() return grmi.NewBusinessError("传递的物料不是成品或虚拟物料ID") } workLineLi, err := artWorkLineDao.Select([]grmi.Predicate{baseMeta.ArtWorkLineLst_ArtId.NewPredicate(grmi.Equal, article.ArtId)}, nil) if err != nil { + _ = session.Rollback() return grmi.NewBusinessError("查询物料关联产线失败, error:" + err.Error()) } var workLineExist bool @@ -2456,7 +2499,7 @@ func (impl *WorkOrderServiceImplement) CreateSplitWorkOrder(session *xorm.Sessio if bomHead == nil { return grmi.NewBusinessError("不存在对应的物料BOM,artId:" + article.ArtId) } - bomLstLi, err := bomLstDao.Select([]grmi.Predicate{meMeta.BomLst_BomId.NewPredicate(grmi.Equal, bomHead.BomId)}, nil) + bomLstLi, err := bomLstDao.Select([]grmi.Predicate{meMeta.BomLst_BomId.NewPredicate(grmi.Equal, bomHead.BomId)}, []grmi.Field{meMeta.BomLst_Position}) if err != nil { return grmi.NewBusinessError("获取BOM细则失败, error:" + err.Error()) } @@ -2557,11 +2600,13 @@ func (impl *WorkOrderServiceImplement) CreateSplitWorkOrder(session *xorm.Sessio if err != nil { return grmi.NewBusinessError("生成工单流水号失败") } + workOrder := model.WorkOrder{ WorkOrderId: workOrderId, ArtId: article.ArtId, CustArtId: article.CustArtId, OrderType: baseModel.ODER_TYPE_INTERVAL, + OrderType1: shift, OrderInfo: article.Descr1, PlanResourceGroupId: article.PlanResourceGroupId, PlanResourceId: workLineId, @@ -2695,9 +2740,10 @@ func (impl *WorkOrderServiceImplement) CreateSplitWorkOrder(session *xorm.Sessio } sortNum := serialNum if workLineId == "X243X247" { - custArtId := custArtMap[artId] + if len(custArtId) < 7 { + _ = session.Rollback() return grmi.NewBusinessError("客户零件号不合规") } @@ -2995,3 +3041,168 @@ func (impl *WorkOrderServiceImplement) SelectUnReleaseWorkOrder(user *models.Use workOrderLi, err := workOrderDao.SelectUnReleaseWorkOrder(workLineId) return workOrderLi, err } + +/****************************************************************************** +* +* @Reference LAPP_LF_MOM_BACKEND/services/om/WorkOrderService.SelectWorkOrderUnCompletedSerialOrder +* +******************************************************************************/ +func (impl *WorkOrderServiceImplement) SelectWorkOrderUnCompletedSerialOrder(user *models.Usertab, workOrderId string) (*[]model.VOmSerialorder, error) { + engine := db.Eloquent.Master() + session := engine.NewSession() + defer session.Close() + dao := dal.NewSerialOrderDAO(session, user.Pid, user.Userid) + return dao.GetWorkOrderUnCompleted(workOrderId) +} + +/****************************************************************************** +* +* @Reference LAPP_LF_MOM_BACKEND/services/om/WorkOrderService.CancelUnCompletedSerialOrder +* +******************************************************************************/ +func (impl *WorkOrderServiceImplement) CancelUnCompletedSerialOrder(user *models.Usertab, serialOrderIdLi []string) error { + engine := db.Eloquent.Master() + session := engine.NewSession() + defer session.Close() + if err := session.Begin(); err != nil { + return err + } + dao := dal.NewWorkOrderDAO(session, user.Pid, user.Userid) + serialOrderDao := dal.NewSerialOrderDAO(session, user.Pid, user.Userid) + poDao := dal.NewSerialOrderPOLstDAO(session, user.Pid, user.Userid) + serialOrderStatusDao := dal.NewSerialOrderStatusDAO(session, user.Pid, user.Userid) + serialOrderStatusRecDao := dal.NewSerialOrderStatusRecLstDAO(session, user.Pid, user.Userid) + StepDao := dal.NewSerialOrderStepLstDAO(session, user.Pid, user.Userid) + opDetailDao := dal.NewSerialOrderOPDetailDAO(session, user.Pid, user.Userid) + workOrderQtyDao := dal.NewWorkOrderQtyDAO(session, user.Pid, user.Userid) + workOrderStatusDao := dal.NewWorkOrderStatusDAO(session, user.Pid, user.Userid) + workOrderStatusRecDao := dal.NewWorkOrderStatusRecLstDAO(session, user.Pid, user.Userid) + if len(serialOrderIdLi) == 0 { + _ = session.Rollback() + return grmi.NewBusinessError("未获取到工单ID") + } + serialOrderLi, err := serialOrderDao.GetSerialOrderByIDLi(serialOrderIdLi) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("查询序列工单失败, error:" + err.Error()) + } + if len(*serialOrderLi) != len(serialOrderIdLi) { + _ = session.Rollback() + return grmi.NewBusinessError("部分序列工单ID错误") + } + var workOrderId string + var status int + for index, serialOrder := range *serialOrderLi { + if workOrderId == "" { + workOrderId = serialOrder.SerialOrder.WorkOrderId + } + status = serialOrder.SerialOrderStatus.Status + if workOrderId != serialOrder.SerialOrder.WorkOrderId { + _ = session.Rollback() + return grmi.NewBusinessError("序列工单不属于同一个批次工单") + } + if index == 0 { + if serialOrder.SerialOrderStatus.Status >= baseModel.ORDER_STATUS_CLOSED || serialOrder.SerialOrderStatus.Status == baseModel.WO_STATUS_INTERRUPT { + _ = session.Rollback() + return grmi.NewBusinessError("序列工单不合规,不允许取消, serialOrderId:" + serialOrder.SerialOrder.SerialOrderId) + } else if serialOrder.SerialOrderStatus.Status == baseModel.ORDER_STATUS_RUNNING { + poDataLi, err := poDao.GetSerialOrderPOData(serialOrder.SerialOrder.SerialOrderId, serialOrder.SerialOrder.UsedResourceId) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("查询工单工序数据失败, error:" + err.Error()) + } + for _, poData := range *poDataLi { + if !poData.Process.IsFirstPO { + if poData.SerialOrderPOLst.Status > baseModel.WO_STATUS_RELEASED { + _ = session.Rollback() + return grmi.NewBusinessError("首个工单的非首道序状态不是已下达") + } + } else { + if poData.SerialOrderPOLst.Status != baseModel.ORDER_STATUS_RUNNING && poData.SerialOrderPOLst.Status != baseModel.WO_STATUS_RELEASED { + _ = session.Rollback() + return grmi.NewBusinessError("首个工单的首道序状态不是生产中") + } + } + } + } + } else { + if serialOrder.SerialOrderStatus.Status >= baseModel.WO_STATUS_RUNNING || serialOrder.SerialOrderStatus.Status == baseModel.WO_STATUS_INTERRUPT { + _ = session.Rollback() + return grmi.NewBusinessError("序列工单不合规,不允许取消, serialOrderId:" + serialOrder.SerialOrder.SerialOrderId) + } + } + serialOrderStatus := serialOrder.SerialOrderStatus + serialOrderStatus.Status = baseModel.ORDER_STATUS_CANCELED + err = serialOrderStatusDao.UpdateOne(&serialOrderStatus) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("更新工单状态失败, error:" + err.Error()) + } + statusRec := model.SerialOrderStatusRecLst{SerialOrderId: serialOrderStatus.SerialOrderId, PrevStatus: status, Status: baseModel.ORDER_STATUS_CANCELED} + err = serialOrderStatusRecDao.InsertOne(&statusRec) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("插入工单状态变更记录失败, error:" + err.Error()) + } + newPo := model.SerialOrderPOLst{Status: baseModel.ORDER_STATUS_CANCELED} + err = poDao.UpdateWhere([]grmi.Predicate{meta.SerialOrderPOLst_SerialOrderId.NewPredicate(grmi.Equal, serialOrder.SerialOrder.SerialOrderId)}, &newPo, meta.SerialOrderPOLst_Status.Name) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("更新工单工序状态失败") + } + newStep := model.SerialOrderStepLst{Status: baseModel.ORDER_STATUS_CANCELED} + err = StepDao.UpdateWhere([]grmi.Predicate{meta.SerialOrderStepLst_SerialOrderId.NewPredicate(grmi.Equal, serialOrder.SerialOrder.SerialOrderId)}, &newStep, meta.SerialOrderStepLst_Status.Name) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("更新工单工步状态失败") + } + newOpDetail := model.SerialOrderOPDetail{Status: baseModel.ORDER_STATUS_CANCELED} + err = opDetailDao.UpdateWhere([]grmi.Predicate{meta.SerialOrderOPDetail_SerialOrderId.NewPredicate(grmi.Equal, serialOrder.SerialOrder.SerialOrderId)}, &newOpDetail, meta.SerialOrderOPDetail_Status.Name) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("更新工单工步详细操作状态失败") + } + } + workOrder, err := dao.SelectOneJoin(workOrderId) + if workOrder.WorkOrderStatus.Status < baseModel.WO_STATUS_RELEASED || workOrder.WorkOrderStatus.Status >= baseModel.ORDER_STATUS_CLOSED { + _ = session.Rollback() + return grmi.NewBusinessError("序列工单状态不符合条件") + } + if workOrder == nil { + _ = session.Rollback() + return grmi.NewBusinessError("未查询到批次工单, workOrderId:" + workOrderId) + } + workOrderStatus := workOrder.WorkOrderStatus.Status + cancelQty := len(serialOrderIdLi) + workOrder.WorkOrderQty.ActQty3 += float64(cancelQty) + workOrder.ActQty += float64(cancelQty) + if int(workOrder.WorkOrderQty.ActQty) == int(workOrder.WorkOrderQty.PlanQty) { + if workOrder.WorkOrderQty.ActQty3 == workOrder.WorkOrderQty.PlanQty { + workOrderStatus = baseModel.ORDER_STATUS_CANCELED + } else { + workOrderStatus = baseModel.WO_STATUS_FINISHED + } + } + err = workOrderQtyDao.UpdateOne(&workOrder.WorkOrderQty) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("更新批次工单数量失败, error:" + err.Error()) + } + if workOrder.WorkOrderStatus.Status != workOrderStatus { + statusRec := model.WorkOrderStatusRecLst{WorkOrderId: workOrder.WorkOrder.WorkOrderId, PrevStatus: workOrder.WorkOrderStatus.Status, Status: workOrderStatus} + err = workOrderStatusRecDao.InsertOne(&statusRec) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("插入批次工单状态变更记录失败, error:" + err.Error()) + } + workOrder.WorkOrderStatus.Status = workOrderStatus + err = workOrderStatusDao.UpdateOne(&workOrder.WorkOrderStatus) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("更新批次工单状态失败, error:" + err.Error()) + } + } + _ = session.Commit() + return nil + +} diff --git a/services/schedule/SchedTask.Ctrl.go b/services/schedule/SchedTask.Ctrl.go index b2db681..cdfa55e 100644 --- a/services/schedule/SchedTask.Ctrl.go +++ b/services/schedule/SchedTask.Ctrl.go @@ -345,11 +345,27 @@ func (tasksrv *TaskSrv) ReleaseSerialOrder(relQty int, releaseId string) (err er // 写入打印条码的逻辑 snr := new(models.Snrtab) snr.Finr = common.PlantNr - printID, err := snr.GetNextSnrWithSession(session, "Printer") - if err != nil { - innerLog.Error("ReleaseSerialOrder 更新工单工艺详细步骤状态失败, error:"+err.Error()+" serialOrderId:"+serialOrderStatus.SerialOrderId, "release id:"+releaseId) - _ = session.Rollback() - return grmi.NewBusinessError("获取打印条码流水号失败, error:" + err.Error()) + var next bool + var printID string + for !next { + printID, err = snr.GetNextSnrWithSession(session, "Printer") + if err != nil { + innerLog.Error("ReleaseSerialOrder 更新工单工艺详细步骤状态失败, error:"+err.Error()+" serialOrderId:"+serialOrderStatus.SerialOrderId, "release id:"+releaseId) + _ = session.Rollback() + return grmi.NewBusinessError("获取打印条码流水号失败, error:" + err.Error()) + } + existPrintHead, err := printHeadDao.SelectOne(printID) + if err != nil { + innerLog.Error("ReleaseSerialOrder 获取失败, error:"+err.Error()+" serialOrderId:"+serialOrderStatus.SerialOrderId, "release id:"+releaseId) + _ = session.Rollback() + return grmi.NewBusinessError("获取打印条码流水号失败, error:" + err.Error()) + } + if existPrintHead != nil { + continue + } else { + next = true + break + } } article, exist := artMap[serialOrder.ArtId] if !exist { @@ -435,7 +451,7 @@ func (tasksrv *TaskSrv) ReleaseSerialOrder(relQty int, releaseId string) (err er PrintHeadId: printID, Pos: 6, VarName: "$shift$", - VarValue: "E", + VarValue: serialOrder.OrderType1, } pd7 := baseModel.PrintDetail{ PrintHeadId: printID, diff --git a/web/controllers/om/WorkOrder.rest.go b/web/controllers/om/WorkOrder.rest.go index ade0254..c929638 100644 --- a/web/controllers/om/WorkOrder.rest.go +++ b/web/controllers/om/WorkOrder.rest.go @@ -693,4 +693,92 @@ func RegisterSelectUnReleaseWorkOrder(party router.Party, path string, method fu } supports.Ok(ctx, supports.OptionSuccess, result) }) +} + + +/****************************************************************************** + * + * @Function Name : RegisterGetUnCompletedSerialOrder + *----------------------------------------------------------------------------- + * + * @Description : 为一个查找状态>= 26 <80的serialOrder的方法注册路由 + * + * @Function Parameters : 路由分组 + * + * @Function Parameters : 路径 + * + * @Function Parameters : 实际处理请求的方法 + * + * @Author : zhangxin + * + * @Date : 2021-09-26 + * + ******************************************************************************/ +func RegisterGetUnCompletedSerialOrder(party router.Party, path string, method func(*models.Usertab, string) (*[]model.VOmSerialorder, error)) { + + party.Get(path, func(ctx iris.Context) { + user, ok := jwts.ParseToken(ctx) + if !ok { + supports.Error(ctx, iris.StatusBadRequest, supports.ParseParamsFailur, nil) + return + } + + workOrderId := ctx.URLParam("workOrderId") + if workOrderId == "" { + supports.Error(ctx, iris.StatusBadRequest, "未获取到workOrderId", nil) + return + } + result, err := method(user, workOrderId) + if err != nil { + supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil) + return + } + if result == nil { + supports.Error(ctx, iris.StatusNotFound, supports.NotFound, nil) + return + } + supports.Ok(ctx, supports.OptionSuccess, result) + }) +} + +/****************************************************************************** + * + * @Function Name : RegisterGetUnCompletedSerialOrder + *----------------------------------------------------------------------------- + * + * @Description : 为一个取消状态>= 26 <80的serialOrder的方法注册路由 + * + * @Function Parameters : 路由分组 + * + * @Function Parameters : 路径 + * + * @Function Parameters : 实际处理请求的方法 + * + * @Author : zhangxin + * + * @Date : 2021-09-26 + * + ******************************************************************************/ +func RegisterCancelUnCompletedSerialOrder(party router.Party, path string, method func(*models.Usertab, []string) error) { + + party.Post(path, func(ctx iris.Context) { + user, ok := jwts.ParseToken(ctx) + if !ok { + supports.Error(ctx, iris.StatusBadRequest, supports.ParseParamsFailur, nil) + return + } + + var serialOrderIdLi []string + if err := ctx.ReadJSON(&serialOrderIdLi); err != nil { + supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil) + return + } + err := method(user, serialOrderIdLi) + if err != nil { + supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil) + return + } + + supports.Ok(ctx, supports.OptionSuccess, nil) + }) } \ No newline at end of file diff --git a/web/controllers/om/om.go b/web/controllers/om/om.go index f725ded..a7fd3cc 100644 --- a/web/controllers/om/om.go +++ b/web/controllers/om/om.go @@ -161,6 +161,10 @@ func RegisterRoutes() { RegisterSortWorkOrder(workorder, "/sort", serviceOfWorkOrder.SortWorkOrder) // 获取所有的未派工work order RegisterSelectUnReleaseWorkOrder(workorder, "/getunrelease", serviceOfWorkOrder.SelectUnReleaseWorkOrder) + // 获取所有的>= 26 <80 serialOrder + RegisterGetUnCompletedSerialOrder(workorder, "/getuncomplete", serviceOfWorkOrder.SelectWorkOrderUnCompletedSerialOrder) + // 取消>= 26 <80 serialOrder + RegisterCancelUnCompletedSerialOrder(workorder, "/canceluncomplete", serviceOfWorkOrder.CancelUnCompletedSerialOrder) // WorkOrderStatus的路由组 workorderstatus := party.Party("/workorderstatus")