| Line 63... |
Line 63... |
| 63 |
import java.time.LocalDate;
|
63 |
import java.time.LocalDate;
|
| 64 |
import java.time.LocalDateTime;
|
64 |
import java.time.LocalDateTime;
|
| 65 |
import java.time.YearMonth;
|
65 |
import java.time.YearMonth;
|
| 66 |
import java.time.format.DateTimeFormatter;
|
66 |
import java.time.format.DateTimeFormatter;
|
| 67 |
import java.util.*;
|
67 |
import java.util.*;
|
| - |
|
68 |
import java.util.HashSet;
|
| 68 |
import java.util.Map.Entry;
|
69 |
import java.util.Map.Entry;
|
| 69 |
import java.util.stream.Collectors;
|
70 |
import java.util.stream.Collectors;
|
| 70 |
|
71 |
|
| 71 |
@Controller
|
72 |
@Controller
|
| 72 |
@Transactional(rollbackFor = Throwable.class)
|
73 |
@Transactional(rollbackFor = Throwable.class)
|
| Line 621... |
Line 622... |
| 621 |
if (!visitRequests.isEmpty()) {
|
622 |
if (!visitRequests.isEmpty()) {
|
| 622 |
visitRequestMap = visitRequests.stream().collect(Collectors.groupingBy(x -> x.getVisitId()));
|
623 |
visitRequestMap = visitRequests.stream().collect(Collectors.groupingBy(x -> x.getVisitId()));
|
| 623 |
}
|
624 |
}
|
| 624 |
List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository.selectByAuthIdAndStatus(authUser.getId(), status, offset, limit);
|
625 |
List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository.selectByAuthIdAndStatus(authUser.getId(), status, offset, limit);
|
| 625 |
|
626 |
|
| - |
|
627 |
// Batch fetch all FranchiseeActivity in one query instead of N+1
|
| - |
|
628 |
List<Integer> activityIds = franchiseeVisits.stream()
|
| - |
|
629 |
.filter(fv -> fv.getFranchiseActivityId() != 0)
|
| - |
|
630 |
.map(FranchiseeVisit::getFranchiseActivityId)
|
| - |
|
631 |
.collect(Collectors.toList());
|
| - |
|
632 |
Map<Integer, FranchiseeActivity> activityMap = new HashMap<>();
|
| - |
|
633 |
if (!activityIds.isEmpty()) {
|
| - |
|
634 |
activityMap = franchiseeActivityRepository.selectByIds(activityIds).stream()
|
| - |
|
635 |
.collect(Collectors.toMap(FranchiseeActivity::getId, x -> x));
|
| - |
|
636 |
}
|
| - |
|
637 |
|
| 626 |
for (FranchiseeVisit fv : franchiseeVisits) {
|
638 |
for (FranchiseeVisit fv : franchiseeVisits) {
|
| 627 |
if (visitRequestMap != null) {
|
639 |
if (visitRequestMap != null) {
|
| 628 |
|
640 |
|
| 629 |
List<VisitRequest> visitRequest = visitRequestMap.get(fv.getId());
|
641 |
List<VisitRequest> visitRequest = visitRequestMap.get(fv.getId());
|
| 630 |
if (visitRequest != null) {
|
642 |
if (visitRequest != null) {
|
| Line 640... |
Line 652... |
| 640 |
|
652 |
|
| 641 |
}
|
653 |
}
|
| 642 |
}
|
654 |
}
|
| 643 |
}
|
655 |
}
|
| 644 |
if (fv.getFranchiseActivityId() != 0) {
|
656 |
if (fv.getFranchiseActivityId() != 0) {
|
| 645 |
FranchiseeActivity fA = franchiseeActivityRepository.selectById(fv.getFranchiseActivityId());
|
657 |
FranchiseeActivity fA = activityMap.get(fv.getFranchiseActivityId());
|
| 646 |
fv.setFranchiseeActivity(fA);
|
658 |
fv.setFranchiseeActivity(fA);
|
| 647 |
}
|
659 |
}
|
| 648 |
|
660 |
|
| 649 |
}
|
661 |
}
|
| 650 |
|
662 |
|
| Line 756... |
Line 768... |
| 756 |
}
|
768 |
}
|
| 757 |
|
769 |
|
| 758 |
@RequestMapping(value = "/purchaseExist", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
|
770 |
@RequestMapping(value = "/purchaseExist", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
|
| 759 |
@ApiImplicitParams({
|
771 |
@ApiImplicitParams({
|
| 760 |
@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
|
772 |
@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
|
| 761 |
public ResponseEntity<?> purchaseExist(HttpServletRequest request, Model model)
|
773 |
public ResponseEntity<?> purchaseExist(HttpServletRequest request) throws ProfitMandiBusinessException {
|
| 762 |
throws ProfitMandiBusinessException {
|
- |
|
| 763 |
int userId = (int) request.getAttribute("userId");
|
774 |
int userId = (int) request.getAttribute("userId");
|
| 764 |
UserCart uc = userAccountRepository.getUserCart(userId);
|
775 |
UserCart uc = userAccountRepository.getUserCart(userId);
|
| 765 |
boolean purchaseExist = purchaseRepository.hasPurchaseForFofoId(uc.getUserId());
|
776 |
return responseSender.ok(purchaseRepository.hasPurchaseForFofoId(uc.getUserId()));
|
| 766 |
if (purchaseExist) {
|
- |
|
| 767 |
return responseSender.ok(true);
|
- |
|
| 768 |
}
|
- |
|
| 769 |
return responseSender.ok(false);
|
- |
|
| 770 |
}
|
777 |
}
|
| 771 |
|
778 |
|
| 772 |
@RequestMapping(value = "/onBoardingTimelineVisibility", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
|
779 |
@RequestMapping(value = "/onBoardingTimelineVisibility", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
|
| 773 |
@ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
|
780 |
@ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
|
| 774 |
public ResponseEntity<?> onBoardingTimelineVisibility(HttpServletRequest request, Model model)
|
781 |
public ResponseEntity<?> onBoardingTimelineVisibility(HttpServletRequest request, Model model)
|
| Line 857... |
Line 864... |
| 857 |
|
864 |
|
| 858 |
Map<Integer, List<PartnerSecondaryPlanModel>> partnerSecondaryPlans = orderRepository
|
865 |
Map<Integer, List<PartnerSecondaryPlanModel>> partnerSecondaryPlans = orderRepository
|
| 859 |
.selectPartnerSecondaryGroupByBrand(fofoIdList, startDate.toLocalDate()).stream()
|
866 |
.selectPartnerSecondaryGroupByBrand(fofoIdList, startDate.toLocalDate()).stream()
|
| 860 |
.collect(Collectors.groupingBy(x -> x.getFofoId()));
|
867 |
.collect(Collectors.groupingBy(x -> x.getFofoId()));
|
| 861 |
|
868 |
|
| - |
|
869 |
// Pre-fetch all AuthUsers that might be needed (instead of N+1 queries)
|
| - |
|
870 |
Set<Integer> allAuthIds = new HashSet<>();
|
| - |
|
871 |
collectionMap.values().stream()
|
| - |
|
872 |
.map(PartnerCollectionPlanModel::getAuthId)
|
| - |
|
873 |
.filter(id -> id != null && id != authUser.getId())
|
| - |
|
874 |
.forEach(allAuthIds::add);
|
| - |
|
875 |
partnerSecondaryPlans.values().stream()
|
| - |
|
876 |
.flatMap(List::stream)
|
| - |
|
877 |
.map(PartnerSecondaryPlanModel::getAuthId)
|
| - |
|
878 |
.filter(id -> id != null && id != authUser.getId())
|
| - |
|
879 |
.forEach(allAuthIds::add);
|
| - |
|
880 |
Map<Integer, AuthUser> authUserMap = new HashMap<>();
|
| - |
|
881 |
if (!allAuthIds.isEmpty()) {
|
| - |
|
882 |
authUserMap = authRepository.selectByIds(new ArrayList<>(allAuthIds)).stream()
|
| - |
|
883 |
.collect(Collectors.toMap(AuthUser::getId, x -> x));
|
| - |
|
884 |
}
|
| - |
|
885 |
|
| 862 |
LOGGER.info("partnerSecondayPlans {}", partnerSecondaryPlans);
|
886 |
LOGGER.info("partnerSecondayPlans {}", partnerSecondaryPlans);
|
| 863 |
for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailers.entrySet()) {
|
887 |
for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailers.entrySet()) {
|
| 864 |
int fofoId = customRetailerEntry.getKey();
|
888 |
int fofoId = customRetailerEntry.getKey();
|
| 865 |
CustomRetailer customRetailer = customRetailerEntry.getValue();
|
889 |
CustomRetailer customRetailer = customRetailerEntry.getValue();
|
| 866 |
float totalSecondaryPlan = 0;
|
890 |
float totalSecondaryPlan = 0;
|
| Line 922... |
Line 946... |
| 922 |
|
946 |
|
| 923 |
}
|
947 |
}
|
| 924 |
}
|
948 |
}
|
| 925 |
|
949 |
|
| 926 |
if (authId != null && authId != authUser.getId()) {
|
950 |
if (authId != null && authId != authUser.getId()) {
|
| 927 |
ptam.setAuthUser(authRepository.selectById(authId));
|
951 |
ptam.setAuthUser(authUserMap.get(authId));
|
| 928 |
|
952 |
|
| 929 |
}
|
953 |
}
|
| 930 |
|
954 |
|
| 931 |
if (collectionPlan.getCommittedDate() != null) {
|
955 |
if (collectionPlan.getCommittedDate() != null) {
|
| 932 |
|
956 |
|
| Line 997... |
Line 1021... |
| 997 |
}
|
1021 |
}
|
| 998 |
|
1022 |
|
| 999 |
for (Entry<String, PartnerSecondaryPlanModel> secondaryModelEntry : secondaryModelMap.entrySet()) {
|
1023 |
for (Entry<String, PartnerSecondaryPlanModel> secondaryModelEntry : secondaryModelMap.entrySet()) {
|
| 1000 |
Integer authId = secondaryModelEntry.getValue().getAuthId();
|
1024 |
Integer authId = secondaryModelEntry.getValue().getAuthId();
|
| 1001 |
if (authId != null && authId != authUser.getId()) {
|
1025 |
if (authId != null && authId != authUser.getId()) {
|
| 1002 |
secondaryModelEntry.getValue().setAuthUser(authRepository.selectById(authId));
|
1026 |
secondaryModelEntry.getValue().setAuthUser(authUserMap.get(authId));
|
| 1003 |
ptam.setSecondaryColor("red");
|
1027 |
ptam.setSecondaryColor("red");
|
| 1004 |
}
|
1028 |
}
|
| 1005 |
|
1029 |
|
| 1006 |
}
|
1030 |
}
|
| 1007 |
|
1031 |
|
| Line 1389... |
Line 1413... |
| 1389 |
.map(x -> x.getVisitId()).collect(Collectors.toList());
|
1413 |
.map(x -> x.getVisitId()).collect(Collectors.toList());
|
| 1390 |
List<Lead> leads = new ArrayList<>();
|
1414 |
List<Lead> leads = new ArrayList<>();
|
| 1391 |
if (!leadIds.isEmpty()) {
|
1415 |
if (!leadIds.isEmpty()) {
|
| 1392 |
leads = leadRepository.selectAllByIds(leadIds);
|
1416 |
leads = leadRepository.selectAllByIds(leadIds);
|
| 1393 |
|
1417 |
|
| - |
|
1418 |
// Batch fetch all LeadActivities instead of N+1
|
| - |
|
1419 |
List<LeadActivity> allLeadActivities = leadActivityRepository.selectAllByleadIds(leadIds);
|
| - |
|
1420 |
Map<Integer, List<LeadActivity>> leadActivityMap = allLeadActivities.stream()
|
| - |
|
1421 |
.collect(Collectors.groupingBy(LeadActivity::getLeadId));
|
| - |
|
1422 |
|
| 1394 |
for (Lead lead : leads) {
|
1423 |
for (Lead lead : leads) {
|
| 1395 |
List<LeadActivity> leadActivities = leadActivityRepository.selectBYLeadId(lead.getId());
|
1424 |
List<LeadActivity> leadActivities = leadActivityMap.get(lead.getId());
|
| - |
|
1425 |
if (leadActivities != null && !leadActivities.isEmpty()) {
|
| 1396 |
lead.setScheduledTimestamp(leadActivities.get(0).getSchelduleTimestamp());
|
1426 |
lead.setScheduledTimestamp(leadActivities.get(0).getSchelduleTimestamp());
|
| 1397 |
lead.setLeadActivity(leadActivities.get(0));
|
1427 |
lead.setLeadActivity(leadActivities.get(0));
|
| - |
|
1428 |
}
|
| 1398 |
}
|
1429 |
}
|
| 1399 |
}
|
1430 |
}
|
| 1400 |
List<Integer> franchiseeIds = allVisitRequests.stream()
|
1431 |
List<Integer> franchiseeIds = allVisitRequests.stream()
|
| 1401 |
.filter(x -> x.getVisitType().equals("franchiseeVisit")).map(x -> x.getVisitId())
|
1432 |
.filter(x -> x.getVisitType().equals("franchiseeVisit")).map(x -> x.getVisitId())
|
| 1402 |
.collect(Collectors.toList());
|
1433 |
.collect(Collectors.toList());
|
| 1403 |
List<FranchiseeVisit> franchiseeVisits = new ArrayList<>();
|
1434 |
List<FranchiseeVisit> franchiseeVisits = new ArrayList<>();
|
| 1404 |
if (!franchiseeIds.isEmpty()) {
|
1435 |
if (!franchiseeIds.isEmpty()) {
|
| 1405 |
franchiseeVisits = franchiseeVisitRepository.selectAllByIds(franchiseeIds);
|
1436 |
franchiseeVisits = franchiseeVisitRepository.selectAllByIds(franchiseeIds);
|
| 1406 |
LOGGER.info("franchiseeVisits {}", franchiseeVisits);
|
1437 |
LOGGER.info("franchiseeVisits {}", franchiseeVisits);
|
| 1407 |
|
1438 |
|
| - |
|
1439 |
// Batch fetch all FranchiseeActivities instead of N+1
|
| - |
|
1440 |
List<FranchiseeActivity> allFranchiseeActivities = franchiseeActivityRepository
|
| - |
|
1441 |
.selectByFranchiseeVisitIds(franchiseeIds);
|
| - |
|
1442 |
Map<Integer, List<FranchiseeActivity>> franchiseeActivityMap = allFranchiseeActivities.stream()
|
| - |
|
1443 |
.collect(Collectors.groupingBy(FranchiseeActivity::getFranchiseeVisitd));
|
| - |
|
1444 |
|
| 1408 |
for (FranchiseeVisit franchiseeVisit : franchiseeVisits) {
|
1445 |
for (FranchiseeVisit franchiseeVisit : franchiseeVisits) {
|
| 1409 |
List<FranchiseeActivity> franchiseeActivities = franchiseeActivityRepository
|
1446 |
List<FranchiseeActivity> franchiseeActivities = franchiseeActivityMap.get(franchiseeVisit.getId());
|
| 1410 |
.selectByFranchiseeVisitId(franchiseeVisit.getId());
|
- |
|
| 1411 |
LOGGER.info("franchiseeActivities {}", franchiseeActivities);
|
1447 |
LOGGER.info("franchiseeActivities {}", franchiseeActivities);
|
| 1412 |
|
1448 |
|
| - |
|
1449 |
if (franchiseeActivities != null && !franchiseeActivities.isEmpty()) {
|
| 1413 |
franchiseeVisit.setScheduleTimestamp(franchiseeActivities.get(0).getSchelduleTimestamp());
|
1450 |
franchiseeVisit.setScheduleTimestamp(franchiseeActivities.get(0).getSchelduleTimestamp());
|
| 1414 |
franchiseeVisit.setFranchiseeActivity(franchiseeActivities.get(0));
|
1451 |
franchiseeVisit.setFranchiseeActivity(franchiseeActivities.get(0));
|
| - |
|
1452 |
}
|
| 1415 |
}
|
1453 |
}
|
| 1416 |
|
1454 |
|
| 1417 |
}
|
1455 |
}
|
| 1418 |
|
1456 |
|
| - |
|
1457 |
// Pre-fetch all retailers using cached method (instead of N+1 getFofoRetailer calls)
|
| - |
|
1458 |
Map<Integer, CustomRetailer> allRetailersMap = retailerService.getAllFofoRetailers();
|
| - |
|
1459 |
|
| 1419 |
Map<LocalDate, List<VisitRequest>> dateWiseVisitRequest = allVisitRequests.stream()
|
1460 |
Map<LocalDate, List<VisitRequest>> dateWiseVisitRequest = allVisitRequests.stream()
|
| 1420 |
.collect(Collectors.groupingBy(x -> x.getScheduleTimestamp().toLocalDate()));
|
1461 |
.collect(Collectors.groupingBy(x -> x.getScheduleTimestamp().toLocalDate()));
|
| 1421 |
|
1462 |
|
| 1422 |
for (Entry<LocalDate, List<VisitRequest>> visitEntry : dateWiseVisitRequest.entrySet()) {
|
1463 |
for (Entry<LocalDate, List<VisitRequest>> visitEntry : dateWiseVisitRequest.entrySet()) {
|
| 1423 |
|
1464 |
|
| Line 1499... |
Line 1540... |
| 1499 |
VisitRequest visitRequest = visitRequests.stream()
|
1540 |
VisitRequest visitRequest = visitRequests.stream()
|
| 1500 |
.filter(x -> x.getVisitId() == franchiseeVisit.getId()
|
1541 |
.filter(x -> x.getVisitId() == franchiseeVisit.getId()
|
| 1501 |
&& x.getCreatedBy() == franchiseeVisit.getAuthId())
|
1542 |
&& x.getCreatedBy() == franchiseeVisit.getAuthId())
|
| 1502 |
.findAny().orElse(null);
|
1543 |
.findAny().orElse(null);
|
| 1503 |
|
1544 |
|
| 1504 |
CustomRetailer customRetailer = retailerService
|
1545 |
CustomRetailer customRetailer = allRetailersMap.get(franchiseeVisit.getFofoId());
|
| 1505 |
.getFofoRetailer(franchiseeVisit.getFofoId());
|
- |
|
| 1506 |
VisitDescriptionModel visitDescriptionModel = new VisitDescriptionModel();
|
1546 |
VisitDescriptionModel visitDescriptionModel = new VisitDescriptionModel();
|
| 1507 |
visitDescriptionModel.setVisitId(visitRequest.getId());
|
1547 |
visitDescriptionModel.setVisitId(visitRequest.getId());
|
| 1508 |
visitDescriptionModel.setVisitName(franchiseeVisit.getPartnerName());
|
1548 |
visitDescriptionModel.setVisitName(franchiseeVisit.getPartnerName());
|
| - |
|
1549 |
if (customRetailer != null && customRetailer.getAddress() != null) {
|
| 1509 |
visitDescriptionModel.setCity(customRetailer.getAddress().getCity());
|
1550 |
visitDescriptionModel.setCity(customRetailer.getAddress().getCity());
|
| 1510 |
visitDescriptionModel.setState(customRetailer.getAddress().getState());
|
1551 |
visitDescriptionModel.setState(customRetailer.getAddress().getState());
|
| - |
|
1552 |
}
|
| 1511 |
visitDescriptionModel.setScheduleTime(
|
1553 |
visitDescriptionModel.setScheduleTime(
|
| 1512 |
franchiseeVisit.getFranchiseeActivity().getSchelduleTimestamp());
|
1554 |
franchiseeVisit.getFranchiseeActivity().getSchelduleTimestamp());
|
| 1513 |
visitDescriptionModel.setStatus(visitRequest.getStatus());
|
1555 |
visitDescriptionModel.setStatus(visitRequest.getStatus());
|
| 1514 |
visitDescriptionModel.setRemarks(franchiseeVisit.getAgenda());
|
1556 |
visitDescriptionModel.setRemarks(franchiseeVisit.getAgenda());
|
| 1515 |
visitDescriptionModel.setVisitType(visitRequest.getVisitType());
|
1557 |
visitDescriptionModel.setVisitType(visitRequest.getVisitType());
|