|
|
@ -277,7 +277,7 @@ func (impl *CustOrderServiceImplement) Dashboard(user *global.User, workLineId s |
|
|
|
|
|
|
|
var err1, err2, err3, err4, err5, err6, err7, err8 error |
|
|
|
var wg sync.WaitGroup |
|
|
|
wg.Add(8) |
|
|
|
wg.Add(7) |
|
|
|
//图例001
|
|
|
|
go func(wg *sync.WaitGroup) { |
|
|
|
DashboardData.DashboardDataPic1, err1 = impl.SelectPic1(user, dayModel, workLineId, startTime, endTime, useDayStartTime, jPHPercent) |
|
|
@ -311,12 +311,9 @@ func (impl *CustOrderServiceImplement) Dashboard(user *global.User, workLineId s |
|
|
|
DashboardData.DefectPackOrder, err7 = impl.SelectDefectPackOrder(user, workLineId, startTime, endTime) |
|
|
|
wg.Done() // 操作完成,减少一个计数
|
|
|
|
}(&wg) |
|
|
|
go func(wg *sync.WaitGroup) { |
|
|
|
DashboardData.DashboardOEE, err8 = impl.SelectOee(user, dayModel, workLineId, startTime, endTime, useDayStartTime) |
|
|
|
wg.Done() // 操作完成,减少一个计数
|
|
|
|
}(&wg) |
|
|
|
|
|
|
|
wg.Wait() |
|
|
|
DashboardData.DashboardOEE, err8 = impl.SelectOee(user, dayModel, workLineId, startTime, endTime, useDayStartTime, DashboardData.DashboardDataPic4.Current, DashboardData.DashboardDataPic3.CompleteNumber, DashboardData.DashboardDataPic4.Target) |
|
|
|
|
|
|
|
if err1 != nil { |
|
|
|
return nil, err1 |
|
|
|
} |
|
|
@ -1379,7 +1376,7 @@ func (impl *CustOrderServiceImplement) SelectPic1(user *global.User, dayModel *b |
|
|
|
} |
|
|
|
|
|
|
|
//图例Oee
|
|
|
|
func (impl *CustOrderServiceImplement) SelectOee(user *global.User, dayModel *baseModel.DayModel, workLineId string, startTime, endTime, dayStartTime time.Time) (result model.DashboardOEE, err error) { |
|
|
|
func (impl *CustOrderServiceImplement) SelectOee(user *global.User, dayModel *baseModel.DayModel, workLineId string, startTime, endTime, dayStartTime time.Time, onDutyTo int, onDutyBeatAchieved int, target int) (result model.DashboardOEE, err error) { |
|
|
|
engine := db.Eloquent.Master() |
|
|
|
session := engine.NewSession() |
|
|
|
defer session.Close() |
|
|
@ -1387,14 +1384,14 @@ func (impl *CustOrderServiceImplement) SelectOee(user *global.User, dayModel *ba |
|
|
|
Slaves := db.Eloquent.Slaves() |
|
|
|
sessionSlaves := Slaves[1].NewSession() |
|
|
|
defer sessionSlaves.Close() |
|
|
|
custOrderDao := dal.NewCustOrderDAO(session, user.PlantNr, user.UserId) |
|
|
|
downDao := dal.NewDownTimeRecordDAO(sessionSlaves, user.PlantNr, user.UserId) |
|
|
|
packOrderDao := jitDal.NewPackOrderDAO(session, user.PlantNr, user.UserId) |
|
|
|
productFamilyDao := meDal.NewProductFamilyDAO(session, user.PlantNr, user.UserId) |
|
|
|
packOrderItemDao := jitDal.NewPackOrderItemLstDAO(session, user.PlantNr, user.UserId) |
|
|
|
workLineDao := baseDal.NewWorkLineDAO(session, user.PlantNr, user.UserId) |
|
|
|
productFamilyMeterMap := make(map[string]float64) |
|
|
|
|
|
|
|
packOrderItemDao := jitDal.NewPackOrderItemLstDAO(session, user.PlantNr, user.UserId) |
|
|
|
if onDutyBeatAchieved >= target { |
|
|
|
onDutyBeatAchieved = target |
|
|
|
} |
|
|
|
glog.InfoExtln("dashboard记录", "onDutyTo:", onDutyTo) |
|
|
|
glog.InfoExtln("dashboard记录", "onDutyBeatAchieved:", onDutyBeatAchieved) |
|
|
|
timeModelList := impl.InitDayModelList(dayModel, dayStartTime) |
|
|
|
downList, err := downDao.Select([]grmi.Predicate{ |
|
|
|
meta.DownTimeRecord_WorkLineId.NewPredicate(grmi.Equal, workLineId), |
|
|
@ -1420,145 +1417,13 @@ func (impl *CustOrderServiceImplement) SelectOee(user *global.User, dayModel *ba |
|
|
|
} |
|
|
|
//停工工时
|
|
|
|
result.OccurrenceTimes = stopTimeOnDuty |
|
|
|
workLineLi, err := workLineDao.Select([]grmi.Predicate{baseMeta.WorkLine_GroupLineId.NewPredicate(grmi.Equal, workLineId)}, nil) |
|
|
|
if err != nil { |
|
|
|
return result, grmi.NewBusinessError("查询工厂产线数据失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
if len(workLineLi) == 0 { |
|
|
|
return result, grmi.NewBusinessError("未查询到实体产线") |
|
|
|
} |
|
|
|
var workLineIds []string |
|
|
|
for _, v := range workLineLi { |
|
|
|
workLineIds = append(workLineIds, v.WorkLineid) |
|
|
|
} |
|
|
|
packOrderLi, err := packOrderDao.SelectClosedPackOrder(startTime.Format(grmi.DateTimeOutFormat), endTime.Format(grmi.DateTimeOutFormat), workLineIds) |
|
|
|
if err != nil { |
|
|
|
return result, grmi.NewBusinessError("查询包装单数据失败") |
|
|
|
} |
|
|
|
usefulPackOrderLi := make([]jitModel.PackOrder, 0) |
|
|
|
for _, packOrder := range packOrderLi { |
|
|
|
var custOrderId string |
|
|
|
var notOneCustOrder bool |
|
|
|
if len(packOrder.PackOrderItemLstLi) == 0 { |
|
|
|
continue |
|
|
|
} |
|
|
|
for index, packOrderItem := range packOrder.PackOrderItemLstLi { |
|
|
|
if index == 0 { |
|
|
|
custOrderId = packOrderItem.SerialOrder.CustOrderId |
|
|
|
continue |
|
|
|
} |
|
|
|
if custOrderId != packOrderItem.SerialOrder.CustOrderId { |
|
|
|
notOneCustOrder = true |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
|
if !notOneCustOrder { |
|
|
|
usefulPackOrderLi = append(usefulPackOrderLi, packOrder) |
|
|
|
} |
|
|
|
} |
|
|
|
custOrderMap := make(map[string]model.CustOrder) |
|
|
|
displayHourMap := make(map[int]interface{}) |
|
|
|
displayHourProductMap := make(map[int][]model.HourProductData) |
|
|
|
for _, packOrder := range usefulPackOrderLi { |
|
|
|
hour := packOrder.CloseTime.Restore().Hour() |
|
|
|
_, exist := displayHourMap[hour] |
|
|
|
if !exist { |
|
|
|
displayHourMap[hour] = nil |
|
|
|
displayHourProductMap[hour] = make([]model.HourProductData, 0) |
|
|
|
} |
|
|
|
producedLi := displayHourProductMap[hour] |
|
|
|
if packOrder.PackOrderItemLstLi[0].SerialOrder.CustOrderId == "" { |
|
|
|
continue |
|
|
|
} |
|
|
|
custOrder, exist := custOrderMap[packOrder.PackOrderItemLstLi[0].SerialOrder.CustOrderId] |
|
|
|
if !exist { |
|
|
|
custOrderP, err := custOrderDao.SelectOne(packOrder.PackOrderItemLstLi[0].SerialOrder.CustOrderId) |
|
|
|
if err != nil { |
|
|
|
return result, grmi.NewBusinessError("查询客户订单失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
if custOrderP == nil { |
|
|
|
return result, grmi.NewBusinessError("客户订单不存在, 客户订单ID:" + packOrder.PackOrderItemLstLi[0].SerialOrder.CustOrderId) |
|
|
|
} |
|
|
|
custOrderMap[packOrder.PackOrderItemLstLi[0].SerialOrder.CustOrderId] = *custOrderP |
|
|
|
custOrder = *custOrderP |
|
|
|
productFamily, err := productFamilyDao.SelectOne(custOrder.ProductFamilyId) |
|
|
|
if err != nil { |
|
|
|
return result, grmi.NewBusinessError("查询派生数据失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
if productFamily == nil { |
|
|
|
return result, grmi.NewBusinessError("客户订单派生不存在, 派生ID:" + custOrder.ProductFamilyId) |
|
|
|
} |
|
|
|
if productFamily.Jph == 0 { |
|
|
|
return result, grmi.NewBusinessError("派生JPH为0 派生ID:" + custOrder.ProductFamilyId) |
|
|
|
} |
|
|
|
productFamilyMeterMap[custOrder.ProductFamilyId] = float64(3600) / productFamily.Jph |
|
|
|
} |
|
|
|
productFamilyId := custOrder.ProductFamilyId |
|
|
|
if len(producedLi) == 0 { |
|
|
|
produceData := model.HourProductData{ |
|
|
|
ProductFamilyId: productFamilyId, |
|
|
|
Qty: 1, |
|
|
|
LastDoneTime: packOrder.CloseTime.Restore(), |
|
|
|
} |
|
|
|
producedLi = append(producedLi, produceData) |
|
|
|
} else { |
|
|
|
lastProduceData := producedLi[len(producedLi)-1] |
|
|
|
if lastProduceData.ProductFamilyId == productFamilyId { |
|
|
|
lastProduceData.Qty += 1 |
|
|
|
if lastProduceData.LastDoneTime.Before(packOrder.CloseTime.Restore()) { |
|
|
|
lastProduceData.LastDoneTime = packOrder.CloseTime.Restore() |
|
|
|
} |
|
|
|
producedLi[len(producedLi)-1] = lastProduceData |
|
|
|
} else { |
|
|
|
produceData := model.HourProductData{ |
|
|
|
ProductFamilyId: productFamilyId, |
|
|
|
Qty: 1, |
|
|
|
LastDoneTime: packOrder.CloseTime.Restore(), |
|
|
|
} |
|
|
|
producedLi = append(producedLi, produceData) |
|
|
|
} |
|
|
|
} |
|
|
|
displayHourProductMap[hour] = producedLi |
|
|
|
} |
|
|
|
|
|
|
|
//当班达成
|
|
|
|
var onDutyTo float64 |
|
|
|
//当班节拍达成
|
|
|
|
var onDutyBeatAchieved float64 |
|
|
|
//当班不良
|
|
|
|
var onDutyBad int |
|
|
|
for hour := 0; hour < 48; hour++ { |
|
|
|
hourData, exist := displayHourProductMap[hour] |
|
|
|
if !exist { |
|
|
|
continue |
|
|
|
} |
|
|
|
productDataLi := make([]model.HourProductData, 0, len(hourData)) |
|
|
|
for _, data := range hourData { |
|
|
|
productDataLi = append(productDataLi, data) |
|
|
|
} |
|
|
|
//impl.QuickSortProductData(productDataLi)
|
|
|
|
currentTime := dayStartTime.Add(time.Hour * time.Duration(hour)) |
|
|
|
var hourAllUsedTime int |
|
|
|
for _, productFamilyProductData := range productDataLi { |
|
|
|
usedTime := impl.GetUsefulTime(currentTime, productFamilyProductData.LastDoneTime, timeModelList) |
|
|
|
currentTime = productFamilyProductData.LastDoneTime |
|
|
|
hourAllUsedTime += usedTime |
|
|
|
} |
|
|
|
currentTime = dayStartTime.Add(time.Hour * time.Duration(hour)) |
|
|
|
for _, productFamilyProductData := range productDataLi { |
|
|
|
|
|
|
|
usedTime := impl.GetUsefulTime(currentTime, productFamilyProductData.LastDoneTime, timeModelList) |
|
|
|
currentTime = productFamilyProductData.LastDoneTime |
|
|
|
meter := productFamilyMeterMap[productFamilyProductData.ProductFamilyId] |
|
|
|
|
|
|
|
onDutyTo += float64(productFamilyProductData.Qty) |
|
|
|
|
|
|
|
onDutyBeatAchieved += meter * float64(usedTime) |
|
|
|
} |
|
|
|
} |
|
|
|
//2 节拍达成率=当班达成/当班节拍达成
|
|
|
|
if onDutyBeatAchieved > 0 { |
|
|
|
result.Performance = utils.Decimal(onDutyTo/onDutyBeatAchieved*100, 1) |
|
|
|
result.Performance = utils.Decimal(float64(onDutyTo)/float64(onDutyBeatAchieved)*float64(100), 1) |
|
|
|
} |
|
|
|
itemLi, err := packOrderItemDao.SelectNGPackOrderItem(workLineId, startTime.Format(grmi.DateTimeOutFormat), endTime.Format(grmi.DateTimeOutFormat)) |
|
|
|
if err != nil { |
|
|
@ -1571,9 +1436,9 @@ func (impl *CustOrderServiceImplement) SelectOee(user *global.User, dayModel *ba |
|
|
|
onDutyBad = len(packOrderMap) |
|
|
|
//3 良品率=(当班达成-当班不良)/当班达成
|
|
|
|
if onDutyTo > 0 { |
|
|
|
result.Quality = utils.Decimal((onDutyTo-float64(onDutyBad))/onDutyTo*100, 1) |
|
|
|
result.Quality = utils.Decimal((float64(onDutyTo)-float64(onDutyBad))/float64(onDutyTo)*float64(100), 1) |
|
|
|
} |
|
|
|
result.Oee = utils.Decimal(result.Availability*result.Performance*result.Quality*100, 1) |
|
|
|
result.Oee = utils.Decimal(result.Availability*result.Performance*result.Quality/10000, 1) |
|
|
|
return result, nil |
|
|
|
} |
|
|
|
|
|
|
|