Commit 0ccb72e3 authored by Vu Duy Anh's avatar Vu Duy Anh

anhvd commit service for search campaign

parent 233dcab3
......@@ -156,6 +156,31 @@
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
......
package com.viettel.campaign.controller;
import com.viettel.campaign.dto.ResultDTO;
import com.viettel.campaign.dto.request_dto.CampaignRequestDTO;
import com.viettel.campaign.model.Campaign;
import com.viettel.campaign.service.CampaignService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.*;
import org.springframework.data.domain.Page;
import java.util.Map;
@Controller
@RestController
@RequestMapping("/ipcc/campaign")
public class CampaignController {
......@@ -28,4 +28,11 @@ public class CampaignController {
Map result = campaignService.searchCampaignExecute(page, pageSize, sort, agentId);
return new ResponseEntity<>(result, HttpStatus.OK);
}
@RequestMapping(value = "/search",method = RequestMethod.POST)
public ResponseEntity<ResultDTO> search(@RequestBody CampaignRequestDTO requestDto) {
ResultDTO result = campaignService.search(requestDto);
return new ResponseEntity<>(result, HttpStatus.OK);
}
}
......@@ -12,6 +12,6 @@ public class ResultDTO {
private String errorCode;
private String description;
private List listData = new ArrayList();
private List<?> listData = new ArrayList();
private Object data;
}
package com.viettel.campaign.dto.request_dto;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
/**
* @author anhvd_itsol
*/
@Getter
@Setter
public class CampaignRequestDTO {
int pageSize;
int page;
String sort;
String campaignCode;
String campaignName;
Short status;
Date fromDateFr;
Date fromDateTo;
Date toDateTo;
Date toDateFr;
Long numOfCusFr;
Long numOfCusTo;
Short type;
Short chanel;
}
package com.viettel.campaign.repository;
import com.viettel.campaign.dto.CampaignDTO;
import com.viettel.campaign.dto.ResultDTO;
import com.viettel.campaign.dto.request_dto.CampaignRequestDTO;
import com.viettel.campaign.model.Campaign;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Repository;
import java.util.List;
public interface CampaignRepositoryCustom {
List<CampaignDTO> searchCampaignExecute(String agentId, Pageable pageable);
ResultDTO search(CampaignRequestDTO requestDto);
}
package com.viettel.campaign.repository;
import com.viettel.campaign.dto.CampaignDTO;
import com.viettel.campaign.model.Campaign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.ArrayList;
import java.util.List;
public class CampaignRepositoryImpl implements CampaignRepositoryCustom {
@Autowired
EntityManager entityManager;
@Override
public List<CampaignDTO> searchCampaignExecute(String agentId, Pageable pageable) {
List<CampaignDTO> lst = new ArrayList<>();
String expression = new StringBuilder()
.append(" SELECT C.CAMPAIGN_ID, C.CAMPAIGN_NAME, C.STATUS ")
.append(" FROM CAMPAIGN C ")
.append(" INNER JOIN CAMPAIGN_AGENT CA ON C.CAMPAIGN_ID = CA.CAMPAIGN_ID ")
.append(" WHERE 1 = 1 ")
.append(" AND CA.AGENT_ID = :pAgentId ")
.append(" AND C.STATUS IN (2,3) ")
.toString();
Query query = entityManager.createNativeQuery(expression);
query.setParameter("pAgentId", agentId);
List<Object[]> data = query.getResultList();
for (Object[] obj : data) {
CampaignDTO item = new CampaignDTO();
item.setCampaignId((Long)obj[0]);
item.setCampaignName((String)obj[1]);
item.setStatus((Short) obj[0]);
lst.add(item);
}
return lst;
}
}
package com.viettel.campaign.repository.impl;
import com.viettel.campaign.dto.CampaignDTO;
import com.viettel.campaign.dto.ResultDTO;
import com.viettel.campaign.dto.request_dto.CampaignRequestDTO;
import com.viettel.campaign.repository.CampaignRepositoryCustom;
import com.viettel.campaign.utils.Constants;
import com.viettel.campaign.utils.DataUtil;
import com.viettel.campaign.utils.DateTimeUtil;
import com.viettel.campaign.utils.SQLBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.ArrayList;
import java.util.List;
@Repository
public class CampaignRepositoryImpl implements CampaignRepositoryCustom {
@Autowired
EntityManager entityManager;
@Override
public List<CampaignDTO> searchCampaignExecute(String agentId, Pageable pageable) {
List<CampaignDTO> lst = new ArrayList<>();
String expression = new StringBuilder()
.append(" SELECT C.CAMPAIGN_ID, C.CAMPAIGN_NAME, C.STATUS ")
.append(" FROM CAMPAIGN C ")
.append(" INNER JOIN CAMPAIGN_AGENT CA ON C.CAMPAIGN_ID = CA.CAMPAIGN_ID ")
.append(" WHERE 1 = 1 ")
.append(" AND CA.AGENT_ID = :pAgentId ")
.append(" AND C.STATUS IN (2,3) ")
.toString();
Query query = entityManager.createNativeQuery(expression);
query.setParameter("pAgentId", agentId);
List<Object[]> data = query.getResultList();
for (Object[] obj : data) {
CampaignDTO item = new CampaignDTO();
item.setCampaignId((Long)obj[0]);
item.setCampaignName((String)obj[1]);
item.setStatus((Short) obj[0]);
lst.add(item);
}
return lst;
}
@Override
public ResultDTO search(CampaignRequestDTO requestDto) {
ResultDTO result = new ResultDTO();
try {
String sqlStr = SQLBuilder.getSqlQueryById(SQLBuilder.SQL_MODULE_CAMPAIGN_MNG, "search-campaign-by-params");
// sqlStr.append(" SELECT CAMPAIGN_CODE campaignCode, CAMPAIGN_NAME campaignName, CAMPAIGN_TYPE campaignType, CHANEL chanel, START_TIME startTime, END_TIME endTime, CUSTOMER_NUMBER customerNumber, STATUS status FROM CAMPAIGN WHERE 1 = 1 ");
// if(!DataUtil.isNullOrEmpty(requestDto.getCampaignCode())) { sqlStr.append(" AND UPPER(CAMPAIGN_CODE) LIKE :code"); }
// if(!DataUtil.isNullOrEmpty(requestDto.getCampaignName())) { sqlStr.append(" AND UPPER(CAMPAIGN_NAME) LIKE :name"); }
// if(requestDto.getStatus() != null) { sqlStr.append(" AND STATUS = :status"); }
// if(requestDto.getFromDateFr() != null && DateTimeUtil.isValid(requestDto.getFromDateFr().getTime())) { sqlStr.append(" AND START_TIME >= :frDateFr"); }
// if(requestDto.getFromDateTo() != null && DateTimeUtil.isValid(requestDto.getFromDateTo().getTime())) { sqlStr.append(" AND START_TIME <= :frDateTo"); }
// if(requestDto.getToDateFr() != null && DateTimeUtil.isValid(requestDto.getToDateFr().getTime())) { sqlStr.append(" AND END_TIME >= :toDateFr"); }
// if(requestDto.getToDateTo() != null && DateTimeUtil.isValid(requestDto.getToDateTo().getTime())) { sqlStr.append(" AND END_TIME <= :toDateTo"); }
// if(!DataUtil.isNullOrZero(requestDto.getNumOfCusFr())) {
//// sqlStr.append(" AND ")
// }
// if(!DataUtil.isNullOrZero(requestDto.getNumOfCusTo())) {
//
// }
// if(requestDto.getType() != null) { sqlStr.append(" AND CAMPAIGN_TYPE = :type"); }
// if(requestDto.getChanel() != null) { sqlStr.append(" AND CHANEL = :chanel"); }
Query query = entityManager.createNativeQuery(sqlStr, CampaignDTO.class);
if (!DataUtil.isNullOrEmpty(requestDto.getCampaignCode())) {
query.setParameter("p_code", "%" +
requestDto.getCampaignCode().toUpperCase()
.replace("\\", "\\\\")
.replaceAll("%", "\\\\%")
.replaceAll("_", "\\\\_")
+ "%");
}
if (!DataUtil.isNullOrEmpty(requestDto.getCampaignName())) {
query.setParameter("p_name", "%" +
requestDto.getCampaignName().toUpperCase()
.replace("\\", "\\\\")
.replaceAll("%", "\\\\%")
.replaceAll("_", "\\\\_")
+ "%");
}
if (requestDto.getStatus() != null) {
query.setParameter("p_status", requestDto.getStatus());
}
if (requestDto.getFromDateFr() != null && DateTimeUtil.isValid(requestDto.getFromDateFr().getTime())) {
query.setParameter("p_frDateFr", requestDto.getFromDateFr());
}
if (requestDto.getFromDateTo() != null && DateTimeUtil.isValid(requestDto.getFromDateTo().getTime())) {
query.setParameter("p_frDateTo", requestDto.getFromDateTo());
}
if (requestDto.getToDateFr() != null && DateTimeUtil.isValid(requestDto.getToDateFr().getTime())) {
query.setParameter("p_toDateFr", requestDto.getToDateFr());
}
if (requestDto.getToDateTo() != null && DateTimeUtil.isValid(requestDto.getToDateTo().getTime())) {
query.setParameter("p_toDateTo", requestDto.getToDateTo());
}
if (requestDto.getType() != null) {
query.setParameter("p_type", requestDto.getType());
}
if (requestDto.getChanel() != null) {
query.setParameter("p_chanel", requestDto.getChanel());
}
List<CampaignDTO> dataCount = query.getResultList();
long count = dataCount.size();
Pageable pageable = buildPageable(requestDto);
if (pageable != null) {
query.setFirstResult(pageable.getPageNumber() * pageable.getPageSize());
query.setMaxResults(pageable.getPageSize());
}
List<CampaignDTO> data = query.getResultList();
Page<CampaignDTO> dataPage = new PageImpl<>(data, pageable, count);
result.setData(dataPage);
result.setErrorCode(Constants.ApiErrorCode.SUCCESS);
result.setDescription(Constants.ApiErrorDesc.SUCCESS);
return result;
}catch (Exception ex) {
}
result.setErrorCode(Constants.ApiErrorCode.ERROR);
result.setDescription(Constants.ApiErrorDesc.ERROR);
return null;
}
private Pageable buildPageable(CampaignRequestDTO obj) {
Pageable pageable = null;
String[] sorts = obj.getSort().split(",");
Sort sort = new Sort(Sort.Direction.fromString(sorts[1]), sorts[0]);
pageable = new PageRequest(obj.getPage(), obj.getPageSize(), sort);
return pageable;
}
}
package com.viettel.campaign.service;
import org.springframework.stereotype.Service;
import com.viettel.campaign.dto.ResultDTO;
import com.viettel.campaign.dto.request_dto.CampaignRequestDTO;
import com.viettel.campaign.model.Campaign;
import org.springframework.data.domain.Page;
import java.util.Map;
@Service
public interface CampaignService {
Map searchCampaignExecute(int page, int pageSize, String sort, String agentId);
ResultDTO search(CampaignRequestDTO requestDto);
}
package com.viettel.campaign.service;
package com.viettel.campaign.service.impl;
import com.viettel.campaign.dto.CampaignDTO;
import com.viettel.campaign.dto.ResultDTO;
import com.viettel.campaign.dto.request_dto.CampaignRequestDTO;
import com.viettel.campaign.model.Campaign;
import com.viettel.campaign.repository.CampaignRepository;
import com.viettel.campaign.service.CampaignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class CampaignServiceImpl implements CampaignService {
@Autowired
......@@ -30,4 +37,9 @@ public class CampaignServiceImpl implements CampaignService {
return result;
}
@Override
public ResultDTO search(CampaignRequestDTO requestDto) {
return campaignRepository.search(requestDto);
}
}
package com.viettel.campaign.utils;
/**
* @author anhvd_itsol
*/
public class Constants {
public interface ApiErrorCode {
String ERROR = "01";
String SUCCESS = "00";
}
public interface ApiErrorDesc {
String ERROR = "ERROR";
String SUCCESS = "SUCCESS";
}
public interface FileType {
String pdf = "pdf";
String xls = "xls";
String xlsx = "xlsx";
}
}
package com.viettel.campaign.utils;
import org.apache.logging.log4j.util.Strings;
import org.joda.time.format.DateTimeFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.concurrent.atomic.AtomicReference;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
/**
* @author anhvd_itsol
*/
public final class DateTimeUtil {
public static final long DAY_IN_MILLIS = 86400000L;
public static interface DateTimeProvider { long now(); }
private static final AtomicReference<DateTimeProvider> PROVIDER = new AtomicReference<DateTimeProvider>();
public static final DateTimeProvider getProvider() { return PROVIDER.get(); }
static {
PROVIDER.set(new DateTimeProvider() { @Override public long now() { return System.currentTimeMillis(); } });
}
public static Date currentTime() {
return new Date(now());
}
public static Date currentDate() {
return date(now());
}
public static final Date date(final long millis) {
final int offset = getTimeZoneOffset(millis);
long t = millis - ((t = (millis + offset) % DAY_IN_MILLIS) < 0 ? DAY_IN_MILLIS + t : t);
t = t + (offset - getTimeZoneOffset(t)); return new Date(t);
}
public static int getTimeZoneOffset(long millis) {
return TimeZone.getDefault().getOffset(millis);
}
public static long now() {
return getProvider().now();
}
public static long toMillis(long nanos) {
return MILLISECONDS.convert(nanos, NANOSECONDS);
}
public static long currentTimeMillis() {
return getProvider().now();
}
/**
* Format
*/
public static String format(String pattern, long millis) {
return DateTimeFormat.forPattern(pattern).print(millis);
}
public static String format(String pattern, Date date, String defaultValue) {
if(date == null) return defaultValue;
return format(pattern ,date.getTime());
}
/**
*
*/
public static boolean isValid(final long millis) {
return millis > 0L;
}
/**
*
*/
public static long parse(final String pattern, String date) {
return DateTimeFormat.forPattern(pattern).parseMillis(date);
}
public static Date parseDate(final String pattern, String date) {
return Strings.isEmpty(date) ? null : date(parse(pattern, date));
}
/**
*
*/
}
package com.viettel.campaign.utils;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import org.springframework.core.io.ClassPathResource;
/**
* @author anhvd_itsol
*/
public class SQLBuilder {
public static final String SQL_MODULE_CAMPAIGN_MNG = "campaign-mng";
public static String getSqlQueryById(String module,
String queryId) {
File folder = null;
try {
folder = new ClassPathResource(
"sql" + File.separator + module + File.separator + queryId + ".sql").getFile();
// Read file
if (folder.isFile()) {
String sql = new String(Files.readAllBytes(Paths.get(folder.getAbsolutePath())));
return sql;
}
} catch (IOException e) {
return null;
}
return null;
}
}
SELECT
CAMPAIGN_CODE campaignCode,
CAMPAIGN_NAME campaignName,
CAMPAIGN_TYPE campaignType,
CHANEL chanel,
START_TIME startTime,
END_TIME endTime,
CUSTOMER_NUMBER customerNumber,
STATUS status
FROM CAMPAIGN
WHERE 1 = 1
AND (:p_code IS NULL OR (:p_code IS NOT NULL AND UPPER(CAMPAIGN_CODE) LIKE :p_code ))
AND (:p_name IS NULL OR (:p_name IS NOT NULL AND UPPER(CAMPAIGN_NAME) LIKE :p_name ))
AND (:p_status IS NULL OR (:p_status IS NOT NULL AND STATUS = :status))
AND ((:p_frDateFr IS NULL AND :p_frDateTo IS NULL)
OR ((:p_frDateFr IS NOT NULL AND :p_frDateTo IS NOT NULL) AND
(trunc(START_TIME) BETWEEN TO_DATE(:p_frDateFr, 'YYYYMMDD') AND TO_DATE(:p_frDateTo, 'YYYYMMDD')))
OR ((:p_frDateFr IS NOT NULL AND :p_frDateTo IS NULL)
AND (trunc(START_TIME) >= TO_DATE(:p_frDateFr, 'YYYYMMDD')))
OR ((:p_frDateFr IS NULL AND :p_frDateTo IS NOT NULL)
AND (trunc(START_TIME) <= TO_DATE(:p_frDateTo, 'YYYYMMDD')))
)
AND ((:p_toDateFr IS NULL AND :p_toDateTo IS NULL)
OR ((:p_toDateFr IS NOT NULL AND :p_toDateTo IS NOT NULL) AND
(trunc(END_TIME) BETWEEN TO_DATE(:p_toDateFr, 'YYYYMMDD') AND TO_DATE(:p_toDateTo, 'YYYYMMDD')))
OR ((:p_toDateFr IS NOT NULL AND :p_toDateTo IS NULL)
AND (trunc(END_TIME) >= TO_DATE(:p_toDateFr, 'YYYYMMDD')))
OR ((:p_toDateFr IS NULL AND :p_toDateTo IS NOT NULL)
AND (trunc(END_TIME) <= TO_DATE(:p_toDateTo, 'YYYYMMDD')))
)
AND (:p_type IS NULL OR (:p_type IS NOT NULL AND CAMPAIGN_TYPE = :p_type))
AND (:p_chanel IS NULL OR (:p_chanel IS NOT NULl AND CHANEL = :p_chanel))
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment