From 7562ed0750a9fca273c09e1cd73694944571cd75 Mon Sep 17 00:00:00 2001 From: zhangxin Date: Tue, 29 Mar 2022 20:42:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=A3=E6=9E=90excel?= =?UTF-8?q?=E6=97=B6=E8=A7=A3=E6=9E=90=E6=97=A5=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/pln/CustOrder.dao.go | 40 ++++ dao/pln/implments/CustOrder.dao.impl.go | 27 +++ .../pln/implments/CustOrder.service.impl.go | 172 +++++++++++++----- 3 files changed, 194 insertions(+), 45 deletions(-) diff --git a/dao/pln/CustOrder.dao.go b/dao/pln/CustOrder.dao.go index eacd750..750c290 100644 --- a/dao/pln/CustOrder.dao.go +++ b/dao/pln/CustOrder.dao.go @@ -393,6 +393,46 @@ type CustOrderDAO interface { * ******************************************************************************/ SelectProduceOrder(start, end string) ([]model.CustOrderData, error) + /****************************************************************************** + * + * @Function Name : SelectCrossDayCustOrder + *----------------------------------------------------------------------------- + * + * @Description : 查询是否有跨天的客户订单 + * + * @Function Parameters : 当天的截止时间 + * + * @Return Value : 查找到的CustOrder + * + * @Return Value : 执行时发生的错误 + * + * @Author : zhangxin + * + * @Date : 2022-03-29 + * + ******************************************************************************/ + SelectCrossDayCustOrder(end string) ([]model.CustOrder, error) + /****************************************************************************** + * + * @Function Name : SelectCurrentDayCustOrder + *----------------------------------------------------------------------------- + * + * @Description : 查询当天的客户订单 + * + * @Function Parameters : 当天的开始时间 + * + * @Function Parameters : 当天的截止时间 + * + * @Return Value : 查找到的CustOrder + * + * @Return Value : 执行时发生的错误 + * + * @Author : zhangxin + * + * @Date : 2022-03-29 + * + ******************************************************************************/ + SelectCurrentDayCustOrder(start, end string) ([]model.CustOrder, error) } /****************************************************************************** diff --git a/dao/pln/implments/CustOrder.dao.impl.go b/dao/pln/implments/CustOrder.dao.impl.go index 92c2713..023d92e 100644 --- a/dao/pln/implments/CustOrder.dao.impl.go +++ b/dao/pln/implments/CustOrder.dao.impl.go @@ -817,4 +817,31 @@ func (impl *CustOrderDAOImplement) SelectProduceOrder(start, end string) ([]mode data := make([]model.CustOrderData, 0) err := session.Where(where, parameters...).Find(&data) return data, err +} + +// SelectCrossDayCustOrder 查询是否有跨天的客户订单 +func (impl *CustOrderDAOImplement) SelectCrossDayCustOrder(end string) ([]model.CustOrder, error) { + parameters := []interface{}{impl.plantNr, end, end} + where := fmt.Sprintf("%s = ? and %s < ? and %s >= ? ", + meta.CustOrder_PlantNr.ColumnName, + meta.CustOrder_PlanStartTime.ColumnName, + meta.CustOrder_PlanEndTime.ColumnName, + ) + data := make([]model.CustOrder, 0) + err := impl.session.Table(impl.meta.TableName).Where(where, parameters...).Find(&data) + return data, err +} + + +// SelectCurrentDayCustOrder 查询当天的客户订单 +func (impl *CustOrderDAOImplement) SelectCurrentDayCustOrder(start, end string) ([]model.CustOrder, error) { + parameters := []interface{}{impl.plantNr, end, start} + where := fmt.Sprintf("%s = ? and %s < ? and %s > ? ", + meta.CustOrder_PlantNr.ColumnName, + meta.CustOrder_PlanEndTime.ColumnName, + meta.CustOrder_PlanEndTime.ColumnName, + ) + data := make([]model.CustOrder, 0) + err := impl.session.Table(impl.meta.TableName).Where(where, parameters...).Desc(meta.CustOrder_PlanEndTime.Name).Find(&data) + return data, err } \ No newline at end of file diff --git a/services/pln/implments/CustOrder.service.impl.go b/services/pln/implments/CustOrder.service.impl.go index 845104e..96426ac 100644 --- a/services/pln/implments/CustOrder.service.impl.go +++ b/services/pln/implments/CustOrder.service.impl.go @@ -3725,10 +3725,11 @@ func (impl *CustOrderServiceImplement) AnalysisPlanFromExcel(user *global.User, if err != nil { return grmi.NewBusinessError("读取Sheet1页失败, error:" + err.Error()) } + today, _ := time.ParseInLocation(grmi.DateTimeOutFormat, time.Now().Format(grmi.DateOutFormat) + " 00:00:00", utils.TimezoneLocation) rowIndex := 0 projectMap := make(map[string]*meModel.Project) productFamilyMap := make(map[string]*meModel.ProductFamily) - custOrderLi := make([]model.CustOrder, 0) + planDateCustOrderMap := make(map[string][]model.CustOrder, 0) for rowsIterator.Next() { rowIndex++ // 第一行标题行 @@ -3744,7 +3745,7 @@ func (impl *CustOrderServiceImplement) AnalysisPlanFromExcel(user *global.User, if err != nil { return grmi.NewBusinessError("去读excel行数据失败, error:" + err.Error()) } - if len(row) != 3 { + if len(row) != 4 { return grmi.NewBusinessError("excel数据列数不合规, 行数:" + strconv.Itoa(rowIndex)) } productFamilyId := row[0] @@ -3756,6 +3757,14 @@ func (impl *CustOrderServiceImplement) AnalysisPlanFromExcel(user *global.User, if qty == 0 { return grmi.NewBusinessError("需求数量为0, 行数:" + strconv.Itoa(rowIndex)) } + planDateStr := row[3] + planDate, err := time.ParseInLocation(grmi.DateOutFormat, planDateStr, utils.TimezoneLocation) + if err != nil { + return grmi.NewBusinessError("解析计划日期失败, 行数:" + strconv.Itoa(rowIndex)) + } + if planDate.Before(today) { + return grmi.NewBusinessError("计划日期不能早于今天") + } productFamily, exist := productFamilyMap[productFamilyId] if !exist { productFamily, err = productFamilyDao.SelectOne(productFamilyId) @@ -3791,35 +3800,128 @@ func (impl *CustOrderServiceImplement) AnalysisPlanFromExcel(user *global.User, PlanQty: qty, WorkLineId: productFamily.WorkLineId, QuantityPerHour: int(productFamily.Jph), + PlanStartDate: grmi.Date(planDate), + PlanEndDate: grmi.Date(planDate), + } + planDateCustOrderMap[planDate.Format(grmi.DateOutFormat)] = append(planDateCustOrderMap[planDate.Format(grmi.DateOutFormat)], custOrder) + } + // 计算计划时间 + // 如果根据所有的jph当天时间够用 根据jph进行分配时间 如果不够根据数量占用所有时间 + // 查询当天是否有计划客户订单 + for planDate, custOrderLi := range planDateCustOrderMap { + dayStartTime := planDate + " 00:00:00" + dayEndTime := planDate + " 23:59:59" + existCustOrderLi, err := custOrderDao.SelectCrossDayCustOrder(dayEndTime) + if err != nil { + return grmi.NewBusinessError("查询已存在的客户订单数据失败, 错误:" + err.Error()) + } + if len(existCustOrderLi) != 0 { + return grmi.NewBusinessError("计划日期中存在跨天的客户订单,无法计划客户订单, 日期:" + planDate) + } + existCustOrderLi, err = custOrderDao.SelectCurrentDayCustOrder(dayStartTime, dayEndTime) + if err != nil { + return grmi.NewBusinessError("查询已存在的客户订单数据失败, 错误:" + err.Error()) + } + var startPlanTime time.Time + // 如果当天没有客户订单 使用的开始时间从0点开始 + if len(existCustOrderLi) == 0 { + startPlanTime, _ = time.ParseInLocation(grmi.DateTimeOutFormat, dayStartTime, utils.TimezoneLocation) + } else { + startPlanTime = existCustOrderLi[0].PlanEndTime.Restore() + } + if startPlanTime.Before(time.Now()) { + startPlanTime = time.Now() + } + // 按照jph计算当时的时间 + useTimeMap := make(map[int]int) + var allUsedSeconds int + var allQty int + for index, custOrder := range custOrderLi { + jph := productFamilyMap[custOrder.ProductFamilyId].Jph + planQty := custOrder.PlanQty + useSeconds := 3600 / int(jph) * planQty + useTimeMap[index] = useSeconds + allUsedSeconds += useSeconds + allQty += custOrder.PlanQty + } + endPlanTme := startPlanTime.Add(time.Second * time.Duration(allUsedSeconds)) + // 如果计算结束时间大于当天则时间剩余时间分配 如果没有大于当天则时间计划时间 + endDayTime, _ := time.ParseInLocation(grmi.DateTimeOutFormat, dayEndTime, utils.TimezoneLocation) + prePlanEndTime := startPlanTime + if endPlanTme.After(endDayTime) { + // 当天还可以使用的时间 + CanUsedTime := endDayTime.Sub(startPlanTime).Seconds() + // 没台套使用的时间 单位s + perCarUsedTime := int(CanUsedTime) / allQty + if perCarUsedTime < 60 { + return grmi.NewBusinessError("分配给每个台套的时间已不足一分钟, 日期:" + planDate) + } + for index, custOrder := range custOrderLi { + custOrder.PlanStartTime = grmi.DateTime(prePlanEndTime) + custOrder.PlanEndTime = grmi.DateTime(prePlanEndTime.Add(time.Duration(custOrder.PlanQty * perCarUsedTime) * time.Second)) + prePlanEndTime = custOrder.PlanEndTime.Restore() + custOrderLi[index] = custOrder + } + } else { + for index, custOrder := range custOrderLi { + custOrder.PlanStartTime = grmi.DateTime(prePlanEndTime) + usedTime := useTimeMap[index] + custOrder.PlanEndTime = grmi.DateTime(prePlanEndTime.Add(time.Duration(usedTime) * time.Second)) + prePlanEndTime = custOrder.PlanEndTime.Restore() + custOrderLi[index] = custOrder + } } - custOrderLi = append(custOrderLi, custOrder) + planDateCustOrderMap[planDate] = custOrderLi } if err = session.Begin(); err != nil { return grmi.NewBusinessError("开启事务失败, 错误:" + err.Error()) } - custOrderStatusLi := make([]model.CustOrderStatus, 0, 20) - custOrderQtyLi := make([]model.CustOrderQty, 0, 20) - tempCustOrderLi := make([]model.CustOrder, 0, 20) - for index, custOrder := range custOrderLi { - project := projectMap[custOrder.ProjectId] - custOrderId, err := snrDao.GetNextSnr(project.CustOrderSnr) - if err != nil { - _ = session.Rollback() - return grmi.NewBusinessError("获取客户订单流水号失败, 错误:" + err.Error()) - } - custOrder.CustOrderId = custOrderId - custOrderStatus := model.CustOrderStatus{ - CustOrderId: custOrderId, - Status: baseModel.WO_STATUS_UNPLANNED, - } - custOrderStatusLi = append(custOrderStatusLi, custOrderStatus) - custOrderQty := model.CustOrderQty{ - CustOrderId: custOrderId, - PlanQty: custOrder.PlanQty, + + for _, custOrderLi := range planDateCustOrderMap { + custOrderStatusLi := make([]model.CustOrderStatus, 0, 20) + custOrderQtyLi := make([]model.CustOrderQty, 0, 20) + tempCustOrderLi := make([]model.CustOrder, 0, 20) + for index, custOrder := range custOrderLi { + project := projectMap[custOrder.ProjectId] + custOrderId, err := snrDao.GetNextSnr(project.CustOrderSnr) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("获取客户订单流水号失败, 错误:" + err.Error()) + } + custOrder.CustOrderId = custOrderId + custOrderStatus := model.CustOrderStatus{ + CustOrderId: custOrderId, + Status: baseModel.WO_STATUS_PLANNED, + } + custOrderStatusLi = append(custOrderStatusLi, custOrderStatus) + custOrderQty := model.CustOrderQty{ + CustOrderId: custOrderId, + PlanQty: custOrder.PlanQty, + } + custOrderQtyLi = append(custOrderQtyLi, custOrderQty) + tempCustOrderLi = append(tempCustOrderLi, custOrder) + if index != 0 && index % 20 == 0 { + err = custOrderDao.Insert(&tempCustOrderLi) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("保存客户订单数据失败, 错误:" + err.Error()) + } + err = custOrderStatusDao.Insert(&custOrderStatusLi) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("保存客户订单状态数据失败, 错误:" + err.Error()) + } + err = custOrderQtyDao.Insert(&custOrderQtyLi) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("保存客户订单数据量数据失败, 错误:" + err.Error()) + } + custOrderStatusLi = make([]model.CustOrderStatus, 0, 20) + custOrderQtyLi = make([]model.CustOrderQty, 0, 20) + tempCustOrderLi = make([]model.CustOrder, 0, 20) + } } - custOrderQtyLi = append(custOrderQtyLi, custOrderQty) - tempCustOrderLi = append(tempCustOrderLi, custOrder) - if index != 0 && index % 20 == 0 { + if len(tempCustOrderLi) != 0 { err = custOrderDao.Insert(&tempCustOrderLi) if err != nil { _ = session.Rollback() @@ -3835,26 +3937,6 @@ func (impl *CustOrderServiceImplement) AnalysisPlanFromExcel(user *global.User, _ = session.Rollback() return grmi.NewBusinessError("保存客户订单数据量数据失败, 错误:" + err.Error()) } - custOrderStatusLi = make([]model.CustOrderStatus, 0, 20) - custOrderQtyLi = make([]model.CustOrderQty, 0, 20) - tempCustOrderLi = make([]model.CustOrder, 0, 20) - } - } - if len(tempCustOrderLi) != 0 { - err = custOrderDao.Insert(&tempCustOrderLi) - if err != nil { - _ = session.Rollback() - return grmi.NewBusinessError("保存客户订单数据失败, 错误:" + err.Error()) - } - err = custOrderStatusDao.Insert(&custOrderStatusLi) - if err != nil { - _ = session.Rollback() - return grmi.NewBusinessError("保存客户订单状态数据失败, 错误:" + err.Error()) - } - err = custOrderQtyDao.Insert(&custOrderQtyLi) - if err != nil { - _ = session.Rollback() - return grmi.NewBusinessError("保存客户订单数据量数据失败, 错误:" + err.Error()) } } _ = session.Commit()