Browse Source

feat:系统添加水印
fix:替换系统logo,企业端-动态表-只要里面有年度的值,状态就显示为“已上传”,复核按钮文字提示调整:点击此按钮任务环节将退回到实地审核,去掉财务数据表数据存储表名称字段,调整调查表名称宽度

luzhixia 3 tuần trước cách đây
mục cha
commit
48de2d33af

BIN
public/logo.png


+ 10 - 0
src/App.vue

@@ -11,6 +11,7 @@
     <keep-alive :include="keepaliveIncludes">
       <router-view />
     </keep-alive>
+    <Watermark :text="username" />
   </div>
 </template>
 
@@ -21,12 +22,17 @@
   import variables from '@/styles/variables.scss'
   import _ from 'lodash'
   import * as dd from 'dingtalk-jsapi'
+  import Watermark from '@/components/commons/Watermark.vue'
   export default {
     name: 'App',
+    components: {
+      Watermark,
+    },
     computed: {
       ...mapGetters({
         style: 'settings/style',
         themeColor: 'settings/themeColor',
+        username: 'user/username',
       }),
       variables() {
         return variables
@@ -41,6 +47,10 @@
       }
     },
     created() {
+      // 确保用户信息已加载
+      if (!this.username && this.$store.state.user.accessToken) {
+        this.$store.dispatch('user/getUserInfo')
+      }
       // 因为resize事件在整个项目中只能监听一次,所以这里通过全局广播发送这个事件
       window.onresize = _.debounce(() => {
         this.$root.$emit('resize')

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
src/assets/index_images/empty.svg


BIN
src/assets/index_images/logo.png


BIN
src/assets/top_images/logo.png


+ 118 - 0
src/components/commons/Watermark.vue

@@ -0,0 +1,118 @@
+<template>
+  <div ref="watermarkContainer" class="watermark-container">
+    <canvas ref="watermarkCanvas" class="watermark-canvas"></canvas>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'Watermark',
+    props: {
+      text: {
+        type: String,
+        default: '',
+      },
+      fontSize: {
+        type: Number,
+        default: 16,
+      },
+      color: {
+        type: String,
+        default: 'rgba(219, 219, 219)',
+      },
+      angle: {
+        type: Number,
+        default: -25,
+      },
+    },
+    data() {
+      return {
+        isInit: false,
+      }
+    },
+    watch: {
+      text: {
+        handler() {
+          this.drawWatermark()
+        },
+        immediate: true,
+      },
+    },
+    mounted() {
+      this.initWatermark()
+      window.addEventListener('resize', this.handleResize)
+    },
+    beforeDestroy() {
+      window.removeEventListener('resize', this.handleResize)
+    },
+    methods: {
+      initWatermark() {
+        this.isInit = true
+        this.drawWatermark()
+      },
+      drawWatermark() {
+        if (!this.isInit || !this.text) return
+
+        const canvas = this.$refs.watermarkCanvas
+        const ctx = canvas.getContext('2d')
+        const container = this.$refs.watermarkContainer
+
+        // 设置canvas大小与容器一致
+        canvas.width = container.offsetWidth || window.innerWidth
+        canvas.height = container.offsetHeight || window.innerHeight
+
+        // 清空画布
+        ctx.clearRect(0, 0, canvas.width, canvas.height)
+
+        // 设置水印样式
+        ctx.font = `${this.fontSize}px Arial`
+        ctx.fillStyle = this.color
+        ctx.textAlign = 'center'
+        ctx.textBaseline = 'middle'
+        ctx.globalAlpha = 0.8 // 增加全局透明度
+        // 计算水印间距和布局 - 调整为5*5分布
+        const textWidth = ctx.measureText(this.text).width
+        // 计算5*5分布需要的间距,进一步减小垂直间距
+        const gapX = canvas.width / 5
+        const gapY = canvas.height / 5
+
+        // 调整起始位置,确保边缘水印完整显示
+        const startX = textWidth * 2
+        const startY = textWidth * 1.2
+
+        // 绘制重复的水印,实现5*5分布
+        for (let x = startX; x < canvas.width; x += gapX) {
+          for (let y = startY; y < canvas.height; y += gapY) {
+            ctx.save()
+            ctx.translate(x, y)
+            ctx.rotate((Math.PI / 180) * this.angle)
+            ctx.fillText(this.text, 0, 0)
+            ctx.restore()
+          }
+        }
+      },
+      handleResize() {
+        this.$nextTick(() => {
+          this.drawWatermark()
+        })
+      },
+    },
+  }
+</script>
+
+<style scoped>
+  .watermark-container {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    pointer-events: none;
+    z-index: 9998;
+  }
+
+  .watermark-canvas {
+    width: 100%;
+    height: 100%;
+  }
+</style>

+ 51 - 0
src/components/commons/empty.vue

@@ -0,0 +1,51 @@
+<template>
+  <div class="empty-container">
+    <img
+      src="@/assets/index_images/empty.svg"
+      alt="暂无数据"
+      class="empty-image"
+    />
+    <p class="empty-text">{{ text }}</p>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'Empty',
+    props: {
+      text: {
+        type: String,
+        default: '暂无数据',
+      },
+    },
+  }
+</script>
+
+<style scoped>
+  .empty-container {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    padding: 60px 20px;
+    text-align: center;
+    width: 100%;
+    height: 100%;
+  }
+
+  .empty-image {
+    width: 200px;
+    height: 200px;
+    margin-bottom: 20px;
+    display: block;
+    object-fit: contain;
+    margin-left: auto;
+    margin-right: auto;
+  }
+
+  .empty-text {
+    font-size: 14px;
+    color: #ccc;
+    margin: 0;
+  }
+</style>

+ 14 - 13
src/components/layouts/HtTopBar/index.vue

@@ -5,22 +5,22 @@
 
       <el-row class="top-bar-row">
         <el-col
-          :xl="3"
-          :lg="6"
-          :md="6"
-          :sm="6"
-          :xs="6"
+          :xl="4"
+          :lg="7"
+          :md="7"
+          :sm="7"
+          :xs="7"
           class="top-bar-row-logo"
         >
           <img src="@/assets/top_images/logo.png" class="logo-padding" />
         </el-col>
 
         <el-col
-          :xl="16"
-          :lg="14"
-          :md="14"
-          :sm="14"
-          :xs="14"
+          :xl="15"
+          :lg="13"
+          :md="13"
+          :sm="13"
+          :xs="13"
           class="top-bar-center"
         >
           <!-- <div v-show="menuLeft < 0" class="menu-left" @click="leftClick">
@@ -271,10 +271,11 @@
       background: url('~@/assets/top_images/h-back.png');
 
       .top-bar-row {
-        width: 92% !important;
+        width: 100% !important;
         margin: auto;
         display: flex;
         align-items: center;
+        padding: 0 $base-padding;
         .top-bar-row-logo {
           // width: 180px;
           // lj-修改
@@ -344,10 +345,10 @@
         }
       }
       .logo-padding {
-        padding-left: $base-logo-padding-left;
+        // padding-left: $base-logo-padding-left;
         background: transparent !important;
         //height: var(--calcRatio);
-        width: calc(var(--calcRatio) * 50px);
+        width: calc(var(--calcRatio) * 360px);
       }
       .menu-more-wrap {
         height: $base-top-bar-height;

+ 102 - 6
src/views/EntDeclaration/auditTaskManagement/components/DataRequirementsTab.vue

@@ -158,13 +158,30 @@
       >
         <template slot-scope="scope">
           <span v-if="!scope.row.isCategoryHeader">
-            <span
-              v-if="scope.row.isUpload === 1 || scope.row.isUpload === '1'"
-              style="color: #67c23a"
-            >
-              已上传
+            <span v-if="scope.row.informationName == '动态表'">
+              <span
+                v-if="uploadStatusMap[scope.row.id] === '已上传'"
+                style="color: #67c23a"
+              >
+                {{ uploadStatusMap[scope.row.id] || '-' }}
+              </span>
+              <span
+                v-else-if="uploadStatusMap[scope.row.id] === '未上传'"
+                class="text-danger"
+              >
+                {{ uploadStatusMap[scope.row.id] }}
+              </span>
+              <span v-else>-</span>
+            </span>
+            <span v-else>
+              <span
+                v-if="scope.row.isUpload === 1 || scope.row.isUpload === '1'"
+                style="color: #67c23a"
+              >
+                已上传
+              </span>
+              <span v-else class="text-danger">未上传</span>
             </span>
-            <span v-else class="text-danger">未上传</span>
           </span>
         </template>
       </el-table-column>
@@ -418,6 +435,7 @@
         fixedFields: '',
         fixedFieldids: '',
         columnsMeta: [],
+        uploadStatusMap: {},
       }
     },
     // ...
@@ -454,8 +472,86 @@
           }
         },
       },
+      // 监听dataRequirements变化,预加载所有动态表上传状态
+      dataRequirements: {
+        immediate: true,
+        deep: true,
+        handler(newVal, oldVal) {
+          if (newVal && newVal.length > 0) {
+            this.preloadAllDynamicTableStatus()
+          }
+        },
+      },
     },
     methods: {
+      // 异步获取上传状态并直接更新row属性
+      async fetchUploadStatus(row) {
+        try {
+          const uploadId = row.uploadId || row.id || ''
+          const auditedUnitId = this.auditedUnitId || row.auditedUnitId || ''
+          const catalogId = row.catalogId || ''
+          const surveyTemplateId = this.getSurveyTemplateId(row)
+
+          const params = {
+            uploadId,
+            auditedUnitId,
+            catalogId,
+            surveyTemplateId,
+            type: 2,
+          }
+
+          const res = await getDynamicTableData(params)
+
+          // 直接更新row的uploadStatus属性
+          if (res && res.code === 200) {
+            const records = res.value?.records || res.value || []
+            this.$set(
+              this.uploadStatusMap,
+              uploadId,
+              records.length > 0 ? '已上传' : '未上传'
+            )
+          } else {
+            this.uploadStatusMap[uploadId] = ''
+          }
+
+          // 触发表格更新
+          this.$nextTick(() => {
+            this.$forceUpdate()
+          })
+        } catch (error) {
+          console.error('获取上传状态失败:', error)
+          // 错误情况下更新为未上传状态
+          row.uploadStatus = '未上传'
+          // 确保表格更新
+          this.$nextTick(() => {
+            this.$forceUpdate()
+          })
+        }
+      },
+      // 预加载所有动态表上传状态
+      async preloadAllDynamicTableStatus() {
+        if (!this.dataRequirements || this.dataRequirements.length === 0) return
+
+        const dynamicTableRows = this.dataRequirements.filter(
+          (row) => !row.isCategoryHeader && row.informationName === '动态表'
+        )
+
+        // 并行请求所有动态表的上传状态,不设置初始加载状态
+        const promises = dynamicTableRows.map((row) => {
+          return this.fetchUploadStatus(row)
+        })
+
+        try {
+          await Promise.all(promises)
+        } catch (error) {
+          console.error('预加载上传状态失败:', error)
+        } finally {
+          // 确保表格更新
+          this.$nextTick(() => {
+            this.$forceUpdate()
+          })
+        }
+      },
       // 在线填报入口:与 CostSurveyTab 一致
       async handleOnlineSubmission(row) {
         if (!row) return

+ 1 - 1
src/views/costAudit/auditInfo/auditManage/mainDetails.vue

@@ -27,7 +27,7 @@
             v-if="currentNode === 'yjfk'"
             class="item"
             effect="dark"
-            content="点击此按钮任务环节将退回到实审核"
+            content="点击此按钮任务环节将退回到实审核"
             placement="top-start"
           >
             <el-button

+ 12 - 12
src/views/costAudit/baseInfo/catalogManage/index.vue

@@ -819,7 +819,7 @@
       <el-dialog
         title="选择模板"
         :visible.sync="templateDialogVisible"
-        width="50%"
+        width="40%"
         :close-on-click-modal="false"
       >
         <cost-audit-table
@@ -849,7 +849,7 @@
       <el-dialog
         title="关联成本调查表"
         :visible.sync="costSurveyDialogVisible"
-        width="50%"
+        width="40%"
         :close-on-click-modal="false"
       >
         <cost-audit-table
@@ -1100,7 +1100,7 @@
           {
             prop: 'templateType',
             label: '模版类型',
-            width: '100px',
+            width: '120px',
             formatter: (row) => {
               return row.templateType == '1'
                 ? '单记录'
@@ -1109,14 +1109,14 @@
                 : '动态表'
             },
           },
-          {
-            prop: 'storageTable',
-            label: '财务数据表数据存储表名称',
-          },
+          // {
+          //   prop: 'storageTable',
+          //   label: '财务数据表数据存储表名称',
+          // },
           {
             prop: 'status',
             label: '状态',
-            width: '100px',
+            width: '120px',
             formatter: (row) => {
               return row.status == '-1'
                 ? '草稿'
@@ -1129,7 +1129,7 @@
             prop: 'createTime',
             label: '创建时间',
             slotName: 'createTime',
-            width: '100px',
+            width: '150px',
           },
         ],
 
@@ -1303,7 +1303,7 @@
           {
             prop: 'templateType',
             label: '模版类型',
-            width: '100px',
+            width: '120px',
             formatter: (row) => {
               return row.templateType == '1'
                 ? '单记录'
@@ -1319,7 +1319,7 @@
           {
             prop: 'status',
             label: '状态',
-            width: '100px',
+            width: '120px',
             formatter: (row) => {
               return row.status == '-1'
                 ? '草稿'
@@ -1332,7 +1332,7 @@
             prop: 'createTime',
             label: '创建时间',
             slotName: 'createTime',
-            width: '100px',
+            width: '150px',
           },
         ]
       },

+ 1 - 1
src/views/costAudit/baseInfo/catalogManage/legalDialog.vue

@@ -98,7 +98,7 @@
     <CostAuditDialog
       title="选择模板"
       :visible="templateDialogVisible"
-      width="50%"
+      width="40%"
       :close-on-click-modal="false"
       @confirm="submitTemplateForm"
       @cancel="handleTemplateCancel"

+ 2 - 1
src/views/home/index.vue

@@ -441,7 +441,7 @@
               </div>
             </el-col>
             <el-col :span="10">
-              <ul class="news-list card-content memoList">
+              <ul v-if="listTotal > 0" class="news-list card-content memoList">
                 <li
                   v-for="(item, idx) in memoList"
                   :key="idx"
@@ -514,6 +514,7 @@
                 @size-change="handleSizeChange"
                 @current-change="handleCurrentChange"
               ></el-pagination>
+              <Empty v-else></Empty>
             </el-col>
           </el-row>
         </el-card>

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác