695593266@qq.com 6 dienas atpakaļ
vecāks
revīzija
a1fdfd2d19

+ 4 - 4
src/views/enterpriseModel/dept/components/org-edit.vue

@@ -474,7 +474,8 @@
           return false;
         }
         let form = {
-          ...this.form
+          ...this.form,
+          managerFirst: this.managerFirst?.name ? [this.managerFirst] : []
         };
         if (['10', '20'].includes(this.form.type)) {
           form['enterprise'] = this.enterprise;
@@ -487,9 +488,6 @@
         if (!this.isUpdate) {
           delete data.id;
         }
-        if (this.managerFirst?.name) {
-          this.form.managerFirst[0] = this.managerFirst;
-        }
         const saveOrUpdate = this.isUpdate
           ? updateOrganization
           : addOrganization;
@@ -545,9 +543,11 @@
       },
       clearManagerFirst() {
         this.managerFirst = {};
+        this.form.managerFirst = [];
       },
       userBk(data) {
         this.managerFirst = data;
+        this.form.managerFirst = data?.name ? [data] : [];
       },
       openStaffSelection() {
         console.log(this.form.manager);

+ 0 - 6
src/views/factoryCalendar/components/AdjustApproval.vue

@@ -30,12 +30,6 @@
           {{ vm.getLabel(vm.approvalStatusOptions, row.applyStatus) }}
         </el-tag>
       </template>
-      <template v-slot:isConflict="{ row }">
-        <el-tag v-if="row.isConflict" size="mini" type="danger">
-          有冲突
-        </el-tag>
-        <el-tag v-else size="mini" type="success">无冲突</el-tag>
-      </template>
       <template v-slot:action="{ row }">
         <el-link
           type="primary"

+ 122 - 169
src/views/factoryCalendar/components/StatisticsView.vue

@@ -36,9 +36,9 @@
             <span>启用日历</span>
             <strong>{{ enabledCalendarCount }}/{{ totalCalendarCount }}</strong>
           </div>
-          <div :class="{ danger: conflictDayCount }">
-            <span>冲突天数</span>
-            <strong>{{ conflictDayCount }}</strong>
+          <div>
+            <span>排班完成率</span>
+            <strong>{{ vm.scheduleRate }}%</strong>
           </div>
         </div>
       </div>
@@ -46,7 +46,7 @@
 
     <section class="industrial-kpi-strip">
       <div
-        v-for="item in vm.visualKpis"
+        v-for="item in displayVisualKpis"
         :key="item.key"
         class="industrial-kpi"
         :style="{ '--accent-color': getKpiColor(item.key) }"
@@ -63,104 +63,66 @@
     </section>
 
     <section class="industrial-main-grid">
-      <div class="industrial-column industrial-column-main">
-        <div class="industrial-panel schedule-analysis">
-          <div class="industrial-panel-head">
-            <div>
-              <span>Schedule Ratio</span>
-              <strong>排班状态占比</strong>
-              <p>工作日、空闲日与节假日构成</p>
-            </div>
-            <el-tag
-              size="mini"
-              :type="vm.scheduleRate >= 90 ? 'success' : 'warning'"
-            >
-              {{ vm.scheduleRate >= 90 ? '状态良好' : '需关注' }}
-            </el-tag>
+      <div class="industrial-panel schedule-analysis">
+        <div class="industrial-panel-head">
+          <div>
+            <span>Schedule Ratio</span>
+            <strong>排班状态占比</strong>
+            <p>工作日、空闲日与节假日构成</p>
           </div>
+          <el-tag
+            size="mini"
+            :type="vm.scheduleRate >= 90 ? 'success' : 'warning'"
+          >
+            {{ vm.scheduleRate >= 90 ? '状态良好' : '需关注' }}
+          </el-tag>
+        </div>
 
-          <div class="schedule-analysis-body">
-            <el-tooltip
-              placement="top"
-              effect="light"
-              :content="vm.scheduleTooltip"
-              :disabled="isScrolling"
-              :enterable="false"
-              popper-class="factory-calendar-stat-tooltip"
-            >
-              <div class="schedule-radar">
-                <div
-                  class="schedule-donut"
-                  :style="{ background: vm.scheduleDonutBackground }"
-                >
-                  <div class="schedule-donut-center">
-                    <strong>{{ vm.scheduleRate }}%</strong>
-                    <span>已排班率</span>
-                  </div>
-                </div>
-              </div>
-            </el-tooltip>
-
-            <div class="schedule-segments">
-              <el-tooltip
-                v-for="item in vm.scheduleSegments"
-                :key="item.key"
-                placement="top"
-                effect="light"
-                :content="vm.getScheduleSegmentTooltip(item)"
-                :disabled="isScrolling"
-                :enterable="false"
-                popper-class="factory-calendar-stat-tooltip"
+        <div class="schedule-analysis-body">
+          <el-tooltip
+            placement="top"
+            effect="light"
+            :content="vm.scheduleTooltip"
+            :disabled="isScrolling"
+            :enterable="false"
+            popper-class="factory-calendar-stat-tooltip"
+          >
+            <div class="schedule-radar">
+              <div
+                class="schedule-donut"
+                :style="{ background: vm.scheduleDonutBackground }"
               >
-                <div
-                  class="schedule-segment-row"
-                  :style="{ '--segment-color': item.color }"
-                >
-                  <div class="segment-meta">
-                    <span>{{ item.label }}</span>
-                    <strong>{{ item.value }}</strong>
-                  </div>
-                  <div class="segment-track">
-                    <i
-                      :style="{ width: getScheduleSegmentPercent(item) + '%' }"
-                    />
-                  </div>
+                <div class="schedule-donut-center">
+                  <strong>{{ vm.scheduleRate }}%</strong>
+                  <span>已排班率</span>
                 </div>
-              </el-tooltip>
+              </div>
             </div>
-          </div>
-        </div>
+          </el-tooltip>
 
-        <div class="industrial-panel month-analysis">
-          <div class="industrial-panel-head">
-            <div>
-              <span>Monthly Status</span>
-              <strong>月度状态分布</strong>
-              <p>按当前年月统计各类日期数量</p>
-            </div>
-          </div>
-
-          <div class="month-telemetry-list">
+          <div class="schedule-segments">
             <el-tooltip
-              v-for="item in vm.visualMonthBars"
+              v-for="item in vm.scheduleSegments"
               :key="item.key"
               placement="top"
               effect="light"
-              :content="vm.getMonthBarTooltip(item)"
+              :content="vm.getScheduleSegmentTooltip(item)"
               :disabled="isScrolling"
               :enterable="false"
               popper-class="factory-calendar-stat-tooltip"
             >
               <div
-                class="month-telemetry-row"
-                :style="{ '--month-color': item.color }"
+                class="schedule-segment-row"
+                :style="{ '--segment-color': item.color }"
               >
-                <div class="month-row-head">
+                <div class="segment-meta">
                   <span>{{ item.label }}</span>
-                  <strong>{{ item.value }}</strong>
+                  <strong>{{ item.value }}</strong>
                 </div>
-                <div class="month-track">
-                  <i :style="{ width: item.percent + '%' }" />
+                <div class="segment-track">
+                  <i
+                    :style="{ width: getScheduleSegmentPercent(item) + '%' }"
+                  />
                 </div>
               </div>
             </el-tooltip>
@@ -168,89 +130,80 @@
         </div>
       </div>
 
-      <div class="industrial-column industrial-column-side">
-        <div class="industrial-panel type-analysis">
-          <div class="industrial-panel-head">
-            <div>
-              <span>Calendar Type</span>
-              <strong>日历类型分布</strong>
-              <p>生产、设备、人员日历启停情况</p>
-            </div>
+      <div class="industrial-panel type-analysis">
+        <div class="industrial-panel-head">
+          <div>
+            <span>Calendar Type</span>
+            <strong>日历类型分布</strong>
+            <p>生产、设备、人员日历启停情况</p>
           </div>
+        </div>
 
-          <div class="type-distribution">
-            <el-tooltip
-              v-for="item in vm.calendarTypeStats"
-              :key="item.value"
-              placement="top"
-              effect="light"
-              :content="vm.getCalendarTypeTooltip(item)"
-              :disabled="isScrolling"
-              :enterable="false"
-              popper-class="factory-calendar-stat-tooltip"
+        <div class="type-distribution">
+          <el-tooltip
+            v-for="item in vm.calendarTypeStats"
+            :key="item.value"
+            placement="top"
+            effect="light"
+            :content="vm.getCalendarTypeTooltip(item)"
+            :disabled="isScrolling"
+            :enterable="false"
+            popper-class="factory-calendar-stat-tooltip"
+          >
+            <div
+              class="type-distribution-row"
+              :style="{
+                '--type-color': item.color,
+                '--type-percent': getCalendarTypePercent(item) + '%'
+              }"
             >
-              <div
-                class="type-distribution-row"
-                :style="{
-                  '--type-color': item.color,
-                  '--type-percent': getCalendarTypePercent(item) + '%'
-                }"
-              >
-                <div class="type-orbit">
-                  <strong>{{ item.count }}</strong>
-                </div>
-                <div class="type-copy">
-                  <strong>{{ item.label }}</strong>
-                  <span
-                    >{{ item.enabled }} 个启用 /
-                    {{ item.disabled }} 个禁用</span
-                  >
-                </div>
+              <div class="type-orbit">
+                <strong>{{ item.count }}</strong>
               </div>
-            </el-tooltip>
-          </div>
+              <div class="type-copy">
+                <strong>{{ item.label }}</strong>
+                <span
+                  >{{ item.enabled }} 个启用 / {{ item.disabled }} 个禁用</span
+                >
+              </div>
+            </div>
+          </el-tooltip>
         </div>
+      </div>
 
-        <div class="industrial-panel conflict-analysis">
-          <div class="industrial-panel-head">
-            <div>
-              <span>Conflict Trend</span>
-              <strong>冲突趋势</strong>
-              <p>近 6 个时间点所在周冲突数量</p>
-            </div>
-            <el-tag size="mini" :type="conflictDayCount ? 'danger' : 'success'">
-              {{ conflictDayCount ? '存在冲突' : '无冲突' }}
-            </el-tag>
+      <div class="industrial-panel month-analysis">
+        <div class="industrial-panel-head">
+          <div>
+            <span>Monthly Status</span>
+            <strong>月度状态分布</strong>
+            <p>按当前年月统计各类日期数量</p>
           </div>
+        </div>
 
-          <div class="conflict-analysis-body">
-            <div class="conflict-total" :class="{ danger: conflictDayCount }">
-              <span>当前月冲突天数</span>
-              <strong>{{ conflictDayCount }}</strong>
-            </div>
-            <div class="conflict-bars">
-              <el-tooltip
-                v-for="item in vm.conflictTrend"
-                :key="item.label"
-                placement="top"
-                effect="light"
-                :content="vm.getConflictTrendTooltip(item)"
-                :disabled="isScrolling"
-                :enterable="false"
-                popper-class="factory-calendar-stat-tooltip"
-              >
-                <div
-                  class="conflict-bar"
-                  :class="{ 'is-zero': !Number(item.count || 0) }"
-                >
-                  <span :style="{ height: item.height + '%' }">
-                    <b>{{ item.count }}</b>
-                  </span>
-                  <em>{{ item.label }}</em>
-                </div>
-              </el-tooltip>
+        <div class="month-telemetry-list">
+          <el-tooltip
+            v-for="item in displayMonthBars"
+            :key="item.key"
+            placement="top"
+            effect="light"
+            :content="vm.getMonthBarTooltip(item)"
+            :disabled="isScrolling"
+            :enterable="false"
+            popper-class="factory-calendar-stat-tooltip"
+          >
+            <div
+              class="month-telemetry-row"
+              :style="{ '--month-color': item.color }"
+            >
+              <div class="month-row-head">
+                <span>{{ item.label }}</span>
+                <strong>{{ item.value }} 天</strong>
+              </div>
+              <div class="month-track">
+                <i :style="{ width: item.percent + '%' }" />
+              </div>
             </div>
-          </div>
+          </el-tooltip>
         </div>
       </div>
     </section>
@@ -284,15 +237,21 @@
         return (this.vm.calendars || []).filter((item) => item.status === 1)
           .length;
       },
+      displayVisualKpis() {
+        return (this.vm.visualKpis || []).filter(
+          (item) => item.key !== 'conflict'
+        );
+      },
+      displayMonthBars() {
+        return (this.vm.visualMonthBars || []).filter(
+          (item) => item.key !== 'conflict'
+        );
+      },
       healthScore() {
         const scheduleScore = Number(this.vm.scheduleRate) || 0;
-        const conflictPenalty = Math.min(this.conflictDayCount * 8, 40);
-        return Math.max(scheduleScore - conflictPenalty, 0);
+        return Math.max(scheduleScore, 0);
       },
       healthText() {
-        if (this.conflictDayCount) {
-          return '冲突待处理';
-        }
         if (this.healthScore >= 90) {
           return '稳定运行';
         }
@@ -300,12 +259,6 @@
           return '基本可控';
         }
         return '需要排查';
-      },
-      conflictDayCount() {
-        const stat = (this.vm.monthStats || []).find(
-          (item) => item.key === 'conflict'
-        );
-        return Number(stat?.value || 0);
       }
     },
     mounted() {

+ 323 - 0
src/views/factoryCalendar/components/factoryCalendar.scss

@@ -112,6 +112,214 @@
       }
     }
 
+    @at-root .adjust-detail-dialog {
+      border-radius: 8px;
+      overflow: hidden;
+
+      .el-dialog__header {
+        padding: 22px 30px 18px;
+        border-bottom: 1px solid #edf1f7;
+        background: linear-gradient(180deg, #ffffff, #f8fbff);
+      }
+
+      .el-dialog__title {
+        color: #1f2d3d;
+        font-size: 20px;
+        font-weight: 700;
+      }
+
+      .el-dialog__body {
+        max-height: calc(100vh - 186px);
+        padding: 22px 30px;
+        background:
+          linear-gradient(135deg, rgba(64, 158, 255, 0.05), transparent 42%),
+          #f7faff;
+        overflow-y: auto;
+      }
+
+      .el-dialog__footer {
+        padding: 14px 30px 18px;
+        border-top: 1px solid #edf1f7;
+        background: #ffffff;
+      }
+
+      .adjust-detail-view {
+        color: #1f2d3d;
+        font-size: 15px;
+      }
+
+      .adjust-detail-grid {
+        display: grid;
+        grid-template-columns: repeat(2, minmax(0, 1fr));
+        gap: 12px;
+      }
+
+      .adjust-detail-field,
+      .adjust-data-card,
+      .adjust-detail-section {
+        border: 1px solid #dbe8f5;
+        border-radius: 8px;
+        background:
+          linear-gradient(135deg, rgba(255, 255, 255, 0.96), rgba(239, 247, 255, 0.86)),
+          #ffffff;
+        box-shadow:
+          inset 0 1px 0 rgba(255, 255, 255, 0.95),
+          0 8px 18px rgba(32, 89, 148, 0.06);
+      }
+
+      .adjust-detail-field {
+        min-height: 66px;
+        padding: 12px 16px;
+      }
+
+      .adjust-detail-field span,
+      .adjust-data-card span,
+      .section-title {
+        display: block;
+        margin-bottom: 6px;
+        color: #7a8798;
+        font-size: 14px;
+        line-height: 20px;
+        font-weight: 600;
+      }
+
+      .adjust-detail-field strong,
+      .adjust-data-card strong {
+        display: block;
+        color: #25364a;
+        font-size: 16px;
+        line-height: 24px;
+        font-weight: 700;
+        word-break: break-word;
+      }
+
+      .adjust-detail-field .el-tag {
+        height: 28px;
+        padding: 0 12px;
+        font-size: 14px;
+        line-height: 26px;
+      }
+
+      .adjust-compare {
+        display: grid;
+        grid-template-columns: repeat(2, minmax(0, 1fr));
+        gap: 12px;
+        margin-top: 12px;
+      }
+
+      .adjust-data-card {
+        position: relative;
+        min-height: 88px;
+        padding: 14px 18px;
+        overflow: hidden;
+      }
+
+      .adjust-data-card::before {
+        content: '';
+        position: absolute;
+        left: 0;
+        top: 0;
+        bottom: 0;
+        width: 4px;
+      }
+
+      .adjust-data-card.before::before {
+        background: #909399;
+      }
+
+      .adjust-data-card.after::before {
+        background: #409eff;
+      }
+
+      .adjust-detail-section {
+        margin-top: 12px;
+        padding: 15px 18px;
+      }
+
+      .adjust-detail-section p {
+        margin: 0;
+        color: #25364a;
+        font-size: 16px;
+        line-height: 26px;
+        word-break: break-word;
+      }
+
+      .approve-timeline {
+        display: flex;
+        flex-direction: column;
+        gap: 12px;
+      }
+
+      .approve-node {
+        display: grid;
+        grid-template-columns: 18px minmax(0, 1fr);
+        gap: 10px;
+      }
+
+      .node-dot {
+        width: 10px;
+        height: 10px;
+        margin-top: 9px;
+        border: 2px solid #ffffff;
+        border-radius: 50%;
+        background: #67c23a;
+        box-shadow: 0 0 0 4px rgba(103, 194, 58, 0.14);
+      }
+
+      .node-content {
+        padding: 10px 12px;
+        border: 1px solid #dbe8f5;
+        border-radius: 7px;
+        background: rgba(255, 255, 255, 0.78);
+      }
+
+      .node-content > div {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        gap: 12px;
+      }
+
+      .node-content strong {
+        color: #25364a;
+        font-size: 16px;
+        line-height: 24px;
+      }
+
+      .node-content span,
+      .node-content em {
+        color: #7a8798;
+        font-size: 14px;
+        line-height: 20px;
+        font-style: normal;
+      }
+
+      .node-content p {
+        margin: 5px 0 2px;
+        color: #425466;
+        font-size: 15px;
+        line-height: 24px;
+      }
+
+      .approve-empty {
+        padding: 18px;
+        border: 1px dashed #cfdceb;
+        border-radius: 8px;
+        color: #8a97a8;
+        font-size: 15px;
+        line-height: 22px;
+        text-align: center;
+        background: rgba(255, 255, 255, 0.62);
+      }
+
+      @media (max-width: 900px) {
+        .adjust-detail-grid,
+        .adjust-compare {
+          grid-template-columns: 1fr;
+        }
+      }
+    }
+
     .factory-calendar-card {
       min-height: calc(100vh - 112px);
     }
@@ -5454,6 +5662,121 @@
     font-weight: 600;
   }
 
+  .factory-calendar .industrial-stat-board .industrial-kpi-strip {
+    grid-template-columns: repeat(3, minmax(0, 1fr));
+  }
+
+  .factory-calendar .industrial-stat-board .industrial-main-grid {
+    grid-template-columns: minmax(0, 1.42fr) minmax(360px, 0.58fr);
+    grid-template-areas:
+      'schedule types'
+      'month month';
+    align-items: stretch;
+  }
+
+  .factory-calendar .industrial-stat-board .schedule-analysis {
+    grid-area: schedule;
+  }
+
+  .factory-calendar .industrial-stat-board .type-analysis {
+    grid-area: types;
+  }
+
+  .factory-calendar .industrial-stat-board .type-analysis {
+    display: flex;
+    width: 100%;
+    min-height: 0;
+    flex-direction: column;
+  }
+
+  .factory-calendar .industrial-stat-board .type-distribution {
+    display: grid;
+    flex: 1;
+    grid-template-rows: repeat(3, minmax(92px, 1fr));
+    gap: 12px;
+  }
+
+  .factory-calendar .industrial-stat-board .type-distribution-row {
+    grid-template-columns: 68px minmax(0, 1fr);
+    min-height: 92px;
+    padding: 14px;
+    background:
+      linear-gradient(135deg, rgba(255, 255, 255, 0.92), rgba(231, 249, 252, 0.78)),
+      rgba(255, 255, 255, 0.8);
+  }
+
+  .factory-calendar .industrial-stat-board .type-orbit {
+    width: 58px;
+    height: 58px;
+  }
+
+  .factory-calendar .industrial-stat-board .month-analysis {
+    grid-area: month;
+    grid-column: 1 / -1;
+    min-height: 0;
+  }
+
+  .factory-calendar .industrial-stat-board .month-telemetry-list {
+    display: grid;
+    grid-template-columns: repeat(5, minmax(150px, 1fr));
+    gap: 12px;
+  }
+
+  .factory-calendar .industrial-stat-board .month-telemetry-row {
+    display: flex;
+    min-height: 72px;
+    justify-content: center;
+    flex-direction: column;
+    padding: 14px 16px;
+  }
+
+  .factory-calendar .industrial-stat-board .schedule-analysis-body {
+    grid-template-columns: 210px minmax(0, 1fr);
+    gap: 20px;
+  }
+
+  .factory-calendar .industrial-stat-board .schedule-segments {
+    gap: 12px;
+  }
+
+  .factory-calendar .industrial-stat-board .schedule-segment-row {
+    padding: 13px 15px;
+  }
+
+  @media (max-width: 1500px) {
+    .factory-calendar .industrial-stat-board .industrial-main-grid {
+      grid-template-columns: minmax(0, 1.24fr) minmax(330px, 0.76fr);
+    }
+
+    .factory-calendar .industrial-stat-board .schedule-analysis-body {
+      grid-template-columns: 188px minmax(0, 1fr);
+    }
+
+    .factory-calendar .industrial-stat-board .month-telemetry-list {
+      grid-template-columns: repeat(3, minmax(180px, 1fr));
+    }
+  }
+
+  @media (max-width: 1360px) {
+    .factory-calendar .industrial-stat-board .industrial-kpi-strip,
+    .factory-calendar .industrial-stat-board .industrial-main-grid,
+    .factory-calendar .industrial-stat-board .schedule-analysis-body,
+    .factory-calendar .industrial-stat-board .month-telemetry-list {
+      grid-template-columns: 1fr;
+    }
+
+    .factory-calendar .industrial-stat-board .industrial-main-grid {
+      grid-template-areas:
+        'schedule'
+        'types'
+        'month';
+    }
+
+    .factory-calendar .industrial-stat-board .type-distribution {
+      grid-template-rows: none;
+    }
+  }
+
   @keyframes factoryStatTipPulse {
     0% {
       transform: translateY(0) scale(1);

+ 127 - 43
src/views/factoryCalendar/index.vue

@@ -633,45 +633,98 @@
     <ele-modal
       :visible.sync="adjustDetailVisible"
       title="调整记录追溯"
-      width="760px"
-      custom-class="ele-dialog-form"
+      width="860px"
+      custom-class="ele-dialog-form adjust-detail-dialog"
     >
-      <el-descriptions v-if="adjustDetail.id" :column="2" border size="small">
-        <el-descriptions-item label="申请单号">
-          {{ adjustDetail.applyNo }}
-        </el-descriptions-item>
-        <el-descriptions-item label="关联日历">
-          {{ adjustDetail.calendarName }}
-        </el-descriptions-item>
-        <el-descriptions-item label="调整类型">
-          {{ getLabel(adjustTypeOptions, adjustDetail.adjustType) }}
-        </el-descriptions-item>
-        <el-descriptions-item label="审批状态">
-          {{ getLabel(approvalStatusOptions, adjustDetail.applyStatus) }}
-        </el-descriptions-item>
-        <el-descriptions-item label="调整日期">
-          {{ adjustDetail.adjustDate }}
-        </el-descriptions-item>
-        <el-descriptions-item label="生效周期">
-          {{ adjustDetail.effectiveTime }} 至 {{ adjustDetail.expireTime }}
-        </el-descriptions-item>
-        <el-descriptions-item label="调整前数据" :span="2">
-          {{ adjustDetail.oldContent }}
-        </el-descriptions-item>
-        <el-descriptions-item label="调整后数据" :span="2">
-          {{ formatSegmentContent(adjustDetail.newContent, adjustDetail) }}
-        </el-descriptions-item>
-        <el-descriptions-item label="调整原因" :span="2">
-          {{ adjustDetail.applyReason }}
-        </el-descriptions-item>
-        <el-descriptions-item label="审批节点" :span="2">
-          {{ adjustDetail.approveNode || '暂无审批记录' }}
-        </el-descriptions-item>
-      </el-descriptions>
+      <div v-if="adjustDetail.id" class="adjust-detail-view">
+        <div class="adjust-detail-grid">
+          <div class="adjust-detail-field">
+            <span>申请单号</span>
+            <strong>{{ adjustDetail.applyNo || '-' }}</strong>
+          </div>
+          <div class="adjust-detail-field">
+            <span>关联日历</span>
+            <strong>{{ adjustDetail.calendarName || '-' }}</strong>
+          </div>
+          <div class="adjust-detail-field">
+            <span>调整类型</span>
+            <strong>{{
+              getLabel(adjustTypeOptions, adjustDetail.adjustType)
+            }}</strong>
+          </div>
+          <div class="adjust-detail-field">
+            <span>审批状态</span>
+            <el-tag
+              size="mini"
+              :type="approvalStatusTag(adjustDetail.applyStatus)"
+            >
+              {{ getLabel(approvalStatusOptions, adjustDetail.applyStatus) }}
+            </el-tag>
+          </div>
+          <div class="adjust-detail-field">
+            <span>调整日期</span>
+            <strong>{{ adjustDetail.adjustDate || '-' }}</strong>
+          </div>
+          <div class="adjust-detail-field">
+            <span>生效周期</span>
+            <strong>
+              {{ adjustDetail.effectiveTime || '-' }} 至
+              {{ adjustDetail.expireTime || '-' }}
+            </strong>
+          </div>
+        </div>
+
+        <div class="adjust-compare">
+          <div class="adjust-data-card before">
+            <span>调整前数据</span>
+            <strong>{{ adjustDetail.oldContent || '-' }}</strong>
+          </div>
+          <div class="adjust-data-card after">
+            <span>调整后数据</span>
+            <strong>{{
+              formatSegmentContent(adjustDetail.newContent, adjustDetail) || '-'
+            }}</strong>
+          </div>
+        </div>
+
+        <div class="adjust-detail-section">
+          <div class="section-title">调整原因</div>
+          <p>{{ adjustDetail.applyReason || '-' }}</p>
+        </div>
+
+        <div class="adjust-detail-section">
+          <div class="section-title">审批节点</div>
+          <div
+            v-if="formatApproveNodes(adjustDetail.approveNode).length"
+            class="approve-timeline"
+          >
+            <div
+              v-for="(node, index) in formatApproveNodes(
+                adjustDetail.approveNode
+              )"
+              :key="index"
+              class="approve-node"
+            >
+              <div class="node-dot"></div>
+              <div class="node-content">
+                <div>
+                  <strong>{{ node.statusText }}</strong>
+                  <span>{{ node.approveTime || '-' }}</span>
+                </div>
+                <p>{{ node.approveOpinion || '-' }}</p>
+                <em v-if="node.approveUserId"
+                  >审批人ID:{{ node.approveUserId }}</em
+                >
+              </div>
+            </div>
+          </div>
+          <div v-else class="approve-empty">暂无审批记录</div>
+        </div>
+      </div>
       <div slot="footer">
-        <el-button icon="el-icon-download" @click="exportAdjustRecord">
+        <!-- <el-button icon="el-icon-download" @click="exportAdjustRecord">
           导出追溯
-        </el-button>
+        </el-button> -->
         <el-button @click="adjustDetailVisible = false">关闭</el-button>
       </div>
     </ele-modal>
@@ -1124,13 +1177,6 @@
             align: 'center',
             slot: 'applyStatus'
           },
-          {
-            minWidth: 110,
-            prop: 'isConflict',
-            label: '预校验',
-            align: 'center',
-            slot: 'isConflict'
-          },
           {
             minWidth: 130,
             prop: 'applyUserName',
@@ -3369,6 +3415,44 @@
           })
           .join('、');
       },
+      formatApproveNodes(approveNode) {
+        if (!approveNode) {
+          return [];
+        }
+        let nodes = approveNode;
+        if (typeof approveNode === 'string') {
+          try {
+            nodes = JSON.parse(approveNode);
+          } catch (e) {
+            return [
+              {
+                statusText: '审批记录',
+                approveOpinion: approveNode,
+                approveTime: '',
+                approveUserId: ''
+              }
+            ];
+          }
+        }
+        const list = Array.isArray(nodes) ? nodes : [nodes];
+        return list
+          .filter((item) => item && typeof item === 'object')
+          .map((item) => {
+            const status = Number(item.applyStatus ?? item.approveStatus);
+            return {
+              statusText:
+                this.getLabel(approvalStatusOptions, status) ||
+                item.statusText ||
+                '审批记录',
+              approveOpinion:
+                item.approveOpinion || item.opinion || item.remark || '',
+              approveTime: String(item.approveTime || item.createTime || '')
+                .replace('T', ' ')
+                .slice(0, 19),
+              approveUserId: item.approveUserId || item.userId || ''
+            };
+          });
+      },
       async openDayDrawer(day) {
         if (!day.date || day.hiddenByFilter) {
           return;

+ 4 - 4
src/views/system/organization/components/org-edit.vue

@@ -340,14 +340,12 @@
           return false;
         }
         let form = {
-          ...this.form
+          ...this.form,
+          managerFirst: this.managerFirst?.name ? [this.managerFirst] : []
         };
         if (['10', '20'].includes(this.form.type)) {
           form['enterprise'] = this.enterprise;
         }
-        if (this.managerFirst?.name) {
-          this.form.managerFirst[0] = this.managerFirst;
-        }
         this.loading = true;
         const data = {
           ...form,
@@ -402,9 +400,11 @@
       },
       clearManagerFirst() {
         this.managerFirst = {};
+        this.form.managerFirst = [];
       },
       userBk(data) {
         this.managerFirst = data;
+        this.form.managerFirst = data?.name ? [data] : [];
       },
       /* 更新visible */
       updateVisible(value) {