spring
12 小时以前 4b8f0d1cb618b00303502681159b0ad6bc4404a6
fix: 真机运行时,日期组件默认当前日期
已修改3个文件
118 ■■■■ 文件已修改
src/pages/consumablesLogistics/stockReport/index.vue 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/inventoryManagement/stockReport/index.vue 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/ruoyi.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/consumablesLogistics/stockReport/index.vue
@@ -74,15 +74,13 @@
      </view>
      <view v-else class="no-data">暂无数据</view>
    </view>
    <up-popup :show="showDatePicker" mode="bottom" @close="showDatePicker = false">
      <up-datetime-picker
        v-model="dateValue"
        :mode="datePickerMode"
        :show="showDatePicker"
        @confirm="onDateConfirm"
        @cancel="showDatePicker = false"
      />
    </up-popup>
    <up-datetime-picker
      v-model="dateValue"
      :mode="datePickerMode"
      :show="showDatePicker"
      @confirm="onDateConfirm"
      @cancel="showDatePicker = false"
    />
  </view>
</template>
@@ -90,7 +88,6 @@
import { ref, reactive, toRefs, computed, watch } from "vue";
import dayjs from "dayjs";
import PageHeader from "@/components/PageHeader.vue";
import { formatDateToYMD } from "@/utils/ruoyi";
import { onShow, onReachBottom } from "@dcloudio/uni-app";
import { getConsumablesInReportList, getConsumablesInInAndOutReportList } from "@/api/consumablesLogistics/consumablesIn.js";
import {
@@ -207,6 +204,23 @@
  getList();
};
const toPickerTimestamp = (val, target) => {
  if (!val) return Date.now();
  let parsed;
  if (target === "startMonth" || target === "endMonth") {
    parsed = dayjs(`${val}-01`).valueOf();
  } else {
    parsed = dayjs(val).valueOf();
  }
  return Number.isNaN(parsed) ? Date.now() : parsed;
};
const formatPickerDate = (value, isMonth) => {
  const parsed = dayjs(value);
  if (!parsed.isValid()) return "";
  return parsed.format(isMonth ? "YYYY-MM" : "YYYY-MM-DD");
};
const openDatePicker = (target) => {
  datePickerTarget.value = target;
  let val = "";
@@ -215,13 +229,18 @@
  else if (target === "endMonth") val = searchForm.value.endMonth;
  else if (target === "startDate") val = searchForm.value.startDate;
  else if (target === "endDate") val = searchForm.value.endDate;
  dateValue.value = val ? new Date(val).getTime() : Date.now();
  dateValue.value = toPickerTimestamp(val, target);
  showDatePicker.value = true;
};
const onDateConfirm = (e) => {
  const isMonth = datePickerTarget.value === "startMonth" || datePickerTarget.value === "endMonth";
  const str = isMonth ? dayjs(e.value).format("YYYY-MM") : formatDateToYMD(e.value);
  const str = formatPickerDate(e.value, isMonth);
  if (!str) {
    showDatePicker.value = false;
    uni.showToast({ title: "日期格式无效", icon: "none" });
    return;
  }
  if (datePickerTarget.value === "single") {
    searchForm.value.singleDate = str;
    showDatePicker.value = false;
@@ -262,6 +281,9 @@
    searchForm.value.endDate = today.format("YYYY-MM-DD");
    searchForm.value.startDate = today.subtract(6, "day").format("YYYY-MM-DD");
  }
  if (!datePickerTarget.value) {
    dateValue.value = toPickerTimestamp(searchForm.value.singleDate, "single");
  }
};
watch(
@@ -277,6 +299,8 @@
  fetchStockRecordTypeOptions();
});
initDefaultDates();
onReachBottom(() => loadMore());
const goBack = () => uni.navigateBack();
src/pages/inventoryManagement/stockReport/index.vue
@@ -80,15 +80,13 @@
      <view v-else class="no-data">暂无数据</view>
    </view>
    <up-popup :show="showDatePicker" mode="bottom" @close="showDatePicker = false">
      <up-datetime-picker
        v-model="dateValue"
        :mode="datePickerMode"
        :show="showDatePicker"
        @confirm="onDateConfirm"
        @cancel="showDatePicker = false"
      />
    </up-popup>
    <up-datetime-picker
      v-model="dateValue"
      :mode="datePickerMode"
      :show="showDatePicker"
      @confirm="onDateConfirm"
      @cancel="showDatePicker = false"
    />
  </view>
</template>
@@ -96,7 +94,6 @@
import { ref, reactive, toRefs, computed, watch } from 'vue'
import dayjs from 'dayjs'
import PageHeader from '@/components/PageHeader.vue'
import { formatDateToYMD } from '@/utils/ruoyi'
import { onShow } from '@dcloudio/uni-app'
import {
  getStockInventoryReportList,
@@ -216,6 +213,23 @@
  getList()
}
const toPickerTimestamp = (val, target) => {
  if (!val) return Date.now()
  let parsed
  if (target === 'startMonth' || target === 'endMonth') {
    parsed = dayjs(`${val}-01`).valueOf()
  } else {
    parsed = dayjs(val).valueOf()
  }
  return Number.isNaN(parsed) ? Date.now() : parsed
}
const formatPickerDate = (value, isMonth) => {
  const parsed = dayjs(value)
  if (!parsed.isValid()) return ''
  return parsed.format(isMonth ? 'YYYY-MM' : 'YYYY-MM-DD')
}
const openDatePicker = (target) => {
  let val = ''
  datePickerTarget.value = target
@@ -236,13 +250,18 @@
      val = searchForm.value.endDate
      break
  }
  dateValue.value = val ? new Date(val).getTime() : Date.now()
  dateValue.value = toPickerTimestamp(val, target)
  showDatePicker.value = true
}
const onDateConfirm = (e) => {
  const isMonth = datePickerTarget.value === 'startMonth' || datePickerTarget.value === 'endMonth'
  const str = isMonth ? dayjs(e.value).format('YYYY-MM') : formatDateToYMD(e.value)
  const str = formatPickerDate(e.value, isMonth)
  if (!str) {
    showDatePicker.value = false
    uni.showToast({ title: '日期格式无效', icon: 'none' })
    return
  }
  
  if (datePickerTarget.value === 'single') {
    searchForm.value.singleDate = str
@@ -286,6 +305,9 @@
    searchForm.value.endDate = today.format('YYYY-MM-DD')
    searchForm.value.startDate = today.subtract(6, 'day').format('YYYY-MM-DD')
  }
  if (!datePickerTarget.value) {
    dateValue.value = toPickerTimestamp(searchForm.value.singleDate, 'single')
  }
}
watch(
@@ -302,6 +324,8 @@
  fetchStockRecordTypeOptions()
})
initDefaultDates()
const goBack = () => uni.navigateBack()
</script>
src/utils/ruoyi.js
@@ -234,16 +234,36 @@
    let date;
    // 处理:如果是时间戳,先转为Date对象
    if (typeof dateSource === 'number') {
        date = new Date(dateSource);
        const timestamp = dateSource.toString().length === 10 ? dateSource * 1000 : dateSource;
        date = new Date(timestamp);
    }
    // 处理:如果是Date对象,直接使用
    else if (dateSource instanceof Date) {
        date = dateSource;
    }
    // 处理:如果是字符串,做兼容转换
    else if (typeof dateSource === 'string') {
        const raw = dateSource.trim();
        if (!raw) return '';
        if (/^[0-9]+$/.test(raw)) {
            const n = parseInt(raw, 10);
            const timestamp = raw.length === 10 ? n * 1000 : n;
            date = new Date(timestamp);
        } else {
            // iOS / 部分 WebView 对 YYYY-MM-DD 兼容较差,统一转 /
            const normalized = raw
                .replace(new RegExp(/-/gm), '/')
                .replace('T', ' ')
                .replace(new RegExp(/\.[\d]{3}/gm), '');
            date = new Date(normalized);
        }
    }
    // 异常情况:返回空
    else {
        return '';
    }
    if (!(date instanceof Date) || Number.isNaN(date.getTime())) return '';
    
    // 补零函数:确保月/日是两位数
    const padZero = (num) => num.toString().padStart(2, '0');