package vn.azteam.tpf.service; import java.time.Instant; import java.util.List; import java.util.Objects; import java.util.Optional; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.persistence.criteria.JoinType; import com.google.common.collect.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import io.github.jhipster.service.QueryService; import io.github.jhipster.service.filter.LongFilter; import org.springframework.web.multipart.MultipartFile; import vn.azteam.tpf.domain.TBCustomer; import vn.azteam.tpf.domain.*; // for static metamodels import vn.azteam.tpf.repository.TBCustomerRepository; import vn.azteam.tpf.repository.search.TBCustomerSearchRepository; import vn.azteam.tpf.service.dto.TBAddressDTO; import vn.azteam.tpf.service.dto.TBCustomerCriteria; import vn.azteam.tpf.service.dto.TBCustomerDTO; import vn.azteam.tpf.service.dto.UserDTO; import vn.azteam.tpf.service.mapper.TBCustomerMapper; /** * Service for executing complex queries for TBCustomer entities in the database. * The main input is a {@link TBCustomerCriteria} which gets converted to {@link Specification}, * in a way that all the filters must apply. * It returns a {@link List} of {@link TBCustomerDTO} or a {@link Page} of {@link TBCustomerDTO} which fulfills the criteria. */ @Service @Transactional(readOnly = true) public class TBCustomerQueryService extends QueryService { private final Logger log = LoggerFactory.getLogger(TBCustomerQueryService.class); private final TBCustomerRepository tBCustomerRepository; private final TBCustomerMapper tBCustomerMapper; private final TBCustomerSearchRepository tBCustomerSearchRepository; private final FileStorageService fileStorageService; private final TBCustomerService tBCustomerService; private final TBAddressService tBAddressService; private final UserService userService; private final EntityManager em; public TBCustomerQueryService(TBCustomerRepository tBCustomerRepository, TBCustomerMapper tBCustomerMapper, TBCustomerSearchRepository tBCustomerSearchRepository, FileStorageService fileStorageService, TBCustomerService tBCustomerService, TBAddressService tBAddressService, UserService userService, EntityManager em) { this.tBCustomerRepository = tBCustomerRepository; this.tBCustomerMapper = tBCustomerMapper; this.tBCustomerSearchRepository = tBCustomerSearchRepository; this.fileStorageService = fileStorageService; this.tBCustomerService = tBCustomerService; this.tBAddressService = tBAddressService; this.userService = userService; this.em = em; } /** * Return a {@link List} of {@link TBCustomerDTO} which matches the criteria from the database * @param criteria The object which holds all the filters, which the entities should match. * @return the matching entities. */ @Transactional(readOnly = true) public List findByCriteria(TBCustomerCriteria criteria) { log.debug("find by criteria : {}", criteria); final Specification specification = createSpecification(criteria); return tBCustomerMapper.toDto(tBCustomerRepository.findAll(specification)); } /** * Return a {@link Page} of {@link TBCustomerDTO} which matches the criteria from the database * @param criteria The object which holds all the filters, which the entities should match. * @param page The page, which should be returned. * @return the matching entities. */ @Transactional(readOnly = true) public Page findByCriteria(TBCustomerCriteria criteria, Pageable page) { log.debug("find by criteria : {}, page: {}", criteria, page); final Specification specification = createSpecification(criteria); return tBCustomerRepository.findAll(specification, page) .map(tBCustomerMapper::toDto); } /** * Return the number of matching entities in the database * @param criteria The object which holds all the filters, which the entities should match. * @return the number of matching entities. */ @Transactional(readOnly = true) public long countByCriteria(TBCustomerCriteria criteria) { log.debug("count by criteria : {}", criteria); final Specification specification = createSpecification(criteria); return tBCustomerRepository.count(specification); } /** * Function to convert TBCustomerCriteria to a {@link Specification} */ private Specification createSpecification(TBCustomerCriteria criteria) { Specification specification = Specification.where(null); if (criteria != null) { UserDTO currentUser = userService.getCurrentUserDTO().get(); if (criteria.getId() != null) { specification = specification.and(buildSpecification(criteria.getId(), TBCustomer_.id)); } if (criteria.getName() != null) { specification = specification.and(buildStringSpecification(criteria.getName(), TBCustomer_.name)); } if (criteria.getPhone() != null) { specification = specification.and(buildStringSpecification(criteria.getPhone(), TBCustomer_.phone)); } if (criteria.getEmail() != null) { specification = specification.and(buildStringSpecification(criteria.getEmail(), TBCustomer_.email)); } if (criteria.getSlugName() != null) { specification = specification.and(buildStringSpecification(criteria.getSlugName(), TBCustomer_.slugName)); } if (criteria.getAreaM2() != null) { specification = specification.and(buildRangeSpecification(criteria.getAreaM2(), TBCustomer_.areaM2)); } if (criteria.getIsActivated() != null) { specification = specification.and(buildRangeSpecification(criteria.getIsActivated(), TBCustomer_.isActivated)); } if (criteria.getCreatedDate() != null) { specification = specification.and(buildRangeSpecification(criteria.getCreatedDate(), TBCustomer_.createdDate)); } if (criteria.getModifiedDate() != null) { specification = specification.and(buildRangeSpecification(criteria.getModifiedDate(), TBCustomer_.modifiedDate)); } if (criteria.getDeletedDate() != null) { specification = specification.and(buildRangeSpecification(criteria.getDeletedDate(), TBCustomer_.deletedDate)); } if (criteria.getTbAddressId() != null) { specification = specification.and(buildSpecification(criteria.getTbAddressId(), root -> root.join(TBCustomer_.tbAddress, JoinType.LEFT).get(TBAddress_.id))); } if (criteria.getTbDashboardTypeId() != null) { specification = specification.and(buildSpecification(criteria.getTbDashboardTypeId(), root -> root.join(TBCustomer_.tbDashboardType, JoinType.LEFT).get(TBDashboardType_.id))); } if (criteria.getCreatedById() != null) { specification = specification.and(buildSpecification(criteria.getCreatedById(), root -> root.join(TBCustomer_.createdBy, JoinType.LEFT).get(TBDetailUser_.id))); } if (criteria.getModifiedById() != null) { specification = specification.and(buildSpecification(criteria.getModifiedById(), root -> root.join(TBCustomer_.modifiedBy, JoinType.LEFT).get(TBDetailUser_.id))); } if (criteria.getDeletedById() != null) { specification = specification.and(buildSpecification(criteria.getDeletedById(), root -> root.join(TBCustomer_.deletedBy, JoinType.LEFT).get(TBDetailUser_.id))); } if(!userService.isAllCustomerRole(currentUser.getRoleId())) { LongFilter customerIdFilter = new LongFilter(); customerIdFilter.setEquals(currentUser.getCustomerId()); specification = specification.and(buildSpecification(customerIdFilter, root -> root.get("id"))); } } return specification; } @Transactional() public TBCustomerDTO createCustomer(TBCustomerDTO tBCustomerDTO){ Optional currentUser = userService.getCurrentUserDTO(); TBAddressDTO tbAddressDTO = new TBAddressDTO(); tbAddressDTO.setId(tBCustomerDTO.getTbAddressId()); tbAddressDTO.setTbCountryId(tBCustomerDTO.getCountryId()); tbAddressDTO.setTbCityId(tBCustomerDTO.getCityId()); tbAddressDTO.setTbDistrictId(tBCustomerDTO.getDistrictId()); tbAddressDTO.setTbWardId(tBCustomerDTO.getWardId()); tbAddressDTO.setAddress(tBCustomerDTO.getAddress()); TBAddressDTO savedTBAddressDTO = this.tBAddressService.save(tbAddressDTO); tBCustomerDTO.setCreatedById(currentUser.get().getId()); tBCustomerDTO.setCreatedDate(Instant.now()); tBCustomerDTO.setTbAddressId(savedTBAddressDTO.getId()); return tBCustomerService.save(tBCustomerDTO); } @Transactional() public TBCustomerDTO updateCustomerWithCertImage(TBCustomerDTO tBCustomerDTO, MultipartFile file, String path){ Optional currentUser = userService.getCurrentUserDTO(); String imagePath; if (null != file) { if (Objects.equals(file.getOriginalFilename(), "")) { tBCustomerDTO.setCertificationImage(tBCustomerDTO.getCertificationImage()); } else { imagePath = this.fileStorageService.storeSingleFile(path, file); if (tBCustomerDTO.getCertificationImage() != null && !tBCustomerDTO.getCertificationImage().equals("")) { tBCustomerDTO.setCertificationImage(imagePath); } else { tBCustomerDTO.setCertificationImage(imagePath); } } } else { tBCustomerDTO.setCertificationImage(tBCustomerDTO.getCertificationImage()); } tBCustomerDTO.setModifiedById(currentUser.get().getId()); tBCustomerDTO.setModifiedDate(Instant.now()); return tBCustomerService.save(tBCustomerDTO); } @Transactional() public TBCustomerDTO updateCustomer(TBCustomerDTO tBCustomerDTO){ Optional currentUser = userService.getCurrentUserDTO(); TBAddressDTO tbAddressDTO = new TBAddressDTO(); Optional dbTBCustomer = tBCustomerService.findOne(tBCustomerDTO.getId()); if(dbTBCustomer.isPresent() && dbTBCustomer.get().getTbAddressId() != null) { Optional optionalTBAddressDTO = tBAddressService.findOne(dbTBCustomer.get().getTbAddressId()); if (optionalTBAddressDTO.isPresent()) { tbAddressDTO = optionalTBAddressDTO.get(); } } tbAddressDTO.setTbCountryId(tBCustomerDTO.getCountryId()); tbAddressDTO.setTbCityId(tBCustomerDTO.getCityId()); tbAddressDTO.setTbDistrictId(tBCustomerDTO.getDistrictId()); tbAddressDTO.setTbWardId(tBCustomerDTO.getWardId()); tbAddressDTO.setAddress(tBCustomerDTO.getAddress()); TBAddressDTO savedTBAddressDTO = this.tBAddressService.save(tbAddressDTO); tBCustomerDTO.setModifiedById(currentUser.get().getId()); tBCustomerDTO.setModifiedDate(Instant.now()); tBCustomerDTO.setTbAddressId(savedTBAddressDTO.getId()); return tBCustomerService.save(tBCustomerDTO); } public Page searchCustomer(String query, String status, Pageable pageable) { String sqlString = "select c.*\n" + " from tb_customer as c\n" + " join tb_address as a on c.tb_address_id = a.id\n" + " where 1 = 1"; if(query != null && !query.isEmpty()) { sqlString = sqlString + " and ( c.name like '%" + query + "%'\n" + " or c.phone like '%" + query + "%'\n" + " or c.email like '%" + query + "%'\n" + " or a.address like '%" + query + "%')\n"; } if(status != null && !status.isEmpty()) { int statusNumber = Integer.parseInt(status); sqlString = sqlString + " and (c.status = " + statusNumber + ")"; } Query tbCustomerQuery = em.createNativeQuery(sqlString, TBCustomer.class); List tbCustomerDTOs = tBCustomerMapper.toDto(tbCustomerQuery.getResultList()); int start = Math.toIntExact(pageable.getOffset()); int end = Math.toIntExact((start + pageable.getPageSize()) > tbCustomerDTOs.size() ? tbCustomerDTOs.size() : (start + pageable.getPageSize())); if(tbCustomerDTOs.size() > start) { return new PageImpl<>(tbCustomerDTOs.subList(start, end), pageable, tbCustomerDTOs.size()); } return new PageImpl<>(Lists.newArrayList(), pageable, tbCustomerDTOs.size()); } }