Преглед на файлове

Merge branch 'master' of http://1.71.9.215:3000/feiyi/cbjsxt-front-master

suhp преди 1 месец
родител
ревизия
83b8021497

+ 0 - 860
src/components/layouts/HtTopBar/index copy.vue

@@ -1,860 +0,0 @@
-<template>
-  <div class="top-bar-container" :style="topStyle">
-    <div class="top-bar-main">
-      <!--      :style="{ background: variables[`${style}-menu-background`] }"-->
-
-      <el-row class="top-bar-row">
-        <el-col
-          :xl="3"
-          :lg="6"
-          :md="6"
-          :sm="6"
-          :xs="6"
-          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"
-          class="top-bar-center"
-        >
-          <!-- <div v-show="menuLeft < 0" class="menu-left" @click="leftClick">
-            <i class="el-icon-arrow-left"></i>
-          </div> -->
-          <div ref="menuScroll" class="menu-scroll menu-wrap">
-            <el-menu
-              id="menuContentRef"
-              router
-              :background-color="variables[`${style}-menu-background`]"
-              :text-color="variables[`${style}-menu-color`]"
-              :active-text-color="themeColor"
-              :style="{
-                '--menuBgColor': variables[`${style}-menu-background`],
-                left: menuLeft + 'px',
-              }"
-              :default-active="activeMenu"
-              mode="horizontal"
-              menu-trigger="hover"
-            >
-              <!-- 使用v-for遍历mockMenu数组 -->
-              <template v-for="menu in mockMenu">
-                <!-- 如果菜单没有子项,直接显示菜单项 -->
-                <el-menu-item
-                  v-if="!menu.children || menu.children.length === 0"
-                  :key="menu.index"
-                  :index="menu.index"
-                >
-                  <i :class="menu.icon"></i>
-                  <span>{{ menu.title }}</span>
-                </el-menu-item>
-
-                <!-- 如果菜单有子项,显示为子菜单 -->
-                <el-submenu v-else :key="menu.index" :index="menu.index">
-                  <template slot="title">
-                    <i :class="menu.icon"></i>
-                    <span>{{ menu.title }}</span>
-                  </template>
-
-                  <!-- 遍历子菜单 -->
-                  <template v-for="subMenu in menu.children">
-                    <!-- 子菜单可能还有孙菜单 -->
-                    <el-submenu
-                      v-if="subMenu.children && subMenu.children.length > 0"
-                      :key="subMenu.index"
-                      :index="subMenu.index"
-                    >
-                      <template slot="title">
-                        <i :class="subMenu.icon"></i>
-                        <span>{{ subMenu.title }}</span>
-                      </template>
-
-                      <!-- 遍历孙菜单 -->
-                      <el-menu-item
-                        v-for="child in subMenu.children"
-                        :key="child.index"
-                        :index="child.index"
-                      >
-                        {{ child.title }}
-                      </el-menu-item>
-                    </el-submenu>
-
-                    <!-- 如果子菜单没有孙菜单,直接显示 -->
-                    <el-menu-item
-                      v-else
-                      :key="subMenu.index"
-                      :index="subMenu.index"
-                    >
-                      <i :class="subMenu.icon"></i>
-                      <span>{{ subMenu.title }}</span>
-                    </el-menu-item>
-                  </template>
-                </el-submenu>
-              </template>
-            </el-menu>
-            <!-- <el-menu id="menuContentRef" :background-color="variables[`${style}-menu-background`]"
-              :text-color="variables[`${style}-menu-color`]" :active-text-color="themeColor" :style="{
-                '--menuBgColor': variables[`${style}-menu-background`],
-                left: menuLeft + 'px',
-              }" :default-active="activeMenu" mode="horizontal" menu-trigger="hover">
-              <template v-for="route in currentShowMenu">
-                <ht-side-bar-item v-if="!route.hidden" :key="route.id" :full-path="route.path" :item="route" />
-              </template>
-            </el-menu> -->
-          </div>
-
-          <!-- <div v-show="showRightIcon" class="menu-right" @click="rightClick">
-            <i class="el-icon-arrow-right"></i>
-          </div> -->
-        </el-col>
-
-        <el-col :xl="4" :lg="4" :md="4" :sm="4" :xs="4" class="top-bar-right">
-          <div
-            class="right-panel"
-            :style="{
-              '--topRightColor': '#ffffff',
-              // '--topRightColor': variables[`${style}-top-right-color`],
-            }"
-          >
-            <ht-message
-              :message-count="messageCount"
-              @msg-click="$router.push('/personal/message')"
-            ></ht-message>
-
-            <ht-full-screen-bar @refresh="refreshRoute" />
-
-            <!-- <ht-apps /> -->
-
-            <!-- <ht-error-log /> -->
-
-            <ht-theme-bar v-show="false" class="hidden-md-and-down" />
-
-            <el-divider direction="vertical"></el-divider>
-
-            <ht-avatar />
-          </div>
-        </el-col>
-      </el-row>
-    </div>
-  </div>
-</template>
-
-<script>
-  import variables from '@/styles/variables.scss'
-  import adjustPX from '@/mixins/adjustPX.js'
-  import { mapGetters, mapState } from 'vuex'
-
-  export default {
-    name: 'HtTopBar',
-    mixins: [adjustPX],
-    data() {
-      return {
-        menuTrigger: 'hover',
-        menuLeft: 0,
-        showRightIcon: true,
-        calcRatio: undefined,
-        // 菜单数据直接定义在data中
-        mockMenu: [
-          {
-            index: 'costAudit',
-            icon: 'el-icon-folder',
-            title: '成本监审',
-            children: [
-              {
-                index: 'costAudit/baseInfo',
-                icon: 'el-icon-document',
-                title: '基础信息管理',
-                children: [
-                  { index: '/costAudit/catalogManage', title: '监审目录管理' },
-                  {
-                    index: '/costAudit/auditEntityManage',
-                    title: '被监审单位管理',
-                  },
-                  {
-                    index: '/costAudit/costFormManage',
-                    title: '成本调查表管理',
-                  },
-                  {
-                    index: '/costAudit/financeSheetManage',
-                    title: '财务数据表管理',
-                  },
-                  {
-                    index: '/costAudit/costVerifyManage',
-                    title: '成本核定表管理',
-                  },
-                  {
-                    index: '/costAudit/auditReviewDocManage',
-                    title: '监审文书管理',
-                  },
-                  {
-                    index: '/costAudit/auditDocNoManage',
-                    title: '监审文书号管理',
-                  },
-                  {
-                    index: '/costAudit/auditProcessManage',
-                    title: '监审流程管理',
-                  },
-                  { index: '/costAudit/auditDocManage', title: '监审资料管理' },
-                  { index: '/costAudit/dictionaryManage', title: '字典项维护' },
-                ],
-              },
-              {
-                index: 'costAudit/projectInfo',
-                icon: 'el-icon-setting',
-                title: '项目信息管理',
-                children: [
-                  {
-                    index: '/costAudit/annualReviewPlan',
-                    title: '年度监审计划',
-                  },
-                  { index: '/costAudit/initiation', title: '成本监审立项管理' },
-                  { index: '/costAudit/memoManage', title: '备忘录管理' },
-                  {
-                    index: '/costAudit/taskProgressManage',
-                    title: '任务进度管理',
-                  },
-                  {
-                    index: '/costAudit/taskQueryStatistics',
-                    title: '任务查询统计',
-                  },
-                  {
-                    index: '/costAudit/superviseMattersManage',
-                    title: '督办事项管理',
-                  },
-                  {
-                    index: '/costAudit/superviseResultManage',
-                    title: '督办结果管理',
-                  },
-                ],
-              },
-            ],
-          },
-        ],
-      }
-    },
-    created() {
-      this.setRatio()
-      console.log('this.calcRatio', this.calcRatio)
-      window.addEventListener('resize', () => {
-        this.setRatio()
-      })
-    },
-    computed: {
-      topStyle() {
-        return {
-          //需要使用到的各种样式变量,可以给一个变量为空的默认值
-          '--calcRatio': this.calcRatio,
-        }
-      },
-      ...mapGetters({
-        style: 'settings/style',
-        routes: 'routes/routes',
-        themeColor: 'settings/themeColor',
-        visitedRoutes: 'tabsBar/visitedRoutes',
-        messageCount: 'navHeader/getUnreadMsgCount',
-      }),
-      ...mapState('routes', ['menus']),
-      activeMenu() {
-        const route = this.$route
-        const { meta, path } = route
-        if (meta.activeMenu) {
-          return meta.activeMenu
-        }
-        return path
-      },
-      variables() {
-        return variables
-      },
-      currentShowMenu() {
-        const menu = this.menus.find((item, index) => index === 6)
-        if (!menu) return this.routes
-        const menuIndex = this.routes.findIndex((it) => it.path === menu.path)
-        const currentMenuList = this.routes.filter(
-          (menu, index) => index <= menuIndex
-        )
-        const otherMenus = this.routes.filter(
-          (menu, index) => index > menuIndex
-        )
-        if (otherMenus && otherMenus.length > 0) {
-          currentMenuList.push({
-            alwaysShow: true,
-            children: otherMenus,
-            name: 'moreMenu',
-            meta: { icon: 'icon-gengduo2' },
-            path: '/more',
-          })
-        }
-        currentMenuList.forEach((element) => {
-          element.isOnlyOne = false
-          if (element.children && element.children.length > 0) {
-            const child = element.children.filter((menu, index) => !menu.hidden)
-            if (child && child.length === 1) {
-              element.isOnlyOne = true
-              // element.routeChildren = child[0]
-              // element.path = path.resolve(element.path, child[0].path)
-              // element.meta.target = child[0].meta.target
-            }
-          }
-        })
-        return currentMenuList
-      },
-    },
-    mounted() {
-      this.$store.dispatch('navHeader/setUnreadMsgCount')
-      // this.$root.$on('resize', () => {
-      //   this.$nextTick(() => {
-      //     this.initMenuScroll()
-      //   })
-      // })
-      // this.initMenuScroll()
-    },
-    methods: {
-      setRatio() {
-        this.calcRatio = this.calcRem()
-        this.$store.state.user.calcRatio = this.calcRatio
-      },
-      async refreshRoute() {
-        this.$baseEventBus.$emit('reload-router-view')
-      },
-      async initMenuScroll() {
-        if (!this.$refs.menuScroll) {
-          await this.awaitOneSecond()
-        }
-        const lookWidth = this.$refs.menuScroll.clientWidth
-        const totalWidth = document.getElementById('menuContentRef').scrollWidth
-        let rightSurplus = totalWidth - Math.abs(this.menuLeft) - lookWidth
-        this.showRightIcon = rightSurplus > 0
-      },
-      awaitOneSecond() {
-        return new Promise((resolve) => {
-          setTimeout(() => {
-            resolve()
-          }, 1000)
-        })
-      },
-      // 点击右箭头(左侧滚动)
-      rightClick() {
-        // 获取可视区域宽度
-        const lookWidth = this.$refs.menuScroll.clientWidth
-        const totalWidth = document.getElementById('menuContentRef').scrollWidth
-        let rightSurplus = totalWidth - Math.abs(this.menuLeft) - lookWidth
-        let percentOffest = lookWidth * 0.5
-        if (rightSurplus > 0) {
-          this.menuLeft -=
-            rightSurplus >= percentOffest ? percentOffest : rightSurplus
-          if (totalWidth - Math.abs(this.menuLeft) - lookWidth <= 0) {
-            this.showRightIcon = false
-          }
-        } else {
-          this.showRightIcon = false
-        }
-      },
-      // 点击左箭头(右侧滚动)
-      leftClick() {
-        // 获取可视区域宽度
-        const lookWidth = this.$refs.menuScroll.clientWidth
-        const totalWidth = document.getElementById('menuContentRef').scrollWidth
-        let percentOffest = lookWidth * 0.5
-        let rightSurplus = totalWidth - Math.abs(this.menuLeft) - lookWidth
-        if (Math.abs(this.menuLeft) > 0) {
-          this.menuLeft +=
-            Math.abs(this.menuLeft) >= percentOffest
-              ? percentOffest
-              : Math.abs(this.menuLeft)
-          this.showRightIcon = true
-        }
-        if (rightSurplus > 0) {
-          this.showRightIcon = true
-        }
-      },
-    },
-  }
-</script>
-
-<style lang="scss" scoped>
-  @mixin dot-border-color {
-    border-color: var(--themeColor);
-  }
-
-  @mixin more-submenu-style($color) {
-    .sub-menu-title,
-    .ht-fa-icon,
-    .el-submenu__icon-arrow {
-      color: var($color) !important;
-    }
-  }
-
-  @mixin menu-arrow($degree) {
-    .el-submenu__icon-arrow {
-      transform: rotateZ($degree);
-    }
-  }
-
-  .top-bar-container {
-    display: flex;
-    align-items: center;
-    justify-items: flex-end;
-    height: $base-top-bar-height;
-
-    .top-bar-main {
-      width: $base-full-width;
-      background: url('~@/assets/top_images/h-back.png');
-
-      .top-bar-row {
-        width: 92% !important;
-        margin: auto;
-        display: flex;
-        align-items: center;
-
-        .top-bar-row-logo {
-          // width: 180px;
-          // lj-修改
-          //width: 80px;
-          width: calc(var(--calcRatio) * 360px);
-        }
-
-        .top-bar-right {
-          width: 380px;
-        }
-
-        .top-bar-center {
-          flex: 1;
-          display: flex;
-          justify-content: flex-start;
-          position: relative;
-          padding: 0 calc(var(--calcRatio) * 30px);
-
-          .menu-scroll {
-            width: 100%;
-            overflow: hidden;
-          }
-
-          .menu-wrap {
-            ::v-deep {
-              .is-active {
-                .el-submenu__title {
-                  .more-menu {
-                    color: var(--themeColor);
-                  }
-                }
-              }
-            }
-          }
-
-          .menu-left {
-            width: 32px;
-            height: 32px;
-            position: absolute;
-            left: 14px;
-            top: 14px;
-            background: #f5f5f5;
-            color: #999;
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            font-size: 20px;
-            cursor: pointer;
-
-            &:hover {
-              color: var(--themeColor);
-            }
-          }
-
-          .menu-right {
-            width: 32px;
-            height: 32px;
-            position: absolute;
-            right: 14px;
-            top: 14px;
-            background: #f5f5f5;
-            color: #999;
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            font-size: 20px;
-            cursor: pointer;
-
-            &:hover {
-              color: var(--themeColor);
-            }
-          }
-        }
-      }
-
-      .logo-padding {
-        padding-left: $base-logo-padding-left;
-        background: transparent !important;
-        //height: var(--calcRatio);
-        width: calc(var(--calcRatio) * 50px);
-      }
-
-      .menu-more-wrap {
-        height: $base-top-bar-height;
-        width: 68px;
-        display: flex;
-        align-items: center;
-
-        .more-menu {
-          position: fixed;
-          top: 60px;
-          z-index: 99;
-        }
-      }
-
-      ::v-deep {
-        .el-menu {
-          &.el-menu--horizontal {
-            // width: 100%;
-            height: $base-top-bar-height;
-            // display: flex;
-            flex-shrink: 0;
-            // overflow-x: auto;
-            // overflow-y: hidden;
-            // overflow: hidden;
-            border-bottom: 0 solid transparent !important;
-            background-color: var(--menuBgColor) !important;
-            display: flex;
-
-            // &::before {
-            //   content: '';
-            //   flex: 1;
-            // }
-
-            &::-webkit-scrollbar {
-              width: 6px;
-              height: 6px;
-              background: transparent;
-            }
-
-            &::-webkit-scrollbar-thumb {
-              background-color: rgba(144, 147, 153, 0.3);
-              border-radius: 10px;
-            }
-
-            &::-webkit-scrollbar-thumb:hover {
-              background-color: rgba(144, 147, 153, 0.3);
-            }
-
-            .el-menu-item.is-active {
-              background-color: rgba(var(--themeColorRgb), 0.2) !important;
-            }
-
-            .el-submenu.is-active {
-              .el-submenu__title {
-                background-color: rgba(var(--themeColorRgb), 0.2) !important;
-              }
-            }
-
-            .is-active.more-menu__submenu {
-              .el-menu--horizontal {
-                .el-submenu.is-active {
-                  .el-submenu__title {
-                    @include more-submenu-style(--themeColor);
-                  }
-                }
-
-                .el-submenu .el-submenu__title {
-                  background-color: var(--menuBgColor) !important;
-
-                  &:hover {
-                    @include more-submenu-style(--themeColor);
-                    @include menu-arrow(90deg);
-                  }
-
-                  @include more-submenu-style(--menuColor);
-                  @include menu-arrow(0deg);
-                }
-              }
-            }
-
-            .el-menu-item,
-            .el-submenu__title {
-              // padding: 0 15px;
-              // background-color: var(--menuBgColor) !important;
-              &:hover {
-                .ht-fa-icon {
-                  color: var(--themeColor);
-                }
-              }
-            }
-
-            @media only screen and (max-width: 767px) {
-              .el-menu-item,
-              .el-submenu__title {
-                padding: 0 8px;
-              }
-
-              li:nth-child(4),
-              li:nth-child(5) {
-                display: none !important;
-              }
-            }
-
-            > .el-menu-item {
-              flex-shrink: 0;
-              height: $base-top-bar-height;
-              line-height: unset;
-              display: flex;
-              align-items: center;
-              // &:hover {
-              //   background-color: rgba(var(--themeColorRgb), 0.2) !important;
-              // }
-            }
-
-            > .el-submenu {
-              .el-submenu__title {
-                height: $base-top-bar-height;
-                line-height: unset;
-                display: flex;
-                align-items: center;
-
-                .ht-fa-icon {
-                  margin-right: 0;
-
-                  &::before {
-                    margin-right: 8px;
-                  }
-                }
-
-                .sub-menu-title {
-                  flex: 1;
-                }
-              }
-            }
-
-            .el-menu--popup {
-              .el-submenu {
-                margin: 0 10px;
-                height: 48px;
-                line-height: 48px;
-              }
-
-              .el-submenu__title {
-                height: 48px;
-                border-radius: 4px;
-              }
-            }
-
-            .el-submenu {
-              .el-menu-item {
-                margin: 0 $base-menu-bg-margin;
-              }
-
-              .el-icon-arrow-down {
-                display: none;
-              }
-
-              // &:hover {
-              //   .el-icon-arrow-down {
-              //     display: none;
-              //     color: var(--themeColor);
-              //   }
-              // }
-              .is-active {
-                background-color: rgba(var(--themeColorRgb), 0.2) !important;
-                border-radius: $base-radius;
-
-                .sub-menu-child__title {
-                  &::before {
-                    background: transparent;
-                    @include dot-border-color;
-                  }
-                }
-              }
-
-              .sub-menu-child__title {
-                &::before {
-                  border-color: $base-color-second-color;
-                }
-              }
-
-              .el-menu-item {
-                &:hover {
-                  .sub-menu-child__title {
-                    &::before {
-                      @include dot-border-color;
-                    }
-                  }
-                }
-              }
-            }
-
-            .el-submenu.is-active {
-              // .el-submenu__title {
-              //   background-color: rgba(var(--themeColorRgb), 0.2) !important;
-              // }
-              .ht-fa-icon {
-                color: var(--themeColor);
-              }
-            }
-
-            .el-submenu.is-opened > .el-submenu__title .el-submenu__icon-arrow {
-              transform: rotateZ(90deg);
-            }
-          }
-
-          svg {
-            width: 1rem;
-            margin-right: 3px;
-          }
-
-          &--horizontal {
-            .el-menu {
-              .el-menu-item,
-              .el-submenu__title {
-                height: $base-menu-item-height;
-                line-height: $base-menu-item-height;
-              }
-            }
-
-            .el-submenu,
-            .el-menu-item {
-              &.is-active {
-                // background-color: $base-color-blue !important;
-                border-bottom: 0 solid transparent !important;
-
-                .el-icon-arrow-down {
-                  color: var(--themeColor);
-                }
-
-                .el-submenu__title {
-                  border-bottom: 0 solid transparent !important;
-                }
-              }
-            }
-
-            > .el-menu-item {
-              .el-tag {
-                margin-top: calc(#{$base-top-bar-height} / 2 - 7.5px);
-                margin-left: 5px;
-              }
-
-              @media only screen and (max-width: 1199px) {
-                .el-tag {
-                  display: none;
-                }
-              }
-
-              &.is-active {
-                background-color: transparent !important;
-              }
-            }
-          }
-        }
-      }
-
-      ::v-deep .el-menu {
-        &.el-menu--horizontal {
-          background-color: transparent !important;
-
-          > .el-submenu {
-            .ht-fa-icon {
-              color: #ffffff;
-            }
-          }
-
-          .el-menu-item {
-            color: #ffffff !important;
-            background: transparent !important;
-
-            .ht-fa-icon {
-              color: #ffffff !important;
-            }
-
-            &.is-active {
-              background: rgba(255, 255, 255, 0.1) !important;
-            }
-          }
-
-          .el-submenu {
-            .el-submenu__title {
-              color: #ffffff !important;
-              background: transparent !important;
-              padding: 0 calc(var(--calcRatio) * 15px) !important;
-
-              &:hover {
-                background: rgba(255, 255, 255, 0.1) !important;
-
-                .ht-fa-icon {
-                  color: #ffffff !important;
-                }
-              }
-            }
-
-            &.is-active {
-              .el-submenu__title {
-                background: rgba(255, 255, 255, 0.1) !important;
-              }
-
-              .ht-fa-icon {
-                color: #ffffff !important;
-              }
-
-              .sub-menu-title {
-                color: #ffffff !important;
-              }
-            }
-          }
-
-          .el-submenu {
-          }
-        }
-      }
-    }
-
-    .right-panel {
-      display: flex;
-      align-items: center;
-      justify-content: flex-end;
-      height: $base-top-bar-height;
-
-      div:not(.el-divider--vertical),
-      span {
-        padding: 0 8px;
-      }
-
-      ::v-deep {
-        .el-divider--vertical {
-          margin: 0 20px;
-          background-color: var(--topRightColor);
-        }
-
-        svg {
-          width: 18px;
-          height: 18px;
-          font-size: $base-font-size-big;
-          color: rgba($base-color-white, 0.9);
-          cursor: pointer;
-          fill: var(--topRightColor);
-        }
-
-        button {
-          svg {
-            margin-right: 0;
-            color: rgba($base-color-white, 0.9);
-            cursor: pointer;
-            fill: rgba($base-color-white, 0.9);
-          }
-        }
-
-        .el-badge {
-          margin-right: 15px;
-        }
-
-        .message-title {
-          color: var(--topRightColor);
-        }
-      }
-    }
-
-    ::v-deep .right-panel {
-      .avatar-dropdown .user-name {
-        color: #ffffff;
-      }
-    }
-  }
-</style>

+ 458 - 3
src/components/task/taskInfo.vue

@@ -9,6 +9,57 @@
     class="task-info-dialog"
     class="task-info-dialog"
   >
   >
     <div class="task-info-container">
     <div class="task-info-container">
+      <!-- 报送资料预置模版查看弹窗:复用 SurveyFormDialog / FixedTableDialog / DynamicTableDialog,只读模式 -->
+      <survey-form-dialog
+        :visible.sync="surveyFormDialogVisible"
+        :survey-data="{ ...(currentTemplateRow || {}), ...surveyDetailData }"
+        :form-fields="formFields"
+        :is-view-mode="true"
+        :audited-unit-id="auditedUnitId"
+        :request-type="2"
+        :upload-id="
+          (currentTemplateRow &&
+            (currentTemplateRow.uploadId || currentTemplateRow.id)) ||
+          ''
+        "
+        :survey-template-id="getSurveyTemplateId(currentTemplateRow)"
+        :catalog-id="(currentTemplateRow && currentTemplateRow.catalogId) || ''"
+      />
+
+      <fixed-table-dialog
+        :visible.sync="fixedTableDialogVisible"
+        :survey-data="{ ...(currentTemplateRow || {}), fixedHeaders }"
+        :table-items="tableItems"
+        :audit-periods="auditPeriods"
+        :is-view-mode="true"
+        :request-type="2"
+        :audited-unit-id="auditedUnitId"
+        :upload-id="
+          (currentTemplateRow &&
+            (currentTemplateRow.uploadId || currentTemplateRow.id)) ||
+          ''
+        "
+        :survey-template-id="getSurveyTemplateId(currentTemplateRow)"
+        :catalog-id="(currentTemplateRow && currentTemplateRow.catalogId) || ''"
+      />
+
+      <dynamic-table-dialog
+        :key="dynamicDialogKey"
+        :visible.sync="dynamicTableDialogVisible"
+        :survey-data="currentTemplateRow || {}"
+        :table-data="dynamicTableData"
+        :table-items="tableItems"
+        :is-view-mode="true"
+        :request-type="2"
+        :audited-unit-id="auditedUnitId"
+        :upload-id="
+          (currentTemplateRow &&
+            (currentTemplateRow.uploadId || currentTemplateRow.id)) ||
+          ''
+        "
+        :survey-template-id="getSurveyTemplateId(currentTemplateRow)"
+        :catalog-id="(currentTemplateRow && currentTemplateRow.catalogId) || ''"
+      />
       <!-- 标签页容器 -->
       <!-- 标签页容器 -->
       <el-tabs
       <el-tabs
         v-model="activeTab"
         v-model="activeTab"
@@ -323,7 +374,10 @@
                 min-width="120"
                 min-width="120"
                 align="center"
                 align="center"
               >
               >
-                <template slot-scope="scope">
+                <template
+                  v-if="scope.row.documentName.includes('送达回证')"
+                  slot-scope="scope"
+                >
                   <!-- <el-button
                   <!-- <el-button
                     :disabled="isViewMode"
                     :disabled="isViewMode"
                     type="text"
                     type="text"
@@ -336,6 +390,7 @@
                     {{ scope.row.feedbackDocumentUrl ? '已回传' : '未回传' }}
                     {{ scope.row.feedbackDocumentUrl ? '已回传' : '未回传' }}
                   </span>
                   </span>
                   <el-button
                   <el-button
+                    v-if="scope.row.feedbackDocumentUrl"
                     type="text"
                     type="text"
                     size="mini"
                     size="mini"
                     @click="handleViewFeedback(scope.row.feedbackDocumentUrl)"
                     @click="handleViewFeedback(scope.row.feedbackDocumentUrl)"
@@ -345,6 +400,17 @@
                 </template>
                 </template>
               </el-table-column>
               </el-table-column>
             </el-table>
             </el-table>
+            <!-- 分页 -->
+            <el-pagination
+              style="margin: 20px 0"
+              :current-page.sync="auditDocumentPagination.page"
+              :page-sizes="[50, 100]"
+              :page-size.sync="auditDocumentPagination.pageSize"
+              layout="total, sizes, prev, pager, next, jumper"
+              :total="auditDocumentPagination.total"
+              @size-change="handleSizeChange"
+              @current-change="handleCurrentChange"
+            />
           </div>
           </div>
         </el-tab-pane>
         </el-tab-pane>
 
 
@@ -507,6 +573,16 @@
                     <template v-if="scope.row.formatRequired == '3'">
                     <template v-if="scope.row.formatRequired == '3'">
                       <el-button
                       <el-button
                         v-if="
                         v-if="
+                          scope.row.isUpload === 1 || scope.row.isUpload === '1'
+                        "
+                        type="text"
+                        size="small"
+                        @click="handleViewTemplate(scope.row)"
+                      >
+                        查看
+                      </el-button>
+                      <el-button
+                        v-if="
                           (scope.row.isUpload === 1 ||
                           (scope.row.isUpload === 1 ||
                             scope.row.isUpload === '1') &&
                             scope.row.isUpload === '1') &&
                           scope.row.templateType !== '1'
                           scope.row.templateType !== '1'
@@ -576,6 +652,7 @@
                 width="100"
                 width="100"
                 align="center"
                 align="center"
               ></el-table-column>
               ></el-table-column>
+
               <el-table-column label="是否上传" width="100" align="center">
               <el-table-column label="是否上传" width="100" align="center">
                 <template slot-scope="scope">
                 <template slot-scope="scope">
                   <span
                   <span
@@ -588,6 +665,18 @@
                   </span>
                   </span>
                 </template>
                 </template>
               </el-table-column>
               </el-table-column>
+              <!-- 操作列:查看单记录/固定表/动态表 -->
+              <el-table-column label="操作" width="120" align="center">
+                <template slot-scope="scope">
+                  <el-button
+                    type="text"
+                    size="small"
+                    @click="handleCostSurveyView(scope.row)"
+                  >
+                    查看
+                  </el-button>
+                </template>
+              </el-table-column>
             </el-table>
             </el-table>
             <el-pagination
             <el-pagination
               background
               background
@@ -909,6 +998,15 @@
   import TemplatePreviewEdit from '@/components/costAudit/TemplatePreviewEdit.vue'
   import TemplatePreviewEdit from '@/components/costAudit/TemplatePreviewEdit.vue'
   import MultiAttachmentDialog from '@/components/costAudit/MultiAttachmentDialog'
   import MultiAttachmentDialog from '@/components/costAudit/MultiAttachmentDialog'
   import { uploadFile } from '@/api/file'
   import { uploadFile } from '@/api/file'
+  import SurveyFormDialog from '@/views/EntDeclaration/auditTaskManagement/components/SurveyFormDialog.vue'
+  import FixedTableDialog from '@/views/EntDeclaration/auditTaskManagement/components/FixedTableDialog.vue'
+  import DynamicTableDialog from '@/views/EntDeclaration/auditTaskManagement/components/DynamicTableDialog.vue'
+  import {
+    getSingleRecordSurveyList,
+    getSurveyDetail,
+    getDynamicTableData,
+  } from '@/api/audit/survey'
+  import { getListBySurveyFdTemplateIdAndVersion } from '@/api/costSurveyTemplateHeaders'
   export default {
   export default {
     name: 'TaskInfo',
     name: 'TaskInfo',
     components: {
     components: {
@@ -917,6 +1015,9 @@
       CostAuditDialog,
       CostAuditDialog,
       TemplatePreviewEdit,
       TemplatePreviewEdit,
       MultiAttachmentDialog,
       MultiAttachmentDialog,
+      SurveyFormDialog,
+      FixedTableDialog,
+      DynamicTableDialog,
     },
     },
     mixins: [dictMixin],
     mixins: [dictMixin],
     props: {
     props: {
@@ -959,7 +1060,7 @@
         },
         },
         auditDocumentPagination: {
         auditDocumentPagination: {
           page: 1,
           page: 1,
-          pageSize: 10,
+          pageSize: 50,
           total: 0,
           total: 0,
         },
         },
         unitList: [],
         unitList: [],
@@ -1025,6 +1126,18 @@
         activeDocTab: 'preview', // 当前标签页,preview:预览,edit:修改
         activeDocTab: 'preview', // 当前标签页,preview:预览,edit:修改
         dialogMultiVisible: false,
         dialogMultiVisible: false,
         attachments: [],
         attachments: [],
+        // 报送资料预置模版查看相关
+        currentTemplateRow: null,
+        surveyFormDialogVisible: false,
+        fixedTableDialogVisible: false,
+        dynamicTableDialogVisible: false,
+        formFields: [],
+        surveyDetailData: {},
+        tableItems: [],
+        auditPeriods: [],
+        dynamicTableData: [],
+        dynamicDialogKey: 0,
+        fixedHeaders: null,
       }
       }
     },
     },
     computed: {
     computed: {
@@ -1448,6 +1561,334 @@
           this.loading = false
           this.loading = false
         }
         }
       },
       },
+      // 成本调查表-查看:复用报送资料预置模版查看的三种弹窗(只读)
+      handleCostSurveyView(row) {
+        if (!row) return
+        // 将成本调查表行映射为 currentTemplateRow 结构
+        const templateRow = {
+          uploadId: row.uploadId || row.id,
+          id: row.id,
+          surveyTemplateId: row.surveyTemplateId,
+          templateType:
+            row.templateType ||
+            (row.tableType === '单记录'
+              ? '1'
+              : row.tableType === '固定表'
+              ? '2'
+              : row.tableType === '动态表'
+              ? '3'
+              : ''),
+          catalogId: row.catalogId || this.catalogId || '',
+          auditedUnitId: row.auditedUnitId || this.auditedUnitId || '',
+          informationName: row.name,
+        }
+        this.handleViewTemplate(templateRow)
+      },
+      // 报送资料预置模版-查看:单记录/固定表/动态表只读查看并回显
+      async handleOnlineSubmission(row) {
+        if (!row) return
+        this.currentTemplateRow = row
+        this.surveyDetailData = {}
+
+        const t = String(row.templateType || row.templatetype || '').trim()
+        if (t === '1') {
+          if (row.uploadId || row.id) {
+            try {
+              const params = {
+                uploadId: row.uploadId || row.id,
+                auditedUnitId: this.auditedUnitId,
+                type: 2,
+              }
+              const res = await getSurveyDetail(params)
+              if (res && res.code === 200 && res.value) {
+                const detailData = {}
+                if (Array.isArray(res.value)) {
+                  res.value.forEach((item) => {
+                    if (item.rowid && item.rvalue !== undefined) {
+                      detailData[item.rowid] = item.rvalue
+                    }
+                  })
+                } else if (res.value && typeof res.value === 'object') {
+                  Object.assign(detailData, res.value)
+                }
+                this.surveyDetailData = detailData
+              }
+            } catch (err) {
+              console.error('获取单记录详情失败', err)
+            }
+          }
+          await this.initFormFields()
+        } else if (t === '2') {
+          await this.initFixedTableData()
+        } else if (t === '3') {
+          await this.initDynamicTableData()
+        }
+      },
+      handleViewTemplate(row) {
+        this.currentTemplateRow = row || null
+        const t = String(
+          (row && (row.templateType || row.templatetype)) || ''
+        ).trim()
+        if (t === '1' || t === '2' || t === '3') {
+          this.handleOnlineSubmission(row)
+        } else {
+          this.$message &&
+            this.$message.warning &&
+            this.$message.warning('未知的模板类型,无法打开预置模板')
+        }
+      },
+      async initDynamicTableData() {
+        try {
+          const uploadId =
+            (this.currentTemplateRow &&
+              (this.currentTemplateRow.uploadId ||
+                this.currentTemplateRow.id)) ||
+            ''
+          const auditedUnitId = this.auditedUnitId || ''
+          const catalogId =
+            (this.currentTemplateRow && this.currentTemplateRow.catalogId) || ''
+          const surveyTemplateId = this.getSurveyTemplateId(
+            this.currentTemplateRow
+          )
+
+          const params = {
+            uploadId,
+            auditedUnitId,
+            catalogId,
+            surveyTemplateId,
+            type: 2,
+          }
+          const res = await getDynamicTableData(params)
+          if (res && res.code === 200) {
+            const records = res.value?.records || res.value || []
+            this.dynamicTableData = Array.isArray(records) ? records : []
+          } else {
+            this.dynamicTableData =
+              this.currentTemplateRow?.dynamicTableData || []
+          }
+
+          if (
+            this.currentTemplateRow &&
+            this.currentTemplateRow.tableItems &&
+            this.currentTemplateRow.tableItems.length > 0
+          ) {
+            this.tableItems = this.currentTemplateRow.tableItems
+          } else {
+            this.tableItems = this.getMockTableItems()
+          }
+          this.dynamicTableDialogVisible = true
+        } catch (error) {
+          console.error('获取动态表数据失败', error)
+          this.dynamicTableData =
+            this.currentTemplateRow?.dynamicTableData || []
+          this.tableItems =
+            this.currentTemplateRow?.tableItems || this.getMockTableItems()
+          this.dynamicTableDialogVisible = true
+        }
+      },
+      async initFormFields() {
+        if (
+          this.currentTemplateRow &&
+          this.getSurveyTemplateId(this.currentTemplateRow)
+        ) {
+          try {
+            const params = {
+              surveyTemplateId: this.getSurveyTemplateId(
+                this.currentTemplateRow
+              ),
+              type: 2,
+            }
+            const res = await getListBySurveyFdTemplateIdAndVersion(params)
+            if (res && res.code === 200) {
+              let mapped = []
+              if (Array.isArray(res.value)) {
+                mapped = res.value
+                  .map((item, index) =>
+                    this.mapApiFieldToFormField(item, index)
+                  )
+                  .filter(Boolean)
+              } else if (res.value && typeof res.value === 'object') {
+                const { fixedFields, fixedFieldids } = res.value
+                if (fixedFields && fixedFieldids) {
+                  const labels = fixedFields.split(',').map((i) => i.trim())
+                  const ids = fixedFieldids.split(',').map((i) => i.trim())
+                  mapped = labels.map((label, index) => ({
+                    prop: ids[index] || `field_${index}`,
+                    label,
+                    type: 'input',
+                    colSpan: 12,
+                    placeholder: `请输入${label}`,
+                    rules: [],
+                    defaultValue: '',
+                    disabled: false,
+                    clearable: true,
+                    multiple: false,
+                    required: false,
+                  }))
+                }
+              }
+              this.formFields =
+                mapped.length > 0 ? mapped : this.getMockFormFields()
+            } else {
+              this.formFields = this.getMockFormFields()
+            }
+            this.surveyFormDialogVisible = true
+          } catch (err) {
+            console.error('获取单记录表单字段配置失败', err)
+            this.formFields = this.getMockFormFields()
+            this.surveyFormDialogVisible = true
+          }
+        } else {
+          this.formFields = this.getMockFormFields()
+          this.surveyFormDialogVisible = true
+        }
+      },
+      async initFixedTableData() {
+        if (
+          this.currentTemplateRow &&
+          this.getSurveyTemplateId(this.currentTemplateRow)
+        ) {
+          try {
+            const params = {
+              surveyTemplateId: this.getSurveyTemplateId(
+                this.currentTemplateRow
+              ),
+              type: 2,
+            }
+            const res = await getSingleRecordSurveyList(params)
+            if (res && res.code === 200 && res.value) {
+              const { itemlist } = res.value
+              if (itemlist && Array.isArray(itemlist) && itemlist.length > 0) {
+                this.tableItems = itemlist.map((item) => ({
+                  id: item.id || item.itemId || '',
+                  rowid: item.rowid || item.id || item.itemId || '',
+                  seq: item.序号,
+                  itemName: item.项目 || '',
+                  unit: item.unit || '',
+                  isCategory: item.isCategory || false,
+                  categorySeq: item.categorySeq || '',
+                  categoryId: item.categoryId || '',
+                  parentid:
+                    item.parentid !== undefined
+                      ? item.parentid
+                      : item.parentId !== undefined
+                      ? item.parentId
+                      : '-1',
+                  validateRules: item.validateRules || {},
+                  linkageRules: item.linkageRules || {},
+                  children: item.children || [],
+                  ...item,
+                }))
+              } else {
+                this.tableItems = this.getMockTableItems()
+              }
+            } else {
+              this.tableItems = this.getMockTableItems()
+            }
+          } catch (err) {
+            console.error('获取固定表配置失败', err)
+            this.tableItems = this.getMockTableItems()
+          }
+        } else if (
+          this.currentTemplateRow &&
+          this.currentTemplateRow.tableItems
+        ) {
+          this.tableItems = this.currentTemplateRow.tableItems
+        } else {
+          this.tableItems = this.getMockTableItems()
+        }
+
+        const currentYear = new Date().getFullYear()
+        this.auditPeriods = [
+          String(currentYear - 2),
+          String(currentYear - 1),
+          String(currentYear),
+        ]
+
+        try {
+          const headerRes = await getListBySurveyFdTemplateIdAndVersion({
+            surveyTemplateId: this.getSurveyTemplateId(this.currentTemplateRow),
+            type: 2,
+          })
+          if (headerRes && headerRes.code === 200) {
+            this.fixedHeaders = headerRes.value || null
+          } else {
+            this.fixedHeaders = null
+          }
+        } catch (err) {
+          console.error('获取固定表表头配置失败', err)
+          this.fixedHeaders = null
+        }
+
+        this.fixedTableDialogVisible = true
+      },
+      getSurveyTemplateId(row) {
+        return (
+          row?.surveyTemplateId ||
+          row?.templateId ||
+          row?.surveyTemplateID ||
+          row?.templateID ||
+          ''
+        )
+      },
+      getMockFormFields() {
+        return []
+      },
+      getMockTableItems() {
+        return []
+      },
+      mapApiFieldToFormField(item, index = 0) {
+        if (!item) return null
+        const getVal = (keys, fallback) => {
+          for (const key of keys) {
+            if (
+              key &&
+              item[key] !== undefined &&
+              item[key] !== null &&
+              item[key] !== ''
+            ) {
+              return item[key]
+            }
+          }
+          return fallback
+        }
+        const prop =
+          getVal(
+            [
+              'fieldName',
+              'field_name',
+              'columnName',
+              'column_name',
+              'fieldCode',
+            ],
+            undefined
+          ) || `field_${index}`
+        const label =
+          getVal(
+            [
+              'columnComment',
+              'column_comment',
+              'fieldCname',
+              'field_cname',
+              'fieldLabel',
+              'field_label',
+            ],
+            prop
+          ) || prop
+        return {
+          prop,
+          label,
+          type: 'input',
+          colSpan: 12,
+          placeholder: `请输入${label}`,
+          rules: [],
+          defaultValue: '',
+          disabled: false,
+          clearable: true,
+          multiple: false,
+          required: false,
+        }
+      },
       // 加载监审文书
       // 加载监审文书
       async loadAuditDocument() {
       async loadAuditDocument() {
         try {
         try {
@@ -1459,7 +1900,7 @@
             pageNum: this.auditDocumentPagination.page,
             pageNum: this.auditDocumentPagination.page,
             pageSize: this.auditDocumentPagination.pageSize,
             pageSize: this.auditDocumentPagination.pageSize,
             projectId: this.currentTaskInfo.projectId,
             projectId: this.currentTaskInfo.projectId,
-            documentName: '',
+            // documentName: '',
             permissionType: 1,
             permissionType: 1,
           }).then((res) => {
           }).then((res) => {
             this.formData.auditDocument = res.value.value.records
             this.formData.auditDocument = res.value.value.records
@@ -1795,6 +2236,7 @@
               surveyTemplateId: it.templateId || it.surveyTemplateId || '',
               surveyTemplateId: it.templateId || it.surveyTemplateId || '',
               catalogId: it.catalogId || this.catalogId || '',
               catalogId: it.catalogId || this.catalogId || '',
               auditedUnitId: it.auditedUnitId || this.auditedUnitId || '',
               auditedUnitId: it.auditedUnitId || this.auditedUnitId || '',
+              templateType: t,
             }
             }
           })
           })
           this.formData.costSurveyData = rows
           this.formData.costSurveyData = rows
@@ -1949,6 +2391,19 @@
         this.messageNoticePagination.currentPage = 1
         this.messageNoticePagination.currentPage = 1
         this.loadMessageNotice()
         this.loadMessageNotice()
       },
       },
+
+      // 监审文书分页 - 每页条数改变
+      handleSizeChange(size) {
+        this.auditDocumentPagination.pageSize = size
+        this.auditDocumentPagination.page = 1
+        this.loadAuditDocument()
+      },
+
+      // 监审文书分页 - 页码改变
+      handleCurrentChange(page) {
+        this.auditDocumentPagination.page = page
+        this.loadAuditDocument()
+      },
     },
     },
   }
   }
 </script>
 </script>

+ 58 - 1
src/views/EntDeclaration/auditTaskManagement/components/AuditDocumentTab.vue

@@ -53,7 +53,10 @@
         min-width="120"
         min-width="120"
         align="center"
         align="center"
       >
       >
-        <template slot-scope="scope">
+        <template
+          v-if="scope.row.documentName.includes('送达回证')"
+          slot-scope="scope"
+        >
           <span>
           <span>
             {{ scope.row.feedbackDocumentUrl ? '已回传' : '未回传' }}
             {{ scope.row.feedbackDocumentUrl ? '已回传' : '未回传' }}
           </span>
           </span>
@@ -66,6 +69,7 @@
             上传附件
             上传附件
           </el-button>
           </el-button>
           <el-button
           <el-button
+            v-if="scope.row.feedbackDocumentUrl"
             type="text"
             type="text"
             size="mini"
             size="mini"
             @click="handleViewFeedback(scope.row.feedbackDocumentUrl)"
             @click="handleViewFeedback(scope.row.feedbackDocumentUrl)"
@@ -75,6 +79,18 @@
         </template>
         </template>
       </el-table-column>
       </el-table-column>
     </el-table>
     </el-table>
+    <!-- 分页 -->
+    <el-pagination
+      style="margin: 20px 0"
+      background
+      layout="total, sizes, prev, pager, next"
+      :current-page="pageNum"
+      :page-sizes="[50, 100]"
+      :page-size="pageSize"
+      :total="total"
+      @size-change="handlePageSizeChange"
+      @current-change="handlePageNumChange"
+    />
     <!-- 查看监审通知书 -->
     <!-- 查看监审通知书 -->
     <CostAuditDialog
     <CostAuditDialog
       :title="documentDialogTitle"
       :title="documentDialogTitle"
@@ -238,6 +254,14 @@
         type: Boolean,
         type: Boolean,
         default: false,
         default: false,
       },
       },
+      pagination: {
+        type: Object,
+        default: () => ({
+          pageNum: 1,
+          pageSize: 50,
+          total: 0,
+        }),
+      },
     },
     },
     data() {
     data() {
       return {
       return {
@@ -251,8 +275,22 @@
         dialogMultiVisible: false,
         dialogMultiVisible: false,
         attachments: [],
         attachments: [],
         unitList: [],
         unitList: [],
+        // 分页相关变量
+        pageNum: 1,
+        pageSize: 50,
+        total: 0,
       }
       }
     },
     },
+    watch: {
+      pagination: {
+        handler(val) {
+          this.pageNum = val.pageNum
+          this.pageSize = val.pageSize
+          this.total = val.total
+        },
+        deep: true,
+      },
+    },
     mounted() {
     mounted() {
       // this.$emit('refresh')
       // this.$emit('refresh')
       this.getAllUnitList()
       this.getAllUnitList()
@@ -497,6 +535,25 @@
         this.fileUrl = ''
         this.fileUrl = ''
         this.costDocumentTemplateFiles = []
         this.costDocumentTemplateFiles = []
       },
       },
+
+      // 分页处理 - 页面大小改变
+      handlePageSizeChange(newSize) {
+        this.pageSize = newSize
+        this.pageNum = 1 // 重置为第一页
+        this.$emit('paginationChange', {
+          pageNum: this.pageNum,
+          pageSize: this.pageSize,
+        })
+      },
+
+      // 分页处理 - 当前页码改变
+      handlePageNumChange(newPage) {
+        this.pageNum = newPage
+        this.$emit('paginationChange', {
+          pageNum: this.pageNum,
+          pageSize: this.pageSize,
+        })
+      },
     },
     },
   }
   }
 </script>
 </script>

+ 57 - 13
src/views/EntDeclaration/auditTaskManagement/components/DataRequirementsTab.vue

@@ -1,11 +1,11 @@
 <template>
 <template>
   <div>
   <div>
-    <!-- 在线填报弹窗(单记录类型,编辑模式) -->
+    <!-- 在线填报弹窗(单记录类型,可编辑/只读由 isViewMode/viewModeForDialog 控制) -->
     <survey-form-dialog
     <survey-form-dialog
       :visible.sync="surveyFormDialogVisible"
       :visible.sync="surveyFormDialogVisible"
       :survey-data="{ ...(currentTemplateRow || {}), ...surveyDetailData }"
       :survey-data="{ ...(currentTemplateRow || {}), ...surveyDetailData }"
       :form-fields="formFields"
       :form-fields="formFields"
-      :is-view-mode="isViewMode"
+      :is-view-mode="viewModeForDialog"
       :audited-unit-id="auditedUnitId"
       :audited-unit-id="auditedUnitId"
       :request-type="2"
       :request-type="2"
       :upload-id="
       :upload-id="
@@ -29,13 +29,13 @@
       "
       "
     />
     />
 
 
-    <!-- 固定表填报弹窗(编辑模式) -->
+    <!-- 固定表填报弹窗(可编辑/只读由 isViewMode/viewModeForDialog 控制) -->
     <fixed-table-dialog
     <fixed-table-dialog
       :visible.sync="fixedTableDialogVisible"
       :visible.sync="fixedTableDialogVisible"
       :survey-data="{ ...(currentTemplateRow || {}), fixedHeaders }"
       :survey-data="{ ...(currentTemplateRow || {}), fixedHeaders }"
       :table-items="tableItems"
       :table-items="tableItems"
       :audit-periods="auditPeriods"
       :audit-periods="auditPeriods"
-      :is-view-mode="isViewMode"
+      :is-view-mode="viewModeForDialog"
       :request-type="2"
       :request-type="2"
       :audited-unit-id="auditedUnitId"
       :audited-unit-id="auditedUnitId"
       :upload-id="
       :upload-id="
@@ -59,14 +59,14 @@
       "
       "
     />
     />
 
 
-    <!-- 动态表填报弹窗(编辑模式) -->
+    <!-- 动态表填报弹窗(可编辑/只读由 isViewMode/viewModeForDialog 控制) -->
     <dynamic-table-dialog
     <dynamic-table-dialog
       :key="dynamicDialogKey"
       :key="dynamicDialogKey"
       :visible.sync="dynamicTableDialogVisible"
       :visible.sync="dynamicTableDialogVisible"
       :survey-data="currentTemplateRow || {}"
       :survey-data="currentTemplateRow || {}"
       :table-data="dynamicTableData"
       :table-data="dynamicTableData"
       :table-items="tableItems"
       :table-items="tableItems"
-      :is-view-mode="isViewMode"
+      :is-view-mode="viewModeForDialog"
       :request-type="2"
       :request-type="2"
       :audited-unit-id="auditedUnitId"
       :audited-unit-id="auditedUnitId"
       :upload-id="
       :upload-id="
@@ -384,6 +384,8 @@
         singleDialogVisible: false,
         singleDialogVisible: false,
         fixedDialogVisible: false,
         fixedDialogVisible: false,
         dynamicDialogVisible: false,
         dynamicDialogVisible: false,
+        // 在线填报/查看共用弹窗的只读控制
+        viewModeForDialog: false,
         // 在线填报(编辑)相关
         // 在线填报(编辑)相关
         surveyFormDialogVisible: false,
         surveyFormDialogVisible: false,
         fixedTableDialogVisible: false,
         fixedTableDialogVisible: false,
@@ -408,6 +410,8 @@
         if (!row) return
         if (!row) return
         this.currentTemplateRow = row
         this.currentTemplateRow = row
         this.surveyDetailData = {}
         this.surveyDetailData = {}
+        // 在线填报时使用页面传入的 isViewMode,不强制只读
+        this.viewModeForDialog = false
 
 
         const t = String(row.templateType || row.templatetype || '').trim()
         const t = String(row.templateType || row.templatetype || '').trim()
         // 1=单记录,2=固定表,3=动态表
         // 1=单记录,2=固定表,3=动态表
@@ -478,17 +482,57 @@
         }
         }
       },
       },
       // 模版查看:与 submitData.vue 的 handleViewTemplate 保持一致
       // 模版查看:与 submitData.vue 的 handleViewTemplate 保持一致
-      handleViewTemplate(row) {
+      async handleViewTemplate(row) {
         this.currentTemplateRow = row || null
         this.currentTemplateRow = row || null
         const t = String(
         const t = String(
           (row && (row.templateType || row.templatetype)) || ''
           (row && (row.templateType || row.templatetype)) || ''
         ).trim()
         ).trim()
-        if (t === '1') {
-          this.singleDialogVisible = true
-        } else if (t === '2') {
-          this.fixedDialogVisible = true
-        } else if (t === '3') {
-          this.dynamicDialogVisible = true
+        // 点击“查看”时,复用在线填报的弹窗和数据加载逻辑,但强制只读
+        this.viewModeForDialog = true
+        if (t === '1' || t === '2' || t === '3') {
+          if (!row) return
+          this.currentTemplateRow = row
+          this.surveyDetailData = {}
+          // 在线填报时使用页面传入的 isViewMode,不强制只读
+          this.viewModeForDialog = true
+
+          const t = String(row.templateType || row.templatetype || '').trim()
+          // 1=单记录,2=固定表,3=动态表
+          if (t === '1') {
+            // 只要有 uploadId/id 就尝试回显数据
+            if (row.uploadId || row.id) {
+              try {
+                const params = {
+                  uploadId: row.uploadId || row.id,
+                  auditedUnitId: this.auditedUnitId,
+                  type: 2,
+                }
+                const res = await getSurveyDetail(params)
+                if (res && res.code === 200 && res.value) {
+                  console.log(res, 'getUploadData')
+                  const detailData = {}
+                  if (Array.isArray(res.value)) {
+                    res.value.forEach((item) => {
+                      if (item.rowid && item.rvalue !== undefined) {
+                        detailData[item.rowid] = item.rvalue
+                      }
+                    })
+                  } else if (res.value && typeof res.value === 'object') {
+                    Object.assign(detailData, res.value)
+                  }
+                  this.surveyDetailData = detailData
+                }
+              } catch (err) {
+                console.error('获取单记录详情失败', err)
+              }
+            }
+            await this.initFormFields()
+          } else if (t === '2') {
+            await this.initFixedTableData()
+          } else if (t === '3') {
+            this.resetDynamicDialogState()
+            await this.initDynamicTableData()
+          }
         } else {
         } else {
           this.$message &&
           this.$message &&
             this.$message.warning &&
             this.$message.warning &&

+ 4 - 1
src/views/EntDeclaration/auditTaskManagement/components/FixedTableDialog.vue

@@ -79,7 +79,9 @@
     </el-table>
     </el-table>
 
 
     <div slot="footer" class="dialog-footer">
     <div slot="footer" class="dialog-footer">
-      <el-button type="primary" @click="handleSave">保存</el-button>
+      <el-button v-if="isViewMode" type="primary" @click="handleSave">
+        保存
+      </el-button>
       <el-button @click="handleCancel">取消</el-button>
       <el-button @click="handleCancel">取消</el-button>
     </div>
     </div>
   </el-dialog>
   </el-dialog>
@@ -311,6 +313,7 @@
       },
       },
       // 初始化表格数据
       // 初始化表格数据
       initTableData() {
       initTableData() {
+        console.log(this.isViewMode, '只读')
         if (!this.tableItems || this.tableItems.length === 0) {
         if (!this.tableItems || this.tableItems.length === 0) {
           // 如果没有传入数据,使用假数据
           // 如果没有传入数据,使用假数据
           this.tableData = this.getMockTableData()
           this.tableData = this.getMockTableData()

+ 12 - 0
src/views/EntDeclaration/auditTaskManagement/taskFillIn.vue

@@ -66,10 +66,12 @@
             <audit-document-tab
             <audit-document-tab
               :form-data="formData.auditDocument"
               :form-data="formData.auditDocument"
               :is-view-mode="isViewMode"
               :is-view-mode="isViewMode"
+              :pagination="auditDocumentPagination"
               @handleClick="handleClick"
               @handleClick="handleClick"
               @handleDownload="handleDownload"
               @handleDownload="handleDownload"
               @handleUpload="handleUpload"
               @handleUpload="handleUpload"
               @refresh="getAuditDocumentList"
               @refresh="getAuditDocumentList"
+              @paginationChange="handleAuditDocumentPaginationChange"
             />
             />
           </el-tab-pane>
           </el-tab-pane>
 
 
@@ -84,6 +86,8 @@
               :is-view-mode="isViewMode"
               :is-view-mode="isViewMode"
               :dict-data="dictData"
               :dict-data="dictData"
               :current-node="currentNode"
               :current-node="currentNode"
+              :audited-unit-id="auditedUnitId"
+              :task-id="taskId"
               @handleAddMaterial="handleAddMaterial"
               @handleAddMaterial="handleAddMaterial"
               @handleFileView="handleFileView"
               @handleFileView="handleFileView"
               @handleFileDownload="handleFileDownload"
               @handleFileDownload="handleFileDownload"
@@ -91,6 +95,9 @@
               @handleTemplateDownload="handleTemplateDownload"
               @handleTemplateDownload="handleTemplateDownload"
               @data-upload-success="getTaskRequirementPage"
               @data-upload-success="getTaskRequirementPage"
               @handleDataUpload="handleDataUpload"
               @handleDataUpload="handleDataUpload"
+              @handle-survey-form-save="getTaskRequirementPage"
+              @handle-fixed-table-save="getTaskRequirementPage"
+              @handle-dynamic-table-save="getTaskRequirementPage"
             />
             />
           </el-tab-pane>
           </el-tab-pane>
           <!-- 成本调查表 -->
           <!-- 成本调查表 -->
@@ -1474,6 +1481,11 @@
           this.auditDocumentPagination.total = res.value.value.total
           this.auditDocumentPagination.total = res.value.value.total
         })
         })
       },
       },
+      handleAuditDocumentPaginationChange(val) {
+        this.auditDocumentPagination.page = val.pageNum
+        this.auditDocumentPagination.pageSize = val.pageSize
+        this.getAuditDocumentList()
+      },
       handleClick(row) {},
       handleClick(row) {},
 
 
       // 下载文书
       // 下载文书

+ 13 - 7
src/views/costAudit/auditInfo/auditManage/auditDocumentsMain.vue

@@ -77,13 +77,19 @@
             >
             >
               上传附件
               上传附件
             </el-button> -->
             </el-button> -->
-            <el-button
-              type="text"
-              size="mini"
-              @click="handleViewScan(scope.row.feedbackDocumentUrl)"
-            >
-              查看附件
-            </el-button>
+            <div v-if="getDocumenType(scope.row).includes('送达回证')">
+              <span>
+                {{ scope.row.feedbackDocumentUrl ? '已回传' : '未回传' }}
+              </span>
+              <el-button
+                v-if="scope.row.feedbackDocumentUrl"
+                type="text"
+                size="mini"
+                @click="handleViewScan(scope.row.feedbackDocumentUrl)"
+              >
+                查看附件
+              </el-button>
+            </div>
           </template>
           </template>
           <template #electronicDocumentUrl="scope">
           <template #electronicDocumentUrl="scope">
             <el-button
             <el-button

+ 13 - 7
src/views/costAudit/projectInfo/auditTaskManage/taskCustomizedRelease/auditNoticeTab.vue

@@ -77,13 +77,19 @@
             >
             >
               上传附件
               上传附件
             </el-button> -->
             </el-button> -->
-            <el-button
-              type="text"
-              size="mini"
-              @click="handleViewScan(scope.row.feedbackDocumentUrl)"
-            >
-              查看附件
-            </el-button>
+            <div v-if="getDocumenType(scope.row).includes('送达回证')">
+              <span>
+                {{ scope.row.feedbackDocumentUrl ? '已回传' : '未回传' }}
+              </span>
+              <el-button
+                v-if="scope.row.feedbackDocumentUrl"
+                type="text"
+                size="mini"
+                @click="handleViewScan(scope.row.feedbackDocumentUrl)"
+              >
+                查看附件
+              </el-button>
+            </div>
           </template>
           </template>
           <template #electronicDocumentUrl="scope">
           <template #electronicDocumentUrl="scope">
             <el-button
             <el-button

+ 37 - 0
src/views/home/index.vue

@@ -532,6 +532,15 @@
       :current-status="cbjsInfoData && cbjsInfoData.status"
       :current-status="cbjsInfoData && cbjsInfoData.status"
     />
     />
     <taskDetail ref="taskDetail" />
     <taskDetail ref="taskDetail" />
+    <!-- 填报任务侧边弹窗 -->
+    <task-fill-in
+      ref="taskFillIn"
+      :visible.sync="taskFillInVisible"
+      :task-info="currentTaskInfo"
+      :view-mode="taskViewMode"
+      @close="handleTaskFillInClose"
+      @refresh="handleTaskFillInRefresh"
+    />
   </div>
   </div>
 </template>
 </template>
 
 
@@ -548,6 +557,7 @@
   import taskInfo from '@/components/task/taskInfo.vue'
   import taskInfo from '@/components/task/taskInfo.vue'
   import cbjsInfo from '@/components/task/cbjsInfo.vue'
   import cbjsInfo from '@/components/task/cbjsInfo.vue'
   import taskDetail from '@/components/task/taskDetail.vue'
   import taskDetail from '@/components/task/taskDetail.vue'
+  import TaskFillIn from '@/views/EntDeclaration/auditTaskManagement/taskFillIn.vue'
   export default {
   export default {
     name: 'Dashboard',
     name: 'Dashboard',
     components: {
     components: {
@@ -556,6 +566,7 @@
       cbjsInfo,
       cbjsInfo,
       mainDetailsDialog,
       mainDetailsDialog,
       taskDetail,
       taskDetail,
+      TaskFillIn,
     },
     },
     mixins: [regionMixin, memoManageMixin],
     mixins: [regionMixin, memoManageMixin],
     data() {
     data() {
@@ -591,6 +602,10 @@
         cbjsInfoData: null,
         cbjsInfoData: null,
         mainDetailsVisible: false,
         mainDetailsVisible: false,
         curOrg: '',
         curOrg: '',
+        // 填报任务弹窗相关
+        taskFillInVisible: false,
+        currentTaskInfo: {},
+        taskViewMode: false,
       }
       }
     },
     },
     watch: {
     watch: {
@@ -668,6 +683,28 @@
           this.loading = false
           this.loading = false
         }
         }
       },
       },
+      // 填报任务
+      handleEdit(row) {
+        console.log('填报任务', row)
+        this.currentTaskInfo = row || {}
+        this.taskViewMode = false
+        // 使用ref调用组件的open方法
+        this.$nextTick(() => {
+          if (this.$refs.taskFillIn) {
+            this.$refs.taskFillIn.open(row, false)
+          }
+        })
+      },
+      // 填报任务提交成功后刷新列表
+      handleTaskFillInRefresh() {
+        // 刷新列表数据
+        this.getEnterpriseTodoList()
+      },
+      // 填报任务弹窗关闭
+      handleTaskFillInClose() {
+        this.taskFillInVisible = false
+        this.currentTaskInfo = {}
+      },
       // 加载审核项目列表
       // 加载审核项目列表
       async loadAuditProjectList() {
       async loadAuditProjectList() {
         try {
         try {