Browse Source

ADD:冰排管理、冷冻柜管理

zoie 8 months ago
parent
commit
c8428b5a92

+ 41 - 0
app/admin/controller/company.go

@@ -52,6 +52,47 @@ func (e CompanyController) GetPage(c *gin.Context) {
 	e.OK(list, "查询成功")
 }
 
+// GetUserPage 获取公司下面的用户列表
+// @Summary 获取公司下面的用户列表
+// @Description 获取公司下面的用户列表
+// @Tags 公司
+// @Param username query string false "用户名"
+// @Param status query string false "状态 1-停用 2-正常"
+// @Param pageSize query int false "页条数"
+// @Param page query int false "页码"
+// @Success 200 {object} response.Response{data=response.Page{list=[]model.SysUser}}  "{"code": 200, "data": [...]}"
+// @Router /api/sys-user [get]
+// @Security Bearer
+func (e CompanyController) GetUserPage(c *gin.Context) {
+	s := service.SysUser{}
+	req := dto.SysUserGetPageByDeptIdReq{}
+	err := e.MakeContext(c).
+		MakeOrm().
+		Bind(&req, binding.Query).
+		MakeService(&s.Service).
+		Errors
+
+	if err != nil {
+		e.Logger.Error(err)
+		e.Error(500, err, err.Error())
+		return
+	}
+
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c)
+
+	list := make([]model.SysUser, 0)
+	var count int64
+
+	err = s.GetPageByDeptId(&req, p, &list, &count)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+
+	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
+}
+
 // GetAll 添加用户-获取公司列表
 // @Summary 添加用户-获取公司列表
 // @Description 添加用户-获取公司列表

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

@@ -5,7 +5,6 @@ import (
 	"cold-delivery/app/admin/service"
 	"cold-delivery/app/admin/service/dto"
 	"cold-delivery/common/actions"
-	"cold-delivery/common/nats/nats_server"
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin/binding"
 	"gogs.baozhida.cn/zoie/OAuth-core/api"
@@ -195,94 +194,6 @@ func (e CoolerBoxController) Delete(c *gin.Context) {
 	e.OK(req.GetId(), "删除成功")
 }
 
-// GetPage 获取保温箱列表
-// @Summary 获取保温箱列表
-// @Description 获取保温箱列表
-// @Tags 保温箱
-// @Param name query string false "保温箱名称"
-// @Param pageSize query int false "页条数"
-// @Param page query int false "页码"
-// @Success 200 {object} response.Response{data=response.Page{list=[]model.CoolerBox}} "{"code": 200, "data": [...]}"
-// @Router /api/CoolerBox [get]
-// @Security Bearer
-func (e CoolerBoxController) GetDevicePage(c *gin.Context) {
-	s := service.CoolerBox{}
-	req := dto.DeviceGetPageReq{}
-	err := e.MakeContext(c).
-		MakeOrm().
-		MakeService(&s.Service).
-		Bind(&req, binding.Query).
-		Errors
-	if err != nil {
-		e.Logger.Error(err)
-		e.Error(500, err, err.Error())
-		return
-	}
-
-	list := make([]nats_server.Device_R, 0)
-	p := actions.GetPermissionFromContext(c)
-
-	var coolerBoxCount int64
-	coolerBoxList := make([]model.CoolerBox, 0)
-
-	coolerBoxReq := dto.CoolerBoxGetPageReq{}
-	coolerBoxReq.PageSize = 9999
-	err = s.GetPage(&coolerBoxReq, &coolerBoxList, &coolerBoxCount, p)
-
-	var count int64
-	company, err := model.GetCompanyById(p.DeptId)
-	if err != nil {
-		e.Error(500, err, err.Error())
-		return
-	}
-	list, count, err = nats_server.Cold_ReadDevice_List(req.Name, company.ColdKey, req.GetPageIndex(), 9999)
-	if err != nil {
-		e.Error(500, err, err.Error())
-		return
-	}
-	var coolerBoxMap = make(map[string]model.CoolerBox)
-	for _, box := range coolerBoxList {
-		coolerBoxMap[box.Sn] = box
-	}
-	// Fixme 测试完成之后删除
-	//for i := 0; i < 20; i++ {
-	//	list = append(list, nats_server.Device_R{
-	//		T_devName: fmt.Sprintf("保温箱%03d", i),
-	//		T_sn:      fmt.Sprintf("2024114956064%03d", i),
-	//	})
-	//}
-
-	list2 := make([]nats_server.Device_R, 0)
-	for i := 0; i < len(list); i++ {
-		if _, ok := coolerBoxMap[list[i].T_sn]; ok {
-			count--
-			continue
-		}
-		list2 = append(list2, list[i])
-	}
-
-	//if len(list2) == 0 {
-	//	e.PageOK(list2, len(list2), req.GetPageIndex(), req.GetPageSize(), "查询成功")
-	//}
-
-	// 计算总页数
-	totalPages := (len(list2) + req.GetPageSize() - 1) / req.GetPageSize()
-
-	// 如果n超出范围,返回错误
-	if req.GetPageIndex() > totalPages {
-		req.Page = totalPages
-	}
-	// 计算当前页的数据
-	start := (req.GetPageIndex() - 1) * req.GetPageSize()
-	end := start + req.GetPageSize()
-	if end > len(list2) {
-		end = len(list2)
-	}
-	currentPage := list2[start:end]
-
-	e.PageOK(currentPage, len(list2), req.GetPageIndex(), req.GetPageSize(), "查询成功")
-}
-
 // BatchInsert 批量添加保温箱
 // @Summary 批量添加保温箱
 // @Description 批量添加保温箱

+ 179 - 0
app/admin/controller/device.go

@@ -0,0 +1,179 @@
+package controller
+
+import (
+	"cold-delivery/app/admin/model"
+	"cold-delivery/app/admin/service"
+	"cold-delivery/app/admin/service/dto"
+	"cold-delivery/common/actions"
+	"cold-delivery/common/nats/nats_server"
+	"github.com/gin-gonic/gin"
+	"github.com/gin-gonic/gin/binding"
+	"gogs.baozhida.cn/zoie/OAuth-core/api"
+	_ "gogs.baozhida.cn/zoie/OAuth-core/pkg/response"
+)
+
+type DeviceController struct {
+	api.Api
+}
+
+// GetDevicePage 获取没有被保温箱和传感器绑定的设备列表
+// @Summary 获取没有被保温箱和传感器绑定的设备列表
+// @Description 获取没有被保温箱和传感器绑定的设备列表
+// @Tags 设备
+// @Param name query string false "设备名称"
+// @Param pageSize query int false "页条数"
+// @Param page query int false "页码"
+// @Success 200 {object} response.Response{data=response.Page{list=[]model.Device_R}} "{"code": 200, "data": [...]}"
+// @Router /api/CoolerBox [get]
+// @Security Bearer
+func (e DeviceController) GetDevicePage(c *gin.Context) {
+	coolerBoxSvc := service.CoolerBox{}
+	iceLockerSvc := service.IceLocker{}
+	req := dto.DeviceGetPageReq{}
+	err := e.MakeContext(c).
+		MakeOrm().
+		MakeService(&coolerBoxSvc.Service).
+		MakeService(&iceLockerSvc.Service).
+		Bind(&req, binding.Query).
+		Errors
+	if err != nil {
+		e.Logger.Error(err)
+		e.Error(500, err, err.Error())
+		return
+	}
+
+	list := make([]nats_server.Device_R, 0)
+	p := actions.GetPermissionFromContext(c)
+
+	var coolerBoxCount int64
+	coolerBoxList := make([]model.CoolerBox, 0)
+	var iceLockerCount int64
+	iceLockerList := make([]model.IceLocker, 0)
+
+	coolerBoxReq := dto.CoolerBoxGetPageReq{}
+	coolerBoxReq.PageSize = 9999
+	err = coolerBoxSvc.GetPage(&coolerBoxReq, &coolerBoxList, &coolerBoxCount, p)
+
+	iceLockerReq := dto.IceLockerGetPageReq{}
+	iceLockerReq.PageSize = 9999
+	err = iceLockerSvc.GetPage(&iceLockerReq, &iceLockerList, &iceLockerCount, p)
+
+	var count int64
+	company, err := model.GetCompanyById(p.DeptId)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+	list, count, err = nats_server.Cold_ReadDevice_List(req.Name, company.ColdKey, req.GetPageIndex(), 9999)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+	var bindMap = make(map[string]struct{})
+	for _, box := range coolerBoxList {
+		bindMap[box.Sn] = struct{}{}
+	}
+	for _, iceLocker := range iceLockerList {
+		bindMap[iceLocker.Sn] = struct{}{}
+	}
+
+	list2 := make([]nats_server.Device_R, 0)
+	for i := 0; i < len(list); i++ {
+		if _, ok := bindMap[list[i].T_sn]; ok {
+			count--
+			continue
+		}
+		list2 = append(list2, list[i])
+	}
+
+	// Fixme 测试完成之后删除
+	//for i := 0; i < 20; i++ {
+	//	list2 = append(list2, nats_server.Device_R{
+	//		T_devName: fmt.Sprintf("冷冻柜%03d", i),
+	//		T_sn:      fmt.Sprintf("2024114956064%03d", i),
+	//	})
+	//	count++
+	//}
+
+	//if len(list2) == 0 {
+	//	e.PageOK(list2, len(list2), req.GetPageIndex(), req.GetPageSize(), "查询成功")
+	//}
+
+	// 计算总页数
+	totalPages := (len(list2) + req.GetPageSize() - 1) / req.GetPageSize()
+
+	// 如果n超出范围,返回错误
+	if req.GetPageIndex() > totalPages {
+		req.Page = totalPages
+	}
+	// 计算当前页的数据
+	start := (req.GetPageIndex() - 1) * req.GetPageSize()
+	end := start + req.GetPageSize()
+	if end > len(list2) {
+		end = len(list2)
+	}
+	currentPage := list2[start:end]
+
+	e.PageOK(currentPage, len(list2), req.GetPageIndex(), req.GetPageSize(), "查询成功")
+}
+
+// GetPage 获取传感器列表
+// @Summary 获取传感器列表
+// @Description 获取传感器列表
+// @Tags 设备
+// @Param sn query string true "sn"
+// @Param pageSize query int false "页条数"
+// @Param page query int false "页码"
+// @Success 200 {object} response.Response{data=response.Page{list=[]model.Device}} "{"code": 200, "data": [...]}"
+// @Router /api/ice-locker [get]
+// @Security Bearer
+func (e DeviceController) GetDeviceSensorPage(c *gin.Context) {
+	s := service.Device{}
+	req := dto.DeviceSensorGetPageReq{}
+	err := e.MakeContext(c).
+		MakeOrm().
+		Bind(&req, binding.Query).
+		MakeService(&s.Service).
+		Errors
+	if err != nil {
+		e.Logger.Error(err)
+		e.Error(500, err, err.Error())
+		return
+	}
+
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c)
+
+	list, count, err := s.GetDeviceSensorList(&req, p)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+	e.PageOK(list, int(count), 0, 0, "查询成功")
+
+}
+func (e DeviceController) GetDeviceSensorDataPage(c *gin.Context) {
+	s := service.Device{}
+	req := dto.DeviceSensorGetDataReq{}
+	err := e.MakeContext(c).
+		MakeOrm().
+		Bind(&req, binding.Query).
+		MakeService(&s.Service).
+		Errors
+	if err != nil {
+		e.Logger.Error(err)
+		e.Error(500, err, err.Error())
+		return
+	}
+
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c)
+
+	list, count, err := s.GetData(&req, p)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+	e.PageOK(list, int(count), 0, 0, "查询成功")
+
+}

+ 58 - 22
app/admin/controller/ice_locker.go

@@ -16,11 +16,11 @@ type IceLockerController struct {
 	api.Api
 }
 
-// GetPage 获取柜列表
-// @Summary 获取柜列表
-// @Description 获取柜列表
-// @Tags 
-// @Param name query string false "柜名称"
+// GetPage 获取冷冻柜列表
+// @Summary 获取冷冻柜列表
+// @Description 获取冷冻柜列表
+// @Tags 冷冻
+// @Param name query string false "冷冻柜名称"
 // @Param pageSize query int false "页条数"
 // @Param page query int false "页码"
 // @Success 200 {object} response.Response{data=response.Page{list=[]model.IceLocker}} "{"code": 200, "data": [...]}"
@@ -54,11 +54,11 @@ func (e IceLockerController) GetPage(c *gin.Context) {
 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
 }
 
-// Get 通过id获取
-// @Summary 通过id获取
-// @Description 通过id获取
-// @Tags 
-// @Param id path string true "柜id"
+// Get 通过id获取冷冻
+// @Summary 通过id获取冷冻
+// @Description 通过id获取冷冻
+// @Tags 冷冻
+// @Param id path string true "冷冻柜id"
 // @Success 200 {object} response.Response{data=model.IceLocker} "{"code": 200, "data": [...]}"
 // @Router /api/ice-locker/{id} [get]
 // @Security Bearer
@@ -88,10 +88,10 @@ func (e IceLockerController) Get(c *gin.Context) {
 	e.OK(object, "查询成功")
 }
 
-// Insert 添加
-// @Summary 添加
-// @Description 添加
-// @Tags 
+// Insert 添加冷冻
+// @Summary 添加冷冻
+// @Description 添加冷冻
+// @Tags 冷冻
 // @Accept  application/json
 // @Product application/json
 // @Param data body dto.IceLockerInsertReq true "data"
@@ -124,10 +124,10 @@ func (e IceLockerController) Insert(c *gin.Context) {
 	e.OK(req.GetId(), "创建成功")
 }
 
-// Update 修改
-// @Summary 修改
-// @Description 修改
-// @Tags 
+// Update 修改冷冻
+// @Summary 修改冷冻
+// @Description 修改冷冻
+// @Tags 冷冻
 // @Accept  application/json
 // @Product application/json
 // @Param data body dto.IceLockerUpdateReq true "body"
@@ -159,10 +159,10 @@ func (e IceLockerController) Update(c *gin.Context) {
 	e.OK(req.GetId(), "更新成功")
 }
 
-// Delete 删除
-// @Summary 删除
-// @Description 删除
-// @Tags 
+// Delete 删除冷冻
+// @Summary 删除冷冻
+// @Description 删除冷冻
+// @Tags 冷冻
 // @Accept  application/json
 // @Product application/json
 // @Param data body dto.IceLockerDeleteReq true "body"
@@ -193,3 +193,39 @@ func (e IceLockerController) Delete(c *gin.Context) {
 	}
 	e.OK(req.GetId(), "删除成功")
 }
+
+// BatchInsert 批量添加保温箱
+// @Summary 批量添加保温箱
+// @Description 批量添加保温箱
+// @Tags 保温箱
+// @Accept  application/json
+// @Product application/json
+// @Param data body dto.IceLockerBatchInsertReq true "data"
+// @Success 200 {string} string	"{"code": 200, "message": "添加成功"}"
+// @Success 200 {string} string	"{"code": -1, "message": "添加失败"}"
+// @Router /api/CoolerBox [post]
+// @Security Bearer
+func (e IceLockerController) BatchInsert(c *gin.Context) {
+	s := service.IceLocker{}
+	req := dto.IceLockerBatchInsertReq{}
+	err := e.MakeContext(c).
+		MakeOrm().
+		Bind(&req, binding.JSON).
+		MakeService(&s.Service).
+		Errors
+	if err != nil {
+		e.Logger.Error(err)
+		e.Error(500, err, err.Error())
+		return
+	}
+	p := actions.GetPermissionFromContext(c)
+	// 设置创建人
+	req.SetCreateBy(user.GetUserId(c))
+	req.SetDeptId(p.DeptId)
+	err = s.BatchInsert(&req)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+	e.OK(nil, "创建成功")
+}

+ 0 - 3
app/admin/controller/sys_user.go

@@ -31,9 +31,6 @@ type SysUser struct {
 // @Description 获取系统用户列表
 // @Tags 用户
 // @Param username query string false "用户名"
-// @Param deptId query int false "部门id"
-// @Param roleId query string false "角色id"
-// @Param postId query string false "岗位id"
 // @Param status query string false "状态 1-停用 2-正常"
 // @Param pageSize query int false "页条数"
 // @Param page query int false "页码"

+ 16 - 5
app/admin/controller/waybill.go

@@ -264,12 +264,23 @@ func (e WaybillController) UserStats(c *gin.Context) {
 		return
 	}
 	var res []dto.WaybillUserStats
-	if userObj.Type == model.SysUserTypeSys {
-		res = s.GetReCheckStats(&req, p)
-	} else {
-		req.UserIds = []int{p.UserId}
-		res = s.GetReCheckStats(&req, p)
+	if req.UserType == "delivery" {
+		if userObj.Type == model.SysUserTypeSys {
+			res = s.GetDeliveryStats(&req, p)
+		} else {
+			req.UserIds = []int{p.UserId}
+			res = s.GetDeliveryStats(&req, p)
+		}
 	}
+	if req.UserType == "reCheck" {
+		if userObj.Type == model.SysUserTypeSys {
+			res = s.GetReCheckStats(&req, p)
+		} else {
+			req.UserIds = []int{p.UserId}
+			res = s.GetReCheckStats(&req, p)
+		}
+	}
+
 	e.OK(res, "查询成功")
 }
 

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

@@ -1,6 +1,9 @@
 package model
 
-import model2 "cold-delivery/common/model"
+import (
+	model2 "cold-delivery/common/model"
+	natsModel "cold-delivery/common/nats/nats_server"
+)
 
 const (
 	CoolerBoxStatusNormal  = "2"
@@ -10,10 +13,11 @@ 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
+	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
+	DeviceData natsModel.DeviceData_R2 `json:"deviceData" gorm:"-"`
 
 	model2.ControlBy
 	model2.ModelTime

+ 7 - 4
app/admin/model/ice_locker.go

@@ -1,6 +1,7 @@
 package model
 
 import model2 "cold-delivery/common/model"
+import natsModel "cold-delivery/common/nats/nats_server"
 
 const (
 	IceLockerStatusNormal  = "2"
@@ -10,16 +11,18 @@ const (
 // 仓库
 type IceLocker struct {
 	model2.Model
-	Name   string `json:"name" gorm:"size:128"`                                 // 商品名称
-	Status string `json:"status" gorm:"size:4;not null;default:'2';comment:状态"` // 1-停用 2-正常
-
+	Name       string                  `json:"name" gorm:"size:128"`                                 // 冷冻柜名称
+	Status     string                  `json:"status" gorm:"size:4;not null;default:'2';comment:状态"` // 1-停用 2-正常
+	Sn         string                  `json:"sn" gorm:"size:128"`                                   // sn
+	HistorySn  model2.StringList       `json:"historySn"`                                            // 历史绑定的sn
+	DeviceData natsModel.DeviceData_R2 `json:"deviceData" gorm:"-"`
 	model2.ControlBy
 	model2.ModelTime
 	model2.DeptBy
 }
 type IceLockerOmit struct {
 	Id   int    `json:"id,omitempty"`   // 主键编码
-	Name string `json:"name,omitempty"` // 商品名称
+	Name string `json:"name,omitempty"` // 冷冻柜名称
 }
 
 func (IceLocker) TableName() string {

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

@@ -40,6 +40,8 @@ const (
 
 func GetIceRaftRecordStatus(s string) string {
 	switch s {
+	case "":
+		return "未入库"
 	case IceRaftRecordStatusFreezing:
 		return "冷冻中"
 	case IceRaftRecordStatusWaitUse:
@@ -56,10 +58,10 @@ func GetIceRaftRecordStatus(s string) string {
 type IceRaftRecord struct {
 	model2.Model
 	IceRaftId      int           `json:"iceRaftId" gorm:"size:128;comment:冰排id"`
-	Status         string        `json:"status" gorm:"size:4;not null;default:'2';comment:状态"` // 1-冷冻中 2-待使用 3-使用中
+	Status         string        `json:"status" gorm:"size:4;not null;default:'2';comment:状态"` // 0未入库 1-冷冻中 2-待使用 3-使用中 4已结束
 	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
+	IceLockerId    int           `json:"iceLockerId" gorm:"size:128;comment:冷冻柜id"`            // 冷冻柜id
 	CoolerBoxId    int           `json:"coolerBoxId" gorm:"size:128;comment:保温箱id"`            // 保温箱id
 	FreezeClaim    float32       `json:"freezeClaim" gorm:"type:decimal(10,2);comment:冷冻要求"`   // 冷冻要求 单位小时
 	FreezeDuration int           `json:"freezeDuration" gorm:"size:128;comment:冷冻时长"`          // 冷冻时长 单位分钟
@@ -73,10 +75,10 @@ type IceRaftRecord struct {
 type IceRaftRecordOmit struct {
 	Id             int           `json:"id,omitempty"`             // 主键编码
 	IceRaftId      int           `json:"iceRaftId,omitempty"`      // 冰排id
-	Status         string        `json:"status,omitempty"`         // 1-停用 2-正常
+	Status         string        `json:"status"`                   // 1-停用 2-正常
 	InStorageTime  model2.Time   `json:"inStorageTime,omitempty"`  // 入库时间
 	OutStorageTime model2.Time   `json:"outStorageTime,omitempty"` // 出库时间
-	IceLockerId    int           `json:"iceLockerId,omitempty"`    // 柜id
+	IceLockerId    int           `json:"iceLockerId,omitempty"`    // 冷冻柜id
 	CoolerBoxId    int           `json:"coolerBoxId,omitempty"`    // 保温箱id
 	FreezeClaim    float32       `json:"freezeClaim"`              // 冷冻要求 单位小时
 	FreezeDuration int           `json:"freezeDuration"`           // 冷冻时长 单位分钟

+ 6 - 5
app/admin/model/sys_user.go

@@ -20,11 +20,12 @@ var (
 type SysUser struct {
 	model2.Model
 	coreModel.User
-	Type     int     `json:"type" gorm:"size:128;comment:类型"` // 管理员1 门店管理员2 配送员3
-	UserType string  `json:"userType" gorm:"size:128;comment:用户类型"`
-	Openid   string  `json:"openid" gorm:"size:128;comment:微信openid"` // 微信openid
-	Dept     SysDept `json:"dept" gorm:"->"`                          // 部门
-	Role     SysRole `json:"-" gorm:"-"`                              // 角色
+	Type       int         `json:"type" gorm:"size:128;comment:类型"` // 管理员1 门店管理员2 配送员3
+	UserType   string      `json:"userType" gorm:"size:128;comment:用户类型"`
+	Openid     string      `json:"openid" gorm:"size:128;comment:微信openid"`                // 微信openid
+	Dept       SysDept     `json:"dept" gorm:"->"`                                         // 部门
+	Role       SysRole     `json:"-" gorm:"-"`                                             // 角色
+	CreateUser SysUserOmit `json:"createUser" gorm:"->;foreignkey:CreateBy;references:Id"` // 角色
 	model2.ControlBy
 	model2.ModelTime
 }

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

@@ -49,6 +49,7 @@ func (e *IceRaftCode) Scan(src interface{}) error {
 type Waybill struct {
 	model2.Model
 	WaybillNo               string         `json:"waybillNo"  gorm:"size:128"`                    // 单号
+	OrderNo                 string         `json:"orderNo"  gorm:"size:128"`                      // 订单号
 	Status                  int            `json:"status"  gorm:"size:128"`                       // 订单状态:1已下单 2配送中 3已送达 4已拒收
 	SenderAddressDetails    string         `json:"senderAddressDetails"  gorm:"size:128"`         // 发货地址详情
 	SenderAddressName       string         `json:"senderAddressName"  gorm:"size:128"`            // 发货地址名称

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

@@ -18,6 +18,7 @@ func registerCompanyRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle
 	r := v1.Group("/company").Use(authMiddleware.MiddlewareFunc()).Use(actions.PermissionAction())
 	{
 		r.GET("", cont.GetPage)
+		r.GET("/user", cont.GetUserPage)
 		r.GET("/all", cont.GetAll)
 		r.GET("/:id", cont.Get)
 		r.POST("", cont.Insert)

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

@@ -23,8 +23,4 @@ func registerCoolerBoxRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMidd
 		r.PUT("", cont.Update)
 		r.DELETE("", cont.Delete)
 	}
-	r2 := v1.Group("/device").Use(authMiddleware.MiddlewareFunc()).Use(actions.PermissionAction())
-	{
-		r2.GET("", cont.GetDevicePage)
-	}
 }

+ 26 - 0
app/admin/router/device.go

@@ -0,0 +1,26 @@
+package router
+
+import (
+	"cold-delivery/app/admin/controller"
+	"cold-delivery/common/actions"
+	"github.com/gin-gonic/gin"
+	jwt "gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth"
+)
+
+func init() {
+	routerCheckRole = append(routerCheckRole, registerDeviceRouter)
+}
+
+// 需认证的路由代码
+func registerDeviceRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
+	cont := controller.DeviceController{}
+	r := v1.Group("/device").Use(authMiddleware.MiddlewareFunc()).Use(actions.PermissionAction())
+	{
+		r.GET("", cont.GetDevicePage)
+	}
+	r2 := v1.Group("/device-sensor").Use(authMiddleware.MiddlewareFunc()).Use(actions.PermissionAction())
+	{
+		r2.GET("", cont.GetDeviceSensorPage)
+		r2.GET("/data", cont.GetDeviceSensorDataPage)
+	}
+}

+ 2 - 0
app/admin/router/ice_locker.go

@@ -21,5 +21,7 @@ func registerIceLockerRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMidd
 		r.POST("", cont.Insert)
 		r.PUT("", cont.Update)
 		r.DELETE("", cont.Delete)
+		r.POST("/import", cont.BatchInsert)
+
 	}
 }

+ 1 - 1
app/admin/router/waybill.go

@@ -38,7 +38,7 @@ func registerWaybillRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle
 		r.POST("/import", cont.Import)                 // 导入运单
 		r.GET("/export-template", cont.ExportTemplate) // 导出运单模板
 		r.GET("/home", cont.Home)                      // 首页统计
-		r.GET("/user-stats", cont.UserStats)           // 用户运单统计
+		r.POST("/user-stats", cont.UserStats)          // 用户运单统计
 		r.GET("/export", cont.Export)                  // 运单管理-导出
 		r.GET("/customer/export", cont.CustomerExport) // 客户下单
 		r.GET("/temperature-pdf", cont.TemperaturePDF) // 导出温湿度pdf

+ 17 - 0
app/admin/service/company.go

@@ -4,6 +4,7 @@ import (
 	"cold-delivery/common/actions"
 	cDto "cold-delivery/common/dto"
 	"cold-delivery/common/global"
+	"cold-delivery/common/nats/nats_server"
 	"encoding/json"
 	"errors"
 	"fmt"
@@ -105,6 +106,13 @@ func (e *Company) Insert(c *dto.CompanyInsertReq) error {
 		return err
 	}
 
+	_, err = nats_server.Cold_ReadCompanyByT_key(c.ColdKey)
+	if err != nil {
+		e.Log.Errorf("获取3.0秘钥失败: %s", err)
+		err = errors.New("冷链3.0公司秘钥错误!")
+		return err
+	}
+
 	c.Generate(&data)
 	err = tx.Create(&data).Error
 	if err != nil {
@@ -154,6 +162,15 @@ func (e *Company) Update(c *dto.CompanyUpdateReq) error {
 		return global.UpdateFailedErr
 	}
 
+	if c.ColdKey != deptModel.ColdKey {
+		_, err = nats_server.Cold_ReadCompanyByT_key(c.ColdKey)
+		if err != nil {
+			e.Log.Errorf("获取3.0秘钥失败: %s", err)
+			err = errors.New("冷链3.0公司秘钥错误!")
+			return err
+		}
+	}
+
 	c.Generate(&deptModel)
 
 	DeptPath := pkg.IntToString(deptModel.Id) + "/"

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

@@ -6,6 +6,7 @@ import (
 	"cold-delivery/common/actions"
 	cDto "cold-delivery/common/dto"
 	"cold-delivery/common/global"
+	"cold-delivery/common/nats/nats_server"
 	"errors"
 	"gogs.baozhida.cn/zoie/OAuth-core/service"
 	"gorm.io/gorm"
@@ -41,6 +42,21 @@ func (e *CoolerBox) GetPage(c *dto.CoolerBoxGetPageReq, list *[]model.CoolerBox,
 		e.Log.Errorf("db error: %s", err)
 		return global.GetFailedErr
 	}
+	if c.ShowTemp {
+		// 获取公司秘钥
+		var company model.SysDept
+		company, err = model.GetCompanyById(p.DeptId)
+		if err != nil {
+			e.Log.Errorf("db error: %s", err)
+			return model.GetCompanyKeyErr
+		}
+		for i := 0; i < len(*list); i++ {
+			deviceData, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey((*list)[i].Sn, company.ColdKey)
+			if len(deviceData) > 0 {
+				(*list)[i].DeviceData = deviceData[0].T_DeviceSensorData
+			}
+		}
+	}
 	return nil
 }
 
@@ -121,7 +137,7 @@ func (e *CoolerBox) BatchInsert(c *dto.CoolerBoxBatchInsertReq) error {
 			return global.CreateFailedErr
 		}
 		if k > 0 {
-			err = errors.New("该Sn已绑定!")
+			//err = errors.New("该Sn已绑定!")
 			continue
 		}
 

+ 5 - 26
app/admin/service/device.go

@@ -4,7 +4,6 @@ import (
 	"cold-delivery/app/admin/model"
 	"cold-delivery/app/admin/service/dto"
 	"cold-delivery/common/actions"
-	"cold-delivery/common/global"
 	"cold-delivery/common/nats/nats_server"
 	"fmt"
 	"gogs.baozhida.cn/zoie/OAuth-core/service"
@@ -15,29 +14,9 @@ type Device struct {
 }
 
 // GetPage 获取Device列表
-func (e *Device) GetSensorList(p *actions.DataPermission) (list []nats_server.DeviceSensor_R, count int64, err error) {
-	var userObj model.SysUser
+func (e *Device) GetDeviceSensorList(c *dto.DeviceSensorGetPageReq, p *actions.DataPermission) (list []nats_server.DeviceSensor_R, count int64, err error) {
 
-	err = e.Orm.Model(&userObj).First(&userObj, p.UserId).Error
-	if err != nil {
-		e.Log.Errorf("db error: %s", err)
-		return list, count, global.GetFailedErr
-	}
-	var sn string
-	// 仓管2 司机3
-	if userObj.Type == 2 {
-		err = e.Orm.Model(&model.Warehouse{}).Select("sn").Where("user_id = ?", userObj.Id).Scan(&sn).Error
-	}
-	if userObj.Type == 3 {
-		err = e.Orm.Model(&model.Car{}).Select("sn").Where("user_id = ?", userObj.Id).Scan(&sn).Error
-	}
-
-	if err != nil {
-		e.Log.Errorf("db error: %s", err)
-		return list, count, global.GetFailedErr
-	}
-
-	if len(sn) == 0 {
+	if len(c.Sn) == 0 {
 		return list, count, nil
 	}
 
@@ -46,16 +25,16 @@ func (e *Device) GetSensorList(p *actions.DataPermission) (list []nats_server.De
 		e.Log.Errorf("db error: %s", err)
 		return list, count, model.GetCompanyKeyErr
 	}
-	list, count, err = nats_server.Cold_CompanyDeviceSensor_List_ByKey(sn, company.ColdKey)
+	list, count, err = nats_server.Cold_CompanyDeviceSensor_List_ByKey(c.Sn, company.ColdKey)
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
 		return list, count, err
 	}
 	return list, count, nil
 }
-func (e *Device) GetData(c dto.DeviceGetDataReq, p *actions.DataPermission) (list []nats_server.DeviceData_R, count int64, err error) {
+func (e *Device) GetData(c *dto.DeviceSensorGetDataReq, p *actions.DataPermission) (list []nats_server.DeviceData_R, count int64, err error) {
 	T_snid := fmt.Sprintf("%s,%d|", c.T_sn, c.T_id)
-	list, count, err = nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, c.StartTime, c.EndTime, c.Page, c.PageSize)
+	list, count, err = nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, c.StartTime, c.EndTime, c.GetPageIndex(), c.GetPageSize())
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
 		return list, count, err

+ 7 - 9
app/admin/service/dto/cooler_box.go

@@ -4,12 +4,15 @@ import (
 	"cold-delivery/app/admin/model"
 	"cold-delivery/common/dto"
 	common "cold-delivery/common/model"
+	"strings"
 )
 
 type CoolerBoxGetPageReq struct {
 	dto.Pagination `search:"-"`
-	Name           string `form:"name" search:"type:contains;column:name;table:cooler_box"` // 保温箱
-	Sn             string `form:"sn" search:"type:contains;column:sn;table:cooler_box"`     // sn
+	Name           string `form:"name" search:"type:contains;column:name;table:cooler_box"`  // 保温箱
+	Sn             string `form:"sn" search:"type:contains;column:sn;table:cooler_box"`      // sn
+	Status         string `form:"status" search:"type:exact;column:status;table:cooler_box"` // 状态
+	ShowTemp       bool   `form:"showTemp" search:"-"`                                       // 展示最新温度
 	CoolerBoxOrder
 }
 
@@ -35,7 +38,7 @@ func (s *CoolerBoxInsertReq) Generate(model *model.CoolerBox) {
 		model.Id = s.Id
 	}
 	model.Name = s.Name
-	model.Sn = s.Sn
+	model.Sn = strings.TrimSpace(s.Sn)
 	model.Status = s.Status
 	if s.ControlBy.UpdateBy != 0 {
 		model.UpdateBy = s.UpdateBy
@@ -65,7 +68,7 @@ func (s *CoolerBoxUpdateReq) Generate(model *model.CoolerBox) {
 		model.Id = s.Id
 	}
 	model.Name = s.Name
-	model.Sn = s.Sn
+	model.Sn = strings.TrimSpace(s.Sn)
 	model.Status = s.Status
 	if s.ControlBy.UpdateBy != 0 {
 		model.UpdateBy = s.UpdateBy
@@ -96,11 +99,6 @@ func (s *CoolerBoxDeleteReq) GetId() interface{} {
 	return s.Id
 }
 
-type DeviceGetPageReq struct {
-	dto.Pagination `search:"-"`
-	Name           string `form:"name" search:"-"`
-}
-
 type CoolerBoxBatchInsertReq struct {
 	List             []CoolerBoxInsertReq
 	Status           string `json:"status"` // 1-停用 2-正常

+ 9 - 1
app/admin/service/dto/device.go

@@ -2,10 +2,18 @@ package dto
 
 import "cold-delivery/common/dto"
 
-type DeviceGetDataReq struct {
+type DeviceSensorGetDataReq struct {
 	dto.Pagination `search:"-"`
 	T_sn           string `form:"t_sn"`
 	T_id           int    `form:"t_id"`
 	StartTime      string `form:"startTime"`
 	EndTime        string `form:"endTime"`
 }
+
+type DeviceGetPageReq struct {
+	dto.Pagination `search:"-"`
+	Name           string `form:"name" search:"-"`
+}
+type DeviceSensorGetPageReq struct {
+	Sn string `form:"sn" search:"-"`
+}

+ 18 - 3
app/admin/service/dto/ice_locker.go

@@ -4,17 +4,21 @@ import (
 	"cold-delivery/app/admin/model"
 	"cold-delivery/common/dto"
 	common "cold-delivery/common/model"
+	"strings"
 )
 
 type IceLockerGetPageReq struct {
 	dto.Pagination `search:"-"`
-	Name           string `form:"name" search:"type:contains;column:name;table:ice_locker"`  // 柜名称
+	Name           string `form:"name" search:"type:contains;column:name;table:ice_locker"`  // 冷冻柜名称
 	Status         string `form:"status" search:"type:exact;column:status;table:ice_locker"` // 状态
+	Sn             string `form:"sn" search:"type:contains;column:sn;table:ice_locker"`      // sn
+	ShowTemp       bool   `form:"showTemp" search:"-"`                                       // 展示最新温度
 	IceLockerOrder
 }
 
 type IceLockerOrder struct {
 	CreatedAtOrder string `search:"type:order;column:created_at;table:ice_locker" form:"createdAtOrder" default:"desc"`
+	IdOrder        string `search:"type:order;column:id;table:ice_locker" form:"idOrder" default:"desc"`
 }
 
 func (m *IceLockerGetPageReq) GetNeedSearch() interface{} {
@@ -23,7 +27,8 @@ func (m *IceLockerGetPageReq) GetNeedSearch() interface{} {
 
 type IceLockerInsertReq struct {
 	Id               int    `json:"id" comment:"编码" swaggerignore:"true"` // 编码
-	Name             string `json:"name" vd:"len($)>0;msg:'冷藏柜不能为空'"`     // 冰柜名称
+	Name             string `json:"name" vd:"len($)>0;msg:'冷冻柜不能为空'"`     // 冷冻柜名称
+	Sn               string `json:"sn"`                                   // sn
 	Status           string `json:"status"`                               // 1-停用 2-正常
 	common.ControlBy `swaggerignore:"true"`
 	common.DeptBy    `swaggerignore:"true"`
@@ -34,6 +39,7 @@ func (s *IceLockerInsertReq) Generate(model *model.IceLocker) {
 		model.Id = s.Id
 	}
 	model.Name = s.Name
+	model.Sn = strings.TrimSpace(s.Sn)
 	model.Status = s.Status
 	if s.ControlBy.UpdateBy != 0 {
 		model.UpdateBy = s.UpdateBy
@@ -52,7 +58,8 @@ func (s *IceLockerInsertReq) GetId() interface{} {
 
 type IceLockerUpdateReq struct {
 	Id               int    `json:"id" comment:"编码"`                    // 编码
-	Name             string `json:"name" vd:"len($)>0;msg:'冷藏柜名称不能为空'"` // 冰柜名称
+	Name             string `json:"name" vd:"len($)>0;msg:'冷冻柜名称不能为空'"` // 冷冻柜名称
+	Sn               string `json:"sn"`                                 // sn
 	Status           string `json:"status"`                             // 1-停用 2-正常
 	common.ControlBy `swaggerignore:"true"`
 }
@@ -62,6 +69,7 @@ func (s *IceLockerUpdateReq) Generate(model *model.IceLocker) {
 		model.Id = s.Id
 	}
 	model.Name = s.Name
+	model.Sn = strings.TrimSpace(s.Sn)
 	model.Status = s.Status
 	if s.ControlBy.UpdateBy != 0 {
 		model.UpdateBy = s.UpdateBy
@@ -91,3 +99,10 @@ type IceLockerDeleteReq struct {
 func (s *IceLockerDeleteReq) GetId() interface{} {
 	return s.Id
 }
+
+type IceLockerBatchInsertReq struct {
+	List             []IceLockerInsertReq
+	Status           string `json:"status"` // 1-停用 2-正常
+	common.ControlBy `swaggerignore:"true"`
+	common.DeptBy    `swaggerignore:"true"`
+}

+ 9 - 8
app/admin/service/dto/ice_raft.go

@@ -16,7 +16,7 @@ type IceRaftGetNewestRecordPageReq struct {
 	dto.Pagination `search:"-"`
 	Code           string `form:"code" search:"type:contains;column:code;table:ice_raft"` // 冰排名称
 	Status         string `form:"status" search:"-"`                                      // 状态
-	IceLockerId    int    `form:"iceLockerId" search:"-"`                                 // 柜id
+	IceLockerId    int    `form:"iceLockerId" search:"-"`                                 // 冷冻柜id
 	CoolerBoxId    int    `form:"coolerBoxId" search:"-"`                                 // 保温箱id
 	IceRaftOrder
 }
@@ -27,6 +27,7 @@ type GetPageByCoolerBoxIdReq struct {
 
 type IceRaftOrder struct {
 	CreatedAtOrder string `search:"type:order;column:created_at;table:ice_raft" form:"createdAtOrder" default:"desc"`
+	IdOrder        string `search:"type:order;column:id;table:ice_raft" form:"idOrder" default:"desc"`
 }
 
 func (m *IceRaftGetPageReq) GetNeedSearch() interface{} {
@@ -37,18 +38,18 @@ func (m *IceRaftGetNewestRecordPageReq) GetNeedSearch() interface{} {
 }
 
 type IceRaftInsertReq struct {
-	Id               int    `json:"id" comment:"编码" swaggerignore:"true"` // 编码
-	Code             string `json:"code" vd:"len($)>0;msg:'冰排编号不能为空'"`    // 冰排名称
-	Status           string `json:"status"`                               // 1-停用 2-正常
+	Id               int      `json:"id" comment:"编码" swaggerignore:"true"`  // 编码
+	CodeList         []string `json:"codeList" vd:"len($)>0;msg:'冰排编号不能为空'"` // 冰排名称
+	Status           string   `json:"status"`                                // 1-停用 2-正常
 	common.ControlBy `swaggerignore:"true"`
 	common.DeptBy    `swaggerignore:"true"`
 }
 
-func (s *IceRaftInsertReq) Generate(model *model.IceRaft) {
+func (s *IceRaftInsertReq) Generate(model *model.IceRaft, code string) {
 	if s.Id != 0 {
 		model.Id = s.Id
 	}
-	model.Code = s.Code
+	model.Code = code
 	model.Status = s.Status
 	if s.ControlBy.UpdateBy != 0 {
 		model.UpdateBy = s.UpdateBy
@@ -109,7 +110,7 @@ func (s *IceRaftDeleteReq) GetId() interface{} {
 
 type IceRaftInStorageReq struct {
 	Code             []string `json:"code"`
-	IceLockerId      int      `json:"iceLockerId"` // 柜id
+	IceLockerId      int      `json:"iceLockerId"` // 冷冻柜id
 	FreezeClaim      float32  `json:"freezeClaim"` // 冷冻要求
 	common.ControlBy `swaggerignore:"true"`
 }
@@ -135,7 +136,7 @@ func (m *IceRaftRecordGetPageReq) GetNeedSearch() interface{} {
 
 type IceRaftRecordUpdateReq struct {
 	Id               int     `json:"id" comment:"编码"` // 编码
-	IceLockerId      int     `json:"iceLockerId"`     // 柜id
+	IceLockerId      int     `json:"iceLockerId"`     // 冷冻柜id
 	CoolerBoxId      int     `json:"coolerBoxId"`     // 保温箱id
 	FreezeClaim      float32 `json:"freezeClaim"`     // 冷冻要求 单位小时
 	common.ControlBy `swaggerignore:"true"`

+ 13 - 0
app/admin/service/dto/sys_user.go

@@ -13,6 +13,7 @@ type SysUserGetPageReq struct {
 	Type            int    `form:"type" search:"type:exact;column:type;table:sys_user" comment:"状态"`
 	SysUserOrder
 }
+
 type SysUserOrder struct {
 	//UserIdOrder    string `search:"type:order;column:id;table:sys_user" form:"userIdOrder"`
 	//UsernameOrder  string `search:"type:order;column:username;table:sys_user" form:"usernameOrder"`
@@ -20,9 +21,21 @@ type SysUserOrder struct {
 	CreatedAtOrder string `search:"type:order;column:created_at;table:sys_user" form:"createdAtOrder" default:"desc"`
 }
 
+type SysUserGetPageByDeptIdReq struct {
+	dto2.Pagination `search:"-"`
+	Username        string `form:"username" search:"type:contains;column:username;table:sys_user" comment:"用户名"`
+	Name            string `form:"name" search:"type:contains;column:nick_name;table:sys_user" comment:"昵称"`
+	Type            int    `form:"type" search:"type:exact;column:type;table:sys_user" comment:"状态"`
+	CompanyId       int    `form:"companyId" search:"-" comment:"公司id"`
+	SysUserOrder
+}
+
 func (m *SysUserGetPageReq) GetNeedSearch() interface{} {
 	return *m
 }
+func (m *SysUserGetPageByDeptIdReq) GetNeedSearch() interface{} {
+	return *m
+}
 
 type ResetSysUserPwdReq struct {
 	Id               int    `json:"id" example:"1" vd:"$>0"`                 // 用户ID

+ 30 - 27
app/admin/service/dto/waybill.go

@@ -13,6 +13,7 @@ import (
 type WaybillGetPageReq struct {
 	dto.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"`           // 状态
 	OrderStartTime string `form:"orderStartTime" search:"type:gte;column:order_time;table:waybill"` // 下单开始时间
 	OrderEndTime   string `form:"orderEndTime" search:"type:lte;column:order_time;table:waybill"`   // 下单结束时间
@@ -44,6 +45,7 @@ func (m *WaybillGetCustomerPageReq) GetNeedSearch() interface{} {
 type WaybillInsertReq struct {
 	Id                      int    `json:"id" comment:"编码" swaggerignore:"true"` // 编码
 	No                      string `json:"no" swaggerignore:"true"`              //单号
+	OrderNo                 string `json:"orderNo"`                              // 订单号
 	Status                  int    `json:"status" swaggerignore:"true"`          //订单状态:1-待处理;102-待装车 103-运输中 104-已签收
 	SaveSenderAddress       bool   `json:"saveSenderAddress"`                    //保存发货地址
 	SenderAddressDetails    string `json:"senderAddressDetails"`                 //发货地址详情
@@ -71,6 +73,7 @@ func (s *WaybillInsertReq) Generate(m *model.Waybill) {
 		m.Id = s.Id
 	}
 	m.Status = 1
+	m.OrderNo = s.OrderNo
 	m.SenderAddressDetails = s.SenderAddressDetails
 	m.SenderAddressName = s.SenderAddressName
 	m.SenderAddressPhone = s.SenderAddressPhone
@@ -105,22 +108,23 @@ func (s *WaybillInsertReq) GetId() interface{} {
 
 type WaybillUpdateReq struct {
 	Id                      int    `json:"id" comment:"编码" swaggerignore:"true"` // 编码
-	SenderAddressDetails    string `json:"senderAddressDetails"`                 //发货地址详情
-	SenderAddressName       string `json:"senderAddressName"`                    //发货地址名称
-	SenderAddressPhone      string `json:"senderAddressPhone"`                   //发货地址电话
-	ConsigneeAddressDetails string `json:"consigneeAddressDetails"`              //收发货地址详情
-	ConsigneeAddressName    string `json:"consigneeAddressName"`                 //收发货地址名称
-	ConsigneeAddressPhone   string `json:"consigneeAddressPhone"`                //收发货地址电话
-	DeliveryName            string `json:"deliveryName"`                         // 配送姓名
-	DeliveryPhone           string `json:"deliveryPhone"`                        // 配送电话
-	DeliveryId              int    `json:"deliveryId"`                           // 配送id
-	ReCheckId               int    `json:"reCheckId"`                            // 复核人id
-	TamperProofLabel        string `json:"tamperProofLabel"`                     //防拆标签
-	TamperProofLabelImg     string `json:"tamperProofLabelImg"`                  //防拆码标签图片
-	DeliveryCondition       string `json:"deliveryCondition"`                    //配送要求
-	Quantity                int    `json:"quantity"`                             //药品数量
-	Remark                  string `json:"remark"`                               //运输备注
-	CoolerBoxId             int    `json:"coolerBoxId"`                          //保温箱id
+	OrderNo                 string `json:"orderNo"`
+	SenderAddressDetails    string `json:"senderAddressDetails"`    //发货地址详情
+	SenderAddressName       string `json:"senderAddressName"`       //发货地址名称
+	SenderAddressPhone      string `json:"senderAddressPhone"`      //发货地址电话
+	ConsigneeAddressDetails string `json:"consigneeAddressDetails"` //收发货地址详情
+	ConsigneeAddressName    string `json:"consigneeAddressName"`    //收发货地址名称
+	ConsigneeAddressPhone   string `json:"consigneeAddressPhone"`   //收发货地址电话
+	DeliveryName            string `json:"deliveryName"`            // 配送姓名
+	DeliveryPhone           string `json:"deliveryPhone"`           // 配送电话
+	DeliveryId              int    `json:"deliveryId"`              // 配送id
+	ReCheckId               int    `json:"reCheckId"`               // 复核人id
+	TamperProofLabel        string `json:"tamperProofLabel"`        //防拆标签
+	TamperProofLabelImg     string `json:"tamperProofLabelImg"`     //防拆码标签图片
+	DeliveryCondition       string `json:"deliveryCondition"`       //配送要求
+	Quantity                int    `json:"quantity"`                //药品数量
+	Remark                  string `json:"remark"`                  //运输备注
+	CoolerBoxId             int    `json:"coolerBoxId"`             //保温箱id
 	model2.ControlBy        `swaggerignore:"true"`
 	model2.DeptBy           `swaggerignore:"true"`
 }
@@ -129,6 +133,7 @@ func (s *WaybillUpdateReq) Generate(m *model.Waybill) {
 	if s.Id != 0 {
 		m.Id = s.Id
 	}
+	m.OrderNo = s.OrderNo
 	m.SenderAddressDetails = s.SenderAddressDetails
 	m.SenderAddressName = s.SenderAddressName
 	m.SenderAddressPhone = s.SenderAddressPhone
@@ -184,9 +189,9 @@ func (s *WaybillUpdateStatusReq) GetId() interface{} {
 }
 
 type WaybillDeliveryReq struct {
-	WaybillIds       []int    `json:"waybillIds"`                        // 运单id
-	CoolerBoxId      int      `json:"coolerBoxId"`                       // 保温箱id
-	IceRaftCode      []string `json:"iceRaftCode"`                       // 冰排code
+	WaybillIds       []int    `json:"waybillIds"`                          // 运单id
+	CoolerBoxId      int      `json:"coolerBoxId"`                         // 保温箱id
+	IceRaftCode      []string `json:"iceRaftCode"`                         // 冰排code
 	OldIceRaftCode   []string `json:"oldIceRaftCode" swaggerignore:"true"` // 旧的冰排code
 	model2.ControlBy `swaggerignore:"true"`
 	model2.DeptBy    `swaggerignore:"true"`
@@ -259,13 +264,14 @@ type WaybillUserStatsReq struct {
 	UserType string `form:"userType"` // 配送员 delivery-配送员 reCheck-复核员
 	UserIds  []int  `form:"userId"`   // 用户id
 }
+type WaybillStats struct {
+	Date string `json:"date"` // 日期 2024-01-01
+	Num  int64  `json:"num"`  // 数量
+}
 
 type WaybillUserStats struct {
 	Name  string
-	Stats []struct {
-		Date string `json:"date"` // 日期 2024-01-01
-		Num  int64  `json:"num"`  // 数量
-	} `json:"stats"`
+	Stats []WaybillStats `json:"stats"`
 }
 type WaybillStatsRes struct {
 	TodayNum        int64 `json:"todayNum"`        // 今日总运单数
@@ -278,10 +284,7 @@ type WaybillStatsRes struct {
 	ThisYearNum     int64 `json:"thisYearNum"`     // 本年运单数
 	LastYearNum     int64 `json:"lastYearNum"`     // 上年运单数
 
-	Stats []struct {
-		Date string `json:"date"` // 日期 2024-01-01
-		Num  int64  `json:"num"`  // 数量
-	} `json:"stats"`
+	Stats []WaybillStats `json:"stats"`
 }
 
 type WaybillGetByWaybillNoReq struct {

+ 90 - 7
app/admin/service/ice_locker.go

@@ -6,6 +6,7 @@ import (
 	"cold-delivery/common/actions"
 	cDto "cold-delivery/common/dto"
 	"cold-delivery/common/global"
+	"cold-delivery/common/nats/nats_server"
 	"errors"
 	"gogs.baozhida.cn/zoie/OAuth-core/service"
 	"gorm.io/gorm"
@@ -27,6 +28,10 @@ func (e *IceLocker) GetPage(c *dto.IceLockerGetPageReq, list *[]model.IceLocker,
 			).
 			Find(list).Limit(-1).Offset(-1).
 			Count(count).Error
+		if err != nil {
+			e.Log.Errorf("db error: %s", err)
+			return global.GetFailedErr
+		}
 	} else {
 		err = e.Orm.Model(&data).
 			Scopes(
@@ -36,11 +41,29 @@ func (e *IceLocker) GetPage(c *dto.IceLockerGetPageReq, list *[]model.IceLocker,
 			).
 			Find(list).Limit(-1).Offset(-1).
 			Count(count).Error
+
 	}
+
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
 		return global.GetFailedErr
 	}
+	if c.ShowTemp {
+		// 获取公司秘钥
+		var company model.SysDept
+		company, err = model.GetCompanyById(p.DeptId)
+		if err != nil {
+			e.Log.Errorf("db error: %s", err)
+			return model.GetCompanyKeyErr
+		}
+		for i := 0; i < len(*list); i++ {
+			deviceData, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey((*list)[i].Sn, company.ColdKey)
+			if len(deviceData) > 0 {
+				(*list)[i].DeviceData = deviceData[0].T_DeviceSensorData
+			}
+		}
+	}
+
 	return nil
 }
 
@@ -75,18 +98,18 @@ func (e *IceLocker) Insert(c *dto.IceLockerInsertReq) error {
 	}()
 
 	var k int64
-	err = tx.Model(&data).Where("name = ? and dept_id = ?", c.Name,c.DeptId).Count(&k).Error
+	err = tx.Model(&data).Where("name = ? and dept_id = ?", c.Name, c.DeptId).Count(&k).Error
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
 		return global.CreateFailedErr
 	}
 	if k > 0 {
-		err = errors.New("柜名称已存在!")
+		err = errors.New("冷冻柜名称已存在!")
 		e.Log.Errorf("db error: %s", err)
 		return err
 	}
 
-	// 添加
+	// 添加冷冻
 	c.Generate(&data)
 	err = tx.Create(&data).Error
 	if err != nil {
@@ -113,7 +136,7 @@ func (e *IceLocker) Update(c *dto.IceLockerUpdateReq, p *actions.DataPermission)
 	}()
 
 	var iceLockerModel = model.IceLocker{}
-	// 查询柜是否存在
+	// 查询冷冻柜是否存在
 	err = e.Orm.Scopes(actions.Permission(iceLockerModel.TableName(), p)).
 		First(&iceLockerModel, c.GetId()).Error
 	if err != nil {
@@ -127,18 +150,35 @@ func (e *IceLocker) Update(c *dto.IceLockerUpdateReq, p *actions.DataPermission)
 	if iceLockerModel.Name != c.Name {
 		var k int64
 		var data = model.IceLocker{}
-		err = tx.Model(&data).Where("name = ? and dept_id = ?", c.Name,iceLockerModel.DeptId).Count(&k).Error
+		err = tx.Model(&data).Where("name = ? and dept_id = ?", c.Name, iceLockerModel.DeptId).Count(&k).Error
 		if err != nil {
 			e.Log.Errorf("db error: %s", err)
 			return global.CreateFailedErr
 		}
 		if k > 0 {
-			err = errors.New("柜名称已存在!")
+			err = errors.New("冷冻柜名称已存在!")
 			e.Log.Errorf("db error: %s", err)
 			return err
 		}
 	}
 
+	if iceLockerModel.Sn != c.Sn {
+		var k int64
+		var data = model.IceLocker{}
+		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
+		}
+
+		iceLockerModel.HistorySn = append(iceLockerModel.HistorySn, c.Sn)
+	}
+
 	c.Generate(&iceLockerModel)
 	err = tx.Save(&iceLockerModel).Error
 	if err != nil {
@@ -165,7 +205,7 @@ func (e *IceLocker) Remove(c *dto.IceLockerDeleteReq, p *actions.DataPermission)
 
 	var iceLockerModel model.IceLocker
 
-	// 查询柜是否存在
+	// 查询冷冻柜是否存在
 	err = e.Orm.Scopes(actions.Permission(iceLockerModel.TableName(), p)).
 		First(&iceLockerModel, c.GetId()).Error
 	if err != nil {
@@ -188,3 +228,46 @@ func (e *IceLocker) Remove(c *dto.IceLockerDeleteReq, p *actions.DataPermission)
 
 	return nil
 }
+
+func (e *IceLocker) BatchInsert(c *dto.IceLockerBatchInsertReq) error {
+	var err error
+
+	tx := e.Orm.Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+
+	for _, iceLocker := range c.List {
+		var data model.IceLocker
+
+		var k int64
+		err = tx.Model(&data).Where("sn = ?", iceLocker.Sn).Count(&k).Error
+		if err != nil {
+			e.Log.Errorf("db error: %s", err)
+			return global.CreateFailedErr
+		}
+		if k > 0 {
+			//err = errors.New("该Sn已绑定!")
+			continue
+		}
+
+		// 添加冷冻柜
+		iceLocker.CreateBy = c.CreateBy
+		iceLocker.DeptId = c.DeptId
+		iceLocker.Status = c.Status
+		iceLocker.Generate(&data)
+		data.HistorySn = []string{data.Sn}
+		err = tx.Create(&data).Error
+		if err != nil {
+			e.Log.Errorf("db error: %s", err)
+			return global.CreateFailedErr
+		}
+	}
+
+	return nil
+
+}

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

@@ -51,6 +51,10 @@ func IceRaftNameRecordStatusScopes(status string) func(db *gorm.DB) *gorm.DB {
 		if len(status) == 0 {
 			return db
 		}
+		if status == "0" {
+			return db.Where("ice_raft_record.status is null")
+
+		}
 		return db.Where("ice_raft_record.status = ?", status)
 	}
 }
@@ -81,9 +85,11 @@ func (e *IceRaft) GetRecordPage(c *dto.IceRaftGetNewestRecordPageReq, list *[]mo
 			Scopes(
 				actions.Permission(data.TableName(), p),
 			).
+			Where("ice_raft.status = '2'").
 			Joins("left join ice_raft_record on ice_raft.ice_raft_record_id = ice_raft_record.id").
 			Preload("IceRaftRecord.IceLocker").
 			Preload("IceRaftRecord.CoolerBox").
+			Order("FIELD(ice_raft_record.status,'2','','1','3','4')").
 			Find(list).Limit(-1).Offset(-1).
 			Count(count).Error
 	} else {
@@ -96,10 +102,11 @@ func (e *IceRaft) GetRecordPage(c *dto.IceRaftGetNewestRecordPageReq, list *[]mo
 				IceRaftNameRecordIceLockerIdScopes(c.IceLockerId),
 				IceRaftNameRecordCoolerBoxIdScopes(c.CoolerBoxId),
 			).
-			Where("ice_raft_record.deleted_at is null").
+			Where("ice_raft.status = '2'").
 			Joins("left join ice_raft_record on ice_raft.ice_raft_record_id = ice_raft_record.id").
 			Preload("IceRaftRecord.IceLocker").
 			Preload("IceRaftRecord.CoolerBox").
+			Order("FIELD(ice_raft_record.status,'2','','1','3','4')").
 			Find(list).Limit(-1).Offset(-1).
 			Count(count).Error
 	}
@@ -140,26 +147,27 @@ func (e *IceRaft) Insert(c *dto.IceRaftInsertReq) error {
 		}
 	}()
 
-	var k int64
-	err = tx.Model(&data).Where("code = ? and dept_id = ?", c.Code, c.DeptId).Count(&k).Error
-	if err != nil {
-		e.Log.Errorf("db error: %s", err)
-		return global.CreateFailedErr
-	}
-	if k > 0 {
-		err = errors.New("冰排编号已存在!")
-		e.Log.Errorf("db error: %s", err)
-		return err
-	}
+	for _, code := range c.CodeList {
+		var k int64
+		err = tx.Model(&data).Where("code = ? and dept_id = ?", code, c.DeptId).Count(&k).Error
+		if err != nil {
+			e.Log.Errorf("db error: %s", err)
+			return global.CreateFailedErr
+		}
+		// 冰排编号已存在
+		if k > 0 {
+			continue
+		}
 
-	// 添加冰柜
-	c.Generate(&data)
-	err = tx.Create(&data).Error
-	if err != nil {
-		e.Log.Errorf("db error: %s", err)
-		return global.CreateFailedErr
+		// 添加冰排
+		data.Id = 0
+		c.Generate(&data, code)
+		err = tx.Create(&data).Error
+		if err != nil {
+			e.Log.Errorf("db error: %s", err)
+			return global.CreateFailedErr
+		}
 	}
-	c.Id = data.Id
 
 	return nil
 
@@ -179,7 +187,7 @@ func (e *IceRaft) Update(c *dto.IceRaftUpdateReq, p *actions.DataPermission) err
 	}()
 
 	var iceRaftModel = model.IceRaft{}
-	// 查询冰是否存在
+	// 查询冰是否存在
 	err = e.Orm.Scopes(actions.Permission(iceRaftModel.TableName(), p)).
 		First(&iceRaftModel, c.GetId()).Error
 	if err != nil {
@@ -231,7 +239,7 @@ func (e *IceRaft) Remove(c *dto.IceRaftDeleteReq, p *actions.DataPermission) err
 
 	var iceRaftModel model.IceRaft
 
-	// 查询冰是否存在
+	// 查询冰是否存在
 	err = e.Orm.Scopes(actions.Permission(iceRaftModel.TableName(), p)).
 		First(&iceRaftModel, c.GetId()).Error
 	if err != nil {
@@ -265,16 +273,16 @@ func (e *IceRaft) InStorage(c *dto.IceRaftInStorageReq, p *actions.DataPermissio
 			tx.Commit()
 		}
 	}()
-	// 查询冷柜信息
+	// 查询冷柜信息
 	var iceLockerModel model.IceLocker
 	err = e.Orm.Scopes(actions.Permission(iceLockerModel.TableName(), p)).
 		First(&iceLockerModel, c.IceLockerId).Error
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
-		return errors.New("获取冷柜信息失败")
+		return errors.New("获取冷柜信息失败")
 	}
 	if iceLockerModel.Status != model.IceLockerStatusNormal {
-		err = errors.New("冷柜状态异常")
+		err = errors.New("冷柜状态异常")
 		return err
 	}
 
@@ -297,7 +305,7 @@ func (e *IceRaft) InStorage(c *dto.IceRaftInStorageReq, p *actions.DataPermissio
 					e.Log.Errorf("db error: %s", err)
 					return errors.New(fmt.Sprintf("添加冰排【%s】信息失败", code))
 				}
-			}else {
+			} else {
 				e.Log.Errorf("db error: %s", err)
 				return errors.New("获取冰排信息失败")
 			}
@@ -499,7 +507,7 @@ func (e *IceRaftRecord) Update(c *dto.IceRaftRecordUpdateReq, p *actions.DataPer
 	}()
 
 	var iceRaftRecordModel = model.IceRaftRecord{}
-	// 查询冰是否存在
+	// 查询冰是否存在
 	err = e.Orm.Scopes(actions.Permission(iceRaftRecordModel.TableName(), p)).
 		First(&iceRaftRecordModel, c.GetId()).Error
 	if err != nil {
@@ -540,7 +548,7 @@ func (e *IceRaftRecord) Remove(c *dto.IceRaftRecordDeleteReq, p *actions.DataPer
 
 	var iceRaftRecordModel model.IceRaftRecord
 
-	// 查询冰是否存在
+	// 查询冰是否存在
 	err = e.Orm.Scopes(actions.Permission(iceRaftRecordModel.TableName(), p)).
 		First(&iceRaftRecordModel, c.GetId()).Error
 	if err != nil {

+ 33 - 0
app/admin/service/sys_user.go

@@ -53,6 +53,39 @@ func (e *SysUser) GetPage(c *dto.SysUserGetPageReq, p *actions.DataPermission, l
 	return nil
 }
 
+func GetSysUserCompanyIdScopes(companyId int) func(db *gorm.DB) *gorm.DB {
+
+	return func(db *gorm.DB) *gorm.DB {
+		if companyId == 0 {
+			return db
+		}
+		return db.Where("dept_id = ?", companyId)
+	}
+}
+func (e *SysUser) GetPageByDeptId(c *dto.SysUserGetPageByDeptIdReq, p *actions.DataPermission, list *[]model.SysUser, count *int64) error {
+	var err error
+	var userList []model.SysUser
+
+	err = e.Orm.
+		Scopes(
+			cDto.MakeCondition(c.GetNeedSearch()),
+			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
+			GetSysUserCompanyIdScopes(c.CompanyId),
+		).
+		Where("user_type = ?", model.UserTypeSys).
+		Preload("Dept").
+		Preload("CreateUser").
+		Find(&userList).Limit(-1).Offset(-1).
+		Count(count).Error
+
+	if err != nil {
+		e.Log.Errorf("db error: %s", err)
+		return global.GetFailedErr
+	}
+	*list = userList
+	return nil
+}
+
 // Get 获取SysUser对象
 func (e *SysUser) Get(d *dto.SysUserGetReq, p *actions.DataPermission, userModel *model.SysUser) error {
 	var data model.SysUser

+ 78 - 6
app/admin/service/waybill.go

@@ -197,6 +197,9 @@ func (e *Waybill) GetByWaybillNo(d *dto.WaybillGetByWaybillPdfReq, waybillModel
 		Scopes(actions.Permission(waybillModel.TableName(), p)).
 		Where("waybill_no = ?", d.WaybillNo).
 		Preload("Dept").
+		Preload("CoolerBox").
+		Preload("Delivery").
+		Preload("ReCheck").
 		First(waybillModel).Error
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
@@ -405,7 +408,7 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 		if len(extraData) > 0 {
 			for _, code := range extraData {
 				var iceRaft model.IceRaft
-				err = tx.Model(&model.IceRaft{}).Where("code = ?", code).First(&iceRaft).Error
+				err = tx.Model(&model.IceRaft{}).Where("code = ?", code).Preload("IceRaftRecord").First(&iceRaft).Error
 				if err != nil {
 					e.Log.Errorf("db error: %s", err)
 					if errors.Is(err, gorm.ErrRecordNotFound) {
@@ -415,6 +418,10 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 					}
 
 				}
+				if iceRaft.IceRaftRecord.Status != model.IceRaftRecordStatusWaitUse {
+					err = errors.New(fmt.Sprintf("冰排【%s】状态为%s,出库保温箱失败!", code, model.GetIceRaftRecordStatus(iceRaft.IceRaftRecord.Status)))
+					return err
+				}
 				// 获取冰排记录
 				err = tx.Model(&model.IceRaftRecord{}).
 					Where("ice_raft_id = ? and status = ?", iceRaft.Id, model.IceRaftRecordStatusWaitUse).
@@ -557,7 +564,7 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 			}
 			waybillModel.SendLog = model.WaybillSendLog{
 				Phone:   waybillModel.ConsigneeAddressPhone,
-				Content: "【冷链送药平台】您的订单正在派送中,点击查看详情:" + addr,
+				Content: "【冷链送药追溯平台】您的运单正在派送中,点击查看详情:" + addr,
 			}
 		}
 
@@ -857,7 +864,7 @@ func (e *Waybill) GetDeliveryStats(c *dto.WaybillUserStatsReq, p *actions.DataPe
 	// 获取用户列表
 	var userList []model.SysUser
 	if err := e.Orm.Model(&userList).Scopes(actions.Permission(model.SysUser{}.TableName(), p), WaybillUserStatsUserIdScopes(c.UserIds)).
-		Where("status = 2").Find(&userList).Error; err != nil {
+		Where("status = 2").Order("created_at desc").Find(&userList).Error; err != nil {
 		return nil
 	}
 	for _, user := range userList {
@@ -871,7 +878,7 @@ func (e *Waybill) GetReCheckStats(c *dto.WaybillUserStatsReq, p *actions.DataPer
 	// 获取用户列表
 	var userList []model.SysUser
 	if err := e.Orm.Model(&userList).Scopes(actions.Permission(model.SysUser{}.TableName(), p), WaybillUserStatsUserIdScopes(c.UserIds)).
-		Where("status = 2").Find(&userList).Error; err != nil {
+		Where("status = 2").Order("created_at desc").Find(&userList).Error; err != nil {
 		return nil
 	}
 	for _, user := range userList {
@@ -888,9 +895,9 @@ func WaybillUserStatsUserIdScopes(userIds []int) func(db *gorm.DB) *gorm.DB {
 			return db
 		}
 		if len(userIds) == 1 {
-			return db.Where("user_id = ?", userIds[0])
+			return db.Where("id = ?", userIds[0])
 		}
-		return db.Where("user_id in (?)", userIds)
+		return db.Where("id in (?)", userIds)
 	}
 }
 
@@ -1006,6 +1013,10 @@ func (e *Waybill) GetUserStats(c *dto.WaybillUserStatsReq, p *actions.DataPermis
 		// 年度数据统计
 		e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p), scopes).
 			Where("order_time between ? and ?", firstDayOfyear, lastDayOfyear).Group("date").Find(&res.Stats)
+		// 获取这个月的所有日期
+		allDates := getAllDatesInYear(c.Date)
+		// 补齐缺失日期的数据
+		res.Stats = completeMissingDates(allDates, res.Stats)
 	}
 
 	if c.Type == "month" {
@@ -1015,11 +1026,72 @@ func (e *Waybill) GetUserStats(c *dto.WaybillUserStatsReq, p *actions.DataPermis
 		lastDayOfMonth := time.Date(month.Year(), month.Month()+1, 1, 23, 59, 59, 0, now.Location()).Add(-time.Hour * 24)
 		e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m-%d') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p), scopes).
 			Where("order_time between ? and ?", firstDayOfMonth, lastDayOfMonth).Group("date").Find(&res.Stats)
+		// 获取这个月的所有日期
+		allDates := getAllDatesInMonth(c.Date)
+		// 补齐缺失日期的数据
+		res.Stats = completeMissingDates(allDates, res.Stats)
 	}
 
 	return res
 }
 
+// 获取指定月份的所有日期
+func getAllDatesInMonth(month string) []string {
+	var dates []string
+	layout := "2006-01-02"
+	firstDay, _ := time.Parse(layout, month+"-01")
+	if time.Now().Before(firstDay) {
+		return dates
+	}
+	lastDay := firstDay.AddDate(0, 1, -1)
+	if time.Now().Before(lastDay) {
+		lastDay = time.Now()
+	}
+
+	for d := firstDay; !d.After(lastDay); d = d.AddDate(0, 0, 1) {
+		dates = append(dates, d.Format(layout))
+	}
+
+	return dates
+}
+
+// 获取指定年份的所有日期
+func getAllDatesInYear(year string) []string {
+	var dates []string
+	layout := "2006-01"
+	firstDay, _ := time.Parse(layout, year+"-01")
+	lastDay := firstDay.AddDate(1, 0, -1)
+	if time.Now().Before(firstDay) {
+		return dates
+	}
+	if time.Now().Before(lastDay) {
+		lastDay = time.Now()
+	}
+	for d := firstDay; !d.After(lastDay); d = d.AddDate(0, 1, 0) {
+		dates = append(dates, d.Format(layout))
+	}
+	return dates
+}
+
+// 补齐缺失日期的数据
+func completeMissingDates(allDates []string, stats []dto.WaybillStats) []dto.WaybillStats {
+	dateMap := make(map[string]int64)
+	for _, stat := range stats {
+		dateMap[stat.Date] = stat.Num
+	}
+
+	var completedStats []dto.WaybillStats
+	for _, date := range allDates {
+		num, exists := dateMap[date]
+		if !exists {
+			num = 0
+		}
+		completedStats = append(completedStats, dto.WaybillStats{Date: date, Num: num})
+	}
+
+	return completedStats
+}
+
 // 获取运单所有温湿度素具
 func (e *Waybill) GetAllData(c *dto.WaybillGetByWaybillNoReq) ([]nats_server.DeviceData_R, []WaybillPDF, error) {
 	var err error

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

@@ -10,6 +10,14 @@ import (
 
 func Cold_CompanyDeviceSensor_List_ByKey(T_sn, T_key string) (data []DeviceSensor_R, count int64, err error) {
 
+	if len(T_sn) == 0 {
+		err = errors.New("sn不能为空!")
+		return
+	}
+	if len(T_key) == 0 {
+		err = errors.New("公司秘钥不能为空!")
+		return
+	}
 	type T_Req struct {
 		T_sn  string `xml:"T_sn"`
 		T_key string `xml:"T_key"`
@@ -216,3 +224,28 @@ func Cold_ReadDevice_List(name, T_key string, page, page_z int) (data []Device_R
 
 	return list, t_R.Count, nil
 }
+func Cold_ReadCompanyByT_key(T_key string) (data Company_R, err error) {
+
+	msg, err := nats.Nats.Request("Cold_ReadCompanyByT_key", []byte(T_key), 3*time.Second)
+	if err != nil {
+		return
+	}
+
+	type T_R struct {
+		Code int16     `xml:"Code"`
+		Msg  string    `xml:"Msg"`
+		Data Company_R `xml:"Data"` // 泛型
+	}
+	var t_R T_R
+
+	err = msgpack.Unmarshal(msg.Data, &t_R)
+	if err != nil {
+		return
+	}
+	if t_R.Code != 200 {
+		err = errors.New(t_R.Msg)
+		return
+	}
+
+	return t_R.Data, nil
+}

+ 15 - 0
common/nats/nats_server/models.go

@@ -141,3 +141,18 @@ type Device_R struct {
 	T_DeviceSensor_Num int // 传感器数量
 
 }
+
+type Company_R struct {
+	Id         int
+	T_mid      int     // 上一级 ID
+	T_name     string  // 公司名称
+	T_plan     string  // 平面图
+	T_data     string  // 大数据
+	T_v3d      string  // 3D 视图
+	T_money    float32 // 余额
+	T_warning  int     // 报警统计
+	T_key      string
+	T_type     int // 公司类型 1-医药公司 2-运输企业
+	T_Charging int
+	Children   []Company_R
+}