Bladeren bron

二次分配订单,保温箱记录修改,添加订单判断是否为手机端添加

huangyan 4 maanden geleden
bovenliggende
commit
ff65f13d97

+ 8 - 5
app/admin/controller/cooler_box.go

@@ -359,11 +359,12 @@ func (e CoolerBoxController) GetCoolerBoxNewestLocus(c *gin.Context) {
 	notify := c.Writer.CloseNotify()
 
 	type Response struct {
-		RequestId string                    `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"`
-		Code      int32                     `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"`
-		Msg       string                    `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"`
-		SN        string                    `protobuf:"bytes,3,opt,name=sn,proto3" json:"sn,omitempty"`
-		Data      []nats_server.DeviceData_ `json:"data"`
+		RequestId  string                    `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"`
+		Code       int32                     `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"`
+		Msg        string                    `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"`
+		SN         string                    `protobuf:"bytes,3,opt,name=sn,proto3" json:"sn,omitempty"`
+		CoolerName string                    `protobuf:"bytes,4,opt,name=CoolerName,proto3" json:"CoolerName,omitempty"`
+		Data       []nats_server.DeviceData_ `json:"data"`
 	}
 	var response Response
 
@@ -381,6 +382,7 @@ func (e CoolerBoxController) GetCoolerBoxNewestLocus(c *gin.Context) {
 				response.Msg = err.Error()
 				response.Data = list
 				response.SN = req.T_sn
+				response.CoolerName = req.CoolerName
 				res, _ := json.Marshal(&response)
 				fmt.Fprintf(c.Writer, "data: %s\n\n", string(res))
 				c.Writer.Flush()
@@ -390,6 +392,7 @@ func (e CoolerBoxController) GetCoolerBoxNewestLocus(c *gin.Context) {
 				response.Msg = "查询成功"
 				response.Data = list
 				response.SN = req.T_sn
+				response.CoolerName = req.CoolerName
 				res, _ := json.Marshal(&response)
 				fmt.Fprintf(c.Writer, "data: %s\n\n", string(res))
 				c.Writer.Flush()

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

@@ -891,6 +891,40 @@ func (e WaybillController) Turnarounds(c *gin.Context) {
 	e.OK(req, "转门店成功")
 }
 
+// SecondaryDistribution 二次分配订单
+// @Summary 二次分配订单
+// @Description 二次分配订单
+// @Tags 运单
+// @Accept  application/json
+// @Product application/json
+// @Param data body dto.WaybillReceiptReq true "body"
+// @Success 200 {string} string	"{"code": 200, "message": "生成成功"}"
+// @Success 200 {string} string	"{"code": -1, "message": "生成成功"}"
+// @Router /api/waybill/SecondaryDistribution [put]
+// @Security Bearer
+func (e WaybillController) SecondaryDistribution(c *gin.Context) {
+	s := service.Waybill{}
+	req := dto.WaybillAssignment{}
+	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)
+	err = s.SecondaryDistribution(&req, p)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+	e.OK(req, "分配成功")
+}
+
 // GetCustomerPage 获取客户运单列表
 // @Summary 获取客户运单列表
 // @Description 获取客户运单列表

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

@@ -17,4 +17,5 @@ type Drug struct {
 	Drug_ent_base_info_id string `json:"drug_ent_base_info_id" gorm:"size:128;comment:药品id"`
 	Ent_name              string `json:"ent_name" gorm:"size:128;comment:企业名称"`
 	Code                  string `json:"code" gorm:"size:128;comment:药品编码"`
+	Count                 int    `json:"count" gorm:"size:128;comment:数量"`
 }

+ 47 - 45
app/admin/model/waybill.go

@@ -70,51 +70,53 @@ 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已拒收   1未确定订单 2已确定订单 3待审核订单 4审核完成 5待配送 6已配送 7已签收 8已拒收
-	SenderAddressDetails       string         `json:"senderAddressDetails"  gorm:"size:128"`         // 发货地址详情
-	SenderAddressName          string         `json:"senderAddressName"  gorm:"size:128"`            // 发货地址名称
-	SenderAddressPhone         string         `json:"senderAddressPhone"  gorm:"size:128"`           // 发货地址电话
-	ConsigneeAddressDetails    string         `json:"consigneeAddressDetails"  gorm:"size:128"`      // 收发货地址详情
-	ConsigneeAddressName       string         `json:"consigneeAddressName"  gorm:"size:128"`         // 收发货地址名称
-	ConsigneeAddressPhone      string         `json:"consigneeAddressPhone"  gorm:"size:128"`        // 收发货地址电话
-	DeliveryName               string         `json:"deliveryName"  gorm:"size:128"`                 // 配送人名称
-	DeliveryPhone              string         `json:"deliveryPhone"  gorm:"size:128"`                // 配送人电话
-	DeliveryId                 int            `json:"deliveryId"  gorm:"size:128"`                   // 配送人id
-	ReCheckId                  int            `json:"reCheckId"  gorm:"size:128"`                    // 复核id
-	Remark                     string         `json:"remark"  gorm:"size:text"`                      // 运输备注
-	OrderTime                  model2.Time    `json:"orderTime"  gorm:"size:128"`                    // 下单时间
-	DeliveryTime               model2.Time    `json:"deliveryTime"  gorm:"size:128"`                 // 配送时间
-	DeliveryDuration           int            `json:"deliveryDuration" gorm:"size:128;comment:冷冻时长"` // 配送耗时 单位分钟
-	ReceiptTime                model2.Time    `json:"receiptTime"  gorm:"size:128"`                  // 签收时间
-	Quantity                   int            `json:"quantity"  gorm:"size:128"`                     // 药品数量
-	CoolerBoxId                int            `json:"coolerBoxId"  gorm:"size:128"`                  // 保温箱id
-	ReceiptImg                 string         `json:"receiptImg"  gorm:"size:text"`                  // 签收图片
-	Receiptsign                string         `json:"receiptsign" gorm:"size:text"`                  // 签收图片签字
-	TamperProofLabel           string         `json:"tamperProofLabel"  gorm:"size:128"`             // 防拆标签
-	TamperProofLabelImg        string         `json:"tamperProofLabelImg"  gorm:"size:text"`         // 防拆标签
-	RejectionReason            string         `json:"rejectionReason"  gorm:"size:128"`              // 拒收原因
-	SendLog                    WaybillSendLog `json:"sendLog" gorm:"size:text"`                      // 运单短信发送日志
-	CoolerBox                  CoolerBoxOmit  `json:"coolerBox" gorm:"->"`                           // 保温箱
-	Dept                       SysDeptOmit    `json:"dept" gorm:"->"`                                // 部门
-	Delivery                   SysUserOmit    `json:"delivery" gorm:"->"`                            // 部门
-	ReCheck                    SysUserOmit    `json:"reCheck" gorm:"->"`                             // 部门
-	IceRaftCode                IceRaftCode    `json:"iceRaftCode" gorm:"size:text"`
-	AssessStar                 int            `json:"assessStar"  gorm:"size:128"`                                 // 评价星星
-	AssessContent              string         `json:"assessContent"  gorm:"size:128"`                              // 评价内容
-	PrescriptionIsAudit        int            `json:"prescriptionIssue"   gorm:"size:128;default:1"`               // 处方是否审核 1 未审核 2已审核
-	InvoiceIsAudit             int            `json:"invoiceIssue"   gorm:"size:128;default:1"`                    // 发票是否审核 1 未审核 2已审核
-	InspectionReportIsAudit    int            `json:"inspectionReportIssue"   gorm:"size:128;default:1"`           // 检验报告是否审核 1 未审核 2已审核
-	DispensingMedicinesIsAudit int            `json:"dispensingMedicinesIssue"   gorm:"size:128;default:1"`        // 调配药品信息是否审核  1 未审核 2已审核
-	IsCold                     int            `json:"isCold"   gorm:"size:128;default:1"`                          // 是否冷链 1 否 2 是
-	PaymentStatus              int            `json:"paymentStatus"  gorm:"size:128;default:1"`                    //支付状态 1 结清 2 未结清  3 支付完成
-	PaymentType                int            `json:"paymentType"  gorm:"size:128;default:0"`                      //支付方式  1现金 2线上支付 3银行卡 4医保 5其他
-	PaymentRemark              string         `json:"paymentremark"  gorm:"size:128;"`                             //支付备注
-	AssignmentStatus           int            `json:"assignmentStatus"  gorm:"size:128;default:1"`                 //分配状态  1 未分配  2已分配
-	AuditRemark                string         `json:"audit_remark"  gorm:"size:255;"`                              //驳回原因
-	AdminAuditRemark           string         `json:"admin_audit_remark"  gorm:"size:255;"`                        //管理员审核备注
-	IsSecondaryDistribution    bool           `json:"is_secondary_distribution" gorm:"type:boolean;default:false"` //是否二次分配
+	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审核完成 5待配送 6已配送 7已签收 8已拒收
+	SenderAddressDetails       string            `json:"senderAddressDetails"  gorm:"size:128"`         // 发货地址详情
+	SenderAddressName          string            `json:"senderAddressName"  gorm:"size:128"`            // 发货地址名称
+	SenderAddressPhone         string            `json:"senderAddressPhone"  gorm:"size:128"`           // 发货地址电话
+	ConsigneeAddressDetails    string            `json:"consigneeAddressDetails"  gorm:"size:128"`      // 收发货地址详情
+	ConsigneeAddressName       string            `json:"consigneeAddressName"  gorm:"size:128"`         // 收发货地址名称
+	ConsigneeAddressPhone      string            `json:"consigneeAddressPhone"  gorm:"size:128"`        // 收发货地址电话
+	DeliveryName               string            `json:"deliveryName"  gorm:"size:128"`                 // 配送人名称
+	DeliveryPhone              string            `json:"deliveryPhone"  gorm:"size:128"`                // 配送人电话
+	DeliveryId                 int               `json:"deliveryId"  gorm:"size:128"`                   // 配送人id
+	ReCheckId                  int               `json:"reCheckId"  gorm:"size:128"`                    // 复核id
+	Remark                     string            `json:"remark"  gorm:"size:text"`                      // 运输备注
+	OrderTime                  model2.Time       `json:"orderTime"  gorm:"size:128"`                    // 下单时间
+	DeliveryTime               model2.Time       `json:"deliveryTime"  gorm:"size:128"`                 // 配送时间
+	DeliveryDuration           int               `json:"deliveryDuration" gorm:"size:128;comment:冷冻时长"` // 配送耗时 单位分钟
+	ReceiptTime                model2.Time       `json:"receiptTime"  gorm:"size:128"`                  // 签收时间
+	Quantity                   int               `json:"quantity"  gorm:"size:128"`                     // 药品数量
+	CoolerBoxId                int               `json:"coolerBoxId"  gorm:"size:128"`                  // 保温箱id
+	ReceiptImg                 string            `json:"receiptImg"  gorm:"size:text"`                  // 签收图片
+	Receiptsign                string            `json:"receiptsign" gorm:"size:text"`                  // 签收图片签字
+	TamperProofLabel           string            `json:"tamperProofLabel"  gorm:"size:128"`             // 防拆标签
+	TamperProofLabelImg        string            `json:"tamperProofLabelImg"  gorm:"size:text"`         // 防拆标签
+	RejectionReason            string            `json:"rejectionReason"  gorm:"size:128"`              // 拒收原因
+	SendLog                    WaybillSendLog    `json:"sendLog" gorm:"size:text"`                      // 运单短信发送日志
+	CoolerBox                  CoolerBoxOmit     `json:"coolerBox" gorm:"->"`                           // 保温箱
+	Dept                       SysDeptOmit       `json:"dept" gorm:"->"`                                // 部门
+	Delivery                   SysUserOmit       `json:"delivery" gorm:"->"`                            // 部门
+	ReCheck                    SysUserOmit       `json:"reCheck" gorm:"->"`                             // 部门
+	Drugs                      []Drug            `json:"drugs" gorm:"-"`                                // 药品信息
+	ChildWaybills              model2.StringList `json:"childWaybills"`                                 // 子运单编号
+	IceRaftCode                IceRaftCode       `json:"iceRaftCode" gorm:"size:text"`
+	AssessStar                 int               `json:"assessStar"  gorm:"size:128"`                                 // 评价星星
+	AssessContent              string            `json:"assessContent"  gorm:"size:128"`                              // 评价内容
+	PrescriptionIsAudit        int               `json:"prescriptionIssue"   gorm:"size:128;default:1"`               // 处方是否审核 1 未审核 2已审核
+	InvoiceIsAudit             int               `json:"invoiceIssue"   gorm:"size:128;default:1"`                    // 发票是否审核 1 未审核 2已审核
+	InspectionReportIsAudit    int               `json:"inspectionReportIssue"   gorm:"size:128;default:1"`           // 检验报告是否审核 1 未审核 2已审核
+	DispensingMedicinesIsAudit int               `json:"dispensingMedicinesIssue"   gorm:"size:128;default:1"`        // 调配药品信息是否审核  1 未审核 2已审核
+	IsCold                     int               `json:"isCold"   gorm:"size:128;default:1"`                          // 是否冷链 1 否 2 是
+	PaymentStatus              int               `json:"paymentStatus"  gorm:"size:128;default:1"`                    //支付状态 1 结清 2 未结清  3 支付完成
+	PaymentType                int               `json:"paymentType"  gorm:"size:128;default:0"`                      //支付方式  1现金 2线上支付 3银行卡 4医保 5其他
+	PaymentRemark              string            `json:"paymentremark"  gorm:"size:128;"`                             //支付备注
+	AssignmentStatus           int               `json:"assignmentStatus"  gorm:"size:128;default:1"`                 //分配状态  1 未分配  2已分配
+	AuditRemark                string            `json:"audit_remark"  gorm:"size:255;"`                              //驳回原因
+	AdminAuditRemark           string            `json:"admin_audit_remark"  gorm:"size:255;"`                        //管理员审核备注
+	IsSecondaryDistribution    bool              `json:"is_secondary_distribution" gorm:"type:boolean;default:false"` //是否二次分配
 	model2.ControlBy
 	model2.ModelTime
 	model2.DeptBy

+ 18 - 17
app/admin/router/waybill.go

@@ -25,23 +25,24 @@ func registerWaybillRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle
 		r.POST("/delivery", cont.Delivery)
 		r.PUT("", cont.Update)
 		r.DELETE("", cont.Delete)
-		r.PUT("/adminaudit", cont.AdminAudit)          //管理员审核订单
-		r.POST("/receipt", cont.Receipt)               // 签收
-		r.GET("/customer", cont.GetCustomerPage)       // 客户下单列表
-		r.POST("/customer", cont.CustomerInsert)       // 客户下单
-		r.PUT("/update-status", cont.UpdateStatus)     // 修改订单状态
-		r.PUT("/audit", cont.Audit)                    // 审核订单
-		r.GET("/applet", cont.GetAppletPage)           // app 运单列表
-		r.GET("/applet-count", cont.GetAppletCount)    // app 运单-统计
-		r.POST("/import", cont.Import)                 // 导入运单
-		r.GET("/export-template", cont.ExportTemplate) // 导出运单模板
-		r.GET("/home", cont.Home)                      // 首页统计
-		r.POST("/user-stats", cont.UserStats)          // 用户运单统计
-		r.GET("/export", cont.Export)                  // 运单管理-导出
-		r.GET("/customer/export", cont.CustomerExport) // 客户下单
-		r.GET("/temperature-pdf", cont.TemperaturePDF) // 导出温湿度pdf
-		r.GET("/createsole", cont.CreateSole)          // 生成唯一订单编号
-		r.PUT("/turnarounds", cont.Turnarounds)        // 订单转门店
+		r.PUT("/adminaudit", cont.AdminAudit)             //管理员审核订单
+		r.POST("/receipt", cont.Receipt)                  // 签收
+		r.GET("/customer", cont.GetCustomerPage)          // 客户下单列表
+		r.POST("/customer", cont.CustomerInsert)          // 客户下单
+		r.PUT("/update-status", cont.UpdateStatus)        // 修改订单状态
+		r.PUT("/audit", cont.Audit)                       // 审核订单
+		r.GET("/applet", cont.GetAppletPage)              // app 运单列表
+		r.GET("/applet-count", cont.GetAppletCount)       // app 运单-统计
+		r.POST("/import", cont.Import)                    // 导入运单
+		r.GET("/export-template", cont.ExportTemplate)    // 导出运单模板
+		r.GET("/home", cont.Home)                         // 首页统计
+		r.POST("/user-stats", cont.UserStats)             // 用户运单统计
+		r.GET("/export", cont.Export)                     // 运单管理-导出
+		r.GET("/customer/export", cont.CustomerExport)    // 客户下单
+		r.GET("/temperature-pdf", cont.TemperaturePDF)    // 导出温湿度pdf
+		r.GET("/createsole", cont.CreateSole)             // 生成唯一订单编号
+		r.PUT("/turnarounds", cont.Turnarounds)           // 订单转门店
+		r.POST("/assignment", cont.SecondaryDistribution) // 二次分配订单
 	}
 }
 

+ 2 - 18
app/admin/service/cooler_box.go

@@ -425,12 +425,8 @@ func (e *CoolerBox) GetNewLocus(c *dto.CoolerBoxReq, list *[]nats_server.DeviceD
 	// 获取公司秘钥
 	var dataDept model.SysDept
 	var Depts []model.SysDept
-	atoi, _ := strconv.Atoi(c.Id)
-	err := e.Orm.Model(&dataDept).
-		Scopes(
-			CompanyIdScopesUser(atoi),
-		).
-		Find(&Depts).Limit(-1).Offset(-1).Error
+	fmt.Println("公司ID=================", c.Id)
+	err := e.Orm.Model(&dataDept).Where("id = ?", c.Id).Or("parent_id =?", c.Id).Find(&Depts).Error
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
 		return global.GetFailedErr
@@ -473,18 +469,6 @@ func (e *CoolerBox) GetNewLocus(c *dto.CoolerBoxReq, list *[]nats_server.DeviceD
 func appendUniqueDeviceData(list []nats_server.DeviceData_, newData []nats_server.DeviceData_) []nats_server.DeviceData_ {
 	uniqueMap := make(map[time.Time]bool)
 	for _, d := range list {
-		//split := strings.Split(list[i].T_site, ",")
-		//defer func() {
-		//	if r := recover(); r != nil {
-		//		fmt.Println("数组下标越界:", r)
-		//	}
-		//}()
-		//Lng := split[0]
-		//Lat := split[1]
-		//Lngs, _ := strconv.ParseFloat(Lng, 64)
-		//Lats, _ := strconv.ParseFloat(Lat, 64)
-		//mLng, mLat := lib.Wgs84ToGcj02(Lngs, Lats)
-		//list[i].T_site = fmt.Sprintf("%v,%v", mLng, mLat)
 		uniqueMap[d.T_time] = true
 	}
 	for _, d := range newData {

+ 3 - 2
app/admin/service/dto/cooler_box.go

@@ -127,8 +127,9 @@ type CoolerBoxBatchReq struct {
 	PageZ     int    `json:"page_z"`
 }
 type CoolerBoxReq struct {
-	T_sn string `json:"T_sn"`
-	Id   string `json:"T_id"`
+	T_sn       string `json:"T_sn"`
+	Id         string `json:"Id"`
+	CoolerName string `json:"CoolerName"`
 }
 type HistoricalData struct {
 	Sn          string `json:"sn"`           //设备Sn

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

@@ -63,6 +63,7 @@ type WaybillInsertReq struct {
 	CoolerBoxId             int          `json:"coolerBoxId"`                                                          // 保温箱id
 	IsSecondaryDistribution bool         `json:"is_secondary_distribution"`                                            //是否二次分配
 	Drugs                   []model.Drug `json:"drugs"`                                                                //药品信息
+	IsPhone                 bool         `json:"is_phone"`                                                             //是否手机添加订单
 	model2.ControlBy        `swaggerignore:"true"`
 	model2.DeptBy
 }
@@ -72,7 +73,6 @@ func (s *WaybillInsertReq) Generate(m *model.Waybill) {
 		m.Id = s.Id
 	}
 	m.Status = 1
-	m.OrderNo = s.OrderNo
 	m.ConsigneeAddressDetails = s.ConsigneeAddressDetails
 	m.ConsigneeAddressName = s.ConsigneeAddressName
 	m.ConsigneeAddressPhone = s.ConsigneeAddressPhone
@@ -103,6 +103,56 @@ func (s *WaybillInsertReq) GetId() interface{} {
 	return s.Id
 }
 
+type WaybillAssignment struct {
+	WaybillNo               string       `json:"waybillNo" comment:"运单号" swaggerignore:"true"`                         // 编码
+	OrderNo                 string       `json:"orderNo"`                                                              // 订单号
+	Status                  int          `json:"status" swaggerignore:"true"`                                          //订单状态:1-待处理;102-待装车 103-运输中 104-已签收
+	SaveConsigneeAddress    bool         `json:"SaveConsigneeAddress"`                                                 //保存收货地址
+	ConsigneeAddressDetails string       `json:"consigneeAddressDetails"`                                              //收发货地址详情
+	ConsigneeAddressName    string       `json:"consigneeAddressName"`                                                 //收发货地址名称
+	ConsigneeAddressPhone   string       `json:"consigneeAddressPhone" vd:"regexp('^1[3-9]\\d{9}$');msg:'收件人电话格式不正确'"` //收发货地址电话
+	DeliveryName            string       `json:"deliveryName"`                                                         // 配送姓名
+	DeliveryPhone           string       `json:"deliveryPhone"`                                                        // 配送电话
+	DeliveryId              int          `json:"deliveryId"`                                                           // 配送人id
+	ReCheckId               int          `json:"reCheckId"`                                                            // 复核人id
+	Quantity                int          `json:"quantity"`                                                             // 药品数量
+	Remark                  string       `json:"remark"`                                                               // 运输备注
+	TamperProofLabel        string       `json:"tamperProofLabel"`                                                     // 防拆码标签
+	TamperProofLabelImg     string       `json:"tamperProofLabelImg"`                                                  // 防拆码标签图片
+	CoolerBoxId             int          `json:"coolerBoxId"`                                                          // 保温箱id
+	IsSecondaryDistribution bool         `json:"is_secondary_distribution"`                                            //是否二次分配
+	Drugs                   []model.Drug `json:"drugs"`                                                                //药品信息
+	model2.ControlBy        `swaggerignore:"true"`
+	model2.DeptBy
+}
+
+func (s *WaybillAssignment) Generate(m *model.Waybill) {
+	m.ConsigneeAddressDetails = s.ConsigneeAddressDetails
+	m.ConsigneeAddressName = s.ConsigneeAddressName
+	m.ConsigneeAddressPhone = s.ConsigneeAddressPhone
+	m.DeliveryName = s.DeliveryName
+	m.DeliveryPhone = s.DeliveryPhone
+	m.DeliveryId = s.DeliveryId
+	m.ReCheckId = s.ReCheckId
+	m.Quantity = s.Quantity
+	m.Remark = s.Remark
+	m.TamperProofLabel = s.TamperProofLabel
+	m.TamperProofLabelImg = s.TamperProofLabelImg
+	m.CoolerBoxId = s.CoolerBoxId
+	m.IsSecondaryDistribution = s.IsSecondaryDistribution
+	m.OrderTime = model2.Time(time.Now())
+
+	if s.ControlBy.UpdateBy != 0 {
+		m.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		m.CreateBy = s.CreateBy
+	}
+	if s.DeptBy.DeptId != 0 {
+		m.DeptId = s.DeptId
+	}
+}
+
 type WaybillUpdateReq struct {
 	Id                      int    `json:"id" comment:"编码" swaggerignore:"true"` // 编码
 	OrderNo                 string `json:"orderNo"`

+ 155 - 44
app/admin/service/waybill.go

@@ -278,7 +278,8 @@ func (e *Waybill) Get(d *dto.WaybillGetReq, waybillModel *model.Waybill, p *acti
 func (e *Waybill) GetByWaybillNo(d *dto.WaybillGetByWaybillPdfReq, waybillModel *model.Waybill, p *actions.DataPermission) error {
 	err := e.Orm.
 		Scopes(actions.Permission(waybillModel.TableName(), p)).
-		Where("waybill_no = ?", d.WaybillNo).
+		Where("waybill.waybill_no = ?", d.WaybillNo).
+		Joins("left join drug on drug.waybill_no = waybill.waybill_no").
 		Preload("Dept").
 		Preload("CoolerBox").
 		Preload("Delivery").
@@ -291,6 +292,9 @@ func (e *Waybill) GetByWaybillNo(d *dto.WaybillGetByWaybillPdfReq, waybillModel
 		}
 		return global.GetFailedErr
 	}
+	var drugs []model.Drug
+	e.Orm.Where("drug.waybill_no = ?", waybillModel.WaybillNo).Find(&drugs)
+	waybillModel.Drugs = drugs
 
 	return nil
 }
@@ -331,6 +335,10 @@ func (e *Waybill) Insert(c *dto.WaybillInsertReq) error {
 	}
 	data.OrderNo = sole
 	c.Generate(&data)
+	if c.IsPhone {
+		data.Status = model.WaybillStatusInDeliverys
+		data.AssignmentStatus = 2
+	}
 	err = tx.Create(&data).Error
 	if err != nil {
 		e.Log.Errorf("db error: %s", err)
@@ -338,26 +346,6 @@ func (e *Waybill) Insert(c *dto.WaybillInsertReq) error {
 	}
 	c.Id = data.Id
 
-	// 保存收货地址
-	//if c.SaveSenderAddress {
-	//	// 查询地址是否存在
-	//	address := model.Address{}
-	//	err = e.Orm.Where("address = ? and phone = ? and name = ? and dept_id = ? and address_type = 'sender'",
-	//		c.SenderAddressDetails, c.SenderAddressPhone, c.SenderAddressName, c.DeptId).First(&address).Error
-	//	if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
-	//		address.Address = c.SenderAddressDetails
-	//		address.Phone = c.SenderAddressPhone
-	//		address.Name = c.SenderAddressName
-	//		address.DeptId = c.DeptId
-	//		address.AddressType = "sender"
-	//		err = tx.Create(&address).Error
-	//		if err != nil {
-	//			e.Log.Errorf("创建地址失败: %s", err)
-	//			return global.CreateFailedErr
-	//		}
-	//	}
-	//}
-
 	// 保存发货地址
 	if c.SaveConsigneeAddress {
 		// 查询地址是否存在
@@ -655,7 +643,7 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 		err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
 			First(&coolerBox, c.CoolerBoxId).Error
 		if err != nil {
-			e.Log.Errorf("db error: %s", err)
+			e.Log.Errorf("获取保温箱信息失败: %s", err)
 			return errors.New("获取保温箱信息失败")
 		}
 	}
@@ -694,13 +682,13 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 			if c.Status == model.WaybillStatusInShippeds {
 				waybillModel.Status = c.Status
 				// 查询保温箱信息
-				var coolerBoxModel model.CoolerBox
-				err = e.Orm.Scopes(actions.Permission(coolerBoxModel.TableName(), p)).
-					First(&coolerBoxModel, waybillModel.CoolerBoxId).Error
-				if err != nil {
-					e.Log.Errorf("获取保温箱信息失败: %s", err)
-					return errors.New("获取保温箱信息失败")
-				}
+				//var coolerBoxModel model.CoolerBox
+				//err = e.Orm.Scopes(actions.Permission(coolerBoxModel.TableName(), p)).
+				//	First(&coolerBoxModel, c.CoolerBoxId).Error
+				//if err != nil {
+				//	e.Log.Errorf("查询保温箱信息失败: %s", err)
+				//	return errors.New("查询保温箱信息失败")
+				//}
 				var data model.IceRaft
 				var list []string
 				err := e.Orm.Model(&data).
@@ -708,7 +696,7 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 					Scopes(
 						actions.Permission(data.TableName(), p),
 						IceRaftNameRecordStatusScopes(model.IceRaftRecordStatusUsing),
-						IceRaftNameRecordCoolerBoxIdScopes(coolerBoxModel.Id),
+						IceRaftNameRecordCoolerBoxIdScopes(coolerBox.Id),
 					).
 					Joins("left join ice_raft_record on ice_raft.ice_raft_record_id = ice_raft_record.id").
 					Find(&list).Error
@@ -718,20 +706,31 @@ func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission)
 				}
 				//查询保温箱记录信息状态为1使用中
 				var cooler model.CoolerBoxRecord
-				err = e.Orm.Scopes(actions.Permission(cooler.TableName(), p)).
-					First(&cooler).Where("cooler_box_id = ?", coolerBoxModel.Id).Where("status = ?", 1).Error
-				if err != nil {
-					e.Log.Errorf("db 获取保温箱记录信息失败: %s", err)
-					return errors.New("获取保温箱记录信息失败")
-				}
-				cooler.CoolerUseUsers = user.NickName
-				cooler.HistoryCode = append(cooler.HistoryCode, list...)
-				cooler.CoolerUserTime = model2.Time(time.Now())
-				cooler.Status = "2" //使用结束
-				err = e.Orm.Updates(&cooler).Where("id = ?", cooler.Id).Error
-				if err != nil {
-					e.Log.Errorf("db error: %s", err)
-					return errors.New("保存保温箱记录失败")
+				var count int64
+				e.Orm.Scopes(actions.Permission(cooler.TableName(), p)).
+					First(&cooler).Where("cooler_box_id = ?", coolerBox.Id).Where("status = ?", 1).Count(&count)
+				if count == 0 {
+					cooler.CoolerUseUsers = user.NickName
+					cooler.HistoryCode = append(cooler.HistoryCode, list...)
+					cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
+					cooler.CoolerUserTime = model2.Time(time.Now())
+					cooler.Status = "2" //使用结束
+					err := e.Orm.Save(&cooler).Error
+					if err != nil {
+						e.Log.Errorf("保存保温箱记录失败: %s", err)
+						return errors.New("保存保温箱记录失败")
+					}
+				} else {
+					cooler.CoolerUseUsers = user.NickName
+					cooler.HistoryCode = append(cooler.HistoryCode, list...)
+					cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
+					cooler.CoolerUserTime = model2.Time(time.Now())
+					cooler.Status = "2" //使用结束
+					err = e.Orm.Updates(&cooler).Where("id = ?", cooler.Id).Error
+					if err != nil {
+						e.Log.Errorf("保存保温箱记录失败: %s", err)
+						return errors.New("保存保温箱记录失败")
+					}
 				}
 				// 配送中状态下才发送短信
 				ss := sms.NewSMS(conf.ExtConfig.SubMail.Appid, conf.ExtConfig.SubMail.Signature)
@@ -1654,3 +1653,115 @@ func (e *Waybill) WaybillTurnarounds(c *dto.WaybillTurnarounds, p *actions.DataP
 	}
 	return nil
 }
+
+// SecondaryDistribution 二次分配订单
+func (e *Waybill) SecondaryDistribution(c *dto.WaybillAssignment, p *actions.DataPermission) error {
+	var err error
+	var waybillModel model.Waybill
+	var count int64
+	//查询订单是否存在
+	tx := e.Orm.Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+	err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
+		Where("waybill_no = ?", c.WaybillNo).
+		First(&waybillModel).Count(&count).Error
+	if err != nil {
+		e.Log.Errorf("db error: %s", err)
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return global.GetNotFoundOrNoPermissionErr
+		}
+		return global.GetFailedErr
+	}
+	if count == 0 {
+		return errors.New("订单不存在")
+	}
+	if !waybillModel.IsSecondaryDistribution {
+		return errors.New("该订单不允许二次分配")
+	}
+	var waybil model.Waybill
+	sole, err := e.CreateSole()
+	var no string
+	for {
+		no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
+		var j int64
+		err = e.Orm.Model(&waybil).Where("waybill_no = ?", no).Count(&j).Error
+		if err != nil {
+			continue
+		}
+		if j == 0 {
+			break
+		}
+	}
+	// 添加运单
+	waybil.WaybillNo = no
+	sole, err = e.CreateSole()
+	if err != nil {
+		err = errors.New("生成运单号失败")
+		return err
+	}
+	waybil.OrderNo = sole
+	waybil.Status = model.WaybillStatusInShippeds
+	waybil.DeptId = waybillModel.DeptId
+	waybil.DeliveryName = waybillModel.DeliveryName
+	waybil.DeliveryId = waybillModel.DeliveryId
+	waybil.DeliveryPhone = waybillModel.DeliveryPhone
+	waybil.OrderTime = model2.Time(time.Now())
+	c.Generate(&waybil)
+	err = tx.Create(&waybil).Error
+	if err != nil {
+		e.Log.Errorf("db error: %s", err)
+		return global.CreateFailedErr
+	}
+	// 保存发货地址
+	if c.SaveConsigneeAddress {
+		// 查询地址是否存在
+		address := model.Address{}
+		err = e.Orm.Where("address = ? and phone = ? and name = ? and dept_id = ? and address_type = 'consignee'",
+			c.ConsigneeAddressDetails, c.ConsigneeAddressPhone, c.ConsigneeAddressName, c.DeptId).First(&address).Error
+		if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
+			address.Address = c.ConsigneeAddressDetails
+			address.Phone = c.ConsigneeAddressPhone
+			address.Name = c.ConsigneeAddressName
+			address.DeptId = c.DeptId
+			address.AddressType = "consignee"
+			err = tx.Create(&address).Error
+			if err != nil {
+				e.Log.Errorf("创建地址失败: %s", err)
+				return global.CreateFailedErr
+			}
+		}
+	}
+	if len(c.Drugs) > 0 {
+		for _, drug := range c.Drugs {
+			var drugs model.Drug
+			drugs.WaybillNo = no
+			drugs.Drug_ent_base_info_id = drug.Drug_ent_base_info_id
+			drugs.Ent_name = drug.Ent_name
+			drugs.Physic_name = drug.Physic_name
+			drugs.Approval_licence_no = drug.Approval_licence_no
+			drugs.Prepn_spec = drug.Prepn_spec
+			drugs.Physic_type_desc = drug.Physic_type_desc
+			drugs.Pkg_spec_crit = drug.Pkg_spec_crit
+			drugs.Prepn_type_desc = drug.Prepn_type_desc
+			drugs.Code = drug.Code
+			err = tx.Save(&drugs).Error
+			if err != nil {
+				e.Log.Errorf("db error: %s", err)
+				return errors.New("保存药品信息失败")
+			}
+		}
+	}
+	waybillModel.ChildWaybills = append(waybillModel.ChildWaybills, waybil.WaybillNo)
+	err = tx.Save(&waybillModel).Error
+	if err != nil {
+		e.Log.Errorf("更新运单失败: %s", err)
+		return global.UpdateFailedErr
+	}
+	return nil
+}

+ 15 - 0
common/dto/uniqueSlice.go

@@ -0,0 +1,15 @@
+package dto
+
+func UniqueSlice(slice []string) []string {
+	seen := make(map[string]struct{}) // 使用空结构体节省内存
+	result := []string{}
+
+	for _, value := range slice {
+		if _, ok := seen[value]; !ok {
+			seen[value] = struct{}{}
+			result = append(result, value)
+		}
+	}
+
+	return result
+}

+ 1 - 1
setting.yml

@@ -55,7 +55,7 @@ settings:
       tokenExpire: 30
       waybillUrl: "https://coldlogistics.coldbaozhida.com/newInquiry?waybillNo="
     nats:
-#      url: "182.44.113.60:4222"
+#      url: "192.168.0.5:4222"
       url: "203.34.49.130:4222"
     amap:
       key: "c3dbf424f12240b2de8ace32893c1aa2"