Kaynağa Gözat

feat: 调整任务筛选与施工页面,补充小程序打包配置

mcc 18 saat önce
ebeveyn
işleme
f331b4ba83

+ 1 - 0
src/api/schedule.ts

@@ -4,6 +4,7 @@ export interface DispatchSchedule {
   scheduleId?: number
   teamId?: number
   teamName?: string
+  scheduleName?: string
   workDate?: string
   shiftType?: 'month_plan' | 'emergency' | string
   vehicleIds?: string

+ 1 - 1
src/components/home/DispatchHome.vue

@@ -311,7 +311,7 @@ const notices = ref<any[]>([])
 const knowledgeList = ref<KnowledgeItem[]>([])
 
 onMounted(async () => {
-  taskStore.fetchMyTasks(today)
+  taskStore.fetchTasks(1, 999)
   notificationStore.fetchUnreadCount()
   try {
     const res = await getNoticeList(1, 3)

+ 1 - 10
src/components/task/ConstructionTaskCard.vue

@@ -11,7 +11,6 @@
     <view class="task-header">
       <view class="flex items-center gap-2 min-w-0">
         <text class="project-name truncate">{{ projectNameText }}</text>
-        <view v-if="coopTagText" class="tag coop-tag">{{ coopTagText }}</view>
         <view v-if="isEmergency" class="tag emergency-tag">应急</view>
         <view v-else-if="urgentText" class="tag" :class="urgentClass">{{ urgentText }}</view>
       </view>
@@ -63,7 +62,7 @@
 import { computed, onMounted, ref, watch } from 'vue'
 import StatusTag from '../common/StatusTag.vue'
 import type { Task } from '@/types'
-import { formatDate, getConstructionTypeText, getCooperationTypeText } from '@/utils'
+import { formatDate, getConstructionTypeText } from '@/utils'
 import { getTaskPhotos, type TaskPhoto } from '@/api/file'
 import {
   FLOW_STEPS,
@@ -90,10 +89,6 @@ const projectNameText = computed(() => {
   return props.task.projectName || (props.task as any).taskName || '未命名任务'
 })
 
-const coopTagText = computed(() => {
-  return getCooperationTypeText(props.task.coopType || (props.task as any).cooperationType)
-})
-
 const urgentText = computed(() => {
   if (props.task.urgent === 'high' || props.task.urgent === 'very_urgent' || props.task.urgencyLevel === 'high') return '加急'
   return ''
@@ -211,10 +206,6 @@ watch(() => props.task, () => {
   line-height: 1;
   flex-shrink: 0;
 }
-.coop-tag {
-  background: #f3e8ff;
-  color: #9333ea;
-}
 .emergency-tag {
   background: #fef2f2;
   color: #dc2626;

+ 3 - 3
src/components/task/TaskListView.vue

@@ -109,10 +109,10 @@ const roleConfig: Record<string, { filterStatuses: { value: string; label: strin
   sales: {
     filterStatuses: [
       { value: 'all', label: '全部' },
-      { value: 'dispatching', label: '调度中' },
-      { value: 'constructing', label: '施工中' },
+      { value: 'auditing', label: '待审核' },
+      { value: 'approved', label: '待安排' },
+      { value: 'assigned', label: '待确认' },
       { value: 'completed', label: '已完成' },
-      { value: 'emergency', label: '应急' },
     ],
     detailPath: '/subPackages/pages-common/taskDetail',
     publishPath: '/subPackages/pages-common/publishTask',

+ 1 - 1
src/config/index.ts

@@ -4,7 +4,7 @@
 // 生产环境通过构建时注入 VITE_APP_BASE_URL 覆盖
 const DEFAULT_BASE_URL = 'http://8.137.16.17:8000/api'
 // const DEFAULT_BASE_URL = 'http://localhost:8080/api'
-// // const DEFAULT_BASE_URL = 'http://192.168.1.100:8080/api'
+// // // const DEFAULT_BASE_URL = 'http://192.168.1.100:8080/api'
 
 export const BASE_URL = import.meta.env.VITE_APP_BASE_URL || DEFAULT_BASE_URL
 

+ 64 - 2
src/manifest.json

@@ -17,7 +17,9 @@
             "delay" : 0
         },
         /* 模块配置 */
-        "modules" : {},
+        "modules" : {
+            "Camera" : {}
+        },
         /* 应用发布信息 */
         "distribute" : {
             /* android打包配置 */
@@ -45,7 +47,65 @@
                 "dSYMs" : false
             },
             /* SDK配置 */
-            "sdkConfigs" : {}
+            "sdkConfigs" : {
+                "geolocation" : {
+                    "system" : {
+                        "__platform__" : [ "ios", "android" ]
+                    },
+                    "tencent" : {
+                        "__platform__" : [ "ios", "android" ],
+                        "apikey_ios" : "",
+                        "apikey_android" : ""
+                    },
+                    "baidu" : {
+                        "__platform__" : [ "ios", "android" ],
+                        "appkey_ios" : "",
+                        "appkey_android" : ""
+                    },
+                    "amap" : {
+                        "name" : "",
+                        "__platform__" : [ "ios", "android" ],
+                        "appkey_ios" : "",
+                        "appkey_android" : ""
+                    }
+                }
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "unpackage/res/icons/72x72.png",
+                    "xhdpi" : "unpackage/res/icons/96x96.png",
+                    "xxhdpi" : "unpackage/res/icons/144x144.png",
+                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
+                },
+                "ios" : {
+                    "appstore" : "unpackage/res/icons/1024x1024.png",
+                    "ipad" : {
+                        "app" : "unpackage/res/icons/76x76.png",
+                        "app@2x" : "unpackage/res/icons/152x152.png",
+                        "notification" : "unpackage/res/icons/20x20.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "proapp@2x" : "unpackage/res/icons/167x167.png",
+                        "settings" : "unpackage/res/icons/29x29.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "spotlight" : "unpackage/res/icons/40x40.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
+                    },
+                    "iphone" : {
+                        "app@2x" : "unpackage/res/icons/120x120.png",
+                        "app@3x" : "unpackage/res/icons/180x180.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "notification@3x" : "unpackage/res/icons/60x60.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "settings@3x" : "unpackage/res/icons/87x87.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
+                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
+                    }
+                }
+            }
+        },
+        // 合并原来第二段的compatible配置到这里
+        "compatible" : {
+            "ignoreVersion" : true
         }
     },
     /* 快应用特有相关 */
@@ -88,3 +148,5 @@
     },
     "vueVersion" : "3"
 }
+//...  
+

+ 5 - 162
src/subPackages/pages-construction/dailyTask.vue

@@ -3,26 +3,6 @@
     <TopBar title="每日检查" show-back />
 
     <view class="px-4 pt-3">
-      <!-- 今日任务概览 -->
-      <view class="glass-card p-4">
-        <view class="section-head-inner mb-3">
-          <view class="section-bar mr-2"></view>
-          <text class="section-title">今日概览</text>
-        </view>
-        <view class="grid grid-cols-2 gap-3">
-          <view class="stat-card">
-            <view class="stat-bar"></view>
-            <text class="stat-value">{{ todayTasks.length }}</text>
-            <text class="stat-label">今日任务</text>
-          </view>
-          <view class="stat-card">
-            <view class="stat-bar"></view>
-            <text class="stat-value">{{ completedTasks }}</text>
-            <text class="stat-label">已完成</text>
-          </view>
-        </view>
-      </view>
-
       <!-- 今日排班 -->
       <view v-if="schedule" class="glass-card p-4">
         <view class="section-head-inner mb-3">
@@ -31,7 +11,7 @@
         </view>
         <view class="info-row">
           <text class="info-label">班组</text>
-          <text class="info-value">{{ schedule.teamName || '-' }}</text>
+          <text class="info-value">{{ displayTeamName }}</text>
         </view>
         <view class="info-row">
           <text class="info-label">班次</text>
@@ -163,47 +143,12 @@
           </view>
         </view>
       </view>
-
-      <!-- 今日任务列表 -->
-      <view class="glass-card">
-        <view class="section-head">
-          <view class="section-bar mr-2"></view>
-          <text class="section-title flex-1">今日任务列表</text>
-        </view>
-        <view v-if="taskStore.loading" class="py-10 text-center">
-          <text class="empty-text">加载中...</text>
-        </view>
-        <view v-else-if="todayTasks.length === 0" class="pb-3">
-          <EmptyState message="今日无任务" />
-        </view>
-        <view v-else>
-          <view
-            v-for="task in todayTasks"
-            :key="task.taskId || task.id"
-            class="list-row"
-            hover-class="row-hover"
-            :hover-start-time="0"
-            :hover-stay-time="120"
-            @click="goToDetail(task.taskId || task.id)"
-          >
-            <view class="icon-chip mr-3">
-              <text class="uni-icons uniui-flag chip-glyph"></text>
-            </view>
-            <view class="flex-1 min-w-0 mr-2">
-              <text class="row-title truncate">{{ task.taskName || task.projectName }}</text>
-              <text class="row-sub truncate">{{ task.address || '暂无地址' }}</text>
-            </view>
-            <StatusTag :status="task.status" />
-          </view>
-        </view>
-      </view>
     </view>
   </view>
 </template>
 
 <script setup lang="ts">
 import { ref, computed, onMounted } from 'vue'
-import { useTaskStore } from '../../stores/task'
 import { useAuthStore } from '../../stores/auth'
 import { chooseMediaCompat } from '../../utils'
 import {
@@ -215,10 +160,7 @@ import {
 } from '../../api/dailyCheck'
 import { uploadFile } from '../../api/file'
 import TopBar from '../../components/common/TopBar.vue'
-import StatusTag from '../../components/common/StatusTag.vue'
-import EmptyState from '../../components/common/EmptyState.vue'
 
-const taskStore = useTaskStore()
 const authStore = useAuthStore()
 
 const today = new Date().toISOString().split('T')[0]
@@ -269,18 +211,12 @@ const vehiclePlateNos = computed(() => {
   return vehicles.value.map((v) => v.plateNo).filter(Boolean).join('、')
 })
 
-const canSubmit = computed(() => {
-  return !!(selectedCheckDate.value && selectedVehicle.value)
-})
-
-const completedTasks = computed(() => {
-  return todayTasks.value.filter((t) => t.status === 'completed').length
+const displayTeamName = computed(() => {
+  return schedule.value?.scheduleName || schedule.value?.teamName || '-'
 })
 
-const todayTasks = computed<any[]>(() => {
-  return taskStore.tasks.filter(
-    (t: any) => t.planDate === today || t.scheduleDate === today || t.serviceDate === today
-  )
+const canSubmit = computed(() => {
+  return !!(selectedCheckDate.value && selectedVehicle.value)
 })
 
 const mediaSummary = computed(() => {
@@ -465,11 +401,6 @@ function handleReset() {
   selectedVehicleIndex.value = 0
 }
 
-function goToDetail(taskId: string | number) {
-  if (!taskId) return
-  uni.navigateTo({ url: `/subPackages/pages-construction/taskDetail?id=${taskId}` })
-}
-
 onMounted(() => {
   const savedRemark = uni.getStorageSync(remarkKey)
   if (savedRemark) {
@@ -478,7 +409,6 @@ onMounted(() => {
 
   loadSchedule()
   loadTodayRecord()
-  taskStore.fetchMyTasks(today)
 })
 </script>
 
@@ -503,12 +433,6 @@ onMounted(() => {
 }
 
 /* 区块标题 */
-.section-head {
-  display: flex;
-  align-items: center;
-  padding: 16px 16px 12px;
-}
-
 .section-head-inner {
   display: flex;
   align-items: center;
@@ -527,45 +451,6 @@ onMounted(() => {
   color: #1f2937;
 }
 
-/* 统计卡 */
-.stat-card {
-  position: relative;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  min-height: 88px;
-  padding: 14px 6px 12px;
-  border-radius: 16px;
-  background-color: rgba(164, 216, 152, 0.14);
-  border: 1px solid rgba(164, 216, 152, 0.3);
-  overflow: hidden;
-}
-
-.stat-bar {
-  position: absolute;
-  top: 0;
-  left: 50%;
-  transform: translateX(-50%);
-  width: 26px;
-  height: 3px;
-  border-radius: 0 0 3px 3px;
-  background: linear-gradient(135deg, #368f6f 0%, #5ab8d0 100%);
-}
-
-.stat-value {
-  font-size: 24px;
-  font-weight: 800;
-  line-height: 1.1;
-  color: #368f6f;
-}
-
-.stat-label {
-  margin-top: 6px;
-  font-size: 12px;
-  color: #6b7280;
-}
-
 /* 排班信息 */
 .info-row {
   display: flex;
@@ -834,48 +719,6 @@ onMounted(() => {
   font-weight: 600;
 }
 
-/* 列表行 */
-.list-row {
-  display: flex;
-  align-items: center;
-  padding: 13px 16px;
-  border-top: 1px solid rgba(164, 216, 152, 0.18);
-}
-
-.row-title {
-  display: block;
-  font-size: 14px;
-  font-weight: 500;
-  color: #1f2937;
-}
-
-.row-sub {
-  display: block;
-  margin-top: 3px;
-  font-size: 12px;
-  color: #9ca3af;
-}
-
-.row-hover {
-  background-color: rgba(164, 216, 152, 0.3);
-}
-
-.icon-chip {
-  width: 42px;
-  height: 42px;
-  border-radius: 12px;
-  flex-shrink: 0;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  background-color: rgba(164, 216, 152, 0.2);
-}
-
-.chip-glyph {
-  font-size: 20px;
-  color: #368f6f;
-}
-
 .empty-text {
   font-size: 13px;
   color: #9ca3af;

+ 1 - 1
src/subPackages/pages-construction/taskDetail.vue

@@ -10,7 +10,7 @@
       <!-- 1. 施工流程进度条(与 admin 对齐:确认 + 7 张记录卡) -->
       <view class="flow-bar">
         <view class="flow-bar-bg"></view>
-        <view class="flow-bar-fill" :style="{ width: flowProgress + '%' }"></view>
+        <view class="flow-bar-fill" :style="{ width: `calc((100% - 56px) * ${Math.max(0, flowProgress) / 100})` }"></view>
         <view v-for="(step, i) in FLOW_STEPS" :key="step.uiStep" class="flow-step-item">
           <view class="flow-step-dot" :class="flowDotClass(step.uiStep)">
             <text v-if="flowStepState(step.uiStep) === 'completed'" class="uni-icons uniui-checkmarkempty flow-step-check"></text>

BIN
unpackage/res/icons/1024x1024.png


BIN
unpackage/res/icons/120x120.png


BIN
unpackage/res/icons/144x144.png


BIN
unpackage/res/icons/152x152.png


BIN
unpackage/res/icons/167x167.png


BIN
unpackage/res/icons/180x180.png


BIN
unpackage/res/icons/192x192.png


BIN
unpackage/res/icons/20x20.png


BIN
unpackage/res/icons/29x29.png


BIN
unpackage/res/icons/40x40.png


BIN
unpackage/res/icons/58x58.png


BIN
unpackage/res/icons/60x60.png


BIN
unpackage/res/icons/72x72.png


BIN
unpackage/res/icons/76x76.png


BIN
unpackage/res/icons/80x80.png


BIN
unpackage/res/icons/87x87.png


BIN
unpackage/res/icons/96x96.png