doa-week-edit.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <template>
  2. <view class="page">
  3. <view v-if="!week" class="loading-box">加载中...</view>
  4. <view v-else class="content">
  5. <text class="page-hint">第 {{ week.weekNo }} 周 · {{ formatDate(week.weekStart) }} ~ {{ formatDate(week.weekEnd) }}</text>
  6. <!-- A表:周行动宣告计划 -->
  7. <view class="section">
  8. <text class="section-title">📋 本周行动计划(A表)</text>
  9. <text class="section-desc">写下本周要做的具体行动,每行一个(参考:明确人事时地)</text>
  10. <textarea class="field-textarea" v-model="form.plan" placeholder="1、完成站桩15分钟&#10;2、准备早餐、拍照记录&#10;3、..."></textarea>
  11. <button class="btn-save" @click="savePlan">保存计划</button>
  12. </view>
  13. <!-- B表:周复盘五问 -->
  14. <view class="section" v-if="week.status === 'reviewed' || week.status === 'planned' || week.status === 'pending'">
  15. <text class="section-title">✅ 本周复盘(B表)</text>
  16. <view class="review-field">
  17. <text class="review-label">本周达成了什么?</text>
  18. <textarea class="field-textarea" v-model="form.achieved" placeholder="如:体重降到 171.5"></textarea>
  19. </view>
  20. <view class="review-field">
  21. <text class="review-label">有什么体验?</text>
  22. <textarea class="field-textarea" v-model="form.experience" placeholder="如:愉悦、疲惫"></textarea>
  23. </view>
  24. <view class="review-field">
  25. <text class="review-label">行得通的是什么?</text>
  26. <textarea class="field-textarea" v-model="form.worked" placeholder="总结有效的方法"></textarea>
  27. </view>
  28. <view class="review-field">
  29. <text class="review-label">要提升 / 行不通的是什么?</text>
  30. <textarea class="field-textarea" v-model="form.improve" placeholder="总结待改进之处"></textarea>
  31. </view>
  32. <view class="review-field">
  33. <text class="review-label">下一周要挑战自己什么?</text>
  34. <textarea class="field-textarea" v-model="form.nextChallenge" placeholder="写下下周的新挑战"></textarea>
  35. </view>
  36. <button class="btn-save review-btn" @click="saveReview">提交复盘</button>
  37. </view>
  38. </view>
  39. </view>
  40. </template>
  41. <script>
  42. import { getDoaStageDetail, submitDoaWeekPlan, submitDoaWeekReview } from '../../utils/api.js'
  43. export default {
  44. data() {
  45. return {
  46. weekId: 0,
  47. stageId: 0,
  48. week: null,
  49. form: {
  50. plan: '',
  51. achieved: '',
  52. experience: '',
  53. worked: '',
  54. improve: '',
  55. nextChallenge: ''
  56. }
  57. }
  58. },
  59. onLoad(options) {
  60. this.weekId = parseInt(options.weekId || '0', 10)
  61. this.stageId = parseInt(options.stageId || '0', 10)
  62. this.loadWeek()
  63. },
  64. methods: {
  65. formatDate(dateStr) {
  66. if (!dateStr) return ''
  67. return String(dateStr).slice(0, 10)
  68. },
  69. async loadWeek() {
  70. try {
  71. var res = await getDoaStageDetail(this.stageId)
  72. if (res.code === 200 && res.data && res.data.weeks) {
  73. for (var i = 0; i < res.data.weeks.length; i++) {
  74. if (res.data.weeks[i].id === this.weekId) {
  75. this.week = res.data.weeks[i]
  76. this.form.plan = this.week.plan || ''
  77. this.form.achieved = this.week.achieved || ''
  78. this.form.experience = this.week.experience || ''
  79. this.form.worked = this.week.worked || ''
  80. this.form.improve = this.week.improve || ''
  81. this.form.nextChallenge = this.week.nextChallenge || ''
  82. break
  83. }
  84. }
  85. }
  86. if (!this.week) {
  87. uni.showToast({ title: '周记录不存在', icon: 'none' })
  88. setTimeout(function() { uni.navigateBack() }, 1000)
  89. }
  90. } catch (e) {
  91. uni.showToast({ title: '加载失败', icon: 'none' })
  92. }
  93. },
  94. savePlan() {
  95. var self = this
  96. submitDoaWeekPlan(this.weekId, this.form.plan).then(function(res) {
  97. if (res.code === 200) {
  98. uni.showToast({ title: '计划已保存', icon: 'success' })
  99. self.week.status = 'planned'
  100. } else {
  101. uni.showToast({ title: res.message || '保存失败', icon: 'none' })
  102. }
  103. })
  104. },
  105. saveReview() {
  106. var self = this
  107. var data = {
  108. weekId: this.weekId,
  109. achieved: this.form.achieved,
  110. experience: this.form.experience,
  111. worked: this.form.worked,
  112. improve: this.form.improve,
  113. nextChallenge: this.form.nextChallenge
  114. }
  115. submitDoaWeekReview(data).then(function(res) {
  116. if (res.code === 200) {
  117. uni.showToast({ title: '复盘已提交', icon: 'success' })
  118. self.week.status = 'reviewed'
  119. setTimeout(function() { uni.navigateBack() }, 600)
  120. } else {
  121. uni.showToast({ title: res.message || '提交失败', icon: 'none' })
  122. }
  123. })
  124. }
  125. }
  126. }
  127. </script>
  128. <style scoped>
  129. .page { min-height: 100vh; background: #F5F7FA; padding: 24rpx; }
  130. .loading-box { text-align: center; padding: 100rpx 0; color: #94A3B8; font-size: 28rpx; }
  131. .page-hint { font-size: 26rpx; color: #475569; display: block; margin-bottom: 16rpx; font-weight: 600; }
  132. .section { background: #fff; border-radius: 16rpx; padding: 24rpx; margin-bottom: 20rpx; }
  133. .section-title { font-size: 28rpx; font-weight: 700; color: #1E293B; display: block; }
  134. .section-desc { font-size: 22rpx; color: #94A3B8; margin-top: 4rpx; display: block; }
  135. .field-textarea {
  136. background: #F8FAFC; border: 1rpx solid #E2E8F0; border-radius: 12rpx;
  137. padding: 16rpx 18rpx; font-size: 26rpx; color: #1E293B;
  138. height: 160rpx; width: 100%; box-sizing: border-box; margin-top: 12rpx;
  139. }
  140. .review-field { margin-top: 16rpx; }
  141. .review-label { font-size: 24rpx; color: #475569; font-weight: 600; display: block; }
  142. .btn-save {
  143. background: #10B981; color: #fff; font-size: 28rpx; font-weight: 600;
  144. border-radius: 40rpx; border: none; height: 76rpx; line-height: 76rpx;
  145. margin-top: 20rpx;
  146. }
  147. .review-btn { background: #6366F1; }
  148. </style>