Преглед изворни кода

ADD:获取最新一条温湿度记录信息

zoie пре 1 година
родитељ
комит
de2f881cd9

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

@@ -462,3 +462,58 @@ func (e SysUser) VerifyCode(c *gin.Context) {
 	e.OK(req.Phone, "发送成功")
 
 }
+
+// GetPageFoeBind 获取用户列表-仓库/车辆绑定
+// @Summary 获取用户列表-仓库/车辆绑定
+// @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 "页码"
+// @Success 200 {object} response.Response{data=response.Page{list=[]model.SysUser}}  "{"code": 200, "data": [...]}"
+// @Router /api/sys-user [get]
+// @Security Bearer
+func (e SysUser) GetPageFoeBind(c *gin.Context) {
+	warehouseSvc := service.Warehouse{}
+	carSvc := service.Car{}
+	req := dto.SysUserGetPageReq{}
+	err := e.MakeContext(c).
+		MakeOrm().
+		Bind(&req, binding.Query).
+		MakeService(&warehouseSvc.Service).
+		MakeService(&carSvc.Service).
+		Errors
+
+	if err != nil {
+		e.Logger.Error(err)
+		e.Error(500, err, err.Error())
+		return
+	}
+
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c)
+
+	list := make([]model.SysUserForBind, 0)
+	var count int64
+
+	if req.Type == 2 {
+		err = warehouseSvc.GetUserList(&req, p, &list, &count)
+		if err != nil {
+			e.Error(500, err, err.Error())
+			return
+		}
+	}
+	if req.Type == 3 {
+		err = carSvc.GetUserList(&req, p, &list, &count)
+		if err != nil {
+			e.Error(500, err, err.Error())
+			return
+		}
+	}
+
+	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
+}

+ 213 - 0
app/admin/controller/waybill.go

@@ -8,6 +8,7 @@ import (
 	"cold-logistics/common/actions"
 	"errors"
 	"fmt"
+	"github.com/beego/beego/v2/core/logs"
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin/binding"
 	"github.com/xuri/excelize/v2"
@@ -17,6 +18,7 @@ import (
 	"net/url"
 	"os"
 	"path"
+	"time"
 )
 
 type WaybillController struct {
@@ -61,6 +63,104 @@ func (e WaybillController) GetPage(c *gin.Context) {
 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
 }
 
+// GetPage 获取运单列表
+// @Summary 获取运单列表
+// @Description 获取运单列表
+// @Tags 运单
+// @Param no query string false "运单号"
+// @Param pageSize query int false "页条数"
+// @Param page query int false "页码"
+// @Success 200 {object} response.Response{data=response.Page{list=[]model.Waybill}} "{"code": 200, "data": [...]}"
+// @Router /api/waybill [get]
+// @Security Bearer
+func (e WaybillController) Export(c *gin.Context) {
+	s := service.Waybill{}
+	req := dto.WaybillGetPageReq{}
+	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.Waybill, 0)
+	var count int64
+	req.PageSize = 9999
+	err = s.GetPage(&req, &list, &count, p)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+
+	f := excelize.NewFile() // 设置单元格的值
+	// 这里设置表头ÒÒ
+	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", "L1", "运输备注")
+
+	// 设置列宽
+	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", "F", "F", 14)
+	f.SetColWidth("Sheet1", "G", "G", 14)
+	f.SetColWidth("Sheet1", "H", "H", 30)
+	f.SetColWidth("Sheet1", "I", "K", 15)
+	f.SetColWidth("Sheet1", "L", "L", 15)
+
+	line := 1
+
+	// 循环写入数据
+	for i, v := range list {
+		line++
+		f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), i+1)
+		f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), model.WaybillStatusMap[v.Status])
+		f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.SenderAddressName)
+		f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.SenderAddressPhone)
+		f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.SenderAddressDetails)
+		f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.ConsigneeAddressName)
+		f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.ConsigneeAddressPhone)
+		f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.ConsigneeAddressDetails)
+		f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), v.TemperatureInterval)
+		f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), v.DeliveryCondition)
+		f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), v.CargoType)
+		f.SetCellValue("Sheet1", fmt.Sprintf("L%d", line), v.Remark)
+
+	}
+	timeStr := time.Now().Format("20060102150405")
+	filePath := "ofile/" + "运单" + timeStr + ".xlsx"
+	defer func() {
+		os.Remove(filePath)
+	}()
+	// 保存文件
+	if err = f.SaveAs(filePath); err != nil {
+		logs.Error("保存运单失败:", err)
+	}
+	c.Header("Content-Type", "application/vnd.ms-excel;charset=utf8")
+	// PathEscape 函数对中文做处理
+	c.Header("Content-Disposition", "attachment; filename="+url.PathEscape("运单"+timeStr+".xlsx"))
+	c.Header("Content-Transfer-Encoding", "binary")
+	c.File(filePath)
+}
+
 // Home 首页统计
 // @Summary 首页统计
 // @Description 首页统计
@@ -553,6 +653,95 @@ func (e WaybillController) GetCustomerPage(c *gin.Context) {
 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
 }
 
+func (e WaybillController) CustomerExport(c *gin.Context) {
+	s := service.Waybill{}
+	req := dto.WaybillGetCustomerPageReq{}
+	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.Waybill, 0)
+	var count int64
+	req.CustomerId = p.UserId
+	req.PageSize = 9999
+	err = s.GetCustomerPage(&req, &list, &count, p)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+
+	f := excelize.NewFile() // 设置单元格的值
+	// 这里设置表头ÒÒ
+	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", "L1", "运输备注")
+
+	// 设置列宽
+	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", "F", "F", 14)
+	f.SetColWidth("Sheet1", "G", "G", 14)
+	f.SetColWidth("Sheet1", "H", "H", 30)
+	f.SetColWidth("Sheet1", "I", "K", 15)
+	f.SetColWidth("Sheet1", "L", "L", 15)
+
+	line := 1
+
+	// 循环写入数据
+	for i, v := range list {
+		line++
+		f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), i+1)
+		f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), model.GetCustomerWaybillStatus(v.Status))
+		f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.SenderAddressName)
+		f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.SenderAddressPhone)
+		f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.SenderAddressDetails)
+		f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.ConsigneeAddressName)
+		f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.ConsigneeAddressPhone)
+		f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.ConsigneeAddressDetails)
+		f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), v.TemperatureInterval)
+		f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), v.DeliveryCondition)
+		f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), v.CargoType)
+		f.SetCellValue("Sheet1", fmt.Sprintf("L%d", line), v.Remark)
+
+	}
+	timeStr := time.Now().Format("20060102150405")
+	filePath := "ofile/" + "运单" + timeStr + ".xlsx"
+	defer func() {
+		os.Remove(filePath)
+	}()
+	// 保存文件
+	if err = f.SaveAs(filePath); err != nil {
+		logs.Error("保存运单失败:", err)
+	}
+	c.Header("Content-Type", "application/vnd.ms-excel;charset=utf8")
+	// PathEscape 函数对中文做处理
+	c.Header("Content-Disposition", "attachment; filename="+url.PathEscape("运单"+timeStr+".xlsx"))
+	c.Header("Content-Transfer-Encoding", "binary")
+	c.File(filePath)
+}
+
 // CustomerInsert 客户添加运单
 // @Summary 客户添加运单
 // @Description 客户添加运单
@@ -604,6 +793,18 @@ func (e WaybillController) CustomerInsert(c *gin.Context) {
 	}
 	e.OK(req.GetId(), "创建成功")
 }
+
+// Import 导入运单
+// @Summary 导入运单
+// @Description 导入运单
+// @Tags 运单
+// @Accept  application/json
+// @Product application/json
+// @Param data body dto.WaybillInsertReq true "data"
+// @Success 200 {string} string	"{"code": 200, "message": "添加成功"}"
+// @Success 200 {string} string	"{"code": -1, "message": "添加失败"}"
+// @Router /api/waybill/import [post]
+// @Security Bearer
 func (e WaybillController) Import(c *gin.Context) {
 	s := service.Waybill{}
 	userSvc := service.SysUser{}
@@ -711,6 +912,18 @@ func (e WaybillController) Import(c *gin.Context) {
 
 	e.OK(len(rows)-1, "导入成功")
 }
+
+// ExportTemplate 导出运单模板
+// @Summary 导出运单模板
+// @Description 导出运单模板
+// @Tags 运单
+// @Accept  application/json
+// @Product application/json
+// @Param data body dto.WaybillInsertReq true "data"
+// @Success 200 {string} string	"{"code": 200, "message": "添加成功"}"
+// @Success 200 {string} string	"{"code": -1, "message": "添加失败"}"
+// @Router /api/waybill/export-template [post]
+// @Security Bearer
 func (e WaybillController) ExportTemplate(c *gin.Context) {
 	s := service.Waybill{}
 	err := e.MakeContext(c).

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

@@ -84,6 +84,40 @@ func (e WaybillTaskController) GetData(c *gin.Context) {
 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
 }
 
+// GetNewestData 获取最新温湿度记录
+// @Summary 获取最新温湿度记录
+// @Description 获取最新温湿度记录
+// @Tags 运单任务
+// @Accept  application/json
+// @Product application/json
+// @Param data body dto.WaybillTaskGetDataPageReq true "body"
+// @Success 200 {object} response.Response{data=response.Page{list=[]model.WaybillTask}} "{"code": 200, "data": [...]}"
+// @Router /api/waybill-task/data [post]
+// @Security Bearer
+func (e WaybillTaskController) GetNewestData(c *gin.Context) {
+	s := service.WaybillTask{}
+	req := dto.WaybillTaskGetNewestDataPageReq{}
+	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
+	}
+
+	data := nats_server.DeviceData_R{}
+
+	data, err = s.GetNewestDataPage(&req)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+	e.OK(data, "查询成功")
+}
+
 func (e WaybillTaskController) GetLocus(c *gin.Context) {
 	s := service.WaybillTask{}
 	req := dto.WaybillGetLocusReq{}

+ 15 - 0
app/admin/model/sys_user.go

@@ -95,3 +95,18 @@ type SysUserOmit struct {
 func (SysUserOmit) TableName() string {
 	return "sys_user"
 }
+
+type SysUserForBind struct {
+	model2.Model
+	coreModel.User
+	Type     int    `json:"type" gorm:"size:128;comment:类型"`         // 管理员1 仓管2 司机3
+	UserType string `json:"userType" gorm:"size:128;comment:用户类型"`   // 系统用户-sys 客户-customer
+	Openid   string `json:"openid" gorm:"size:128;comment:微信openid"` // 微信openid
+	IsBind   bool
+	model2.ControlBy
+	model2.ModelTime
+}
+
+func (SysUserForBind) TableName() string {
+	return "sys_user"
+}

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

@@ -23,6 +23,19 @@ var (
 	}
 )
 
+// 获取客户运单状态
+func GetCustomerWaybillStatus(status int) string {
+	switch status {
+	case WaybillStatusWaitDelivery, WaybillStatusWaitTruck, WaybillStatusWaitStorage:
+		return "未发货"
+	case WaybillStatusTruck, WaybillStatusStorage, WaybillStatusTruckOut, WaybillStatusStorageOut:
+		return "已发货"
+	case WaybillStatusReceipt:
+		return "已签收"
+	}
+	return ""
+}
+
 // 运单
 type Waybill struct {
 	model2.Model
@@ -48,7 +61,7 @@ type Waybill struct {
 	ReceiptTime             model2.Time `json:"receiptTime"  gorm:"size:128"`             // 签收时间
 	WarehouseId             int         `json:"warehouseId"  gorm:"size:128"`             // 仓库id
 	CarId                   int         `json:"carId"  gorm:"size:128"`                   // 仓库id
-	ReceiptImg              string      `json:"ReceiptImg"  gorm:"size:128"`              // 签收图片
+	ReceiptImg              string      `json:"ReceiptImg"  gorm:"size:text"`             // 签收图片
 
 	Freight   float64     `json:"freight"  gorm:"size:9"` //运费
 	PrintUser SysUserOmit `json:"printUser" gorm:"->;foreignkey:PrintUserId;references:Id"`

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

@@ -20,6 +20,7 @@ func registerSysUserRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle
 	r := v1.Group("/sys-user").Use(authMiddleware.MiddlewareFunc()).Use(actions.PermissionAction())
 	{
 		r.GET("", cont.GetPage)
+		r.GET("/bind", cont.GetPageFoeBind)
 		r.GET("/:id", cont.Get)
 		r.POST("", cont.Insert)
 		r.PUT("", cont.Update)

+ 10 - 7
app/admin/router/waybill.go

@@ -24,16 +24,19 @@ func registerWaybillRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle
 		r.POST("/delivery", cont.Delivery)
 		r.PUT("", cont.Update)
 		r.DELETE("", cont.Delete)
-		r.POST("/warehouse-in", cont.WarehouseIn)      // 入库
-		r.POST("/warehouse-out", cont.WarehouseOut)    // 出库
-		r.POST("/car-in", cont.CarIn)                  // 装车
-		r.POST("/car-out", cont.CarOut)                // 下车
-		r.POST("/receipt", cont.Receipt)               // 签收
-		r.GET("/customer", cont.GetCustomerPage)       // 客户下单列表
-		r.POST("/customer", cont.CustomerInsert)       // 客户下单
+		r.POST("/warehouse-in", cont.WarehouseIn)   // 入库
+		r.POST("/warehouse-out", cont.WarehouseOut) // 出库
+		r.POST("/car-in", cont.CarIn)               // 装车
+		r.POST("/car-out", cont.CarOut)             // 下车
+		r.POST("/receipt", cont.Receipt)            // 签收
+		r.GET("/customer", cont.GetCustomerPage)    // 客户下单列表
+		r.POST("/customer", cont.CustomerInsert)    // 客户下单
+
 		r.GET("/applet", cont.GetAppletPage)           // app 运单列表
 		r.POST("/import", cont.Import)                 // 导入运单
 		r.GET("/export-template", cont.ExportTemplate) // 导出运单模板
 		r.GET("/home", cont.Home)                      // 首页统计
+		r.GET("/export", cont.Export)                  // 运单管理-导出
+		r.GET("/customer/export", cont.CustomerExport) // 客户下单
 	}
 }

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

@@ -18,5 +18,6 @@ func registerWaybillTaskRouter(v1 *gin.RouterGroup) {
 		r.GET("", cont.GetPage)
 		r.POST("/data", cont.GetData)
 		r.GET("/locus", cont.GetLocus)
+		r.POST("/newest-locus", cont.GetNewestData)
 	}
 }

+ 60 - 0
app/admin/service/car.go

@@ -170,6 +170,21 @@ func (e *Car) Update(c *dto.CarUpdateReq, p *actions.DataPermission) error {
 		carModel.HistorySn = append(carModel.HistorySn, c.Sn)
 	}
 
+	if carModel.UserId != c.UserId {
+		var k int64
+		var data = model.Car{}
+		err = tx.Model(&data).Where("user_id = ?", c.UserId).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
+		}
+	}
+
 	c.Generate(&carModel)
 	err = tx.Save(&carModel).Error
 	if err != nil {
@@ -219,3 +234,48 @@ func (e *Car) Remove(c *dto.CarDeleteReq, p *actions.DataPermission) error {
 
 	return nil
 }
+
+// GetUserList 获取绑定车辆的用户
+func (e *Car) GetUserList(c *dto.SysUserGetPageReq, p *actions.DataPermission, list *[]model.SysUserForBind, count *int64) error {
+	var err error
+	var userList []model.SysUserForBind
+
+	var carModel model.Car
+	var userModel model.SysUserForBind
+	var userIds []int
+	// 查询仓库是否存在
+	err = e.Orm.Model(&carModel).Select("user_id").Scopes(actions.Permission(carModel.TableName(), p)).
+		Find(&userIds).Error
+	if err != nil {
+		e.Log.Errorf("db error: %s", err)
+		return global.GetFailedErr
+	}
+
+	err = e.Orm.
+		Scopes(
+			cDto.MakeCondition(c.GetNeedSearch()),
+			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
+			actions.UserPermission(userModel.TableName(), p),
+		).
+		Where("user_type = ? ", model.UserTypeSys).
+		Find(&userList).Limit(-1).Offset(-1).
+		Count(count).Error
+
+	if err != nil {
+		e.Log.Errorf("db error: %s", err)
+		return global.GetFailedErr
+	}
+	userIdMap := make(map[int]bool)
+	for _, id := range userIds {
+		userIdMap[id] = true
+	}
+
+	for i := 0; i < len(userList); i++ {
+		if _, ok := userIdMap[userList[i].Id]; ok {
+			userList[i].IsBind = true
+		}
+	}
+
+	*list = userList
+	return nil
+}

+ 1 - 5
app/admin/service/customer.go

@@ -144,10 +144,6 @@ func (e *Customer) Update(c *dto.CustomerUpdateReq, p *actions.DataPermission) e
 		return global.UpdateFailedErr
 	}
 
-	// TODO 1.1.1.8更新用户信息
-	// TODO 1.1.1.10送气人员绑定资质信息
-	// TODO 1.1.1.11货车司机绑定资质信息
-
 	c.Generate(&userModel)
 	err = tx.Model(&userModel).Where("id = ?", &userModel.Id).
 		Omit("password", "salt").Updates(&userModel).Error
@@ -301,7 +297,7 @@ func (e *Customer) UpdatePwd(id int, oldPassword, newPassword string) error {
 }
 
 func (e *Customer) GetProfile(c *dto.CustomerById, user *model.SysUser) error {
-	err := e.Orm.First(user, c.GetId()).Preload("Dept").Error
+	err := e.Orm.Preload("Dept").First(user, c.GetId()).Error
 	if err != nil {
 		return err
 	}

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

@@ -14,6 +14,8 @@ type WaybillGetPageReq struct {
 	dto.Pagination `search:"-"`
 	WaybillNo      string `form:"waybillNo" search:"type:contains;column:waybill_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"`   // 下单结束时间
 	WaybillOrder
 }
 
@@ -29,6 +31,8 @@ type WaybillGetCustomerPageReq struct {
 	dto.Pagination `search:"-"`
 	WaybillNo      string `form:"waybillNo" search:"type:contains;column:waybill_no;table:waybill"`                      // 运单编号
 	Status         int    `form:"status" search:"-"`                                                                     // 状态
+	OrderStartTime string `form:"orderStartTime" search:"type:gte;column:order_time;table:waybill"`                      // 下单开始时间
+	OrderEndTime   string `form:"orderEndTime" search:"type:lte;column:order_time;table:waybill"`                        // 下单结束时间
 	CustomerId     int    `form:"customerId" search:"type:exact;column:customer_id;table:waybill"  swaggerignore:"true"` // 客户id
 	WaybillOrder
 }

+ 4 - 0
app/admin/service/dto/waybill_task.go

@@ -40,3 +40,7 @@ type WaybillGetLocusReq struct {
 func (m *WaybillGetLocusReq) GetNeedSearch() interface{} {
 	return *m
 }
+
+type WaybillTaskGetNewestDataPageReq struct {
+	WaybillNo string `form:"waybillNo" vd:"len($)>0;msg:'订单编号不能为空'"` // 运单编号-必填
+}

+ 3 - 19
app/admin/service/sys_user.go

@@ -29,6 +29,7 @@ func (e *SysUser) GetPage(c *dto.SysUserGetPageReq, p *actions.DataPermission, l
 				cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
 			).Where("create_by = ?", p.UserId).
 			Where("user_type = ?", model.UserTypeSys).
+			Preload("Dept").
 			Find(&userList).Limit(-1).Offset(-1).
 			Count(count).Error
 	} else {
@@ -39,6 +40,7 @@ func (e *SysUser) GetPage(c *dto.SysUserGetPageReq, p *actions.DataPermission, l
 				actions.UserPermission(data.TableName(), p),
 			).
 			Where("user_type = ?", model.UserTypeSys).
+			Preload("Dept").
 			Find(&userList).Limit(-1).Offset(-1).
 			Count(count).Error
 	}
@@ -47,20 +49,6 @@ func (e *SysUser) GetPage(c *dto.SysUserGetPageReq, p *actions.DataPermission, l
 		e.Log.Errorf("db error: %s", err)
 		return global.GetFailedErr
 	}
-
-	for i := 0; i < len(userList); i++ {
-		var dept model.SysDept
-		var role model.SysRole
-		//var post model.SysPost
-		err = e.Orm.First(&dept, userList[i].DeptId).Error
-		userList[i].Dept = dept
-
-		err = e.Orm.First(&role, userList[i].RoleId).Error
-		userList[i].Role = role
-
-		//err = e.Orm.First(&post, userList[i].PostId).Error
-		//userList[i].Post = post
-	}
 	*list = userList
 	return nil
 }
@@ -179,10 +167,6 @@ func (e *SysUser) Update(c *dto.SysUserUpdateReq, p *actions.DataPermission) err
 		return global.UpdateFailedErr
 	}
 
-	// TODO 1.1.1.8更新用户信息
-	// TODO 1.1.1.10送气人员绑定资质信息
-	// TODO 1.1.1.11货车司机绑定资质信息
-
 	c.Generate(&userModel)
 	err = tx.Model(&userModel).Where("id = ?", &userModel.Id).
 		Omit("password", "salt").Updates(&userModel).Error
@@ -352,7 +336,7 @@ func (e *SysUser) UpdatePwd(id int, oldPassword, newPassword string) error {
 }
 
 func (e *SysUser) GetProfile(c *dto.SysUserById, user *model.SysUser) error {
-	err := e.Orm.First(user, c.GetId()).Preload("Dept").Error
+	err := e.Orm.Preload("Dept").First(user, c.GetId()).Error
 	if err != nil {
 		return err
 	}

+ 60 - 0
app/admin/service/warehouse.go

@@ -167,6 +167,21 @@ func (e *Warehouse) Update(c *dto.WarehouseUpdateReq, p *actions.DataPermission)
 		warehouseModel.HistorySn = append(warehouseModel.HistorySn, c.Sn)
 	}
 
+	if warehouseModel.UserId != c.UserId {
+		var k int64
+		var data = model.Warehouse{}
+		err = tx.Model(&data).Where("user_id = ?", c.UserId).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
+		}
+	}
+
 	c.Generate(&warehouseModel)
 	err = tx.Save(&warehouseModel).Error
 	if err != nil {
@@ -216,3 +231,48 @@ func (e *Warehouse) Remove(c *dto.WarehouseDeleteReq, p *actions.DataPermission)
 
 	return nil
 }
+
+// GetUserList 获取绑定车辆的用户
+func (e *Warehouse) GetUserList(c *dto.SysUserGetPageReq, p *actions.DataPermission, list *[]model.SysUserForBind, count *int64) error {
+	var err error
+	var userList []model.SysUserForBind
+
+	var warehouseModel model.Warehouse
+	var userModel model.SysUserForBind
+	var userIds []int
+	// 查询仓库是否存在
+	err = e.Orm.Model(&warehouseModel).Select("user_id").Scopes(actions.Permission(warehouseModel.TableName(), p)).
+		Find(&userIds).Error
+	if err != nil {
+		e.Log.Errorf("db error: %s", err)
+		return global.GetFailedErr
+	}
+
+	err = e.Orm.
+		Scopes(
+			cDto.MakeCondition(c.GetNeedSearch()),
+			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
+			actions.UserPermission(userModel.TableName(), p),
+		).
+		Where("user_type = ? ", model.UserTypeSys).
+		Find(&userList).Limit(-1).Offset(-1).
+		Count(count).Error
+
+	if err != nil {
+		e.Log.Errorf("db error: %s", err)
+		return global.GetFailedErr
+	}
+	userIdMap := make(map[int]bool)
+	for _, id := range userIds {
+		userIdMap[id] = true
+	}
+
+	for i := 0; i < len(userList); i++ {
+		if _, ok := userIdMap[userList[i].Id]; ok {
+			userList[i].IsBind = true
+		}
+	}
+
+	*list = userList
+	return nil
+}

+ 130 - 15
app/admin/service/waybill.go

@@ -59,6 +59,20 @@ func WaybillCustomerStatusScopes(status int) func(db *gorm.DB) *gorm.DB {
 func (e *Waybill) GetPage(c *dto.WaybillGetPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
 	var err error
 	var data model.Waybill
+	if c.PageSize == 9999 {
+		err = e.Orm.Model(&data).
+			Scopes(
+				cDto.MakeCondition(c.GetNeedSearch()),
+				actions.Permission(data.TableName(), p),
+			).
+			Find(list).Limit(-1).Offset(-1).
+			Count(count).Error
+		if err != nil {
+			e.Log.Errorf("db error: %s", err)
+			return global.GetFailedErr
+		}
+		return nil
+	}
 
 	err = e.Orm.Model(&data).
 		Scopes(
@@ -107,6 +121,22 @@ func (e *Waybill) GetCustomerPage(c *dto.WaybillGetCustomerPageReq, list *[]mode
 	var err error
 	var data model.Waybill
 
+	if c.PageSize == 9999 {
+		err = e.Orm.Model(&data).
+			Scopes(
+				WaybillCustomerStatusScopes(c.Status),
+				cDto.MakeCondition(c.GetNeedSearch()),
+				actions.Permission(data.TableName(), p),
+			).
+			Find(list).Limit(-1).Offset(-1).
+			Count(count).Error
+		if err != nil {
+			e.Log.Errorf("db error: %s", err)
+			return global.GetFailedErr
+		}
+		return nil
+	}
+
 	err = e.Orm.Model(&data).
 		Scopes(
 			WaybillCustomerStatusScopes(c.Status),
@@ -492,10 +522,58 @@ func (e *Waybill) WarehouseIn(c *dto.WaybillInOutReq, p *actions.DataPermission)
 		if waybillModel.WarehouseId == warehouse.Id && waybillModel.Status == model.WaybillStatusStorage {
 			continue
 		}
-		if waybillModel.Status == model.WaybillStatusTruck || (waybillModel.WarehouseId != warehouse.Id && waybillModel.Status == model.WaybillStatusStorage) {
+		if waybillModel.WarehouseId != warehouse.Id && waybillModel.Status == model.WaybillStatusStorage {
 			err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法入库!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
 			return err
 		}
+		var lng, lat string
+		lng, lat, err = e.GetSite(p.DeptId, warehouse.Sn, c.StartTime.String())
+		if err != nil {
+			e.Log.Errorf("获取定位信息失败: %s", err)
+			return err
+		}
+
+		if waybillModel.Status == model.WaybillStatusTruck {
+			// 添加物流
+			Logistics := model.WaybillLogistics{
+				WaybillNo: waybillNo,
+				Status:    model.WaybillStatusTruckOut,
+				CarId:     waybillModel.CarId,
+				UserId:    p.UserId,
+				Lng:       lng,
+				Lat:       lat,
+				ControlBy: model2.ControlBy{
+					CreateBy: p.UserId,
+				},
+				DeptBy: model2.DeptBy{
+					DeptId: p.DeptId,
+				},
+				ModelTime: model2.ModelTime{
+					CreatedAt: c.StartTime,
+				},
+			}
+			err = tx.Create(&Logistics).Error
+			if err != nil {
+				e.Log.Errorf("db error: %s", err)
+				return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
+			}
+
+			// 查询任务
+			var task model.WaybillTask
+			err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", waybillNo, waybillModel.CarId).
+				Last(&task).Error
+			if err != nil {
+				e.Log.Errorf("db error: %s", err)
+				return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
+			}
+			task.EndTime = c.StartTime
+			task.UpdateBy = p.UserId
+			err = tx.Save(&task).Error
+			if err != nil {
+				e.Log.Errorf("db error: %s", err)
+				return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
+			}
+		}
 
 		waybillModel.Status = model.WaybillStatusStorage
 		waybillModel.WarehouseId = warehouse.Id
@@ -505,12 +583,6 @@ func (e *Waybill) WarehouseIn(c *dto.WaybillInOutReq, p *actions.DataPermission)
 			return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
 		}
 
-		var lng, lat string
-		lng, lat, err = e.GetSite(p.DeptId, warehouse.Sn, c.StartTime.String())
-		if err != nil {
-			e.Log.Errorf("获取定位信息失败: %s", err)
-			return err
-		}
 		// 添加物流
 		Logistics := model.WaybillLogistics{
 			WaybillNo:   waybillNo,
@@ -704,13 +776,63 @@ func (e *Waybill) CarIn(c *dto.WaybillInOutReq, p *actions.DataPermission) error
 		if waybillModel.CarId == car.Id && waybillModel.Status == model.WaybillStatusTruck {
 			continue
 		}
-		if waybillModel.Status == model.WaybillStatusStorage || (waybillModel.CarId != car.Id && waybillModel.Status == model.WaybillStatusTruck) {
+		if waybillModel.CarId != car.Id && waybillModel.Status == model.WaybillStatusTruck {
 			err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法装车!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
 			return err
 		}
 		if waybillModel.Status == model.WaybillStatusWaitTruck {
 			waybillModel.DeliveryTime = c.StartTime
 		}
+
+		var lng, lat string
+		lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
+		if err != nil {
+			e.Log.Errorf("获取定位信息失败: %s", err)
+			return err
+		}
+		// 如果上一个状态为入库,则自动出库
+		if waybillModel.Status == model.WaybillStatusStorage {
+			// 添加物流
+			Logistics := model.WaybillLogistics{
+				WaybillNo:   waybillNo,
+				Status:      model.WaybillStatusStorageOut,
+				WarehouseId: waybillModel.WarehouseId,
+				UserId:      p.UserId,
+				Lng:         lng,
+				Lat:         lat,
+				ControlBy: model2.ControlBy{
+					CreateBy: p.UserId,
+				},
+				DeptBy: model2.DeptBy{
+					DeptId: p.DeptId,
+				},
+				ModelTime: model2.ModelTime{
+					CreatedAt: c.StartTime,
+				},
+			}
+			err = tx.Create(&Logistics).Error
+			if err != nil {
+				e.Log.Errorf("db error: %s", err)
+				return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
+			}
+
+			// 查询任务
+			var task model.WaybillTask
+			err = tx.Model(&task).Where("waybill_no = ? and warehouse_id = ?", waybillNo, waybillModel.WarehouseId).
+				Last(&task).Error
+			if err != nil {
+				e.Log.Errorf("db error: %s", err)
+				return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
+			}
+			task.EndTime = c.StartTime
+			task.UpdateBy = p.UserId
+			err = tx.Save(&task).Error
+			if err != nil {
+				e.Log.Errorf("db error: %s", err)
+				return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
+			}
+		}
+
 		waybillModel.Status = model.WaybillStatusTruck
 		waybillModel.CarId = car.Id
 
@@ -720,13 +842,6 @@ func (e *Waybill) CarIn(c *dto.WaybillInOutReq, p *actions.DataPermission) error
 			return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
 		}
 
-		var lng, lat string
-		lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
-		if err != nil {
-			e.Log.Errorf("获取定位信息失败: %s", err)
-			return err
-		}
-
 		// 添加物流
 		Logistics := model.WaybillLogistics{
 			WaybillNo: waybillNo,

+ 54 - 0
app/admin/service/waybill_task.go

@@ -5,6 +5,7 @@ import (
 	"cold-logistics/app/admin/service/dto"
 	cDto "cold-logistics/common/dto"
 	"cold-logistics/common/global"
+	model2 "cold-logistics/common/model"
 	"cold-logistics/common/nats/nats_server"
 	"errors"
 	"fmt"
@@ -115,6 +116,59 @@ func (e *WaybillTask) GetDataPage(c *dto.WaybillTaskGetDataPageReq) (list []nats
 	list, count, err = nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, c.StartTime, c.EndTime, c.Page, c.PageSize)
 	return
 }
+func (e *WaybillTask) GetNewestDataPage(c *dto.WaybillTaskGetNewestDataPageReq) (data nats_server.DeviceData_R, err error) {
+	var waybill model.Waybill
+	err = e.Orm.Model(&waybill).Where("waybill_no = ?", c.WaybillNo).First(&waybill).Error
+	if err != nil {
+		e.Log.Errorf("db error: %s", err)
+		err = errors.New("获取运单信息错误!")
+		return
+	}
+	// 获取公司秘钥
+	var company model.SysDept
+	company, err = model.GetCompanyById(waybill.DeptId)
+	if err != nil {
+		e.Log.Errorf("db error: %s", err)
+		err = model.GetCompanyKeyErr
+		return
+	}
+
+	var taskList []model.WaybillTask
+	err = e.Orm.Where("waybill_no = ?", c.WaybillNo).Order("id desc").Find(&taskList).Error
+	if err != nil {
+		e.Log.Errorf("db error: %s", err)
+		err = errors.New("获取运单信息任务失败!")
+		return
+	}
+	if len(taskList) == 0 {
+		err = errors.New("获取运单信息任务失败!")
+		return
+	}
+	var listAll []nats_server.DeviceData_R
+	for _, task := range taskList {
+		deviceSensorList, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey(task.Sn, company.ColdKey)
+		if len(deviceSensorList) == 0 {
+			continue
+		}
+		T_snid := fmt.Sprintf("%s,%d|", deviceSensorList[0].T_sn, deviceSensorList[0].T_id)
+		if len(task.EndTime.String()) == 0 {
+			task.EndTime = model2.Time(time.Now())
+		}
+		// 获取传感器信息
+		list, _, _ := nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, task.StartTime.String(), task.EndTime.String(), 0, 9999)
+		if len(list) > 0 {
+			listAll = append(listAll, list...)
+			break
+		}
+	}
+
+	if len(listAll) > 0 {
+		data = listAll[0]
+		return
+	}
+	err = errors.New("暂无温湿度记录信息!")
+	return
+}
 func (e *WaybillTask) GetLocus(c *dto.WaybillGetLocusReq) ([]nats_server.DeviceData_R2, error) {
 	var err error
 	var data model.WaybillTask

+ 0 - 1
conf/extend.go

@@ -39,7 +39,6 @@ type Applet struct {
 
 type Nats struct {
 	Url string `json:"url"`
-	Key string `json:"key"`
 }
 type Amap struct {
 	Key string `json:"key"`

+ 3 - 1
go.mod

@@ -27,7 +27,9 @@ require (
 )
 
 require (
+	github.com/beego/beego/v2 v2.1.0
 	github.com/go-redis/redis/v7 v7.4.0
+	github.com/go-resty/resty/v2 v2.7.0
 	github.com/nats-io/nats.go v1.34.0
 	github.com/vmihailenco/msgpack/v5 v5.4.1
 	github.com/xuri/excelize/v2 v2.8.1
@@ -60,7 +62,6 @@ require (
 	github.com/go-playground/locales v0.14.1 // indirect
 	github.com/go-playground/universal-translator v0.18.1 // indirect
 	github.com/go-playground/validator/v10 v10.11.2 // indirect
-	github.com/go-resty/resty/v2 v2.7.0 // indirect
 	github.com/goccy/go-json v0.10.0 // indirect
 	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
 	github.com/golang/protobuf v1.5.3 // indirect
@@ -96,6 +97,7 @@ require (
 	github.com/robinjoseph08/redisqueue/v2 v2.1.0 // indirect
 	github.com/russross/blackfriday/v2 v2.1.0 // indirect
 	github.com/shamsher31/goimgext v1.0.0 // indirect
+	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
 	github.com/shirou/gopsutil v2.19.12+incompatible // indirect
 	github.com/spf13/cast v1.3.1 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect

+ 5 - 1
go.sum

@@ -62,6 +62,8 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkY
 github.com/aws/aws-sdk-go v1.23.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
 github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA=
 github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
+github.com/beego/beego/v2 v2.1.0 h1:Lk0FtQGvDQCx5V5yEu4XwDsIgt+QOlNjt5emUa3/ZmA=
+github.com/beego/beego/v2 v2.1.0/go.mod h1:6h36ISpaxNrrpJ27siTpXBG8d/Icjzsc7pU1bWpp0EE=
 github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -544,8 +546,8 @@ github.com/robinjoseph08/redisqueue/v2 v2.1.0/go.mod h1:fiNYBqIF/DqZxKvO6faLB6nk
 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
 github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -557,6 +559,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg
 github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
 github.com/shamsher31/goimgext v1.0.0 h1:wFKf9GeeE0Xr6UQtliaPgYYgTju2izobM7XpCEgUCC8=
 github.com/shamsher31/goimgext v1.0.0/go.mod h1:rYLKgXuTGBIaH49z+jUVSWz7gUWIZmqvYUsdvJbNNOc=
+github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=
+github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
 github.com/shirou/gopsutil v2.19.12+incompatible h1:WRstheAymn1WOPesh+24+bZKFkqrdCR8JOc77v4xV3Q=
 github.com/shirou/gopsutil v2.19.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=