|
@@ -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分钟 2、准备早餐、拍照记录 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>
|