package tkio.service.impl;
import com.amazonaws.services.dynamodbv2.xspec.B;
import common.model.*;
import common.repository.*;
import common.service.UserService;
import dic.ContractTypeEnum;
import dic.RoleEnum;
import dic.RoleTypeEnum;
import org.apache.commons.collections.map.AbstractMapDecorator;
import org.apache.commons.collections.map.HashedMap;
import org.apache.commons.collections4.list.TreeList;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import tkio.model.Account;
import tkio.model.Crowd;
import tkio.model.PackageType;
import tkio.model.SalesManLeader;
import tkio.repository.*;
import tkio.service.AccountFlowRestrictService;
import tkio.service.TkioAccountService;
import tkio.task.AccountCheck;
import util.Constant;
import util.DateUtil;
import util.HttpClientUtil;
import util.ValidateUtil;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
/**
* Created by mxq on 2017/12/26.
*/
@Service
public class TkioAccountServiceImpl implements TkioAccountService {
private static final Logger logger = LoggerFactory.getLogger(TkioAccountServiceImpl.class);
//查询URI
private final static String URI_REPORT_BY_SQL = "/api/trackingio/bysql";
@Autowired
Account4WebRepository account4WebRepository;
@Autowired
SalesManLeaderRepository salesManLeaderRepository;
@Autowired
AccountRepository accountRepository;
@Autowired
BackVisitRepository backVisitRepository;
@Autowired
PaymentRepository paymentRepository;
@Autowired
ReminderRepository reminderRepository;
@Autowired
CampaignRepository campaignRepository;
@Autowired
ChannelRepository channelRepository;
@Autowired
AppRepository appRepository;
@Autowired
AccountFlowRestrictService accountFlowRestrictService;
@Autowired
UserRepository userRepository;
@Autowired
ContractMoneyRepository contractMoneyRepository;
@Autowired
ContractRepository contractRepository;
@Autowired
ContractChangeRepository contractChangeRepository;
@Autowired
PackageTypeRepository packageTypeRepository;
@Autowired
UserService userService;
@Autowired
ReminderLevelRepository reminderLevelRepository;
@Autowired
PressMoneyRepository pressMoneyRepository;
@Autowired
CrowdRepository crowdRepository;
@Override
public Map<String, Object> findSale(User user, Long sale) {
Map<String, Object> map = new HashMap();
String email = null;
if (null != sale) {
try {
SalesManLeader one = salesManLeaderRepository.findOne(Integer.parseInt(sale + ""));
User user1 = userRepository.findByEmail(one.getEmail());
if (null != user1)
map.put("old", user1.getName());
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
List<User> list = new ArrayList<>();
if (user.getRole().equals(RoleEnum.NORTH_BUSSINUSS.getKey()) || user.getRole().equals(RoleEnum.SOUTH_BUSSINUSS.getKey())) {
list = userService.findbyRole(user.getRole());
} else {
list = userRepository.findSales();
}
map.put("new", list);
return map;
}
@Override
public Account4Web updateSale(String email, String account) {
Account accountTkio = accountRepository.findByEmail(account);
Account4Web account4Web = account4WebRepository.findByEmail(account);
SalesManLeader leader = salesManLeaderRepository.findOneByEmail(email);
User user = userRepository.findByEmail(email);
accountTkio.setBussinessman(Long.parseLong(leader.getId() + ""));
accountRepository.save(accountTkio);
account4Web.setBussinessMan(Long.parseLong(leader.getId() + ""));
account4Web.setSaleEamil(user.getEmail());
return account4WebRepository.save(account4Web);
}
@Override
public List<Account4Web> findAll(User user) {
List<Account4Web> result = new ArrayList<>();
List<Account4Web> account4WebList = null;
if (user.getRole().equals(RoleEnum.MANAGER.getKey())) {
account4WebList = account4WebRepository.findAll();
} else {
List<Integer> idList = new ArrayList<>();
if (user.getRoleType().equals(RoleTypeEnum.MANAGER.getKey())) {
List<User> userList = userRepository.findAllUserByRole(user.getRole());
List<String> emialList = new ArrayList<>();
for (User u : userList) {
emialList.add(u.getEmail());
}
List<SalesManLeader> salesManLeaderList = salesManLeaderRepository.findAllByEmails(emialList);
if (ValidateUtil.isValid(salesManLeaderList)) {
for (SalesManLeader sml : salesManLeaderList) {
idList.add(sml.getId());
}
}
} else {
List<String> emailList = new ArrayList<>();
emailList.add(user.getEmail());
List<User> userList = userService.findAllSons(user.getId());
if (ValidateUtil.isValid(userList)) {
for (User u : userList) {
emailList.add(u.getEmail());
}
}
List<SalesManLeader> manLeaderList = salesManLeaderRepository.findAllByEmails(emailList);
if (ValidateUtil.isValid(manLeaderList)) {
for (SalesManLeader a : manLeaderList) {
idList.add(a.getId());
}
}
}
if (ValidateUtil.isValid(idList)) {
List<Account> accountList = accountRepository.findBussnissMan(idList);
List<String> emails = new ArrayList<>();
if (ValidateUtil.isValid(accountList)) {
for (Account ac : accountList) {
emails.add(ac.getEmail());
}
account4WebList = account4WebRepository.findByEmails(emails);
}
}
}
List<SalesManLeader> roles = salesManLeaderRepository.findAll();
Map<Long, String> busMap = new HashMap<>();
for (SalesManLeader u : roles) {
busMap.put((long) u.getId(), u.getName());
}
List<User> users = userRepository.findAll();
Map<String, Long> saleMap = new HashMap<>();
for (User u : users) {
saleMap.put(u.getEmail(), u.getId());
}
List<Reminder> reminderList = reminderRepository.findAllDistinct("tkio");
Map<Long, Boolean> reMap = new HashMap<>();
if (ValidateUtil.isValid(reminderList)) {
for (Reminder re : reminderList) {
reMap.put(re.getAccountId(), re.getRemindStatus());
}
}
List<PressMoney> allPress = pressMoneyRepository.findAllPress("tkio");
Map<Long, Boolean> pressMap = new HashMap<>();
if (ValidateUtil.isValid(allPress)) {
for (PressMoney re : allPress) {
pressMap.put(re.getAccountId(), re.getPressStatus());
}
}
if (ValidateUtil.isValid(account4WebList)) {
Map<String, Integer> backTimeMap = getBackTime();
Map<String, List<Contract>> payMap = getPay();
for (Account4Web aw : account4WebList) {
if (backTimeMap.containsKey(aw.getEmail())) {
aw.setBackTime(backTimeMap.get(aw.getEmail()));
} else {
aw.setBackTime(0);
}
if (payMap.containsKey(aw.getEmail())) {
List<Contract> contractList = payMap.get(aw.getEmail());
//aw.setMoney(contractList.get(contractList.size() - 1 ).getPayMoney());
aw.setContractStatus(contractRepository.findByPlatformAndEmailLimit1("tkio", aw.getEmail(), ContractTypeEnum.MAIN.getKey()).getStatus());
aw.setContractTime(contractList.size());
} else {
aw.setContractTime(0);
aw.setContractStatus("empty");
aw.setMoney(0L);
}
if (reMap.containsKey(aw.getAccountId())) {
aw.setRemStatus(reMap.get(aw.getAccountId()));
} else {
aw.setRemStatus(true);
}
if (pressMap.containsKey(aw.getAccountId())) {
aw.setPressStatus(true);
aw.setContractStatus("stop");
} else {
aw.setRemStatus(false);
}
if (busMap.containsKey(aw.getBussinessMan())) {
aw.setSaleName(busMap.get(aw.getBussinessMan()));
} else {
aw.setSaleName("");
}
if (saleMap.containsKey(aw.getSaleEamil())) {
aw.setSale(saleMap.get(aw.getSaleEamil()));
}
result.add(aw);
}
}
return result;
}
@Override
public Account4Web findOne(String email) {
List<Reminder> reminderList = reminderRepository.findAllDistinct("tkio");
Map<Long, Boolean> reMap = new HashMap<>();
if (ValidateUtil.isValid(reminderList)) {
for (Reminder re : reminderList) {
reMap.put(re.getAccountId(), re.getRemindStatus());
}
}
Account account = accountRepository.findByEmail(email);
//Account4Web aw = account4WebRepository.findByEmail(email);
Account4Web aw = null;
if (null == account) {
return null;
} else {
aw = new Account4Web();
aw.setAccountId(account.getId());
aw.setBussinessMan(account.getBussinessman());
}
List<SalesManLeader> roles = salesManLeaderRepository.findAll();
Map<Long, String> busMap = new HashMap<>();
for (SalesManLeader u : roles) {
busMap.put((long) u.getId(), u.getName());
}
List<User> users = userRepository.findAll();
Map<String, Long> saleMap = new HashMap<>();
for (User u : users) {
saleMap.put(u.getEmail(), u.getId());
}
List<BackVisit> backVisitList = backVisitRepository.findAllByPlatformAndEmail("tkio", email);
if (ValidateUtil.isValid(backVisitList)) {
aw.setBackTime(backVisitList.size());
} else {
aw.setBackTime(0);
}
List<Contract> contractList = contractRepository.findByPlatformAndEmail("tkio", email, ContractTypeEnum.MAIN.getKey());
if (ValidateUtil.isValid(contractList)) {
//aw.setMoney(contractList.get(contractList.size() - 1 ).getPayMoney());
aw.setContractStatus(contractList.get(contractList.size() - 1).getStatus());
aw.setContractTime(contractList.size());
} else {
aw.setContractTime(0);
aw.setContractStatus("empty");
aw.setMoney(0L);
}
if (reMap.containsKey(aw.getAccountId())) {
aw.setRemStatus(reMap.get(aw.getAccountId()));
} else {
aw.setRemStatus(true);
}
if (busMap.containsKey(aw.getBussinessMan())) {
aw.setSaleName(busMap.get(aw.getBussinessMan()));
} else {
aw.setSaleName("");
}
return aw;
}
@Override
public List<ReminderLevel> findReminderlevel() {
return reminderLevelRepository.findAll();
}
@Override
public Reminder forbiden(User user, Reminder resource) {
resource.setUser(user.getId());
resource.setModifyTime(new Date());
resource.setPlatform("tkio");
resource.setRemindStatus(false);
resource.setDs(DateUtil.getBeforeDays(0));
return reminderRepository.save(resource);
}
@Override
public Reminder enable(User user, Reminder resource) {
resource.setUser(user.getId());
resource.setModifyTime(new Date());
resource.setPlatform("tkio");
resource.setRemindStatus(true);
resource.setDs(DateUtil.getBeforeDays(0));
return reminderRepository.save(resource);
}
@Override
public void forbidenPress(User user, PressMoney resource) {
PressMoney pressMoney = pressMoneyRepository.findOne("tkio", resource.getAccountId());
pressMoney.setUser(user.getId());
pressMoney.setModifyTime(new Date());
pressMoney.setPressStatus(false);
pressMoney.setDs(DateUtil.getBeforeDays(0));
Contract contract = contractRepository.findByPlatformAndEmailLimit1("tkio", resource.getEmail(), ContractTypeEnum.MAIN.getKey());
if (null != contract) {
contract.setStatus("executing");
contractRepository.save(contract);
}
Account4Web account4Web = account4WebRepository.findByEmail(resource.getEmail());
account4Web.setStatus("已激活");
account4WebRepository.save(account4Web);
Account account = accountRepository.findByEmail(resource.getEmail());
account.setStatus(1);
accountRepository.save(account);
pressMoneyRepository.save(pressMoney);
return;
}
@Override
public PressMoney enablePress(User user, PressMoney resource) {
PressMoney pressMoney = pressMoneyRepository.findOne("tkio", resource.getAccountId());
if (null == pressMoney) {
resource.setUser(user.getId());
resource.setModifyTime(new Date());
resource.setPlatform("tkio");
resource.setPressStatus(true);
resource.setDs(DateUtil.getBeforeDays(0));
pressMoneyRepository.save(resource);
} else {
pressMoney.setUser(user.getId());
pressMoney.setModifyTime(new Date());
pressMoney.setPressStatus(true);
pressMoney.setDs(DateUtil.getBeforeDays(0));
pressMoneyRepository.save(pressMoney);
}
Contract contract = contractRepository.findByPlatformAndEmailLimit1("tkio", resource.getEmail(), ContractTypeEnum.MAIN.getKey());
if (null != contract) {
contract.setStatus("stop");
contractRepository.save(contract);
}
Account4Web account4Web = account4WebRepository.findByEmail(resource.getEmail());
account4Web.setStatus("已禁用");
account4WebRepository.save(account4Web);
Account account = accountRepository.findByEmail(resource.getEmail());
account.setStatus(0);
accountRepository.save(account);
return null;
}
@Override
public Payment pay(User user, Payment resource) {
resource.setUser(user.getId());
resource.setPayDate(new Date());
resource.setPlatform("tkio");
resource.setDs(DateUtil.getBeforeDays(0));
Reminder re = new Reminder();
re.setUser(user.getId());
re.setModifyTime(new Date());
re.setPlatform("tkio");
re.setRemindStatus(true);
re.setDs(DateUtil.getBeforeDays(0));
reminderRepository.save(re);
return paymentRepository.save(resource);
}
@Override
public BackVisit visit(User user, BackVisit resource) {
resource.setUser(user.getId());
resource.setVisitDate(new Date());
resource.setPlatform("tkio");
resource.setDs(DateUtil.getBeforeDays(0));
return backVisitRepository.save(resource);
}
@Override
public Map<String, Integer> findFunTimes(Long account, String startDate, String endDate) {
Map<String, Integer> result = new HashMap<>();
List<Account> accountList = accountRepository.findByRootParent(account);
List<Long> idList = new ArrayList<>();
for (Account ac : accountList) {
idList.add(ac.getId());
}
List<String> appkeys = appRepository.findAppkeys(idList);
String appkeyStr = String.join("','", appkeys);
BigInteger numAccount = accountRepository.countByRootParent(account, startDate, endDate);
BigInteger numApp = appRepository.countByAccount(idList, startDate, endDate);
BigInteger numCampaign = campaignRepository.countByAccount(idList, startDate, endDate);
BigInteger numChannel = channelRepository.countByAccount(idList, startDate, endDate);
BigInteger event_sum = accountFlowRestrictService.getTotalNum(startDate, endDate, "'" + appkeyStr + "'", "account_io_flow_restrict", "event_sum");
BigInteger click_sum = accountFlowRestrictService.getTotalNum(startDate, endDate, "'" + appkeyStr + "'", "account_track_flow_restrict", "click_sum");
result.put("numAccount", numAccount.intValue());
result.put("numApp", numApp.intValue());
result.put("numCampaign", numCampaign.intValue());
result.put("numChannel", numChannel.intValue());
result.put("event_sum", event_sum.intValue());
result.put("click_sum", click_sum.intValue());
return result;
}
@Override
public List<Map<String, Object>> findPv(Long account, String startDate, String endDate) {
List<Map<String, Object>> result = new ArrayList<>();
List<Account> accountList = accountRepository.findByRootParent(account);
List<Long> idList = new ArrayList<>();
for (Account ac : accountList) {
idList.add(ac.getId());
}
List<String> appkeys = appRepository.findAppkeys(idList);
String appkeyStr = String.join("','", appkeys);
String querySql = "select menu, count(*) as pv, count(distinct(xwho)) as uv, count(*)/count(distinct(xwho)) as puv " +
"from tkio_bigtable_view.event_f0f251af10e66a0c94d2e923d8863105 where user_appkey in ('" + appkeyStr + "') " +
"AND ds >= '" + startDate + "' AND ds <= '" + endDate + "' group by menu;";
String url = Constant.reportUrl + URI_REPORT_BY_SQL;
Map<String, String> conditions = new HashMap<>();
conditions.put("sql", querySql);
conditions.put("dbtype", "presto");
conditions.put("datatype", "list");
conditions.put("iscache", "0");
String responseJson = HttpClientUtil.doHttpPostRequest(url, "trackingio", conditions);
if (responseJson.contains("val")) {
try {
JSONObject jsonObject = new JSONObject(responseJson);
JSONArray valArr = jsonObject.getJSONArray("val");
if (null != valArr && valArr.length() > 0) {
for (int i = 0; i < valArr.length(); i++) {
JSONObject val = valArr.getJSONObject(i);
Map<String, Object> map = new HashMap<>();
map.put("menu", val.getString("menu"));
map.put("pv", val.getInt("pv"));
map.put("uv", val.getInt("uv"));
map.put("puv", val.getInt("puv"));
result.add(map);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
return result;
}
@Override
public List<Reminder> findRed(Long account, String startDate, String endDate) {
List<Reminder> result = new ArrayList<>();
List<User> userList = userRepository.findAll();
Map<Long, String> userMap = new HashMap<>();
for (User u : userList) {
userMap.put(u.getId(), u.getName());
}
List<Reminder> list = reminderRepository.findAll(account, startDate, endDate, "tkio");
if (ValidateUtil.isValid(list)) {
for (Reminder re : list) {
re.setUserName(userMap.get(re.getUser()));
result.add(re);
}
}
return result;
}
@Override
public List<BackVisit> findVisit(Long account, String startDate, String endDate) {
List<BackVisit> result = new ArrayList<>();
List<User> userList = userRepository.findAll();
Map<Long, String> userMap = new HashMap<>();
for (User u : userList) {
userMap.put(u.getId(), u.getName());
}
List<BackVisit> list = backVisitRepository.findAll(account, startDate, endDate, "tkio");
if (ValidateUtil.isValid(list)) {
for (BackVisit re : list) {
re.setUserName(userMap.get(re.getUser()));
result.add(re);
}
}
return result;
}
@Override
public List<ContractMoney> findPay(String email, String startDate, String endDate) {
List<ContractMoney> result = new ArrayList<>();
List<User> userList = userRepository.findAll();
Map<Long, String> userMap = new HashMap<>();
for (User u : userList) {
userMap.put(u.getId(), u.getName());
}
List<ContractMoney> list = contractMoneyRepository.findByDs(startDate, endDate, email, "tkio");
if (ValidateUtil.isValid(list)) {
for (ContractMoney cm : list) {
Long user = null == cm.getModifyAccount() ? cm.getUser() : cm.getModifyAccount();
cm.setCreateName(userMap.containsKey(user) ? userMap.get(user) : "");
result.add(cm);
}
}
return result;
}
@Override
public List<Contract> findContract(String email) {
List<Contract> result = new ArrayList<>();
List<User> userList = userRepository.findAll();
Map<Long, String> userMap = new HashMap<>();
for (User u : userList) {
userMap.put(u.getId(), u.getName());
}
List<PackageType> typeList = packageTypeRepository.findAll();
Map<Long, String> typeMap = new HashMap<>();
if (ValidateUtil.isValid(typeList)) {
for (PackageType s : typeList) {
typeMap.put(s.getId(), s.getPackageName());
}
}
List<Contract> contractList = contractRepository.findByPlatformAndEmail("tkio", email, ContractTypeEnum.MAIN.getKey());
if (ValidateUtil.isValid(contractList)) {
for (Contract cm : contractList) {
cm.setSaleName(userMap.containsKey(cm.getSale()) ? userMap.get(cm.getSale()) : "");
cm.setPriceLevelName(typeMap.containsKey(cm.getPriceLevel()) ? typeMap.get(cm.getPriceLevel()) : "");
result.add(cm);
}
}
return result;
}
@Override
public List<ContractChange> findContractChange(String email, String startDate, String endDate) {
List<ContractChange> result = new ArrayList<>();
List<User> userList = userRepository.findAll();
Map<Long, String> userMap = new HashMap<>();
for (User u : userList) {
userMap.put(u.getId(), u.getName());
}
List<PackageType> typeList = packageTypeRepository.findAll();
Map<Long, String> typeMap = new HashMap<>();
if (ValidateUtil.isValid(typeList)) {
for (PackageType s : typeList) {
typeMap.put(s.getId(), s.getPackageName());
}
}
List<ContractChange> contractChangeList = contractChangeRepository.findByPlatformAndEmail("tkio", email, startDate, endDate);
if (ValidateUtil.isValid(contractChangeList)) {
for (ContractChange cm : contractChangeList) {
Long user = null == cm.getModifyAccount() ? cm.getUser() : cm.getModifyAccount();
cm.setCreateName(userMap.containsKey(user) ? userMap.get(user) : "");
cm.setLevelName(typeMap.containsKey(cm.getLevel()) ? typeMap.get(cm.getLevel()) : "");
result.add(cm);
}
}
return result;
}
@Override
public void contractPay(User loginUser, ContractMoney resource) {
Contract contract = contractRepository.findByCode(resource.getContractCode());
//增值服务
if (contract.getType().equals(ContractTypeEnum.INCREMENT.getKey())) {
//回本分析不作操作
if (contract.getPriceLevel().longValue() == 3L) {
return;
}
Crowd crowd = crowdRepository.findOne(resource.getContractCode());
if (null != crowd) {
crowd.setPayment(1);
crowdRepository.save(crowd);
}
//人群分析
if (null == contract.getEndDate()) {
contract.setStatus("end");
contractRepository.save(contract);
}
} else {//基础套餐
Account account = accountRepository.findByEmail(resource.getEmail());
PressMoney press = pressMoneyRepository.findOnePress("tkio", account.getId());
//如果被催款了,恢复状态
if (press != null) {
account.setStatus(1);
accountRepository.save(account);
contract.setStatus("executing");
contractRepository.save(contract);
}
}
}
public Map<String, Integer> getBackTime() {
Map<String, Integer> map = new HashMap<>();
List<BackVisit> all = backVisitRepository.findAllByPlatform("tkio");
if (ValidateUtil.isValid(all)) {
for (BackVisit bv : all) {
if (map.containsKey(bv.getEmail())) {
map.put(bv.getEmail(), map.get(bv.getEmail()) + 1);
} else {
map.put(bv.getEmail(), 1);
}
}
}
return map;
}
public Map<String, List<Contract>> getPay() {
Map<String, List<Contract>> map = new HashMap<>();
List<Contract> contractList = contractRepository.findByPlatform("tkio");
if (ValidateUtil.isValid(contractList)) {
for (Contract pa : contractList) {
if (map.containsKey(pa.getEmail())) {
List<Contract> list = map.get(pa.getEmail());
list.add(pa);
map.put(pa.getEmail(), list);
} else {
List<Contract> list = new TreeList<>();
list.add(pa);
map.put(pa.getEmail(), list);
}
}
}
return map;
}
}