소스 검색

对接居家工单接口

unknown 1 주 전
부모
커밋
516ef47648

+ 5 - 5
src/api/living-home/elderly/index.ts

@@ -509,7 +509,7 @@ export interface AppointmentVO {
 // 查询预约服务工单列表(分页)
 export const getAppointmentPage = (params: any) => {
   return request.get({
-    url: '/home/appointment/page',
+    url: '/home/service-order/page',
     params
   })
 }
@@ -517,14 +517,14 @@ export const getAppointmentPage = (params: any) => {
 // 查询预约服务工单详情
 export const getAppointment = (id: number) => {
   return request.get({
-    url: `/home/appointment/get?id=${id}`
+    url: `/home/service-order/get?id=${id}`
   })
 }
 
 // 新增预约服务工单
 export const createAppointment = (data: any) => {
   return request.post({
-    url: '/home/appointment/create',
+    url: '/home/service-order/create',
     data
   })
 }
@@ -532,7 +532,7 @@ export const createAppointment = (data: any) => {
 // 修改预约服务工单
 export const updateAppointment = (data: any) => {
   return request.put({
-    url: '/home/appointment/update',
+    url: '/home/service-order/update',
     data
   })
 }
@@ -540,7 +540,7 @@ export const updateAppointment = (data: any) => {
 // 删除预约服务工单
 export const deleteAppointment = (id: number) => {
   return request.delete({
-    url: `/home/appointment/delete?id=${id}`
+    url: `/home/service-order/delete?id=${id}`
   })
 }
 

+ 164 - 134
src/views/living-home/visiting-service/appointment-list/AddForm.vue

@@ -9,9 +9,9 @@
       <!-- 长者信息选择 -->
       <div class="section-title">长者信息</div>
       
-      <el-form-item label="长者姓名" prop="elderId">
+      <el-form-item label="长者姓名" prop="homeElderId">
         <el-select
-          v-model="formData.elderId"
+          v-model="formData.homeElderId"
           placeholder="请输入长者姓名搜索"
           class="w-full"
           filterable
@@ -126,19 +126,19 @@
           class="w-full"
           :disabled="isDetailMode"
         >
-          <el-option label="报警" value="报警" />
-          <el-option label="电话咨询" value="电话咨询" />
-          <el-option label="自主下单" value="自主下单" />
-          <el-option label="上门关怀" value="上门关怀" />
-          <el-option label="工单详情下单" value="工单详情下单" />
-          <el-option label="长者小程序下单" value="长者小程序下单" />
-          <el-option label="守护中心下单" value="守护中心下单" />
+          <el-option label="报警" :value="0" />
+          <el-option label="电话咨询" :value="1" />
+          <el-option label="自主下单" :value="2" />
+          <el-option label="上门关怀" :value="3" />
+          <el-option label="工单详情下单" :value="4" />
+          <el-option label="长者小程序下单" :value="5" />
+          <el-option label="守护中心下单" :value="6" />
         </el-select>
       </el-form-item>
 
-      <el-form-item label="服务人员" prop="servicePersonId">
+      <el-form-item label="服务人员" prop="serviceMemberId">
         <el-select
-          v-model="formData.servicePersonId"
+          v-model="formData.serviceMemberId"
           placeholder="请选择服务人员"
           clearable
           class="w-full"
@@ -167,9 +167,9 @@
 
       <el-row :gutter="20">
         <el-col :span="12">
-          <el-form-item label="上门开始时间" prop="visitStartTime">
+          <el-form-item label="上门开始时间" prop="serviceStartTime">
             <el-date-picker
-              v-model="formData.visitStartTime"
+              v-model="formData.serviceStartTime"
               type="datetime"
               placeholder="选择上门开始时间"
               class="w-full"
@@ -180,9 +180,9 @@
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="上门结束时间" prop="visitEndTime">
+          <el-form-item label="上门结束时间" prop="serviceEndTime">
             <el-date-picker
-              v-model="formData.visitEndTime"
+              v-model="formData.serviceEndTime"
               type="datetime"
               placeholder="选择上门结束时间"
               class="w-full"
@@ -279,67 +279,11 @@
         />
       </el-form-item>
 
-      <!-- 详情模式下显示额外信息 -->
-      <template v-if="isDetailMode && detailData">
-        <div class="section-title">其他信息</div>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="下单时间">
-              <el-input v-model="detailData.orderTime" disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="是否过期">
-              <el-input :value="detailData.isExpired === '是' ? '是' : '否'" disabled />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="工单状态">
-              <el-input v-model="detailData.status" disabled />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </template>
+
+
     </el-form>
 
-    <!-- 后端提交参数说明 -->
-    <el-divider content-position="left">后端接口参数说明</el-divider>
-    <el-descriptions :column="2" border size="small" class="field-description">
-      <el-descriptions-item label="elderId" :span="1">长者ID(number,必填)</el-descriptions-item>
-      <el-descriptions-item label="elderName" :span="1">长者姓名(string,必填)</el-descriptions-item>
-      
-      <el-descriptions-item label="gender" :span="1">性别(string,男/女)</el-descriptions-item>
-      <el-descriptions-item label="age" :span="1">年龄(number)</el-descriptions-item>
-      
-      <el-descriptions-item label="phone" :span="1">手机号码(string)</el-descriptions-item>
-      <el-descriptions-item label="address" :span="1">居住地址(string)</el-descriptions-item>
-      
-      <el-descriptions-item label="orderType" :span="1">下单方式(string,必填)</el-descriptions-item>
-      <el-descriptions-item label="servicePersonId" :span="1">服务人员ID(number,必填)</el-descriptions-item>
-      
-      <el-descriptions-item label="servicePersonName" :span="1">服务人员姓名(string,必填)</el-descriptions-item>
-      <el-descriptions-item label="orderTime" :span="1">下单时间(string,YYYY-MM-DD HH:mm:ss)</el-descriptions-item>
-      
-      <el-descriptions-item label="visitStartTime" :span="1">上门开始时间(string,YYYY-MM-DD HH:mm:ss)</el-descriptions-item>
-      <el-descriptions-item label="visitEndTime" :span="1">上门结束时间(string,YYYY-MM-DD HH:mm:ss)</el-descriptions-item>
-      
-      <el-descriptions-item label="serviceDuration" :span="1">服务时长(number,分钟)</el-descriptions-item>
-      <el-descriptions-item label="projectAmount" :span="1">项目金额(number,元)</el-descriptions-item>
-      
-      <el-descriptions-item label="subsidyAmount" :span="1">补贴金额(number,元,默认等于项目金额)</el-descriptions-item>
-      <el-descriptions-item label="selfPayAmount" :span="1">自费金额(number,元,默认为0)</el-descriptions-item>
-      
-      <el-descriptions-item label="serviceItems" :span="2">
-        <div>服务项目列表(array,必填)</div>
-        <div style="margin-top: 5px; color: #606266; font-size: 12px;">
-          每项包含:id(项目ID)、itemName(项目名称)、amount(金额)
-        </div>
-      </el-descriptions-item>
-      
-      <el-descriptions-item label="remark" :span="2">工单备注(string)</el-descriptions-item>
-    </el-descriptions>
+
 
     <template #footer>
       <el-button @click="dialogVisible = false">{{ isDetailMode ? '关闭' : '取消' }}</el-button>
@@ -350,6 +294,7 @@
 
 <script setup lang="ts">
 import * as ElderApi from '@/api/living-home/elderly'
+import {getElderDetail} from "@/api/living-home/elderly";
 
 const emit = defineEmits(['success'])
 
@@ -370,36 +315,36 @@ const selectedElder = ref<any>(null)
 
 const formData = reactive({
   id: undefined as number | undefined,
-  elderId: undefined as number | undefined,
+  homeElderId: undefined as number | undefined,
   elderName: '',
   gender: '',
   age: undefined as number | undefined,
   phone: '',
   address: '',
-  orderType: '电话咨询', // 默认使用电话咨询
-  servicePersonId: undefined as number | undefined,
+  orderType: 1, // 默认0
+  serviceMemberId: undefined as number | undefined,
   servicePersonName: '',
-  serviceItemIds: [] as number[], // 服务项目ID
+  serviceItemIds: [] as number[], // 服务项目ID列表
   orderTime: '', // 下单时间
-  visitStartTime: '', // 上门开始时间
-  visitEndTime: '', // 上门结束时间
+  serviceStartTime: '', // 上门开始时间
+  serviceEndTime: '', // 上门结束时间
   serviceDuration: undefined as number | undefined, // 服务时长(分钟)
-  serviceItems: [] as number[], // 服务项目ID列表
   projectAmount: 0, // 项目金额,默认为0
   subsidyAmount: 0, // 补贴金额,默认为0
   selfPayAmount: 0, // 自费金额,默认为0
   subsidyArrivalDate: '', // 补贴到账日期
-  remark: ''
+  remark: '',
+  type: 0 // 默认0
 })
 
 const formRules = {
-  elderId: [{ required: true, message: '请选择长者', trigger: 'change' }],
+  homeElderId: [{ required: true, message: '请选择长者', trigger: 'change' }],
   serviceItems: [{ required: true, message: '请选择服务项目', trigger: 'change', type: 'array' }],
   orderType: [{ required: true, message: '请选择下单方式', trigger: 'change' }],
-  servicePersonId: [{ required: true, message: '请选择服务人员', trigger: 'change' }],
+  serviceMemberId: [{ required: true, message: '请选择服务人员', trigger: 'change' }],
   orderTime: [{ required: true, message: '请选择下单时间', trigger: 'change' }],
-  visitStartTime: [{ required: true, message: '请选择上门开始时间', trigger: 'change' }],
-  visitEndTime: [{ required: true, message: '请选择上门结束时间', trigger: 'change' }],
+  serviceStartTime: [{ required: true, message: '请选择上门开始时间', trigger: 'change' }],
+  serviceEndTime: [{ required: true, message: '请选择上门结束时间', trigger: 'change' }],
   serviceDuration: [{ required: true, message: '请输入服务时长', trigger: 'change' }],
   projectAmount: [{ required: true, message: '请输入项目金额', trigger: 'change' }]
 }
@@ -498,15 +443,15 @@ const calculateEndTime = (startTime: string, durationMinutes: number): string =>
 
 // 上门开始时间变化
 const handleVisitStartTimeChange = () => {
-  if (formData.visitStartTime && formData.serviceDuration) {
-    formData.visitEndTime = calculateEndTime(formData.visitStartTime, formData.serviceDuration)
+  if (formData.serviceStartTime && formData.serviceDuration) {
+    formData.serviceEndTime = calculateEndTime(formData.serviceStartTime, formData.serviceDuration)
   }
 }
 
 // 上门结束时间变化
 const handleVisitEndTimeChange = () => {
-  if (formData.visitStartTime && formData.visitEndTime) {
-    const duration = calculateDuration(formData.visitStartTime, formData.visitEndTime)
+  if (formData.serviceStartTime && formData.serviceEndTime) {
+    const duration = calculateDuration(formData.serviceStartTime, formData.serviceEndTime)
     if (duration > 0) {
       formData.serviceDuration = duration
     }
@@ -515,8 +460,8 @@ const handleVisitEndTimeChange = () => {
 
 // 服务时长变化
 const handleDurationChange = () => {
-  if (formData.visitStartTime && formData.serviceDuration) {
-    formData.visitEndTime = calculateEndTime(formData.visitStartTime, formData.serviceDuration)
+  if (formData.serviceStartTime && formData.serviceDuration) {
+    formData.serviceEndTime = calculateEndTime(formData.serviceStartTime, formData.serviceDuration)
   }
 }
 
@@ -601,65 +546,139 @@ const toggleServiceItem = (item: any) => {
 // 打开弹窗
 const open = async (row?: any, mode: 'create' | 'edit' | 'detail' = 'create') => {
   dialogMode.value = mode
-  dialogVisible.value = true
-  resetForm()
+  
+  // 新增模式先重置表单,避免显示上一次的值
+  if (!row || mode === 'create') {
+    resetForm()
+  }
   
   // 加载服务人员列表和服务项目列表
   await getServicePersonList()
   await getServiceItemList()
+  
+  // 新增模式下,确保服务项目选中状态被清空(因为getServiceItemList可能会触发响应式更新)
+  if (!row || mode === 'create') {
+    selectedServiceItems.value = []
+    formData.serviceItemIds = []
+  }
 
-  if (row && (mode === 'edit' || mode === 'detail')) {
-    // 回填数据
-    await fillFormData(row)
-    detailData.value = row
+  if (row && (mode === 'edit' || mode === 'detail') && row.id) {
+    // 调用接口获取最新详情数据
+    try {
+      const res = await ElderApi.getAppointment(row.id)
+      if (res) {
+        await fillFormData(res)
+        detailData.value = res
+      }
+    } catch (error) {
+      console.log('获取详情失败', error)
+      // 接口失败时使用传入的row数据
+      await fillFormData(row)
+      detailData.value = row
+    }
   }
+  
+  // 最后才显示弹窗
+  dialogVisible.value = true
+}
+
+// 13位时间戳转日期时间字符串
+const timestampToDateStr = (timestamp: number | string | undefined): string => {
+  if (!timestamp) return ''
+  const ts = typeof timestamp === 'string' ? parseInt(timestamp) : timestamp
+  if (isNaN(ts)) return ''
+  const date = new Date(ts)
+  if (isNaN(date.getTime())) return ''
+  const year = date.getFullYear()
+  const month = String(date.getMonth() + 1).padStart(2, '0')
+  const day = String(date.getDate()).padStart(2, '0')
+  const hours = String(date.getHours()).padStart(2, '0')
+  const minutes = String(date.getMinutes()).padStart(2, '0')
+  const seconds = String(date.getSeconds()).padStart(2, '0')
+  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
 }
 
 // 回填表单数据
 const fillFormData = async (row: any) => {
   formData.id = row.id
-  formData.elderId = row.elderId
-  formData.elderName = row.elderName
-  formData.gender = row.gender
-  formData.age = row.age
-  formData.phone = row.phone
-  formData.address = row.address
-  formData.orderType = row.orderType
-  formData.servicePersonId = row.servicePersonId
+  formData.orderType = row.orderType ?? 1
+  formData.serviceMemberId = row.serviceMemberId ?? row.servicePersonId
   formData.servicePersonName = row.servicePersonName
-  formData.orderTime = row.orderTime
-  formData.visitStartTime = row.visitStartTime || row.visitTime
-  formData.visitEndTime = row.visitEndTime
+  // 时间戳转日期字符串
+  formData.orderTime = timestampToDateStr(row.orderTime) || row.orderTime
+  formData.serviceStartTime = timestampToDateStr(row.serviceStartTime) || row.visitStartTime || row.visitTime
+  formData.serviceEndTime = timestampToDateStr(row.serviceEndTime) || row.visitEndTime
   formData.serviceDuration = row.serviceDuration
   formData.projectAmount = row.projectAmount || 0
   formData.subsidyAmount = row.subsidyAmount || row.projectAmount || 0
   formData.selfPayAmount = row.selfPayAmount || 0
   formData.subsidyArrivalDate = row.subsidyArrivalDate || ''
   formData.remark = row.remark || ''
+  formData.type = row.type ?? 0
 
   // 回填服务项目
-  if (row.serviceItems && row.serviceItems.length > 0) {
+  if (row.serviceItemIds && row.serviceItemIds.length > 0) {
+    formData.serviceItemIds = row.serviceItemIds
+    formData.serviceItems = row.serviceItemIds // 同时设置serviceItems用于表单验证
+    // 从列表中找到对应的服务项目
+    selectedServiceItems.value = serviceItemList.value.filter(item => row.serviceItemIds.includes(item.id))
+  } else if (row.serviceItems && row.serviceItems.length > 0) {
     const itemIds = row.serviceItems.map((item: any) => typeof item === 'object' ? item.id : item)
-    formData.serviceItems = itemIds
     formData.serviceItemIds = itemIds
+    formData.serviceItems = itemIds // 同时设置serviceItems用于表单验证
     // 从列表中找到对应的服务项目
     selectedServiceItems.value = serviceItemList.value.filter(item => itemIds.includes(item.id))
   } else {
-    formData.serviceItems = []
     formData.serviceItemIds = []
+    formData.serviceItems = []
     selectedServiceItems.value = []
   }
 
-  // 设置选中的长者信息
-  selectedElder.value = {
-    id: row.elderId,
-    elderName: row.elderName,
-    sex: row.gender === '男' ? '1' : '2',
-    age: row.age,
-    phone: row.phone,
-    currentLiveAddress: row.address
+  // 根据长者ID查询长者详细信息
+  const elderId = row.homeElderId || row.elderId
+  if (elderId) {
+    try {
+      const elderRes = await getElderDetail(elderId)
+      if (elderRes) {
+        formData.homeElderId = elderRes.id
+        formData.elderName = elderRes.elderName
+        formData.gender = elderRes.sex === '1' ? '男' : '女'
+        formData.age = elderRes.age
+        formData.phone = elderRes.phone
+        formData.address = elderRes.currentLiveAddress
+
+        // 设置选中的长者信息
+        selectedElder.value = {
+          id: elderRes.id,
+          elderName: elderRes.elderName,
+          sex: elderRes.sex,
+          age: elderRes.age,
+          phone: elderRes.phone,
+          currentLiveAddress: elderRes.currentLiveAddress
+        }
+        elderSearchOptions.value = [selectedElder.value]
+      }
+    } catch (error) {
+      console.log('获取长者详情失败', error)
+      // 使用后端返回的数据作为回退
+      formData.homeElderId = row.homeElderId || row.elderId
+      formData.elderName = row.homeElderName || row.elderName || ''
+      formData.gender = row.gender || ''
+      formData.age = row.age
+      formData.phone = row.phone || ''
+      formData.address = row.address || ''
+
+      selectedElder.value = {
+        id: row.homeElderId || row.elderId,
+        elderName: row.homeElderName || row.elderName || '',
+        sex: row.gender === '男' ? '1' : '2',
+        age: row.age,
+        phone: row.phone || '',
+        currentLiveAddress: row.address || ''
+      }
+      elderSearchOptions.value = selectedElder.value ? [selectedElder.value] : []
+    }
   }
-  elderSearchOptions.value = [selectedElder.value]
 }
 
 // 获取当前时间格式化
@@ -677,26 +696,26 @@ const getCurrentDateTime = (): string => {
 // 重置表单
 const resetForm = () => {
   formData.id = undefined
-  formData.elderId = undefined
+  formData.homeElderId = undefined
   formData.elderName = ''
   formData.gender = ''
   formData.age = undefined
   formData.phone = ''
   formData.address = ''
-  formData.orderType = '电话咨询'
-  formData.servicePersonId = undefined
+  formData.orderType = 1
+  formData.serviceMemberId = undefined
   formData.servicePersonName = ''
   formData.orderTime = getCurrentDateTime() // 默认当前时间
-  formData.visitStartTime = ''
-  formData.visitEndTime = ''
+  formData.serviceStartTime = ''
+  formData.serviceEndTime = ''
   formData.serviceDuration = undefined
-  formData.serviceItems = []
   formData.serviceItemIds = []
   selectedServiceItems.value = []
   serviceItemSearchKeyword.value = ''
   formData.projectAmount = 0
   formData.subsidyAmount = 0
   formData.selfPayAmount = 0
+  formData.type = 0
   formData.remark = ''
   
   selectedElder.value = null
@@ -707,6 +726,14 @@ const resetForm = () => {
   })
 }
 
+// 日期时间转13位时间戳
+const dateToTimestamp = (dateStr: string): number | undefined => {
+  if (!dateStr) return undefined
+  const date = new Date(dateStr)
+  if (isNaN(date.getTime())) return undefined
+  return date.getTime()
+}
+
 // 提交表单
 const handleSubmit = async () => {
   const valid = await formRef.value?.validate().catch(() => false)
@@ -715,17 +742,20 @@ const handleSubmit = async () => {
   submitLoading.value = true
   try {
     // 获取选中的服务人员名称
-    const servicePerson = servicePersonList.value.find(item => item.id === formData.servicePersonId)
+    const servicePerson = servicePersonList.value.find(item => item.id === formData.serviceMemberId)
     const servicePersonName = servicePerson?.name || ''
 
     const data = {
       ...formData,
       servicePersonName,
-      serviceItems: selectedServiceItems.value.map(item => ({
-        id: item.id,
-        itemName: item.itemName,
-        amount: item.amount
-      }))
+      serviceItemIds: selectedServiceItems.value.map(item => item.id),
+      // 时间字段转换为13位时间戳
+      orderTime: dateToTimestamp(formData.orderTime),
+      serviceStartTime: dateToTimestamp(formData.serviceStartTime),
+      serviceEndTime: dateToTimestamp(formData.serviceEndTime),
+      // 后端需要的字段名
+      homeElderId: formData.elderId,
+      homeElderName: formData.elderName
     }
 
     if (dialogMode.value === 'edit' && formData.id) {
@@ -893,4 +923,4 @@ defineExpose({ open })
     }
   }
 }
-</style>
+</style>

+ 94 - 84
src/views/living-home/visiting-service/appointment-list/index.vue

@@ -17,38 +17,38 @@
           class="!w-180px"
         />
       </el-form-item>
-      <el-form-item label="服务人员姓名:" prop="servicePersonName">
+      <el-form-item label="服务人员姓名:" prop="serviceMemberName">
         <el-input
-          v-model="queryParams.servicePersonName"
+          v-model="queryParams.serviceMemberName"
           placeholder="请输入"
           clearable
           @keyup.enter="handleQuery"
           class="!w-180px"
         />
       </el-form-item>
-      <el-form-item label="联系电话:" prop="phone">
-        <el-input
-          v-model="queryParams.phone"
-          placeholder="请输入"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-180px"
-        />
-      </el-form-item>
-      <el-form-item label="工单状态:" prop="status">
-        <el-select
-          v-model="queryParams.status"
-          placeholder="全部"
-          clearable
-          class="!w-180px"
-        >
-          <el-option label="全部" value="" />
-          <el-option label="待派单" value="待派单" />
-          <el-option label="待接单" value="待接单" />
-          <el-option label="已接单" value="已接单" />
-          <el-option label="已签到" value="已签到" />
-        </el-select>
-      </el-form-item>
+<!--      <el-form-item label="联系电话:" prop="phone">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.phone"-->
+<!--          placeholder="请输入"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-180px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="工单状态:" prop="status">-->
+<!--        <el-select-->
+<!--          v-model="queryParams.status"-->
+<!--          placeholder="全部"-->
+<!--          clearable-->
+<!--          class="!w-180px"-->
+<!--        >-->
+<!--          <el-option label="全部" value="" />-->
+<!--          <el-option label="待派单" value="待派单" />-->
+<!--          <el-option label="待接单" value="待接单" />-->
+<!--          <el-option label="已接单" value="已接单" />-->
+<!--          <el-option label="已签到" value="已签到" />-->
+<!--        </el-select>-->
+<!--      </el-form-item>-->
       <el-form-item label="下单方式:" prop="orderType">
         <el-select
           v-model="queryParams.orderType"
@@ -57,13 +57,13 @@
           class="!w-180px"
         >
           <el-option label="全部" value="" />
-          <el-option label="报警" value="报警" />
-          <el-option label="电话咨询" value="电话咨询" />
-          <el-option label="自主下单" value="自主下单" />
-          <el-option label="上门关怀" value="上门关怀" />
-          <el-option label="工单详情下单" value="工单详情下单" />
-          <el-option label="长者小程序下单" value="长者小程序下单" />
-          <el-option label="守护中心下单" value="守护中心下单" />
+          <el-option label="报警" :value="0" />
+          <el-option label="电话咨询" :value="1" />
+          <el-option label="自主下单" :value="2" />
+          <el-option label="上门关怀" :value="3" />
+          <el-option label="工单详情下单" :value="4" />
+          <el-option label="长者小程序下单" :value="5" />
+          <el-option label="守护中心下单" :value="6" />
         </el-select>
       </el-form-item>
       <el-form-item class="!ml-auto">
@@ -80,7 +80,6 @@
   <!-- 列表 -->
   <ContentWrap>
     <div class="flex items-center justify-between mb-15px">
-
       <div class="flex gap-10px">
         <el-button type="primary" @click="handleOrderByElder">
           <Icon icon="ep:user" class="mr-5px" /> 新增补贴登记
@@ -91,6 +90,9 @@
         <el-button type="warning" @click="handleOrderDownload">
           <Icon icon="ep:download" class="mr-5px" /> 导出
         </el-button>
+        <el-button type="warning" @click="handleOrderAffirm">
+          <Icon icon="ep:download" class="mr-5px" /> 批量确认
+        </el-button>
       </div>
     </div>
     <el-table
@@ -100,24 +102,25 @@
     >
       <el-table-column label="序号" type="index" width="80" align="center" />
       <!-- 长者信息 -->
-      <el-table-column prop="elderName" label="长者姓名" align="center" min-width="100" />
-      <el-table-column prop="gender" label="性别" align="center" width="80" />
+      <el-table-column prop="homeElderName" label="长者姓名" align="center" min-width="100" />
+      <el-table-column prop="sex" label="性别" align="center" width="80" />
       <el-table-column prop="age" label="年龄" align="center" width="80" />
       <el-table-column prop="phone" label="手机号码" align="center" min-width="120" />
       <el-table-column prop="address" label="居住地址" align="center" min-width="200" show-overflow-tooltip />
       <!-- 工单信息 -->
       <el-table-column prop="orderType" label="下单方式" align="center" min-width="120" />
-      <el-table-column prop="servicePersonName" label="服务人员" align="center" min-width="120" />
+      <el-table-column prop="serviceMemberName" label="服务人员" align="center" min-width="120" />
       <el-table-column prop="orderTime" label="下单时间" align="center" min-width="160" />
-      <el-table-column prop="visitStartTime" label="上门开始时间" align="center" min-width="160" />
-      <el-table-column prop="visitEndTime" label="上门结束时间" align="center" min-width="160" />
+      <el-table-column prop="serviceStartTime" label="上门开始时间" align="center" min-width="160" />
+      <el-table-column prop="serviceEndTime" label="上门结束时间" align="center" min-width="160" />
       <el-table-column prop="serviceDuration" label="服务时长(分钟)" align="center" width="120" />
       <!-- 服务项目 -->
       <el-table-column label="服务项目" align="center" min-width="200" show-overflow-tooltip>
         <template #default="scope">
-          {{ scope.row.serviceItems ? scope.row.serviceItems.map(item => item.itemName || item).join('、') : '-' }}
+          {{ scope.row.items}}
         </template>
       </el-table-column>
+
       <!-- 金额信息 -->
       <el-table-column prop="projectAmount" label="项目金额" align="center" width="100">
         <template #default="scope">
@@ -192,7 +195,7 @@
 
   <!-- 签到记录弹窗 -->
   <SignInRecordDialog ref="signInRecordRef" @success="getList" />
-
+  
   <!-- 一键签到弹窗 -->
   <QuickSignInDialog ref="quickSignInRef" @success="getList" />
 </template>
@@ -219,69 +222,76 @@ const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
   elderName: '',
-  servicePersonName: '',
+  serviceMemberName: '',
   phone: '',
   status: '',
+  type:0,
   orderType: ''
 })
 
+// 13位时间戳转日期时间字符串
+const timestampToDateStr = (timestamp: number | string | undefined): string => {
+  if (!timestamp) return ''
+  const ts = typeof timestamp === 'string' ? parseInt(timestamp) : timestamp
+  if (isNaN(ts)) return ''
+  const date = new Date(ts)
+  if (isNaN(date.getTime())) return ''
+  const year = date.getFullYear()
+  const month = String(date.getMonth() + 1).padStart(2, '0')
+  const day = String(date.getDate()).padStart(2, '0')
+  const hours = String(date.getHours()).padStart(2, '0')
+  const minutes = String(date.getMinutes()).padStart(2, '0')
+  const seconds = String(date.getSeconds()).padStart(2, '0')
+  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
+}
+
+// 下单方式数字转中文
+const orderTypeToText = (orderType: number | string | undefined): string => {
+  const map: Record<number, string> = {
+    0: '报警',
+    1: '电话咨询',
+    2: '自主下单',
+    3: '上门关怀',
+    4: '工单详情下单',
+    5: '长者小程序下单',
+    6: '守护中心下单'
+  }
+  if (orderType === undefined || orderType === null) return ''
+  const key = typeof orderType === 'string' ? parseInt(orderType) : orderType
+  return map[key] || String(orderType)
+}
+
 /** 查询列表 */
 const getList = async () => {
   loading.value = true
   try {
     const data = await AppointmentApi.getAppointmentPage(queryParams)
-    list.value = data.list || []
+    // 将时间戳转换为日期字符串,下单方式数字转中文
+    list.value = (data.list || []).map((item: any) => ({
+      ...item,
+      orderTime: timestampToDateStr(item.orderTime) || item.orderTime,
+      serviceStartTime: timestampToDateStr(item.serviceStartTime) || item.visitStartTime || item.visitTime,
+      serviceEndTime: timestampToDateStr(item.serviceEndTime) || item.visitEndTime,
+      orderType: orderTypeToText(item.orderType)
+    }))
     total.value = data.total || 0
   } catch (error) {
     console.log('获取预约列表失败', error)
     // 使用模拟数据
-    list.value = [
-      {
-        id: 1,
-        elderName: '张三',
-        gender: '女',
-        age: 43,
-        phone: '156****5555',
-        address: '河源市/源城区/城东街道aaa',
-        orderType: '坐席下单',
-        servicePersonName: '张磊',
-        orderTime: '2026-04-27 15:00:04',
-        visitTime: '2026-04-27 上午',
-        isExpired: '否'
-      },
-      {
-        id: 2,
-        elderName: '张三',
-        gender: '女',
-        age: 43,
-        phone: '156****5555',
-        address: '河源市/源城区/城东街道aaa',
-        orderType: '坐席下单',
-        servicePersonName: '张磊',
-        orderTime: '2026-04-27 15:00:04',
-        visitTime: '2026-04-28 上午',
-        isExpired: '否'
-      },
-      {
-        id: 3,
-        elderName: '张三',
-        gender: '女',
-        age: 43,
-        phone: '156****5555',
-        address: '河源市/源城区/城东街道aaa',
-        orderType: '坐席下单',
-        servicePersonName: '张磊',
-        orderTime: '2026-04-27 15:00:04',
-        visitTime: '2026-04-29 上午',
-        isExpired: '否'
-    }
-    ]
-    total.value = list.value.length
   } finally {
     loading.value = false
   }
 }
 
+const handleOrderAffirm = async () => {
+  try {
+    await message.confirmirm('确认批量选中工单吗?')
+    await AppointmentApi.affirmAppointment({ ids: selectedRows.value.map(row => row.id) })
+    message.success(t('common.confirmirmSuccess'))
+    getList()
+  } catch {}
+}
+
 /** 搜索按钮操作 */
 const handleQuery = () => {
   queryParams.pageNo = 1

+ 157 - 131
src/views/living-home/visiting-service/self-funded-registration/AddForm.vue

@@ -126,19 +126,19 @@
           class="w-full"
           :disabled="isDetailMode"
         >
-          <el-option label="报警" value="报警" />
-          <el-option label="电话咨询" value="电话咨询" />
-          <el-option label="自主下单" value="自主下单" />
-          <el-option label="上门关怀" value="上门关怀" />
-          <el-option label="工单详情下单" value="工单详情下单" />
-          <el-option label="长者小程序下单" value="长者小程序下单" />
-          <el-option label="守护中心下单" value="守护中心下单" />
+          <el-option label="报警" :value="0" />
+          <el-option label="电话咨询" :value="1" />
+          <el-option label="自主下单" :value="2" />
+          <el-option label="上门关怀" :value="3" />
+          <el-option label="工单详情下单" :value="4" />
+          <el-option label="长者小程序下单" :value="5" />
+          <el-option label="守护中心下单" :value="6" />
         </el-select>
       </el-form-item>
 
-      <el-form-item label="服务人员" prop="servicePersonId">
+      <el-form-item label="服务人员" prop="serviceMemberId">
         <el-select
-          v-model="formData.servicePersonId"
+          v-model="formData.serviceMemberId"
           placeholder="请选择服务人员"
           clearable
           class="w-full"
@@ -167,9 +167,9 @@
 
       <el-row :gutter="20">
         <el-col :span="12">
-          <el-form-item label="上门开始时间" prop="visitStartTime">
+          <el-form-item label="上门开始时间" prop="serviceStartTime">
             <el-date-picker
-              v-model="formData.visitStartTime"
+              v-model="formData.serviceStartTime"
               type="datetime"
               placeholder="选择上门开始时间"
               class="w-full"
@@ -180,9 +180,9 @@
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="上门结束时间" prop="visitEndTime">
+          <el-form-item label="上门结束时间" prop="serviceEndTime">
             <el-date-picker
-              v-model="formData.visitEndTime"
+              v-model="formData.serviceEndTime"
               type="datetime"
               placeholder="选择上门结束时间"
               class="w-full"
@@ -278,69 +278,9 @@
         />
       </el-form-item>
 
-      <!-- 详情模式下显示额外信息 -->
-      <template v-if="isDetailMode && detailData">
-        <div class="section-title">其他信息</div>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="下单时间">
-              <el-input v-model="detailData.orderTime" disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="是否过期">
-              <el-input :value="detailData.isExpired === '是' ? '是' : '否'" disabled />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="工单状态">
-              <el-input v-model="detailData.status" disabled />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </template>
+
     </el-form>
 
-    <!-- 后端提交参数说明 -->
-    <el-divider content-position="left">后端接口参数说明</el-divider>
-    <el-descriptions :column="2" border size="small" class="field-description">
-      <el-descriptions-item label="elderId" :span="1">长者ID(number,必填)</el-descriptions-item>
-      <el-descriptions-item label="elderName" :span="1">长者姓名(string,必填)</el-descriptions-item>
-      
-      <el-descriptions-item label="gender" :span="1">性别(string,男/女)</el-descriptions-item>
-      <el-descriptions-item label="age" :span="1">年龄(number)</el-descriptions-item>
-      
-      <el-descriptions-item label="phone" :span="1">手机号码(string)</el-descriptions-item>
-      <el-descriptions-item label="address" :span="1">居住地址(string)</el-descriptions-item>
-      
-      <el-descriptions-item label="orderType" :span="1">下单方式(string,必填)</el-descriptions-item>
-      <el-descriptions-item label="servicePersonId" :span="1">服务人员ID(number,必填)</el-descriptions-item>
-      
-      <el-descriptions-item label="servicePersonName" :span="1">服务人员姓名(string,必填)</el-descriptions-item>
-      <el-descriptions-item label="orderTime" :span="1">下单时间(string,YYYY-MM-DD HH:mm:ss)</el-descriptions-item>
-      
-      <el-descriptions-item label="visitStartTime" :span="1">上门开始时间(string,YYYY-MM-DD HH:mm:ss)</el-descriptions-item>
-      <el-descriptions-item label="visitEndTime" :span="1">上门结束时间(string,YYYY-MM-DD HH:mm:ss)</el-descriptions-item>
-      
-      <el-descriptions-item label="serviceDuration" :span="1">服务时长(number,分钟)</el-descriptions-item>
-      <el-descriptions-item label="projectAmount" :span="1">项目金额(number,元)</el-descriptions-item>
-      
-      <el-descriptions-item label="subsidyAmount" :span="1">补贴金额(number,元,默认为项目金额的50%,上限800元)</el-descriptions-item>
-      <el-descriptions-item label="selfPayAmount" :span="1">自费金额(number,元,项目金额-补贴金额)</el-descriptions-item>
-      
-      <el-descriptions-item label="subsidyArrivalDate" :span="2">补贴到账日期(string,YYYY-MM-DD,非必填)</el-descriptions-item>
-      
-      <el-descriptions-item label="serviceItems" :span="2">
-        <div>服务项目列表(array,必填)</div>
-        <div style="margin-top: 5px; color: #606266; font-size: 12px;">
-          每项包含:id(项目ID)、itemName(项目名称)、amount(金额)
-        </div>
-      </el-descriptions-item>
-      
-      <el-descriptions-item label="remark" :span="2">工单备注(string)</el-descriptions-item>
-    </el-descriptions>
 
     <template #footer>
       <el-button @click="dialogVisible = false">{{ isDetailMode ? '关闭' : '取消' }}</el-button>
@@ -351,6 +291,7 @@
 
 <script setup lang="ts">
 import * as ElderApi from '@/api/living-home/elderly'
+import {getElderDetail} from "@/api/living-home/elderly";
 
 const emit = defineEmits(['success'])
 
@@ -377,30 +318,30 @@ const formData = reactive({
   age: undefined as number | undefined,
   phone: '',
   address: '',
-  orderType: '电话咨询', // 默认使用电话咨询
-  servicePersonId: undefined as number | undefined,
+  orderType: 1, // 默认0
+  serviceMemberId: undefined as number | undefined,
   servicePersonName: '',
-  serviceItemIds: [] as number[], // 服务项目ID
+  serviceItemIds: [] as number[], // 服务项目ID列表
   orderTime: '', // 下单时间
-  visitStartTime: '', // 上门开始时间
-  visitEndTime: '', // 上门结束时间
+  serviceStartTime: '', // 上门开始时间
+  serviceEndTime: '', // 上门结束时间
   serviceDuration: undefined as number | undefined, // 服务时长(分钟)
-  serviceItems: [] as number[], // 服务项目ID列表
   projectAmount: 0, // 项目金额,默认为0
   subsidyAmount: 0, // 补贴金额,默认为0
   selfPayAmount: 0, // 自费金额,默认为0
   subsidyArrivalDate: '', // 补贴到账日期
-  remark: ''
+  remark: '',
+  type: 1 // 自费登记默认1
 })
 
 const formRules = {
   elderId: [{ required: true, message: '请选择长者', trigger: 'change' }],
   serviceItems: [{ required: true, message: '请选择服务项目', trigger: 'change', type: 'array' }],
   orderType: [{ required: true, message: '请选择下单方式', trigger: 'change' }],
-  servicePersonId: [{ required: true, message: '请选择服务人员', trigger: 'change' }],
+  serviceMemberId: [{ required: true, message: '请选择服务人员', trigger: 'change' }],
   orderTime: [{ required: true, message: '请选择下单时间', trigger: 'change' }],
-  visitStartTime: [{ required: true, message: '请选择上门开始时间', trigger: 'change' }],
-  visitEndTime: [{ required: true, message: '请选择上门结束时间', trigger: 'change' }],
+  serviceStartTime: [{ required: true, message: '请选择上门开始时间', trigger: 'change' }],
+  serviceEndTime: [{ required: true, message: '请选择上门结束时间', trigger: 'change' }],
   serviceDuration: [{ required: true, message: '请输入服务时长', trigger: 'change' }],
   projectAmount: [{ required: true, message: '请输入项目金额', trigger: 'change' }]
 }
@@ -499,15 +440,15 @@ const calculateEndTime = (startTime: string, durationMinutes: number): string =>
 
 // 上门开始时间变化
 const handleVisitStartTimeChange = () => {
-  if (formData.visitStartTime && formData.serviceDuration) {
-    formData.visitEndTime = calculateEndTime(formData.visitStartTime, formData.serviceDuration)
+  if (formData.serviceStartTime && formData.serviceDuration) {
+    formData.serviceEndTime = calculateEndTime(formData.serviceStartTime, formData.serviceDuration)
   }
 }
 
 // 上门结束时间变化
 const handleVisitEndTimeChange = () => {
-  if (formData.visitStartTime && formData.visitEndTime) {
-    const duration = calculateDuration(formData.visitStartTime, formData.visitEndTime)
+  if (formData.serviceStartTime && formData.serviceEndTime) {
+    const duration = calculateDuration(formData.serviceStartTime, formData.serviceEndTime)
     if (duration > 0) {
       formData.serviceDuration = duration
     }
@@ -516,8 +457,8 @@ const handleVisitEndTimeChange = () => {
 
 // 服务时长变化
 const handleDurationChange = () => {
-  if (formData.visitStartTime && formData.serviceDuration) {
-    formData.visitEndTime = calculateEndTime(formData.visitStartTime, formData.serviceDuration)
+  if (formData.serviceStartTime && formData.serviceDuration) {
+    formData.serviceEndTime = calculateEndTime(formData.serviceStartTime, formData.serviceDuration)
   }
 }
 
@@ -611,65 +552,139 @@ const toggleServiceItem = (item: any) => {
 // 打开弹窗
 const open = async (row?: any, mode: 'create' | 'edit' | 'detail' = 'create') => {
   dialogMode.value = mode
-  dialogVisible.value = true
-  resetForm()
+  
+  // 新增模式先重置表单,避免显示上一次的值
+  if (!row || mode === 'create') {
+    resetForm()
+  }
   
   // 加载服务人员列表和服务项目列表
   await getServicePersonList()
   await getServiceItemList()
+  
+  // 新增模式下,确保服务项目选中状态被清空(因为getServiceItemList可能会触发响应式更新)
+  if (!row || mode === 'create') {
+    selectedServiceItems.value = []
+    formData.serviceItemIds = []
+  }
 
-  if (row && (mode === 'edit' || mode === 'detail')) {
-    // 回填数据
-    await fillFormData(row)
-    detailData.value = row
+  if (row && (mode === 'edit' || mode === 'detail') && row.id) {
+    // 调用接口获取最新详情数据
+    try {
+      const res = await ElderApi.getAppointment(row.id)
+      if (res) {
+        await fillFormData(res)
+        detailData.value = res
+      }
+    } catch (error) {
+      console.log('获取详情失败', error)
+      // 接口失败时使用传入的row数据
+      await fillFormData(row)
+      detailData.value = row
+    }
   }
+  
+  // 最后才显示弹窗
+  dialogVisible.value = true
+}
+
+// 13位时间戳转日期时间字符串
+const timestampToDateStr = (timestamp: number | string | undefined): string => {
+  if (!timestamp) return ''
+  const ts = typeof timestamp === 'string' ? parseInt(timestamp) : timestamp
+  if (isNaN(ts)) return ''
+  const date = new Date(ts)
+  if (isNaN(date.getTime())) return ''
+  const year = date.getFullYear()
+  const month = String(date.getMonth() + 1).padStart(2, '0')
+  const day = String(date.getDate()).padStart(2, '0')
+  const hours = String(date.getHours()).padStart(2, '0')
+  const minutes = String(date.getMinutes()).padStart(2, '0')
+  const seconds = String(date.getSeconds()).padStart(2, '0')
+  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
 }
 
 // 回填表单数据
 const fillFormData = async (row: any) => {
   formData.id = row.id
-  formData.elderId = row.elderId
-  formData.elderName = row.elderName
-  formData.gender = row.gender
-  formData.age = row.age
-  formData.phone = row.phone
-  formData.address = row.address
-  formData.orderType = row.orderType
-  formData.servicePersonId = row.servicePersonId
+  formData.orderType = row.orderType ?? 1
+  formData.serviceMemberId = row.serviceMemberId ?? row.servicePersonId
   formData.servicePersonName = row.servicePersonName
-  formData.orderTime = row.orderTime
-  formData.visitStartTime = row.visitStartTime || row.visitTime
-  formData.visitEndTime = row.visitEndTime
+  // 时间戳转日期字符串
+  formData.orderTime = timestampToDateStr(row.orderTime) || row.orderTime
+  formData.serviceStartTime = timestampToDateStr(row.serviceStartTime) || row.visitStartTime || row.visitTime
+  formData.serviceEndTime = timestampToDateStr(row.serviceEndTime) || row.visitEndTime
   formData.serviceDuration = row.serviceDuration
   formData.projectAmount = row.projectAmount || 0
   formData.subsidyAmount = row.subsidyAmount || row.projectAmount || 0
   formData.selfPayAmount = row.selfPayAmount || 0
   formData.subsidyArrivalDate = row.subsidyArrivalDate || ''
   formData.remark = row.remark || ''
+  formData.type = row.type ?? 1
 
   // 回填服务项目
-  if (row.serviceItems && row.serviceItems.length > 0) {
+  if (row.serviceItemIds && row.serviceItemIds.length > 0) {
+    formData.serviceItemIds = row.serviceItemIds
+    formData.serviceItems = row.serviceItemIds // 同时设置serviceItems用于表单验证
+    // 从列表中找到对应的服务项目
+    selectedServiceItems.value = serviceItemList.value.filter(item => row.serviceItemIds.includes(item.id))
+  } else if (row.serviceItems && row.serviceItems.length > 0) {
     const itemIds = row.serviceItems.map((item: any) => typeof item === 'object' ? item.id : item)
-    formData.serviceItems = itemIds
     formData.serviceItemIds = itemIds
+    formData.serviceItems = itemIds // 同时设置serviceItems用于表单验证
     // 从列表中找到对应的服务项目
     selectedServiceItems.value = serviceItemList.value.filter(item => itemIds.includes(item.id))
   } else {
-    formData.serviceItems = []
     formData.serviceItemIds = []
+    formData.serviceItems = []
     selectedServiceItems.value = []
   }
 
-  // 设置选中的长者信息
-  selectedElder.value = {
-    id: row.elderId,
-    elderName: row.elderName,
-    sex: row.gender === '男' ? '1' : '2',
-    age: row.age,
-    phone: row.phone,
-    currentLiveAddress: row.address
+  // 根据长者ID查询长者详细信息
+  const elderId = row.homeElderId || row.elderId
+  if (elderId) {
+    try {
+      const elderRes = await getElderDetail(elderId)
+      if (elderRes) {
+        formData.elderId = elderRes.id
+        formData.elderName = elderRes.elderName
+        formData.gender = elderRes.sex === '1' ? '男' : '女'
+        formData.age = elderRes.age
+        formData.phone = elderRes.phone
+        formData.address = elderRes.currentLiveAddress
+
+        // 设置选中的长者信息
+        selectedElder.value = {
+          id: elderRes.id,
+          elderName: elderRes.elderName,
+          sex: elderRes.sex,
+          age: elderRes.age,
+          phone: elderRes.phone,
+          currentLiveAddress: elderRes.currentLiveAddress
+        }
+        elderSearchOptions.value = [selectedElder.value]
+      }
+    } catch (error) {
+      console.log('获取长者详情失败', error)
+      // 使用后端返回的数据作为回退
+      formData.elderId = row.homeElderId || row.elderId
+      formData.elderName = row.homeElderName || row.elderName || ''
+      formData.gender = row.gender || ''
+      formData.age = row.age
+      formData.phone = row.phone || ''
+      formData.address = row.address || ''
+
+      selectedElder.value = {
+        id: row.homeElderId || row.elderId,
+        elderName: row.homeElderName || row.elderName || '',
+        sex: row.gender === '男' ? '1' : '2',
+        age: row.age,
+        phone: row.phone || '',
+        currentLiveAddress: row.address || ''
+      }
+      elderSearchOptions.value = selectedElder.value ? [selectedElder.value] : []
+    }
   }
-  elderSearchOptions.value = [selectedElder.value]
 }
 
 // 获取当前时间格式化
@@ -693,14 +708,13 @@ const resetForm = () => {
   formData.age = undefined
   formData.phone = ''
   formData.address = ''
-  formData.orderType = '电话咨询'
-  formData.servicePersonId = undefined
+  formData.orderType = 1
+  formData.serviceMemberId = undefined
   formData.servicePersonName = ''
   formData.orderTime = getCurrentDateTime() // 默认当前时间
-  formData.visitStartTime = ''
-  formData.visitEndTime = ''
+  formData.serviceStartTime = ''
+  formData.serviceEndTime = ''
   formData.serviceDuration = undefined
-  formData.serviceItems = []
   formData.serviceItemIds = []
   selectedServiceItems.value = []
   serviceItemSearchKeyword.value = ''
@@ -708,6 +722,7 @@ const resetForm = () => {
   formData.subsidyAmount = 0
   formData.selfPayAmount = 0
   formData.remark = ''
+  formData.type = 1
   
   selectedElder.value = null
   elderSearchOptions.value = []
@@ -717,6 +732,14 @@ const resetForm = () => {
   })
 }
 
+// 日期时间转13位时间戳
+const dateToTimestamp = (dateStr: string): number | undefined => {
+  if (!dateStr) return undefined
+  const date = new Date(dateStr)
+  if (isNaN(date.getTime())) return undefined
+  return date.getTime()
+}
+
 // 提交表单
 const handleSubmit = async () => {
   const valid = await formRef.value?.validate().catch(() => false)
@@ -725,17 +748,20 @@ const handleSubmit = async () => {
   submitLoading.value = true
   try {
     // 获取选中的服务人员名称
-    const servicePerson = servicePersonList.value.find(item => item.id === formData.servicePersonId)
+    const servicePerson = servicePersonList.value.find(item => item.id === formData.serviceMemberId)
     const servicePersonName = servicePerson?.name || ''
 
     const data = {
       ...formData,
       servicePersonName,
-      serviceItems: selectedServiceItems.value.map(item => ({
-        id: item.id,
-        itemName: item.itemName,
-        amount: item.amount
-      }))
+      serviceItemIds: selectedServiceItems.value.map(item => item.id),
+      // 时间字段转换为13位时间戳
+      orderTime: dateToTimestamp(formData.orderTime),
+      serviceStartTime: dateToTimestamp(formData.serviceStartTime),
+      serviceEndTime: dateToTimestamp(formData.serviceEndTime),
+      // 后端需要的字段名
+      homeElderId: formData.elderId,
+      homeElderName: formData.elderName
     }
 
     if (dialogMode.value === 'edit' && formData.id) {
@@ -903,4 +929,4 @@ defineExpose({ open })
     }
   }
 }
-</style>
+</style>

+ 69 - 71
src/views/living-home/visiting-service/self-funded-registration/index.vue

@@ -35,20 +35,20 @@
           class="!w-180px"
         />
       </el-form-item>
-      <el-form-item label="工单状态:" prop="status">
-        <el-select
-          v-model="queryParams.status"
-          placeholder="全部"
-          clearable
-          class="!w-180px"
-        >
-          <el-option label="全部" value="" />
-          <el-option label="待派单" value="待派单" />
-          <el-option label="待接单" value="待接单" />
-          <el-option label="已接单" value="已接单" />
-          <el-option label="已签到" value="已签到" />
-        </el-select>
-      </el-form-item>
+<!--      <el-form-item label="工单状态:" prop="status">-->
+<!--        <el-select-->
+<!--          v-model="queryParams.status"-->
+<!--          placeholder="全部"-->
+<!--          clearable-->
+<!--          class="!w-180px"-->
+<!--        >-->
+<!--          <el-option label="全部" value="" />-->
+<!--          <el-option label="待派单" value="待派单" />-->
+<!--          <el-option label="待接单" value="待接单" />-->
+<!--          <el-option label="已接单" value="已接单" />-->
+<!--          <el-option label="已签到" value="已签到" />-->
+<!--        </el-select>-->
+<!--      </el-form-item>-->
       <el-form-item label="下单方式:" prop="orderType">
         <el-select
           v-model="queryParams.orderType"
@@ -57,13 +57,13 @@
           class="!w-180px"
         >
           <el-option label="全部" value="" />
-          <el-option label="报警" value="报警" />
-          <el-option label="电话咨询" value="电话咨询" />
-          <el-option label="自主下单" value="自主下单" />
-          <el-option label="上门关怀" value="上门关怀" />
-          <el-option label="工单详情下单" value="工单详情下单" />
-          <el-option label="长者小程序下单" value="长者小程序下单" />
-          <el-option label="守护中心下单" value="守护中心下单" />
+          <el-option label="报警" :value="0" />
+          <el-option label="电话咨询" :value="1" />
+          <el-option label="自主下单" :value="2" />
+          <el-option label="上门关怀" :value="3" />
+          <el-option label="工单详情下单" :value="4" />
+          <el-option label="长者小程序下单" :value="5" />
+          <el-option label="守护中心下单" :value="6" />
         </el-select>
       </el-form-item>
       <el-form-item class="!ml-auto">
@@ -100,22 +100,22 @@
     >
       <el-table-column label="序号" type="index" width="80" align="center" />
       <!-- 长者信息 -->
-      <el-table-column prop="elderName" label="长者姓名" align="center" min-width="100" />
-      <el-table-column prop="gender" label="性别" align="center" width="80" />
+      <el-table-column prop="homeElderName" label="长者姓名" align="center" min-width="100" />
+      <el-table-column prop="sex" label="性别" align="center" width="80" />
       <el-table-column prop="age" label="年龄" align="center" width="80" />
       <el-table-column prop="phone" label="手机号码" align="center" min-width="120" />
       <el-table-column prop="address" label="居住地址" align="center" min-width="200" show-overflow-tooltip />
       <!-- 工单信息 -->
       <el-table-column prop="orderType" label="下单方式" align="center" min-width="120" />
-      <el-table-column prop="servicePersonName" label="服务人员" align="center" min-width="120" />
+      <el-table-column prop="serviceMemberName" label="服务人员" align="center" min-width="120" />
       <el-table-column prop="orderTime" label="下单时间" align="center" min-width="160" />
-      <el-table-column prop="visitStartTime" label="上门开始时间" align="center" min-width="160" />
-      <el-table-column prop="visitEndTime" label="上门结束时间" align="center" min-width="160" />
+      <el-table-column prop="serviceStartTime" label="上门开始时间" align="center" min-width="160" />
+      <el-table-column prop="serviceEndTime" label="上门结束时间" align="center" min-width="160" />
       <el-table-column prop="serviceDuration" label="服务时长(分钟)" align="center" width="120" />
       <!-- 服务项目 -->
       <el-table-column label="服务项目" align="center" min-width="200" show-overflow-tooltip>
         <template #default="scope">
-          {{ scope.row.serviceItems ? scope.row.serviceItems.map(item => item.itemName || item).join('、') : '-' }}
+          {{ scope.row.items  }}
         </template>
       </el-table-column>
       <!-- 金额信息 -->
@@ -209,64 +209,62 @@ const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
   elderName: '',
-  servicePersonName: '',
+  serviceMemberName: '',
   phone: '',
   status: '',
+  type:1,
   orderType: ''
 })
 
+// 13位时间戳转日期时间字符串
+const timestampToDateStr = (timestamp: number | string | undefined): string => {
+  if (!timestamp) return ''
+  const ts = typeof timestamp === 'string' ? parseInt(timestamp) : timestamp
+  if (isNaN(ts)) return ''
+  const date = new Date(ts)
+  if (isNaN(date.getTime())) return ''
+  const year = date.getFullYear()
+  const month = String(date.getMonth() + 1).padStart(2, '0')
+  const day = String(date.getDate()).padStart(2, '0')
+  const hours = String(date.getHours()).padStart(2, '0')
+  const minutes = String(date.getMinutes()).padStart(2, '0')
+  const seconds = String(date.getSeconds()).padStart(2, '0')
+  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
+}
+
+// 下单方式数字转中文
+const orderTypeToText = (orderType: number | string | undefined): string => {
+  const map: Record<number, string> = {
+    0: '报警',
+    1: '电话咨询',
+    2: '自主下单',
+    3: '上门关怀',
+    4: '工单详情下单',
+    5: '长者小程序下单',
+    6: '守护中心下单'
+  }
+  if (orderType === undefined || orderType === null) return ''
+  const key = typeof orderType === 'string' ? parseInt(orderType) : orderType
+  return map[key] || String(orderType)
+}
+
 /** 查询列表 */
 const getList = async () => {
   loading.value = true
   try {
     const data = await AppointmentApi.getAppointmentPage(queryParams)
-    list.value = data.list || []
+    // 将时间戳转换为日期字符串,下单方式数字转中文
+    list.value = (data.list || []).map((item: any) => ({
+      ...item,
+      orderTime: timestampToDateStr(item.orderTime) || item.orderTime,
+      serviceStartTime: timestampToDateStr(item.serviceStartTime) || item.visitStartTime || item.visitTime,
+      serviceEndTime: timestampToDateStr(item.serviceEndTime) || item.visitEndTime,
+      orderType: orderTypeToText(item.orderType)
+    }))
     total.value = data.total || 0
   } catch (error) {
     console.log('获取预约列表失败', error)
     // 使用模拟数据
-    list.value = [
-      {
-        id: 1,
-        elderName: '张三',
-        gender: '女',
-        age: 43,
-        phone: '156****5555',
-        address: '河源市/源城区/城东街道aaa',
-        orderType: '坐席下单',
-        servicePersonName: '张磊',
-        orderTime: '2026-04-27 15:00:04',
-        visitTime: '2026-04-27 上午',
-        isExpired: '否'
-      },
-      {
-        id: 2,
-        elderName: '张三',
-        gender: '女',
-        age: 43,
-        phone: '156****5555',
-        address: '河源市/源城区/城东街道aaa',
-        orderType: '坐席下单',
-        servicePersonName: '张磊',
-        orderTime: '2026-04-27 15:00:04',
-        visitTime: '2026-04-28 上午',
-        isExpired: '否'
-      },
-      {
-        id: 3,
-        elderName: '张三',
-        gender: '女',
-        age: 43,
-        phone: '156****5555',
-        address: '河源市/源城区/城东街道aaa',
-        orderType: '坐席下单',
-        servicePersonName: '张磊',
-        orderTime: '2026-04-27 15:00:04',
-        visitTime: '2026-04-29 上午',
-        isExpired: '否'
-      }
-    ]
-    total.value = list.value.length
   } finally {
     loading.value = false
   }