Explorar el Código

feat: 新增运行数据管理模块

新增查获数据、日常运行数据、候检区数据和劝阻充电宝数据的管理功能
包括列表展示、增删改查、导入导出等基础功能
huoyi hace 1 mes
padre
commit
0a99faa5aa

+ 72 - 0
src/api/runData/collectWaitingAreaData.js

@@ -0,0 +1,72 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询候检区数据列表
4
+export function listCollectWaitingAreaData(query) {
5
+  return request({
6
+    url: '/runData/collectWaitingAreaData/list',
7
+    method: 'get',
8
+    params: query
9
+  })
10
+}
11
+
12
+// 查询候检区数据详细
13
+export function getCollectWaitingAreaData(id) {
14
+  return request({
15
+    url: '/runData/collectWaitingAreaData/' + id,
16
+    method: 'get'
17
+  })
18
+}
19
+
20
+// 新增候检区数据
21
+export function addCollectWaitingAreaData(data) {
22
+  return request({
23
+    url: '/runData/collectWaitingAreaData',
24
+    method: 'post',
25
+    data: data
26
+  })
27
+}
28
+
29
+// 修改候检区数据
30
+export function updateCollectWaitingAreaData(data) {
31
+  return request({
32
+    url: '/runData/collectWaitingAreaData',
33
+    method: 'put',
34
+    data: data
35
+  })
36
+}
37
+
38
+// 删除候检区数据
39
+export function delCollectWaitingAreaData(id) {
40
+  return request({
41
+    url: '/runData/collectWaitingAreaData/' + id,
42
+    method: 'delete'
43
+  })
44
+}
45
+
46
+// 导出候检区数据
47
+export function exportCollectWaitingAreaData(query) {
48
+  return request({
49
+    url: '/runData/collectWaitingAreaData/export',
50
+    method: 'get',
51
+    params: query,
52
+    responseType: 'blob'
53
+  })
54
+}
55
+
56
+// 导入候检区数据
57
+export function importCollectWaitingAreaData(data) {
58
+  return request({
59
+    url: '/runData/collectWaitingAreaData/importData',
60
+    method: 'post',
61
+    data: data
62
+  })
63
+}
64
+
65
+// 下载导入模板
66
+export function importTemplate() {
67
+  return request({
68
+    url: '/runData/collectWaitingAreaData/importTemplate',
69
+    method: 'get',
70
+    responseType: 'blob'
71
+  })
72
+}

+ 72 - 0
src/api/runData/dailyRunData.js

@@ -0,0 +1,72 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询日常运行数据列表
4
+export function listDailyRunData(query) {
5
+  return request({
6
+    url: '/runData/dailyRunData/list',
7
+    method: 'get',
8
+    params: query
9
+  })
10
+}
11
+
12
+// 查询日常运行数据详细
13
+export function getDailyRunData(id) {
14
+  return request({
15
+    url: '/runData/dailyRunData/' + id,
16
+    method: 'get'
17
+  })
18
+}
19
+
20
+// 新增日常运行数据
21
+export function addDailyRunData(data) {
22
+  return request({
23
+    url: '/runData/dailyRunData',
24
+    method: 'post',
25
+    data: data
26
+  })
27
+}
28
+
29
+// 修改日常运行数据
30
+export function updateDailyRunData(data) {
31
+  return request({
32
+    url: '/runData/dailyRunData',
33
+    method: 'put',
34
+    data: data
35
+  })
36
+}
37
+
38
+// 删除日常运行数据
39
+export function delDailyRunData(id) {
40
+  return request({
41
+    url: '/runData/dailyRunData/' + id,
42
+    method: 'delete'
43
+  })
44
+}
45
+
46
+// 导出日常运行数据
47
+export function exportDailyRunData(query) {
48
+  return request({
49
+    url: '/runData/dailyRunData/export',
50
+    method: 'get',
51
+    params: query,
52
+    responseType: 'blob'
53
+  })
54
+}
55
+
56
+// 导入日常运行数据
57
+export function importDailyRunData(data) {
58
+  return request({
59
+    url: '/runData/dailyRunData/importData',
60
+    method: 'post',
61
+    data: data
62
+  })
63
+}
64
+
65
+// 下载导入模板
66
+export function importTemplate() {
67
+  return request({
68
+    url: '/runData/dailyRunData/importTemplate',
69
+    method: 'get',
70
+    responseType: 'blob'
71
+  })
72
+}

+ 72 - 0
src/api/runData/discouragePowerBanksData.js

@@ -0,0 +1,72 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询劝阻充电宝数据列表
4
+export function listDiscouragePowerBanksData(query) {
5
+  return request({
6
+    url: '/runData/discouragePowerBanksData/list',
7
+    method: 'get',
8
+    params: query
9
+  })
10
+}
11
+
12
+// 查询劝阻充电宝数据详细
13
+export function getDiscouragePowerBanksData(id) {
14
+  return request({
15
+    url: '/runData/discouragePowerBanksData/' + id,
16
+    method: 'get'
17
+  })
18
+}
19
+
20
+// 新增劝阻充电宝数据
21
+export function addDiscouragePowerBanksData(data) {
22
+  return request({
23
+    url: '/runData/discouragePowerBanksData',
24
+    method: 'post',
25
+    data: data
26
+  })
27
+}
28
+
29
+// 修改劝阻充电宝数据
30
+export function updateDiscouragePowerBanksData(data) {
31
+  return request({
32
+    url: '/runData/discouragePowerBanksData',
33
+    method: 'put',
34
+    data: data
35
+  })
36
+}
37
+
38
+// 删除劝阻充电宝数据
39
+export function delDiscouragePowerBanksData(id) {
40
+  return request({
41
+    url: '/runData/discouragePowerBanksData/' + id,
42
+    method: 'delete'
43
+  })
44
+}
45
+
46
+// 导出劝阻充电宝数据
47
+export function exportDiscouragePowerBanksData(query) {
48
+  return request({
49
+    url: '/runData/discouragePowerBanksData/export',
50
+    method: 'get',
51
+    params: query,
52
+    responseType: 'blob'
53
+  })
54
+}
55
+
56
+// 导入劝阻充电宝数据
57
+export function importDiscouragePowerBanksData(data) {
58
+  return request({
59
+    url: '/runData/discouragePowerBanksData/importData',
60
+    method: 'post',
61
+    data: data
62
+  })
63
+}
64
+
65
+// 下载导入模板
66
+export function importTemplate() {
67
+  return request({
68
+    url: '/runData/discouragePowerBanksData/importTemplate',
69
+    method: 'get',
70
+    responseType: 'blob'
71
+  })
72
+}

+ 72 - 0
src/api/runData/seizeData.js

@@ -0,0 +1,72 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询查获数据列表
4
+export function listSeizeData(query) {
5
+  return request({
6
+    url: '/runData/seizeData/list',
7
+    method: 'get',
8
+    params: query
9
+  })
10
+}
11
+
12
+// 查询查获数据详细
13
+export function getSeizeData(id) {
14
+  return request({
15
+    url: '/runData/seizeData/' + id,
16
+    method: 'get'
17
+  })
18
+}
19
+
20
+// 新增查获数据
21
+export function addSeizeData(data) {
22
+  return request({
23
+    url: '/runData/seizeData',
24
+    method: 'post',
25
+    data: data
26
+  })
27
+}
28
+
29
+// 修改查获数据
30
+export function updateSeizeData(data) {
31
+  return request({
32
+    url: '/runData/seizeData',
33
+    method: 'put',
34
+    data: data
35
+  })
36
+}
37
+
38
+// 删除查获数据
39
+export function delSeizeData(id) {
40
+  return request({
41
+    url: '/runData/seizeData/' + id,
42
+    method: 'delete'
43
+  })
44
+}
45
+
46
+// 导出查获数据
47
+export function exportSeizeData(query) {
48
+  return request({
49
+    url: '/runData/seizeData/export',
50
+    method: 'get',
51
+    params: query,
52
+    responseType: 'blob'
53
+  })
54
+}
55
+
56
+// 导入查获数据
57
+export function importSeizeData(data) {
58
+  return request({
59
+    url: '/runData/seizeData/importData',
60
+    method: 'post',
61
+    data: data
62
+  })
63
+}
64
+
65
+// 下载导入模板
66
+export function importTemplate() {
67
+  return request({
68
+    url: '/runData/seizeData/importTemplate',
69
+    method: 'get',
70
+    responseType: 'blob'
71
+  })
72
+}

+ 461 - 0
src/views/runData/collectWaitingAreaData/index.vue

@@ -0,0 +1,461 @@
1
+<template>
2
+  <div class="app-container">
3
+    <!-- 查询条件 -->
4
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
5
+      <el-form-item label="日期" prop="date">
6
+        <el-date-picker v-model="queryParams.date" type="date" placeholder="请选择日期" value-format="YYYY-MM-DD" 
7
+          style="width: 200px" />
8
+      </el-form-item>
9
+      <el-form-item label="时间段" prop="timePeriod">
10
+        <el-input v-model="queryParams.timePeriod" placeholder="请输入时间段" clearable style="width: 200px" />
11
+      </el-form-item>
12
+      <el-form-item>
13
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
14
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
15
+      </el-form-item>
16
+    </el-form>
17
+
18
+    <!-- 按钮区域 -->
19
+    <el-row :gutter="10" class="mb8">
20
+      <el-col :span="1.5">
21
+        <el-button type="primary" plain icon="Plus" @click="handleAdd"
22
+          v-hasPermi="['runData:collectWaitingAreaData:add']">新增</el-button>
23
+      </el-col>
24
+      <el-col :span="1.5">
25
+        <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
26
+          v-hasPermi="['runData:collectWaitingAreaData:edit']">修改</el-button>
27
+      </el-col>
28
+      <el-col :span="1.5">
29
+        <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
30
+          v-hasPermi="['runData:collectWaitingAreaData:remove']">删除</el-button>
31
+      </el-col>
32
+      <el-col :span="1.5">
33
+        <el-button type="info" plain icon="Upload" @click="handleImport"
34
+          v-hasPermi="['runData:collectWaitingAreaData:import']">导入</el-button>
35
+      </el-col>
36
+      <el-col :span="1.5">
37
+        <el-button type="warning" plain icon="Download" @click="handleExport"
38
+          v-hasPermi="['runData:collectWaitingAreaData:export']">导出</el-button>
39
+      </el-col>
40
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
41
+    </el-row>
42
+
43
+    <!-- 数据表格 -->
44
+    <el-table v-loading="loading" :data="collectWaitingAreaDataList" @selection-change="handleSelectionChange">
45
+      <el-table-column type="selection" width="55" align="center" />
46
+      <el-table-column label="日期" align="center" prop="date" />
47
+      <el-table-column label="时间段" align="center" prop="timePeriod" />
48
+      
49
+      <!-- T1区域数据 -->
50
+      <el-table-column label="T1A区火种" align="center" prop="t1aFire" />
51
+      <el-table-column label="T1A区液态物品" align="center" prop="t1aLiquid" />
52
+      <el-table-column label="T1A区其他物品" align="center" prop="t1aOther" />
53
+      <el-table-column label="T1B区火种" align="center" prop="t1bFire" />
54
+      <el-table-column label="T1B区液态物品" align="center" prop="t1bLiquid" />
55
+      <el-table-column label="T1B区其他物品" align="center" prop="t1bOther" />
56
+      
57
+      <!-- T2区域数据 -->
58
+      <el-table-column label="T2国内火种" align="center" prop="t2DomesticFire" />
59
+      <el-table-column label="T2国内液态物品" align="center" prop="t2DomesticLiquid" />
60
+      <el-table-column label="T2国内其他物品" align="center" prop="t2DomesticOther" />
61
+      <el-table-column label="T2国际火种" align="center" prop="t2InternationalFire" />
62
+      <el-table-column label="T2国际液态物品" align="center" prop="t2InternationalLiquid" />
63
+      <el-table-column label="T2国际中转火种" align="center" prop="t2InternationalTransitFire" />
64
+      <el-table-column label="T2中转火种" align="center" prop="t2TransitFire" />
65
+      <el-table-column label="T2中转液态物品" align="center" prop="t2TransitLiquid" />
66
+      <el-table-column label="T2中转其他物品" align="center" prop="t2TransitOther" />
67
+      
68
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
69
+        <template #default="scope">
70
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
71
+            v-hasPermi="['runData:collectWaitingAreaData:edit']">修改</el-button>
72
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
73
+            v-hasPermi="['runData:collectWaitingAreaData:remove']">删除</el-button>
74
+        </template>
75
+      </el-table-column>
76
+    </el-table>
77
+
78
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
79
+      v-model:limit="queryParams.pageSize" @pagination="getList" />
80
+
81
+    <!-- 添加或修改候检区数据对话框 -->
82
+    <el-dialog :title="title" v-model="open" width="800px" append-to-body>
83
+      <el-form ref="collectWaitingAreaDataRef" :model="form" :rules="rules" label-width="140px">
84
+        <el-row :gutter="20">
85
+          <el-col :span="12">
86
+            <el-form-item label="日期" prop="date">
87
+              <el-date-picker v-model="form.date" type="date" placeholder="请选择日期" value-format="YYYY-MM-DD" 
88
+                style="width: 100%" />
89
+            </el-form-item>
90
+          </el-col>
91
+          <el-col :span="12">
92
+            <el-form-item label="时间段" prop="timePeriod">
93
+              <el-input v-model="form.timePeriod" placeholder="请输入时间段" />
94
+            </el-form-item>
95
+          </el-col>
96
+        </el-row>
97
+        
98
+        <!-- T1区域 -->
99
+        <el-divider content-position="left">T1区域数据</el-divider>
100
+        <el-row :gutter="20">
101
+          <el-col :span="12">
102
+            <h4 style="margin-bottom: 15px;">T1A区</h4>
103
+            <el-form-item label="T1A区火种" prop="t1aFire">
104
+              <el-input-number v-model="form.t1aFire" :min="0" placeholder="请输入T1A区火种" style="width: 100%" />
105
+            </el-form-item>
106
+            <el-form-item label="T1A区液态物品" prop="t1aLiquid">
107
+              <el-input-number v-model="form.t1aLiquid" :min="0" placeholder="请输入T1A区液态物品" style="width: 100%" />
108
+            </el-form-item>
109
+            <el-form-item label="T1A区其他物品" prop="t1aOther">
110
+              <el-input-number v-model="form.t1aOther" :min="0" placeholder="请输入T1A区其他物品" style="width: 100%" />
111
+            </el-form-item>
112
+          </el-col>
113
+          <el-col :span="12">
114
+            <h4 style="margin-bottom: 15px;">T1B区</h4>
115
+            <el-form-item label="T1B区火种" prop="t1bFire">
116
+              <el-input-number v-model="form.t1bFire" :min="0" placeholder="请输入T1B区火种" style="width: 100%" />
117
+            </el-form-item>
118
+            <el-form-item label="T1B区液态物品" prop="t1bLiquid">
119
+              <el-input-number v-model="form.t1bLiquid" :min="0" placeholder="请输入T1B区液态物品" style="width: 100%" />
120
+            </el-form-item>
121
+            <el-form-item label="T1B区其他物品" prop="t1bOther">
122
+              <el-input-number v-model="form.t1bOther" :min="0" placeholder="请输入T1B区其他物品" style="width: 100%" />
123
+            </el-form-item>
124
+          </el-col>
125
+        </el-row>
126
+        
127
+        <!-- T2区域 -->
128
+        <el-divider content-position="left">T2区域数据</el-divider>
129
+        <el-row :gutter="20">
130
+          <el-col :span="8">
131
+            <h4 style="margin-bottom: 15px;">T2国内</h4>
132
+            <el-form-item label="T2国内火种" prop="t2DomesticFire">
133
+              <el-input-number v-model="form.t2DomesticFire" :min="0" placeholder="请输入T2国内火种" style="width: 100%" />
134
+            </el-form-item>
135
+            <el-form-item label="T2国内液态物品" prop="t2DomesticLiquid">
136
+              <el-input-number v-model="form.t2DomesticLiquid" :min="0" placeholder="请输入T2国内液态物品" style="width: 100%" />
137
+            </el-form-item>
138
+            <el-form-item label="T2国内其他物品" prop="t2DomesticOther">
139
+              <el-input-number v-model="form.t2DomesticOther" :min="0" placeholder="请输入T2国内其他物品" style="width: 100%" />
140
+            </el-form-item>
141
+          </el-col>
142
+          <el-col :span="8">
143
+            <h4 style="margin-bottom: 15px;">T2国际</h4>
144
+            <el-form-item label="T2国际火种" prop="t2InternationalFire">
145
+              <el-input-number v-model="form.t2InternationalFire" :min="0" placeholder="请输入T2国际火种" style="width: 100%" />
146
+            </el-form-item>
147
+            <el-form-item label="T2国际液态物品" prop="t2InternationalLiquid">
148
+              <el-input-number v-model="form.t2InternationalLiquid" :min="0" placeholder="请输入T2国际液态物品" style="width: 100%" />
149
+            </el-form-item>
150
+            <el-form-item label="T2国际中转火种" prop="t2InternationalTransitFire">
151
+              <el-input-number v-model="form.t2InternationalTransitFire" :min="0" placeholder="请输入T2国际中转火种" style="width: 100%" />
152
+            </el-form-item>
153
+          </el-col>
154
+          <el-col :span="8">
155
+            <h4 style="margin-bottom: 15px;">T2中转</h4>
156
+            <el-form-item label="T2中转火种" prop="t2TransitFire">
157
+              <el-input-number v-model="form.t2TransitFire" :min="0" placeholder="请输入T2中转火种" style="width: 100%" />
158
+            </el-form-item>
159
+            <el-form-item label="T2中转液态物品" prop="t2TransitLiquid">
160
+              <el-input-number v-model="form.t2TransitLiquid" :min="0" placeholder="请输入T2中转液态物品" style="width: 100%" />
161
+            </el-form-item>
162
+            <el-form-item label="T2中转其他物品" prop="t2TransitOther">
163
+              <el-input-number v-model="form.t2TransitOther" :min="0" placeholder="请输入T2中转其他物品" style="width: 100%" />
164
+            </el-form-item>
165
+          </el-col>
166
+        </el-row>
167
+      </el-form>
168
+      <template #footer>
169
+        <div class="dialog-footer">
170
+          <el-button type="primary" @click="submitForm">确 定</el-button>
171
+          <el-button @click="cancel">取 消</el-button>
172
+        </div>
173
+      </template>
174
+    </el-dialog>
175
+
176
+    <!-- 导入对话框 -->
177
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
178
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
179
+        :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
180
+        :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
181
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
182
+        <div class="el-upload__text">
183
+          将文件拖到此处,或<em>点击上传</em>
184
+        </div>
185
+        <template #tip>
186
+          <div class="el-upload__tip">
187
+            <span>仅允许导入xls、xlsx格式文件。</span>
188
+            <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
189
+              @click="importTemplate">下载模板</el-link>
190
+          </div>
191
+        </template>
192
+      </el-upload>
193
+      <template #footer>
194
+        <div class="dialog-footer">
195
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
196
+          <el-button @click="upload.open = false">取 消</el-button>
197
+        </div>
198
+      </template>
199
+    </el-dialog>
200
+  </div>
201
+</template>
202
+
203
+<script setup name="CollectWaitingAreaData">
204
+import { listCollectWaitingAreaData, getCollectWaitingAreaData, delCollectWaitingAreaData, addCollectWaitingAreaData, updateCollectWaitingAreaData } from "@/api/runData/collectWaitingAreaData"
205
+import { getToken } from '@/utils/auth'
206
+
207
+const { proxy } = getCurrentInstance()
208
+
209
+const collectWaitingAreaDataList = ref([])
210
+const open = ref(false)
211
+const loading = ref(true)
212
+const showSearch = ref(true)
213
+const ids = ref([])
214
+const single = ref(true)
215
+const multiple = ref(true)
216
+const total = ref(0)
217
+const title = ref("")
218
+
219
+// 导入参数
220
+const upload = reactive({
221
+  // 是否显示弹出层
222
+  open: false,
223
+  // 弹出层标题
224
+  title: "",
225
+  // 是否禁用上传
226
+  isUploading: false,
227
+  // 是否更新已经存在的候检区数据
228
+  updateSupport: 0,
229
+  // 设置上传的请求头部
230
+  headers: { Authorization: "Bearer " + getToken() },
231
+  // 上传的地址
232
+  url: import.meta.env.VITE_APP_BASE_API + "/runData/collectWaitingAreaData/importData"
233
+})
234
+
235
+const uploadRef = ref()
236
+
237
+const data = reactive({
238
+  form: {},
239
+  queryParams: {
240
+    pageNum: 1,
241
+    pageSize: 10,
242
+    date: null,
243
+    timePeriod: null
244
+  },
245
+  rules: {
246
+    date: [
247
+      { required: true, message: "日期不能为空", trigger: "blur" }
248
+    ],
249
+    timePeriod: [
250
+      { required: true, message: "时间段不能为空", trigger: "blur" }
251
+    ],
252
+    t1aFire: [
253
+      { type: "integer", message: "T1A区火种必须为整数", trigger: "blur" }
254
+    ],
255
+    t1aLiquid: [
256
+      { type: "integer", message: "T1A区液态物品必须为整数", trigger: "blur" }
257
+    ],
258
+    t1aOther: [
259
+      { type: "integer", message: "T1A区其他物品必须为整数", trigger: "blur" }
260
+    ],
261
+    t1bFire: [
262
+      { type: "integer", message: "T1B区火种必须为整数", trigger: "blur" }
263
+    ],
264
+    t1bLiquid: [
265
+      { type: "integer", message: "T1B区液态物品必须为整数", trigger: "blur" }
266
+    ],
267
+    t1bOther: [
268
+      { type: "integer", message: "T1B区其他物品必须为整数", trigger: "blur" }
269
+    ],
270
+    t2DomesticFire: [
271
+      { type: "integer", message: "T2国内火种必须为整数", trigger: "blur" }
272
+    ],
273
+    t2DomesticLiquid: [
274
+      { type: "integer", message: "T2国内液态物品必须为整数", trigger: "blur" }
275
+    ],
276
+    t2DomesticOther: [
277
+      { type: "integer", message: "T2国内其他物品必须为整数", trigger: "blur" }
278
+    ],
279
+    t2InternationalFire: [
280
+      { type: "integer", message: "T2国际火种必须为整数", trigger: "blur" }
281
+    ],
282
+    t2InternationalLiquid: [
283
+      { type: "integer", message: "T2国际液态物品必须为整数", trigger: "blur" }
284
+    ],
285
+    t2InternationalTransitFire: [
286
+      { type: "integer", message: "T2国际中转火种必须为整数", trigger: "blur" }
287
+    ],
288
+    t2TransitFire: [
289
+      { type: "integer", message: "T2中转火种必须为整数", trigger: "blur" }
290
+    ],
291
+    t2TransitLiquid: [
292
+      { type: "integer", message: "T2中转液态物品必须为整数", trigger: "blur" }
293
+    ],
294
+    t2TransitOther: [
295
+      { type: "integer", message: "T2中转其他物品必须为整数", trigger: "blur" }
296
+    ]
297
+  }
298
+})
299
+
300
+const { queryParams, form, rules } = toRefs(data)
301
+
302
+/** 查询候检区数据列表 */
303
+function getList() {
304
+  loading.value = true
305
+  listCollectWaitingAreaData(queryParams.value).then(response => {
306
+    collectWaitingAreaDataList.value = response.rows
307
+    total.value = response.total
308
+    loading.value = false
309
+  })
310
+}
311
+
312
+// 取消按钮
313
+function cancel() {
314
+  open.value = false
315
+  reset()
316
+}
317
+
318
+// 表单重置
319
+function reset() {
320
+  form.value = {
321
+    id: null,
322
+    date: null,
323
+    timePeriod: null,
324
+    // T1区域数据
325
+    t1aFire: null,
326
+    t1aLiquid: null,
327
+    t1aOther: null,
328
+    t1bFire: null,
329
+    t1bLiquid: null,
330
+    t1bOther: null,
331
+    // T2区域数据
332
+    t2DomesticFire: null,
333
+    t2DomesticLiquid: null,
334
+    t2DomesticOther: null,
335
+    t2InternationalFire: null,
336
+    t2InternationalLiquid: null,
337
+    t2InternationalTransitFire: null,
338
+    t2TransitFire: null,
339
+    t2TransitLiquid: null,
340
+    t2TransitOther: null
341
+  }
342
+  proxy.resetForm("collectWaitingAreaDataRef")
343
+}
344
+
345
+/** 搜索按钮操作 */
346
+function handleQuery() {
347
+  queryParams.value.pageNum = 1
348
+  getList()
349
+}
350
+
351
+/** 重置按钮操作 */
352
+function resetQuery() {
353
+  proxy.resetForm("queryRef")
354
+  handleQuery()
355
+}
356
+
357
+// 多选框选中数据
358
+function handleSelectionChange(selection) {
359
+  ids.value = selection.map(item => item.id)
360
+  single.value = selection.length != 1
361
+  multiple.value = !selection.length
362
+}
363
+
364
+/** 新增按钮操作 */
365
+function handleAdd() {
366
+  reset()
367
+  open.value = true
368
+  title.value = "添加候检区数据"
369
+}
370
+
371
+/** 修改按钮操作 */
372
+function handleUpdate(row) {
373
+  reset()
374
+  const _id = row.id || ids.value
375
+  getCollectWaitingAreaData(_id).then(response => {
376
+    form.value = response.data
377
+    open.value = true
378
+    title.value = "修改候检区数据"
379
+  })
380
+}
381
+
382
+/** 提交按钮 */
383
+function submitForm() {
384
+  proxy.$refs["collectWaitingAreaDataRef"].validate(valid => {
385
+    if (valid) {
386
+      if (form.value.id != null) {
387
+        updateCollectWaitingAreaData(form.value).then(response => {
388
+          proxy.$modal.msgSuccess("修改成功")
389
+          open.value = false
390
+          getList()
391
+        })
392
+      } else {
393
+        addCollectWaitingAreaData(form.value).then(response => {
394
+          proxy.$modal.msgSuccess("新增成功")
395
+          open.value = false
396
+          getList()
397
+        })
398
+      }
399
+    }
400
+  })
401
+}
402
+
403
+/** 删除按钮操作 */
404
+function handleDelete(row) {
405
+  const _ids = row.id || ids.value
406
+  proxy.$modal.confirm('是否确认删除数据项?').then(function () {
407
+    return delCollectWaitingAreaData(_ids)
408
+  }).then(() => {
409
+    getList()
410
+    proxy.$modal.msgSuccess("删除成功")
411
+  }).catch(() => { })
412
+}
413
+
414
+/** 导出按钮操作 */
415
+function handleExport() {
416
+  // 过滤掉值为null的参数,但保留分页参数
417
+  const filteredParams = Object.fromEntries(
418
+    Object.entries(queryParams.value).filter(([key, value]) => {
419
+      // 保留分页参数
420
+      if (key === 'pageNum' || key === 'pageSize') return true
421
+      // 过滤掉其他为null的参数
422
+      return value !== null
423
+    })
424
+  )
425
+  
426
+  proxy.download('/runData/collectWaitingAreaData/export', filteredParams, `collectWaitingAreaData_${new Date().getTime()}.xlsx`)
427
+}
428
+
429
+/** 导入按钮操作 */
430
+function handleImport() {
431
+  upload.title = "候检区数据导入"
432
+  upload.open = true
433
+}
434
+
435
+/** 下载模板操作 */
436
+function importTemplate() {
437
+  proxy.download('/runData/collectWaitingAreaData/importTemplate', {
438
+  }, `候检区数据导入模板_${new Date().getTime()}.xlsx`)
439
+}
440
+
441
+/** 文件上传中处理 */
442
+const handleFileUploadProgress = (event, file, fileList) => {
443
+  upload.isUploading = true
444
+}
445
+
446
+/** 文件上传成功处理 */
447
+const handleFileSuccess = (response, file, fileList) => {
448
+  upload.open = false
449
+  upload.isUploading = false
450
+  uploadRef.value.handleRemove(file)
451
+  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true })
452
+  getList()
453
+}
454
+
455
+/** 提交上传文件 */
456
+function submitFileForm() {
457
+  uploadRef.value.submit()
458
+}
459
+
460
+getList()
461
+</script>

+ 0 - 0
src/views/runData/collectWaitingAreaData/待检区收缴数据


+ 505 - 0
src/views/runData/dailyRunData/index.vue

@@ -0,0 +1,505 @@
1
+<template>
2
+  <div class="app-container">
3
+    <!-- 查询条件 -->
4
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
5
+      <el-form-item label="日期" prop="date">
6
+        <el-date-picker v-model="queryParams.date" type="date" placeholder="请选择日期" value-format="YYYY-MM-DD" 
7
+          style="width: 200px" />
8
+      </el-form-item>
9
+      <el-form-item>
10
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
11
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
12
+      </el-form-item>
13
+    </el-form>
14
+
15
+    <!-- 按钮区域 -->
16
+    <el-row :gutter="10" class="mb8">
17
+      <el-col :span="1.5">
18
+        <el-button type="primary" plain icon="Plus" @click="handleAdd"
19
+          v-hasPermi="['runData:dailyRunData:add']">新增</el-button>
20
+      </el-col>
21
+      <el-col :span="1.5">
22
+        <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
23
+          v-hasPermi="['runData:dailyRunData:edit']">修改</el-button>
24
+      </el-col>
25
+      <el-col :span="1.5">
26
+        <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
27
+          v-hasPermi="['runData:dailyRunData:remove']">删除</el-button>
28
+      </el-col>
29
+      <el-col :span="1.5">
30
+        <el-button type="info" plain icon="Upload" @click="handleImport"
31
+          v-hasPermi="['runData:dailyRunData:import']">导入</el-button>
32
+      </el-col>
33
+      <el-col :span="1.5">
34
+        <el-button type="warning" plain icon="Download" @click="handleExport"
35
+          v-hasPermi="['runData:dailyRunData:export']">导出</el-button>
36
+      </el-col>
37
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
38
+    </el-row>
39
+
40
+    <!-- 数据表格 -->
41
+    <el-table v-loading="loading" :data="dailyRunDataList" @selection-change="handleSelectionChange">
42
+      <el-table-column type="selection" width="55" align="center" />
43
+      <el-table-column label="日期" align="center" prop="date" />
44
+      <el-table-column label="A区" align="center" prop="areaA" />
45
+      <el-table-column label="B区" align="center" prop="areaB" />
46
+      <el-table-column label="贵宾" align="center" prop="vip" />
47
+      <el-table-column label="国内旅检" align="center" prop="domesticTravelInspection" />
48
+      <el-table-column label="国际旅检" align="center" prop="internationalTravelInspection" />
49
+      <el-table-column label="贵宾通道" align="center" prop="vipChannel" />
50
+      <el-table-column label="T1回流通道" align="center" prop="t1ReturnChannel" />
51
+      <el-table-column label="T1行检" align="center" prop="t1Inspection" />
52
+      <el-table-column label="一楼员工" align="center" prop="firstFloorStaff" />
53
+      <el-table-column label="T2回流通道" align="center" prop="t2ReturnChannel" />
54
+      <el-table-column label="T2行检" align="center" prop="t2Inspection" />
55
+      <el-table-column label="三楼" align="center" prop="thirdFloor" />
56
+      <el-table-column label="一楼" align="center" prop="firstFloor" />
57
+      <el-table-column label="负一楼" align="center" prop="basementFloor" />
58
+      <el-table-column label="国内货站" align="center" prop="domesticCargo" />
59
+      <el-table-column label="道口" align="center" prop="gate" />
60
+      <el-table-column label="南侧车检" align="center" prop="southVehicleInspection" />
61
+      <el-table-column label="防爆" align="center" prop="explosionProof" />
62
+      <el-table-column label="国际货站" align="center" prop="internationalCargo" />
63
+      <el-table-column label="道口" align="center" prop="gate2" />
64
+      <el-table-column label="北侧车检" align="center" prop="northVehicleInspection" />
65
+      <el-table-column label="防爆" align="center" prop="explosionProof2" />
66
+      <el-table-column label="车检总数" align="center" prop="totalVehicleInspection" />
67
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
68
+        <template #default="scope">
69
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
70
+            v-hasPermi="['runData:dailyRunData:edit']">修改</el-button>
71
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
72
+            v-hasPermi="['runData:dailyRunData:remove']">删除</el-button>
73
+        </template>
74
+      </el-table-column>
75
+    </el-table>
76
+
77
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
78
+      v-model:limit="queryParams.pageSize" @pagination="getList" />
79
+
80
+    <!-- 添加或修改日常运行数据对话框 -->
81
+    <el-dialog :title="title" v-model="open" width="800px" append-to-body>
82
+      <el-form ref="dailyRunDataRef" :model="form" :rules="rules" label-width="120px">
83
+        <el-form-item label="日期" prop="date">
84
+          <el-date-picker v-model="form.date" type="date" placeholder="请选择日期" value-format="YYYY-MM-DD" 
85
+            style="width: 100%" />
86
+        </el-form-item>
87
+        
88
+        <el-row :gutter="20">
89
+          <el-col :span="12">
90
+            <el-form-item label="A区" prop="areaA">
91
+              <el-input-number v-model="form.areaA" :min="0" placeholder="请输入A区数据" style="width: 100%" />
92
+            </el-form-item>
93
+            <el-form-item label="B区" prop="areaB">
94
+              <el-input-number v-model="form.areaB" :min="0" placeholder="请输入B区数据" style="width: 100%" />
95
+            </el-form-item>
96
+            <el-form-item label="贵宾" prop="vip">
97
+              <el-input-number v-model="form.vip" :min="0" placeholder="请输入贵宾数据" style="width: 100%" />
98
+            </el-form-item>
99
+            <el-form-item label="国内旅检" prop="domesticTravelInspection">
100
+              <el-input-number v-model="form.domesticTravelInspection" :min="0" placeholder="请输入国内旅检数据" style="width: 100%" />
101
+            </el-form-item>
102
+            <el-form-item label="国际旅检" prop="internationalTravelInspection">
103
+              <el-input-number v-model="form.internationalTravelInspection" :min="0" placeholder="请输入国际旅检数据" style="width: 100%" />
104
+            </el-form-item>
105
+            <el-form-item label="贵宾通道" prop="vipChannel">
106
+              <el-input-number v-model="form.vipChannel" :min="0" placeholder="请输入贵宾通道数据" style="width: 100%" />
107
+            </el-form-item>
108
+            <el-form-item label="T1回流通道" prop="t1ReturnChannel">
109
+              <el-input-number v-model="form.t1ReturnChannel" :min="0" placeholder="请输入T1回流通道数据" style="width: 100%" />
110
+            </el-form-item>
111
+            <el-form-item label="T1行检" prop="t1Inspection">
112
+              <el-input-number v-model="form.t1Inspection" :min="0" placeholder="请输入T1行检数据" style="width: 100%" />
113
+            </el-form-item>
114
+            <el-form-item label="一楼员工" prop="firstFloorStaff">
115
+              <el-input-number v-model="form.firstFloorStaff" :min="0" placeholder="请输入一楼员工数据" style="width: 100%" />
116
+            </el-form-item>
117
+            <el-form-item label="T2回流通道" prop="t2ReturnChannel">
118
+              <el-input-number v-model="form.t2ReturnChannel" :min="0" placeholder="请输入T2回流通道数据" style="width: 100%" />
119
+            </el-form-item>
120
+          </el-col>
121
+          
122
+          <el-col :span="12">
123
+            <el-form-item label="T2行检" prop="t2Inspection">
124
+              <el-input-number v-model="form.t2Inspection" :min="0" placeholder="请输入T2行检数据" style="width: 100%" />
125
+            </el-form-item>
126
+            <el-form-item label="三楼" prop="thirdFloor">
127
+              <el-input-number v-model="form.thirdFloor" :min="0" placeholder="请输入三楼数据" style="width: 100%" />
128
+            </el-form-item>
129
+            <el-form-item label="一楼" prop="firstFloor">
130
+              <el-input-number v-model="form.firstFloor" :min="0" placeholder="请输入一楼数据" style="width: 100%" />
131
+            </el-form-item>
132
+            <el-form-item label="负一楼" prop="basementFloor">
133
+              <el-input-number v-model="form.basementFloor" :min="0" placeholder="请输入负一楼数据" style="width: 100%" />
134
+            </el-form-item>
135
+            <el-form-item label="国内货站" prop="domesticCargo">
136
+              <el-input-number v-model="form.domesticCargo" :min="0" placeholder="请输入国内货站数据" style="width: 100%" />
137
+            </el-form-item>
138
+            <el-form-item label="道口" prop="gate">
139
+              <el-input-number v-model="form.gate" :min="0" placeholder="请输入道口数据" style="width: 100%" />
140
+            </el-form-item>
141
+            <el-form-item label="南侧车检" prop="southVehicleInspection">
142
+              <el-input-number v-model="form.southVehicleInspection" :min="0" placeholder="请输入南侧车检数据" style="width: 100%" />
143
+            </el-form-item>
144
+            <el-form-item label="防爆" prop="explosionProof">
145
+              <el-input-number v-model="form.explosionProof" :min="0" placeholder="请输入防爆数据" style="width: 100%" />
146
+            </el-form-item>
147
+            <el-form-item label="国际货站" prop="internationalCargo">
148
+              <el-input-number v-model="form.internationalCargo" :min="0" placeholder="请输入国际货站数据" style="width: 100%" />
149
+            </el-form-item>
150
+            <el-form-item label="道口" prop="gate2">
151
+              <el-input-number v-model="form.gate2" :min="0" placeholder="请输入道口数据" style="width: 100%" />
152
+            </el-form-item>
153
+            <el-form-item label="北侧车检" prop="northVehicleInspection">
154
+              <el-input-number v-model="form.northVehicleInspection" :min="0" placeholder="请输入北侧车检数据" style="width: 100%" />
155
+            </el-form-item>
156
+            <el-form-item label="防爆" prop="explosionProof2">
157
+              <el-input-number v-model="form.explosionProof2" :min="0" placeholder="请输入防爆数据" style="width: 100%" />
158
+            </el-form-item>
159
+            <el-form-item label="车检总数" prop="totalVehicleInspection">
160
+              <el-input-number v-model="form.totalVehicleInspection" :min="0" placeholder="请输入车检总数" style="width: 100%" />
161
+            </el-form-item>
162
+          </el-col>
163
+        </el-row>
164
+      </el-form>
165
+      <template #footer>
166
+        <div class="dialog-footer">
167
+          <el-button type="primary" @click="submitForm">确 定</el-button>
168
+          <el-button @click="cancel">取 消</el-button>
169
+        </div>
170
+      </template>
171
+    </el-dialog>
172
+
173
+    <!-- 导入对话框 -->
174
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
175
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
176
+        :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
177
+        :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
178
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
179
+        <div class="el-upload__text">
180
+          将文件拖到此处,或<em>点击上传</em>
181
+        </div>
182
+        <template #tip>
183
+          <div class="el-upload__tip">
184
+            <span>仅允许导入xls、xlsx格式文件。</span>
185
+            <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
186
+              @click="importTemplate">下载模板</el-link>
187
+          </div>
188
+        </template>
189
+      </el-upload>
190
+      <template #footer>
191
+        <div class="dialog-footer">
192
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
193
+          <el-button @click="upload.open = false">取 消</el-button>
194
+        </div>
195
+      </template>
196
+    </el-dialog>
197
+  </div>
198
+</template>
199
+
200
+<script setup name="DailyRunData">
201
+import { listDailyRunData, getDailyRunData, delDailyRunData, addDailyRunData, updateDailyRunData } from "@/api/runData/dailyRunData"
202
+import { getToken } from '@/utils/auth'
203
+
204
+const { proxy } = getCurrentInstance()
205
+
206
+const dailyRunDataList = ref([])
207
+const open = ref(false)
208
+const loading = ref(true)
209
+const showSearch = ref(true)
210
+const ids = ref([])
211
+const single = ref(true)
212
+const multiple = ref(true)
213
+const total = ref(0)
214
+const title = ref("")
215
+
216
+// 导入参数
217
+const upload = reactive({
218
+  // 是否显示弹出层
219
+  open: false,
220
+  // 弹出层标题
221
+  title: "",
222
+  // 是否禁用上传
223
+  isUploading: false,
224
+  // 是否更新已经存在的日常运行数据
225
+  updateSupport: 0,
226
+  // 设置上传的请求头部
227
+  headers: { Authorization: "Bearer " + getToken() },
228
+  // 上传的地址
229
+  url: import.meta.env.VITE_APP_BASE_API + "/runData/dailyRunData/importData"
230
+})
231
+
232
+const uploadRef = ref()
233
+
234
+const data = reactive({
235
+  form: {},
236
+  queryParams: {
237
+    pageNum: 1,
238
+    pageSize: 10,
239
+    date: null
240
+  },
241
+  rules: {
242
+    date: [
243
+      { required: true, message: "日期不能为空", trigger: "blur" }
244
+    ],
245
+    areaA: [
246
+      { required: true, message: "A区数据不能为空", trigger: "blur" },
247
+      { type: "integer", message: "A区数据必须为整数", trigger: "blur" }
248
+    ],
249
+    areaB: [
250
+      { required: true, message: "B区数据不能为空", trigger: "blur" },
251
+      { type: "integer", message: "B区数据必须为整数", trigger: "blur" }
252
+    ],
253
+    vip: [
254
+      { required: true, message: "贵宾数据不能为空", trigger: "blur" },
255
+      { type: "integer", message: "贵宾数据必须为整数", trigger: "blur" }
256
+    ],
257
+    domesticTravelInspection: [
258
+      { required: true, message: "国内旅检数据不能为空", trigger: "blur" },
259
+      { type: "integer", message: "国内旅检数据必须为整数", trigger: "blur" }
260
+    ],
261
+    internationalTravelInspection: [
262
+      { required: true, message: "国际旅检数据不能为空", trigger: "blur" },
263
+      { type: "integer", message: "国际旅检数据必须为整数", trigger: "blur" }
264
+    ],
265
+    vipChannel: [
266
+      { required: true, message: "贵宾通道数据不能为空", trigger: "blur" },
267
+      { type: "integer", message: "贵宾通道数据必须为整数", trigger: "blur" }
268
+    ],
269
+    t1ReturnChannel: [
270
+      { required: true, message: "T1回流通道数据不能为空", trigger: "blur" },
271
+      { type: "integer", message: "T1回流通道数据必须为整数", trigger: "blur" }
272
+    ],
273
+    t1Inspection: [
274
+      { required: true, message: "T1行检数据不能为空", trigger: "blur" },
275
+      { type: "integer", message: "T1行检数据必须为整数", trigger: "blur" }
276
+    ],
277
+    firstFloorStaff: [
278
+      { required: true, message: "一楼员工数据不能为空", trigger: "blur" },
279
+      { type: "integer", message: "一楼员工数据必须为整数", trigger: "blur" }
280
+    ],
281
+    t2ReturnChannel: [
282
+      { required: true, message: "T2回流通道数据不能为空", trigger: "blur" },
283
+      { type: "integer", message: "T2回流通道数据必须为整数", trigger: "blur" }
284
+    ],
285
+    t2Inspection: [
286
+      { required: true, message: "T2行检数据不能为空", trigger: "blur" },
287
+      { type: "integer", message: "T2行检数据必须为整数", trigger: "blur" }
288
+    ],
289
+    thirdFloor: [
290
+      { required: true, message: "三楼数据不能为空", trigger: "blur" },
291
+      { type: "integer", message: "三楼数据必须为整数", trigger: "blur" }
292
+    ],
293
+    firstFloor: [
294
+      { required: true, message: "一楼数据不能为空", trigger: "blur" },
295
+      { type: "integer", message: "一楼数据必须为整数", trigger: "blur" }
296
+    ],
297
+    basementFloor: [
298
+      { required: true, message: "负一楼数据不能为空", trigger: "blur" },
299
+      { type: "integer", message: "负一楼数据必须为整数", trigger: "blur" }
300
+    ],
301
+    domesticCargo: [
302
+      { required: true, message: "国内货站数据不能为空", trigger: "blur" },
303
+      { type: "integer", message: "国内货站数据必须为整数", trigger: "blur" }
304
+    ],
305
+    gate: [
306
+      { required: true, message: "道口数据不能为空", trigger: "blur" },
307
+      { type: "integer", message: "道口数据必须为整数", trigger: "blur" }
308
+    ],
309
+    southVehicleInspection: [
310
+      { required: true, message: "南侧车检数据不能为空", trigger: "blur" },
311
+      { type: "integer", message: "南侧车检数据必须为整数", trigger: "blur" }
312
+    ],
313
+    explosionProof: [
314
+      { required: true, message: "防爆数据不能为空", trigger: "blur" },
315
+      { type: "integer", message: "防爆数据必须为整数", trigger: "blur" }
316
+    ],
317
+    internationalCargo: [
318
+      { required: true, message: "国际货站数据不能为空", trigger: "blur" },
319
+      { type: "integer", message: "国际货站数据必须为整数", trigger: "blur" }
320
+    ],
321
+    gate2: [
322
+      { required: true, message: "道口数据不能为空", trigger: "blur" },
323
+      { type: "integer", message: "道口数据必须为整数", trigger: "blur" }
324
+    ],
325
+    northVehicleInspection: [
326
+      { required: true, message: "北侧车检数据不能为空", trigger: "blur" },
327
+      { type: "integer", message: "北侧车检数据必须为整数", trigger: "blur" }
328
+    ],
329
+    explosionProof2: [
330
+      { required: true, message: "防爆数据不能为空", trigger: "blur" },
331
+      { type: "integer", message: "防爆数据必须为整数", trigger: "blur" }
332
+    ],
333
+    totalVehicleInspection: [
334
+      { type: "integer", message: "车检总数必须为整数", trigger: "blur" }
335
+    ]
336
+  }
337
+})
338
+
339
+const { queryParams, form, rules } = toRefs(data)
340
+
341
+/** 查询日常运行数据列表 */
342
+function getList() {
343
+  loading.value = true
344
+  listDailyRunData(queryParams.value).then(response => {
345
+    dailyRunDataList.value = response.rows
346
+    total.value = response.total
347
+    loading.value = false
348
+  })
349
+}
350
+
351
+// 取消按钮
352
+function cancel() {
353
+  open.value = false
354
+  reset()
355
+}
356
+
357
+// 表单重置
358
+function reset() {
359
+  form.value = {
360
+    id: null,
361
+    date: null,
362
+    areaA: null,
363
+    areaB: null,
364
+    vip: null,
365
+    domesticTravelInspection: null,
366
+    internationalTravelInspection: null,
367
+    vipChannel: null,
368
+    t1ReturnChannel: null,
369
+    t1Inspection: null,
370
+    firstFloorStaff: null,
371
+    t2ReturnChannel: null,
372
+    t2Inspection: null,
373
+    thirdFloor: null,
374
+    firstFloor: null,
375
+    basementFloor: null,
376
+    domesticCargo: null,
377
+    gate: null,
378
+    southVehicleInspection: null,
379
+    explosionProof: null,
380
+    internationalCargo: null,
381
+    gate2: null,
382
+    northVehicleInspection: null,
383
+    explosionProof2: null,
384
+    totalVehicleInspection: null
385
+  }
386
+  proxy.resetForm("dailyRunDataRef")
387
+}
388
+
389
+/** 搜索按钮操作 */
390
+function handleQuery() {
391
+  queryParams.value.pageNum = 1
392
+  getList()
393
+}
394
+
395
+/** 重置按钮操作 */
396
+function resetQuery() {
397
+  proxy.resetForm("queryRef")
398
+  handleQuery()
399
+}
400
+
401
+// 多选框选中数据
402
+function handleSelectionChange(selection) {
403
+  ids.value = selection.map(item => item.id)
404
+  single.value = selection.length != 1
405
+  multiple.value = !selection.length
406
+}
407
+
408
+/** 新增按钮操作 */
409
+function handleAdd() {
410
+  reset()
411
+  open.value = true
412
+  title.value = "添加日常运行数据"
413
+}
414
+
415
+/** 修改按钮操作 */
416
+function handleUpdate(row) {
417
+  reset()
418
+  const _id = row.id || ids.value
419
+  getDailyRunData(_id).then(response => {
420
+    form.value = response.data
421
+    open.value = true
422
+    title.value = "修改日常运行数据"
423
+  })
424
+}
425
+
426
+/** 提交按钮 */
427
+function submitForm() {
428
+  proxy.$refs["dailyRunDataRef"].validate(valid => {
429
+    if (valid) {
430
+      if (form.value.id != null) {
431
+        updateDailyRunData(form.value).then(response => {
432
+          proxy.$modal.msgSuccess("修改成功")
433
+          open.value = false
434
+          getList()
435
+        })
436
+      } else {
437
+        addDailyRunData(form.value).then(response => {
438
+          proxy.$modal.msgSuccess("新增成功")
439
+          open.value = false
440
+          getList()
441
+        })
442
+      }
443
+    }
444
+  })
445
+}
446
+
447
+/** 删除按钮操作 */
448
+function handleDelete(row) {
449
+  const _ids = row.id || ids.value
450
+  proxy.$modal.confirm('是否确认删除数据项?').then(function () {
451
+    return delDailyRunData(_ids)
452
+  }).then(() => {
453
+    getList()
454
+    proxy.$modal.msgSuccess("删除成功")
455
+  }).catch(() => { })
456
+}
457
+
458
+/** 导出按钮操作 */
459
+function handleExport() {
460
+  // 过滤掉值为null的参数,但保留分页参数
461
+  const filteredParams = Object.fromEntries(
462
+    Object.entries(queryParams.value).filter(([key, value]) => {
463
+      // 保留分页参数
464
+      if (key === 'pageNum' || key === 'pageSize') return true
465
+      // 过滤掉其他为null的参数
466
+      return value !== null
467
+    })
468
+  )
469
+  
470
+  proxy.download('/runData/dailyRunData/export', filteredParams, `dailyRunData_${new Date().getTime()}.xlsx`)
471
+}
472
+
473
+/** 导入按钮操作 */
474
+function handleImport() {
475
+  upload.title = "日常运行数据导入"
476
+  upload.open = true
477
+}
478
+
479
+/** 下载模板操作 */
480
+function importTemplate() {
481
+  proxy.download('/runData/dailyRunData/importTemplate', {
482
+  }, `日常运行数据导入模板_${new Date().getTime()}.xlsx`)
483
+}
484
+
485
+/** 文件上传中处理 */
486
+const handleFileUploadProgress = (event, file, fileList) => {
487
+  upload.isUploading = true
488
+}
489
+
490
+/** 文件上传成功处理 */
491
+const handleFileSuccess = (response, file, fileList) => {
492
+  upload.open = false
493
+  upload.isUploading = false
494
+  uploadRef.value.handleRemove(file)
495
+  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true })
496
+  getList()
497
+}
498
+
499
+/** 提交上传文件 */
500
+function submitFileForm() {
501
+  uploadRef.value.submit()
502
+}
503
+
504
+getList()
505
+</script>

+ 0 - 0
src/views/runData/dailyRunData/每日运行数据


+ 446 - 0
src/views/runData/discouragePowerBanksData/index.vue

@@ -0,0 +1,446 @@
1
+<template>
2
+  <div class="app-container">
3
+    <!-- 查询条件 -->
4
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
5
+      <el-form-item label="日期" prop="date">
6
+        <el-date-picker v-model="queryParams.date" type="date" placeholder="请选择日期" value-format="YYYY-MM-DD" 
7
+          style="width: 200px" />
8
+      </el-form-item>
9
+      <el-form-item label="时间段" prop="timePeriod">
10
+        <el-input v-model="queryParams.timePeriod" placeholder="请输入时间段" clearable style="width: 200px" />
11
+      </el-form-item>
12
+      <el-form-item>
13
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
14
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
15
+      </el-form-item>
16
+    </el-form>
17
+
18
+    <!-- 按钮区域 -->
19
+    <el-row :gutter="10" class="mb8">
20
+      <el-col :span="1.5">
21
+        <el-button type="primary" plain icon="Plus" @click="handleAdd"
22
+          v-hasPermi="['runData:discouragePowerBanksData:add']">新增</el-button>
23
+      </el-col>
24
+      <el-col :span="1.5">
25
+        <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
26
+          v-hasPermi="['runData:discouragePowerBanksData:edit']">修改</el-button>
27
+      </el-col>
28
+      <el-col :span="1.5">
29
+        <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
30
+          v-hasPermi="['runData:discouragePowerBanksData:remove']">删除</el-button>
31
+      </el-col>
32
+      <el-col :span="1.5">
33
+        <el-button type="info" plain icon="Upload" @click="handleImport"
34
+          v-hasPermi="['runData:discouragePowerBanksData:import']">导入</el-button>
35
+      </el-col>
36
+      <el-col :span="1.5">
37
+        <el-button type="warning" plain icon="Download" @click="handleExport"
38
+          v-hasPermi="['runData:discouragePowerBanksData:export']">导出</el-button>
39
+      </el-col>
40
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
41
+    </el-row>
42
+
43
+    <!-- 数据表格 -->
44
+    <el-table v-loading="loading" :data="discouragePowerBanksDataList" @selection-change="handleSelectionChange">
45
+      <el-table-column type="selection" width="55" align="center" />
46
+      <el-table-column label="日期" align="center" prop="date" />
47
+      <el-table-column label="时间段" align="center" prop="timePeriod" />
48
+      
49
+      <!-- T1区域数据 -->
50
+      <el-table-column label="T1召回充电宝" align="center" prop="t1Recall" />
51
+      <el-table-column label="T1无3C标识" align="center" prop="t1No3C" />
52
+      <el-table-column label="T1标识不清" align="center" prop="t1Unclear" />
53
+      <el-table-column label="T1超规数量" align="center" prop="t1OverSize" />
54
+      <el-table-column label="T1邮寄" align="center" prop="t1Mail" />
55
+      <el-table-column label="T1自弃" align="center" prop="t1SelfAbandon" />
56
+      <el-table-column label="T1暂存" align="center" prop="t1Temporary" />
57
+      
58
+      <!-- T2区域数据 -->
59
+      <el-table-column label="T2召回充电宝" align="center" prop="t2Recall" />
60
+      <el-table-column label="T2无3C标识" align="center" prop="t2No3C" />
61
+      <el-table-column label="T2标识不清" align="center" prop="t2Unclear" />
62
+      <el-table-column label="T2超规数量" align="center" prop="t2OverSize" />
63
+      <el-table-column label="T2邮寄" align="center" prop="t2Mail" />
64
+      <el-table-column label="T2自弃" align="center" prop="t2SelfAbandon" />
65
+      <el-table-column label="T2暂存" align="center" prop="t2Temporary" />
66
+      
67
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
68
+        <template #default="scope">
69
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
70
+            v-hasPermi="['runData:discouragePowerBanksData:edit']">修改</el-button>
71
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
72
+            v-hasPermi="['runData:discouragePowerBanksData:remove']">删除</el-button>
73
+        </template>
74
+      </el-table-column>
75
+    </el-table>
76
+
77
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
78
+      v-model:limit="queryParams.pageSize" @pagination="getList" />
79
+
80
+    <!-- 添加或修改劝阻充电宝数据对话框 -->
81
+    <el-dialog :title="title" v-model="open" width="800px" append-to-body>
82
+      <el-form ref="discouragePowerBanksDataRef" :model="form" :rules="rules" label-width="120px">
83
+        <el-row :gutter="20">
84
+          <el-col :span="12">
85
+            <el-form-item label="日期" prop="date">
86
+              <el-date-picker v-model="form.date" type="date" placeholder="请选择日期" value-format="YYYY-MM-DD" 
87
+                style="width: 100%" />
88
+            </el-form-item>
89
+          </el-col>
90
+          <el-col :span="12">
91
+            <el-form-item label="时间段" prop="timePeriod">
92
+              <el-input v-model="form.timePeriod" placeholder="请输入时间段" />
93
+            </el-form-item>
94
+          </el-col>
95
+        </el-row>
96
+        
97
+        <!-- T1区域 -->
98
+        <el-divider content-position="left">T1区域数据</el-divider>
99
+        <el-row :gutter="20">
100
+          <el-col :span="12">
101
+            <el-form-item label="T1召回充电宝" prop="t1Recall">
102
+              <el-input-number v-model="form.t1Recall" :min="0" placeholder="请输入T1召回充电宝" style="width: 100%" />
103
+            </el-form-item>
104
+            <el-form-item label="T1无3C标识" prop="t1No3C">
105
+              <el-input-number v-model="form.t1No3C" :min="0" placeholder="请输入T1无3C标识" style="width: 100%" />
106
+            </el-form-item>
107
+            <el-form-item label="T1标识不清" prop="t1Unclear">
108
+              <el-input-number v-model="form.t1Unclear" :min="0" placeholder="请输入T1标识不清" style="width: 100%" />
109
+            </el-form-item>
110
+            <el-form-item label="T1超规数量" prop="t1OverSize">
111
+              <el-input-number v-model="form.t1OverSize" :min="0" placeholder="请输入T1超规数量" style="width: 100%" />
112
+            </el-form-item>
113
+          </el-col>
114
+          <el-col :span="12">
115
+            <el-form-item label="T1邮寄" prop="t1Mail">
116
+              <el-input-number v-model="form.t1Mail" :min="0" placeholder="请输入T1邮寄" style="width: 100%" />
117
+            </el-form-item>
118
+            <el-form-item label="T1自弃" prop="t1SelfAbandon">
119
+              <el-input-number v-model="form.t1SelfAbandon" :min="0" placeholder="请输入T1自弃" style="width: 100%" />
120
+            </el-form-item>
121
+            <el-form-item label="T1暂存" prop="t1Temporary">
122
+              <el-input-number v-model="form.t1Temporary" :min="0" placeholder="请输入T1暂存" style="width: 100%" />
123
+            </el-form-item>
124
+          </el-col>
125
+        </el-row>
126
+        
127
+        <!-- T2区域 -->
128
+        <el-divider content-position="left">T2区域数据</el-divider>
129
+        <el-row :gutter="20">
130
+          <el-col :span="12">
131
+            <el-form-item label="T2召回充电宝" prop="t2Recall">
132
+              <el-input-number v-model="form.t2Recall" :min="0" placeholder="请输入T2召回充电宝" style="width: 100%" />
133
+            </el-form-item>
134
+            <el-form-item label="T2无3C标识" prop="t2No3C">
135
+              <el-input-number v-model="form.t2No3C" :min="0" placeholder="请输入T2无3C标识" style="width: 100%" />
136
+            </el-form-item>
137
+            <el-form-item label="T2标识不清" prop="t2Unclear">
138
+              <el-input-number v-model="form.t2Unclear" :min="0" placeholder="请输入T2标识不清" style="width: 100%" />
139
+            </el-form-item>
140
+            <el-form-item label="T2超规数量" prop="t2OverSize">
141
+              <el-input-number v-model="form.t2OverSize" :min="0" placeholder="请输入T2超规数量" style="width: 100%" />
142
+            </el-form-item>
143
+          </el-col>
144
+          <el-col :span="12">
145
+            <el-form-item label="T2邮寄" prop="t2Mail">
146
+              <el-input-number v-model="form.t2Mail" :min="0" placeholder="请输入T2邮寄" style="width: 100%" />
147
+            </el-form-item>
148
+            <el-form-item label="T2自弃" prop="t2SelfAbandon">
149
+              <el-input-number v-model="form.t2SelfAbandon" :min="0" placeholder="请输入T2自弃" style="width: 100%" />
150
+            </el-form-item>
151
+            <el-form-item label="T2暂存" prop="t2Temporary">
152
+              <el-input-number v-model="form.t2Temporary" :min="0" placeholder="请输入T2暂存" style="width: 100%" />
153
+            </el-form-item>
154
+          </el-col>
155
+        </el-row>
156
+      </el-form>
157
+      <template #footer>
158
+        <div class="dialog-footer">
159
+          <el-button type="primary" @click="submitForm">确 定</el-button>
160
+          <el-button @click="cancel">取 消</el-button>
161
+        </div>
162
+      </template>
163
+    </el-dialog>
164
+
165
+    <!-- 导入对话框 -->
166
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
167
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
168
+        :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
169
+        :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
170
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
171
+        <div class="el-upload__text">
172
+          将文件拖到此处,或<em>点击上传</em>
173
+        </div>
174
+        <template #tip>
175
+          <div class="el-upload__tip">
176
+            <span>仅允许导入xls、xlsx格式文件。</span>
177
+            <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
178
+              @click="importTemplate">下载模板</el-link>
179
+          </div>
180
+        </template>
181
+      </el-upload>
182
+      <template #footer>
183
+        <div class="dialog-footer">
184
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
185
+          <el-button @click="upload.open = false">取 消</el-button>
186
+        </div>
187
+      </template>
188
+    </el-dialog>
189
+  </div>
190
+</template>
191
+
192
+<script setup name="DiscouragePowerBanksData">
193
+import { listDiscouragePowerBanksData, getDiscouragePowerBanksData, delDiscouragePowerBanksData, addDiscouragePowerBanksData, updateDiscouragePowerBanksData } from "@/api/runData/discouragePowerBanksData"
194
+import { getToken } from '@/utils/auth'
195
+
196
+const { proxy } = getCurrentInstance()
197
+
198
+const discouragePowerBanksDataList = ref([])
199
+const open = ref(false)
200
+const loading = ref(true)
201
+const showSearch = ref(true)
202
+const ids = ref([])
203
+const single = ref(true)
204
+const multiple = ref(true)
205
+const total = ref(0)
206
+const title = ref("")
207
+
208
+// 导入参数
209
+const upload = reactive({
210
+  // 是否显示弹出层
211
+  open: false,
212
+  // 弹出层标题
213
+  title: "",
214
+  // 是否禁用上传
215
+  isUploading: false,
216
+  // 是否更新已经存在的劝阻充电宝数据
217
+  updateSupport: 0,
218
+  // 设置上传的请求头部
219
+  headers: { Authorization: "Bearer " + getToken() },
220
+  // 上传的地址
221
+  url: import.meta.env.VITE_APP_BASE_API + "/runData/discouragePowerBanksData/importData"
222
+})
223
+
224
+const uploadRef = ref()
225
+
226
+const data = reactive({
227
+  form: {},
228
+  queryParams: {
229
+    pageNum: 1,
230
+    pageSize: 10,
231
+    date: null,
232
+    timePeriod: null
233
+  },
234
+  rules: {
235
+    date: [
236
+      { required: true, message: "日期不能为空", trigger: "blur" }
237
+    ],
238
+    timePeriod: [
239
+      { required: true, message: "时间段不能为空", trigger: "blur" }
240
+    ],
241
+    t1Recall: [
242
+      { type: "integer", message: "T1召回充电宝必须为整数", trigger: "blur" }
243
+    ],
244
+    t1No3C: [
245
+      { type: "integer", message: "T1无3C标识必须为整数", trigger: "blur" }
246
+    ],
247
+    t1Unclear: [
248
+      { type: "integer", message: "T1标识不清必须为整数", trigger: "blur" }
249
+    ],
250
+    t1OverSize: [
251
+      { type: "integer", message: "T1超规数量必须为整数", trigger: "blur" }
252
+    ],
253
+    t1Mail: [
254
+      { type: "integer", message: "T1邮寄必须为整数", trigger: "blur" }
255
+    ],
256
+    t1SelfAbandon: [
257
+      { type: "integer", message: "T1自弃必须为整数", trigger: "blur" }
258
+    ],
259
+    t1Temporary: [
260
+      { type: "integer", message: "T1暂存必须为整数", trigger: "blur" }
261
+    ],
262
+    t2Recall: [
263
+      { type: "integer", message: "T2召回充电宝必须为整数", trigger: "blur" }
264
+    ],
265
+    t2No3C: [
266
+      { type: "integer", message: "T2无3C标识必须为整数", trigger: "blur" }
267
+    ],
268
+    t2Unclear: [
269
+      { type: "integer", message: "T2标识不清必须为整数", trigger: "blur" }
270
+    ],
271
+    t2OverSize: [
272
+      { type: "integer", message: "T2超规数量必须为整数", trigger: "blur" }
273
+    ],
274
+    t2Mail: [
275
+      { type: "integer", message: "T2邮寄必须为整数", trigger: "blur" }
276
+    ],
277
+    t2SelfAbandon: [
278
+      { type: "integer", message: "T2自弃必须为整数", trigger: "blur" }
279
+    ],
280
+    t2Temporary: [
281
+      { type: "integer", message: "T2暂存必须为整数", trigger: "blur" }
282
+    ]
283
+  }
284
+})
285
+
286
+const { queryParams, form, rules } = toRefs(data)
287
+
288
+/** 查询劝阻充电宝数据列表 */
289
+function getList() {
290
+  loading.value = true
291
+  listDiscouragePowerBanksData(queryParams.value).then(response => {
292
+    discouragePowerBanksDataList.value = response.rows
293
+    total.value = response.total
294
+    loading.value = false
295
+  })
296
+}
297
+
298
+// 取消按钮
299
+function cancel() {
300
+  open.value = false
301
+  reset()
302
+}
303
+
304
+// 表单重置
305
+function reset() {
306
+  form.value = {
307
+    id: null,
308
+    date: null,
309
+    timePeriod: null,
310
+    // T1区域数据
311
+    t1Recall: null,
312
+    t1No3C: null,
313
+    t1Unclear: null,
314
+    t1OverSize: null,
315
+    t1Mail: null,
316
+    t1SelfAbandon: null,
317
+    t1Temporary: null,
318
+    // T2区域数据
319
+    t2Recall: null,
320
+    t2No3C: null,
321
+    t2Unclear: null,
322
+    t2OverSize: null,
323
+    t2Mail: null,
324
+    t2SelfAbandon: null,
325
+    t2Temporary: null
326
+  }
327
+  proxy.resetForm("discouragePowerBanksDataRef")
328
+}
329
+
330
+/** 搜索按钮操作 */
331
+function handleQuery() {
332
+  queryParams.value.pageNum = 1
333
+  getList()
334
+}
335
+
336
+/** 重置按钮操作 */
337
+function resetQuery() {
338
+  proxy.resetForm("queryRef")
339
+  handleQuery()
340
+}
341
+
342
+// 多选框选中数据
343
+function handleSelectionChange(selection) {
344
+  ids.value = selection.map(item => item.id)
345
+  single.value = selection.length != 1
346
+  multiple.value = !selection.length
347
+}
348
+
349
+/** 新增按钮操作 */
350
+function handleAdd() {
351
+  reset()
352
+  open.value = true
353
+  title.value = "添加劝阻充电宝数据"
354
+}
355
+
356
+/** 修改按钮操作 */
357
+function handleUpdate(row) {
358
+  reset()
359
+  const _id = row.id || ids.value
360
+  getDiscouragePowerBanksData(_id).then(response => {
361
+    form.value = response.data
362
+    open.value = true
363
+    title.value = "修改劝阻充电宝数据"
364
+  })
365
+}
366
+
367
+/** 提交按钮 */
368
+function submitForm() {
369
+  proxy.$refs["discouragePowerBanksDataRef"].validate(valid => {
370
+    if (valid) {
371
+      if (form.value.id != null) {
372
+        updateDiscouragePowerBanksData(form.value).then(response => {
373
+          proxy.$modal.msgSuccess("修改成功")
374
+          open.value = false
375
+          getList()
376
+        })
377
+      } else {
378
+        addDiscouragePowerBanksData(form.value).then(response => {
379
+          proxy.$modal.msgSuccess("新增成功")
380
+          open.value = false
381
+          getList()
382
+        })
383
+      }
384
+    }
385
+  })
386
+}
387
+
388
+/** 删除按钮操作 */
389
+function handleDelete(row) {
390
+  const _ids = row.id || ids.value
391
+  proxy.$modal.confirm('是否确认删除数据项?').then(function () {
392
+    return delDiscouragePowerBanksData(_ids)
393
+  }).then(() => {
394
+    getList()
395
+    proxy.$modal.msgSuccess("删除成功")
396
+  }).catch(() => { })
397
+}
398
+
399
+/** 导出按钮操作 */
400
+function handleExport() {
401
+  // 过滤掉值为null的参数,但保留分页参数
402
+  const filteredParams = Object.fromEntries(
403
+    Object.entries(queryParams.value).filter(([key, value]) => {
404
+      // 保留分页参数
405
+      if (key === 'pageNum' || key === 'pageSize') return true
406
+      // 过滤掉其他为null的参数
407
+      return value !== null
408
+    })
409
+  )
410
+  
411
+  proxy.download('/runData/discouragePowerBanksData/export', filteredParams, `discouragePowerBanksData_${new Date().getTime()}.xlsx`)
412
+}
413
+
414
+/** 导入按钮操作 */
415
+function handleImport() {
416
+  upload.title = "劝阻充电宝数据导入"
417
+  upload.open = true
418
+}
419
+
420
+/** 下载模板操作 */
421
+function importTemplate() {
422
+  proxy.download('/runData/discouragePowerBanksData/importTemplate', {
423
+  }, `劝阻充电宝数据导入模板_${new Date().getTime()}.xlsx`)
424
+}
425
+
426
+/** 文件上传中处理 */
427
+const handleFileUploadProgress = (event, file, fileList) => {
428
+  upload.isUploading = true
429
+}
430
+
431
+/** 文件上传成功处理 */
432
+const handleFileSuccess = (response, file, fileList) => {
433
+  upload.open = false
434
+  upload.isUploading = false
435
+  uploadRef.value.handleRemove(file)
436
+  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true })
437
+  getList()
438
+}
439
+
440
+/** 提交上传文件 */
441
+function submitFileForm() {
442
+  uploadRef.value.submit()
443
+}
444
+
445
+getList()
446
+</script>

+ 0 - 0
src/views/runData/discouragePowerBanksData/劝阻充电宝数据


+ 0 - 0
src/views/runData/runScreen/index.vue


+ 591 - 0
src/views/runData/seizeData/index.vue

@@ -0,0 +1,591 @@
1
+<template>
2
+  <div class="app-container">
3
+    <!-- 查询条件 -->
4
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
5
+      <el-form-item label="日期" prop="date">
6
+        <el-date-picker v-model="queryParams.date" type="date" placeholder="请选择日期" value-format="YYYY-MM-DD" 
7
+          style="width: 200px" />
8
+      </el-form-item>
9
+      <el-form-item label="班次" prop="shift">
10
+        <el-input v-model="queryParams.shift" placeholder="请输入班次" clearable style="width: 200px" />
11
+      </el-form-item>
12
+      <el-form-item label="当班大队" prop="team">
13
+        <el-input v-model="queryParams.team" placeholder="请输入当班大队" clearable style="width: 200px" />
14
+      </el-form-item>
15
+      <el-form-item>
16
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
17
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
18
+      </el-form-item>
19
+    </el-form>
20
+
21
+    <!-- 按钮区域 -->
22
+    <el-row :gutter="10" class="mb8">
23
+      <el-col :span="1.5">
24
+        <el-button type="primary" plain icon="Plus" @click="handleAdd"
25
+          v-hasPermi="['runData:seizeData:add']">新增</el-button>
26
+      </el-col>
27
+      <el-col :span="1.5">
28
+        <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
29
+          v-hasPermi="['runData:seizeData:edit']">修改</el-button>
30
+      </el-col>
31
+      <el-col :span="1.5">
32
+        <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
33
+          v-hasPermi="['runData:seizeData:remove']">删除</el-button>
34
+      </el-col>
35
+      <el-col :span="1.5">
36
+        <el-button type="info" plain icon="Upload" @click="handleImport"
37
+          v-hasPermi="['runData:seizeData:import']">导入</el-button>
38
+      </el-col>
39
+      <el-col :span="1.5">
40
+        <el-button type="warning" plain icon="Download" @click="handleExport"
41
+          v-hasPermi="['runData:seizeData:export']">导出</el-button>
42
+      </el-col>
43
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
44
+    </el-row>
45
+
46
+    <!-- 数据表格 -->
47
+    <el-table v-loading="loading" :data="seizeDataList" @selection-change="handleSelectionChange">
48
+      <el-table-column type="selection" width="55" align="center" />
49
+      <el-table-column label="日期" align="center" prop="date" />
50
+      <el-table-column label="班次" align="center" prop="shift" />
51
+      <el-table-column label="当班大队" align="center" prop="team" />
52
+      
53
+      <!-- T1区域数据 -->
54
+      <el-table-column label="T1火种" align="center" prop="t1Fire" />
55
+      <el-table-column label="T1刀具" align="center" prop="t1Knife" />
56
+      <el-table-column label="T1警械器具" align="center" prop="t1PoliceEquipment" />
57
+      <el-table-column label="T1烟花爆竹" align="center" prop="t1Fireworks" />
58
+      <el-table-column label="T1活体动物" align="center" prop="t1LiveAnimal" />
59
+      <el-table-column label="T1腐蚀性物品" align="center" prop="t1Corrosive" />
60
+      <el-table-column label="T1用假冒他" align="center" prop="t1Counterfeit" />
61
+      <el-table-column label="T1爆炸装置" align="center" prop="t1Explosive" />
62
+      <el-table-column label="T1工具" align="center" prop="t1Tool" />
63
+      <el-table-column label="T1枪支弹药" align="center" prop="t1Gun" />
64
+      <el-table-column label="T1扫黄打非" align="center" prop="t1Pornography" />
65
+      <el-table-column label="T1其他" align="center" prop="t1Other" />
66
+      <el-table-column label="T1总数" align="center" prop="t1Total" />
67
+      
68
+      <!-- T2区域数据 -->
69
+      <el-table-column label="T2火种" align="center" prop="t2Fire" />
70
+      <el-table-column label="T2刀具" align="center" prop="t2Knife" />
71
+      <el-table-column label="T2警械器具" align="center" prop="t2PoliceEquipment" />
72
+      <el-table-column label="T2烟花爆竹" align="center" prop="t2Fireworks" />
73
+      <el-table-column label="T2活体动物" align="center" prop="t2LiveAnimal" />
74
+      <el-table-column label="T2腐蚀性物品" align="center" prop="t2Corrosive" />
75
+      <el-table-column label="T2用假冒他" align="center" prop="t2Counterfeit" />
76
+      <el-table-column label="T2爆炸装置" align="center" prop="t2Explosive" />
77
+      <el-table-column label="T2工具" align="center" prop="t2Tool" />
78
+      <el-table-column label="T2枪支弹药" align="center" prop="t2Gun" />
79
+      <el-table-column label="T2扫黄打非" align="center" prop="t2Pornography" />
80
+      <el-table-column label="T2其他" align="center" prop="t2Other" />
81
+      <el-table-column label="T2总数" align="center" prop="t2Total" />
82
+      
83
+      <el-table-column label="T1总数+T2总数" align="center" prop="total" />
84
+      
85
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
86
+        <template #default="scope">
87
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
88
+            v-hasPermi="['runData:seizeData:edit']">修改</el-button>
89
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
90
+            v-hasPermi="['runData:seizeData:remove']">删除</el-button>
91
+        </template>
92
+      </el-table-column>
93
+    </el-table>
94
+
95
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
96
+      v-model:limit="queryParams.pageSize" @pagination="getList" />
97
+
98
+    <!-- 添加或修改查获数据对话框 -->
99
+    <el-dialog :title="title" v-model="open" width="900px" append-to-body>
100
+      <el-form ref="seizeDataRef" :model="form" :rules="rules" label-width="120px">
101
+        <el-row :gutter="20">
102
+          <el-col :span="8">
103
+            <el-form-item label="日期" prop="date">
104
+              <el-date-picker v-model="form.date" type="date" placeholder="请选择日期" value-format="YYYY-MM-DD" 
105
+                style="width: 100%" />
106
+            </el-form-item>
107
+          </el-col>
108
+          <el-col :span="8">
109
+            <el-form-item label="班次" prop="shift">
110
+              <el-input v-model="form.shift" placeholder="请输入班次" />
111
+            </el-form-item>
112
+          </el-col>
113
+          <el-col :span="8">
114
+            <el-form-item label="当班大队" prop="team">
115
+              <el-input v-model="form.team" placeholder="请输入当班大队" />
116
+            </el-form-item>
117
+          </el-col>
118
+        </el-row>
119
+        
120
+        <!-- T1区域 -->
121
+        <el-divider content-position="left">T1区域数据</el-divider>
122
+        <el-row :gutter="20">
123
+          <el-col :span="6">
124
+            <el-form-item label="T1火种" prop="t1Fire">
125
+              <el-input-number v-model="form.t1Fire" :min="0" placeholder="请输入T1火种" style="width: 100%" @change="calculateTotals" />
126
+            </el-form-item>
127
+            <el-form-item label="T1刀具" prop="t1Knife">
128
+              <el-input-number v-model="form.t1Knife" :min="0" placeholder="请输入T1刀具" style="width: 100%" @change="calculateTotals" />
129
+            </el-form-item>
130
+            <el-form-item label="T1警械器具" prop="t1PoliceEquipment">
131
+              <el-input-number v-model="form.t1PoliceEquipment" :min="0" placeholder="请输入T1警械器具" style="width: 100%" @change="calculateTotals" />
132
+            </el-form-item>
133
+            <el-form-item label="T1烟花爆竹" prop="t1Fireworks">
134
+              <el-input-number v-model="form.t1Fireworks" :min="0" placeholder="请输入T1烟花爆竹" style="width: 100%" @change="calculateTotals" />
135
+            </el-form-item>
136
+          </el-col>
137
+          <el-col :span="6">
138
+            <el-form-item label="T1活体动物" prop="t1LiveAnimal">
139
+              <el-input-number v-model="form.t1LiveAnimal" :min="0" placeholder="请输入T1活体动物" style="width: 100%" @change="calculateTotals" />
140
+            </el-form-item>
141
+            <el-form-item label="T1腐蚀性物品" prop="t1Corrosive">
142
+              <el-input-number v-model="form.t1Corrosive" :min="0" placeholder="请输入T1腐蚀性物品" style="width: 100%" @change="calculateTotals" />
143
+            </el-form-item>
144
+            <el-form-item label="T1用假冒他" prop="t1Counterfeit">
145
+              <el-input-number v-model="form.t1Counterfeit" :min="0" placeholder="请输入T1用假冒他" style="width: 100%" @change="calculateTotals" />
146
+            </el-form-item>
147
+            <el-form-item label="T1爆炸装置" prop="t1Explosive">
148
+              <el-input-number v-model="form.t1Explosive" :min="0" placeholder="请输入T1爆炸装置" style="width: 100%" @change="calculateTotals" />
149
+            </el-form-item>
150
+          </el-col>
151
+          <el-col :span="6">
152
+            <el-form-item label="T1工具" prop="t1Tool">
153
+              <el-input-number v-model="form.t1Tool" :min="0" placeholder="请输入T1工具" style="width: 100%" @change="calculateTotals" />
154
+            </el-form-item>
155
+            <el-form-item label="T1枪支弹药" prop="t1Gun">
156
+              <el-input-number v-model="form.t1Gun" :min="0" placeholder="请输入T1枪支弹药" style="width: 100%" @change="calculateTotals" />
157
+            </el-form-item>
158
+            <el-form-item label="T1扫黄打非" prop="t1Pornography">
159
+              <el-input-number v-model="form.t1Pornography" :min="0" placeholder="请输入T1扫黄打非" style="width: 100%" @change="calculateTotals" />
160
+            </el-form-item>
161
+            <el-form-item label="T1其他" prop="t1Other">
162
+              <el-input-number v-model="form.t1Other" :min="0" placeholder="请输入T1其他" style="width: 100%" @change="calculateTotals" />
163
+            </el-form-item>
164
+          </el-col>
165
+          <el-col :span="6">
166
+            <el-form-item label="T1总数" prop="t1Total">
167
+              <el-input v-model="form.t1Total" placeholder="自动计算" readonly style="width: 100%" />
168
+            </el-form-item>
169
+          </el-col>
170
+        </el-row>
171
+        
172
+        <!-- T2区域 -->
173
+        <el-divider content-position="left">T2区域数据</el-divider>
174
+        <el-row :gutter="20">
175
+          <el-col :span="6">
176
+            <el-form-item label="T2火种" prop="t2Fire">
177
+              <el-input-number v-model="form.t2Fire" :min="0" placeholder="请输入T2火种" style="width: 100%" @change="calculateTotals" />
178
+            </el-form-item>
179
+            <el-form-item label="T2刀具" prop="t2Knife">
180
+              <el-input-number v-model="form.t2Knife" :min="0" placeholder="请输入T2刀具" style="width: 100%" @change="calculateTotals" />
181
+            </el-form-item>
182
+            <el-form-item label="T2警械器具" prop="t2PoliceEquipment">
183
+              <el-input-number v-model="form.t2PoliceEquipment" :min="0" placeholder="请输入T2警械器具" style="width: 100%" @change="calculateTotals" />
184
+            </el-form-item>
185
+            <el-form-item label="T2烟花爆竹" prop="t2Fireworks">
186
+              <el-input-number v-model="form.t2Fireworks" :min="0" placeholder="请输入T2烟花爆竹" style="width: 100%" @change="calculateTotals" />
187
+            </el-form-item>
188
+          </el-col>
189
+          <el-col :span="6">
190
+            <el-form-item label="T2活体动物" prop="t2LiveAnimal">
191
+              <el-input-number v-model="form.t2LiveAnimal" :min="0" placeholder="请输入T2活体动物" style="width: 100%" @change="calculateTotals" />
192
+            </el-form-item>
193
+            <el-form-item label="T2腐蚀性物品" prop="t2Corrosive">
194
+              <el-input-number v-model="form.t2Corrosive" :min="0" placeholder="请输入T2腐蚀性物品" style="width: 100%" @change="calculateTotals" />
195
+            </el-form-item>
196
+            <el-form-item label="T2用假冒他" prop="t2Counterfeit">
197
+              <el-input-number v-model="form.t2Counterfeit" :min="0" placeholder="请输入T2用假冒他" style="width: 100%" @change="calculateTotals" />
198
+            </el-form-item>
199
+            <el-form-item label="T2爆炸装置" prop="t2Explosive">
200
+              <el-input-number v-model="form.t2Explosive" :min="0" placeholder="请输入T2爆炸装置" style="width: 100%" @change="calculateTotals" />
201
+            </el-form-item>
202
+          </el-col>
203
+          <el-col :span="6">
204
+            <el-form-item label="T2工具" prop="t2Tool">
205
+              <el-input-number v-model="form.t2Tool" :min="0" placeholder="请输入T2工具" style="width: 100%" @change="calculateTotals" />
206
+            </el-form-item>
207
+            <el-form-item label="T2枪支弹药" prop="t2Gun">
208
+              <el-input-number v-model="form.t2Gun" :min="0" placeholder="请输入T2枪支弹药" style="width: 100%" @change="calculateTotals" />
209
+            </el-form-item>
210
+            <el-form-item label="T2扫黄打非" prop="t2Pornography">
211
+              <el-input-number v-model="form.t2Pornography" :min="0" placeholder="请输入T2扫黄打非" style="width: 100%" @change="calculateTotals" />
212
+            </el-form-item>
213
+            <el-form-item label="T2其他" prop="t2Other">
214
+              <el-input-number v-model="form.t2Other" :min="0" placeholder="请输入T2其他" style="width: 100%" @change="calculateTotals" />
215
+            </el-form-item>
216
+          </el-col>
217
+          <el-col :span="6">
218
+            <el-form-item label="T2总数" prop="t2Total">
219
+              <el-input v-model="form.t2Total" placeholder="自动计算" readonly style="width: 100%" />
220
+            </el-form-item>
221
+            <el-form-item label="T1总数+T2总数" prop="total">
222
+              <el-input v-model="form.total" placeholder="自动计算" readonly style="width: 100%" />
223
+            </el-form-item>
224
+          </el-col>
225
+        </el-row>
226
+      </el-form>
227
+      <template #footer>
228
+        <div class="dialog-footer">
229
+          <el-button type="primary" @click="submitForm">确 定</el-button>
230
+          <el-button @click="cancel">取 消</el-button>
231
+        </div>
232
+      </template>
233
+    </el-dialog>
234
+
235
+    <!-- 导入对话框 -->
236
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
237
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
238
+        :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
239
+        :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
240
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
241
+        <div class="el-upload__text">
242
+          将文件拖到此处,或<em>点击上传</em>
243
+        </div>
244
+        <template #tip>
245
+          <div class="el-upload__tip">
246
+            <span>仅允许导入xls、xlsx格式文件。</span>
247
+            <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
248
+              @click="importTemplate">下载模板</el-link>
249
+          </div>
250
+        </template>
251
+      </el-upload>
252
+      <template #footer>
253
+        <div class="dialog-footer">
254
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
255
+          <el-button @click="upload.open = false">取 消</el-button>
256
+        </div>
257
+      </template>
258
+    </el-dialog>
259
+  </div>
260
+</template>
261
+
262
+<script setup name="SeizeData">
263
+import { listSeizeData, getSeizeData, delSeizeData, addSeizeData, updateSeizeData } from "@/api/runData/seizeData"
264
+import { getToken } from '@/utils/auth'
265
+
266
+const { proxy } = getCurrentInstance()
267
+
268
+const seizeDataList = ref([])
269
+const open = ref(false)
270
+const loading = ref(true)
271
+const showSearch = ref(true)
272
+const ids = ref([])
273
+const single = ref(true)
274
+const multiple = ref(true)
275
+const total = ref(0)
276
+const title = ref("")
277
+
278
+// 导入参数
279
+const upload = reactive({
280
+  // 是否显示弹出层
281
+  open: false,
282
+  // 弹出层标题
283
+  title: "",
284
+  // 是否禁用上传
285
+  isUploading: false,
286
+  // 是否更新已经存在的查获数据
287
+  updateSupport: 0,
288
+  // 设置上传的请求头部
289
+  headers: { Authorization: "Bearer " + getToken() },
290
+  // 上传的地址
291
+  url: import.meta.env.VITE_APP_BASE_API + "/runData/seizeData/importData"
292
+})
293
+
294
+const uploadRef = ref()
295
+
296
+const data = reactive({
297
+  form: {},
298
+  queryParams: {
299
+    pageNum: 1,
300
+    pageSize: 10,
301
+    date: null,
302
+    shift: null,
303
+    team: null
304
+  },
305
+  rules: {
306
+    date: [
307
+      { required: true, message: "日期不能为空", trigger: "blur" }
308
+    ],
309
+    shift: [
310
+      { required: true, message: "班次不能为空", trigger: "blur" }
311
+    ],
312
+    team: [
313
+      { required: true, message: "当班大队不能为空", trigger: "blur" }
314
+    ],
315
+    t1Fire: [
316
+      { type: "integer", message: "T1火种必须为整数", trigger: "blur" }
317
+    ],
318
+    t1Knife: [
319
+      { type: "integer", message: "T1刀具必须为整数", trigger: "blur" }
320
+    ],
321
+    t1PoliceEquipment: [
322
+      { type: "integer", message: "T1警械器具必须为整数", trigger: "blur" }
323
+    ],
324
+    t1Fireworks: [
325
+      { type: "integer", message: "T1烟花爆竹必须为整数", trigger: "blur" }
326
+    ],
327
+    t1LiveAnimal: [
328
+      { type: "integer", message: "T1活体动物必须为整数", trigger: "blur" }
329
+    ],
330
+    t1Corrosive: [
331
+      { type: "integer", message: "T1腐蚀性物品必须为整数", trigger: "blur" }
332
+    ],
333
+    t1Counterfeit: [
334
+      { type: "integer", message: "T1用假冒他必须为整数", trigger: "blur" }
335
+    ],
336
+    t1Explosive: [
337
+      { type: "integer", message: "T1爆炸装置必须为整数", trigger: "blur" }
338
+    ],
339
+    t1Tool: [
340
+      { type: "integer", message: "T1工具必须为整数", trigger: "blur" }
341
+    ],
342
+    t1Gun: [
343
+      { type: "integer", message: "T1枪支弹药必须为整数", trigger: "blur" }
344
+    ],
345
+    t1Pornography: [
346
+      { type: "integer", message: "T1扫黄打非必须为整数", trigger: "blur" }
347
+    ],
348
+    t1Other: [
349
+      { type: "integer", message: "T1其他必须为整数", trigger: "blur" }
350
+    ],
351
+    t2Fire: [
352
+      { type: "integer", message: "T2火种必须为整数", trigger: "blur" }
353
+    ],
354
+    t2Knife: [
355
+      { type: "integer", message: "T2刀具必须为整数", trigger: "blur" }
356
+    ],
357
+    t2PoliceEquipment: [
358
+      { type: "integer", message: "T2警械器具必须为整数", trigger: "blur" }
359
+    ],
360
+    t2Fireworks: [
361
+      { type: "integer", message: "T2烟花爆竹必须为整数", trigger: "blur" }
362
+    ],
363
+    t2LiveAnimal: [
364
+      { type: "integer", message: "T2活体动物必须为整数", trigger: "blur" }
365
+    ],
366
+    t2Corrosive: [
367
+      { type: "integer", message: "T2腐蚀性物品必须为整数", trigger: "blur" }
368
+    ],
369
+    t2Counterfeit: [
370
+      { type: "integer", message: "T2用假冒他必须为整数", trigger: "blur" }
371
+    ],
372
+    t2Explosive: [
373
+      { type: "integer", message: "T2爆炸装置必须为整数", trigger: "blur" }
374
+    ],
375
+    t2Tool: [
376
+      { type: "integer", message: "T2工具必须为整数", trigger: "blur" }
377
+    ],
378
+    t2Gun: [
379
+      { type: "integer", message: "T2枪支弹药必须为整数", trigger: "blur" }
380
+    ],
381
+    t2Pornography: [
382
+      { type: "integer", message: "T2扫黄打非必须为整数", trigger: "blur" }
383
+    ],
384
+    t2Other: [
385
+      { type: "integer", message: "T2其他必须为整数", trigger: "blur" }
386
+    ]
387
+  }
388
+})
389
+
390
+const { queryParams, form, rules } = toRefs(data)
391
+
392
+/** 计算总数 */
393
+function calculateTotals() {
394
+  // 计算T1总数
395
+  const t1Fields = ['t1Fire', 't1Knife', 't1PoliceEquipment', 't1Fireworks', 't1LiveAnimal', 
396
+                   't1Corrosive', 't1Counterfeit', 't1Explosive', 't1Tool', 't1Gun', 
397
+                   't1Pornography', 't1Other']
398
+  const t1Total = t1Fields.reduce((sum, field) => {
399
+    return sum + (form.value[field] || 0)
400
+  }, 0)
401
+  form.value.t1Total = t1Total
402
+  
403
+  // 计算T2总数
404
+  const t2Fields = ['t2Fire', 't2Knife', 't2PoliceEquipment', 't2Fireworks', 't2LiveAnimal', 
405
+                   't2Corrosive', 't2Counterfeit', 't2Explosive', 't2Tool', 't2Gun', 
406
+                   't2Pornography', 't2Other']
407
+  const t2Total = t2Fields.reduce((sum, field) => {
408
+    return sum + (form.value[field] || 0)
409
+  }, 0)
410
+  form.value.t2Total = t2Total
411
+  
412
+  // 计算总总数
413
+  form.value.total = t1Total + t2Total
414
+}
415
+
416
+/** 查询查获数据列表 */
417
+function getList() {
418
+  loading.value = true
419
+  listSeizeData(queryParams.value).then(response => {
420
+    seizeDataList.value = response.rows
421
+    total.value = response.total
422
+    loading.value = false
423
+  })
424
+}
425
+
426
+// 取消按钮
427
+function cancel() {
428
+  open.value = false
429
+  reset()
430
+}
431
+
432
+// 表单重置
433
+function reset() {
434
+  form.value = {
435
+    id: null,
436
+    date: null,
437
+    shift: null,
438
+    team: null,
439
+    // T1区域数据
440
+    t1Fire: null,
441
+    t1Knife: null,
442
+    t1PoliceEquipment: null,
443
+    t1Fireworks: null,
444
+    t1LiveAnimal: null,
445
+    t1Corrosive: null,
446
+    t1Counterfeit: null,
447
+    t1Explosive: null,
448
+    t1Tool: null,
449
+    t1Gun: null,
450
+    t1Pornography: null,
451
+    t1Other: null,
452
+    t1Total: null,
453
+    // T2区域数据
454
+    t2Fire: null,
455
+    t2Knife: null,
456
+    t2PoliceEquipment: null,
457
+    t2Fireworks: null,
458
+    t2LiveAnimal: null,
459
+    t2Corrosive: null,
460
+    t2Counterfeit: null,
461
+    t2Explosive: null,
462
+    t2Tool: null,
463
+    t2Gun: null,
464
+    t2Pornography: null,
465
+    t2Other: null,
466
+    t2Total: null,
467
+    total: null
468
+  }
469
+  proxy.resetForm("seizeDataRef")
470
+}
471
+
472
+/** 搜索按钮操作 */
473
+function handleQuery() {
474
+  queryParams.value.pageNum = 1
475
+  getList()
476
+}
477
+
478
+/** 重置按钮操作 */
479
+function resetQuery() {
480
+  proxy.resetForm("queryRef")
481
+  handleQuery()
482
+}
483
+
484
+// 多选框选中数据
485
+function handleSelectionChange(selection) {
486
+  ids.value = selection.map(item => item.id)
487
+  single.value = selection.length != 1
488
+  multiple.value = !selection.length
489
+}
490
+
491
+/** 新增按钮操作 */
492
+function handleAdd() {
493
+  reset()
494
+  open.value = true
495
+  title.value = "添加查获数据"
496
+}
497
+
498
+/** 修改按钮操作 */
499
+function handleUpdate(row) {
500
+  reset()
501
+  const _id = row.id || ids.value
502
+  getSeizeData(_id).then(response => {
503
+    form.value = response.data
504
+    open.value = true
505
+    title.value = "修改查获数据"
506
+  })
507
+}
508
+
509
+/** 提交按钮 */
510
+function submitForm() {
511
+  proxy.$refs["seizeDataRef"].validate(valid => {
512
+    if (valid) {
513
+      // 提交前重新计算总数
514
+      calculateTotals()
515
+      
516
+      if (form.value.id != null) {
517
+        updateSeizeData(form.value).then(response => {
518
+          proxy.$modal.msgSuccess("修改成功")
519
+          open.value = false
520
+          getList()
521
+        })
522
+      } else {
523
+        addSeizeData(form.value).then(response => {
524
+          proxy.$modal.msgSuccess("新增成功")
525
+          open.value = false
526
+          getList()
527
+        })
528
+      }
529
+    }
530
+  })
531
+}
532
+
533
+/** 删除按钮操作 */
534
+function handleDelete(row) {
535
+  const _ids = row.id || ids.value
536
+  proxy.$modal.confirm('是否确认删除数据项?').then(function () {
537
+    return delSeizeData(_ids)
538
+  }).then(() => {
539
+    getList()
540
+    proxy.$modal.msgSuccess("删除成功")
541
+  }).catch(() => { })
542
+}
543
+
544
+/** 导出按钮操作 */
545
+function handleExport() {
546
+  // 过滤掉值为null的参数,但保留分页参数
547
+  const filteredParams = Object.fromEntries(
548
+    Object.entries(queryParams.value).filter(([key, value]) => {
549
+      // 保留分页参数
550
+      if (key === 'pageNum' || key === 'pageSize') return true
551
+      // 过滤掉其他为null的参数
552
+      return value !== null
553
+    })
554
+  )
555
+  
556
+  proxy.download('/runData/seizeData/export', filteredParams, `seizeData_${new Date().getTime()}.xlsx`)
557
+}
558
+
559
+/** 导入按钮操作 */
560
+function handleImport() {
561
+  upload.title = "查获数据导入"
562
+  upload.open = true
563
+}
564
+
565
+/** 下载模板操作 */
566
+function importTemplate() {
567
+  proxy.download('/runData/seizeData/importTemplate', {
568
+  }, `查获数据导入模板_${new Date().getTime()}.xlsx`)
569
+}
570
+
571
+/** 文件上传中处理 */
572
+const handleFileUploadProgress = (event, file, fileList) => {
573
+  upload.isUploading = true
574
+}
575
+
576
+/** 文件上传成功处理 */
577
+const handleFileSuccess = (response, file, fileList) => {
578
+  upload.open = false
579
+  upload.isUploading = false
580
+  uploadRef.value.handleRemove(file)
581
+  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true })
582
+  getList()
583
+}
584
+
585
+/** 提交上传文件 */
586
+function submitFileForm() {
587
+  uploadRef.value.submit()
588
+}
589
+
590
+getList()
591
+</script>

+ 0 - 0
src/views/runData/seizeData/查获数据