Quellcode durchsuchen

添加收费员管理

杨再金 vor 2 Jahren
Ursprung
Commit
55f98c0cb0
28 geänderte Dateien mit 1189 neuen und 13 gelöschten Zeilen
  1. 1 0
      .gitignore
  2. 5 3
      App.vue
  3. 4 0
      common/apiurl.js
  4. 7 0
      common/http.api.js
  5. 288 0
      components/yealuo-select/yealuo-select.vue
  6. 54 0
      pages.json
  7. 22 0
      pages/collectorManagement/assessmentAnalysis/assessmentAnalysis.vue
  8. 23 0
      pages/collectorManagement/assessmentRanking/assessmentRanking.vue
  9. 43 0
      pages/collectorManagement/performanceAnalysis/performanceAnalysis.scss
  10. 313 0
      pages/collectorManagement/performanceAnalysis/performanceAnalysis.vue
  11. 23 0
      pages/collectorManagement/performanceRanking/performanceRanking.scss
  12. 185 0
      pages/collectorManagement/performanceRanking/performanceRanking.vue
  13. 23 0
      pages/collectorManagement/shiftScheduling/shiftScheduling.vue
  14. 1 1
      pages/dataOverview/operationalAnalysis/components/arrearsAnalysis.vue
  15. 1 1
      pages/dataOverview/operationalAnalysis/components/incomeAnalysis.vue
  16. 1 1
      pages/dataOverview/operationalAnalysis/components/revenueAnalysis.vue
  17. 1 1
      pages/dataOverview/operationalAnalysis/components/sectionAnalysis.vue
  18. 1 1
      pages/dataOverview/operationalAnalysis/components/tollCollectorPerformance.vue
  19. 1 1
      pages/dataOverview/operationalAnalysis/components/trafficFlow.vue
  20. 1 2
      pages/index/index.scss
  21. 67 2
      pages/index/index.vue
  22. 22 0
      pages/patrolManagement/emergencyDisposalRecords/emergencyDisposalRecords.vue
  23. 17 0
      static/icons/assessment-analysis-icon.svg
  24. 17 0
      static/icons/assessment-ranking-icon.svg
  25. 17 0
      static/icons/emergency-disposal-icon.svg
  26. 17 0
      static/icons/performance-analysis-icon.svg
  27. 17 0
      static/icons/performance-ranking-icon.svg
  28. 17 0
      static/icons/shift-scheduling-icon.svg

+ 1 - 0
.gitignore

@@ -2,5 +2,6 @@
 .vscode
 .vscode
 .project
 .project
 .DS_Store
 .DS_Store
+.history
 /.hbuilderx/
 /.hbuilderx/
 /unpackage/
 /unpackage/

+ 5 - 3
App.vue

@@ -20,6 +20,7 @@
 			 * 通过参数设置获取最新版本信息
 			 * 通过参数设置获取最新版本信息
 			 */
 			 */
 			getVersion() {
 			getVersion() {
+				const _this = this
 				uni.$u.api.getParameterApi({
 				uni.$u.api.getParameterApi({
 					key: 'parking.operation.version'
 					key: 'parking.operation.version'
 				}).then(res => {
 				}).then(res => {
@@ -35,7 +36,7 @@
 											confirmColor: '#EE8F57',
 											confirmColor: '#EE8F57',
 											success: (res) => {
 											success: (res) => {
 												if (res.confirm) {
 												if (res.confirm) {
-													this.downloadAppFile()
+													_this.downloadAppFile()
 												}
 												}
 											}
 											}
 										})
 										})
@@ -47,7 +48,7 @@
 											confirmColor: '#EE8F57',
 											confirmColor: '#EE8F57',
 											success: (res) => {
 											success: (res) => {
 												if (res.confirm) {
 												if (res.confirm) {
-													this.downloadAppFile()
+													_this.downloadAppFile()
 												}
 												}
 											}
 											}
 										})
 										})
@@ -75,12 +76,13 @@
 			 * 下载文件
 			 * 下载文件
 			 */
 			 */
 			downloadAppFile() {
 			downloadAppFile() {
+				const _this = this
 				uni.showLoading({
 				uni.showLoading({
 					mask: true,
 					mask: true,
 					title: '下载中...'
 					title: '下载中...'
 				})
 				})
 				let downloadTask = uni.downloadFile({ // 执行下载
 				let downloadTask = uni.downloadFile({ // 执行下载
-					url: this.downloadUrl,
+					url: _this.downloadUrl,
 					success: downloadResult => {
 					success: downloadResult => {
 						// 下载成功
 						// 下载成功
 						if (downloadResult.statusCode === 200) {
 						if (downloadResult.statusCode === 200) {

+ 4 - 0
common/apiurl.js

@@ -82,6 +82,10 @@ export const apiurl = {
 		// 获取停车场实收统计总数据接口
 		// 获取停车场实收统计总数据接口
 		getParkingReallyIncomeTotalUrl: '/admin/reportparking/realamttotal'
 		getParkingReallyIncomeTotalUrl: '/admin/reportparking/realamttotal'
 	},
 	},
+	// 收费员业绩管理模块接口
+	tollCollectorPerformance: {
+		getAllTollCollectorUrl: '/admin/payeeinfo'
+	},
 	// 设备异常记录模块接口
 	// 设备异常记录模块接口
 	deviceAbnormal: {
 	deviceAbnormal: {
 		// 获取设备异常记录列表接口
 		// 获取设备异常记录列表接口

+ 7 - 0
common/http.api.js

@@ -167,6 +167,12 @@ const install = (Vue, vm) => {
 			params
 			params
 		})
 		})
 	};
 	};
+	// 收费员业绩管理模块接口
+	let tollCollectorPerformanceApi = {
+		getAllTollCollectorApi: (params = {}) => vm.$u.http.get(apiurl.tollCollectorPerformance.getAllTollCollectorUrl, {
+			params
+		})
+	}
 	// 设备异常记录模块
 	// 设备异常记录模块
 	let deviceAbnormalApi = {
 	let deviceAbnormalApi = {
 		// 获取设备异常记录列表
 		// 获取设备异常记录列表
@@ -190,6 +196,7 @@ const install = (Vue, vm) => {
 		todayOverviewApi,
 		todayOverviewApi,
 		operationalAnalysisApi,
 		operationalAnalysisApi,
 		statisticalReportApi,
 		statisticalReportApi,
+		tollCollectorPerformanceApi,
 		deviceAbnormalApi
 		deviceAbnormalApi
 	};
 	};
 }
 }

+ 288 - 0
components/yealuo-select/yealuo-select.vue

@@ -0,0 +1,288 @@
+<template>
+  <view class="yealuo-select">
+    <view class="yealuo-background" @tap="isShow = false" v-show="isShow"></view>
+    <view class="yealuo-con" :style="inputStyle" @tap="isShow = isShow ? false : nowData.length">
+      <slot name="left"></slot>
+      <input
+        :disabled="theDisabled"
+        :placeholder="placeholder"
+        v-model="theValue"
+        @input="theInput"
+        @focus="theFocus"
+        @blur="theBlur"
+        autocomplete="off"
+      />
+      <slot name="right" v-if="selectIco">
+        <svg
+          class="icon"
+          v-if="!isShow"
+          style="width: 1em; height: 1em; vertical-align: middle; fill: currentColor; overflow: hidden"
+          viewBox="0 0 1024 1024"
+          version="1.1"
+          xmlns="http://www.w3.org/2000/svg"
+          p-id="530"
+        >
+          <path
+            d="M512 714.666667c-8.533333 0-17.066667-2.133333-23.466667-8.533334l-341.333333-341.333333c-12.8-12.8-12.8-32 0-44.8 12.8-12.8 32-12.8 44.8 0l320 317.866667 317.866667-320c12.8-12.8 32-12.8 44.8 0 12.8 12.8 12.8 32 0 44.8L533.333333 704c-4.266667 8.533333-12.8 10.666667-21.333333 10.666667z"
+            p-id="531"
+          ></path>
+        </svg>
+        <svg
+          class="icon"
+          v-else
+          style="width: 1em; height: 1em; vertical-align: middle; fill: currentColor; overflow: hidden"
+          viewBox="0 0 1024 1024"
+          version="1.1"
+          xmlns="http://www.w3.org/2000/svg"
+          p-id="1927"
+        >
+          <path
+            d="M904.533333 674.133333l-362.666666-362.666666c-17.066667-17.066667-42.666667-17.066667-59.733334 0l-362.666666 362.666666c-17.066667 17.066667-17.066667 42.666667 0 59.733334 17.066667 17.066667 42.666667 17.066667 59.733333 0L512 401.066667l332.8 332.8c8.533333 8.533333 19.2 12.8 29.866667 12.8s21.333333-4.266667 29.866666-12.8c17.066667-17.066667 17.066667-42.666667 0-59.733334z"
+            p-id="1928"
+          ></path>
+        </svg>
+      </slot>
+    </view>
+    <view class="yealuo-select" v-show="show" :style="selectStyle">
+      <view class="data">
+        <radio-group v-if="checkType == 'radio'" @change="selectCheckbox">
+          <view class="select-item" :class="'item-' + overflow" v-for="(item, index) in nowData" :key="index">
+            <label class="item-text" :class="{ active: theValue == item.value }">
+              <radio name="name1" checked v-if="theValue == item.value" :value="item.value + '|' + item.id"></radio>
+              <radio name="name1" v-else :value="item.value + '|' + item.id"></radio>
+              {{ item.value }}
+            </label>
+          </view>
+        </radio-group>
+        <checkbox-group v-else-if="checkType == 'checkbox'" @change="selectCheckbox">
+          <view class="select-item" :class="'item-' + overflow" v-for="(item, index) in nowData" :key="index">
+            <label class="item-text" :class="{ active: theValue.indexOf(item.value) != -1 }">
+              <checkbox name="name1" checked v-if="theValue.indexOf(item.value) != -1" :value="item.value + '|' + item.id"></checkbox>
+              <checkbox name="name1" v-else :value="item.value + '|' + item.id"></checkbox>
+              {{ item.value }}
+            </label>
+          </view>
+        </checkbox-group>
+        <radio-group v-else @change="selectCheckbox">
+          <view class="select-item" :class="'item-' + overflow" v-for="(item, index) in nowData" :key="index">
+            <label class="item-text" :class="{ active: theValue == item.value }">
+              <radio name="name1" style="display: none" checked v-if="theValue == item.value" :value="item.value + '|' + item.id"></radio>
+              <radio name="name1" style="display: none" v-else :value="item.value + '|' + item.id"></radio>
+              {{ item.value }}
+            </label>
+          </view>
+        </radio-group>
+      </view>
+      <view class="item-close" @tap="isShow = false">收起</view>
+    </view>
+  </view>
+</template>
+
+<script>
+let fontUnit = 'upx';
+// #ifdef MP-WEIXIN
+fontUnit = 'rpx';
+// #endif
+export default {
+  name: 'yealuoInputs',
+  props: {
+    placeholder: {
+      type: String,
+      default: ''
+    },
+    value: {
+      type: String,
+      default: ''
+    },
+    checkType: {
+      type: String,
+      default: ''
+    },
+    itemKey: {
+      type: String,
+      default: ''
+    },
+    width: {
+      type: String,
+      default: '600'
+    },
+    disabled: {
+      type: Boolean,
+      default: false
+    },
+    inputStyle: {
+      type: String,
+      default: ''
+    },
+    selectStyle: {
+      type: String,
+      default: ''
+    },
+    overflow: {
+      type: String,
+      default: 'auto'
+    },
+    tags: {
+      type: String,
+      default: ''
+    },
+
+    binData: {
+      type: Array,
+      default: ''
+    },
+    selectIco: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      odData: this.binData,
+      nowData: this.binData,
+      isShow: false,
+      theValue: this.value,
+      theDisabled: this.disabled
+    };
+  },
+  watch: {
+    value(val) {
+      this.theValue = val;
+    },
+    //监听数据变化
+    // nowData: {
+    //   handler: function () {
+    //     this.nowData = this.binData;
+    //   },
+    //   deep: true
+    // }
+  },
+  computed: {
+    show() {
+      return this.isShow && this.nowData.length;
+    }
+  },
+  methods: {
+    //获取焦点
+    theFocus(e) {
+      this.nowData = this.odData;
+    },
+    //失去焦点
+    theBlur(e) {
+      this.$emit('blur', e);
+    },
+    //获取输入值
+    theInput(e) {
+      var val = e.detail.value;
+      let data = [];
+      var odData = this.odData;
+      for (var i = 0; i < odData.length; i++) {
+        var isHas = false;
+        if (odData[i].value.indexOf(val) > -1) {
+          data.push(odData[i]);
+          if (odData[i].value == val) {
+            isHas = true;
+            var arr = [];
+            arr.push(odData[i].value + '|' + odData[i].id);
+            this.$emit('getBackVal', arr);
+          }
+        }
+        if (!isHas) {
+          var arr = [];
+          arr.push(val);
+          this.$emit('getBackVal', arr);
+        }
+      }
+      this.nowData = data;
+    },
+    //下拉选中
+    selectCheckbox(e) {
+      var val = e.target.value;
+      var str = val;
+      if (typeof str != 'string') {
+        str = '';
+        for (var i = 0; i < val.length; i++) {
+          var vt = val[i].split('|');
+          str += i > 0 ? ',' + vt[0] : vt[0];
+        }
+      } else {
+        this.isShow = false;
+        str = str.split('|')[0];
+      }
+      this.$emit('getBackVal', val + '|' + this.tags);
+      this.theValue = str;
+    },
+    clearData() {
+      this.theValue = '';
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.yealuo-select {
+  max-width: 100%;
+  border: solid 1px #dcdfe6;
+  border-radius: 4px;
+  padding: 6px;
+  position: relative;
+  .yealuo-background {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 750upx;
+    height: 100%;
+  }
+  .yealuo-con {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    input {
+      flex: 1;
+      margin: 0 6upx;
+    }
+  }
+
+  .yealuo-select {
+    border: 1px solid #f3f3f4;
+    position: absolute;
+    z-index: 999;
+    background: #fff;
+    width: 100%;
+    .data {
+      max-height: 600upx;
+      padding: 10upx;
+      overflow: auto;
+      .select-item {
+        width: 100%;
+        color: #666;
+        .item-text {
+          width: 100%;
+          display: block;
+        }
+        .active {
+          font-weight: bold;
+        }
+      }
+      .item-auto {
+        overflow: auto;
+        .item-text {
+          width: max-content;
+        }
+      }
+      .item-hide .item-text {
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
+    }
+    .item-close {
+      padding: 20upx;
+      text-align: center;
+      font-size: 32upx;
+      border-top: 1px solid #f3f3f4;
+      color: #8f8f94;
+    }
+  }
+}
+</style>

+ 54 - 0
pages.json

@@ -122,6 +122,60 @@
 				"navigationBarTextStyle": "white"
 				"navigationBarTextStyle": "white"
 			}
 			}
 
 
+		}, {
+			"path": "pages/collectorManagement/performanceRanking/performanceRanking",
+			"style": {
+				"navigationBarTitleText": "业绩排名",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#1767F2",
+				"navigationBarTextStyle": "white"
+			}
+
+		}, {
+			"path": "pages/collectorManagement/performanceAnalysis/performanceAnalysis",
+			"style": {
+				"navigationBarTitleText": "业绩分析",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#1767F2",
+				"navigationBarTextStyle": "white"
+			}
+
+		}, {
+			"path": "pages/collectorManagement/assessmentRanking/assessmentRanking",
+			"style": {
+				"navigationBarTitleText": "考核排名",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#1767F2",
+				"navigationBarTextStyle": "white"
+			}
+
+		}, {
+			"path": "pages/collectorManagement/assessmentAnalysis/assessmentAnalysis",
+			"style": {
+				"navigationBarTitleText": "考核分析",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#1767F2",
+				"navigationBarTextStyle": "white"
+			}
+
+		}, {
+			"path": "pages/collectorManagement/shiftScheduling/shiftScheduling",
+			"style": {
+				"navigationBarTitleText": "排班情况",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#1767F2",
+				"navigationBarTextStyle": "white"
+			}
+
+		}, {
+			"path": "pages/patrolManagement/emergencyDisposalRecords/emergencyDisposalRecords",
+			"style": {
+				"navigationBarTitleText": "应急处置记录",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#1767F2",
+				"navigationBarTextStyle": "white"
+			}
+
 		}
 		}
 	],
 	],
 	"globalStyle": {
 	"globalStyle": {

+ 22 - 0
pages/collectorManagement/assessmentAnalysis/assessmentAnalysis.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 23 - 0
pages/collectorManagement/assessmentRanking/assessmentRanking.vue

@@ -0,0 +1,23 @@
+<!-- 考核排名 -->
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 43 - 0
pages/collectorManagement/performanceAnalysis/performanceAnalysis.scss

@@ -0,0 +1,43 @@
+.performance-analysis {
+  padding: 15px;
+  &-search {
+    background-color: #fff;
+    border-radius: 5px;
+    padding: 15px;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 10px;
+    &-left {
+      .tab {
+        display: flex;
+        border: solid 1px #1767f2;
+        &-item {
+          width: 40px;
+          height: 34px;
+          line-height: 34px;
+          text-align: center;
+          border-right: solid 1px #1767f2;
+          color: #1767f2;
+          font-size: 16px;
+          &:last-child {
+            border-right: none;
+          }
+        }
+        .active {
+          background-color: #1767f2;
+          color: #fff;
+        }
+      }
+    }
+    &-right {
+      width: 150px;
+    }
+  }
+  &-content {
+    background-color: #fff;
+    border-radius: 5px;
+    margin-bottom: 10px;
+    padding: 15px;
+  }
+}

+ 313 - 0
pages/collectorManagement/performanceAnalysis/performanceAnalysis.vue

@@ -0,0 +1,313 @@
+<!--
+ * @Description: 业绩分析
+ * @Author: 空白格
+ * @Date: 2022-06-20 09:20:23
+ * @LastEditors: 空白格
+ * @LastEditTime: 2022-06-20 11:30:19
+ * @FilePath: \parking_operation\pages\collectorManagement\performanceAnalysis\performanceAnalysis.vue
+ * @Copyright: Copyright (c) 2016~2022 by 空白格, All Rights Reserved. 
+-->
+<template>
+  <view class="performance-analysis">
+    <view class="performance-analysis-search">
+      <view class="performance-analysis-search-left">
+        <view class="tab">
+          <view
+            class="tab-item"
+            v-for="(item, index) in tabList"
+            :key="index"
+            :class="{ active: tabCur === item.value }"
+            @click="tabClick(item)"
+          >
+            {{
+            item.label
+            }}
+          </view>
+        </view>
+      </view>
+      <view class="performance-analysis-search-right">
+        <u--input placeholder="" border="surround" v-model="currentDate" disabled inputAlign="center"/>
+      </view>
+    </view>
+    <view class="performance-analysis-content">
+      <template v-if="chartData.series[0].data.length > 0">
+        <LineChart :chartData="chartData" :opts="opts" />
+      </template>
+      <template v-else>
+        <view class="empty">
+          <u-empty></u-empty>
+        </view>
+      </template>
+    </view>
+    <!-- 年 -->
+    <u-picker
+      :show="yearPicker"
+      :columns="yearList"
+      :defaultIndex="defaultYear"
+      @confirm="yearConfirm"
+      @cancel="yearPicker = false"
+    ></u-picker>
+    <!-- 月 -->
+    <u-picker
+      :show="monthPicker"
+      :columns="monthList"
+      :defaultIndex="defaultMonth"
+      @confirm="monthConfirm"
+      @cancel="monthPicker = false"
+    ></u-picker>
+    <!-- 日 -->
+    <u-picker
+      :show="dayPicker"
+      :columns="dayList"
+      :defaultIndex="defaultDay"
+      @confirm="dayConfirm"
+      @cancel="dayPicker = false"
+    ></u-picker>
+  </view>
+</template>
+
+<script>
+import LineChart from '@/components/lineChart.vue';
+export default {
+  components: {
+    LineChart
+  },
+  data() {
+    return {
+      tabList: [
+        {
+          label: '年',
+          value: 2
+        },
+        {
+          label: '月',
+          value: 1
+        },
+        {
+          label: '日',
+          value: 0
+        }
+      ],
+      tabCur: 2,
+      params: {
+        queryDate: '',
+        reportType: 2
+      },
+      currentDate: '',
+      // 年
+      yearPicker: false,
+      yearList: this.getYearList(),
+      defaultYear: [4],
+      currentYear: '',
+      yearObj: {},
+      // 月
+      monthPicker: false,
+      monthList: this.getMonthList(),
+      defaultMonth: [],
+      currentMonth: '01',
+      monthObj: {},
+      // 日
+      dayPicker: false,
+      dayList: this.getDayList(),
+      defaultDay: [],
+      currentDay: '01',
+      dayObj: {},
+      chartData: {
+        categories: [],
+        series: [
+          {
+            name: '',
+            data: []
+          }
+        ]
+      },
+      opts: {
+        enableScroll: true,
+        xAxis: {
+          rotateLabel: true,
+          scrollShow: true,
+          itemCount: 8
+        },
+        yAxis: {
+          showTitle: true,
+          splitNumber: 5,
+          data: [
+            {
+              title: '元',
+              titleOffsetY: -3
+            }
+          ]
+        },
+        legend: {
+          show: false
+        },
+        dataLabel: false,
+        padding: [20, 10, 10, 10],
+        extra: {
+          column: {
+            width: 20
+          }
+        }
+      }
+    };
+  },
+  onShow() {
+    this.defaultSetVal();
+  },
+  watch: {
+    'params.queryDate'(val) {
+      if (val) {
+        let timestamp = new Date(val).valueOf();
+        switch (this.params.reportType) {
+          case 0:
+            this.currentDate = this.$u.timeFormat(timestamp, 'yyyy年mm月dd日');
+            break;
+          case 1:
+            this.currentDate = this.$u.timeFormat(timestamp, 'yyyy年mm月');
+            break;
+          case 2:
+            this.currentDate = this.$u.timeFormat(timestamp, 'yyyy年');
+            break;
+        }
+      }
+    }
+  },
+  methods: {
+    defaultSetVal() {
+      this.currentYear = this.yearList[0][4].value;
+      this.yearObj = this.yearList[0][4];
+      this.params.queryDate = `${this.currentYear}-${this.currentMonth}-${this.currentDay}`;
+      this.getData();
+    },
+    getYearList() {
+      const date = new Date();
+      const year = date.getFullYear();
+      const list = [[]];
+      for (let i = year - 4; i < year + 1; i++) {
+        const obj = {
+          text: String(i),
+          value: String(i)
+        };
+        list[0].push(obj);
+      }
+      return list;
+    },
+    getMonthList() {
+      const list = [[]];
+      for (let i = 1; i < 13; i++) {
+        const obj = {
+          text: String(i),
+          value: String(i)
+        };
+        if (i < 10) {
+          obj.text = '0' + i;
+          obj.value = '0' + i;
+        }
+        list[0].push(obj);
+      }
+      setTimeout(() => {
+        this.defaultMonth = [0];
+      }, 1000);
+      return list;
+    },
+    getDayList() {
+      const date = new Date();
+      const year = date.getFullYear();
+      let month = date.getMonth();
+      if (this.monthObj) {
+        month = parseInt(this.monthObj.value);
+      }
+      const day = date.getDate();
+      const dayLen = new Date(year, month, 0).getDate();
+      const list = [[]];
+      for (let i = 1; i < dayLen + 1; i++) {
+        const obj = {
+          text: String(i),
+          value: String(i)
+        };
+        if (i < 10) {
+          obj.text = '0' + i;
+          obj.value = '0' + i;
+        }
+        list[0].push(obj);
+      }
+      setTimeout(() => {
+        this.defaultDay = [0];
+      }, 1000);
+      return list;
+    },
+    /**
+     * 点击tab
+     * @param {Object} item
+     */
+    tabClick(item) {
+      this.tabCur = item.value;
+      switch (item.value) {
+        case 0:
+          this.dayPicker = true;
+          break;
+        case 1:
+          this.monthPicker = true;
+          break;
+        case 2:
+          this.yearPicker = true;
+          break;
+      }
+      this.params.reportType = this.tabCur;
+    },
+    yearConfirm(e) {
+      this.defaultYear = [e.indexs[0]];
+      this.currentYear = e.value[0].value;
+      this.yearObj = e.value[0];
+      this.params.queryDate = `${this.currentYear}-${this.currentMonth}-${this.currentDay}`;
+      this.yearPicker = false;
+      this.getData();
+    },
+    monthConfirm(e) {
+      this.defaultMonth = [e.indexs[0]];
+      this.currentMonth = e.value[0].value;
+      this.monthObj = e.value[0];
+      this.params.queryDate = `${this.currentYear}-${this.currentMonth}-${this.currentDay}`;
+      this.monthPicker = false;
+      this.dayList = this.getDayList();
+      this.getData();
+    },
+    dayConfirm(e) {
+      this.defaultDay = [e.indexs[0]];
+      this.currentDay = e.value[0].value;
+      this.dayObj = e.value[0];
+      this.params.queryDate = `${this.currentYear}-${this.currentMonth}-${this.currentDay}`;
+      this.dayPicker = false;
+      this.getData();
+    },
+    getData() {
+      uni.$u.api.operationalAnalysisApi
+        .getTollCollectorPerformanceApi({ ...this.params })
+        .then((res) => {
+          if (res.code === 200) {
+            if (res.rows && res.rows.length) {
+              this.chartData.categories = res.rows.map((item) => {
+                return item.payeeName;
+              });
+              this.chartData.series[0].data = res.rows.map((item) => {
+                return item.amt;
+              });
+            } else {
+              this.chartData.categories = [];
+              this.chartData.series[0].data = [];
+            }
+          }
+        });
+    }
+  }
+};
+</script>
+<style lang="scss">
+	page {
+	  background-color: #1767f2;
+	  min-height: calc(100vh - 44px);
+	}
+</style>
+<style lang="scss" scoped>
+@import './performanceAnalysis.scss';
+</style>

+ 23 - 0
pages/collectorManagement/performanceRanking/performanceRanking.scss

@@ -0,0 +1,23 @@
+.performance-ranking {
+  padding: 15px;
+  &-search {
+    background-color: #fff;
+    border-radius: 5px;
+    padding: 15px;
+    margin-bottom: 10px;
+    &-item {
+      margin-bottom: 15px;
+      &:last-child {
+        margin-bottom: 0;
+      }
+    }
+    .btn-item {
+      display: flex;
+      .custom-btn {
+        width: 100px;
+        margin-right: 20px;
+        margin-left: 0;
+      }
+    }
+  }
+}

+ 185 - 0
pages/collectorManagement/performanceRanking/performanceRanking.vue

@@ -0,0 +1,185 @@
+<!--
+ * @Description: 业绩排行
+ * @Author: 空白格
+ * @Date: 2022-06-20 09:15:39
+ * @LastEditors: 空白格
+ * @LastEditTime: 2022-06-20 15:49:36
+ * @FilePath: \parking_operation\pages\collectorManagement\performanceRanking\performanceRanking.vue
+ * @Copyright: Copyright (c) 2016~2022 by 空白格, All Rights Reserved. 
+-->
+
+<template>
+  <view class="performance-ranking">
+    <view class="performance-ranking-search">
+      <view class="performance-ranking-search-item">
+        <uni-datetime-picker v-model="dateRange" type="daterange" @change="dateChange" />
+      </view>
+      <view class="performance-ranking-search-item">
+        <yealuoInputs
+          v-if="loadAcheve"
+          ref="yealuoInputs"
+          :value="payeeNoList"
+          placeholder="请勾选收费员"
+          :binData="collectorList"
+          checkType="checkbox"
+          overflow="hide"
+          @getBackVal="getBackVal"
+          :selectIco="true"
+        />
+      </view>
+      <view class="performance-ranking-search-item btn-item">
+        <u-button text="搜索" size="small" class="custom-btn" type="primary" @click="handleQuery"></u-button>
+        <u-button text="重置" size="small" class="custom-btn" @click="handleReset"></u-button>
+      </view>
+    </view>
+    <view class="performance-ranking-content">
+      <TableRanking
+        :loading="tableData.loading"
+        :padding="'0'"
+        :tableTh="tableData.tableTh"
+        :tableData="tableData.tableData"
+        @pageChange="pageChange"
+      />
+    </view>
+  </view>
+</template>
+
+<script>
+import yealuoInputs from '@/components/yealuo-select/yealuo-select.vue';
+import TableRanking from '@/components/tableRanking.vue';
+export default {
+  components: {
+    yealuoInputs,
+    TableRanking
+  },
+  data() {
+    return {
+      dateRange: [],
+      collectorList: [],
+      payeeNoList: '',
+      loadAcheve: false,
+      params: {
+        payeeNoList: '',
+        beginTime: '',
+        endTime: '',
+        pageNum: 1,
+        pageSize: 10
+      },
+      tableData: {
+        loading: false,
+        tableTh: [
+          {
+            field: '工号',
+            key: 'payeeNo',
+            width: 100
+          },
+          {
+            field: '姓名',
+            key: 'payeeName'
+          },
+          {
+            field: '实收金额(元)',
+            key: 'realAmount'
+          }
+        ],
+        tableData: {
+          list: [],
+          total: 0
+        }
+      }
+    };
+  },
+  onShow() {
+    this.getCollectorList();
+    this.getList();
+  },
+  methods: {
+    /**
+     * 获取所有收费员
+     * @date 2022-06-20
+     * @returns {any}
+     */
+    getCollectorList() {
+      uni.$u.api.tollCollectorPerformanceApi
+        .getAllTollCollectorApi()
+        .then((res) => {
+          const { code, rows } = res;
+          if (code === 200) {
+            this.collectorList = rows.map((item) => {
+              return { id: item.payeeNo, value: item.payeeName };
+            });
+            this.loadAcheve = true;
+          }
+        });
+    },
+    /**
+     * 获取数据
+     */
+    getList() {
+      this.tableData.loading = true;
+      uni.$u.api.statisticalReportApi
+        .getTollCollectorAchieveListApi({ ...this.params })
+        .then((res) => {
+          const { code, rows, total } = res;
+          if (code === 200) {
+            this.tableData.tableData.list = rows;
+            this.tableData.tableData.total = total;
+          }
+          this.tableData.loading = false;
+        });
+    },
+    handleQuery() {
+      this.getList();
+    },
+    handleReset() {
+      this.params = {
+        payeeNoList: '',
+        beginTime: '',
+        endTime: '',
+        pageNum: 1,
+        pageSize: 10
+      };
+      this.dateRange = [];
+      this.$refs['yealuoInputs'].clearData();
+      this.getList();
+    },
+    getBackVal(val) {
+      if (typeof val === 'string') {
+        let curList = val.split(','),
+          valList = [];
+        if (curList.length) {
+          curList.forEach((item) => {
+            valList.push(item.split('|')[1]);
+          });
+        }
+        this.params.payeeNoList = valList.join(',');
+      }
+    },
+    /**
+     * 时间范围选择触发
+     * @param {*} e
+     */
+    dateChange(e) {
+      this.params.beginTime = e[0];
+      this.params.endTime = e[1];
+    },
+    /**
+     * 分页触发
+     * @param {*} page
+     */
+    pageChange(page) {
+      this.params.pageNum = page;
+      this.getList();
+    }
+  }
+};
+</script>
+<style lang="scss">
+	page {
+	  background-color: #1767f2;
+	  min-height: calc(100vh - 44px);
+	}
+</style>
+<style lang="scss" scoped>
+@import './performanceRanking.scss';
+</style>

+ 23 - 0
pages/collectorManagement/shiftScheduling/shiftScheduling.vue

@@ -0,0 +1,23 @@
+<!-- 排班情况 -->
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 1 - 1
pages/dataOverview/operationalAnalysis/components/arrearsAnalysis.vue

@@ -43,7 +43,7 @@
 							show: true
 							show: true
 						},
 						},
 						dataLabel: false,
 						dataLabel: false,
-						padding: [10, 0, 10, 0],
+						padding: [20, 0, 10, 0],
 						extra: {
 						extra: {
 							column: {
 							column: {
 								width: 20
 								width: 20

+ 1 - 1
pages/dataOverview/operationalAnalysis/components/incomeAnalysis.vue

@@ -62,7 +62,7 @@
 							show: false
 							show: false
 						},
 						},
 						dataLabel: false,
 						dataLabel: false,
-						padding: [10, 0, 10, 0],
+						padding: [20, 0, 10, 0],
 						extra: {
 						extra: {
 							column: {
 							column: {
 								width: 20
 								width: 20

+ 1 - 1
pages/dataOverview/operationalAnalysis/components/revenueAnalysis.vue

@@ -73,7 +73,7 @@
 						show: true
 						show: true
 					},
 					},
 					dataLabel: false,
 					dataLabel: false,
-					padding: [10, 10, 10, 10],
+					padding: [20, 10, 10, 10],
 					extra: {
 					extra: {
 						column: {
 						column: {
 							width: 20
 							width: 20

+ 1 - 1
pages/dataOverview/operationalAnalysis/components/sectionAnalysis.vue

@@ -56,7 +56,7 @@
 						show: false
 						show: false
 					},
 					},
 					dataLabel: false,
 					dataLabel: false,
-					padding: [10, 0, 10, 0],
+					padding: [20, 0, 10, 0],
 					extra: {
 					extra: {
 						column: {
 						column: {
 							width: 20
 							width: 20

+ 1 - 1
pages/dataOverview/operationalAnalysis/components/tollCollectorPerformance.vue

@@ -75,7 +75,7 @@
 						show: false
 						show: false
 					},
 					},
 					dataLabel: false,
 					dataLabel: false,
-					padding: [10, 10, 10, 10],
+					padding: [20, 10, 10, 10],
 					extra: {
 					extra: {
 						column: {
 						column: {
 							width: 20
 							width: 20

+ 1 - 1
pages/dataOverview/operationalAnalysis/components/trafficFlow.vue

@@ -43,7 +43,7 @@
 							show: true
 							show: true
 						},
 						},
 						dataLabel: false,
 						dataLabel: false,
-						padding: [10, 10, 10, 10],
+						padding: [20, 10, 10, 10],
 						extra: {
 						extra: {
 							column: {
 							column: {
 								width: 20
 								width: 20

+ 1 - 2
pages/index/index.scss

@@ -71,10 +71,9 @@
 					flex-wrap: wrap;
 					flex-wrap: wrap;
 					padding: 15px 0;
 					padding: 15px 0;
 					&-item {
 					&-item {
-						width: 23%;
+						width: 25%;
 						margin-bottom: 24px;
 						margin-bottom: 24px;
 						text-align: center;
 						text-align: center;
-						margin-right: 2%;
 						&-icon {
 						&-icon {
 							margin: 0 auto 9px;
 							margin: 0 auto 9px;
 						}
 						}

+ 67 - 2
pages/index/index.vue

@@ -11,7 +11,7 @@
 					</view>
 					</view>
 				</view>
 				</view>
 				<view class="index-header-box-2">
 				<view class="index-header-box-2">
-					<text>普定智慧停车<br />运营中心</text>
+					<text>普定停车<br />运营中心</text>
 				</view>
 				</view>
 			</view>
 			</view>
 		</view>
 		</view>
@@ -29,7 +29,7 @@
 					</view>
 					</view>
 				</view>
 				</view>
 				<!-- 订单管理 -->
 				<!-- 订单管理 -->
-				<view class="index-main-menu-2">
+				<!-- <view class="index-main-menu-2">
 					<view class="index-main-menu-title">
 					<view class="index-main-menu-title">
 						<text>订单管理</text>
 						<text>订单管理</text>
 					</view>
 					</view>
@@ -44,6 +44,23 @@
 							</view>
 							</view>
 						</view>
 						</view>
 					</view>
 					</view>
+				</view> -->
+				<!-- 收费员管理 -->
+				<view class="index-main-menu-2">
+					<view class="index-main-menu-title">
+						<text>收费员管理</text>
+					</view>
+					<view class="menu">
+						<view class="menu-item" v-for="(item, index) in tollCollectorList" :key="index" @click="jumpPage(item.url, {}, item.flag)">
+							<view class="menu-item-icon" :style="{ width: item.width || '30px' }">
+								<u--image :src="item.icon" :width="item.width || '30px'"
+									:height="item.height || '31px'"></u--image>
+							</view>
+							<view class="menu-item-name">
+								<text>{{ item.name }}</text>
+							</view>
+						</view>
+					</view>
 				</view>
 				</view>
 				<!-- 巡检管理 -->
 				<!-- 巡检管理 -->
 				<view class="index-main-menu-2">
 				<view class="index-main-menu-2">
@@ -126,6 +143,46 @@
 						height: '31px'
 						height: '31px'
 					}
 					}
 				],
 				],
+				// 收费员管理
+				tollCollectorList: [
+					{
+						icon: require('@/static/icons/performance-ranking-icon.svg'),
+						name: '业绩排名',
+						url: 'pages/collectorManagement/performanceRanking/performanceRanking',
+						height: '33px'
+					},
+					{
+						icon: require('@/static/icons/performance-analysis-icon.svg'),
+						name: '业绩分析',
+						url: 'pages/collectorManagement/performanceAnalysis/performanceAnalysis',
+						height: '33px',
+						width: '33px'
+					},
+					{
+						icon: require('@/static/icons/assessment-ranking-icon.svg'),
+						name: '考核排名',
+						url: 'pages/collectorManagement/assessmentRanking/assessmentRanking',
+						height: '33px',
+						width: '33px',
+						flag: true
+					},
+					{
+						icon: require('@/static/icons/assessment-analysis-icon.svg'),
+						name: '考核分析',
+						url: 'pages/collectorManagement/assessmentAnalysis/assessmentAnalysis',
+						height: '32px',
+						width: '33px',
+						flag: true
+					},
+					{
+						icon: require('@/static/icons/shift-scheduling-icon.svg'),
+						name: '排班情况',
+						url: 'pages/collectorManagement/shiftScheduling/shiftScheduling',
+						height: '30px',
+						width: '33px',
+						flag: true
+					}
+				],
 				// 巡检管理
 				// 巡检管理
 				patrolMenuList: [{
 				patrolMenuList: [{
 						icon: require('@/static/icons/patrol-manage-icon.svg'),
 						icon: require('@/static/icons/patrol-manage-icon.svg'),
@@ -141,6 +198,14 @@
 						url: 'pages/patrolManagement/deviceAbnormalRecords/deviceAbnormalRecords',
 						url: 'pages/patrolManagement/deviceAbnormalRecords/deviceAbnormalRecords',
 						width: '35px',
 						width: '35px',
 						height: '31px'
 						height: '31px'
+					},
+					{
+						icon: require('@/static/icons/emergency-disposal-icon.svg'),
+						name: '应急处置记录',
+						url: 'pages/patrolManagement/emergencyDisposalRecords/emergencyDisposalRecords',
+						width: '35px',
+						height: '31px',
+						flag: true
 					}
 					}
 				]
 				]
 			}
 			}

+ 22 - 0
pages/patrolManagement/emergencyDisposalRecords/emergencyDisposalRecords.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

Datei-Diff unterdrückt, da er zu groß ist
+ 17 - 0
static/icons/assessment-analysis-icon.svg


Datei-Diff unterdrückt, da er zu groß ist
+ 17 - 0
static/icons/assessment-ranking-icon.svg


Datei-Diff unterdrückt, da er zu groß ist
+ 17 - 0
static/icons/emergency-disposal-icon.svg


Datei-Diff unterdrückt, da er zu groß ist
+ 17 - 0
static/icons/performance-analysis-icon.svg


Datei-Diff unterdrückt, da er zu groß ist
+ 17 - 0
static/icons/performance-ranking-icon.svg


Datei-Diff unterdrückt, da er zu groß ist
+ 17 - 0
static/icons/shift-scheduling-icon.svg