From 4b8f0d1cb618b00303502681159b0ad6bc4404a6 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期二, 24 三月 2026 14:54:40 +0800
Subject: [PATCH] fix: 真机运行时,日期组件默认当前日期

---
 src/pages/consumablesLogistics/stockReport/index.vue |   48 ++++++++++++++++++------
 src/pages/inventoryManagement/stockReport/index.vue  |   48 ++++++++++++++++++------
 src/utils/ruoyi.js                                   |   22 ++++++++++
 3 files changed, 93 insertions(+), 25 deletions(-)

diff --git a/src/pages/consumablesLogistics/stockReport/index.vue b/src/pages/consumablesLogistics/stockReport/index.vue
index 8dc324f..175c151 100644
--- a/src/pages/consumablesLogistics/stockReport/index.vue
+++ b/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();
diff --git a/src/pages/inventoryManagement/stockReport/index.vue b/src/pages/inventoryManagement/stockReport/index.vue
index 51c6a2a..eba56c3 100644
--- a/src/pages/inventoryManagement/stockReport/index.vue
+++ b/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>
 
diff --git a/src/utils/ruoyi.js b/src/utils/ruoyi.js
index 624fe97..f659c1a 100644
--- a/src/utils/ruoyi.js
+++ b/src/utils/ruoyi.js
@@ -234,16 +234,36 @@
 	let date;
 	// 澶勭悊锛氬鏋滄槸鏃堕棿鎴筹紝鍏堣浆涓篋ate瀵硅薄
 	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');

--
Gitblit v1.9.3