|
|
@@ -28,6 +28,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.validation.BindingResult;
|
|
|
import org.springframework.web.bind.annotation.RequestBody;
|
|
|
import org.springframework.web.bind.annotation.RequestHeader;
|
|
|
+import org.springframework.web.bind.annotation.RequestParam;
|
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
@@ -2502,6 +2503,9 @@ public class RepairRecordController implements RepairRecordControllerAPI {
|
|
|
IPage<MaintenanceWorkerVo> page = new Page();
|
|
|
BeanUtils.copyProperties(repairReceivingListPage,page);
|
|
|
|
|
|
+ IPage<MaintenanceWorkerVo> page = new Page();
|
|
|
+ BeanUtils.copyProperties(repairReceivingListPage,page);
|
|
|
+
|
|
|
LambdaQueryWrapper<RepairReceiving> wrapperReceiving2 = new LambdaQueryWrapper<>();
|
|
|
wrapperReceiving2.between(ObjectUtils.isNotEmpty(startTime), RepairReceiving::getReceivingTime, startTime, endTime);
|
|
|
wrapperReceiving2.isNotNull(RepairReceiving::getFinishTime);
|
|
|
@@ -2781,6 +2785,7 @@ public class RepairRecordController implements RepairRecordControllerAPI {
|
|
|
String endTime = DateUtils.endTime();
|
|
|
|
|
|
ArrayList<MaintenanceWorkerVo> vos = new ArrayList<>();
|
|
|
+<<<<<<< HEAD
|
|
|
|
|
|
// 导出
|
|
|
Workbook workbook = new XSSFWorkbook();
|
|
|
@@ -2880,6 +2885,299 @@ public class RepairRecordController implements RepairRecordControllerAPI {
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+=======
|
|
|
+
|
|
|
+ // 导出
|
|
|
+ Workbook workbook = new XSSFWorkbook();
|
|
|
+ Sheet sheet = workbook.createSheet("维修师傅效率统计");
|
|
|
+ Row headerRow = sheet.createRow(0);
|
|
|
+ headerRow.createCell(0).setCellValue("序号");
|
|
|
+ headerRow.createCell(1).setCellValue("校区");
|
|
|
+ headerRow.createCell(2).setCellValue("姓名");
|
|
|
+ headerRow.createCell(3).setCellValue("工单总数");
|
|
|
+ headerRow.createCell(4).setCellValue("好评率");
|
|
|
+ headerRow.createCell(5).setCellValue("超时率");
|
|
|
+ headerRow.createCell(6).setCellValue("平均响应时长(分)");
|
|
|
+ headerRow.createCell(7).setCellValue("平均维修时长(分)");
|
|
|
+ headerRow.createCell(8).setCellValue("耗材总费用(元)");
|
|
|
+
|
|
|
+
|
|
|
+ LambdaQueryWrapper<RepairReceiving> wrapperReceiving = new LambdaQueryWrapper<>();
|
|
|
+ wrapperReceiving.between(ObjectUtils.isNotEmpty(startTime), RepairReceiving::getReceivingTime, startTime, endTime);
|
|
|
+ wrapperReceiving.isNotNull(RepairReceiving::getFinishTime);
|
|
|
+ List<RepairReceiving> repairReceivingList = repairReceivingService.list(wrapperReceiving);
|
|
|
+
|
|
|
+ if (ObjectUtils.isNotEmpty(repairReceivingList)&&repairReceivingList.size()>0) {
|
|
|
+
|
|
|
+
|
|
|
+ ArrayList<Integer> userList = new ArrayList<>();
|
|
|
+
|
|
|
+ ArrayList<Integer> recordList = new ArrayList<>();
|
|
|
+
|
|
|
+// 接单总次数
|
|
|
+ HashMap<Integer, List<Integer>> receivingCountMap = new HashMap<>();
|
|
|
+
|
|
|
+// 维修超时次数
|
|
|
+ Map<Integer, Integer> maintainTimeOutMap = new HashMap<>();
|
|
|
+
|
|
|
+// 维修总时长
|
|
|
+ Map<Integer, Long> maintainMap = new HashMap<>();
|
|
|
+
|
|
|
+
|
|
|
+ for (RepairReceiving repairReceiving : repairReceivingList) {
|
|
|
+ Date finishTime = repairReceiving.getFinishTime();
|
|
|
+
|
|
|
+ if (ObjectUtils.isEmpty(finishTime)) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer userId = repairReceiving.getUserId();
|
|
|
+ userList.add(userId);
|
|
|
+
|
|
|
+ Integer recordId = repairReceiving.getRecordId();
|
|
|
+ recordList.add(recordId);
|
|
|
+
|
|
|
+ if (receivingCountMap.containsKey(userId)) {
|
|
|
+// 总次数
|
|
|
+ List<Integer> list = receivingCountMap.get(userId);
|
|
|
+ list.add(recordId);
|
|
|
+ receivingCountMap.put(userId, list);
|
|
|
+ } else {
|
|
|
+ ArrayList<Integer> list = new ArrayList<>();
|
|
|
+ list.add(recordId);
|
|
|
+ receivingCountMap.put(userId, list);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+// 接单时间
|
|
|
+ long receivingTime = repairReceiving.getReceivingTime().getTime();
|
|
|
+// 考核时间(分)
|
|
|
+ Integer maintenanceAssessTime = repairReceiving.getMaintenanceAssessTime() * 1000 * 60;
|
|
|
+
|
|
|
+ long time = receivingTime + maintenanceAssessTime;
|
|
|
+
|
|
|
+// 完成时间
|
|
|
+ long finishTimeTime = finishTime.getTime();
|
|
|
+
|
|
|
+// 实际完成时间大于接单时间加考核时间为超时
|
|
|
+ if (finishTimeTime > time) {
|
|
|
+ if (maintainTimeOutMap.containsKey(userId)) {
|
|
|
+// 次数
|
|
|
+ Integer count = maintainTimeOutMap.get(userId);
|
|
|
+ count = count + 1;
|
|
|
+ maintainTimeOutMap.put(userId, count);
|
|
|
+ } else {
|
|
|
+ maintainTimeOutMap.put(userId, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+// 维修时长=完成时间-接单时间(分)
|
|
|
+ long maintainTime = finishTimeTime - receivingTime;
|
|
|
+ maintainTime = maintainTime / 1000 / 60;
|
|
|
+
|
|
|
+ if (maintainMap.containsKey(userId)) {
|
|
|
+// 维修时长
|
|
|
+ Long maintainTotalTime = maintainMap.get(userId);
|
|
|
+ maintainTotalTime = maintainTotalTime + maintainTime;
|
|
|
+ maintainMap.put(userId, maintainTotalTime);
|
|
|
+ } else {
|
|
|
+ maintainMap.put(userId, maintainTime);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 接单总次数
|
|
|
+ HashMap<Integer, List<Integer>> sendCountMap = new HashMap<>();
|
|
|
+
|
|
|
+// 接单超时次数
|
|
|
+ Map<Integer, Integer> sendTimeOutMap = new HashMap<>();
|
|
|
+
|
|
|
+// 接单总时长
|
|
|
+ Map<Integer, Long> sendMap = new HashMap<>();
|
|
|
+
|
|
|
+
|
|
|
+ LambdaQueryWrapper<RepairDispatchRecord> rdrsWrapper = new LambdaQueryWrapper<>();
|
|
|
+ rdrsWrapper.in(RepairDispatchRecord::getRecordId, recordList)
|
|
|
+ .isNotNull(RepairDispatchRecord::getReceivingTime);
|
|
|
+
|
|
|
+
|
|
|
+ List<RepairDispatchRecord> repairDispatchRecords = repairDispatchRecordService.list(rdrsWrapper);
|
|
|
+ for (RepairDispatchRecord repairDispatchRecord : repairDispatchRecords) {
|
|
|
+// 派单时间
|
|
|
+ long sendTime = repairDispatchRecord.getAssignedTime().getTime();
|
|
|
+// 接单考核时间
|
|
|
+ Integer acceptanceAssessTime = repairDispatchRecord.getAcceptanceAssessTime() * 1000 * 60;
|
|
|
+
|
|
|
+ long time = sendTime + acceptanceAssessTime;
|
|
|
+
|
|
|
+// 接单时间
|
|
|
+ long receivingTime = repairDispatchRecord.getReceivingTime().getTime();
|
|
|
+// 接单人
|
|
|
+ Integer usersId = repairDispatchRecord.getUsersId();
|
|
|
+ Integer recordId = repairDispatchRecord.getRecordId();
|
|
|
+
|
|
|
+ if (sendCountMap.containsKey(usersId)) {
|
|
|
+ List<Integer> integers = sendCountMap.get(usersId);
|
|
|
+ integers.add(recordId);
|
|
|
+ sendCountMap.put(usersId, integers);
|
|
|
+ } else {
|
|
|
+ ArrayList<Integer> integers = new ArrayList<>();
|
|
|
+ sendCountMap.put(usersId, integers);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+// 实际完成时间大于接单时间加考核时间为超时
|
|
|
+ if (receivingTime > time) {
|
|
|
+ if (sendTimeOutMap.containsKey(usersId)) {
|
|
|
+// 次数
|
|
|
+ Integer count = sendTimeOutMap.get(usersId);
|
|
|
+ count = count + 1;
|
|
|
+ sendTimeOutMap.put(usersId, count);
|
|
|
+ } else {
|
|
|
+ sendTimeOutMap.put(usersId, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+// 接单时长=接单时间-派单时间(分)
|
|
|
+ Long orderReceivingTime = receivingTime - sendTime;
|
|
|
+ orderReceivingTime = orderReceivingTime / 1000 / 60;
|
|
|
+
|
|
|
+ if (sendMap.containsKey(usersId)) {
|
|
|
+// 接单总时长
|
|
|
+ Long sendTotalTime = sendMap.get(usersId);
|
|
|
+ sendTotalTime = sendTotalTime + orderReceivingTime;
|
|
|
+ sendMap.put(usersId, sendTotalTime);
|
|
|
+ } else {
|
|
|
+ sendMap.put(usersId, orderReceivingTime);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ LambdaQueryWrapper<RepairUser> userWrapper = new LambdaQueryWrapper<>();
|
|
|
+ userWrapper.in(RepairUser::getId, userList);
|
|
|
+
|
|
|
+ List<RepairUser> users = repairUserService.list(userWrapper);
|
|
|
+
|
|
|
+
|
|
|
+ Wrapper<RepairSchool> schoolWrapper = new LambdaQueryWrapper<>();
|
|
|
+ List<RepairSchool> schoolList = repairSchoolService.list(schoolWrapper);
|
|
|
+
|
|
|
+
|
|
|
+ users.forEach(repairUser -> {
|
|
|
+ MaintenanceWorkerVo maintenanceWorkerVo = new MaintenanceWorkerVo();
|
|
|
+// 名字
|
|
|
+ maintenanceWorkerVo.setName(repairUser.getUserName());
|
|
|
+
|
|
|
+// 学校
|
|
|
+ Integer schoolId = repairUser.getSchoolId();
|
|
|
+ for (RepairSchool repairSchool : schoolList) {
|
|
|
+ Integer id = repairSchool.getId();
|
|
|
+ if (id.equals(schoolId)) {
|
|
|
+ maintenanceWorkerVo.setSchoolName(repairSchool.getName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer id = repairUser.getId();
|
|
|
+// 工单集合
|
|
|
+ List<Integer> recordsList = receivingCountMap.get(id);
|
|
|
+ int size = recordsList.size();
|
|
|
+ BigDecimal b = new BigDecimal(size);
|
|
|
+
|
|
|
+// 工单总数
|
|
|
+ maintenanceWorkerVo.setWorkOrderTotal(size);
|
|
|
+
|
|
|
+// 超时率
|
|
|
+ if (maintainTimeOutMap.containsKey(id)) {
|
|
|
+ Integer integer = maintainTimeOutMap.get(id);
|
|
|
+ BigDecimal a = new BigDecimal(integer);
|
|
|
+ BigDecimal c = b;
|
|
|
+// 接单
|
|
|
+ if (sendTimeOutMap.containsKey(id)) {
|
|
|
+ Integer integer1 = sendTimeOutMap.get(id);
|
|
|
+ BigDecimal bigDecimal = new BigDecimal(integer1);
|
|
|
+ a = a.add(bigDecimal);
|
|
|
+ List<Integer> integers = sendCountMap.get(id);
|
|
|
+ c = c.add(new BigDecimal(integers.size()));
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal bigDecimal = a.divide(c, 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ BigDecimal multiply = bigDecimal.multiply(new BigDecimal(100));
|
|
|
+ maintenanceWorkerVo.setTimeOut(multiply + "%");
|
|
|
+ }
|
|
|
+
|
|
|
+// 平均维修时间
|
|
|
+ Long aLong = maintainMap.get(id);
|
|
|
+ BigDecimal bigDecimal = new BigDecimal(aLong);
|
|
|
+ BigDecimal maintain = bigDecimal.divide(b, 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ maintenanceWorkerVo.setMaintain(maintain);
|
|
|
+
|
|
|
+ // 平均响应时长
|
|
|
+ if (sendMap.containsKey(id)) {
|
|
|
+ Long aLong1 = sendMap.get(id);
|
|
|
+ BigDecimal bigDecimal1 = new BigDecimal(aLong1);
|
|
|
+ List<Integer> integers = sendCountMap.get(id);
|
|
|
+ BigDecimal bigDecimal2 = new BigDecimal(integers.size());
|
|
|
+ BigDecimal send = bigDecimal1.divide(bigDecimal2, 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ maintenanceWorkerVo.setAnswer(send);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+// 总费用
|
|
|
+ LambdaQueryWrapper<RepairRecord> recordWrapper = new LambdaQueryWrapper<>();
|
|
|
+ recordWrapper.in(RepairRecord::getId, recordsList);
|
|
|
+
|
|
|
+ List<RepairRecord> list = repairRecordService.list(recordWrapper);
|
|
|
+ BigDecimal totalPrice = new BigDecimal(0);
|
|
|
+ for (RepairRecord repairRecord : list) {
|
|
|
+ BigDecimal price = repairRecord.getPrice();
|
|
|
+ if (ObjectUtils.isNotEmpty(price)) {
|
|
|
+ totalPrice = totalPrice.add(price);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ maintenanceWorkerVo.setTotalPrice(totalPrice);
|
|
|
+
|
|
|
+// 好评率
|
|
|
+ LambdaQueryWrapper<RepairEvaluate> evaluateWrapper = new LambdaQueryWrapper<>();
|
|
|
+ evaluateWrapper.in(RepairEvaluate::getRecordId, recordsList);
|
|
|
+// 根据工单id来查询对应的评价
|
|
|
+ List<RepairEvaluate> repairEvaluates = repairEvaluateService.list(evaluateWrapper);
|
|
|
+ BigDecimal evaluatesDecimal = new BigDecimal(repairEvaluates.size());
|
|
|
+ BigDecimal satisfaction = new BigDecimal(0);
|
|
|
+ for (RepairEvaluate repairEvaluate : repairEvaluates) {
|
|
|
+ Integer star = repairEvaluate.getStar();
|
|
|
+ if (star > 3) {
|
|
|
+ satisfaction = satisfaction.add(new BigDecimal(1));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ BigDecimal degreePraise = satisfaction.divide(evaluatesDecimal, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
|
|
|
+ maintenanceWorkerVo.setDegreePraise(degreePraise + "%");
|
|
|
+
|
|
|
+
|
|
|
+ vos.add(maintenanceWorkerVo);
|
|
|
+ });
|
|
|
+
|
|
|
+ for (int i = 0; i < vos.size(); i++) {
|
|
|
+ MaintenanceWorkerVo vo = vos.get(i);
|
|
|
+ Row dataRow1 = sheet.createRow(i + 1);
|
|
|
+ dataRow1.createCell(0).setCellValue(i+1);
|
|
|
+ dataRow1.createCell(1).setCellValue(vo.getSchoolName());
|
|
|
+ dataRow1.createCell(2).setCellValue(vo.getName());
|
|
|
+ dataRow1.createCell(3).setCellValue(vo.getWorkOrderTotal());
|
|
|
+ dataRow1.createCell(4).setCellValue( vo.getDegreePraise());
|
|
|
+ dataRow1.createCell(5).setCellValue( vo.getTimeOut());
|
|
|
+ BigDecimal answer = vo.getAnswer();
|
|
|
+ if (ObjectUtils.isEmpty(answer)) {
|
|
|
+ answer=new BigDecimal(0);
|
|
|
+ }
|
|
|
+ dataRow1.createCell(6).setCellValue(answer.toString());
|
|
|
+ BigDecimal maintain = vo.getMaintain();
|
|
|
+ if (ObjectUtils.isEmpty(maintain)) {
|
|
|
+ maintain=new BigDecimal(0);
|
|
|
+ }
|
|
|
+>>>>>>> 50f552bf470c81eada92cf60360c8142077f19e6
|
|
|
|
|
|
|
|
|
// 接单总次数
|
|
|
@@ -2950,6 +3248,7 @@ public class RepairRecordController implements RepairRecordControllerAPI {
|
|
|
|
|
|
}
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
|
|
|
|
LambdaQueryWrapper<RepairUser> userWrapper = new LambdaQueryWrapper<>();
|
|
|
userWrapper.in(RepairUser::getId, userList);
|
|
|
@@ -3081,8 +3380,11 @@ public class RepairRecordController implements RepairRecordControllerAPI {
|
|
|
}
|
|
|
dataRow1.createCell(8).setCellValue( totalPrice.toString());
|
|
|
|
|
|
+=======
|
|
|
+>>>>>>> 50f552bf470c81eada92cf60360c8142077f19e6
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
// 将工作簿写入文件
|
|
|
ExcelUtils.excelDownload(workbook, "维修师傅.xlsx", response);
|
|
|
|
|
|
@@ -3267,7 +3569,11 @@ public class RepairRecordController implements RepairRecordControllerAPI {
|
|
|
}
|
|
|
vos.add(vo);
|
|
|
}
|
|
|
+<<<<<<< HEAD
|
|
|
|
|
|
+=======
|
|
|
+
|
|
|
+>>>>>>> 50f552bf470c81eada92cf60360c8142077f19e6
|
|
|
|
|
|
return CommonResult.ok(vos);
|
|
|
}
|