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

fix: 修改备忘录bug

shiyanyu преди 5 часа
родител
ревизия
15c1d30a77

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

@@ -110,7 +110,10 @@
                   >
                     <span
                       :style="{
-                        backgroundColor: getReminderTypeColor(row.reminderType),
+                        backgroundColor: getReminderTypeColor(
+                          row.reminderType,
+                          row
+                        ),
                       }"
                       class="reminder-dot-marker"
                     ></span>
@@ -228,7 +231,7 @@
           >
             <span
               :style="{
-                backgroundColor: getReminderTypeColor(row.reminderType),
+                backgroundColor: getReminderTypeColor(row.reminderType, row),
               }"
               class="reminder-dot-marker"
             ></span>

+ 105 - 10
src/views/costAudit/projectInfo/auditProjectManage/memoManage/memoManageMixin.js

@@ -244,17 +244,112 @@ export const memoManageMixin = {
       }
     },
     // 根据提醒类型获取对应的颜色
-    getReminderTypeColor(type) {
-      const colorMap = {
-        1: '#c0c4cc', // 不提醒 - 浅灰色
-        2: '#f56c6c', // 提前1小时 - 红色
-        3: '#e6a23c', // 提前2小时 - 橙色
-        4: '#e6a23c', // 提前3小时 - 橙色
-        5: '#73c0de', // 提前1天 - 天蓝色
-        6: '#98fb98', // 提前2天 - 浅绿色
-        7: '#c0c4cc', // 提前3天 - 浅灰色
+    // 规则:
+    // - reminderType=0:一直灰色
+    // - reminderType!=0:未到提醒触发时间 => 灰色;到达触发时间 => 显示 reminderType 对应颜色
+    // 触发时间 = memoDate + timePeriod(开始时间) - reminderType 对应提前量
+    // 兼容旧用法:
+    // - getReminderTypeColor(row.reminderType)
+    // 推荐用法(可动态判断):
+    // - getReminderTypeColor(row.reminderType, row)
+    getReminderTypeColor(type, row) {
+      console.log('getReminderTypeColor', type, row)
+      const t = Number(type)
+
+      // 不提醒:始终灰色
+      if (!t) return '#c0c4cc'
+
+      // 触发后才显示对应颜色;未触发(或未传row无法判断)统一灰色
+      if (!row || !this._isReminderTriggered(row)) {
+        return '#c0c4cc'
+      }
+
+      // 已触发:按 reminderType 显示对应颜色
+      const triggeredColorMap = {
+        1: '#f56c6c', // 提前1小时 - 红色
+        2: '#e6a23c', // 提前2小时 - 橙色
+        3: '#e6a23c', // 提前3小时 - 橙色
+        4: '#73c0de', // 提前1天 - 天蓝色
+        5: '#98fb98', // 提前2天 - 浅绿色
+        6: '#c0c4cc', // 提前3天 - 浅灰色
+      }
+
+      return triggeredColorMap[t] || '#c0c4cc'
+    },
+
+    /**
+     * 判断是否已到提醒触发时间
+     * 触发时间 = memoDate + timePeriod 的开始时间 - reminderType 对应的提前量
+     * @private
+     */
+    _isReminderTriggered(row) {
+      const reminderType = Number(row?.reminderType)
+      if (!reminderType) return false // 0:不提醒
+
+      const memoDate = row?.memoDate
+      const timePeriod = row?.timePeriod
+      if (!memoDate || !timePeriod) return false
+
+      const { startTime } = this._parseTimePeriod(timePeriod)
+      if (!startTime) return false
+
+      const startAt = moment(`${memoDate} ${startTime}`, 'YYYY-MM-DD HH:mm')
+      if (!startAt.isValid()) return false
+
+      const offset = this._getReminderOffset(reminderType)
+      const remindAt = startAt.clone().subtract(offset)
+      const now = moment()
+
+      // 只在“提前窗口内”触发:remindAt <= now <= startAt
+      return now.isSameOrAfter(remindAt) && now.isSameOrBefore(startAt)
+    },
+
+    /**
+     * timePeriod: "16:00-18:13" -> { startTime: "16:00", endTime: "18:13" }
+     * @private
+     */
+    _parseTimePeriod(timePeriod) {
+      if (!timePeriod || typeof timePeriod !== 'string') {
+        return { startTime: '', endTime: '' }
+      }
+      const arr = timePeriod.split('-')
+      if (arr.length !== 2) {
+        return { startTime: '', endTime: '' }
+      }
+      return {
+        startTime: (arr[0] || '').trim(),
+        endTime: (arr[1] || '').trim(),
+      }
+    },
+
+    /**
+     * reminderType:
+     * 0 不提醒
+     * 1 提前1小时
+     * 2 提前2小时
+     * 3 提前3小时
+     * 4 提前1天
+     * 5 提前2天
+     * 6 提前3天
+     * @private
+     */
+    _getReminderOffset(reminderType) {
+      switch (Number(reminderType)) {
+        case 1:
+          return { hours: 1 }
+        case 2:
+          return { hours: 2 }
+        case 3:
+          return { hours: 3 }
+        case 4:
+          return { days: 1 }
+        case 5:
+          return { days: 2 }
+        case 6:
+          return { days: 3 }
+        default:
+          return { minutes: 0 }
       }
-      return colorMap[type] || '#c0c4cc'
     },
 
     // 时间处理逻辑已移除,改为直接使用editForm中的startTime和endTime