Pārlūkot izejas kodu

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

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

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

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

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

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

refactor(每日行李过检查堵): 重构导入功能并优化表格列宽
huoyi 1 dienu atpakaļ
vecāks
revīzija
159e4d2527

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

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

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

@@ -143,3 +143,12 @@ export function deptTreeSelect() {
143
     method: 'get'
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
       <div class="chart-row">
4
       <div class="chart-row">
5
         <div class="chart-item">
5
         <div class="chart-item">
6
           <div class="chart-title">查堵-主管排行榜</div>
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
         </div>
8
         </div>
9
         <div class="chart-item">
9
         <div class="chart-item">
10
           <div class="chart-title">查堵-班组长排行榜</div>
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
         </div>
12
         </div>
13
         <div class="chart-item">
13
         <div class="chart-item">
14
           <div class="chart-title">查堵-员工排行榜</div>
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
         </div>
16
         </div>
17
       </div>
17
       </div>
18
       
18
       

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

@@ -3,16 +3,16 @@
3
     <div class="module-two-content">
3
     <div class="module-two-content">
4
       <div class="top-row">
4
       <div class="top-row">
5
         <div class="table-card">
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
         </div>
8
         </div>
9
         <div class="table-card">
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
         </div>
12
         </div>
13
         <div class="table-card">
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
         </div>
16
         </div>
17
       </div>
17
       </div>
18
 
18
 

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

@@ -1,9 +1,9 @@
1
 <template>
1
 <template>
2
   <div class="rank-list-container">
2
   <div class="rank-list-container">
3
     <div class="rank-list-header">
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
     </div>
7
     </div>
8
     <div class="rank-list-body">
8
     <div class="rank-list-body">
9
       <div v-for="(item, index) in rankData" :key="index" class="rank-item" :class="'rank-item-' + getRankClass(index)">
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
   title: {
31
   title: {
32
     type: String,
32
     type: String,
33
     default: '排行榜'
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
   height: 100%;
69
   height: 100%;
58
   background: #fff;
70
   background: #fff;
59
   border-radius: 8px;
71
   border-radius: 8px;
60
-  padding: 16px;
72
+  border: 1px solid #e5e7eb;
73
+  // padding: 16px;
61
   display: flex;
74
   display: flex;
62
   flex-direction: column;
75
   flex-direction: column;
63
 }
76
 }
@@ -65,7 +78,7 @@ const getProgressWidth = (value, max) => {
65
 .rank-list-header {
78
 .rank-list-header {
66
   display: flex;
79
   display: flex;
67
   align-items: center;
80
   align-items: center;
68
-  padding: 8px 0;
81
+  padding: 8px;
69
   border-bottom: 1px solid #e5e7eb;
82
   border-bottom: 1px solid #e5e7eb;
70
   margin-bottom: 8px;
83
   margin-bottom: 8px;
71
 }
84
 }
@@ -100,9 +113,9 @@ const getProgressWidth = (value, max) => {
100
 .rank-item {
113
 .rank-item {
101
   display: flex;
114
   display: flex;
102
   align-items: center;
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
 .rank-item-first {
121
 .rank-item-first {
@@ -122,7 +135,7 @@ const getProgressWidth = (value, max) => {
122
 }
135
 }
123
 
136
 
124
 .rank-number {
137
 .rank-number {
125
-  width: 80px;
138
+  //width: 80px;
126
   font-weight: bold;
139
   font-weight: bold;
127
   font-size: 15px;
140
   font-size: 15px;
128
   padding: 4px 8px;
141
   padding: 4px 8px;
@@ -130,17 +143,17 @@ const getProgressWidth = (value, max) => {
130
 }
143
 }
131
 
144
 
132
 .rank-number-first {
145
 .rank-number-first {
133
-  background-color: #fbbf24;
146
+  background: linear-gradient(135deg, #EFB63D, #F8CA4D);
134
   color: #fff;
147
   color: #fff;
135
 }
148
 }
136
 
149
 
137
 .rank-number-second {
150
 .rank-number-second {
138
-  background-color: #9ca3af;
151
+  background: linear-gradient(135deg, #C4CAE1, #E0E4ED);
139
   color: #fff;
152
   color: #fff;
140
 }
153
 }
141
 
154
 
142
 .rank-number-third {
155
 .rank-number-third {
143
-  background-color: #f87171;
156
+  background: linear-gradient(135deg, #D6A089, #E9C0AF);
144
   color: #fff;
157
   color: #fff;
145
 }
158
 }
146
 
159
 
@@ -179,15 +192,15 @@ const getProgressWidth = (value, max) => {
179
 }
192
 }
180
 
193
 
181
 .rank-bar-fill-first {
194
 .rank-bar-fill-first {
182
-  background: linear-gradient(90deg, #fbbf24, #f59e0b);
195
+  background: #FFCA00;
183
 }
196
 }
184
 
197
 
185
 .rank-bar-fill-second {
198
 .rank-bar-fill-second {
186
-  background: linear-gradient(90deg, #9ca3af, #6b7280);
199
+  background: #C4C9DF;
187
 }
200
 }
188
 
201
 
189
 .rank-bar-fill-third {
202
 .rank-bar-fill-third {
190
-  background: linear-gradient(90deg, #f87171, #ef4444);
203
+  background: #D99B86;
191
 }
204
 }
192
 
205
 
193
 .rank-bar-fill-default {
206
 .rank-bar-fill-default {

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

@@ -6,8 +6,8 @@
6
           <el-option v-for="item in brigadeOptions" :key="item.value" :label="item.label" :value="item.value" />
6
           <el-option v-for="item in brigadeOptions" :key="item.value" :label="item.label" :value="item.value" />
7
         </el-select>
7
         </el-select>
8
       </el-form-item>
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
           style="width: 200px" />
11
           style="width: 200px" />
12
       </el-form-item>
12
       </el-form-item>
13
       <el-form-item>
13
       <el-form-item>
@@ -38,38 +38,38 @@
38
 
38
 
39
     <el-table v-loading="loading" :data="dailyLuggageCheckInList" @selection-change="handleSelectionChange">
39
     <el-table v-loading="loading" :data="dailyLuggageCheckInList" @selection-change="handleSelectionChange">
40
       <el-table-column type="selection" width="55" align="center" />
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
         <template #default="scope">
73
         <template #default="scope">
74
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
74
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
75
             v-hasPermi="['dailyLuggageCheckIn:dailyLuggageCheckIn:edit']">修改</el-button>
75
             v-hasPermi="['dailyLuggageCheckIn:dailyLuggageCheckIn:edit']">修改</el-button>
@@ -102,8 +102,8 @@
102
             </el-form-item>
102
             </el-form-item>
103
           </el-col>
103
           </el-col>
104
         </el-row>
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
             <el-option v-for="item in brigadeOptions" :key="item.value" :label="item.label" :value="item.value" />
107
             <el-option v-for="item in brigadeOptions" :key="item.value" :label="item.label" :value="item.value" />
108
           </el-select>
108
           </el-select>
109
         </el-form-item>
109
         </el-form-item>
@@ -132,11 +132,11 @@
132
           </el-col>
132
           </el-col>
133
         </el-row>
133
         </el-row>
134
         <el-row :gutter="20">
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
               <el-input-number v-model="form.totalLuggageCount" :min="0" style="width: 100%" />
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
         </el-row>
140
         </el-row>
141
         <el-row :gutter="20">
141
         <el-row :gutter="20">
142
           <el-col :span="12">
142
           <el-col :span="12">
@@ -145,22 +145,15 @@
145
             </el-form-item>
145
             </el-form-item>
146
           </el-col>
146
           </el-col>
147
           <el-col :span="12">
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
             <el-form-item label="T2旅检查堵件数" prop="t2TravelBlockedCount">
148
             <el-form-item label="T2旅检查堵件数" prop="t2TravelBlockedCount">
156
               <el-input-number v-model="form.t2TravelBlockedCount" :min="0" :precision="0" style="width: 100%" />
149
               <el-input-number v-model="form.t2TravelBlockedCount" :min="0" :precision="0" style="width: 100%" />
157
             </el-form-item>
150
             </el-form-item>
158
           </el-col>
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
         </el-row>
157
         </el-row>
165
         <el-row :gutter="20">
158
         <el-row :gutter="20">
166
           <el-col :span="12">
159
           <el-col :span="12">
@@ -169,31 +162,38 @@
169
             </el-form-item>
162
             </el-form-item>
170
           </el-col>
163
           </el-col>
171
           <el-col :span="12">
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
             <el-form-item label="T2行检查堵件数" prop="t2WalkBlockedCount">
165
             <el-form-item label="T2行检查堵件数" prop="t2WalkBlockedCount">
180
               <el-input-number v-model="form.t2WalkBlockedCount" :min="0" :precision="0" style="width: 100%" />
166
               <el-input-number v-model="form.t2WalkBlockedCount" :min="0" :precision="0" style="width: 100%" />
181
             </el-form-item>
167
             </el-form-item>
182
           </el-col>
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
         </el-row>
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
               <el-input-number v-model="form.dailyBlockRate" :min="0" :precision="2" style="width: 100%" />
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
         <el-row :gutter="20">
197
         <el-row :gutter="20">
198
           <el-col :span="12">
198
           <el-col :span="12">
199
             <el-form-item label="T1复查图像总数" prop="t1ReviewImageTotal">
199
             <el-form-item label="T1复查图像总数" prop="t1ReviewImageTotal">
@@ -245,7 +245,7 @@
245
         <el-form-item label="其他(VP通道)数量" prop="otherVipCount">
245
         <el-form-item label="其他(VP通道)数量" prop="otherVipCount">
246
           <el-input-number v-model="form.otherVipCount" :min="0" style="width: 100%" />
246
           <el-input-number v-model="form.otherVipCount" :min="0" style="width: 100%" />
247
         </el-form-item>
247
         </el-form-item>
248
-    
248
+
249
       </el-form>
249
       </el-form>
250
       <template #footer>
250
       <template #footer>
251
         <div class="dialog-footer">
251
         <div class="dialog-footer">
@@ -256,21 +256,24 @@
256
     </el-dialog>
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
       </el-upload>
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
       <template #footer>
273
       <template #footer>
271
         <div class="dialog-footer">
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
         </div>
277
         </div>
275
       </template>
278
       </template>
276
     </el-dialog>
279
     </el-dialog>
@@ -281,6 +284,8 @@
281
 import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
284
 import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
282
 import { listDailyLuggageCheckIn, getDailyLuggageCheckIn, delDailyLuggageCheckIn, addDailyLuggageCheckIn, updateDailyLuggageCheckIn, exportDailyLuggageCheckIn, downloadTemplate } from '@/api/blockingData/dailyLuggageCheckInList'
285
 import { listDailyLuggageCheckIn, getDailyLuggageCheckIn, delDailyLuggageCheckIn, addDailyLuggageCheckIn, updateDailyLuggageCheckIn, exportDailyLuggageCheckIn, downloadTemplate } from '@/api/blockingData/dailyLuggageCheckInList'
283
 import { listDept } from '@/api/system/dept'
286
 import { listDept } from '@/api/system/dept'
287
+import { getToken } from '@/utils/auth'
288
+import { UploadFilled } from '@element-plus/icons-vue'
284
 
289
 
285
 const { proxy } = getCurrentInstance()
290
 const { proxy } = getCurrentInstance()
286
 
291
 
@@ -302,10 +307,13 @@ const dailyLuggageCheckInList = ref([])
302
 const title = ref('')
307
 const title = ref('')
303
 // 是否显示弹出层
308
 // 是否显示弹出层
304
 const open = ref(false)
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
 const queryParams = reactive({
319
 const queryParams = reactive({
@@ -322,7 +330,7 @@ const form = reactive({})
322
 const rules = {
330
 const rules = {
323
   statDate: [{ required: true, message: '日期不能为空', trigger: 'change' }],
331
   statDate: [{ required: true, message: '日期不能为空', trigger: 'change' }],
324
   shiftType: [{ required: true, message: '班次不能为空', trigger: 'change' }],
332
   shiftType: [{ required: true, message: '班次不能为空', trigger: 'change' }],
325
-  brigadeName: [{ required: true, message: '当班大队不能为空', trigger: 'change' }],
333
+  brigadeId: [{ required: true, message: '当班大队不能为空', trigger: 'change' }],
326
   t1TravelLuggageCount: [{ required: true, message: 'T1旅检过检行李数不能为空', trigger: 'change' }],
334
   t1TravelLuggageCount: [{ required: true, message: 'T1旅检过检行李数不能为空', trigger: 'change' }],
327
   t2TravelLuggageCount: [{ required: true, message: 'T2旅检过检行李数不能为空', trigger: 'change' }],
335
   t2TravelLuggageCount: [{ required: true, message: 'T2旅检过检行李数不能为空', trigger: 'change' }],
328
   t1WalkLuggageCount: [{ required: true, message: 'T1行检过检行李数不能为空', trigger: 'change' }],
336
   t1WalkLuggageCount: [{ required: true, message: 'T1行检过检行李数不能为空', trigger: 'change' }],
@@ -359,7 +367,7 @@ function getList() {
359
 function getDeptList() {
367
 function getDeptList() {
360
   listDept({}).then(response => {
368
   listDept({}).then(response => {
361
     const deptList = response.data || []
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
       value: item.deptId,
371
       value: item.deptId,
364
       label: item.deptName
372
       label: item.deptName
365
     }))
373
     }))
@@ -378,6 +386,7 @@ function reset() {
378
     id: null,
386
     id: null,
379
     statDate: null,
387
     statDate: null,
380
     shiftType: null,
388
     shiftType: null,
389
+    brigadeId: null,
381
     brigadeName: null,
390
     brigadeName: null,
382
     t1TravelLuggageCount: 0,
391
     t1TravelLuggageCount: 0,
383
     t2TravelLuggageCount: 0,
392
     t2TravelLuggageCount: 0,
@@ -454,6 +463,12 @@ function handleUpdate(row) {
454
 function submitForm() {
463
 function submitForm() {
455
   proxy.$refs.dailyLuggageCheckInRef.validate(valid => {
464
   proxy.$refs.dailyLuggageCheckInRef.validate(valid => {
456
     if (valid) {
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
       if (form.id != null) {
472
       if (form.id != null) {
458
         updateDailyLuggageCheckIn(form).then(response => {
473
         updateDailyLuggageCheckIn(form).then(response => {
459
           proxy.$modal.msgSuccess('修改成功')
474
           proxy.$modal.msgSuccess('修改成功')
@@ -484,40 +499,38 @@ function handleDelete(row) {
484
 
499
 
485
 /** 导出按钮操作 */
500
 /** 导出按钮操作 */
486
 function handleExport() {
501
 function handleExport() {
487
-  proxy.download('dailyLuggageCheckIn/export', {
502
+  proxy.download('/blocked/daily/export', {
488
     ...queryParams
503
     ...queryParams
489
-  }, `每日行李查缉_${new Date().getTime()}.xlsx`)
504
+  }, `每日行李过检行李查堵_${new Date().getTime()}.xlsx`)
490
 }
505
 }
491
 
506
 
492
 /** 导入按钮操作 */
507
 /** 导入按钮操作 */
493
 function handleImport() {
508
 function handleImport() {
494
-  importOpen.value = true
495
-  importFile.value = null
509
+  upload.open = true
496
 }
510
 }
497
 
511
 
498
 /** 下载模板操作 */
512
 /** 下载模板操作 */
499
 function importTemplate() {
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
 onMounted(() => {
536
 onMounted(() => {

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

@@ -7,8 +7,8 @@
7
         </el-select>
7
         </el-select>
8
       </el-form-item>
8
       </el-form-item>
9
       <el-form-item label="统计日期" prop="statDate">
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
       </el-form-item>
12
       </el-form-item>
13
       <el-form-item>
13
       <el-form-item>
14
         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
14
         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -36,23 +36,24 @@
36
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
36
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
37
     </el-row>
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
       <el-table-column type="selection" width="55" align="center" />
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
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="140">
57
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="140">
57
         <template #default="scope">
58
         <template #default="scope">
58
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
59
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
@@ -66,8 +67,8 @@
66
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
67
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
67
       v-model:limit="queryParams.pageSize" @pagination="getList" />
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
         <el-row :gutter="20">
72
         <el-row :gutter="20">
72
           <el-col :span="12">
73
           <el-col :span="12">
73
             <el-form-item label="统计日期" prop="statDate">
74
             <el-form-item label="统计日期" prop="statDate">
@@ -86,7 +87,10 @@
86
         <el-row :gutter="20">
87
         <el-row :gutter="20">
87
           <el-col :span="12">
88
           <el-col :span="12">
88
             <el-form-item label="时间段" prop="timePeriod">
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
             </el-form-item>
94
             </el-form-item>
91
           </el-col>
95
           </el-col>
92
           <el-col :span="12">
96
           <el-col :span="12">
@@ -143,8 +147,8 @@
143
             </el-form-item>
147
             </el-form-item>
144
           </el-col>
148
           </el-col>
145
         </el-row>
149
         </el-row>
146
-       
147
-       
150
+
151
+
148
       </el-form>
152
       </el-form>
149
       <template #footer>
153
       <template #footer>
150
         <div class="dialog-footer">
154
         <div class="dialog-footer">
@@ -154,21 +158,24 @@
154
       </template>
158
       </template>
155
     </el-dialog>
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
       </el-upload>
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
       <template #footer>
175
       <template #footer>
169
         <div class="dialog-footer">
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
         </div>
179
         </div>
173
       </template>
180
       </template>
174
     </el-dialog>
181
     </el-dialog>
@@ -179,8 +186,12 @@
179
 import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
186
 import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
180
 import { listDailyLuggageInspectionScheduleByTime, getDailyLuggageInspectionScheduleByTime, delDailyLuggageInspectionScheduleByTime, addDailyLuggageInspectionScheduleByTime, updateDailyLuggageInspectionScheduleByTime, exportDailyLuggageInspectionScheduleByTime, downloadTemplate } from '@/api/blockingData/dailyLuggageInspectionScheduleByTime'
187
 import { listDailyLuggageInspectionScheduleByTime, getDailyLuggageInspectionScheduleByTime, delDailyLuggageInspectionScheduleByTime, addDailyLuggageInspectionScheduleByTime, updateDailyLuggageInspectionScheduleByTime, exportDailyLuggageInspectionScheduleByTime, downloadTemplate } from '@/api/blockingData/dailyLuggageInspectionScheduleByTime'
181
 import { listDept } from '@/api/system/dept'
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
 const { proxy } = getCurrentInstance()
193
 const { proxy } = getCurrentInstance()
194
+const { blocked_time_period } = useDict('blocked_time_period')
184
 
195
 
185
 const loading = ref(true)
196
 const loading = ref(true)
186
 const ids = ref([])
197
 const ids = ref([])
@@ -191,8 +202,14 @@ const total = ref(0)
191
 const dailyLuggageInspectionScheduleByTimeList = ref([])
202
 const dailyLuggageInspectionScheduleByTimeList = ref([])
192
 const title = ref('')
203
 const title = ref('')
193
 const open = ref(false)
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
 const queryParams = reactive({
214
 const queryParams = reactive({
198
   pageNum: 1,
215
   pageNum: 1,
@@ -207,14 +224,38 @@ const rules = {
207
   statDate: [{ required: true, message: '统计日期不能为空', trigger: 'change' }],
224
   statDate: [{ required: true, message: '统计日期不能为空', trigger: 'change' }],
208
   brigadeId: [{ required: true, message: '当班大队不能为空', trigger: 'change' }],
225
   brigadeId: [{ required: true, message: '当班大队不能为空', trigger: 'change' }],
209
   timePeriod: [{ required: true, message: '时间段不能为空', trigger: 'change' }],
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
   // remark 不设置必填校验
259
   // remark 不设置必填校验
219
 }
260
 }
220
 
261
 
@@ -232,10 +273,11 @@ function getList() {
232
 function getDeptList() {
273
 function getDeptList() {
233
   listDept({}).then(response => {
274
   listDept({}).then(response => {
234
     const deptList = response.data || []
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
       value: item.deptId,
277
       value: item.deptId,
237
       label: item.deptName
278
       label: item.deptName
238
     }))
279
     }))
280
+
239
   })
281
   })
240
 }
282
 }
241
 
283
 
@@ -251,14 +293,14 @@ function reset() {
251
     brigadeId: null,
293
     brigadeId: null,
252
     timePeriod: null,
294
     timePeriod: null,
253
     remark: null,
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
     totalLuggageCount: 0,
304
     totalLuggageCount: 0,
263
     totalBlockedCount: 0,
305
     totalBlockedCount: 0,
264
     blockedRate: 0
306
     blockedRate: 0
@@ -303,6 +345,12 @@ function handleUpdate(row) {
303
 function submitForm() {
345
 function submitForm() {
304
   proxy.$refs.dailyLuggageInspectionScheduleByTimeRef.validate(valid => {
346
   proxy.$refs.dailyLuggageInspectionScheduleByTimeRef.validate(valid => {
305
     if (valid) {
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
       if (form.id != null) {
354
       if (form.id != null) {
307
         updateDailyLuggageInspectionScheduleByTime(form).then(response => {
355
         updateDailyLuggageInspectionScheduleByTime(form).then(response => {
308
           proxy.$modal.msgSuccess('修改成功')
356
           proxy.$modal.msgSuccess('修改成功')
@@ -331,37 +379,37 @@ function handleDelete(row) {
331
 }
379
 }
332
 
380
 
333
 function handleExport() {
381
 function handleExport() {
334
-  proxy.download('dailyLuggageInspectionScheduleByTime/export', {
382
+  proxy.download('/blocked/pieceDaily/export', {
335
     ...queryParams
383
     ...queryParams
336
   }, `每日各时段查堵行李_${new Date().getTime()}.xlsx`)
384
   }, `每日各时段查堵行李_${new Date().getTime()}.xlsx`)
337
 }
385
 }
338
 
386
 
339
 function handleImport() {
387
 function handleImport() {
340
-  importOpen.value = true
341
-  importFile.value = null
388
+  upload.open = true
342
 }
389
 }
343
 
390
 
344
 /** 下载模板操作 */
391
 /** 下载模板操作 */
345
 function importTemplate() {
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
 onMounted(() => {
415
 onMounted(() => {
@@ -374,6 +422,4 @@ onMounted(() => {
374
 .app-container {
422
 .app-container {
375
   padding: 20px;
423
   padding: 20px;
376
 }
424
 }
377
-
378
-
379
 </style>
425
 </style>

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

@@ -59,41 +59,37 @@
59
 
59
 
60
     <el-table v-loading="loading" :data="missedInspectionList" @selection-change="handleSelectionChange">
60
     <el-table v-loading="loading" :data="missedInspectionList" @selection-change="handleSelectionChange">
61
       <el-table-column type="selection" width="55" align="center" />
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
         <template #default="scope">
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
         </template>
79
         </template>
82
       </el-table-column>
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
         <template #default="scope">
87
         <template #default="scope">
90
-          <el-tag>
91
             {{ scope.row.selfTestHasMissCheck ? '有' : '无' }}
88
             {{ scope.row.selfTestHasMissCheck ? '有' : '无' }}
92
-          </el-tag>
93
         </template>
89
         </template>
94
       </el-table-column>
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
         <template #default="scope">
93
         <template #default="scope">
98
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
94
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
99
             v-hasPermi="['missedInspection:missedInspection:edit']">修改</el-button>
95
             v-hasPermi="['missedInspection:missedInspection:edit']">修改</el-button>
@@ -128,7 +124,8 @@
128
         <el-row :gutter="20">
124
         <el-row :gutter="20">
129
           <el-col :span="12">
125
           <el-col :span="12">
130
             <el-form-item label="被回查人" prop="reviewedUserId">
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
                 <el-option v-for="item in personOptions" :key="item.value" :label="item.label" :value="item.value" />
129
                 <el-option v-for="item in personOptions" :key="item.value" :label="item.label" :value="item.value" />
133
               </el-select>
130
               </el-select>
134
             </el-form-item>
131
             </el-form-item>
@@ -207,10 +204,10 @@
207
               </el-select>
204
               </el-select>
208
             </el-form-item>
205
             </el-form-item>
209
           </el-col>
206
           </el-col>
210
-         
207
+
211
         </el-row>
208
         </el-row>
212
         <el-row :gutter="20">
209
         <el-row :gutter="20">
213
-           <el-col :span="12">
210
+          <el-col :span="12">
214
             <el-form-item label="简单/难" prop="difficultyLevel">
211
             <el-form-item label="简单/难" prop="difficultyLevel">
215
               <el-select v-model="form.difficultyLevel" placeholder="请选择简单/难" style="width: 100%">
212
               <el-select v-model="form.difficultyLevel" placeholder="请选择简单/难" style="width: 100%">
216
                 <el-option label="简单" value="简单" />
213
                 <el-option label="简单" value="简单" />
@@ -225,10 +222,10 @@
225
               </el-select>
222
               </el-select>
226
             </el-form-item>
223
             </el-form-item>
227
           </el-col>
224
           </el-col>
228
-         
225
+
229
         </el-row>
226
         </el-row>
230
         <el-row :gutter="20">
227
         <el-row :gutter="20">
231
-           <el-col :span="12">
228
+          <el-col :span="12">
232
             <el-form-item label="判别类型" prop="discriminationType">
229
             <el-form-item label="判别类型" prop="discriminationType">
233
               <el-select v-model="form.discriminationType" placeholder="请选择判别类型" style="width: 100%">
230
               <el-select v-model="form.discriminationType" placeholder="请选择判别类型" style="width: 100%">
234
                 <el-option v-for="item in discrimination_type" :key="item.value" :label="item.label"
231
                 <el-option v-for="item in discrimination_type" :key="item.value" :label="item.label"
@@ -239,12 +236,12 @@
239
           <el-col :span="12">
236
           <el-col :span="12">
240
             <el-form-item label="是否追回" prop="isRecovered">
237
             <el-form-item label="是否追回" prop="isRecovered">
241
               <el-select v-model="form.isRecovered" placeholder="请选择是否追回" style="width: 100%">
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
               </el-select>
241
               </el-select>
245
             </el-form-item>
242
             </el-form-item>
246
           </el-col>
243
           </el-col>
247
-          
244
+
248
         </el-row>
245
         </el-row>
249
         <el-row :gutter="20">
246
         <el-row :gutter="20">
250
           <el-col :span="12">
247
           <el-col :span="12">
@@ -260,7 +257,7 @@
260
               <el-input v-model="form.certificateLevel" placeholder="请输入证书级别" />
257
               <el-input v-model="form.certificateLevel" placeholder="请输入证书级别" />
261
             </el-form-item>
258
             </el-form-item>
262
           </el-col>
259
           </el-col>
263
-          
260
+
264
         </el-row>
261
         </el-row>
265
         <el-row :gutter="20">
262
         <el-row :gutter="20">
266
           <el-col :span="12">
263
           <el-col :span="12">
@@ -279,10 +276,10 @@
279
               </el-select>
276
               </el-select>
280
             </el-form-item>
277
             </el-form-item>
281
           </el-col>
278
           </el-col>
282
-        
279
+
283
         </el-row>
280
         </el-row>
284
         <el-row :gutter="20">
281
         <el-row :gutter="20">
285
-            <el-col :span="12">
282
+          <el-col :span="12">
286
             <el-form-item label="月考成绩" prop="monthlyAssessment">
283
             <el-form-item label="月考成绩" prop="monthlyAssessment">
287
               <el-select v-model="form.monthlyAssessment" placeholder="请选择月考成绩" style="width: 100%">
284
               <el-select v-model="form.monthlyAssessment" placeholder="请选择月考成绩" style="width: 100%">
288
                 <el-option v-for="item in blocked_monthly_exam_result" :key="item.value" :label="item.label"
285
                 <el-option v-for="item in blocked_monthly_exam_result" :key="item.value" :label="item.label"
@@ -292,7 +289,8 @@
292
           </el-col>
289
           </el-col>
293
           <el-col :span="12">
290
           <el-col :span="12">
294
             <el-form-item label="本月自测有无漏检" prop="selfTestHasMissCheck">
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
             </el-form-item>
294
             </el-form-item>
297
           </el-col>
295
           </el-col>
298
 
296
 
@@ -307,21 +305,24 @@
307
     </el-dialog>
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
       </el-upload>
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
       <template #footer>
322
       <template #footer>
322
         <div class="dialog-footer">
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
         </div>
326
         </div>
326
       </template>
327
       </template>
327
     </el-dialog>
328
     </el-dialog>
@@ -333,8 +334,10 @@ import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
333
 import { listPosition } from '@/api/system/position'
334
 import { listPosition } from '@/api/system/position'
334
 import { listMissedInspection, getMissedInspection, delMissedInspection, addMissedInspection, updateMissedInspection, exportMissedInspection, downloadTemplate } from '@/api/blockingData/missedInspection'
335
 import { listMissedInspection, getMissedInspection, delMissedInspection, addMissedInspection, updateMissedInspection, exportMissedInspection, downloadTemplate } from '@/api/blockingData/missedInspection'
335
 import { listDept } from '@/api/system/dept'
336
 import { listDept } from '@/api/system/dept'
336
-import { listUser } from '@/api/system/user'
337
+import { listUser, selectUserLeaderListByCondition } from '@/api/system/user'
337
 import { useDict } from '@/utils/dict'
338
 import { useDict } from '@/utils/dict'
339
+import { getToken } from '@/utils/auth'
340
+import { UploadFilled } from '@element-plus/icons-vue'
338
 
341
 
339
 const { proxy } = getCurrentInstance()
342
 const { proxy } = getCurrentInstance()
340
 
343
 
@@ -356,12 +359,15 @@ const missedInspectionList = ref([])
356
 const title = ref('')
359
 const title = ref('')
357
 // 是否显示弹出层
360
 // 是否显示弹出层
358
 const open = ref(false)
361
 const open = ref(false)
359
-// 是否显示导入弹出层
360
-const importOpen = ref(false)
361
 // 日期范围
362
 // 日期范围
362
 const dateRange = ref([])
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
 const queryParams = reactive({
373
 const queryParams = reactive({
@@ -402,7 +408,7 @@ const rules = {
402
   monthlyAssessment: [{ required: true, message: '月考成绩不能为空', trigger: 'change' }],
408
   monthlyAssessment: [{ required: true, message: '月考成绩不能为空', trigger: 'change' }],
403
   selfTestHasMissCheck: [
409
   selfTestHasMissCheck: [
404
     { required: true, message: '本月自测有无漏检不能为空', trigger: 'change' },
410
     { required: true, message: '本月自测有无漏检不能为空', trigger: 'change' },
405
-    { 
411
+    {
406
       validator: (rule, value, callback) => {
412
       validator: (rule, value, callback) => {
407
         if (value === null || value === undefined || value === '') {
413
         if (value === null || value === undefined || value === '') {
408
           callback(new Error('本月自测有无漏检不能为空'))
414
           callback(new Error('本月自测有无漏检不能为空'))
@@ -468,21 +474,57 @@ function getList() {
468
 function getDeptList() {
474
 function getDeptList() {
469
   listDept({}).then(response => {
475
   listDept({}).then(response => {
470
     const deptList = response.data || []
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
       value: item.deptId,
478
       value: item.deptId,
473
       label: item.deptName
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
 function getUserList() {
529
 function getUserList() {
488
   listUser({ pageNum: 1, pageSize: 1000 }).then(response => {
530
   listUser({ pageNum: 1, pageSize: 1000 }).then(response => {
@@ -585,8 +627,9 @@ function submitForm() {
585
 
627
 
586
       // 处理区域ID和名称映射
628
       // 处理区域ID和名称映射
587
       if (form.areaId) {
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
       // 处理被回查人ID和名称映射
635
       // 处理被回查人ID和名称映射
@@ -597,8 +640,8 @@ function submitForm() {
597
 
640
 
598
       // 处理上岗位置ID和名称映射
641
       // 处理上岗位置ID和名称映射
599
       if (form.channelId) {
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
       // 处理分管主管ID和名称映射
647
       // 处理分管主管ID和名称映射
@@ -609,6 +652,7 @@ function submitForm() {
609
 
652
 
610
       // 处理代管主管ID和名称映射
653
       // 处理代管主管ID和名称映射
611
       if (form.actingSupervisorId) {
654
       if (form.actingSupervisorId) {
655
+        
612
         const actingSupervisor = supervisorOptions.value.find(item => item.value === form.actingSupervisorId)
656
         const actingSupervisor = supervisorOptions.value.find(item => item.value === form.actingSupervisorId)
613
         form.actingSupervisorName = actingSupervisor ? actingSupervisor.label : null
657
         form.actingSupervisorName = actingSupervisor ? actingSupervisor.label : null
614
       }
658
       }
@@ -655,47 +699,48 @@ function handleDelete(row) {
655
 
699
 
656
 /** 导出按钮操作 */
700
 /** 导出按钮操作 */
657
 function handleExport() {
701
 function handleExport() {
658
-  proxy.download('missedInspection/export', {
702
+  proxy.download('/blocked/missReview/export', {
659
     ...queryParams
703
     ...queryParams
660
   }, `漏检_${new Date().getTime()}.xlsx`)
704
   }, `漏检_${new Date().getTime()}.xlsx`)
661
 }
705
 }
662
 
706
 
663
 /** 导入按钮操作 */
707
 /** 导入按钮操作 */
664
 function handleImport() {
708
 function handleImport() {
665
-  importOpen.value = true
666
-  importFile.value = null
709
+  upload.open = true
667
 }
710
 }
668
 
711
 
669
 /** 下载模板操作 */
712
 /** 下载模板操作 */
670
 function importTemplate() {
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
 onMounted(() => {
736
 onMounted(() => {
737
+  getUserList()
695
   getList()
738
   getList()
696
   getDeptList()
739
   getDeptList()
697
-  getUserList()
740
+
698
   getPositionList()
741
   getPositionList()
742
+  getTeamLeaderOptions()
743
+  getSupervisorOptions()
699
 })
744
 })
700
 </script>
745
 </script>
701
 
746
 

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

@@ -44,7 +44,7 @@
44
     <el-table v-loading="loading" :data="rateList" @selection-change="handleSelectionChange">
44
     <el-table v-loading="loading" :data="rateList" @selection-change="handleSelectionChange">
45
       <el-table-column type="selection" width="55" align="center" />
45
       <el-table-column type="selection" width="55" align="center" />
46
       <el-table-column label="日期" align="center" prop="statDate" />
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
       <el-table-column label="当班大队" align="center" prop="dutyBrigadeName" />
48
       <el-table-column label="当班大队" align="center" prop="dutyBrigadeName" />
49
       <el-table-column label="T1-A区速率(高峰期时段)" align="center" prop="t1AAreaRatePeak" />
49
       <el-table-column label="T1-A区速率(高峰期时段)" align="center" prop="t1AAreaRatePeak" />
50
       <el-table-column label="T1-B区速率(高峰期时段)" align="center" prop="t1BAreaRatePeak" />
50
       <el-table-column label="T1-B区速率(高峰期时段)" align="center" prop="t1BAreaRatePeak" />
@@ -52,7 +52,7 @@
52
       <el-table-column label="T2-国际速率(高峰期时段)" align="center" prop="t2InternationalRatePeak" />
52
       <el-table-column label="T2-国际速率(高峰期时段)" align="center" prop="t2InternationalRatePeak" />
53
       <el-table-column label="班次" align="center" prop="shift" />
53
       <el-table-column label="班次" align="center" prop="shift" />
54
       <el-table-column label="T2-中转(高峰期时段)" align="center" prop="t2TransferRatePeak" />
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
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
56
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
57
         <template #default="scope">
57
         <template #default="scope">
58
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
58
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
@@ -66,8 +66,8 @@
66
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
66
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
67
       v-model:limit="queryParams.pageSize" @pagination="getList" />
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
         <el-row :gutter="20">
71
         <el-row :gutter="20">
72
           <el-col :span="12">
72
           <el-col :span="12">
73
             <el-form-item label="日期" prop="statDate">
73
             <el-form-item label="日期" prop="statDate">
@@ -144,20 +144,24 @@
144
       </template>
144
       </template>
145
     </el-dialog>
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
       </el-upload>
160
       </el-upload>
157
       <template #footer>
161
       <template #footer>
158
         <div class="dialog-footer">
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
         </div>
165
         </div>
162
       </template>
166
       </template>
163
     </el-dialog>
167
     </el-dialog>
@@ -168,6 +172,8 @@
168
 import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
172
 import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
169
 import { listRate, getRate, delRate, addRate, updateRate, exportRate,downloadTemplate } from '@/api/blockingData/rateList'
173
 import { listRate, getRate, delRate, addRate, updateRate, exportRate,downloadTemplate } from '@/api/blockingData/rateList'
170
 import { listDept } from '@/api/system/dept'
174
 import { listDept } from '@/api/system/dept'
175
+import { getToken } from '@/utils/auth'
176
+import { UploadFilled } from '@element-plus/icons-vue'
171
 
177
 
172
 const { proxy } = getCurrentInstance()
178
 const { proxy } = getCurrentInstance()
173
 const { shift } = proxy.useDict('shift')
179
 const { shift } = proxy.useDict('shift')
@@ -181,8 +187,13 @@ const total = ref(0)
181
 const rateList = ref([])
187
 const rateList = ref([])
182
 const title = ref('')
188
 const title = ref('')
183
 const open = ref(false)
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
 const queryParams = reactive({
198
 const queryParams = reactive({
188
   pageNum: 1,
199
   pageNum: 1,
@@ -221,7 +232,7 @@ function getList() {
221
 function getDeptList() {
232
 function getDeptList() {
222
   listDept({}).then(response => {
233
   listDept({}).then(response => {
223
     const deptList = response.data || []
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
       value: item.deptId,
236
       value: item.deptId,
226
       label: item.deptName
237
       label: item.deptName
227
     }))
238
     }))
@@ -239,6 +250,7 @@ function reset() {
239
     statDate: null,
250
     statDate: null,
240
     dutyBrigadeId: null,
251
     dutyBrigadeId: null,
241
     shift: null,
252
     shift: null,
253
+    shiftDesc: null,
242
     travelInspectionDomesticAvgRatePeak: 0,
254
     travelInspectionDomesticAvgRatePeak: 0,
243
     t1AAreaRatePeak: 0,
255
     t1AAreaRatePeak: 0,
244
     t1BAreaRatePeak: 0,
256
     t1BAreaRatePeak: 0,
@@ -287,6 +299,11 @@ function handleUpdate(row) {
287
 function submitForm() {
299
 function submitForm() {
288
   proxy.$refs.rateListRef.validate(valid => {
300
   proxy.$refs.rateListRef.validate(valid => {
289
     if (valid) {
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
       if (form.id != null) {
307
       if (form.id != null) {
291
         updateRate(form).then(response => {
308
         updateRate(form).then(response => {
292
           proxy.$modal.msgSuccess('修改成功')
309
           proxy.$modal.msgSuccess('修改成功')
@@ -315,37 +332,37 @@ function handleDelete(row) {
315
 }
332
 }
316
 
333
 
317
 function handleExport() {
334
 function handleExport() {
318
-  proxy.download('rateList/export', {
335
+  proxy.download('blocked/rate/export', {
319
     ...queryParams
336
     ...queryParams
320
   }, `速率统计_${new Date().getTime()}.xlsx`)
337
   }, `速率统计_${new Date().getTime()}.xlsx`)
321
 }
338
 }
322
 
339
 
323
 function handleImport() {
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
 function importTemplate() {
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
 onMounted(() => {
368
 onMounted(() => {