Selaa lähdekoodia

添加收费员管理

杨再金 3 vuotta sitten
vanhempi
sitoutus
55f98c0cb0
28 muutettua tiedostoa jossa 1174 lisäystä ja 13 poistoa
  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. 12 0
      static/icons/performance-analysis-icon.svg
  27. 12 0
      static/icons/performance-ranking-icon.svg
  28. 12 0
      static/icons/shift-scheduling-icon.svg

+ 1 - 0
.gitignore

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

+ 5 - 3
App.vue

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

+ 4 - 0
common/apiurl.js

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

+ 7 - 0
common/http.api.js

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

+ 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
 						},
 						dataLabel: false,
-						padding: [10, 0, 10, 0],
+						padding: [20, 0, 10, 0],
 						extra: {
 							column: {
 								width: 20

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

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

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

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

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

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

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

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

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

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

+ 1 - 2
pages/index/index.scss

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

+ 67 - 2
pages/index/index.vue

@@ -11,7 +11,7 @@
 					</view>
 				</view>
 				<view class="index-header-box-2">
-					<text>普定智慧停车<br />运营中心</text>
+					<text>普定停车<br />运营中心</text>
 				</view>
 			</view>
 		</view>
@@ -29,7 +29,7 @@
 					</view>
 				</view>
 				<!-- 订单管理 -->
-				<view class="index-main-menu-2">
+				<!-- <view class="index-main-menu-2">
 					<view class="index-main-menu-title">
 						<text>订单管理</text>
 					</view>
@@ -44,6 +44,23 @@
 							</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 class="index-main-menu-2">
@@ -126,6 +143,46 @@
 						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: [{
 						icon: require('@/static/icons/patrol-manage-icon.svg'),
@@ -141,6 +198,14 @@
 						url: 'pages/patrolManagement/deviceAbnormalRecords/deviceAbnormalRecords',
 						width: '35px',
 						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>

+ 17 - 0
static/icons/assessment-analysis-icon.svg

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="59px" height="58px" viewBox="0 0 59 58" version="1.1">
+  <title>fenxi6</title>
+  <defs>
+    <linearGradient x1="9.34686699%" y1="1.68055157%" x2="100%" y2="98.3194484%" id="linearGradient-1">
+      <stop stop-color="#FA7C2F" offset="0%"></stop>
+      <stop stop-color="#FE243A" offset="100%"></stop>
+    </linearGradient>
+  </defs>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="首页(新调整)" transform="translate(-614.000000, -840.000000)" fill="url(#linearGradient-1)" fill-rule="nonzero">
+      <g id="fenxi6" transform="translate(614.000000, 840.000000)">
+        <path d="M5.33458333,0 C2.39396701,0.0132303008 0.0134584094,2.3533913 0,5.24416667 L0,52.7558333 C0,55.6521066 2.38837431,58 5.33458333,58 L53.6654167,58 C56.606033,57.9867697 58.9865416,55.6466087 59,52.7558333 L59,5.24416667 C58.9865416,2.3533913 56.606033,0.0132303008 53.6654167,0 L5.33458333,0 Z M37.09625,35.38 C36.6299107,35.8919958 35.9638834,36.1845942 35.2647917,36.1845942 C34.5656999,36.1845942 33.8996726,35.8919958 33.4333333,35.38 L25.1241667,26.9216667 L14.23375,37.9175 C13.7674107,38.4294958 13.1013834,38.7220942 12.4022917,38.7220942 C11.7031999,38.7220942 11.0371726,38.4294958 10.5708333,37.9175 C9.55001383,36.8705224 9.55001383,35.2186443 10.5708333,34.1716667 L23.2804167,21.3391667 C23.7467559,20.8271708 24.4127832,20.5345725 25.111875,20.5345725 C25.8109668,20.5345725 26.4769941,20.8271708 26.9433333,21.3391667 L35.2279167,29.7975 L44.6925,20.1308333 C45.3192445,19.4719042 46.2671444,19.2109907 47.1508333,19.4541667 C48.058065,19.7083878 48.759939,20.416765 48.9945833,21.315 C49.2258826,22.2209293 48.9656998,23.1800778 48.30625,23.8525 L37.09625,35.38 Z" id="形状"></path>
+      </g>
+    </g>
+  </g>
+</svg>

+ 17 - 0
static/icons/assessment-ranking-icon.svg

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="59px" height="59px" viewBox="0 0 59 59" version="1.1">
+  <title>gongzuokaohe_1</title>
+  <defs>
+    <linearGradient x1="20.0772761%" y1="0%" x2="88.0340112%" y2="100%" id="linearGradient-1">
+      <stop stop-color="#42B5F8" offset="0%"></stop>
+      <stop stop-color="#0383DC" offset="100%"></stop>
+    </linearGradient>
+  </defs>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="首页(新调整)" transform="translate(-429.000000, -840.000000)" fill="url(#linearGradient-1)" fill-rule="nonzero">
+      <g id="gongzuokaohe_1" transform="translate(429.000000, 840.000000)">
+        <path d="M38.4305701,58.9984054 L29.9979402,58.9984054 L29.9979402,50.4771223 L46.0283016,34.2812627 L54.4625097,42.8025459 L52.8100741,44.4720413 L38.4321483,59 L38.4305701,58.9984054 Z M32.7488431,56.2876679 L37.3794505,56.2876679 L32.7488431,51.6092538 L32.7488431,56.2876679 Z M16.0193136,58.9984054 L0,58.9984054 L0,0 L53.6607549,0 L53.6607549,20.9699468 L16.0319396,58.9984054 L16.0193136,58.9984054 Z M11.0478025,37.0844842 L29.0320466,37.0844842 L29.0320466,33.3819356 L11.0588503,33.3819356 L11.0478025,37.0844842 Z M11.0478025,25.9226237 L43.5393895,25.9226237 L43.5393895,22.2200752 L11.0588503,22.2200752 L11.0478025,25.9226237 Z M11.0478025,14.7607633 L43.5393895,14.7607633 L43.5393895,11.0582147 L11.0588503,11.0582147 L11.0478025,14.7607633 Z M48.3215098,31.7570877 L50.5531659,29.5023918 L59,38.0364314 L56.7683439,40.2927218 L48.3215098,31.7570877 Z" id="形状"></path>
+      </g>
+    </g>
+  </g>
+</svg>

+ 17 - 0
static/icons/emergency-disposal-icon.svg

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="70px" height="61px" viewBox="0 0 70 61" version="1.1">
+  <title>yingjipingtai</title>
+  <defs>
+    <linearGradient x1="20.285477%" y1="16.0510556%" x2="90.4116202%" y2="87.9693878%" id="linearGradient-1">
+      <stop stop-color="#FF7526" offset="0%"></stop>
+      <stop stop-color="#FF2939" offset="100%"></stop>
+    </linearGradient>
+  </defs>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="首页(新调整)" transform="translate(-453.000000, -1305.000000)" fill="url(#linearGradient-1)" fill-rule="nonzero">
+      <g id="yingjipingtai" transform="translate(453.000000, 1305.000000)">
+        <path d="M38.2608975,1.87661736 L69.4777496,55.2646323 C70.1657631,56.4413904 70.174546,57.8987481 69.5007663,59.0838128 C68.8269866,60.2688774 67.5738806,61 66.2168521,61 L3.78314794,61 C2.42611939,61 1.17301342,60.2688774 0.499233716,59.0838128 C-0.174545993,57.8987481 -0.165763075,56.4413904 0.522250404,55.2646323 L31.7391025,1.87661736 C32.4187222,0.713932629 33.6592847,0 35,0 C36.3407153,0 37.5812778,0.713932629 38.2608975,1.87661736 Z M35,15.330184 C32.9107378,15.330184 31.2170562,17.0341068 31.2170562,19.136002 L31.2170562,38.165092 C31.2170562,40.2669872 32.9107378,41.97091 35,41.97091 C37.0892622,41.97091 38.7829438,40.2669872 38.7829438,38.165092 L38.7829438,19.136002 C38.7829438,17.0341068 37.0892622,15.330184 35,15.330184 Z M35,53.388364 C36.3515157,53.388364 37.6003677,52.6629793 38.2761255,51.485455 C38.9518834,50.3079308 38.9518834,48.8571612 38.2761255,47.679637 C37.6003677,46.5021127 36.3515157,45.776728 35,45.776728 C32.9107379,45.776728 31.2170564,47.4806508 31.2170564,49.582546 C31.2170564,51.6844412 32.9107379,53.388364 35,53.388364 Z" id="形状"></path>
+      </g>
+    </g>
+  </g>
+</svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 12 - 0
static/icons/performance-analysis-icon.svg


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 12 - 0
static/icons/performance-ranking-icon.svg


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 12 - 0
static/icons/shift-scheduling-icon.svg


Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä