瀏覽代碼

feat(用户管理): 新增根据用户ID和角色编码查询直属领导列表接口

fix(每日行李查缉): 修复查询详细接口URL路径错误

style(排行榜组件): 优化排行榜样式和表头配置

refactor(速率统计): 重构导入功能使用标准上传组件

refactor(每日各时段查堵行李): 重构导入功能并优化表单验证

refactor(漏检管理): 重构导入功能并优化表单交互

refactor(每日行李过检查堵): 重构导入功能并优化表格列宽
huoyi 1 天之前
父節點
當前提交
159e4d2527

+ 1 - 1
src/api/blockingData/dailyLuggageCheckInList.js

@@ -12,7 +12,7 @@ export function listDailyLuggageCheckIn(query) {
12 12
 // 查询每日行李查缉详细
13 13
 export function getDailyLuggageCheckIn(id) {
14 14
   return request({
15
-    url: `/blocked/daily${id}`,
15
+    url: `/blocked/daily/${id}`,
16 16
     method: 'get'
17 17
   })
18 18
 }

+ 9 - 0
src/api/system/user.js

@@ -143,3 +143,12 @@ export function deptTreeSelect() {
143 143
     method: 'get'
144 144
   })
145 145
 }
146
+
147
+//根据用户ID和角色编码列表查询各级直属领导列表
148
+export function selectUserLeaderListByCondition(data) {
149
+  return request({
150
+    url: '/system/user/selectUserLeaderListByCondition',
151
+    method: 'post',
152
+    data: data
153
+  })
154
+}

+ 3 - 3
src/views/blockingData/blockingDataScreen/components/ModuleBrigadeTwo.vue

@@ -4,15 +4,15 @@
4 4
       <div class="chart-row">
5 5
         <div class="chart-item">
6 6
           <div class="chart-title">查堵-主管排行榜</div>
7
-          <rank-list :rank-data="rankData1" title="查堵-主管排行榜" />
7
+          <rank-list :rank-data="rankData1" title="查堵-主管排行榜" header-label="排名" header-name="分管主管" header-count="计数" />
8 8
         </div>
9 9
         <div class="chart-item">
10 10
           <div class="chart-title">查堵-班组长排行榜</div>
11
-          <rank-list :rank-data="rankData2" title="查堵-班组长排行榜" />
11
+          <rank-list :rank-data="rankData2" title="查堵-班组长排行榜" header-label="排名" header-name="分管班组长" header-count="计数" />
12 12
         </div>
13 13
         <div class="chart-item">
14 14
           <div class="chart-title">查堵-员工排行榜</div>
15
-          <rank-list :rank-data="rankData3" title="查堵-员工排行榜" />
15
+          <rank-list :rank-data="rankData3" title="查堵-员工排行榜" header-label="排名" header-name="被回查人" header-count="计数" />
16 16
         </div>
17 17
       </div>
18 18
       

+ 6 - 6
src/views/blockingData/blockingDataScreen/components/ModuleTwo.vue

@@ -3,16 +3,16 @@
3 3
     <div class="module-two-content">
4 4
       <div class="top-row">
5 5
         <div class="table-card">
6
-          <div class="chart-title">查堵-主管分管榜</div>
7
-          <rank-list :rank-data="rankData1" title="查堵-主管分管榜" />
6
+          <div class="chart-title">查堵-主管排行榜</div>
7
+          <rank-list :rank-data="rankData1" title="查堵-主管排行榜" header-label="排名" header-name="分管主管" header-count="计数" />
8 8
         </div>
9 9
         <div class="table-card">
10
-          <div class="chart-title">查堵-班组排行</div>
11
-          <rank-list :rank-data="rankData2" title="查堵-班组排行" />
10
+          <div class="chart-title">查堵-班组排行</div>
11
+          <rank-list :rank-data="rankData2" title="查堵-班组排行榜" header-label="排名" header-name="分管班组长" header-count="计数" />
12 12
         </div>
13 13
         <div class="table-card">
14
-          <div class="chart-title">查堵-人员榜</div>
15
-          <rank-list :rank-data="rankData3" title="查堵-人员榜" />
14
+          <div class="chart-title">查堵-人员排行榜</div>
15
+          <rank-list :rank-data="rankData3" title="查堵-人员排行" header-label="排名" header-name="被回查人" header-count="计数" />
16 16
         </div>
17 17
       </div>
18 18
 

+ 28 - 15
src/views/blockingData/blockingDataScreen/components/RankList.vue

@@ -1,9 +1,9 @@
1 1
 <template>
2 2
   <div class="rank-list-container">
3 3
     <div class="rank-list-header">
4
-      <span class="header-label">排名</span>
5
-      <span class="header-name">分管班组长</span>
6
-      <span class="header-count">计数</span>
4
+      <span class="header-label">{{ headerLabel }}</span>
5
+      <span class="header-name">{{ headerName }}</span>
6
+      <span class="header-count">{{ headerCount }}</span>
7 7
     </div>
8 8
     <div class="rank-list-body">
9 9
       <div v-for="(item, index) in rankData" :key="index" class="rank-item" :class="'rank-item-' + getRankClass(index)">
@@ -31,6 +31,18 @@ const props = defineProps({
31 31
   title: {
32 32
     type: String,
33 33
     default: '排行榜'
34
+  },
35
+  headerLabel: {
36
+    type: String,
37
+    default: '排名'
38
+  },
39
+  headerName: {
40
+    type: String,
41
+    default: '分管班组长'
42
+  },
43
+  headerCount: {
44
+    type: String,
45
+    default: '计数'
34 46
   }
35 47
 })
36 48
 
@@ -57,7 +69,8 @@ const getProgressWidth = (value, max) => {
57 69
   height: 100%;
58 70
   background: #fff;
59 71
   border-radius: 8px;
60
-  padding: 16px;
72
+  border: 1px solid #e5e7eb;
73
+  // padding: 16px;
61 74
   display: flex;
62 75
   flex-direction: column;
63 76
 }
@@ -65,7 +78,7 @@ const getProgressWidth = (value, max) => {
65 78
 .rank-list-header {
66 79
   display: flex;
67 80
   align-items: center;
68
-  padding: 8px 0;
81
+  padding: 8px;
69 82
   border-bottom: 1px solid #e5e7eb;
70 83
   margin-bottom: 8px;
71 84
 }
@@ -100,9 +113,9 @@ const getProgressWidth = (value, max) => {
100 113
 .rank-item {
101 114
   display: flex;
102 115
   align-items: center;
103
-  padding: 10px 0;
104
-  border-radius: 8px;
105
-  transition: background-color 0.2s;
116
+  padding: 10px;
117
+
118
+  // transition: background-color 0.2s;
106 119
 }
107 120
 
108 121
 .rank-item-first {
@@ -122,7 +135,7 @@ const getProgressWidth = (value, max) => {
122 135
 }
123 136
 
124 137
 .rank-number {
125
-  width: 80px;
138
+  //width: 80px;
126 139
   font-weight: bold;
127 140
   font-size: 15px;
128 141
   padding: 4px 8px;
@@ -130,17 +143,17 @@ const getProgressWidth = (value, max) => {
130 143
 }
131 144
 
132 145
 .rank-number-first {
133
-  background-color: #fbbf24;
146
+  background: linear-gradient(135deg, #EFB63D, #F8CA4D);
134 147
   color: #fff;
135 148
 }
136 149
 
137 150
 .rank-number-second {
138
-  background-color: #9ca3af;
151
+  background: linear-gradient(135deg, #C4CAE1, #E0E4ED);
139 152
   color: #fff;
140 153
 }
141 154
 
142 155
 .rank-number-third {
143
-  background-color: #f87171;
156
+  background: linear-gradient(135deg, #D6A089, #E9C0AF);
144 157
   color: #fff;
145 158
 }
146 159
 
@@ -179,15 +192,15 @@ const getProgressWidth = (value, max) => {
179 192
 }
180 193
 
181 194
 .rank-bar-fill-first {
182
-  background: linear-gradient(90deg, #fbbf24, #f59e0b);
195
+  background: #FFCA00;
183 196
 }
184 197
 
185 198
 .rank-bar-fill-second {
186
-  background: linear-gradient(90deg, #9ca3af, #6b7280);
199
+  background: #C4C9DF;
187 200
 }
188 201
 
189 202
 .rank-bar-fill-third {
190
-  background: linear-gradient(90deg, #f87171, #ef4444);
203
+  background: #D99B86;
191 204
 }
192 205
 
193 206
 .rank-bar-fill-default {

+ 124 - 111
src/views/blockingData/dailyLuggageCheckInList/index.vue

@@ -6,8 +6,8 @@
6 6
           <el-option v-for="item in brigadeOptions" :key="item.value" :label="item.label" :value="item.value" />
7 7
         </el-select>
8 8
       </el-form-item>
9
-      <el-form-item label="日期" prop="date">
10
-        <el-date-picker clearable v-model="queryParams.date" type="date" placeholder="选择日期" value-format="YYYY-MM-DD"
9
+      <el-form-item label="日期" prop="startDate">
10
+        <el-date-picker clearable v-model="queryParams.startDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD"
11 11
           style="width: 200px" />
12 12
       </el-form-item>
13 13
       <el-form-item>
@@ -38,38 +38,38 @@
38 38
 
39 39
     <el-table v-loading="loading" :data="dailyLuggageCheckInList" @selection-change="handleSelectionChange">
40 40
       <el-table-column type="selection" width="55" align="center" />
41
-      <el-table-column label="日期" align="center" prop="statDate" width="120" />
42
-      <el-table-column label="班次" align="center" prop="shiftType" width="100" />
43
-      <el-table-column label="当班大队" align="center" prop="brigadeName" width="120" />
44
-      <el-table-column label="T1旅检过检行李数" align="center" prop="t1TravelLuggageCount" width="150" />
45
-      <el-table-column label="T2旅检过检行李数" align="center" prop="t2TravelLuggageCount" width="150" />
46
-      <el-table-column label="过检行李合计" align="center" prop="totalLuggageCount" width="120" />
47
-      <el-table-column label="T1旅检查堵件数" align="center" prop="t1TravelBlockedCount" width="120" />
48
-      <el-table-column label="T1旅检万分率" align="center" prop="t1TravelBlockRate" width="120" />
49
-      <el-table-column label="T2旅检查堵件数" align="center" prop="t2TravelBlockedCount" width="120" />
50
-      <el-table-column label="T2旅检万分率" align="center" prop="t2TravelBlockRate" width="120" />
51
-      <el-table-column label="T1行检过检行李数" align="center" prop="t1WalkLuggageCount" width="120" />
52
-      <el-table-column label="T2行检过检行李数" align="center" prop="t2WalkLuggageCount" width="120" />
53
-      <el-table-column label="T1行检查堵件数" align="center" prop="t1WalkBlockedCount" width="120" />
54
-      <el-table-column label="T1行检万分率" align="center" prop="t1WalkBlockRate" width="120" />
55
-      <el-table-column label="T2行检查堵件数" align="center" prop="t2WalkBlockedCount" width="120" />
56
-      <el-table-column label="T2行检万分率" align="center" prop="t2WalkBlockRate" width="120" />
57
-      <el-table-column label="查堵合计件数" align="center" prop="totalBlockedCount" width="120" />
58
-      <el-table-column label="当日查堵万分率" align="center" prop="dailyBlockRate" width="120" />
59
-      <el-table-column label="T1复查图像总数" align="center" prop="t1ReviewImageTotal" width="120" />
60
-      <el-table-column label="T1-AI标记总数" align="center" prop="t1AiMarkTotal" width="120" />
61
-      <el-table-column label="T1-AI误判总数" align="center" prop="t1AiErrorTotal" width="120" />
62
-      <el-table-column label="T1-AI漏判总数" align="center" prop="t1AiMissTotal" width="120" />
63
-      <el-table-column label="T2复查图像总数" align="center" prop="t2ReviewImageTotal" width="120" />
64
-      <el-table-column label="T2-AI标记总数" align="center" prop="t2AiMarkTotal" width="120" />
65
-      <el-table-column label="T2-AI误判总数" align="center" prop="t2AiErrorTotal" width="120" />
66
-      <el-table-column label="T2-AI漏判总数" align="center" prop="t2AiMissTotal" width="120" />
67
-      <el-table-column label="其他(VP通道)数量" align="center" prop="otherVipCount" width="140" />
68
-      <el-table-column label="AI复查图像总数" align="center" prop="aiReviewImageTotal" width="120" />
69
-      <el-table-column label="AI标记图像总数" align="center" prop="aiMarkTotal" width="120" />
70
-      <el-table-column label="AI漏判图像总数" align="center" prop="aiMissImageTotal" width="120" />
71
-      <el-table-column label="AI误判图像总数" align="center" prop="aiErrorImageTotal" width="140" />
72
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="140">
41
+      <el-table-column label="日期" align="center" prop="statDate" min-width="120" />
42
+      <el-table-column label="班次" align="center" prop="shiftType" min-width="100" />
43
+      <el-table-column label="当班大队" align="center" prop="brigadeName" min-width="120" />
44
+      <el-table-column label="T1旅检过检行李数" align="center" prop="t1TravelLuggageCount" min-width="150" />
45
+      <el-table-column label="T2旅检过检行李数" align="center" prop="t2TravelLuggageCount" min-width="150" />
46
+      <el-table-column label="过检行李合计" align="center" prop="totalLuggageCount" min-width="120" />
47
+      <el-table-column label="T1旅检查堵件数" align="center" prop="t1TravelBlockedCount" min-width="140" />
48
+      <el-table-column label="T1旅检万分率" align="center" prop="t1TravelBlockRate" min-width="130" />
49
+      <el-table-column label="T2旅检查堵件数" align="center" prop="t2TravelBlockedCount" min-width="140" />
50
+      <el-table-column label="T2旅检万分率" align="center" prop="t2TravelBlockRate" min-width="130" />
51
+      <el-table-column label="T1行检过检行李数" align="center" prop="t1WalkLuggageCount" min-width="150" />
52
+      <el-table-column label="T2行检过检行李数" align="center" prop="t2WalkLuggageCount" min-width="150" />
53
+      <el-table-column label="T1行检查堵件数" align="center" prop="t1WalkBlockedCount" min-width="140" />
54
+      <el-table-column label="T1行检万分率" align="center" prop="t1WalkBlockRate" min-width="130" />
55
+      <el-table-column label="T2行检查堵件数" align="center" prop="t2WalkBlockedCount" min-width="140" />
56
+      <el-table-column label="T2行检万分率" align="center" prop="t2WalkBlockRate" min-width="130" />
57
+      <el-table-column label="查堵合计件数" align="center" prop="totalBlockedCount" min-width="120" />
58
+      <el-table-column label="当日查堵万分率" align="center" prop="dailyBlockRate" min-width="130" />
59
+      <el-table-column label="T1复查图像总数" align="center" prop="t1ReviewImageTotal" min-width="140" />
60
+      <el-table-column label="T1-AI标记总数" align="center" prop="t1AiMarkTotal" min-width="140" />
61
+      <el-table-column label="T1-AI误判总数" align="center" prop="t1AiErrorTotal" min-width="140" />
62
+      <el-table-column label="T1-AI漏判总数" align="center" prop="t1AiMissTotal" min-width="140" />
63
+      <el-table-column label="T2复查图像总数" align="center" prop="t2ReviewImageTotal" min-width="140" />
64
+      <el-table-column label="T2-AI标记总数" align="center" prop="t2AiMarkTotal" min-width="140" />
65
+      <el-table-column label="T2-AI误判总数" align="center" prop="t2AiErrorTotal" min-width="140" />
66
+      <el-table-column label="T2-AI漏判总数" align="center" prop="t2AiMissTotal" min-width="140" />
67
+      <el-table-column label="其他(VP通道)数量" align="center" prop="otherVipCount" min-width="150" />
68
+      <el-table-column label="AI复查图像总数" align="center" prop="aiReviewImageTotal" min-width="150" />
69
+      <el-table-column label="AI标记图像总数" align="center" prop="aiMarkTotal" min-width="150" />
70
+      <el-table-column label="AI漏判图像总数" align="center" prop="aiMissImageTotal" min-width="150" />
71
+      <el-table-column label="AI误判图像总数" align="center" prop="aiErrorImageTotal" min-width="150" />
72
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="140" fixed="right">
73 73
         <template #default="scope">
74 74
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
75 75
             v-hasPermi="['dailyLuggageCheckIn:dailyLuggageCheckIn:edit']">修改</el-button>
@@ -102,8 +102,8 @@
102 102
             </el-form-item>
103 103
           </el-col>
104 104
         </el-row>
105
-        <el-form-item label="当班大队" prop="brigadeName">
106
-          <el-select v-model="form.brigadeName" placeholder="请选择当班大队" style="width: 100%">
105
+        <el-form-item label="当班大队" prop="brigadeId">
106
+          <el-select v-model="form.brigadeId" placeholder="请选择当班大队" style="width: 100%">
107 107
             <el-option v-for="item in brigadeOptions" :key="item.value" :label="item.label" :value="item.value" />
108 108
           </el-select>
109 109
         </el-form-item>
@@ -132,11 +132,11 @@
132 132
           </el-col>
133 133
         </el-row>
134 134
         <el-row :gutter="20">
135
-          <el-col :span="12">
136
-            <!-- <el-form-item label="过检行李合计" prop="totalLuggageCount">
135
+          <!--  <el-col :span="12">
136
+          <el-form-item label="过检行李合计" prop="totalLuggageCount">
137 137
               <el-input-number v-model="form.totalLuggageCount" :min="0" style="width: 100%" />
138
-            </el-form-item> -->
139
-          </el-col>
138
+            </el-form-item> 
139
+          </el-col> -->
140 140
         </el-row>
141 141
         <el-row :gutter="20">
142 142
           <el-col :span="12">
@@ -145,22 +145,15 @@
145 145
             </el-form-item>
146 146
           </el-col>
147 147
           <el-col :span="12">
148
-            <!-- <el-form-item label="T1旅检万分率" prop="t1TravelBlockRate">
149
-              <el-input-number v-model="form.t1TravelBlockRate" :min="0" :precision="2" style="width: 100%" />
150
-            </el-form-item> -->
151
-          </el-col>
152
-        </el-row>
153
-        <el-row :gutter="20">
154
-          <el-col :span="12">
155 148
             <el-form-item label="T2旅检查堵件数" prop="t2TravelBlockedCount">
156 149
               <el-input-number v-model="form.t2TravelBlockedCount" :min="0" :precision="0" style="width: 100%" />
157 150
             </el-form-item>
158 151
           </el-col>
159
-          <el-col :span="12">
160
-            <!-- <el-form-item label="T2旅检万分率" prop="t2TravelBlockRate">
161
-              <el-input-number v-model="form.t2TravelBlockRate" :min="0" :precision="2" style="width: 100%" />
162
-            </el-form-item> -->
163
-          </el-col>
152
+          <!--  <el-col :span="12">
153
+            <el-form-item label="T1旅检万分率" prop="t1TravelBlockRate">
154
+              <el-input-number v-model="form.t1TravelBlockRate" :min="0" :precision="2" style="width: 100%" />
155
+            </el-form-item> 
156
+          </el-col>-->
164 157
         </el-row>
165 158
         <el-row :gutter="20">
166 159
           <el-col :span="12">
@@ -169,31 +162,38 @@
169 162
             </el-form-item>
170 163
           </el-col>
171 164
           <el-col :span="12">
172
-            <!-- <el-form-item label="T1行检万分率" prop="t1WalkBlockRate">
173
-              <el-input-number v-model="form.t1WalkBlockRate" :min="0" :precision="2" style="width: 100%" />
174
-            </el-form-item> -->
175
-          </el-col>
176
-        </el-row>
177
-        <el-row :gutter="20">
178
-          <el-col :span="12">
179 165
             <el-form-item label="T2行检查堵件数" prop="t2WalkBlockedCount">
180 166
               <el-input-number v-model="form.t2WalkBlockedCount" :min="0" :precision="0" style="width: 100%" />
181 167
             </el-form-item>
182 168
           </el-col>
183
-          <el-col :span="12">
184
-            <!-- <el-form-item label="T2行检万分率" prop="t2WalkBlockRate">
185
-              <el-input-number v-model="form.t2WalkBlockRate" :min="0" :precision="2" style="width: 100%" />
186
-            </el-form-item> -->
187
-          </el-col>
169
+          <!--<el-col :span="12">
170
+             <el-form-item label="T2旅检万分率" prop="t2TravelBlockRate">
171
+              <el-input-number v-model="form.t2TravelBlockRate" :min="0" :precision="2" style="width: 100%" />
172
+            </el-form-item> 
173
+          </el-col>-->
188 174
         </el-row>
189
-        <el-row :gutter="20">
190
-          
191
-          <el-col :span="12">
192
-            <!-- <el-form-item label="当日查堵万分率" prop="dailyBlockRate">
175
+
176
+
177
+        <!--  <el-col :span="12">
178
+          <el-form-item label="T1行检万分率" prop="t1WalkBlockRate">
179
+              <el-input-number v-model="form.t1WalkBlockRate" :min="0" :precision="2" style="width: 100%" />
180
+            </el-form-item> 
181
+          </el-col>-->
182
+
183
+
184
+        <!-- <el-col :span="12">
185
+            <el-form-item label="T2行检万分率" prop="t2WalkBlockRate">
186
+              <el-input-number v-model="form.t2WalkBlockRate" :min="0" :precision="2" style="width: 100%" />
187
+            </el-form-item>
188
+          </el-col> -->
189
+
190
+
191
+          <!--   <el-col :span="12">
192
+           <el-form-item label="当日查堵万分率" prop="dailyBlockRate">
193 193
               <el-input-number v-model="form.dailyBlockRate" :min="0" :precision="2" style="width: 100%" />
194
-            </el-form-item> -->
195
-          </el-col>
196
-        </el-row>
194
+            </el-form-item> 
195
+          </el-col>-->
196
+    
197 197
         <el-row :gutter="20">
198 198
           <el-col :span="12">
199 199
             <el-form-item label="T1复查图像总数" prop="t1ReviewImageTotal">
@@ -245,7 +245,7 @@
245 245
         <el-form-item label="其他(VP通道)数量" prop="otherVipCount">
246 246
           <el-input-number v-model="form.otherVipCount" :min="0" style="width: 100%" />
247 247
         </el-form-item>
248
-    
248
+
249 249
       </el-form>
250 250
       <template #footer>
251 251
         <div class="dialog-footer">
@@ -256,21 +256,24 @@
256 256
     </el-dialog>
257 257
 
258 258
     <!-- 导入对话框 -->
259
-    <el-dialog title="导入" v-model="importOpen" width="500px" append-to-body>
260
-      <el-upload ref="uploadRef" :auto-upload="false" :on-change="handleFileChange" :show-file-list="false"
261
-        accept=".xlsx,.xls">
262
-        <el-button type="primary">选取文件</el-button>
263
-        
259
+    <el-dialog title="导入" v-model="upload.open" width="500px" append-to-body>
260
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url"
261
+        :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
262
+        :auto-upload="false" drag>
263
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
264
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
265
+        <template #tip>
266
+          <div class="el-upload__tip text-center">
267
+            <span>仅允许导入xls、xlsx格式文件。</span>
268
+            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
269
+              @click="importTemplate">下载模板</el-link>
270
+          </div>
271
+        </template>
264 272
       </el-upload>
265
-      <div class="el-upload__tip">只能上传xls/xlsx文件</div>
266
-        <div class="el-upload__tip">
267
-          <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
268
-            @click="importTemplate">下载模板</el-link>
269
-        </div>
270 273
       <template #footer>
271 274
         <div class="dialog-footer">
272
-          <el-button type="primary" @click="submitImport">确 定</el-button>
273
-          <el-button @click="importOpen = false">取 消</el-button>
275
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
276
+          <el-button @click="upload.open = false">取 消</el-button>
274 277
         </div>
275 278
       </template>
276 279
     </el-dialog>
@@ -281,6 +284,8 @@
281 284
 import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
282 285
 import { listDailyLuggageCheckIn, getDailyLuggageCheckIn, delDailyLuggageCheckIn, addDailyLuggageCheckIn, updateDailyLuggageCheckIn, exportDailyLuggageCheckIn, downloadTemplate } from '@/api/blockingData/dailyLuggageCheckInList'
283 286
 import { listDept } from '@/api/system/dept'
287
+import { getToken } from '@/utils/auth'
288
+import { UploadFilled } from '@element-plus/icons-vue'
284 289
 
285 290
 const { proxy } = getCurrentInstance()
286 291
 
@@ -302,10 +307,13 @@ const dailyLuggageCheckInList = ref([])
302 307
 const title = ref('')
303 308
 // 是否显示弹出层
304 309
 const open = ref(false)
305
-// 是否显示导入弹出层
306
-const importOpen = ref(false)
307
-// 导入文件
308
-const importFile = ref(null)
310
+
311
+const upload = reactive({
312
+  open: false,
313
+  isUploading: false,
314
+  headers: { Authorization: 'Bearer ' + getToken() },
315
+  url: import.meta.env.VITE_APP_BASE_API + '/blocked/daily/importData'
316
+})
309 317
 
310 318
 // 查询参数
311 319
 const queryParams = reactive({
@@ -322,7 +330,7 @@ const form = reactive({})
322 330
 const rules = {
323 331
   statDate: [{ required: true, message: '日期不能为空', trigger: 'change' }],
324 332
   shiftType: [{ required: true, message: '班次不能为空', trigger: 'change' }],
325
-  brigadeName: [{ required: true, message: '当班大队不能为空', trigger: 'change' }],
333
+  brigadeId: [{ required: true, message: '当班大队不能为空', trigger: 'change' }],
326 334
   t1TravelLuggageCount: [{ required: true, message: 'T1旅检过检行李数不能为空', trigger: 'change' }],
327 335
   t2TravelLuggageCount: [{ required: true, message: 'T2旅检过检行李数不能为空', trigger: 'change' }],
328 336
   t1WalkLuggageCount: [{ required: true, message: 'T1行检过检行李数不能为空', trigger: 'change' }],
@@ -359,7 +367,7 @@ function getList() {
359 367
 function getDeptList() {
360 368
   listDept({}).then(response => {
361 369
     const deptList = response.data || []
362
-    brigadeOptions.value = deptList.filter(item => item.deptType === 'BRIGADE').map(item => ({
370
+    brigadeOptions.value = deptList.filter(item => item.deptType === 'BRIGADE' && [311, 314, 315].includes(item.deptId)).map(item => ({
363 371
       value: item.deptId,
364 372
       label: item.deptName
365 373
     }))
@@ -378,6 +386,7 @@ function reset() {
378 386
     id: null,
379 387
     statDate: null,
380 388
     shiftType: null,
389
+    brigadeId: null,
381 390
     brigadeName: null,
382 391
     t1TravelLuggageCount: 0,
383 392
     t2TravelLuggageCount: 0,
@@ -454,6 +463,12 @@ function handleUpdate(row) {
454 463
 function submitForm() {
455 464
   proxy.$refs.dailyLuggageCheckInRef.validate(valid => {
456 465
     if (valid) {
466
+      // 获取brigadeName
467
+      const selectedBrigade = brigadeOptions.value.find(item => item.value === form.brigadeId)
468
+      if (selectedBrigade) {
469
+        form.brigadeName = selectedBrigade.label
470
+      }
471
+
457 472
       if (form.id != null) {
458 473
         updateDailyLuggageCheckIn(form).then(response => {
459 474
           proxy.$modal.msgSuccess('修改成功')
@@ -484,40 +499,38 @@ function handleDelete(row) {
484 499
 
485 500
 /** 导出按钮操作 */
486 501
 function handleExport() {
487
-  proxy.download('dailyLuggageCheckIn/export', {
502
+  proxy.download('/blocked/daily/export', {
488 503
     ...queryParams
489
-  }, `每日行李查缉_${new Date().getTime()}.xlsx`)
504
+  }, `每日行李过检行李查堵_${new Date().getTime()}.xlsx`)
490 505
 }
491 506
 
492 507
 /** 导入按钮操作 */
493 508
 function handleImport() {
494
-  importOpen.value = true
495
-  importFile.value = null
509
+  upload.open = true
496 510
 }
497 511
 
498 512
 /** 下载模板操作 */
499 513
 function importTemplate() {
500
-  proxy.download('blocked/daily/importTemplate', {}, `daily_luggage_checkin_template_${new Date().getTime()}.xlsx`)
514
+  proxy.download('blocked/daily/importTemplate', {}, `每日行李过检行李查堵模板_${new Date().getTime()}.xlsx`)
501 515
 }
502 516
 
503
-/** 文件选择 */
504
-function handleFileChange(file) {
505
-  importFile.value = file.raw
517
+/** 文件上传中处理 */
518
+const handleFileUploadProgress = (event, file, fileList) => {
519
+  upload.isUploading = true
506 520
 }
507 521
 
508
-/** 提交导入 */
509
-function submitImport() {
510
-  if (!importFile.value) {
511
-    proxy.$modal.msgWarning('请选择要导入的文件')
512
-    return
513
-  }
514
-  const formData = new FormData()
515
-  formData.append('file', importFile.value)
516
-  proxy.upload('dailyLuggageCheckIn/importData', formData).then(response => {
517
-    proxy.$modal.msgSuccess(response.msg)
518
-    importOpen.value = false
519
-    getList()
520
-  })
522
+/** 文件上传成功处理 */
523
+const handleFileSuccess = (response, file, fileList) => {
524
+  upload.open = false
525
+  upload.isUploading = false
526
+  proxy.$refs.uploadRef.handleRemove(file)
527
+  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true })
528
+  getList()
529
+}
530
+
531
+/** 提交上传文件 */
532
+function submitFileForm() {
533
+  proxy.$refs.uploadRef.submit()
521 534
 }
522 535
 
523 536
 onMounted(() => {

+ 120 - 74
src/views/blockingData/dailyLuggageInspectionScheduleByTime/index.vue

@@ -7,8 +7,8 @@
7 7
         </el-select>
8 8
       </el-form-item>
9 9
       <el-form-item label="统计日期" prop="statDate">
10
-        <el-date-picker clearable v-model="queryParams.statDate" type="date" placeholder="选择统计日期" value-format="YYYY-MM-DD"
11
-          style="width: 200px" />
10
+        <el-date-picker clearable v-model="queryParams.statDate" type="date" placeholder="选择统计日期"
11
+          value-format="YYYY-MM-DD" style="width: 200px" />
12 12
       </el-form-item>
13 13
       <el-form-item>
14 14
         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -36,23 +36,24 @@
36 36
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
37 37
     </el-row>
38 38
 
39
-    <el-table v-loading="loading" :data="dailyLuggageInspectionScheduleByTimeList" @selection-change="handleSelectionChange">
39
+    <el-table v-loading="loading" :data="dailyLuggageInspectionScheduleByTimeList"
40
+      @selection-change="handleSelectionChange">
40 41
       <el-table-column type="selection" width="55" align="center" />
41
-      <el-table-column label="统计日期" align="center" prop="statDate"  />
42
-      <el-table-column label="当班大队" align="center" prop="brigadeName"  />
43
-      <el-table-column label="时间段" align="center" prop="timePeriod"  />
44
-      <el-table-column label="备注" align="center" prop="remark"  />
45
-      <el-table-column label="T1行检箱包数" align="center" prop="t1WalkBagCount"  />
46
-      <el-table-column label="T1行检查堵数" align="center" prop="t1WalkBlockedCount"  />
47
-      <el-table-column label="T2行检箱包数" align="center" prop="t2WalkBagCount"  />
48
-      <el-table-column label="T2行检查堵数" align="center" prop="t2WalkBlockedCount"  />
49
-      <el-table-column label="T1旅检箱包数" align="center" prop="t1TravelBagCount"  />
50
-      <el-table-column label="T1旅检查堵数" align="center" prop="t1TravelBlockedCount"  />
51
-      <el-table-column label="T2旅检箱包数" align="center" prop="t2TravelBagCount"  />
52
-      <el-table-column label="T2旅检查堵数" align="center" prop="t2TravelBlockedCount"  />
53
-      <el-table-column label="过检行李数" align="center" prop="totalLuggageCount"  />
54
-      <el-table-column label="时段查堵件数" align="center" prop="totalBlockedCount"  />
55
-      <el-table-column label="查堵万分率" align="center" prop="blockedRate"  />
42
+      <el-table-column label="统计日期" align="center" prop="statDate" />
43
+      <el-table-column label="当班大队" align="center" prop="brigadeName" />
44
+      <el-table-column label="时间段" align="center" prop="timePeriod" />
45
+      <el-table-column label="备注" align="center" prop="remark" />
46
+      <el-table-column label="T1行检箱包数" align="center" prop="t1WalkBagCount" />
47
+      <el-table-column label="T1行检查堵数" align="center" prop="t1WalkBlockedCount" />
48
+      <el-table-column label="T2行检箱包数" align="center" prop="t2WalkBagCount" />
49
+      <el-table-column label="T2行检查堵数" align="center" prop="t2WalkBlockedCount" />
50
+      <el-table-column label="T1旅检箱包数" align="center" prop="t1TravelBagCount" />
51
+      <el-table-column label="T1旅检查堵数" align="center" prop="t1TravelBlockedCount" />
52
+      <el-table-column label="T2旅检箱包数" align="center" prop="t2TravelBagCount" />
53
+      <el-table-column label="T2旅检查堵数" align="center" prop="t2TravelBlockedCount" />
54
+      <el-table-column label="过检行李数" align="center" prop="totalLuggageCount" />
55
+      <el-table-column label="时段查堵件数" align="center" prop="totalBlockedCount" />
56
+      <el-table-column label="查堵万分率" align="center" prop="blockedRate" />
56 57
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="140">
57 58
         <template #default="scope">
58 59
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
@@ -66,8 +67,8 @@
66 67
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
67 68
       v-model:limit="queryParams.pageSize" @pagination="getList" />
68 69
 
69
-    <el-dialog :title="title" v-model="open" width="800px" append-to-body>
70
-      <el-form ref="dailyLuggageInspectionScheduleByTimeRef" :model="form" :rules="rules" label-width="180px">
70
+    <el-dialog :title="title" v-model="open" width="1000px" append-to-body>
71
+      <el-form ref="dailyLuggageInspectionScheduleByTimeRef" :model="form" :rules="rules" label-width="250px">
71 72
         <el-row :gutter="20">
72 73
           <el-col :span="12">
73 74
             <el-form-item label="统计日期" prop="statDate">
@@ -86,7 +87,10 @@
86 87
         <el-row :gutter="20">
87 88
           <el-col :span="12">
88 89
             <el-form-item label="时间段" prop="timePeriod">
89
-              <el-input v-model="form.timePeriod" placeholder="请输入时间段" style="width: 100%" />
90
+              <el-select v-model="form.timePeriod" placeholder="请选择时间段" style="width: 100%">
91
+                <el-option v-for="dict in blocked_time_period" :key="dict.value" :label="dict.label"
92
+                  :value="dict.value" />
93
+              </el-select>
90 94
             </el-form-item>
91 95
           </el-col>
92 96
           <el-col :span="12">
@@ -143,8 +147,8 @@
143 147
             </el-form-item>
144 148
           </el-col>
145 149
         </el-row>
146
-       
147
-       
150
+
151
+
148 152
       </el-form>
149 153
       <template #footer>
150 154
         <div class="dialog-footer">
@@ -154,21 +158,24 @@
154 158
       </template>
155 159
     </el-dialog>
156 160
 
157
-    <el-dialog title="导入" v-model="importOpen" width="500px" append-to-body>
158
-      <el-upload ref="uploadRef" :auto-upload="false" :on-change="handleFileChange" :show-file-list="false"
159
-        accept=".xlsx,.xls">
160
-        <el-button type="primary">选取文件</el-button>
161
-       
161
+    <el-dialog title="导入" v-model="upload.open" width="500px" append-to-body>
162
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url"
163
+        :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
164
+        :auto-upload="false" drag>
165
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
166
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
167
+        <template #tip>
168
+          <div class="el-upload__tip text-center">
169
+            <span>仅允许导入xls、xlsx格式文件。</span>
170
+            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
171
+              @click="importTemplate">下载模板</el-link>
172
+          </div>
173
+        </template>
162 174
       </el-upload>
163
-       <div class="el-upload__tip">只能上传xls/xlsx文件</div>
164
-        <div class="el-upload__tip">
165
-          <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
166
-            @click="importTemplate">下载模板</el-link>
167
-        </div>
168 175
       <template #footer>
169 176
         <div class="dialog-footer">
170
-          <el-button type="primary" @click="submitImport">确 定</el-button>
171
-          <el-button @click="importOpen = false">取 消</el-button>
177
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
178
+          <el-button @click="upload.open = false">取 消</el-button>
172 179
         </div>
173 180
       </template>
174 181
     </el-dialog>
@@ -179,8 +186,12 @@
179 186
 import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
180 187
 import { listDailyLuggageInspectionScheduleByTime, getDailyLuggageInspectionScheduleByTime, delDailyLuggageInspectionScheduleByTime, addDailyLuggageInspectionScheduleByTime, updateDailyLuggageInspectionScheduleByTime, exportDailyLuggageInspectionScheduleByTime, downloadTemplate } from '@/api/blockingData/dailyLuggageInspectionScheduleByTime'
181 188
 import { listDept } from '@/api/system/dept'
189
+import { useDict } from '@/utils/dict'
190
+import { getToken } from '@/utils/auth'
191
+import { UploadFilled } from '@element-plus/icons-vue'
182 192
 
183 193
 const { proxy } = getCurrentInstance()
194
+const { blocked_time_period } = useDict('blocked_time_period')
184 195
 
185 196
 const loading = ref(true)
186 197
 const ids = ref([])
@@ -191,8 +202,14 @@ const total = ref(0)
191 202
 const dailyLuggageInspectionScheduleByTimeList = ref([])
192 203
 const title = ref('')
193 204
 const open = ref(false)
194
-const importOpen = ref(false)
195
-const importFile = ref(null)
205
+
206
+
207
+const upload = reactive({
208
+  open: false,
209
+  isUploading: false,
210
+  headers: { Authorization: 'Bearer ' + getToken() },
211
+  url: import.meta.env.VITE_APP_BASE_API + '/blocked/pieceDaily/importData'
212
+})
196 213
 
197 214
 const queryParams = reactive({
198 215
   pageNum: 1,
@@ -207,14 +224,38 @@ const rules = {
207 224
   statDate: [{ required: true, message: '统计日期不能为空', trigger: 'change' }],
208 225
   brigadeId: [{ required: true, message: '当班大队不能为空', trigger: 'change' }],
209 226
   timePeriod: [{ required: true, message: '时间段不能为空', trigger: 'change' }],
210
-  t1WalkBagCount: [{ required: true, message: 'T1行检箱包数不能为空', trigger: 'change' }],
211
-  t1WalkBlockedCount: [{ required: true, message: 'T1行检查堵数不能为空', trigger: 'change' }],
212
-  t2WalkBagCount: [{ required: true, message: 'T2行检箱包数不能为空', trigger: 'change' }],
213
-  t2WalkBlockedCount: [{ required: true, message: 'T2行检查堵数不能为空', trigger: 'change' }],
214
-  t1TravelBagCount: [{ required: true, message: 'T1旅检箱包数不能为空', trigger: 'change' }],
215
-  t1TravelBlockedCount: [{ required: true, message: 'T1旅检查堵数不能为空', trigger: 'change' }],
216
-  t2TravelBagCount: [{ required: true, message: 'T2旅检箱包数不能为空', trigger: 'change' }],
217
-  t2TravelBlockedCount: [{ required: true, message: 'T2旅检查堵数不能为空', trigger: 'change' }]
227
+  t1WalkBagCount: [
228
+    { required: true, message: 'T1行检箱包数不能为空', trigger: 'blur' },
229
+    { type: 'number', message: '请输入有效的数字', trigger: 'blur' }
230
+  ],
231
+  t1WalkBlockedCount: [
232
+    { required: true, message: 'T1行检查堵数不能为空', trigger: 'blur' },
233
+    { type: 'number', message: '请输入有效的数字', trigger: 'blur' }
234
+  ],
235
+  t2WalkBagCount: [
236
+    { required: true, message: 'T2行检箱包数不能为空', trigger: 'blur' },
237
+    { type: 'number', message: '请输入有效的数字', trigger: 'blur' }
238
+  ],
239
+  t2WalkBlockedCount: [
240
+    { required: true, message: 'T2行检查堵数不能为空', trigger: 'blur' },
241
+    { type: 'number', message: '请输入有效的数字', trigger: 'blur' }
242
+  ],
243
+  t1TravelBagCount: [
244
+    { required: true, message: 'T1旅检箱包数不能为空', trigger: 'blur' },
245
+    { type: 'number', message: '请输入有效的数字', trigger: 'blur' }
246
+  ],
247
+  t1TravelBlockedCount: [
248
+    { required: true, message: 'T1旅检查堵数不能为空', trigger: 'blur' },
249
+    { type: 'number', message: '请输入有效的数字', trigger: 'blur' }
250
+  ],
251
+  t2TravelBagCount: [
252
+    { required: true, message: 'T2旅检箱包数不能为空', trigger: 'blur' },
253
+    { type: 'number', message: '请输入有效的数字', trigger: 'blur' }
254
+  ],
255
+  t2TravelBlockedCount: [
256
+    { required: true, message: 'T2旅检查堵数不能为空', trigger: 'blur' },
257
+    { type: 'number', message: '请输入有效的数字', trigger: 'blur' }
258
+  ]
218 259
   // remark 不设置必填校验
219 260
 }
220 261
 
@@ -232,10 +273,11 @@ function getList() {
232 273
 function getDeptList() {
233 274
   listDept({}).then(response => {
234 275
     const deptList = response.data || []
235
-    brigadeOptions.value = deptList.filter(item => item.deptType === 'BRIGADE').map(item => ({
276
+    brigadeOptions.value = deptList.filter(item => item.deptType === 'BRIGADE' && [311, 314, 315].includes(item.deptId)).map(item => ({
236 277
       value: item.deptId,
237 278
       label: item.deptName
238 279
     }))
280
+
239 281
   })
240 282
 }
241 283
 
@@ -251,14 +293,14 @@ function reset() {
251 293
     brigadeId: null,
252 294
     timePeriod: null,
253 295
     remark: null,
254
-    t1WalkBagCount: 0,
255
-    t1WalkBlockedCount: 0,
256
-    t2WalkBagCount: 0,
257
-    t2WalkBlockedCount: 0,
258
-    t1TravelBagCount: 0,
259
-    t1TravelBlockedCount: 0,
260
-    t2TravelBagCount: 0,
261
-    t2TravelBlockedCount: 0,
296
+    t1WalkBagCount: null,
297
+    t1WalkBlockedCount: null,
298
+    t2WalkBagCount: null,
299
+    t2WalkBlockedCount: null,
300
+    t1TravelBagCount: null,
301
+    t1TravelBlockedCount: null,
302
+    t2TravelBagCount: null,
303
+    t2TravelBlockedCount: null,
262 304
     totalLuggageCount: 0,
263 305
     totalBlockedCount: 0,
264 306
     blockedRate: 0
@@ -303,6 +345,12 @@ function handleUpdate(row) {
303 345
 function submitForm() {
304 346
   proxy.$refs.dailyLuggageInspectionScheduleByTimeRef.validate(valid => {
305 347
     if (valid) {
348
+      // 获取brigadeName
349
+      const selectedBrigade = brigadeOptions.value.find(item => item.value === form.brigadeId)
350
+      if (selectedBrigade) {
351
+        form.brigadeName = selectedBrigade.label
352
+      }
353
+
306 354
       if (form.id != null) {
307 355
         updateDailyLuggageInspectionScheduleByTime(form).then(response => {
308 356
           proxy.$modal.msgSuccess('修改成功')
@@ -331,37 +379,37 @@ function handleDelete(row) {
331 379
 }
332 380
 
333 381
 function handleExport() {
334
-  proxy.download('dailyLuggageInspectionScheduleByTime/export', {
382
+  proxy.download('/blocked/pieceDaily/export', {
335 383
     ...queryParams
336 384
   }, `每日各时段查堵行李_${new Date().getTime()}.xlsx`)
337 385
 }
338 386
 
339 387
 function handleImport() {
340
-  importOpen.value = true
341
-  importFile.value = null
388
+  upload.open = true
342 389
 }
343 390
 
344 391
 /** 下载模板操作 */
345 392
 function importTemplate() {
346
-  proxy.download('blocked/pieceDaily/importTemplate', {}, `daily_luggage_inspection_schedule_template_${new Date().getTime()}.xlsx`)
393
+  proxy.download('blocked/pieceDaily/importTemplate', {}, `每日各时段查堵行李模板_${new Date().getTime()}.xlsx`)
347 394
 }
348 395
 
349
-function handleFileChange(file) {
350
-  importFile.value = file.raw
396
+/** 文件上传中处理 */
397
+const handleFileUploadProgress = (event, file, fileList) => {
398
+  upload.isUploading = true
351 399
 }
352 400
 
353
-function submitImport() {
354
-  if (!importFile.value) {
355
-    proxy.$modal.msgWarning('请选择要导入的文件')
356
-    return
357
-  }
358
-  const formData = new FormData()
359
-  formData.append('file', importFile.value)
360
-  proxy.upload('dailyLuggageInspectionScheduleByTime/importData', formData).then(response => {
361
-    proxy.$modal.msgSuccess(response.msg)
362
-    importOpen.value = false
363
-    getList()
364
-  })
401
+/** 文件上传成功处理 */
402
+const handleFileSuccess = (response, file, fileList) => {
403
+  upload.open = false
404
+  upload.isUploading = false
405
+  proxy.$refs.uploadRef.handleRemove(file)
406
+  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true })
407
+  getList()
408
+}
409
+
410
+/** 提交上传文件 */
411
+function submitFileForm() {
412
+  proxy.$refs.uploadRef.submit()
365 413
 }
366 414
 
367 415
 onMounted(() => {
@@ -374,6 +422,4 @@ onMounted(() => {
374 422
 .app-container {
375 423
   padding: 20px;
376 424
 }
377
-
378
-
379 425
 </style>

+ 135 - 90
src/views/blockingData/missedInspectionList/index.vue

@@ -59,41 +59,37 @@
59 59
 
60 60
     <el-table v-loading="loading" :data="missedInspectionList" @selection-change="handleSelectionChange">
61 61
       <el-table-column type="selection" width="55" align="center" />
62
-      <el-table-column label="大队" align="center" prop="brigadeName" width="120" />
63
-      <el-table-column label="区域" align="center" prop="areaName" width="120" />
64
-      <el-table-column label="被回查人" align="center" prop="reviewedUserName" width="120" />
65
-      <el-table-column label="回查日期" align="center" prop="reviewDate" width="120" />
66
-      <el-table-column label="漏检时间" align="center" prop="missCheckTime" width="120" />
67
-      <el-table-column label="漏检时间段" align="center" prop="missCheckTimePeriod" width="150" />
68
-      <el-table-column label="上岗位置" align="center" prop="channelName" width="120" />
69
-      <el-table-column label="分管主管" align="center" prop="supervisorName" width="120" />
70
-      <el-table-column label="代管主管" align="center" prop="actingSupervisorName" width="120" />
71
-      <el-table-column label="分管班组长" align="center" prop="teamLeaderName" width="120" />
72
-      <el-table-column label="物品位置" align="center" prop="itemLocation" width="120" />
73
-      <el-table-column label="简单/难" align="center" prop="difficultyLevel" width="100" />
74
-      <el-table-column label="回查人" align="center" prop="reviewUserName" width="120" />
75
-      <el-table-column label="判别类型" align="center" prop="discriminationType" width="100" />
76
-      <el-table-column label="是否追回" align="center" prop="isRecovered" width="100">
62
+      <el-table-column label="大队" align="center" prop="brigadeName" min-width="120" />
63
+      <el-table-column label="区域" align="center" prop="areaName" min-width="120" />
64
+      <el-table-column label="被回查人" align="center" prop="reviewedUserName" min-width="120" />
65
+      <el-table-column label="回查日期" align="center" prop="reviewDate" min-width="120" />
66
+      <el-table-column label="漏检时间" align="center" prop="missCheckTime" min-width="180" />
67
+      <el-table-column label="漏检时间段" align="center" prop="missCheckTimePeriod" min-width="150" />
68
+      <el-table-column label="上岗位置" align="center" prop="channelName" min-width="120" />
69
+      <el-table-column label="分管主管" align="center" prop="supervisorName" min-width="120" />
70
+      <el-table-column label="代管主管" align="center" prop="actingSupervisorName" min-width="120" />
71
+      <el-table-column label="分管班组长" align="center" prop="teamLeaderName" min-width="120" />
72
+      <el-table-column label="物品位置" align="center" prop="itemLocation" min-width="120" />
73
+      <el-table-column label="简单/难" align="center" prop="difficultyLevel" min-width="100" />
74
+      <el-table-column label="回查人" align="center" prop="reviewUserName" min-width="120" />
75
+      <el-table-column label="判别类型" align="center" prop="discriminationType" min-width="100" />
76
+      <el-table-column label="是否追回" align="center" prop="isRecovered" min-width="100">
77 77
         <template #default="scope">
78
-          <el-tag :type="scope.row.isRecovered === '是' ? 'success' : 'warning'">
79
-            {{ scope.row.isRecovered }}
80
-          </el-tag>
78
+          {{ scope.row.isRecovered == 1 ? '是' : '否' }}
81 79
         </template>
82 80
       </el-table-column>
83
-      <el-table-column label="开机年限" align="center" prop="machineOperatingYears" width="100" />
84
-      <el-table-column label="证书级别" align="center" prop="certificateLevel" width="100" />
85
-      <el-table-column label="人员性别" align="center" prop="gender" width="100" />
86
-      <el-table-column label="漏检原因分类" align="center" prop="missCheckReasonCategory" width="120" />
87
-      <el-table-column label="月考成绩" align="center" prop="monthlyAssessment" width="100" />
88
-      <el-table-column label="本月自测有无漏检" align="center" prop="selfTestHasMissCheck" width="120">
81
+      <el-table-column label="开机年限" align="center" prop="machineOperatingYears" min-width="100" />
82
+      <el-table-column label="证书级别" align="center" prop="certificateLevel" min-width="100" />
83
+      <el-table-column label="人员性别" align="center" prop="gender" min-width="100" />
84
+      <el-table-column label="漏检原因分类" align="center" prop="missCheckReasonCategory" min-width="220" />
85
+      <el-table-column label="月考成绩" align="center" prop="monthlyAssessment" min-width="100" />
86
+      <el-table-column label="本月自测有无漏检" align="center" prop="selfTestHasMissCheck" min-width="160">
89 87
         <template #default="scope">
90
-          <el-tag>
91 88
             {{ scope.row.selfTestHasMissCheck ? '有' : '无' }}
92
-          </el-tag>
93 89
         </template>
94 90
       </el-table-column>
95
-      <el-table-column label="漏检物品" align="center" prop="missCheckItem" width="120" />
96
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="140">
91
+      <el-table-column label="漏检物品" align="center" prop="missCheckItem" min-width="120" />
92
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="140" fixed="right">
97 93
         <template #default="scope">
98 94
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
99 95
             v-hasPermi="['missedInspection:missedInspection:edit']">修改</el-button>
@@ -128,7 +124,8 @@
128 124
         <el-row :gutter="20">
129 125
           <el-col :span="12">
130 126
             <el-form-item label="被回查人" prop="reviewedUserId">
131
-              <el-select v-model="form.reviewedUserId" placeholder="请选择被回查人" style="width: 100%">
127
+              <el-select v-model="form.reviewedUserId" placeholder="请选择被回查人" style="width: 100%"
128
+                @change="handleReviewedUserChange">
132 129
                 <el-option v-for="item in personOptions" :key="item.value" :label="item.label" :value="item.value" />
133 130
               </el-select>
134 131
             </el-form-item>
@@ -207,10 +204,10 @@
207 204
               </el-select>
208 205
             </el-form-item>
209 206
           </el-col>
210
-         
207
+
211 208
         </el-row>
212 209
         <el-row :gutter="20">
213
-           <el-col :span="12">
210
+          <el-col :span="12">
214 211
             <el-form-item label="简单/难" prop="difficultyLevel">
215 212
               <el-select v-model="form.difficultyLevel" placeholder="请选择简单/难" style="width: 100%">
216 213
                 <el-option label="简单" value="简单" />
@@ -225,10 +222,10 @@
225 222
               </el-select>
226 223
             </el-form-item>
227 224
           </el-col>
228
-         
225
+
229 226
         </el-row>
230 227
         <el-row :gutter="20">
231
-           <el-col :span="12">
228
+          <el-col :span="12">
232 229
             <el-form-item label="判别类型" prop="discriminationType">
233 230
               <el-select v-model="form.discriminationType" placeholder="请选择判别类型" style="width: 100%">
234 231
                 <el-option v-for="item in discrimination_type" :key="item.value" :label="item.label"
@@ -239,12 +236,12 @@
239 236
           <el-col :span="12">
240 237
             <el-form-item label="是否追回" prop="isRecovered">
241 238
               <el-select v-model="form.isRecovered" placeholder="请选择是否追回" style="width: 100%">
242
-                <el-option label="是" value="" />
243
-                <el-option label="否" value="" />
239
+                <el-option label="是" value="1" />
240
+                <el-option label="否" value="0" />
244 241
               </el-select>
245 242
             </el-form-item>
246 243
           </el-col>
247
-          
244
+
248 245
         </el-row>
249 246
         <el-row :gutter="20">
250 247
           <el-col :span="12">
@@ -260,7 +257,7 @@
260 257
               <el-input v-model="form.certificateLevel" placeholder="请输入证书级别" />
261 258
             </el-form-item>
262 259
           </el-col>
263
-          
260
+
264 261
         </el-row>
265 262
         <el-row :gutter="20">
266 263
           <el-col :span="12">
@@ -279,10 +276,10 @@
279 276
               </el-select>
280 277
             </el-form-item>
281 278
           </el-col>
282
-        
279
+
283 280
         </el-row>
284 281
         <el-row :gutter="20">
285
-            <el-col :span="12">
282
+          <el-col :span="12">
286 283
             <el-form-item label="月考成绩" prop="monthlyAssessment">
287 284
               <el-select v-model="form.monthlyAssessment" placeholder="请选择月考成绩" style="width: 100%">
288 285
                 <el-option v-for="item in blocked_monthly_exam_result" :key="item.value" :label="item.label"
@@ -292,7 +289,8 @@
292 289
           </el-col>
293 290
           <el-col :span="12">
294 291
             <el-form-item label="本月自测有无漏检" prop="selfTestHasMissCheck">
295
-              <el-input-number v-model="form.selfTestHasMissCheck" :min="0" :max="2" :precision="0" placeholder="请输入0-2的整数" style="width: 100%" />
292
+              <el-input-number v-model="form.selfTestHasMissCheck" :min="0" :max="2" :precision="0"
293
+                placeholder="请输入0-2的整数" style="width: 100%" />
296 294
             </el-form-item>
297 295
           </el-col>
298 296
 
@@ -307,21 +305,24 @@
307 305
     </el-dialog>
308 306
 
309 307
     <!-- 导入对话框 -->
310
-    <el-dialog title="导入" v-model="importOpen" width="500px" append-to-body>
311
-      <el-upload ref="uploadRef" :auto-upload="false" :on-change="handleFileChange" :show-file-list="false"
312
-        accept=".xlsx,.xls">
313
-        <el-button type="primary">选取文件</el-button>
314
-
308
+    <el-dialog title="导入" v-model="upload.open" width="500px" append-to-body>
309
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url"
310
+        :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
311
+        :auto-upload="false" drag>
312
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
313
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
314
+        <template #tip>
315
+          <div class="el-upload__tip text-center">
316
+            <span>仅允许导入xls、xlsx格式文件。</span>
317
+            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
318
+              @click="importTemplate">下载模板</el-link>
319
+          </div>
320
+        </template>
315 321
       </el-upload>
316
-      <div class="el-upload__tip">只能上传xls/xlsx文件</div>
317
-      <div class="el-upload__tip">
318
-        <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
319
-          @click="importTemplate">下载模板</el-link>
320
-      </div>
321 322
       <template #footer>
322 323
         <div class="dialog-footer">
323
-          <el-button type="primary" @click="submitImport">确 定</el-button>
324
-          <el-button @click="importOpen = false">取 消</el-button>
324
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
325
+          <el-button @click="upload.open = false">取 消</el-button>
325 326
         </div>
326 327
       </template>
327 328
     </el-dialog>
@@ -333,8 +334,10 @@ import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
333 334
 import { listPosition } from '@/api/system/position'
334 335
 import { listMissedInspection, getMissedInspection, delMissedInspection, addMissedInspection, updateMissedInspection, exportMissedInspection, downloadTemplate } from '@/api/blockingData/missedInspection'
335 336
 import { listDept } from '@/api/system/dept'
336
-import { listUser } from '@/api/system/user'
337
+import { listUser, selectUserLeaderListByCondition } from '@/api/system/user'
337 338
 import { useDict } from '@/utils/dict'
339
+import { getToken } from '@/utils/auth'
340
+import { UploadFilled } from '@element-plus/icons-vue'
338 341
 
339 342
 const { proxy } = getCurrentInstance()
340 343
 
@@ -356,12 +359,15 @@ const missedInspectionList = ref([])
356 359
 const title = ref('')
357 360
 // 是否显示弹出层
358 361
 const open = ref(false)
359
-// 是否显示导入弹出层
360
-const importOpen = ref(false)
361 362
 // 日期范围
362 363
 const dateRange = ref([])
363
-// 导入文件
364
-const importFile = ref(null)
364
+
365
+const upload = reactive({
366
+  open: false,
367
+  isUploading: false,
368
+  headers: { Authorization: 'Bearer ' + getToken() },
369
+  url: import.meta.env.VITE_APP_BASE_API + '/blocked/missReview/importData'
370
+})
365 371
 
366 372
 // 查询参数
367 373
 const queryParams = reactive({
@@ -402,7 +408,7 @@ const rules = {
402 408
   monthlyAssessment: [{ required: true, message: '月考成绩不能为空', trigger: 'change' }],
403 409
   selfTestHasMissCheck: [
404 410
     { required: true, message: '本月自测有无漏检不能为空', trigger: 'change' },
405
-    { 
411
+    {
406 412
       validator: (rule, value, callback) => {
407 413
         if (value === null || value === undefined || value === '') {
408 414
           callback(new Error('本月自测有无漏检不能为空'))
@@ -468,21 +474,57 @@ function getList() {
468 474
 function getDeptList() {
469 475
   listDept({}).then(response => {
470 476
     const deptList = response.data || []
471
-    brigadeOptions.value = deptList.filter(item => item.deptType === 'BRIGADE').map(item => ({
477
+    brigadeOptions.value = deptList.filter(item => item.deptType === 'BRIGADE' && [311, 314, 315].includes(item.deptId)).map(item => ({
472 478
       value: item.deptId,
473 479
       label: item.deptName
474 480
     }))
475
-    teamLeaderOptions.value = deptList.filter(item => item.deptType === 'TEAMS').map(item => ({
476
-      value: item.deptId,
477
-      label: item.deptName
481
+  })
482
+}
483
+
484
+/** 获取班组长选项 */
485
+function getTeamLeaderOptions() {
486
+  selectUserLeaderListByCondition({ roleKeyList: ['banzuzhang'] }).then(response => {
487
+    teamLeaderOptions.value = (response.data || []).map(item => ({
488
+      value: item.userId,
489
+      label: item.nickName
478 490
     }))
479
-    supervisorOptions.value = deptList.filter(item => item.deptType === 'MANAGER').map(item => ({
480
-      value: item.deptId,
481
-      label: item.deptName
491
+  })
492
+}
493
+
494
+/** 获取主管选项 */
495
+function getSupervisorOptions() {
496
+  selectUserLeaderListByCondition({ roleKeyList: ['kezhang'] }).then(response => {
497
+    supervisorOptions.value = (response.data || []).map(item => ({
498
+      value: item.userId,
499
+      label: item.nickName
482 500
     }))
483 501
   })
484 502
 }
485 503
 
504
+/** 被回查人变更事件 */
505
+function handleReviewedUserChange(userId) {
506
+  if (userId) {
507
+    //请求回查人班组长
508
+    selectUserLeaderListByCondition({ userId: userId, roleKeyList: ['banzuzhang'] }).then(response => {
509
+      if (response.data && response.data.length > 0) {
510
+        const data = response.data[0]
511
+        form.teamLeaderId = data.userId
512
+      }
513
+    })
514
+    selectUserLeaderListByCondition({ userId: userId, roleKeyList: ['kezhang'] }).then(response => {
515
+      if (response.data && response.data.length > 0) {
516
+        const data = response.data[0]
517
+        form.supervisorId = data.userId
518
+      }
519
+    })
520
+  } else {
521
+    form.supervisorId = null
522
+    form.teamLeaderId = null
523
+    form.certificateLevel = null
524
+    form.gender = null
525
+  }
526
+}
527
+
486 528
 /** 获取用户列表 */
487 529
 function getUserList() {
488 530
   listUser({ pageNum: 1, pageSize: 1000 }).then(response => {
@@ -585,8 +627,9 @@ function submitForm() {
585 627
 
586 628
       // 处理区域ID和名称映射
587 629
       if (form.areaId) {
588
-        const area = areaOptions.value.find(item => item.positionId === form.areaId)
589
-        form.areaName = area ? area.positionName : null
630
+        
631
+        const area = areaOptions.value.find(item => item.id === form.areaId)
632
+        form.areaName = area ? area.name : null
590 633
       }
591 634
 
592 635
       // 处理被回查人ID和名称映射
@@ -597,8 +640,8 @@ function submitForm() {
597 640
 
598 641
       // 处理上岗位置ID和名称映射
599 642
       if (form.channelId) {
600
-        const channel = channelOptions.value.find(item => item.positionId === form.channelId)
601
-        form.channelName = channel ? channel.positionName : null
643
+        const channel = channelOptions.value.find(item => item.id === form.channelId)
644
+        form.channelName = channel ? channel.name : null
602 645
       }
603 646
 
604 647
       // 处理分管主管ID和名称映射
@@ -609,6 +652,7 @@ function submitForm() {
609 652
 
610 653
       // 处理代管主管ID和名称映射
611 654
       if (form.actingSupervisorId) {
655
+        
612 656
         const actingSupervisor = supervisorOptions.value.find(item => item.value === form.actingSupervisorId)
613 657
         form.actingSupervisorName = actingSupervisor ? actingSupervisor.label : null
614 658
       }
@@ -655,47 +699,48 @@ function handleDelete(row) {
655 699
 
656 700
 /** 导出按钮操作 */
657 701
 function handleExport() {
658
-  proxy.download('missedInspection/export', {
702
+  proxy.download('/blocked/missReview/export', {
659 703
     ...queryParams
660 704
   }, `漏检_${new Date().getTime()}.xlsx`)
661 705
 }
662 706
 
663 707
 /** 导入按钮操作 */
664 708
 function handleImport() {
665
-  importOpen.value = true
666
-  importFile.value = null
709
+  upload.open = true
667 710
 }
668 711
 
669 712
 /** 下载模板操作 */
670 713
 function importTemplate() {
671
-  proxy.download('blocked/missReview/importTemplate', {}, `missed_inspection_template_${new Date().getTime()}.xlsx`)
714
+  proxy.download('blocked/missReview/importTemplate', {}, `漏检模板_${new Date().getTime()}.xlsx`)
672 715
 }
673 716
 
674
-/** 文件选择 */
675
-function handleFileChange(file) {
676
-  importFile.value = file.raw
717
+/** 文件上传中处理 */
718
+const handleFileUploadProgress = (event, file, fileList) => {
719
+  upload.isUploading = true
677 720
 }
678 721
 
679
-/** 提交导入 */
680
-function submitImport() {
681
-  if (!importFile.value) {
682
-    proxy.$modal.msgWarning('请选择要导入的文件')
683
-    return
684
-  }
685
-  const formData = new FormData()
686
-  formData.append('file', importFile.value)
687
-  proxy.upload('missedInspection/importData', formData).then(response => {
688
-    proxy.$modal.msgSuccess(response.msg)
689
-    importOpen.value = false
690
-    getList()
691
-  })
722
+/** 文件上传成功处理 */
723
+const handleFileSuccess = (response, file, fileList) => {
724
+  upload.open = false
725
+  upload.isUploading = false
726
+  proxy.$refs.uploadRef.handleRemove(file)
727
+  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true })
728
+  getList()
729
+}
730
+
731
+/** 提交上传文件 */
732
+function submitFileForm() {
733
+  proxy.$refs.uploadRef.submit()
692 734
 }
693 735
 
694 736
 onMounted(() => {
737
+  getUserList()
695 738
   getList()
696 739
   getDeptList()
697
-  getUserList()
740
+
698 741
   getPositionList()
742
+  getTeamLeaderOptions()
743
+  getSupervisorOptions()
699 744
 })
700 745
 </script>
701 746
 

+ 55 - 38
src/views/blockingData/rateList/index.vue

@@ -44,7 +44,7 @@
44 44
     <el-table v-loading="loading" :data="rateList" @selection-change="handleSelectionChange">
45 45
       <el-table-column type="selection" width="55" align="center" />
46 46
       <el-table-column label="日期" align="center" prop="statDate" />
47
-      <el-table-column label="旅检国内区域平均速率(高峰期时段)" align="center" prop="travelInspectionDomesticAvgRatePeak" />
47
+      <el-table-column label="旅检国内区域平均速率(高峰期时段)" align="center" prop="travelInspectionDomesticAvgRatePeak" min-width="120"/>
48 48
       <el-table-column label="当班大队" align="center" prop="dutyBrigadeName" />
49 49
       <el-table-column label="T1-A区速率(高峰期时段)" align="center" prop="t1AAreaRatePeak" />
50 50
       <el-table-column label="T1-B区速率(高峰期时段)" align="center" prop="t1BAreaRatePeak" />
@@ -52,7 +52,7 @@
52 52
       <el-table-column label="T2-国际速率(高峰期时段)" align="center" prop="t2InternationalRatePeak" />
53 53
       <el-table-column label="班次" align="center" prop="shift" />
54 54
       <el-table-column label="T2-中转(高峰期时段)" align="center" prop="t2TransferRatePeak" />
55
-      <el-table-column label="国际及中转区域平均速率(高峰期时段)" align="center" prop="internationalTransferAvgRatePeak" />
55
+      <el-table-column label="国际及中转区域平均速率(高峰期时段)" align="center" prop="internationalTransferAvgRatePeak" min-width="120"/>
56 56
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
57 57
         <template #default="scope">
58 58
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
@@ -66,8 +66,8 @@
66 66
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
67 67
       v-model:limit="queryParams.pageSize" @pagination="getList" />
68 68
 
69
-    <el-dialog :title="title" v-model="open" width="800px" append-to-body>
70
-      <el-form ref="rateListRef" :model="form" :rules="rules" label-width="240px">
69
+    <el-dialog :title="title" v-model="open" width="1000px" append-to-body>
70
+      <el-form ref="rateListRef" :model="form" :rules="rules" label-width="280px">
71 71
         <el-row :gutter="20">
72 72
           <el-col :span="12">
73 73
             <el-form-item label="日期" prop="statDate">
@@ -144,20 +144,24 @@
144 144
       </template>
145 145
     </el-dialog>
146 146
 
147
-    <el-dialog title="导入" v-model="importOpen" width="500px" append-to-body>
148
-      <el-upload ref="uploadRef" :auto-upload="false" :on-change="handleFileChange" :show-file-list="false"
149
-        accept=".xlsx,.xls">
150
-        <el-button type="primary">选取文件</el-button>
151
-        <div class="el-upload__tip">只能上传xls/xlsx文件</div>
152
-        <div class="el-upload__tip">
153
-          <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
154
-            @click="importTemplate">下载模板</el-link>
155
-        </div>
147
+    <el-dialog title="导入" v-model="upload.open" width="500px" append-to-body>
148
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url"
149
+        :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
150
+        :auto-upload="false" drag>
151
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
152
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
153
+        <template #tip>
154
+          <div class="el-upload__tip text-center">
155
+            <span>仅允许导入xls、xlsx格式文件。</span>
156
+            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
157
+              @click="importTemplate">下载模板</el-link>
158
+          </div>
159
+        </template>
156 160
       </el-upload>
157 161
       <template #footer>
158 162
         <div class="dialog-footer">
159
-          <el-button type="primary" @click="submitImport">确 定</el-button>
160
-          <el-button @click="importOpen = false">取 消</el-button>
163
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
164
+          <el-button @click="upload.open = false">取 消</el-button>
161 165
         </div>
162 166
       </template>
163 167
     </el-dialog>
@@ -168,6 +172,8 @@
168 172
 import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
169 173
 import { listRate, getRate, delRate, addRate, updateRate, exportRate,downloadTemplate } from '@/api/blockingData/rateList'
170 174
 import { listDept } from '@/api/system/dept'
175
+import { getToken } from '@/utils/auth'
176
+import { UploadFilled } from '@element-plus/icons-vue'
171 177
 
172 178
 const { proxy } = getCurrentInstance()
173 179
 const { shift } = proxy.useDict('shift')
@@ -181,8 +187,13 @@ const total = ref(0)
181 187
 const rateList = ref([])
182 188
 const title = ref('')
183 189
 const open = ref(false)
184
-const importOpen = ref(false)
185
-const importFile = ref(null)
190
+
191
+const upload = reactive({
192
+  open: false,
193
+  isUploading: false,
194
+  headers: { Authorization: 'Bearer ' + getToken() },
195
+  url: import.meta.env.VITE_APP_BASE_API + 'blocked/rate/importData'
196
+})
186 197
 
187 198
 const queryParams = reactive({
188 199
   pageNum: 1,
@@ -221,7 +232,7 @@ function getList() {
221 232
 function getDeptList() {
222 233
   listDept({}).then(response => {
223 234
     const deptList = response.data || []
224
-    brigadeOptions.value = deptList.filter(item => item.deptType === 'BRIGADE').map(item => ({
235
+    brigadeOptions.value = deptList.filter(item => item.deptType === 'BRIGADE'&& [311, 314, 315].includes(item.deptId)).map(item => ({
225 236
       value: item.deptId,
226 237
       label: item.deptName
227 238
     }))
@@ -239,6 +250,7 @@ function reset() {
239 250
     statDate: null,
240 251
     dutyBrigadeId: null,
241 252
     shift: null,
253
+    shiftDesc: null,
242 254
     travelInspectionDomesticAvgRatePeak: 0,
243 255
     t1AAreaRatePeak: 0,
244 256
     t1BAreaRatePeak: 0,
@@ -287,6 +299,11 @@ function handleUpdate(row) {
287 299
 function submitForm() {
288 300
   proxy.$refs.rateListRef.validate(valid => {
289 301
     if (valid) {
302
+      // if (form.shift) {
303
+      //   const shiftItem = shift.value.find(item => item.value === form.shift)
304
+      //   form.shiftDesc = shiftItem ? shiftItem.label : null
305
+      // }
306
+
290 307
       if (form.id != null) {
291 308
         updateRate(form).then(response => {
292 309
           proxy.$modal.msgSuccess('修改成功')
@@ -315,37 +332,37 @@ function handleDelete(row) {
315 332
 }
316 333
 
317 334
 function handleExport() {
318
-  proxy.download('rateList/export', {
335
+  proxy.download('blocked/rate/export', {
319 336
     ...queryParams
320 337
   }, `速率统计_${new Date().getTime()}.xlsx`)
321 338
 }
322 339
 
323 340
 function handleImport() {
324
-  importOpen.value = true
325
-  importFile.value = null
326
-}
327
-
328
-function handleFileChange(file) {
329
-  importFile.value = file.raw
341
+  upload.open = true
330 342
 }
331 343
 
332 344
 /** 下载模板操作 */
333 345
 function importTemplate() {
334
-  proxy.download('rateList/importTemplate', {}, `rate_list_template_${new Date().getTime()}.xlsx`)
346
+  proxy.download('/blocked/rate/importTemplate', {}, `速率统计模板${new Date().getTime()}.xlsx`)
335 347
 }
336 348
 
337
-function submitImport() {
338
-  if (!importFile.value) {
339
-    proxy.$modal.msgWarning('请选择要导入的文件')
340
-    return
341
-  }
342
-  const formData = new FormData()
343
-  formData.append('file', importFile.value)
344
-  proxy.upload('rateList/importData', formData).then(response => {
345
-    proxy.$modal.msgSuccess(response.msg)
346
-    importOpen.value = false
347
-    getList()
348
-  })
349
+/** 文件上传中处理 */
350
+const handleFileUploadProgress = (event, file, fileList) => {
351
+  upload.isUploading = true
352
+}
353
+
354
+/** 文件上传成功处理 */
355
+const handleFileSuccess = (response, file, fileList) => {
356
+  upload.open = false
357
+  upload.isUploading = false
358
+  proxy.$refs.uploadRef.handleRemove(file)
359
+  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true })
360
+  getList()
361
+}
362
+
363
+/** 提交上传文件 */
364
+function submitFileForm() {
365
+  proxy.$refs.uploadRef.submit()
349 366
 }
350 367
 
351 368
 onMounted(() => {