Browse Source

Merge branch 'master' of http://39.164.159.226:3000/hnsh-smart-steward/smart-steward-mobile

闪电 3 weeks ago
parent
commit
73119d7eb3
40 changed files with 5462 additions and 184 deletions
  1. 1 1
      env/.env.production
  2. 30 4
      src/App.ku.vue
  3. BIN
      src/assets/AIimgs.gif
  4. 14 7
      src/components/jiayiList/index.vue
  5. 305 4
      src/pages/archive/HSSE/HSSEDrill.vue
  6. 344 4
      src/pages/archive/HSSE/HSSELedger.vue
  7. 428 0
      src/pages/archive/HSSE/addHSSELedger.vue
  8. 10 18
      src/pages/archive/cpns/checkTask.vue
  9. 325 4
      src/pages/archive/headOffice/headOfficeAreaInspect.vue
  10. 326 5
      src/pages/archive/headOffice/headOfficeAreaMeet.vue
  11. 325 4
      src/pages/archive/headOffice/headOfficeInspect.vue
  12. 325 4
      src/pages/archive/headOffice/headOfficeStation.vue
  13. 4 7
      src/pages/archive/index.vue
  14. 290 5
      src/pages/archive/operat/operatComplain.vue
  15. 328 4
      src/pages/archive/operat/operatLicenses.vue
  16. 4 1
      src/pages/archive/operat/operatManage.vue
  17. 325 5
      src/pages/archive/operat/operatMeet.vue
  18. 4 1
      src/pages/archive/operat/operatPlan.vue
  19. 2 11
      src/pages/archive/operat/operatPrice.vue
  20. 1 11
      src/pages/archive/operat/operatSales.vue
  21. 308 4
      src/pages/archive/operat/operatTeam.vue
  22. 1 8
      src/pages/archive/operat/operatTurnIn.vue
  23. 2 11
      src/pages/archive/operat/operatWeek.vue
  24. 20 2
      src/pages/archive/order/creatOrder.vue
  25. 327 5
      src/pages/archive/quality/qualityAdditive.vue
  26. 328 5
      src/pages/archive/quality/qualityOilGun.vue
  27. 328 5
      src/pages/archive/quality/qualityTestWater.vue
  28. 10 3
      src/pages/archive/station/stationCar.vue
  29. 10 3
      src/pages/archive/station/stationExtinguisher.vue
  30. 10 3
      src/pages/archive/station/stationFilter.vue
  31. 10 3
      src/pages/archive/station/stationFirstAidKit.vue
  32. 10 3
      src/pages/archive/station/stationHandover.vue
  33. 10 3
      src/pages/archive/station/stationLicenses.vue
  34. 10 3
      src/pages/archive/station/stationOilGun.vue
  35. 10 3
      src/pages/archive/station/stationOpponent.vue
  36. 10 3
      src/pages/archive/station/stationProtection.vue
  37. 327 4
      src/pages/archive/temporary/temporaryStation.vue
  38. 326 4
      src/pages/archive/temporary/temporaryVisitor.vue
  39. 13 8
      src/pages/schedule/view/addgasstation/index.vue
  40. 1 1
      src/pages/schedule/view/index.vue

+ 1 - 1
env/.env.production

@@ -6,4 +6,4 @@ VITE_DELETE_CONSOLE = true
6 6
 VITE_SHOW_SOURCEMAP = false
7 7
 
8 8
 # 后台请求地址
9
-# VITE_SERVER_BASEURL = 'https://prod.xxx.com'
9
+VITE_SERVER_BASEURL = 'http://39.164.159.226:8088'

+ 30 - 4
src/App.ku.vue

@@ -11,8 +11,7 @@ onShow(() => {
11 11
   // 所以这里需要判断一下,如果是 '/' 就当做首页,也要显示 tabbar
12 12
   if (path === '/') {
13 13
     isCurrentPageTabbar.value = true
14
-  }
15
-  else {
14
+  } else {
16 15
     isCurrentPageTabbar.value = isPageTabbar(path)
17 16
   }
18 17
 })
@@ -21,6 +20,10 @@ const helloKuRoot = ref('Hello AppKuVue')
21 20
 
22 21
 const exposeRef = ref('this is form app.Ku.vue')
23 22
 
23
+const handleAIClick = () => {
24
+  console.log('点击了')
25
+}
26
+
24 27
 defineExpose({
25 28
   exposeRef,
26 29
 })
@@ -32,9 +35,32 @@ defineExpose({
32 35
     <view class="hidden text-center">
33 36
       {{ helloKuRoot }},这里可以配置全局的东西
34 37
     </view>
35
-
36 38
     <KuRootView />
37
-
38 39
     <FgTabbar v-if="isCurrentPageTabbar" />
40
+    <view class="ai-icon" @click="handleAIClick">
41
+      <image src="/src/assets/AIimgs.gif" mode="aspectFit" />
42
+    </view>
39 43
   </view>
40 44
 </template>
45
+
46
+<style lang="scss" scoped>
47
+.ai-icon {
48
+  position: fixed;
49
+  bottom: 110rpx;
50
+  right: 20rpx;
51
+  z-index: 9999;
52
+  width: 120rpx;
53
+  height: 120rpx;
54
+  overflow: hidden;
55
+  display: flex;
56
+  align-items: center;
57
+  justify-content: center;
58
+  cursor: pointer;
59
+}
60
+
61
+.ai-icon image {
62
+  width: 100%;
63
+  height: 100%;
64
+  object-fit: cover;
65
+}
66
+</style>

BIN
src/assets/AIimgs.gif


+ 14 - 7
src/components/jiayiList/index.vue

@@ -76,9 +76,16 @@ function navigateToDetail(item) {
76 76
     urlParams += `&delayId=${item.delayId}`
77 77
   }
78 78
   if (item.detailType === 'task') {
79
-    uni.navigateTo({
80
-      url: `/pages/schedule/details/index?taskId=${item.taskId}`
81
-    })
79
+    if(item.taskId){
80
+      uni.navigateTo({
81
+        url: `/pages/schedule/details/index?id=${item.taskId}`
82
+      })
83
+    } else {
84
+      uni.showToast({
85
+        title: '任务ID不存在',
86
+        icon: 'none',
87
+      })
88
+    }
82 89
   } else {
83 90
     uni.navigateTo({
84 91
       url: `/pages/archive/order/detail${urlParams}`
@@ -151,9 +158,9 @@ function getStatusStyle(statusName: string) {
151 158
           </view>
152 159
           
153 160
           <!-- 第三行:用户名和创建时间 -->
154
-          <view class="flex justify-between items-center">
155
-            <text class="text-sm text-gray-600">{{ item.userName }}</text>
156
-            <text class="text-sm text-gray-600">{{ item.createTime }}</text>
161
+          <view class="flex items-center">
162
+            <text class="text-sm text-gray-600 flex-1 min-w-0 overflow-hidden text-ellipsis whitespace-nowrap pr-2">{{ item.userName }}</text>
163
+            <text class="text-sm text-gray-600 w-20 text-right">{{ item.createTime.split(' ')[0] }}</text>
157 164
           </view>
158 165
         </view>
159 166
       </wd-card>
@@ -240,7 +247,7 @@ function getStatusStyle(statusName: string) {
240 247
 
241 248
 .action-buttons {
242 249
   position: fixed;
243
-  bottom: 32rpx;
250
+  bottom:150rpx;
244 251
   right: 32rpx;
245 252
   display: flex;
246 253
   flex-direction: column;

+ 305 - 4
src/pages/archive/HSSE/HSSEDrill.vue

@@ -1,13 +1,314 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3 9
   title: '应急演练'
4 10
 })
11
+const typeDataData = ref<any>({
12
+  HSSEDrill: 'hsse_management',
13
+})
14
+// 应急演练数据接口
15
+interface HSSEDrill {
16
+  id: number
17
+  checkName: string
18
+  isTask: number
19
+  foundProblem: string
20
+  tags: string
21
+  suggestion: string
22
+  mainHarm: string
23
+  riskLevel: number
24
+  rectifyDeadline: string
25
+  problemImages: string
26
+  ccTo: string
27
+  registerType: string
28
+  checkStartTime: string
29
+  checkEndTime: string
30
+  stationId: number
31
+  executorName: string
32
+  createType: number
33
+  completionStatus: number
34
+}
35
+
36
+// 任务列表数据
37
+const listData = ref<HSSEDrill[]>([])
38
+const loading = ref(false)
39
+const loadingMore = ref(false)
40
+const pageNum = ref(1)
41
+const hasMore = ref(true)
42
+const perms = ref('')
43
+// 筛选相关变量
44
+const filterStationId = ref('')
45
+const filterCheckStartTime = ref('')
46
+const filterCheckEndTime = ref('')
47
+const taskName = ref('')
48
+const filterCreateType = ref('')
49
+const filterCompletionStatus = ref('')
50
+
51
+// 下拉框数据
52
+const stationList = ref<Array<{ value: string; label: string }>>([])
53
+const createTypeList = ref<Array<{ value: string; label: string }>>([
54
+  { value: '0', label: '系统' },
55
+  { value: '1', label: '新增' }
56
+])
57
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
58
+  { value: '0', label: '待完成' },
59
+  { value: '1', label: '逾期完成' },
60
+  { value: '2', label: '按时完成' }
61
+])
62
+
63
+// 获取加油站列表
64
+async function fetchStationList() {
65
+  try {
66
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
67
+    stationList.value = response.map(item => ({
68
+      value: item.id.toString(),
69
+      label: item.stationName || ''
70
+    }))
71
+  } catch (error) {
72
+    console.error('获取加油站列表失败:', error)
73
+  }
74
+}
75
+
76
+// 处理时间选择确认
77
+function handleConfirm(date: any, type: 'start' | 'end') {
78
+  let formattedDate = ''
79
+  if (typeof date === 'object' && date.value) {
80
+    const dateObj = new Date(date.value)
81
+    const year = dateObj.getFullYear()
82
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
83
+    const day = String(dateObj.getDate()).padStart(2, '0')
84
+    formattedDate = `${year}-${month}-${day} 00:00:00`
85
+  } else if (typeof date === 'number') {
86
+    const dateObj = new Date(date)
87
+    const year = dateObj.getFullYear()
88
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
89
+    const day = String(dateObj.getDate()).padStart(2, '0')
90
+    formattedDate = `${year}-${month}-${day} 00:00:00`
91
+  } else if (typeof date === 'string') {
92
+    if (date.includes('T')) {
93
+      formattedDate = date.replace('T', ' ').substring(0, 19)
94
+    } else if (date.length === 10) {
95
+      formattedDate = date + ' 00:00:00'
96
+    } else {
97
+      formattedDate = date
98
+    }
99
+  }
100
+  
101
+  if (type === 'start') {
102
+    filterCheckStartTime.value = formattedDate
103
+  } else {
104
+    filterCheckEndTime.value = formattedDate
105
+  }
106
+}
107
+
108
+// 获取任务列表数据
109
+async function fetchTaskList(isLoadMore = false) {
110
+  if (isLoadMore) {
111
+    loadingMore.value = true
112
+  } else {
113
+    loading.value = true
114
+    pageNum.value = 1
115
+    hasMore.value = true
116
+  }
117
+  try {
118
+    // 构建请求参数
119
+    const params = {
120
+      pageSize: 10,
121
+      pageNum: pageNum.value,
122
+    }
123
+    // 添加筛选条件
124
+    if (filterStationId.value) {
125
+      params.stationId = filterStationId.value
126
+    }
127
+    if (filterCheckStartTime.value) {
128
+      params.checkStartTime = filterCheckStartTime.value
129
+    }
130
+    if (filterCheckEndTime.value) {
131
+      params.checkEndTime = filterCheckEndTime.value
132
+    }
133
+    if (taskName.value) {
134
+      params.taskName = taskName.value
135
+    }
136
+    if (filterCreateType.value) {
137
+      params.createType = filterCreateType.value
138
+    }
139
+    if (filterCompletionStatus.value) {
140
+      params.completionStatus = filterCompletionStatus.value
141
+    }
142
+    params.directoryType = typeDataData.value[perms.value]
143
+    
144
+    const response = await http.get<{ rows: any[], total: number }>('/formEmergencyDrill/drill/list', params)
145
+    const newData = response.rows || []
146
+    
147
+    // 转换数据格式为组件所需的格式
148
+    const formattedData = newData.map(item => ({
149
+      detailType: 'hsseDrill',
150
+      id: item.id,
151
+      taskId: item.id,
152
+      button: '',
153
+      title: item.taskName || '',
154
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
155
+      statusClass: item.completionStatus === 0 ? 'bg-green-100 text-green-800' : item.completionStatus === 1 ? 'bg-red-100 text-red-800' : item.completionStatus === 2 ? 'bg-green-100 text-green-800' : 'bg-gray-100 text-gray-800',
156
+      userName: item.executorName + '/' + item.stationName || '',
157
+      createTime: item.processTime || item.checkTime || '',
158
+      createType: item.createType || 0,
159
+      completionStatus: item.completionStatus || 0
160
+    }))
161
+    
162
+    if (isLoadMore) {
163
+      listData.value = [...(listData.value || []), ...formattedData]
164
+    } else {
165
+      listData.value = formattedData
166
+    }
167
+    // 检查是否还有更多数据
168
+    hasMore.value = (newData || []).length === 10
169
+    // 增加页码
170
+    pageNum.value++
171
+  }
172
+  catch (error) {
173
+    uni.showToast({
174
+      title: '获取任务列表失败',
175
+      icon: 'none',
176
+    })
177
+  }
178
+  finally {
179
+    loading.value = false
180
+    loadingMore.value = false
181
+  }
182
+}
183
+
184
+// 处理刷新
185
+function handleRefresh() {
186
+  fetchTaskList()
187
+}
188
+
189
+// 处理加载更多
190
+function handleLoadMore() {
191
+  if (!loadingMore.value && hasMore.value) {
192
+    fetchTaskList(true)
193
+  }
194
+}
195
+
196
+// 筛选相关方法
197
+function handleFilter() {
198
+  console.log('筛选数据')
199
+}
200
+
201
+function handleFilterConfirm() {
202
+  console.log('筛选确定')
203
+  // 重新获取数据,应用筛选条件
204
+  fetchTaskList()
205
+}
206
+
207
+function handleFilterCancel() {
208
+  console.log('筛选取消')
209
+}
210
+
211
+function handleReset() {
212
+  console.log('重置筛选条件')
213
+  // 清空所有筛选条件
214
+  filterStationId.value = ''
215
+  filterCheckStartTime.value = ''
216
+  filterCheckEndTime.value = ''
217
+  taskName.value = ''
218
+  filterCreateType.value = ''
219
+  filterCompletionStatus.value = ''
220
+}
221
+
222
+// 页面加载时获取数据
223
+onMounted(() => {})
224
+
225
+// 页面显示时刷新数据
226
+onPageShow(() => {
227
+  // 从详情页返回时刷新数据
228
+  const pages = getCurrentPages()
229
+  const currentPage = pages[pages.length - 1]
230
+  if (currentPage.options.perms) {
231
+    perms.value = currentPage.options.perms as string
232
+    console.log('收到的 perms 参数:', perms.value)
233
+    fetchTaskList()
234
+    fetchStationList()
235
+  }
236
+})
237
+
5 238
 </script>
6 239
 
7 240
 <template>
8
-  <view class="page">
9
-    <view class="flex items-center justify-center h-full">
10
-      <text class="text-lg">应急演练页面</text>
11
-    </view>
241
+  <view class="page min-h-screen bg-gray-100">
242
+    <JiayiList
243
+      :data="listData"
244
+      @refresh="handleRefresh"
245
+      @filter="handleFilter"
246
+      @filter-confirm="handleFilterConfirm"
247
+      @filter-cancel="handleFilterCancel"
248
+      @reset="handleReset"
249
+      @load-more="handleLoadMore"
250
+    >
251
+      <template #filter-content>
252
+        <view class="p-4">
253
+          <view class="text-lg font-medium mb-4">筛选条件</view>
254
+          
255
+          <!-- 检查名称搜索 -->
256
+          <view class="mb-4">
257
+            <text class="block mb-2">任务名称</text> 
258
+            <wd-input v-model="taskName" placeholder="请输入任务名称" />
259
+          </view>
260
+          
261
+          <!-- 加油站下拉框 -->
262
+          <view class="mb-4">
263
+            <text class="block mb-2">加油站</text>
264
+            <wd-picker 
265
+              :columns="[stationList]" 
266
+              v-model="filterStationId" 
267
+            />
268
+          </view>
269
+          
270
+          <!-- 检查开始时间选择 -->
271
+          <view class="mb-4">
272
+            <text class="block mb-2">检查开始时间</text>
273
+            <view class="relative">
274
+              <wd-calendar 
275
+                v-model="filterCheckStartTime" 
276
+                @confirm="(date) => handleConfirm(date, 'start')" 
277
+              />
278
+            </view>
279
+          </view>
280
+          
281
+          <!-- 检查结束时间选择 -->
282
+          <view class="mb-4">
283
+            <text class="block mb-2">检查结束时间</text>
284
+            <view class="relative">
285
+              <wd-calendar 
286
+                v-model="filterCheckEndTime" 
287
+                @confirm="(date) => handleConfirm(date, 'end')" 
288
+              />
289
+            </view>
290
+          </view>
291
+          
292
+          <!-- 创建类型下拉框 -->
293
+          <view class="mb-4">
294
+            <text class="block mb-2">创建类型</text>
295
+            <wd-picker 
296
+              :columns="[createTypeList]" 
297
+              v-model="filterCreateType" 
298
+            />
299
+          </view>
300
+          
301
+          <!-- 完成状态下拉框 -->
302
+          <view class="mb-4">
303
+            <text class="block mb-2">完成状态</text>
304
+            <wd-picker 
305
+              :columns="[completionStatusList]" 
306
+              v-model="filterCompletionStatus" 
307
+            />
308
+          </view>
309
+          
310
+        </view>
311
+      </template>
312
+    </JiayiList>
12 313
   </view>
13 314
 </template>

+ 344 - 4
src/pages/archive/HSSE/HSSELedger.vue

@@ -1,13 +1,353 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3 9
   title: '安全隐患台账'
4 10
 })
11
+
12
+onPageShow(() => {
13
+  const pages = getCurrentPages()
14
+  const currentPage = pages[pages.length - 1]
15
+  if (currentPage.options.perms) {
16
+    perms.value = currentPage.options.perms as string
17
+    console.log('收到的 perms 参数:', perms.value)
18
+    fetchTaskList()
19
+    fetchStationList()
20
+  }
21
+})
22
+
23
+// 任务数据接口
24
+interface Task {
25
+  id: number
26
+  taskName: string
27
+  completionStatus: number
28
+  executorName: string
29
+  createTime: string
30
+  stationId: number
31
+  createType: number
32
+  processTime: string
33
+  meetingTheme: string
34
+  meetingHost: string
35
+  meetingLocation: string
36
+  attendeesCount: number
37
+  totalCount: number
38
+}
39
+
40
+// 任务列表数据
41
+const listData = ref<Task[]>([])
42
+const loading = ref(false)
43
+const loadingMore = ref(false)
44
+const pageNum = ref(1)
45
+const hasMore = ref(true)
46
+const perms = ref('')
47
+
48
+// 筛选相关变量
49
+const filterStationId = ref('')
50
+const filterProcessStartTime = ref('')
51
+const filterProcessEndTime = ref('')
52
+const filterCreateType = ref('')
53
+const filterCompletionStatus = ref('')
54
+const filterTaskName = ref('')
55
+const typeDataData = ref<any>({
56
+  HSSELedger:'hsse_management',
57
+})
58
+// 下拉框数据
59
+const stationList = ref<Array<{ value: string; label: string }>>([])
60
+const createTypeList = ref<Array<{ value: string; label: string }>>([
61
+  { value: '0', label: '系统' },
62
+  { value: '1', label: '新增' }
63
+])
64
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
65
+  { value: '0', label: '待完成' },
66
+  { value: '1', label: '按时完成' },
67
+  { value: '2', label: '逾期完成' }
68
+])
69
+
70
+// 时间选择器相关
71
+const showStartTimePicker = ref(true)
72
+const showEndTimePicker = ref(true)
73
+const calendarValue = ref('')
74
+
75
+// 获取加油站列表
76
+async function fetchStationList() {
77
+  try {
78
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
79
+    stationList.value = response.map(item => ({
80
+      value: item.id.toString(),
81
+      label: item.stationName || ''
82
+    }))
83
+    console.log(stationList.value)
84
+  } catch (error) {
85
+    console.error('获取加油站列表失败:', error)
86
+  }
87
+}
88
+
89
+// 处理时间选择确认
90
+function handleConfirm(date: any, type: 'start' | 'end') {
91
+  console.log('确认日期:', date)
92
+  
93
+  let formattedDate = ''
94
+  if (typeof date === 'object' && date.value) {
95
+    const dateObj = new Date(date.value)
96
+    const year = dateObj.getFullYear()
97
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
98
+    const day = String(dateObj.getDate()).padStart(2, '0')
99
+    formattedDate = `${year}-${month}-${day} 00:00:00`
100
+  } else if (typeof date === 'number') {
101
+    const dateObj = new Date(date)
102
+    const year = dateObj.getFullYear()
103
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
104
+    const day = String(dateObj.getDate()).padStart(2, '0')
105
+    formattedDate = `${year}-${month}-${day} 00:00:00`
106
+  } else if (typeof date === 'string') {
107
+    if (date.includes('T')) {
108
+      formattedDate = date.replace('T', ' ').substring(0, 19)
109
+    } else if (date.length === 10) {
110
+      formattedDate = date + ' 00:00:00'
111
+    } else {
112
+      formattedDate = date
113
+    }
114
+  }
115
+  console.log(formattedDate)
116
+  if (type === 'start') {
117
+    filterProcessStartTime.value = formattedDate
118
+  } else {
119
+    filterProcessEndTime.value = formattedDate
120
+  }
121
+  
122
+  calendarValue.value = formattedDate
123
+}
124
+
125
+// 获取任务列表数据
126
+async function fetchTaskList(isLoadMore = false) {
127
+  if (isLoadMore) {
128
+    loadingMore.value = true
129
+  } else {
130
+    loading.value = true
131
+    pageNum.value = 1
132
+    hasMore.value = true
133
+  }
134
+  try {
135
+    const params = {
136
+      pageSize: 10,
137
+      pageNum: pageNum.value,
138
+    }
139
+    if (filterStationId.value) {
140
+      params.stationId = filterStationId.value
141
+    }
142
+    if (filterProcessStartTime.value) {
143
+      params.processStartTime = filterProcessStartTime.value
144
+    }
145
+    
146
+    if (filterProcessEndTime.value) {
147
+      params.processEndTime = filterProcessEndTime.value
148
+    }
149
+    
150
+    if (filterCreateType.value) {
151
+      params.createType = filterCreateType.value
152
+    }
153
+    
154
+    if (filterCompletionStatus.value) {
155
+      params.completionStatus = filterCompletionStatus.value
156
+    }
157
+    
158
+    if (filterTaskName.value) {
159
+      params.taskName = filterTaskName.value
160
+    }
161
+    // params.isComplete = 0
162
+    params.directoryType = typeDataData.value[perms.value]
163
+    const response = await http.get<{ rows: any[], total: number }>('/formHiddenDangerRegister/register/list', params)
164
+    const newData = response.rows || []   
165
+    
166
+    const formattedData = newData.map(item => ({
167
+      detailType: 'task',
168
+      id: item.id,
169
+      taskId: item.taskId,
170
+      button: '',
171
+      title: item.meetingTheme || item.taskName || '',
172
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
173
+      statusClass: completionStatusList.value.find(status => status.value === item.completionStatus)?.value === '0' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800',
174
+      userName: item.executorIdName+ '/' + item.stationName || '',
175
+      createTime: item.createTime || '',
176
+      meetingHost: item.meetingHost || '',
177
+      meetingLocation: item.meetingLocation || '',
178
+      attendeesCount: item.attendeesCount || 0,
179
+      totalCount: item.totalCount || 0
180
+    }))
181
+    
182
+    if (isLoadMore) {
183
+      listData.value = [...(listData.value || []), ...formattedData]
184
+    } else {
185
+      listData.value = formattedData
186
+    }
187
+    hasMore.value = (newData || []).length === 10
188
+    pageNum.value++
189
+  }
190
+  catch (error) {
191
+    uni.showToast({
192
+      title: '获取任务列表失败',
193
+      icon: 'none',
194
+    })
195
+  }
196
+  finally {
197
+    loading.value = false
198
+    loadingMore.value = false
199
+  }
200
+}
201
+
202
+function handleRefresh() {
203
+  fetchTaskList()
204
+}
205
+
206
+function handleLoadMore() {
207
+  if (!loadingMore.value && hasMore.value) {
208
+    fetchTaskList(true)
209
+  }
210
+}
211
+
212
+function handleFilter() {
213
+  console.log('筛选数据')
214
+}
215
+
216
+function handleFilterConfirm() {
217
+  console.log('筛选确定')
218
+  fetchTaskList()
219
+}
220
+
221
+function handleFilterCancel() {
222
+  console.log('筛选取消')
223
+}
224
+
225
+function handleReset() {
226
+  console.log('重置筛选条件')
227
+  filterStationId.value = ''
228
+  filterProcessStartTime.value = ''
229
+  filterProcessEndTime.value = ''
230
+  filterCreateType.value = ''
231
+  filterCompletionStatus.value = ''
232
+  filterTaskName.value = ''
233
+}
234
+
235
+// 导航到新增页面
236
+function navigateToAddPage() {
237
+  uni.navigateTo({
238
+    url: '/pages/archive/HSSE/addHSSELedger'
239
+  })
240
+}
241
+
5 242
 </script>
6 243
 
7 244
 <template>
8
-  <view class="page">
9
-    <view class="flex items-center justify-center h-full">
10
-      <text class="text-lg">安全隐患台账页面</text>
245
+  <view class="page min-h-screen bg-gray-100">
246
+    <JiayiList
247
+      :data="listData"
248
+      @refresh="handleRefresh"
249
+      @filter="handleFilter"
250
+      @filter-confirm="handleFilterConfirm"
251
+      @filter-cancel="handleFilterCancel"
252
+      @reset="handleReset"
253
+      @load-more="handleLoadMore"
254
+    >
255
+      <template #default="{ item }">
256
+        <view class="p-4 bg-white border-b border-gray-200">
257
+          <view class="flex justify-between items-center mb-2">
258
+            <text class="text-lg font-medium">{{ item.title }}</text>
259
+            <text class="text-sm px-2 py-1 rounded" :class="item.statusClass">
260
+              {{ item.statusName }}
261
+            </text>
262
+          </view>
263
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
264
+            <text>主持人:{{ item.meetingHost }}</text>
265
+            <text>地点:{{ item.meetingLocation }}</text>
266
+          </view>
267
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
268
+            <text>参会人数:{{ item.attendeesCount }}/{{ item.totalCount }}</text>
269
+            <text>{{ item.createTime }}</text>
270
+          </view>
271
+          <view class="flex justify-start items-center text-sm text-gray-600">
272
+            <text>执行人:{{ item.executorName }}</text>
273
+          </view>
274
+        </view>
275
+      </template>
276
+      <template #filter-content>
277
+        <view class="p-4">
278
+          <view class="text-lg font-medium mb-4">筛选条件</view>
279
+          
280
+          <!-- 任务名称搜索 -->
281
+          <view class="mb-4">
282
+            <text class="block mb-2">任务名称</text>
283
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
284
+          </view>
285
+          
286
+          <!-- 加油站下拉框 -->
287
+          <view class="mb-4">
288
+            <text class="block mb-2">加油站</text>
289
+            <wd-picker 
290
+              :columns="[stationList]" 
291
+              v-model="filterStationId" 
292
+            />
293
+          </view>
294
+          
295
+          <!-- 开始时间选择 -->
296
+          <view class="mb-4">
297
+            <text class="block mb-2">开始时间</text>
298
+            <view class="relative">
299
+              <wd-calendar 
300
+                v-model="filterProcessStartTime" 
301
+                @confirm="(date) => handleConfirm(date, 'start')" 
302
+                v-if="showStartTimePicker"
303
+              />
304
+            </view>
305
+          </view>
306
+          
307
+          <!-- 结束时间选择 -->
308
+          <view class="mb-4">
309
+            <text class="block mb-2">结束时间</text>
310
+            <view class="relative">
311
+              <wd-calendar 
312
+                v-model="filterProcessEndTime" 
313
+                @confirm="(date) => handleConfirm(date, 'end')" 
314
+                v-if="showEndTimePicker"
315
+              />
316
+            </view>
317
+          </view>
318
+          
319
+          <!-- 创建类型下拉框 -->
320
+          <view class="mb-4">
321
+            <text class="block mb-2">创建类型</text>
322
+            <wd-picker 
323
+              :columns="[createTypeList]" 
324
+              v-model="filterCreateType" 
325
+            />
326
+          </view>
327
+          
328
+          <!-- 完成状态下拉框 -->
329
+          <view class="mb-4">
330
+            <text class="block mb-2">完成状态</text>
331
+            <wd-picker 
332
+              :columns="[completionStatusList]" 
333
+              v-model="filterCompletionStatus" 
334
+            />
335
+          </view>
336
+          
337
+        </view>
338
+      </template>
339
+    </JiayiList>
340
+    
341
+    <!-- 底部悬浮新增按钮 -->
342
+    <view class="fixed bottom-0 left-0 right-0">
343
+      <wd-button 
344
+        type="primary" 
345
+        size="large" 
346
+        @click="navigateToAddPage"
347
+        class="w-full"
348
+      >
349
+        新增
350
+      </wd-button>
11 351
     </view>
12 352
   </view>
13
-</template>
353
+</template>

+ 428 - 0
src/pages/archive/HSSE/addHSSELedger.vue

@@ -0,0 +1,428 @@
1
+<script setup lang="ts">
2
+import { ref, onMounted, reactive } from 'vue'
3
+import { http } from '@/utils/request'
4
+
5
+// 页面配置
6
+uni.setNavigationBarTitle({
7
+  title: '添加隐患台账'
8
+})
9
+
10
+// 表单数据
11
+const formData = reactive({
12
+  stationId: '',
13
+  checkName: '',
14
+  isTask:1,
15
+  foundProblem: '',
16
+  tags: '',
17
+  suggestion: '',
18
+  mainHarm: '',
19
+  riskLevel: 0,
20
+  rectifyDeadline: '',
21
+  problemImages: '',
22
+  ccTo: '',
23
+  executorId: ''
24
+})
25
+
26
+// 加油站列表
27
+const stationList = ref<any[]>([])
28
+// 加油站选择器列
29
+const stationColumns = ref<any[]>([])
30
+
31
+// 下拉框数据
32
+const riskLevelList = ref<Array<{ value: string; label: string }>>([
33
+  { value: '0', label: '低' },
34
+  { value: '1', label: '中' },
35
+  { value: '2', label: '高' }
36
+])
37
+const isTaskList = ref<Array<{ value: string; label: string }>>([
38
+  { value: '1', label: '是' }
39
+])
40
+const tagsList = ref<Array<{ value: string; label: string }>>([])
41
+
42
+// 用户列表(用于执行人选择)
43
+const executorList = ref<any[]>([])
44
+// 执行人选择器列
45
+const executorColumns = ref<any[]>([])
46
+
47
+// 用户列表(用于抄送人选择)
48
+const userList = ref<any[]>([])
49
+// 抄送人选择器列
50
+const userColumns = ref<any[]>([])
51
+// 选中的用户
52
+const selectedUsers = ref<any[]>([])
53
+
54
+// 附件上传
55
+const uploadFiles = ref<any[]>([])
56
+const uploadLoading = ref(false)
57
+
58
+// 页面状态
59
+const loading = ref(false)
60
+
61
+// 获取加油站列表
62
+async function fetchStationList() {
63
+  try {
64
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
65
+    stationList.value = response
66
+    // 转换为选择器列格式
67
+    stationColumns.value = response.map(item => ({
68
+      value: item.id,
69
+      label: item.stationName
70
+    }))
71
+  } catch (error) {
72
+    console.error('获取加油站列表失败:', error)
73
+    uni.showToast({
74
+      title: '获取加油站列表失败',
75
+      icon: 'none'
76
+    })
77
+  }
78
+}
79
+
80
+// 获取执行人列表
81
+async function fetchExecutorList() {
82
+  try {
83
+    if (!formData.stationId) {
84
+      return
85
+    }
86
+    const response = await http.get<any[]>('/system/user/stationList', {
87
+      stationId: formData.stationId
88
+    })
89
+    executorList.value = response
90
+    console.log(response)
91
+    
92
+    // 转换为选择器列格式
93
+    executorColumns.value = response.map(item => ({
94
+      value: item.userId,
95
+      label: item.nickName
96
+    }))
97
+     // 转换为选择器列格式
98
+    userColumns.value = response.map(item => ({
99
+      value: item.userId,
100
+      label: item.nickName
101
+    }))
102
+  } catch (error) {
103
+    console.error('获取执行人列表失败:', error)
104
+    uni.showToast({
105
+      title: '获取执行人列表失败',
106
+      icon: 'none'
107
+    })
108
+  }
109
+}
110
+
111
+
112
+
113
+// 获取标签列表
114
+async function fetchTagsList() {
115
+  try {
116
+    const response = await http.get<any[]>('/system/dict/data/type/ledger_tag')
117
+    // 转换为选择器列格式
118
+    tagsList.value = response.map(item => ({
119
+      value: item.dictCode,
120
+      label: item.dictLabel
121
+    }))
122
+  } catch (error) {
123
+    console.error('获取标签列表失败:', error)
124
+    uni.showToast({
125
+      title: '获取标签列表失败',
126
+      icon: 'none'
127
+    })
128
+  }
129
+}
130
+
131
+// 处理加油站选择
132
+function handleStationConfirm({ value }: { value: string }) {
133
+  formData.stationId = value
134
+  fetchExecutorList()
135
+}
136
+
137
+// 处理执行人选择
138
+function handleExecutorConfirm({ value }: { value: string }) {
139
+  formData.executorId = value
140
+}
141
+
142
+// 处理风险度选择
143
+function handleRiskLevelConfirm({ value }: { value: string }) {
144
+  formData.riskLevel = parseInt(value)
145
+}
146
+
147
+// 处理是否转任务选择
148
+function handleIsTaskConfirm({ value }: { value: string }) {
149
+  formData.isTask = parseInt(value)
150
+}
151
+
152
+// 处理标签选择
153
+function handleTagsConfirm({ value }: { value: string }) {
154
+  formData.tags = value
155
+}
156
+
157
+// 处理时间选择
158
+function handleDateConfirm(date: any) {
159
+  let formattedDate = ''
160
+  if (typeof date === 'object' && date.value) {
161
+    const dateObj = new Date(date.value)
162
+    const year = dateObj.getFullYear()
163
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
164
+    const day = String(dateObj.getDate()).padStart(2, '0')
165
+    const hours = String(dateObj.getHours()).padStart(2, '0')
166
+    const minutes = String(dateObj.getMinutes()).padStart(2, '0')
167
+    const seconds = String(dateObj.getSeconds()).padStart(2, '0')
168
+    formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
169
+  } else if (typeof date === 'number') {
170
+    const dateObj = new Date(date)
171
+    const year = dateObj.getFullYear()
172
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
173
+    const day = String(dateObj.getDate()).padStart(2, '0')
174
+    const hours = String(dateObj.getHours()).padStart(2, '0')
175
+    const minutes = String(dateObj.getMinutes()).padStart(2, '0')
176
+    const seconds = String(dateObj.getSeconds()).padStart(2, '0')
177
+    formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
178
+  }
179
+  formData.rectifyDeadline = formattedDate
180
+}
181
+
182
+// 处理附件上传
183
+async function handleSuccess(data: any) {
184
+  console.log('上传成功:', data.fileList)
185
+
186
+  // 更新上传文件列表
187
+  uploadFiles.value = data.fileList
188
+  // 更新附件字段,取 fileName
189
+  const fileNames = uploadFiles.value.map(f => {
190
+    try {
191
+      const response = JSON.parse(f.response)
192
+      return response.data.fileName
193
+    } catch (error) {
194
+      console.error('解析文件响应失败:', error)
195
+      return ''
196
+    }
197
+  }).filter(Boolean)
198
+  console.log('fileNames:', fileNames)
199
+  formData.problemImages = fileNames.join(',')
200
+}
201
+
202
+// 处理附件删除
203
+function handleRemoveFile(file: any) {
204
+  const index = uploadFiles.value.findIndex(f => f.url === file.url)
205
+  if (index !== -1) {
206
+    uploadFiles.value.splice(index, 1)
207
+    // 更新附件字段,取 fileName
208
+    const fileNames = uploadFiles.value.map(f => {
209
+      try {
210
+        const response = JSON.parse(f.response)
211
+        return response.data.fileName
212
+      } catch (error) {
213
+        console.error('解析文件响应失败:', error)
214
+        return ''
215
+      }
216
+    }).filter(Boolean)
217
+    
218
+    formData.problemImages = fileNames.join(',')
219
+  }
220
+}
221
+
222
+
223
+// 提交表单
224
+async function submitForm() {
225
+  // 验证表单
226
+  if (!formData.stationId) {
227
+    uni.showToast({ title: '请选择检查油站', icon: 'none' })
228
+    return
229
+  }
230
+  if (!formData.checkName) {
231
+    uni.showToast({ title: '请填写检查名称', icon: 'none' })
232
+    return
233
+  }
234
+  if (!formData.foundProblem) {
235
+    uni.showToast({ title: '请填写发现问题描述', icon: 'none' })
236
+    return
237
+  }
238
+  if (!formData.rectifyDeadline) {
239
+    uni.showToast({ title: '请选择整改截止时间', icon: 'none' })
240
+    return
241
+  }
242
+  
243
+  loading.value = true
244
+  formData.ccTo = formData.ccTo.join(',')
245
+  try {
246
+    // 提交表单数据
247
+    await http.post('/formHiddenDangerRegister/register', formData)
248
+    uni.showToast({
249
+      title: '添加隐患台账成功',
250
+      icon: 'success'
251
+    })
252
+    
253
+    // 跳转回上一页
254
+    setTimeout(() => {
255
+      uni.navigateBack()
256
+    }, 1500)
257
+  } catch (error) {
258
+    console.error('提交表单失败:', error)
259
+    uni.showToast({
260
+      title: '提交表单失败',
261
+      icon: 'none'
262
+    })
263
+  } finally {
264
+    loading.value = false
265
+  }
266
+}
267
+
268
+// 页面加载时获取数据
269
+onMounted(() => {
270
+  fetchStationList()
271
+  fetchTagsList()
272
+})</script>
273
+
274
+<template>
275
+  <view class="page min-h-screen bg-gray-100">
276
+    <view class="bg-white rounded-lg p-4 shadow-sm">
277
+      <!-- 检查油站 -->
278
+      <view class="mb-6">
279
+        <text class="block mb-2 font-medium">
280
+          <text class="text-red-500">*</text> 检查油站
281
+        </text>
282
+        <wd-picker 
283
+          :columns="[stationColumns]" 
284
+          v-model="formData.stationId" 
285
+          @confirm="handleStationConfirm"
286
+        />
287
+      </view>
288
+      
289
+      <!-- 检查名称 -->
290
+      <view class="mb-6">
291
+        <text class="block mb-2 font-medium">
292
+          <text class="text-red-500">*</text> 检查名称
293
+        </text>
294
+        <wd-input v-model="formData.checkName" placeholder="请输入检查名称" />
295
+      </view>
296
+      
297
+      <!-- 执行人 -->
298
+      <view class="mb-6">
299
+        <text class="block mb-2 font-medium">执行人</text>
300
+        <wd-picker 
301
+          :columns="[executorColumns]" 
302
+          v-model="formData.executorId" 
303
+          @confirm="handleExecutorConfirm"
304
+        />
305
+      </view>
306
+      
307
+      <!-- 是否转任务 -->
308
+      <view class="mb-6">
309
+        <text class="block mb-2 font-medium">是否转任务</text>
310
+        <wd-picker 
311
+          :columns="[isTaskList]" 
312
+          v-model="formData.isTask" 
313
+          @confirm="handleIsTaskConfirm"
314
+        />
315
+      </view>
316
+      
317
+      <!-- 发现问题描述 -->
318
+      <view class="mb-6">
319
+        <text class="block mb-2 font-medium">
320
+          <text class="text-red-500">*</text> 发现问题描述
321
+        </text>
322
+        <wd-input 
323
+          v-model="formData.foundProblem" 
324
+          placeholder="请输入发现问题描述" 
325
+          type="textarea" 
326
+          rows="4"
327
+        />
328
+      </view>
329
+      
330
+      <!-- 标签 -->
331
+      <view class="mb-6">
332
+        <text class="block mb-2 font-medium">标签</text>
333
+        <wd-picker 
334
+          :columns="[tagsList]" 
335
+          v-model="formData.tags" 
336
+          @confirm="handleTagsConfirm"
337
+        />
338
+      </view>
339
+      
340
+      <!-- 处理建议 -->
341
+      <view class="mb-6">
342
+        <text class="block mb-2 font-medium">处理建议</text>
343
+        <wd-input 
344
+          v-model="formData.suggestion" 
345
+          placeholder="请输入处理建议" 
346
+          type="textarea" 
347
+          rows="3"
348
+        />
349
+      </view>
350
+      
351
+      <!-- 主要危害描述 -->
352
+      <view class="mb-6">
353
+        <text class="block mb-2 font-medium">主要危害描述</text>
354
+        <wd-input 
355
+          v-model="formData.mainHarm" 
356
+          placeholder="请输入主要危害描述" 
357
+          type="textarea" 
358
+          rows="3"
359
+        />
360
+      </view>
361
+      
362
+      <!-- 风险度 -->
363
+      <view class="mb-6">
364
+        <text class="block mb-2 font-medium">风险度</text>
365
+        <wd-picker 
366
+          :columns="[riskLevelList]" 
367
+          v-model="formData.riskLevel" 
368
+          @confirm="handleRiskLevelConfirm"
369
+        />
370
+      </view>
371
+      
372
+      <!-- 整改截止时间 -->
373
+      <view class="mb-6">
374
+        <text class="block mb-2 font-medium">
375
+          <text class="text-red-500">*</text> 整改截止时间
376
+        </text>
377
+        <wd-calendar 
378
+          v-model="formData.rectifyDeadline" 
379
+          @confirm="handleDateConfirm" 
380
+        />
381
+      </view>
382
+      
383
+      <!-- 问题图片 -->
384
+      <view class="mb-6">
385
+        <text class="block mb-2 font-medium">问题图片</text>
386
+        <wd-upload 
387
+          v-model:file-list="uploadFiles" 
388
+          action="/common/upload"
389
+          @success="handleSuccess" 
390
+          @remove="handleRemoveFile"
391
+          :loading="uploadLoading"
392
+          multiple
393
+          accept="image/*"
394
+        />
395
+      </view>
396
+      
397
+
398
+      
399
+      <!-- 抄送人 -->
400
+      <view class="mb-6">
401
+        <text class="block mb-2 font-medium">抄送人</text>
402
+        <wd-select-picker 
403
+          v-model="formData.ccTo" 
404
+          :columns="userColumns" 
405
+          placeholder="请选择人员"
406
+        />
407
+      </view>
408
+      
409
+      <!-- 提交按钮 -->
410
+      <view class="mt-8 flex justify-center">
411
+        <wd-button 
412
+          type="primary" 
413
+          size="large" 
414
+          @click="submitForm"
415
+          :loading="loading"
416
+        >
417
+          添加隐患台账
418
+        </wd-button>
419
+      </view>
420
+    </view>
421
+  </view>
422
+</template>
423
+
424
+<style scoped>
425
+.page {
426
+  padding-bottom: 100rpx;
427
+}
428
+</style>

+ 10 - 18
src/pages/archive/cpns/checkTask.vue

@@ -57,7 +57,9 @@ const typeDataData = ref<any>({
57 57
   financeInspect:"financial",
58 58
   personnelInspect:"human_resources",
59 59
   visitorInspect:"visitor_feedback",
60
-  visitorTemporary:"visitor_feedback"
60
+  visitorTemporary:"visitor_feedback",
61
+  headOfficeInspect:'headquarters_area',
62
+  headOfficeAreaInspect:'headquarters_area',
61 63
 })
62 64
 // 下拉框数据
63 65
 const stationList = ref<Array<{ value: string; label: string }>>([])
@@ -172,9 +174,13 @@ async function fetchTaskList(isLoadMore = false) {
172 174
     }
173 175
     // params.isComplete = 0
174 176
     params.directoryType = typeDataData.value[perms.value]
175
-    if (perms.value === 'operatExcept') {
176
-      params.isAbnormal = 1
177
+    if (perms.value === 'headOfficeInspect') {
178
+       params.type='headquarters_check'
177 179
     }
180
+    if (perms.value === 'headOfficeAreaInspect') {
181
+      params.type='area_check'
182
+    }
183
+
178 184
     const response = await http.get<{ rows: any[], total: number }>('/taskCheck/check/list', params)
179 185
     const newData = response.rows || []   
180 186
     
@@ -188,7 +194,7 @@ async function fetchTaskList(isLoadMore = false) {
188 194
       statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
189 195
       statusClass: item.completionStatus === 0 ? 'bg-yellow-100 text-yellow-800' : item.completionStatus === 1 ? 'bg-red-100 text-red-800' : 'bg-green-100 text-green-800',
190 196
       userName: item.executorName+ '/' + item.stationName || '',
191
-      createTime: item.createTime || '',
197
+      createTime: item.processTime || item.createTime || '',
192 198
     }))
193 199
     
194 200
     if (isLoadMore) {
@@ -264,20 +270,6 @@ function handleReset() {
264 270
       @reset="handleReset"
265 271
       @load-more="handleLoadMore"
266 272
     >
267
-      <template #default="{ item }">
268
-        <view class="p-4 bg-white border-b border-gray-200">
269
-          <view class="flex justify-between items-center mb-2">
270
-            <text class="text-lg font-medium">{{ item.taskName }}</text>
271
-            <text class="text-sm px-2 py-1 rounded" :class="item.statusClass">
272
-              {{ item.statusName }}
273
-            </text>
274
-          </view>
275
-          <view class="flex justify-between items-center text-sm text-gray-600">
276
-            <text>执行人:{{ item.executorName }}</text>
277
-            <text>{{ item.createTime }}</text>
278
-          </view>
279
-        </view>
280
-      </template>
281 273
       <template #filter-content>
282 274
         <view class="p-4">
283 275
           <view class="text-lg font-medium mb-4">筛选条件</view>

+ 325 - 4
src/pages/archive/headOffice/headOfficeAreaInspect.vue

@@ -1,12 +1,333 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3 9
   title: '片区检查'
4 10
 })
11
+
12
+onPageShow(() => {
13
+  const pages = getCurrentPages()
14
+  const currentPage = pages[pages.length - 1]
15
+  if (currentPage.options.perms) {
16
+    perms.value = currentPage.options.perms as string
17
+    console.log('收到的 perms 参数:', perms.value)
18
+    fetchTaskList()
19
+    fetchStationList()
20
+  }
21
+})
22
+
23
+// 任务数据接口
24
+interface Task {
25
+  id: number
26
+  taskName: string
27
+  completionStatus: number
28
+  executorName: string
29
+  createTime: string
30
+  stationId: number
31
+  createType: number
32
+  processTime: string
33
+  meetingTheme: string
34
+  meetingHost: string
35
+  meetingLocation: string
36
+  attendeesCount: number
37
+  totalCount: number
38
+}
39
+
40
+// 任务列表数据
41
+const listData = ref<Task[]>([])
42
+const loading = ref(false)
43
+const loadingMore = ref(false)
44
+const pageNum = ref(1)
45
+const hasMore = ref(true)
46
+const perms = ref('')
47
+
48
+// 筛选相关变量
49
+const filterStationId = ref('')
50
+const filterProcessStartTime = ref('')
51
+const filterProcessEndTime = ref('')
52
+const filterCreateType = ref('')
53
+const filterCompletionStatus = ref('')
54
+const filterTaskName = ref('')
55
+const typeDataData = ref<any>({
56
+  headOfficeAreaInspect:'headquarters_area',
57
+})
58
+// 下拉框数据
59
+const stationList = ref<Array<{ value: string; label: string }>>([])
60
+const createTypeList = ref<Array<{ value: string; label: string }>>([
61
+  { value: '0', label: '系统' },
62
+  { value: '1', label: '新增' }
63
+])
64
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
65
+  { value: '0', label: '待完成' },
66
+  { value: '1', label: '按时完成' },
67
+  { value: '2', label: '逾期完成' }
68
+])
69
+
70
+// 时间选择器相关
71
+const showStartTimePicker = ref(true)
72
+const showEndTimePicker = ref(true)
73
+const calendarValue = ref('')
74
+
75
+// 获取加油站列表
76
+async function fetchStationList() {
77
+  try {
78
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
79
+    stationList.value = response.map(item => ({
80
+      value: item.id.toString(),
81
+      label: item.stationName || ''
82
+    }))
83
+    console.log(stationList.value)
84
+  } catch (error) {
85
+    console.error('获取加油站列表失败:', error)
86
+  }
87
+}
88
+
89
+// 处理时间选择确认
90
+function handleConfirm(date: any, type: 'start' | 'end') {
91
+  console.log('确认日期:', date)
92
+  
93
+  let formattedDate = ''
94
+  if (typeof date === 'object' && date.value) {
95
+    const dateObj = new Date(date.value)
96
+    const year = dateObj.getFullYear()
97
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
98
+    const day = String(dateObj.getDate()).padStart(2, '0')
99
+    formattedDate = `${year}-${month}-${day} 00:00:00`
100
+  } else if (typeof date === 'number') {
101
+    const dateObj = new Date(date)
102
+    const year = dateObj.getFullYear()
103
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
104
+    const day = String(dateObj.getDate()).padStart(2, '0')
105
+    formattedDate = `${year}-${month}-${day} 00:00:00`
106
+  } else if (typeof date === 'string') {
107
+    if (date.includes('T')) {
108
+      formattedDate = date.replace('T', ' ').substring(0, 19)
109
+    } else if (date.length === 10) {
110
+      formattedDate = date + ' 00:00:00'
111
+    } else {
112
+      formattedDate = date
113
+    }
114
+  }
115
+  console.log(formattedDate)
116
+  if (type === 'start') {
117
+    filterProcessStartTime.value = formattedDate
118
+  } else {
119
+    filterProcessEndTime.value = formattedDate
120
+  }
121
+  
122
+  calendarValue.value = formattedDate
123
+}
124
+
125
+// 获取任务列表数据
126
+async function fetchTaskList(isLoadMore = false) {
127
+  if (isLoadMore) {
128
+    loadingMore.value = true
129
+  } else {
130
+    loading.value = true
131
+    pageNum.value = 1
132
+    hasMore.value = true
133
+  }
134
+  try {
135
+    const params = {
136
+      pageSize: 10,
137
+      pageNum: pageNum.value,
138
+    }
139
+    if (filterStationId.value) {
140
+      params.stationId = filterStationId.value
141
+    }
142
+    if (filterProcessStartTime.value) {
143
+      params.processStartTime = filterProcessStartTime.value
144
+    }
145
+    
146
+    if (filterProcessEndTime.value) {
147
+      params.processEndTime = filterProcessEndTime.value
148
+    }
149
+    
150
+    if (filterCreateType.value) {
151
+      params.createType = filterCreateType.value
152
+    }
153
+    
154
+    if (filterCompletionStatus.value) {
155
+      params.completionStatus = filterCompletionStatus.value
156
+    }
157
+    
158
+    if (filterTaskName.value) {
159
+      params.taskName = filterTaskName.value
160
+    }
161
+    params.directoryType = typeDataData.value[perms.value]
162
+    const response = await http.get<{ rows: any[], total: number }>('/formMeetingRecords/records/list', params)
163
+    const newData = response.rows || []   
164
+    
165
+    const formattedData = newData.map(item => ({
166
+      detailType: 'task',
167
+      id: item.id,
168
+      taskId: item.taskId,
169
+      button: '',
170
+      title: item.meetingTheme || item.taskName || '',
171
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
172
+      statusClass: completionStatusList.value.find(status => status.value === item.completionStatus)?.value === '0' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800',
173
+      userName: item.executorName+ '/' + item.stationName || '',
174
+      createTime: item.createTime || '',
175
+      meetingHost: item.meetingHost || '',
176
+      meetingLocation: item.meetingLocation || '',
177
+      attendeesCount: item.attendeesCount || 0,
178
+      totalCount: item.totalCount || 0
179
+    }))
180
+    
181
+    if (isLoadMore) {
182
+      listData.value = [...(listData.value || []), ...formattedData]
183
+    } else {
184
+      listData.value = formattedData
185
+    }
186
+    hasMore.value = (newData || []).length === 10
187
+    pageNum.value++
188
+  }
189
+  catch (error) {
190
+    uni.showToast({
191
+      title: '获取任务列表失败',
192
+      icon: 'none',
193
+    })
194
+  }
195
+  finally {
196
+    loading.value = false
197
+    loadingMore.value = false
198
+  }
199
+}
200
+
201
+function handleRefresh() {
202
+  fetchTaskList()
203
+}
204
+
205
+function handleLoadMore() {
206
+  if (!loadingMore.value && hasMore.value) {
207
+    fetchTaskList(true)
208
+  }
209
+}
210
+
211
+function handleFilter() {
212
+  console.log('筛选数据')
213
+}
214
+
215
+function handleFilterConfirm() {
216
+  console.log('筛选确定')
217
+  fetchTaskList()
218
+}
219
+
220
+function handleFilterCancel() {
221
+  console.log('筛选取消')
222
+}
223
+
224
+function handleReset() {
225
+  console.log('重置筛选条件')
226
+  filterStationId.value = ''
227
+  filterProcessStartTime.value = ''
228
+  filterProcessEndTime.value = ''
229
+  filterCreateType.value = ''
230
+  filterCompletionStatus.value = ''
231
+  filterTaskName.value = ''
232
+}
233
+
5 234
 </script>
235
+
6 236
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">片区检查页面</text>
10
-    </view>
237
+  <view class="page min-h-screen bg-gray-100">
238
+    <JiayiList
239
+      :data="listData"
240
+      @refresh="handleRefresh"
241
+      @filter="handleFilter"
242
+      @filter-confirm="handleFilterConfirm"
243
+      @filter-cancel="handleFilterCancel"
244
+      @reset="handleReset"
245
+      @load-more="handleLoadMore"
246
+    >
247
+      <template #default="{ item }">
248
+        <view class="p-4 bg-white border-b border-gray-200">
249
+          <view class="flex justify-between items-center mb-2">
250
+            <text class="text-lg font-medium">{{ item.title }}</text>
251
+            <text class="text-sm px-2 py-1 rounded" :class="item.statusClass">
252
+              {{ item.statusName }}
253
+            </text>
254
+          </view>
255
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
256
+            <text>主持人:{{ item.meetingHost }}</text>
257
+            <text>地点:{{ item.meetingLocation }}</text>
258
+          </view>
259
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
260
+            <text>参会人数:{{ item.attendeesCount }}/{{ item.totalCount }}</text>
261
+            <text>{{ item.createTime }}</text>
262
+          </view>
263
+          <view class="flex justify-start items-center text-sm text-gray-600">
264
+            <text>执行人:{{ item.executorName }}</text>
265
+          </view>
266
+        </view>
267
+      </template>
268
+      <template #filter-content>
269
+        <view class="p-4">
270
+          <view class="text-lg font-medium mb-4">筛选条件</view>
271
+          
272
+          <!-- 任务名称搜索 -->
273
+          <view class="mb-4">
274
+            <text class="block mb-2">任务名称</text>
275
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
276
+          </view>
277
+          
278
+          <!-- 加油站下拉框 -->
279
+          <view class="mb-4">
280
+            <text class="block mb-2">加油站</text>
281
+            <wd-picker 
282
+              :columns="[stationList]" 
283
+              v-model="filterStationId" 
284
+            />
285
+          </view>
286
+          
287
+          <!-- 开始时间选择 -->
288
+          <view class="mb-4">
289
+            <text class="block mb-2">开始时间</text>
290
+            <view class="relative">
291
+              <wd-calendar 
292
+                v-model="filterProcessStartTime" 
293
+                @confirm="(date) => handleConfirm(date, 'start')" 
294
+                v-if="showStartTimePicker"
295
+              />
296
+            </view>
297
+          </view>
298
+          
299
+          <!-- 结束时间选择 -->
300
+          <view class="mb-4">
301
+            <text class="block mb-2">结束时间</text>
302
+            <view class="relative">
303
+              <wd-calendar 
304
+                v-model="filterProcessEndTime" 
305
+                @confirm="(date) => handleConfirm(date, 'end')" 
306
+                v-if="showEndTimePicker"
307
+              />
308
+            </view>
309
+          </view>
310
+          
311
+          <!-- 创建类型下拉框 -->
312
+          <view class="mb-4">
313
+            <text class="block mb-2">创建类型</text>
314
+            <wd-picker 
315
+              :columns="[createTypeList]" 
316
+              v-model="filterCreateType" 
317
+            />
318
+          </view>
319
+          
320
+          <!-- 完成状态下拉框 -->
321
+          <view class="mb-4">
322
+            <text class="block mb-2">完成状态</text>
323
+            <wd-picker 
324
+              :columns="[completionStatusList]" 
325
+              v-model="filterCompletionStatus" 
326
+            />
327
+          </view>
328
+          
329
+        </view>
330
+      </template>
331
+    </JiayiList>
11 332
   </view>
12 333
 </template>

+ 326 - 5
src/pages/archive/headOffice/headOfficeAreaMeet.vue

@@ -1,12 +1,333 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3
-  title: '片区会议'
9
+  title: '油站例会'
4 10
 })
11
+
12
+onPageShow(() => {
13
+  const pages = getCurrentPages()
14
+  const currentPage = pages[pages.length - 1]
15
+  if (currentPage.options.perms) {
16
+    perms.value = currentPage.options.perms as string
17
+    console.log('收到的 perms 参数:', perms.value)
18
+    fetchTaskList()
19
+    fetchStationList()
20
+  }
21
+})
22
+
23
+// 任务数据接口
24
+interface Task {
25
+  id: number
26
+  taskName: string
27
+  completionStatus: number
28
+  executorName: string
29
+  createTime: string
30
+  stationId: number
31
+  createType: number
32
+  processTime: string
33
+  meetingTheme: string
34
+  meetingHost: string
35
+  meetingLocation: string
36
+  attendeesCount: number
37
+  totalCount: number
38
+}
39
+
40
+// 任务列表数据
41
+const listData = ref<Task[]>([])
42
+const loading = ref(false)
43
+const loadingMore = ref(false)
44
+const pageNum = ref(1)
45
+const hasMore = ref(true)
46
+const perms = ref('')
47
+
48
+// 筛选相关变量
49
+const filterStationId = ref('')
50
+const filterProcessStartTime = ref('')
51
+const filterProcessEndTime = ref('')
52
+const filterCreateType = ref('')
53
+const filterCompletionStatus = ref('')
54
+const filterTaskName = ref('')
55
+const typeDataData = ref<any>({
56
+  headOfficeAreaMeet:'headquarters_area',
57
+})
58
+// 下拉框数据
59
+const stationList = ref<Array<{ value: string; label: string }>>([])
60
+const createTypeList = ref<Array<{ value: string; label: string }>>([
61
+  { value: '0', label: '系统' },
62
+  { value: '1', label: '新增' }
63
+])
64
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
65
+  { value: '0', label: '待完成' },
66
+  { value: '1', label: '按时完成' },
67
+  { value: '2', label: '逾期完成' }
68
+])
69
+
70
+// 时间选择器相关
71
+const showStartTimePicker = ref(true)
72
+const showEndTimePicker = ref(true)
73
+const calendarValue = ref('')
74
+
75
+// 获取加油站列表
76
+async function fetchStationList() {
77
+  try {
78
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
79
+    stationList.value = response.map(item => ({
80
+      value: item.id.toString(),
81
+      label: item.stationName || ''
82
+    }))
83
+    console.log(stationList.value)
84
+  } catch (error) {
85
+    console.error('获取加油站列表失败:', error)
86
+  }
87
+}
88
+
89
+// 处理时间选择确认
90
+function handleConfirm(date: any, type: 'start' | 'end') {
91
+  console.log('确认日期:', date)
92
+  
93
+  let formattedDate = ''
94
+  if (typeof date === 'object' && date.value) {
95
+    const dateObj = new Date(date.value)
96
+    const year = dateObj.getFullYear()
97
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
98
+    const day = String(dateObj.getDate()).padStart(2, '0')
99
+    formattedDate = `${year}-${month}-${day} 00:00:00`
100
+  } else if (typeof date === 'number') {
101
+    const dateObj = new Date(date)
102
+    const year = dateObj.getFullYear()
103
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
104
+    const day = String(dateObj.getDate()).padStart(2, '0')
105
+    formattedDate = `${year}-${month}-${day} 00:00:00`
106
+  } else if (typeof date === 'string') {
107
+    if (date.includes('T')) {
108
+      formattedDate = date.replace('T', ' ').substring(0, 19)
109
+    } else if (date.length === 10) {
110
+      formattedDate = date + ' 00:00:00'
111
+    } else {
112
+      formattedDate = date
113
+    }
114
+  }
115
+  console.log(formattedDate)
116
+  if (type === 'start') {
117
+    filterProcessStartTime.value = formattedDate
118
+  } else {
119
+    filterProcessEndTime.value = formattedDate
120
+  }
121
+  
122
+  calendarValue.value = formattedDate
123
+}
124
+
125
+// 获取任务列表数据
126
+async function fetchTaskList(isLoadMore = false) {
127
+  if (isLoadMore) {
128
+    loadingMore.value = true
129
+  } else {
130
+    loading.value = true
131
+    pageNum.value = 1
132
+    hasMore.value = true
133
+  }
134
+  try {
135
+    const params = {
136
+      pageSize: 10,
137
+      pageNum: pageNum.value,
138
+    }
139
+    if (filterStationId.value) {
140
+      params.stationId = filterStationId.value
141
+    }
142
+    if (filterProcessStartTime.value) {
143
+      params.processStartTime = filterProcessStartTime.value
144
+    }
145
+    
146
+    if (filterProcessEndTime.value) {
147
+      params.processEndTime = filterProcessEndTime.value
148
+    }
149
+    
150
+    if (filterCreateType.value) {
151
+      params.createType = filterCreateType.value
152
+    }
153
+    
154
+    if (filterCompletionStatus.value) {
155
+      params.completionStatus = filterCompletionStatus.value
156
+    }
157
+    
158
+    if (filterTaskName.value) {
159
+      params.taskName = filterTaskName.value
160
+    }
161
+    params.directoryType = typeDataData.value[perms.value]
162
+    const response = await http.get<{ rows: any[], total: number }>('/formMeetingRecords/records/list', params)
163
+    const newData = response.rows || []   
164
+    
165
+    const formattedData = newData.map(item => ({
166
+      detailType: 'task',
167
+      id: item.id,
168
+      taskId: item.taskId,
169
+      button: '',
170
+      title: item.meetingTheme || item.taskName || '',
171
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
172
+      statusClass: completionStatusList.value.find(status => status.value === item.completionStatus)?.value === '0' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800',
173
+      userName: item.executorName+ '/' + item.stationName || '',
174
+      createTime: item.createTime || '',
175
+      meetingHost: item.meetingHost || '',
176
+      meetingLocation: item.meetingLocation || '',
177
+      attendeesCount: item.attendeesCount || 0,
178
+      totalCount: item.totalCount || 0
179
+    }))
180
+    
181
+    if (isLoadMore) {
182
+      listData.value = [...(listData.value || []), ...formattedData]
183
+    } else {
184
+      listData.value = formattedData
185
+    }
186
+    hasMore.value = (newData || []).length === 10
187
+    pageNum.value++
188
+  }
189
+  catch (error) {
190
+    uni.showToast({
191
+      title: '获取任务列表失败',
192
+      icon: 'none',
193
+    })
194
+  }
195
+  finally {
196
+    loading.value = false
197
+    loadingMore.value = false
198
+  }
199
+}
200
+
201
+function handleRefresh() {
202
+  fetchTaskList()
203
+}
204
+
205
+function handleLoadMore() {
206
+  if (!loadingMore.value && hasMore.value) {
207
+    fetchTaskList(true)
208
+  }
209
+}
210
+
211
+function handleFilter() {
212
+  console.log('筛选数据')
213
+}
214
+
215
+function handleFilterConfirm() {
216
+  console.log('筛选确定')
217
+  fetchTaskList()
218
+}
219
+
220
+function handleFilterCancel() {
221
+  console.log('筛选取消')
222
+}
223
+
224
+function handleReset() {
225
+  console.log('重置筛选条件')
226
+  filterStationId.value = ''
227
+  filterProcessStartTime.value = ''
228
+  filterProcessEndTime.value = ''
229
+  filterCreateType.value = ''
230
+  filterCompletionStatus.value = ''
231
+  filterTaskName.value = ''
232
+}
233
+
5 234
 </script>
235
+
6 236
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">片区会议页面</text>
10
-    </view>
237
+  <view class="page min-h-screen bg-gray-100">
238
+    <JiayiList
239
+      :data="listData"
240
+      @refresh="handleRefresh"
241
+      @filter="handleFilter"
242
+      @filter-confirm="handleFilterConfirm"
243
+      @filter-cancel="handleFilterCancel"
244
+      @reset="handleReset"
245
+      @load-more="handleLoadMore"
246
+    >
247
+      <template #default="{ item }">
248
+        <view class="p-4 bg-white border-b border-gray-200">
249
+          <view class="flex justify-between items-center mb-2">
250
+            <text class="text-lg font-medium">{{ item.title }}</text>
251
+            <text class="text-sm px-2 py-1 rounded" :class="item.statusClass">
252
+              {{ item.statusName }}
253
+            </text>
254
+          </view>
255
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
256
+            <text>主持人:{{ item.meetingHost }}</text>
257
+            <text>地点:{{ item.meetingLocation }}</text>
258
+          </view>
259
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
260
+            <text>参会人数:{{ item.attendeesCount }}/{{ item.totalCount }}</text>
261
+            <text>{{ item.createTime }}</text>
262
+          </view>
263
+          <view class="flex justify-start items-center text-sm text-gray-600">
264
+            <text>执行人:{{ item.executorName }}</text>
265
+          </view>
266
+        </view>
267
+      </template>
268
+      <template #filter-content>
269
+        <view class="p-4">
270
+          <view class="text-lg font-medium mb-4">筛选条件</view>
271
+          
272
+          <!-- 任务名称搜索 -->
273
+          <view class="mb-4">
274
+            <text class="block mb-2">任务名称</text>
275
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
276
+          </view>
277
+          
278
+          <!-- 加油站下拉框 -->
279
+          <view class="mb-4">
280
+            <text class="block mb-2">加油站</text>
281
+            <wd-picker 
282
+              :columns="[stationList]" 
283
+              v-model="filterStationId" 
284
+            />
285
+          </view>
286
+          
287
+          <!-- 开始时间选择 -->
288
+          <view class="mb-4">
289
+            <text class="block mb-2">开始时间</text>
290
+            <view class="relative">
291
+              <wd-calendar 
292
+                v-model="filterProcessStartTime" 
293
+                @confirm="(date) => handleConfirm(date, 'start')" 
294
+                v-if="showStartTimePicker"
295
+              />
296
+            </view>
297
+          </view>
298
+          
299
+          <!-- 结束时间选择 -->
300
+          <view class="mb-4">
301
+            <text class="block mb-2">结束时间</text>
302
+            <view class="relative">
303
+              <wd-calendar 
304
+                v-model="filterProcessEndTime" 
305
+                @confirm="(date) => handleConfirm(date, 'end')" 
306
+                v-if="showEndTimePicker"
307
+              />
308
+            </view>
309
+          </view>
310
+          
311
+          <!-- 创建类型下拉框 -->
312
+          <view class="mb-4">
313
+            <text class="block mb-2">创建类型</text>
314
+            <wd-picker 
315
+              :columns="[createTypeList]" 
316
+              v-model="filterCreateType" 
317
+            />
318
+          </view>
319
+          
320
+          <!-- 完成状态下拉框 -->
321
+          <view class="mb-4">
322
+            <text class="block mb-2">完成状态</text>
323
+            <wd-picker 
324
+              :columns="[completionStatusList]" 
325
+              v-model="filterCompletionStatus" 
326
+            />
327
+          </view>
328
+          
329
+        </view>
330
+      </template>
331
+    </JiayiList>
11 332
   </view>
12 333
 </template>

+ 325 - 4
src/pages/archive/headOffice/headOfficeInspect.vue

@@ -1,12 +1,333 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3 9
   title: '总部检查'
4 10
 })
11
+
12
+onPageShow(() => {
13
+  const pages = getCurrentPages()
14
+  const currentPage = pages[pages.length - 1]
15
+  if (currentPage.options.perms) {
16
+    perms.value = currentPage.options.perms as string
17
+    console.log('收到的 perms 参数:', perms.value)
18
+    fetchTaskList()
19
+    fetchStationList()
20
+  }
21
+})
22
+
23
+// 任务数据接口
24
+interface Task {
25
+  id: number
26
+  taskName: string
27
+  completionStatus: number
28
+  executorName: string
29
+  createTime: string
30
+  stationId: number
31
+  createType: number
32
+  processTime: string
33
+  meetingTheme: string
34
+  meetingHost: string
35
+  meetingLocation: string
36
+  attendeesCount: number
37
+  totalCount: number
38
+}
39
+
40
+// 任务列表数据
41
+const listData = ref<Task[]>([])
42
+const loading = ref(false)
43
+const loadingMore = ref(false)
44
+const pageNum = ref(1)
45
+const hasMore = ref(true)
46
+const perms = ref('')
47
+
48
+// 筛选相关变量
49
+const filterStationId = ref('')
50
+const filterProcessStartTime = ref('')
51
+const filterProcessEndTime = ref('')
52
+const filterCreateType = ref('')
53
+const filterCompletionStatus = ref('')
54
+const filterTaskName = ref('')
55
+const typeDataData = ref<any>({
56
+  headOfficeInspect:'headquarters_area',
57
+})
58
+// 下拉框数据
59
+const stationList = ref<Array<{ value: string; label: string }>>([])
60
+const createTypeList = ref<Array<{ value: string; label: string }>>([
61
+  { value: '0', label: '系统' },
62
+  { value: '1', label: '新增' }
63
+])
64
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
65
+  { value: '0', label: '待完成' },
66
+  { value: '1', label: '按时完成' },
67
+  { value: '2', label: '逾期完成' }
68
+])
69
+
70
+// 时间选择器相关
71
+const showStartTimePicker = ref(true)
72
+const showEndTimePicker = ref(true)
73
+const calendarValue = ref('')
74
+
75
+// 获取加油站列表
76
+async function fetchStationList() {
77
+  try {
78
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
79
+    stationList.value = response.map(item => ({
80
+      value: item.id.toString(),
81
+      label: item.stationName || ''
82
+    }))
83
+    console.log(stationList.value)
84
+  } catch (error) {
85
+    console.error('获取加油站列表失败:', error)
86
+  }
87
+}
88
+
89
+// 处理时间选择确认
90
+function handleConfirm(date: any, type: 'start' | 'end') {
91
+  console.log('确认日期:', date)
92
+  
93
+  let formattedDate = ''
94
+  if (typeof date === 'object' && date.value) {
95
+    const dateObj = new Date(date.value)
96
+    const year = dateObj.getFullYear()
97
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
98
+    const day = String(dateObj.getDate()).padStart(2, '0')
99
+    formattedDate = `${year}-${month}-${day} 00:00:00`
100
+  } else if (typeof date === 'number') {
101
+    const dateObj = new Date(date)
102
+    const year = dateObj.getFullYear()
103
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
104
+    const day = String(dateObj.getDate()).padStart(2, '0')
105
+    formattedDate = `${year}-${month}-${day} 00:00:00`
106
+  } else if (typeof date === 'string') {
107
+    if (date.includes('T')) {
108
+      formattedDate = date.replace('T', ' ').substring(0, 19)
109
+    } else if (date.length === 10) {
110
+      formattedDate = date + ' 00:00:00'
111
+    } else {
112
+      formattedDate = date
113
+    }
114
+  }
115
+  console.log(formattedDate)
116
+  if (type === 'start') {
117
+    filterProcessStartTime.value = formattedDate
118
+  } else {
119
+    filterProcessEndTime.value = formattedDate
120
+  }
121
+  
122
+  calendarValue.value = formattedDate
123
+}
124
+
125
+// 获取任务列表数据
126
+async function fetchTaskList(isLoadMore = false) {
127
+  if (isLoadMore) {
128
+    loadingMore.value = true
129
+  } else {
130
+    loading.value = true
131
+    pageNum.value = 1
132
+    hasMore.value = true
133
+  }
134
+  try {
135
+    const params = {
136
+      pageSize: 10,
137
+      pageNum: pageNum.value,
138
+    }
139
+    if (filterStationId.value) {
140
+      params.stationId = filterStationId.value
141
+    }
142
+    if (filterProcessStartTime.value) {
143
+      params.processStartTime = filterProcessStartTime.value
144
+    }
145
+    
146
+    if (filterProcessEndTime.value) {
147
+      params.processEndTime = filterProcessEndTime.value
148
+    }
149
+    
150
+    if (filterCreateType.value) {
151
+      params.createType = filterCreateType.value
152
+    }
153
+    
154
+    if (filterCompletionStatus.value) {
155
+      params.completionStatus = filterCompletionStatus.value
156
+    }
157
+    
158
+    if (filterTaskName.value) {
159
+      params.taskName = filterTaskName.value
160
+    }
161
+    params.directoryType = typeDataData.value[perms.value]
162
+    const response = await http.get<{ rows: any[], total: number }>('/formMeetingRecords/records/list', params)
163
+    const newData = response.rows || []   
164
+    
165
+    const formattedData = newData.map(item => ({
166
+      detailType: 'task',
167
+      id: item.id,
168
+      taskId: item.taskId,
169
+      button: '',
170
+      title: item.meetingTheme || item.taskName || '',
171
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
172
+      statusClass: completionStatusList.value.find(status => status.value === item.completionStatus)?.value === '0' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800',
173
+      userName: item.executorName+ '/' + item.stationName || '',
174
+      createTime: item.createTime || '',
175
+      meetingHost: item.meetingHost || '',
176
+      meetingLocation: item.meetingLocation || '',
177
+      attendeesCount: item.attendeesCount || 0,
178
+      totalCount: item.totalCount || 0
179
+    }))
180
+    
181
+    if (isLoadMore) {
182
+      listData.value = [...(listData.value || []), ...formattedData]
183
+    } else {
184
+      listData.value = formattedData
185
+    }
186
+    hasMore.value = (newData || []).length === 10
187
+    pageNum.value++
188
+  }
189
+  catch (error) {
190
+    uni.showToast({
191
+      title: '获取任务列表失败',
192
+      icon: 'none',
193
+    })
194
+  }
195
+  finally {
196
+    loading.value = false
197
+    loadingMore.value = false
198
+  }
199
+}
200
+
201
+function handleRefresh() {
202
+  fetchTaskList()
203
+}
204
+
205
+function handleLoadMore() {
206
+  if (!loadingMore.value && hasMore.value) {
207
+    fetchTaskList(true)
208
+  }
209
+}
210
+
211
+function handleFilter() {
212
+  console.log('筛选数据')
213
+}
214
+
215
+function handleFilterConfirm() {
216
+  console.log('筛选确定')
217
+  fetchTaskList()
218
+}
219
+
220
+function handleFilterCancel() {
221
+  console.log('筛选取消')
222
+}
223
+
224
+function handleReset() {
225
+  console.log('重置筛选条件')
226
+  filterStationId.value = ''
227
+  filterProcessStartTime.value = ''
228
+  filterProcessEndTime.value = ''
229
+  filterCreateType.value = ''
230
+  filterCompletionStatus.value = ''
231
+  filterTaskName.value = ''
232
+}
233
+
5 234
 </script>
235
+
6 236
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">总部检查页面</text>
10
-    </view>
237
+  <view class="page min-h-screen bg-gray-100">
238
+    <JiayiList
239
+      :data="listData"
240
+      @refresh="handleRefresh"
241
+      @filter="handleFilter"
242
+      @filter-confirm="handleFilterConfirm"
243
+      @filter-cancel="handleFilterCancel"
244
+      @reset="handleReset"
245
+      @load-more="handleLoadMore"
246
+    >
247
+      <template #default="{ item }">
248
+        <view class="p-4 bg-white border-b border-gray-200">
249
+          <view class="flex justify-between items-center mb-2">
250
+            <text class="text-lg font-medium">{{ item.title }}</text>
251
+            <text class="text-sm px-2 py-1 rounded" :class="item.statusClass">
252
+              {{ item.statusName }}
253
+            </text>
254
+          </view>
255
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
256
+            <text>主持人:{{ item.meetingHost }}</text>
257
+            <text>地点:{{ item.meetingLocation }}</text>
258
+          </view>
259
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
260
+            <text>参会人数:{{ item.attendeesCount }}/{{ item.totalCount }}</text>
261
+            <text>{{ item.createTime }}</text>
262
+          </view>
263
+          <view class="flex justify-start items-center text-sm text-gray-600">
264
+            <text>执行人:{{ item.executorName }}</text>
265
+          </view>
266
+        </view>
267
+      </template>
268
+      <template #filter-content>
269
+        <view class="p-4">
270
+          <view class="text-lg font-medium mb-4">筛选条件</view>
271
+          
272
+          <!-- 任务名称搜索 -->
273
+          <view class="mb-4">
274
+            <text class="block mb-2">任务名称</text>
275
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
276
+          </view>
277
+          
278
+          <!-- 加油站下拉框 -->
279
+          <view class="mb-4">
280
+            <text class="block mb-2">加油站</text>
281
+            <wd-picker 
282
+              :columns="[stationList]" 
283
+              v-model="filterStationId" 
284
+            />
285
+          </view>
286
+          
287
+          <!-- 开始时间选择 -->
288
+          <view class="mb-4">
289
+            <text class="block mb-2">开始时间</text>
290
+            <view class="relative">
291
+              <wd-calendar 
292
+                v-model="filterProcessStartTime" 
293
+                @confirm="(date) => handleConfirm(date, 'start')" 
294
+                v-if="showStartTimePicker"
295
+              />
296
+            </view>
297
+          </view>
298
+          
299
+          <!-- 结束时间选择 -->
300
+          <view class="mb-4">
301
+            <text class="block mb-2">结束时间</text>
302
+            <view class="relative">
303
+              <wd-calendar 
304
+                v-model="filterProcessEndTime" 
305
+                @confirm="(date) => handleConfirm(date, 'end')" 
306
+                v-if="showEndTimePicker"
307
+              />
308
+            </view>
309
+          </view>
310
+          
311
+          <!-- 创建类型下拉框 -->
312
+          <view class="mb-4">
313
+            <text class="block mb-2">创建类型</text>
314
+            <wd-picker 
315
+              :columns="[createTypeList]" 
316
+              v-model="filterCreateType" 
317
+            />
318
+          </view>
319
+          
320
+          <!-- 完成状态下拉框 -->
321
+          <view class="mb-4">
322
+            <text class="block mb-2">完成状态</text>
323
+            <wd-picker 
324
+              :columns="[completionStatusList]" 
325
+              v-model="filterCompletionStatus" 
326
+            />
327
+          </view>
328
+          
329
+        </view>
330
+      </template>
331
+    </JiayiList>
11 332
   </view>
12 333
 </template>

+ 325 - 4
src/pages/archive/headOffice/headOfficeStation.vue

@@ -1,12 +1,333 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3 9
   title: '油站抽检'
4 10
 })
11
+
12
+onPageShow(() => {
13
+  const pages = getCurrentPages()
14
+  const currentPage = pages[pages.length - 1]
15
+  if (currentPage.options.perms) {
16
+    perms.value = currentPage.options.perms as string
17
+    console.log('收到的 perms 参数:', perms.value)
18
+    fetchTaskList()
19
+    fetchStationList()
20
+  }
21
+})
22
+
23
+// 任务数据接口
24
+interface Task {
25
+  id: number
26
+  taskName: string
27
+  completionStatus: number
28
+  executorName: string
29
+  createTime: string
30
+  stationId: number
31
+  createType: number
32
+  processTime: string
33
+  meetingTheme: string
34
+  meetingHost: string
35
+  meetingLocation: string
36
+  attendeesCount: number
37
+  totalCount: number
38
+}
39
+
40
+// 任务列表数据
41
+const listData = ref<Task[]>([])
42
+const loading = ref(false)
43
+const loadingMore = ref(false)
44
+const pageNum = ref(1)
45
+const hasMore = ref(true)
46
+const perms = ref('')
47
+
48
+// 筛选相关变量
49
+const filterStationId = ref('')
50
+const filterProcessStartTime = ref('')
51
+const filterProcessEndTime = ref('')
52
+const filterCreateType = ref('')
53
+const filterCompletionStatus = ref('')
54
+const filterTaskName = ref('')
55
+const typeDataData = ref<any>({
56
+  headOfficeStation:'headquarters_area',
57
+})
58
+// 下拉框数据
59
+const stationList = ref<Array<{ value: string; label: string }>>([])
60
+const createTypeList = ref<Array<{ value: string; label: string }>>([
61
+  { value: '0', label: '系统' },
62
+  { value: '1', label: '新增' }
63
+])
64
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
65
+  { value: '0', label: '待完成' },
66
+  { value: '1', label: '按时完成' },
67
+  { value: '2', label: '逾期完成' }
68
+])
69
+
70
+// 时间选择器相关
71
+const showStartTimePicker = ref(true)
72
+const showEndTimePicker = ref(true)
73
+const calendarValue = ref('')
74
+
75
+// 获取加油站列表
76
+async function fetchStationList() {
77
+  try {
78
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
79
+    stationList.value = response.map(item => ({
80
+      value: item.id.toString(),
81
+      label: item.stationName || ''
82
+    }))
83
+    console.log(stationList.value)
84
+  } catch (error) {
85
+    console.error('获取加油站列表失败:', error)
86
+  }
87
+}
88
+
89
+// 处理时间选择确认
90
+function handleConfirm(date: any, type: 'start' | 'end') {
91
+  console.log('确认日期:', date)
92
+  
93
+  let formattedDate = ''
94
+  if (typeof date === 'object' && date.value) {
95
+    const dateObj = new Date(date.value)
96
+    const year = dateObj.getFullYear()
97
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
98
+    const day = String(dateObj.getDate()).padStart(2, '0')
99
+    formattedDate = `${year}-${month}-${day} 00:00:00`
100
+  } else if (typeof date === 'number') {
101
+    const dateObj = new Date(date)
102
+    const year = dateObj.getFullYear()
103
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
104
+    const day = String(dateObj.getDate()).padStart(2, '0')
105
+    formattedDate = `${year}-${month}-${day} 00:00:00`
106
+  } else if (typeof date === 'string') {
107
+    if (date.includes('T')) {
108
+      formattedDate = date.replace('T', ' ').substring(0, 19)
109
+    } else if (date.length === 10) {
110
+      formattedDate = date + ' 00:00:00'
111
+    } else {
112
+      formattedDate = date
113
+    }
114
+  }
115
+  console.log(formattedDate)
116
+  if (type === 'start') {
117
+    filterProcessStartTime.value = formattedDate
118
+  } else {
119
+    filterProcessEndTime.value = formattedDate
120
+  }
121
+  
122
+  calendarValue.value = formattedDate
123
+}
124
+
125
+// 获取任务列表数据
126
+async function fetchTaskList(isLoadMore = false) {
127
+  if (isLoadMore) {
128
+    loadingMore.value = true
129
+  } else {
130
+    loading.value = true
131
+    pageNum.value = 1
132
+    hasMore.value = true
133
+  }
134
+  try {
135
+    const params = {
136
+      pageSize: 10,
137
+      pageNum: pageNum.value,
138
+    }
139
+    if (filterStationId.value) {
140
+      params.stationId = filterStationId.value
141
+    }
142
+    if (filterProcessStartTime.value) {
143
+      params.processStartTime = filterProcessStartTime.value
144
+    }
145
+    
146
+    if (filterProcessEndTime.value) {
147
+      params.processEndTime = filterProcessEndTime.value
148
+    }
149
+    
150
+    if (filterCreateType.value) {
151
+      params.createType = filterCreateType.value
152
+    }
153
+    
154
+    if (filterCompletionStatus.value) {
155
+      params.completionStatus = filterCompletionStatus.value
156
+    }
157
+    
158
+    if (filterTaskName.value) {
159
+      params.taskName = filterTaskName.value
160
+    }
161
+    params.directoryType = typeDataData.value[perms.value]
162
+    const response = await http.get<{ rows: any[], total: number }>('/formParticipationRecord/record/list', params)
163
+    const newData = response.rows || []   
164
+    
165
+    const formattedData = newData.map(item => ({
166
+      detailType: 'task',
167
+      id: item.id,
168
+      taskId: item.taskId,
169
+      button: '',
170
+      title: item.meetingTheme || item.taskName || '',
171
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
172
+      statusClass: completionStatusList.value.find(status => status.value === item.completionStatus)?.value === '0' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800',
173
+      userName: item.executorName+ '/' + item.stationName || '',
174
+      createTime: item.createTime || '',
175
+      meetingHost: item.meetingHost || '',
176
+      meetingLocation: item.meetingLocation || '',
177
+      attendeesCount: item.attendeesCount || 0,
178
+      totalCount: item.totalCount || 0
179
+    }))
180
+    
181
+    if (isLoadMore) {
182
+      listData.value = [...(listData.value || []), ...formattedData]
183
+    } else {
184
+      listData.value = formattedData
185
+    }
186
+    hasMore.value = (newData || []).length === 10
187
+    pageNum.value++
188
+  }
189
+  catch (error) {
190
+    uni.showToast({
191
+      title: '获取任务列表失败',
192
+      icon: 'none',
193
+    })
194
+  }
195
+  finally {
196
+    loading.value = false
197
+    loadingMore.value = false
198
+  }
199
+}
200
+
201
+function handleRefresh() {
202
+  fetchTaskList()
203
+}
204
+
205
+function handleLoadMore() {
206
+  if (!loadingMore.value && hasMore.value) {
207
+    fetchTaskList(true)
208
+  }
209
+}
210
+
211
+function handleFilter() {
212
+  console.log('筛选数据')
213
+}
214
+
215
+function handleFilterConfirm() {
216
+  console.log('筛选确定')
217
+  fetchTaskList()
218
+}
219
+
220
+function handleFilterCancel() {
221
+  console.log('筛选取消')
222
+}
223
+
224
+function handleReset() {
225
+  console.log('重置筛选条件')
226
+  filterStationId.value = ''
227
+  filterProcessStartTime.value = ''
228
+  filterProcessEndTime.value = ''
229
+  filterCreateType.value = ''
230
+  filterCompletionStatus.value = ''
231
+  filterTaskName.value = ''
232
+}
233
+
5 234
 </script>
235
+
6 236
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">油站抽检页面</text>
10
-    </view>
237
+  <view class="page min-h-screen bg-gray-100">
238
+    <JiayiList
239
+      :data="listData"
240
+      @refresh="handleRefresh"
241
+      @filter="handleFilter"
242
+      @filter-confirm="handleFilterConfirm"
243
+      @filter-cancel="handleFilterCancel"
244
+      @reset="handleReset"
245
+      @load-more="handleLoadMore"
246
+    >
247
+      <template #default="{ item }">
248
+        <view class="p-4 bg-white border-b border-gray-200">
249
+          <view class="flex justify-between items-center mb-2">
250
+            <text class="text-lg font-medium">{{ item.title }}</text>
251
+            <text class="text-sm px-2 py-1 rounded" :class="item.statusClass">
252
+              {{ item.statusName }}
253
+            </text>
254
+          </view>
255
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
256
+            <text>主持人:{{ item.meetingHost }}</text>
257
+            <text>地点:{{ item.meetingLocation }}</text>
258
+          </view>
259
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
260
+            <text>参会人数:{{ item.attendeesCount }}/{{ item.totalCount }}</text>
261
+            <text>{{ item.createTime }}</text>
262
+          </view>
263
+          <view class="flex justify-start items-center text-sm text-gray-600">
264
+            <text>执行人:{{ item.executorName }}</text>
265
+          </view>
266
+        </view>
267
+      </template>
268
+      <template #filter-content>
269
+        <view class="p-4">
270
+          <view class="text-lg font-medium mb-4">筛选条件</view>
271
+          
272
+          <!-- 任务名称搜索 -->
273
+          <view class="mb-4">
274
+            <text class="block mb-2">任务名称</text>
275
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
276
+          </view>
277
+          
278
+          <!-- 加油站下拉框 -->
279
+          <view class="mb-4">
280
+            <text class="block mb-2">加油站</text>
281
+            <wd-picker 
282
+              :columns="[stationList]" 
283
+              v-model="filterStationId" 
284
+            />
285
+          </view>
286
+          
287
+          <!-- 开始时间选择 -->
288
+          <view class="mb-4">
289
+            <text class="block mb-2">开始时间</text>
290
+            <view class="relative">
291
+              <wd-calendar 
292
+                v-model="filterProcessStartTime" 
293
+                @confirm="(date) => handleConfirm(date, 'start')" 
294
+                v-if="showStartTimePicker"
295
+              />
296
+            </view>
297
+          </view>
298
+          
299
+          <!-- 结束时间选择 -->
300
+          <view class="mb-4">
301
+            <text class="block mb-2">结束时间</text>
302
+            <view class="relative">
303
+              <wd-calendar 
304
+                v-model="filterProcessEndTime" 
305
+                @confirm="(date) => handleConfirm(date, 'end')" 
306
+                v-if="showEndTimePicker"
307
+              />
308
+            </view>
309
+          </view>
310
+          
311
+          <!-- 创建类型下拉框 -->
312
+          <view class="mb-4">
313
+            <text class="block mb-2">创建类型</text>
314
+            <wd-picker 
315
+              :columns="[createTypeList]" 
316
+              v-model="filterCreateType" 
317
+            />
318
+          </view>
319
+          
320
+          <!-- 完成状态下拉框 -->
321
+          <view class="mb-4">
322
+            <text class="block mb-2">完成状态</text>
323
+            <wd-picker 
324
+              :columns="[completionStatusList]" 
325
+              v-model="filterCompletionStatus" 
326
+            />
327
+          </view>
328
+          
329
+        </view>
330
+      </template>
331
+    </JiayiList>
11 332
   </view>
12 333
 </template>

+ 4 - 7
src/pages/archive/index.vue

@@ -2,7 +2,11 @@
2 2
 import { onMounted, ref } from 'vue'
3 3
 import { http } from '@/utils/request'
4 4
 import { toLoginPage } from '@/utils/toLoginPage'
5
+import { onPageShow } from '@dcloudio/uni-app'
5 6
 
7
+onPageShow(() => {
8
+  fetchMenuData()
9
+})
6 10
 
7 11
 definePage({
8 12
   // 使用 type: "home" 属性设置首页,其他页面不需要设置,默认为page
@@ -101,7 +105,6 @@ async function fetchMenuData() {
101 105
     loading.value = false
102 106
   }
103 107
 }
104
-
105 108
 // 处理菜单项点击
106 109
 function handleMenuItemClick(menu: MenuItem) {
107 110
   console.log(menu)
@@ -124,12 +127,6 @@ function handleMenuItemClick(menu: MenuItem) {
124 127
     })
125 128
   }
126 129
 }
127
-onMounted(async () => {
128
-  // fetchMenuData()
129
-})
130
-onLoad(async () => {
131
-  fetchMenuData()
132
-})
133 130
 </script>
134 131
 
135 132
 <template>

+ 290 - 5
src/pages/archive/operat/operatComplain.vue

@@ -1,13 +1,298 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3 9
   title: '客户投诉'
4 10
 })
11
+
12
+onPageShow(() => {
13
+  const pages = getCurrentPages()
14
+  const currentPage = pages[pages.length - 1]
15
+  if (currentPage.options.perms) {
16
+    perms.value = currentPage.options.perms as string
17
+    console.log('收到的 perms 参数:', perms.value)
18
+    fetchTaskList()
19
+    fetchStationList()
20
+  }
21
+})
22
+
23
+// 任务数据接口
24
+interface Task {
25
+  id: number
26
+  taskName: string
27
+  completionStatus: number
28
+  executorName: string
29
+  createTime: string
30
+  stationId: number
31
+  createType: number
32
+  processTime: string
33
+}
34
+const typeDataData = ref<any>({
35
+  operatComplain:'operational',
36
+})
37
+// 任务列表数据
38
+const listData = ref<Task[]>([])
39
+const loading = ref(false)
40
+const loadingMore = ref(false)
41
+const pageNum = ref(1)
42
+const hasMore = ref(true)
43
+const perms = ref('')
44
+
45
+// 筛选相关变量
46
+const filterStationId = ref('')
47
+const filterProcessStartTime = ref('')
48
+const filterProcessEndTime = ref('')
49
+const filterCreateType = ref('')
50
+const filterCompletionStatus = ref('')
51
+const filterTaskName = ref('')
52
+// 下拉框数据
53
+const stationList = ref<Array<{ value: string; label: string }>>([])
54
+const createTypeList = ref<Array<{ value: string; label: string }>>([
55
+  { value: '0', label: '系统' },
56
+  { value: '1', label: '新增' }
57
+])
58
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
59
+  { value: '0', label: '待完成' },
60
+  { value: '1', label: '逾期完成' },
61
+  { value: '2', label: '按时完成' }
62
+])
63
+
64
+// 时间选择器相关
65
+const showStartTimePicker = ref(true)
66
+const showEndTimePicker = ref(true)
67
+const calendarValue = ref('')
68
+
69
+// 获取加油站列表
70
+async function fetchStationList() {
71
+  try {
72
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
73
+    stationList.value = response.map(item => ({
74
+      value: item.id.toString(),
75
+      label: item.stationName || ''
76
+    }))
77
+    console.log(stationList.value)
78
+  } catch (error) {
79
+    console.error('获取加油站列表失败:', error)
80
+  }
81
+}
82
+
83
+// 处理时间选择确认
84
+function handleConfirm(date: any, type: 'start' | 'end') {
85
+  console.log('确认日期:', date)
86
+  
87
+  let formattedDate = ''
88
+  if (typeof date === 'object' && date.value) {
89
+    const dateObj = new Date(date.value)
90
+    const year = dateObj.getFullYear()
91
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
92
+    const day = String(dateObj.getDate()).padStart(2, '0')
93
+    formattedDate = `${year}-${month}-${day} 00:00:00`
94
+  } else if (typeof date === 'number') {
95
+    const dateObj = new Date(date)
96
+    const year = dateObj.getFullYear()
97
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
98
+    const day = String(dateObj.getDate()).padStart(2, '0')
99
+    formattedDate = `${year}-${month}-${day} 00:00:00`
100
+  } else if (typeof date === 'string') {
101
+    if (date.includes('T')) {
102
+      formattedDate = date.replace('T', ' ').substring(0, 19)
103
+    } else if (date.length === 10) {
104
+      formattedDate = date + ' 00:00:00'
105
+    } else {
106
+      formattedDate = date
107
+    }
108
+  }
109
+  console.log(formattedDate)
110
+  if (type === 'start') {
111
+    filterProcessStartTime.value = formattedDate
112
+  } else {
113
+    filterProcessEndTime.value = formattedDate
114
+  }
115
+  
116
+  calendarValue.value = formattedDate
117
+}
118
+
119
+// 获取任务列表数据
120
+async function fetchTaskList(isLoadMore = false) {
121
+  if (isLoadMore) {
122
+    loadingMore.value = true
123
+  } else {
124
+    loading.value = true
125
+    pageNum.value = 1
126
+    hasMore.value = true
127
+  }
128
+  try {
129
+    const params = {
130
+      pageSize: 10,
131
+      pageNum: pageNum.value,
132
+    }
133
+    if (filterStationId.value) {
134
+      params.stationId = filterStationId.value
135
+    }
136
+    if (filterProcessStartTime.value) {
137
+      params.processStartTime = filterProcessStartTime.value
138
+    }
139
+    
140
+    if (filterProcessEndTime.value) {
141
+      params.processEndTime = filterProcessEndTime.value
142
+    }
143
+    
144
+    if (filterCreateType.value) {
145
+      params.createType = filterCreateType.value
146
+    }
147
+    
148
+    if (filterCompletionStatus.value) {
149
+      params.completionStatus = filterCompletionStatus.value
150
+    }
151
+    params.directoryType = typeDataData.value[perms.value]
152
+    const response = await http.get<{ rows: any[], total: number }>('/taskCustomerComplaint/complaint/list', params)
153
+    const newData = response.rows || []   
154
+    
155
+    const formattedData = newData.map(item => ({
156
+      detailType: 'task',
157
+      id: item.id,
158
+      taskId: item.taskId,
159
+      button: '',
160
+      title: item.complaintChannelName || '',
161
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
162
+      statusClass: completionStatusList.value.find(status => status.value === item.completionStatus)?.value === '0' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800',
163
+      userName: item.executorIdName+ '/' + item.stationName || '',
164
+      createTime: item.createTime || '',
165
+    }))
166
+    
167
+    if (isLoadMore) {
168
+      listData.value = [...(listData.value || []), ...formattedData]
169
+    } else {
170
+      listData.value = formattedData
171
+    }
172
+    hasMore.value = (newData || []).length === 10
173
+    pageNum.value++
174
+  }
175
+  catch (error) {
176
+    uni.showToast({
177
+      title: '获取任务列表失败',
178
+      icon: 'none',
179
+    })
180
+  }
181
+  finally {
182
+    loading.value = false
183
+    loadingMore.value = false
184
+  }
185
+}
186
+
187
+function handleRefresh() {
188
+  fetchTaskList()
189
+}
190
+
191
+function handleLoadMore() {
192
+  if (!loadingMore.value && hasMore.value) {
193
+    fetchTaskList(true)
194
+  }
195
+}
196
+
197
+function handleFilter() {
198
+  console.log('筛选数据')
199
+}
200
+
201
+function handleFilterConfirm() {
202
+  console.log('筛选确定')
203
+  fetchTaskList()
204
+}
205
+
206
+function handleFilterCancel() {
207
+  console.log('筛选取消')
208
+}
209
+
210
+function handleReset() {
211
+  console.log('重置筛选条件')
212
+  filterStationId.value = ''
213
+  filterProcessStartTime.value = ''
214
+  filterProcessEndTime.value = ''
215
+  filterCreateType.value = ''
216
+  filterCompletionStatus.value = ''
217
+  filterTaskName.value = ''
218
+}
219
+
5 220
 </script>
6 221
 
7 222
 <template>
8
-  <view class="page">
9
-    <view class="flex items-center justify-center h-full">
10
-      <text class="text-lg">客户投诉页面</text>
11
-    </view>
223
+  <view class="page min-h-screen bg-gray-100">
224
+    <JiayiList
225
+      :data="listData"
226
+      @refresh="handleRefresh"
227
+      @filter="handleFilter"
228
+      @filter-confirm="handleFilterConfirm"
229
+      @filter-cancel="handleFilterCancel"
230
+      @reset="handleReset"
231
+      @load-more="handleLoadMore"
232
+    >
233
+      <template #filter-content>
234
+        <view class="p-4">
235
+          <view class="text-lg font-medium mb-4">筛选条件</view>
236
+          
237
+          <!-- 任务名称搜索 -->
238
+          <view class="mb-4">
239
+            <text class="block mb-2">任务名称</text>
240
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
241
+          </view>
242
+          
243
+          <!-- 加油站下拉框 -->
244
+          <view class="mb-4">
245
+            <text class="block mb-2">加油站</text>
246
+            <wd-picker 
247
+              :columns="[stationList]" 
248
+              v-model="filterStationId" 
249
+            />
250
+          </view>
251
+          
252
+          <!-- 开始时间选择 -->
253
+          <view class="mb-4">
254
+            <text class="block mb-2">开始时间</text>
255
+            <view class="relative">
256
+              <wd-calendar 
257
+                v-model="filterProcessStartTime" 
258
+                @confirm="(date) => handleConfirm(date, 'start')" 
259
+                v-if="showStartTimePicker"
260
+              />
261
+            </view>
262
+          </view>
263
+          
264
+          <!-- 结束时间选择 -->
265
+          <view class="mb-4">
266
+            <text class="block mb-2">结束时间</text>
267
+            <view class="relative">
268
+              <wd-calendar 
269
+                v-model="filterProcessEndTime" 
270
+                @confirm="(date) => handleConfirm(date, 'end')" 
271
+                v-if="showEndTimePicker"
272
+              />
273
+            </view>
274
+          </view>
275
+          
276
+          <!-- 创建类型下拉框 -->
277
+          <view class="mb-4">
278
+            <text class="block mb-2">创建类型</text>
279
+            <wd-picker 
280
+              :columns="[createTypeList]" 
281
+              v-model="filterCreateType" 
282
+            />
283
+          </view>
284
+          
285
+          <!-- 完成状态下拉框 -->
286
+          <view class="mb-4">
287
+            <text class="block mb-2">完成状态</text>
288
+            <wd-picker 
289
+              :columns="[completionStatusList]" 
290
+              v-model="filterCompletionStatus" 
291
+            />
292
+          </view>
293
+          
294
+        </view>
295
+      </template>
296
+    </JiayiList>
12 297
   </view>
13
-</template>
298
+</template>

+ 328 - 4
src/pages/archive/operat/operatLicenses.vue

@@ -1,13 +1,337 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3 9
   title: '证照任务管理'
4 10
 })
11
+
12
+// 证照任务数据接口
13
+interface LicenseTask {
14
+  id: number
15
+  licenseName: string
16
+  taskType: string
17
+  taskName: string
18
+  executorName: string
19
+  stationId: number
20
+  createType: number
21
+  deadline: string
22
+  processTime: string
23
+  completionStatus: number
24
+}
25
+const typeDataData = ref<any>({
26
+  operatLicenses:'operational',
27
+})
28
+// 任务列表数据
29
+const listData = ref<LicenseTask[]>([])
30
+const loading = ref(false)
31
+const loadingMore = ref(false)
32
+const pageNum = ref(1)
33
+const hasMore = ref(true)
34
+const perms = ref('')
35
+
36
+
37
+// 筛选相关变量
38
+const filterStationId = ref('')
39
+const filterProcessStartTime = ref('')
40
+const filterProcessEndTime = ref('')
41
+const filterCreateType = ref('')
42
+const filterCompletionStatus = ref('')
43
+const filterTaskName = ref('')
44
+const filterLicenseName = ref('')
45
+const filterTaskType = ref('')
46
+
47
+// 下拉框数据
48
+const stationList = ref<Array<{ value: string; label: string }>>([])
49
+const createTypeList = ref<Array<{ value: string; label: string }>>([
50
+  { value: '0', label: '系统' },
51
+  { value: '1', label: '新增' }
52
+])
53
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
54
+  { value: '0', label: '待完成' },
55
+  { value: '1', label: '逾期完成' },
56
+  { value: '2', label: '按时完成' }
57
+])
58
+const taskTypeList = ref<Array<{ value: string; label: string }>>([
59
+  { value: '年审任务', label: '年审任务' },
60
+  { value: '换证任务', label: '换证任务' }
61
+])
62
+
63
+// 获取加油站列表
64
+async function fetchStationList() {
65
+  try {
66
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
67
+    stationList.value = response.map(item => ({
68
+      value: item.id.toString(),
69
+      label: item.stationName || ''
70
+    }))
71
+  } catch (error) {
72
+    console.error('获取加油站列表失败:', error)
73
+  }
74
+}
75
+
76
+// 处理时间选择确认
77
+function handleConfirm(date: any, type: 'start' | 'end') {
78
+  let formattedDate = ''
79
+  if (typeof date === 'object' && date.value) {
80
+    const dateObj = new Date(date.value)
81
+    const year = dateObj.getFullYear()
82
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
83
+    const day = String(dateObj.getDate()).padStart(2, '0')
84
+    formattedDate = `${year}-${month}-${day} 00:00:00`
85
+  } else if (typeof date === 'number') {
86
+    const dateObj = new Date(date)
87
+    const year = dateObj.getFullYear()
88
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
89
+    const day = String(dateObj.getDate()).padStart(2, '0')
90
+    formattedDate = `${year}-${month}-${day} 00:00:00`
91
+  } else if (typeof date === 'string') {
92
+    if (date.includes('T')) {
93
+      formattedDate = date.replace('T', ' ').substring(0, 19)
94
+    } else if (date.length === 10) {
95
+      formattedDate = date + ' 00:00:00'
96
+    } else {
97
+      formattedDate = date
98
+    }
99
+  }
100
+  
101
+  if (type === 'start') {
102
+    filterProcessStartTime.value = formattedDate
103
+  } else {
104
+    filterProcessEndTime.value = formattedDate
105
+  }
106
+}
107
+
108
+// 获取任务列表数据
109
+async function fetchTaskList(isLoadMore = false) {
110
+  if (isLoadMore) {
111
+    loadingMore.value = true
112
+  } else {
113
+    loading.value = true
114
+    pageNum.value = 1
115
+    hasMore.value = true
116
+  }
117
+  try {
118
+    // 构建请求参数
119
+    const params = {
120
+      pageSize: 10,
121
+      pageNum: pageNum.value,
122
+    }
123
+    // 添加筛选条件
124
+    if (filterStationId.value) {
125
+      params.stationId = filterStationId.value
126
+    }
127
+    if (filterProcessStartTime.value) {
128
+      params.processStartTime = filterProcessStartTime.value
129
+    }
130
+    if (filterProcessEndTime.value) {
131
+      params.processEndTime = filterProcessEndTime.value
132
+    }
133
+    if (filterCreateType.value) {
134
+      params.createType = filterCreateType.value
135
+    }
136
+    if (filterCompletionStatus.value) {
137
+      params.completionStatus = filterCompletionStatus.value
138
+    }
139
+    if (filterTaskName.value) {
140
+      params.taskName = filterTaskName.value
141
+    }
142
+    if (filterLicenseName.value) {
143
+      params.licenseName = filterLicenseName.value
144
+    }
145
+    if (filterTaskType.value) {
146
+      params.taskType = filterTaskType.value
147
+    }
148
+    params.directoryType = typeDataData.value[perms.value]
149
+    const response = await http.get<{ rows: any[], total: number }>('/formLicense/license/list', params)
150
+    const newData = response.rows || []
151
+    
152
+    // 转换数据格式为组件所需的格式
153
+    const formattedData = newData.map(item => ({
154
+      detailType: 'task',
155
+      id: item.id,
156
+      taskId: item.taskId,
157
+      button: '',
158
+      title: item.taskName || '',
159
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
160
+      statusClass: item.completionStatus === 0 ? 'bg-green-100 text-green-800' : item.completionStatus === 1 ? 'bg-red-100 text-red-800' : 'bg-green-100 text-green-800',
161
+      userName: item.executorIdName || '',
162
+      createTime: item.deadline || '',
163
+      licenseName: item.licenseName || '',
164
+      taskType: item.taskType || ''
165
+    }))
166
+    
167
+    if (isLoadMore) {
168
+      listData.value = [...(listData.value || []), ...formattedData]
169
+    } else {
170
+      listData.value = formattedData
171
+    }
172
+    // 检查是否还有更多数据
173
+    hasMore.value = (newData || []).length === 10
174
+    // 增加页码
175
+    pageNum.value++
176
+  }
177
+  catch (error) {
178
+    uni.showToast({
179
+      title: '获取任务列表失败',
180
+      icon: 'none',
181
+    })
182
+  }
183
+  finally {
184
+    loading.value = false
185
+    loadingMore.value = false
186
+  }
187
+}
188
+
189
+// 处理刷新
190
+function handleRefresh() {
191
+  fetchTaskList()
192
+}
193
+
194
+// 处理加载更多
195
+function handleLoadMore() {
196
+  if (!loadingMore.value && hasMore.value) {
197
+    fetchTaskList(true)
198
+  }
199
+}
200
+
201
+// 筛选相关方法
202
+function handleFilter() {
203
+  console.log('筛选数据')
204
+}
205
+
206
+function handleFilterConfirm() {
207
+  console.log('筛选确定')
208
+  // 重新获取数据,应用筛选条件
209
+  fetchTaskList()
210
+}
211
+
212
+function handleFilterCancel() {
213
+  console.log('筛选取消')
214
+}
215
+
216
+function handleReset() {
217
+  console.log('重置筛选条件')
218
+  // 清空所有筛选条件
219
+  filterStationId.value = ''
220
+  filterProcessStartTime.value = ''
221
+  filterProcessEndTime.value = ''
222
+  filterCreateType.value = ''
223
+  filterCompletionStatus.value = ''
224
+  filterTaskName.value = ''
225
+  filterLicenseName.value = ''
226
+  filterTaskType.value = ''
227
+}
228
+
229
+// 页面加载时获取数据
230
+onMounted(() => {})
231
+
232
+// 页面显示时刷新数据
233
+onPageShow(() => {
234
+  const pages = getCurrentPages()
235
+  const currentPage = pages[pages.length - 1]
236
+  if (currentPage.options.perms) {
237
+    perms.value = currentPage.options.perms as string
238
+    console.log('收到的 perms 参数:', perms.value)
239
+    fetchTaskList()
240
+    fetchStationList()
241
+  }
242
+})
243
+
244
+
245
+
5 246
 </script>
6 247
 
7 248
 <template>
8
-  <view class="page">
9
-    <view class="flex items-center justify-center h-full">
10
-      <text class="text-lg">证照任务管理页面</text>
11
-    </view>
249
+  <view class="page min-h-screen bg-gray-100">
250
+    <JiayiList
251
+      :data="listData"
252
+      @refresh="handleRefresh"
253
+      @filter="handleFilter"
254
+      @filter-confirm="handleFilterConfirm"
255
+      @filter-cancel="handleFilterCancel"
256
+      @reset="handleReset"
257
+      @load-more="handleLoadMore"
258
+    >
259
+      <template #filter-content>
260
+        <view class="p-4">
261
+          <view class="text-lg font-medium mb-4">筛选条件</view>
262
+          
263
+          <!-- 任务名称搜索 -->
264
+          <view class="mb-4">
265
+            <text class="block mb-2">任务名称</text>
266
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
267
+          </view>
268
+          
269
+          <!-- 证照名称搜索 -->
270
+          <view class="mb-4">
271
+            <text class="block mb-2">证照名称</text>
272
+            <wd-input v-model="filterLicenseName" placeholder="请输入证照名称" />
273
+          </view>
274
+          
275
+          <!-- 任务类型 -->
276
+          <view class="mb-4">
277
+            <text class="block mb-2">任务类型</text>
278
+            <wd-picker 
279
+              :columns="[taskTypeList]" 
280
+              v-model="filterTaskType" 
281
+            />
282
+          </view>
283
+          
284
+          <!-- 加油站下拉框 -->
285
+          <view class="mb-4">
286
+            <text class="block mb-2">加油站</text>
287
+            <wd-picker 
288
+              :columns="[stationList]" 
289
+              v-model="filterStationId" 
290
+            />
291
+          </view>
292
+          
293
+          <!-- 开始时间选择 -->
294
+          <view class="mb-4">
295
+            <text class="block mb-2">开始时间</text>
296
+            <view class="relative">
297
+              <wd-calendar 
298
+                v-model="filterProcessStartTime" 
299
+                @confirm="(date) => handleConfirm(date, 'start')" 
300
+              />
301
+            </view>
302
+          </view>
303
+          
304
+          <!-- 结束时间选择 -->
305
+          <view class="mb-4">
306
+            <text class="block mb-2">结束时间</text>
307
+            <view class="relative">
308
+              <wd-calendar 
309
+                v-model="filterProcessEndTime" 
310
+                @confirm="(date) => handleConfirm(date, 'end')" 
311
+              />
312
+            </view>
313
+          </view>
314
+          
315
+          <!-- 创建类型下拉框 -->
316
+          <view class="mb-4">
317
+            <text class="block mb-2">创建类型</text>
318
+            <wd-picker 
319
+              :columns="[createTypeList]" 
320
+              v-model="filterCreateType" 
321
+            />
322
+          </view>
323
+          
324
+          <!-- 完成状态下拉框 -->
325
+          <view class="mb-4">
326
+            <text class="block mb-2">完成状态</text>
327
+            <wd-picker 
328
+              :columns="[completionStatusList]" 
329
+              v-model="filterCompletionStatus" 
330
+            />
331
+          </view>
332
+          
333
+        </view>
334
+      </template>
335
+    </JiayiList>
12 336
   </view>
13 337
 </template>

+ 4 - 1
src/pages/archive/operat/operatManage.vue

@@ -8,7 +8,9 @@ import { http } from '@/utils/request'
8 8
 definePage({
9 9
   title: '管理计划'
10 10
 })
11
-
11
+const typeDataData = ref<any>({
12
+  operatManage:'operational',
13
+})
12 14
 onPageShow(() => {
13 15
   const pages = getCurrentPages()
14 16
   const currentPage = pages[pages.length - 1]
@@ -152,6 +154,7 @@ async function fetchTaskList(isLoadMore = false) {
152 154
     if (filterTaskName.value) {
153 155
       params.taskName = filterTaskName.value
154 156
     }
157
+    params.directoryType = typeDataData.value[perms.value]
155 158
     // params.isComplete = 0
156 159
     const response = await http.get<{ rows: any[], total: number }>('/formManagementPlan/plan/list', params)
157 160
     const newData = response.rows || []   

+ 325 - 5
src/pages/archive/operat/operatMeet.vue

@@ -1,13 +1,333 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3 9
   title: '油站例会'
4 10
 })
11
+
12
+onPageShow(() => {
13
+  const pages = getCurrentPages()
14
+  const currentPage = pages[pages.length - 1]
15
+  if (currentPage.options.perms) {
16
+    perms.value = currentPage.options.perms as string
17
+    console.log('收到的 perms 参数:', perms.value)
18
+    fetchTaskList()
19
+    fetchStationList()
20
+  }
21
+})
22
+
23
+// 任务数据接口
24
+interface Task {
25
+  id: number
26
+  taskName: string
27
+  completionStatus: number
28
+  executorName: string
29
+  createTime: string
30
+  stationId: number
31
+  createType: number
32
+  processTime: string
33
+  meetingTheme: string
34
+  meetingHost: string
35
+  meetingLocation: string
36
+  attendeesCount: number
37
+  totalCount: number
38
+}
39
+
40
+// 任务列表数据
41
+const listData = ref<Task[]>([])
42
+const loading = ref(false)
43
+const loadingMore = ref(false)
44
+const pageNum = ref(1)
45
+const hasMore = ref(true)
46
+const perms = ref('')
47
+
48
+// 筛选相关变量
49
+const filterStationId = ref('')
50
+const filterProcessStartTime = ref('')
51
+const filterProcessEndTime = ref('')
52
+const filterCreateType = ref('')
53
+const filterCompletionStatus = ref('')
54
+const filterTaskName = ref('')
55
+const typeDataData = ref<any>({
56
+  operatMeet:'operational',
57
+})
58
+// 下拉框数据
59
+const stationList = ref<Array<{ value: string; label: string }>>([])
60
+const createTypeList = ref<Array<{ value: string; label: string }>>([
61
+  { value: '0', label: '系统' },
62
+  { value: '1', label: '新增' }
63
+])
64
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
65
+  { value: '0', label: '待完成' },
66
+  { value: '1', label: '按时完成' },
67
+  { value: '2', label: '逾期完成' }
68
+])
69
+
70
+// 时间选择器相关
71
+const showStartTimePicker = ref(true)
72
+const showEndTimePicker = ref(true)
73
+const calendarValue = ref('')
74
+
75
+// 获取加油站列表
76
+async function fetchStationList() {
77
+  try {
78
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
79
+    stationList.value = response.map(item => ({
80
+      value: item.id.toString(),
81
+      label: item.stationName || ''
82
+    }))
83
+    console.log(stationList.value)
84
+  } catch (error) {
85
+    console.error('获取加油站列表失败:', error)
86
+  }
87
+}
88
+
89
+// 处理时间选择确认
90
+function handleConfirm(date: any, type: 'start' | 'end') {
91
+  console.log('确认日期:', date)
92
+  
93
+  let formattedDate = ''
94
+  if (typeof date === 'object' && date.value) {
95
+    const dateObj = new Date(date.value)
96
+    const year = dateObj.getFullYear()
97
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
98
+    const day = String(dateObj.getDate()).padStart(2, '0')
99
+    formattedDate = `${year}-${month}-${day} 00:00:00`
100
+  } else if (typeof date === 'number') {
101
+    const dateObj = new Date(date)
102
+    const year = dateObj.getFullYear()
103
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
104
+    const day = String(dateObj.getDate()).padStart(2, '0')
105
+    formattedDate = `${year}-${month}-${day} 00:00:00`
106
+  } else if (typeof date === 'string') {
107
+    if (date.includes('T')) {
108
+      formattedDate = date.replace('T', ' ').substring(0, 19)
109
+    } else if (date.length === 10) {
110
+      formattedDate = date + ' 00:00:00'
111
+    } else {
112
+      formattedDate = date
113
+    }
114
+  }
115
+  console.log(formattedDate)
116
+  if (type === 'start') {
117
+    filterProcessStartTime.value = formattedDate
118
+  } else {
119
+    filterProcessEndTime.value = formattedDate
120
+  }
121
+  
122
+  calendarValue.value = formattedDate
123
+}
124
+
125
+// 获取任务列表数据
126
+async function fetchTaskList(isLoadMore = false) {
127
+  if (isLoadMore) {
128
+    loadingMore.value = true
129
+  } else {
130
+    loading.value = true
131
+    pageNum.value = 1
132
+    hasMore.value = true
133
+  }
134
+  try {
135
+    const params = {
136
+      pageSize: 10,
137
+      pageNum: pageNum.value,
138
+    }
139
+    if (filterStationId.value) {
140
+      params.stationId = filterStationId.value
141
+    }
142
+    if (filterProcessStartTime.value) {
143
+      params.processStartTime = filterProcessStartTime.value
144
+    }
145
+    
146
+    if (filterProcessEndTime.value) {
147
+      params.processEndTime = filterProcessEndTime.value
148
+    }
149
+    
150
+    if (filterCreateType.value) {
151
+      params.createType = filterCreateType.value
152
+    }
153
+    
154
+    if (filterCompletionStatus.value) {
155
+      params.completionStatus = filterCompletionStatus.value
156
+    }
157
+    
158
+    if (filterTaskName.value) {
159
+      params.taskName = filterTaskName.value
160
+    }
161
+    params.directoryType = typeDataData.value[perms.value]
162
+    const response = await http.get<{ rows: any[], total: number }>('/formMeetingRecords/records/list', params)
163
+    const newData = response.rows || []   
164
+    
165
+    const formattedData = newData.map(item => ({
166
+      detailType: 'task',
167
+      id: item.id,
168
+      taskId: item.taskId,
169
+      button: '',
170
+      title: item.meetingTheme || item.taskName || '',
171
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
172
+      statusClass: completionStatusList.value.find(status => status.value === item.completionStatus)?.value === '0' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800',
173
+      userName: item.executorName+ '/' + item.stationName || '',
174
+      createTime: item.createTime || '',
175
+      meetingHost: item.meetingHost || '',
176
+      meetingLocation: item.meetingLocation || '',
177
+      attendeesCount: item.attendeesCount || 0,
178
+      totalCount: item.totalCount || 0
179
+    }))
180
+    
181
+    if (isLoadMore) {
182
+      listData.value = [...(listData.value || []), ...formattedData]
183
+    } else {
184
+      listData.value = formattedData
185
+    }
186
+    hasMore.value = (newData || []).length === 10
187
+    pageNum.value++
188
+  }
189
+  catch (error) {
190
+    uni.showToast({
191
+      title: '获取任务列表失败',
192
+      icon: 'none',
193
+    })
194
+  }
195
+  finally {
196
+    loading.value = false
197
+    loadingMore.value = false
198
+  }
199
+}
200
+
201
+function handleRefresh() {
202
+  fetchTaskList()
203
+}
204
+
205
+function handleLoadMore() {
206
+  if (!loadingMore.value && hasMore.value) {
207
+    fetchTaskList(true)
208
+  }
209
+}
210
+
211
+function handleFilter() {
212
+  console.log('筛选数据')
213
+}
214
+
215
+function handleFilterConfirm() {
216
+  console.log('筛选确定')
217
+  fetchTaskList()
218
+}
219
+
220
+function handleFilterCancel() {
221
+  console.log('筛选取消')
222
+}
223
+
224
+function handleReset() {
225
+  console.log('重置筛选条件')
226
+  filterStationId.value = ''
227
+  filterProcessStartTime.value = ''
228
+  filterProcessEndTime.value = ''
229
+  filterCreateType.value = ''
230
+  filterCompletionStatus.value = ''
231
+  filterTaskName.value = ''
232
+}
233
+
5 234
 </script>
6 235
 
7 236
 <template>
8
-  <view class="page">
9
-    <view class="flex items-center justify-center h-full">
10
-      <text class="text-lg">油站例会页面</text>
11
-    </view>
237
+  <view class="page min-h-screen bg-gray-100">
238
+    <JiayiList
239
+      :data="listData"
240
+      @refresh="handleRefresh"
241
+      @filter="handleFilter"
242
+      @filter-confirm="handleFilterConfirm"
243
+      @filter-cancel="handleFilterCancel"
244
+      @reset="handleReset"
245
+      @load-more="handleLoadMore"
246
+    >
247
+      <template #default="{ item }">
248
+        <view class="p-4 bg-white border-b border-gray-200">
249
+          <view class="flex justify-between items-center mb-2">
250
+            <text class="text-lg font-medium">{{ item.title }}</text>
251
+            <text class="text-sm px-2 py-1 rounded" :class="item.statusClass">
252
+              {{ item.statusName }}
253
+            </text>
254
+          </view>
255
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
256
+            <text>主持人:{{ item.meetingHost }}</text>
257
+            <text>地点:{{ item.meetingLocation }}</text>
258
+          </view>
259
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
260
+            <text>参会人数:{{ item.attendeesCount }}/{{ item.totalCount }}</text>
261
+            <text>{{ item.createTime }}</text>
262
+          </view>
263
+          <view class="flex justify-start items-center text-sm text-gray-600">
264
+            <text>执行人:{{ item.executorName }}</text>
265
+          </view>
266
+        </view>
267
+      </template>
268
+      <template #filter-content>
269
+        <view class="p-4">
270
+          <view class="text-lg font-medium mb-4">筛选条件</view>
271
+          
272
+          <!-- 任务名称搜索 -->
273
+          <view class="mb-4">
274
+            <text class="block mb-2">任务名称</text>
275
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
276
+          </view>
277
+          
278
+          <!-- 加油站下拉框 -->
279
+          <view class="mb-4">
280
+            <text class="block mb-2">加油站</text>
281
+            <wd-picker 
282
+              :columns="[stationList]" 
283
+              v-model="filterStationId" 
284
+            />
285
+          </view>
286
+          
287
+          <!-- 开始时间选择 -->
288
+          <view class="mb-4">
289
+            <text class="block mb-2">开始时间</text>
290
+            <view class="relative">
291
+              <wd-calendar 
292
+                v-model="filterProcessStartTime" 
293
+                @confirm="(date) => handleConfirm(date, 'start')" 
294
+                v-if="showStartTimePicker"
295
+              />
296
+            </view>
297
+          </view>
298
+          
299
+          <!-- 结束时间选择 -->
300
+          <view class="mb-4">
301
+            <text class="block mb-2">结束时间</text>
302
+            <view class="relative">
303
+              <wd-calendar 
304
+                v-model="filterProcessEndTime" 
305
+                @confirm="(date) => handleConfirm(date, 'end')" 
306
+                v-if="showEndTimePicker"
307
+              />
308
+            </view>
309
+          </view>
310
+          
311
+          <!-- 创建类型下拉框 -->
312
+          <view class="mb-4">
313
+            <text class="block mb-2">创建类型</text>
314
+            <wd-picker 
315
+              :columns="[createTypeList]" 
316
+              v-model="filterCreateType" 
317
+            />
318
+          </view>
319
+          
320
+          <!-- 完成状态下拉框 -->
321
+          <view class="mb-4">
322
+            <text class="block mb-2">完成状态</text>
323
+            <wd-picker 
324
+              :columns="[completionStatusList]" 
325
+              v-model="filterCompletionStatus" 
326
+            />
327
+          </view>
328
+          
329
+        </view>
330
+      </template>
331
+    </JiayiList>
12 332
   </view>
13
-</template>
333
+</template>

+ 4 - 1
src/pages/archive/operat/operatPlan.vue

@@ -8,7 +8,9 @@ import { http } from '@/utils/request'
8 8
 definePage({
9 9
   title: '经营计划'
10 10
 })
11
-
11
+const typeDataData = ref<any>({
12
+  operatPlan:'operational',
13
+})
12 14
 onPageShow(() => {
13 15
   const pages = getCurrentPages()
14 16
   const currentPage = pages[pages.length - 1]
@@ -152,6 +154,7 @@ async function fetchTaskList(isLoadMore = false) {
152 154
     if (filterTaskName.value) {
153 155
       params.taskName = filterTaskName.value
154 156
     }
157
+    params.directoryType = typeDataData.value[perms.value]
155 158
     // params.isComplete = 0
156 159
     const response = await http.get<{ rows: any[], total: number }>('/formBusinessPlan/plan/list', params)
157 160
     const newData = response.rows || []   

+ 2 - 11
src/pages/archive/operat/operatPrice.vue

@@ -51,14 +51,7 @@ const filterSurveyDateStart = ref('')
51 51
 const filterSurveyDateEnd = ref('')
52 52
 const filterTaskName = ref('')
53 53
 const typeDataData = ref<any>({
54
-  operatInspect:'operational',
55
-  operatExcept:'operational',
56
-  HSSEInspect: 'hsse_management',
57
-  qualityInspect:'data_quality',
58
-  financeInspect:"financial",
59
-  personnelInspect:"human_resources",
60
-  visitorInspect:"visitor_feedback",
61
-  visitorTemporary:"visitor_feedback"
54
+  operatPrice:'operational',
62 55
 })
63 56
 // 下拉框数据
64 57
 const stationList = ref<Array<{ value: string; label: string }>>([])
@@ -182,9 +175,7 @@ async function fetchTaskList(isLoadMore = false) {
182 175
     }
183 176
     // params.isComplete = 0
184 177
     params.directoryType = typeDataData.value[perms.value]
185
-    if (perms.value === 'operatExcept') {
186
-      params.isAbnormal = 1
187
-    }
178
+
188 179
     const response = await http.get<{ data: any[], total: number }>('/formCompetitorMarketingSurvey/survey/list', params)
189 180
     const newData = response.data || []   
190 181
     

+ 1 - 11
src/pages/archive/operat/operatSales.vue

@@ -48,14 +48,7 @@ const filterSurveyDateStart = ref('')
48 48
 const filterSurveyDateEnd = ref('')
49 49
 const filterTaskName = ref('')
50 50
 const typeDataData = ref<any>({
51
-  operatInspect:'operational',
52
-  operatExcept:'operational',
53
-  HSSEInspect: 'hsse_management',
54
-  qualityInspect:'data_quality',
55
-  financeInspect:"financial",
56
-  personnelInspect:"human_resources",
57
-  visitorInspect:"visitor_feedback",
58
-  visitorTemporary:"visitor_feedback"
51
+  operatSales:'operational',
59 52
 })
60 53
 // 下拉框数据
61 54
 const stationList = ref<Array<{ value: string; label: string }>>([])
@@ -162,9 +155,6 @@ async function fetchTaskList(isLoadMore = false) {
162 155
       params.taskName = filterTaskName.value
163 156
     }
164 157
     params.directoryType = typeDataData.value[perms.value]
165
-    if (perms.value === 'operatExcept') {
166
-      params.isAbnormal = 1
167
-    }
168 158
     const response = await http.get<{ data: any[], total: number }>('/formCompetitorSalesSurvey/survey/list', params)
169 159
     const newData = response.rows || []   
170 160
     

+ 308 - 4
src/pages/archive/operat/operatTeam.vue

@@ -1,13 +1,317 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3 9
   title: '班组日志'
4 10
 })
11
+
12
+// 班组日志数据接口
13
+interface TeamLog {
14
+  id: number
15
+  taskName: string
16
+  executorName: string
17
+  stationId: number
18
+  createType: number
19
+  deadline: string
20
+  processTime: string
21
+  completionStatus: number
22
+  shiftDate: string
23
+  shiftId: string
24
+  weather: string
25
+  shiftLeaderName: string
26
+  shiftMembers: string
27
+}
28
+
29
+// 任务列表数据
30
+const listData = ref<TeamLog[]>([])
31
+const loading = ref(false)
32
+const loadingMore = ref(false)
33
+const pageNum = ref(1)
34
+const hasMore = ref(true)
35
+const perms = ref('')
36
+const typeDataData = ref<any>({
37
+  operatTeam:'operational',
38
+})
39
+
40
+
41
+
42
+// 筛选相关变量
43
+const filterStationId = ref('')
44
+const filterProcessStartTime = ref('')
45
+const filterProcessEndTime = ref('')
46
+const filterCreateType = ref('')
47
+const filterCompletionStatus = ref('')
48
+const filterTaskName = ref('')
49
+
50
+// 下拉框数据
51
+const stationList = ref<Array<{ value: string; label: string }>>([])
52
+const createTypeList = ref<Array<{ value: string; label: string }>>([
53
+  { value: '0', label: '系统' },
54
+  { value: '1', label: '新增' }
55
+])
56
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
57
+  { value: '0', label: '待完成' },
58
+  { value: '1', label: '按时完成' },
59
+  { value: '2', label: '逾期完成' }
60
+])
61
+const shiftIdList = ref<Array<{ value: string; label: string }>>([
62
+  { value: '早班', label: '早班' },
63
+  { value: '中班', label: '中班' },
64
+  { value: '晚班', label: '晚班' }
65
+])
66
+
67
+// 获取加油站列表
68
+async function fetchStationList() {
69
+  try {
70
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
71
+    stationList.value = response.map(item => ({
72
+      value: item.id.toString(),
73
+      label: item.stationName || ''
74
+    }))
75
+  } catch (error) {
76
+    console.error('获取加油站列表失败:', error)
77
+  }
78
+}
79
+
80
+// 处理时间选择确认
81
+function handleConfirm(date: any, type: 'start' | 'end' | 'shift') {
82
+  let formattedDate = ''
83
+  if (typeof date === 'object' && date.value) {
84
+    const dateObj = new Date(date.value)
85
+    const year = dateObj.getFullYear()
86
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
87
+    const day = String(dateObj.getDate()).padStart(2, '0')
88
+    formattedDate = `${year}-${month}-${day} 00:00:00`
89
+  } else if (typeof date === 'number') {
90
+    const dateObj = new Date(date)
91
+    const year = dateObj.getFullYear()
92
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
93
+    const day = String(dateObj.getDate()).padStart(2, '0')
94
+    formattedDate = `${year}-${month}-${day} 00:00:00`
95
+  } else if (typeof date === 'string') {
96
+    if (date.includes('T')) {
97
+      formattedDate = date.replace('T', ' ').substring(0, 19)
98
+    } else if (date.length === 10) {
99
+      formattedDate = date + ' 00:00:00'
100
+    } else {
101
+      formattedDate = date
102
+    }
103
+  }
104
+  
105
+  if (type === 'start') {
106
+    filterProcessStartTime.value = formattedDate
107
+  } else if (type === 'end') {
108
+    filterProcessEndTime.value = formattedDate
109
+  }
110
+}
111
+
112
+// 获取任务列表数据
113
+async function fetchTaskList(isLoadMore = false) {
114
+  if (isLoadMore) {
115
+    loadingMore.value = true
116
+  } else {
117
+    loading.value = true
118
+    pageNum.value = 1
119
+    hasMore.value = true
120
+  }
121
+  try {
122
+    // 构建请求参数
123
+    const params = {
124
+      pageSize: 10,
125
+      pageNum: pageNum.value,
126
+    }
127
+    // 添加筛选条件
128
+    if (filterStationId.value) {
129
+      params.stationId = filterStationId.value
130
+    }
131
+    if (filterProcessStartTime.value) {
132
+      params.processStartTime = filterProcessStartTime.value
133
+    }
134
+    if (filterProcessEndTime.value) {
135
+      params.processEndTime = filterProcessEndTime.value
136
+    }
137
+    if (filterCreateType.value) {
138
+      params.createType = filterCreateType.value
139
+    }
140
+    if (filterCompletionStatus.value) {
141
+      params.completionStatus = filterCompletionStatus.value
142
+    }
143
+    if (filterTaskName.value) {
144
+      params.taskName = filterTaskName.value
145
+    }
146
+    params.directoryType = typeDataData.value[perms.value]
147
+    const response = await http.get<{ rows: any[], total: number }>('/formTeamShiftLog/log/list', params)
148
+    const newData = response.rows || []
149
+    
150
+    // 转换数据格式为组件所需的格式
151
+    const formattedData = newData.map(item => ({
152
+      detailType: 'tasd',
153
+      id: item.id,
154
+      taskId: item.taskId,
155
+      button: '',
156
+      title: item.taskName || '',
157
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
158
+      statusClass: item.completionStatus === 0 ? 'bg-green-100 text-green-800' : item.completionStatus === 1 ? 'bg-red-100 text-red-800' : 'bg-green-100 text-green-800', 
159
+      userName: item.executorName+ '/' + item.stationName || '',
160
+      createTime: item.processTime || item.shiftDate || '',
161
+      shiftId: item.shiftId || '',
162
+      weather: item.weather || '',
163
+      shiftLeaderName: item.shiftLeaderName || ''
164
+    }))
165
+    
166
+    if (isLoadMore) {
167
+      listData.value = [...(listData.value || []), ...formattedData]
168
+    } else {
169
+      listData.value = formattedData
170
+    }
171
+    // 检查是否还有更多数据
172
+    hasMore.value = (newData || []).length === 10
173
+    // 增加页码
174
+    pageNum.value++
175
+  }
176
+  catch (error) {
177
+    uni.showToast({
178
+      title: '获取任务列表失败',
179
+      icon: 'none',
180
+    })
181
+  }
182
+  finally {
183
+    loading.value = false
184
+    loadingMore.value = false
185
+  }
186
+}
187
+
188
+// 处理刷新
189
+function handleRefresh() {
190
+  fetchTaskList()
191
+}
192
+
193
+// 处理加载更多
194
+function handleLoadMore() {
195
+  if (!loadingMore.value && hasMore.value) {
196
+    fetchTaskList(true)
197
+  }
198
+}
199
+
200
+// 筛选相关方法
201
+function handleFilter() {
202
+  console.log('筛选数据')
203
+}
204
+
205
+function handleFilterConfirm() {
206
+  console.log('筛选确定')
207
+  // 重新获取数据,应用筛选条件
208
+  fetchTaskList()
209
+}
210
+
211
+function handleFilterCancel() {
212
+  console.log('筛选取消')
213
+}
214
+
215
+function handleReset() {
216
+  console.log('重置筛选条件')
217
+  // 清空所有筛选条件
218
+  filterStationId.value = ''
219
+  filterProcessStartTime.value = ''
220
+  filterProcessEndTime.value = ''
221
+  filterCreateType.value = ''
222
+  filterCompletionStatus.value = ''
223
+  filterTaskName.value = ''
224
+}
225
+
226
+// 页面加载时获取数据
227
+onMounted(() => {})
228
+
229
+// 页面显示时刷新数据
230
+onPageShow(() => {
231
+  const pages = getCurrentPages()
232
+  const currentPage = pages[pages.length - 1]
233
+  if (currentPage.options.perms) {
234
+    perms.value = currentPage.options.perms as string
235
+    console.log('收到的 perms 参数:', perms.value)
236
+    fetchTaskList()
237
+    fetchStationList()
238
+  }
239
+})
240
+
5 241
 </script>
6 242
 
7 243
 <template>
8
-  <view class="page">
9
-    <view class="flex items-center justify-center h-full">
10
-      <text class="text-lg">班组日志页面</text>
11
-    </view>
244
+  <view class="page min-h-screen bg-gray-100">
245
+    <JiayiList
246
+      :data="listData"
247
+      @refresh="handleRefresh"
248
+      @filter="handleFilter"
249
+      @filter-confirm="handleFilterConfirm"
250
+      @filter-cancel="handleFilterCancel"
251
+      @reset="handleReset"
252
+      @load-more="handleLoadMore"
253
+    >
254
+      <template #filter-content>
255
+        <view class="p-4">
256
+          <view class="text-lg font-medium mb-4">筛选条件</view>
257
+          
258
+          <!-- 任务名称搜索 -->
259
+          <view class="mb-4">
260
+            <text class="block mb-2">任务名称</text>
261
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
262
+          </view>
263
+          
264
+          <!-- 加油站下拉框 -->
265
+          <view class="mb-4">
266
+            <text class="block mb-2">加油站</text>
267
+            <wd-picker 
268
+              :columns="[stationList]" 
269
+              v-model="filterStationId" 
270
+            />
271
+          </view>
272
+          
273
+          <!-- 开始时间选择 -->
274
+          <view class="mb-4">
275
+            <text class="block mb-2">开始时间</text>
276
+            <view class="relative">
277
+              <wd-calendar 
278
+                v-model="filterProcessStartTime" 
279
+                @confirm="(date) => handleConfirm(date, 'start')" 
280
+              />
281
+            </view>
282
+          </view>
283
+          
284
+          <!-- 结束时间选择 -->
285
+          <view class="mb-4">
286
+            <text class="block mb-2">结束时间</text>
287
+            <view class="relative">
288
+              <wd-calendar 
289
+                v-model="filterProcessEndTime" 
290
+                @confirm="(date) => handleConfirm(date, 'end')" 
291
+              />
292
+            </view>
293
+          </view>
294
+          
295
+          <!-- 创建类型下拉框 -->
296
+          <view class="mb-4">
297
+            <text class="block mb-2">创建类型</text>
298
+            <wd-picker 
299
+              :columns="[createTypeList]" 
300
+              v-model="filterCreateType" 
301
+            />
302
+          </view>
303
+          
304
+          <!-- 完成状态下拉框 -->
305
+          <view class="mb-4">
306
+            <text class="block mb-2">完成状态</text>
307
+            <wd-picker 
308
+              :columns="[completionStatusList]" 
309
+              v-model="filterCompletionStatus" 
310
+            />
311
+          </view>
312
+          
313
+        </view>
314
+      </template>
315
+    </JiayiList>
12 316
   </view>
13 317
 </template>

+ 1 - 8
src/pages/archive/operat/operatTurnIn.vue

@@ -48,14 +48,7 @@ const filterSurveyStartTime = ref('')
48 48
 const filterSurveyEndTime = ref('')
49 49
 const filterTaskName = ref('')
50 50
 const typeDataData = ref<any>({
51
-  operatInspect:'operational',
52
-  operatExcept:'operational',
53
-  HSSEInspect: 'hsse_management',
54
-  qualityInspect:'data_quality',
55
-  financeInspect:"financial",
56
-  personnelInspect:"human_resources",
57
-  visitorInspect:"visitor_feedback",
58
-  visitorTemporary:"visitor_feedback"
51
+  operatTurnIn:'operational',
59 52
 })
60 53
 // 下拉框数据
61 54
 const stationList = ref<Array<{ value: string; label: string }>>([])

+ 2 - 11
src/pages/archive/operat/operatWeek.vue

@@ -48,14 +48,7 @@ const filterCreateType = ref('')
48 48
 const filterCompletionStatus = ref('')
49 49
 const filterTaskName = ref('')
50 50
 const typeDataData = ref<any>({
51
-  operatInspect:'operational',
52
-  operatExcept:'operational',
53
-  HSSEInspect: 'hsse_management',
54
-  qualityInspect:'data_quality',
55
-  financeInspect:"financial",
56
-  personnelInspect:"human_resources",
57
-  visitorInspect:"visitor_feedback",
58
-  visitorTemporary:"visitor_feedback"
51
+  operatWeek:'operational',
59 52
 })
60 53
 // 下拉框数据
61 54
 const stationList = ref<Array<{ value: string; label: string }>>([])
@@ -161,9 +154,7 @@ async function fetchTaskList(isLoadMore = false) {
161 154
       params.taskName = filterTaskName.value
162 155
     }
163 156
     params.directoryType = typeDataData.value[perms.value]
164
-    if (perms.value === 'operatExcept') {
165
-      params.isAbnormal = 1
166
-    }
157
+
167 158
     const response = await http.get<{ rows: any[], total: number }>('/formOperationalWeeklyReport/report/list', params)
168 159
     const newData = response.rows || []   
169 160
     

+ 20 - 2
src/pages/archive/order/creatOrder.vue

@@ -13,9 +13,16 @@ const formData = reactive({
13 13
   phone: '',
14 14
   content: '',
15 15
   attachments: '',
16
-  isSubmit: true
16
+  isSubmit: true,
17
+  urgency: '1'
17 18
 })
18 19
 
20
+// 紧急程度选项
21
+const urgencyOptions = ref([
22
+  { value: '1', label: '一般' },
23
+  { value: '2', label: '紧急' }
24
+])
25
+
19 26
 // 工单类型树形数据
20 27
 const ticketTypeTree = ref<any[]>([])
21 28
 // 选中的工单类型
@@ -111,6 +118,7 @@ async function fetchOrderDetail() {
111 118
     formData.content = response.content || ''
112 119
     formData.attachments = response.attachments || ''
113 120
     formData.isSubmit = false
121
+    formData.urgency = response.urgency || '1'
114 122
     
115 123
     // 处理附件
116 124
     if (response.attachmentsUrl) {
@@ -263,7 +271,7 @@ onMounted(() => {
263 271
 </script>
264 272
 
265 273
 <template>
266
-  <view class="page min-h-screen bg-gray-100 p-4">
274
+  <view class="page min-h-screen bg-gray-100">
267 275
     <view class="bg-white rounded-lg p-4 shadow-sm">
268 276
       <!-- 工单类型 -->
269 277
       <view class="mb-6">
@@ -355,6 +363,16 @@ onMounted(() => {
355 363
         />
356 364
       </view>
357 365
       
366
+      <!-- 紧急程度 -->
367
+      <view class="mb-6">
368
+        <text class="block mb-2 font-medium">紧急程度</text>
369
+        <wd-picker 
370
+          :columns="[urgencyOptions]" 
371
+          v-model="formData.urgency" 
372
+          style="border-bottom: 1px solid rgba(0, 0, 0, 0.1);"
373
+        />
374
+      </view>
375
+      
358 376
       <!-- 是否提交 -->
359 377
       <view class="mb-6">
360 378
         <text class="block mb-2 font-medium">是否提交</text>

+ 327 - 5
src/pages/archive/quality/qualityAdditive.vue

@@ -1,12 +1,334 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3
-  title: '添加剂库存表'
9
+  title: '添加剂库存'
4 10
 })
11
+
12
+onPageShow(() => {
13
+  const pages = getCurrentPages()
14
+  const currentPage = pages[pages.length - 1]
15
+  if (currentPage.options.perms) {
16
+    perms.value = currentPage.options.perms as string
17
+    console.log('收到的 perms 参数:', perms.value)
18
+    fetchTaskList()
19
+    fetchStationList()
20
+  }
21
+})
22
+
23
+// 任务数据接口
24
+interface Task {
25
+  id: number
26
+  taskName: string
27
+  completionStatus: number
28
+  executorName: string
29
+  createTime: string
30
+  stationId: number
31
+  createType: number
32
+  processTime: string
33
+  meetingTheme: string
34
+  meetingHost: string
35
+  meetingLocation: string
36
+  attendeesCount: number
37
+  totalCount: number
38
+}
39
+
40
+// 任务列表数据
41
+const listData = ref<Task[]>([])
42
+const loading = ref(false)
43
+const loadingMore = ref(false)
44
+const pageNum = ref(1)
45
+const hasMore = ref(true)
46
+const perms = ref('')
47
+
48
+// 筛选相关变量
49
+const filterStationId = ref('')
50
+const filterProcessStartTime = ref('')
51
+const filterProcessEndTime = ref('')
52
+const filterCreateType = ref('')
53
+const filterCompletionStatus = ref('')
54
+const filterTaskName = ref('')
55
+const typeDataData = ref<any>({
56
+  qualityAdditive:'data_quality',
57
+})
58
+// 下拉框数据
59
+const stationList = ref<Array<{ value: string; label: string }>>([])
60
+const createTypeList = ref<Array<{ value: string; label: string }>>([
61
+  { value: '0', label: '系统' },
62
+  { value: '1', label: '新增' }
63
+])
64
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
65
+  { value: '0', label: '待完成' },
66
+  { value: '1', label: '按时完成' },
67
+  { value: '2', label: '逾期完成' }
68
+])
69
+
70
+// 时间选择器相关
71
+const showStartTimePicker = ref(true)
72
+const showEndTimePicker = ref(true)
73
+const calendarValue = ref('')
74
+
75
+// 获取加油站列表
76
+async function fetchStationList() {
77
+  try {
78
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
79
+    stationList.value = response.map(item => ({
80
+      value: item.id.toString(),
81
+      label: item.stationName || ''
82
+    }))
83
+    console.log(stationList.value)
84
+  } catch (error) {
85
+    console.error('获取加油站列表失败:', error)
86
+  }
87
+}
88
+
89
+// 处理时间选择确认
90
+function handleConfirm(date: any, type: 'start' | 'end') {
91
+  console.log('确认日期:', date)
92
+  
93
+  let formattedDate = ''
94
+  if (typeof date === 'object' && date.value) {
95
+    const dateObj = new Date(date.value)
96
+    const year = dateObj.getFullYear()
97
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
98
+    const day = String(dateObj.getDate()).padStart(2, '0')
99
+    formattedDate = `${year}-${month}-${day} 00:00:00`
100
+  } else if (typeof date === 'number') {
101
+    const dateObj = new Date(date)
102
+    const year = dateObj.getFullYear()
103
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
104
+    const day = String(dateObj.getDate()).padStart(2, '0')
105
+    formattedDate = `${year}-${month}-${day} 00:00:00`
106
+  } else if (typeof date === 'string') {
107
+    if (date.includes('T')) {
108
+      formattedDate = date.replace('T', ' ').substring(0, 19)
109
+    } else if (date.length === 10) {
110
+      formattedDate = date + ' 00:00:00'
111
+    } else {
112
+      formattedDate = date
113
+    }
114
+  }
115
+  console.log(formattedDate)
116
+  if (type === 'start') {
117
+    filterProcessStartTime.value = formattedDate
118
+  } else {
119
+    filterProcessEndTime.value = formattedDate
120
+  }
121
+  
122
+  calendarValue.value = formattedDate
123
+}
124
+
125
+// 获取任务列表数据
126
+async function fetchTaskList(isLoadMore = false) {
127
+  if (isLoadMore) {
128
+    loadingMore.value = true
129
+  } else {
130
+    loading.value = true
131
+    pageNum.value = 1
132
+    hasMore.value = true
133
+  }
134
+  try {
135
+    const params = {
136
+      pageSize: 10,
137
+      pageNum: pageNum.value,
138
+    }
139
+    if (filterStationId.value) {
140
+      params.stationId = filterStationId.value
141
+    }
142
+    if (filterProcessStartTime.value) {
143
+      params.processStartTime = filterProcessStartTime.value
144
+    }
145
+    
146
+    if (filterProcessEndTime.value) {
147
+      params.processEndTime = filterProcessEndTime.value
148
+    }
149
+    
150
+    if (filterCreateType.value) {
151
+      params.createType = filterCreateType.value
152
+    }
153
+    
154
+    if (filterCompletionStatus.value) {
155
+      params.completionStatus = filterCompletionStatus.value
156
+    }
157
+    
158
+    if (filterTaskName.value) {
159
+      params.taskName = filterTaskName.value
160
+    }
161
+    params.directoryType = typeDataData.value[perms.value]
162
+
163
+    const response = await http.get<{ rows: any[], total: number }>('/formAdditiveInventory/inventory/list', params)
164
+    const newData = response.rows || []   
165
+    
166
+    const formattedData = newData.map(item => ({
167
+      detailType: 'task',
168
+      id: item.id,
169
+      taskId: item.taskId,
170
+      button: '',
171
+      title: item.meetingTheme || item.taskName || '',
172
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
173
+      statusClass: completionStatusList.value.find(status => status.value === item.completionStatus)?.value === '0' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800',
174
+      userName: item.executorName+ '/' + item.stationName || '',
175
+      createTime: item.createTime || '',
176
+      meetingHost: item.meetingHost || '',
177
+      meetingLocation: item.meetingLocation || '',
178
+      attendeesCount: item.attendeesCount || 0,
179
+      totalCount: item.totalCount || 0
180
+    }))
181
+    
182
+    if (isLoadMore) {
183
+      listData.value = [...(listData.value || []), ...formattedData]
184
+    } else {
185
+      listData.value = formattedData
186
+    }
187
+    hasMore.value = (newData || []).length === 10
188
+    pageNum.value++
189
+  }
190
+  catch (error) {
191
+    uni.showToast({
192
+      title: '获取任务列表失败',
193
+      icon: 'none',
194
+    })
195
+  }
196
+  finally {
197
+    loading.value = false
198
+    loadingMore.value = false
199
+  }
200
+}
201
+
202
+function handleRefresh() {
203
+  fetchTaskList()
204
+}
205
+
206
+function handleLoadMore() {
207
+  if (!loadingMore.value && hasMore.value) {
208
+    fetchTaskList(true)
209
+  }
210
+}
211
+
212
+function handleFilter() {
213
+  console.log('筛选数据')
214
+}
215
+
216
+function handleFilterConfirm() {
217
+  console.log('筛选确定')
218
+  fetchTaskList()
219
+}
220
+
221
+function handleFilterCancel() {
222
+  console.log('筛选取消')
223
+}
224
+
225
+function handleReset() {
226
+  console.log('重置筛选条件')
227
+  filterStationId.value = ''
228
+  filterProcessStartTime.value = ''
229
+  filterProcessEndTime.value = ''
230
+  filterCreateType.value = ''
231
+  filterCompletionStatus.value = ''
232
+  filterTaskName.value = ''
233
+}
234
+
5 235
 </script>
236
+
6 237
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">添加剂库存表页面</text>
10
-    </view>
238
+  <view class="page min-h-screen bg-gray-100">
239
+    <JiayiList
240
+      :data="listData"
241
+      @refresh="handleRefresh"
242
+      @filter="handleFilter"
243
+      @filter-confirm="handleFilterConfirm"
244
+      @filter-cancel="handleFilterCancel"
245
+      @reset="handleReset"
246
+      @load-more="handleLoadMore"
247
+    >
248
+      <template #default="{ item }">
249
+        <view class="p-4 bg-white border-b border-gray-200">
250
+          <view class="flex justify-between items-center mb-2">
251
+            <text class="text-lg font-medium">{{ item.title }}</text>
252
+            <text class="text-sm px-2 py-1 rounded" :class="item.statusClass">
253
+              {{ item.statusName }}
254
+            </text>
255
+          </view>
256
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
257
+            <text>主持人:{{ item.meetingHost }}</text>
258
+            <text>地点:{{ item.meetingLocation }}</text>
259
+          </view>
260
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
261
+            <text>参会人数:{{ item.attendeesCount }}/{{ item.totalCount }}</text>
262
+            <text>{{ item.createTime }}</text>
263
+          </view>
264
+          <view class="flex justify-start items-center text-sm text-gray-600">
265
+            <text>执行人:{{ item.executorName }}</text>
266
+          </view>
267
+        </view>
268
+      </template>
269
+      <template #filter-content>
270
+        <view class="p-4">
271
+          <view class="text-lg font-medium mb-4">筛选条件</view>
272
+          
273
+          <!-- 任务名称搜索 -->
274
+          <view class="mb-4">
275
+            <text class="block mb-2">任务名称</text>
276
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
277
+          </view>
278
+          
279
+          <!-- 加油站下拉框 -->
280
+          <view class="mb-4">
281
+            <text class="block mb-2">加油站</text>
282
+            <wd-picker 
283
+              :columns="[stationList]" 
284
+              v-model="filterStationId" 
285
+            />
286
+          </view>
287
+          
288
+          <!-- 开始时间选择 -->
289
+          <view class="mb-4">
290
+            <text class="block mb-2">开始时间</text>
291
+            <view class="relative">
292
+              <wd-calendar 
293
+                v-model="filterProcessStartTime" 
294
+                @confirm="(date) => handleConfirm(date, 'start')" 
295
+                v-if="showStartTimePicker"
296
+              />
297
+            </view>
298
+          </view>
299
+          
300
+          <!-- 结束时间选择 -->
301
+          <view class="mb-4">
302
+            <text class="block mb-2">结束时间</text>
303
+            <view class="relative">
304
+              <wd-calendar 
305
+                v-model="filterProcessEndTime" 
306
+                @confirm="(date) => handleConfirm(date, 'end')" 
307
+                v-if="showEndTimePicker"
308
+              />
309
+            </view>
310
+          </view>
311
+          
312
+          <!-- 创建类型下拉框 -->
313
+          <view class="mb-4">
314
+            <text class="block mb-2">创建类型</text>
315
+            <wd-picker 
316
+              :columns="[createTypeList]" 
317
+              v-model="filterCreateType" 
318
+            />
319
+          </view>
320
+          
321
+          <!-- 完成状态下拉框 -->
322
+          <view class="mb-4">
323
+            <text class="block mb-2">完成状态</text>
324
+            <wd-picker 
325
+              :columns="[completionStatusList]" 
326
+              v-model="filterCompletionStatus" 
327
+            />
328
+          </view>
329
+          
330
+        </view>
331
+      </template>
332
+    </JiayiList>
11 333
   </view>
12 334
 </template>

+ 328 - 5
src/pages/archive/quality/qualityOilGun.vue

@@ -1,13 +1,336 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3
-  title: '油枪自检损益表'
9
+  title: '油枪自检'
10
+})
11
+
12
+onPageShow(() => {
13
+  const pages = getCurrentPages()
14
+  const currentPage = pages[pages.length - 1]
15
+  if (currentPage.options.perms) {
16
+    perms.value = currentPage.options.perms as string
17
+    console.log('收到的 perms 参数:', perms.value)
18
+    fetchTaskList()
19
+    fetchStationList()
20
+  }
21
+})
22
+
23
+// 任务数据接口
24
+interface Task {
25
+  id: number
26
+  taskName: string
27
+  completionStatus: number
28
+  executorName: string
29
+  createTime: string
30
+  stationId: number
31
+  createType: number
32
+  processTime: string
33
+  meetingTheme: string
34
+  meetingHost: string
35
+  meetingLocation: string
36
+  attendeesCount: number
37
+  totalCount: number
38
+}
39
+
40
+// 任务列表数据
41
+const listData = ref<Task[]>([])
42
+const loading = ref(false)
43
+const loadingMore = ref(false)
44
+const pageNum = ref(1)
45
+const hasMore = ref(true)
46
+const perms = ref('')
47
+
48
+// 筛选相关变量
49
+const filterStationId = ref('')
50
+const filterProcessStartTime = ref('')
51
+const filterProcessEndTime = ref('')
52
+const filterCreateType = ref('')
53
+const filterCompletionStatus = ref('')
54
+const filterTaskName = ref('')
55
+const typeDataData = ref<any>({
56
+  qualityOilGun:'data_quality',
4 57
 })
58
+// 下拉框数据
59
+const stationList = ref<Array<{ value: string; label: string }>>([])
60
+const createTypeList = ref<Array<{ value: string; label: string }>>([
61
+  { value: '0', label: '系统' },
62
+  { value: '1', label: '新增' }
63
+])
64
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
65
+  { value: '0', label: '待完成' },
66
+  { value: '1', label: '按时完成' },
67
+  { value: '2', label: '逾期完成' }
68
+])
69
+
70
+// 时间选择器相关
71
+const showStartTimePicker = ref(true)
72
+const showEndTimePicker = ref(true)
73
+const calendarValue = ref('')
74
+
75
+// 获取加油站列表
76
+async function fetchStationList() {
77
+  try {
78
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
79
+    stationList.value = response.map(item => ({
80
+      value: item.id.toString(),
81
+      label: item.stationName || ''
82
+    }))
83
+    console.log(stationList.value)
84
+  } catch (error) {
85
+    console.error('获取加油站列表失败:', error)
86
+  }
87
+}
88
+
89
+// 处理时间选择确认
90
+function handleConfirm(date: any, type: 'start' | 'end') {
91
+  console.log('确认日期:', date)
92
+  
93
+  let formattedDate = ''
94
+  if (typeof date === 'object' && date.value) {
95
+    const dateObj = new Date(date.value)
96
+    const year = dateObj.getFullYear()
97
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
98
+    const day = String(dateObj.getDate()).padStart(2, '0')
99
+    formattedDate = `${year}-${month}-${day} 00:00:00`
100
+  } else if (typeof date === 'number') {
101
+    const dateObj = new Date(date)
102
+    const year = dateObj.getFullYear()
103
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
104
+    const day = String(dateObj.getDate()).padStart(2, '0')
105
+    formattedDate = `${year}-${month}-${day} 00:00:00`
106
+  } else if (typeof date === 'string') {
107
+    if (date.includes('T')) {
108
+      formattedDate = date.replace('T', ' ').substring(0, 19)
109
+    } else if (date.length === 10) {
110
+      formattedDate = date + ' 00:00:00'
111
+    } else {
112
+      formattedDate = date
113
+    }
114
+  }
115
+  console.log(formattedDate)
116
+  if (type === 'start') {
117
+    filterProcessStartTime.value = formattedDate
118
+  } else {
119
+    filterProcessEndTime.value = formattedDate
120
+  }
121
+  
122
+  calendarValue.value = formattedDate
123
+}
124
+
125
+// 获取任务列表数据
126
+async function fetchTaskList(isLoadMore = false) {
127
+  if (isLoadMore) {
128
+    loadingMore.value = true
129
+  } else {
130
+    loading.value = true
131
+    pageNum.value = 1
132
+    hasMore.value = true
133
+  }
134
+  try {
135
+    const params = {
136
+      pageSize: 10,
137
+      pageNum: pageNum.value,
138
+    }
139
+    if (filterStationId.value) {
140
+      params.stationId = filterStationId.value
141
+    }
142
+    if (filterProcessStartTime.value) {
143
+      params.processStartTime = filterProcessStartTime.value
144
+    }
145
+    
146
+    if (filterProcessEndTime.value) {
147
+      params.processEndTime = filterProcessEndTime.value
148
+    }
149
+    
150
+    if (filterCreateType.value) {
151
+      params.createType = filterCreateType.value
152
+    }
153
+    
154
+    if (filterCompletionStatus.value) {
155
+      params.completionStatus = filterCompletionStatus.value
156
+    }
157
+    
158
+    if (filterTaskName.value) {
159
+      params.taskName = filterTaskName.value
160
+    }
161
+    params.directoryType = typeDataData.value[perms.value]
162
+    if (perms.value === 'operatExcept') {
163
+      params.isAbnormal = 1
164
+    }
165
+    const response = await http.get<{ rows: any[], total: number }>('/formGunSelfCheck/check/list', params)
166
+    const newData = response.rows || []   
167
+    
168
+    const formattedData = newData.map(item => ({
169
+      detailType: 'task',
170
+      id: item.id,
171
+      taskId: item.taskId,
172
+      button: '',
173
+      title: item.meetingTheme || item.taskName || '',
174
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
175
+      statusClass: completionStatusList.value.find(status => status.value === item.completionStatus)?.value === '0' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800',
176
+      userName: item.executorName+ '/' + item.stationName || '',
177
+      createTime: item.createTime || '',
178
+      meetingHost: item.meetingHost || '',
179
+      meetingLocation: item.meetingLocation || '',
180
+      attendeesCount: item.attendeesCount || 0,
181
+      totalCount: item.totalCount || 0
182
+    }))
183
+    
184
+    if (isLoadMore) {
185
+      listData.value = [...(listData.value || []), ...formattedData]
186
+    } else {
187
+      listData.value = formattedData
188
+    }
189
+    hasMore.value = (newData || []).length === 10
190
+    pageNum.value++
191
+  }
192
+  catch (error) {
193
+    uni.showToast({
194
+      title: '获取任务列表失败',
195
+      icon: 'none',
196
+    })
197
+  }
198
+  finally {
199
+    loading.value = false
200
+    loadingMore.value = false
201
+  }
202
+}
203
+
204
+function handleRefresh() {
205
+  fetchTaskList()
206
+}
207
+
208
+function handleLoadMore() {
209
+  if (!loadingMore.value && hasMore.value) {
210
+    fetchTaskList(true)
211
+  }
212
+}
213
+
214
+function handleFilter() {
215
+  console.log('筛选数据')
216
+}
217
+
218
+function handleFilterConfirm() {
219
+  console.log('筛选确定')
220
+  fetchTaskList()
221
+}
222
+
223
+function handleFilterCancel() {
224
+  console.log('筛选取消')
225
+}
226
+
227
+function handleReset() {
228
+  console.log('重置筛选条件')
229
+  filterStationId.value = ''
230
+  filterProcessStartTime.value = ''
231
+  filterProcessEndTime.value = ''
232
+  filterCreateType.value = ''
233
+  filterCompletionStatus.value = ''
234
+  filterTaskName.value = ''
235
+}
236
+
5 237
 </script>
6 238
 
7 239
 <template>
8
-  <view class="page">
9
-    <view class="flex items-center justify-center h-full">
10
-      <text class="text-lg">油枪自检损益表页面</text>
11
-    </view>
240
+  <view class="page min-h-screen bg-gray-100">
241
+    <JiayiList
242
+      :data="listData"
243
+      @refresh="handleRefresh"
244
+      @filter="handleFilter"
245
+      @filter-confirm="handleFilterConfirm"
246
+      @filter-cancel="handleFilterCancel"
247
+      @reset="handleReset"
248
+      @load-more="handleLoadMore"
249
+    >
250
+      <template #default="{ item }">
251
+        <view class="p-4 bg-white border-b border-gray-200">
252
+          <view class="flex justify-between items-center mb-2">
253
+            <text class="text-lg font-medium">{{ item.title }}</text>
254
+            <text class="text-sm px-2 py-1 rounded" :class="item.statusClass">
255
+              {{ item.statusName }}
256
+            </text>
257
+          </view>
258
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
259
+            <text>主持人:{{ item.meetingHost }}</text>
260
+            <text>地点:{{ item.meetingLocation }}</text>
261
+          </view>
262
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
263
+            <text>参会人数:{{ item.attendeesCount }}/{{ item.totalCount }}</text>
264
+            <text>{{ item.createTime }}</text>
265
+          </view>
266
+          <view class="flex justify-start items-center text-sm text-gray-600">
267
+            <text>执行人:{{ item.executorName }}</text>
268
+          </view>
269
+        </view>
270
+      </template>
271
+      <template #filter-content>
272
+        <view class="p-4">
273
+          <view class="text-lg font-medium mb-4">筛选条件</view>
274
+          
275
+          <!-- 任务名称搜索 -->
276
+          <view class="mb-4">
277
+            <text class="block mb-2">任务名称</text>
278
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
279
+          </view>
280
+          
281
+          <!-- 加油站下拉框 -->
282
+          <view class="mb-4">
283
+            <text class="block mb-2">加油站</text>
284
+            <wd-picker 
285
+              :columns="[stationList]" 
286
+              v-model="filterStationId" 
287
+            />
288
+          </view>
289
+          
290
+          <!-- 开始时间选择 -->
291
+          <view class="mb-4">
292
+            <text class="block mb-2">开始时间</text>
293
+            <view class="relative">
294
+              <wd-calendar 
295
+                v-model="filterProcessStartTime" 
296
+                @confirm="(date) => handleConfirm(date, 'start')" 
297
+                v-if="showStartTimePicker"
298
+              />
299
+            </view>
300
+          </view>
301
+          
302
+          <!-- 结束时间选择 -->
303
+          <view class="mb-4">
304
+            <text class="block mb-2">结束时间</text>
305
+            <view class="relative">
306
+              <wd-calendar 
307
+                v-model="filterProcessEndTime" 
308
+                @confirm="(date) => handleConfirm(date, 'end')" 
309
+                v-if="showEndTimePicker"
310
+              />
311
+            </view>
312
+          </view>
313
+          
314
+          <!-- 创建类型下拉框 -->
315
+          <view class="mb-4">
316
+            <text class="block mb-2">创建类型</text>
317
+            <wd-picker 
318
+              :columns="[createTypeList]" 
319
+              v-model="filterCreateType" 
320
+            />
321
+          </view>
322
+          
323
+          <!-- 完成状态下拉框 -->
324
+          <view class="mb-4">
325
+            <text class="block mb-2">完成状态</text>
326
+            <wd-picker 
327
+              :columns="[completionStatusList]" 
328
+              v-model="filterCompletionStatus" 
329
+            />
330
+          </view>
331
+          
332
+        </view>
333
+      </template>
334
+    </JiayiList>
12 335
   </view>
13 336
 </template>

+ 328 - 5
src/pages/archive/quality/qualityTestWater.vue

@@ -1,13 +1,336 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3
-  title: '添加剂库存'
9
+  title: '量缸试水记录'
10
+})
11
+
12
+onPageShow(() => {
13
+  const pages = getCurrentPages()
14
+  const currentPage = pages[pages.length - 1]
15
+  if (currentPage.options.perms) {
16
+    perms.value = currentPage.options.perms as string
17
+    console.log('收到的 perms 参数:', perms.value)
18
+    fetchTaskList()
19
+    fetchStationList()
20
+  }
21
+})
22
+
23
+// 任务数据接口
24
+interface Task {
25
+  id: number
26
+  taskName: string
27
+  completionStatus: number
28
+  executorName: string
29
+  createTime: string
30
+  stationId: number
31
+  createType: number
32
+  processTime: string
33
+  meetingTheme: string
34
+  meetingHost: string
35
+  meetingLocation: string
36
+  attendeesCount: number
37
+  totalCount: number
38
+}
39
+
40
+// 任务列表数据
41
+const listData = ref<Task[]>([])
42
+const loading = ref(false)
43
+const loadingMore = ref(false)
44
+const pageNum = ref(1)
45
+const hasMore = ref(true)
46
+const perms = ref('')
47
+
48
+// 筛选相关变量
49
+const filterStationId = ref('')
50
+const filterProcessStartTime = ref('')
51
+const filterProcessEndTime = ref('')
52
+const filterCreateType = ref('')
53
+const filterCompletionStatus = ref('')
54
+const filterTaskName = ref('')
55
+const typeDataData = ref<any>({
56
+  qualityTestWater:'data_quality',
4 57
 })
58
+// 下拉框数据
59
+const stationList = ref<Array<{ value: string; label: string }>>([])
60
+const createTypeList = ref<Array<{ value: string; label: string }>>([
61
+  { value: '0', label: '系统' },
62
+  { value: '1', label: '新增' }
63
+])
64
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
65
+  { value: '0', label: '待完成' },
66
+  { value: '1', label: '按时完成' },
67
+  { value: '2', label: '逾期完成' }
68
+])
69
+
70
+// 时间选择器相关
71
+const showStartTimePicker = ref(true)
72
+const showEndTimePicker = ref(true)
73
+const calendarValue = ref('')
74
+
75
+// 获取加油站列表
76
+async function fetchStationList() {
77
+  try {
78
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
79
+    stationList.value = response.map(item => ({
80
+      value: item.id.toString(),
81
+      label: item.stationName || ''
82
+    }))
83
+    console.log(stationList.value)
84
+  } catch (error) {
85
+    console.error('获取加油站列表失败:', error)
86
+  }
87
+}
88
+
89
+// 处理时间选择确认
90
+function handleConfirm(date: any, type: 'start' | 'end') {
91
+  console.log('确认日期:', date)
92
+  
93
+  let formattedDate = ''
94
+  if (typeof date === 'object' && date.value) {
95
+    const dateObj = new Date(date.value)
96
+    const year = dateObj.getFullYear()
97
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
98
+    const day = String(dateObj.getDate()).padStart(2, '0')
99
+    formattedDate = `${year}-${month}-${day} 00:00:00`
100
+  } else if (typeof date === 'number') {
101
+    const dateObj = new Date(date)
102
+    const year = dateObj.getFullYear()
103
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
104
+    const day = String(dateObj.getDate()).padStart(2, '0')
105
+    formattedDate = `${year}-${month}-${day} 00:00:00`
106
+  } else if (typeof date === 'string') {
107
+    if (date.includes('T')) {
108
+      formattedDate = date.replace('T', ' ').substring(0, 19)
109
+    } else if (date.length === 10) {
110
+      formattedDate = date + ' 00:00:00'
111
+    } else {
112
+      formattedDate = date
113
+    }
114
+  }
115
+  console.log(formattedDate)
116
+  if (type === 'start') {
117
+    filterProcessStartTime.value = formattedDate
118
+  } else {
119
+    filterProcessEndTime.value = formattedDate
120
+  }
121
+  
122
+  calendarValue.value = formattedDate
123
+}
124
+
125
+// 获取任务列表数据
126
+async function fetchTaskList(isLoadMore = false) {
127
+  if (isLoadMore) {
128
+    loadingMore.value = true
129
+  } else {
130
+    loading.value = true
131
+    pageNum.value = 1
132
+    hasMore.value = true
133
+  }
134
+  try {
135
+    const params = {
136
+      pageSize: 10,
137
+      pageNum: pageNum.value,
138
+    }
139
+    if (filterStationId.value) {
140
+      params.stationId = filterStationId.value
141
+    }
142
+    if (filterProcessStartTime.value) {
143
+      params.processStartTime = filterProcessStartTime.value
144
+    }
145
+    
146
+    if (filterProcessEndTime.value) {
147
+      params.processEndTime = filterProcessEndTime.value
148
+    }
149
+    
150
+    if (filterCreateType.value) {
151
+      params.createType = filterCreateType.value
152
+    }
153
+    
154
+    if (filterCompletionStatus.value) {
155
+      params.completionStatus = filterCompletionStatus.value
156
+    }
157
+    
158
+    if (filterTaskName.value) {
159
+      params.taskName = filterTaskName.value
160
+    }
161
+    params.directoryType = typeDataData.value[perms.value]
162
+    if (perms.value === 'operatExcept') {
163
+      params.isAbnormal = 1
164
+    }
165
+    const response = await http.get<{ rows: any[], total: number }>('/formTankWater/water/list', params)
166
+    const newData = response.rows || []   
167
+    
168
+    const formattedData = newData.map(item => ({
169
+      detailType: 'task',
170
+      id: item.id,
171
+      taskId: item.taskId,
172
+      button: '',
173
+      title: item.meetingTheme || item.taskName || '',
174
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
175
+      statusClass: completionStatusList.value.find(status => status.value === item.completionStatus)?.value === '0' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800',
176
+      userName: item.executorName+ '/' + item.stationName || '',
177
+      createTime: item.createTime || '',
178
+      meetingHost: item.meetingHost || '',
179
+      meetingLocation: item.meetingLocation || '',
180
+      attendeesCount: item.attendeesCount || 0,
181
+      totalCount: item.totalCount || 0
182
+    }))
183
+    
184
+    if (isLoadMore) {
185
+      listData.value = [...(listData.value || []), ...formattedData]
186
+    } else {
187
+      listData.value = formattedData
188
+    }
189
+    hasMore.value = (newData || []).length === 10
190
+    pageNum.value++
191
+  }
192
+  catch (error) {
193
+    uni.showToast({
194
+      title: '获取任务列表失败',
195
+      icon: 'none',
196
+    })
197
+  }
198
+  finally {
199
+    loading.value = false
200
+    loadingMore.value = false
201
+  }
202
+}
203
+
204
+function handleRefresh() {
205
+  fetchTaskList()
206
+}
207
+
208
+function handleLoadMore() {
209
+  if (!loadingMore.value && hasMore.value) {
210
+    fetchTaskList(true)
211
+  }
212
+}
213
+
214
+function handleFilter() {
215
+  console.log('筛选数据')
216
+}
217
+
218
+function handleFilterConfirm() {
219
+  console.log('筛选确定')
220
+  fetchTaskList()
221
+}
222
+
223
+function handleFilterCancel() {
224
+  console.log('筛选取消')
225
+}
226
+
227
+function handleReset() {
228
+  console.log('重置筛选条件')
229
+  filterStationId.value = ''
230
+  filterProcessStartTime.value = ''
231
+  filterProcessEndTime.value = ''
232
+  filterCreateType.value = ''
233
+  filterCompletionStatus.value = ''
234
+  filterTaskName.value = ''
235
+}
236
+
5 237
 </script>
6 238
 
7 239
 <template>
8
-  <view class="page">
9
-    <view class="flex items-center justify-center h-full">
10
-      <text class="text-lg">添加剂库存</text>
11
-    </view>
240
+  <view class="page min-h-screen bg-gray-100">
241
+    <JiayiList
242
+      :data="listData"
243
+      @refresh="handleRefresh"
244
+      @filter="handleFilter"
245
+      @filter-confirm="handleFilterConfirm"
246
+      @filter-cancel="handleFilterCancel"
247
+      @reset="handleReset"
248
+      @load-more="handleLoadMore"
249
+    >
250
+      <template #default="{ item }">
251
+        <view class="p-4 bg-white border-b border-gray-200">
252
+          <view class="flex justify-between items-center mb-2">
253
+            <text class="text-lg font-medium">{{ item.title }}</text>
254
+            <text class="text-sm px-2 py-1 rounded" :class="item.statusClass">
255
+              {{ item.statusName }}
256
+            </text>
257
+          </view>
258
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
259
+            <text>主持人:{{ item.meetingHost }}</text>
260
+            <text>地点:{{ item.meetingLocation }}</text>
261
+          </view>
262
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
263
+            <text>参会人数:{{ item.attendeesCount }}/{{ item.totalCount }}</text>
264
+            <text>{{ item.createTime }}</text>
265
+          </view>
266
+          <view class="flex justify-start items-center text-sm text-gray-600">
267
+            <text>执行人:{{ item.executorName }}</text>
268
+          </view>
269
+        </view>
270
+      </template>
271
+      <template #filter-content>
272
+        <view class="p-4">
273
+          <view class="text-lg font-medium mb-4">筛选条件</view>
274
+          
275
+          <!-- 任务名称搜索 -->
276
+          <view class="mb-4">
277
+            <text class="block mb-2">任务名称</text>
278
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
279
+          </view>
280
+          
281
+          <!-- 加油站下拉框 -->
282
+          <view class="mb-4">
283
+            <text class="block mb-2">加油站</text>
284
+            <wd-picker 
285
+              :columns="[stationList]" 
286
+              v-model="filterStationId" 
287
+            />
288
+          </view>
289
+          
290
+          <!-- 开始时间选择 -->
291
+          <view class="mb-4">
292
+            <text class="block mb-2">开始时间</text>
293
+            <view class="relative">
294
+              <wd-calendar 
295
+                v-model="filterProcessStartTime" 
296
+                @confirm="(date) => handleConfirm(date, 'start')" 
297
+                v-if="showStartTimePicker"
298
+              />
299
+            </view>
300
+          </view>
301
+          
302
+          <!-- 结束时间选择 -->
303
+          <view class="mb-4">
304
+            <text class="block mb-2">结束时间</text>
305
+            <view class="relative">
306
+              <wd-calendar 
307
+                v-model="filterProcessEndTime" 
308
+                @confirm="(date) => handleConfirm(date, 'end')" 
309
+                v-if="showEndTimePicker"
310
+              />
311
+            </view>
312
+          </view>
313
+          
314
+          <!-- 创建类型下拉框 -->
315
+          <view class="mb-4">
316
+            <text class="block mb-2">创建类型</text>
317
+            <wd-picker 
318
+              :columns="[createTypeList]" 
319
+              v-model="filterCreateType" 
320
+            />
321
+          </view>
322
+          
323
+          <!-- 完成状态下拉框 -->
324
+          <view class="mb-4">
325
+            <text class="block mb-2">完成状态</text>
326
+            <wd-picker 
327
+              :columns="[completionStatusList]" 
328
+              v-model="filterCompletionStatus" 
329
+            />
330
+          </view>
331
+          
332
+        </view>
333
+      </template>
334
+    </JiayiList>
12 335
   </view>
13 336
 </template>

+ 10 - 3
src/pages/archive/station/stationCar.vue

@@ -4,9 +4,16 @@ definePage({
4 4
 })
5 5
 </script>
6 6
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">车辆信息</text>
7
+  <view class="page min-h-screen bg-gradient-to-br from-blue-50 to-indigo-50 flex items-center justify-center p-8">
8
+    <view class="text-center max-w-md">
9
+      <view class="w-24 h-24 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-8 animate-pulse">
10
+        <wd-icon name="laptop" size="48" color="#3b82f6" />
11
+      </view>
12
+      <text class="text-2xl font-bold text-gray-800 mb-4 block">功能开发中</text>
13
+      <text class="text-gray-500 mb-8 block">该功能正在紧张开发中,敬请期待!</text>
14
+      <view class="flex justify-center space-x-4">
15
+        <wd-button size="small" type="default" @click="uni.navigateBack()">返回</wd-button>
16
+      </view>
10 17
     </view>
11 18
   </view>
12 19
 </template>

+ 10 - 3
src/pages/archive/station/stationExtinguisher.vue

@@ -4,9 +4,16 @@ definePage({
4 4
 })
5 5
 </script>
6 6
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">灭火器档案页面</text>
7
+  <view class="page min-h-screen bg-gradient-to-br from-blue-50 to-indigo-50 flex items-center justify-center p-8">
8
+    <view class="text-center max-w-md">
9
+      <view class="w-24 h-24 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-8 animate-pulse">
10
+        <wd-icon name="laptop" size="48" color="#3b82f6" />
11
+      </view>
12
+      <text class="text-2xl font-bold text-gray-800 mb-4 block">功能开发中</text>
13
+      <text class="text-gray-500 mb-8 block">该功能正在紧张开发中,敬请期待!</text>
14
+      <view class="flex justify-center space-x-4">
15
+        <wd-button size="small" type="default" @click="uni.navigateBack()">返回</wd-button>
16
+      </view>
10 17
     </view>
11 18
   </view>
12 19
 </template>

+ 10 - 3
src/pages/archive/station/stationFilter.vue

@@ -4,9 +4,16 @@ definePage({
4 4
 })
5 5
 </script>
6 6
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">过滤器档案页面</text>
7
+  <view class="page min-h-screen bg-gradient-to-br from-blue-50 to-indigo-50 flex items-center justify-center p-8">
8
+    <view class="text-center max-w-md">
9
+      <view class="w-24 h-24 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-8 animate-pulse">
10
+        <wd-icon name="laptop" size="48" color="#3b82f6" />
11
+      </view>
12
+      <text class="text-2xl font-bold text-gray-800 mb-4 block">功能开发中</text>
13
+      <text class="text-gray-500 mb-8 block">该功能正在紧张开发中,敬请期待!</text>
14
+      <view class="flex justify-center space-x-4">
15
+        <wd-button size="small" type="default" @click="uni.navigateBack()">返回</wd-button>
16
+      </view>
10 17
     </view>
11 18
   </view>
12 19
 </template>

+ 10 - 3
src/pages/archive/station/stationFirstAidKit.vue

@@ -4,9 +4,16 @@ definePage({
4 4
 })
5 5
 </script>
6 6
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">急救箱档案页面</text>
7
+  <view class="page min-h-screen bg-gradient-to-br from-blue-50 to-indigo-50 flex items-center justify-center p-8">
8
+    <view class="text-center max-w-md">
9
+      <view class="w-24 h-24 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-8 animate-pulse">
10
+        <wd-icon name="laptop" size="48" color="#3b82f6" />
11
+      </view>
12
+      <text class="text-2xl font-bold text-gray-800 mb-4 block">功能开发中</text>
13
+      <text class="text-gray-500 mb-8 block">该功能正在紧张开发中,敬请期待!</text>
14
+      <view class="flex justify-center space-x-4">
15
+        <wd-button size="small" type="default" @click="uni.navigateBack()">返回</wd-button>
16
+      </view>
10 17
     </view>
11 18
   </view>
12 19
 </template>

+ 10 - 3
src/pages/archive/station/stationHandover.vue

@@ -4,9 +4,16 @@ definePage({
4 4
 })
5 5
 </script>
6 6
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">站长交接</text>
7
+  <view class="page min-h-screen bg-gradient-to-br from-blue-50 to-indigo-50 flex items-center justify-center p-8">
8
+    <view class="text-center max-w-md">
9
+      <view class="w-24 h-24 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-8 animate-pulse">
10
+        <wd-icon name="laptop" size="48" color="#3b82f6" />
11
+      </view>
12
+      <text class="text-2xl font-bold text-gray-800 mb-4 block">功能开发中</text>
13
+      <text class="text-gray-500 mb-8 block">该功能正在紧张开发中,敬请期待!</text>
14
+      <view class="flex justify-center space-x-4">
15
+        <wd-button size="small" type="default" @click="uni.navigateBack()">返回</wd-button>
16
+      </view>
10 17
     </view>
11 18
   </view>
12 19
 </template>

+ 10 - 3
src/pages/archive/station/stationLicenses.vue

@@ -4,9 +4,16 @@ definePage({
4 4
 })
5 5
 </script>
6 6
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">证照档案页面</text>
7
+  <view class="page min-h-screen bg-gradient-to-br from-blue-50 to-indigo-50 flex items-center justify-center p-8">
8
+    <view class="text-center max-w-md">
9
+      <view class="w-24 h-24 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-8 animate-pulse">
10
+        <wd-icon name="laptop" size="48" color="#3b82f6" />
11
+      </view>
12
+      <text class="text-2xl font-bold text-gray-800 mb-4 block">功能开发中</text>
13
+      <text class="text-gray-500 mb-8 block">该功能正在紧张开发中,敬请期待!</text>
14
+      <view class="flex justify-center space-x-4">
15
+        <wd-button size="small" type="default" @click="uni.navigateBack()">返回</wd-button>
16
+      </view>
10 17
     </view>
11 18
   </view>
12 19
 </template>

+ 10 - 3
src/pages/archive/station/stationOilGun.vue

@@ -4,9 +4,16 @@ definePage({
4 4
 })
5 5
 </script>
6 6
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">油枪管理页面</text>
7
+  <view class="page min-h-screen bg-gradient-to-br from-blue-50 to-indigo-50 flex items-center justify-center p-8">
8
+    <view class="text-center max-w-md">
9
+      <view class="w-24 h-24 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-8 animate-pulse">
10
+        <wd-icon name="laptop" size="48" color="#3b82f6" />
11
+      </view>
12
+      <text class="text-2xl font-bold text-gray-800 mb-4 block">功能开发中</text>
13
+      <text class="text-gray-500 mb-8 block">该功能正在紧张开发中,敬请期待!</text>
14
+      <view class="flex justify-center space-x-4">
15
+        <wd-button size="small" type="default" @click="uni.navigateBack()">返回</wd-button>
16
+      </view>
10 17
     </view>
11 18
   </view>
12 19
 </template>

+ 10 - 3
src/pages/archive/station/stationOpponent.vue

@@ -4,9 +4,16 @@ definePage({
4 4
 })
5 5
 </script>
6 6
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">竞争对手档案</text>
7
+  <view class="page min-h-screen bg-gradient-to-br from-blue-50 to-indigo-50 flex items-center justify-center p-8">
8
+    <view class="text-center max-w-md">
9
+      <view class="w-24 h-24 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-8 animate-pulse">
10
+        <wd-icon name="laptop" size="48" color="#3b82f6" />
11
+      </view>
12
+      <text class="text-2xl font-bold text-gray-800 mb-4 block">功能开发中</text>
13
+      <text class="text-gray-500 mb-8 block">该功能正在紧张开发中,敬请期待!</text>
14
+      <view class="flex justify-center space-x-4">
15
+        <wd-button size="small" type="default" @click="uni.navigateBack()">返回</wd-button>
16
+      </view>
10 17
     </view>
11 18
   </view>
12 19
 </template>

+ 10 - 3
src/pages/archive/station/stationProtection.vue

@@ -4,9 +4,16 @@ definePage({
4 4
 })
5 5
 </script>
6 6
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">应急防护档案页面</text>
7
+  <view class="page min-h-screen bg-gradient-to-br from-blue-50 to-indigo-50 flex items-center justify-center p-8">
8
+    <view class="text-center max-w-md">
9
+      <view class="w-24 h-24 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-8 animate-pulse">
10
+        <wd-icon name="laptop" size="48" color="#3b82f6" />
11
+      </view>
12
+      <text class="text-2xl font-bold text-gray-800 mb-4 block">功能开发中</text>
13
+      <text class="text-gray-500 mb-8 block">该功能正在紧张开发中,敬请期待!</text>
14
+      <view class="flex justify-center space-x-4">
15
+        <wd-button size="small" type="default" @click="uni.navigateBack()">返回</wd-button>
16
+      </view>
10 17
     </view>
11 18
   </view>
12 19
 </template>

+ 327 - 4
src/pages/archive/temporary/temporaryStation.vue

@@ -1,12 +1,335 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3 9
   title: '场站新增'
4 10
 })
11
+
12
+onPageShow(() => {
13
+  const pages = getCurrentPages()
14
+  const currentPage = pages[pages.length - 1]
15
+  if (currentPage.options.perms) {
16
+    perms.value = currentPage.options.perms as string
17
+    console.log('收到的 perms 参数:', perms.value)
18
+    fetchTaskList()
19
+    fetchStationList()
20
+  }
21
+})
22
+
23
+// 任务数据接口
24
+interface Task {
25
+  id: number
26
+  taskName: string
27
+  completionStatus: number
28
+  executorName: string
29
+  createTime: string
30
+  stationId: number
31
+  createType: number
32
+  processTime: string
33
+  meetingTheme: string
34
+  meetingHost: string
35
+  meetingLocation: string
36
+  attendeesCount: number
37
+  totalCount: number
38
+}
39
+
40
+// 任务列表数据
41
+const listData = ref<Task[]>([])
42
+const loading = ref(false)
43
+const loadingMore = ref(false)
44
+const pageNum = ref(1)
45
+const hasMore = ref(true)
46
+const perms = ref('')
47
+
48
+// 筛选相关变量
49
+const filterStationId = ref('')
50
+const filterProcessStartTime = ref('')
51
+const filterProcessEndTime = ref('')
52
+const filterCreateType = ref('')
53
+const filterCompletionStatus = ref('')
54
+const filterTaskName = ref('')
55
+// 下拉框数据
56
+const stationList = ref<Array<{ value: string; label: string }>>([])
57
+const createTypeList = ref<Array<{ value: string; label: string }>>([
58
+  { value: '0', label: '系统' },
59
+  { value: '1', label: '新增' }
60
+])
61
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
62
+  { value: '0', label: '待完成' },
63
+  { value: '1', label: '按时完成' },
64
+  { value: '2', label: '逾期完成' }
65
+])
66
+
67
+// 时间选择器相关
68
+const showStartTimePicker = ref(true)
69
+const showEndTimePicker = ref(true)
70
+const calendarValue = ref('')
71
+
72
+// 获取加油站列表
73
+async function fetchStationList() {
74
+  try {
75
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
76
+    stationList.value = response.map(item => ({
77
+      value: item.id.toString(),
78
+      label: item.stationName || ''
79
+    }))
80
+    console.log(stationList.value)
81
+  } catch (error) {
82
+    console.error('获取加油站列表失败:', error)
83
+  }
84
+}
85
+
86
+// 处理时间选择确认
87
+function handleConfirm(date: any, type: 'start' | 'end') {
88
+  console.log('确认日期:', date)
89
+  
90
+  let formattedDate = ''
91
+  if (typeof date === 'object' && date.value) {
92
+    const dateObj = new Date(date.value)
93
+    const year = dateObj.getFullYear()
94
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
95
+    const day = String(dateObj.getDate()).padStart(2, '0')
96
+    formattedDate = `${year}-${month}-${day} 00:00:00`
97
+  } else if (typeof date === 'number') {
98
+    const dateObj = new Date(date)
99
+    const year = dateObj.getFullYear()
100
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
101
+    const day = String(dateObj.getDate()).padStart(2, '0')
102
+    formattedDate = `${year}-${month}-${day} 00:00:00`
103
+  } else if (typeof date === 'string') {
104
+    if (date.includes('T')) {
105
+      formattedDate = date.replace('T', ' ').substring(0, 19)
106
+    } else if (date.length === 10) {
107
+      formattedDate = date + ' 00:00:00'
108
+    } else {
109
+      formattedDate = date
110
+    }
111
+  }
112
+  console.log(formattedDate)
113
+  if (type === 'start') {
114
+    filterProcessStartTime.value = formattedDate
115
+  } else {
116
+    filterProcessEndTime.value = formattedDate
117
+  }
118
+  
119
+  calendarValue.value = formattedDate
120
+}
121
+
122
+// 获取任务列表数据
123
+async function fetchTaskList(isLoadMore = false) {
124
+  if (isLoadMore) {
125
+    loadingMore.value = true
126
+  } else {
127
+    loading.value = true
128
+    pageNum.value = 1
129
+    hasMore.value = true
130
+  }
131
+  try {
132
+    const params = {
133
+      pageSize: 10,
134
+      pageNum: pageNum.value,
135
+    }
136
+    if (filterStationId.value) {
137
+      params.stationId = filterStationId.value
138
+    }
139
+    if (filterProcessStartTime.value) {
140
+      params.processStartTime = filterProcessStartTime.value
141
+    }
142
+    
143
+    if (filterProcessEndTime.value) {
144
+      params.processEndTime = filterProcessEndTime.value
145
+    }
146
+    
147
+    if (filterCreateType.value) {
148
+      params.createType = filterCreateType.value
149
+    }
150
+    
151
+    if (filterCompletionStatus.value) {
152
+      params.completionStatus = filterCompletionStatus.value
153
+    }
154
+    
155
+    if (filterTaskName.value) {
156
+      params.taskName = filterTaskName.value
157
+    }
158
+    
159
+    if (perms.value === 'temporaryStation') {
160
+      params.taskType = 'oil_station_add'
161
+      params.taskStatusStr = '3'
162
+    }
163
+    
164
+    const response = await http.get<{ rows: any[], total: number }>('/scheduleTasks/tasks/list', params)
165
+    const newData = response.rows || []   
166
+    
167
+    const formattedData = newData.map(item => ({
168
+      detailType: 'task',
169
+      id: item.id,
170
+      taskId: item.taskId,
171
+      button: '',
172
+      title: item.meetingTheme || item.taskName || '',
173
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
174
+      statusClass: completionStatusList.value.find(status => status.value === item.completionStatus)?.value === '0' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800',
175
+      userName: item.executorName+ '/' + item.stationName || '',
176
+      createTime: item.createTime || '',
177
+      meetingHost: item.meetingHost || '',
178
+      meetingLocation: item.meetingLocation || '',
179
+      attendeesCount: item.attendeesCount || 0,
180
+      totalCount: item.totalCount || 0
181
+    }))
182
+    
183
+    if (isLoadMore) {
184
+      listData.value = [...(listData.value || []), ...formattedData]
185
+    } else {
186
+      listData.value = formattedData
187
+    }
188
+    hasMore.value = (newData || []).length === 10
189
+    pageNum.value++
190
+  }
191
+  catch (error) {
192
+    uni.showToast({
193
+      title: '获取任务列表失败',
194
+      icon: 'none',
195
+    })
196
+  }
197
+  finally {
198
+    loading.value = false
199
+    loadingMore.value = false
200
+  }
201
+}
202
+
203
+function handleRefresh() {
204
+  fetchTaskList()
205
+}
206
+
207
+function handleLoadMore() {
208
+  if (!loadingMore.value && hasMore.value) {
209
+    fetchTaskList(true)
210
+  }
211
+}
212
+
213
+function handleFilter() {
214
+  console.log('筛选数据')
215
+}
216
+
217
+function handleFilterConfirm() {
218
+  console.log('筛选确定')
219
+  fetchTaskList()
220
+}
221
+
222
+function handleFilterCancel() {
223
+  console.log('筛选取消')
224
+}
225
+
226
+function handleReset() {
227
+  console.log('重置筛选条件')
228
+  filterStationId.value = ''
229
+  filterProcessStartTime.value = ''
230
+  filterProcessEndTime.value = ''
231
+  filterCreateType.value = ''
232
+  filterCompletionStatus.value = ''
233
+  filterTaskName.value = ''
234
+}
235
+
5 236
 </script>
237
+
6 238
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">场站新增页面</text>
10
-    </view>
239
+  <view class="page min-h-screen bg-gray-100">
240
+    <JiayiList
241
+      :data="listData"
242
+      @refresh="handleRefresh"
243
+      @filter="handleFilter"
244
+      @filter-confirm="handleFilterConfirm"
245
+      @filter-cancel="handleFilterCancel"
246
+      @reset="handleReset"
247
+      @load-more="handleLoadMore"
248
+    >
249
+      <template #default="{ item }">
250
+        <view class="p-4 bg-white border-b border-gray-200">
251
+          <view class="flex justify-between items-center mb-2">
252
+            <text class="text-lg font-medium">{{ item.title }}</text>
253
+            <text class="text-sm px-2 py-1 rounded" :class="item.statusClass">
254
+              {{ item.statusName }}
255
+            </text>
256
+          </view>
257
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
258
+            <text>主持人:{{ item.meetingHost }}</text>
259
+            <text>地点:{{ item.meetingLocation }}</text>
260
+          </view>
261
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
262
+            <text>参会人数:{{ item.attendeesCount }}/{{ item.totalCount }}</text>
263
+            <text>{{ item.createTime }}</text>
264
+          </view>
265
+          <view class="flex justify-start items-center text-sm text-gray-600">
266
+            <text>执行人:{{ item.executorName }}</text>
267
+          </view>
268
+        </view>
269
+      </template>
270
+      <template #filter-content>
271
+        <view class="p-4">
272
+          <view class="text-lg font-medium mb-4">筛选条件</view>
273
+          
274
+          <!-- 任务名称搜索 -->
275
+          <view class="mb-4">
276
+            <text class="block mb-2">任务名称</text>
277
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
278
+          </view>
279
+          
280
+          <!-- 加油站下拉框 -->
281
+          <view class="mb-4">
282
+            <text class="block mb-2">加油站</text>
283
+            <wd-picker 
284
+              :columns="[stationList]" 
285
+              v-model="filterStationId" 
286
+            />
287
+          </view>
288
+          
289
+          <!-- 开始时间选择 -->
290
+          <view class="mb-4">
291
+            <text class="block mb-2">开始时间</text>
292
+            <view class="relative">
293
+              <wd-calendar 
294
+                v-model="filterProcessStartTime" 
295
+                @confirm="(date) => handleConfirm(date, 'start')" 
296
+                v-if="showStartTimePicker"
297
+              />
298
+            </view>
299
+          </view>
300
+          
301
+          <!-- 结束时间选择 -->
302
+          <view class="mb-4">
303
+            <text class="block mb-2">结束时间</text>
304
+            <view class="relative">
305
+              <wd-calendar 
306
+                v-model="filterProcessEndTime" 
307
+                @confirm="(date) => handleConfirm(date, 'end')" 
308
+                v-if="showEndTimePicker"
309
+              />
310
+            </view>
311
+          </view>
312
+          
313
+          <!-- 创建类型下拉框 -->
314
+          <view class="mb-4">
315
+            <text class="block mb-2">创建类型</text>
316
+            <wd-picker 
317
+              :columns="[createTypeList]" 
318
+              v-model="filterCreateType" 
319
+            />
320
+          </view>
321
+          
322
+          <!-- 完成状态下拉框 -->
323
+          <view class="mb-4">
324
+            <text class="block mb-2">完成状态</text>
325
+            <wd-picker 
326
+              :columns="[completionStatusList]" 
327
+              v-model="filterCompletionStatus" 
328
+            />
329
+          </view>
330
+          
331
+        </view>
332
+      </template>
333
+    </JiayiList>
11 334
   </view>
12 335
 </template>

+ 326 - 4
src/pages/archive/temporary/temporaryVisitor.vue

@@ -1,12 +1,334 @@
1 1
 <script setup lang="ts">
2
+import { ref, onMounted } from 'vue'
3
+import { onPageShow } from '@dcloudio/uni-app'
4
+
5
+import JiayiList from '@/components/jiayiList/index.vue'
6
+import { http } from '@/utils/request'
7
+
2 8
 definePage({
3 9
   title: '访客新增'
4 10
 })
11
+
12
+onPageShow(() => {
13
+  const pages = getCurrentPages()
14
+  const currentPage = pages[pages.length - 1]
15
+  if (currentPage.options.perms) {
16
+    perms.value = currentPage.options.perms as string
17
+    console.log('收到的 perms 参数:', perms.value)
18
+    fetchTaskList()
19
+    fetchStationList()
20
+  }
21
+})
22
+
23
+// 任务数据接口
24
+interface Task {
25
+  id: number
26
+  taskName: string
27
+  completionStatus: number
28
+  executorName: string
29
+  createTime: string
30
+  stationId: number
31
+  createType: number
32
+  processTime: string
33
+  meetingTheme: string
34
+  meetingHost: string
35
+  meetingLocation: string
36
+  attendeesCount: number
37
+  totalCount: number
38
+}
39
+
40
+// 任务列表数据
41
+const listData = ref<Task[]>([])
42
+const loading = ref(false)
43
+const loadingMore = ref(false)
44
+const pageNum = ref(1)
45
+const hasMore = ref(true)
46
+const perms = ref('')
47
+
48
+// 筛选相关变量
49
+const filterStationId = ref('')
50
+const filterProcessStartTime = ref('')
51
+const filterProcessEndTime = ref('')
52
+const filterCreateType = ref('')
53
+const filterCompletionStatus = ref('')
54
+const filterTaskName = ref('')
55
+// 下拉框数据
56
+const stationList = ref<Array<{ value: string; label: string }>>([])
57
+const createTypeList = ref<Array<{ value: string; label: string }>>([
58
+  { value: '0', label: '系统' },
59
+  { value: '1', label: '新增' }
60
+])
61
+const completionStatusList = ref<Array<{ value: string; label: string }>>([
62
+  { value: '0', label: '待完成' },
63
+  { value: '1', label: '按时完成' },
64
+  { value: '2', label: '逾期完成' }
65
+])
66
+
67
+// 时间选择器相关
68
+const showStartTimePicker = ref(true)
69
+const showEndTimePicker = ref(true)
70
+const calendarValue = ref('')
71
+
72
+// 获取加油站列表
73
+async function fetchStationList() {
74
+  try {
75
+    const response = await http.get<any[]>('/sysStation/station/selectAllSysStationList')
76
+    stationList.value = response.map(item => ({
77
+      value: item.id.toString(),
78
+      label: item.stationName || ''
79
+    }))
80
+    console.log(stationList.value)
81
+  } catch (error) {
82
+    console.error('获取加油站列表失败:', error)
83
+  }
84
+}
85
+
86
+// 处理时间选择确认
87
+function handleConfirm(date: any, type: 'start' | 'end') {
88
+  console.log('确认日期:', date)
89
+  
90
+  let formattedDate = ''
91
+  if (typeof date === 'object' && date.value) {
92
+    const dateObj = new Date(date.value)
93
+    const year = dateObj.getFullYear()
94
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
95
+    const day = String(dateObj.getDate()).padStart(2, '0')
96
+    formattedDate = `${year}-${month}-${day} 00:00:00`
97
+  } else if (typeof date === 'number') {
98
+    const dateObj = new Date(date)
99
+    const year = dateObj.getFullYear()
100
+    const month = String(dateObj.getMonth() + 1).padStart(2, '0')
101
+    const day = String(dateObj.getDate()).padStart(2, '0')
102
+    formattedDate = `${year}-${month}-${day} 00:00:00`
103
+  } else if (typeof date === 'string') {
104
+    if (date.includes('T')) {
105
+      formattedDate = date.replace('T', ' ').substring(0, 19)
106
+    } else if (date.length === 10) {
107
+      formattedDate = date + ' 00:00:00'
108
+    } else {
109
+      formattedDate = date
110
+    }
111
+  }
112
+  console.log(formattedDate)
113
+  if (type === 'start') {
114
+    filterProcessStartTime.value = formattedDate
115
+  } else {
116
+    filterProcessEndTime.value = formattedDate
117
+  }
118
+  
119
+  calendarValue.value = formattedDate
120
+}
121
+
122
+// 获取任务列表数据
123
+async function fetchTaskList(isLoadMore = false) {
124
+  if (isLoadMore) {
125
+    loadingMore.value = true
126
+  } else {
127
+    loading.value = true
128
+    pageNum.value = 1
129
+    hasMore.value = true
130
+  }
131
+  try {
132
+    const params = {
133
+      pageSize: 10,
134
+      pageNum: pageNum.value,
135
+    }
136
+    if (filterStationId.value) {
137
+      params.stationId = filterStationId.value
138
+    }
139
+    if (filterProcessStartTime.value) {
140
+      params.processStartTime = filterProcessStartTime.value
141
+    }
142
+    
143
+    if (filterProcessEndTime.value) {
144
+      params.processEndTime = filterProcessEndTime.value
145
+    }
146
+    
147
+    if (filterCreateType.value) {
148
+      params.createType = filterCreateType.value
149
+    }
150
+    
151
+    if (filterCompletionStatus.value) {
152
+      params.completionStatus = filterCompletionStatus.value
153
+    }
154
+    
155
+    if (filterTaskName.value) {
156
+      params.taskName = filterTaskName.value
157
+    }
158
+    if (perms.value === 'temporaryVisitor') {
159
+      params.taskType = 'visitor_add'
160
+      params.taskStatusStr = '3'
161
+    }
162
+
163
+    const response = await http.get<{ rows: any[], total: number }>('/scheduleTasks/tasks/list', params)
164
+    const newData = response.rows || []   
165
+    
166
+    const formattedData = newData.map(item => ({
167
+      detailType: 'task',
168
+      id: item.id,
169
+      taskId: item.taskId,
170
+      button: '',
171
+      title: item.meetingTheme || item.taskName || '',
172
+      statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
173
+      statusClass: completionStatusList.value.find(status => status.value === item.completionStatus)?.value === '0' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800',
174
+      userName: item.executorName+ '/' + item.stationName || '',
175
+      createTime: item.createTime || '',
176
+      meetingHost: item.meetingHost || '',
177
+      meetingLocation: item.meetingLocation || '',
178
+      attendeesCount: item.attendeesCount || 0,
179
+      totalCount: item.totalCount || 0
180
+    }))
181
+    
182
+    if (isLoadMore) {
183
+      listData.value = [...(listData.value || []), ...formattedData]
184
+    } else {
185
+      listData.value = formattedData
186
+    }
187
+    hasMore.value = (newData || []).length === 10
188
+    pageNum.value++
189
+  }
190
+  catch (error) {
191
+    uni.showToast({
192
+      title: '获取任务列表失败',
193
+      icon: 'none',
194
+    })
195
+  }
196
+  finally {
197
+    loading.value = false
198
+    loadingMore.value = false
199
+  }
200
+}
201
+
202
+function handleRefresh() {
203
+  fetchTaskList()
204
+}
205
+
206
+function handleLoadMore() {
207
+  if (!loadingMore.value && hasMore.value) {
208
+    fetchTaskList(true)
209
+  }
210
+}
211
+
212
+function handleFilter() {
213
+  console.log('筛选数据')
214
+}
215
+
216
+function handleFilterConfirm() {
217
+  console.log('筛选确定')
218
+  fetchTaskList()
219
+}
220
+
221
+function handleFilterCancel() {
222
+  console.log('筛选取消')
223
+}
224
+
225
+function handleReset() {
226
+  console.log('重置筛选条件')
227
+  filterStationId.value = ''
228
+  filterProcessStartTime.value = ''
229
+  filterProcessEndTime.value = ''
230
+  filterCreateType.value = ''
231
+  filterCompletionStatus.value = ''
232
+  filterTaskName.value = ''
233
+}
234
+
5 235
 </script>
236
+
6 237
 <template>
7
-  <view class="page">
8
-    <view class="flex items-center justify-center h-full">
9
-      <text class="text-lg">访客新增页面</text>
10
-    </view>
238
+  <view class="page min-h-screen bg-gray-100">
239
+    <JiayiList
240
+      :data="listData"
241
+      @refresh="handleRefresh"
242
+      @filter="handleFilter"
243
+      @filter-confirm="handleFilterConfirm"
244
+      @filter-cancel="handleFilterCancel"
245
+      @reset="handleReset"
246
+      @load-more="handleLoadMore"
247
+    >
248
+      <template #default="{ item }">
249
+        <view class="p-4 bg-white border-b border-gray-200">
250
+          <view class="flex justify-between items-center mb-2">
251
+            <text class="text-lg font-medium">{{ item.title }}</text>
252
+            <text class="text-sm px-2 py-1 rounded" :class="item.statusClass">
253
+              {{ item.statusName }}
254
+            </text>
255
+          </view>
256
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
257
+            <text>主持人:{{ item.meetingHost }}</text>
258
+            <text>地点:{{ item.meetingLocation }}</text>
259
+          </view>
260
+          <view class="flex justify-between items-center text-sm text-gray-600 mb-2">
261
+            <text>参会人数:{{ item.attendeesCount }}/{{ item.totalCount }}</text>
262
+            <text>{{ item.createTime }}</text>
263
+          </view>
264
+          <view class="flex justify-start items-center text-sm text-gray-600">
265
+            <text>执行人:{{ item.executorName }}</text>
266
+          </view>
267
+        </view>
268
+      </template>
269
+      <template #filter-content>
270
+        <view class="p-4">
271
+          <view class="text-lg font-medium mb-4">筛选条件</view>
272
+          
273
+          <!-- 任务名称搜索 -->
274
+          <view class="mb-4">
275
+            <text class="block mb-2">任务名称</text>
276
+            <wd-input v-model="filterTaskName" placeholder="请输入任务名称" />
277
+          </view>
278
+          
279
+          <!-- 加油站下拉框 -->
280
+          <view class="mb-4">
281
+            <text class="block mb-2">加油站</text>
282
+            <wd-picker 
283
+              :columns="[stationList]" 
284
+              v-model="filterStationId" 
285
+            />
286
+          </view>
287
+          
288
+          <!-- 开始时间选择 -->
289
+          <view class="mb-4">
290
+            <text class="block mb-2">开始时间</text>
291
+            <view class="relative">
292
+              <wd-calendar 
293
+                v-model="filterProcessStartTime" 
294
+                @confirm="(date) => handleConfirm(date, 'start')" 
295
+                v-if="showStartTimePicker"
296
+              />
297
+            </view>
298
+          </view>
299
+          
300
+          <!-- 结束时间选择 -->
301
+          <view class="mb-4">
302
+            <text class="block mb-2">结束时间</text>
303
+            <view class="relative">
304
+              <wd-calendar 
305
+                v-model="filterProcessEndTime" 
306
+                @confirm="(date) => handleConfirm(date, 'end')" 
307
+                v-if="showEndTimePicker"
308
+              />
309
+            </view>
310
+          </view>
311
+          
312
+          <!-- 创建类型下拉框 -->
313
+          <view class="mb-4">
314
+            <text class="block mb-2">创建类型</text>
315
+            <wd-picker 
316
+              :columns="[createTypeList]" 
317
+              v-model="filterCreateType" 
318
+            />
319
+          </view>
320
+          
321
+          <!-- 完成状态下拉框 -->
322
+          <view class="mb-4">
323
+            <text class="block mb-2">完成状态</text>
324
+            <wd-picker 
325
+              :columns="[completionStatusList]" 
326
+              v-model="filterCompletionStatus" 
327
+            />
328
+          </view>
329
+          
330
+        </view>
331
+      </template>
332
+    </JiayiList>
11 333
   </view>
12 334
 </template>

+ 13 - 8
src/pages/schedule/view/addgasstation/index.vue

@@ -242,30 +242,35 @@ function handleSubmit() {
242 242
             .map((item) => JSON.parse(item.response).data.fileName)
243 243
             .filter(Boolean)
244 244
             .join(','),
245
-            executorIds: model.value.executorIds.map((item) =>JSON.parse(item)),
245
+          executorIds: model.value.executorIds.map((item) => JSON.parse(item)),
246 246
           // executors: model.value.executorIds.map((item) =>
247 247
           //   String(JSON.parse(item).userId)
248 248
           // ),
249 249
           ccReceivers: model.value.ccReceivers.join(','),
250
-
251 250
           // ccReceiversName: model.value.ccReceivers.map((item) =>
252 251
           //   String(JSON.parse(item).userId)
253 252
           // ),
254 253
         }
255
-        if (model.value.formType === 'photo' || model.value.formType === 'inspection') {
254
+        if (
255
+          model.value.formType === 'photo' ||
256
+          model.value.formType === 'inspection'
257
+        ) {
256 258
           delete submitData.templateId
257 259
         } else if (model.value.formType === '3') {
258 260
           // delete submitData.taskName
259 261
           // submitData.formType = ''
260
-          submitData.taskName = getTemplateListOptions.value.find((item) => item.id === Number(model.value.templateId))?.taskName || ''
262
+          submitData.taskName =
263
+            getTemplateListOptions.value.find(
264
+              (item) => item.id === Number(model.value.templateId)
265
+            )?.taskName || ''
261 266
         }
262
-        if(getoptions.value==='新增油站'){
267
+        if (getoptions.value === '新增油站') {
263 268
           //  submitData['executorIds']=model.value.executorIds.map((item) => JSON.parse(item))
264
-           delete submitData.stationId
265
-        }else if(getoptions.value==='新增访客'){
269
+          delete submitData.stationId
270
+        } else if (getoptions.value === '新增访客') {
266 271
           //  submitData['executorId']=model.value.executorIds.map((item) => JSON.parse(item))
267 272
           //  delete submitData.executorIds
268
-           submitData.stationId=model.value.stationId.join(',')
273
+          submitData.stationId = model.value.stationId.join(',')
269 274
         }
270 275
         const res = (await addtodoaskslist(submitData)) as any
271 276
         if (res?.code === 200) {

+ 1 - 1
src/pages/schedule/view/index.vue

@@ -26,7 +26,7 @@ interface CalendarDate {
26 26
 const mainloing = ref(false)
27 27
 const GasStationId = ref('')
28 28
 const currentMonth = ref(new Date())
29
-const isExpanded = ref(true)
29
+const isExpanded = ref(false)
30 30
 const radioActive = ref('日')
31 31
 const selectedDate = ref(new Date())
32 32
 const overduedaylist = ref([]) as any // 逾期任务列表