Przeglądaj źródła

Merge branch 'personnelPerformance'

huoyi 1 tydzień temu
rodzic
commit
0c6eb31c8c

+ 77 - 69
src/views/performanceManage/monthlyAssess/index.vue

@@ -73,6 +73,7 @@
73
       <el-table v-loading="loading" :data="nonCadreList" border fit highlight-current-row
73
       <el-table v-loading="loading" :data="nonCadreList" border fit highlight-current-row
74
         style="width: 100%; margin-top: 20px;" @selection-change="handleSelectionChange">
74
         style="width: 100%; margin-top: 20px;" @selection-change="handleSelectionChange">
75
         <el-table-column type="selection" width="55" align="center" />
75
         <el-table-column type="selection" width="55" align="center" />
76
+        <el-table-column label="大队" prop="brigadeName" align="center" min-width="120" />
76
         <el-table-column label="用工形式" prop="employmentType" align="center" min-width="100">
77
         <el-table-column label="用工形式" prop="employmentType" align="center" min-width="100">
77
           <template #default="scope">
78
           <template #default="scope">
78
             <dict-tag :options="employment_type" :value="scope.row.employmentType" />
79
             <dict-tag :options="employment_type" :value="scope.row.employmentType" />
@@ -291,8 +292,9 @@
291
             <div class="indicator-group-title">{{ group.title }}</div>
292
             <div class="indicator-group-title">{{ group.title }}</div>
292
             <div v-for="(item, itemIndex) in group.items" :key="itemIndex" class="indicator-item">
293
             <div v-for="(item, itemIndex) in group.items" :key="itemIndex" class="indicator-item">
293
               <div class="indicator-name">{{ item.indicatorName }}</div>
294
               <div class="indicator-name">{{ item.indicatorName }}</div>
294
-              <div class="indicator-value" v-if="item.categoryNameOne != '红线指标'">{{ item.score > 0 ? '+' : '' }}{{ item.score
295
-                }}/次
295
+              <div class="indicator-value" v-if="item.categoryNameOne != '红线指标'">{{ item.score > 0 ? '+' : '' }}{{
296
+                item.score
297
+              }}/次
296
               </div>
298
               </div>
297
               <div class="indicator-count">{{ item.occurCount }}次</div>
299
               <div class="indicator-count">{{ item.occurCount }}次</div>
298
               <div class="indicator-total">{{ item.scoreResult > 0 ? '+' : '' }}{{ item.scoreResult }}</div>
300
               <div class="indicator-total">{{ item.scoreResult > 0 ? '+' : '' }}{{ item.scoreResult }}</div>
@@ -536,42 +538,54 @@
536
           </div>
538
           </div>
537
         </el-form-item>
539
         </el-form-item>
538
 
540
 
539
-        <template
540
-          v-for="(detail, index) in (indicatorDialog.form.personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList || [])"
541
-          :key="index">
542
-          <div style="display: flex; align-items: center; gap: 10px; margin-bottom: 10px;">
543
-            <h4 style="margin-left: 80px;">明细{{ index + 1 }}</h4>
544
-            <el-button type="danger" size="small" @click="removeRewardPunishmentDetail(index)">删除</el-button>
545
-          </div>
546
-          <el-form-item label="检查部门">
547
-            <div style="display: flex; align-items: center; gap: 10px; width: 100%;">
548
-              <el-select v-model="detail.qcDeptType" placeholder="请选择" style="width: 200px;">
549
-                <el-option v-for="item in base_performance_indicator_qc_dept_type" :key="item.value" :label="item.label"
550
-                  :value="item.value" />
551
-              </el-select>
552
-            </div>
553
-          </el-form-item>
554
-          <el-form-item v-if="indicatorDialog.form.score > 0" label="奖励明细">
555
-            <el-input v-model="detail.rewardPunishmentDetail" type="textarea" :rows="2" />
556
-          </el-form-item>
557
-          <el-form-item v-if="indicatorDialog.form.score > 0" label="奖励">
558
-            <div style="display: flex; align-items: center; gap: 10px;">
559
-              <el-input-number v-model="detail.amount" :min="0" :precision="2" style="width: 200px;"
560
-                @change="updateTotal" />
561
-              <span>元</span>
562
-            </div>
563
-          </el-form-item>
564
-          <el-form-item v-if="indicatorDialog.form.score < 0" label="惩罚明细">
565
-            <el-input v-model="detail.rewardPunishmentDetail" type="textarea" :rows="2" />
566
-          </el-form-item>
567
-          <el-form-item v-if="indicatorDialog.form.score < 0" label="扣罚">
568
-            <div style="display: flex; align-items: center; gap: 10px;">
569
-              <el-input-number v-model="detail.amount" :min="0" :precision="2" style="width: 200px;"
570
-                @change="updateTotal" />
571
-              <span>元</span>
572
-            </div>
573
-          </el-form-item>
574
-        </template>
541
+        <el-form-item label="记录明细">
542
+          <el-table :data="indicatorDialog.form.personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList" border
543
+            max-height="400">
544
+            <el-table-column label="序号" type="index" width="60" align="center" />
545
+            <el-table-column label="日期" width="180">
546
+              <template #default="scope">
547
+                <el-date-picker v-model="scope.row.recordDate" type="date" value-format="YYYY-MM-DD" placeholder="选择日期"
548
+                  style="width: 100%" />
549
+              </template>
550
+            </el-table-column>
551
+            <el-table-column label="检查部门">
552
+              <template #default="scope">
553
+                <el-select v-model="scope.row.qcDeptType" placeholder="请选择" clearable>
554
+                  <el-option v-for="item in base_performance_indicator_qc_dept_type" :key="item.value"
555
+                    :label="item.label" :value="item.value" />
556
+                </el-select>
557
+              </template>
558
+            </el-table-column>
559
+            <el-table-column label="扣罚明细" v-if="indicatorDialog.form.score < 0">
560
+              <template #default="scope">
561
+                <el-input v-model="scope.row.rewardPunishmentDetail" type="textarea" :rows="1" placeholder="请输入扣罚明细" />
562
+              </template>
563
+            </el-table-column>
564
+            <el-table-column label="扣罚(元)" v-if="indicatorDialog.form.score < 0">
565
+              <template #default="scope">
566
+                <el-input-number v-model="scope.row.amount" :max="0" :precision="2" style="width: 170px;"
567
+                  @change="updateTotal" />
568
+              </template>
569
+            </el-table-column>
570
+            <el-table-column label="奖励明细" v-if="indicatorDialog.form.score > 0">
571
+              <template #default="scope">
572
+                <el-input v-model="scope.row.rewardPunishmentDetail" type="textarea" :rows="1" placeholder="请输入奖励明细" />
573
+              </template>
574
+            </el-table-column>
575
+            <el-table-column label="奖励(元)" v-if="indicatorDialog.form.score > 0">
576
+              <template #default="scope">
577
+                <el-input-number v-model="scope.row.amount" :min="0" :precision="2" style="width: 170px;"
578
+                  @change="updateTotal" />
579
+              </template>
580
+            </el-table-column>
581
+            <el-table-column label="操作" align="center">
582
+              <template #default="scope">
583
+                <el-button type="danger" link icon="Delete" @click="removeRewardPunishmentDetail(scope.$index)" />
584
+              </template>
585
+            </el-table-column>
586
+          </el-table>
587
+
588
+        </el-form-item>
575
       </el-form>
589
       </el-form>
576
 
590
 
577
       <template #footer>
591
       <template #footer>
@@ -751,7 +765,7 @@ const indicatorDialog = reactive({
751
     value: 'id',
765
     value: 'id',
752
     label: 'name',
766
     label: 'name',
753
     children: 'indicatorList',
767
     children: 'indicatorList',
754
-    checkStrictly: false,
768
+
755
     emitPath: false
769
     emitPath: false
756
   },
770
   },
757
   rules: {
771
   rules: {
@@ -823,7 +837,7 @@ function transformIndicatorTree(treeData) {
823
 
837
 
824
         if (child.indicatorList && child.indicatorList.length > 0) {
838
         if (child.indicatorList && child.indicatorList.length > 0) {
825
           transformedChild.indicatorList = child.indicatorList.map(indicator => ({
839
           transformedChild.indicatorList = child.indicatorList.map(indicator => ({
826
-            ...indicator, name: indicator.name, id: indicator.id, indicatorId: indicator.id, indicatorName: indicator.name, occurCount: 1, personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList: []
840
+            ...indicator, name: indicator.name, id: indicator.id, indicatorId: indicator.indicatorId, indicatorName: indicator.name, occurCount: 1, personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList: []
827
           }))
841
           }))
828
         }
842
         }
829
 
843
 
@@ -833,7 +847,7 @@ function transformIndicatorTree(treeData) {
833
 
847
 
834
     if (node.indicatorList && node.indicatorList.length > 0) {
848
     if (node.indicatorList && node.indicatorList.length > 0) {
835
       transformed.indicatorList = node.indicatorList.map(indicator => ({
849
       transformed.indicatorList = node.indicatorList.map(indicator => ({
836
-        ...indicator, name: indicator.name, id: indicator.id, indicatorId: indicator.id, indicatorName: indicator.name, occurCount: 1, personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList: []
850
+        ...indicator, name: indicator.name, id: indicator.id, indicatorId: indicator.indicatorId, indicatorName: indicator.name, occurCount: 1, personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList: []
837
       }))
851
       }))
838
     }
852
     }
839
 
853
 
@@ -843,6 +857,7 @@ function transformIndicatorTree(treeData) {
843
 
857
 
844
 function onIndicatorCascaderChange(value) {
858
 function onIndicatorCascaderChange(value) {
845
   const selected = findIndicatorById(indicatorDialog.cascaderOptions, value)
859
   const selected = findIndicatorById(indicatorDialog.cascaderOptions, value)
860
+
846
   if (selected) {
861
   if (selected) {
847
     indicatorDialog.form = {
862
     indicatorDialog.form = {
848
       ...selected,
863
       ...selected,
@@ -897,10 +912,12 @@ const showDetailModal = (title, content) => {
897
 const formatAccordList = (list) => {
912
 const formatAccordList = (list) => {
898
   if (!list || !Array.isArray(list) || list.length === 0) return ''
913
   if (!list || !Array.isArray(list) || list.length === 0) return ''
899
   return list.map(item => {
914
   return list.map(item => {
915
+    const detail = item.personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList[0] || {};
916
+    const date = detail.recordDate || ''
900
     const name = item.indicatorName || item.name || ''
917
     const name = item.indicatorName || item.name || ''
901
     const score = item.score !== undefined ? item.score : ''
918
     const score = item.score !== undefined ? item.score : ''
902
     const count = item.occurCount !== undefined ? item.occurCount : ''
919
     const count = item.occurCount !== undefined ? item.occurCount : ''
903
-    return `${name} ${score}分 x ${count}次`
920
+    return `${date} ${name} ${score}分 x ${count}次`
904
   }).join('\n')
921
   }).join('\n')
905
 }
922
 }
906
 
923
 
@@ -1253,19 +1270,19 @@ const submitForm = async () => {
1253
           group.items.map(item => ({
1270
           group.items.map(item => ({
1254
             ...item,
1271
             ...item,
1255
             indicatorName: item.name || item.indicatorName,
1272
             indicatorName: item.name || item.indicatorName,
1256
-            indicatorId: item.id || item.indicatorId,
1273
+            indicatorId: item.indicatorId ,
1257
             indicatorCode: item.code || item.indicatorCode,
1274
             indicatorCode: item.code || item.indicatorCode,
1258
           }))
1275
           }))
1259
         )
1276
         )
1260
         delete submitData.indicatorGroups
1277
         delete submitData.indicatorGroups
1261
       }
1278
       }
1262
 
1279
 
1263
-      if (dialog.title === '新增非干部月度考核') {
1264
-        await addNonCadreAssessment(submitData)
1265
-        ElMessage.success('新增成功')
1266
-      } else {
1280
+      if (nonCadreForm.id) {
1267
         await updateNonCadreAssessment(submitData)
1281
         await updateNonCadreAssessment(submitData)
1268
         ElMessage.success('更新成功')
1282
         ElMessage.success('更新成功')
1283
+      } else {
1284
+        await addNonCadreAssessment(submitData)
1285
+        ElMessage.success('新增成功')
1269
       }
1286
       }
1270
     } else {
1287
     } else {
1271
       ElMessage.success('操作成功')
1288
       ElMessage.success('操作成功')
@@ -1337,16 +1354,7 @@ const generateMonthlyAssessment = async () => {
1337
   }
1354
   }
1338
 }
1355
 }
1339
 
1356
 
1340
-// 获取考核结果文本
1341
-const getResultText = (value) => {
1342
-  const map = {
1343
-    'excellent': '优秀',
1344
-    'good': '良好',
1345
-    'qualified': '合格',
1346
-    'unqualified': '不称职'
1347
-  }
1348
-  return map[value] || ''
1349
-}
1357
+
1350
 
1358
 
1351
 // 添加指标 - 打开新增模态框
1359
 // 添加指标 - 打开新增模态框
1352
 const addIndicator = () => {
1360
 const addIndicator = () => {
@@ -1371,6 +1379,7 @@ const addIndicator = () => {
1371
 
1379
 
1372
 // 编辑指标 - 打开编辑模态框
1380
 // 编辑指标 - 打开编辑模态框
1373
 const editIndicator = async (groupIndex, itemIndex) => {
1381
 const editIndicator = async (groupIndex, itemIndex) => {
1382
+  await loadIndicatorCascaderOptions()
1374
   const item = nonCadreForm.indicatorGroups[groupIndex].items[itemIndex]
1383
   const item = nonCadreForm.indicatorGroups[groupIndex].items[itemIndex]
1375
   indicatorDialog.visible = true
1384
   indicatorDialog.visible = true
1376
   indicatorDialog.title = '编辑扣分指标'
1385
   indicatorDialog.title = '编辑扣分指标'
@@ -1378,10 +1387,11 @@ const editIndicator = async (groupIndex, itemIndex) => {
1378
   indicatorDialog.groupIndex = groupIndex
1387
   indicatorDialog.groupIndex = groupIndex
1379
   indicatorDialog.itemIndex = itemIndex
1388
   indicatorDialog.itemIndex = itemIndex
1380
 
1389
 
1381
-  await loadIndicatorCascaderOptions()
1382
-  await nextTick()
1383
 
1390
 
1391
+  await nextTick()
1384
   indicatorDialog.form = { ...item }
1392
   indicatorDialog.form = { ...item }
1393
+  console.log(indicatorDialog.form, "indicatorDialog.form")
1394
+
1385
   if (!indicatorDialog.form.personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList) {
1395
   if (!indicatorDialog.form.personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList) {
1386
     indicatorDialog.form.personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList = []
1396
     indicatorDialog.form.personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList = []
1387
   }
1397
   }
@@ -1400,15 +1410,7 @@ const deleteIndicator = (groupIndex, itemIndex) => {
1400
   }).catch(() => { })
1410
   }).catch(() => { })
1401
 }
1411
 }
1402
 
1412
 
1403
-// 指标名称变化时更新分值
1404
-const onIndicatorNameChange = (value) => {
1405
-  console.log(value, indicatorDialog.indicatorOptions, "indicatorDialog.indicatorOptions")
1406
-  const selected = indicatorDialog.indicatorOptions.find(item => item.id === value)
1407
-  if (selected) {
1408
-    indicatorDialog.form = { ...selected, indicatorId: selected.id, indicatorName: selected.name, occurCount: 1, personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList: [] }
1409
-    updateTotal()
1410
-  }
1411
-}
1413
+
1412
 
1414
 
1413
 // 更新总分
1415
 // 更新总分
1414
 const updateTotal = () => {
1416
 const updateTotal = () => {
@@ -1420,12 +1422,18 @@ const updateTotal = () => {
1420
     return
1422
     return
1421
   }
1423
   }
1422
   const targetCount = indicatorDialog.form.occurCount
1424
   const targetCount = indicatorDialog.form.occurCount
1425
+  const today = `${new Date().getFullYear()}-${String(new Date().getMonth() + 1).padStart(2, '0')}-${String(new Date().getDate()).padStart(2, '0')}`
1423
   if (list.length < targetCount) {
1426
   if (list.length < targetCount) {
1424
     for (let i = list.length; i < targetCount; i++) {
1427
     for (let i = list.length; i < targetCount; i++) {
1428
+      const isCoreIndicator = indicatorDialog.form.categoryNameOne === '核心指标'
1429
+      const defaultAmount = isCoreIndicator
1430
+        ? (indicatorDialog.form.score * 100)
1431
+        : (indicatorDialog.form.score * 50)
1425
       list.push({
1432
       list.push({
1433
+        recordDate: today,
1426
         qcDeptType: '',
1434
         qcDeptType: '',
1427
         rewardPunishmentDetail: '',
1435
         rewardPunishmentDetail: '',
1428
-        amount: 0
1436
+        amount: defaultAmount
1429
       })
1437
       })
1430
     }
1438
     }
1431
   }
1439
   }

+ 53 - 19
src/views/performanceManage/monthlyAssessSum/index.vue

@@ -88,8 +88,14 @@
88
         <el-card class="chart-card">
88
         <el-card class="chart-card">
89
           <div class="chart-header">大队分布统计图</div>
89
           <div class="chart-header">大队分布统计图</div>
90
           <div class="pie-charts-container">
90
           <div class="pie-charts-container">
91
-            <div ref="brigadePieChart1" class="pie-chart"></div>
92
-            <div ref="brigadePieChart2" class="pie-chart"></div>
91
+            <div class="pie-chart-wrapper">
92
+              <div class="pie-chart-title">各大队实际待改进人数占比</div>
93
+              <div ref="brigadePieChart1" class="pie-chart"></div>
94
+            </div>
95
+            <div class="pie-chart-wrapper">
96
+              <div class="pie-chart-title">各大队实际不称职人数占比</div>
97
+              <div ref="brigadePieChart2" class="pie-chart"></div>
98
+            </div>
93
           </div>
99
           </div>
94
         </el-card>
100
         </el-card>
95
 
101
 
@@ -97,8 +103,14 @@
97
         <el-card class="chart-card">
103
         <el-card class="chart-card">
98
           <div class="chart-header">岗位分布统计图</div>
104
           <div class="chart-header">岗位分布统计图</div>
99
           <div class="pie-charts-container">
105
           <div class="pie-charts-container">
100
-            <div ref="positionPieChart1" class="pie-chart"></div>
101
-            <div ref="positionPieChart2" class="pie-chart"></div>
106
+            <div class="pie-chart-wrapper">
107
+              <div class="pie-chart-title">各考核组实际待改进人数占比</div>
108
+              <div ref="positionPieChart1" class="pie-chart"></div>
109
+            </div>
110
+            <div class="pie-chart-wrapper">
111
+              <div class="pie-chart-title">各考核组实际不称职人数占比</div>
112
+              <div ref="positionPieChart2" class="pie-chart"></div>
113
+            </div>
102
           </div>
114
           </div>
103
         </el-card>
115
         </el-card>
104
       </div>
116
       </div>
@@ -222,9 +234,9 @@ const queryParams = reactive({
222
 const summaryTableTitle = computed(() => {
234
 const summaryTableTitle = computed(() => {
223
   if (queryParams.assessmentMonth) {
235
   if (queryParams.assessmentMonth) {
224
     const [year, month] = queryParams.assessmentMonth.split('-')
236
     const [year, month] = queryParams.assessmentMonth.split('-')
225
-    return `${year}年${parseInt(month)}月模拟分数汇总`
237
+    return `${year}年${parseInt(month)}月分数汇总`
226
   }
238
   }
227
-  return '模拟分数汇总'
239
+  return '分数汇总'
228
 })
240
 })
229
 
241
 
230
 // 图表引用
242
 // 图表引用
@@ -287,6 +299,7 @@ const initCharts = () => {
287
         series: [{
299
         series: [{
288
           type: 'pie',
300
           type: 'pie',
289
           radius: '70%',
301
           radius: '70%',
302
+          label: { formatter: '{b}: {c}' },
290
           data: [
303
           data: [
291
             { value: 380, name: '参与考核' },
304
             { value: 380, name: '参与考核' },
292
             { value: 20, name: '未参与考核' }
305
             { value: 20, name: '未参与考核' }
@@ -318,7 +331,8 @@ const initCharts = () => {
318
         tooltip: { trigger: 'item' },
331
         tooltip: { trigger: 'item' },
319
         series: [{
332
         series: [{
320
           type: 'pie',
333
           type: 'pie',
321
-          radius: '50%',
334
+          radius: '45%',
335
+          label: { formatter: '{b}\n{c}' },
322
           data: [
336
           data: [
323
             { value: 120, name: '一队' },
337
             { value: 120, name: '一队' },
324
             { value: 150, name: '二队' },
338
             { value: 150, name: '二队' },
@@ -335,7 +349,8 @@ const initCharts = () => {
335
         tooltip: { trigger: 'item' },
349
         tooltip: { trigger: 'item' },
336
         series: [{
350
         series: [{
337
           type: 'pie',
351
           type: 'pie',
338
-          radius: '50%',
352
+          radius: '45%',
353
+          label: { formatter: '{b}\n{c}' },
339
           data: [
354
           data: [
340
             { value: 45, name: '优秀' },
355
             { value: 45, name: '优秀' },
341
             { value: 280, name: '合格' },
356
             { value: 280, name: '合格' },
@@ -352,7 +367,8 @@ const initCharts = () => {
352
         tooltip: { trigger: 'item' },
367
         tooltip: { trigger: 'item' },
353
         series: [{
368
         series: [{
354
           type: 'pie',
369
           type: 'pie',
355
-          radius: '50%',
370
+          radius: '45%',
371
+          label: { formatter: '{b}\n{c}' },
356
           data: [
372
           data: [
357
             { value: 150, name: '安检员' },
373
             { value: 150, name: '安检员' },
358
             { value: 120, name: '设备操作员' },
374
             { value: 120, name: '设备操作员' },
@@ -370,7 +386,8 @@ const initCharts = () => {
370
         tooltip: { trigger: 'item' },
386
         tooltip: { trigger: 'item' },
371
         series: [{
387
         series: [{
372
           type: 'pie',
388
           type: 'pie',
373
-          radius: '50%',
389
+          radius: '45%',
390
+          label: { formatter: '{b}\n{c}' },
374
           data: [
391
           data: [
375
             { value: 35, name: '优秀' },
392
             { value: 35, name: '优秀' },
376
             { value: 320, name: '合格' },
393
             { value: 320, name: '合格' },
@@ -498,8 +515,8 @@ const getList = async () => {
498
 
515
 
499
     // 获取大队列表
516
     // 获取大队列表
500
     const brigadeListRes = await listDept()
517
     const brigadeListRes = await listDept()
501
-    const brigadeList = (brigadeListRes.data || []).filter(item => item.deptType === 'BRIGADE' && item.isFunctionalDept == 0)
502
-
518
+    const brigadeList = (brigadeListRes.data || []).filter(item => item.deptType === 'BRIGADE' && item.isFunctionalDept == 0 && item.deptId !== 487)
519
+    // console.log('大队列表:', brigadeList)
503
     // 其他接口调用
520
     // 其他接口调用
504
     const formattedQueryParams = formatParams(queryParams)
521
     const formattedQueryParams = formatParams(queryParams)
505
     const results = await Promise.allSettled([
522
     const results = await Promise.allSettled([
@@ -542,6 +559,9 @@ const getList = async () => {
542
         }))
559
         }))
543
       }
560
       }
544
 
561
 
562
+      const totalRowData = statisticsData[1]?.assessmentTeams[0] || {}
563
+
564
+
545
       // 计算总计用于标题
565
       // 计算总计用于标题
546
       const totalImprovement = tableData.reduce((sum, item) => sum + (item.actualImprovementCount || 0), 0)
566
       const totalImprovement = tableData.reduce((sum, item) => sum + (item.actualImprovementCount || 0), 0)
547
       const totalIncompetent = tableData.reduce((sum, item) => sum + (item.actualIncompetentCount || 0), 0)
567
       const totalIncompetent = tableData.reduce((sum, item) => sum + (item.actualIncompetentCount || 0), 0)
@@ -549,7 +569,7 @@ const getList = async () => {
549
       return {
569
       return {
550
         title: brigade.deptName,
570
         title: brigade.deptName,
551
         deptId: brigade.deptId,
571
         deptId: brigade.deptId,
552
-        tableData,
572
+        tableData: [...tableData, totalRowData],
553
         improveData: brigadeImproveData,
573
         improveData: brigadeImproveData,
554
         incompData: brigadeIncompData,
574
         incompData: brigadeIncompData,
555
         totalImprovement,
575
         totalImprovement,
@@ -575,7 +595,7 @@ const getList = async () => {
575
       const data = deptPartRes.value.data
595
       const data = deptPartRes.value.data
576
       if (participantPieChartInstance && Array.isArray(data)) {
596
       if (participantPieChartInstance && Array.isArray(data)) {
577
         participantPieChartInstance.setOption({
597
         participantPieChartInstance.setOption({
578
-          series: [{ data: data.map(item => ({ name: item.deptName, value: item.count })) }]
598
+          series: [{ label: { formatter: '{b}: {c}' }, data: data.map(item => ({ name: item.deptName, value: item.count })) }]
579
         })
599
         })
580
       }
600
       }
581
     }
601
     }
@@ -626,7 +646,7 @@ const getList = async () => {
626
       const data = actualImproveRes.value.data
646
       const data = actualImproveRes.value.data
627
       if (brigadePieChart1Instance && Array.isArray(data)) {
647
       if (brigadePieChart1Instance && Array.isArray(data)) {
628
         brigadePieChart1Instance.setOption({
648
         brigadePieChart1Instance.setOption({
629
-          series: [{ data: data.map(item => ({ name: item.deptName, value: item.count })) }]
649
+          series: [{ label: { formatter: '{b}\n{c}' }, data: data.map(item => ({ name: item.deptName, value: item.count })) }]
630
         })
650
         })
631
       }
651
       }
632
     }
652
     }
@@ -635,7 +655,7 @@ const getList = async () => {
635
       const data = actualIncompRes.value.data
655
       const data = actualIncompRes.value.data
636
       if (brigadePieChart2Instance && Array.isArray(data)) {
656
       if (brigadePieChart2Instance && Array.isArray(data)) {
637
         brigadePieChart2Instance.setOption({
657
         brigadePieChart2Instance.setOption({
638
-          series: [{ data: data.map(item => ({ name: item.deptName, value: item.count })) }]
658
+          series: [{ label: { formatter: '{b}\n{c}' }, data: data.map(item => ({ name: item.deptName, value: item.count })) }]
639
         })
659
         })
640
       }
660
       }
641
     }
661
     }
@@ -644,7 +664,7 @@ const getList = async () => {
644
       const data = teamImproveRes.value.data
664
       const data = teamImproveRes.value.data
645
       if (positionPieChart1Instance && Array.isArray(data)) {
665
       if (positionPieChart1Instance && Array.isArray(data)) {
646
         positionPieChart1Instance.setOption({
666
         positionPieChart1Instance.setOption({
647
-          series: [{ data: data.map(item => ({ name: selectDictLabel(assessment_team.value, item.assessmentTeam), value: item.count })) }]
667
+          series: [{ label: { formatter: '{b}\n{c}' }, data: data.map(item => ({ name: selectDictLabel(assessment_team.value, item.assessmentTeam), value: item.count })) }]
648
         })
668
         })
649
       }
669
       }
650
     }
670
     }
@@ -653,7 +673,7 @@ const getList = async () => {
653
       const data = teamIncompRes.value.data
673
       const data = teamIncompRes.value.data
654
       if (positionPieChart2Instance && Array.isArray(data)) {
674
       if (positionPieChart2Instance && Array.isArray(data)) {
655
         positionPieChart2Instance.setOption({
675
         positionPieChart2Instance.setOption({
656
-          series: [{ data: data.map(item => ({ name: selectDictLabel(assessment_team.value, item.assessmentTeam), value: item.count })) }]
676
+          series: [{ label: { formatter: '{b}\n{c}' }, data: data.map(item => ({ name: selectDictLabel(assessment_team.value, item.assessmentTeam), value: item.count })) }]
657
         })
677
         })
658
       }
678
       }
659
     }
679
     }
@@ -716,7 +736,7 @@ const getList = async () => {
716
           pieData: deptPieData.map(p => ({ name: selectDictLabel(assessment_team.value, p.assessmentTeam), value: p.count }))
736
           pieData: deptPieData.map(p => ({ name: selectDictLabel(assessment_team.value, p.assessmentTeam), value: p.count }))
717
         }
737
         }
718
       })
738
       })
719
-    
739
+
720
       nextTick(() => {
740
       nextTick(() => {
721
         traversalData2.value.forEach((item, index) => {
741
         traversalData2.value.forEach((item, index) => {
722
           const chartKey = `barChart_${index}`
742
           const chartKey = `barChart_${index}`
@@ -1338,6 +1358,20 @@ onUnmounted(() => {
1338
   height: 100%;
1358
   height: 100%;
1339
 }
1359
 }
1340
 
1360
 
1361
+.pie-chart-wrapper {
1362
+  display: flex;
1363
+  flex-direction: column;
1364
+  align-items: center;
1365
+  flex: 1;
1366
+}
1367
+
1368
+.pie-chart-title {
1369
+  font-size: 14px;
1370
+  color: #606266;
1371
+  margin-bottom: 10px;
1372
+  text-align: center;
1373
+}
1374
+
1341
 :deep(.el-table) {
1375
 :deep(.el-table) {
1342
   .el-table__header th {
1376
   .el-table__header th {
1343
     background-color: #f5f7fa;
1377
     background-color: #f5f7fa;

+ 1 - 1
vite.config.js

@@ -3,7 +3,7 @@ import path from 'path'
3
 import createVitePlugins from './vite/plugins'
3
 import createVitePlugins from './vite/plugins'
4
 
4
 
5
 // const baseUrl = 'http://192.168.3.221:8088' // 后端接口
5
 // const baseUrl = 'http://192.168.3.221:8088' // 后端接口
6
-const baseUrl = 'http://airport.samsundot.com:9024/prod-api'
6
+const baseUrl = 'http://airport-test.samsundot.com:9025/prod-api'
7
 // https://vitejs.dev/config/
7
 // https://vitejs.dev/config/
8
 export default defineConfig(({ mode, command }) => {
8
 export default defineConfig(({ mode, command }) => {
9
   const env = loadEnv(mode, process.cwd())
9
   const env = loadEnv(mode, process.cwd())