Browse Source

添加解析excel时解析日期

pull/181/head
zhangxin 2 years ago
parent
commit
7562ed0750
3 changed files with 194 additions and 45 deletions
  1. +40
    -0
      dao/pln/CustOrder.dao.go
  2. +27
    -0
      dao/pln/implments/CustOrder.dao.impl.go
  3. +127
    -45
      services/pln/implments/CustOrder.service.impl.go

+ 40
- 0
dao/pln/CustOrder.dao.go View File

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


+ 27
- 0
dao/pln/implments/CustOrder.dao.impl.go View File

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

+ 127
- 45
services/pln/implments/CustOrder.service.impl.go View File

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


Loading…
Cancel
Save