Pārlūkot izejas kodu

feat:新增批量数据下载的owner设置功能

jerry 9 mēneši atpakaļ
vecāks
revīzija
3954fb287f

+ 26 - 0
service/controllers/batchDownloadControllers.go

@@ -3,6 +3,7 @@
  * /batchDownload/manage/list - GET
  * /batchDownload/manage/config - POST 创建新配置
  * /batchDownload/manage/description/{id} - POST 更新任务说明
+ * /batchDownload/manage/owner/{id} - POST 设置owner
  * /batchDownload/manage/config/{id} - DELETE 删除配置
  * /batchDownload/data/{id} - GET 获取指定ID的数据包下载地址
  * /batchDownload/manage/path - GET 获取指定ID的文件目录结构
@@ -96,6 +97,31 @@ func UpdateBatchDownloadDescription(c *fiber.Ctx) error {
 	return Success(c, body)
 }
 
+// 设置一个批量数据的owner
+// /batchDownload/manage/owner/:id
+func UpdateBatchDownloadOwner(c *fiber.Ctx) error {
+	id := c.Params("id")
+	var body struct {
+		Owner []string `json:"owner"`
+	}
+	if err := c.BodyParser(&body); err != nil {
+		zap.L().Warn("Invalid request body", zap.String("err", err.Error()))
+		return Fail(c, "Invalid request body")
+	}
+
+	objID, err := primitive.ObjectIDFromHex(id)
+	if err != nil {
+		zap.L().Warn("Invalid request para :id", zap.String("err", err.Error()))
+		return Fail(c, "Invalid request para :id")
+	}
+
+	if err := services.UpdateBatchDownloadOwner(objID, body.Owner); err != nil {
+		zap.L().Warn("Database write failed. (MongoDb)", zap.String("err", err.Error()))
+		return Error(c, "Database write failed. (MongoDb)")
+	}
+	return Success(c, body)
+}
+
 // 删除一个批量数据下载数据
 // /batchDownload/manage/config/:id
 func DeleteBatchDownload(c *fiber.Ctx) error {

+ 3 - 0
service/domain/batchDownloadDomain.go

@@ -12,6 +12,7 @@ type BatchDownloadInfo struct {
 	Options     BatchDownloadOptions `bson:"options" json:"options"`
 	Progress    Progress             `bson:"progress" json:"progress"`
 	FailReasons []string             `bson:"failReasons" json:"failReasons"`
+	Owner       *[]string            `bson:"owner,omitempty" json:"owner,omitempty"`
 }
 
 type BatchDownloadOptions struct {
@@ -30,6 +31,7 @@ type BatchDownloadConfigWrite struct {
 	Description string               `bson:"description" json:"description"`
 	TimePeriod  [2]string            `bson:"timePeriod" json:"timePeriod"`
 	Options     BatchDownloadOptions `bson:"options"`
+	Owner       *[]string            `bson:"owner,omitempty" json:"owner,omitempty"`
 }
 
 type BatchDownloadConfig struct {
@@ -41,6 +43,7 @@ type BatchDownloadConfig struct {
 	Progress    Progress                     `bson:"progress" json:"progress"`
 	Data        map[string]BatchDownloadData `bson:"data" json:"data"` // map-key为SN
 	FailReasons []string                     `bson:"failReasons" json:"failReasons"`
+	Owner       *[]string                    `bson:"owner,omitempty" json:"owner,omitempty"`
 }
 
 type TaskBatchDownload struct {

BIN
service/fwh-toolbox-server


+ 26 - 0
service/repositories/mongo/batchDownloadRepo.go

@@ -141,6 +141,32 @@ func UpdateBatchDownloadDescription(id primitive.ObjectID, desc string) error {
 	return nil
 }
 
+// 更新一条批量下载数据owner到数据库
+func UpdateBatchDownloadOwner(id primitive.ObjectID, owner []string) error {
+	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+	defer cancel()
+
+	collection := database.GetCollection("BatchDownloadConfig")
+
+	// _, err := collection.InsertOne(ctx, config)
+	filter := bson.M{"_id": id} // 按ID匹配
+	update := bson.M{
+		// 如果存在就更新全部字段
+		"$set": bson.M{
+			"owner": owner,
+		},
+	}
+
+	opts := options.Update().SetUpsert(true)
+
+	_, err := collection.UpdateOne(ctx, filter, update, opts)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
 // 更新一条批量下载结果到数据库
 func UpdateBatchDownloadResult(id primitive.ObjectID, result domain.Progress, reasons []string) error {
 	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)

+ 4 - 0
service/routes/batchDownloadRoutes.go

@@ -3,6 +3,7 @@
  * /batchDownload/manage/list - GET
  * /batchDownload/manage/config - POST 创建新配置
  * /batchDownload/manage/description/{id} - POST 更新任务说明
+ * /batchDownload/manage/owner/{id} - POST 设置owner
  * /batchDownload/manage/config/{id} - DELETE 删除配置
  * /batchDownload/data/{id} - GET 获取指定ID的数据包下载地址
  * /batchDownload/manage/path - GET 获取指定ID的文件目录结构
@@ -27,6 +28,9 @@ func BatchDownloadSetup(api fiber.Router) {
 	// 更新一个批量数据下载说明
 	api.Post("/batchDownload/manage/description/:id", controllers.UpdateBatchDownloadDescription)
 
+	// 设置一个批量数据的owner
+	api.Post("/batchDownload/manage/owner/:id", controllers.UpdateBatchDownloadOwner)
+
 	// 删除一个批量数据下载数据
 	api.Delete("/batchDownload/manage/config/:id", controllers.DeleteBatchDownload)
 

+ 10 - 0
service/services/batchDownloadServices.go

@@ -51,6 +51,16 @@ func UpdateBatchDownloadDescription(id primitive.ObjectID, desc string) error {
 	return nil
 }
 
+// 设置一个批量数据的owner
+func UpdateBatchDownloadOwner(id primitive.ObjectID, owner []string) error {
+	err := repositories.UpdateBatchDownloadOwner(id, owner)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
 // 删除一条批量数据下载配置
 func DeleteBatchDownloadConfig(id primitive.ObjectID) error {
 	err := repositories.DeleteBatchDownloadConfig(id)

+ 8 - 0
src/service/batchDownload/index.ts

@@ -2,6 +2,7 @@
 // /batchDownload/manage/list - GET
 // /batchDownload/manage/config - POST 创建新配置
 // /batchDownload/manage/description/{id} - POST 更新任务说明
+// /batchDownload/manage/owner/{id} - POST 设置数据的owner
 // /batchDownload/manage/config/{id} - DELETE 删除配置
 // /batchDownload/data/{id} - GET 获取指定ID的数据包下载地址
 // /batchDownload/manage/path - GET 获取指定ID的文件目录结构
@@ -21,6 +22,7 @@ const API_List = {
   batchDownloadList: '/batchDownload/manage/list',
   createBatchDownload: '/batchDownload/manage/config',
   updateBatchDownloadDescription: '/batchDownload/manage/description/{id}',
+  updateBatchDownloadOwner: '/batchDownload/manage/owner/{id}',
   deleteBatchDownload: '/batchDownload/manage/config/{id}',
   getBatchDownloadPackage: '/batchDownload/data/{id}',
   getBatchDownloadPath: '/batchDownload/manage/path',
@@ -57,6 +59,12 @@ export const updateBatchDownloadDescription = async (id: string, description: st
   const res = await http.post(url, description)
 }
 
+// POST 设置数据的owner
+export const updateBatchDownloadOwner = async (id: string, owner: string[]) => {
+  const url = API_List.updateBatchDownloadOwner.replace('{id}', encodeURIComponent(id))
+  const res = await http.post(url, {owner})
+}
+
 // DELETE 删除指定id配置
 export const deleteBatchDownload = async (id: string) => {
   const url = API_List.deleteBatchDownload.replace('{id}', encodeURIComponent(id))

+ 1 - 0
src/service/batchDownload/interface.ts

@@ -34,6 +34,7 @@ export interface BatchDownloadInfo {
   options: BatchDownloadOptions
   progress: string
   failReasons: string[]
+  owner?: string // 未设置则只有管理员能查看
 }
 
 export interface BatchDownloadStructNode {

+ 13 - 2
src/views/batch-download/index.vue

@@ -66,7 +66,7 @@ import { NButton, NDataTable, NForm, NNumberAnimation, NInput, NEllipsis, NDrawe
 import type { DataTableColumns, PaginationProps, DropdownProps, EllipsisProps } from 'naive-ui'
 import { useDataTable } from '@/composable/comp/useDataTable'
 import { useResettableReactive } from '@/composable/useResettable'
-import { getBatchDownloadList, createBatchDownload as createBatchDownloadTask, getBatchDownloadPackage, getBatchDownloadPath } from '@/service/batchDownload'
+import { getBatchDownloadList, createBatchDownload as createBatchDownloadTask, getBatchDownloadPackage, getBatchDownloadPath, updateBatchDownloadOwner } from '@/service/batchDownload'
 import type { BatchDownloadFilter, BatchDownloadInfo, BatchDownloadConfig } from '@/service/batchDownload/interface'
 import ModalData from './ModalData.vue'
 import ViewPathDialog from './component/viewPathDialog.vue'
@@ -242,6 +242,14 @@ function createColumns(): DataTableColumns<BatchDownloadInfo> {
       key: 'progress',
       width: 100,
     },
+    {
+      title: '所有者',
+      key: 'owner',
+      render(rowData, rowIndex) {
+        if (rowData.owner === undefined) return 'admin'
+        return ['admin', ...rowData.owner].join(', ')
+      }
+    },
     {
       title: '任务结果',
       key: 'failReasons',
@@ -367,7 +375,10 @@ const itemViewInfo = (info: BatchDownloadInfo) => {
   const optionStr = "Options:\n" + powerFlowStr + '\n' + mqttLogsStr + '\n' + eventAlarmStr + '\n' + alarmSnapshotStr + '\n' + emsLogsStr + '\n' + faultRecordStr + '\n' + updateLogStr + '\n' + settingsStr
   const progressStr = `Progress: ${info.progress}`
   const failReasonsStr = "Fail Reasons:\n" + info.failReasons.map(fail => `\t${fail}`).join("\n")
-  const contextStr = idStr + "\n" + snStr + "\n" + descStr + "\n" + periodStr + "\n" + optionStr + "\n" + progressStr + "\n" + failReasonsStr
+  let contextStr = idStr + "\n" + snStr + "\n" + descStr + "\n" + periodStr + "\n" + optionStr + "\n" + progressStr + "\n" + failReasonsStr
+  if (info.owner !== undefined) {
+    contextStr = contextStr + "\n" + `[${['admin', ...info.owner].join(', ')}]`
+  }
 
   drawerTitle.value = "任务详情"
   drawerContext.value = contextStr

+ 6 - 1
src/views/batch-download/page/viewLog.vue

@@ -6,7 +6,12 @@
 
 <script setup lang="ts">
 import { ref } from 'vue';
-import { CodeEditor } from 'monaco-editor-vue3';
+// import { CodeEditor } from 'monaco-editor-vue3';
+
+// 改为动态载入,提升加载速度
+const CodeEditor = defineAsyncComponent(() =>
+  import('monaco-editor-vue3')
+);
 
 const code = ref(`function hello() {
   console.log('Hello, Monaco Editor Vue3!');