admin 3 viikkoa sitten
vanhempi
commit
65f1ac8018
1 muutettua tiedostoa jossa 47 lisäystä ja 5 poistoa
  1. 47 5
      src/components/page/admin/inspect/assess/Index.vue

+ 47 - 5
src/components/page/admin/inspect/assess/Index.vue

@@ -5,7 +5,7 @@
         <el-option label="周度" :value="1" />
         <el-option label="月度" :value="2" />
       </el-select>
-      <el-input v-model="query.periodCode" placeholder="周期编码,如 2026-08" clearable style="width: 180px;" />
+      <el-input v-model="query.periodCode" :placeholder="periodCodePlaceholder(query.periodType)" clearable style="width: 200px;" />
       <el-select v-model="query.storeBelongto" placeholder="校区/区域" clearable filterable style="width: 180px;">
         <el-option v-for="b in belongtoOptions" :key="b.value" :label="b.label" :value="b.value" />
       </el-select>
@@ -148,7 +148,8 @@
           </el-radio-group>
         </el-form-item>
         <el-form-item label="周期编码" required>
-          <el-input v-model="triggerForm.periodCode" placeholder="如 2026-08" />
+          <el-input v-model="triggerForm.periodCode" :placeholder="'例:' + periodCodePlaceholder(triggerForm.periodType)" />
+          <span class="tip">按上方周期与小范围自动生成;周度形如 2026W35,月度形如 202608。</span>
         </el-form-item>
         <el-form-item label="周期范围" required>
           <el-date-picker v-model="periodRange" type="daterange" value-format="yyyy-MM-dd" start-placeholder="开始日期" end-placeholder="结束日期" style="width: 100%;" />
@@ -194,6 +195,10 @@ export default {
       padL: 40, padR: 16, padT: 12, padB: 26, chartW: 560, chartH: 200
     }
   },
+  watch: {
+    'triggerForm.periodType'() { this.autoPeriodCode() },
+    periodRange() { this.autoPeriodCode() }
+  },
   computed: {
     belongtoOptions() {
       const map = {}
@@ -306,8 +311,34 @@ export default {
       this.loadDistribution()
       this.loadTrend()
     },
+    periodCodePlaceholder(type) {
+      if (Number(type) === 1) return '周度,如 2026W35'
+      if (Number(type) === 2) return '月度,如 202608'
+      return '周度 2026W35 / 月度 202608'
+    },
+    // ISO 8601 周数(与定时任务 / Java Calendar WEEK_OF_YEAR 基本对齐)
+    weekNumber(dt) {
+      const d = new Date(Date.UTC(dt.getFullYear(), dt.getMonth(), dt.getDate()))
+      const dayNum = d.getUTCDay() || 7
+      d.setUTCDate(d.getUTCDate() + 4 - dayNum)
+      const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1))
+      const week = Math.ceil((((d - yearStart) / 86400000) + 1) / 7)
+      return { year: d.getUTCFullYear(), week }
+    },
+    autoPeriodCode() {
+      if (!this.periodRange || this.periodRange.length < 2 || !this.periodRange[0]) { return }
+      const type = Number(this.triggerForm.periodType)
+      const start = new Date(this.periodRange[0])
+      if (type === 1) {
+        const { year, week } = this.weekNumber(start)
+        this.triggerForm.periodCode = year + 'W' + week
+      } else if (type === 2) {
+        const month = start.getMonth() + 1
+        this.triggerForm.periodCode = start.getFullYear() + (month < 10 ? '0' : '') + month
+      }
+    },
     loadDistribution() {
-      if (!this.query.periodType && !this.query.periodCode) {
+      if (!this.query.periodType || !this.query.periodCode) {
         this.distributions = []
         return
       }
@@ -324,8 +355,14 @@ export default {
       post(this.$axios, '/assessResultManage/getAssessTrend', { storeIds: this.trendStoreIds, periodType: this.query.periodType || '' }).then(res => {
         const list = (res && res.list) || []
         this.trendRows = list.map(row => {
-          const arr = Array.isArray(row) ? row : Object.keys(row).map(k => row[k])
-          return { storeId: String(arr[0]), periodCode: String(arr[1] === null || arr[1] === undefined ? '' : arr[1]), totalScore: Number(arr[2] || 0) }
+          // 后端返回 Map:{ storeId, storeName, periodCode, totalScore, rankNo }
+          let it
+          if (Array.isArray(row)) {
+            it = { storeId: row[0], periodCode: row[2], totalScore: row[3] }
+          } else {
+            it = { storeId: row.storeId, periodCode: row.periodCode, totalScore: row.totalScore }
+          }
+          return { storeId: String(it.storeId), periodCode: String(it.periodCode == null ? '' : it.periodCode), totalScore: Number(it.totalScore || 0) }
         })
       })
     },
@@ -360,6 +397,11 @@ export default {
     },
     trigger() {
       if (!this.triggerForm.periodCode) return this.$message.warning('请输入周期编码')
+      const trigType = Number(this.triggerForm.periodType)
+      const trigCode = String(this.triggerForm.periodCode || '').trim()
+      if (!(trigType === 1 ? /^\d{4}W\d{1,2}$/i : /^\d{6}$/).test(trigCode)) {
+        return this.$message.warning(trigType === 1 ? '周期编码格式应为 2026W35(年W周数)' : '周期编码格式应为 202608(年+月)')
+      }
       if (!this.periodRange || !this.periodRange.length) return this.$message.warning('请选择周期范围')
       const form = Object.assign({}, this.triggerForm, { periodStartDate: this.periodRange[0], periodEndDate: this.periodRange[1] })
       this.triggering = true