Browse Source

驾驶舱个人-排名查询添加日期查询

wanglt 1 week ago
parent
commit
1c1a55bf3b

+ 9 - 1
ygtx-gxt/src/main/java/com/ygtx/gxt/controller/GxtRepairOrderController.java

@@ -419,6 +419,7 @@ public class GxtRepairOrderController extends BaseController
     {
         GxtOrderData result = gxtRepairOrderService.selectHomePageData();
         result.setNickName(SecurityUtils.getLoginUser().getUser().getNickName());
+        result.setUserId(SecurityUtils.getUserId());
         result.setRepairPending(gxtRepairOrderService.getUnfinishedOrder());
         result.setWorkPending(gxtWorkOrderService.getUnfinishedOrder());
         result.setHasCenter(gxtWorkOrderService.hasCenter());
@@ -433,6 +434,13 @@ public class GxtRepairOrderController extends BaseController
         return success(result);
     }
 
+    @GetMapping(value = "/selectCompanyRank")
+    @ApiOperation("获取排名数据")
+    public AjaxResult selectCompanyRank(GxtUserScore userScore)
+    {
+        return success(gxtRepairOrderService.getCompanyRankingList(userScore));
+    }
+
     /**
      * 导出排名列表
      */
@@ -443,7 +451,7 @@ public class GxtRepairOrderController extends BaseController
         Calendar calendar = Calendar.getInstance();
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
         String monthPeriod = sdf.format(calendar.getTime());
-        List<GxtUserScore> list = gxtRepairOrderService.getCompanyRankingList();
+        List<GxtUserScore> list = gxtRepairOrderService.getCompanyRankingList(userScore);
         List<GxtCompanyRankingVo> ranks = new ArrayList<>();
         int currentRank = 1; // 当前排名
         BigDecimal prevScore = null;

+ 20 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/domain/GxtUserScore.java

@@ -93,6 +93,10 @@ public class GxtUserScore extends BaseEntity
 
     private String rankPermission;
 
+    private Date dateFrom;
+
+    private Date dateTo;
+
     public String getRankPermission() {
         return rankPermission;
     }
@@ -292,6 +296,22 @@ public class GxtUserScore extends BaseEntity
         this.companyName = companyName;
     }
 
+    public Date getDateFrom() {
+        return dateFrom;
+    }
+
+    public void setDateFrom(Date dateFrom) {
+        this.dateFrom = dateFrom;
+    }
+
+    public Date getDateTo() {
+        return dateTo;
+    }
+
+    public void setDateTo(Date dateTo) {
+        this.dateTo = dateTo;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 1 - 1
ygtx-gxt/src/main/java/com/ygtx/gxt/service/IGxtRepairOrderService.java

@@ -312,7 +312,7 @@ public interface IGxtRepairOrderService
      */
     public void completePendingOrderDeductionData(GxtRepairOrder repairOrder);
 
-    public List<GxtUserScore> getCompanyRankingList();
+    public List<GxtUserScore> getCompanyRankingList(GxtUserScore userScore);
 
     /**
      * 添加维修工单人员

+ 4 - 2
ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtRepairOrderServiceImpl.java

@@ -2254,16 +2254,19 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
         if (StringUtil.isNotEmpty(permission)) {
             GxtUserScore userScoreC = new GxtUserScore();
             userScoreC.setPermission(permission);
+            userScoreC.setStatus(0);
             List<GxtUserScore> scoreCompany = gxtRepairOrderMapper.selectHomePageRank(userScoreC);
             Integer companySort = getSort(scoreCompany,userId);
             GxtUserScore userScoreCenter = new GxtUserScore();
             userScoreCenter.setPermission(permission);
             userScoreCenter.setCenterId(centerId);
+            userScoreCenter.setStatus(0);
             List<GxtUserScore> scoreCenter = gxtRepairOrderMapper.selectHomePageRank(userScoreCenter);
             Integer centerSort = getSort(scoreCenter,userId);
             GxtUserScore userScoreD = new GxtUserScore();
             userScoreD.setPermission(permission);
             userScoreD.setDeptId(deptId);
+            userScoreD.setStatus(0);
             List<GxtUserScore> scoreDept = gxtRepairOrderMapper.selectHomePageRank(userScoreD);
             Integer deptSort = getSort(scoreDept,userId);
             result.setScoreCompany(scoreCompany);
@@ -3130,11 +3133,10 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
         }
     }
 
-    public List<GxtUserScore> getCompanyRankingList() {
+    public List<GxtUserScore> getCompanyRankingList(GxtUserScore userScore) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         String permission = getJXY(loginUser.getUsername());
         if (StringUtil.isNotEmpty(permission)) {
-            GxtUserScore userScore = new GxtUserScore();
             userScore.setPermission(permission);
             return gxtRepairOrderMapper.selectHomePageRank(userScore);
         }

+ 30 - 3
ygtx-gxt/src/main/resources/mapper/gxt/GxtRepairOrderMapper.xml

@@ -143,6 +143,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="center" column="center"/>
         <result property="companyName" column="companyName"/>
         <result property="permission" column="permission"/>
+        <result property="status" column="status"/>
+        <result property="dateFrom" column="dateFrom"/>
+        <result property="dateTo" column="dateTo"/>
     </resultMap>
 
     <sql id="selectGxtRepairOrderVo">
@@ -966,9 +969,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             IFNULL(us.final_score,0) AS final_score
         FROM
             sys_user u
-                LEFT JOIN sys_dept d ON u.dept_id = d.dept_id
-                LEFT JOIN sys_dept p ON d.parent_id = p.dept_id
-                LEFT JOIN (SELECT month_period,user_name,SUM(final_score) AS final_score FROM gxt_user_score GROUP BY month_period,user_name) us ON u.user_name = us.user_name AND us.month_period = DATE_FORMAT(CURDATE(), '%Y-%m')
+        LEFT JOIN sys_dept d ON u.dept_id = d.dept_id
+        LEFT JOIN sys_dept p ON d.parent_id = p.dept_id
+        LEFT JOIN (
+            SELECT
+                SUM( score ) AS final_score,
+                user_id
+            FROM
+                gxt_order_score_detail
+            WHERE 1=1
+                <if test="status != null">
+                    AND status = #{status}
+                </if>
+                <if test="dateFrom == null and dateTo == null and monthPeriod == null">
+                    AND DATE_FORMAT(create_time, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m')
+                </if>
+                <if test="monthPeriod != null and monthPeriod != ''">
+                    AND DATE_FORMAT(create_time, '%Y-%m') = #{monthPeriod}
+                </if>
+                <if test="dateFrom != null">
+                    AND create_time >= #{dateFrom}
+                </if>
+                <if test="dateTo != null">
+                    AND #{dateTo} >= create_time
+                </if>
+            GROUP BY
+                user_id
+        ) us ON u.user_id = us.user_id
         WHERE 1=1
         <if test="deptId != null">
             AND d.dept_id=#{deptId}

+ 9 - 0
ygtx-ui/src/api/gxt/repairOrder.js

@@ -178,6 +178,15 @@ export function selectHomePageData() {
   })
 }
 
+// 查询首页工单统计数据
+export function selectCompanyRank(query) {
+  return request({
+    url: '/gxt/repairOrder/selectCompanyRank',
+    method: 'get',
+    params: query
+  })
+}
+
 // 退回维修工单
 export function returnRepairOrder(data) {
   return request({

+ 1 - 0
ygtx-ui/src/views/gxt/monthScore/scoreDetail.vue

@@ -86,6 +86,7 @@ export default {
       });
     },
     getItemValue() {
+      this.queryParams.pageNum = 1;
       this.queryParams.userName = sessionStorage.getItem('userName');
       this.queryParams.nickName = sessionStorage.getItem('nickName');
       this.queryParams.finishDate = sessionStorage.getItem('finishDate');

+ 114 - 27
ygtx-ui/src/views/index5.vue

@@ -275,10 +275,38 @@
                 v-model="rankingSearchQuery"
                 placeholder="搜索..."
                 @keyup.enter="handleRankingSearch"
-                style="width: 300px;"
+                style="width: 150px;"
                 prefix-icon="search"
                 clearable
               />
+              <!-- 月份选择器(日期选择器样式) -->
+              <el-date-picker
+                v-if="!isCustomDate"
+                v-model="selectedMonth"
+                type="month"
+                placeholder="选择月份"
+                value-format="YYYY-MM"
+                style="width:150px;margin: 0 10px;"
+                @change="onMonthChange"
+              />
+
+              <!-- 自定义日期范围 -->
+              <el-date-picker
+                v-else
+                v-model="dateRange"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="YYYY-MM-DD"
+                style="margin: 0 10px;"
+                @change="onDateRangeChange"
+              />
+
+              <!-- 切换按钮 -->
+              <el-button @click="toggleCustomDate">
+                {{ isCustomDate ? '返回' : '自定义' }}
+              </el-button>
               <el-button type="primary" @click="handleExportRank">
                 <i class="fa fa-download" style="margin-right: 8px;"></i>导出
               </el-button>
@@ -288,7 +316,7 @@
                 <el-table-column prop="rank" label="排名" width="80" align="center"></el-table-column>
                 <el-table-column prop="name" label="名字" width="120" align="center">
                   <template #default="scope">
-                    <span :style="{ color: scope.row.name === homePageData.nickName && scope.row.rank === currentSort ? 'red' : '' }">{{ scope.row.name }}</span>
+                    <span :style="{ color: scope.row.userId === homePageData.userId ? 'red' : '' }">{{ scope.row.name }}</span>
                   </template>
                 </el-table-column>
                 <el-table-column prop="station" label="场站" align="center"></el-table-column>
@@ -302,8 +330,7 @@
 </template>
 
 <script>
-import { ref, reactive } from 'vue';
-import { selectHomePageData } from '@/api/gxt/repairOrder';
+import { selectHomePageData, selectCompanyRank } from '@/api/gxt/repairOrder';
 import { listMyTodo } from '@/api/gxt/orderMine';
 import { listGxtOrderPerson } from '@/api/gxt/gxtOrderPerson';
 import { encryptParams } from '@/utils/encrypt';
@@ -325,9 +352,21 @@ export default {
         orderCode: null,
         status: 0
       },
+      // 个人公司排名相关参数
+      queryRank: {
+        dateFrom: null,
+        dateTo: null,
+        monthPeriod: null,
+        status: 0
+      },
+      isCustomDate: false,
+      monthList: [],
+      selectedMonth: null,
+      dateRange: [],
       companyExport: false,
       rankingSearchQuery: '',
       companyRankList: [],
+      // 个人公司排名相关参数结束
       orderPersonList: [],
       // 添加首页统计数据
       homePageData: {
@@ -375,6 +414,48 @@ export default {
     }, 3000);
   },
   methods: {
+    // 月份选择变化
+    onMonthChange() {
+      if (!this.selectedMonth) return;
+      this.queryRank.monthPeriod = this.selectedMonth;
+      this.queryRank.dateFrom = null;
+      this.queryRank.dateTo = null;
+      selectCompanyRank(this.queryRank).then(response => {
+        if (response.code === 200) {
+          this.homePageData.scoreCompany = response.data || [];
+          let rankingData = [...this.homePageData.scoreCompany];
+          this.getCurrentRankingData(rankingData);
+        }
+      });
+    },
+
+    // 日期范围变化
+    onDateRangeChange() {
+      if (!this.dateRange || this.dateRange.length < 2) return;
+      const start = this.dateRange[0] + ' 00:00:00';
+      const end = this.dateRange[1] + ' 23:59:59';
+      this.queryRank.dateFrom = start;
+      this.queryRank.dateTo = end;
+      this.queryRank.monthPeriod = null;
+      selectCompanyRank(this.queryRank).then(response => {
+        if (response.code === 200) {
+          this.homePageData.scoreCompany = response.data || [];
+          let rankingData = [...this.homePageData.scoreCompany];
+          this.getCurrentRankingData(rankingData);
+        }
+      });
+    },
+
+    // 切换 月份选择 / 自定义日期
+    toggleCustomDate() {
+      this.isCustomDate = !this.isCustomDate;
+      if (this.isCustomDate) {
+        this.selectedMonth = null;
+      } else {
+        this.dateRange = [];
+        this.onMonthChange();
+      }
+    },
     // 在组件销毁前清除定时器
     beforeDestroy() {
       if (this.timer) {
@@ -424,36 +505,39 @@ export default {
           rankingData = [...this.homePageData.scoreCompany];
         }
 
-        // 按finalScore降序排序
-        rankingData.sort((a, b) => (b.finalScore || 0) - (a.finalScore || 0));
-
-        // 实现RANK模式排名
-        const rankedData = [];
-        rankingData.forEach((item, index) => {
-          // 计算RANK排名
-          let rank = index + 1;
-          // 如果当前项的finalScore与前一项相同,则排名也相同
-          if (index > 0 && item.finalScore === rankingData[index - 1].finalScore) {
-            rank = rankedData[index - 1].rank;
-          }
+        this.getCurrentRankingData(rankingData);
+      }
+    },
+    getCurrentRankingData(rankingData) {
+      // 按finalScore降序排序
+      rankingData.sort((a, b) => (b.finalScore || 0) - (a.finalScore || 0));
+
+      // 实现RANK模式排名
+      const rankedData = [];
+      rankingData.forEach((item, index) => {
+        // 计算RANK排名
+        let rank = index + 1;
+        // 如果当前项的finalScore与前一项相同,则排名也相同
+        if (index > 0 && item.finalScore === rankingData[index - 1].finalScore) {
+          rank = rankedData[index - 1].rank;
+        }
 
-          rankedData.push({
-            rank: rank,
-            name: item.nickName,
-            station: item.deptName,
-            finalScore: item.finalScore || 0
-          });
+        rankedData.push({
+          userId: item.userId,
+          rank: rank,
+          name: item.nickName,
+          station: item.deptName,
+          finalScore: item.finalScore || 0
         });
+      });
 
-        this.companyRankList = rankedData;
-        this.currentRankingData = rankedData;
-      }
+      this.companyRankList = rankedData;
+      this.currentRankingData = rankedData;
     },
     applyFilter() {
       // 获取工单人员列表数据
       listGxtOrderPerson(this.queryParams).then(response => {
         if (response.code === 200) {
-          console.log(response.rows);
           this.total = response.total;
           this.orderPersonList = response.rows;
         }
@@ -477,6 +561,7 @@ export default {
       selectHomePageData().then(response => {
         if (response.code === 200) {
           this.homePageData.nickName = response.data.nickName;
+          this.homePageData.userId = response.data.userId;
           this.homePageData.workOrderNum = response.data.workOrderNum || 0;
           this.homePageData.workOrderJsy = response.data.workOrderJsy || 0;
           this.homePageData.repairOrderNum = response.data.repairOrderNum || 0;
@@ -491,7 +576,9 @@ export default {
           this.homePageData.pendingNum = this.homePageData.repairPending + this.homePageData.workPending;
           this.homePageData.hasCenter = response.data.hasCenter;
           this.homePageData.timeOutNum = response.data.timeOutNum;
-          this.homePageData.scoreCompany = response.data.scoreCompany || [];
+          if (this.queryRank.dateFrom == null && this.queryRank.dateTo == null && this.queryRank.monthPeriod == null) {
+            this.homePageData.scoreCompany = response.data.scoreCompany || [];
+          }
           this.homePageData.companySort = response.data.companySort || 0;
           this.homePageData.scoreCenter = response.data.scoreCenter || [];
           this.homePageData.centerSort = response.data.centerSort || 0;

+ 117 - 28
ygtx-ui/src/views/index6.vue

@@ -275,10 +275,38 @@
                 v-model="rankingSearchQuery"
                 placeholder="搜索..."
                 @keyup.enter="handleRankingSearch"
-                style="width: 300px;"
+                style="width: 150px;"
                 prefix-icon="search"
                 clearable
               />
+              <!-- 月份选择器(日期选择器样式) -->
+              <el-date-picker
+                  v-if="!isCustomDate"
+                  v-model="selectedMonth"
+                  type="month"
+                  placeholder="选择月份"
+                  value-format="YYYY-MM"
+                  style="width:150px;margin: 0 10px;"
+                  @change="onMonthChange"
+              />
+
+              <!-- 自定义日期范围 -->
+              <el-date-picker
+                  v-else
+                  v-model="dateRange"
+                  type="daterange"
+                  range-separator="至"
+                  start-placeholder="开始日期"
+                  end-placeholder="结束日期"
+                  value-format="YYYY-MM-DD"
+                  style="margin: 0 10px;"
+                  @change="onDateRangeChange"
+              />
+
+              <!-- 切换按钮 -->
+              <el-button @click="toggleCustomDate">
+                {{ isCustomDate ? '返回' : '自定义' }}
+              </el-button>
               <el-button type="primary" @click="handleExportRank">
                 <i class="fa fa-download" style="margin-right: 8px;"></i>导出
               </el-button>
@@ -288,7 +316,7 @@
                 <el-table-column prop="rank" label="排名" width="80" align="center"></el-table-column>
                 <el-table-column prop="name" label="名字" width="120" align="center">
                   <template #default="scope">
-                    <span :style="{ color: scope.row.name === homePageData.nickName && scope.row.rank === currentSort ? 'red' : '' }">{{ scope.row.name }}</span>
+                    <span :style="{ color: scope.row.userId === homePageData.userId ? 'red' : '' }">{{ scope.row.name }}</span>
                   </template>
                 </el-table-column>
                 <el-table-column prop="station" label="场站" align="center"></el-table-column>
@@ -302,8 +330,7 @@
 </template>
 
 <script>
-import { ref, reactive } from 'vue';
-import { selectHomePageData } from '@/api/gxt/repairOrder';
+import {selectCompanyRank, selectHomePageData} from '@/api/gxt/repairOrder';
 import { listMyTodo } from '@/api/gxt/orderMine';
 import { listGxtOrderPerson } from '@/api/gxt/gxtOrderPerson';
 import { encryptParams } from '@/utils/encrypt';
@@ -325,9 +352,21 @@ export default {
         orderCode: null,
         status: 0
       },
+      // 个人公司排名相关参数
+      queryRank: {
+        dateFrom: null,
+        dateTo: null,
+        monthPeriod: null,
+        status: 0
+      },
+      isCustomDate: false,
+      monthList: [],
+      selectedMonth: null,
+      dateRange: [],
       companyExport: false,
       rankingSearchQuery: '',
       companyRankList: [],
+      // 个人公司排名相关参数结束
       orderPersonList: [],
       // 添加首页统计数据
       homePageData: {
@@ -375,6 +414,48 @@ export default {
     }, 3000);
   },
   methods: {
+    // 月份选择变化
+    onMonthChange() {
+      if (!this.selectedMonth) return;
+      this.queryRank.monthPeriod = this.selectedMonth;
+      this.queryRank.dateFrom = null;
+      this.queryRank.dateTo = null;
+      selectCompanyRank(this.queryRank).then(response => {
+        if (response.code === 200) {
+          this.homePageData.scoreCompany = response.data || [];
+          let rankingData = [...this.homePageData.scoreCompany];
+          this.getCurrentRankingData(rankingData);
+        }
+      });
+    },
+
+    // 日期范围变化
+    onDateRangeChange() {
+      if (!this.dateRange || this.dateRange.length < 2) return;
+      const start = this.dateRange[0] + ' 00:00:00';
+      const end = this.dateRange[1] + ' 23:59:59';
+      this.queryRank.dateFrom = start;
+      this.queryRank.dateTo = end;
+      this.queryRank.monthPeriod = null;
+      selectCompanyRank(this.queryRank).then(response => {
+        if (response.code === 200) {
+          this.homePageData.scoreCompany = response.data || [];
+          let rankingData = [...this.homePageData.scoreCompany];
+          this.getCurrentRankingData(rankingData);
+        }
+      });
+    },
+
+    // 切换 月份选择 / 自定义日期
+    toggleCustomDate() {
+      this.isCustomDate = !this.isCustomDate;
+      if (this.isCustomDate) {
+        this.selectedMonth = null;
+      } else {
+        this.dateRange = [];
+        this.onMonthChange();
+      }
+    },
     // 在组件销毁前清除定时器
     beforeDestroy() {
       if (this.timer) {
@@ -423,32 +504,36 @@ export default {
           this.currentSort = this.homePageData.companySort;
           rankingData = [...this.homePageData.scoreCompany];
         }
-        
-        // 按finalScore降序排序
-        rankingData.sort((a, b) => (b.finalScore || 0) - (a.finalScore || 0));
-        
-        // 实现RANK模式排名
-        const rankedData = [];
-        rankingData.forEach((item, index) => {
-          // 计算RANK排名
-          let rank = index + 1;
-          // 如果当前项的finalScore与前一项相同,则排名也相同
-          if (index > 0 && item.finalScore === rankingData[index - 1].finalScore) {
-            rank = rankedData[index - 1].rank;
-          }
-          
-          rankedData.push({
-            rank: rank,
-            name: item.nickName,
-            station: item.deptName,
-            finalScore: item.finalScore || 0
-          });
-        });
 
-        this.companyRankList = rankedData;
-        this.currentRankingData = rankedData;
+        this.getCurrentRankingData(rankingData);
       }
     },
+    getCurrentRankingData(rankingData) {
+      // 按finalScore降序排序
+      rankingData.sort((a, b) => (b.finalScore || 0) - (a.finalScore || 0));
+
+      // 实现RANK模式排名
+      const rankedData = [];
+      rankingData.forEach((item, index) => {
+        // 计算RANK排名
+        let rank = index + 1;
+        // 如果当前项的finalScore与前一项相同,则排名也相同
+        if (index > 0 && item.finalScore === rankingData[index - 1].finalScore) {
+          rank = rankedData[index - 1].rank;
+        }
+
+        rankedData.push({
+          userId: item.userId,
+          rank: rank,
+          name: item.nickName,
+          station: item.deptName,
+          finalScore: item.finalScore || 0
+        });
+      });
+
+      this.companyRankList = rankedData;
+      this.currentRankingData = rankedData;
+    },
     applyFilter() {
       // 获取工单人员列表数据
       listGxtOrderPerson(this.queryParams).then(response => {
@@ -476,6 +561,7 @@ export default {
       selectHomePageData().then(response => {
         if (response.code === 200) {
           this.homePageData.nickName = response.data.nickName;
+          this.homePageData.userId = response.data.userId;
           this.homePageData.workOrderNum = response.data.workOrderNum || 0;
           this.homePageData.workOrderJsy = response.data.workOrderJsy || 0;
           this.homePageData.repairOrderNum = response.data.repairOrderNum || 0;
@@ -490,7 +576,10 @@ export default {
           this.homePageData.pendingNum = this.homePageData.repairPending + this.homePageData.workPending;
           this.homePageData.hasCenter = response.data.hasCenter;
           this.homePageData.timeOutNum = response.data.timeOutNum;
-          this.homePageData.scoreCompany = response.data.scoreCompany || [];
+
+          if (this.queryRank.dateFrom == null && this.queryRank.dateTo == null && this.queryRank.monthPeriod == null) {
+            this.homePageData.scoreCompany = response.data.scoreCompany || [];
+          }
           this.homePageData.companySort = response.data.companySort || 0;
           this.homePageData.scoreCenter = response.data.scoreCenter || [];
           this.homePageData.centerSort = response.data.centerSort || 0;