浏览代码

归档相关信息

miaofuhao 3 周之前
父节点
当前提交
0e58ca2e59

+ 11 - 4
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?taskId=${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}`
@@ -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: 'HSSEDrill'
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
+  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.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>

+ 1 - 15
src/pages/archive/cpns/checkTask.vue

@@ -188,7 +188,7 @@ async function fetchTaskList(isLoadMore = false) {
188 188
       statusName: item.completionStatus === 0 ? '待完成' : item.completionStatus === 1 ? '逾期完成' : '按时完成',
189 189
       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 190
       userName: item.executorName+ '/' + item.stationName || '',
191
-      createTime: item.createTime || '',
191
+      createTime: item.processTime || item.createTime || '',
192 192
     }))
193 193
     
194 194
     if (isLoadMore) {
@@ -264,20 +264,6 @@ function handleReset() {
264 264
       @reset="handleReset"
265 265
       @load-more="handleLoadMore"
266 266
     >
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 267
       <template #filter-content>
282 268
         <view class="p-4">
283 269
           <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 }>('/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>

+ 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 }>>([])

+ 19 - 1
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) {
@@ -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>

+ 326 - 4
src/pages/archive/temporary/temporaryStation.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
+const typeDataData = ref<any>({
56
+  temporaryStation:'temporary_task',
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
+    
162
+    params.directoryType = typeDataData.value[perms.value]
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>

+ 325 - 4
src/pages/archive/temporary/temporaryVisitor.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
+  temporaryVisitor:'temporary_task',
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 }>('/scheduleTasks/tasks/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>