src/views/CNAS/resourceDemand/device/component/checkRecord.vue
@@ -141,6 +141,7 @@
  findExaminePlanDetail,
  resolveExaminePlanDetail,
  updateDeviceExaminePlanDetail,
  getDeviceById,
} from '@/api/cnas/resourceDemand/device.js'
import { selectUserCondition } from "@/api/performance/class";
import LimsAttachment from '@/components/Attachment/lims-attachment.vue'
@@ -178,6 +179,7 @@
      selectedDeviceId: '',
      submitFormLoading: false,
      userList: [],
      planDueDate: '',
      rules: {
        checkMethod: [{ required: true, message: '请填写核查方式', trigger: 'blur' }],
      },
@@ -209,6 +211,15 @@
        fileName: row.fileName || '',
        fileUrl: row.fileUrl || '',
        planDetailsId: row.planDetailsId,
      }
      this.planDueDate = ''
      if (row.deviceId && /^\d{4}-\d{2}$/.test(this.form.checkTime)) {
        getDeviceById({ deviceId: row.deviceId }).then(res => {
          const due = res.data && res.data.nextExamineDate
          if (due && String(due).slice(0, 7) === this.form.checkTime) {
            this.planDueDate = String(due).slice(0, 10)
          }
        }).catch(() => {})
      }
    },
    // 新增核查记录:自选设备,提交时自动匹配/创建本轮计划明细
@@ -328,6 +339,48 @@
    },
    // 提交审核
    examine(statue) {
      const checkTime = this.form.checkTime || ''
      const now = new Date()
      const nowMonth = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`
      const checkMonth = checkTime.slice(0, 7)
      const isEarlyReview = statue === 1 && /^\d{4}-\d{2}/.test(checkTime) && checkMonth > nowMonth
      if (!isEarlyReview) {
        this.submitReview(statue)
        return
      }
      const isMonthOnly = /^\d{4}-\d{2}$/.test(checkTime)
      const nowYear = nowMonth.slice(0, 4)
      const todayStr = `${nowMonth}-${String(now.getDate()).padStart(2, '0')}`
      const plannedText = isMonthOnly
        ? (this.planDueDate ? `${this.planDueDate}(计划月份 ${checkTime})` : `${checkTime}(系统计划只登记到月份)`)
        : checkTime
      const head = `<div class="er-head">该条记录的计划核查时间为 <b>${plannedText}</b>,当前审核日期是 <b>${todayStr}</b>,属于<b>提前审核</b>。</div>`
      const items = isMonthOnly
        ? [
          `本轮记录按实际审核月份归档:核查时间登记为 <b>${nowMonth}</b>(实际审核日期 ${todayStr}),并归入 <b>${nowYear} 年设备核查计划</b>(切到 ${nowYear} 年可看到,状态显示“通过”)。`,
          `系统会按设备的核查周期自动生成下一轮待核查任务(在下次核查日期所属年份的计划中),初始状态“未开始”——这是正常现象,不是审核没生效。`,
          `设备档案的最近核查日期更新为 <b>${todayStr}</b>,下次核查日期按核查周期自动计算。`
        ]
        : [
          `该记录保留原核查日期 <b>${checkTime}</b>,审核状态显示“通过”。`,
          `系统会按设备的核查周期自动生成下一轮待核查任务(在下次核查日期所属年份的计划中),初始状态“未开始”,这是正常现象。`,
          `设备档案的最近核查日期更新为 <b>${todayStr}</b>,下次核查日期按核查周期自动计算。`
        ]
      const content = `${head}<div class="er-title">通过后系统会做三件事:</div>` +
        `<ol class="er-list">${items.map(item => `<li>${item}</li>`).join('')}</ol>` +
        `<div class="er-question">是否确认通过?</div>`
      this.$confirm(content, '提前审核提醒', {
        confirmButtonText: '确认通过',
        cancelButtonText: '取消',
        type: 'warning',
        dangerouslyUseHTMLString: true,
        customClass: 'early-review-message',
      }).then(() => {
        this.submitReview(statue, isMonthOnly)
      }).catch(() => {})
    },
    // 真正提交审核
    submitReview(statue, isMonthOnly = false) {
      this.submitFormLoading = true
      const params = {
        planDetailsId: this.form.planDetailsId,
@@ -335,7 +388,12 @@
      }
      reviewExamineRecord(params).then(res => {
        if (res.code == 200) {
          this.$message.success(statue === 1 ? '审核通过' : '已退回')
          if (statue === 1 && isMonthOnly) {
            const now = new Date()
            this.$message.success(`审核通过,本轮已归入 ${now.getFullYear()} 年设备核查计划`)
          } else {
            this.$message.success(statue === 1 ? '审核通过' : '已退回')
          }
          this.resetForm()
        }
        this.submitFormLoading = false
@@ -447,3 +505,51 @@
  margin-bottom: 12px;
}
</style>
<style>
.early-review-message {
  width: 560px !important;
  max-width: calc(100vw - 40px);
}
.early-review-message .el-message-box__message {
  line-height: 1.8;
}
.early-review-message .er-head {
  padding: 10px 14px;
  margin-bottom: 16px;
  line-height: 1.8;
  color: #303133;
  background: #fdf6ec;
  border-left: 4px solid #e6a23c;
  border-radius: 4px;
}
.early-review-message .er-title {
  margin-bottom: 8px;
  font-weight: 600;
  color: #303133;
}
.early-review-message .er-list {
  margin: 0 0 0 4px;
  padding-left: 20px;
  list-style: decimal;
}
.early-review-message .er-list li {
  margin-bottom: 10px;
  line-height: 1.8;
  color: #303133;
}
.early-review-message .er-list li:last-child {
  margin-bottom: 0;
}
.early-review-message .er-question {
  margin-top: 16px;
  color: #606266;
}
</style>