Browse Source

冰排添加释冷要求-时间 排序新增排序字段
追溯表格 -释冷要求、归还日期---释冷日期改开始时间 、释冷日期改开始时间
保温箱新增冰排绑定、预冷要求-时间 ------冰排绑定保温箱之后保温箱只能装绑定冰排、绑定冰排只能装指 定保温箱
保温箱追溯、预冷要求、预冷时间、归还时间-添加app名称

huangyan 7 months ago
parent
commit
8089b71d48

+ 8 - 0
Z_Build.bat

@@ -0,0 +1,8 @@
+cd %~dp0
+set GOARCH=amd64
+set GOOS=linux
+set GOPATH=E:\gopath
+set GO111MODULE=auto
+
+
+go build -o cold-delivery6280 main.go

+ 3 - 3
app/admin/controller/cooler_box.go

@@ -273,7 +273,7 @@ func (e CoolerBoxController) GetCollerBoxLocus(c *gin.Context) {
 		return
 		return
 	}
 	}
 	count := req.PageZ / req.Page
 	count := req.PageZ / req.Page
-	e.PageOK(history, int(count), req.Page, req.PageZ, "查询成功")
+	e.PageOK(history, count, req.Page, req.PageZ, "查询成功")
 }
 }
 
 
 // GetCoolerBoxLocus 获取保温箱历史轨迹
 // GetCoolerBoxLocus 获取保温箱历史轨迹
@@ -300,7 +300,7 @@ func (e CoolerBoxController) GetCoolerBoxLocus(c *gin.Context) {
 		e.Error(500, err, err.Error())
 		e.Error(500, err, err.Error())
 		return
 		return
 	}
 	}
-	data, _, err := nats_server.Cold_ReadDeviceDataListBy_T_snidForLocus(req.SnId+","+req.T_id, req.StartTime, req.EndTime, req.Page, req.PageZ)
+	data, _, err := nats_server.Cold_ReadDeviceDataListBy_T_snidForLocus(req.SnId+","+"1|", req.StartTime, req.EndTime, req.Page, req.PageZ)
 	if err != nil {
 	if err != nil {
 		e.Logger.Error("nats 获取轨迹信息失败:", err)
 		e.Logger.Error("nats 获取轨迹信息失败:", err)
 		fmt.Println("nats 获取轨迹信息失败: %s", err)
 		fmt.Println("nats 获取轨迹信息失败: %s", err)
@@ -575,7 +575,7 @@ func (e CoolerBoxController) ExportExecl(c *gin.Context) {
 		f.SetColWidth("Sheet1", "B", "B", 8)
 		f.SetColWidth("Sheet1", "B", "B", 8)
 		f.SetColWidth("Sheet1", "C", "C", 14)
 		f.SetColWidth("Sheet1", "C", "C", 14)
 		f.SetColWidth("Sheet1", "D", "D", 14)
 		f.SetColWidth("Sheet1", "D", "D", 14)
-		f.SetColWidth("Sheet1", "E", "E", 30)
+		f.SetColWidth("Sheet1", "E", "E", 15)
 		f.SetColWidth("Sheet1", "F", "F", 14)
 		f.SetColWidth("Sheet1", "F", "F", 14)
 		f.SetColWidth("Sheet1", "G", "G", 14)
 		f.SetColWidth("Sheet1", "G", "G", 14)
 
 

+ 110 - 45
app/admin/controller/ice_raft.go

@@ -5,7 +5,6 @@ import (
 	"cold-delivery/app/admin/service"
 	"cold-delivery/app/admin/service"
 	"cold-delivery/app/admin/service/dto"
 	"cold-delivery/app/admin/service/dto"
 	"cold-delivery/common/actions"
 	"cold-delivery/common/actions"
-	global2 "cold-delivery/common/global"
 	"encoding/json"
 	"encoding/json"
 	"fmt"
 	"fmt"
 	"github.com/beego/beego/v2/core/logs"
 	"github.com/beego/beego/v2/core/logs"
@@ -15,6 +14,7 @@ import (
 	"gogs.baozhida.cn/zoie/OAuth-core/api"
 	"gogs.baozhida.cn/zoie/OAuth-core/api"
 	"gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth/user"
 	"gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth/user"
 	_ "gogs.baozhida.cn/zoie/OAuth-core/pkg/response"
 	_ "gogs.baozhida.cn/zoie/OAuth-core/pkg/response"
+	"math"
 	"net/url"
 	"net/url"
 	"os"
 	"os"
 	"time"
 	"time"
@@ -478,6 +478,40 @@ func (e IceRaftController) IsOutStorage(c *gin.Context) {
 	e.OK(nil, str)
 	e.OK(nil, str)
 }
 }
 
 
+// BindCoolerBox 冰排绑定保温箱
+// @Summary 冰排绑定保温箱
+// @Description 冰排绑定保温箱
+// @Tags 冰排
+// @Accept  application/json
+// @Product application/json
+// @Param data body dto.IceRaftOutStorageReq true "body"
+// @Success 200 {string} string	"{"code": 200, "message": "绑定成功"}"
+// @Success 200 {string} string	"{"code": -1, "message": "绑定失败"}"
+// @Router /api/bindCoolerBox [post]
+// @Security Bearer
+func (e IceRaftController) BindCoolerBox(c *gin.Context) {
+	s := service.IceRaft{}
+	req := dto.IceRaftOutStorageReq{}
+	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.BindCookerBox(&req, p)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+	e.OK(nil, "绑定成功")
+}
+
 type IceRaftRecordController struct {
 type IceRaftRecordController struct {
 	api.Api
 	api.Api
 }
 }
@@ -739,88 +773,119 @@ func (e IceRaftRecordController) ExportExecl(c *gin.Context) {
 		return
 		return
 	}
 	}
 	if sysUser.Dept.IsIceReleaseCold {
 	if sysUser.Dept.IsIceReleaseCold {
-
 		// 这里设置表头ÒÒ
 		// 这里设置表头ÒÒ
 		f.SetCellValue("Sheet1", "A1", "序号")
 		f.SetCellValue("Sheet1", "A1", "序号")
 		f.SetCellValue("Sheet1", "B1", "冰排编号")
 		f.SetCellValue("Sheet1", "B1", "冰排编号")
-		f.SetCellValue("Sheet1", "C1", "预冷日期")
-		f.SetCellValue("Sheet1", "D1", "预冷时间(小时)")
-		f.SetCellValue("Sheet1", "E1", "预冷温度")
-		f.SetCellValue("Sheet1", "F1", "预冷地点")
-		f.SetCellValue("Sheet1", "G1", "操作人员")
-		f.SetCellValue("Sheet1", "H1", "使用日期")
-		f.SetCellValue("Sheet1", "I1", "使用时间")
-		f.SetCellValue("Sheet1", "J1", "操作人员")
-		f.SetCellValue("Sheet1", "K1", "备注")
+		f.SetCellValue("Sheet1", "C1", "入库时间")
+		f.SetCellValue("Sheet1", "D1", "出库时间")
+		f.SetCellValue("Sheet1", "E1", "所在位置")
+		f.SetCellValue("Sheet1", "F1", "冷冻要求")
+		f.SetCellValue("Sheet1", "G1", "冷冻时间")
+		f.SetCellValue("Sheet1", "H1", "释冷日期")
+		f.SetCellValue("Sheet1", "I1", "释冷时间(小时)")
+		f.SetCellValue("Sheet1", "J1", "释冷温度")
+		f.SetCellValue("Sheet1", "K1", "释冷地点")
+		f.SetCellValue("Sheet1", "L1", "操作人员")
+		f.SetCellValue("Sheet1", "M1", "使用日期")
+		f.SetCellValue("Sheet1", "N1", "使用时间")
+		f.SetCellValue("Sheet1", "O1", "使用人员")
+		f.SetCellValue("Sheet1", "P1", "备注")
 
 
 		// 设置列宽
 		// 设置列宽
 		f.SetColWidth("Sheet1", "A", "A", 6)
 		f.SetColWidth("Sheet1", "A", "A", 6)
 		f.SetColWidth("Sheet1", "B", "B", 8)
 		f.SetColWidth("Sheet1", "B", "B", 8)
 		f.SetColWidth("Sheet1", "C", "C", 14)
 		f.SetColWidth("Sheet1", "C", "C", 14)
 		f.SetColWidth("Sheet1", "D", "D", 14)
 		f.SetColWidth("Sheet1", "D", "D", 14)
-		f.SetColWidth("Sheet1", "E", "E", 30)
+		f.SetColWidth("Sheet1", "E", "E", 15)
 		f.SetColWidth("Sheet1", "F", "F", 14)
 		f.SetColWidth("Sheet1", "F", "F", 14)
 		f.SetColWidth("Sheet1", "G", "G", 14)
 		f.SetColWidth("Sheet1", "G", "G", 14)
-		f.SetColWidth("Sheet1", "H", "H", 30)
+		f.SetColWidth("Sheet1", "H", "H", 14)
 		f.SetColWidth("Sheet1", "I", "J", 15)
 		f.SetColWidth("Sheet1", "I", "J", 15)
-		f.SetColWidth("Sheet1", "K", "K", 30)
+		f.SetColWidth("Sheet1", "K", "K", 15)
+		f.SetColWidth("Sheet1", "L", "K", 15)
+		f.SetColWidth("Sheet1", "M", "K", 15)
+		f.SetColWidth("Sheet1", "N", "K", 15)
+		f.SetColWidth("Sheet1", "O", "K", 15)
+		f.SetColWidth("Sheet1", "P", "K", 15)
 
 
 		line := 1
 		line := 1
 
 
 		// 循环写入数据
 		// 循环写入数据
 		for i, v := range list {
 		for i, v := range list {
 			line++
 			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())
-			duration := global2.FormatDuration(start, end)
-			parse, _ := time.Parse("2006-01-02 15:04:05", v.UpdatedAt.String())
-			formatDuration := global2.FormatDuration(parse, end)
+			start, _ := time.Parse("2006-01-02 15:04:05", v.StartIceColdTime.String())
+			end, _ := time.Parse("2006-01-02 15:04:05", v.EndForColdTime.String())
+
+			IceColdTime := end.Sub(start)
+			ColdTime := fmt.Sprintf("%vh%vm", math.Floor(IceColdTime.Hours()), int(IceColdTime.Minutes())%60)
+
+			Updstart, _ := time.Parse("2006-01-02 15:04:05", v.ReturnDate.String())
+			Useend, _ := time.Parse("2006-01-02 15:04:05", v.IceUseTime.String())
+			sub := Updstart.Sub(Useend)
+			subTime := fmt.Sprintf("%vh%vm", math.Floor(sub.Hours()), int(sub.Minutes())%60)
 			f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), i+1)
 			f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), i+1)
 			f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.IceRafts.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), 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), formatDuration)
-			f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), v.IceUseUsers)
-			f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), "")
+			f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.InStorageTime)
+			f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.OutStorageTime)
+			f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.CoolerBox.Name)
+			f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.FreezeClaim)
+			f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.FreezeDuration)
+			f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.StartIceColdTime)
+			f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), ColdTime)
+			f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), v.SuitableForCold)
+			f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), v.IceColdAddress)
+			f.SetCellValue("Sheet1", fmt.Sprintf("L%d", line), v.IceColdUsers)
+			f.SetCellValue("Sheet1", fmt.Sprintf("M%d", line), v.IceUseTime)
+			f.SetCellValue("Sheet1", fmt.Sprintf("N%d", line), subTime)
+			f.SetCellValue("Sheet1", fmt.Sprintf("O%d", line), v.IceUseUsers)
+			f.SetCellValue("Sheet1", fmt.Sprintf("P%d", line), "")
 		}
 		}
 	} else {
 	} else {
 		// 这里设置表头ÒÒ
 		// 这里设置表头ÒÒ
 		f.SetCellValue("Sheet1", "A1", "序号")
 		f.SetCellValue("Sheet1", "A1", "序号")
 		f.SetCellValue("Sheet1", "B1", "冰排编号")
 		f.SetCellValue("Sheet1", "B1", "冰排编号")
-		f.SetCellValue("Sheet1", "C1", "操作人员")
-		f.SetCellValue("Sheet1", "D1", "使用日期")
-		f.SetCellValue("Sheet1", "E1", "使用时间")
-		f.SetCellValue("Sheet1", "F1", "操作人员")
-		f.SetCellValue("Sheet1", "G1", "备注")
-
+		f.SetCellValue("Sheet1", "C1", "入库时间")
+		f.SetCellValue("Sheet1", "D1", "出库时间")
+		f.SetCellValue("Sheet1", "E1", "所在位置")
+		f.SetCellValue("Sheet1", "F1", "冷冻要求")
+		f.SetCellValue("Sheet1", "G1", "冷冻时间")
+		f.SetCellValue("Sheet1", "H1", "使用日期")
+		f.SetCellValue("Sheet1", "I1", "使用时间")
+		f.SetCellValue("Sheet1", "J1", "使用人员")
+		f.SetCellValue("Sheet1", "K1", "备注")
 		// 设置列宽
 		// 设置列宽
 		f.SetColWidth("Sheet1", "A", "A", 6)
 		f.SetColWidth("Sheet1", "A", "A", 6)
 		f.SetColWidth("Sheet1", "B", "B", 8)
 		f.SetColWidth("Sheet1", "B", "B", 8)
 		f.SetColWidth("Sheet1", "C", "C", 14)
 		f.SetColWidth("Sheet1", "C", "C", 14)
-		f.SetColWidth("Sheet1", "D", "D", 30)
+		f.SetColWidth("Sheet1", "D", "D", 15)
 		f.SetColWidth("Sheet1", "E", "E", 15)
 		f.SetColWidth("Sheet1", "E", "E", 15)
-		f.SetColWidth("Sheet1", "F", "F", 30)
-		f.SetColWidth("Sheet1", "G", "G", 30)
+		f.SetColWidth("Sheet1", "F", "F", 15)
+		f.SetColWidth("Sheet1", "G", "G", 15)
+		f.SetColWidth("Sheet1", "H", "H", 15)
+		f.SetColWidth("Sheet1", "I", "I", 15)
+		f.SetColWidth("Sheet1", "J", "J", 15)
+		f.SetColWidth("Sheet1", "K", "K", 15)
 
 
 		line := 1
 		line := 1
 
 
 		// 循环写入数据
 		// 循环写入数据
 		for i, v := range list {
 		for i, v := range list {
 			line++
 			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())
-			duration := global2.FormatDuration(parse, start)
+			Update, _ := time.Parse("2006-01-02 15:04:05", v.ReturnDate.String())
+			UseTime, _ := time.Parse("2006-01-02 15:04:05", v.IceUseTime.String())
+			sub := Update.Sub(UseTime)
+			subTime := fmt.Sprintf("%vh%vm", math.Floor(sub.Hours()), int(sub.Minutes())%60)
 			f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), i+1)
 			f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), i+1)
 			f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.IceRafts.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), duration)
-			f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.IceUseUsers)
-			f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), "")
+			f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.InStorageTime)
+			f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.OutStorageTime)
+			f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.CoolerBox.Name)
+			f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.FreezeClaim)
+			f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.FreezeDuration)
+			f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.IceUseTime)
+			f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), subTime)
+			f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), v.IceUseUsers)
+			f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), "")
 		}
 		}
 	}
 	}
 
 

+ 4 - 6
app/admin/controller/waybill.go

@@ -638,11 +638,9 @@ func (e WaybillController) AdminAudit(c *gin.Context) {
 		return
 		return
 	}
 	}
 	p := actions.GetPermissionFromContext(c)
 	p := actions.GetPermissionFromContext(c)
-	var userObj model.SysUser
-	userSvc := service.SysUser{}
-	err = userSvc.Get(&dto.SysUserGetReq{Id: p.UserId}, nil, &userObj)
+	err, userObj := service.GetUserProfile(e.Orm, p.UserId)
 	if err != nil {
 	if err != nil {
-		e.Error(500, err, err.Error())
+		e.Error(500, err, "获取用户信息失败")
 		return
 		return
 	}
 	}
 	if userObj.Type != model.SysUserTypeSys {
 	if userObj.Type != model.SysUserTypeSys {
@@ -816,10 +814,10 @@ func (e WaybillController) CustomerReceipt(c *gin.Context) {
 		e.Error(500, err, err.Error())
 		e.Error(500, err, err.Error())
 		return
 		return
 	}
 	}
-
+	p := actions.GetPermissionFromContext(c)
 	//req.WaybillNo = lib.AesDecryptCBC(req.WaybillNo, lib.AesKey)
 	//req.WaybillNo = lib.AesDecryptCBC(req.WaybillNo, lib.AesKey)
 	//数据权限检查
 	//数据权限检查
-	err = s.Receipt(&req, nil)
+	err = s.Receipt(&req, p)
 	if err != nil {
 	if err != nil {
 		e.Error(500, err, err.Error())
 		e.Error(500, err, err.Error())
 		return
 		return

+ 14 - 9
app/admin/model/cooler_box.go

@@ -13,15 +13,17 @@ const (
 // 保温箱
 // 保温箱
 type CoolerBox struct {
 type CoolerBox struct {
 	model2.Model
 	model2.Model
-	Name             string                  `json:"name" gorm:"size:128"`                                 // 商品名称
-	Sn               string                  `json:"sn" gorm:"size:128"`                                   // sn
-	Status           string                  `json:"status" gorm:"size:4;not null;default:'2';comment:状态"` // 1-停用 2-正常
-	HistorySn        model2.StringList       `json:"historySn"`                                            // 历史绑定的sn
-	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:"-"`
+	Name              string                  `json:"name" gorm:"size:128"`                                 // 商品名称
+	Sn                string                  `json:"sn" gorm:"size:128"`                                   // sn
+	Status            string                  `json:"status" gorm:"size:4;not null;default:'2';comment:状态"` // 1-停用 2-正常
+	HistorySn         model2.StringList       `json:"historySn"`                                            // 历史绑定的sn
+	ColdSpots         string                  `json:"cold_spots"`                                           //遇冷地点
+	ColdTemperatures  string                  `json:"cold_temperatures"`                                    //遇冷温度
+	ForColdCoolerTime int                     `json:"for_cold_cooler_time" gorm:"comment:预冷要求"`             //保温箱预冷要求
+	DeviceData        natsModel.DeviceData_R2 `json:"deviceData" gorm:"-"`
+	MonitorStatus     int                     `json:"monitorStatus" gorm:"comment:监控状态"` // 监控状态 0-未监控 1-监控中
+	BindIceRaftId     model2.StringList       `json:"bindIceRaftId" gorm:"comment:绑定冰排"` // 绑定的冰排id
+	UseStatus         string                  `json:"useStatus" gorm:"-"`
 	model2.ControlBy
 	model2.ControlBy
 	model2.ModelTime
 	model2.ModelTime
 	model2.DeptBy
 	model2.DeptBy
@@ -42,6 +44,9 @@ type CoolerBoxRecord struct {
 	ColdTemperatures  string            `json:"cold_temperatures"`                                    //遇冷温度
 	ColdTemperatures  string            `json:"cold_temperatures"`                                    //遇冷温度
 	CoolerColdUsers   string            `json:"cooler-cold-users" gorm:"size:128;comment:保温箱预冷操作人员"`  //保温箱预冷操作人员
 	CoolerColdUsers   string            `json:"cooler-cold-users" gorm:"size:128;comment:保温箱预冷操作人员"`  //保温箱预冷操作人员
 	CoolerUseUsers    string            `json:"cooler-use-users" gorm:"size:128;comment:保温箱使用操作人员"`   //保温箱使用操作人员
 	CoolerUseUsers    string            `json:"cooler-use-users" gorm:"size:128;comment:保温箱使用操作人员"`   //保温箱使用操作人员
+	CoolerEndUseTime  model2.Time       `json:"coolerEndUseTime"  gorm:"size:128;comment:保温箱结束使用时间"`
+	ForColdCoolerTime int               `json:"for_cold_cooler_time" gorm:"comment:预冷要求"`
+	ForColdDuration   string            `json:"for_cold_duration" gorm:"-"` // 预冷时长
 	model2.ControlBy
 	model2.ControlBy
 	model2.ModelTime
 	model2.ModelTime
 	model2.DeptBy
 	model2.DeptBy

+ 10 - 1
app/admin/model/ice_raft.go

@@ -10,7 +10,7 @@ const (
 // 冰排
 // 冰排
 type IceRaft struct {
 type IceRaft struct {
 	model2.Model
 	model2.Model
-	Code            string            `json:"code" gorm:"size:128"`                                 // 商品名称
+	Code            string            `json:"code" gorm:"size:128"`                                 // 冰排编号
 	Status          string            `json:"status" gorm:"size:4;not null;default:'2';comment:状态"` // 1-停用 2-正常
 	Status          string            `json:"status" gorm:"size:4;not null;default:'2';comment:状态"` // 1-停用 2-正常
 	IceRaftRecordId int               `json:"iceRaftRecordId" gorm:"size:128"`                      // 最新入库记录
 	IceRaftRecordId int               `json:"iceRaftRecordId" gorm:"size:128"`                      // 最新入库记录
 	FreezeClaim     model2.FloatList  `json:"freezeClaim" gorm:"type:json;comment:冷冻要求"`            // 冷冻要求 单位小时
 	FreezeClaim     model2.FloatList  `json:"freezeClaim" gorm:"type:json;comment:冷冻要求"`            // 冷冻要求 单位小时
@@ -18,6 +18,10 @@ type IceRaft struct {
 	Label           string            `json:"label" gorm:"size:128;comment:标签"`                         // 标签
 	Label           string            `json:"label" gorm:"size:128;comment:标签"`                         // 标签
 	IceColdAddress  string            `json:"iceColdAddress" gorm:"size:128;comment:冰排预冷地点"`            //冰排预冷地点
 	IceColdAddress  string            `json:"iceColdAddress" gorm:"size:128;comment:冰排预冷地点"`            //冰排预冷地点
 	SuitableForCold float32           `json:"suitableForCold" gorm:"type:decimal(10,2);comment:冰排适冷温度"` // 冰排遇冷温度
 	SuitableForCold float32           `json:"suitableForCold" gorm:"type:decimal(10,2);comment:冰排适冷温度"` // 冰排遇冷温度
+	Sort            int               `json:"sort" gorm:"size:4;comment:排序"`                            // 排序
+	ForColdTime     int               `json:"forColdTime" gorm:"comment:适冷时长"`                          // 适冷时长 单位分钟
+	BindCoolerBox   int               `json:"bindCoolerBox" gorm:"comment:绑定保温箱"`                       //绑定保温箱  当该字段为零时,代表未绑定保温箱可正常出库
+	CoolerBoxName   string            `json:"coolerBoxName" gorm:"-"`                                   // 保温箱名称
 	model2.ControlBy
 	model2.ControlBy
 	model2.ModelTime
 	model2.ModelTime
 	model2.DeptBy
 	model2.DeptBy
@@ -68,6 +72,8 @@ type IceRaftRecord struct {
 	Label             string           `json:"label" gorm:"size:128;comment:标签"`                         // 标签
 	Label             string           `json:"label" gorm:"size:128;comment:标签"`                         // 标签
 	Code              string           `json:"code" gorm:"size:128;comment:编号"`                          // 编号
 	Code              string           `json:"code" gorm:"size:128;comment:编号"`                          // 编号
 	Status            string           `json:"status" gorm:"size:4;not null;default:'2';comment:状态"`     // 0未入库 1-冷冻中 2-待使用 3-使用中 4已结束 5-释冷中
 	Status            string           `json:"status" gorm:"size:4;not null;default:'2';comment:状态"`     // 0未入库 1-冷冻中 2-待使用 3-使用中 4已结束 5-释冷中
+	Sort              int              `json:"sort" gorm:"size:4;comment:排序"`                            // 排序
+	ForColdTime       int              `json:"forColdTime" gorm:"comment:适冷时长"`                          // 适冷时长 单位分钟
 	InStorageTime     model2.Time      `json:"inStorageTime"  gorm:"size:128;comment:入库时间"`              // 入库时间
 	InStorageTime     model2.Time      `json:"inStorageTime"  gorm:"size:128;comment:入库时间"`              // 入库时间
 	OutStorageTime    model2.Time      `json:"outStorageTime"  gorm:"size:128;comment:出库时间"`             // 出库时间
 	OutStorageTime    model2.Time      `json:"outStorageTime"  gorm:"size:128;comment:出库时间"`             // 出库时间
 	IceLockerId       int              `json:"iceLockerId" gorm:"size:128;comment:冷冻柜id"`                // 冷冻柜id
 	IceLockerId       int              `json:"iceLockerId" gorm:"size:128;comment:冷冻柜id"`                // 冷冻柜id
@@ -87,6 +93,8 @@ type IceRaftRecord struct {
 	CoolerColdAddress string           `json:"cooler-cold-address" gorm:"size:128;comment:保温箱预冷地点"`      //保温箱预冷地点
 	CoolerColdAddress string           `json:"cooler-cold-address" gorm:"size:128;comment:保温箱预冷地点"`      //保温箱预冷地点
 	CoolerColdUsers   string           `json:"cooler-cold-users" gorm:"size:128;comment:保温箱预冷操作人员"`      //保温箱预冷操作人员
 	CoolerColdUsers   string           `json:"cooler-cold-users" gorm:"size:128;comment:保温箱预冷操作人员"`      //保温箱预冷操作人员
 	CoolerUseUsers    string           `json:"cooler-use-users" gorm:"size:128;comment:保温箱使用操作人员"`       //保温箱使用操作人员
 	CoolerUseUsers    string           `json:"cooler-use-users" gorm:"size:128;comment:保温箱使用操作人员"`       //保温箱使用操作人员
+	ReturnDate        model2.Time      `json:"returnDate" gorm:"size:128;comment:归还日期"`                  // 归还日期
+	CoolingTime       string           `json:"coolingTime" gorm:"-"`                                     //释冷时间
 	IceLocker         IceLockerOmit    `json:"iceLocker" gorm:"->"`
 	IceLocker         IceLockerOmit    `json:"iceLocker" gorm:"->"`
 	CoolerBox         CoolerBoxOmit    `json:"coolerBox" gorm:"->"`
 	CoolerBox         CoolerBoxOmit    `json:"coolerBox" gorm:"->"`
 	CoolerBoxRecord   CoolerBoxRecord  `json:"coolerBoxRecord" gorm:"-"`
 	CoolerBoxRecord   CoolerBoxRecord  `json:"coolerBoxRecord" gorm:"-"`
@@ -117,6 +125,7 @@ type IceRaftRecordOmit struct {
 	CoolerColdAddress string           `json:"cooler-cold-address" gorm:"size:128;comment:保温箱预冷地点"` //保温箱预冷地点
 	CoolerColdAddress string           `json:"cooler-cold-address" gorm:"size:128;comment:保温箱预冷地点"` //保温箱预冷地点
 	CoolerColdUsers   string           `json:"cooler-cold-users" gorm:"size:128;comment:保温箱预冷操作人员"` //保温箱预冷操作人员
 	CoolerColdUsers   string           `json:"cooler-cold-users" gorm:"size:128;comment:保温箱预冷操作人员"` //保温箱预冷操作人员
 	CoolerUseUsers    string           `json:"cooler-use-users" gorm:"size:128;comment:保温箱使用操作人员"`  //保温箱使用操作人员
 	CoolerUseUsers    string           `json:"cooler-use-users" gorm:"size:128;comment:保温箱使用操作人员"`  //保温箱使用操作人员
+	CoolingTime       string           `json:"coolingTime" gorm:"-"`                                //释冷时间
 	IceLocker         IceLockerOmit    `json:"iceLocker" gorm:"->"`
 	IceLocker         IceLockerOmit    `json:"iceLocker" gorm:"->"`
 	CoolerBox         CoolerBoxOmit    `json:"coolerBox" gorm:"->"`
 	CoolerBox         CoolerBoxOmit    `json:"coolerBox" gorm:"->"`
 }
 }

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

@@ -14,8 +14,9 @@ var GetCompanyKeyErr = errors.New("获取公司秘钥失败")
 type SysDept struct {
 type SysDept struct {
 	model2.Model
 	model2.Model
 	ParentId            int       `json:"parentId" gorm:""`                                      // 上级部门
 	ParentId            int       `json:"parentId" gorm:""`                                      // 上级部门
-	Path                string    `json:"-" gorm:"size:255;" swaggerignore:"true"`               // 路径
-	Name                string    `json:"name"  gorm:"size:128;"`                                // 部门名称
+	Path                string    `json:"-" gorm:"size:255;comment:路径" swaggerignore:"true"`     // 路径
+	Name                string    `json:"name"  gorm:"size:128;comment:部门名称"`                    // 部门名称
+	AppName             string    `json:"appName"  gorm:"size:128;comment:app名称"`                // 部门名称
 	Sort                int       `json:"-" gorm:"size:4;"`                                      // 排序
 	Sort                int       `json:"-" gorm:"size:4;"`                                      // 排序
 	Status              int       `json:"-" gorm:"size:4;"`                                      // 状态 1-停用 2-正常
 	Status              int       `json:"-" gorm:"size:4;"`                                      // 状态 1-停用 2-正常
 	Remark              string    `json:"remark"  gorm:"size:1024;"`                             // 备注
 	Remark              string    `json:"remark"  gorm:"size:1024;"`                             // 备注
@@ -25,6 +26,7 @@ type SysDept struct {
 	IsCoolerReleaseCold bool      `json:"isCoolerReleaseCold" gorm:"type:boolean;default:false"` //保温箱是否释冷
 	IsCoolerReleaseCold bool      `json:"isCoolerReleaseCold" gorm:"type:boolean;default:false"` //保温箱是否释冷
 	IsCoolerShow        bool      `json:"isCoolerShow" gorm:"type:boolean;default:false"`        //保温箱是否展示开始使用时间
 	IsCoolerShow        bool      `json:"isCoolerShow" gorm:"type:boolean;default:false"`        //保温箱是否展示开始使用时间
 	IsOutStorage        bool      `json:"isOutStorage" gorm:"type:boolean;default:true"`         //是否可以出库  true 需要验证  false 随时出库
 	IsOutStorage        bool      `json:"isOutStorage" gorm:"type:boolean;default:true"`         //是否可以出库  true 需要验证  false 随时出库
+	IceRaftManage       bool      `json:"iceRaftManage" gorm:"type:boolean;default:false"`       //false 全部有  true 只有冰排管理
 	Children            []SysDept `json:"children" gorm:"-"`
 	Children            []SysDept `json:"children" gorm:"-"`
 	CompanyAddress      string    `json:"companyAddress"` //公司地址
 	CompanyAddress      string    `json:"companyAddress"` //公司地址
 	model2.ControlBy
 	model2.ControlBy

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

@@ -122,6 +122,8 @@ type Waybill struct {
 	Prescription               model2.StringList `json:"prescription"`                                                // 处方
 	Prescription               model2.StringList `json:"prescription"`                                                // 处方
 	IsChild                    bool              `json:"isChild" gorm:"type:boolean;default:false"`                   //是否属于子订单
 	IsChild                    bool              `json:"isChild" gorm:"type:boolean;default:false"`                   //是否属于子订单
 	SecondaryTime              model2.Time       `json:"secondary_time" gorm:"comment:分配时间"`                          //分配时间
 	SecondaryTime              model2.Time       `json:"secondary_time" gorm:"comment:分配时间"`                          //分配时间
+	AskForTime                 model2.Time       `json:"askForTime" gorm:"comment:客户要求时间"`                            //客户要求时间
+	DeliveryType               string            `json:"deliveryType" gorm:"size:128;comment:配送方式"`                   // 配送方式
 	model2.ControlBy
 	model2.ControlBy
 	model2.ModelTime
 	model2.ModelTime
 	model2.DeptBy
 	model2.DeptBy

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

@@ -28,6 +28,7 @@ func registerIceRaftRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle
 		r.GET("/newest-record-sse", cont.GetNewestRecordPageSSE)
 		r.GET("/newest-record-sse", cont.GetNewestRecordPageSSE)
 		r.GET("/cooler-box", cont.GetPageByCoolerBoxId)
 		r.GET("/cooler-box", cont.GetPageByCoolerBoxId)
 		r.POST("/isoutstorage", cont.IsOutStorage)
 		r.POST("/isoutstorage", cont.IsOutStorage)
+		r.POST("/bindCoolerBox", cont.BindCoolerBox)
 	}
 	}
 
 
 	cont2 := controller.IceRaftRecordController{}
 	cont2 := controller.IceRaftRecordController{}

+ 28 - 14
app/admin/service/cooler_box.go

@@ -121,17 +121,18 @@ func (e *CoolerBox) Insert(c *dto.CoolerBoxInsertReq, p *actions.DataPermission)
 	}()
 	}()
 
 
 	var k int64
 	var k int64
-	err = tx.Model(&data).Where("sn = ?", c.Sn).Count(&k).Error
-	if err != nil {
-		e.Log.Errorf("db error: %s", err)
-		return global.CreateFailedErr
-	}
-	if k > 0 {
-		err = errors.New("该Sn已绑定!")
-		e.Log.Errorf("db error: %s", err)
-		return err
+	if len(c.Sn) > 0 {
+		err = tx.Model(&data).Where("sn = ?", c.Sn).Count(&k).Error
+		if err != nil {
+			e.Log.Errorf("db error: %s", err)
+			return global.CreateFailedErr
+		}
+		if k > 0 {
+			err = errors.New("该Sn已绑定!")
+			e.Log.Errorf("db error: %s", err)
+			return err
+		}
 	}
 	}
-
 	//var device nats_server.Device
 	//var device nats_server.Device
 	//var company model.SysDept
 	//var company model.SysDept
 	//device, err = nats_server.Cold_ReadDeviceByT_sn(c.Sn)
 	//device, err = nats_server.Cold_ReadDeviceByT_sn(c.Sn)
@@ -160,7 +161,6 @@ func (e *CoolerBox) Insert(c *dto.CoolerBoxInsertReq, p *actions.DataPermission)
 		return global.CreateFailedErr
 		return global.CreateFailedErr
 	}
 	}
 	c.Id = data.Id
 	c.Id = data.Id
-
 	return nil
 	return nil
 
 
 }
 }
@@ -406,7 +406,6 @@ func (e *CoolerBox) GetHistory(c *dto.CoolerBoxBatchReqSN, p *actions.DataPermis
 				e.Log.Errorf("nats 获取轨迹信息失败: %s", err)
 				e.Log.Errorf("nats 获取轨迹信息失败: %s", err)
 				return
 				return
 			}
 			}
-
 		}(task)
 		}(task)
 	}
 	}
 	wg.Wait()
 	wg.Wait()
@@ -478,7 +477,7 @@ func appendUniqueDeviceData(list []nats_server.DeviceData_, newData []nats_serve
 	}
 	}
 	for _, d := range newData {
 	for _, d := range newData {
 		if !uniqueMap[d.T_time] {
 		if !uniqueMap[d.T_time] {
-			if len(d.T_site) > 0 {
+			if len(d.T_site) > 0 && d.T_site != "0,0" {
 				split := strings.Split(d.T_site, ",")
 				split := strings.Split(d.T_site, ",")
 				defer func() {
 				defer func() {
 					if r := recover(); r != nil {
 					if r := recover(); r != nil {
@@ -566,6 +565,19 @@ func (e *CoolerBox) GetCoolerBoxIceAll(c *dto.GetCoolerBoxIceAll, list *[]model.
 			Find(&list).Limit(-1).Offset(-1).Order("cooler_user_time desc").Count(count).
 			Find(&list).Limit(-1).Offset(-1).Order("cooler_user_time desc").Count(count).
 			Count(count).Error
 			Count(count).Error
 	}
 	}
+	for i, _ := range *list {
+		if (*list)[i].CoolerBoxStarTime.String() != "" && (*list)[i].CoolerUserTime.String() != "" {
+			start, _ := time.Parse("2006-01-02 15:04:05", (*list)[i].CoolerBoxStarTime.String())
+			end, _ := time.Parse("2006-01-02 15:04:05", (*list)[i].CoolerUserTime.String())
+			sub := end.Sub(start)
+			hours := int(sub.Hours())
+			minutes := int(sub.Minutes()) % 60
+			sprintf := fmt.Sprintf("%dh%dm\n", hours, minutes)
+			(*list)[i].ForColdDuration = sprintf
+		} else {
+			(*list)[i].ForColdDuration = ""
+		}
+	}
 	if err != nil {
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
 		e.Log.Errorf("db error: %s", err)
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
@@ -676,7 +688,9 @@ func (e *CoolerBox) CoolerBoxEndUse(c *dto.IceStartbleForColfTimReq, p *actions.
 			return errors.New("获取保温箱信息失败")
 			return errors.New("获取保温箱信息失败")
 		}
 		}
 		//保温箱使用状态变为结束使用
 		//保温箱使用状态变为结束使用
-		err = e.Orm.Model(&cooler).Where("cooler_box_id = ?", v).Update("status", "2").Error
+		cooler.CoolerEndUseTime = model2.Time(time.Now())
+		cooler.Status = "2"
+		err = e.Orm.Model(&cooler).Where("cooler_box_id = ?", v).Updates(&cooler).Error
 		if err != nil {
 		if err != nil {
 			e.Log.Errorf("db error: %s", err)
 			e.Log.Errorf("db error: %s", err)
 			return global.CreateFailedErr
 			return global.CreateFailedErr

+ 8 - 0
app/admin/service/dto/company.go

@@ -39,7 +39,9 @@ type CompanyInsertReq struct {
 	IsIceReleaseCold    bool   `json:"isIceReleaseCold" gorm:"type:boolean;default:false"`    //冰排是否释冷
 	IsIceReleaseCold    bool   `json:"isIceReleaseCold" gorm:"type:boolean;default:false"`    //冰排是否释冷
 	IsCoolerReleaseCold bool   `json:"isCoolerReleaseCold" gorm:"type:boolean;default:false"` //保温箱是否释冷
 	IsCoolerReleaseCold bool   `json:"isCoolerReleaseCold" gorm:"type:boolean;default:false"` //保温箱是否释冷
 	IsOutStorage        bool   `json:"isOutStorage" gorm:"type:boolean;default:false"`        //是否出库
 	IsOutStorage        bool   `json:"isOutStorage" gorm:"type:boolean;default:false"`        //是否出库
+	IceRaftManage       bool   `json:"iceRaftManage"`                                         //冰排管理
 	CompanyAddress      string `json:"companyAddress"`                                        //公司地址
 	CompanyAddress      string `json:"companyAddress"`                                        //公司地址
+	AppName             string `json:"appName"`                                               // app名称
 	common.ControlBy    `swaggerignore:"true"`
 	common.ControlBy    `swaggerignore:"true"`
 }
 }
 
 
@@ -55,6 +57,8 @@ func (s *CompanyInsertReq) Generate(model *model.SysDept) {
 	model.IsIceReleaseCold = s.IsIceReleaseCold
 	model.IsIceReleaseCold = s.IsIceReleaseCold
 	model.IsCoolerReleaseCold = s.IsCoolerReleaseCold
 	model.IsCoolerReleaseCold = s.IsCoolerReleaseCold
 	model.IsOutStorage = s.IsOutStorage
 	model.IsOutStorage = s.IsOutStorage
+	model.IceRaftManage = s.IceRaftManage
+	model.AppName = s.AppName
 }
 }
 
 
 // GetId 获取数据对应的ID
 // GetId 获取数据对应的ID
@@ -71,7 +75,9 @@ type CompanyUpdateReq struct {
 	IsCoolerReleaseCold bool   `json:"isCoolerReleaseCold"`                            //保温箱是否释冷
 	IsCoolerReleaseCold bool   `json:"isCoolerReleaseCold"`                            //保温箱是否释冷
 	IsOutStorage        bool   `json:"isOutStorage" gorm:"type:boolean;default:false"` //保温箱是否释冷
 	IsOutStorage        bool   `json:"isOutStorage" gorm:"type:boolean;default:false"` //保温箱是否释冷
 	IsCoolerShow        bool   `json:"isCoolerShow"`                                   //保温箱是否展示开始使用时间
 	IsCoolerShow        bool   `json:"isCoolerShow"`                                   //保温箱是否展示开始使用时间
+	IceRaftManage       bool   `json:"iceRaftManage"`                                  //冰排管理
 	CompanyAddress      string `json:"companyAddress"`                                 //公司地址
 	CompanyAddress      string `json:"companyAddress"`                                 //公司地址
+	AppName             string `json:"appName"`                                        // app名称
 	common.ControlBy    `swaggerignore:"true"`
 	common.ControlBy    `swaggerignore:"true"`
 }
 }
 
 
@@ -88,6 +94,8 @@ func (s *CompanyUpdateReq) Generate(model *model.SysDept) {
 	model.IsCoolerReleaseCold = s.IsCoolerReleaseCold
 	model.IsCoolerReleaseCold = s.IsCoolerReleaseCold
 	model.IsCoolerShow = s.IsCoolerShow
 	model.IsCoolerShow = s.IsCoolerShow
 	model.IsOutStorage = s.IsOutStorage
 	model.IsOutStorage = s.IsOutStorage
+	model.IceRaftManage = s.IceRaftManage
+	model.AppName = s.AppName
 }
 }
 
 
 // GetId 获取数据对应的ID
 // GetId 获取数据对应的ID

+ 21 - 15
app/admin/service/dto/cooler_box.go

@@ -26,14 +26,16 @@ func (m *CoolerBoxGetPageReq) GetNeedSearch() interface{} {
 }
 }
 
 
 type CoolerBoxInsertReq struct {
 type CoolerBoxInsertReq struct {
-	Id               int    `json:"id" comment:"编码" swaggerignore:"true"` // 编码
-	Name             string `json:"name"`                                 // 保温箱名称
-	Sn               string `json:"sn"`                                   // sn
-	Status           string `json:"status"`                               // 1-停用 2-正常
-	ColdSpots        string `json:"cold_spots"`                           //遇冷地点
-	ColdTemperatures string `json:"cold_temperatures"`                    //遇冷温度
-	common.ControlBy `swaggerignore:"true"`
-	common.DeptBy    `swaggerignore:"true"`
+	Id                int      `json:"id" comment:"编码" swaggerignore:"true"` // 编码
+	Name              string   `json:"name"`                                 // 保温箱名称
+	Sn                string   `json:"sn"`                                   // sn
+	Status            string   `json:"status"`                               // 1-停用 2-正常
+	ColdSpots         string   `json:"cold_spots"`                           //遇冷地点
+	ColdTemperatures  string   `json:"cold_temperatures"`                    //遇冷温度
+	Code              []string `json:"code"`
+	ForColdCoolerTime int      `json:"for_cold_cooler_time"` //保温箱预冷要求
+	common.ControlBy  `swaggerignore:"true"`
+	common.DeptBy     `swaggerignore:"true"`
 }
 }
 
 
 func (s *CoolerBoxInsertReq) Generate(model *model.CoolerBox) {
 func (s *CoolerBoxInsertReq) Generate(model *model.CoolerBox) {
@@ -45,6 +47,7 @@ func (s *CoolerBoxInsertReq) Generate(model *model.CoolerBox) {
 	model.Status = s.Status
 	model.Status = s.Status
 	model.ColdSpots = s.ColdSpots
 	model.ColdSpots = s.ColdSpots
 	model.ColdTemperatures = s.ColdTemperatures
 	model.ColdTemperatures = s.ColdTemperatures
+	model.ForColdCoolerTime = s.ForColdCoolerTime
 	if s.ControlBy.UpdateBy != 0 {
 	if s.ControlBy.UpdateBy != 0 {
 		model.UpdateBy = s.UpdateBy
 		model.UpdateBy = s.UpdateBy
 	}
 	}
@@ -61,13 +64,15 @@ func (s *CoolerBoxInsertReq) GetId() interface{} {
 }
 }
 
 
 type CoolerBoxUpdateReq struct {
 type CoolerBoxUpdateReq struct {
-	Id               int    `json:"id" comment:"编码"` // 编码
-	Name             string `json:"name"`            // 保温箱名称
-	Sn               string `json:"sn"`              // sn
-	Status           string `json:"status"`          // 1-停用 2-正常
-	ColdSpots        string `json:"cold_spots"`      //遇冷地点
-	ColdTemperatures string `json:"cold_temperatures"`
-	common.ControlBy `swaggerignore:"true"`
+	Id                int      `json:"id" comment:"编码"` // 编码
+	Name              string   `json:"name"`            // 保温箱名称
+	Sn                string   `json:"sn"`              // sn
+	Status            string   `json:"status"`          // 1-停用 2-正常
+	ColdSpots         string   `json:"cold_spots"`      //遇冷地点
+	ColdTemperatures  string   `json:"cold_temperatures"`
+	Code              []string `json:"code"`
+	ForColdCoolerTime int      `json:"for_cold_cooler_time"` //保温箱预冷要求
+	common.ControlBy  `swaggerignore:"true"`
 }
 }
 
 
 func (s *CoolerBoxUpdateReq) Generate(model *model.CoolerBox) {
 func (s *CoolerBoxUpdateReq) Generate(model *model.CoolerBox) {
@@ -79,6 +84,7 @@ func (s *CoolerBoxUpdateReq) Generate(model *model.CoolerBox) {
 	model.Status = s.Status
 	model.Status = s.Status
 	model.ColdSpots = s.ColdSpots
 	model.ColdSpots = s.ColdSpots
 	model.ColdTemperatures = s.ColdTemperatures
 	model.ColdTemperatures = s.ColdTemperatures
+	model.ForColdCoolerTime = s.ForColdCoolerTime
 	if s.ControlBy.UpdateBy != 0 {
 	if s.ControlBy.UpdateBy != 0 {
 		model.UpdateBy = s.UpdateBy
 		model.UpdateBy = s.UpdateBy
 	}
 	}

+ 11 - 3
app/admin/service/dto/ice_raft.go

@@ -16,8 +16,8 @@ type IceRaftRecordRecording struct {
 	dto.Pagination `search:"-"`
 	dto.Pagination `search:"-"`
 	StartTime      string `form:"startTime" search:"-"`                                                          // 开始时间
 	StartTime      string `form:"startTime" search:"-"`                                                          // 开始时间
 	EndTime        string `form:"endTime" search:"-"`                                                            // 结束时间
 	EndTime        string `form:"endTime" search:"-"`                                                            // 结束时间
-	CoolerBoxId    int    `form:"coolerBoxId" search:"type:contains;column:cooler_box_id;table:ice_raft_record"` // 保温箱id
-	IceLockerId    int    `form:"iceLockerId" search:"type:contains;column:ice_locker_id;table:ice_raft_record"` // 冷冻柜id
+	CoolerBoxId    string `form:"coolerBoxId" search:"type:contains;column:cooler_box_id;table:ice_raft_record"` // 保温箱id
+	IceLockerId    string `form:"iceLockerId" search:"type:contains;column:ice_locker_id;table:ice_raft_record"` // 冷冻柜id
 	Code           string `form:"code" search:"type:contains;column:code;table:ice_raft_record"`                 // 冰排名称
 	Code           string `form:"code" search:"type:contains;column:code;table:ice_raft_record"`                 // 冰排名称
 }
 }
 type IceRaftGetNewestRecordPageReq struct {
 type IceRaftGetNewestRecordPageReq struct {
@@ -54,8 +54,10 @@ type IceRaftInsertReq struct {
 	Status           string           `json:"status"`                                                   // 1-停用 2-正常
 	Status           string           `json:"status"`                                                   // 1-停用 2-正常
 	FreezeClaim      common.FloatList `json:"freezeClaim"`                                              // 冷冻要求 单位小时
 	FreezeClaim      common.FloatList `json:"freezeClaim"`                                              // 冷冻要求 单位小时
 	Label            string           `json:"label"`                                                    // 标签
 	Label            string           `json:"label"`                                                    // 标签
-	IceColdAddress   string           `json:"iceColdAddress" gorm:"size:128;comment:冰排预冷地点"`            //冰排冷地点
+	IceColdAddress   string           `json:"iceColdAddress" gorm:"size:128;comment:冰排预冷地点"`            //冰排冷地点
 	SuitableForCold  float32          `json:"suitableForCold" gorm:"type:decimal(10,2);comment:冰排适冷温度"` // 冰排遇冷温度
 	SuitableForCold  float32          `json:"suitableForCold" gorm:"type:decimal(10,2);comment:冰排适冷温度"` // 冰排遇冷温度
+	Sort             int              `json:"sort"`                                                     // 排序
+	ForColdTime      int              `json:"forColdTime"`                                              // 释冷时长 单位分钟
 	common.ControlBy `swaggerignore:"true"`
 	common.ControlBy `swaggerignore:"true"`
 	common.DeptBy    `swaggerignore:"true"`
 	common.DeptBy    `swaggerignore:"true"`
 }
 }
@@ -70,6 +72,8 @@ func (s *IceRaftInsertReq) Generate(model *model.IceRaft, code string) {
 	model.Label = s.Label
 	model.Label = s.Label
 	model.IceColdAddress = s.IceColdAddress
 	model.IceColdAddress = s.IceColdAddress
 	model.SuitableForCold = s.SuitableForCold
 	model.SuitableForCold = s.SuitableForCold
+	model.Sort = s.Sort
+	model.ForColdTime = s.ForColdTime
 	if s.ControlBy.UpdateBy != 0 {
 	if s.ControlBy.UpdateBy != 0 {
 		model.UpdateBy = s.UpdateBy
 		model.UpdateBy = s.UpdateBy
 	}
 	}
@@ -93,6 +97,8 @@ type IceRaftUpdateReq struct {
 	FreezeClaim      common.FloatList `json:"freezeClaim"`                                              // 冷冻要求 单位小时
 	FreezeClaim      common.FloatList `json:"freezeClaim"`                                              // 冷冻要求 单位小时
 	IceColdAddress   string           `json:"iceColdAddress" gorm:"size:128;comment:冰排预冷地点"`            //冰排预冷地点
 	IceColdAddress   string           `json:"iceColdAddress" gorm:"size:128;comment:冰排预冷地点"`            //冰排预冷地点
 	SuitableForCold  float32          `json:"suitableForCold" gorm:"type:decimal(10,2);comment:冰排适冷温度"` // 冰排遇冷温度
 	SuitableForCold  float32          `json:"suitableForCold" gorm:"type:decimal(10,2);comment:冰排适冷温度"` // 冰排遇冷温度
+	Sort             int              `json:"sort"`
+	ForColdTime      int              `json:"forColdTime"` // 适冷时长 单位分钟
 	common.ControlBy `swaggerignore:"true"`
 	common.ControlBy `swaggerignore:"true"`
 }
 }
 
 
@@ -106,6 +112,8 @@ func (s *IceRaftUpdateReq) Generate(model *model.IceRaft) {
 	model.Label = s.Label
 	model.Label = s.Label
 	model.IceColdAddress = s.IceColdAddress
 	model.IceColdAddress = s.IceColdAddress
 	model.SuitableForCold = s.SuitableForCold
 	model.SuitableForCold = s.SuitableForCold
+	model.Sort = s.Sort
+	model.ForColdTime = s.ForColdTime
 	if s.ControlBy.UpdateBy != 0 {
 	if s.ControlBy.UpdateBy != 0 {
 		model.UpdateBy = s.UpdateBy
 		model.UpdateBy = s.UpdateBy
 	}
 	}

+ 22 - 8
app/admin/service/dto/waybill.go

@@ -11,13 +11,16 @@ import (
 // 运单
 // 运单
 
 
 type WaybillGetPageReq struct {
 type WaybillGetPageReq struct {
-	dto2.Pagination  `search:"-"`
-	WaybillNo        string `form:"waybillNo" search:"type:contains;column:waybill_no;table:waybill"`              // 运单编号
-	OrderNo          string `form:"orderNo" search:"type:contains;column:order_no;table:waybill"`                  // 运单编号
-	Status           int    `form:"status" search:"type:exact;column:status;table:waybill"`                        // 状态
-	AssignmentStatus int    `form:"assignment_status"  search:"type:exact;column:assignment_status;table:waybill"` //分配状态  1 未分配  2已分配
-	OrderStartTime   string `form:"orderStartTime" search:"type:gte;column:order_time;table:waybill"`              // 下单开始时间
-	OrderEndTime     string `form:"orderEndTime" search:"type:lte;column:order_time;table:waybill"`                // 下单结束时间
+	dto2.Pagination       `search:"-"`
+	WaybillNo             string `form:"waybillNo" search:"type:contains;column:waybill_no;table:waybill"`                            // 运单编号
+	OrderNo               string `form:"orderNo" search:"type:contains;column:order_no;table:waybill"`                                // 订单编号
+	ConsigneeAddressName  string `form:"Consignee_address_name" search:"type:contains;column:consignee_address_name;table:waybill"`   // 患者名称
+	ConsigneeAddressPhone string `form:"Consignee_address_phone" search:"type:contains;column:consignee_address_phone;table:waybill"` // 患者手机号
+	DeliveryName          string `form:"delivery_name" search:"type:contains;column:delivery_name;table:waybill"`                     // 配送员
+	Status                int    `form:"status" search:"type:exact;column:status;table:waybill"`                                      // 状态
+	AssignmentStatus      int    `form:"assignment_status"  search:"type:exact;column:assignment_status;table:waybill"`               //分配状态  1 未分配  2已分配
+	OrderStartTime        string `form:"orderStartTime" search:"type:gte;column:order_time;table:waybill"`                            // 下单开始时间
+	OrderEndTime          string `form:"orderEndTime" search:"type:lte;column:order_time;table:waybill"`                              // 下单结束时间
 	WaybillOrder
 	WaybillOrder
 }
 }
 type WaybillOrder struct {
 type WaybillOrder struct {
@@ -65,6 +68,8 @@ type WaybillInsertReq struct {
 	Drugs                   []model.Drug      `json:"drugs"`                                                                //药品信息
 	Drugs                   []model.Drug      `json:"drugs"`                                                                //药品信息
 	IsPhone                 bool              `json:"is_phone"`                                                             //是否手机添加订单
 	IsPhone                 bool              `json:"is_phone"`                                                             //是否手机添加订单
 	Prescription            model2.StringList `json:"prescription"`
 	Prescription            model2.StringList `json:"prescription"`
+	AskForTime              model2.Time       `json:"askForTime" gorm:"comment:客户要求时间"`          //客户要求时间
+	DeliveryType            string            `json:"deliveryType" gorm:"size:128;comment:配送方式"` // 配送方式
 	model2.ControlBy        `swaggerignore:"true"`
 	model2.ControlBy        `swaggerignore:"true"`
 	model2.DeptBy
 	model2.DeptBy
 }
 }
@@ -90,6 +95,8 @@ func (s *WaybillInsertReq) Generate(m *model.Waybill) {
 	m.Prescription = s.Prescription
 	m.Prescription = s.Prescription
 	m.OrderTime = model2.Time(time.Now())
 	m.OrderTime = model2.Time(time.Now())
 
 
+	m.AskForTime = s.AskForTime
+	m.DeliveryType = s.DeliveryType
 	if s.ControlBy.UpdateBy != 0 {
 	if s.ControlBy.UpdateBy != 0 {
 		m.UpdateBy = s.UpdateBy
 		m.UpdateBy = s.UpdateBy
 	}
 	}
@@ -173,7 +180,10 @@ type WaybillUpdateReq struct {
 	Remark                  string            `json:"remark"`                  //运输备注
 	Remark                  string            `json:"remark"`                  //运输备注
 	CoolerBoxId             int               `json:"coolerBoxId"`             //保温箱id
 	CoolerBoxId             int               `json:"coolerBoxId"`             //保温箱id
 	Prescription            model2.StringList `json:"prescription"`
 	Prescription            model2.StringList `json:"prescription"`
-	Drugs                   []model.Drug      `json:"drugs"` //药品信息
+	Drugs                   []model.Drug      `json:"drugs"`                                     //药品信息
+	AskForTime              model2.Time       `json:"askForTime" gorm:"comment:客户要求时间"`          //客户要求时间
+	DeliveryType            string            `json:"deliveryType" gorm:"size:128;comment:配送方式"` // 配送方式
+	IsSecondaryDistribution bool              `json:"is_secondary_distribution"`                 //是否二次分配
 	model2.ControlBy        `swaggerignore:"true"`
 	model2.ControlBy        `swaggerignore:"true"`
 	model2.DeptBy           `swaggerignore:"true"`
 	model2.DeptBy           `swaggerignore:"true"`
 }
 }
@@ -214,6 +224,10 @@ func (s *WaybillUpdateReq) Generate(m *model.Waybill) {
 	m.TamperProofLabel = s.TamperProofLabel
 	m.TamperProofLabel = s.TamperProofLabel
 	m.TamperProofLabelImg = s.TamperProofLabelImg
 	m.TamperProofLabelImg = s.TamperProofLabelImg
 	m.Prescription = s.Prescription
 	m.Prescription = s.Prescription
+	m.Drugs = s.Drugs
+	m.AskForTime = s.AskForTime
+	m.IsSecondaryDistribution = s.IsSecondaryDistribution
+	m.DeliveryType = s.DeliveryType
 	if s.CoolerBoxId > 0 {
 	if s.CoolerBoxId > 0 {
 		m.CoolerBoxId = s.CoolerBoxId
 		m.CoolerBoxId = s.CoolerBoxId
 	}
 	}

+ 139 - 35
app/admin/service/ice_raft.go

@@ -28,7 +28,7 @@ func (e *IceRaft) GetPage(c *dto.IceRaftGetPageReq, list *[]model.IceRaft, count
 		err = e.Orm.Model(&data).
 		err = e.Orm.Model(&data).
 			Scopes(
 			Scopes(
 				actions.Permission(data.TableName(), p),
 				actions.Permission(data.TableName(), p),
-			).
+			).Order("ice_raft.sort desc").
 			Find(list).Limit(-1).Offset(-1).
 			Find(list).Limit(-1).Offset(-1).
 			Count(count).Error
 			Count(count).Error
 	} else {
 	} else {
@@ -37,10 +37,19 @@ func (e *IceRaft) GetPage(c *dto.IceRaftGetPageReq, list *[]model.IceRaft, count
 				cDto.MakeCondition(c.GetNeedSearch()),
 				cDto.MakeCondition(c.GetNeedSearch()),
 				cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
 				cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
 				actions.Permission(data.TableName(), p),
 				actions.Permission(data.TableName(), p),
-			).
+			).Order("ice_raft.sort desc").
 			Find(list).Limit(-1).Offset(-1).
 			Find(list).Limit(-1).Offset(-1).
 			Count(count).Error
 			Count(count).Error
 	}
 	}
+	for i, _ := range *list {
+		if (*list)[i].BindCoolerBox != 0 {
+			err = e.Orm.Model(&model.CoolerBox{}).Select("name").Where("id = ?", (*list)[i].BindCoolerBox).First(&(*list)[i].CoolerBoxName).Error
+			if err != nil {
+				e.Log.Errorf("db error: %s", err)
+				return global.GetFailedErr
+			}
+		}
+	}
 	if err != nil {
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
 		e.Log.Errorf("db error: %s", err)
 		return global.GetFailedErr
 		return global.GetFailedErr
@@ -141,6 +150,17 @@ func (e *IceRaft) GetRecordPage(c *dto.IceRaftGetNewestRecordPageReq, list *[]mo
 			Find(list).Limit(-1).Offset(-1).
 			Find(list).Limit(-1).Offset(-1).
 			Count(count).Error
 			Count(count).Error
 	}
 	}
+	for i, _ := range *list {
+		if (*list)[i].IceRaftRecord.IsSuitableForCold == 1 {
+			start, _ := time.Parse("2006-01-02 15:04:05", (*list)[i].IceRaftRecord.StartIceColdTime.String())
+			end, _ := time.Parse("2006-01-02 15:04:05", (*list)[i].IceRaftRecord.EndForColdTime.String())
+			sub := end.Sub(start)
+			hours := sub.Hours()
+			minutes := int(sub.Minutes()) % 60
+			sprintf := fmt.Sprintf("%vh%dm\n", hours, minutes)
+			(*list)[i].IceRaftRecord.CoolingTime = sprintf
+		}
+	}
 	if err != nil {
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
 		e.Log.Errorf("db error: %s", err)
 		return global.GetFailedErr
 		return global.GetFailedErr
@@ -354,23 +374,7 @@ func (e *IceRaft) InStorage(c *dto.IceRaftInStorageReq, p *actions.DataPermissio
 			Preload("IceRaftRecord").
 			Preload("IceRaftRecord").
 			First(&iceRaftModel).Error
 			First(&iceRaftModel).Error
 		if err != nil {
 		if err != nil {
-			// 冰排编号不存在,添加
-			//if errors.Is(err, gorm.ErrRecordNotFound) {
-			//	iceRaftModel.Code = code
-			//	iceRaftModel.Status = model.IceRaftStatusNormal
-			//	iceRaftModel.DeptId = p.DeptId
-			//	iceRaftModel.CreateBy = p.UserId
-			//	err = tx.Create(&iceRaftModel).Error
-			//	if err != nil {
-			//		e.Log.Errorf("db error: %s", err)
-			//		return errors.New(fmt.Sprintf("添加冰排【%s】信息失败", code))
-			//	}
-			//} else {
-			//	e.Log.Errorf("db error: %s", err)
-			//	return errors.New(fmt.Sprintf("获取冰排【%s】信息失败",code))
-			//}
-
-			e.Log.Errorf("db error: %s", err)
+			e.Log.Errorf("获取冰排信息失败 %s", err)
 			return errors.New(fmt.Sprintf("获取冰排【%s】信息失败", code))
 			return errors.New(fmt.Sprintf("获取冰排【%s】信息失败", code))
 		}
 		}
 
 
@@ -388,7 +392,8 @@ func (e *IceRaft) InStorage(c *dto.IceRaftInStorageReq, p *actions.DataPermissio
 		err = tx.Model(&model.IceRaftRecord{}).
 		err = tx.Model(&model.IceRaftRecord{}).
 			Where("ice_raft_id = ? and status = ?", iceRaftModel.Id, model.IceRaftRecordStatusUsing).
 			Where("ice_raft_id = ? and status = ?", iceRaftModel.Id, model.IceRaftRecordStatusUsing).
 			Updates(map[string]interface{}{
 			Updates(map[string]interface{}{
-				"status": model.IceRaftRecordStatusFinish,
+				"status":      model.IceRaftRecordStatusFinish,
+				"return_date": model2.Time(time.Now()),
 			}).Error
 			}).Error
 
 
 		// 添加冰排记录
 		// 添加冰排记录
@@ -399,6 +404,8 @@ func (e *IceRaft) InStorage(c *dto.IceRaftInStorageReq, p *actions.DataPermissio
 			Label:         iceRaftModel.Label,
 			Label:         iceRaftModel.Label,
 			Code:          code,
 			Code:          code,
 			InStorageTime: model2.Time(time.Now()),
 			InStorageTime: model2.Time(time.Now()),
+			Sort:          iceRaftModel.Sort,
+			ForColdTime:   iceRaftModel.ForColdTime,
 			//FreezeClaim:   iceRaftModel.FreezeClaim,
 			//FreezeClaim:   iceRaftModel.FreezeClaim,
 			DeptBy: model2.DeptBy{
 			DeptBy: model2.DeptBy{
 				DeptId: p.DeptId,
 				DeptId: p.DeptId,
@@ -450,9 +457,16 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 		return err
 		return err
 	}
 	}
 	var user model.SysUser
 	var user model.SysUser
+	falseIce := make([]string, 0)
 	first := e.Orm.Model(&model.SysUser{}).Where("id = ?", p.UserId).First(&user)
 	first := e.Orm.Model(&model.SysUser{}).Where("id = ?", p.UserId).First(&user)
 	if first.Error != nil {
 	if first.Error != nil {
-		return global.GetFailedErr
+		err = errors.New("获取用户信息失败")
+		return err
+	}
+	err, sysUser := GetUserProfile(e.Orm, p.UserId)
+	if err != nil {
+		err = errors.New("获取用户信息失败")
+		return err
 	}
 	}
 	for _, code := range c.Code {
 	for _, code := range c.Code {
 		// 查询冰排是否存在
 		// 查询冰排是否存在
@@ -471,6 +485,12 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 			return err
 			return err
 		}
 		}
 
 
+		//判断冰排绑定,当冰排绑定和需要绑定的保温箱id不一致时禁止冰排出库装箱
+		if iceRaftModel.BindCoolerBox != 0 && iceRaftModel.BindCoolerBox != coolerBoxModel.Id {
+			err = errors.New(fmt.Sprintf("冰排【%s】绑定的保温箱id为%d,当前保温箱id为%d,禁止出库!", code, iceRaftModel.BindCoolerBox, c.CoolerBoxId))
+			return err
+		}
+
 		// 获取冰排记录
 		// 获取冰排记录
 		var iceRaftRecordModel model.IceRaftRecord
 		var iceRaftRecordModel model.IceRaftRecord
 		err = e.Orm.Scopes(actions.Permission(iceRaftRecordModel.TableName(), p)).
 		err = e.Orm.Scopes(actions.Permission(iceRaftRecordModel.TableName(), p)).
@@ -489,11 +509,7 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 		sort.Slice(iceRaftRecordModel.FreezeClaim, func(i, j int) bool {
 		sort.Slice(iceRaftRecordModel.FreezeClaim, func(i, j int) bool {
 			return iceRaftRecordModel.FreezeClaim[i] < iceRaftRecordModel.FreezeClaim[j]
 			return iceRaftRecordModel.FreezeClaim[i] < iceRaftRecordModel.FreezeClaim[j]
 		})
 		})
-		err, sysUser := GetUserProfile(e.Orm, p.UserId)
-		if err != nil {
-			err = errors.New("获取用户信息失败")
-			return err
-		}
+
 		if sysUser.Dept.IsOutStorage {
 		if sysUser.Dept.IsOutStorage {
 			for _, v := range iceRaftRecordModel.FreezeClaim {
 			for _, v := range iceRaftRecordModel.FreezeClaim {
 				if inTime.Add(time.Hour * time.Duration(v)).After(time.Now()) {
 				if inTime.Add(time.Hour * time.Duration(v)).After(time.Now()) {
@@ -503,10 +519,14 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 				}
 				}
 			}
 			}
 		}
 		}
-		//if inTime.Add(time.Hour * time.Duration(iceRaftRecordModel.FreezeClaim[0])).After(time.Now()) {
-		//	err = errors.New(fmt.Sprintf("冰排【%s】未达到冷冻时长,禁止出库", code))
-		//	return err
-		//}
+		//判断冰排释冷要求是否为0,如果不为零,则判断是否达到释冷时长,否则不允许出库
+		if sysUser.Dept.IsIceReleaseCold && iceRaftRecordModel.ForColdTime != 0 {
+			start, err := time.Parse("2006-01-02 15:04:05", iceRaftRecordModel.StartIceColdTime.String())
+			if start.Add(time.Minute * time.Duration(iceRaftRecordModel.ForColdTime)).After(time.Now()) {
+				err = errors.New(fmt.Sprintf("冰排【%s】未达到释冷时长【%v】,禁止出库", code, iceRaftRecordModel.ForColdTime))
+				return err
+			}
+		}
 
 
 		iceRaftRecordModel.Status = model.IceRaftRecordStatusUsing
 		iceRaftRecordModel.Status = model.IceRaftRecordStatusUsing
 		iceRaftRecordModel.CoolerBoxId = coolerBoxModel.Id
 		iceRaftRecordModel.CoolerBoxId = coolerBoxModel.Id
@@ -525,7 +545,21 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 			return errors.New("保存冰排记录失败")
 			return errors.New("保存冰排记录失败")
 		}
 		}
 	}
 	}
-
+	m := make(map[string]bool)
+	if len(coolerBoxModel.BindIceRaftId) != 0 {
+		for _, v := range coolerBoxModel.BindIceRaftId {
+			m[v] = true
+		}
+		for _, v := range c.Code {
+			if !m[v] {
+				falseIce = append(falseIce, v)
+			}
+		}
+	}
+	if len(falseIce) > 0 {
+		err = errors.New(fmt.Sprintf("冰排%s未绑定该保温箱,禁止出库!", falseIce))
+		return err
+	}
 	//添加保温箱记录
 	//添加保温箱记录
 	var cooler model.CoolerBoxRecord
 	var cooler model.CoolerBoxRecord
 	cooler.CoolerBoxId = coolerBoxModel.Id
 	cooler.CoolerBoxId = coolerBoxModel.Id
@@ -536,6 +570,7 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 	cooler.Name = coolerBoxModel.Name
 	cooler.Name = coolerBoxModel.Name
 	cooler.HistoryCode = append(cooler.HistoryCode, c.Code...)
 	cooler.HistoryCode = append(cooler.HistoryCode, c.Code...)
 	cooler.CoolerUseUsers = user.NickName
 	cooler.CoolerUseUsers = user.NickName
+	cooler.ForColdCoolerTime = coolerBoxModel.ForColdCoolerTime
 	//查询是否有正在使用中的保温箱记录
 	//查询是否有正在使用中的保温箱记录
 	var count int64
 	var count int64
 	var coolerBoxRecordModel model.CoolerBoxRecord
 	var coolerBoxRecordModel model.CoolerBoxRecord
@@ -552,6 +587,13 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 			return errors.New("获取保温箱信息失败")
 			return errors.New("获取保温箱信息失败")
 		}
 		}
 	}
 	}
+	if sysUser.Dept.IsCoolerReleaseCold && coolerBoxModel.ForColdCoolerTime != 0 {
+		start, err := time.Parse("2006-01-02 15:04:05", coolerBoxRecordModel.CoolerBoxStarTime.String())
+		if start.Add(time.Minute * time.Duration(coolerBoxModel.ForColdCoolerTime)).After(time.Now()) {
+			err = errors.New(fmt.Sprintf("保温箱未达到释冷时长【%v】分钟,禁止装箱", coolerBoxModel.ForColdCoolerTime))
+			return err
+		}
+	}
 	//如果有正在使用中的保温箱记录,就更新
 	//如果有正在使用中的保温箱记录,就更新
 	if count > 0 {
 	if count > 0 {
 		err = tx.Where("id = ?", coolerBoxRecordModel.Id).Updates(&cooler).Error
 		err = tx.Where("id = ?", coolerBoxRecordModel.Id).Updates(&cooler).Error
@@ -563,6 +605,67 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 	return nil
 	return nil
 }
 }
 
 
+// BindCookerBox 冰排绑定保温箱
+func (e *IceRaft) BindCookerBox(c *dto.IceRaftOutStorageReq, p *actions.DataPermission) error {
+	var err error
+
+	tx := e.Orm.Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+	// 查询保温箱信息
+	var coolerBoxModel model.CoolerBox
+	err = e.Orm.Scopes(actions.Permission(coolerBoxModel.TableName(), p)).
+		First(&coolerBoxModel, c.CoolerBoxId).Error
+	if err != nil {
+		e.Log.Errorf("db error: %s", err)
+		return errors.New("获取保温箱信息失败")
+	}
+	if coolerBoxModel.Status != model.CoolerBoxStatusNormal {
+		err = errors.New("保温箱状态异常")
+		return err
+	}
+	for _, code := range c.Code {
+		// 查询冰排是否存在
+		var iceRaftModel model.IceRaft
+		err = e.Orm.Scopes(actions.Permission(iceRaftModel.TableName(), p)).
+			Where("code = ?", code).
+			Preload("IceRaftRecord").
+			First(&iceRaftModel).Error
+		if err != nil {
+			e.Log.Errorf("获取冰排信息失败: %s", err)
+			return errors.New("获取冰排信息失败")
+		}
+
+		if iceRaftModel.Status != model.IceRaftStatusNormal {
+			err = errors.New(fmt.Sprintf("冰排【%s】状态异常", code))
+			return err
+		}
+		if iceRaftModel.BindCoolerBox != 0 {
+			err = tx.Model(&coolerBoxModel).Where("id =?", iceRaftModel.BindCoolerBox).Update("bind_ice_raft_id", "").Error
+			err = errors.New("更新绑定失败")
+			return err
+		}
+		err = tx.Model(&iceRaftModel).Where("id =?", iceRaftModel.Id).Update("bind_cooler_box", coolerBoxModel.Id).Error
+		if err != nil {
+			e.Log.Errorf("绑定保温箱失败: %s", err)
+			return errors.New("绑定保温箱失败")
+		}
+		coolerBoxModel.BindIceRaftId = append(coolerBoxModel.BindIceRaftId, code)
+		coolerBoxModel.BindIceRaftId = cDto.UniqueSlice(coolerBoxModel.BindIceRaftId)
+		err = tx.Model(&coolerBoxModel).Where("id =?", coolerBoxModel.Id).Update("bind_ice_raft_id", coolerBoxModel.BindIceRaftId).Error
+		if err != nil {
+			e.Log.Errorf("绑定保温箱失败: %s", err)
+			return errors.New("绑定保温箱失败")
+		}
+	}
+	return nil
+}
+
 // IsOutStorage 判断冰排是否达到冷冻时长
 // IsOutStorage 判断冰排是否达到冷冻时长
 func (e *IceRaft) IsOutStorage(c *dto.IceOutStorageReq, p *actions.DataPermission) (error, string) {
 func (e *IceRaft) IsOutStorage(c *dto.IceOutStorageReq, p *actions.DataPermission) (error, string) {
 	var err error
 	var err error
@@ -582,6 +685,7 @@ func (e *IceRaft) IsOutStorage(c *dto.IceOutStorageReq, p *actions.DataPermissio
 				err = e.Orm.Scopes(actions.Permission(iceRaftRecordModel.TableName(), p)).
 				err = e.Orm.Scopes(actions.Permission(iceRaftRecordModel.TableName(), p)).
 					Where("code = ?", v).
 					Where("code = ?", v).
 					Where("status = ?", model.IceRaftRecordStatusWaitUse).
 					Where("status = ?", model.IceRaftRecordStatusWaitUse).
+					Or("status=?", model.IceRaftRecordStatusUsing).
 					First(&iceRaftRecordModel).Error
 					First(&iceRaftRecordModel).Error
 				if err != nil {
 				if err != nil {
 					e.Log.Errorf("db error: %s", err)
 					e.Log.Errorf("db error: %s", err)
@@ -848,9 +952,9 @@ func (e *IceRaftRecord) StartForCold(c *dto.IceStartbleForColfTimReq, p *actions
 		if err != nil {
 		if err != nil {
 			e.Log.Errorf("db error: %s", err)
 			e.Log.Errorf("db error: %s", err)
 			if errors.Is(err, gorm.ErrRecordNotFound) {
 			if errors.Is(err, gorm.ErrRecordNotFound) {
-				return global.UpdateNotFoundOrNoPermissionErr
+				return errors.New("获取数据失败")
 			}
 			}
-			return global.UpdateFailedErr
+			return errors.New("获取冰排失败")
 		}
 		}
 		err = e.Orm.Model(&iceRaft).Where("id = ?", iceRaftRecordModel.IceRaftId).First(&iceRaft).Error
 		err = e.Orm.Model(&iceRaft).Where("id = ?", iceRaftRecordModel.IceRaftId).First(&iceRaft).Error
 		if err != nil {
 		if err != nil {
@@ -906,8 +1010,8 @@ func (e *IceRaft) IceRaftRecordRecording(c *dto.IceRaftRecordRecording, list *[]
 		return global.GetFailedErr
 		return global.GetFailedErr
 	}
 	}
 	var Ice model.IceRaftOmit
 	var Ice model.IceRaftOmit
-	for i, _ := range *list {
-		err := e.Orm.Model(&Ice).Where("id = ?", (*list)[i].IceRaftId).Find(&(*list)[i].IceRafts).Error
+	for i := range *list {
+		err = e.Orm.Model(&Ice).Where("id = ?", (*list)[i].IceRaftId).Find(&(*list)[i].IceRafts).Error
 		if err != nil {
 		if err != nil {
 			return global.GetFailedErr
 			return global.GetFailedErr
 		}
 		}

+ 79 - 13
app/admin/service/waybill.go

@@ -379,6 +379,11 @@ func (e *Waybill) Insert(c *dto.WaybillInsertReq) error {
 	}
 	}
 	if len(c.Drugs) > 0 {
 	if len(c.Drugs) > 0 {
 		for _, drug := range c.Drugs {
 		for _, drug := range c.Drugs {
+			//var count int64
+			//e.Orm.Model(&model.Drug{}).Where("code = ?", drug.Code).Count(&count)
+			//if count > 0 {
+			//	return errors.New("药品编号已存在")
+			//}
 			var drugs model.Drug
 			var drugs model.Drug
 			drugs.WaybillNo = no
 			drugs.WaybillNo = no
 			drugs.Drug_ent_base_info_id = drug.Drug_ent_base_info_id
 			drugs.Drug_ent_base_info_id = drug.Drug_ent_base_info_id
@@ -424,16 +429,37 @@ func (e *Waybill) Update(c *dto.WaybillUpdateReq, p *actions.DataPermission) err
 		}
 		}
 		return global.UpdateFailedErr
 		return global.UpdateFailedErr
 	}
 	}
-
 	c.Generate(&waybillModel)
 	c.Generate(&waybillModel)
 	var count int64
 	var count int64
+	//var codes []string
+	//tx.Model(&model.Drug{}).Select("code").Where("waybill_no = ?", waybillModel.WaybillNo).Find(&codes)
+	tx.Model(&model.Drug{}).Where("waybill_no = ?", waybillModel.WaybillNo).Count(&count)
 	for _, drug := range c.Drugs {
 	for _, drug := range c.Drugs {
-		e.Orm.Model(&model.Drug{}).Where("code = ?", drug.Code).Count(&count)
 		if count > 0 {
 		if count > 0 {
-			return errors.New("药品编号已存在")
+			err = tx.Model(&model.Drug{}).Where("waybill_no = ?", waybillModel.WaybillNo).Delete(&model.Drug{}).Error
+			if err != nil {
+				e.Log.Errorf("删除药品信息失败: %s", err)
+				return errors.New("删除药品信息失败")
+			}
 		}
 		}
+		var drugs model.Drug
+		drugs.WaybillNo = waybillModel.WaybillNo
+		drugs.Drug_ent_base_info_id = drug.Drug_ent_base_info_id
+		drugs.Ent_name = drug.Ent_name
+		drugs.Physic_name = drug.Physic_name
+		drugs.Approval_licence_no = drug.Approval_licence_no
+		drugs.Prepn_spec = drug.Prepn_spec
+		drugs.Physic_type_desc = drug.Physic_type_desc
+		drugs.Pkg_spec_crit = drug.Pkg_spec_crit
+		drugs.Prepn_type_desc = drug.Prepn_type_desc
+		drugs.Code = drug.Code
+		err = tx.Save(&drugs).Error
+		if err != nil {
+			e.Log.Errorf("db error: %s", err)
+			return errors.New("保存药品信息失败")
+		}
+
 	}
 	}
-	waybillModel.Drugs = append(waybillModel.Drugs, c.Drugs...)
 	err = tx.Where("id = ?", waybillModel.Id).Updates(&waybillModel).Error
 	err = tx.Where("id = ?", waybillModel.Id).Updates(&waybillModel).Error
 	if err != nil {
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
 		e.Log.Errorf("db error: %s", err)
@@ -534,7 +560,7 @@ func (e *Waybill) UpdateStatus(c *dto.UpdateStatusReq, p *actions.DataPermission
 			return global.UpdateFailedErr
 			return global.UpdateFailedErr
 		}
 		}
 		//添加确认人信息
 		//添加确认人信息
-		if waybillModel.Status == model.WaybillStatusAudits {
+		if c.Status == model.WaybillStatusAudits {
 			err, sysUser := GetUserProfile(e.Orm, p.UserId)
 			err, sysUser := GetUserProfile(e.Orm, p.UserId)
 			if err != nil {
 			if err != nil {
 				e.Log.Errorf("db 获取用户信息失败: %s", err)
 				e.Log.Errorf("db 获取用户信息失败: %s", err)
@@ -725,6 +751,9 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 					cooler.Name = coolerBox.Name
 					cooler.Name = coolerBox.Name
 					cooler.Sn = coolerBox.Sn
 					cooler.Sn = coolerBox.Sn
 					cooler.CoolerUseUsers = user.NickName
 					cooler.CoolerUseUsers = user.NickName
+					cooler.CoolerUserTime = model2.Time(time.Now())
+					cooler.Status = "1" //使用结束
+					cooler.DeptId = user.DeptId
 					if len(list) == 0 {
 					if len(list) == 0 {
 						cooler.HistoryCode = append(cooler.HistoryCode, c.IceRaftCode...)
 						cooler.HistoryCode = append(cooler.HistoryCode, c.IceRaftCode...)
 						cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
 						cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
@@ -732,9 +761,6 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 						cooler.HistoryCode = append(cooler.HistoryCode, list...)
 						cooler.HistoryCode = append(cooler.HistoryCode, list...)
 						cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
 						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
 					err := e.Orm.Save(&cooler).Error
 					if err != nil {
 					if err != nil {
 						e.Log.Errorf("保存保温箱记录失败: %s", err)
 						e.Log.Errorf("保存保温箱记录失败: %s", err)
@@ -749,8 +775,6 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 						cooler.HistoryCode = append(cooler.HistoryCode, list...)
 						cooler.HistoryCode = append(cooler.HistoryCode, list...)
 						cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
 						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
 					err = e.Orm.Updates(&cooler).Where("id = ?", cooler.Id).Error
 					if err != nil {
 					if err != nil {
 						e.Log.Errorf("保存保温箱记录失败: %s", err)
 						e.Log.Errorf("保存保温箱记录失败: %s", err)
@@ -960,7 +984,7 @@ func (e *Waybill) Receipt(c *dto.WaybillReceiptReq, p *actions.DataPermission) e
 
 
 	var waybillModel = model.Waybill{}
 	var waybillModel = model.Waybill{}
 	// 查询运单是否存在
 	// 查询运单是否存在
-	err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
+	err = tx.
 		Where("waybill_no = ?", c.WaybillNo).
 		Where("waybill_no = ?", c.WaybillNo).
 		First(&waybillModel).Error
 		First(&waybillModel).Error
 	if err != nil {
 	if err != nil {
@@ -970,10 +994,13 @@ func (e *Waybill) Receipt(c *dto.WaybillReceiptReq, p *actions.DataPermission) e
 		}
 		}
 		return errors.New(fmt.Sprintf("运单号%s查询失败", c.WaybillNo))
 		return errors.New(fmt.Sprintf("运单号%s查询失败", c.WaybillNo))
 	}
 	}
-
+	err, user := GetUserProfile(e.Orm, waybillModel.DeliveryId)
+	if err != nil {
+		return errors.New("获取用户信息失败")
+	}
 	// 查询保温箱信息
 	// 查询保温箱信息
 	var coolerBox = model.CoolerBox{}
 	var coolerBox = model.CoolerBox{}
-	err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
+	err = tx.
 		First(&coolerBox, waybillModel.CoolerBoxId).Error
 		First(&coolerBox, waybillModel.CoolerBoxId).Error
 	if err != nil {
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
 		e.Log.Errorf("db error: %s", err)
@@ -1009,6 +1036,43 @@ func (e *Waybill) Receipt(c *dto.WaybillReceiptReq, p *actions.DataPermission) e
 		e.Log.Errorf("获取定位信息失败: %s", err)
 		e.Log.Errorf("获取定位信息失败: %s", err)
 		return err
 		return err
 	}
 	}
+	//查询保温箱记录信息状态为1使用中
+	var cooler model.CoolerBoxRecord
+	var count int64
+	tx.Where("cooler_box_id = ?", coolerBox.Id).Where("status = ?", 1).First(&cooler).Count(&count)
+	if count == 0 {
+		cooler.CoolerBoxId = coolerBox.Id
+		cooler.Name = coolerBox.Name
+		cooler.Sn = coolerBox.Sn
+		cooler.CoolerUseUsers = user.NickName
+		cooler.CoolerEndUseTime = model2.Time(time.Now()) //保温箱结束使用时间
+		cooler.Status = "2"                               //使用结束
+		cooler.DeptId = user.DeptId
+		if len(waybillModel.IceRaftCode) == 0 {
+			cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
+		} else {
+			cooler.HistoryCode = append(cooler.HistoryCode, waybillModel.IceRaftCode...)
+			cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
+		}
+		err := tx.Save(&cooler).Error
+		if err != nil {
+			e.Log.Errorf("保存保温箱记录失败: %s", err)
+			return errors.New("保存保温箱记录失败")
+		}
+	} else {
+		cooler.CoolerUseUsers = user.NickName
+		if len(waybillModel.IceRaftCode) == 0 {
+			cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
+		} else {
+			cooler.HistoryCode = append(cooler.HistoryCode, waybillModel.IceRaftCode...)
+			cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
+		}
+		err = tx.Updates(&cooler).Where("id = ?", cooler.Id).Error
+		if err != nil {
+			e.Log.Errorf("保存保温箱记录失败: %s", err)
+			return errors.New("保存保温箱记录失败")
+		}
+	}
 
 
 	// 查询任务
 	// 查询任务
 	var task model.WaybillTask
 	var task model.WaybillTask
@@ -1779,6 +1843,8 @@ func (e *Waybill) SecondaryDistribution(c *dto.WaybillAssignment, p *actions.Dat
 	waybil.ConsigneeAddressDetails = c.ConsigneeAddressDetails
 	waybil.ConsigneeAddressDetails = c.ConsigneeAddressDetails
 	waybil.ConsigneeAddressName = c.ConsigneeAddressName
 	waybil.ConsigneeAddressName = c.ConsigneeAddressName
 	waybil.ConsigneeAddressPhone = c.ConsigneeAddressPhone
 	waybil.ConsigneeAddressPhone = c.ConsigneeAddressPhone
+	waybil.AssignmentStatus = 2
+	waybil.Prescription = c.Prescription
 	//c.Generate(&waybil)
 	//c.Generate(&waybil)
 	err = tx.Create(&waybil).Error
 	err = tx.Create(&waybil).Error
 	if err != nil {
 	if err != nil {

+ 8 - 2
app/jobs/jobs.go

@@ -88,9 +88,7 @@ func (t CountIceRaftRecordFreezeDuration) Exec(arg interface{}) error {
 		}
 		}
 
 
 	}
 	}
-
 	return nil
 	return nil
-
 }
 }
 
 
 // Exec 更新保温箱监控状态
 // Exec 更新保温箱监控状态
@@ -114,6 +112,14 @@ func (t UpdateCoolerBoxMonitorStatus) Exec(arg interface{}) error {
 					return global.UpdateFailedErr
 					return global.UpdateFailedErr
 				}
 				}
 			}
 			}
+		} else {
+			if coolerBox[i].MonitorStatus != 4 {
+				err := orm.Model(&sysModel.CoolerBox{}).Where("id = ?", coolerBox[i].Id).Update("monitor_status", 4).Error
+				if err != nil {
+					log.Errorf("更新保温箱监控状态失败: %s", err)
+					return global.UpdateFailedErr
+				}
+			}
 		}
 		}
 	}
 	}
 	return nil
 	return nil

+ 0 - 13
common/global/formatDuration.go

@@ -1,13 +0,0 @@
-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)
-}

+ 2 - 2
setting.yml

@@ -35,8 +35,8 @@ settings:
     source: root:mysql_5xGzBc@tcp(182.43.247.65:3306)/cold_delivery?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
     source: root:mysql_5xGzBc@tcp(182.43.247.65:3306)/cold_delivery?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
 #    source: cold_delivery:yjwyEckZS7rE5H!@tcp(182.44.114.135:3306)/cold_delivery?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
 #    source: cold_delivery:yjwyEckZS7rE5H!@tcp(182.44.114.135:3306)/cold_delivery?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
     redis:
     redis:
-      addr: 182.44.113.60:6379
-      password:
+      addr: 182.43.247.65:6379
+      password: redis_myhDre
       db: 4
       db: 4
     # key存在即可
     # key存在即可
     memory: ''
     memory: ''