Commit 281d22f3 authored by Phạm Duy Phi's avatar Phạm Duy Phi
parents c2903393 2785f1b2
......@@ -638,6 +638,7 @@ public class CampaignRepositoryImpl implements CampaignRepositoryCustom {
"),\n" +
"data as (\n" +
"select a.*, rownum row_ from data_temp a\n" +
"where a.totalCusList > 0" +
"),\n" +
"count_data as (\n" +
"select count(*) totalRow from data_temp\n" +
......
......@@ -4,6 +4,7 @@ import com.viettel.campaign.model.ccms_full.Scenario;
import com.viettel.campaign.web.dto.*;
import com.viettel.econtact.filter.UserSession;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
......@@ -25,5 +26,5 @@ public interface ScenarioService {
XSSFWorkbook buildTemplate();
Map<String, Object> readAndValidateCustomer(String path, UserSession userSession);
Map<String, Object> readAndValidateCustomer(String path, Long scenarioId, Long campaignId, Long companySiteId);
}
......@@ -555,6 +555,7 @@ public class CampaignServiceImpl implements CampaignService {
List<CampaignCustomer> list = campaignCustomerRepository.findCustomerContacted(campaignId, companySiteId, Long.parseLong(cusListId));
for (CampaignCustomer campaignCustomer: list) {
campaignCustomer.setInCampaignStatus((short) 0);
campaignCustomerRepository.save(campaignCustomer);
}
}
resultDTO.setErrorCode(Constants.ApiErrorCode.SUCCESS);
......
......@@ -1587,6 +1587,13 @@ public class CustomerServiceImpl implements CustomerService {
sb.append(" from customer_contact cc");
sb.append(" where cc.contact_type = 2");
sb.append(" and status = 1");
sb.append(" )," +
"cusInCampaign as (" +
"select * from campaign_customer " +
"where campaign_id = :p_campaign_id " +
"and company_site_id = :p_company_site_id " +
"and customer_list_id is null " +
"and in_campaign_status = 1");
sb.append(" ), datas as (");
sb.append(" select c.customer_id customerId,");
sb.append(" c.name,");
......@@ -1597,6 +1604,7 @@ public class CustomerServiceImpl implements CustomerService {
sb.append(" c.current_address currentAddress,");
sb.append(" c.description");
sb.append(" from customer c");
sb.append(" inner join cusInCampaign cc on c.customer_id = cc.customer_id");
sb.append(" left join cusPhone cP on c.customer_id = cP.cusId");
sb.append(" left join cusEmail cE on c.customer_id = cE.cusId");
sb.append(" )");
......@@ -1615,8 +1623,11 @@ public class CustomerServiceImpl implements CustomerService {
Map<String, Object> param = new HashMap<>();
param.put("p_page_number", campaignCustomerDTO.getPage());
param.put("p_page_size", campaignCustomerDTO.getPageSize());
param.put("p_campaign_id", campaignCustomerDTO.getCampaignId());
param.put("p_company_site_id", campaignCustomerDTO.getCompanySiteId());
customerList = namedParameterJdbcTemplate.query(sb.toString(), param, new BeanPropertyRowMapper<>(CustomerDTO.class));
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
return null;
}
return customerList;
......
......@@ -3,6 +3,7 @@ package com.viettel.campaign.service.impl;
import com.viettel.campaign.config.DataSourceQualify;
import com.viettel.campaign.model.ccms_full.*;
import com.viettel.campaign.repository.ccms_full.*;
import com.viettel.campaign.service.ScenarioQuestionService;
import com.viettel.campaign.service.ScenarioService;
import com.viettel.campaign.utils.BundleUtils;
import com.viettel.campaign.utils.Constants;
......@@ -52,6 +53,9 @@ public class ScenarioServiceImpl implements ScenarioService {
@Autowired
ContactQuestResultRepository questResultRepository;
@Autowired
ScenarioQuestionService questionService;
@Override
@Transactional(DataSourceQualify.CCMS_FULL)
public Scenario findScenarioByCampaignIdAndCompanySiteId(Long campaignId, Long companySiteId) {
......@@ -234,7 +238,7 @@ public class ScenarioServiceImpl implements ScenarioService {
@Override
@Transactional(DataSourceQualify.CCMS_FULL)
public Map<String, Object> readAndValidateCustomer(String path, UserSession userSession) {
public Map<String, Object> readAndValidateCustomer(String path, Long scenarioId, Long campaignId, Long companySiteId) {
Locale locale = new Locale("vi", "VN");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Map<String, Object> result = new HashMap<>();
......@@ -294,7 +298,7 @@ public class ScenarioServiceImpl implements ScenarioService {
List<Object[]> rawDataList = new ArrayList<>();
//validate row
for (int i = 3; i < sheet.getPhysicalNumberOfRows(); i++) {
for (int i = 3; i <= sheet.getPhysicalNumberOfRows(); i++) {
Row dataRow = sheet.getRow(i);
if (dataRow != null) {
Object[] obj = new Object[row.getPhysicalNumberOfCells()];
......@@ -311,6 +315,7 @@ public class ScenarioServiceImpl implements ScenarioService {
}
}
}
rawDataList.add(obj);
}
}
......@@ -350,7 +355,7 @@ public class ScenarioServiceImpl implements ScenarioService {
if ((rawDataList.get(i)[3] == null || rawDataList.get(i)[3].toString().trim().equals("")) && (!selectedType.equals(BundleUtils.getLangString("scenario.template.text")))) {
sb.append(BundleUtils.getLangString("scenario.answer.required"));
}
if(rawDataList.get(i)[4] == null && rawDataList.get(i)[4].toString().trim().equals("")) {
if (rawDataList.get(i)[4] == null && rawDataList.get(i)[4].toString().trim().equals("")) {
sb.append(BundleUtils.getLangString("scenario.hashInput.required"));
}
}
......@@ -371,10 +376,15 @@ public class ScenarioServiceImpl implements ScenarioService {
//insert data
if (isValid) {
logger.info("----- Data valid, start import scenario question -----");
for (int i = 0; i < rawDataList.size(); i++) {
buildQuestionsLst(rawDataList);
}
}else {
List<ScenarioQuestionDTO> lstQuestion = buildQuestionsLst(rawDataList, scenarioId, campaignId, companySiteId);
lstQuestion.forEach(question -> {
questionService.add(question);
});
FileOutputStream fos = new FileOutputStream(file);
workbook.write(fos);
result.put("file", file);
result.put("message", BundleUtils.getLangString("customer.importSuccess", locale));
} else {
FileOutputStream fos = new FileOutputStream(file);
workbook.write(fos);
result.put("file", file);
......@@ -384,7 +394,7 @@ public class ScenarioServiceImpl implements ScenarioService {
logger.info(ex.getMessage(), ex);
result.put("message", BundleUtils.getLangString("customer.errorValidate", locale));
}
logger.info("Import Questions result:" , result);
logger.info("Import Questions result:", result);
return result;
}
......@@ -393,15 +403,75 @@ public class ScenarioServiceImpl implements ScenarioService {
return false;
}
private List<ScenarioQuestionDTO> buildQuestionsLst(List<Object[]> rawDatas) {
private Long questionOrderIndex = null;
private Integer answerIndex = null;
private List<ScenarioQuestionDTO> buildQuestionsLst(List<Object[]> rawDatas, Long scenarioId, Long campaignId, Long companySiteId) {
List<ScenarioQuestionDTO> lstQuestions = new ArrayList<>();
List<ScenarioAnswerDTO> lstAnswerOfQuestion = new ArrayList<>();
ScenarioQuestionDTO questionDTO = null;
for(int i = 0; i < rawDatas.size(); i++) {
if(rawDatas.get(i)[0] != null && !rawDatas.get(i)[0].toString().trim().equals("")) {
Integer questionIndex = null;
for (int i = 0; i < rawDatas.size(); i++) {
if (rawDatas.get(i)[0] != null && !rawDatas.get(i)[0].toString().trim().equals("")) {
questionIndex = Double.valueOf(rawDatas.get(i)[0].toString().trim()).intValue();
questionDTO = new ScenarioQuestionDTO();
// questionDTO.setCampaignId();
}
}
questionDTO.setScenarioId(scenarioId);
questionDTO.setCampaignId(campaignId);
questionDTO.setCompanySiteId(companySiteId);
questionDTO.setImportIndex(questionIndex);
if (rawDatas.get(i)[1].toString().trim().equals(BundleUtils.getLangString("scenario.template.text")))
questionDTO.setType((short) 0);
else if (rawDatas.get(i)[1].toString().trim().equals(BundleUtils.getLangString("scenario.template.singleChoice")))
questionDTO.setType((short) 1);
else questionDTO.setType((short) 2);
questionDTO.setQuestion(rawDatas.get(i)[2].toString().trim());
if (rawDatas.get(i)[5].toString().trim().equals(BundleUtils.getLangString("scenario.template.yes")))
questionDTO.setIsRequire((short) 1);
else questionDTO.setIsRequire((short) 0);
if (rawDatas.get(i)[6].toString().trim().equals(BundleUtils.getLangString("scenario.template.yes")))
questionDTO.setIsDefault((short) 1);
else questionDTO.setIsDefault((short) 0);
lstQuestions.add(questionDTO);
} else {
ScenarioAnswerDTO answerDto = new ScenarioAnswerDTO();
answerDto.setAnswer(rawDatas.get(i)[3].toString().trim());
if (rawDatas.get(i)[4].toString().trim().equals(BundleUtils.getLangString("scenario.template.yes")))
answerDto.setHasInput((short) 1);
else answerDto.setHasInput((short) 0);
if (rawDatas.get(i)[7] != null && !rawDatas.get(i)[7].toString().trim().equals("")) {
answerDto.setMappingQuestionId(Double.valueOf(rawDatas.get(i)[7].toString().trim()).longValue());
}
answerDto.setImportQuestionIndex(questionIndex);
answerDto.setCompanySiteId(companySiteId);
lstAnswerOfQuestion.add(answerDto);
}
}
questionOrderIndex = questionRepository.getMaxOrderId(scenarioId, campaignId, companySiteId);
if(questionOrderIndex == null) questionOrderIndex = 0L;
lstQuestions.forEach(q -> {
questionOrderIndex += 1;
q.setOrderIndex(questionOrderIndex);
q.setCode(campaignId + "_" + questionOrderIndex);
answerIndex = 0;
List<ScenarioAnswerDTO> answers = new ArrayList<>();
lstAnswerOfQuestion.forEach(a -> {
answerIndex += 1;
a.setOrderIndex(answerIndex);
if(a.getImportQuestionIndex() == q.getImportIndex()) answers.add(a);
});
q.setLstAnswers(answers);
});
questionOrderIndex = null;
return lstQuestions;
}
}
......@@ -25,4 +25,5 @@ public class ScenarioAnswerDTO implements Serializable {
public Date deleteTime;
public Long mappingQuestionId;
public Long campaignId;
public Integer importQuestionIndex;
}
......@@ -29,4 +29,5 @@ public class ScenarioQuestionDTO implements Serializable {
private Short isDefault;
private Short answerIndex;
private List<ScenarioAnswerDTO> lstAnswers;
private Integer importIndex;
}
package com.viettel.campaign.web.dto.request_dto;
import lombok.Getter;
import lombok.Setter;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
/**
* @author anhvd_itsol
*/
@Getter
@Setter
public class RequestImportDTO {
CommonsMultipartFile file;
}
......@@ -227,32 +227,4 @@ public class CampaignController {
return new ResponseEntity<>(result, HttpStatus.OK);
}
@RequestMapping(value = "/import-file", method = RequestMethod.POST)
public ResponseEntity<?> importFile(@RequestParam("file") MultipartFile file,
@RequestHeader("X-Auth-Token") String authToken) {
Locale locale = new Locale("vi", "VN");
try {
UserSession userSession = (UserSession) RedisUtil.getInstance().get(authToken);
if (file.isEmpty()) {
return new ResponseEntity<>(BundleUtils.getLangString("common.fileNotSelected"), HttpStatus.OK);
}
if (!Objects.equals(FilenameUtils.getExtension(file.getOriginalFilename()), Constants.FileType.xlsx)) {
return new ResponseEntity<>(BundleUtils.getLangString("common.fileInvalidFormat", locale), HttpStatus.OK);
}
//String path = saveUploadFile(file);
// List<CustomizeFields> dynamicHeaders = customerService.getDynamicHeader(userSession.getCompanySiteId());
// Map<String, Object> map = customerService.readAndValidateCustomer(path, dynamicHeaders, userSession, customerListId);
// File fileExport = (File) map.get("file");
// String message = (String) map.get("message");
// return ResponseEntity.ok()
// .header("Content-Type", Constants.MIME_TYPE.EXCEL_XLSX)
// .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=template_import_customer.xlsx")
// .header("Message", message)
// .body(Files.readAllBytes(fileExport.toPath()));
return new ResponseEntity<>(null, HttpStatus.OK);
} catch (Exception e) {
logger.error(e.getMessage(), e);
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
}
}
......@@ -8,6 +8,7 @@ import com.viettel.campaign.utils.RedisUtil;
import com.viettel.campaign.web.dto.ContactQuestResultDTO;
import com.viettel.campaign.web.dto.ResultDTO;
import com.viettel.campaign.web.dto.ScenarioDTO;
import com.viettel.campaign.web.dto.request_dto.RequestImportDTO;
import com.viettel.econtact.filter.UserSession;
import org.apache.commons.io.FilenameUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
......@@ -21,6 +22,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.file.Files;
......@@ -104,12 +106,11 @@ public class ScenarioController {
}
@RequestMapping(value = "/import-file", method = RequestMethod.POST)
public ResponseEntity<?> importFile(@RequestParam MultipartFile file) {
public ResponseEntity<?> importFile(@RequestParam MultipartFile file, @RequestParam Long scenarioId, @RequestParam Long campaignId, HttpServletRequest request) {
logger.info("------------IMPORT FILE TEMPLATE--------------");
Locale locale = new Locale("vi", "VN");
try {
UserSession userSession = new UserSession();
// UserSession userSession = (UserSession) RedisUtil.getInstance().get(authToken);
UserSession userSession = (UserSession) RedisUtil.getInstance().get(request.getHeader("X-Auth-Token"));
if (file.isEmpty()) {
return new ResponseEntity<>(BundleUtils.getLangString("common.fileNotSelected"), HttpStatus.OK);
}
......@@ -117,14 +118,18 @@ public class ScenarioController {
return new ResponseEntity<>(BundleUtils.getLangString("common.fileInvalidFormat", locale), HttpStatus.OK);
}
String path = saveUploadFile(file);
Map<String, Object> map = scenarioService.readAndValidateCustomer(path, userSession);
Map<String, Object> map = scenarioService.readAndValidateCustomer(path, scenarioId, campaignId, userSession.getCompanySiteId());
File fileExport = (File) map.get("file");
String message = (String) map.get("message");
return ResponseEntity.ok()
.header("Content-Type", Constants.MIME_TYPE.EXCEL_XLSX)
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=import_scenario_result.xlsx")
.header("Message", message)
.body(Files.readAllBytes(fileExport.toPath()));
ResultDTO resultDTO = new ResultDTO();
resultDTO.setErrorCode(Constants.ApiErrorCode.SUCCESS);
resultDTO.setDescription(message);
return new ResponseEntity<>(resultDTO, HttpStatus.OK);
// return ResponseEntity.ok()
// .header("Content-Type", Constants.MIME_TYPE.EXCEL_XLSX)
// .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=import_scenario_result.xlsx")
// .header("Message", message)
// .body(Files.readAllBytes(fileExport.toPath()));
} catch (Exception e) {
logger.error(e.getMessage());
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
......
......@@ -62,13 +62,13 @@ DATE_OF_BIRTH = Ngày sinh
MOBILE_NUMBER = Số điện thoại
USERNAME = Tài khoản
AREA_CODE = Khu vực
CALL_ALLOWED = CALL_ALLOWED
EMAIL_ALLOWED = EMAIL_ALLOWED
SMS_ALLOWED = SMS_ALLOWED
IPCC_STATUS = IPCC_STATUS
EMAIL = EMAIL
CUSTOMER_TYPE = CUSTOMER_TYPE
AVATAR_LINK = AVATAR_LINK
CALL_ALLOWED = Cho phép gọi
EMAIL_ALLOWED = Cho phép gửi email
SMS_ALLOWED = Cho phép gửi sms
IPCC_STATUS = Trạng thái Ipcc
EMAIL = Email
CUSTOMER_TYPE = Loại khách hàng
AVATAR_LINK = Đường dẫn ảnh đại diện
#Customer Excel Header
customer.no = STT
......
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