فهرست منبع

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

huangyan 3 ماه پیش
والد
کامیت
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
 	}
 	count := req.PageZ / req.Page
-	e.PageOK(history, int(count), req.Page, req.PageZ, "查询成功")
+	e.PageOK(history, count, req.Page, req.PageZ, "查询成功")
 }
 
 // GetCoolerBoxLocus 获取保温箱历史轨迹
@@ -300,7 +300,7 @@ func (e CoolerBoxController) GetCoolerBoxLocus(c *gin.Context) {
 		e.Error(500, err, err.Error())
 		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 {
 		e.Logger.Error("nats 获取轨迹信息失败:", 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", "C", "C", 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", "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/dto"
 	"cold-delivery/common/actions"
-	global2 "cold-delivery/common/global"
 	"encoding/json"
 	"fmt"
 	"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/pkg/jwtauth/user"
 	_ "gogs.baozhida.cn/zoie/OAuth-core/pkg/response"
+	"math"
 	"net/url"
 	"os"
 	"time"
@@ -478,6 +478,40 @@ func (e IceRaftController) IsOutStorage(c *gin.Context) {
 	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 {
 	api.Api
 }
@@ -739,88 +773,119 @@ func (e IceRaftRecordController) ExportExecl(c *gin.Context) {
 		return
 	}
 	if sysUser.Dept.IsIceReleaseCold {
-
 		// 这里设置表头ÒÒ
 		f.SetCellValue("Sheet1", "A1", "序号")
 		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", "B", "B", 8)
 		f.SetColWidth("Sheet1", "C", "C", 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", "G", "G", 14)
-		f.SetColWidth("Sheet1", "H", "H", 30)
+		f.SetColWidth("Sheet1", "H", "H", 14)
 		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
 
 		// 循环写入数据
 		for i, v := range list {
 			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("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 {
 		// 这里设置表头ÒÒ
 		f.SetCellValue("Sheet1", "A1", "序号")
 		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", "B", "B", 8)
 		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", "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
 
 		// 循环写入数据
 		for i, v := range list {
 			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("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
 	}
 	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 {
-		e.Error(500, err, err.Error())
+		e.Error(500, err, "获取用户信息失败")
 		return
 	}
 	if userObj.Type != model.SysUserTypeSys {
@@ -816,10 +814,10 @@ func (e WaybillController) CustomerReceipt(c *gin.Context) {
 		e.Error(500, err, err.Error())
 		return
 	}
-
+	p := actions.GetPermissionFromContext(c)
 	//req.WaybillNo = lib.AesDecryptCBC(req.WaybillNo, lib.AesKey)
 	//数据权限检查
-	err = s.Receipt(&req, nil)
+	err = s.Receipt(&req, p)
 	if err != nil {
 		e.Error(500, err, err.Error())
 		return

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

@@ -13,15 +13,17 @@ const (
 // 保温箱
 type CoolerBox struct {
 	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.ModelTime
 	model2.DeptBy
@@ -42,6 +44,9 @@ type CoolerBoxRecord struct {
 	ColdTemperatures  string            `json:"cold_temperatures"`                                    //遇冷温度
 	CoolerColdUsers   string            `json:"cooler-cold-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.ModelTime
 	model2.DeptBy

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

@@ -10,7 +10,7 @@ const (
 // 冰排
 type IceRaft struct {
 	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-正常
 	IceRaftRecordId int               `json:"iceRaftRecordId" gorm:"size:128"`                      // 最新入库记录
 	FreezeClaim     model2.FloatList  `json:"freezeClaim" gorm:"type:json;comment:冷冻要求"`            // 冷冻要求 单位小时
@@ -18,6 +18,10 @@ type IceRaft struct {
 	Label           string            `json:"label" gorm:"size:128;comment:标签"`                         // 标签
 	IceColdAddress  string            `json:"iceColdAddress" gorm:"size:128;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.ModelTime
 	model2.DeptBy
@@ -68,6 +72,8 @@ type IceRaftRecord struct {
 	Label             string           `json:"label" 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-释冷中
+	Sort              int              `json:"sort" gorm:"size:4;comment:排序"`                            // 排序
+	ForColdTime       int              `json:"forColdTime" gorm:"comment:适冷时长"`                          // 适冷时长 单位分钟
 	InStorageTime     model2.Time      `json:"inStorageTime"  gorm:"size:128;comment:入库时间"`              // 入库时间
 	OutStorageTime    model2.Time      `json:"outStorageTime"  gorm:"size:128;comment:出库时间"`             // 出库时间
 	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:保温箱预冷地点"`      //保温箱预冷地点
 	CoolerColdUsers   string           `json:"cooler-cold-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:"->"`
 	CoolerBox         CoolerBoxOmit    `json:"coolerBox" gorm:"->"`
 	CoolerBoxRecord   CoolerBoxRecord  `json:"coolerBoxRecord" gorm:"-"`
@@ -117,6 +125,7 @@ type IceRaftRecordOmit struct {
 	CoolerColdAddress string           `json:"cooler-cold-address" gorm:"size:128;comment:保温箱预冷地点"` //保温箱预冷地点
 	CoolerColdUsers   string           `json:"cooler-cold-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:"->"`
 	CoolerBox         CoolerBoxOmit    `json:"coolerBox" gorm:"->"`
 }

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

@@ -14,8 +14,9 @@ var GetCompanyKeyErr = errors.New("获取公司秘钥失败")
 type SysDept struct {
 	model2.Model
 	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;"`                                      // 排序
 	Status              int       `json:"-" gorm:"size:4;"`                                      // 状态 1-停用 2-正常
 	Remark              string    `json:"remark"  gorm:"size:1024;"`                             // 备注
@@ -25,6 +26,7 @@ type SysDept struct {
 	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:true"`         //是否可以出库  true 需要验证  false 随时出库
+	IceRaftManage       bool      `json:"iceRaftManage" gorm:"type:boolean;default:false"`       //false 全部有  true 只有冰排管理
 	Children            []SysDept `json:"children" gorm:"-"`
 	CompanyAddress      string    `json:"companyAddress"` //公司地址
 	model2.ControlBy

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

@@ -122,6 +122,8 @@ type Waybill struct {
 	Prescription               model2.StringList `json:"prescription"`                                                // 处方
 	IsChild                    bool              `json:"isChild" gorm:"type:boolean;default:false"`                   //是否属于子订单
 	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.ModelTime
 	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("/cooler-box", cont.GetPageByCoolerBoxId)
 		r.POST("/isoutstorage", cont.IsOutStorage)
+		r.POST("/bindCoolerBox", cont.BindCoolerBox)
 	}
 
 	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
-	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 company model.SysDept
 	//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
 	}
 	c.Id = data.Id
-
 	return nil
 
 }
@@ -406,7 +406,6 @@ func (e *CoolerBox) GetHistory(c *dto.CoolerBoxBatchReqSN, p *actions.DataPermis
 				e.Log.Errorf("nats 获取轨迹信息失败: %s", err)
 				return
 			}
-
 		}(task)
 	}
 	wg.Wait()
@@ -478,7 +477,7 @@ func appendUniqueDeviceData(list []nats_server.DeviceData_, newData []nats_serve
 	}
 	for _, d := range newData {
 		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, ",")
 				defer func() {
 					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).
 			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 {
 		e.Log.Errorf("db error: %s", err)
 		if errors.Is(err, gorm.ErrRecordNotFound) {
@@ -676,7 +688,9 @@ func (e *CoolerBox) CoolerBoxEndUse(c *dto.IceStartbleForColfTimReq, p *actions.
 			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 {
 			e.Log.Errorf("db error: %s", err)
 			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"`    //冰排是否释冷
 	IsCoolerReleaseCold bool   `json:"isCoolerReleaseCold" gorm:"type:boolean;default:false"` //保温箱是否释冷
 	IsOutStorage        bool   `json:"isOutStorage" gorm:"type:boolean;default:false"`        //是否出库
+	IceRaftManage       bool   `json:"iceRaftManage"`                                         //冰排管理
 	CompanyAddress      string `json:"companyAddress"`                                        //公司地址
+	AppName             string `json:"appName"`                                               // app名称
 	common.ControlBy    `swaggerignore:"true"`
 }
 
@@ -55,6 +57,8 @@ func (s *CompanyInsertReq) Generate(model *model.SysDept) {
 	model.IsIceReleaseCold = s.IsIceReleaseCold
 	model.IsCoolerReleaseCold = s.IsCoolerReleaseCold
 	model.IsOutStorage = s.IsOutStorage
+	model.IceRaftManage = s.IceRaftManage
+	model.AppName = s.AppName
 }
 
 // GetId 获取数据对应的ID
@@ -71,7 +75,9 @@ type CompanyUpdateReq struct {
 	IsCoolerReleaseCold bool   `json:"isCoolerReleaseCold"`                            //保温箱是否释冷
 	IsOutStorage        bool   `json:"isOutStorage" gorm:"type:boolean;default:false"` //保温箱是否释冷
 	IsCoolerShow        bool   `json:"isCoolerShow"`                                   //保温箱是否展示开始使用时间
+	IceRaftManage       bool   `json:"iceRaftManage"`                                  //冰排管理
 	CompanyAddress      string `json:"companyAddress"`                                 //公司地址
+	AppName             string `json:"appName"`                                        // app名称
 	common.ControlBy    `swaggerignore:"true"`
 }
 
@@ -88,6 +94,8 @@ func (s *CompanyUpdateReq) Generate(model *model.SysDept) {
 	model.IsCoolerReleaseCold = s.IsCoolerReleaseCold
 	model.IsCoolerShow = s.IsCoolerShow
 	model.IsOutStorage = s.IsOutStorage
+	model.IceRaftManage = s.IceRaftManage
+	model.AppName = s.AppName
 }
 
 // GetId 获取数据对应的ID

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

@@ -26,14 +26,16 @@ func (m *CoolerBoxGetPageReq) GetNeedSearch() interface{} {
 }
 
 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) {
@@ -45,6 +47,7 @@ func (s *CoolerBoxInsertReq) Generate(model *model.CoolerBox) {
 	model.Status = s.Status
 	model.ColdSpots = s.ColdSpots
 	model.ColdTemperatures = s.ColdTemperatures
+	model.ForColdCoolerTime = s.ForColdCoolerTime
 	if s.ControlBy.UpdateBy != 0 {
 		model.UpdateBy = s.UpdateBy
 	}
@@ -61,13 +64,15 @@ func (s *CoolerBoxInsertReq) GetId() interface{} {
 }
 
 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) {
@@ -79,6 +84,7 @@ func (s *CoolerBoxUpdateReq) Generate(model *model.CoolerBox) {
 	model.Status = s.Status
 	model.ColdSpots = s.ColdSpots
 	model.ColdTemperatures = s.ColdTemperatures
+	model.ForColdCoolerTime = s.ForColdCoolerTime
 	if s.ControlBy.UpdateBy != 0 {
 		model.UpdateBy = s.UpdateBy
 	}

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

@@ -16,8 +16,8 @@ type IceRaftRecordRecording struct {
 	dto.Pagination `search:"-"`
 	StartTime      string `form:"startTime" 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"`                 // 冰排名称
 }
 type IceRaftGetNewestRecordPageReq struct {
@@ -54,8 +54,10 @@ type IceRaftInsertReq struct {
 	Status           string           `json:"status"`                                                   // 1-停用 2-正常
 	FreezeClaim      common.FloatList `json:"freezeClaim"`                                              // 冷冻要求 单位小时
 	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:冰排适冷温度"` // 冰排遇冷温度
+	Sort             int              `json:"sort"`                                                     // 排序
+	ForColdTime      int              `json:"forColdTime"`                                              // 释冷时长 单位分钟
 	common.ControlBy `swaggerignore:"true"`
 	common.DeptBy    `swaggerignore:"true"`
 }
@@ -70,6 +72,8 @@ func (s *IceRaftInsertReq) Generate(model *model.IceRaft, code string) {
 	model.Label = s.Label
 	model.IceColdAddress = s.IceColdAddress
 	model.SuitableForCold = s.SuitableForCold
+	model.Sort = s.Sort
+	model.ForColdTime = s.ForColdTime
 	if s.ControlBy.UpdateBy != 0 {
 		model.UpdateBy = s.UpdateBy
 	}
@@ -93,6 +97,8 @@ type IceRaftUpdateReq struct {
 	FreezeClaim      common.FloatList `json:"freezeClaim"`                                              // 冷冻要求 单位小时
 	IceColdAddress   string           `json:"iceColdAddress" gorm:"size:128;comment:冰排预冷地点"`            //冰排预冷地点
 	SuitableForCold  float32          `json:"suitableForCold" gorm:"type:decimal(10,2);comment:冰排适冷温度"` // 冰排遇冷温度
+	Sort             int              `json:"sort"`
+	ForColdTime      int              `json:"forColdTime"` // 适冷时长 单位分钟
 	common.ControlBy `swaggerignore:"true"`
 }
 
@@ -106,6 +112,8 @@ func (s *IceRaftUpdateReq) Generate(model *model.IceRaft) {
 	model.Label = s.Label
 	model.IceColdAddress = s.IceColdAddress
 	model.SuitableForCold = s.SuitableForCold
+	model.Sort = s.Sort
+	model.ForColdTime = s.ForColdTime
 	if s.ControlBy.UpdateBy != 0 {
 		model.UpdateBy = s.UpdateBy
 	}

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

@@ -11,13 +11,16 @@ import (
 // 运单
 
 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
 }
 type WaybillOrder struct {
@@ -65,6 +68,8 @@ type WaybillInsertReq struct {
 	Drugs                   []model.Drug      `json:"drugs"`                                                                //药品信息
 	IsPhone                 bool              `json:"is_phone"`                                                             //是否手机添加订单
 	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.DeptBy
 }
@@ -90,6 +95,8 @@ func (s *WaybillInsertReq) Generate(m *model.Waybill) {
 	m.Prescription = s.Prescription
 	m.OrderTime = model2.Time(time.Now())
 
+	m.AskForTime = s.AskForTime
+	m.DeliveryType = s.DeliveryType
 	if s.ControlBy.UpdateBy != 0 {
 		m.UpdateBy = s.UpdateBy
 	}
@@ -173,7 +180,10 @@ type WaybillUpdateReq struct {
 	Remark                  string            `json:"remark"`                  //运输备注
 	CoolerBoxId             int               `json:"coolerBoxId"`             //保温箱id
 	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.DeptBy           `swaggerignore:"true"`
 }
@@ -214,6 +224,10 @@ func (s *WaybillUpdateReq) Generate(m *model.Waybill) {
 	m.TamperProofLabel = s.TamperProofLabel
 	m.TamperProofLabelImg = s.TamperProofLabelImg
 	m.Prescription = s.Prescription
+	m.Drugs = s.Drugs
+	m.AskForTime = s.AskForTime
+	m.IsSecondaryDistribution = s.IsSecondaryDistribution
+	m.DeliveryType = s.DeliveryType
 	if s.CoolerBoxId > 0 {
 		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).
 			Scopes(
 				actions.Permission(data.TableName(), p),
-			).
+			).Order("ice_raft.sort desc").
 			Find(list).Limit(-1).Offset(-1).
 			Count(count).Error
 	} else {
@@ -37,10 +37,19 @@ func (e *IceRaft) GetPage(c *dto.IceRaftGetPageReq, list *[]model.IceRaft, count
 				cDto.MakeCondition(c.GetNeedSearch()),
 				cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
 				actions.Permission(data.TableName(), p),
-			).
+			).Order("ice_raft.sort desc").
 			Find(list).Limit(-1).Offset(-1).
 			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 {
 		e.Log.Errorf("db error: %s", err)
 		return global.GetFailedErr
@@ -141,6 +150,17 @@ func (e *IceRaft) GetRecordPage(c *dto.IceRaftGetNewestRecordPageReq, list *[]mo
 			Find(list).Limit(-1).Offset(-1).
 			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 {
 		e.Log.Errorf("db error: %s", err)
 		return global.GetFailedErr
@@ -354,23 +374,7 @@ func (e *IceRaft) InStorage(c *dto.IceRaftInStorageReq, p *actions.DataPermissio
 			Preload("IceRaftRecord").
 			First(&iceRaftModel).Error
 		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))
 		}
 
@@ -388,7 +392,8 @@ func (e *IceRaft) InStorage(c *dto.IceRaftInStorageReq, p *actions.DataPermissio
 		err = tx.Model(&model.IceRaftRecord{}).
 			Where("ice_raft_id = ? and status = ?", iceRaftModel.Id, model.IceRaftRecordStatusUsing).
 			Updates(map[string]interface{}{
-				"status": model.IceRaftRecordStatusFinish,
+				"status":      model.IceRaftRecordStatusFinish,
+				"return_date": model2.Time(time.Now()),
 			}).Error
 
 		// 添加冰排记录
@@ -399,6 +404,8 @@ func (e *IceRaft) InStorage(c *dto.IceRaftInStorageReq, p *actions.DataPermissio
 			Label:         iceRaftModel.Label,
 			Code:          code,
 			InStorageTime: model2.Time(time.Now()),
+			Sort:          iceRaftModel.Sort,
+			ForColdTime:   iceRaftModel.ForColdTime,
 			//FreezeClaim:   iceRaftModel.FreezeClaim,
 			DeptBy: model2.DeptBy{
 				DeptId: p.DeptId,
@@ -450,9 +457,16 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 		return err
 	}
 	var user model.SysUser
+	falseIce := make([]string, 0)
 	first := e.Orm.Model(&model.SysUser{}).Where("id = ?", p.UserId).First(&user)
 	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 {
 		// 查询冰排是否存在
@@ -471,6 +485,12 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 			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
 		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 {
 			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 {
 			for _, v := range iceRaftRecordModel.FreezeClaim {
 				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.CoolerBoxId = coolerBoxModel.Id
@@ -525,7 +545,21 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 			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
 	cooler.CoolerBoxId = coolerBoxModel.Id
@@ -536,6 +570,7 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 	cooler.Name = coolerBoxModel.Name
 	cooler.HistoryCode = append(cooler.HistoryCode, c.Code...)
 	cooler.CoolerUseUsers = user.NickName
+	cooler.ForColdCoolerTime = coolerBoxModel.ForColdCoolerTime
 	//查询是否有正在使用中的保温箱记录
 	var count int64
 	var coolerBoxRecordModel model.CoolerBoxRecord
@@ -552,6 +587,13 @@ func (e *IceRaft) OutStorage(c *dto.IceRaftOutStorageReq, p *actions.DataPermiss
 			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 {
 		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
 }
 
+// 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 判断冰排是否达到冷冻时长
 func (e *IceRaft) IsOutStorage(c *dto.IceOutStorageReq, p *actions.DataPermission) (error, string) {
 	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)).
 					Where("code = ?", v).
 					Where("status = ?", model.IceRaftRecordStatusWaitUse).
+					Or("status=?", model.IceRaftRecordStatusUsing).
 					First(&iceRaftRecordModel).Error
 				if err != nil {
 					e.Log.Errorf("db error: %s", err)
@@ -848,9 +952,9 @@ func (e *IceRaftRecord) StartForCold(c *dto.IceStartbleForColfTimReq, p *actions
 		if err != nil {
 			e.Log.Errorf("db error: %s", err)
 			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
 		if err != nil {
@@ -906,8 +1010,8 @@ func (e *IceRaft) IceRaftRecordRecording(c *dto.IceRaftRecordRecording, list *[]
 		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
+	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
 		}

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

@@ -379,6 +379,11 @@ func (e *Waybill) Insert(c *dto.WaybillInsertReq) error {
 	}
 	if len(c.Drugs) > 0 {
 		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
 			drugs.WaybillNo = no
 			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
 	}
-
 	c.Generate(&waybillModel)
 	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 {
-		e.Orm.Model(&model.Drug{}).Where("code = ?", drug.Code).Count(&count)
 		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
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
@@ -534,7 +560,7 @@ func (e *Waybill) UpdateStatus(c *dto.UpdateStatusReq, p *actions.DataPermission
 			return global.UpdateFailedErr
 		}
 		//添加确认人信息
-		if waybillModel.Status == model.WaybillStatusAudits {
+		if c.Status == model.WaybillStatusAudits {
 			err, sysUser := GetUserProfile(e.Orm, p.UserId)
 			if err != nil {
 				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.Sn = coolerBox.Sn
 					cooler.CoolerUseUsers = user.NickName
+					cooler.CoolerUserTime = model2.Time(time.Now())
+					cooler.Status = "1" //使用结束
+					cooler.DeptId = user.DeptId
 					if len(list) == 0 {
 						cooler.HistoryCode = append(cooler.HistoryCode, c.IceRaftCode...)
 						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 = 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)
@@ -749,8 +775,6 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 						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
 					if err != nil {
 						e.Log.Errorf("保存保温箱记录失败: %s", err)
@@ -960,7 +984,7 @@ func (e *Waybill) Receipt(c *dto.WaybillReceiptReq, p *actions.DataPermission) e
 
 	var waybillModel = model.Waybill{}
 	// 查询运单是否存在
-	err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
+	err = tx.
 		Where("waybill_no = ?", c.WaybillNo).
 		First(&waybillModel).Error
 	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))
 	}
-
+	err, user := GetUserProfile(e.Orm, waybillModel.DeliveryId)
+	if err != nil {
+		return errors.New("获取用户信息失败")
+	}
 	// 查询保温箱信息
 	var coolerBox = model.CoolerBox{}
-	err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
+	err = tx.
 		First(&coolerBox, waybillModel.CoolerBoxId).Error
 	if err != nil {
 		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)
 		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
@@ -1779,6 +1843,8 @@ func (e *Waybill) SecondaryDistribution(c *dto.WaybillAssignment, p *actions.Dat
 	waybil.ConsigneeAddressDetails = c.ConsigneeAddressDetails
 	waybil.ConsigneeAddressName = c.ConsigneeAddressName
 	waybil.ConsigneeAddressPhone = c.ConsigneeAddressPhone
+	waybil.AssignmentStatus = 2
+	waybil.Prescription = c.Prescription
 	//c.Generate(&waybil)
 	err = tx.Create(&waybil).Error
 	if err != nil {

+ 8 - 2
app/jobs/jobs.go

@@ -88,9 +88,7 @@ func (t CountIceRaftRecordFreezeDuration) Exec(arg interface{}) error {
 		}
 
 	}
-
 	return nil
-
 }
 
 // Exec 更新保温箱监控状态
@@ -114,6 +112,14 @@ func (t UpdateCoolerBoxMonitorStatus) Exec(arg interface{}) error {
 					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

+ 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: cold_delivery:yjwyEckZS7rE5H!@tcp(182.44.114.135:3306)/cold_delivery?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
     redis:
-      addr: 182.44.113.60:6379
-      password:
+      addr: 182.43.247.65:6379
+      password: redis_myhDre
       db: 4
     # key存在即可
     memory: ''