zjk
2026-05-28 5f8b85d00ae8afeacea7528378aac4e5f3533a5b
fix: 修复日期查询范围,优化活动策略校验并重命名车辆类型字段

1. 修复免密策略列表和活动领取记录页面的结束时间查询范围,将结束时间设为23:59:59以覆盖整日查询
2. 在活动策略添加页面新增生效日期与失效日期的校验逻辑,添加日期禁用函数并监听策略列表变化以清除无效失效日期
3. 在车辆库存添加页面将vehicleType重命名为vehicleModelType以提升命名准确性
4个文件已修改
75 ■■■■■ 已修改文件
src/views/assetManagement/vehicleManagement/inventoryVehicle/add.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/transaction/passwordFreeStrategy/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/userContent/active/activityManagement/add.vue 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/userContent/active/activityManagement/components/ReceiveRecord.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/assetManagement/vehicleManagement/inventoryVehicle/add.vue
@@ -48,7 +48,7 @@
    remark: '', // 备注
    operationArea: null as string | null, // 运营区域
    vehicleAttribute: null as number | null, // 车辆属性
    vehicleType: null as number | null, // 车辆类型
    vehicleModelType: null as number | null, // 车辆类型
    ownerType: '1', // 所有人类型 1企业 2个人
    ownerName: '', // 车辆所有人
    driveMotorNo: '', // 驱动电机编号
@@ -94,10 +94,10 @@
  { label: '运营', value: 2 },
]
const isVehicleAttributeSelectOpen = ref(false)
const isVehicleTypeSelectOpen = ref(false)
const isVehicleModelTypeSelectOpen = ref(false)
const isInsuranceTypeSelectOpen = ref(false)
const vehicleTypeOptions = [
const vehicleModelTypeOptions = [
  { label: '小型纯电动客车', value: 1 },
  { label: '小型插电式混合动力客车', value: 2 },
  { label: '轻型纯电动厢式货车', value: 3 },
@@ -188,7 +188,7 @@
      remark: data.remarks || data.remark || '',
      operationArea: data.electronicId === null || data.electronicId === undefined || data.electronicId === '' ? null : String(data.electronicId),
      vehicleAttribute: toNumberOrNull(data.vehicleAttribute),
      vehicleType: toNumberOrNull(data.vehicleType),
      vehicleModelType: toNumberOrNull(data.vehicleModelType),
      ownerType: String(data.ownerType ?? '1'),
      ownerName: data.ownerName || data.vehicleOwner || '',
      driveMotorNo: data.driveMotorNo || data.driveMotorNumber || '',
@@ -539,7 +539,7 @@
      procurementSource: formModel.value.purchaseSource,
      remarks: formModel.value.remark,
      electronicId: formModel.value.operationArea,
      vehicleType: formModel.value.vehicleType || '',
      vehicleModelType: formModel.value.vehicleModelType || '',
      ownerType: formModel.value.ownerType,
      ownerName: formModel.value.ownerName,
      driveMotorNo: formModel.value.driveMotorNo,
@@ -918,20 +918,20 @@
        >
          <n-grid :cols="3" :x-gap="24" :y-gap="8">
            <n-gi>
              <n-form-item label="车辆类型" path="vehicleType">
              <n-form-item label="车辆类型" path="vehicleModelType">
                <n-select
                  v-model:value="formModel.vehicleType"
                  :options="vehicleTypeOptions"
                  v-model:value="formModel.vehicleModelType"
                  :options="vehicleModelTypeOptions"
                  placeholder="请选择"
                  clearable
                  @update:show="isVehicleTypeSelectOpen = $event"
                  @update:show="isVehicleModelTypeSelectOpen = $event"
                >
                  <template #arrow>
                    <img
                      src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/e120f81c-9f15-4e1a-9938-22252898edf9.png"
                      class="arrow-icon"
                      :class="{
                        'arrow-icon--open': isVehicleTypeSelectOpen,
                        'arrow-icon--open': isVehicleModelTypeSelectOpen,
                      }"
                      style="width: 16px; height: 16px"
                      alt="arrow"
src/views/transaction/passwordFreeStrategy/index.vue
@@ -80,7 +80,7 @@
        ? dayjs(model.value.createTimeRange[0]).format('YYYY-MM-DD HH:mm:ss')
        : undefined,
      createTimeEnd: model.value.createTimeRange?.[1]
        ? dayjs(model.value.createTimeRange[1]).format('YYYY-MM-DD HH:mm:ss')
        ? `${dayjs(model.value.createTimeRange[1]).format('YYYY-MM-DD')} 23:59:59`
        : undefined,
    }
    const res = await getPasswordFreePolicyList(params)
src/views/userContent/active/activityManagement/add.vue
@@ -1,6 +1,6 @@
<script setup lang="tsx">
import dayjs from 'dayjs'
import { computed, onMounted, ref } from 'vue'
import { computed, onMounted, ref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import {
  NButton,
@@ -246,6 +246,19 @@
function disablePastDate(timestamp: number) {
  const todayStart = dayjs().startOf('day').valueOf()
  return timestamp < todayStart
}
function disableExpireDate(timestamp: number, strategy: StrategyItem) {
  if (disablePastDate(timestamp))
    return true
  // 当指定了生效日期时,失效日期必须大于生效日期,同一天也不可选
  if (strategy.effectiveRules === 2 && strategy.effectiveDays) {
    const effectiveDate = dayjs(strategy.effectiveDays).startOf('day').valueOf()
    return timestamp <= effectiveDate
  }
  return false
}
function syncUserGroupStrategy(groupIndex: number, strategyId: number | null) {
@@ -1173,6 +1186,17 @@
      message.warning(`请为策略${index + 1}选择失效日期`)
      return false
    }
    if (
      strategy.effectiveRules === 2
      && strategy.effectiveDays
      && strategy.expireRules === 3
      && strategy.expireDate
      && dayjs(strategy.expireDate).startOf('day').valueOf() <= dayjs(strategy.effectiveDays).startOf('day').valueOf()
    ) {
      activeTab.value = 2
      message.warning(`策略${index + 1}的失效日期必须大于生效日期`)
      return false
    }
    const invalidUsageTime = strategy.usagePeriod.find(item =>
      item.startTime
      && item.endTime
@@ -1288,6 +1312,29 @@
onMounted(() => {
  getDetail()
})
watch(
  () => strategyList.value.map(strategy => ({
    effectiveRules: strategy.effectiveRules,
    effectiveDays: strategy.effectiveDays,
    expireRules: strategy.expireRules,
    expireDate: strategy.expireDate,
  })),
  () => {
    strategyList.value.forEach((strategy) => {
      if (
        strategy.effectiveRules === 2
        && strategy.effectiveDays
        && strategy.expireRules === 3
        && strategy.expireDate
        && dayjs(strategy.expireDate).startOf('day').valueOf() <= dayjs(strategy.effectiveDays).startOf('day').valueOf()
      ) {
        strategy.expireDate = null
      }
    })
  },
  { deep: true },
)
</script>
<template>
@@ -1535,7 +1582,7 @@
                    <NDatePicker
                      v-model:value="strategy.expireDate" type="date" format="yyyy/MM/dd" clearable
                      :actions="null"
                      :is-date-disabled="disablePastDate"
                      :is-date-disabled="(timestamp: number) => disableExpireDate(timestamp, strategy)"
                      close-on-select
                      placeholder="请选择日期"
                      style="width: 240px;"
src/views/userContent/active/activityManagement/components/ReceiveRecord.vue
@@ -97,7 +97,7 @@
      pageNum: currentPage.value,
      pageSize: pageSize.value,
      startTime: searchModel.value.time?.[0] ? dayjs(searchModel.value.time?.[0]).format('YYYY-MM-DD HH:mm:ss') : null,
      endTime: searchModel.value.time?.[1] ? dayjs(searchModel.value.time?.[1]).format('YYYY-MM-DD HH:mm:ss') : null,
      endTime: searchModel.value.time?.[1] ? `${dayjs(searchModel.value.time?.[1]).format('YYYY-MM-DD')} 23:59:59` : null,
      name: searchModel.value.receiver,
      phone: searchModel.value.phone,
      status: searchModel.value.status,