|
@@ -5,7 +5,7 @@
|
|
|
<el-option label="周度" :value="1" />
|
|
<el-option label="周度" :value="1" />
|
|
|
<el-option label="月度" :value="2" />
|
|
<el-option label="月度" :value="2" />
|
|
|
</el-select>
|
|
</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-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-option v-for="b in belongtoOptions" :key="b.value" :label="b.label" :value="b.value" />
|
|
|
</el-select>
|
|
</el-select>
|
|
@@ -148,7 +148,8 @@
|
|
|
</el-radio-group>
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item label="周期编码" required>
|
|
<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>
|
|
|
<el-form-item label="周期范围" required>
|
|
<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%;" />
|
|
<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
|
|
padL: 40, padR: 16, padT: 12, padB: 26, chartW: 560, chartH: 200
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
|
|
+ watch: {
|
|
|
|
|
+ 'triggerForm.periodType'() { this.autoPeriodCode() },
|
|
|
|
|
+ periodRange() { this.autoPeriodCode() }
|
|
|
|
|
+ },
|
|
|
computed: {
|
|
computed: {
|
|
|
belongtoOptions() {
|
|
belongtoOptions() {
|
|
|
const map = {}
|
|
const map = {}
|
|
@@ -306,8 +311,34 @@ export default {
|
|
|
this.loadDistribution()
|
|
this.loadDistribution()
|
|
|
this.loadTrend()
|
|
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() {
|
|
loadDistribution() {
|
|
|
- if (!this.query.periodType && !this.query.periodCode) {
|
|
|
|
|
|
|
+ if (!this.query.periodType || !this.query.periodCode) {
|
|
|
this.distributions = []
|
|
this.distributions = []
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
@@ -324,8 +355,14 @@ export default {
|
|
|
post(this.$axios, '/assessResultManage/getAssessTrend', { storeIds: this.trendStoreIds, periodType: this.query.periodType || '' }).then(res => {
|
|
post(this.$axios, '/assessResultManage/getAssessTrend', { storeIds: this.trendStoreIds, periodType: this.query.periodType || '' }).then(res => {
|
|
|
const list = (res && res.list) || []
|
|
const list = (res && res.list) || []
|
|
|
this.trendRows = list.map(row => {
|
|
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() {
|
|
trigger() {
|
|
|
if (!this.triggerForm.periodCode) return this.$message.warning('请输入周期编码')
|
|
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('请选择周期范围')
|
|
if (!this.periodRange || !this.periodRange.length) return this.$message.warning('请选择周期范围')
|
|
|
const form = Object.assign({}, this.triggerForm, { periodStartDate: this.periodRange[0], periodEndDate: this.periodRange[1] })
|
|
const form = Object.assign({}, this.triggerForm, { periodStartDate: this.periodRange[0], periodEndDate: this.periodRange[1] })
|
|
|
this.triggering = true
|
|
this.triggering = true
|