Parcourir la source

add:导入冷链3.0公司

zoie il y a 21 heures
Parent
commit
ca694c5c73

+ 63 - 1
app/admin/controller/company.go

@@ -5,6 +5,7 @@ import (
 	"cold-delivery/app/admin/service"
 	"cold-delivery/app/admin/service/dto"
 	"cold-delivery/common/actions"
+
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin/binding"
 	"gogs.baozhida.cn/zoie/OAuth-core/api"
@@ -281,7 +282,6 @@ func (e CompanyController) Delete(c *gin.Context) {
 		e.Error(500, err, err.Error())
 		return
 	}
-
 	//数据权限检查
 	//p := actions.GetPermissionFromContext(c)
 	err = s.Remove(&req, nil)
@@ -291,3 +291,65 @@ func (e CompanyController) Delete(c *gin.Context) {
 	}
 	e.OK(req.GetId(), "删除成功")
 }
+
+// ImportThirdCompanyTree 从第三方平台批量导入公司树结构
+// @Summary 从第三方平台批量导入公司树结构
+// @Description 通过勾选第三方平台树级结构,批量导入公司,并与本平台公司树对应(Id->ColdPid, T_key->ColdKey)
+// @Tags 公司
+// @Accept  application/json
+// @Product application/json
+// @Param data body []dto.ThirdCompanyTreeReq true "第三方公司树结构"
+// @Success 200 {string} string "{"code": 200, "message": "导入成功"}"
+// @Router /api/company/importThird [post]
+// @Security Bearer
+func (e CompanyController) ImportThirdCompanyTree(c *gin.Context) {
+	s := service.Company{}
+	req := make([]dto.ThirdCompanyTreeReq, 0)
+	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
+	}
+
+	err = s.ImportThirdCompanyTree(req)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+	e.OK(nil, "导入成功")
+}
+
+// GetCompanyTreeByTKey 根据T_key获取公司树结构
+// @Summary 根据T_key获取公司树结构
+// @Description 根据T_key从NATS获取公司树结构
+// @Tags 公司
+// @Param t_key query string true "公司秘钥"
+// @Success 200 {object} response.Response{data=[]object} "{"code": 200, "data": [...]}"
+// @Router /api/company/tree [get]
+// @Security Bearer
+func (e CompanyController) GetCompanyThirdTree(c *gin.Context) {
+	s := service.Company{}
+	req := dto.CompanyThirdTreeReq{}
+	err := e.MakeContext(c).
+		MakeOrm().
+		Bind(&req, nil).
+		MakeService(&s.Service).
+		Errors
+	if err != nil {
+		e.Logger.Error(err)
+		e.Error(500, err, err.Error())
+		return
+	}
+
+	data, err := s.GetCompanyTreeByTname(req.Name)
+	if err != nil {
+		e.Error(500, err, err.Error())
+		return
+	}
+	e.OK(data, "查询成功")
+}

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

@@ -3,6 +3,7 @@ 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"
 )
@@ -21,11 +22,12 @@ func registerCompanyRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle
 		r.GET("/dept", cont.GetCurrentCompany)
 		r.GET("/user", cont.GetUserPage)
 		r.GET("/all", cont.GetAll)
+		r.GET("/third-tree", cont.GetCompanyThirdTree)
 		r.GET("/:id", cont.Get)
 		r.POST("", cont.Insert)
 		r.PUT("", cont.Update)
 		r.DELETE("", cont.Delete)
-
+		r.POST("/import-third-tree", cont.ImportThirdCompanyTree)
 	}
 
 }

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

@@ -8,12 +8,14 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+
 	"gogs.baozhida.cn/zoie/OAuth-core/service"
 	"gorm.io/gorm"
 	"gorm.io/gorm/clause"
 
 	"cold-delivery/app/admin/model"
 	"cold-delivery/app/admin/service/dto"
+
 	"gogs.baozhida.cn/zoie/OAuth-core/pkg"
 )
 
@@ -273,6 +275,109 @@ func (e *Company) Remove(d *dto.CompanyDeleteReq, p *actions.DataPermission) err
 	return nil
 }
 
+// GetCompanyTreeByTKey 根据T_name获取公司树结构
+func (e *Company) GetCompanyTreeByTname(T_name string) (data []nats_server.Company_R, err error) {
+	data, err = nats_server.Cold_CompanyTreeByT_name(T_name)
+	if err != nil {
+		e.Log.Errorf("获取公司树失败: %s", err)
+		return nil, err
+	}
+	return data, nil
+}
+
+// ImportThirdCompanyTree 批量导入第三方平台公司树结构
+// Id    -> ColdPid
+// T_key -> ColdKey
+func (e *Company) ImportThirdCompanyTree(nodes []dto.ThirdCompanyTreeReq) (err error) {
+	tx := e.Orm.Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+
+	for _, node := range nodes {
+		_, err = e.importThirdCompanyNode(tx, node, 0)
+		if err != nil {
+			e.Log.Errorf("import third company tree error: %s", err)
+			return err
+		}
+	}
+
+	return nil
+}
+
+// importThirdCompanyNode 递归导入单个节点及其子节点
+func (e *Company) importThirdCompanyNode(tx *gorm.DB, node dto.ThirdCompanyTreeReq, parentDeptId int) (deptId int, err error) {
+	var dept model.SysDept
+
+	// 根据 ColdPid 查找是否已存在
+	dbErr := tx.Where("cold_pid = ?", node.Id).First(&dept).Error
+	if dbErr != nil {
+		if errors.Is(dbErr, gorm.ErrRecordNotFound) {
+			// 新建
+			dept = model.SysDept{}
+		} else {
+			e.Log.Errorf("db error when query by cold_pid: %s", dbErr)
+			return 0, global.GetFailedErr
+		}
+	}
+
+	isNew := dept.Id == 0
+
+	dept.Name = node.TName
+	dept.ColdKey = node.TKey
+	dept.ColdPid = node.Id
+	dept.CompanyAddress = node.TAddress
+	dept.ParentId = parentDeptId
+
+	if isNew {
+		err = tx.Create(&dept).Error
+		if err != nil {
+			e.Log.Errorf("db error when create dept: %s", err)
+			return 0, global.CreateFailedErr
+		}
+	} else {
+		err = tx.Save(&dept).Error
+		if err != nil {
+			e.Log.Errorf("db error when update dept: %s", err)
+			return 0, global.UpdateFailedErr
+		}
+	}
+
+	// 生成 path
+	deptPath := pkg.IntToString(dept.Id) + "/"
+	if parentDeptId != 0 {
+		var parentDept model.SysDept
+		err = tx.First(&parentDept, parentDeptId).Error
+		if err != nil {
+			e.Log.Errorf("db error when query parent dept: %s", err)
+			return 0, global.GetFailedErr
+		}
+		deptPath = parentDept.Path + deptPath
+	} else {
+		deptPath = "/0/" + deptPath
+	}
+
+	err = tx.Model(&dept).Update("path", deptPath).Error
+	if err != nil {
+		e.Log.Errorf("db error when update dept path: %s", err)
+		return 0, global.UpdateFailedErr
+	}
+
+	// 递归处理子节点
+	for _, child := range node.Children {
+		_, err = e.importThirdCompanyNode(tx, child, dept.Id)
+		if err != nil {
+			return dept.Id, err
+		}
+	}
+
+	return dept.Id, nil
+}
+
 // SetDeptPage 设置Dept页面数据
 func (e *Company) SetDeptPage(c *dto.CompanyGetPageReq, p *actions.DataPermission) (m []model.SysDept, err error) {
 	var list []model.SysDept
@@ -389,6 +494,7 @@ func (e *Company) DeptPageCall(deptList *[]model.SysDept, menu model.SysDept) mo
 		mi.IsCoolerReleaseCold = list[j].IsCoolerReleaseCold
 		mi.IsCoolerShow = list[j].IsCoolerShow
 		mi.IsIceReleaseCold = list[j].IsIceReleaseCold
+		mi.IsOutStorage = list[j].IsOutStorage
 		mi.CompanyAddress = list[j].CompanyAddress
 		mi.IceRaftManage = list[j].IceRaftManage
 		mi.AppName = list[j].AppName

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

@@ -149,3 +149,19 @@ type DeptLabel struct {
 	Label    string      `gorm:"-" json:"label"`
 	Children []DeptLabel `gorm:"-" json:"children"`
 }
+
+// ThirdCompanyTreeReq 第三方平台公司树结构导入请求
+// Id    -> ColdPid
+// T_key -> ColdKey
+type ThirdCompanyTreeReq struct {
+	Id       int                   `json:"Id"`        // 第三方公司ID,对应本平台 ColdPid
+	TMid     int                   `json:"T_mid"`     // 上级公司ID(第三方)
+	TName    string                `json:"T_name"`    // 公司名称
+	TKey     string                `json:"T_key"`     // 冷链3.0公司秘钥,对应 ColdKey
+	TAddress string                `json:"T_Address"` // 公司地址 对应 CompanyAddress
+	Children []ThirdCompanyTreeReq `json:"Children"`  // 子公司
+}
+
+type CompanyThirdTreeReq struct {
+	Name string `uri:"name"`
+}

+ 28 - 1
common/nats/nats_server/NatsColdApi.go

@@ -3,9 +3,10 @@ package nats_server
 import (
 	"cold-delivery/common/nats"
 	"errors"
-	"github.com/vmihailenco/msgpack/v5"
 	"sort"
 	"time"
+
+	"github.com/vmihailenco/msgpack/v5"
 )
 
 func Cold_CompanyDeviceSensor_List_ByKey(T_sn, T_key string) (data []DeviceSensor_R, count int64, err error) {
@@ -250,6 +251,32 @@ func Cold_ReadCompanyByT_key(T_key string) (data Company_R, err error) {
 	return t_R.Data, nil
 }
 
+func Cold_CompanyTreeByT_name(T_key string) (data []Company_R, err error) {
+
+	msg, err := nats.Nats.Request("Cold_User_CompanyTreeByT_name", []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
+}
+
 func Cold_ReadDeviceByT_sn(T_sn string) (data Device, err error) {
 
 	msg, err := nats.Nats.Request("Cold_ReadDeviceByT_sn", []byte(T_sn), 3*time.Second)

+ 3 - 3
conf/setting_test.yml

@@ -32,10 +32,10 @@ settings:
     # 数据库类型 mysql
     driver: mysql
     # 数据库连接字符串 mysql 缺省信息 charset=utf8&parseTime=True&loc=Local&timeout=1000ms
-    source: cold-delivery:SRxDd5TK3xtPTKxw@tcp(192.168.11.77:3306)/cold-delivery?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
+    source: cold-delivery:SRxDd5TK3xtPTKxw@tcp(192.168.0.5:3306)/cold-delivery?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
   cache:
     redis:
-      addr: 192.168.11.77:6379
+      addr: 192.168.0.5:6379
       password:
       db: 4
     # key存在即可
@@ -55,7 +55,7 @@ settings:
       tokenExpire: 30
       waybillUrl: "https://coldlogistics.coldbaozhida.com/newInquiry?waybillNo="
     nats:
-      url: "127.0.0.1:43422"
+      url: "192.168.0.5:4222"
     amap:
       key: "c3dbf424f12240b2de8ace32893c1aa2"
     apk:

+ 3 - 3
conf/settings.yml

@@ -30,12 +30,12 @@ settings:
     # 数据库类型 mysql
     driver: mysql
     # 数据库连接字符串 mysql 缺省信息 charset=utf8&parseTime=True&loc=Local&timeout=1000ms
-    source: cold:yjwyEckZS7rE5H!@tcp(127.0.0.1:40306)/cold_delivery?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
+    source: cold:yjwyEckZS7rE5H!@tcp(192.168.0.5:3306)/cold_delivery?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
   #    host: localhost:8080
   #    host: 192.168.31.163:8080
   cache:
     redis:
-      addr: 127.0.0.1:43379
+      addr: 192.168.0.5:6379
       password:
       db: 11
     # key存在即可
@@ -55,7 +55,7 @@ settings:
       tokenExpire: 30
       waybillUrl: "https://coldlogistics.coldbaozhida.com/newInquiry?waybillNo="
     nats:
-      url: "127.0.0.1:43422"
+      url: "192.168.0.5:4222"
     amap:
       key: "c3dbf424f12240b2de8ace32893c1aa2"
     apk:

+ 4 - 4
setting.yml

@@ -32,11 +32,11 @@ settings:
     # 数据库类型 mysql
     driver: mysql
     # 数据库连接字符串 mysql 缺省信息 charset=utf8&parseTime=True&loc=Local&timeout=1000ms
-    source: root:mysql_5xGzBc@tcp(182.43.247.65:3306)/cold_delivery?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
+    source: cold_delivery:rt4djJzJpGEJsi3T@tcp(8.148.211.203:3306)/cold_delivery?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
 #    source: cold_delivery:yjwyEckZS7rE5H!@tcp(182.44.114.135:3306)/cold_delivery?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
     redis:
-      addr: 182.43.247.65:6379
-      password: redis_myhDre
+      addr: 8.148.211.203:6379
+      password: redis_JJ56d5
       db: 4
     # key存在即可
     memory: ''
@@ -56,7 +56,7 @@ settings:
       waybillUrl: "https://coldlogistics.coldbaozhida.com/newInquiry?waybillNo="
     nats:
 #      url: "192.168.0.5:4222"
-      url: "203.34.49.130:4222"
+      url: "8.148.211.203:4222"
     amap:
       key: "c3dbf424f12240b2de8ace32893c1aa2"
     apk: