Просмотр исходного кода

feat(uniapp): 巡检/品控 列表-详情-扫码 透传 slot(每日多时段打卡独立)

- types/inspection: PunchSubmitPayload 加 slot?: string
- api/inspection: getInspectionTaskDetail(id, slot?) 加 slot 参数
- pages/inspection/list: onPunchTap / onDetailTap 跳转时拼 &slot=<slot>
- pages/inspection/check: onLoad 收 slot,loadDetail 传给 API,submitPunch payload 带 slot
- pages/inspection/scan: onLoad 收 slot,跳 check 时拼 slot
- pages/qualityInspection/*: 同 inspection 的三处修改
yangjingjing 1 день назад
Родитель
Сommit
82a2692f09

+ 6 - 2
src/api/inspection.ts

@@ -76,10 +76,14 @@ export function listInspectionTasks(query: InspectionListQuery): Promise<PageRes
 }
 
 // ===== 任务详情(含巡检项目) =====
-export function getInspectionTaskDetail(id: string | number): Promise<any> {
+// slot 可选:每日多时段任务传 slot 可按 (taskId, slot) 查 record 状态
+export function getInspectionTaskDetail(id: string | number, slot?: string): Promise<any> {
+  const params: Record<string, string> = {}
+  if (slot) params.slot = slot
   return request<any>({
     url: `/risk/inspectionTask/mobileDetail/${id}`,
-    method: 'GET'
+    method: 'GET',
+    params
   })
 }
 

+ 7 - 1
src/pages/inspection/check/index.vue

@@ -125,11 +125,14 @@ const showSuccess = ref(false)
 const pickedLocation = ref<string>('')
 // 用户选位置时取到的坐标(覆盖 GPS 自动获取)
 const pickedCoord = ref<{ lng: number; lat: number } | null>(null)
+// 每日多时段任务的当前时间段(从列表或扫码页 URL 传入)
+const slot = ref<string>('')
 
 onLoad((q) => {
   // 注意:taskId 是大数(雪花 ID),Number() 会丢精度,必须全程用 string
   taskId.value = String(q?.taskId || '')
   readonly.value = q?.readonly === '1'
+  slot.value = String(q?.slot || '')
   // 扫码页会带 lng/lat 过来,作为初值(用户仍可在地图上重新选点)
   if (q?.lng && q?.lat) {
     pickedCoord.value = {
@@ -147,7 +150,8 @@ onShow(() => {
 async function loadDetail() {
   try {
     // 走统一 request 后:已自动剥外层 R<T>,data 即 InspectionTask
-    const data = (await getInspectionTaskDetail(taskId.value)) as InspectionTask
+    // 每日多时段任务: 传 slot 让后端按 (taskId, slot) 查 record 状态
+    const data = (await getInspectionTaskDetail(taskId.value, slot.value || undefined)) as InspectionTask
     if (data) {
       // 详情接口字段是 location(后端 VO),模板用的是 punchLocation(列表接口 mapRow 映射后的字段名)
       // 这里补一次映射,让已打卡任务的预设位置能在 readonly 模式下显示
@@ -371,6 +375,8 @@ async function onSubmit() {
       lng,
       lat,
       punchType: (task.value.punchType as any) || 'NORMAL',
+      // 每日多时段任务:把当前 slot 传给后端,record 按 (taskId, slot) 独立存储
+      slot: slot.value || undefined,
       photos: allPhotoUrls || undefined,
       items: items.value.map((it) => ({
         itemId: it.id,

+ 6 - 3
src/pages/inspection/list/index.vue

@@ -169,22 +169,25 @@ function onFilterTap() {
 }
 
 async function onPunchTap(item: InspectionTask) {
+  // 每日多时段任务: 把当前 slot 带到详情/扫码页,后端按 (taskId, slot) 独立判断打卡状态
+  const slotQuery = item.slot ? `&slot=${encodeURIComponent(item.slot)}` : ''
   if (item.punchType === 'NORMAL') {
     // 常规打卡:直接跳转
     uni.navigateTo({
-      url: `/pages/inspection/check/index?taskId=${item.id}`
+      url: `/pages/inspection/check/index?taskId=${item.id}${slotQuery}`
     })
   } else if (item.punchType === 'SCAN') {
     // 扫码打卡:先扫码
     uni.navigateTo({
-      url: `/pages/inspection/scan/index?taskId=${item.id}`
+      url: `/pages/inspection/scan/index?taskId=${item.id}${slotQuery}`
     })
   }
 }
 
 function onDetailTap(item: InspectionTask) {
+  const slotQuery = item.slot ? `&slot=${encodeURIComponent(item.slot)}` : ''
   uni.navigateTo({
-    url: `/pages/inspection/check/index?taskId=${item.id}&readonly=1`
+    url: `/pages/inspection/check/index?taskId=${item.id}&readonly=1${slotQuery}`
   })
 }
 

+ 6 - 1
src/pages/inspection/scan/index.vue

@@ -74,9 +74,12 @@ const fileInputRef = ref<any>(null)
 let scanTimer: any = null
 let h5Stream: MediaStream | null = null
 let h5RafId: number | null = null
+// 每日多时段任务的当前时间段(从列表传入)
+const slot = ref<string>('')
 
 onLoad((q) => {
   taskId.value = Number(q?.taskId || 0)
+  slot.value = String(q?.slot || '')
   // 自动启动扫码(大部分设备直接可用)
   // iOS Safari 若因手势问题失败,会显示"点击重试"按钮
   startScan()
@@ -326,8 +329,10 @@ async function onScanSuccess(qrContent: string) {
 
     uni.hideLoading()
     // 3. 校验通过:跳转到打卡页
+    //    每日多时段任务:带上当前 slot
+    const slotQuery = slot.value ? `&slot=${encodeURIComponent(slot.value)}` : ''
     uni.redirectTo({
-      url: `/pages/inspection/check/index?taskId=${taskId.value}&lng=${loc.longitude}&lat=${loc.latitude}`
+      url: `/pages/inspection/check/index?taskId=${taskId.value}&lng=${loc.longitude}&lat=${loc.latitude}${slotQuery}`
     })
   } catch (e) {
     uni.hideLoading()

+ 6 - 3
src/pages/qualityInspection/list/index.vue

@@ -173,22 +173,25 @@ function onFilterTap() {
 
 function onPunchTap(item: QualityInspectionTask) {
   // 3.2.2:根据打卡方式跳转品控打卡/扫码页(独立路由)
+  // 每日多时段任务:把当前 slot 带到详情/扫码页
+  const slotQuery = item.slot ? `&slot=${encodeURIComponent(item.slot)}` : ''
   if (item.punchType === 'SCAN') {
     // 扫码打卡:跳转品控扫码页
     uni.navigateTo({
-      url: `/pages/qualityInspection/scan/index?taskId=${item.id}`
+      url: `/pages/qualityInspection/scan/index?taskId=${item.id}${slotQuery}`
     })
   } else {
     // 常规打卡:跳转品控打卡页
     uni.navigateTo({
-      url: `/pages/qualityInspection/check/index?taskId=${item.id}`
+      url: `/pages/qualityInspection/check/index?taskId=${item.id}${slotQuery}`
     })
   }
 }
 
 function onDetailTap(item: QualityInspectionTask) {
+  const slotQuery = item.slot ? `&slot=${encodeURIComponent(item.slot)}` : ''
   uni.navigateTo({
-    url: `/pages/qualityInspection/check/index?taskId=${item.id}&readonly=1`
+    url: `/pages/qualityInspection/check/index?taskId=${item.id}&readonly=1${slotQuery}`
   })
 }
 

+ 6 - 1
src/pages/qualityInspection/scan/index.vue

@@ -77,9 +77,12 @@ let h5RafId: number | null = null
 // 缓存任务点位经纬度(进入页时从 storage 取,真实项目可从任务详情接口返回)
 let taskLng = 0
 let taskLat = 0
+// 每日多时段任务的当前时间段(从列表传入)
+const slot = ref<string>('')
 
 onLoad((q) => {
   taskId.value = Number(q?.taskId || 0)
+  slot.value = String(q?.slot || '')
   taskLng = Number(uni.getStorageSync(`qtask_lng_${taskId.value}`) || 0)
   taskLat = Number(uni.getStorageSync(`qtask_lat_${taskId.value}`) || 0)
   // 自动启动扫码(大部分设备直接可用)
@@ -316,8 +319,10 @@ async function onScanSuccess(qrContent: string) {
 
     uni.hideLoading()
     // 3. 校验通过:跳转到品控打卡页
+    //    每日多时段任务:带上当前 slot
+    const slotQuery = slot.value ? `&slot=${encodeURIComponent(slot.value)}` : ''
     uni.redirectTo({
-      url: `/pages/qualityInspection/check/index?taskId=${taskId.value}&lng=${loc.longitude}&lat=${loc.latitude}`
+      url: `/pages/qualityInspection/check/index?taskId=${taskId.value}&lng=${loc.longitude}&lat=${loc.latitude}${slotQuery}`
     })
   } catch (e) {
     uni.hideLoading()

+ 2 - 0
src/types/inspection.ts

@@ -56,6 +56,8 @@ export interface PunchSubmitPayload {
   lat: number                   // 纬度(@NotNull 必填)
   punchType: PunchType          // 打卡类型 NORMAL/SCAN
   qrCode?: string               // 扫码得到的二维码内容(SCAN 时必填)
+  /** 每日多时段任务用:如 "08:00-08:30",空则按 task 整体打卡 */
+  slot?: string
   photos?: string               // 整单照片(逗号分隔)
   remark?: string               // 备注
   items: Array<PunchItemPayload>