Просмотр исходного кода

feat(doa): 新增doa-week-edit周计划复盘编辑页

Sisyphus 1 месяц назад
Родитель
Сommit
708b9ff16a
1 измененных файлов с 154 добавлено и 0 удалено
  1. 154 0
      cfc-frontend/pages/health/doa-week-edit.vue

+ 154 - 0
cfc-frontend/pages/health/doa-week-edit.vue

@@ -0,0 +1,154 @@
+<template>
+  <view class="page">
+    <view v-if="!week" class="loading-box">加载中...</view>
+
+    <view v-else class="content">
+      <text class="page-hint">第 {{ week.weekNo }} 周 · {{ formatDate(week.weekStart) }} ~ {{ formatDate(week.weekEnd) }}</text>
+
+      <!-- A表:周行动宣告计划 -->
+      <view class="section">
+        <text class="section-title">📋 本周行动计划(A表)</text>
+        <text class="section-desc">写下本周要做的具体行动,每行一个(参考:明确人事时地)</text>
+        <textarea class="field-textarea" v-model="form.plan" placeholder="1、完成站桩15分钟&#10;2、准备早餐、拍照记录&#10;3、..."></textarea>
+        <button class="btn-save" @click="savePlan">保存计划</button>
+      </view>
+
+      <!-- B表:周复盘五问 -->
+      <view class="section" v-if="week.status === 'reviewed' || week.status === 'planned' || week.status === 'pending'">
+        <text class="section-title">✅ 本周复盘(B表)</text>
+        <view class="review-field">
+          <text class="review-label">本周达成了什么?</text>
+          <textarea class="field-textarea" v-model="form.achieved" placeholder="如:体重降到 171.5"></textarea>
+        </view>
+        <view class="review-field">
+          <text class="review-label">有什么体验?</text>
+          <textarea class="field-textarea" v-model="form.experience" placeholder="如:愉悦、疲惫"></textarea>
+        </view>
+        <view class="review-field">
+          <text class="review-label">行得通的是什么?</text>
+          <textarea class="field-textarea" v-model="form.worked" placeholder="总结有效的方法"></textarea>
+        </view>
+        <view class="review-field">
+          <text class="review-label">要提升 / 行不通的是什么?</text>
+          <textarea class="field-textarea" v-model="form.improve" placeholder="总结待改进之处"></textarea>
+        </view>
+        <view class="review-field">
+          <text class="review-label">下一周要挑战自己什么?</text>
+          <textarea class="field-textarea" v-model="form.nextChallenge" placeholder="写下下周的新挑战"></textarea>
+        </view>
+        <button class="btn-save review-btn" @click="saveReview">提交复盘</button>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { getDoaStageDetail, submitDoaWeekPlan, submitDoaWeekReview } from '../../utils/api.js'
+
+export default {
+  data() {
+    return {
+      weekId: 0,
+      stageId: 0,
+      week: null,
+      form: {
+        plan: '',
+        achieved: '',
+        experience: '',
+        worked: '',
+        improve: '',
+        nextChallenge: ''
+      }
+    }
+  },
+  onLoad(options) {
+    this.weekId = parseInt(options.weekId || '0', 10)
+    this.stageId = parseInt(options.stageId || '0', 10)
+    this.loadWeek()
+  },
+  methods: {
+    formatDate(dateStr) {
+      if (!dateStr) return ''
+      return String(dateStr).slice(0, 10)
+    },
+    async loadWeek() {
+      try {
+        var res = await getDoaStageDetail(this.stageId)
+        if (res.code === 200 && res.data && res.data.weeks) {
+          for (var i = 0; i < res.data.weeks.length; i++) {
+            if (res.data.weeks[i].id === this.weekId) {
+              this.week = res.data.weeks[i]
+              this.form.plan = this.week.plan || ''
+              this.form.achieved = this.week.achieved || ''
+              this.form.experience = this.week.experience || ''
+              this.form.worked = this.week.worked || ''
+              this.form.improve = this.week.improve || ''
+              this.form.nextChallenge = this.week.nextChallenge || ''
+              break
+            }
+          }
+        }
+        if (!this.week) {
+          uni.showToast({ title: '周记录不存在', icon: 'none' })
+          setTimeout(function() { uni.navigateBack() }, 1000)
+        }
+      } catch (e) {
+        uni.showToast({ title: '加载失败', icon: 'none' })
+      }
+    },
+    savePlan() {
+      var self = this
+      submitDoaWeekPlan(this.weekId, this.form.plan).then(function(res) {
+        if (res.code === 200) {
+          uni.showToast({ title: '计划已保存', icon: 'success' })
+          self.week.status = 'planned'
+        } else {
+          uni.showToast({ title: res.message || '保存失败', icon: 'none' })
+        }
+      })
+    },
+    saveReview() {
+      var self = this
+      var data = {
+        weekId: this.weekId,
+        achieved: this.form.achieved,
+        experience: this.form.experience,
+        worked: this.form.worked,
+        improve: this.form.improve,
+        nextChallenge: this.form.nextChallenge
+      }
+      submitDoaWeekReview(data).then(function(res) {
+        if (res.code === 200) {
+          uni.showToast({ title: '复盘已提交', icon: 'success' })
+          self.week.status = 'reviewed'
+          setTimeout(function() { uni.navigateBack() }, 600)
+        } else {
+          uni.showToast({ title: res.message || '提交失败', icon: 'none' })
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.page { min-height: 100vh; background: #F5F7FA; padding: 24rpx; }
+.loading-box { text-align: center; padding: 100rpx 0; color: #94A3B8; font-size: 28rpx; }
+.page-hint { font-size: 26rpx; color: #475569; display: block; margin-bottom: 16rpx; font-weight: 600; }
+.section { background: #fff; border-radius: 16rpx; padding: 24rpx; margin-bottom: 20rpx; }
+.section-title { font-size: 28rpx; font-weight: 700; color: #1E293B; display: block; }
+.section-desc { font-size: 22rpx; color: #94A3B8; margin-top: 4rpx; display: block; }
+.field-textarea {
+  background: #F8FAFC; border: 1rpx solid #E2E8F0; border-radius: 12rpx;
+  padding: 16rpx 18rpx; font-size: 26rpx; color: #1E293B;
+  height: 160rpx; width: 100%; box-sizing: border-box; margin-top: 12rpx;
+}
+.review-field { margin-top: 16rpx; }
+.review-label { font-size: 24rpx; color: #475569; font-weight: 600; display: block; }
+.btn-save {
+  background: #10B981; color: #fff; font-size: 28rpx; font-weight: 600;
+  border-radius: 40rpx; border: none; height: 76rpx; line-height: 76rpx;
+  margin-top: 20rpx;
+}
+.review-btn { background: #6366F1; }
+</style>