Browse Source

保温箱状态,判断冰排是否可以出库

huangyan 7 months ago
parent
commit
1b9e12e1dc

+ 34 - 0
app/admin/controller/cooler_box.go

@@ -642,3 +642,37 @@ func (e CoolerBoxController) CoolerBoxStarTime(c *gin.Context) {
 	}
 	e.OK(req, "提交成功")
 }
+
+// CoolerBoxEndUse 保温箱结束使用
+// @Summary 保温箱结束使用
+// @Description 保温箱结束使用
+// @Tags 保温箱
+// @Accept  application/json
+// @Product application/json
+// @Param data body dto.IceRaftRecordEedReq true "body"
+// @Success 200 {string} string	"{"code": 200, "message": "提交成功"}"
+// @Success 200 {string} string	"{"code": -1, "message": "提交成功"}"
+// @Router /api/coolerBoxEndUse [post]
+// @Security Bearer
+func (e CoolerBoxController) CoolerBoxEndUse(c *gin.Context) {
+	s := service.CoolerBox{}
+	req := dto.IceStartbleForColfTimReq{}
+	err := e.MakeContext(c).
+		MakeOrm().
+		Bind(&req, binding.JSON, nil).
+		MakeService(&s.Service).
+		Errors
+	if err != nil {
+		e.Logger.Error(err)
+		e.Error(500, err, err.Error())
+		return
+	}
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c)
+	err = s.CoolerBoxEndUse(&req, p)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+	e.OK(req, "提交成功")
+}

+ 17 - 13
app/admin/controller/ice_raft.go

@@ -5,6 +5,7 @@ import (
 	"cold-delivery/app/admin/service"
 	"cold-delivery/app/admin/service/dto"
 	"cold-delivery/common/actions"
+	global2 "cold-delivery/common/global"
 	"encoding/json"
 	"fmt"
 	"github.com/beego/beego/v2/core/logs"
@@ -462,13 +463,17 @@ func (e IceRaftController) IsOutStorage(c *gin.Context) {
 		e.Error(500, err, err.Error())
 		return
 	}
-
 	//数据权限检查
 	p := actions.GetPermissionFromContext(c)
 	err, str := s.IsOutStorage(&req, p)
 	if err != nil {
-		e.Error(500, err, err.Error())
-		return
+		if len(str) > 0 {
+			e.Error(1201, err, err.Error())
+			return
+		} else {
+			e.Error(500, err, err.Error())
+			return
+		}
 	}
 	e.OK(nil, str)
 }
@@ -739,7 +744,7 @@ func (e IceRaftRecordController) ExportExecl(c *gin.Context) {
 		f.SetCellValue("Sheet1", "A1", "序号")
 		f.SetCellValue("Sheet1", "B1", "冰排编号")
 		f.SetCellValue("Sheet1", "C1", "预冷日期")
-		f.SetCellValue("Sheet1", "D1", "预冷时间")
+		f.SetCellValue("Sheet1", "D1", "预冷时间(小时)")
 		f.SetCellValue("Sheet1", "E1", "预冷温度")
 		f.SetCellValue("Sheet1", "F1", "预冷地点")
 		f.SetCellValue("Sheet1", "G1", "操作人员")
@@ -767,23 +772,22 @@ func (e IceRaftRecordController) ExportExecl(c *gin.Context) {
 			line++
 			start, _ := time.Parse("2006-01-02 15:04:05", v.IceUseTime.String())
 			end, _ := time.Parse("2006-01-02 15:04:05", v.StartIceColdTime.String())
-			sub := start.Sub(end).String()
+			duration := global2.FormatDuration(start, end)
 			parse, _ := time.Parse("2006-01-02 15:04:05", v.UpdatedAt.String())
-			s2 := parse.Sub(end).String()
+			formatDuration := global2.FormatDuration(parse, end)
 			f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), i+1)
-			f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.Code)
+			f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.IceRafts.Code)
 			f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.StartIceColdTime)
-			f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), sub)
+			f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), duration)
 			f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.SuitableForCold)
 			f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.IceColdAddress)
 			f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.IceColdUsers)
 			f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.IceUseTime)
-			f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), s2)
+			f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), formatDuration)
 			f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), v.IceUseUsers)
 			f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), "")
 		}
 	} else {
-
 		// 这里设置表头ÒÒ
 		f.SetCellValue("Sheet1", "A1", "序号")
 		f.SetCellValue("Sheet1", "B1", "冰排编号")
@@ -809,12 +813,12 @@ func (e IceRaftRecordController) ExportExecl(c *gin.Context) {
 			line++
 			start, _ := time.Parse("2006-01-02 15:04:05", v.IceUseTime.String())
 			parse, _ := time.Parse("2006-01-02 15:04:05", v.UpdatedAt.String())
-			s2 := parse.Sub(start).String()
+			duration := global2.FormatDuration(parse, start)
 			f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), i+1)
-			f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.Code)
+			f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.IceRafts.Code)
 			f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.IceColdUsers)
 			f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.IceUseTime)
-			f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), s2)
+			f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), duration)
 			f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.IceUseUsers)
 			f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), "")
 		}

+ 2 - 2
app/admin/controller/waybill.go

@@ -99,7 +99,7 @@ func (e WaybillController) GetPage(c *gin.Context) {
 			return
 		}
 		list[i].ReCheck.Id = list[i].ReCheckId
-		list[i].ReCheck.NickName = ReCheckuser.Username
+		list[i].ReCheck.NickName = ReCheckuser.NickName
 		list[i].ReCheck.Phone = ReCheckuser.Phone
 	}
 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
@@ -922,7 +922,7 @@ func (e WaybillController) SecondaryDistribution(c *gin.Context) {
 		e.Error(500, err, err.Error())
 		return
 	}
-	e.OK(req, "分配成功")
+	e.OK(req.WaybillNo, "分配成功")
 }
 
 // GetCustomerPage 获取客户运单列表

+ 2 - 0
app/admin/model/cooler_box.go

@@ -20,6 +20,8 @@ type CoolerBox struct {
 	ColdSpots        string                  `json:"cold_spots"`                                           //遇冷地点
 	ColdTemperatures string                  `json:"cold_temperatures"`                                    //遇冷温度
 	DeviceData       natsModel.DeviceData_R2 `json:"deviceData" gorm:"-"`
+	MonitorStatus    int                     `json:"monitorStatus" gorm:"comment:监控状态"` // 监控状态 0-未监控 1-监控中
+	UseStatus        string                  `json:"useStatus" gorm:"-"`
 	model2.ControlBy
 	model2.ModelTime
 	model2.DeptBy

+ 5 - 0
app/admin/model/drug.go

@@ -18,4 +18,9 @@ type Drug struct {
 	Ent_name              string `json:"ent_name" gorm:"size:128;comment:企业名称"`
 	Code                  string `json:"code" gorm:"size:128;comment:药品编码"`
 	Count                 int    `json:"count" gorm:"size:128;comment:数量"`
+	IsAssignment          bool   `json:"isAssignment" gorm:"default:false;comment:是否分配"`
+}
+
+func (Drug) TableName() string {
+	return "drug"
 }

+ 4 - 2
app/admin/model/ice_raft.go

@@ -23,8 +23,9 @@ type IceRaft struct {
 	model2.DeptBy
 }
 type IceRaftOmit struct {
-	Id   int    `json:"id,omitempty"`   // 主键编码
-	Code string `json:"code,omitempty"` // 商品名称
+	Id    int    `json:"id,omitempty"`                     // 主键编码
+	Code  string `json:"code,omitempty"`                   // 商品名称
+	Label string `json:"label" gorm:"size:128;comment:标签"` // 标签
 }
 
 func (IceRaft) TableName() string {
@@ -89,6 +90,7 @@ type IceRaftRecord struct {
 	IceLocker         IceLockerOmit    `json:"iceLocker" gorm:"->"`
 	CoolerBox         CoolerBoxOmit    `json:"coolerBox" gorm:"->"`
 	CoolerBoxRecord   CoolerBoxRecord  `json:"coolerBoxRecord" gorm:"-"`
+	IceRafts          IceRaftOmit      `json:"iceRafts" gorm:"-"`
 	model2.ControlBy
 	model2.ModelTime
 	model2.DeptBy

+ 1 - 1
app/admin/model/sys_dept.go

@@ -24,7 +24,7 @@ type SysDept struct {
 	IsIceReleaseCold    bool      `json:"isIceReleaseCold" gorm:"type:boolean;default:false"`    //冰排是否释冷
 	IsCoolerReleaseCold bool      `json:"isCoolerReleaseCold" gorm:"type:boolean;default:false"` //保温箱是否释冷
 	IsCoolerShow        bool      `json:"isCoolerShow" gorm:"type:boolean;default:false"`        //保温箱是否展示开始使用时间
-	IsOutStorage        bool      `json:"isOutStorage" gorm:"type:boolean;default:false"`        //是否可以出库
+	IsOutStorage        bool      `json:"isOutStorage" gorm:"type:boolean;default:true"`         //是否可以出库  true 需要验证  false 随时出库
 	Children            []SysDept `json:"children" gorm:"-"`
 	CompanyAddress      string    `json:"companyAddress"` //公司地址
 	model2.ControlBy

+ 2 - 0
app/admin/model/waybill.go

@@ -120,6 +120,8 @@ type Waybill struct {
 	Confirmer                  string            `json:"confirmer" gorm:"size:255;"`                                  // 确认人
 	ConfirmerPhone             string            `json:"confirmerPhone" gorm:"size:255;"`                             // 确认人电话
 	Prescription               model2.StringList `json:"prescription"`                                                // 处方
+	IsChild                    bool              `json:"isChild" gorm:"type:boolean;default:false"`                   //是否属于子订单
+	SecondaryTime              model2.Time       `json:"secondary_time" gorm:"comment:分配时间"`                          //分配时间
 	model2.ControlBy
 	model2.ModelTime
 	model2.DeptBy

+ 1 - 0
app/admin/router/cooler_box.go

@@ -28,5 +28,6 @@ func registerCoolerBoxRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMidd
 		r.GET("/getcoolerboxall", cont.GetCoolerBoxAll)
 		r.POST("/coolerboxstarttime", cont.CoolerBoxStarTime)
 		r.GET("/export-execl", cont.ExportExecl)
+		r.PUT("/coolerBoxEndUse", cont.CoolerBoxEndUse)
 	}
 }

+ 49 - 17
app/admin/service/cooler_box.go

@@ -81,6 +81,7 @@ func (e *CoolerBox) GetPage(c *dto.CoolerBoxGetPageReq, list *[]model.CoolerBox,
 			return global.GetFailedErr
 		}
 		(*list)[i].IceRaft = dataIces
+		e.Orm.Model(&model.CoolerBoxRecord{}).Select("status").Where("cooler_box_id = ?", (*list)[i].Id).Order("cooler_user_time desc").First(&(*list)[i].UseStatus)
 	}
 	//排序
 	sort.SliceStable(*list, func(i, j int) bool {
@@ -477,19 +478,21 @@ func appendUniqueDeviceData(list []nats_server.DeviceData_, newData []nats_serve
 	}
 	for _, d := range newData {
 		if !uniqueMap[d.T_time] {
-			split := strings.Split(d.T_site, ",")
-			defer func() {
-				if r := recover(); r != nil {
-					fmt.Println("数组下标越界:", r)
-				}
-			}()
-			Lng := split[0]
-			Lat := split[1]
-			Lngs, _ := strconv.ParseFloat(Lng, 64)
-			Lats, _ := strconv.ParseFloat(Lat, 64)
-			mLng, mLat := lib.Wgs84ToGcj02(Lngs, Lats)
-			d.T_site = fmt.Sprintf("%v,%v", mLng, mLat)
-			list = append(list, d)
+			if len(d.T_site) > 0 {
+				split := strings.Split(d.T_site, ",")
+				defer func() {
+					if r := recover(); r != nil {
+						fmt.Println("数组下标越界:", r)
+					}
+				}()
+				Lng := split[0]
+				Lat := split[1]
+				Lngs, _ := strconv.ParseFloat(Lng, 64)
+				Lats, _ := strconv.ParseFloat(Lat, 64)
+				mLng, mLat := lib.Wgs84ToGcj02(Lngs, Lats)
+				d.T_site = fmt.Sprintf("%v,%v", mLng, mLat)
+				list = append(list, d)
+			}
 		}
 	}
 	//排序
@@ -551,8 +554,7 @@ func (e *CoolerBox) GetCoolerBoxIceAll(c *dto.GetCoolerBoxIceAll, list *[]model.
 			CollerStartTimeAndEndTimeScopes(c.StartTime, c.EndTime),
 		).
 			Where("status = ?", 2).
-			Find(&list).
-			Count(count).Error
+			Find(&list).Count(count).Error
 	} else {
 		err = e.Orm.Scopes(
 			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
@@ -561,10 +563,9 @@ func (e *CoolerBox) GetCoolerBoxIceAll(c *dto.GetCoolerBoxIceAll, list *[]model.
 			CollerStartTimeAndEndTimeScopes(c.StartTime, c.EndTime),
 		).
 			Where("status = ?", 2).
-			Find(&list).
+			Find(&list).Limit(-1).Offset(-1).Order("cooler_user_time desc").Count(count).
 			Count(count).Error
 	}
-
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
 		if errors.Is(err, gorm.ErrRecordNotFound) {
@@ -652,3 +653,34 @@ func (e *CoolerBox) CoolerBoxStarTime(c *dto.IceStartbleForColfTimReq, p *action
 	}
 	return nil
 }
+
+// 保温箱结束使用
+func (e *CoolerBox) CoolerBoxEndUse(c *dto.IceStartbleForColfTimReq, p *actions.DataPermission) error {
+	var err error
+
+	tx := e.Orm.Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+	//添加保温箱记录
+	for _, v := range c.Id {
+		var cooler model.CoolerBoxRecord
+		var coolerBox model.CoolerBox
+		err = e.Orm.Model(&model.CoolerBox{}).Where("id = ?", v).First(&coolerBox).Error
+		if err != nil {
+			e.Log.Errorf("获取保温箱信息失败: %s", err)
+			return errors.New("获取保温箱信息失败")
+		}
+		//保温箱使用状态变为结束使用
+		err = e.Orm.Model(&cooler).Where("cooler_box_id = ?", v).Update("status", "2").Error
+		if err != nil {
+			e.Log.Errorf("db error: %s", err)
+			return global.CreateFailedErr
+		}
+	}
+	return nil
+}

+ 5 - 4
app/admin/service/dto/cooler_box.go

@@ -9,10 +9,11 @@ import (
 
 type CoolerBoxGetPageReq struct {
 	dto.Pagination `search:"-"`
-	Name           string `form:"name" search:"type:contains;column:name;table:cooler_box"`  // 保温箱
-	Sn             string `form:"sn" search:"type:contains;column:sn;table:cooler_box"`      // sn
-	Status         string `form:"status" search:"type:exact;column:status;table:cooler_box"` // 状态
-	ShowTemp       bool   `form:"showTemp" search:"-"`                                       // 展示最新温度
+	Name           string `form:"name" search:"type:contains;column:name;table:cooler_box"`                    // 保温箱
+	Sn             string `form:"sn" search:"type:contains;column:sn;table:cooler_box"`                        // sn
+	Status         string `form:"status" search:"type:exact;column:status;table:cooler_box"`                   // 状态
+	ShowTemp       bool   `form:"showTemp" search:"-"`                                                         // 展示最新温度
+	MonitorStatus  string `form:"monitorStatus" search:"type:contains;column:monitor_status;table:cooler_box"` // 监控状态
 	CoolerBoxOrder
 }
 

+ 1 - 0
app/admin/service/dto/waybill.go

@@ -173,6 +173,7 @@ type WaybillUpdateReq struct {
 	Remark                  string            `json:"remark"`                  //运输备注
 	CoolerBoxId             int               `json:"coolerBoxId"`             //保温箱id
 	Prescription            model2.StringList `json:"prescription"`
+	Drugs                   []model.Drug      `json:"drugs"` //药品信息
 	model2.ControlBy        `swaggerignore:"true"`
 	model2.DeptBy           `swaggerignore:"true"`
 }

+ 65 - 29
app/admin/service/ice_raft.go

@@ -480,7 +480,6 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 			e.Log.Errorf("db error: %s", err)
 			return errors.New("获取冰排记录失败,请确认冰排是否入库!")
 		}
-
 		if len(iceRaftRecordModel.OutStorageTime.String()) > 0 {
 			err = errors.New(fmt.Sprintf("冰排【%s】已出库,禁止出库!", code))
 			return err
@@ -514,16 +513,12 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 		iceRaftRecordModel.OutStorageTime = model2.Time(time.Now())
 		iceRaftRecordModel.IceUseUsers = user.NickName
 		iceRaftRecordModel.IceUseTime = model2.Time(time.Now())
-		//data, err := nats_server.Read_DeviceTask_List_By_Condition(coolerBoxModel.Sn)
-		//if data.T_State != 1 {
-		//	e.Log.Errorf("该保温箱未启动: %s", err)
-		//	return errors.New("该保温箱未启动,请启动保温箱监控")
-		//}
-		//if err != nil {
-		//	e.Log.Errorf("获取设备任务列表失败: %s", err)
-		//	return errors.New("该保温箱未绑定平台")
-		//}
-		//iceRaftRecordModel.CoolerBoxStarTime = model2.Time(data.T_Ut_start)
+		iceRaftRecordModel.IceRaftId = iceRaftModel.Id
+		if user.Dept.IsIceReleaseCold {
+			iceRaftRecordModel.IsSuitableForCold = 1
+			iceRaftRecordModel.SuitableForCold = iceRaftModel.SuitableForCold
+			iceRaftRecordModel.EndForColdTime = model2.Time(time.Now())
+		}
 		err = tx.Save(&iceRaftRecordModel).Error
 		if err != nil {
 			e.Log.Errorf("db error: %s", err)
@@ -543,24 +538,27 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 	cooler.CoolerUseUsers = user.NickName
 	//查询是否有正在使用中的保温箱记录
 	var count int64
-	err = e.Orm.Model(&model.CoolerBoxRecord{}).Where("id = ?", coolerBoxModel.Id).Where("status = ?", "1").Count(&count).Error
+	var coolerBoxRecordModel model.CoolerBoxRecord
+	err = tx.Model(&model.CoolerBoxRecord{}).Where("cooler_box_id = ?", coolerBoxModel.Id).Where("status = ?", "1").First(&coolerBoxRecordModel).Count(&count).Error
 	if err != nil {
-		e.Log.Errorf("获取保温箱信息失败: %s", err)
-		return errors.New("获取保温箱信息失败")
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			err = e.Orm.Create(&cooler).Error
+			if err != nil {
+				e.Log.Errorf("db 创建保温箱记录失败: %s", err)
+				return errors.New("创建保温箱记录失败")
+			}
+		} else {
+			e.Log.Errorf("获取保温箱信息失败: %s", err)
+			return errors.New("获取保温箱信息失败")
+		}
 	}
 	//如果有正在使用中的保温箱记录,就更新
 	if count > 0 {
-		err = e.Orm.Updates(&cooler).Error
+		err = tx.Where("id = ?", coolerBoxRecordModel.Id).Updates(&cooler).Error
 		if err != nil {
 			e.Log.Errorf("db 更新保温箱记录失败: %s", err)
 			return errors.New("更新保温箱记录失败")
 		}
-	} else {
-		err = e.Orm.Create(&cooler).Error
-		if err != nil {
-			e.Log.Errorf("db 创建保温箱记录失败: %s", err)
-			return errors.New("创建保温箱记录失败")
-		}
 	}
 	return nil
 }
@@ -569,39 +567,69 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 func (e *IceRaft) IsOutStorage(c *dto.IceOutStorageReq, p *actions.DataPermission) (error, string) {
 	var err error
 	var str string
+	msg := make([]string, 0)
+	sussce := make([]string, 0)
+	FreezeDuration := make([]int, 0)
 	// 获取冰排记录
 	for _, v := range c.Code {
 		var iceRaftRecordModel model.IceRaftRecord
 		err = e.Orm.Scopes(actions.Permission(iceRaftRecordModel.TableName(), p)).
 			Where("code = ?", v).
-			Where("status = ?", model.IceRaftRecordStatusFreezing).Or("status = ?", model.IceRaftRecordStatusWaitUse).
+			Where("status = ?", model.IceRaftRecordStatusFreezing).
 			First(&iceRaftRecordModel).Error
 		if err != nil {
-			e.Log.Errorf("db error: %s", err)
-			return errors.New("获取冰排记录失败,请确认冰排是否入库!"), ""
+			if errors.Is(err, gorm.ErrRecordNotFound) {
+				err = e.Orm.Scopes(actions.Permission(iceRaftRecordModel.TableName(), p)).
+					Where("code = ?", v).
+					Where("status = ?", model.IceRaftRecordStatusWaitUse).
+					First(&iceRaftRecordModel).Error
+				if err != nil {
+					e.Log.Errorf("db error: %s", err)
+					return errors.New("当前冰排不存在" + v), ""
+				} else {
+					//记录达到冷冻要求的冰排
+					msg = append(msg, v)
+					continue
+					//return errors.New("冰排已达到冷冻要求"), "冰排已达到冷冻要求"
+				}
+			} else {
+				e.Log.Errorf("db error: %s", err)
+				return errors.New("当前冰排不存在" + v), ""
+			}
 		}
 
 		if len(iceRaftRecordModel.OutStorageTime.String()) > 0 {
 			err = errors.New(fmt.Sprintf("冰排【%s】已出库,禁止出库!", v))
 			return err, ""
 		}
-
+		//(001,002,003)未到达 xxx要求  已达到冷冻时长【%v】小时【%v】分钟
 		inTime := iceRaftRecordModel.InStorageTime.Local()
 		sort.Slice(iceRaftRecordModel.FreezeClaim, func(i, j int) bool {
 			return iceRaftRecordModel.FreezeClaim[i] < iceRaftRecordModel.FreezeClaim[j]
 		})
-
 		for _, vs := range iceRaftRecordModel.FreezeClaim {
 			if inTime.Add(time.Hour * time.Duration(vs)).After(time.Now()) {
-				str = fmt.Sprintf("冰排编号【%s】未达到冷冻时长【%v】小时,已达到冷冻时长【%v】,是否继续出库", v, vs, time.Now().Sub(inTime).Hours())
+				hour := iceRaftRecordModel.FreezeDuration / 60
+				minutes := iceRaftRecordModel.FreezeDuration % 60
+				str = fmt.Sprintf("冰排编号【%s】未达到冷冻时长【%v】小时,已达到冷冻时长【%v】小时【%v】分钟,是否继续出库", v, vs, hour, minutes)
+				sussce = append(sussce, v)
+				FreezeDuration = append(FreezeDuration, iceRaftRecordModel.FreezeDuration)
 				break
 			}
 		}
 	}
+	if len(sussce) == 0 && len(msg) > 0 {
+		return errors.New("冰排已达到冷冻要求"), "冰排已达到冷冻要求"
+	} else if len(sussce) > 0 {
+		sort.Slice(FreezeDuration, func(i, j int) bool {
+			return FreezeDuration[i] < FreezeDuration[j]
+		})
+		str = fmt.Sprintf("冰排%v未达到冷冻要求,已达到冷冻时长【%v】小时【%v】分钟", sussce, FreezeDuration[0]/60, FreezeDuration[0]%60)
+	}
 	return nil, str
 }
 
-// 查询保温箱关联的冰排
+// GetPageByCoolerBoxId 查询保温箱关联的冰排
 func (e *IceRaft) GetPageByCoolerBoxId(coolerBoxId int, list *[]string, p *actions.DataPermission) error {
 	var data model.IceRaft
 	err := e.Orm.Model(&data).
@@ -824,7 +852,7 @@ func (e *IceRaftRecord) StartForCold(c *dto.IceStartbleForColfTimReq, p *actions
 			}
 			return global.UpdateFailedErr
 		}
-		err = e.Orm.Model(&iceRaft).Where("id = ?", iceRaftRecordModel.IceRaftId).Error
+		err = e.Orm.Model(&iceRaft).Where("id = ?", iceRaftRecordModel.IceRaftId).First(&iceRaft).Error
 		if err != nil {
 			return global.GetFailedErr
 		}
@@ -833,6 +861,7 @@ func (e *IceRaftRecord) StartForCold(c *dto.IceStartbleForColfTimReq, p *actions
 		iceRaftRecordModel.IceColdUsers = user.NickName
 		iceRaftRecordModel.IceColdAddress = iceRaft.IceColdAddress
 		iceRaftRecordModel.SuitableForCold = iceRaft.SuitableForCold
+		iceRaftRecordModel.OutStorageTime = model2.Time(time.Now()) //出库时间
 		updates := tx.Where("id = ?", iceRaftRecordModel.Id).Updates(&iceRaftRecordModel)
 		if err = updates.Error; err != nil {
 			e.Log.Errorf("db error: %s", err)
@@ -876,5 +905,12 @@ func (e *IceRaft) IceRaftRecordRecording(c *dto.IceRaftRecordRecording, list *[]
 		e.Log.Errorf("db error: %s", err)
 		return global.GetFailedErr
 	}
+	var Ice model.IceRaftOmit
+	for i, _ := range *list {
+		err := e.Orm.Model(&Ice).Where("id = ?", (*list)[i].IceRaftId).Find(&(*list)[i].IceRafts).Error
+		if err != nil {
+			return global.GetFailedErr
+		}
+	}
 	return nil
 }

+ 191 - 76
app/admin/service/waybill.go

@@ -426,7 +426,15 @@ func (e *Waybill) Update(c *dto.WaybillUpdateReq, p *actions.DataPermission) err
 	}
 
 	c.Generate(&waybillModel)
-	err = tx.Save(&waybillModel).Error
+	var count int64
+	for _, drug := range c.Drugs {
+		e.Orm.Model(&model.Drug{}).Where("code = ?", drug.Code).Count(&count)
+		if count > 0 {
+			return errors.New("药品编号已存在")
+		}
+	}
+	waybillModel.Drugs = append(waybillModel.Drugs, c.Drugs...)
+	err = tx.Where("id = ?", waybillModel.Id).Updates(&waybillModel).Error
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
 		return global.UpdateFailedErr
@@ -470,7 +478,7 @@ func (e *Waybill) Audit(c *dto.WaybillUpdateReqaudit, p *actions.DataPermission)
 	return nil
 }
 
-// 管理员审核订单
+// AdminAudit 管理员审核订单
 func (e *Waybill) AdminAudit(c *dto.WaybillAdmin, p *actions.DataPermission) error {
 	var err error
 	tx := e.Orm.Begin()
@@ -545,7 +553,7 @@ func (e *Waybill) UpdateStatus(c *dto.UpdateStatusReq, p *actions.DataPermission
 	return nil
 }
 
-// 派单
+// Delivery 派单
 func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission) error {
 	var err error
 
@@ -606,7 +614,7 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 					}
 
 				}
-				if !user.Dept.IsOutStorage {
+				if user.Dept.IsOutStorage {
 					if iceRaft.IceRaftRecord.Status != model.IceRaftRecordStatusWaitUse {
 						err = errors.New(fmt.Sprintf("冰排【%s】状态为%s,出库保温箱失败!", code, model.GetIceRaftRecordStatus(iceRaft.IceRaftRecord.Status)))
 						return err
@@ -627,6 +635,7 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 					err = tx.Model(&model.IceRaftRecord{}).
 						Where("ice_raft_id = ? and status = ?", iceRaft.Id, model.IceRaftRecordStatusFreezing).
 						Or("ice_raft_id = ? and status = ?", iceRaft.Id, model.IceRaftRecordStatusWaitUse).
+						Or("ice_raft_id = ? and status = ?", iceRaft.Id, model.IceRaftRecordReleasedInTheCold).
 						Updates(map[string]interface{}{
 							"status":           model.IceRaftRecordStatusUsing,
 							"out_storage_time": time.Now(),
@@ -679,9 +688,7 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 		}
 		//派单时添加
 		//waybillModeStatus := waybillModel.Status
-		if waybillModel.Status == model.WaybillStatusInDeliverys ||
-			(waybillModel.Status == model.WaybillStatusInDeliverys && waybillModel.CoolerBoxId != c.CoolerBoxId) ||
-			(waybillModel.Status == model.WaybillStatusInDeliverys && !lib.StrListEqual(c.IceRaftCode, c.OldIceRaftCode)) {
+		if waybillModel.Status == model.WaybillStatusInDeliverys || (waybillModel.Status == model.WaybillStatusInDeliverys && waybillModel.CoolerBoxId != c.CoolerBoxId) || (waybillModel.Status == model.WaybillStatusInDeliverys && !lib.StrListEqual(c.IceRaftCode, c.OldIceRaftCode)) {
 			waybillModel.Status = model.WaybillStatusInDeliverys
 			waybillModel.TamperProofLabel = c.TamperProofLabel
 			waybillModel.TamperProofLabelImg = c.TamperProofLabelImg // 防拆标签
@@ -690,6 +697,7 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 			waybillModel.CoolerBoxId = c.CoolerBoxId
 			waybillModel.DeliveryTime = model2.Time(time.Now())
 			waybillModel.IceRaftCode = c.IceRaftCode
+			waybillModel.SecondaryTime = model2.Time(time.Now()) //分配时间
 			if c.Status == model.WaybillStatusInShippeds {
 				waybillModel.Status = c.Status
 				var data model.IceRaft
@@ -699,7 +707,7 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 					Scopes(
 						actions.Permission(data.TableName(), p),
 						IceRaftNameRecordStatusScopes(model.IceRaftRecordStatusUsing),
-						IceRaftNameRecordCoolerBoxIdScopes(coolerBox.Id),
+						IceRaftNameRecordCoolerBoxIdScopes(c.CoolerBoxId),
 					).
 					Joins("left join ice_raft_record on ice_raft.ice_raft_record_id = ice_raft_record.id").
 					Find(&list).Error
@@ -713,11 +721,20 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 				e.Orm.Scopes(actions.Permission(cooler.TableName(), p)).
 					Where("cooler_box_id = ?", c.CoolerBoxId).Where("status = ?", 1).First(&cooler).Count(&count)
 				if count == 0 {
+					cooler.CoolerBoxId = c.CoolerBoxId
+					cooler.Name = coolerBox.Name
+					cooler.Sn = coolerBox.Sn
 					cooler.CoolerUseUsers = user.NickName
-					cooler.HistoryCode = append(cooler.HistoryCode, list...)
-					cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
+					if len(list) == 0 {
+						cooler.HistoryCode = append(cooler.HistoryCode, c.IceRaftCode...)
+						cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
+					} else {
+						cooler.HistoryCode = append(cooler.HistoryCode, list...)
+						cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
+					}
 					cooler.CoolerUserTime = model2.Time(time.Now())
 					cooler.Status = "2" //使用结束
+					cooler.DeptId = user.DeptId
 					err := e.Orm.Save(&cooler).Error
 					if err != nil {
 						e.Log.Errorf("保存保温箱记录失败: %s", err)
@@ -725,8 +742,13 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 					}
 				} else {
 					cooler.CoolerUseUsers = user.NickName
-					cooler.HistoryCode = append(cooler.HistoryCode, list...)
-					cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
+					if len(list) == 0 {
+						cooler.HistoryCode = append(cooler.HistoryCode, c.IceRaftCode...)
+						cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
+					} else {
+						cooler.HistoryCode = append(cooler.HistoryCode, list...)
+						cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
+					}
 					cooler.CoolerUserTime = model2.Time(time.Now())
 					cooler.Status = "2" //使用结束
 					err = e.Orm.Updates(&cooler).Where("id = ?", cooler.Id).Error
@@ -748,71 +770,88 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 					Phone:   waybillModel.ConsigneeAddressPhone,
 					Content: "【冷链送药追溯平台】您的运单正在派送中,点击查看详情:" + addr,
 				}
-				// 查询任务
-				var logistics model.WaybillLogistics
+				//// 查询任务
+				//var logistics model.WaybillLogistics
 				// 添加物流
-				logisticsObj := model.WaybillLogistics{
-					WaybillNo:   waybillModel.WaybillNo,
-					Status:      waybillModel.Status,
-					CoolerBoxId: coolerBox.Id,
-					ControlBy: model2.ControlBy{
-						CreateBy: p.UserId,
-					},
-					DeptBy: model2.DeptBy{
-						DeptId: p.DeptId,
-					},
-				}
-				err = tx.Create(&logisticsObj).Error
-				if err != nil {
-					e.Log.Errorf("db error: %s", err)
-					return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
-				}
-				logistics.CoolerBoxId = coolerBox.Id
-				err = tx.Save(&logistics).Error
-				if err != nil {
-					e.Log.Errorf("db error: %s", err)
-					return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
-				}
+				//logisticsObj := model.WaybillLogistics{
+				//	WaybillNo:   waybillModel.WaybillNo,
+				//	Status:      waybillModel.Status,
+				//	CoolerBoxId: coolerBox.Id,
+				//	ControlBy: model2.ControlBy{
+				//		CreateBy: p.UserId,
+				//	},
+				//	DeptBy: model2.DeptBy{
+				//		DeptId: p.DeptId,
+				//	},
+				//}
+				//err = tx.Create(&logisticsObj).Error
+				//if err != nil {
+				//	e.Log.Errorf("db error: %s", err)
+				//	return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
+				//}
+				//logistics.CoolerBoxId = coolerBox.Id
+				//err = tx.Save(&logistics).Error
+				//if err != nil {
+				//	e.Log.Errorf("db error: %s", err)
+				//	return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
+				//}
 			}
+			// 查询任务
 			err = tx.Save(&waybillModel).Error
 			if err != nil {
 				e.Log.Errorf("db error: %s", err)
 				return global.UpdateFailedErr
 			}
-
 			// 查询任务
-			var logistics model.WaybillLogistics
-			err = tx.Model(&logistics).Where("waybill_no = ?", waybillModel.WaybillNo).
-				Last(&logistics).Error
+			//var logistics model.WaybillLogistics
+			//err = tx.Model(&logistics).Where("waybill_no = ?", waybillModel.WaybillNo).
+			//	Last(&logistics).Error
+			//if err != nil {
+			//	if errors.Is(err, gorm.ErrRecordNotFound) {
+			//		// 添加物流
+			//		logisticsObj := model.WaybillLogistics{
+			//			WaybillNo:   waybillModel.WaybillNo,
+			//			Status:      waybillModel.Status,
+			//			CoolerBoxId: coolerBox.Id,
+			//			ControlBy: model2.ControlBy{
+			//				CreateBy: p.UserId,
+			//			},
+			//			DeptBy: model2.DeptBy{
+			//				DeptId: p.DeptId,
+			//			},
+			//		}
+			//		err = tx.Create(&logisticsObj).Error
+			//		if err != nil {
+			//			e.Log.Errorf("db error: %s", err)
+			//			return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
+			//		}
+			//	} else {
+			//		e.Log.Errorf("db error: %s", err)
+			//		return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
+			//	}
+			//	logistics.CoolerBoxId = coolerBox.Id
+			//	err = tx.Save(&logistics).Error
+			//	if err != nil {
+			//		e.Log.Errorf("db error: %s", err)
+			//		return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
+			//	}
+			//}
+			// 添加物流
+			logisticsObj := model.WaybillLogistics{
+				WaybillNo:   waybillModel.WaybillNo,
+				Status:      waybillModel.Status,
+				CoolerBoxId: coolerBox.Id,
+				ControlBy: model2.ControlBy{
+					CreateBy: p.UserId,
+				},
+				DeptBy: model2.DeptBy{
+					DeptId: p.DeptId,
+				},
+			}
+			err = tx.Create(&logisticsObj).Error
 			if err != nil {
-				if errors.Is(err, gorm.ErrRecordNotFound) {
-					// 添加物流
-					logisticsObj := model.WaybillLogistics{
-						WaybillNo:   waybillModel.WaybillNo,
-						Status:      waybillModel.Status,
-						CoolerBoxId: coolerBox.Id,
-						ControlBy: model2.ControlBy{
-							CreateBy: p.UserId,
-						},
-						DeptBy: model2.DeptBy{
-							DeptId: p.DeptId,
-						},
-					}
-					err = tx.Create(&logisticsObj).Error
-					if err != nil {
-						e.Log.Errorf("db error: %s", err)
-						return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
-					}
-				} else {
-					e.Log.Errorf("db error: %s", err)
-					return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
-				}
-				logistics.CoolerBoxId = coolerBox.Id
-				err = tx.Save(&logistics).Error
-				if err != nil {
-					e.Log.Errorf("db error: %s", err)
-					return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
-				}
+				e.Log.Errorf("db error: %s", err)
+				return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
 			}
 			// 查询任务
 			var task model.WaybillTask
@@ -840,10 +879,17 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 						return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
 					}
 				} else {
-					e.Log.Errorf("db error: %s", err)
-					return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
+					//task.StartTime = model2.Time(time.Now())
+					task.UpdateBy = p.UserId
+					task.CoolerBoxId = coolerBox.Id
+					task.Sn = coolerBox.Sn
+					err = tx.Save(&task).Error
+					if err != nil {
+						e.Log.Errorf("db error: %s", err)
+						return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
+					}
 				}
-				task.StartTime = model2.Time(time.Now())
+			} else {
 				task.UpdateBy = p.UserId
 				task.CoolerBoxId = coolerBox.Id
 				task.Sn = coolerBox.Sn
@@ -957,7 +1003,6 @@ func (e *Waybill) Receipt(c *dto.WaybillReceiptReq, p *actions.DataPermission) e
 		e.Log.Errorf("db error: %s", err)
 		return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
 	}
-
 	var lng, lat string
 	lng, lat, err = e.GetSite(waybillModel.DeptId, coolerBox.Sn, waybillModel.ReceiptTime.String())
 	if err != nil {
@@ -976,6 +1021,7 @@ func (e *Waybill) Receipt(c *dto.WaybillReceiptReq, p *actions.DataPermission) e
 	// 未下车 直接点签收
 	if time.Time(task.EndTime).IsZero() {
 		task.EndTime = model2.Time(time.Now())
+		task.CoolerBoxId = coolerBox.Id
 		//task.UpdateBy = p.UserIds
 		err = tx.Save(&task).Error
 		if err != nil {
@@ -1687,6 +1733,16 @@ func (e *Waybill) SecondaryDistribution(c *dto.WaybillAssignment, p *actions.Dat
 	if !waybillModel.IsSecondaryDistribution {
 		return errors.New("该订单不允许二次分配")
 	}
+	var coolerBox = model.CoolerBox{}
+	// 查询保温箱信息
+	if c.CoolerBoxId != 0 {
+		err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
+			First(&coolerBox, waybillModel.CoolerBoxId).Error
+		if err != nil {
+			e.Log.Errorf("获取保温箱信息失败: %s", err)
+			return errors.New("获取保温箱信息失败")
+		}
+	}
 	var waybil model.Waybill
 	sole, err := e.CreateSole()
 	var no string
@@ -1716,7 +1772,14 @@ func (e *Waybill) SecondaryDistribution(c *dto.WaybillAssignment, p *actions.Dat
 	waybil.DeliveryPhone = waybillModel.DeliveryPhone
 	waybil.OrderTime = model2.Time(time.Now())
 	waybil.IsSecondaryDistribution = false
-	c.Generate(&waybil)
+	waybil.ReCheckId = waybillModel.ReCheckId
+	waybil.IceRaftCode = waybillModel.IceRaftCode
+	waybil.CoolerBoxId = waybillModel.CoolerBoxId
+	waybil.IsChild = true
+	waybil.ConsigneeAddressDetails = c.ConsigneeAddressDetails
+	waybil.ConsigneeAddressName = c.ConsigneeAddressName
+	waybil.ConsigneeAddressPhone = c.ConsigneeAddressPhone
+	//c.Generate(&waybil)
 	err = tx.Create(&waybil).Error
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
@@ -1756,9 +1819,14 @@ func (e *Waybill) SecondaryDistribution(c *dto.WaybillAssignment, p *actions.Dat
 			drugs.Code = drug.Code
 			err = tx.Save(&drugs).Error
 			if err != nil {
-				e.Log.Errorf("db error: %s", err)
+				e.Log.Errorf("保存药品信息失败: %s", err)
 				return errors.New("保存药品信息失败")
 			}
+			err := e.Orm.Table(model.Drug{}.TableName()).Where("waybill_no = ?", waybillModel.WaybillNo).Where("code = ?", drug.Code).Update("is_assignment", true).Error
+			if err != nil {
+				e.Log.Errorf("更新药品状态失败: %s", err)
+				return errors.New("更新药品状态失败")
+			}
 		}
 	}
 	waybillModel.ChildWaybills = append(waybillModel.ChildWaybills, waybil.WaybillNo)
@@ -1770,15 +1838,62 @@ func (e *Waybill) SecondaryDistribution(c *dto.WaybillAssignment, p *actions.Dat
 	// 二次分配订单发送短信
 	ss := sms.NewSMS(conf.ExtConfig.SubMail.Appid, conf.ExtConfig.SubMail.Signature)
 	addr := conf.ExtConfig.Applet.WaybillUrl + url.QueryEscape(lib.AesEncryptCBC(waybil.WaybillNo, lib.AesKey))
-	res, err1 := ss.SmsXSend(waybil.ConsigneeAddressPhone, addr)
+	res, err1 := ss.SmsXSend(c.ConsigneeAddressPhone, addr)
 	if err1 != nil || res.Status != sms.SUCCESS {
 		e.Log.Errorf("派单短信发送失败", zap.Any("res", res), zap.Error(err1))
 		err = errors.New("派单短信发送失败,请检查收件人电话是否正确!")
 		return err
 	}
 	waybil.SendLog = model.WaybillSendLog{
-		Phone:   waybil.ConsigneeAddressPhone,
+		Phone:   c.ConsigneeAddressPhone,
 		Content: "【冷链送药追溯平台】您的运单正在派送中,点击查看详情:" + addr,
 	}
+	// 添加物流
+	logisticsObj := model.WaybillLogistics{
+		WaybillNo:   waybil.WaybillNo,
+		Status:      waybil.Status,
+		CoolerBoxId: waybil.CoolerBoxId,
+		ControlBy: model2.ControlBy{
+			CreateBy: p.UserId,
+		},
+		DeptBy: model2.DeptBy{
+			DeptId: p.DeptId,
+		},
+	}
+	err = tx.Create(&logisticsObj).Error
+	if err != nil {
+		e.Log.Errorf("db error: %s", err)
+		return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
+	}
+	// 查询任务
+	var task model.WaybillTask
+	err = tx.Model(&task).Where("waybill_no = ? ", waybil.WaybillNo).
+		Last(&task).Error
+	if err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			// 添加任务
+			taskObj := model.WaybillTask{
+				WaybillNo:   waybil.WaybillNo,
+				CoolerBoxId: waybil.CoolerBoxId,
+				UserId:      p.UserId,
+				Sn:          coolerBox.Sn,
+				StartTime:   model2.Time(time.Now()),
+				ControlBy: model2.ControlBy{
+					CreateBy: p.UserId,
+				},
+				DeptBy: model2.DeptBy{
+					DeptId: p.DeptId,
+				},
+			}
+			err = tx.Create(&taskObj).Error
+			if err != nil {
+				e.Log.Errorf("db error: %s", err)
+				return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
+			}
+		} else {
+			e.Log.Errorf("db error: %s", err)
+			return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
+		}
+	}
 	return nil
 }

+ 38 - 3
app/jobs/jobs.go

@@ -3,10 +3,12 @@ package jobs
 import (
 	sysModel "cold-delivery/app/admin/model"
 	"cold-delivery/common/global"
+	"cold-delivery/common/nats/nats_server"
 	"cold-delivery/db"
 	"fmt"
 	"github.com/gin-gonic/gin"
 	log "gogs.baozhida.cn/zoie/OAuth-core/logger"
+	"sort"
 	"time"
 )
 
@@ -16,6 +18,7 @@ func InitJob() {
 	jobList = map[string]JobsExec{
 		//"ExamplesOne":     ExamplesOne{},
 		"CountIceRaftRecordFreezeDuration": CountIceRaftRecordFreezeDuration{},
+		"UpdateCoolerBoxMonitorStatus":     UpdateCoolerBoxMonitorStatus{},
 		// ...
 	}
 }
@@ -47,6 +50,10 @@ func (t ExamplesOne) Exec(arg interface{}) error {
 type CountIceRaftRecordFreezeDuration struct {
 }
 
+// 更新保温箱监控状态
+type UpdateCoolerBoxMonitorStatus struct {
+}
+
 // 统计冰排冷冻时长
 func (t CountIceRaftRecordFreezeDuration) Exec(arg interface{}) error {
 
@@ -60,12 +67,14 @@ func (t CountIceRaftRecordFreezeDuration) Exec(arg interface{}) error {
 		log.Errorf("db error: %s", err)
 		return global.GetFailedErr
 	}
-
+	//冰排统计时长
 	for _, record := range iceRaftRecordList {
-
+		sort.Slice(record.FreezeClaim, func(i, j int) bool {
+			return record.FreezeClaim[i] < record.FreezeClaim[j]
+		})
 		inTime := record.InStorageTime.Local()
 		//if inTime.Add(time.Hour * time.Duration(record.FreezeClaim)).After(time.Now()) {
-		if inTime.Add(time.Duration(float64(time.Hour) * record.FreezeClaim[0])).After(time.Now()) {
+		if inTime.Add(time.Duration(time.Hour * time.Duration(record.FreezeClaim[0]))).After(time.Now()) {
 			// 未达到冷冻时长 不修改状态 只修改时间
 			record.FreezeDuration = int(time.Now().Sub(inTime).Minutes())
 		} else {
@@ -83,3 +92,29 @@ func (t CountIceRaftRecordFreezeDuration) Exec(arg interface{}) error {
 	return nil
 
 }
+
+// Exec 更新保温箱监控状态
+func (t UpdateCoolerBoxMonitorStatus) Exec(arg interface{}) error {
+	// GetOrm 获取orm连接
+	orm, _ := db.GetOrm(&gin.Context{})
+	var coolerBox []sysModel.CoolerBox
+	err := orm.Model(&sysModel.CoolerBox{}).Find(&coolerBox).Error
+	if err != nil {
+		log.Errorf("获取保温箱状态失败: %s", err)
+		return global.GetFailedErr
+	}
+	for i, _ := range coolerBox {
+		data, _ := nats_server.Read_Device_ByT_sn(coolerBox[i].Sn)
+		if len(data.T_sn) != 0 {
+			//只查询设备在线并且处于监控状态下的设备
+			if data.T_monitor != coolerBox[i].MonitorStatus {
+				err := orm.Model(&sysModel.CoolerBox{}).Where("id = ?", coolerBox[i].Id).Update("monitor_status", data.T_monitor).Error
+				if err != nil {
+					log.Errorf("更新保温箱监控状态失败: %s", err)
+					return global.UpdateFailedErr
+				}
+			}
+		}
+	}
+	return nil
+}

+ 13 - 0
common/global/formatDuration.go

@@ -0,0 +1,13 @@
+package global
+
+import (
+	"fmt"
+	"time"
+)
+
+func FormatDuration(strt, end time.Time) string {
+	duration := strt.Sub(end)
+	hours := int(duration.Hours())
+	//minutes := int(duration.Minutes())
+	return fmt.Sprintf("%d小时", hours)
+}

+ 38 - 0
common/nats/nats_server/NatsColdApi.go

@@ -276,6 +276,8 @@ func Cold_ReadDeviceByT_sn(T_sn string) (data Device, err error) {
 
 	return data, nil
 }
+
+// Read_DeviceTask_List_By_Condition 获取设备任务状态
 func Read_DeviceTask_List_By_Condition(T_sn string) (data DeviceTask, err error) {
 	type T_R struct {
 		Code int16      `xml:"Code"`
@@ -344,6 +346,7 @@ func Read_New_DeviceData(T_sn string, T_id int) (data DeviceSensor, err error) {
 	data = t_R.Data
 	return data, nil
 }
+
 func Read_Start_Time_DeviceData(T_sn string, T_id int, StartTime, EndTime string) (data []DeviceData_, err error) {
 	type T_R struct {
 		Code int16         `xml:"Code"`
@@ -383,3 +386,38 @@ func Read_Start_Time_DeviceData(T_sn string, T_id int, StartTime, EndTime string
 	data = t_R.Data
 	return data, nil
 }
+
+// Read_Device_ByT_sn 根据sn查询设备信息
+func Read_Device_ByT_sn(T_sn string) (data Device, err error) {
+	type T_R struct {
+		Code int16  `xml:"Code"`
+		Msg  string `xml:"Msg"`
+		Data Device `xml:"Data"` // 泛型
+	}
+	type T_Req struct {
+		T_sn string `xml:"T_sn"`
+	}
+	if len(T_sn) == 0 {
+		err = errors.New("sn不能为空!")
+		return
+	}
+	t_req := T_Req{
+		T_sn: T_sn,
+	}
+	b, _ := msgpack.Marshal(&t_req)
+	msg, err := nats.Nats.Request("Read_Device_ByT_sn", b, 3*time.Second)
+	if err != nil {
+		return
+	}
+	var t_R T_R
+	err = msgpack.Unmarshal(msg.Data, &t_R)
+	if err != nil {
+		return
+	}
+	if t_R.Code != 200 {
+		err = errors.New(t_R.Msg)
+		return
+	}
+	data = t_R.Data
+	return data, nil
+}