Ver Fonte

修改bug,修改成本调查表,财务数据表,成本核定表问题,修改首页样式

zzw há 1 mês atrás
pai
commit
c758d9602b
27 ficheiros alterados com 4355 adições e 1021 exclusões
  1. 7 0
      src/api/costSurveyTemplateVersion.js
  2. 8 0
      src/api/dictionaryManage.js
  3. BIN
      src/assets/index_images/index-icon1@2x.png
  4. BIN
      src/assets/index_images/index-icon2@2x.png
  5. BIN
      src/assets/index_images/index-icon3@2x.png
  6. BIN
      src/assets/index_images/index-icon4@2x.png
  7. BIN
      src/assets/index_images/index-icon5@2x.png
  8. BIN
      src/assets/index_images/index-icon6-light@2x.png
  9. BIN
      src/assets/index_images/index-icon6@2x.png
  10. 1 1
      src/components/costAudit/CostAuditTable.vue
  11. 8 6
      src/components/costAudit/EstablishmentDialog.vue
  12. 45 0
      src/mixins/useDict.js
  13. 2 2
      src/views/costAudit/baseInfo/auditDocManage/index.vue
  14. 1 1
      src/views/costAudit/baseInfo/auditDocNoManage/index.vue
  15. 1 1
      src/views/costAudit/baseInfo/auditEntityManage/index.vue
  16. 2 2
      src/views/costAudit/baseInfo/auditReviewDocManage/index.vue
  17. 27 6
      src/views/costAudit/baseInfo/catalogManage/index.vue
  18. 75 5
      src/views/costAudit/baseInfo/catalogManage/surveyDialog.vue
  19. 2 3
      src/views/costAudit/baseInfo/costFormManage/index.vue
  20. 219 61
      src/views/costAudit/baseInfo/costFormManage/infoMaintain.vue
  21. 273 670
      src/views/costAudit/baseInfo/costVerifyManage/index.vue
  22. 2817 0
      src/views/costAudit/baseInfo/costVerifyManage/infoMaintain.vue
  23. 2 3
      src/views/costAudit/baseInfo/financeSheetManage/index.vue
  24. 234 57
      src/views/costAudit/baseInfo/financeSheetManage/infoMaintain.vue
  25. 2 1
      src/views/costAudit/projectInfo/auditProjectManage/memoManage/index.vue
  26. 2 2
      src/views/costAudit/projectInfo/auditTaskManage/taskCustomizedRelease/index.vue
  27. 627 200
      src/views/home/index.vue

+ 7 - 0
src/api/costSurveyTemplateVersion.js

@@ -58,3 +58,10 @@ export function putSurveyTemplatePublishVersion(data) {
     data: data,
   })
 }
+
+export function switchSurveyTemplateVersion(id) {
+  return request({
+    url: url + '/costSurveyTemplateVersion/v1/switch-version/' + id,
+    method: 'post',
+  })
+}

+ 8 - 0
src/api/dictionaryManage.js

@@ -39,6 +39,14 @@ export function getByTypeKey(params) {
     params,
   })
 }
+// 获取所有字典
+export function getDictTypList(params) {
+  return request({
+    url: `${url}/sys/sysType/v1/getByParentIdOrLikeName?catId=5&parentId=5`,
+    method: 'get',
+    params,
+  })
+}
 
 // 以下接口没有使用
 export function getDictTypeAll() {

BIN
src/assets/index_images/index-icon1@2x.png


BIN
src/assets/index_images/index-icon2@2x.png


BIN
src/assets/index_images/index-icon3@2x.png


BIN
src/assets/index_images/index-icon4@2x.png


BIN
src/assets/index_images/index-icon5@2x.png


BIN
src/assets/index_images/index-icon6-light@2x.png


BIN
src/assets/index_images/index-icon6@2x.png


+ 1 - 1
src/components/costAudit/CostAuditTable.vue

@@ -118,7 +118,7 @@
       <el-pagination
         v-bind="paginationProps"
         :current-page="pagination.currentPage"
-        :page-sizes="pagination.pageSizes || [10, 20, 30, 50]"
+        :page-sizes="pagination.pageSizes || [50, 100]"
         :page-size="pagination.pageSize"
         :layout="pagination.layout || 'total, sizes, prev, pager, next, jumper'"
         :total="pagination.total"

+ 8 - 6
src/components/costAudit/EstablishmentDialog.vue

@@ -52,7 +52,7 @@
             placeholder="请选择单位"
             clearable
             multiple
-            style="width: 78%"
+            style="width: 76%"
           >
             <el-option
               v-for="unit in unitList"
@@ -498,6 +498,7 @@
     watch: {
       visible(val) {
         // 当弹窗显示时初始化数据
+        // type 0 新建 1编辑 2查看 3快速立项
         if (this.type === 1 || this.type === 2) {
           if (val && this.initialData) {
             console.log('this.initialData', this.initialData)
@@ -509,7 +510,7 @@
               ? this.initialData.projectMembers.split(',')
               : []
             if (this.formData.auditPeriod) {
-              this.formData.auditPeriod = this.formData.auditPeriod
+              this.formData.auditPeriodArray = this.formData.auditPeriod
                 .split(',')
                 .map((year) => ({ value: year }))
             }
@@ -536,10 +537,11 @@
             : []
           this.formData.orgId = this.initialData.orgId
           this.formData.planYear = this.initialData.planYear
-          console.log(
-            'this.initialData.auditPeriod',
-            this.initialData.auditPeriod
-          )
+          if (this.formData.auditPeriod) {
+            this.formData.auditPeriodArray = this.initialData.auditPeriod
+              .split(',')
+              .map((year) => ({ value: year }))
+          }
         } else {
           this.formData.areaCode = ''
         }

+ 45 - 0
src/mixins/useDict.js

@@ -227,8 +227,53 @@ export const catalogMixin = {
         this.catalogListOptions = this.catalogListOptions
           .filter((item) => item.children && item.parentId === '0')
           .flatMap((item) => item.children)
+        // 递归过滤出status == 1(启用状态)的数据
+        this.catalogListOptions = this.filterEnabledCatalogsStrict(
+          this.catalogListOptions
+        )
       })
     },
+    /**
+     * 递归过滤出状态为启用(status == 1)的目录数据(严格模式)
+     * @param {Array} catalogs - 目录数据数组
+     * @returns {Array} 过滤后的目录数据
+     */
+    filterEnabledCatalogsStrict(catalogs) {
+      if (!Array.isArray(catalogs) || catalogs.length === 0) {
+        return []
+      }
+
+      const result = []
+
+      for (const catalog of catalogs) {
+        // 检查当前节点是否为启用状态
+        if (catalog.status == 1) {
+          // 创建当前节点的副本
+          const filteredCatalog = { ...catalog }
+
+          // 如果有子目录,递归过滤子目录
+          if (
+            filteredCatalog.children &&
+            Array.isArray(filteredCatalog.children)
+          ) {
+            filteredCatalog.children = this.filterEnabledCatalogsStrict(
+              filteredCatalog.children
+            )
+          }
+
+          result.push(filteredCatalog)
+        } else if (catalog.children && Array.isArray(catalog.children)) {
+          // 如果当前节点不是启用状态,但子节点中可能有启用的节点
+          const filteredChildren = this.filterEnabledCatalogsStrict(
+            catalog.children
+          )
+          // 如果有过滤后的子节点,将它们添加到结果中
+          result.push(...filteredChildren)
+        }
+      }
+
+      return result
+    },
   },
 }
 

+ 2 - 2
src/views/costAudit/baseInfo/auditDocManage/index.vue

@@ -99,7 +99,7 @@
     <div class="pagination-container">
       <el-pagination
         :current-page="currentPage"
-        :page-sizes="[10, 20, 50, 100]"
+        :page-sizes="[50, 100]"
         :page-size="pageSize"
         layout="total, sizes, prev, pager, next, jumper"
         :total="total"
@@ -208,7 +208,7 @@
         auditCatalogList: [],
         // 分页信息
         currentPage: 1,
-        pageSize: 10,
+        pageSize: 50,
         total: 0,
         // 对话框相关
         selectDialogVisible: false,

+ 1 - 1
src/views/costAudit/baseInfo/auditDocNoManage/index.vue

@@ -338,7 +338,7 @@
         // 当前页码
         currentPage: 1,
         // 每页显示条数
-        pageSize: 10,
+        pageSize: 50,
         // 总记录数
         total: 0,
         // 选中的行数据

+ 1 - 1
src/views/costAudit/baseInfo/auditEntityManage/index.vue

@@ -97,7 +97,7 @@
         tableData: [],
         pagination: {
           currentPage: 1,
-          pageSize: 10,
+          pageSize: 50,
           total: 0,
         },
         dialogVisible: false,

+ 2 - 2
src/views/costAudit/baseInfo/auditReviewDocManage/index.vue

@@ -216,7 +216,7 @@
       <div class="pagination">
         <el-pagination
           :current-page="currentPage"
-          :page-sizes="[10, 20, 50, 100]"
+          :page-sizes="[50, 100]"
           :page-size="pageSize"
           layout="total, sizes, prev, pager, next, jumper"
           :total="total"
@@ -557,7 +557,7 @@
         // 当前页码
         currentPage: 1,
         // 每页显示条数
-        pageSize: 10,
+        pageSize: 50,
         // 总记录数
         total: 0,
         // 选中的行数据

+ 27 - 6
src/views/costAudit/baseInfo/catalogManage/index.vue

@@ -1343,12 +1343,33 @@
 
             // 移除不需要的属性
             this.tableListData = this.removeItemFromTree(this.tableListData)
-
-            // 使用函数式方法直接生成新的tableData
-            this.tableData = this.tableListData
-              .filter((item) => item.children && item.parentId === '0')
-              .flatMap((item) => item.children)
-
+            this.tableData - []
+            // 直接返回所有顶级目录的子项元素,扁平化处理
+            // 先清空数组,避免数据积累
+            this.tableData = []
+            // 使用Set来跟踪已添加的ID,避免重复项
+            const addedIds = new Set()
+            this.tableListData.forEach((item) => {
+              if (
+                item.parentId === '0' &&
+                item.children &&
+                item.children.length > 0
+              ) {
+                // 处理顶级目录的子项
+                item.children.forEach((child) => {
+                  if (child.id && !addedIds.has(child.id)) {
+                    addedIds.add(child.id)
+                    this.tableData.push(child)
+                  }
+                })
+              } else if (item.parentId != '0') {
+                // 处理非顶级目录项
+                if (item.id && !addedIds.has(item.id)) {
+                  addedIds.add(item.id)
+                  this.tableData.push(item)
+                }
+              }
+            })
             this.loading = false
           })
           .catch(() => {

+ 75 - 5
src/views/costAudit/baseInfo/catalogManage/surveyDialog.vue

@@ -10,7 +10,7 @@
       @cancel="handleCancel"
     >
       <div class="content-edit-container">
-        <div class="table-header-info">
+        <div class="table-header-info mb20">
           <div class="table-name">
             表名:{{ contentEditForm.surveyTemplateName }}
           </div>
@@ -69,10 +69,45 @@
                 width="100"
                 align="center"
                 prop="orderNum"
-              ></el-table-column>
+              >
+                <template slot-scope="scope">
+                  {{
+                    scope.row.fixedValues ? scope.row.fixedValues['序号'] : ''
+                  }}
+                </template>
+              </el-table-column>
+              <el-table-column label="父子节点关系" align="center" width="120">
+                <template slot-scope="scope">
+                  <el-tag
+                    v-if="
+                      scope.row.isChild ||
+                      scope.row.isSubItem ||
+                      (scope.row.parentid &&
+                        scope.row.parentid != -1 &&
+                        scope.row.parentid != '-1')
+                    "
+                    type="success"
+                    size="small"
+                  >
+                    子项
+                  </el-tag>
+                  <el-tag
+                    v-else-if="
+                      scope.row.parentid === -1 ||
+                      scope.row.parentid === '-1' ||
+                      !scope.row.parentid
+                    "
+                    type="primary"
+                    size="small"
+                  >
+                    父项
+                  </el-tag>
+                  <el-tag v-else type="info" size="small">无</el-tag>
+                </template>
+              </el-table-column>
               <el-table-column
                 v-for="(item, index) in contentEditForm.fixedTable
-                  .fixedTablesTitle"
+                  .fixedTableHeaders"
                 :key="index"
                 :label="item.rkey"
                 align="center"
@@ -85,6 +120,24 @@
                   }}
                 </template>
               </el-table-column>
+              <el-table-column
+                label="指标编号"
+                width="100"
+                align="center"
+                prop="cellCode"
+              ></el-table-column>
+              <el-table-column
+                label="计算公式"
+                width="100"
+                align="center"
+                prop="calculationFormula"
+              ></el-table-column>
+              <el-table-column
+                label="单位"
+                width="100"
+                align="center"
+                prop="unit"
+              ></el-table-column>
             </el-table>
           </div>
         </div>
@@ -101,10 +154,18 @@
                 width="100"
                 align="center"
                 prop="orderNum"
-              ></el-table-column>
+              >
+                <template slot-scope="scope">
+                  {{
+                    scope.row.dynamicValues
+                      ? scope.row.dynamicValues['序号']
+                      : ''
+                  }}
+                </template>
+              </el-table-column>
               <el-table-column
                 v-for="(item, index) in contentEditForm.dynamicTable
-                  .dynamicTablesTitle"
+                  .dynamicTableHeaders"
                 :key="index"
                 :label="item.rkey"
                 align="center"
@@ -179,12 +240,14 @@
             tableHeaders: [],
             fixedTables: [],
             fixedTablesTitle: [],
+            fixedTableHeaders: [],
           },
           // 动态表列表
           dynamicTable: {
             tableHeaders: [],
             dynamicTables: [],
             dynamicTablesTitle: [],
+            dynamicTableHeaders: [],
           },
           isDynamicTables: false,
           isFixedTables: false,
@@ -253,6 +316,10 @@
           responseData.value.fixedFields || ''
         )
         const fixedTitles = this.contentEditForm.fixedTable.fixedTablesTitle
+        this.contentEditForm.fixedTable.fixedTableHeaders =
+          this.contentEditForm.fixedTable.fixedTablesTitle.filter(
+            (title) => title.rkey !== '序号'
+          )
 
         // 清空现有数据
         this.contentEditForm.fixedTable.fixedTables = []
@@ -302,6 +369,8 @@
           this.stringToObjects(responseData.value.fixedFields || '')
         const dynamicTitles =
           this.contentEditForm.dynamicTable.dynamicTablesTitle
+        this.contentEditForm.dynamicTable.dynamicTableHeaders =
+          dynamicTitles.filter((title) => title.rkey !== '序号')
 
         // 按orderNum分组数据
         const groupedData = {}
@@ -383,6 +452,7 @@
 </script>
 
 <style scoped lang="scss">
+  @import '@/styles/costAudit.scss';
   .survey-dialog-container {
     .content-edit-container {
       .table-header-info {

+ 2 - 3
src/views/costAudit/baseInfo/costFormManage/index.vue

@@ -264,9 +264,8 @@
         // 分页信息
         pagination: {
           currentPage: 1,
-          pageSize: 10,
-          total: 7,
-          pageSizes: [10, 20, 30, 50],
+          pageSize: 50,
+          total: 0,
         },
         // 加载状态
         loading: false,

+ 219 - 61
src/views/costAudit/baseInfo/costFormManage/infoMaintain.vue

@@ -89,13 +89,19 @@
             size="small"
             @click="handleEdit(row)"
           >
-            编辑
+            修改
           </el-button>
-          <el-button type="text" size="small" @click="handleDelete(row)">
+          <el-button
+            v-if="row.status != '0'"
+            class="delete-btn"
+            type="text"
+            size="small"
+            @click="handleDelete(row)"
+          >
             删除
           </el-button>
           <el-button
-            v-if="row.status === '0' || row.status === '-1'"
+            v-if="row.status === '-1'"
             type="text"
             size="small"
             @click="handleEditContent(row)"
@@ -173,7 +179,7 @@
           ></el-input>
         </el-form-item>
       </el-form>
-      <div slot="footer">
+      <div slot="footer" class="dialog-footer">
         <el-button @click="dialogVisible = false">取消</el-button>
         <el-button type="primary" @click="submitForm">确定</el-button>
       </div>
@@ -183,7 +189,7 @@
     <el-dialog
       title="内容维护"
       :visible.sync="contentEditDialogVisible"
-      width="70%"
+      width="75%"
       class="content-edit-dialog"
     >
       <div class="content-edit-container">
@@ -206,15 +212,47 @@
               </el-radio>
             </el-radio-group>
           </div>
+          <div v-if="viewDetail" class="detail-info-container">
+            <div class="detail-item">
+              <span class="detail-label">版本号:</span>
+              <span class="detail-value">{{ detailForm.versionNo }}</span>
+            </div>
+            <div class="detail-item">
+              <span class="detail-label">状态:</span>
+              <span class="detail-value">
+                {{ forStatus(detailForm.status) }}
+              </span>
+            </div>
+            <div class="detail-item">
+              <span class="detail-label">创建人:</span>
+              <span class="detail-value">{{ detailForm.createBy }}</span>
+            </div>
+            <div class="detail-item">
+              <span class="detail-label">创建时间:</span>
+              <span class="detail-value">{{ detailForm.createTime }}</span>
+            </div>
+            <div class="detail-item">
+              <span class="detail-label">备注:</span>
+              <span class="detail-value">{{ detailForm.remarks }}</span>
+            </div>
+          </div>
         </div>
 
         <!-- 单记录列表 -->
         <div v-if="contentEditForm.templateType === '1'">
           <div class="button-group">
-            <el-button type="primary" @click="handleAddTableHeader('单记录')">
+            <el-button
+              type="primary"
+              :disabled="viewDetail"
+              @click="handleAddTableHeader('单记录')"
+            >
               添加项目
             </el-button>
-            <el-button type="primary" @click="handleSaveContent('单记录')">
+            <el-button
+              type="primary"
+              :disabled="viewDetail"
+              @click="handleSaveContent('单记录')"
+            >
               保存
             </el-button>
           </div>
@@ -239,6 +277,7 @@
                     v-model="scope.row.fieldName"
                     placeholder="请输入字段名称"
                     size="small"
+                    :disabled="viewDetail"
                   ></el-input>
                 </template>
               </el-table-column>
@@ -248,6 +287,7 @@
                     v-model="scope.row.fieldType"
                     placeholder="请选择字段类型"
                     size="small"
+                    :disabled="viewDetail"
                     @change="handleFieldTypeChange(scope.row)"
                   >
                     <el-option label="字符串" value="string"></el-option>
@@ -271,6 +311,7 @@
                       placeholder="请输入长度"
                       size="small"
                       style="width: calc(100% - 80px)"
+                      :disabled="viewDetail"
                     ></el-input>
                   </div>
 
@@ -285,6 +326,7 @@
                       placeholder="整数位数"
                       size="small"
                       style="width: 80px; margin: 0 5px"
+                      :disabled="viewDetail"
                     ></el-input>
                   </div>
 
@@ -299,6 +341,7 @@
                       placeholder="小数位数"
                       size="small"
                       style="width: 80px; margin-left: 5px"
+                      :disabled="viewDetail"
                     ></el-input>
                   </div>
 
@@ -312,6 +355,7 @@
                       placeholder="请选择日期格式"
                       size="small"
                       style="width: 100%"
+                      :disabled="viewDetail"
                     >
                       <el-option
                         label="yyyy-MM-dd HH:mm:ss"
@@ -330,6 +374,7 @@
                       placeholder="请选择布尔值格式"
                       size="small"
                       style="width: 100%"
+                      :disabled="viewDetail"
                     >
                       <el-option label="是" value="true"></el-option>
                       <el-option label="否" value="false"></el-option>
@@ -340,6 +385,7 @@
                     v-model="scope.row.format"
                     :placeholder="getFormatPlaceholder(scope.row.fieldType)"
                     size="small"
+                    :disabled="viewDetail"
                   ></el-input>
                 </template>
               </el-table-column>
@@ -349,7 +395,7 @@
                   <el-select
                     v-model="scope.row.isRequired"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   >
                     <el-option label="是" value="true"></el-option>
                     <el-option label="否" value="false"></el-option>
@@ -362,7 +408,7 @@
                   <el-select
                     v-model="scope.row.showVisible"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   >
                     <el-option label="是" value="1"></el-option>
                     <el-option label="否" value="0"></el-option>
@@ -377,6 +423,7 @@
                       v-model="scope.row.isDict"
                       size="small"
                       style="width: 80px"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @change="handleBindDictChange(scope.row)"
                     >
                       <el-option label="是" value="true"></el-option>
@@ -389,12 +436,13 @@
                       class="dict-select"
                       size="small"
                       style="width: 120px; margin-top: 5px"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     >
                       <el-option
                         v-for="(item, index) in dictTypeList"
                         :key="index"
-                        :label="item.dictName"
-                        :value="String(item.dictId)"
+                        :label="item.name"
+                        :value="String(item.id)"
                       ></el-option>
                     </el-select>
                   </div>
@@ -407,6 +455,7 @@
                     <el-button
                       type="text"
                       size="mini"
+                      :disabled="viewDetail"
                       @click="
                         handleDeleteHeader(scope.$index, '单记录', scope.row)
                       "
@@ -417,6 +466,7 @@
                       v-if="scope.$index !== 0"
                       type="text"
                       size="mini"
+                      :disabled="viewDetail"
                       @click="handleMoveUp(scope.$index)"
                     >
                       上升
@@ -427,6 +477,7 @@
                       "
                       type="text"
                       size="mini"
+                      :disabled="viewDetail"
                       @click="handleMoveDown(scope.$index)"
                     >
                       下降
@@ -442,11 +493,16 @@
           <div class="button-group">
             <el-button
               type="primary"
+              :disabled="viewDetail"
               @click="handleAddTableHeader('固定表表头')"
             >
               添加表头
             </el-button>
-            <el-button type="primary" @click="handleSaveContent('固定表表头')">
+            <el-button
+              type="primary"
+              :disabled="viewDetail"
+              @click="handleSaveContent('固定表表头')"
+            >
               下一步
             </el-button>
           </div>
@@ -471,7 +527,7 @@
                     v-model="scope.row.fieldName"
                     placeholder="请输入字段名称"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   ></el-input>
                 </template>
               </el-table-column>
@@ -481,7 +537,7 @@
                     v-model="scope.row.fieldType"
                     placeholder="请选择字段类型"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                     @change="handleFieldTypeChange(scope.row)"
                   >
                     <el-option label="字符串" value="string"></el-option>
@@ -505,7 +561,7 @@
                       placeholder="请输入长度"
                       size="small"
                       style="width: calc(100% - 80px)"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     ></el-input>
                   </div>
 
@@ -520,7 +576,7 @@
                       placeholder="整数位数"
                       size="small"
                       style="width: 80px; margin: 0 5px"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     ></el-input>
                   </div>
 
@@ -535,7 +591,7 @@
                       placeholder="小数位数"
                       size="small"
                       style="width: 80px; margin-left: 5px"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     ></el-input>
                   </div>
                   <!-- 日期类型格式 -->
@@ -567,7 +623,7 @@
                       placeholder="请选择布尔值格式"
                       size="small"
                       style="width: 100%"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     >
                       <el-option label="是" value="true"></el-option>
                       <el-option label="否" value="false"></el-option>
@@ -579,7 +635,7 @@
                     v-model="scope.row.format"
                     :placeholder="getFormatPlaceholder(scope.row.fieldType)"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   ></el-input>
                 </template>
               </el-table-column>
@@ -589,7 +645,7 @@
                   <el-select
                     v-model="scope.row.isRequired"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   >
                     <el-option label="是" value="true"></el-option>
                     <el-option label="否" value="false"></el-option>
@@ -602,7 +658,7 @@
                   <el-select
                     v-model="scope.row.showVisible"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   >
                     <el-option label="是" value="1"></el-option>
                     <el-option label="否" value="0"></el-option>
@@ -619,21 +675,52 @@
                   <el-select
                     v-model="scope.row.isAuditPeriod"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   >
                     <el-option label="是" value="true"></el-option>
                     <el-option label="否" value="false"></el-option>
                   </el-select>
                 </template>
               </el-table-column>
-
+              <el-table-column prop="isDict" label="绑定字典" min-width="150">
+                <template slot-scope="scope">
+                  <div class="bind-dict-column">
+                    <el-select
+                      v-model="scope.row.isDict"
+                      size="small"
+                      style="width: 80px"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                      @change="handleBindDictChange(scope.row)"
+                    >
+                      <el-option label="是" value="true"></el-option>
+                      <el-option label="否" value="false"></el-option>
+                    </el-select>
+                    <el-select
+                      v-if="scope.row.isDict === 'true'"
+                      v-model="scope.row.dictid"
+                      placeholder="请选择字典"
+                      class="dict-select"
+                      size="small"
+                      style="width: 120px; margin-top: 5px"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                    >
+                      <el-option
+                        v-for="(item, index) in dictTypeList"
+                        :key="index"
+                        :label="item.name"
+                        :value="String(item.id)"
+                      ></el-option>
+                    </el-select>
+                  </div>
+                </template>
+              </el-table-column>
               <el-table-column label="操作" width="150" fixed="right">
                 <template slot-scope="scope">
                   <div class="table-actions">
                     <el-button
                       type="text"
                       size="mini"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @click="
                         handleDeleteHeader(
                           scope.$index,
@@ -648,7 +735,7 @@
                       v-if="scope.$index !== 0"
                       type="text"
                       size="mini"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @click="handleMoveUp(scope.$index)"
                     >
                       上升
@@ -659,7 +746,7 @@
                       "
                       type="text"
                       size="mini"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @click="handleMoveDown(scope.$index)"
                     >
                       下降
@@ -673,12 +760,14 @@
             <div class="button-group">
               <el-button
                 type="primary"
+                :disabled="viewDetail"
                 @click="handleAddTableHeader('固定表项目')"
               >
                 添加项目
               </el-button>
               <el-button
                 type="primary"
+                :disabled="viewDetail"
                 @click="handleSaveContent('固定表项目')"
               >
                 保存
@@ -701,6 +790,7 @@
                       "
                       size="small"
                       placeholder="数字或中文"
+                      :disabled="viewDetail"
                       @input="handleFixedValueChange(scope.row, '序号', $event)"
                     ></el-input>
                   </template>
@@ -753,6 +843,7 @@
                           : ''
                       "
                       size="small"
+                      :disabled="viewDetail"
                       @input="
                         handleFixedValueChange(scope.row, item.rkey, $event)
                       "
@@ -764,6 +855,7 @@
                     <el-input
                       :value="scope.row.cellCode"
                       size="small"
+                      :disabled="viewDetail"
                       @input="(val) => $set(scope.row, 'cellCode', val)"
                     ></el-input>
                   </template>
@@ -774,6 +866,7 @@
                       v-model="scope.row.calculationFormula"
                       size="small"
                       readonly
+                      :disabled="viewDetail"
                       @click.native="
                         openCalculationFormulaDialogVisible(
                           scope.row,
@@ -788,6 +881,7 @@
                     <el-input
                       :value="scope.row.unit"
                       size="small"
+                      :disabled="viewDetail"
                       @input="(val) => $set(scope.row, 'unit', val)"
                     ></el-input>
                   </template>
@@ -796,8 +890,10 @@
                   <template slot-scope="scope">
                     <div class="table-actions">
                       <el-button
+                        v-if="!scope.row.isChild"
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="
                           handleAddChildItem(
                             scope.$index,
@@ -811,6 +907,7 @@
                       <el-button
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="
                           handleDeleteHeader(
                             scope.$index,
@@ -836,6 +933,7 @@
                         "
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="handleMoveDown(scope.$index, '固定表')"
                       >
                         下降
@@ -852,11 +950,16 @@
           <div class="button-group">
             <el-button
               type="primary"
+              :disabled="viewDetail"
               @click="handleAddTableHeader('动态表表头')"
             >
               添加表头
             </el-button>
-            <el-button type="primary" @click="handleSaveContent('动态表表头')">
+            <el-button
+              type="primary"
+              :disabled="viewDetail"
+              @click="handleSaveContent('动态表表头')"
+            >
               下一步
             </el-button>
           </div>
@@ -881,7 +984,7 @@
                     v-model="scope.row.fieldName"
                     placeholder="请输入字段名称"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   ></el-input>
                 </template>
               </el-table-column>
@@ -891,7 +994,7 @@
                     v-model="scope.row.fieldType"
                     placeholder="请选择字段类型"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                     @change="handleFieldTypeChange(scope.row)"
                   >
                     <el-option label="字符串" value="string"></el-option>
@@ -915,7 +1018,7 @@
                       placeholder="请输入长度"
                       size="small"
                       style="width: calc(100% - 80px)"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     ></el-input>
                   </div>
 
@@ -930,7 +1033,7 @@
                       placeholder="整数位数"
                       size="small"
                       style="width: 80px; margin: 0 5px"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     ></el-input>
                   </div>
 
@@ -945,7 +1048,7 @@
                       placeholder="小数位数"
                       size="small"
                       style="width: 80px; margin-left: 5px"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     ></el-input>
                   </div>
 
@@ -959,7 +1062,7 @@
                       placeholder="请选择日期格式"
                       size="small"
                       style="width: 100%"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     >
                       <el-option
                         label="yyyy-MM-dd HH:mm:ss"
@@ -978,7 +1081,7 @@
                       placeholder="请选择布尔值格式"
                       size="small"
                       style="width: 100%"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     >
                       <el-option label="是" value="true"></el-option>
                       <el-option label="否" value="false"></el-option>
@@ -990,7 +1093,7 @@
                     v-model="scope.row.format"
                     :placeholder="getFormatPlaceholder(scope.row.fieldType)"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   ></el-input>
                 </template>
               </el-table-column>
@@ -1000,7 +1103,7 @@
                   <el-select
                     v-model="scope.row.isRequired"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   >
                     <el-option label="是" value="true"></el-option>
                     <el-option label="否" value="false"></el-option>
@@ -1013,21 +1116,52 @@
                   <el-select
                     v-model="scope.row.showVisible"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   >
                     <el-option label="是" value="1"></el-option>
                     <el-option label="否" value="0"></el-option>
                   </el-select>
                 </template>
               </el-table-column>
-
+              <el-table-column prop="isDict" label="绑定字典" min-width="150">
+                <template slot-scope="scope">
+                  <div class="bind-dict-column">
+                    <el-select
+                      v-model="scope.row.isDict"
+                      size="small"
+                      style="width: 80px"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                      @change="handleBindDictChange(scope.row)"
+                    >
+                      <el-option label="是" value="true"></el-option>
+                      <el-option label="否" value="false"></el-option>
+                    </el-select>
+                    <el-select
+                      v-if="scope.row.isDict === 'true'"
+                      v-model="scope.row.dictid"
+                      placeholder="请选择字典"
+                      class="dict-select"
+                      size="small"
+                      style="width: 120px; margin-top: 5px"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                    >
+                      <el-option
+                        v-for="(item, index) in dictTypeList"
+                        :key="index"
+                        :label="item.name"
+                        :value="String(item.id)"
+                      ></el-option>
+                    </el-select>
+                  </div>
+                </template>
+              </el-table-column>
               <el-table-column label="操作" width="150" fixed="right">
                 <template slot-scope="scope">
                   <div class="table-actions">
                     <el-button
                       type="text"
                       size="mini"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @click="
                         handleDeleteHeader(
                           scope.$index,
@@ -1042,7 +1176,7 @@
                       v-if="scope.$index !== 0"
                       type="text"
                       size="mini"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @click="handleMoveUp(scope.$index)"
                     >
                       上升
@@ -1053,7 +1187,7 @@
                       "
                       type="text"
                       size="mini"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @click="handleMoveDown(scope.$index)"
                     >
                       下降
@@ -1067,12 +1201,14 @@
             <div class="button-group">
               <el-button
                 type="primary"
+                :disabled="viewDetail"
                 @click="handleAddTableHeader('动态表项目')"
               >
                 添加项目
               </el-button>
               <el-button
                 type="primary"
+                :disabled="viewDetail"
                 @click="handleSaveContent('动态表项目')"
               >
                 保存
@@ -1095,6 +1231,7 @@
                       "
                       size="small"
                       placeholder="数字或中文"
+                      :disabled="viewDetail"
                       @input="
                         handleDynamicValueChange(scope.row, '序号', $event)
                       "
@@ -1149,6 +1286,7 @@
                           : ''
                       "
                       size="small"
+                      :disabled="viewDetail"
                       @input="
                         handleDynamicValueChange(scope.row, item.rkey, $event)
                       "
@@ -1159,8 +1297,10 @@
                   <template slot-scope="scope">
                     <div class="table-actions">
                       <el-button
+                        v-if="!scope.row.isChild"
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="
                           handleAddChildItem(
                             scope.$index,
@@ -1174,6 +1314,7 @@
                       <el-button
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="
                           handleDeleteHeader(
                             scope.$index,
@@ -1188,6 +1329,7 @@
                         v-if="scope.$index !== 0"
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="handleMoveUp(scope.$index, '动态表')"
                       >
                         上升
@@ -1199,6 +1341,7 @@
                         "
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="handleMoveDown(scope.$index, '动态表')"
                       >
                         下降
@@ -1301,7 +1444,7 @@
     getDataStorageTableOptions,
   } from '@/api/costFormManage'
   import CostAuditTable from '@/components/costAudit/CostAuditTable.vue'
-  import { getDictTypeAll } from '@/api/dictionaryManage.js'
+  import { getDictTypList } from '@/api/dictionaryManage.js'
   import {
     listByTemplateIdAndVersion,
     getCellCodesByTemplateId,
@@ -1339,11 +1482,12 @@
         selectedRows: [],
         pagination: {
           currentPage: 1,
-          pageSize: 10,
+          pageSize: 50,
           total: 0, // 初始化为0
         },
         dialogVisible: false,
         detailDialogVisible: false,
+        viewDetail: false,
         contentEditDialogVisible: false,
         calculationFormulaDialogVisible: false,
         currentEditingRow: null,
@@ -1587,22 +1731,14 @@
       },
     },
     mounted() {
-      if (this.$route.params.id) {
-        this.id = this.$route.params.id
-        this.contentEditForm.tableName = this.$route.params.tableName || ''
-        this.contentEditForm.templateType =
-          this.$route.params.templateType || '固定表'
-      }
-      // this.loadDictTypeList()
       this.isAutoGeneratedFormula = false
     },
     methods: {
       async loadDictTypeList() {
         try {
-          const res = await getDictTypeAll()
-          this.dictTypeList = res.value
+          const res = await getDictTypList()
+          this.dictTypeList = res || []
         } catch (error) {
-          this.$message.error('加载字典类型失败')
           console.error('加载字典类型失败:', error)
         }
       },
@@ -1614,6 +1750,7 @@
         this.surveyTemplateName = row.surveyTemplateName
         this.contentEditForm.templateType = row.templateType
         this.handleSearch()
+        this.loadDictTypeList()
       },
       handleBack() {
         this.$emit('back', 'list')
@@ -1908,8 +2045,10 @@
 
       // 查看详情
       handleViewDetail(row) {
+        this.viewDetail = true
         this.detailForm = { ...row }
-        this.detailDialogVisible = true
+        // this.detailDialogVisible = true
+        this.handleEditContent(row)
       },
       // 添加子项方法
       handleAddChildItem(index, type, parentRow) {
@@ -3093,14 +3232,15 @@
             newRow.orderNum = parseInt(item.orderNum, 10) || 0
           }
 
-          // 初始化dynamicValues并填充实际值,但排除序号相关字段
+          // 初始化dynamicValues并填充实际值
           dynamicTitles.forEach((title) => {
-            // 排除序号相关字段,避免重复显示序号列
-            if (
-              title.rkey !== '序号' &&
-              title.rkey !== 'ordernum' &&
-              title.rkey !== 'orderText'
-            ) {
+            // 特殊处理序号字段,需要保存到dynamicValues中供输入框使用
+            if (title.rkey === '序号') {
+              // 优先使用item中的序号值,如果没有则保持为空
+              newRow.dynamicValues[title.rkey] = item[title.rkey] || ''
+            }
+            // 排除其他序号相关字段,避免重复显示
+            else if (title.rkey !== 'ordernum' && title.rkey !== 'orderText') {
               newRow.dynamicValues[title.rkey] = item[title.rkey] || ''
             }
           })
@@ -3411,4 +3551,22 @@
       }
     }
   }
+  .detail-info-container {
+    margin: 20px 0;
+    border-radius: 4px;
+    .detail-item {
+      display: inline-block;
+      margin-right: 30px;
+      margin-bottom: 10px;
+
+      .detail-label {
+        font-weight: bold;
+        color: #606266;
+      }
+
+      .detail-value {
+        color: #303133;
+      }
+    }
+  }
 </style>

Diff do ficheiro suprimidas por serem muito extensas
+ 273 - 670
src/views/costAudit/baseInfo/costVerifyManage/index.vue


+ 2817 - 0
src/views/costAudit/baseInfo/costVerifyManage/infoMaintain.vue

@@ -0,0 +1,2817 @@
+<template>
+  <div>
+    <div class="top-wrapper">
+      <el-button plain type="primary" icon="el-icon-back" @click="handleBack">
+        返回
+      </el-button>
+      <div class="title ml20">{{ surveyTemplateName }}内容维护</div>
+    </div>
+    <!-- 搜索面板 -->
+    <div class="search-panel mt20">
+      <el-form :inline="true" :model="searchForm" label-width="80px">
+        <el-form-item label="状态:">
+          <el-select
+            v-model="searchForm.status"
+            placeholder="请选择状态"
+            style="width: 180px"
+          >
+            <el-option label="全部" value=""></el-option>
+            <el-option label="草稿" value="-1"></el-option>
+            <el-option label="现行版本" value="0"></el-option>
+            <el-option label="历史版本" value="1"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" @click="handleSearch">
+            查询
+          </el-button>
+          <el-button
+            plain
+            type="primary"
+            icon="el-icon-refresh"
+            @click="handleReset"
+          >
+            重置
+          </el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <!-- 操作栏 -->
+    <div class="operation-bar">
+      <el-button
+        plain
+        type="success"
+        icon="el-icon-circle-plus"
+        @click="handleAdd"
+      >
+        添加
+      </el-button>
+      <el-button
+        plain
+        type="danger"
+        icon="el-icon-delete"
+        :disabled="selectedRows.length === 0"
+        @click="handleBatchDelete"
+      >
+        批量删除
+      </el-button>
+    </div>
+
+    <!-- 表格 -->
+    <div class="table-container">
+      <CostAuditTable
+        ref="costAuditTable"
+        :table-data="tableData"
+        :columns="tableColumns"
+        :show-selection="true"
+        :show-index="true"
+        :show-pagination="true"
+        :pagination="pagination"
+        :loading="loading"
+        @selection-change="handleSelectionChange"
+        @pagination-change="handlePaginationChange"
+      >
+        <!-- 创建时间自定义单元格 -->
+        <template #createTime="{ row }">
+          <div>{{ row.createTime ? row.createTime.split(' ')[0] : '-' }}</div>
+          <div>{{ row.createTime ? row.createTime.split(' ')[1] : '-' }}</div>
+        </template>
+
+        <!-- 操作列 -->
+        <template #action="{ row }">
+          <el-button type="text" size="small" @click="handleViewDetail(row)">
+            详情
+          </el-button>
+          <el-button
+            v-if="row.status === '-1'"
+            class="delete-btn"
+            type="text"
+            size="small"
+            @click="handleEdit(row)"
+          >
+            修改
+          </el-button>
+          <el-button
+            v-if="row.status != '0'"
+            type="text"
+            size="small"
+            @click="handleDelete(row)"
+          >
+            删除
+          </el-button>
+          <el-button
+            v-if="row.status === '-1'"
+            type="text"
+            size="small"
+            @click="handleEditContent(row)"
+          >
+            内容维护
+          </el-button>
+          <el-button
+            v-if="row.status === '-1'"
+            type="text"
+            size="small"
+            @click="handleStatus(row)"
+          >
+            启用
+          </el-button>
+          <el-button
+            v-if="row.status === '0'"
+            type="text"
+            size="small"
+            @click="handleStatus(row)"
+          >
+            停用
+          </el-button>
+        </template>
+      </CostAuditTable>
+    </div>
+
+    <!-- 添加/修改弹窗 -->
+    <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="600px">
+      <el-form
+        ref="dataForm"
+        :model="dataForm"
+        :rules="dataFormRules"
+        label-width="120px"
+        class="data-form"
+      >
+        <el-form-item label="创建人" prop="createBy">
+          <el-input
+            v-model="dataForm.createBy"
+            placeholder="请输入创建人"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="创建时间" prop="createTime">
+          <el-date-picker
+            v-model="dataForm.createTime"
+            type="datetime"
+            placeholder="选择日期时间"
+            style="width: 100%"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="备注">
+          <el-input
+            v-model="dataForm.remarks"
+            type="textarea"
+            placeholder="请输入备注"
+            rows="3"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取消</el-button>
+        <el-button type="primary" @click="submitForm">确认</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 内容修改弹窗 -->
+    <el-dialog
+      title="内容维护"
+      :visible.sync="contentEditDialogVisible"
+      width="70%"
+      class="content-edit-dialog"
+    >
+      <div class="content-edit-container">
+        <div class="table-header-info">
+          <!-- <div class="table-name">表名:{{ contentEditForm.tableName }}</div> -->
+          <div class="table-style mb20">
+            表单样式:
+            <el-radio-group
+              v-model="contentEditForm.templateType"
+              @change="handleFormStyleChange"
+            >
+              <el-radio v-if="contentEditForm.templateType === '1'" label="1">
+                单记录
+              </el-radio>
+              <el-radio v-if="contentEditForm.templateType === '2'" label="2">
+                固定表
+              </el-radio>
+              <el-radio v-if="contentEditForm.templateType === '3'" label="3">
+                动态表
+              </el-radio>
+            </el-radio-group>
+          </div>
+          <div v-if="viewDetail" class="detail-info-container">
+            <div class="detail-item">
+              <span class="detail-label">版本号:</span>
+              <span class="detail-value">{{ detailForm.versionNo }}</span>
+            </div>
+            <div class="detail-item">
+              <span class="detail-label">状态:</span>
+              <span class="detail-value">
+                {{ forStatus(detailForm.status) }}
+              </span>
+            </div>
+            <div class="detail-item">
+              <span class="detail-label">创建人:</span>
+              <span class="detail-value">{{ detailForm.createBy }}</span>
+            </div>
+            <div class="detail-item">
+              <span class="detail-label">创建时间:</span>
+              <span class="detail-value">{{ detailForm.createTime }}</span>
+            </div>
+            <div class="detail-item">
+              <span class="detail-label">备注:</span>
+              <span class="detail-value">{{ detailForm.remarks }}</span>
+            </div>
+          </div>
+        </div>
+
+        <div>
+          <div class="mb20">
+            <el-button
+              v-if="!contentEditForm.surveyTemplateId"
+              type="primary"
+              class="mr20"
+              :disabled="viewDetail"
+              @click="handleGenerateTemplate"
+            >
+              生成模版
+            </el-button>
+            <el-button
+              type="primary"
+              :disabled="viewDetail"
+              @click="handleSaveTemplate"
+            >
+              保存模版
+            </el-button>
+          </div>
+          <div
+            v-if="contentEditForm.surveyTemplateId"
+            class="table-edit-container"
+          >
+            <div class="mb20">
+              <el-button
+                type="primary"
+                :disabled="viewDetail"
+                @click="handleAddTableHeader('固定表表头')"
+              >
+                添加表头
+              </el-button>
+              <el-button
+                type="primary"
+                @click="handleSaveContent('固定表表头')"
+              >
+                保存表头
+              </el-button>
+            </div>
+            <div class="table-edit-container">
+              <el-table
+                :data="contentEditForm.fixedTable.tableHeaders"
+                border
+                style="width: 100%"
+              >
+                <el-table-column label="序号" width="80" align="center">
+                  <template slot-scope="scope">
+                    <span>{{ scope.$index + 1 }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  prop="fieldName"
+                  label="字段名称"
+                  min-width="150"
+                  align="center"
+                >
+                  <template slot-scope="scope">
+                    <el-input
+                      v-model="scope.row.fieldName"
+                      placeholder="请输入字段名称"
+                      size="small"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                      @change="handleFieldNameChange(scope.row)"
+                    ></el-input>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  prop="fieldType"
+                  label="字段类型"
+                  width="120"
+                  align="center"
+                >
+                  <template slot-scope="scope">
+                    <el-select
+                      v-model="scope.row.fieldType"
+                      placeholder="请选择字段类型"
+                      size="small"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                      @change="handleFieldTypeChange(scope.row)"
+                    >
+                      <el-option label="字符串" value="string"></el-option>
+                      <el-option label="整数" value="integer"></el-option>
+                      <el-option label="小数" value="double"></el-option>
+                      <el-option label="日期" value="datetime"></el-option>
+                      <el-option label="布尔值" value="boolean"></el-option>
+                    </el-select>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  prop="format"
+                  label="格式"
+                  width="220"
+                  align="center"
+                >
+                  <template slot-scope="scope">
+                    <!-- 字符串类型格式 -->
+                    <div
+                      v-if="scope.row.fieldType === 'string'"
+                      class="format-input"
+                    >
+                      <span class="format-prefix">长度</span>
+                      <el-input
+                        v-model="scope.row.format"
+                        placeholder="请输入长度"
+                        size="small"
+                        style="width: calc(100% - 80px); margin-left: 5px"
+                        :disabled="scope.row.isDisabled || viewDetail"
+                      ></el-input>
+                    </div>
+
+                    <!-- 整数类型格式 -->
+                    <div
+                      v-else-if="scope.row.fieldType === 'integer'"
+                      class="format-input"
+                    >
+                      <span class="format-prefix">整数</span>
+                      <el-input
+                        v-model="scope.row.fieldTypelen"
+                        placeholder="整数位数"
+                        size="small"
+                        style="width: calc(100% - 80px); margin: 0 5px"
+                        :disabled="scope.row.isDisabled || viewDetail"
+                      ></el-input>
+                    </div>
+
+                    <!-- 小数类型格式 -->
+                    <div
+                      v-else-if="scope.row.fieldType === 'double'"
+                      class="format-input"
+                    >
+                      <span class="format-prefix">小数</span>
+                      <el-input
+                        v-model="scope.row.fieldTypenointlen"
+                        placeholder="小数位数"
+                        size="small"
+                        style="width: calc(100% - 80px); margin-left: 5px"
+                        :disabled="scope.row.isDisabled || viewDetail"
+                      ></el-input>
+                    </div>
+                    <!-- 日期类型格式 -->
+                    <div
+                      v-else-if="scope.row.fieldType === 'datetime'"
+                      class="format-input"
+                    >
+                      <el-select
+                        v-model="scope.row.format"
+                        placeholder="请选择日期格式"
+                        size="small"
+                        style="width: 100%"
+                        :disabled="scope.row.isDisabled || viewDetail"
+                      >
+                        <el-option
+                          label="yyyy-MM-dd HH:mm:ss"
+                          value="yyyy-MM-dd HH:mm:ss"
+                        ></el-option>
+                        <el-option
+                          label="yyyy-MM-dd"
+                          value="yyyy-MM-dd"
+                        ></el-option>
+                      </el-select>
+                    </div>
+                    <!-- 布尔类型格式 -->
+                    <div v-else-if="scope.row.fieldType === 'boolean'">
+                      <el-select
+                        v-model="scope.row.format"
+                        placeholder="请选择布尔值格式"
+                        size="small"
+                        style="width: 100%"
+                        :disabled="scope.row.isDisabled || viewDetail"
+                      >
+                        <el-option label="true" value="true"></el-option>
+                        <el-option label="false" value="false"></el-option>
+                      </el-select>
+                    </div>
+                    <!-- 默认情况 -->
+                    <el-input
+                      v-else
+                      v-model="scope.row.format"
+                      :placeholder="getFormatPlaceholder(scope.row.fieldType)"
+                      size="small"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                    ></el-input>
+                  </template>
+                </el-table-column>
+
+                <el-table-column
+                  prop="isRequired"
+                  label="是否必填"
+                  width="120"
+                  align="center"
+                >
+                  <template slot-scope="scope">
+                    <el-select
+                      v-model="scope.row.isRequired"
+                      size="small"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                    >
+                      <el-option label="是" value="true"></el-option>
+                      <el-option label="否" value="false"></el-option>
+                    </el-select>
+                  </template>
+                </el-table-column>
+
+                <el-table-column
+                  prop="showVisible"
+                  label="是否显示"
+                  width="120"
+                  align="center"
+                >
+                  <template slot-scope="scope">
+                    <el-select
+                      v-model="scope.row.showVisible"
+                      size="small"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                    >
+                      <el-option label="是" value="1"></el-option>
+                      <el-option label="否" value="0"></el-option>
+                    </el-select>
+                  </template>
+                </el-table-column>
+
+                <el-table-column
+                  prop="isAuditPeriod"
+                  label="是否绑定监审期间"
+                  width="140"
+                  align="center"
+                >
+                  <template slot-scope="scope">
+                    <el-select
+                      v-model="scope.row.isAuditPeriod"
+                      size="small"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                    >
+                      <el-option label="是" value="true"></el-option>
+                      <el-option label="否" value="false"></el-option>
+                    </el-select>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="isDict" label="绑定字典" min-width="150">
+                  <template slot-scope="scope">
+                    <div class="bind-dict-column">
+                      <el-select
+                        v-model="scope.row.isDict"
+                        size="small"
+                        style="width: 80px"
+                        :disabled="scope.row.isDisabled || viewDetail"
+                        @change="handleBindDictChange(scope.row)"
+                      >
+                        <el-option label="是" value="true"></el-option>
+                        <el-option label="否" value="false"></el-option>
+                      </el-select>
+                      <el-select
+                        v-if="scope.row.isDict === 'true'"
+                        v-model="scope.row.dictid"
+                        placeholder="请选择字典"
+                        class="dict-select"
+                        size="small"
+                        style="width: 120px; margin-top: 5px"
+                        :disabled="scope.row.isDisabled || viewDetail"
+                      >
+                        <el-option
+                          v-for="(item, index) in dictTypeList"
+                          :key="index"
+                          :label="item.name"
+                          :value="String(item.id)"
+                        ></el-option>
+                      </el-select>
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="操作"
+                  width="150"
+                  fixed="right"
+                  align="center"
+                >
+                  <template slot-scope="scope">
+                    <div class="table-actions">
+                      <el-button
+                        type="text"
+                        size="mini"
+                        :disabled="scope.row.isDisabled || viewDetail"
+                        @click="
+                          handleDeleteHeader(
+                            scope.$index,
+                            '固定表表头',
+                            scope.row
+                          )
+                        "
+                      >
+                        删除
+                      </el-button>
+                      <el-button
+                        v-if="scope.$index !== 0"
+                        type="text"
+                        size="mini"
+                        :disabled="scope.row.isDisabled || viewDetail"
+                        @click="handleMoveUp(scope.$index)"
+                      >
+                        上升
+                      </el-button>
+                      <el-button
+                        v-if="
+                          scope.$index !==
+                          contentEditForm.fixedTable.tableHeaders.length - 1
+                        "
+                        type="text"
+                        size="mini"
+                        :disabled="scope.row.isDisabled || viewDetail"
+                        @click="handleMoveDown(scope.$index)"
+                      >
+                        下降
+                      </el-button>
+                    </div>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div>
+              <div class="button-group mt20 mb20">
+                <el-button
+                  type="primary"
+                  :disabled="viewDetail"
+                  @click="handleAddTableHeader('固定表项目')"
+                >
+                  添加项目
+                </el-button>
+              </div>
+              <div class="table-edit-container">
+                <el-table
+                  :data="contentEditForm.fixedTable.fixedTables"
+                  border
+                  style="width: 100%"
+                  @selection-change="handleSelectionChange"
+                >
+                  <el-table-column label="序号" width="150" align="center">
+                    <template slot-scope="scope">
+                      <div class="row-indent-container">
+                        <el-input
+                          :value="
+                            scope.row.fixedValues
+                              ? scope.row.fixedValues['序号']
+                              : ''
+                          "
+                          size="small"
+                          placeholder="数字或中文"
+                          :disabled="viewDetail"
+                          @input="
+                            handleFixedValueChange(scope.row, '序号', $event)
+                          "
+                        ></el-input>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    label="父子节点关系"
+                    align="center"
+                    width="120"
+                  >
+                    <template slot-scope="scope">
+                      <el-tag
+                        v-if="
+                          scope.row.isChild ||
+                          scope.row.isSubItem ||
+                          (scope.row.parentid &&
+                            scope.row.parentid != -1 &&
+                            scope.row.parentid != '-1')
+                        "
+                        type="success"
+                        size="small"
+                      >
+                        子项
+                      </el-tag>
+                      <el-tag
+                        v-else-if="
+                          scope.row.parentid === -1 ||
+                          scope.row.parentid === '-1' ||
+                          !scope.row.parentid
+                        "
+                        type="primary"
+                        size="small"
+                      >
+                        父项
+                      </el-tag>
+                      <el-tag v-else type="info" size="small">无</el-tag>
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    v-for="(item, index) in contentEditForm.fixedTable
+                      .fixedTableHeaders"
+                    :key="index"
+                    :label="item.rkey"
+                    align="center"
+                  >
+                    <template slot-scope="scope">
+                      <div class="row-indent-container">
+                        <el-input
+                          :value="
+                            scope.row.fixedValues
+                              ? scope.row.fixedValues[item.rkey]
+                              : ''
+                          "
+                          size="small"
+                          :disabled="viewDetail"
+                          @input="
+                            handleFixedValueChange(scope.row, item.rkey, $event)
+                          "
+                        ></el-input>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="指标编号" width="100" align="center">
+                    <template slot-scope="scope">
+                      <div class="row-indent-container">
+                        <el-input
+                          :value="scope.row.cellCode"
+                          size="small"
+                          :disabled="viewDetail"
+                          @input="(val) => $set(scope.row, 'cellCode', val)"
+                        ></el-input>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    label="计算公式"
+                    width="150"
+                    align="center"
+                    show-overflow-tooltip
+                  >
+                    <template slot-scope="scope">
+                      <div class="row-indent-container">
+                        <el-input
+                          :value="scope.row.calculationFormula"
+                          size="small"
+                          readonly
+                          :disabled="viewDetail"
+                          @click.native="
+                            openCalculationFormulaDialogVisible(
+                              scope.row,
+                              scope.$index
+                            )
+                          "
+                        ></el-input>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="单位" width="80" align="center">
+                    <template slot-scope="scope">
+                      <div class="row-indent-container">
+                        <el-input
+                          :value="scope.row.unit"
+                          size="small"
+                          :disabled="viewDetail"
+                          @input="(val) => $set(scope.row, 'unit', val)"
+                        ></el-input>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    label="操作"
+                    align="center"
+                    fixed="right"
+                    width="200"
+                  >
+                    <template slot-scope="scope">
+                      <div class="table-actions">
+                        <el-button
+                          v-if="!scope.row.isChild"
+                          type="text"
+                          size="mini"
+                          :disabled="viewDetail"
+                          @click="
+                            handleAddChildItem(
+                              scope.$index,
+                              '固定表项目',
+                              scope.row
+                            )
+                          "
+                        >
+                          添加子项
+                        </el-button>
+                        <el-button
+                          type="text"
+                          size="mini"
+                          :disabled="viewDetail"
+                          @click="
+                            handleDeleteHeader(
+                              scope.$index,
+                              '固定表项目',
+                              scope.row
+                            )
+                          "
+                        >
+                          删除
+                        </el-button>
+                        <el-button
+                          v-if="scope.$index !== 0"
+                          type="text"
+                          size="mini"
+                          :disabled="viewDetail"
+                          @click="handleMoveUp(scope.$index, '固定表')"
+                        >
+                          上升
+                        </el-button>
+                        <el-button
+                          v-if="
+                            scope.$index !==
+                            contentEditForm.fixedTable.fixedTables.length - 1
+                          "
+                          type="text"
+                          size="mini"
+                          :disabled="viewDetail"
+                          @click="handleMoveDown(scope.$index, '固定表')"
+                        >
+                          下降
+                        </el-button>
+                      </div>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </el-dialog>
+    <el-dialog
+      title="计算公式"
+      :visible.sync="calculationFormulaDialogVisible"
+      width="500px"
+      :before-close="handleDialogClose"
+    >
+      <!-- 单选按钮组:切换“当前指标项”/“其他模板指标项” -->
+      <el-radio-group v-model="radioType">
+        <el-radio label="current">当前指标项</el-radio>
+        <el-radio label="other">其他模板指标项</el-radio>
+      </el-radio-group>
+
+      <!-- 「当前指标项」内容区域 -->
+      <div v-if="radioType === 'current'" class="current-panel">
+        <el-input
+          v-model="formulaText"
+          type="textarea"
+          rows="4"
+          placeholder="请输入公式(如 C1+C2+C3)"
+        />
+      </div>
+
+      <!-- 「其他模板指标项」内容区域 -->
+      <div v-else class="other-panel">
+        <el-select
+          v-model="selectedTemplateId"
+          placeholder="请选择模板"
+          @change="handleTemplateChange"
+        >
+          <el-option
+            v-for="(item, index) in templateList"
+            :key="index"
+            :label="item.surveyTemplateName"
+            :value="item.pkVal"
+          ></el-option>
+        </el-select>
+
+        <!-- 指标表格 -->
+        <el-table
+          ref="indicatorTable"
+          :data="indicatorTableData"
+          border
+          style="width: 100%; margin-top: 10px"
+          @row-click="handleRowClick"
+        >
+          <el-table-column label="选择" width="60">
+            <template #default="scope">
+              <el-checkbox
+                v-model="scope.row.checked"
+                @change="handleCheckboxChange(scope.row)"
+                @click.stop
+              ></el-checkbox>
+            </template>
+          </el-table-column>
+          <el-table-column prop="code" label="指标编号"></el-table-column>
+          <el-table-column prop="name" label="项目名称"></el-table-column>
+        </el-table>
+        <el-input
+          v-model="formulaText"
+          type="textarea"
+          rows="4"
+          placeholder="请输入公式(如 C1+C2+C3)"
+          @input="handleFormulaTextChange"
+        />
+      </div>
+
+      <!-- 弹窗底部按钮 -->
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button type="primary" @click="handleConfirm">确定</el-button>
+          <el-button @click="calculationFormulaDialogVisible = false">
+            取消
+          </el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  // 导入API模块
+  import {
+    getCostFormList,
+    addCostForm,
+    editCostForm,
+    deleteCostForm,
+    getDataStorageTableOptions,
+    getCostFormVersionsByTemplateId,
+    batchSaveOrUpdate,
+  } from '@/api/costFormManage'
+  import CostAuditTable from '@/components/costAudit/CostAuditTable.vue'
+  import { getDictTypList } from '@/api/dictionaryManage.js'
+  import {
+    listByTemplateIdAndVersion,
+    getCellCodesByTemplateId,
+  } from '@/api/costSurveyTemplateItems'
+  import {
+    addSurveyTemplateVersion,
+    delSurveyTemplateVersionById,
+    putSurveyTemplatePublishVersion,
+    getCostSurveyTemplateVersionsByTemplateId,
+    batchDeleteCostForm,
+  } from '@/api/costSurveyTemplateVersion'
+  // import { getListFixedEnabled } from '@/api/costSurveyTemplate'
+  import {
+    // getListBySurveyTemplateId,
+    getListBySurveyTemplateIdAndVersion,
+    getBatchSaveOrUpdate,
+  } from '@/api/costSurveyTemplateHeaders'
+  import {
+    getlistBySurveyTemplateId,
+    batchDeleteCostVerifyForm,
+    getlistBySurveyTemplateIdcurrentversion,
+    batchSave,
+    enable,
+    getListFixedEnabled,
+    listByVerifyTemplateId,
+  } from '@/api/costVerifyManage'
+  import { commonMixin } from '@/mixins/useDict'
+  import { mapState } from 'vuex'
+  export default {
+    name: 'InfoMaintain',
+    components: {
+      CostAuditTable,
+    },
+    mixins: [commonMixin],
+    data() {
+      return {
+        surveyTemplateName: '',
+        loading: false,
+        searchForm: {
+          status: '',
+        },
+        tableData: [],
+        currentRow: null,
+        selectedRows: [],
+        pagination: {
+          currentPage: 1,
+          pageSize: 50,
+          total: 0, // 初始化为0
+        },
+        dialogVisible: false,
+        detailDialogVisible: false,
+        viewDetail: false,
+        contentEditDialogVisible: false,
+        calculationFormulaDialogVisible: false,
+        currentEditingRow: null,
+        currentEditingRowIndex: -1,
+        radioType: 'current',
+        formulaText: 'C1+C2+C3',
+        templateName: '',
+        templateList: [],
+        indicatorTableData: [],
+        selectedIndicatorCodes: [],
+        selectedIndicatorsPerTemplate: {},
+        dialogTitle: '',
+        dataForm: {
+          id: null,
+          version: '',
+          status: '',
+          createBy: '',
+          createTime: '',
+          remark: '',
+        },
+        detailForm: {
+          id: null,
+          version: '',
+          status: '',
+          createBy: '',
+          createTime: '',
+          remark: '',
+        },
+        contentEditForm: {
+          tableName: '',
+          templateType: '1',
+          versionId: '',
+          // 单记录列表
+          tableHeaders: [],
+          // 固定表列表
+          fixedTable: {
+            tableHeaders: [],
+            fixedTables: [],
+            fixedTablesTitle: [],
+            fixedTableHeaders: [],
+          },
+          // 动态表列表
+          dynamicTable: {
+            tableHeaders: [],
+            dynamicTables: [],
+            dynamicTablesTitle: [],
+            dynamicTableHeaders: [],
+          },
+          isDynamicTables: false,
+          isFixedTables: false,
+        },
+        tableKey: 0, // 用于强制刷新表格
+        dataFormRules: {
+          status: [
+            { required: true, message: '请选择状态', trigger: 'change' },
+          ],
+          createBy: [
+            { required: true, message: '请输入创建人', trigger: 'blur' },
+          ],
+          createTime: [
+            { required: true, message: '请选择创建时间', trigger: 'change' },
+          ],
+        },
+        id: '', // 从路由获取的ID
+        dataStorageTableOptions: [], // 数据存储库表选项
+        surveyTemplateId: '', // 成本调查表ID
+        versionId: '',
+        dictTypeList: [],
+      }
+    },
+    computed: {
+      ...mapState('user', ['userInfo', 'username']),
+      formatter: (status) => {
+        return status === '-1' ? '草稿' : status === '0' ? '现行' : '历史'
+      },
+      tableColumns() {
+        return [
+          {
+            prop: 'versionNo',
+            label: '版本号',
+            align: 'center',
+            showOverflowTooltip: true,
+          },
+          {
+            prop: 'status',
+            label: '状态',
+            align: 'center',
+            formatter: (row) => {
+              return row.status == '-1'
+                ? '草稿'
+                : row.status == '0'
+                ? '现行'
+                : '历史'
+            },
+          },
+          {
+            prop: 'createBy',
+            label: '创建人',
+            align: 'center',
+          },
+          {
+            prop: 'createTime',
+            label: '创建时间',
+            showOverflowTooltip: true,
+            slotName: 'createTime',
+          },
+          {
+            prop: 'remarks',
+            label: '备注',
+            align: 'center',
+            showOverflowTooltip: true,
+          },
+          {
+            prop: 'action',
+            width: '270',
+            label: '操作',
+            align: 'center',
+            fixed: 'right',
+            slotName: 'action',
+          },
+        ]
+      },
+    },
+    watch: {
+      indicatorTableData: {
+        handler(newVal) {
+          if (this.radioType === 'other' && this.selectedTemplateId) {
+            this.$set(
+              this.selectedIndicatorsPerTemplate,
+              this.selectedTemplateId,
+              newVal.filter((item) => item.checked)
+            )
+          }
+
+          this.updateSelectedIndicatorCodes()
+        },
+        deep: true,
+      },
+
+      selectedIndicatorCodes: {
+        handler(newVal) {
+          if (this.radioType === 'other') {
+            const allSelectedTemplateIds = [
+              ...new Set([
+                this.selectedTemplateId,
+                ...Object.keys(this.selectedIndicatorsPerTemplate).filter(
+                  (id) =>
+                    id !== this.selectedTemplateId &&
+                    this.selectedIndicatorsPerTemplate[id].some(
+                      (item) => item.checked
+                    )
+                ),
+              ]),
+            ].filter((id) => id)
+
+            const isSingleTemplate = allSelectedTemplateIds.length === 1
+
+            if (isSingleTemplate && allSelectedTemplateIds[0]) {
+              const selectedTemplate = this.templateList.find(
+                (item) => item.pkVal === allSelectedTemplateIds[0]
+              )
+              const templateNameYw = selectedTemplate
+                ? selectedTemplate.surveyTemplateNameYw ||
+                  selectedTemplate.surveyTemplateName ||
+                  ''
+                : ''
+
+              let selectedItems = []
+              if (allSelectedTemplateIds[0] === this.selectedTemplateId) {
+                selectedItems = newVal
+              } else {
+                selectedItems = this.selectedIndicatorsPerTemplate[
+                  allSelectedTemplateIds[0]
+                ]
+                  .filter((item) => item.checked)
+                  .map(
+                    (item) => `${templateNameYw}.${item.code || item.cellCode}`
+                  )
+              }
+
+              if (selectedItems.length > 0) {
+                this.formulaText = selectedItems.join('+')
+                this.isAutoGeneratedFormula = true
+              } else if (this.isAutoGeneratedFormula) {
+                this.formulaText = ''
+              }
+            } else {
+              let allSelectedCodes = []
+
+              if (newVal.length > 0 && this.selectedTemplateId) {
+                allSelectedCodes = [...newVal]
+              }
+
+              Object.keys(this.selectedIndicatorsPerTemplate).forEach(
+                (templateId) => {
+                  if (templateId !== this.selectedTemplateId) {
+                    const items = this.selectedIndicatorsPerTemplate[templateId]
+                    const selectedTemplate = this.templateList.find(
+                      (item) => item.pkVal === templateId
+                    )
+                    const templateName = selectedTemplate
+                      ? selectedTemplate.surveyTemplateNameYw ||
+                        selectedTemplate.surveyTemplateName ||
+                        ''
+                      : ''
+
+                    items
+                      .filter((item) => item.checked)
+                      .forEach((item) => {
+                        allSelectedCodes.push(
+                          `${templateName}.${item.code || item.cellCode}`
+                        )
+                      })
+                  }
+                }
+              )
+
+              if (allSelectedCodes.length > 0) {
+                this.formulaText = allSelectedCodes.join('+')
+                this.isAutoGeneratedFormula = true
+              } else if (this.isAutoGeneratedFormula) {
+                this.formulaText = ''
+              }
+            }
+          } else if (newVal.length > 0 && this.radioType === 'current') {
+            if (
+              !this.formulaText ||
+              this.formulaText === 'C1+C2+C3' ||
+              this.isAutoGeneratedFormula
+            ) {
+              this.formulaText = newVal.join('+')
+              this.isAutoGeneratedFormula = true
+            }
+          } else if (newVal.length === 0 && this.radioType === 'current') {
+            if (this.isAutoGeneratedFormula) {
+              this.formulaText = ''
+            }
+          }
+        },
+        deep: true,
+      },
+    },
+    mounted() {
+      // this.loadDictTypeList()
+      this.isAutoGeneratedFormula = false
+    },
+    methods: {
+      async loadDictTypeList() {
+        try {
+          const res = await getDictTypList()
+          this.dictTypeList = res || []
+        } catch (error) {
+          this.$message.error('加载字典类型失败')
+          console.error('加载字典类型失败:', error)
+        }
+      },
+      getTemplateRow(row) {
+        this.currentRow = row
+        this.surveyTemplateId = row.surveyTemplateId
+        this.templateType = row.templateType
+        this.contentEditForm.tableName = row.storageTable
+        this.surveyTemplateName = row.surveyTemplateName
+        this.contentEditForm.templateType = row.templateType
+        this.handleSearch(row)
+        this.loadDictTypeList()
+      },
+      handleBack() {
+        this.$emit('back', 'list')
+      },
+      // 查询
+      handleSearch(row) {
+        // todo: 获取所有版本数据
+        this.tableData.push(row)
+        this.pagination.total = 1
+        return
+        this.loading = true
+        const params = {
+          surveyTemplateId: this.surveyTemplateId,
+          status: this.searchForm.status,
+          // pageNum: this.pagination.currentPage,
+          // pageSize: this.pagination.pageSize,
+        }
+
+        // 根据成本调查表ID获取所有版本数据
+        getCostSurveyTemplateVersionsByTemplateId(params)
+          .then((response) => {
+            this.tableData = response.value || []
+            this.pagination.total = response.total || 0
+            this.loading = false
+          })
+          .catch((error) => {
+            console.error('查询失败:', error)
+            this.loading = false
+          })
+      },
+
+      // 重置
+      handleReset() {
+        this.searchForm = {
+          status: '',
+        }
+        this.pagination.currentPage = 1
+        this.handleSearch()
+      },
+      handleRowClick(row, column, event) {
+        if (column && column.property !== 'checked') {
+          this.toggleRowSelection(row)
+        }
+      },
+      toggleRowSelection(row) {
+        // 切换选中状态
+        this.$set(row, 'checked', !row.checked)
+
+        // 格式化代码并存储在行数据中
+        if (row.checked) {
+          this.formatRowCode(row)
+        }
+
+        // 触发选中状态更新
+        this.$forceUpdate()
+      },
+      handleCheckboxChange(row) {
+        this.$set(row, 'checked', !row.checked)
+
+        if (row.checked) {
+          this.formatRowCode(row)
+        }
+
+        this.updateSelectedIndicatorCodes()
+
+        this.$forceUpdate()
+      },
+      updateSelectedIndicatorCodes() {
+        // 获取当前选中的行
+        const selectedRows = this.indicatorTableData.filter(
+          (item) => item.checked
+        )
+
+        // 更新选中的指标代码列表
+        this.selectedIndicatorCodes = selectedRows.map((item) => {
+          // 获取选中的模板信息
+          const selectedTemplate = this.templateList.find(
+            (template) => template.pkVal === this.selectedTemplateId
+          )
+
+          // 获取模板的 surveyTemplateNameYw
+          const templateName = selectedTemplate
+            ? selectedTemplate.surveyTemplateNameYw ||
+              selectedTemplate.surveyTemplateName ||
+              ''
+            : ''
+
+          return templateName
+            ? `${templateName}.${item.code || item.cellCode || ''}`
+            : item.code || item.cellCode || ''
+        })
+      },
+      formatRowCode(row) {
+        const selectedTemplate = this.templateList.find(
+          (item) => item.pkVal === this.selectedTemplateId
+        )
+
+        const surveyTemplateNameYw = selectedTemplate
+          ? selectedTemplate.surveyTemplateNameYw ||
+            selectedTemplate.surveyTemplateName ||
+            ''
+          : ''
+
+        const formattedCode = surveyTemplateNameYw
+          ? `${surveyTemplateNameYw}.${row.code || row.cellCode || ''}`
+          : row.code || row.cellCode || ''
+
+        this.$set(row, 'formattedCode', formattedCode)
+
+        const templateCode = surveyTemplateNameYw
+          ? `${surveyTemplateNameYw}_${row.code || row.cellCode || ''}`
+          : row.code || row.cellCode || ''
+
+        this.$set(
+          row,
+          'jsonStr',
+          JSON.stringify([
+            {
+              [templateCode]: this.selectedTemplateId,
+            },
+          ])
+        )
+      },
+      openCalculationFormulaDialogVisible(row, index) {
+        this.currentEditingRow = row
+        this.currentEditingRowIndex = index
+        this.calculationFormulaDialogVisible = true
+        this.formulaText = row.calculationFormula || ''
+        this.selectedTemplateId = '' // 重置选中的模板
+        this.indicatorTableData = [] // 清空指标数据
+        this.getListFixedEnabled()
+      },
+
+      getListFixedEnabled() {
+        getListFixedEnabled().then((res) => {
+          this.templateList = res.value
+        })
+      },
+      // 处理模板选择变化
+      handleTemplateChange(templateId) {
+        if (templateId) {
+          // 根据选中的模板ID查找对应的surveyTemplateId
+          const selectedTemplate = this.templateList.find(
+            (item) => item.pkVal === templateId
+          )
+
+          if (selectedTemplate && selectedTemplate.surveyTemplateId) {
+            this.getCellCodesByTemplateId(selectedTemplate.surveyTemplateId)
+          } else {
+            this.indicatorTableData = []
+          }
+        } else {
+          this.indicatorTableData = []
+        }
+
+        // 恢复该模板之前选中的指标项
+        this.$nextTick(() => {
+          if (this.selectedIndicatorsPerTemplate[templateId]) {
+            this.indicatorTableData.forEach((item) => {
+              const isSelected = this.selectedIndicatorsPerTemplate[
+                templateId
+              ].some((selectedItem) => selectedItem.code === item.code)
+              this.$set(item, 'checked', isSelected)
+
+              if (isSelected) {
+                this.formatRowCode(item)
+              }
+            })
+          }
+
+          // 更新选中的指标代码列表
+          this.updateSelectedIndicatorCodes()
+        })
+      },
+
+      handleDialogClose(done) {
+        this.selectedIndicatorsPerTemplate = {}
+        done()
+      },
+      handleConfirm() {
+        const result = {
+          type: this.radioType,
+          formula: this.formulaText,
+          selectedTemplate: this.selectedTemplateId,
+          selectedItems: this.indicatorTableData.filter((item) => item.checked),
+        }
+
+        // 生成 jsonstr 字段
+        const jsonStrArray = this.indicatorTableData
+          .filter((item) => item.checked)
+          .map((item) => {
+            if (item.jsonStr) {
+              try {
+                return JSON.parse(item.jsonStr)[0]
+              } catch (e) {
+                console.error('解析 jsonStr 失败:', e)
+                return {}
+              }
+            }
+            return {}
+          })
+          .filter((item) => Object.keys(item).length > 0)
+
+        const jsonstr = JSON.stringify(jsonStrArray)
+
+        // 更新当前编辑行的计算公式值
+        if (this.currentEditingRow) {
+          this.$set(
+            this.currentEditingRow,
+            'calculationFormula',
+            this.formulaText
+          )
+
+          this.$set(this.currentEditingRow, 'jsonstr', jsonstr)
+        }
+
+        console.log('点击了确定,获取到的数据:', {
+          ...result,
+          jsonstr: jsonstr,
+        })
+
+        // 清空当前操作的状态
+        this.calculationFormulaDialogVisible = false
+        this.currentEditingRow = null
+        this.currentEditingRowIndex = -1
+        this.isAutoGeneratedFormula = false
+        this.selectedTemplateId = ''
+        this.indicatorTableData = []
+        this.selectedIndicatorsPerTemplate = {} // 清空模板选中记录
+      },
+      // 获取单元格代码
+      getCellCodesByTemplateId(surveyTemplateId) {
+        getCellCodesByTemplateId(surveyTemplateId)
+          .then((res) => {
+            // 将返回的数据转换为表格需要的格式
+            if (res.value && Array.isArray(res.value)) {
+              this.indicatorTableData = res.value.map((item) => ({
+                ...item,
+                checked: false,
+                code: item.cellCode || '',
+                name: item.rvalue || '',
+                formattedCode: '', // 添加格式化代码字段
+              }))
+            } else {
+              this.indicatorTableData = []
+            }
+          })
+          .catch((error) => {
+            console.error('获取指标数据失败:', error)
+            this.$message.error('获取指标数据失败')
+            this.indicatorTableData = []
+          })
+      },
+      handleFormulaTextChange(value) {
+        // 当用户手动修改公式文本时,标记为非自动生成
+        this.isAutoGeneratedFormula = false
+      },
+
+      handleAdd() {
+        this.dialogTitle = '添加'
+        // 获取当前时间
+        const now = new Date()
+        // 格式化时间为YYYY-MM-DD HH:mm:ss
+        const formattedDate = `${now.getFullYear()}-${String(
+          now.getMonth() + 1
+        ).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(
+          now.getHours()
+        ).padStart(2, '0')}:${String(now.getMinutes()).padStart(
+          2,
+          '0'
+        )}:${String(now.getSeconds()).padStart(2, '0')}`
+
+        this.dataForm = {
+          id: null,
+          version: '',
+          status: '',
+          createBy: this.username,
+          createTime: formattedDate,
+          remarks: '',
+        }
+        this.dialogVisible = true
+      },
+
+      // 修改
+      handleEdit(row) {
+        this.dialogTitle = '修改'
+        this.dataForm = { ...row }
+        this.dialogVisible = true
+      },
+
+      //状态格式化
+      forStatus(status) {
+        return status === '-1' ? '草稿' : status === '0' ? '现行' : '历史'
+      },
+
+      // 查看详情
+      handleViewDetail(row) {
+        this.viewDetail = true
+        this.detailForm = { ...row }
+        // this.detailDialogVisible = true
+        this.handleEditContent(row)
+      },
+      // 添加子项方法
+      handleAddChildItem(index, type, parentRow) {
+        if (!parentRow.rowid) {
+          this.$set(parentRow, 'rowid', this.generateUUID())
+        }
+
+        switch (type) {
+          case '固定表项目':
+            let childOrderNum =
+              this.contentEditForm.fixedTable.fixedTables.length + 1
+
+            const fixedNewRow = {
+              orderText: childOrderNum,
+              orderNum: childOrderNum,
+              cellCode: '',
+              calculationFormula: '',
+              unit: '',
+              tabtype: this.templateType,
+              surveyTemplateId: this.surveyTemplateId,
+              versionId: this.versionId,
+              fixedValues: { ...parentRow.fixedValues },
+              parentid: parentRow.rowid,
+              isChild: true,
+              isSubItem: true,
+              rowid: this.generateUUID(),
+            }
+
+            this.contentEditForm.fixedTable.fixedTablesTitle.forEach(
+              (title) => {
+                if (!(title.rkey in fixedNewRow.fixedValues)) {
+                  fixedNewRow.fixedValues[title.rkey] = ''
+                }
+              }
+            )
+
+            this.contentEditForm.fixedTable.fixedTables.splice(
+              index + 1,
+              0,
+              fixedNewRow
+            )
+            break
+
+          case '动态表项目':
+            let dynamicChildOrderNum =
+              this.contentEditForm.dynamicTable.dynamicTables.length + 1
+
+            const dynamicNewRow = {
+              orderText: dynamicChildOrderNum,
+              orderNum: dynamicChildOrderNum,
+              tabtype: this.templateType,
+              surveyTemplateId: this.surveyTemplateId,
+              versionId: this.versionId,
+              dynamicValues: { ...parentRow.dynamicValues },
+              parentid: parentRow.rowid,
+              isChild: true,
+              isSubItem: true,
+              rowid: Date.now() + Math.random() + 1,
+            }
+
+            this.contentEditForm.dynamicTable.dynamicTablesTitle.forEach(
+              (title) => {
+                if (!(title.rkey in dynamicNewRow.dynamicValues)) {
+                  dynamicNewRow.dynamicValues[title.rkey] = ''
+                }
+              }
+            )
+
+            this.contentEditForm.dynamicTable.dynamicTables.splice(
+              index + 1,
+              0,
+              dynamicNewRow
+            )
+            break
+        }
+
+        this.$nextTick(() => {
+          const tableBody = document.querySelector('.el-table__body-wrapper')
+          if (tableBody) {
+            tableBody.scrollTop = tableBody.scrollHeight
+          }
+        })
+      },
+
+      handleFormStyleChange() {},
+
+      getListBySurveyTemplateIdAndVersion(surveyTemplateId, versionId) {
+        return getListBySurveyTemplateIdAndVersion({
+          surveyTemplateId: surveyTemplateId,
+          versionId: versionId,
+        })
+          .then((res) => {
+            // 确保表头数据包含所有必要的字段,包括 id
+            this.contentEditForm.tableHeaders =
+              res.value.map((item) => ({
+                ...item,
+                fieldKey: item.fieldEname
+                  ? item.fieldEname.toLowerCase()
+                  : `field_${Date.now()}_${Math.random()
+                      .toString(36)
+                      .substr(2, 9)}`,
+              })) || []
+
+            // 检查并添加序号字段(固定表和动态表需要)
+            if (['2', '3'].includes(this.contentEditForm.templateType)) {
+              const hasSerialNumber = this.contentEditForm.tableHeaders.some(
+                (item) => item.fieldName === '序号'
+              )
+              if (!hasSerialNumber) {
+                this.contentEditForm.tableHeaders.unshift({
+                  fieldName: '序号',
+                  fieldType: 'string',
+                  format: '255',
+                  fieldTypelen: '',
+                  fieldTypenointlen: '',
+                  isRequired: 'false',
+                  showVisible: '1',
+                  isAuditPeriod: 'false',
+                  tabtype: this.templateType,
+                  surveyTemplateId: this.surveyTemplateId,
+                  versionId: this.versionId,
+                  isDisabled: true,
+                  orderNum: 1,
+                })
+              } else {
+                // 如果已存在序号字段,确保其不可编辑
+                const serialNumberIndex =
+                  this.contentEditForm.tableHeaders.findIndex(
+                    (item) => item.fieldName === '序号'
+                  )
+                if (serialNumberIndex !== -1) {
+                  this.contentEditForm.tableHeaders[
+                    serialNumberIndex
+                  ].isDisabled = true
+                }
+              }
+            }
+
+            this.contentEditForm.dynamicTable.tableHeaders =
+              this.contentEditForm.tableHeaders
+            this.contentEditForm.fixedTable.tableHeaders =
+              this.contentEditForm.tableHeaders
+
+            // 同时获取表头标题信息
+            listByTemplateIdAndVersion(surveyTemplateId, versionId)
+              .then((response) => {
+                if (response.code === 200) {
+                  if (this.contentEditForm.templateType === '2') {
+                    this.contentEditForm.fixedTable.fixedTablesTitle =
+                      this.stringToObjects(response.value.fixedFields || '')
+                  } else if (this.contentEditForm.templateType === '3') {
+                    this.contentEditForm.dynamicTable.dynamicTablesTitle =
+                      this.stringToObjects(response.value.fixedFields || '')
+                  }
+                }
+                return response
+              })
+              .catch((error) => {
+                console.error('获取表头标题信息失败:', error)
+                throw error
+              })
+          })
+          .catch((error) => {
+            console.error('查询失败:', error)
+            this.loading = false
+            throw error
+          })
+      },
+      initFixedTableRow(row) {
+        if (row.cellCode === undefined) {
+          this.$set(row, 'cellCode', '')
+        }
+        if (row.calculationFormula === undefined) {
+          this.$set(row, 'calculationFormula', '')
+        }
+        if (row.unit === undefined) {
+          this.$set(row, 'unit', '')
+        }
+        if (!row.fixedValues) {
+          this.$set(row, 'fixedValues', {})
+        }
+        this.contentEditForm.fixedTable.fixedTablesTitle.forEach(
+          (title, index) => {
+            if (!(title.rkey in row.fixedValues)) {
+              this.$set(row.fixedValues, title.rkey, '')
+            }
+          }
+        )
+        this.contentEditForm.fixedTable.fixedTableHeaders =
+          this.contentEditForm.fixedTable.fixedTablesTitle.filter(
+            (title) => title.rkey !== '序号'
+          )
+
+        return row
+      },
+      initDynamicTableRow(row) {
+        // 为当前行创建一个与 dynamicTablesTitle 对应的值对象
+        if (!row.dynamicValues) {
+          this.$set(row, 'dynamicValues', {})
+        }
+
+        // 确保每个动态列在当前行都有对应的值
+        this.contentEditForm.dynamicTable.dynamicTablesTitle.forEach(
+          (title) => {
+            if (!(title.rkey in row.dynamicValues)) {
+              this.$set(row.dynamicValues, title.rkey, '')
+            }
+          }
+        )
+
+        return row
+      },
+      /**
+       * 处理固定表项目字段值变化
+       */
+      handleFixedValueChange(row, rkey, value) {
+        if (!row.fixedValues) {
+          this.$set(row, 'fixedValues', {})
+        }
+        this.$set(row.fixedValues, rkey, value)
+      },
+      // 获取或设置序号字段
+      getOrSetOrder(row, value) {
+        // 如果提供了value参数,则设置值
+        if (value !== undefined) {
+          // 使用this.$set确保响应式更新
+          if (row['序号'] === undefined) {
+            this.$set(row, '序号', value)
+          } else {
+            row['序号'] = value
+          }
+        }
+
+        // 如果没有提供value参数,则获取值
+        return row['序号'] !== undefined && row['序号'] !== null
+          ? row['序号']
+          : row.orderNum || ''
+      },
+      /**
+       * 处理动态表项目字段值变化
+       */
+      handleDynamicValueChange(row, rkey, value) {
+        if (!row.dynamicValues) {
+          this.$set(row, 'dynamicValues', {})
+        }
+        this.$set(row.dynamicValues, rkey, value)
+      },
+      handleEditContent(row) {
+        this.contentEditForm = {
+          ...row,
+          // 固定表列表
+          fixedTable: {
+            tableHeaders: [],
+            fixedTables: [],
+            fixedTablesTitle: [],
+          },
+        }
+        if (row.createmode == '1') {
+          this.contentEditForm.createtemplateid = row.createtemplateid || ''
+          this.contentEditForm.createtemplateid1 = ''
+        } else if (row.createmode == '2') {
+          this.contentEditForm.createtemplateid1 = row.createtemplateid || ''
+          this.contentEditForm.createtemplateid = ''
+        }
+        // 成本核定表模板列表
+        // this.getActiveCostVerifyFormList()
+        // 成本调查表模板列表
+        // this.getActiveCostVerifyFormListByType()
+        this.loadTemplateDataForEdit(this.contentEditForm.surveyTemplateId)
+        this.contentEditDialogVisible = true
+      },
+      async loadTemplateDataForEdit(surveyTemplateId) {
+        // 并行获取表头和表格数据
+        const [tableHeadersRes, tableDataRes] = await Promise.all([
+          getlistBySurveyTemplateId({
+            surveyTemplateId,
+          }),
+          getCostFormVersionsByTemplateId({
+            surveyTemplateId,
+          }),
+        ])
+        // 处理表头数据
+        if (tableHeadersRes.code == 200) {
+          this.contentEditForm.fixedTable.tableHeaders = Array.isArray(
+            tableHeadersRes.value
+          )
+            ? tableHeadersRes.value
+            : []
+
+          // 检查是否有fieldName为"序号"的数据
+          const hasSerialNumber =
+            this.contentEditForm.fixedTable.tableHeaders.some(
+              (header) => header.fieldName === '序号'
+            )
+
+          // 如果没有序号数据,则添加一条默认的序号数据,并标记为不可编辑
+          if (!hasSerialNumber) {
+            this.contentEditForm.fixedTable.tableHeaders.unshift({
+              fieldName: '序号',
+              fieldType: 'string',
+              format: '30',
+              fieldTypelen: '',
+              fieldTypenointlen: '',
+              isRequired: 'false',
+              showVisible: '1',
+              isAuditPeriod: 'false',
+              tabtype: '2',
+              surveyTemplateId: this.contentEditForm.surveyTemplateId,
+              versionId: this.versionId,
+              isFixed: '1',
+              isDisabled: true, // 标记为不可编辑
+              orderNum: 1,
+            })
+          } else {
+            this.contentEditForm.fixedTable.tableHeaders.forEach((item) => {
+              if (item.fieldName === '序号') {
+                item.isDisabled = true // 确保序号字段不可编辑
+              }
+            })
+          }
+        }
+        // 处理表格数据
+        if (tableDataRes.code == 200) {
+          this.parseAndDisplayFixedTableData(tableDataRes)
+        }
+      },
+
+      // 内容维护
+      handleEditContent1(row) {
+        this.versionId = row.id
+
+        // 显示加载状态
+        this.loading = true
+
+        // 获取所有需要的数据
+        this.getListBySurveyTemplateIdAndVersion(row.surveyTemplateId, row.id)
+          .then(() => {
+            // 获取项目数据用于回显
+            return listByTemplateIdAndVersion(row.surveyTemplateId, row.id)
+          })
+          .then((res) => {
+            if (res.code === 200) {
+              // 根据模板类型解析并显示数据
+              if (this.contentEditForm.templateType === '2') {
+                // 解析并显示固定表项目数据
+                setTimeout(() => {
+                  this.parseAndDisplayFixedTableData(res)
+                }, 1000)
+              } else if (this.contentEditForm.templateType === '3') {
+                // 解析并显示动态表项目数据
+                setTimeout(() => {
+                  this.parseAndDisplayDynamicTableData(res)
+                }, 1000)
+              }
+            }
+            this.loading = false
+            this.contentEditDialogVisible = true
+          })
+          .catch((error) => {
+            console.error('获取数据失败:', error)
+            this.$message.error('获取数据失败')
+            this.contentEditDialogVisible = true
+            this.loading = false
+          })
+      },
+      handleGenerateTemplate() {
+        // todo:
+        this.$message.warning('功能开发中')
+        return
+        this.$confirm(
+          `生成成本核定表后将无法根据调查表生成还是根据历史核定模板生成,确定要生成模版吗?`,
+          '删除确认',
+          {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning',
+          }
+        ).then(() => {
+          if (this.contentEditForm.createmode == '1') {
+            this.generateFromSurveyTemplate()
+          } else if (this.contentEditForm.createmode == '2') {
+            this.generateFromHistoryTemplate()
+          }
+        })
+      },
+
+      // 字段类型变化处理
+      handleFieldTypeChange(row) {
+        // 重置格式相关字段
+        row.format = ''
+        row.integerDigits = ''
+        row.decimalDigits = ''
+      },
+
+      // 添加表头
+      handleAddTableHeader(type) {
+        switch (type) {
+          case '单记录':
+            this.contentEditForm.tableHeaders.push({
+              fieldName: '',
+              fieldType: 'string',
+              format: '255',
+              fieldTypelen: '',
+              fieldTypenointlen: '',
+              isRequired: 'false',
+              showVisible: '1',
+              isDict: 'false',
+              dictid: '',
+              dictValue: '',
+              tabtype: this.templateType,
+              surveyTemplateId: this.surveyTemplateId,
+              versionId: this.versionId,
+            })
+            break
+          case '固定表表头':
+            this.contentEditForm.fixedTable.tableHeaders.push({
+              fieldName: '',
+              fieldType: 'string',
+              format: '255',
+              fieldTypelen: '',
+              fieldTypenointlen: '',
+              isRequired: 'false',
+              showVisible: '1',
+              isAuditPeriod: 'false',
+              tabtype: this.templateType,
+              surveyTemplateId: this.surveyTemplateId,
+              versionId: this.versionId,
+            })
+            break
+
+          case '固定表项目':
+            let maxFixedOrderNum = 0
+            if (this.contentEditForm.fixedTable.fixedTables.length > 0) {
+              maxFixedOrderNum = Math.max(
+                ...this.contentEditForm.fixedTable.fixedTables.map(
+                  (item) => item.orderNum || 0
+                )
+              )
+            }
+
+            const newRow = {
+              orderText: maxFixedOrderNum + 1,
+              orderNum: maxFixedOrderNum + 1,
+              cellCode: '',
+              calculationFormula: '',
+              unit: '',
+              tabtype: this.templateType,
+              surveyTemplateId: this.surveyTemplateId,
+              versionId: this.versionId,
+              fixedValues: {},
+              parentid: -1,
+              rowid: this.generateUUID(),
+            }
+
+            this.contentEditForm.fixedTable.fixedTablesTitle.forEach(
+              (title) => {
+                newRow.fixedValues[title.rkey] = ''
+              }
+            )
+
+            this.contentEditForm.fixedTable.fixedTables.push(newRow)
+
+            break
+
+          case '动态表表头':
+            this.contentEditForm.dynamicTable.tableHeaders.push({
+              fieldName: '',
+              fieldType: 'string',
+              format: '255',
+              fieldTypelen: '',
+              fieldTypenointlen: '',
+              isRequired: 'false',
+              showVisible: '1',
+              tabtype: this.templateType,
+              surveyTemplateId: this.surveyTemplateId,
+              versionId: this.versionId,
+            })
+            break
+          case '动态表项目':
+            let maxDynamicOrderNum = 0
+            if (this.contentEditForm.dynamicTable.dynamicTables.length > 0) {
+              maxDynamicOrderNum = Math.max(
+                ...this.contentEditForm.dynamicTable.dynamicTables.map(
+                  (item) => item.orderNum || 0
+                )
+              )
+            }
+
+            const dynamicRow = {
+              orderText: maxDynamicOrderNum + 1,
+              orderNum: maxDynamicOrderNum + 1,
+              tabtype: this.templateType,
+              surveyTemplateId: this.surveyTemplateId,
+              versionId: this.versionId,
+              dynamicValues: {},
+              parentid: -1,
+              rowid: this.generateUUID(),
+            }
+
+            this.contentEditForm.dynamicTable.dynamicTablesTitle.forEach(
+              (title) => {
+                dynamicRow.dynamicValues[title.rkey] = ''
+              }
+            )
+
+            this.contentEditForm.dynamicTable.dynamicTables.push(dynamicRow)
+            break
+          default:
+            break
+        }
+        this.$nextTick(() => {
+          const tableBody = document.querySelector('.el-table__body-wrapper')
+          if (tableBody) {
+            tableBody.scrollTop = tableBody.scrollHeight
+          }
+        })
+      },
+
+      // 删除表头
+      handleDeleteHeader(index, type, row) {
+        // todo: 删除表头逻辑
+        this.$message.warning('功能开发中')
+        return
+        // 提取重复的删除逻辑为内部函数
+        const handleDelete = () => {
+          const data = {
+            deleteheadersList: [row],
+          }
+          getBatchSaveOrUpdate(data)
+            .then((res) => {
+              if (res.code === 200) {
+                this.$message.success('删除成功')
+              } else {
+                this.$message.error(`删除失败:${res.message || '未知错误'}`)
+              }
+            })
+            .catch((error) => {
+              console.error('删除接口异常:', error)
+              this.$message.error('删除接口异常,请重试')
+            })
+            .finally(() => {})
+        }
+
+        switch (type) {
+          case '固定表表头':
+            if (this.contentEditForm.fixedTable.tableHeaders.length <= 1) {
+              this.$message.warning('至少保留一个表头')
+              return
+            }
+
+            this.contentEditForm.fixedTable.tableHeaders.splice(index, 1)
+            handleDelete()
+            break
+
+          case '固定表项目':
+            if (this.contentEditForm.fixedTable.fixedTables.length <= 1) {
+              this.$message.warning('至少保留一个项目')
+              return
+            }
+            this.contentEditForm.fixedTable.fixedTables.splice(index, 1)
+            handleDelete() // 执行删除逻辑
+            break
+          case '动态表表头':
+            if (this.contentEditForm.dynamicTable.tableHeaders.length <= 1) {
+              this.$message.warning('至少保留一个表头')
+              return
+            }
+            this.contentEditForm.dynamicTable.tableHeaders.splice(index, 1)
+            handleDelete() // 执行删除逻辑
+            break
+          case '动态表项目':
+            if (this.contentEditForm.dynamicTable.dynamicTables.length <= 1) {
+              this.$message.warning('至少保留一个项目')
+              return
+            }
+            this.contentEditForm.dynamicTable.dynamicTables.splice(index, 1)
+            handleDelete() // 执行删除逻辑
+            break
+          case '单记录':
+            if (this.contentEditForm.tableHeaders.length <= 1) {
+              this.$message.warning('至少保留一个表头')
+              return
+            }
+            this.contentEditForm.tableHeaders.splice(index, 1)
+            handleDelete() // 执行删除逻辑
+            break
+          default:
+            break
+        }
+      },
+
+      // 上升
+      handleMoveUp(index, tableType) {
+        if (tableType === '固定表') {
+          if (index > 0) {
+            const temp = this.contentEditForm.fixedTable.fixedTables[index]
+            this.contentEditForm.fixedTable.fixedTables.splice(index, 1)
+            this.contentEditForm.fixedTable.fixedTables.splice(
+              index - 1,
+              0,
+              temp
+            )
+          }
+        } else if (tableType === '动态表') {
+          if (index > 0) {
+            const temp = this.contentEditForm.dynamicTable.dynamicTables[index]
+            this.contentEditForm.dynamicTable.dynamicTables.splice(index, 1)
+            this.contentEditForm.dynamicTable.dynamicTables.splice(
+              index - 1,
+              0,
+              temp
+            )
+          }
+        } else {
+          if (index > 0) {
+            const temp = this.contentEditForm.tableHeaders[index]
+            this.contentEditForm.tableHeaders.splice(index, 1)
+            this.contentEditForm.tableHeaders.splice(index - 1, 0, temp)
+          }
+        }
+      },
+
+      // 启动/停用状态
+      handleStatus(row) {
+        // todo: 待开发
+        this.$message.warning('功能开发中')
+        return
+
+        const action = row.status === '启用' ? '停用' : '启用'
+        if (row.status === '0') {
+          this.$confirm(`确认要停用该数据吗?`, '操作确认', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning',
+          })
+            .then(() => {
+              row.status = '-1'
+              putSurveyTemplatePublishVersion(row).then((res) => {
+                if (res.code === 200) {
+                  this.$message.success(`停用成功`)
+                  this.handleSearch()
+                }
+              })
+            })
+            .catch(() => {
+              this.$message({
+                type: 'info',
+                message: '已取消操作',
+              })
+            })
+        } else if (row.status === '-1') {
+          this.$confirm(`确认要启用该数据吗?`, '操作确认', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning',
+          })
+            .then(() => {
+              row.status = '0'
+              putSurveyTemplatePublishVersion(row).then((res) => {
+                if (res.code === 200) {
+                  this.$message.success(`停用成功`)
+                  this.handleSearch()
+                }
+              })
+            })
+            .catch(() => {
+              this.$message({
+                type: 'info',
+                message: '已取消操作',
+              })
+            })
+        }
+      },
+
+      // 下降
+      handleMoveDown(index, tableType) {
+        if (tableType === '固定表') {
+          if (index < this.contentEditForm.fixedTable.fixedTables.length - 1) {
+            const temp = this.contentEditForm.fixedTable.fixedTables[index]
+            this.contentEditForm.fixedTable.fixedTables.splice(index, 1)
+            this.contentEditForm.fixedTable.fixedTables.splice(
+              index + 1,
+              0,
+              temp
+            )
+          }
+        } else if (tableType === '动态表') {
+          if (
+            index <
+            this.contentEditForm.dynamicTable.dynamicTables.length - 1
+          ) {
+            const temp = this.contentEditForm.dynamicTable.dynamicTables[index]
+            this.contentEditForm.dynamicTable.dynamicTables.splice(index, 1)
+            this.contentEditForm.dynamicTable.dynamicTables.splice(
+              index + 1,
+              0,
+              temp
+            )
+          }
+        } else {
+          if (index < this.contentEditForm.tableHeaders.length - 1) {
+            const temp = this.contentEditForm.tableHeaders[index]
+            this.contentEditForm.tableHeaders.splice(index, 1)
+            this.contentEditForm.tableHeaders.splice(index + 1, 0, temp)
+          }
+        }
+      },
+
+      // 绑定字典变化
+      handleBindDictChange(row) {
+        if (row.isDict === 'false') {
+          row.dictid = ''
+        }
+      },
+
+      // 获取格式占位符
+      getFormatPlaceholder(fieldType) {
+        switch (fieldType) {
+          case '日期':
+            return '如:yyyy-MM-dd'
+          case '数字':
+            return '如:#,##0.00'
+          default:
+            return '请输入格式'
+        }
+      },
+
+      // 滚动到错误行
+      scrollToErrorRow(rowIndex) {
+        this.$nextTick(() => {
+          const tableBody = document.querySelector(
+            '.table-edit-container .el-table__body-wrapper'
+          )
+          if (tableBody) {
+            const scrollTop = rowIndex * 48
+            tableBody.scrollTop = scrollTop
+          }
+        })
+      },
+      handleSaveTemplate() {
+        // 获取拆分后的数据
+        const splitData = this.splitFixedTableDataForSave()
+        const headersList = this.contentEditForm.fixedTable.tableHeaders.map(
+          (header, index) => ({
+            ...header,
+            orderNum: header.orderNum || index + 1,
+          })
+        )
+        let data = {
+          costVerifyTemplateId: this.contentEditForm.surveyTemplateId,
+          headersList: headersList,
+          itemsList: splitData,
+        }
+        batchSaveOrUpdate(data)
+          .then((data) => {
+            this.contentEditDialogVisible = false
+            this.$message.success('保存成功')
+            this.handleSearch()
+          })
+          .catch((err) => {
+            console.log(err)
+          })
+      },
+      // 保存内容
+      handleSaveContent(type) {
+        this.loading = true
+        let isValid = false
+        try {
+          if (type === '单记录') {
+            var data = {
+              headersList: this.contentEditForm.tableHeaders,
+            }
+            getBatchSaveOrUpdate(data)
+              .then((res) => {
+                if (res.code === 200) {
+                  this.$message.success('保存成功')
+                  this.contentEditDialogVisible = false
+                } else {
+                  this.$message.error(`保存失败:${res.message || '未知错误'}`)
+                }
+              })
+              .catch((error) => {
+                console.error('保存接口异常:', error)
+                this.$message.error('保存接口异常,请重试')
+              })
+              .finally(() => {
+                this.loading = false
+              })
+          } else if (type === '固定表表头') {
+            var data = {
+              headersList: this.contentEditForm.fixedTable.tableHeaders,
+            }
+            batchSaveOrUpdate(data)
+              .then((res) => {
+                if (res.code === 200) {
+                  // 如果后端返回了保存后的数据,更新本地数据
+                  if (res.value && Array.isArray(res.value)) {
+                    this.contentEditForm.fixedTable.tableHeaders =
+                      res.value.map((item) => ({
+                        ...item,
+                      }))
+                  }
+                  this.loadTemplateDataForEdit(
+                    this.contentEditForm.surveyTemplateId
+                  )
+                  this.contentEditForm.fixedTable.fixedTables.forEach((row) => {
+                    this.initFixedTableRow(row)
+                  })
+                } else {
+                  this.$message.error(`保存失败:${res.message || '未知错误'}`)
+                }
+              })
+              .catch((error) => {
+                console.error('保存接口异常:', error)
+                this.$message.error('保存接口异常,请重试')
+              })
+              .finally(() => {
+                this.loading = false
+              })
+          } else if (type === '固定表项目') {
+            this.saveFixedTableData()
+          } else if (type === '动态表表头') {
+            var data = {
+              headersList: this.contentEditForm.dynamicTable.tableHeaders,
+            }
+            getBatchSaveOrUpdate(data)
+              .then((res) => {
+                if (res.code === 200) {
+                  this.contentEditForm.isDynamicTables = true
+                  this.loading = true
+
+                  // 如果后端返回了保存后的数据,更新本地数据
+                  if (res.value && Array.isArray(res.value)) {
+                    this.contentEditForm.dynamicTable.tableHeaders =
+                      res.value.map((item) => ({
+                        ...item,
+                        fieldKey: item.fieldEname
+                          ? item.fieldEname.toLowerCase()
+                          : `field_${Date.now()}_${Math.random()
+                              .toString(36)
+                              .substr(2, 9)}`,
+                      }))
+                  }
+                  this.getListBySurveyTemplateIdAndVersion(
+                    this.surveyTemplateId,
+                    this.versionId
+                  )
+
+                  listByTemplateIdAndVersion(
+                    this.surveyTemplateId,
+                    this.versionId
+                  )
+                    .then((res) => {
+                      this.loading = false
+
+                      this.contentEditForm.dynamicTable.dynamicTablesTitle =
+                        this.stringToObjects(res.value.fixedFields || '')
+
+                      // 初始化所有已有行的 dynamicValues
+                      this.contentEditForm.dynamicTable.dynamicTables.forEach(
+                        (row) => {
+                          this.initDynamicTableRow(row)
+                        }
+                      )
+                    })
+                    .catch((error) => {
+                      console.error('查询失败:', error)
+                      this.loading = false
+                    })
+                } else {
+                  this.$message.error(`保存失败:${res.message || '未知错误'}`)
+                }
+              })
+              .catch((error) => {
+                console.error('保存接口异常:', error)
+                this.$message.error('保存接口异常,请重试')
+              })
+              .finally(() => {
+                this.loading = false
+              })
+          } else if (type === '动态表项目') {
+            this.saveDynamicTableData()
+          }
+        } catch (error) {
+          console.error('保存处理异常:', error)
+          this.$message.error('保存过程中发生错误,请重试')
+          this.loading = false
+        }
+      },
+      /**
+       * 将固定表项目的数据根据固定列拆分成对应的数据结构
+       * @returns {Array} 拆分后的数据数组,每个固定列对应一行数据
+       */
+      splitFixedTableDataForSave() {
+        const fixedTables = this.contentEditForm.fixedTable.fixedTables
+        const fixedTitles = this.contentEditForm.fixedTable.fixedTablesTitle
+        const fixedHeaders = this.contentEditForm.fixedTable.tableHeaders
+        // 结果数组
+        const result = []
+
+        // 遍历每一行数据
+        fixedTables.forEach((row, rowIndex) => {
+          // 为每个固定列创建一条记录
+          fixedTitles.forEach((title, colIndex) => {
+            // 找到对应的表头信息
+            const correspondingHeader = fixedHeaders.find(
+              (header) => header.fieldName === title.rkey
+            )
+
+            const newItem = {
+              rkey: title.rkey,
+              rvalue: row.fixedValues ? row.fixedValues[title.rkey] || '' : '',
+              surveyTemplateId: row.surveyTemplateId,
+              versionId: row.versionId,
+              tabtype: row.tabtype,
+              rowIndex: rowIndex,
+              // 添加 headersId 字段(表头的id)
+              headersId: correspondingHeader ? correspondingHeader.id : null,
+              // 添加记录的id(itemlist中每条记录的id)
+              id: row.itemId || null,
+              // 添加父子关系字段
+              parentid: row.parentid || -1, // 父项ID,默认为-1表示无父项
+              isChild: row.isChild || false, // 是否为子项
+              // 添加 rowid 字段
+              rowid: row.rowid || null,
+              // 添加计算公式相关字段
+              calculationFormula: row.calculationFormula || null,
+              jsonstr: row.jsonstr || null,
+            }
+
+            if (row.orderNum) {
+              newItem.orderNum =
+                typeof row.orderNum === 'number'
+                  ? row.orderNum
+                  : parseInt(row.orderNum, 10) || 0
+            }
+
+            // 添加其他固定表特有的字段
+            newItem.cellCode = row.cellCode || ''
+            newItem.unit = row.unit || ''
+
+            // 添加其他可能需要的字段,但排除特定字段
+            Object.keys(row).forEach((key) => {
+              if (
+                !(key in newItem) &&
+                key !== 'fixedValues' &&
+                key !== 'itemId' &&
+                key !== 'id' &&
+                key !== 'parentid' &&
+                key !== 'isChild' &&
+                key !== 'isSubItem' &&
+                key !== 'rowid' &&
+                key !== 'jsonstr' &&
+                key !== 'calculationFormula'
+              ) {
+                newItem[key] = row[key]
+              }
+            })
+
+            result.push(newItem)
+          })
+        })
+
+        return result
+      },
+      //保存固定表项目数据
+      saveFixedTableData() {
+        try {
+          // 获取拆分后的数据
+          const splitData = this.splitFixedTableDataForSave()
+
+          // 构造保存数据的结构
+          const saveData = {
+            itemsList: splitData,
+          }
+
+          // 调用保存接口
+          getBatchSaveOrUpdate(saveData)
+            .then((res) => {
+              if (res.code === 200) {
+                this.$message.success('固定表数据保存成功')
+                this.contentEditDialogVisible = false
+              } else {
+                this.$message.error(`保存失败:${res.message || '未知错误'}`)
+              }
+            })
+            .catch((error) => {
+              console.error('保存固定表数据接口异常:', error)
+              this.$message.error('保存固定表数据失败,请重试')
+            })
+            .finally(() => {
+              this.loading = false
+            })
+
+          return splitData
+        } catch (error) {
+          console.error('处理固定表数据保存时出错:', error)
+          this.$message.error('保存过程中发生错误,请重试')
+          this.loading = false
+        }
+      },
+      /**
+       * 解析并回显固定表项目数据
+       * @param {Object} responseData - listByTemplateIdAndVersion接口返回的数据
+       */
+      parseAndDisplayFixedTableData(responseData) {
+        if (responseData.value.fixedFields) {
+          this.contentEditForm.fixedTable.fixedTablesTitle =
+            this.stringToObjects(responseData.value.fixedFields || '')
+        } else {
+          let fixedFields = this.contentEditForm.fixedTable.tableHeaders
+            .map((item) => item.fieldName)
+            .join(',')
+          this.contentEditForm.fixedTable.fixedTablesTitle =
+            this.stringToObjects(fixedFields || '')
+        }
+        const fixedTitles = this.contentEditForm.fixedTable.fixedTablesTitle
+        this.contentEditForm.fixedTable.fixedTableHeaders = fixedTitles.filter(
+          (title) => title.rkey !== '序号'
+        )
+        if (
+          !responseData ||
+          !responseData.value ||
+          !responseData.value.itemlist
+        ) {
+          return
+        }
+        const itemList = responseData.value.itemlist
+
+        // 清空现有数据
+        this.contentEditForm.fixedTable.fixedTables = []
+
+        // 遍历itemList,为每个项目创建一行数据
+        itemList.forEach((item, index) => {
+          // 判断是否为子项(parentid不为-1且不为"-1")
+          const isSubItem =
+            item.parentid && item.parentid !== -1 && item.parentid !== '-1'
+          const newRow = {
+            orderText: item.orderNum || '', // 显示用序号
+            orderNum: item.orderNum || '', // 保留原始序号用于发送后端
+            surveyTemplateId: item.surveyTemplateId,
+            versionId: item.versionId,
+            cellCode: item.cellCode || '',
+            calculationFormula: item.calculationFormula || '',
+            unit: item.unit || '',
+            fixedValues: {},
+            itemId: item.id || null,
+            parentid: item.parentid || -1,
+            isChild: isSubItem,
+            isSubItem: isSubItem,
+            rowid: item.rowid || this.generateUUID(),
+            jsonstr: item.jsonstr || null,
+          }
+
+          // 确保orderNum是数字类型
+          if (item.orderNum) {
+            newRow.orderNum = parseInt(item.orderNum, 10) || 0
+          }
+
+          fixedTitles.forEach((title) => {
+            newRow.fixedValues[title.rkey] = item[title.rkey] || ''
+          })
+
+          this.contentEditForm.fixedTable.fixedTables.push(newRow)
+        })
+
+        // 按父子关系和orderNum排序,确保子项显示在父项后面
+        this.contentEditForm.fixedTable.fixedTables.sort((a, b) => {
+          // 先按orderNum排序父项
+          if (a.isChild && !b.isChild) {
+            // 如果a是子项,b是父项,需要检查a的父项是否在b之后
+            const parentOfA = this.contentEditForm.fixedTable.fixedTables.find(
+              (item) => item.rowid === a.parentid || item.itemId === a.parentid
+            )
+            if (parentOfA && parentOfA.orderNum > b.orderNum) {
+              return 1
+            }
+            return -1
+          }
+          if (!a.isChild && b.isChild) {
+            // 如果a是父项,b是子项,需要检查b的父项是否在a之前
+            const parentOfB = this.contentEditForm.fixedTable.fixedTables.find(
+              (item) => item.rowid === b.parentid || item.itemId === b.parentid
+            )
+            if (parentOfB && parentOfB.orderNum < a.orderNum) {
+              return -1
+            }
+            return 1
+          }
+
+          // 如果都是父项或都是子项,按orderNum排序
+          return (a.orderNum || 0) - (b.orderNum || 0)
+        })
+
+        // 重新排序,确保子项紧跟在其对应的父项后面
+        const sortedArray = []
+        const parentItems = this.contentEditForm.fixedTable.fixedTables.filter(
+          (item) => !item.isChild
+        )
+        const childItems = this.contentEditForm.fixedTable.fixedTables.filter(
+          (item) => item.isChild
+        )
+
+        parentItems.forEach((parent) => {
+          sortedArray.push(parent)
+          // 找到并添加该父项的所有子项
+          const relatedChildren = childItems.filter(
+            (child) =>
+              child.parentid === parent.rowid ||
+              child.parentid === parent.itemId
+          )
+          // 子项按orderNum排序
+          relatedChildren.sort((a, b) => (a.orderNum || 0) - (b.orderNum || 0))
+          sortedArray.push(...relatedChildren)
+        })
+
+        this.contentEditForm.fixedTable.fixedTables = sortedArray
+        console.log('sortedArray:', sortedArray)
+      },
+
+      //分割字符串
+      stringToObjects(str) {
+        const items = str.split(',')
+        return items.map((item) => ({
+          rkey: item,
+          rvalue: '',
+        }))
+      },
+
+      // 删除
+      handleDelete(row) {
+        // todo:
+        this.$message.warning('功能开发中')
+        return
+        this.$confirm('确定要删除该数据吗?', '提示', {
+          type: 'warning',
+        })
+          .then(() => {
+            this.loading = true
+            delSurveyTemplateVersionById(row.id)
+              .then((res) => {
+                if (res.code === 200) {
+                  this.$message.success('删除成功')
+                  this.loading = false
+                  this.handleSearch()
+                }
+              })
+              .catch((error) => {
+                console.error('删除失败:', error)
+                this.$message.error('删除失败,请重试')
+                this.loading = false
+              })
+          })
+          .catch(() => {})
+      },
+
+      // 批量删除
+      handleBatchDelete() {
+        if (this.selectedRows.length === 0) {
+          this.$message.warning('请先选择要删除的数据')
+          return
+        }
+
+        this.$confirm(
+          `确定要删除选中的${this.selectedRows.length}条数据吗?`,
+          '提示',
+          {
+            type: 'warning',
+          }
+        )
+          .then(() => {
+            this.loading = true
+            const ids = this.selectedRows.map((row) => row.id)
+
+            batchDeleteCostForm(ids)
+              .then(() => {
+                this.selectedRows.forEach((row) => {
+                  const index = this.tableData.findIndex(
+                    (item) => item.id === row.id
+                  )
+                  if (index > -1) {
+                    this.tableData.splice(index, 1)
+                  }
+                })
+                this.pagination.total -= this.selectedRows.length
+                this.selectedRows = []
+                this.$message.success('批量删除成功')
+                this.loading = false
+              })
+              .catch((error) => {
+                console.error('批量删除失败:', error)
+                this.$message.error('批量删除失败,请重试')
+                this.loading = false
+              })
+          })
+          .catch(() => {})
+      },
+
+      // 表格选择
+      handleSelectionChange(selection) {
+        this.selectedRows = selection
+      },
+
+      // 分页变化处理
+      handlePaginationChange({ currentPage, pageSize }) {
+        this.pagination.currentPage = currentPage
+        this.pagination.pageSize = pageSize
+        this.handleSearch()
+      },
+
+      // 提交表单
+      submitForm() {
+        // todo: 提交表单逻辑
+        this.$message.warning('功能开发中')
+        return
+        this.$refs.dataForm.validate((valid) => {
+          if (valid) {
+            this.loading = true
+
+            const submitData = {
+              versionNo: this.dataForm.version,
+              status: this.dataForm.status,
+              createBy: this.dataForm.createBy,
+              createTime: this.dataForm.createTime,
+              remarks: this.dataForm.remarks,
+              templateType: this.currentRow.templateType,
+              surveyTemplateName: this.currentRow.surveyTemplateName,
+              surveyTemplateId: this.currentRow.surveyTemplateId,
+            }
+
+            if (this.dataForm.id) {
+              // 修改
+              submitData.formId = this.dataForm.id
+              editCostForm(submitData)
+                .then(() => {
+                  this.loading = false
+                  this.$message.success('修改成功')
+                  this.dialogVisible = false
+                  this.handleSearch() // 重新加载数据
+                })
+                .catch((error) => {
+                  console.error('修改失败:', error)
+                  this.$message.error('修改失败,请重试')
+                  this.loading = false
+                })
+            } else {
+              addSurveyTemplateVersion(submitData)
+                .then(() => {
+                  this.loading = false
+                  this.$message.success('添加成功')
+                  this.dialogVisible = false
+                  this.handleSearch() // 重新加载数据
+                })
+                .catch((error) => {
+                  console.error('添加失败:', error)
+                  this.$message.error('添加失败,请重试')
+                  this.loading = false
+                })
+            }
+          }
+        })
+      },
+
+      // 获取数据存储库表选项
+      loadDataStorageTableOptions() {
+        getDataStorageTableOptions()
+          .then((response) => {
+            this.dataStorageTableOptions = response.data || []
+          })
+          .catch((error) => {
+            console.error('获取数据存储库表选项失败:', error)
+          })
+      },
+    },
+  }
+</script>
+
+<style lang="scss" scoped>
+  @import '@/styles/costAudit.scss';
+  .top-wrapper {
+    display: flex;
+    align-items: center;
+  }
+
+  .data-form,
+  .detail-form {
+    ::v-deep .el-select {
+      width: 100%;
+    }
+  }
+
+  .content-edit-container {
+    overflow-y: auto;
+
+    .button-group {
+      margin: 10px 0;
+
+      .el-button {
+        margin-right: 10px;
+      }
+    }
+
+    .table-edit-container {
+      margin-top: 10px;
+
+      ::v-deep .el-table {
+        transition: height 0.3s ease;
+      }
+
+      ::v-deep .el-table__body-wrapper {
+        transition: scrollTop 0.3s ease;
+      }
+    }
+
+    .bind-dict-column {
+      display: flex;
+      flex-direction: column;
+    }
+
+    .table-actions {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+
+      .el-button {
+        padding: 4px;
+        margin: 0 2px;
+      }
+    }
+
+    .format-input {
+      display: flex;
+      align-items: center;
+
+      .format-prefix {
+        font-size: 12px;
+        color: #606266;
+        margin-right: 5px;
+        white-space: nowrap;
+      }
+    }
+  }
+  .detail-info-container {
+    margin: 20px 0;
+    border-radius: 4px;
+    .detail-item {
+      display: inline-block;
+      margin-right: 30px;
+      margin-bottom: 10px;
+
+      .detail-label {
+        font-weight: bold;
+        color: #606266;
+      }
+
+      .detail-value {
+        color: #303133;
+      }
+    }
+  }
+</style>

+ 2 - 3
src/views/costAudit/baseInfo/financeSheetManage/index.vue

@@ -258,9 +258,8 @@
         // 分页信息
         pagination: {
           currentPage: 1,
-          pageSize: 10,
-          total: 7,
-          pageSizes: [10, 20, 30, 50],
+          pageSize: 50,
+          total: 0,
         },
         // 加载状态
         loading: false,

+ 234 - 57
src/views/costAudit/baseInfo/financeSheetManage/infoMaintain.vue

@@ -89,13 +89,19 @@
             size="small"
             @click="handleEdit(row)"
           >
-            编辑
+            修改
           </el-button>
-          <el-button type="text" size="small" @click="handleDelete(row)">
+          <el-button
+            v-if="row.status != '0'"
+            class="delete-btn"
+            type="text"
+            size="small"
+            @click="handleDelete(row)"
+          >
             删除
           </el-button>
           <el-button
-            v-if="row.status === '0' || row.status === '-1'"
+            v-if="row.status === '-1'"
             type="text"
             size="small"
             @click="handleEditContent(row)"
@@ -206,15 +212,47 @@
               </el-radio>
             </el-radio-group>
           </div>
+          <div v-if="viewDetail" class="detail-info-container">
+            <div class="detail-item">
+              <span class="detail-label">版本号:</span>
+              <span class="detail-value">{{ detailForm.versionNo }}</span>
+            </div>
+            <div class="detail-item">
+              <span class="detail-label">状态:</span>
+              <span class="detail-value">
+                {{ forStatus(detailForm.status) }}
+              </span>
+            </div>
+            <div class="detail-item">
+              <span class="detail-label">创建人:</span>
+              <span class="detail-value">{{ detailForm.createBy }}</span>
+            </div>
+            <div class="detail-item">
+              <span class="detail-label">创建时间:</span>
+              <span class="detail-value">{{ detailForm.createTime }}</span>
+            </div>
+            <div class="detail-item">
+              <span class="detail-label">备注:</span>
+              <span class="detail-value">{{ detailForm.remarks }}</span>
+            </div>
+          </div>
         </div>
 
         <!-- 单记录列表 -->
         <div v-if="contentEditForm.templateType === '1'">
           <div class="button-group">
-            <el-button type="primary" @click="handleAddTableHeader('单记录')">
+            <el-button
+              type="primary"
+              :disabled="viewDetail"
+              @click="handleAddTableHeader('单记录')"
+            >
               添加项目
             </el-button>
-            <el-button type="primary" @click="handleSaveContent('单记录')">
+            <el-button
+              type="primary"
+              :disabled="viewDetail"
+              @click="handleSaveContent('单记录')"
+            >
               保存
             </el-button>
           </div>
@@ -239,6 +277,7 @@
                     v-model="scope.row.fieldName"
                     placeholder="请输入字段名称"
                     size="small"
+                    :disabled="viewDetail"
                   ></el-input>
                 </template>
               </el-table-column>
@@ -248,6 +287,7 @@
                     v-model="scope.row.fieldType"
                     placeholder="请选择字段类型"
                     size="small"
+                    :disabled="viewDetail"
                     @change="handleFieldTypeChange(scope.row)"
                   >
                     <el-option label="字符串" value="string"></el-option>
@@ -271,6 +311,7 @@
                       placeholder="请输入长度"
                       size="small"
                       style="width: calc(100% - 80px)"
+                      :disabled="viewDetail"
                     ></el-input>
                   </div>
 
@@ -285,6 +326,7 @@
                       placeholder="整数位数"
                       size="small"
                       style="width: 80px; margin: 0 5px"
+                      :disabled="viewDetail"
                     ></el-input>
                   </div>
 
@@ -299,6 +341,7 @@
                       placeholder="小数位数"
                       size="small"
                       style="width: 80px; margin-left: 5px"
+                      :disabled="viewDetail"
                     ></el-input>
                   </div>
 
@@ -312,6 +355,7 @@
                       placeholder="请选择日期格式"
                       size="small"
                       style="width: 100%"
+                      :disabled="viewDetail"
                     >
                       <el-option
                         label="yyyy-MM-dd HH:mm:ss"
@@ -324,20 +368,35 @@
                     </el-select>
                   </div>
                   <!-- 布尔类型格式 -->
-                  <div v-else-if="scope.row.fieldType === 'boolean'"></div>
+                  <div v-else-if="scope.row.fieldType === 'boolean'">
+                    <el-select
+                      v-model="scope.row.format"
+                      placeholder="请选择布尔值格式"
+                      size="small"
+                      style="width: 100%"
+                      :disabled="viewDetail"
+                    >
+                      <el-option label="是" value="true"></el-option>
+                      <el-option label="否" value="false"></el-option>
+                    </el-select>
+                  </div>
                   <!-- 默认情况 -->
                   <el-input
-                    v-else
                     v-model="scope.row.format"
                     :placeholder="getFormatPlaceholder(scope.row.fieldType)"
                     size="small"
+                    :disabled="viewDetail"
                   ></el-input>
                 </template>
               </el-table-column>
 
               <el-table-column prop="isRequired" label="是否必填" width="120">
                 <template slot-scope="scope">
-                  <el-select v-model="scope.row.isRequired" size="small">
+                  <el-select
+                    v-model="scope.row.isRequired"
+                    size="small"
+                    :disabled="scope.row.isDisabled || viewDetail"
+                  >
                     <el-option label="是" value="true"></el-option>
                     <el-option label="否" value="false"></el-option>
                   </el-select>
@@ -346,7 +405,11 @@
 
               <el-table-column prop="showVisible" label="是否显示" width="120">
                 <template slot-scope="scope">
-                  <el-select v-model="scope.row.showVisible" size="small">
+                  <el-select
+                    v-model="scope.row.showVisible"
+                    size="small"
+                    :disabled="scope.row.isDisabled || viewDetail"
+                  >
                     <el-option label="是" value="1"></el-option>
                     <el-option label="否" value="0"></el-option>
                   </el-select>
@@ -360,6 +423,7 @@
                       v-model="scope.row.isDict"
                       size="small"
                       style="width: 80px"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @change="handleBindDictChange(scope.row)"
                     >
                       <el-option label="是" value="true"></el-option>
@@ -372,12 +436,13 @@
                       class="dict-select"
                       size="small"
                       style="width: 120px; margin-top: 5px"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     >
                       <el-option
                         v-for="(item, index) in dictTypeList"
                         :key="index"
-                        :label="item.dictName"
-                        :value="String(item.dictId)"
+                        :label="item.name"
+                        :value="String(item.id)"
                       ></el-option>
                     </el-select>
                   </div>
@@ -390,6 +455,7 @@
                     <el-button
                       type="text"
                       size="mini"
+                      :disabled="viewDetail"
                       @click="
                         handleDeleteHeader(scope.$index, '单记录', scope.row)
                       "
@@ -400,6 +466,7 @@
                       v-if="scope.$index !== 0"
                       type="text"
                       size="mini"
+                      :disabled="viewDetail"
                       @click="handleMoveUp(scope.$index)"
                     >
                       上升
@@ -410,6 +477,7 @@
                       "
                       type="text"
                       size="mini"
+                      :disabled="viewDetail"
                       @click="handleMoveDown(scope.$index)"
                     >
                       下降
@@ -425,11 +493,16 @@
           <div class="button-group">
             <el-button
               type="primary"
+              :disabled="viewDetail"
               @click="handleAddTableHeader('固定表表头')"
             >
               添加表头
             </el-button>
-            <el-button type="primary" @click="handleSaveContent('固定表表头')">
+            <el-button
+              type="primary"
+              :disabled="viewDetail"
+              @click="handleSaveContent('固定表表头')"
+            >
               下一步
             </el-button>
           </div>
@@ -454,7 +527,7 @@
                     v-model="scope.row.fieldName"
                     placeholder="请输入字段名称"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   ></el-input>
                 </template>
               </el-table-column>
@@ -464,7 +537,7 @@
                     v-model="scope.row.fieldType"
                     placeholder="请选择字段类型"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                     @change="handleFieldTypeChange(scope.row)"
                   >
                     <el-option label="字符串" value="string"></el-option>
@@ -488,7 +561,7 @@
                       placeholder="请输入长度"
                       size="small"
                       style="width: calc(100% - 80px)"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     ></el-input>
                   </div>
 
@@ -503,7 +576,7 @@
                       placeholder="整数位数"
                       size="small"
                       style="width: 80px; margin: 0 5px"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     ></el-input>
                   </div>
 
@@ -518,7 +591,7 @@
                       placeholder="小数位数"
                       size="small"
                       style="width: 80px; margin-left: 5px"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     ></el-input>
                   </div>
                   <!-- 日期类型格式 -->
@@ -547,10 +620,10 @@
                   <div v-else-if="scope.row.fieldType === 'boolean'">
                     <el-select
                       v-model="scope.row.format"
-                      placeholder="请选择布尔值"
+                      placeholder="请选择布尔值格式"
                       size="small"
                       style="width: 100%"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     >
                       <el-option label="是" value="true"></el-option>
                       <el-option label="否" value="false"></el-option>
@@ -562,7 +635,7 @@
                     v-model="scope.row.format"
                     :placeholder="getFormatPlaceholder(scope.row.fieldType)"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   ></el-input>
                 </template>
               </el-table-column>
@@ -572,7 +645,7 @@
                   <el-select
                     v-model="scope.row.isRequired"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   >
                     <el-option label="是" value="true"></el-option>
                     <el-option label="否" value="false"></el-option>
@@ -585,7 +658,7 @@
                   <el-select
                     v-model="scope.row.showVisible"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   >
                     <el-option label="是" value="1"></el-option>
                     <el-option label="否" value="0"></el-option>
@@ -596,27 +669,58 @@
               <el-table-column
                 prop="isAuditPeriod"
                 label="是否绑定监审期间"
-                width="120"
+                width="140"
               >
                 <template slot-scope="scope">
                   <el-select
                     v-model="scope.row.isAuditPeriod"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   >
                     <el-option label="是" value="true"></el-option>
                     <el-option label="否" value="false"></el-option>
                   </el-select>
                 </template>
               </el-table-column>
-
+              <el-table-column prop="isDict" label="绑定字典" min-width="150">
+                <template slot-scope="scope">
+                  <div class="bind-dict-column">
+                    <el-select
+                      v-model="scope.row.isDict"
+                      size="small"
+                      style="width: 80px"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                      @change="handleBindDictChange(scope.row)"
+                    >
+                      <el-option label="是" value="true"></el-option>
+                      <el-option label="否" value="false"></el-option>
+                    </el-select>
+                    <el-select
+                      v-if="scope.row.isDict === 'true'"
+                      v-model="scope.row.dictid"
+                      placeholder="请选择字典"
+                      class="dict-select"
+                      size="small"
+                      style="width: 120px; margin-top: 5px"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                    >
+                      <el-option
+                        v-for="(item, index) in dictTypeList"
+                        :key="index"
+                        :label="item.name"
+                        :value="String(item.id)"
+                      ></el-option>
+                    </el-select>
+                  </div>
+                </template>
+              </el-table-column>
               <el-table-column label="操作" width="150" fixed="right">
                 <template slot-scope="scope">
                   <div class="table-actions">
                     <el-button
                       type="text"
                       size="mini"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @click="
                         handleDeleteHeader(
                           scope.$index,
@@ -631,7 +735,7 @@
                       v-if="scope.$index !== 0"
                       type="text"
                       size="mini"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @click="handleMoveUp(scope.$index)"
                     >
                       上升
@@ -642,7 +746,7 @@
                       "
                       type="text"
                       size="mini"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @click="handleMoveDown(scope.$index)"
                     >
                       下降
@@ -656,12 +760,14 @@
             <div class="button-group">
               <el-button
                 type="primary"
+                :disabled="viewDetail"
                 @click="handleAddTableHeader('固定表项目')"
               >
                 添加项目
               </el-button>
               <el-button
                 type="primary"
+                :disabled="viewDetail"
                 @click="handleSaveContent('固定表项目')"
               >
                 保存
@@ -684,6 +790,7 @@
                       "
                       size="small"
                       placeholder="数字或中文"
+                      :disabled="viewDetail"
                       @input="handleFixedValueChange(scope.row, '序号', $event)"
                     ></el-input>
                   </template>
@@ -723,7 +830,7 @@
                 </el-table-column>
                 <el-table-column
                   v-for="(item, index) in contentEditForm.fixedTable
-                    .fixedTablesTitle"
+                    .fixedTableHeaders"
                   :key="index"
                   :label="item.rkey"
                   align="center"
@@ -736,6 +843,7 @@
                           : ''
                       "
                       size="small"
+                      :disabled="viewDetail"
                       @input="
                         handleFixedValueChange(scope.row, item.rkey, $event)
                       "
@@ -747,6 +855,7 @@
                     <el-input
                       :value="scope.row.cellCode"
                       size="small"
+                      :disabled="viewDetail"
                       @input="(val) => $set(scope.row, 'cellCode', val)"
                     ></el-input>
                   </template>
@@ -757,6 +866,7 @@
                       v-model="scope.row.calculationFormula"
                       size="small"
                       readonly
+                      :disabled="viewDetail"
                       @click.native="
                         openCalculationFormulaDialogVisible(
                           scope.row,
@@ -771,6 +881,7 @@
                     <el-input
                       :value="scope.row.unit"
                       size="small"
+                      :disabled="viewDetail"
                       @input="(val) => $set(scope.row, 'unit', val)"
                     ></el-input>
                   </template>
@@ -779,8 +890,10 @@
                   <template slot-scope="scope">
                     <div class="table-actions">
                       <el-button
+                        v-if="!scope.row.isChild"
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="
                           handleAddChildItem(
                             scope.$index,
@@ -794,6 +907,7 @@
                       <el-button
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="
                           handleDeleteHeader(
                             scope.$index,
@@ -819,6 +933,7 @@
                         "
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="handleMoveDown(scope.$index, '固定表')"
                       >
                         下降
@@ -835,11 +950,16 @@
           <div class="button-group">
             <el-button
               type="primary"
+              :disabled="viewDetail"
               @click="handleAddTableHeader('动态表表头')"
             >
               添加表头
             </el-button>
-            <el-button type="primary" @click="handleSaveContent('动态表表头')">
+            <el-button
+              type="primary"
+              :disabled="viewDetail"
+              @click="handleSaveContent('动态表表头')"
+            >
               下一步
             </el-button>
           </div>
@@ -864,7 +984,7 @@
                     v-model="scope.row.fieldName"
                     placeholder="请输入字段名称"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   ></el-input>
                 </template>
               </el-table-column>
@@ -874,7 +994,7 @@
                     v-model="scope.row.fieldType"
                     placeholder="请选择字段类型"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                     @change="handleFieldTypeChange(scope.row)"
                   >
                     <el-option label="字符串" value="string"></el-option>
@@ -898,7 +1018,7 @@
                       placeholder="请输入长度"
                       size="small"
                       style="width: calc(100% - 80px)"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     ></el-input>
                   </div>
 
@@ -913,7 +1033,7 @@
                       placeholder="整数位数"
                       size="small"
                       style="width: 80px; margin: 0 5px"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     ></el-input>
                   </div>
 
@@ -928,7 +1048,7 @@
                       placeholder="小数位数"
                       size="small"
                       style="width: 80px; margin-left: 5px"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     ></el-input>
                   </div>
 
@@ -942,7 +1062,7 @@
                       placeholder="请选择日期格式"
                       size="small"
                       style="width: 100%"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     >
                       <el-option
                         label="yyyy-MM-dd HH:mm:ss"
@@ -960,7 +1080,8 @@
                       v-model="scope.row.format"
                       placeholder="请选择布尔值格式"
                       size="small"
-                      :disabled="scope.row.isDisabled"
+                      style="width: 100%"
+                      :disabled="scope.row.isDisabled || viewDetail"
                     >
                       <el-option label="是" value="true"></el-option>
                       <el-option label="否" value="false"></el-option>
@@ -972,7 +1093,7 @@
                     v-model="scope.row.format"
                     :placeholder="getFormatPlaceholder(scope.row.fieldType)"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   ></el-input>
                 </template>
               </el-table-column>
@@ -982,7 +1103,7 @@
                   <el-select
                     v-model="scope.row.isRequired"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   >
                     <el-option label="是" value="true"></el-option>
                     <el-option label="否" value="false"></el-option>
@@ -995,21 +1116,52 @@
                   <el-select
                     v-model="scope.row.showVisible"
                     size="small"
-                    :disabled="scope.row.isDisabled"
+                    :disabled="scope.row.isDisabled || viewDetail"
                   >
                     <el-option label="是" value="1"></el-option>
                     <el-option label="否" value="0"></el-option>
                   </el-select>
                 </template>
               </el-table-column>
-
+              <el-table-column prop="isDict" label="绑定字典" min-width="150">
+                <template slot-scope="scope">
+                  <div class="bind-dict-column">
+                    <el-select
+                      v-model="scope.row.isDict"
+                      size="small"
+                      style="width: 80px"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                      @change="handleBindDictChange(scope.row)"
+                    >
+                      <el-option label="是" value="true"></el-option>
+                      <el-option label="否" value="false"></el-option>
+                    </el-select>
+                    <el-select
+                      v-if="scope.row.isDict === 'true'"
+                      v-model="scope.row.dictid"
+                      placeholder="请选择字典"
+                      class="dict-select"
+                      size="small"
+                      style="width: 120px; margin-top: 5px"
+                      :disabled="scope.row.isDisabled || viewDetail"
+                    >
+                      <el-option
+                        v-for="(item, index) in dictTypeList"
+                        :key="index"
+                        :label="item.name"
+                        :value="String(item.id)"
+                      ></el-option>
+                    </el-select>
+                  </div>
+                </template>
+              </el-table-column>
               <el-table-column label="操作" width="150" fixed="right">
                 <template slot-scope="scope">
                   <div class="table-actions">
                     <el-button
                       type="text"
                       size="mini"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @click="
                         handleDeleteHeader(
                           scope.$index,
@@ -1024,7 +1176,7 @@
                       v-if="scope.$index !== 0"
                       type="text"
                       size="mini"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @click="handleMoveUp(scope.$index)"
                     >
                       上升
@@ -1035,7 +1187,7 @@
                       "
                       type="text"
                       size="mini"
-                      :disabled="scope.row.isDisabled"
+                      :disabled="scope.row.isDisabled || viewDetail"
                       @click="handleMoveDown(scope.$index)"
                     >
                       下降
@@ -1049,12 +1201,14 @@
             <div class="button-group">
               <el-button
                 type="primary"
+                :disabled="viewDetail"
                 @click="handleAddTableHeader('动态表项目')"
               >
                 添加项目
               </el-button>
               <el-button
                 type="primary"
+                :disabled="viewDetail"
                 @click="handleSaveContent('动态表项目')"
               >
                 保存
@@ -1077,6 +1231,7 @@
                       "
                       size="small"
                       placeholder="数字或中文"
+                      :disabled="viewDetail"
                       @input="
                         handleDynamicValueChange(scope.row, '序号', $event)
                       "
@@ -1131,6 +1286,7 @@
                           : ''
                       "
                       size="small"
+                      :disabled="viewDetail"
                       @input="
                         handleDynamicValueChange(scope.row, item.rkey, $event)
                       "
@@ -1141,8 +1297,10 @@
                   <template slot-scope="scope">
                     <div class="table-actions">
                       <el-button
+                        v-if="!scope.row.isChild"
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="
                           handleAddChildItem(
                             scope.$index,
@@ -1156,6 +1314,7 @@
                       <el-button
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="
                           handleDeleteHeader(
                             scope.$index,
@@ -1170,6 +1329,7 @@
                         v-if="scope.$index !== 0"
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="handleMoveUp(scope.$index, '动态表')"
                       >
                         上升
@@ -1181,6 +1341,7 @@
                         "
                         type="text"
                         size="mini"
+                        :disabled="viewDetail"
                         @click="handleMoveDown(scope.$index, '动态表')"
                       >
                         下降
@@ -1288,7 +1449,7 @@
     getListFixedEnabled,
   } from '@/api/costSurveyFdTemplate'
   import CostAuditTable from '@/components/costAudit/CostAuditTable.vue'
-  import { getDictTypeAll } from '@/api/dictionaryManage.js'
+  import { getDictTypList } from '@/api/dictionaryManage.js'
   import {
     listByTemplateIdAndVersion,
     getCellCodesByTemplateId,
@@ -1320,11 +1481,12 @@
         selectedRows: [],
         pagination: {
           currentPage: 1,
-          pageSize: 10,
+          pageSize: 50,
           total: 0, // 初始化为0
         },
         dialogVisible: false,
         detailDialogVisible: false,
+        viewDetail: false,
         contentEditDialogVisible: false,
         calculationFormulaDialogVisible: false,
         currentEditingRow: null,
@@ -1568,20 +1730,13 @@
       },
     },
     mounted() {
-      if (this.$route.params.id) {
-        this.id = this.$route.params.id
-        this.contentEditForm.tableName = this.$route.params.tableName || ''
-        this.contentEditForm.templateType =
-          this.$route.params.templateType || '固定表'
-      }
-      this.loadDictTypeList()
       this.isAutoGeneratedFormula = false
     },
     methods: {
       async loadDictTypeList() {
         try {
-          const res = await getDictTypeAll()
-          this.dictTypeList = res.value
+          const res = await getDictTypList()
+          this.dictTypeList = res || []
         } catch (error) {
           this.$message.error('加载字典类型失败')
           console.error('加载字典类型失败:', error)
@@ -1591,9 +1746,11 @@
         this.currentRow = row
         this.surveyTemplateId = row.surveyTemplateId
         this.templateType = row.templateType
+        this.surveyTemplateName = row.surveyTemplateName
         this.contentEditForm.tableName = row.storageTable
         this.contentEditForm.templateType = row.templateType
         this.handleSearch()
+        this.loadDictTypeList()
       },
       handleBack() {
         this.$emit('back', 'list')
@@ -1888,8 +2045,10 @@
 
       // 查看详情
       handleViewDetail(row) {
+        this.viewDetail = true
         this.detailForm = { ...row }
-        this.detailDialogVisible = true
+        // this.detailDialogVisible = true
+        this.handleEditContent(row)
       },
 
       // 添加子项方法
@@ -2416,7 +2575,7 @@
 
       // 启动/停用状态
       handleStatus(row) {
-        const action = row.status === '启用' ? '停用' : '启用'
+        const action = row.status === '0' ? '停用' : '启用'
         if (row.status === '0') {
           this.$confirm(`确认要停用该数据吗?`, '操作确认', {
             confirmButtonText: '确定',
@@ -3248,4 +3407,22 @@
       }
     }
   }
+  .detail-info-container {
+    margin: 20px 0;
+    border-radius: 4px;
+    .detail-item {
+      display: inline-block;
+      margin-right: 30px;
+      margin-bottom: 10px;
+
+      .detail-label {
+        font-weight: bold;
+        color: #606266;
+      }
+
+      .detail-value {
+        color: #303133;
+      }
+    }
+  }
 </style>

+ 2 - 1
src/views/costAudit/projectInfo/auditProjectManage/memoManage/index.vue

@@ -224,6 +224,7 @@
       <el-pagination
         :current-page.sync="searchParams.pageNum"
         :page-size="searchParams.pageSize"
+        :page-sizes="[50, 100]"
         layout="total, sizes, prev, pager, next, jumper"
         :total="listTotal"
         @size-change="handleSizeChange"
@@ -376,7 +377,7 @@
           startTime: '',
           endTime: '',
           pageNum: 1,
-          pageSize: 10,
+          pageSize: 50,
         },
         listTotal: 0,
 

+ 2 - 2
src/views/costAudit/projectInfo/auditTaskManage/taskCustomizedRelease/index.vue

@@ -207,8 +207,8 @@
         // 分页信息
         pagination: {
           currentPage: 1,
-          pageSize: 10,
-          total: 3,
+          pageSize: 50,
+          total: 0,
         },
         project: {},
         // 任务发布弹窗相关

+ 627 - 200
src/views/home/index.vue

@@ -1,41 +1,65 @@
 <template>
   <div class="dashboard-page">
-    <el-row :gutter="20" class="mb-20">
+    <el-row :gutter="20" class="mb-20 card-row">
       <el-col :span="14">
         <el-card shadow="hover">
-          <div slot="header" class="clearfix">
-            <h3>成本监审办理情况</h3>
-            <el-select
-              v-model="province"
-              placeholder="请选择省份"
-              style="width: 100px; margin-right: 10px"
-            >
-              <el-option label="山西省" value="山西省"></el-option>
-            </el-select>
-            <el-select
-              v-model="year"
-              placeholder="请选择年份"
-              style="width: 100px"
-            >
-              <el-option label="2025" value="2025"></el-option>
-            </el-select>
+          <div class="card-header">
+            <div class="left-icon">
+              <img src="@/assets/index_images/index-icon1@2x.png" alt="" />
+              <h3>成本监审办理情况</h3>
+            </div>
+            <div class="header-actions">
+              <el-select
+                v-model="province"
+                placeholder="请选择省份"
+                style="width: 100px; margin-right: 10px"
+              >
+                <el-option label="山西省" value="山西省"></el-option>
+              </el-select>
+              <el-select
+                v-model="year"
+                placeholder="请选择年份"
+                style="width: 100px"
+              >
+                <el-option label="2025" value="2025"></el-option>
+              </el-select>
+            </div>
           </div>
           <div ref="chartRef" style="width: 100%; height: 300px"></div>
         </el-card>
       </el-col>
       <el-col :span="10">
         <el-card shadow="hover">
-          <div slot="header" class="clearfix">
-            <h3>最新消息</h3>
-            <el-button type="text" @click="loadMoreNews">更多</el-button>
+          <div class="card-header">
+            <div class="left-icon">
+              <img src="@/assets/index_images/index-icon2@2x.png" alt="" />
+              <h3>最新消息</h3>
+            </div>
+            <el-button type="text" size="small" @click="loadMoreNews">
+              更多 &gt;
+            </el-button>
           </div>
-          <ul class="news-list">
+          <ul class="news-list card-content">
             <li v-for="(item, idx) in newsList" :key="idx" class="news-item">
-              <i class="el-icon-bell"></i>
-              <span class="news-content">{{ item.content }}</span>
-              <div class="news-meta">
-                <span>管理员</span>
-                <span>{{ item.time }}</span>
+              <i></i>
+              <div class="news-content">
+                <div class="news-title">{{ item.content }}</div>
+                <div>
+                  <div class="left-icon">
+                    <img
+                      src="@/assets/index_images/index-icon3@2x.png"
+                      alt=""
+                    />
+                    <span></span>
+                  </div>
+                  <div class="left-icon">
+                    <img
+                      src="@/assets/index_images/index-icon4@2x.png"
+                      alt=""
+                    />
+                    <span>{{ item.date }}</span>
+                  </div>
+                </div>
               </div>
             </li>
           </ul>
@@ -47,8 +71,11 @@
     <el-row class="mb-20">
       <el-col :span="24">
         <el-card shadow="hover">
-          <div slot="header" class="clearfix">
-            <h3>本人待办事项</h3>
+          <div class="card-header">
+            <div class="left-icon">
+              <img src="@/assets/index_images/index-icon5@2x.png" alt="" />
+              <h3>本人待办事项</h3>
+            </div>
             <el-select
               v-model="auditType"
               placeholder="请选择监审类型"
@@ -60,7 +87,7 @@
               ></el-option>
             </el-select>
           </div>
-          <el-table :data="todoList" border style="width: 100%">
+          <el-table :data="todoList" style="width: 100%" :stripe="false">
             <el-table-column label="预警" width="60">
               <template slot-scope="scope">
                 <el-tag v-if="scope.row.warning" type="warning">预警</el-tag>
@@ -77,11 +104,12 @@
               label="监审期间"
             ></el-table-column>
             <el-table-column prop="status" label="办理状态"></el-table-column>
-            <el-table-column label="操作">
+            <el-table-column label="操作" width="100">
               <template slot-scope="scope">
                 <el-button
                   v-if="scope.row.op === '任务详情'"
                   type="text"
+                  size="small"
                   @click="handleOp('详情', scope.row)"
                 >
                   任务详情
@@ -89,6 +117,7 @@
                 <el-button
                   v-if="scope.row.op === '任务办理'"
                   type="text"
+                  size="small"
                   @click="handleOp('办理', scope.row)"
                 >
                   任务办理
@@ -96,6 +125,7 @@
                 <el-button
                   v-if="scope.row.op === '查看'"
                   type="text"
+                  size="small"
                   @click="handleOp('查看', scope.row)"
                 >
                   查看
@@ -103,6 +133,7 @@
                 <el-button
                   v-if="scope.row.op === '审核'"
                   type="text"
+                  size="small"
                   @click="handleOp('审核', scope.row)"
                 >
                   审核
@@ -115,55 +146,128 @@
     </el-row>
 
     <!-- 第三行:本人备忘录 -->
-    <el-row>
-      <el-col :span="14">
+    <el-row class="card-row">
+      <el-col :span="24">
         <el-card shadow="hover">
-          <div slot="header" class="clearfix">
+          <div class="card-header">
             <h3>本人备忘录</h3>
+            <div class="search-actions">
+              <el-input
+                v-model="searchKeyword"
+                placeholder="请输入关键词"
+                style="width: 180px"
+                clearable
+              ></el-input>
+              <el-button
+                type="primary"
+                style="margin-left: 10px"
+                size="small"
+                @click="searchMemo"
+              >
+                查询
+              </el-button>
+            </div>
           </div>
-          <el-calendar v-model="currentDate">
-            <template slot="dateCell" slot-scope="{ data }">
-              <div class="calendar-day" :class="{ 'has-event': data.hasEvent }">
-                {{ data.day.split('-').slice(2).join('-') }}
-                <div v-if="data.hasEvent" class="event-tip">
-                  {{ data.eventInfo }}
+          <el-row>
+            <el-col :span="13">
+              <div class="calendar-container">
+                <div class="calendar-header">
+                  <el-button
+                    type="text"
+                    class="calendar-btn"
+                    @click="handlePrevMonth"
+                  >
+                    <i class="el-icon-arrow-left"></i>
+                  </el-button>
+                  <span class="month-text">
+                    {{ getCustomMonthText(currentDate) }}
+                    <span class="lunar-info">
+                      农历{{
+                        getChineseCalendar(
+                          currentDate.getFullYear(),
+                          currentDate.getMonth() + 1
+                        )
+                      }}年【{{ getChineseZodiac(currentDate.getFullYear()) }}】
+                    </span>
+                  </span>
+                  <el-button
+                    type="text"
+                    class="calendar-btn"
+                    @click="handleNextMonth"
+                  >
+                    <i class="el-icon-arrow-right"></i>
+                  </el-button>
                 </div>
+                <el-calendar ref="calendar" v-model="currentDate">
+                  <!-- 自定义日期单元格 -->
+                  <template slot="dateCell" slot-scope="{ data }">
+                    <div
+                      class="calendar-day"
+                      :class="{
+                        'has-event': hasEventOnDate(data.day),
+                        selected: data.date === currentDate,
+                        weekend: isWeekend(new Date(data.date)),
+                      }"
+                      @click="handleDateClick(data)"
+                    >
+                      <div class="date-number">
+                        {{ data.day.split('-').slice(2).join('-') }}
+                      </div>
+
+                      <div class="lunar-date">
+                        {{ getLunarDate(data.day) }}
+                      </div>
+
+                      <div
+                        v-if="hasEventOnDate(data.day)"
+                        class="event-dot"
+                      ></div>
+
+                      <div
+                        v-if="hasEventOnDate(data.day)"
+                        v-show="showTooltip && selectedDate === data.day"
+                        class="tooltip"
+                      >
+                        <div class="tooltip-content">
+                          {{ getEventDescription(data.day) }}
+                        </div>
+                      </div>
+                    </div>
+                  </template>
+                </el-calendar>
               </div>
-            </template>
-          </el-calendar>
-        </el-card>
-      </el-col>
-      <el-col :span="10">
-        <el-card shadow="hover">
-          <div slot="header" class="clearfix">
-            <h3>备忘录列表</h3>
-            <el-input
-              v-model="searchKeyword"
-              placeholder="请输入关键词"
-              style="width: 180px"
-            ></el-input>
-            <el-button
-              type="primary"
-              style="margin-left: 10px"
-              @click="searchMemo"
-            >
-              查询
-            </el-button>
-          </div>
-          <ul class="memo-list">
-            <li v-for="(item, idx) in memoList" :key="idx" class="memo-item">
-              <i v-if="item.type === 'warning'" class="el-icon-warning"></i>
-              <i v-else class="el-icon-info"></i>
-              <div class="memo-content">
-                <h4>{{ item.title }}</h4>
-                <p class="memo-desc">{{ item.desc }}</p>
-                <p class="memo-meta">
-                  <span>XX小学财务资料核直</span>
-                  <span>{{ item.time }}</span>
-                </p>
-              </div>
-            </li>
-          </ul>
+            </el-col>
+            <el-col :span="11">
+              <ul class="memo-list">
+                <li
+                  v-for="(item, idx) in memoList"
+                  :key="idx"
+                  class="memo-item"
+                >
+                  <div class="left-icon">
+                    <img
+                      v-if="item.type === 'warning'"
+                      src="@/assets/index_images/index-icon6-light@2x.png"
+                      alt=""
+                    />
+                    <img
+                      v-else
+                      src="@/assets/index_images/index-icon6@2x.png"
+                      alt=""
+                    />
+                  </div>
+                  <div class="memo-content">
+                    <h4>{{ item.title }}</h4>
+                    <p class="memo-desc">{{ item.desc }}</p>
+                    <p class="memo-meta">
+                      <span>{{ item.relatedTask || '相关任务' }}</span>
+                      <span>{{ item.time }}</span>
+                    </p>
+                  </div>
+                </li>
+              </ul>
+            </el-col>
+          </el-row>
         </el-card>
       </el-col>
     </el-row>
@@ -171,188 +275,228 @@
 </template>
 
 <script>
+  import * as echarts from 'echarts'
+
   export default {
-    name: 'CostAuditDashboard',
+    name: 'Dashboard',
     data() {
       return {
         province: '山西省',
         year: '2025',
+        auditType: '山西省公立幼儿园教育成本监审',
+        searchKeyword: '',
         newsList: [
           {
-            content: '依据定价管理规范,全面开展《山西省定价目录》修订工作',
-            time: '2025-05-06 14:00',
+            content:
+              '做好公立幼儿园监审工作,认真完成幼儿园教育成本监审资料核对和整理工作。',
+            time: '2025-06-10',
           },
           {
             content:
-              '为适应市场发展新形势,正式启动定价管理范畴内《山西省定价目录》的调整优化工作',
-            time: '2025-05-06 14:00',
+              '为推进市发改委工作,具体负责组织和调配用人单位《山西省定价目录》权限范围内定价成本监审工作。',
+            time: '2025-06-10',
           },
           {
             content:
-              '按照定价管理的既定流程和标准,积极推进《山西省定价目录》的更新完善事宜',
-            time: '2025-05-06 14:00',
+              '负责定价成本监审政策研究制定,组织编制《山西省定价目录》范围内的定价成本监审规则和方法。',
+            time: '2025-06-10',
           },
           {
             content:
-              '基于当前价格管理工作的实际需求,着力实施定价管理中《山西省定价目录》的修改完善行动',
-            time: '2025-05-06 14:00',
+              '需参与制定或修订成本监审相关的法规政策、成本监审目录,确定重大成本监审项目。',
+            time: '2025-06-10',
           },
           {
             content:
-              '为进一步提升定价管理的科学性与精准性,全面开启《山西省定价目录》的深度修订进程',
-            time: '2025-05-06 14:00',
+              '进一步提升会计解释的科学性与准确性,全面提升会计监督的目的性、针对性和有效性。',
+            time: '2025-06-10',
           },
         ],
-        auditType: '山西省公立幼儿园教育成本监审',
         todoList: [
           {
             warning: true,
             task: '山西省公立幼儿园教育成本监审',
-            unit: 'A***幼儿园、B***幼儿园、C***幼儿园',
-            auditForm: '定调价监审',
-            auditPeriod: '2023年-2025年',
-            status: '资料初审',
-            op: '任务详情',
-          },
-          {
-            warning: false,
-            task: '子任务',
-            unit: 'A***幼儿园',
-            auditForm: '定期监审',
-            auditPeriod: '2024年-2025年',
-            status: '初审通过',
-            op: '查看',
+            unit: 'XX幼儿园、YY幼儿园、ZZ幼儿园',
+            auditForm: '实地监审',
+            auditPeriod: '2023-2024年',
+            status: '进行中',
+            op: '任务办理',
           },
           {
             warning: false,
-            task: '子任务',
-            unit: 'B***幼儿园',
-            auditForm: '定调价监审',
-            auditPeriod: '2024年-2025年',
-            status: '已提交',
+            task: '山西省公立医院医疗服务成本监审',
+            unit: '山西省人民医院',
+            auditForm: '实地监审',
+            auditPeriod: '2023-2024年',
+            status: '待审核',
             op: '审核',
           },
           {
             warning: false,
-            task: '子任务',
-            unit: 'C***幼儿园',
-            auditForm: '定调价监审',
-            auditPeriod: '2024年-2025年',
-            status: '中止',
+            task: '太原市生活垃圾处理成本监审',
+            unit: '太原市环卫局',
+            auditForm: '书面监审',
+            auditPeriod: '2023-2024年',
+            status: '已完成',
             op: '查看',
           },
           {
-            warning: true,
-            task: '太原市自来水成本监审',
-            unit: 'A自来水公司、B自来水公司',
-            auditForm: '定期监审',
-            auditPeriod: '2022年-2024年',
-            status: '实地审核',
-            op: '任务详情',
-          },
-          {
-            warning: false,
-            task: '子任务',
-            unit: 'A自来水公司',
-            auditForm: '定期监审',
-            auditPeriod: '2022年-2024年',
-            status: '审核中',
-            op: '查看',
-          },
-          {
-            warning: false,
-            task: '子任务',
-            unit: 'B自来水公司',
-            auditForm: '定期监审',
-            auditPeriod: '2022年-2024年',
-            status: '审核通过',
-            op: '审核',
-          },
-          {
             warning: false,
-            task: '子任务',
-            unit: 'C自来水公司',
-            auditForm: '定期监审',
-            auditPeriod: '2022年-2024年',
-            status: '待补充材料',
-            op: '查看',
+            task: '山西省公立小学教育成本监审',
+            unit: '太原市实验小学等10所学校',
+            auditForm: '实地监审',
+            auditPeriod: '2023-2024年',
+            status: '待分配',
+            op: '任务详情',
           },
         ],
-        currentDate: new Date(),
-        searchKeyword: '',
         memoList: [
           {
             type: 'warning',
             title: '山西省公立小学教育成本监审',
             desc: '要求学校提供近三年教学设备采购、师资薪酬等财务明细。',
             time: '2025-05-06',
+            relatedTask: '山西省公立小学教育成本监审',
           },
           {
             type: 'warning',
             title: '山西省公立医院医疗服务成本监审',
             desc: '要依据药品采购、医疗器械使用、医护人员成本等情况提供明细。',
             time: '2025-05-06',
+            relatedTask: '山西省公立医院医疗服务成本监审',
           },
           {
             type: 'info',
             title: '太原市生活垃圾处理成本监审',
             desc: '要求提供垃圾收集、运输、处理各环节的成本支出明细。',
             time: '2025-05-06',
+            relatedTask: '太原市生活垃圾处理成本监审',
           },
           {
             type: 'info',
+            title: '太原市市政设施维护成本监审',
+            desc: '需要收集道路、桥梁、公共广场等市政设施的维护成本数据。',
+            time: '2025-05-18',
+            relatedTask: '太原市市政设施维护成本监审',
+          },
+          {
+            type: 'warning',
             title: '山西省公立小学教育成本监审',
             desc: '要求学校提供近三年教学设备采购、师资薪酬等财务明细。',
             time: '2025-05-06',
+            relatedTask: '山西省公立小学教育成本监审',
           },
         ],
+        currentDate: new Date(),
+        selectedDate: '',
+        showTooltip: false,
       }
     },
     mounted() {
-      this.initChart() // 初始化图表
+      this.initChart()
+      this.$el.querySelector('div.el-calendar__header').remove()
     },
     methods: {
+      // 获取自定义月份文本
+      getCustomMonthText(date) {
+        const year = date.getFullYear()
+        const month = date.getMonth() + 1
+
+        // 自定义格式
+        return `${year}年${month}月`
+      },
+      handlePrevMonth() {
+        this.currentDate = new Date(
+          this.currentDate.getFullYear(),
+          this.currentDate.getMonth() - 1,
+          this.currentDate.getDate()
+        )
+      },
+      handleNextMonth() {
+        this.currentDate = new Date(
+          this.currentDate.getFullYear(),
+          this.currentDate.getMonth() + 1,
+          this.currentDate.getDate()
+        )
+      },
+      // 判断是否为周末
+      isWeekend(date) {
+        const day = date.getDay() // 0-6,0表示周日,6表示周六
+        return day === 0 || day === 6 // 周日或周六为周末
+      },
       initChart() {
-        const chartDom = this.$refs.chartRef
-        const myChart = echarts.init(chartDom)
+        const chart = echarts.init(this.$refs.chartRef)
+        let data = [
+          { value: 10, name: '输配电' },
+          { value: 5, name: '燃气' },
+          { value: 20, name: '交通运输' },
+          { value: 15, name: '供热' },
+          { value: 30, name: '托育服务' },
+          { value: 25, name: '养老服务' },
+          { value: 40, name: '文化旅游' },
+        ]
         const option = {
           tooltip: {
             trigger: 'axis',
-            axisPointer: { type: 'shadow' },
+            axisPointer: {
+              type: 'shadow',
+            },
+          },
+          legend: {
+            data: ['已办', '在办'],
+          },
+          grid: {
+            left: '3%',
+            right: '4%',
+            bottom: '15%', // 增加底部空间以容纳滚动条和旋转的标签
+            containLabel: true,
           },
-          legend: { data: ['已办', '在办'] },
           xAxis: {
             type: 'category',
-            data: [
-              '输配电',
-              '燃气',
-              '交通运输',
-              '供热',
-              '交通运输',
-              '托育服务',
-              '养老服务',
-              '文化旅游',
-              '教育',
-              '殡葬',
-            ],
+            data: data.map((item) => item.name),
+            // 启用滚动条
+            axisLabel: {
+              interval: 0,
+              rotate: 0,
+            },
+            axisTick: {
+              alignWithLabel: true,
+            },
+            boundaryGap: true,
+            // 滚动配置
+            scrollBar: {
+              show: true,
+              height: 10,
+            },
+          },
+          yAxis: {
+            type: 'value',
           },
-          yAxis: { type: 'value', max: 60 },
           series: [
             {
               name: '已办',
               type: 'bar',
-              data: [52, 40, 35, 42, 28, 27, 22, 12, 42, 24],
+              barWidth: '10%',
+              data: [45, 38, 42, 39, 43, 48, 46, 44, 47, 52, 49, 51],
+              itemStyle: {
+                color: '#1890ff',
+              },
             },
             {
               name: '在办',
               type: 'bar',
-              data: [18, 30, 12, 25, 5, 45, 12, 28, 18, 35],
+              barWidth: '10%',
+              data: [18, 25, 16, 22, 20, 17, 19, 21, 24, 18, 23, 20],
+              itemStyle: {
+                color: '#ff9c6e',
+              },
             },
           ],
         }
-        myChart.setOption(option)
-        // 窗口resize时,图表自适应
-        window.addEventListener('resize', () => myChart.resize())
+        chart.setOption(option)
+        window.addEventListener('resize', () => {
+          chart.resize()
+        })
       },
       loadMoreNews() {
         this.$message.info('加载更多消息(可对接接口逻辑)')
@@ -363,15 +507,131 @@
       searchMemo() {
         this.$message.info(`搜索备忘录,关键词:${this.searchKeyword}`)
       },
+      hasEventOnDate(date) {
+        // 检查指定日期是否有备忘录事件
+        return this.memoList.some((item) => item.time === date.substring(5))
+      },
+      addMemo() {
+        this.$message.info('添加新备忘录')
+      },
+      // 获取农历日期
+      getLunarDate(date) {
+        const lunarMap = {
+          '01': '初一',
+          '02': '初二',
+          '03': '初三',
+          '04': '初四',
+          '05': '初五',
+          '06': '初六',
+          '07': '初七',
+          '08': '初八',
+          '09': '初九',
+          10: '初十',
+          11: '十一',
+          12: '十二',
+          13: '十三',
+          14: '十四',
+          15: '十五',
+          16: '十六',
+          17: '十七',
+          18: '十八',
+          19: '十九',
+          20: '二十',
+          21: '廿一',
+          22: '廿二',
+          23: '廿三',
+          24: '廿四',
+          25: '廿五',
+          26: '廿六',
+          27: '廿七',
+          28: '廿八',
+          29: '廿九',
+          30: '三十',
+        }
+
+        const day = date.split('-')[2]
+        return lunarMap[day] || ''
+      },
+      // 获取生肖信息
+      getChineseZodiac(year) {
+        const zodiacs = [
+          '鼠',
+          '牛',
+          '虎',
+          '兔',
+          '龙',
+          '蛇',
+          '马',
+          '羊',
+          '猴',
+          '鸡',
+          '狗',
+          '猪',
+        ]
+        const index = (year - 4) % 12
+        return zodiacs[index]
+      },
+
+      // 获取天干地支
+      getChineseCalendar(year, month) {
+        const heavenlyStems = [
+          '甲',
+          '乙',
+          '丙',
+          '丁',
+          '戊',
+          '己',
+          '庚',
+          '辛',
+          '壬',
+          '癸',
+        ]
+        const earthlyBranches = [
+          '子',
+          '丑',
+          '寅',
+          '卯',
+          '辰',
+          '巳',
+          '午',
+          '未',
+          '申',
+          '酉',
+          '戌',
+          '亥',
+        ]
+
+        // 简化计算,实际需要更复杂的算法
+        const stemIndex = (year - 3) % 10
+        const branchIndex = (year - 3) % 12
+
+        return `${heavenlyStems[stemIndex]}${earthlyBranches[branchIndex]}`
+      },
+
+      // 获取事件描述
+      getEventDescription(date) {
+        const event = this.memoList.find(
+          (item) => item.time === date.substring(5)
+        )
+        return event ? `${event.title} [${event.time}]` : ''
+      },
+
+      // 处理日期点击
+      handleDateClick(data) {
+        this.currentDate = new Date(data.date)
+        this.selectedDate = data.day
+        this.showTooltip = true
+
+        // 2秒后隐藏提示
+        setTimeout(() => {
+          this.showTooltip = false
+        }, 2000)
+      },
     },
   }
 </script>
 
-<style scoped>
-  .clearfix {
-    /* border: 1px solid red; */
-    display: flex;
-  }
+<style scoped lang="scss">
   .dashboard-page {
     padding: 20px;
   }
@@ -379,26 +639,68 @@
     /* border: 1px solid red; */
     margin-bottom: 20px;
   }
-  .news-list {
-    list-style: none;
-    padding: 0;
-    margin: 0;
+  /* 确保同一行的卡片高度一致 */
+  .card-row {
+    display: flex;
+    flex-wrap: wrap;
   }
-  .news-item {
-    padding: 10px 0;
-    border-bottom: 1px solid #eee;
+  .card-row .el-card {
+    height: 100%;
     display: flex;
     flex-direction: column;
   }
-  .news-content {
-    line-height: 1.5;
+  ::v-deep .el-card__body {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    padding: 0;
   }
-  .news-meta {
-    font-size: 12px;
-    color: #999;
-    margin-top: 5px;
+  .card-header {
+    width: 100%;
     display: flex;
     justify-content: space-between;
+    align-items: center;
+    background: linear-gradient(0deg, #e8edfc, #ffffff);
+    padding: 10px 20px;
+    box-sizing: border-box;
+  }
+
+  .header-actions {
+    display: flex;
+    align-items: center;
+  }
+  .calendar-actions {
+    display: flex;
+    align-items: center;
+  }
+  .search-actions {
+    display: flex;
+    align-items: center;
+  }
+  .news-list {
+  }
+  .card-content {
+    padding: 20px;
+  }
+  .news-item {
+    padding: 12px 0;
+    border-bottom: 1px solid #f0f0f0;
+    display: flex;
+    align-items: flex-start;
+  }
+  .news-item:last-child {
+    border-bottom: none;
+  }
+  .news-item i {
+    color: #f56c6c;
+    margin-right: 8px;
+    font-size: 14px;
+    margin-top: 2px;
+  }
+  .news-content {
+    line-height: 1.6;
+    font-size: 14px;
+    flex: 1;
   }
   .calendar-day {
     position: relative;
@@ -409,27 +711,27 @@
   .has-event {
     background-color: #f0f9eb;
   }
-  .event-tip {
+  .event-dot {
     position: absolute;
-    top: 100%;
+    bottom: 5px;
     left: 50%;
     transform: translateX(-50%);
-    background: rgba(0, 0, 0, 0.7);
-    color: #fff;
-    font-size: 12px;
-    padding: 3px 6px;
-    border-radius: 4px;
-    white-space: nowrap;
-    z-index: 10;
+    width: 6px;
+    height: 6px;
+    background-color: #67c23a;
+    border-radius: 50%;
   }
   .memo-list {
     list-style: none;
     padding: 0;
     margin: 0;
+    /* 移除滚动条限制 */
+    max-height: none;
+    overflow-y: visible;
   }
   .memo-item {
-    padding: 10px 0;
-    border-bottom: 1px solid #eee;
+    padding: 12px 0;
+    border-bottom: 1px solid #f0f0f0;
     display: flex;
     align-items: flex-start;
   }
@@ -437,8 +739,9 @@
     border-bottom: none;
   }
   .memo-item i {
-    margin-right: 8px;
-    font-size: 16px;
+    margin-right: 10px;
+    font-size: 18px;
+    margin-top: 2px;
   }
   .memo-item i.el-icon-warning {
     color: #f56c6c;
@@ -446,10 +749,18 @@
   .memo-item i.el-icon-info {
     color: #409eff;
   }
+  .memo-content {
+    flex: 1;
+  }
+  .memo-content h4 {
+    margin: 0 0 5px 0;
+    font-size: 14px;
+    font-weight: 500;
+  }
   .memo-desc {
     font-size: 12px;
     color: #666;
-    margin: 5px 0;
+    margin: 0 0 8px 0;
     line-height: 1.5;
   }
   .memo-meta {
@@ -458,4 +769,120 @@
     display: flex;
     justify-content: space-between;
   }
+  .left-icon {
+    display: flex;
+    align-items: center;
+    img {
+      width: 20px;
+    }
+  }
+  h3 {
+    margin: 0;
+    // font-size: 16px;
+    font-weight: bolder;
+    color: #333333;
+    margin-left: 10px;
+  }
+  .month-text {
+    font-size: 16px;
+    font-weight: 500;
+    color: #303133;
+  }
+  .lunar-info {
+    font-size: 14px;
+    margin-left: 10px;
+  }
+
+  .calendar-day:hover {
+    background-color: #f5f7fa;
+  }
+
+  .calendar-day.selected {
+    background-color: #ecf5ff;
+    border-color: #a0d3e8;
+  }
+
+  .calendar-day.has-event {
+    background-color: #f0f9eb;
+  }
+  .calendar-day.weekend .date-number {
+    color: #fd8c2f;
+  }
+
+  .date-number {
+    font-size: 14px;
+    font-weight: 500;
+    color: #303133;
+    margin-bottom: 4px;
+  }
+
+  .lunar-date {
+    font-size: 12px;
+    color: #999;
+    margin-bottom: 4px;
+  }
+
+  .event-dot {
+    position: absolute;
+    bottom: 5px;
+    left: 50%;
+    transform: translateX(-50%);
+    width: 6px;
+    height: 6px;
+    background-color: #67c23a;
+    border-radius: 50%;
+  }
+
+  .tooltip {
+    position: absolute;
+    top: 100%;
+    left: 50%;
+    transform: translateX(-50%);
+    background-color: #333;
+    color: white;
+    padding: 8px 12px;
+    border-radius: 4px;
+    font-size: 12px;
+    z-index: 1000;
+    opacity: 0;
+    transition: opacity 0.3s ease;
+  }
+
+  .tooltip.show {
+    opacity: 1;
+  }
+
+  .tooltip-content {
+    max-width: 200px;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+  }
+
+  .calendar-header {
+    width: 95%;
+    margin: 15px auto 0;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    text-align: center;
+    background: #f0f4fd;
+    padding: 5px 0;
+  }
+  .calendar-btn {
+    margin: 0 20px;
+    cursor: pointer;
+    font-size: 20px;
+    color: #606266;
+    transition: color 0.3s ease;
+    &:hover {
+      color: #409eff;
+    }
+  }
+  /* 使星期几头部居中显示 */
+  ::v-deep .el-calendar-table thead th {
+    text-align: center !important;
+    font-weight: 500;
+    color: #606266;
+  }
 </style>

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff