From 896fcc46a0ad102001be619bc7f0a963833a131e Mon Sep 17 00:00:00 2001
From: 田源 <lastanimals@163.com>
Date: 星期五, 24 十一月 2023 17:43:59 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/mapper/LogOperateMapper.java                                                              |   16 
 Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/DockingPreAttrMappingServiceImpl.java |    2 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/CodeApplication.java                                                                |    2 
 Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/entity/Attach.java                                                      |   11 
 Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/ILogLocalService.java                                                             |   40 +
 Source/UBCS-WEB/src/views/monitor/log/operateLog.vue                                                                                                   |    0 
 Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogOperateController.java                                                      |   23 
 Source/UBCS-WEB/vue.config.js                                                                                                                          |    4 
 Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogErrorController.java                                                        |    5 
 Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/dto/LocalLogVO.java                                                               |   31 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java                                            |    8 
 Source/UBCS-WEB/src/views/monitor/log/authLog.vue                                                                                                      |    0 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeSyncUniversalController.java                                         |    2 
 Source/UBCS-WEB/src/views/monitor/log/localLog.vue                                                                                                     |  207 +++++++
 Source/UBCS-WEB/src/views/monitor/log/loginLog.vue                                                                                                     |  139 +++++
 Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileDownloadUtil.java                                             |  114 +++-
 Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/entity/LocalLog.java                                                              |   63 ++
 Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/mapper/SmsMapper.xml                                                                             |    2 
 Source/UBCS/ubcs-codeApply/src/main/java/com/vci/rmip/code/client/codeapply/Apply410/utils/HttpUtil.java                                               |    2 
 Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/entity/LogOperate.java                                                            |   69 ++
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java                                                  |   15 
 Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MdmCountConfigController.java                                        |    1 
 Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/LogApplication.java                                                                       |    2 
 Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/application-prod.yml                                                                             |    4 
 Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/mapper/AttachMapper.xml                                                                          |    2 
 Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogLocalServiceImpl.java                                                     |  318 ++++++++++++
 Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/ILogOperateService.java                                                           |   29 +
 Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogOperateServiceImpl.java                                                   |   52 ++
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeApplyWebManagementServiceImpl.java                                 |    2 
 Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/FileController.java                                                  |  230 ++++----
 Source/UBCS-WEB/src/api/logs.js                                                                                                                        |   22 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java                                              |    2 
 Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/GroupMdmInterServiceImpl.java         |    4 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeButtonWrapper.java                                                      |    2 
 Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogLocalController.java                                                        |   83 +++
 35 files changed, 1,328 insertions(+), 180 deletions(-)

diff --git a/Source/UBCS-WEB/src/api/logs.js b/Source/UBCS-WEB/src/api/logs.js
index 7538730..6655657 100644
--- a/Source/UBCS-WEB/src/api/logs.js
+++ b/Source/UBCS-WEB/src/api/logs.js
@@ -62,3 +62,25 @@
   })
 }
 
+export const getLazyList = (data) => {
+  return request({
+    url: '/api/ubcs-log/localLog/lazy-list',
+    method: 'post',
+    data: data,
+  })
+}
+export const downLoadLog = (data) => {
+  return request({
+    url: '/api/ubcs-log/localLog/downLoadLog',
+    method: 'post',
+    data:data,
+  })
+}
+export const deleteLocalLog = (data) => {
+  return request({
+    url: '/api/ubcs-log/localLog/deleteLogFile',
+    method: 'delete',
+    data: data
+  })
+}
+
diff --git a/Source/UBCS-WEB/src/views/monitor/log/authLog.vue b/Source/UBCS-WEB/src/views/monitor/log/authLog.vue
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Source/UBCS-WEB/src/views/monitor/log/authLog.vue
diff --git a/Source/UBCS-WEB/src/views/monitor/log/localLog.vue b/Source/UBCS-WEB/src/views/monitor/log/localLog.vue
new file mode 100644
index 0000000..90d9130
--- /dev/null
+++ b/Source/UBCS-WEB/src/views/monitor/log/localLog.vue
@@ -0,0 +1,207 @@
+<template>
+  <basic-container>
+    <avue-crud ref="crud"
+              v-model="form"
+              :before-close="beforeClose"
+              :before-open="beforeOpen"
+              :data="data"
+              :option="option"
+              :permission="permissionList"
+              :table-loading="loading"
+              @row-del="rowDel"
+              @search-change="searchChange"
+              @search-reset="searchReset"
+              @selection-change="selectionChange"
+              @row-click="clickRowChange"
+              @current-change="currentChange"
+              @size-change="sizeChange"
+              @refresh-change="refreshChange"
+              @on-load="onLoad"
+              @tree-load="treeLoad">
+          <template slot="menu" slot-scope="scope">
+              <el-button
+                  icon="el-icon-download el-icon--right"
+                  size="small"
+                  type="text"
+                  :loading="downloadLoading"
+                  @click="downLoadLogFile(scope.row)"
+                  v-if="permissionList.downLoadBtn"
+              >涓嬭浇
+              </el-button>
+          </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getLazyList, deleteLocalLog,downLoadLog} from "@/api/logs";
+  import func from "@/util/func";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        selectionList: [],
+        query: {},
+        logPath: "",
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        option: {
+          height: "auto",
+          lazy: true,
+          columnBtn: false,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          tree: true,
+          border: true,
+          index: true,
+          selection: true,
+          editBtn: false,
+          delBtn: true,
+          addBtn: false,
+          viewBtn: false,
+          // menuWidth: 300,
+          dialogClickModal: false,
+          highlightCurrentRow: true, //琛岄�変腑鏃堕珮浜�
+          rowKey: "logName", //琛屾暟鎹殑 Key锛岀敤鏉ヤ紭鍖� Table 鐨勬覆鏌�
+          column: [
+            {
+              label: "鏈嶅姟鍚嶇О",
+              prop: "serviceName",
+              width:'120',
+              search: true
+            },
+            {
+              label: "鏈嶅姟ID",
+              prop: "serviceId",
+              search: true
+            },
+            {
+              label: "鏃ュ織璺緞",
+              prop: "logPath",
+              width:'160'
+            },
+            {
+              label: "鏃ュ織鍚嶇О",
+              prop: "logName",
+              width:'80',
+            },
+            {
+              label: "鏃ュ織绫诲瀷",
+              prop: "logType"
+            },
+            {
+              label: "鍒涘缓鏃堕棿",
+              prop: "createTime",
+              width:'180'
+            },
+            {
+              label: "鏈�鍚庝慨鏀规椂闂�",
+              prop: "lastModifier",
+              width:'180'
+            }
+          ]
+        },
+        data: [],
+        downloadLoading: false,
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          delBtn: this.vaildData(this.permission.localLog.localLog_delete, false),
+          downLoadBtn: this.vaildData(this.permission.localLog.localLog_dwonload, false)
+        };
+      }
+    },
+    methods: {
+
+      downLoadLogFile(row){
+          this.downloadLoading = true;
+          let logPath = row.hasChildren ?  row.logPath:row.logPath+"\\"+row.logName;
+          downLoadLog(Object.assign({},row,{logFullPaths:logPath})).then(res=>{
+              func.downloadFileByBlobHandler(res);
+              this.downloadLoading = false;
+          }).catch((res)=>{
+              //this.$message.warning(res)
+              this.downloadLoading = false;
+          })
+      },
+      // 琛屽垹闄�
+      rowDel(row, index, done) {
+          this.$confirm("纭畾灏嗛�夋嫨鐨勬棩蹇楁枃浠跺垹闄�?", {
+              confirmButtonText: "纭畾",
+              cancelButtonText: "鍙栨秷",
+              type: "warning"
+          })
+          .then(() => {
+              let logPath = row.hasChildren ?  row.logPath:row.logPath+"\\"+row.logName;
+              return deleteLocalLog(Object.assign({},row,{logFullPaths:logPath}));
+          })
+          .then(() => {
+              this.$message({
+                  type: "success",
+                  message: "鎿嶄綔鎴愬姛!"
+              });
+              // 鏁版嵁鍥炶皟杩涜鍒锋柊
+              done(row);
+              //this.onLoad();
+          });
+      },
+      searchReset() {
+          this.query = {};
+          this.parentId = 0;
+          this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+          this.query = params;
+          this.parentId = '';
+          this.page.currentPage = 1;
+          this.onLoad(this.page, params);
+          done();
+      },
+      clickRowChange(row) {
+          this.$refs.crud.toggleSelection();
+          this.selectionList = row;
+          this.$refs.crud.setCurrentRow(row);
+          this.$refs.crud.toggleRowSelection(row); //閫変腑褰撳墠琛�
+      },
+      selectionChange(list) {
+          this.selectionList = list;
+          this.$refs.crud.setCurrentRow(this.selectionList[list.length - 1]);
+      },
+      selectionClear() {
+          this.selectionList = [];
+          this.$refs.crud.toggleSelection();
+      },
+      refreshChange() {
+          this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+          this.loading = true;
+          //Object.assign(params, this.query)
+          getLazyList({"logPath": this.logPath}).then(res => {
+              this.data = res.data.data;
+              this.loading = false;
+              this.selectionClear();
+          });
+      },
+      treeLoad(tree, treeNode, resolve) {
+          const logPath = tree.logPath;
+          getLazyList({"logPath": logPath}).then(res => {
+              resolve(res.data.data);
+          });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>
diff --git a/Source/UBCS-WEB/src/views/monitor/log/loginLog.vue b/Source/UBCS-WEB/src/views/monitor/log/loginLog.vue
new file mode 100644
index 0000000..1298f88
--- /dev/null
+++ b/Source/UBCS-WEB/src/views/monitor/log/loginLog.vue
@@ -0,0 +1,139 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               ref="crud"
+               v-model="form"
+               :permission="permissionList"
+               :page.sync="page"
+               :before-open="beforeOpen"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getUsualList, getUsualLogs} from "@/api/logs";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        selectionList: [],
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        option: {
+          height: 'auto',
+          calcHeight: 30,
+          columnBtn:false,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          editBtn: false,
+          addBtn: false,
+          delBtn: false,
+          menuWidth: 120,
+          dialogType: 'drawer',
+          column: [
+            {
+              label: "鐢ㄦ埛鍚�",
+              prop: "serviceId",
+              search: true
+            },
+            {
+              label: "濮撳悕",
+              prop: "serverHost",
+              search: true
+            },
+            {
+              label: "鐢ㄦ埛id",
+              prop: "serverIp"
+            },
+            {
+              label: "妯″潡",
+              prop: "env",
+              width:'80'
+            },
+            {
+              label: "鏃堕棿",
+              prop: "logLevel"
+            },
+            {
+              label: "鎿嶄綔缁撴灉",
+              prop: "logId"
+            },
+            {
+              label: "鎻忚堪",
+              prop: "requestUri"
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          viewBtn: this.vaildData(this.permission.log_usual.log_usual_view, false)
+        };
+      }
+    },
+    methods: {
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getUsualLogs(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getUsualList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>
diff --git a/Source/UBCS-WEB/src/views/monitor/log/operateLog.vue b/Source/UBCS-WEB/src/views/monitor/log/operateLog.vue
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Source/UBCS-WEB/src/views/monitor/log/operateLog.vue
diff --git a/Source/UBCS-WEB/vue.config.js b/Source/UBCS-WEB/vue.config.js
index fcfbd7d..264ceae 100644
--- a/Source/UBCS-WEB/vue.config.js
+++ b/Source/UBCS-WEB/vue.config.js
@@ -26,9 +26,9 @@
     proxy: {
       '/api': {
         //鏈湴鏈嶅姟鎺ュ彛鍦板潃
-        // target: 'http://127.0.0.1:37000',
+        target: 'http://127.0.0.1:37000',
         // target: 'http://192.168.1.51:37000',
-        target: 'http://dev.vci-tech.com:37000',
+        // target: 'http://dev.vci-tech.com:37000',
         //yxc
         // target: 'http:// 192.168.0.104:37000',
         // target: 'http://192.168.0.105:37000',
diff --git a/Source/UBCS/ubcs-codeApply/src/main/java/com/vci/rmip/code/client/codeapply/Apply410/utils/HttpUtil.java b/Source/UBCS/ubcs-codeApply/src/main/java/com/vci/rmip/code/client/codeapply/Apply410/utils/HttpUtil.java
index 3ff0ef7..3806f25 100644
--- a/Source/UBCS/ubcs-codeApply/src/main/java/com/vci/rmip/code/client/codeapply/Apply410/utils/HttpUtil.java
+++ b/Source/UBCS/ubcs-codeApply/src/main/java/com/vci/rmip/code/client/codeapply/Apply410/utils/HttpUtil.java
@@ -346,7 +346,7 @@
 				return result;
 			}
 		}catch (Throwable e){
-			e.printStackTrace();;
+			e.printStackTrace();
 		}
 		return result;
 	}
diff --git a/Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/dto/LocalLogVO.java b/Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/dto/LocalLogVO.java
new file mode 100644
index 0000000..add2fea
--- /dev/null
+++ b/Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/dto/LocalLogVO.java
@@ -0,0 +1,31 @@
+package com.vci.ubcs.log.dto;
+
+import com.vci.ubcs.log.entity.LocalLog;
+import javafx.scene.Parent;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author ludc
+ * @date 2023/11/23 11:17
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class LocalLogVO extends LocalLog implements Serializable {
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = 2217599544701726981L;
+
+	/**
+	 * 鏃ュ織鍏ㄨ矾寰勯泦鍚�
+	 */
+	private String logFullPaths;
+
+}
diff --git a/Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/entity/LocalLog.java b/Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/entity/LocalLog.java
new file mode 100644
index 0000000..6fe8cfa
--- /dev/null
+++ b/Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/entity/LocalLog.java
@@ -0,0 +1,63 @@
+package com.vci.ubcs.log.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author ludc
+ * @date 2023/10/31 15:43
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class LocalLog implements Serializable {
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = 2217599544701726181L;
+
+	/**
+	 * 鏃ュ織鎵�灞炴湇鍔″悕绉�
+	 */
+	private String serviceName;
+
+	/**
+	 * 鏈嶅姟id
+	 */
+	private String serviceId;
+
+	/**
+	 * 鏃ュ織鏂囦欢鎵�鍦ㄧ殑璺緞
+	 */
+	private String logPath;
+
+	/**
+	 * 鏃ュ織鍚嶇О
+	 */
+	private String logName;
+
+	/**
+	 * 鏃ュ織绫诲瀷
+	 */
+	private String logType;
+
+	/**
+	 * 鏃ュ織鍒涘缓鏃堕棿
+	 */
+	private String createTime;
+
+	/**
+	 * 鏃ュ織鐨勬渶鍚庝慨鏀规椂闂�
+	 */
+	private String lastModifier;
+
+	/**
+	 * 鏄惁鍖呭惈瀛樺湪瀛愭枃浠�
+	 */
+	private Boolean hasChildren;
+
+}
diff --git a/Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/entity/LogOperate.java b/Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/entity/LogOperate.java
new file mode 100644
index 0000000..2d9cac1
--- /dev/null
+++ b/Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/entity/LogOperate.java
@@ -0,0 +1,69 @@
+package com.vci.ubcs.log.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 鎿嶄綔鏃ュ織绠$悊:(鍖呮嫭鐧诲綍鏃ュ織銆佹搷浣滄棩蹇椼�佹巿鏉冩棩蹇楋紝浠ュ強绠$悊鍛樼殑浠ヤ笂涓夌鏃ュ織)
+ * @author ludc
+ * @date 2023/11/24 10:58
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class LogOperate implements Serializable {
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = 2217599544701724211L;
+
+	/**
+	 * 涓婚敭
+	 */
+	private String oid;
+
+	/**
+	 * 鐢ㄦ埛鍚�
+	 */
+	private String userName;
+
+	/**
+	 * 濮撳悕
+	 */
+	private String realName;
+
+	/**
+	 * ip鍦板潃
+	 */
+	private String ip;
+
+	/**
+	 * 妯″潡
+	 */
+	private String model;
+
+	/**
+	 * 鎿嶄綔
+	 */
+	private String operate;
+
+	/**
+	 * 鏃堕棿
+	 */
+	private String time;
+
+	/**
+	 * 鎿嶄綔缁撴灉
+	 */
+	private String operateResult;
+
+	/**
+	 * 鎻忚堪
+	 */
+	private String description;
+
+}
diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/entity/Attach.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/entity/Attach.java
index 24ae52e..544e274 100644
--- a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/entity/Attach.java
+++ b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/entity/Attach.java
@@ -16,11 +16,13 @@
  */
 package com.vci.ubcs.resource.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
 import org.springblade.core.tenant.mp.TenantEntity;
 
 /**
@@ -32,7 +34,7 @@
 @TableName("pl_attach")
 @EqualsAndHashCode(callSuper = true)
 @ApiModel(value = "Attach瀵硅薄", description = "闄勪欢琛�")
-public class Attach extends TenantEntity {
+public class Attach extends BaseEntity {
 
 	private static final long serialVersionUID = 1L;
 
@@ -66,6 +68,11 @@
 	 */
 	@ApiModelProperty(value = "闄勪欢澶у皬")
 	private Long attachSize;
-
+	/**
+	 * 绉熸埛ID
+	 */
+	@ApiModelProperty(value = "绉熸埛ID")
+	@TableField("TENANT_ID")
+	private String tenantId;
 
 }
diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileDownloadUtil.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileDownloadUtil.java
index 89450ec..8df5b21 100644
--- a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileDownloadUtil.java
+++ b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileDownloadUtil.java
@@ -21,39 +21,39 @@
 @Slf4j
 public class FileDownloadUtil {
 
-    /**
-     * 涓嬭浇鏂囦欢
-     * @param response 鍝嶅簲瀵硅薄
-     * @param fileObjectBO 鏂囦欢鐨勪俊鎭紝鍖呭惈鏂囦欢鐨勮緭鍏ユ祦
-     * @throws IOException 涓嬭浇寮傚父浼氭姏鍑�
-     */
-    public static void downloadFile(HttpServletResponse response, FileObjectBO fileObjectBO) throws IOException {
-        downloadFile(response,fileObjectBO,true);
-    }
+	/**
+	 * 涓嬭浇鏂囦欢
+	 * @param response 鍝嶅簲瀵硅薄
+	 * @param fileObjectBO 鏂囦欢鐨勪俊鎭紝鍖呭惈鏂囦欢鐨勮緭鍏ユ祦
+	 * @throws IOException 涓嬭浇寮傚父浼氭姏鍑�
+	 */
+	public static void downloadFile(HttpServletResponse response, FileObjectBO fileObjectBO) throws IOException {
+		downloadFile(response,fileObjectBO,true);
+	}
 
-    /**
-     * 涓嬭浇鏂囦欢
-     * @param response 鍝嶅簲瀵硅薄
-     * @param fileObjectBO 鏂囦欢鐨勪俊鎭紝鍖呭惈鏂囦欢鐨勮緭鍏ユ祦
-     * @param closeInputStream 鏄惁鍏抽棴娴�
-     * @throws IOException 涓嬭浇鍑洪敊鐨勬椂鍊欐姏鍑哄紓甯�
-     */
-    public static void downloadFile(HttpServletResponse response, FileObjectBO fileObjectBO,boolean closeInputStream) throws IOException {
-        MediaType mediaType = MediaTypeFactory.getMediaType(fileObjectBO.getBucketName() + "." + fileObjectBO.getFileExtension()).orElse(MediaType.APPLICATION_OCTET_STREAM);
-        // 璁剧疆寮哄埗涓嬭浇涓嶆墦寮�
-        response.setContentType(mediaType.toString()+";application/force-download;charset=UTF-8");
-        try{
-            String fileName = URLEncoder.encode(fileObjectBO.getName() + "." + fileObjectBO.getFileExtension(), "UTF8");
-            response.addHeader("Content-Disposition", "attachment;filename="+ fileName+ ";filename*=utf-8''");
-        }catch(Exception e){
-            if(log.isErrorEnabled()){
-                log.error("璁剧疆鏂囦欢鐨勫悕绉板埌鍝嶅簲娴佺殑鏃跺�欏嚭閿�",e);
-            }
-        }
-        response.setCharacterEncoding("UTF-8");
-        Cookie cookie = new Cookie("fileDownload", "true");
-        cookie.setPath("/");
-        response.addCookie(cookie);
+	/**
+	 * 涓嬭浇鏂囦欢
+	 * @param response 鍝嶅簲瀵硅薄
+	 * @param fileObjectBO 鏂囦欢鐨勪俊鎭紝鍖呭惈鏂囦欢鐨勮緭鍏ユ祦
+	 * @param closeInputStream 鏄惁鍏抽棴娴�
+	 * @throws IOException 涓嬭浇鍑洪敊鐨勬椂鍊欐姏鍑哄紓甯�
+	 */
+	public static void downloadFile(HttpServletResponse response, FileObjectBO fileObjectBO,boolean closeInputStream) throws IOException {
+		MediaType mediaType = MediaTypeFactory.getMediaType(fileObjectBO.getBucketName() + "." + fileObjectBO.getFileExtension()).orElse(MediaType.APPLICATION_OCTET_STREAM);
+		// 璁剧疆寮哄埗涓嬭浇涓嶆墦寮�
+		response.setContentType(mediaType.toString()+";application/force-download;charset=UTF-8");
+		try{
+			String fileName = URLEncoder.encode(fileObjectBO.getName() + "." + fileObjectBO.getFileExtension(), "UTF8");
+			response.addHeader("Content-Disposition", "attachment;filename="+ fileName+ ";filename*=utf-8''");
+		}catch(Exception e){
+			if(log.isErrorEnabled()){
+				log.error("璁剧疆鏂囦欢鐨勫悕绉板埌鍝嶅簲娴佺殑鏃跺�欏嚭閿�",e);
+			}
+		}
+		response.setCharacterEncoding("UTF-8");
+		Cookie cookie = new Cookie("fileDownload", "true");
+		cookie.setPath("/");
+		response.addCookie(cookie);
 		if(closeInputStream) {
 			try (InputStream ins = (fileObjectBO.getInputStream() != null ? fileObjectBO.getInputStream() : new FileInputStream(fileObjectBO.getFileLocalPath()))) {
 				IOUtils.copy(ins, response.getOutputStream());
@@ -76,5 +76,53 @@
 				throw e;
 			}
 		}
-    }
+	}
+
+	/**
+	 * 涓嬭浇鏂囦欢
+	 * @param response 鍝嶅簲瀵硅薄
+	 * @param fileObjectBO 鏂囦欢鐨勪俊鎭紝鍖呭惈鏂囦欢鐨勮緭鍏ユ祦
+	 * @param closeInputStream 鏄惁鍏抽棴娴�
+	 * @throws IOException 涓嬭浇鍑洪敊鐨勬椂鍊欐姏鍑哄紓甯�
+	 */
+	public static void downloadFileLocal(HttpServletResponse response, FileObjectBO fileObjectBO,boolean closeInputStream) throws IOException {
+		MediaType mediaType = MediaTypeFactory.getMediaType(fileObjectBO.getFileExtension()).orElse(MediaType.APPLICATION_OCTET_STREAM);
+		// 璁剧疆寮哄埗涓嬭浇涓嶆墦寮�
+		response.setContentType(mediaType.toString()+";application/force-download;charset=UTF-8");
+		try{
+			String fileName = URLEncoder.encode(fileObjectBO.getName(), "UTF8");
+			response.addHeader("Content-Disposition", "attachment;filename="+ fileName+ ";filename*=utf-8''");
+		}catch(Exception e){
+			if(log.isErrorEnabled()){
+				log.error("璁剧疆鏂囦欢鐨勫悕绉板埌鍝嶅簲娴佺殑鏃跺�欏嚭閿�",e);
+			}
+		}
+		response.setCharacterEncoding("UTF-8");
+		Cookie cookie = new Cookie("fileDownload", "true");
+		cookie.setPath("/");
+		response.addCookie(cookie);
+		if(closeInputStream) {
+			try (InputStream ins = (fileObjectBO.getInputStream() != null ? fileObjectBO.getInputStream() : new FileInputStream(fileObjectBO.getFileLocalPath()))) {
+				IOUtils.copy(ins, response.getOutputStream());
+			} catch (IOException e) {
+				//鏈夊彲鑳藉鎴风鐨勯摼鎺�
+				if (log.isErrorEnabled()) {
+					log.error("鍐欏叆鏂囦欢鍒板搷搴旀祦鍑洪敊", e);
+				}
+				throw e;
+			}
+		}else{
+			try {
+				InputStream ins = (fileObjectBO.getInputStream() != null ? fileObjectBO.getInputStream() : new FileInputStream(fileObjectBO.getFileLocalPath()));
+				IOUtils.copy(ins, response.getOutputStream());
+			} catch (IOException e) {
+				//鏈夊彲鑳藉鎴风鐨勯摼鎺�
+				if (log.isErrorEnabled()) {
+					log.error("鍐欏叆鏂囦欢鍒板搷搴旀祦鍑洪敊", e);
+				}
+				throw e;
+			}
+		}
+	}
+
 }
diff --git a/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/LogApplication.java b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/LogApplication.java
index 3cb1c31..ea8f6dd 100644
--- a/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/LogApplication.java
+++ b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/LogApplication.java
@@ -29,7 +29,7 @@
  * @author Chill
  */
 @EnableDiscoveryClient
-@EnableFeignClients("org.springblade")
+@EnableFeignClients(basePackages = {"com.vci.ubcs", "org.springblade"})
 @SpringBootApplication
 public class LogApplication {
 
diff --git a/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogErrorController.java b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogErrorController.java
index d040838..e43b0f3 100644
--- a/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogErrorController.java
+++ b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogErrorController.java
@@ -25,10 +25,7 @@
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 
 import java.util.Map;
diff --git a/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogLocalController.java b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogLocalController.java
new file mode 100644
index 0000000..8fea8d4
--- /dev/null
+++ b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogLocalController.java
@@ -0,0 +1,83 @@
+package com.vci.ubcs.log.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.common.utils.StringUtils;
+import com.vci.ubcs.log.dto.LocalLogVO;
+import com.vci.ubcs.log.service.ILogLocalService;
+import com.vci.ubcs.log.entity.LocalLog;
+import com.vci.ubcs.resource.utils.FileDownloadUtil;
+import com.vci.ubcs.starter.web.util.ControllerUtil;
+import com.vci.ubcs.starter.web.util.LangBaseUtil;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.rmi.ServerException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏈湴绯荤粺鏃ュ織
+ * @author ludc
+ * @date 2023/10/31 15:37
+ */
+@NonDS
+@Slf4j
+@RestController
+@AllArgsConstructor
+@RequestMapping("/localLog")
+public class LogLocalController {
+
+	private final ILogLocalService logLocalService;
+
+	/**
+	 * 鑾峰彇鏃ュ織鏂囦欢鍒楄〃
+	 * @param localLog
+	 * @return
+	 */
+	@PostMapping("/lazy-list")
+	public R<List<LocalLog>> getSystemLogList(@RequestBody LocalLog localLog){
+ 		return R.data(logLocalService.getSystemLogList(localLog.getLogPath()));
+	}
+
+	/**
+	 * 涓嬭浇鏃ュ織鏂囦欢
+	 * @param localLogVO 涓嬭浇鏃ュ織鐨勫叏璺緞闆嗗悎
+	 * @param response
+	 * @return
+	 */
+	@RequestMapping(value = "/downLoadLog",method = {RequestMethod.GET,RequestMethod.POST})
+	public void downloadLogByServiceName(@RequestBody LocalLogVO localLogVO, HttpServletResponse response) throws IOException {
+		try {
+			//ControllerUtil.writeFileToResponse(response,excelName);
+			FileDownloadUtil.downloadFileLocal(response, logLocalService.downloadLogByServiceNameAndFileName(localLogVO),true);
+		} catch (Throwable e) {
+			//濡傛灉鍑洪敊,鎶婇敊璇俊鎭啓鍒皌ext
+			String msg = LangBaseUtil.getErrorMsg(e);
+			if(StringUtils.isBlank(msg)){
+				msg = "鏈煡閿欒";
+			}
+			ControllerUtil.writeDataToResponse(response,msg.getBytes(StandardCharsets.UTF_8),null);
+		}
+	}
+
+	/**
+	 * 鍒犻櫎鏃ュ織鏂囦欢
+	 * @param localLogVO
+	 * @return
+	 * @throws ServerException
+	 */
+	@DeleteMapping("/deleteLogFile")
+	public R deleteLogFile(@RequestBody LocalLogVO localLogVO) throws ServerException {
+		return logLocalService.deleteLogFile(localLogVO);
+	}
+
+}
diff --git a/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogOperateController.java b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogOperateController.java
new file mode 100644
index 0000000..3263ddd
--- /dev/null
+++ b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogOperateController.java
@@ -0,0 +1,23 @@
+package com.vci.ubcs.log.controller;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 鎿嶄綔鏃ュ織绠$悊:(鍖呮嫭鐧诲綍鏃ュ織銆佹搷浣滄棩蹇椼�佹巿鏉冩棩蹇楋紝浠ュ強绠$悊鍛樼殑浠ヤ笂涓夌鏃ュ織)
+ * @author ludc
+ * @date 2023/11/24 10:43
+ */
+@NonDS
+@Slf4j
+@RestController
+@AllArgsConstructor
+@RequestMapping("/operateLog")
+public class LogOperateController {
+
+
+
+}
diff --git a/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/mapper/LogOperateMapper.java b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/mapper/LogOperateMapper.java
new file mode 100644
index 0000000..8526497
--- /dev/null
+++ b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/mapper/LogOperateMapper.java
@@ -0,0 +1,16 @@
+package com.vci.ubcs.log.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.vci.ubcs.log.entity.LogOperate;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 鎿嶄綔鏃ュ織绠$悊:(鍖呮嫭鐧诲綍鏃ュ織銆佹搷浣滄棩蹇椼�佹巿鏉冩棩蹇楋紝浠ュ強绠$悊鍛樼殑浠ヤ笂涓夌鏃ュ織)
+ * @author ludc
+ * @date 2023/11/24 10:50
+ */
+@Mapper
+public interface LogOperateMapper extends BaseMapper<LogOperate> {
+
+
+}
diff --git a/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/ILogLocalService.java b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/ILogLocalService.java
new file mode 100644
index 0000000..38a03f0
--- /dev/null
+++ b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/ILogLocalService.java
@@ -0,0 +1,40 @@
+package com.vci.ubcs.log.service;
+
+import com.vci.ubcs.log.dto.LocalLogVO;
+import com.vci.ubcs.log.entity.LocalLog;
+import com.vci.ubcs.resource.bo.FileObjectBO;
+import org.springblade.core.tool.api.R;
+
+import java.rmi.ServerException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏈湴绯荤粺鏃ュ織
+ * @author ludc
+ * @date 2023/10/31 15:38
+ */
+public interface ILogLocalService {
+
+	/**
+	 * 鏌ョ湅锛屾湰鍦扮郴缁熸棩蹇楀垪琛�
+	 * @param logParentPath
+	 * @return
+	 */
+	List<LocalLog> getSystemLogList(String logParentPath);
+
+	/**
+	 * 涓嬭浇锛屾牴鎹湇鍔″悕鎵�鍦ㄦ枃浠跺悕鍜屾枃浠跺悕涓嬭浇鏂囦欢
+	 * @param localLogVO 涓嬭浇鏃ュ織鐨勫璞�
+	 * @return 鏂囦欢鐨勪俊鎭�
+	 */
+	FileObjectBO downloadLogByServiceNameAndFileName(LocalLogVO localLogVO) throws ServerException;
+
+	/**
+	 * 鍒犻櫎锛屾牴鎹湇鍔℃墍鍦ㄦ枃浠跺悕锛屽拰鏃ュ織鏂囦欢鍚嶇О鍒犻櫎
+	 * @param localLogVO
+	 * @return 鎵ц缁撴灉
+	 */
+	R deleteLogFile(LocalLogVO localLogVO) throws ServerException;
+
+}
diff --git a/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/ILogOperateService.java b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/ILogOperateService.java
new file mode 100644
index 0000000..6af6c3d
--- /dev/null
+++ b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/ILogOperateService.java
@@ -0,0 +1,29 @@
+package com.vci.ubcs.log.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vci.ubcs.log.entity.LogOperate;
+
+import java.util.List;
+
+/**
+ * 鎿嶄綔鏃ュ織绠$悊:(鍖呮嫭鐧诲綍鏃ュ織銆佹搷浣滄棩蹇椼�佹巿鏉冩棩蹇楋紝浠ュ強绠$悊鍛樼殑浠ヤ笂涓夌鏃ュ織)
+ * @author ludc
+ * @date 2023/11/24 10:50
+ */
+public interface ILogOperateService extends IService<LogOperate> {
+
+	/**
+	 * 淇濆瓨鎿嶄綔鏃ュ織
+	 * @param logOperate
+	 * @return
+	 */
+	boolean saveLogOperate(LogOperate logOperate);
+
+	/**
+	 * 鏉′欢鏌ヨ鑾峰彇鏃ュ織鍒楄〃
+	 * @param logOperate
+	 * @return
+	 */
+	List<LogOperate> listByCondition(LogOperate logOperate);
+
+}
diff --git a/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogLocalServiceImpl.java b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogLocalServiceImpl.java
new file mode 100644
index 0000000..f8ba775
--- /dev/null
+++ b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogLocalServiceImpl.java
@@ -0,0 +1,318 @@
+package com.vci.ubcs.log.service.impl;
+
+import com.vci.ubcs.log.dto.LocalLogVO;
+import com.vci.ubcs.log.service.ILogLocalService;
+import com.vci.ubcs.log.entity.LocalLog;
+import com.vci.ubcs.resource.utils.FileUtil;
+import com.vci.ubcs.resource.utils.ZipUtil;
+import com.vci.ubcs.resource.vo.FileObjectVO;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.web.util.BeanUtil;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
+import org.springblade.core.log.exception.ServiceException;
+import com.vci.ubcs.omd.cache.EnumCache;
+import com.vci.ubcs.omd.enums.EnumEnum;
+import com.vci.ubcs.resource.bo.FileObjectBO;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.rmi.ServerException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鏈湴绯荤粺鏃ュ織
+ * @author ludc
+ * @date 2023/10/31 15:39
+ */
+@Service
+@Slf4j
+public class LogLocalServiceImpl implements ILogLocalService{
+
+	/**
+	 * 鍚勪釜鏈嶅姟瀛樻斁鐨勭殑鐖惰矾寰�
+	 */
+	@Value("${local-log.parent-path:/data1/ubcs/ubcs-server}")
+	private String PARENTPATH;
+
+	/**
+	 * 鏃ュ織鏂囦欢鐨勫叿浣撲綅缃�
+	 */
+	@Value("${local-log.log-path:/target/log}")
+	private String LOGPATH;
+
+	/**
+	 * 褰撳墠鎿嶄綔绯荤粺锛屾槸鍚︿负windows绯荤粺
+	 */
+	private Boolean isWindows = true;
+
+	{
+		String os = System.getProperty("os.name").toLowerCase();
+		//榛樿灏遍厤缃负windows鐨勶紝濡傛灉涓嶆槸褰撳墠绯荤粺涓嶆槸windows灏遍渶瑕佸鍏惰浆鎹负linux鐨勬枃浠惰矾寰勬牸寮�
+		if (!os.contains("win")) {
+			this.PARENTPATH = this.PARENTPATH.substring(this.PARENTPATH.lastIndexOf(":") + 1).replace("\\", "/");
+			this.LOGPATH = this.LOGPATH.replace("\\", "/");
+			this.isWindows = false;
+		}
+	}
+
+	/**
+	 * 鍘嬬缉鏂囦欢鐨勫伐鍏风被
+	 */
+	@Resource
+	private ZipUtil zipUtil;
+
+	/**
+	 * 鑾峰彇鏈湴鏃ュ織鍒楄〃
+	 * @param logParentPath
+	 * @return
+	 */
+	//@Override
+	public List<LocalLog> getSystemLogList(String logParentPath) {
+		List<LocalLog> localLogs = new ArrayList<>();
+		// 涓嶄负绌鸿鏄庢槸鍔犺浇褰撳墠杩欎釜鏈嶅姟璺緞涓嬬殑鏃ュ織鏂囦欢
+		if(Func.isNotEmpty(logParentPath)){
+			File file = new File(logParentPath);
+			if (file.isDirectory()) {
+				File[] files = file.listFiles();
+				Arrays.stream(files).forEach(item->{
+					// 缁勫缓鏃ュ織鏂囦欢瀵硅薄
+					LocalLog localLog = new LocalLog();
+					localLog.setLogName(item.getName());
+					localLog.setLogType(getLogType(item.getName()));
+					localLog.setCreateTime(getLastModifiedOrCreatTime(false,logParentPath));
+					localLog.setLastModifier(getLastModifiedOrCreatTime(true,logParentPath));
+					localLog.setLogPath(logParentPath);
+					String serviceId = getServiceId(logParentPath);
+					localLog.setServiceId(serviceId);
+					localLog.setServiceName(getServiceName(serviceId));
+					localLog.setHasChildren(false);
+					localLogs.add(localLog);
+				});
+			}
+		}else {
+			File fileDir = new File(PARENTPATH);
+			File[] childDir = fileDir.listFiles();
+			Arrays.stream(childDir).forEach(dir->{
+				if(dir.getName().contains("ubcs_")){
+					String fullPath = dir.getPath() + LOGPATH;
+					File file = new File(fullPath);
+					LocalLog localLog = new LocalLog();
+					localLog.setLastModifier(getLastModifiedOrCreatTime(true,fullPath));
+					localLog.setCreateTime(getLastModifiedOrCreatTime(false,fullPath));
+					localLog.setLogPath(fullPath);
+					String serviceId = getServiceId(file.getPath());
+					localLog.setServiceId(serviceId);
+					String serviceName = getServiceName(serviceId);
+					localLog.setServiceName(serviceName);
+					localLog.setLogType(serviceName+"鏃ュ織鐖剁洰褰�");
+					localLog.setLogName(serviceName+"鏃ュ織鐖剁洰褰�");
+					localLog.setHasChildren(true);
+					localLogs.add(localLog);
+				}
+			});
+		}
+		return localLogs;
+	}
+
+	/**
+	 * 鑾峰彇鏂囦欢鏈�鍚庝慨鏀规垨鑰呭垱寤烘椂闂�
+	 * @param isModifier
+	 * @return
+	 */
+	private String getLastModifiedOrCreatTime(boolean isModifier,String pathStr) {
+		Path path = FileSystems.getDefault().getPath(pathStr);
+		String date = "";
+		try {
+			BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
+			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+			// 鏄幏鍙栨渶鍚庝慨鏀规椂闂�
+			if(isModifier){
+				date = dateFormat.format(new Date(attr.lastModifiedTime().toMillis()));
+			}else {
+				date = dateFormat.format(new Date(attr.creationTime().toMillis()));
+			}
+		} catch (IOException e) {
+			throw new ServiceException("Error reading file date attributes: " + e.getMessage());
+		}
+		return date;
+	}
+
+	/**
+	 * 鑾峰彇鏃ュ織绫诲瀷
+	 * @param fileName
+	 * @return
+	 */
+	private String getLogType(String fileName){
+		//鍒ゆ柇鏃ュ織鐨勭殑绫诲瀷
+		if (fileName.contains("error")) {
+			return "Error";
+		} else if (fileName.contains("info")) {
+			return "Info";
+		} else if (fileName.contains("warning")) {
+			return "Warning";
+		} else {
+			return "Unknown";
+		}
+	}
+
+	/**
+	 * 鑾峰彇鏈嶅姟ID
+	 * @param servciePath
+	 * @return
+	 */
+	private String getServiceId(String servciePath){
+		// 鏍规嵁褰撳墠鎿嶄綔绯荤粺鏉ュ喅瀹氭槸閫氳繃浠�涔堝瓧绗︽潵鎴彇
+		String[] parts = servciePath.split(this.isWindows ? "\\\\":"/");
+		String extractedString = "";
+		if(parts.length > 3){
+			extractedString = parts[parts.length - 3];
+		}
+		return extractedString;
+	}
+
+	/**
+	 * 鑾峰彇鏈嶅姟鍚嶇О
+	 * @param serViceId
+	 * @return
+	 */
+	private String getServiceName(String serViceId){
+		return EnumCache.getValue(EnumEnum.SERCIVE_NAME_ROLE, serViceId);
+	}
+
+	/**
+	 * 鎴彇璺緞涓殑鏃ュ織鏂囦欢鍚嶇О
+	 * @param logFullPath
+	 * @return
+	 */
+	private String getLogFileName(String logFullPath){
+		// 鏍规嵁褰撳墠鎿嶄綔绯荤粺鏉ュ喅瀹氭槸閫氳繃浠�涔堝瓧绗︽潵鎴彇
+		String[] parts = logFullPath.split(this.isWindows ? "\\\\":"/");
+		String logFileName = "";
+		if(parts.length > 3){
+			logFileName = parts[parts.length - 1];
+		}
+		return logFileName;
+	}
+
+	/**
+	 * 涓嬭浇鏃ュ織鏂囦欢
+	 * @param localLogVO 涓嬭浇鏃ュ織瀵硅薄
+	 * @return
+	 * @throws ServerException
+	 */
+	@Override
+	public FileObjectBO downloadLogByServiceNameAndFileName(LocalLogVO localLogVO) throws ServerException {
+		if(Func.isEmpty(localLogVO) || Func.isEmpty(localLogVO.getLogPath())){
+			throw new ServerException("鏈幏鍙栧埌璇ユ棩蹇楄矾寰勶紒");
+		}
+		FileObjectBO fileObjectBO = new FileObjectBO();
+		String logFullPaths = localLogVO.getLogFullPaths();
+		// 鍒ゆ柇鏄惁鏄埗鐩綍
+		if(!localLogVO.getHasChildren()){
+			//鍙笅杞戒竴涓棩蹇楁枃浠�
+			File file = new File(logFullPaths);
+			if(!file.isFile() || !file.exists()){
+				throw new ServerException("鏈湴鏃ュ織鏂囦欢璺緞"+ logFullPaths +"涓湭鎵惧埌鏃ュ織");
+			}
+			try {
+				fileObjectBO.setName(file.getName());
+				fileObjectBO.setInputStream(new FileInputStream(file));
+				fileObjectBO.setFileLocalPath(logFullPaths);
+				fileObjectBO.setFileExtension(".log");
+			}catch (Throwable e){
+				throw new VciBaseException("鑾峰彇鏂囦欢鐨勬祦鏈夐棶棰�",new String[]{logFullPaths},e);
+			}
+		}else{
+			// 鏄埗鐩綍锛屾墍浠ラ渶瑕佽幏鍙栧埌涓嬮潰鐨勬墍鏈夊瓙鐩綍
+			// 鏈夊涓紝闇�瑕佷娇鐢▃ip杩涜鍘嬬缉
+			String tempFolder = FileUtil.getDefaultTempFolder();
+			File[] file1 = new File(logFullPaths).listFiles();
+			if(file1.length > 0){
+				Arrays.stream(file1).forEach(item->{
+					String fileName = tempFolder + File.separator + System.currentTimeMillis() + ".log";
+					File file = new File(fileName);
+					try {
+						if(!file.exists()) {
+							file.createNewFile();
+						}
+					}catch (Throwable e){
+						throw new VciBaseException("鍒涘缓鏂囦欢鍑洪敊,{0}",new String[]{fileName});
+					}
+					File logFile = new File(item.getPath());
+					if(!logFile.exists() || !logFile.isFile()){
+						throw new VciBaseException("鏈湴鏃ュ織鏂囦欢璺緞"+item.getPath()+"涓湭鎵惧埌鏃ュ織");
+					}
+
+					try(OutputStream os = new FileOutputStream(file);
+						InputStream ins = new FileInputStream(logFile);
+					){
+						IOUtils.copy(ins,os);
+					}catch (Throwable e){
+						throw new VciBaseException("涓嬭浇鏂囦欢鍒颁复鏃舵枃浠跺す閲屽嚭閿�,{0}",new String[]{fileName});
+					}
+				});
+				String zipName = new File(tempFolder).getPath() + File.separator + getLogFileName(logFullPaths) + "绛�"+file1.length + "涓枃浠�.zip";
+				zipUtil.folderToZipFile(tempFolder,zipName);
+				fileObjectBO.setFileLocalPath(zipName);
+				fileObjectBO.setFileExtension(".log");
+				if(log.isDebugEnabled()){
+					log.debug("涓嬭浇鏂囦欢鐨勪俊鎭�,",zipName);
+				}
+			}
+		}
+		return fileObjectBO;
+	}
+
+	/**
+	 * 鍒犻櫎鏃ュ織鏂囦欢
+	 * @param localLogVO 鏂囦欢鍏ㄨ矾寰勯泦鍚�
+	 * @throws ServerException
+	 */
+	@Override
+	public R deleteLogFile(LocalLogVO localLogVO) throws ServerException {
+		List<String> resMsgs = new ArrayList<>();
+		// 鍒ゆ柇鏄惁鏄棩蹇楅《灞傜洰褰�
+		if(localLogVO.getHasChildren()){
+			// 鏄《灞傜洰褰曪紝闇�瑕佸惊鐜幓鍒犻櫎鍖呭惈鐨勬墍鏈夋棩蹇楁枃浠�
+			File parentFile = new File(localLogVO.getLogFullPaths());
+			if(parentFile.isDirectory()){
+				Arrays.stream(parentFile.listFiles()).forEach(logFile->{
+					if (logFile.exists()) {
+						//鍒犻櫎澶辫触鐨勭洿鎺ヨ褰曚笅鏂囦欢鍚�
+						if (!logFile.delete()) {
+							resMsgs.add(getLogFileName(logFile.getPath()));
+						}
+					}
+				});
+			}
+		}else {
+			// 鍗曚釜鍒犻櫎
+			File file = new File(localLogVO.getLogFullPaths());
+			if (file.exists()) {
+				//鍒犻櫎澶辫触鐨勭洿鎺ヨ褰曚笅鏂囦欢鍚�
+				if (!file.delete()) {
+					resMsgs.add(getLogFileName(localLogVO.getLogFullPaths()));
+				}
+			}
+		}
+		return resMsgs.size()==0 ? R.success("鍒犻櫎鎴愬姛!"):R.fail("浠ヤ笅鏃ュ織鏂囦欢锛�"+resMsgs.stream().collect(Collectors.joining(","))+"鍒犻櫎澶辫触!");
+	}
+
+}
diff --git a/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogOperateServiceImpl.java b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogOperateServiceImpl.java
new file mode 100644
index 0000000..9c02711
--- /dev/null
+++ b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogOperateServiceImpl.java
@@ -0,0 +1,52 @@
+package com.vci.ubcs.log.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
+import com.vci.ubcs.log.entity.LogOperate;
+import com.vci.ubcs.log.mapper.LogOperateMapper;
+import com.vci.ubcs.log.service.ILogOperateService;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 鎿嶄綔鏃ュ織绠$悊:(鍖呮嫭鐧诲綍鏃ュ織銆佹搷浣滄棩蹇椼�佹巿鏉冩棩蹇楋紝浠ュ強绠$悊鍛樼殑浠ヤ笂涓夌鏃ュ織)
+ * @author ludc
+ * @date 2023/11/24 10:51
+ */
+@Service
+public class LogOperateServiceImpl extends ServiceImpl<LogOperateMapper,LogOperate> implements ILogOperateService {
+
+	@Autowired
+	private LogOperateMapper logOperateMapper;
+
+	/**
+	 * 淇濆瓨鎿嶄綔鏃ュ織
+	 * @param logOperate
+	 * @return
+	 */
+	@Override
+	public boolean saveLogOperate(LogOperate logOperate) {
+		if(Func.isEmpty(logOperate)){
+			return false;
+		}
+		return SqlHelper.retBool(logOperateMapper.insert(logOperate));
+	}
+
+	/**
+	 * 鏉′欢鏌ヨ鑾峰彇鏃ュ織鍒楄〃
+	 * @param logOperate
+	 * @return
+	 */
+	@Override
+	public List<LogOperate> listByCondition(LogOperate logOperate) {
+		QueryWrapper<LogOperate> queryWrapper = Condition.getQueryWrapper(logOperate);
+		this.list(queryWrapper);
+		return this.list(queryWrapper);
+	}
+
+}
diff --git a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/FileController.java b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/FileController.java
index b81f862..626effe 100644
--- a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/FileController.java
+++ b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/FileController.java
@@ -1,6 +1,7 @@
 package com.vci.ubcs.resource.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.common.utils.StringUtils;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.vci.ubcs.resource.dto.FileObjectDTO;
 import com.vci.ubcs.resource.dto.FileReleaseDTO;
@@ -24,6 +25,7 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.Collection;
 import java.util.List;
@@ -38,36 +40,40 @@
 @Slf4j
 public class FileController {
 
-    /**
-     * 鏂囦欢鏈嶅姟
-     */
-    @Autowired
-    private IFileService fileService;
+	/**
+	 * 鏂囦欢鏈嶅姟
+	 */
+	@Autowired
+	private IFileService fileService;
 
-    /**
-     * 鏍规嵁鏂囦欢涓婚敭涓嬭浇鏂囦欢
-     * @param fileOids 鏂囦欢鐨勪富閿�
-     * @param response 鍝嶅簲鐨勫璞�
-     * @return 鎵ц缁撴灉锛屽彧鏈変笅杞藉け璐ョ殑鏃跺�欐墠浼氳繖鏍�
-     */
+	/**
+	 * 鏍规嵁鏂囦欢涓婚敭涓嬭浇鏂囦欢
+	 * @param fileOids 鏂囦欢鐨勪富閿�
+	 * @param response 鍝嶅簲鐨勫璞�
+	 * @return 鎵ц缁撴灉锛屽彧鏈変笅杞藉け璐ョ殑鏃跺�欐墠浼氳繖鏍�
+	 */
 	@RequestMapping(value = "/downloadFilesByOids",method = {RequestMethod.GET,RequestMethod.POST})
-	public String downloadFilesByOids(@RequestParam String fileOids, HttpServletResponse response){
-		try{
+	public void downloadFilesByOids(@RequestParam String fileOids, HttpServletResponse response) throws IOException {
+		try {
+			//ControllerUtil.writeFileToResponse(response,excelName);
 			FileDownloadUtil.downloadFile(response, fileService.downloadFileByOids(VciBaseUtil.str2List(fileOids)));
-		}catch (Throwable e){
-			return JSON.toJSONString(R.fail(LangBaseUtil.getErrorMsg(e)));
+		} catch (Throwable e) {
+			//濡傛灉鍑洪敊,鎶婇敊璇俊鎭啓鍒皌ext
+			String msg = LangBaseUtil.getErrorMsg(e);
+			if(StringUtils.isBlank(msg)){
+				msg = "鏈煡閿欒";
+			}
+			ControllerUtil.writeDataToResponse(response,msg.getBytes(StandardCharsets.UTF_8),null);
 		}
-		//鍥犱负璁剧疆浜嗗搷搴攃ontentType,鎵�浠ヨ繖鍎夸笉鑳藉啀鐩存帴杩斿洖R浜嗭紝鍙兘浼氬鑷存姤閿�
-		return JSON.toJSONString(R.success("涓嬭浇瀹屾垚")) ;
 	}
 
-    /**
-     * 鏂囦欢鍒犻櫎
-     * @param oids 鏂囦欢鐨勪富閿�
-     * @return 鏂囦欢鍐呭
-     */
-    @DeleteMapping("/deleteFile")
-    public R deleteFile(@RequestBody Collection<String> oids){
+	/**
+	 * 鏂囦欢鍒犻櫎
+	 * @param oids 鏂囦欢鐨勪富閿�
+	 * @return 鏂囦欢鍐呭
+	 */
+	@DeleteMapping("/deleteFile")
+	public R deleteFile(@RequestBody Collection<String> oids){
 		try {
 			fileService.deleteFiles(oids);
 		}catch (Throwable e){
@@ -79,104 +85,104 @@
 			log.debug(msg);
 			return R.fail(msg);
 		}
-        return R.success("鍒犻櫎鎴愬姛");
-    }
+		return R.success("鍒犻櫎鎴愬姛");
+	}
 
-    /**
-     * 鍓嶇椤甸潰鍗曟枃浠朵笂浼犮��(鍏堟暟鎹紝鍚庢枃浠舵ā寮忎笂浼�)
-     * @param file 涓婁紶鐨勬枃浠�
-     * @param fileObjectDTO 鏂囦欢淇℃伅浼犺緭瀵硅薄
-     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
-     */
-    @PostMapping("/uploadFile")
-    public R<FileObjectVO> uploadFile(MultipartFile file, FileObjectDTO fileObjectDTO){
-        if (file != null ) {
-            return fileService.uploadFile(file, fileObjectDTO);
-        } else {
-            return R.fail("鏃犱笂浼犵殑鏂囦欢");
-        }
-    }
+	/**
+	 * 鍓嶇椤甸潰鍗曟枃浠朵笂浼犮��(鍏堟暟鎹紝鍚庢枃浠舵ā寮忎笂浼�)
+	 * @param file 涓婁紶鐨勬枃浠�
+	 * @param fileObjectDTO 鏂囦欢淇℃伅浼犺緭瀵硅薄
+	 * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
+	 */
+	@PostMapping("/uploadFile")
+	public R<FileObjectVO> uploadFile(MultipartFile file, FileObjectDTO fileObjectDTO){
+		if (file != null ) {
+			return fileService.uploadFile(file, fileObjectDTO);
+		} else {
+			return R.fail("鏃犱笂浼犵殑鏂囦欢");
+		}
+	}
 
-    /**
-     * 鍦ㄤ笂浼犳枃浠跺悗锛屼繚瀛樻枃浠剁殑淇℃伅
-     * @param fileObjectDTO 鏂囦欢淇℃伅浼犺緭瀵硅薄
-     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
-     */
-    @PostMapping("/saveFileAfterUpload")
-    public R<FileObjectVO> saveFileAfterUpload( @RequestBody FileObjectDTO fileObjectDTO){
-       return fileService.saveFileAfterUpload(fileObjectDTO);
-    }
+	/**
+	 * 鍦ㄤ笂浼犳枃浠跺悗锛屼繚瀛樻枃浠剁殑淇℃伅
+	 * @param fileObjectDTO 鏂囦欢淇℃伅浼犺緭瀵硅薄
+	 * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
+	 */
+	@PostMapping("/saveFileAfterUpload")
+	public R<FileObjectVO> saveFileAfterUpload( @RequestBody FileObjectDTO fileObjectDTO){
+		return fileService.saveFileAfterUpload(fileObjectDTO);
+	}
 
-    /**
-     * 灏嗗師鏁版嵁涓嬬殑鎵�鏈夋枃浠跺叡浜埌鍏朵粬鐨勪笟鍔℃暟鎹笅
-     * @param shareDTO 鏂囦欢鍒嗕韩
-     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄,鏄涓�
-     */
-    @PostMapping("/shareFiles")
-    public R<List<FileObjectVO>> shareFiles(@RequestBody FileShareDTO shareDTO){
-        return fileService.shareFiles(shareDTO);
-    }
+	/**
+	 * 灏嗗師鏁版嵁涓嬬殑鎵�鏈夋枃浠跺叡浜埌鍏朵粬鐨勪笟鍔℃暟鎹笅
+	 * @param shareDTO 鏂囦欢鍒嗕韩
+	 * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄,鏄涓�
+	 */
+	@PostMapping("/shareFiles")
+	public R<List<FileObjectVO>> shareFiles(@RequestBody FileShareDTO shareDTO){
+		return fileService.shareFiles(shareDTO);
+	}
 
 
-    /**
-     * 淇敼鏂囦欢淇℃伅(涓嶅惈鏂囦欢),娉ㄦ剰objectName鍜宖ilePath涓嶄細鍙樺寲
-     * @param fileDTOs 鏂囦欢鐨勬暟鎹璞�
-     * @return 鎵ц缁撴灉
-     */
-    @PostMapping("/updateFileInfos")
-    public R updateFileInfos(@RequestBody Collection<FileObjectDTO> fileDTOs){
-        return fileService.updateFileInfos(fileDTOs);
-    }
+	/**
+	 * 淇敼鏂囦欢淇℃伅(涓嶅惈鏂囦欢),娉ㄦ剰objectName鍜宖ilePath涓嶄細鍙樺寲
+	 * @param fileDTOs 鏂囦欢鐨勬暟鎹璞�
+	 * @return 鎵ц缁撴灉
+	 */
+	@PostMapping("/updateFileInfos")
+	public R updateFileInfos(@RequestBody Collection<FileObjectDTO> fileDTOs){
+		return fileService.updateFileInfos(fileDTOs);
+	}
 
-    /**
-     * 鏂囦欢鐢熸晥
-     * @param ids 鏂囦欢鐨勪富閿�
-     * @return 鎵ц缁撴灉
-     */
-    @PutMapping("/releasedFiles")
-    public R releasedFiles(@RequestBody Collection<String> ids){
-        return fileService.releasedFiles(ids);
-    }
+	/**
+	 * 鏂囦欢鐢熸晥
+	 * @param ids 鏂囦欢鐨勪富閿�
+	 * @return 鎵ц缁撴灉
+	 */
+	@PutMapping("/releasedFiles")
+	public R releasedFiles(@RequestBody Collection<String> ids){
+		return fileService.releasedFiles(ids);
+	}
 
-    /**
-     * 鎵归噺鎸囧畾鏂囦欢涓氬姟鏁版嵁鍚庣敓鏁�
-     * @param releaseDTOS 鐢熸晥鐨勭浉鍏充俊鎭�
-     * @return 鎵ц缁撴灉
-     */
-    @PutMapping("/releasedFilesForOwn")
-    public R releasedFilesForOwn(@RequestBody Collection<FileReleaseDTO> releaseDTOS){
-        return fileService.releasedFilesForOwn(releaseDTOS);
-    }
+	/**
+	 * 鎵归噺鎸囧畾鏂囦欢涓氬姟鏁版嵁鍚庣敓鏁�
+	 * @param releaseDTOS 鐢熸晥鐨勭浉鍏充俊鎭�
+	 * @return 鎵ц缁撴灉
+	 */
+	@PutMapping("/releasedFilesForOwn")
+	public R releasedFilesForOwn(@RequestBody Collection<FileReleaseDTO> releaseDTOS){
+		return fileService.releasedFilesForOwn(releaseDTOS);
+	}
 
 
-    /**
-     * 浣跨敤涓氬姟绫诲瀷鏌ヨ鏂囦欢鐨勪俊鎭紝鎻愪緵缁欓〉闈㈣皟鐢�
-     * @param fileQuery 鏌ヨ瀵硅薄
-     * @return 鏂囦欢鐨勬樉绀哄璞�
-     */
-    @RequestMapping(value = "/listFiles",method = {RequestMethod.GET,RequestMethod.POST})
-    public R<IPage<FileObjectVO>> listFiles(FileQuery fileQuery, Query query){
-        return R.data(fileService.listFiles(fileQuery,query));
-    }
+	/**
+	 * 浣跨敤涓氬姟绫诲瀷鏌ヨ鏂囦欢鐨勪俊鎭紝鎻愪緵缁欓〉闈㈣皟鐢�
+	 * @param fileQuery 鏌ヨ瀵硅薄
+	 * @return 鏂囦欢鐨勬樉绀哄璞�
+	 */
+	@RequestMapping(value = "/listFiles",method = {RequestMethod.GET,RequestMethod.POST})
+	public R<IPage<FileObjectVO>> listFiles(FileQuery fileQuery, Query query){
+		return R.data(fileService.listFiles(fileQuery,query));
+	}
 
-    /**
-     * 浣跨敤鏂囦欢涓婚敭鑾峰彇瀵硅薄
-     * @param oid 涓婚敭
-     * @return 鏂囦欢鏄剧ず瀵硅薄
-     */
-    @GetMapping("/get")
-    public FileObjectVO get(String oid){
-        return fileService.get(oid);
-    }
+	/**
+	 * 浣跨敤鏂囦欢涓婚敭鑾峰彇瀵硅薄
+	 * @param oid 涓婚敭
+	 * @return 鏂囦欢鏄剧ず瀵硅薄
+	 */
+	@GetMapping("/get")
+	public FileObjectVO get(String oid){
+		return fileService.get(oid);
+	}
 
-    /**
-     * 浣跨敤鏂囦欢鐨勪富閿壒閲忚幏鍙栧璞�
-     * @param oids 鏂囦欢鐨勪富閿泦鍚�
-     * @return 鏂囦欢鐨勬樉绀轰俊鎭�
-     */
-    @GetMapping("/listFilesByOids")
-    public List<FileObjectVO> listFilesByOids( Collection<String> oids){
-        return fileService.listFilesByOids(oids);
-    }
+	/**
+	 * 浣跨敤鏂囦欢鐨勪富閿壒閲忚幏鍙栧璞�
+	 * @param oids 鏂囦欢鐨勪富閿泦鍚�
+	 * @return 鏂囦欢鐨勬樉绀轰俊鎭�
+	 */
+	@GetMapping("/listFilesByOids")
+	public List<FileObjectVO> listFilesByOids( Collection<String> oids){
+		return fileService.listFilesByOids(oids);
+	}
 
 }
diff --git a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/application-prod.yml b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/application-prod.yml
index d80f6c2..080f06c 100644
--- a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/application-prod.yml
+++ b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/application-prod.yml
@@ -23,7 +23,3 @@
   secret-key: Reo4wW8EWF4gSizUmVsNjWfbDZzR3rBYFn5Jehd9
   bucket-name: vci-ubcs
 
-#鍏抽棴椹煎嘲鍛藉悕鏄犲皠
-mybatis-plus:
-  configuration:
-    map-underscore-to-camel-case: false
diff --git a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/mapper/AttachMapper.xml b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/mapper/AttachMapper.xml
index 81ffb52..c29205b 100644
--- a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/mapper/AttachMapper.xml
+++ b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/mapper/AttachMapper.xml
@@ -22,7 +22,7 @@
 
 
     <select id="selectAttachPage" resultMap="attachResultMap">
-        select * from blade_attach where is_deleted = 0
+        select * from blade_attach where isdeleted = 0
     </select>
 
 </mapper>
diff --git a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/mapper/SmsMapper.xml b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/mapper/SmsMapper.xml
index 002cc0f..ac43f88 100644
--- a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/mapper/SmsMapper.xml
+++ b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/resources/mapper/SmsMapper.xml
@@ -24,7 +24,7 @@
 
 
     <select id="selectSmsPage" resultMap="smsResultMap">
-        select * from pl_sys_sms where is_deleted = 0
+        select * from pl_sys_sms where isdeleted = 0
     </select>
 
 </mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/DockingPreAttrMappingServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/DockingPreAttrMappingServiceImpl.java
index 9c6eef1..86a2b9b 100644
--- a/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/DockingPreAttrMappingServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/DockingPreAttrMappingServiceImpl.java
@@ -225,7 +225,7 @@
 		try {
 			count = dockingPreAttrMappingMapper.selectCount(Wrappers.<DockingPreAttrMapping>query().lambda().eq(DockingPreAttrMapping::getTargetClassifyId, targetClassifyId).eq(DockingPreAttrMapping::getSourceClassifyId,sourceClassifyId));
 		}catch (Throwable e){
-			e.printStackTrace();;
+			e.printStackTrace();
 		} finally {
 			return  count>0?true:false;
 		}
diff --git a/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/GroupMdmInterServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/GroupMdmInterServiceImpl.java
index b0535f1..3db3194 100644
--- a/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/GroupMdmInterServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/GroupMdmInterServiceImpl.java
@@ -471,7 +471,7 @@
 			}
 			return R.success(message);
 		}catch (Throwable e){
-			e.printStackTrace();;
+			e.printStackTrace();
 			log.error("鑾峰彇鏁版嵁妯″瀷澶辫触"+e);
 			R.fail(message);
 		}
@@ -537,7 +537,7 @@
 			}
 
 		}catch (Throwable e){
-			e.printStackTrace();;
+			e.printStackTrace();
 			log.error("鑾峰彇鐢宠鍗曠姸鎬佸け璐�"+e);
 			throw  new VciBaseException(message);
 		}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/CodeApplication.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/CodeApplication.java
index ac7770b..5886f2d 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/CodeApplication.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/CodeApplication.java
@@ -16,12 +16,10 @@
  */
 package com.vci.ubcs.code;
 
-import com.vci.ubcs.starter.util.VciSpringUtil;
 import org.springblade.core.cloud.client.UbcsCloudApplication;
 import org.springblade.core.launch.UbcsApplication;
 import org.springblade.core.launch.constant.AppConstant;
 import org.springframework.context.annotation.ComponentScan;
-import org.springframework.stereotype.Component;
 
 /**
  * Code鍚姩鍣�
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeSyncUniversalController.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeSyncUniversalController.java
index 44ea636..0f2f922 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeSyncUniversalController.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeSyncUniversalController.java
@@ -71,7 +71,7 @@
 			this.setHttpToThreadLocal(request);
 			result= universalInterfaceI.syncEditData(dataString,dataType);
 		}catch (Throwable e){
-			e.printStackTrace();;
+			e.printStackTrace();
 			logger.error("syncData->"+e.getMessage());
 		}
 		return result;
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeApplyWebManagementServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeApplyWebManagementServiceImpl.java
index f43d83a..a0be413 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeApplyWebManagementServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeApplyWebManagementServiceImpl.java
@@ -48,7 +48,7 @@
 		QueryWrapper<SystemClassifyRole> wrapper = new QueryWrapper<>();
 		wrapper.eq("systemOid",systemOid);
 		wrapper.eq("systemId",systemId);
-		List<SystemClassifyRole> systemClassifyRoles = this.listByIds(roleList.stream().map(SystemClassifyRole ::getOid).collect(Collectors.toList()));;
+		List<SystemClassifyRole> systemClassifyRoles = this.listByIds(roleList.stream().map(SystemClassifyRole ::getOid).collect(Collectors.toList()));
 		this.remove(wrapper);
 		List<SystemClassifyRole> newSCRoles = new ArrayList<>();
 		//鏁版嵁澶勭悊
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
index 91912c7..dd02c8d 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -1961,7 +1961,7 @@
         String sqlHasPage = pageHelper.getLimit() > 0 ? ("select * from (select A.*,rownum RN from (" + sql + whereSubfixForPage) : sql;
         String sqlCount = "select count(1) from " + tableName + SPACE + "t" + SPACE + joinTableList.values().stream().collect(Collectors.joining(SPACE))
                 + (StringUtils.isBlank(whereSql) ? "" : " where ") + whereSql;
-		String sqlId = "select ID from " + tableName + SPACE + "t" + SPACE + joinTableList.values().stream().collect(Collectors.joining(SPACE))
+		String sqlId = "select t.ID from " + tableName + SPACE + "t" + SPACE + joinTableList.values().stream().collect(Collectors.joining(SPACE))
 			+ (StringUtils.isBlank(whereSql) ? "" : " where ") + whereSql;
         CodeTemplateAttrSqlBO sqlBO = new CodeTemplateAttrSqlBO();
         sqlBO.setTableName(tableName);
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
index 6235f08..c168c16 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
@@ -885,7 +885,7 @@
 			String idFieldName = attrVOS.stream().filter(s -> VciQueryWrapperForDO.ID_FIELD.equalsIgnoreCase(s.getId())).findFirst().orElseGet(() -> new CodeClassifyTemplateAttrVO()).getName();
 			getFieldIndexMap(titleRowData, attrNameIdMap, fieldIndexMap);
 			//鍏堜笉鐢ㄧ灞炴�ф槸鍚﹂兘瀛樺湪锛屽厛杞崲涓�涓嬫暟鎹�
-			List<ClientBusinessObject> cboList = new CopyOnWriteArrayList<>();
+			List<ClientBusinessObject> cboList = new ArrayList<>();
 			String fullPath = getFullPath(classifyFullInfo);
 			//鎴戜滑闇�瑕佽幏鍙栧埌鎵�鏈夌殑涓嬬骇鍒嗙被鐨刼id鐨勮矾寰勶紝鍥犱负鍚庨潰闇�瑕�
 			Map<String/**涓婚敭**/, String/**璺緞**/> childOidPathMap = getChildClassifyPathMap(classifyFullInfo, fullPath);
@@ -2020,9 +2020,10 @@
 		//鏈�鍚庡紕缁勫悎瑙勫垯
 		batchSwitchComponentAttrOnOrder(attrVOS,cboList);
 		//3.鍒ゆ柇鍏抽敭灞炴��
-		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,errorMap);
+		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,errorKeyMap);
 		Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
 		Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
+
 		Map<String,List<String>>keyAttrOkOidTORepeatOidMap= keyResultVO.getKeyAttrOkOidTORepeatOidMap();
 		if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
 			selfRepeatRowIndexList.stream().forEach(rowIndex->{
@@ -2052,7 +2053,11 @@
                 resultDataObjectDetailDO.setMsg(errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅" );
                 resultDataObjectDetailDOs.add(resultDataObjectDetailDO);
                 */
-				errorKeyMap.put(rowIndex, "鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorMap.getOrDefault(rowIndex,""));
+				Map<String, List<BaseModel>> indexTODataMap=keyResultVO.getIndexTODataMap();
+				if(indexTODataMap.containsKey(rowIndex)){
+					List<BaseModel> baseModelList= indexTODataMap.get(rowIndex);
+				}
+				errorKeyMap.put(rowIndex, "鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorKeyMap.getOrDefault(rowIndex,""));
 			});
 		}
 		//鏍¢獙灞炴�ф槸鍚︽纭敊璇俊鎭�
@@ -2688,7 +2693,7 @@
 				return;
 			}
 			//final String[] sql = {"select count(*) from " + tableName + " t where 1 = 1 "};
-			final String[] sql = {"select id from " + tableName + " t where 1 = 1 "};
+			final String[] sql = {"select t.id from " + tableName + " t where 1 = 1 "};
 			conditionMap.forEach((key, value) -> {
 				if(StringUtils.isBlank(value)||value.equals(QueryOptionConstant.ISNULL)){
 					sql[0] += " and " + key + " is null ";
@@ -3775,7 +3780,7 @@
 			if(!CollectionUtils.isEmpty(nullRowIndex)){
 				String checkAttr = requiredAttrMap.values().stream().map(CodeClassifyTemplateAttrVO::getName).collect(Collectors.joining(","));
 				nullRowIndex.stream().forEach(rowIndex->{
-					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鏍¢獙瑙勫垯涓嶉�氳繃锛屾湁鏍¢獙鐨勫睘鎬т负" + checkAttr);
+					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鏍¢獙瑙勫垯蹇呭~椤逛笉閫氳繃锛屽鏋滄湁蹇呭~灞炴�т负绌猴紝鍒欏~銆�/銆戜唬鏇�,鏈夋牎楠岀殑灞炴�т负" + checkAttr);
 				});
 			}
 		}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java
index e468dc1..56d77fd 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java
@@ -1070,7 +1070,7 @@
 				}
 			});
 		}catch (Throwable e){
-			e.printStackTrace();;
+			e.printStackTrace();
 			msg="缂栫爜鏇存敼/鐘舵�佹洿鏀�/鍒犻櫎:"+e.getMessage();
           /*  XMLResultSystemVO XMLResultSystemVO=new XMLResultSystemVO();
             XMLResultSystemVO.setErrorid(errorid);
@@ -1254,7 +1254,7 @@
 			issucess=true;
 			resultData.setLibrary(libraryVo);
 		}catch (Throwable e){
-			e.printStackTrace();;
+			e.printStackTrace();
 			msg="鏌ヨ鍒嗙被澶辫触:"+e.getMessage();
 		}finally {
 			resultData.setErrorid(errorid);
@@ -1473,7 +1473,7 @@
 				msg = "鎺ュ彛鍙傛暟锛歭ibrary 鏈煡璇㈠埌瀵瑰簲鐨勫簱鑺傜偣淇℃伅";
 			}
 		}catch (Throwable e){
-			e.printStackTrace();;
+			e.printStackTrace();
 			msg="鏌ヨ鏁版嵁澶辫触:"+e.getMessage();
 		}finally {
 			resultDataVO.setErrorid(errorid);
@@ -1925,7 +1925,7 @@
 			issucess=true;
 			resultClassifyRuleData.setLibrary(resultLibraryVO);
 		}catch (Throwable e){
-			e.printStackTrace();;
+			e.printStackTrace();
 			msg="鏌ヨ鍒嗙被澶辫触:"+e.getMessage();
 		}finally {
 			resultClassifyRuleData.setErrorid(errorid);
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeButtonWrapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeButtonWrapper.java
index c178bcd..fd8b3a2 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeButtonWrapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeButtonWrapper.java
@@ -38,7 +38,7 @@
 
 	@Override
 	public CodeButtonVO entityVO(CodeButton codebutton) {
-		CodeButtonVO codebuttonVO = new CodeButtonVO();;
+		CodeButtonVO codebuttonVO = new CodeButtonVO();
 		BeanUtilForVCI.copyPropertiesIgnoreCase(codebutton,codebuttonVO);
 		Objects.requireNonNull(codebuttonVO);
 		codebuttonVO.setUsedpositiontypeText(DictCache.getValue("codeButtonPosition", codebutton.getUsedPositionType()));
diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MdmCountConfigController.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MdmCountConfigController.java
index 49d1bdf..49f7db5 100644
--- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MdmCountConfigController.java
+++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MdmCountConfigController.java
@@ -30,5 +30,4 @@
 		return countConfigService.saveMdmCountConfig(mdmCountConfigVO);
 	}
 
-
 }

--
Gitblit v1.9.3