Commit 6dbd46bb authored by renjie's avatar renjie

异步任务

parent 3b1002a9
package com.edgec.browserbackend.browser.ErrorCode; package com.edgec.browserbackend.browser.ErrorCode;
import com.edgec.browserbackend.browser.domain.IpTransaction;
import com.edgec.browserbackend.common.commons.error.ErrorCode; import com.edgec.browserbackend.common.commons.error.ErrorCode;
import com.fasterxml.jackson.annotation.JsonValue; import com.fasterxml.jackson.annotation.JsonValue;
...@@ -14,7 +15,9 @@ public enum BrowserErrorCode implements ErrorCode { ...@@ -14,7 +15,9 @@ public enum BrowserErrorCode implements ErrorCode {
IPNOTEXIST(BROWSER_BASE+201, "The ip do not exist"), IPNOTEXIST(BROWSER_BASE+201, "The ip do not exist"),
IPNOTBINDTOSHOP(BROWSER_BASE+202, "The ip do not bind this shop."), IPNOTBINDTOSHOP(BROWSER_BASE+202, "The ip do not bind this shop."),
GROUPNOTEXIST(BROWSER_BASE+301, "The group do not exist"); GROUPNOTEXIST(BROWSER_BASE+301, "The group do not exist"),
IPTRANSACTIONNOTEXIST(BROWSER_BASE+401, "The ipTransaction do not exist");
......
...@@ -26,7 +26,7 @@ public class IpControlloer { ...@@ -26,7 +26,7 @@ public class IpControlloer {
public ResultDto buyIp(Principal principal, @RequestBody IpResourceRequestDto ipResourceRequestDto){ public ResultDto buyIp(Principal principal, @RequestBody IpResourceRequestDto ipResourceRequestDto){
ResultDto resultDto = new ResultDto(); ResultDto resultDto = new ResultDto();
try { try {
List<IpResourceDto> ipResourceDto = ipResourceService.buyIp(principal.getName(), ipResourceRequestDto); IpTransactionDto ipResourceDto = ipResourceService.buyIp(principal.getName(), ipResourceRequestDto);
resultDto.setData(ipResourceDto); resultDto.setData(ipResourceDto);
resultDto.setStatus(0); resultDto.setStatus(0);
} catch (ClientRequestException e) { } catch (ClientRequestException e) {
...@@ -100,4 +100,22 @@ public class IpControlloer { ...@@ -100,4 +100,22 @@ public class IpControlloer {
} }
return resultDto; return resultDto;
} }
@RequestMapping(value = "/queryTransaction", method = RequestMethod.POST)
public ResultDto queryTransaction(Principal principal, @RequestBody IpTransactionDto ipTransactionDto) {
ResultDto resultDto = new ResultDto();
try {
IpTransactionDto ipTransactionDto1 = ipResourceService.queryTransaction(principal.getName(), ipTransactionDto.getTid());
resultDto.setData(ipTransactionDto1);
resultDto.setStatus(0);
}catch (ClientRequestException e) {
resultDto.setStatus(-1);
Map<String, Object> statusInfo = new HashMap<>();
statusInfo.put("code", e.getErrorCode());
statusInfo.put("message", e.getMessage());
resultDto.setStatusInfo(statusInfo);
}
return resultDto;
}
} }
...@@ -3,6 +3,8 @@ package com.edgec.browserbackend.browser.domain; ...@@ -3,6 +3,8 @@ package com.edgec.browserbackend.browser.domain;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
import java.util.List;
/** /**
* @Desc * @Desc
* @Author jason * @Author jason
...@@ -13,17 +15,19 @@ public class IpTransaction { ...@@ -13,17 +15,19 @@ public class IpTransaction {
@Id @Id
private String tid; private String tid;
private int username; private String username;
private long createTime; private long createTime;
private int status; private int status;
public int getUsername() { private List<String> ipIds;
public String getUsername() {
return username; return username;
} }
public void setUsername(int username) { public void setUsername(String username) {
this.username = username; this.username = username;
} }
...@@ -50,4 +54,12 @@ public class IpTransaction { ...@@ -50,4 +54,12 @@ public class IpTransaction {
public void setTid(String tid) { public void setTid(String tid) {
this.tid = tid; this.tid = tid;
} }
public List<String> getIpIds() {
return ipIds;
}
public void setIpIds(List<String> ipIds) {
this.ipIds = ipIds;
}
} }
package com.edgec.browserbackend.browser.dto; package com.edgec.browserbackend.browser.dto;
import com.edgec.browserbackend.browser.domain.IpTransaction;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import java.util.ArrayList;
import java.util.List;
/** /**
* @Desc * @Desc
* @Author jason * @Author jason
* @CreateTime 2020/3/18 9:57 上午 * @CreateTime 2020/3/18 9:57 上午
**/ **/
@JsonIgnoreProperties(ignoreUnknown = true)
public class IpTransactionDto { public class IpTransactionDto {
private String tid; private String tid;
private int status; private int status;
private IpResourceDto ipResourceDto; private List<IpResourceDto> ipResourceDtos;
public IpTransactionDto(){
}
public IpTransactionDto(IpTransaction ipTransaction) {
this.tid = ipTransaction.getTid();
this.status = ipTransaction.getStatus();
ipResourceDtos = new ArrayList<>();
}
public String getTid() { public String getTid() {
return tid; return tid;
...@@ -26,11 +43,11 @@ public class IpTransactionDto { ...@@ -26,11 +43,11 @@ public class IpTransactionDto {
this.status = status; this.status = status;
} }
public IpResourceDto getIpResourceDto() { public List<IpResourceDto> getIpResourceDtos() {
return ipResourceDto; return ipResourceDtos;
} }
public void setIpResourceDto(IpResourceDto ipResourceDto) { public void setIpResourceDtos(List<IpResourceDto> ipResourceDtos) {
this.ipResourceDto = ipResourceDto; this.ipResourceDtos = ipResourceDtos;
} }
} }
package com.edgec.browserbackend.browser.repository;
import com.edgec.browserbackend.browser.domain.IpTransaction;
import org.springframework.data.mongodb.repository.MongoRepository;
/**
* @Desc
* @Author jason
* @CreateTime 2020/3/18 5:21 下午
**/
public interface IpTransactionRepository extends MongoRepository<IpTransaction, String> {
}
...@@ -5,8 +5,6 @@ import com.alibaba.fastjson.JSONObject; ...@@ -5,8 +5,6 @@ import com.alibaba.fastjson.JSONObject;
import com.edgec.browserbackend.account.domain.Account; import com.edgec.browserbackend.account.domain.Account;
import com.edgec.browserbackend.account.domain.IpChargeRequestDto; import com.edgec.browserbackend.account.domain.IpChargeRequestDto;
import com.edgec.browserbackend.account.domain.IpChargeResultDto; import com.edgec.browserbackend.account.domain.IpChargeResultDto;
import com.edgec.browserbackend.account.dto.CvmChargeRegion;
import com.edgec.browserbackend.account.dto.ResultDto;
import com.edgec.browserbackend.account.exception.AccountErrorCode; import com.edgec.browserbackend.account.exception.AccountErrorCode;
import com.edgec.browserbackend.account.repository.AccountRepository; import com.edgec.browserbackend.account.repository.AccountRepository;
import com.edgec.browserbackend.account.service.AccountService; import com.edgec.browserbackend.account.service.AccountService;
...@@ -16,31 +14,26 @@ import com.edgec.browserbackend.browser.dto.*; ...@@ -16,31 +14,26 @@ import com.edgec.browserbackend.browser.dto.*;
import com.edgec.browserbackend.browser.repository.*; import com.edgec.browserbackend.browser.repository.*;
import com.edgec.browserbackend.browser.service.IpResourceService; import com.edgec.browserbackend.browser.service.IpResourceService;
import com.edgec.browserbackend.common.commons.error.ClientRequestException; import com.edgec.browserbackend.common.commons.error.ClientRequestException;
import com.edgec.browserbackend.common.commons.error.ErrorCode;
import com.edgec.browserbackend.common.dto.Result;
import com.edgec.browserbackend.common.utils.FileUtil; import com.edgec.browserbackend.common.utils.FileUtil;
import com.edgec.browserbackend.common.utils.ThreadPoolUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.couchbase.CouchbaseProperties;
import org.springframework.core.env.Environment;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.aggregation.ArrayOperators;
import org.springframework.http.*; import org.springframework.http.*;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import javax.swing.text.Document;
import java.io.File; import java.io.File;
import java.text.MessageFormat;
import java.time.Instant; import java.time.Instant;
import java.util.*; import java.util.*;
import java.util.regex.Pattern; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
...@@ -82,6 +75,9 @@ public class IpResourceServiceImpl implements IpResourceService { ...@@ -82,6 +75,9 @@ public class IpResourceServiceImpl implements IpResourceService {
@Autowired @Autowired
private PlatformOptionsRepository platformOptionsRepository; private PlatformOptionsRepository platformOptionsRepository;
@Autowired
private IpTransactionRepository ipTransactionRepository;
public HttpHeaders buildPostHeader() { public HttpHeaders buildPostHeader() {
HttpHeaders header = new HttpHeaders(); HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_JSON); header.setContentType(MediaType.APPLICATION_JSON);
...@@ -158,7 +154,7 @@ public class IpResourceServiceImpl implements IpResourceService { ...@@ -158,7 +154,7 @@ public class IpResourceServiceImpl implements IpResourceService {
} }
@Override @Override
public List<IpResourceDto> buyIp(String username, IpResourceRequestDto ipResourceRequestDto) throws Exception { public IpTransactionDto buyIp(String username, IpResourceRequestDto ipResourceRequestDto) throws Exception {
String URL = (profiles.equals("dev") || profiles.equals("staging"))? TESTURL : CLOUDAMURL; String URL = (profiles.equals("dev") || profiles.equals("staging"))? TESTURL : CLOUDAMURL;
Account account = accountRepository.findByName(username); Account account = accountRepository.findByName(username);
if (account == null) if (account == null)
...@@ -173,78 +169,114 @@ public class IpResourceServiceImpl implements IpResourceService { ...@@ -173,78 +169,114 @@ public class IpResourceServiceImpl implements IpResourceService {
String price = vendorPrices.stream() String price = vendorPrices.stream()
.filter(x -> Vendor.valueOf(ipResourceRequestDto.getVendor()).getValue().equals(x.substring(0, x.indexOf("-")))) .filter(x -> Vendor.valueOf(ipResourceRequestDto.getVendor()).getValue().equals(x.substring(0, x.indexOf("-"))))
.map(x -> x.substring(x.lastIndexOf("-") + 1)).collect(Collectors.joining()); .map(x -> x.substring(x.lastIndexOf("-") + 1)).collect(Collectors.joining());
IpChargeResultDto ipChargeResultDto = accountService.preChargeByMoney(username, Double.valueOf(price)); IpChargeResultDto ipChargeResultDto = accountService.preChargeByMoney(username, Double.valueOf(price) * ipResourceRequestDto.getAmount());
if (!ipChargeResultDto.isSuccess()) { if (!ipChargeResultDto.isSuccess()) {
throw new ClientRequestException(AccountErrorCode.NOTENOUGHBALANCE); throw new ClientRequestException(AccountErrorCode.NOTENOUGHBALANCE);
} }
List<IpResourceDto> ipResourceDtos = new ArrayList<>();
RestTemplate restTemplate = new RestTemplate();
HttpHeaders header = buildPostHeader();
HashMap<String, Object> map = new HashMap<>();
map.put("name", ipResourceRequestDto.getName());
map.put("region", ipResourceRequestDto.getRegion());
if (ipResourceRequestDto.getUnit().equals("month") && ipResourceRequestDto.getPeriod() == 6)
ipResourceRequestDto.setPeriod(7);
else if (ipResourceRequestDto.getUnit().equals("month") && ipResourceRequestDto.getPeriod() == 12)
ipResourceRequestDto.setPeriod(14);
map.put("period", String.valueOf(ipResourceRequestDto.getPeriod()));
map.put("provider", ipResourceRequestDto.getVendor());
map.put("unit", ipResourceRequestDto.getUnit());
map.put("amount", String.valueOf(ipResourceRequestDto.getAmount()));
String password; String password;
if (StringUtils.isNotBlank(ipResourceRequestDto.getPassword())) if (StringUtils.isNotBlank(ipResourceRequestDto.getPassword()))
password = ipResourceRequestDto.getPassword(); password = ipResourceRequestDto.getPassword();
else else
password = genRandom(3, 12); password = genRandom(3, 12);
map.put("loginPassword", password);
map.put("startscript", startscript); IpTransaction ipTransaction = new IpTransaction();
map.put("ipkeptperiod", ipResourceRequestDto.getIpkeptperiod()); ipTransaction.setCreateTime(Instant.now().toEpochMilli());
HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(map, header); ipTransaction.setUsername(username);
IpBuyResultDto ipBuyResultDto = null; ipTransaction.setStatus(0);
try {
ipBuyResultDto = restTemplate.postForObject(URL + "/intelligroup/ipresources?accountId=browser", httpEntity, IpBuyResultDto.class); List<IpResourceDto> ipResourceDtos = new ArrayList<>();
if (StringUtils.isNotBlank(ipBuyResultDto.getErrorCode())) List<String> ipIds = new ArrayList<>();
throw new Exception(ipBuyResultDto.getErrorCode());
} catch (Throwable e) { for (int i = 0; i < ipResourceRequestDto.getAmount(); i++) {
logger.error("fail to post request", e.getMessage()); IpResource ipResource = new IpResource();
logger.error(e.getMessage()); ipResource.setAddr("");
throw e; ipResource.setIpType(IpType.VENDOR);
} ipResource.setPurchasedTime(Instant.now().toEpochMilli());
try { ipResource.setValidTime(Instant.now().toEpochMilli());
if (ipBuyResultDto != null && ipBuyResultDto.getIplist() != null && ipBuyResultDto.getIplist().size() >= 1) { ipResource.setPort(port);
ipBuyResultDto.getIplist().forEach(x -> { ipResource.setVendor(Vendor.valueOf(ipResourceRequestDto.getVendor()));
IpResource ipResource = new IpResource(); ipResource.setStatus(0);
ipResource.setAddr(x.getIp()); ipResource.setUsername(USERNAME);
ipResource.setIpType(IpType.VENDOR); if (account.getParent() != null)
ipResource.setPurchasedTime(Instant.now().toEpochMilli()); ipResource.setUserParent(account.getParent());
ipResource.setValidTime(Instant.parse(x.getValidTill()).toEpochMilli()); ipResource.setRegion(ipResourceRequestDto.getRegion());
ipResource.setPort(port); ipResource.setRegionCn(ipResourceRequestDto.getRegionCn());
ipResource.setVendor(Vendor.valueOf(ipResourceRequestDto.getVendor())); ipResource.setProtocol(protocol);
ipResource.setStatus(0); ipResource.setPassword(password);
ipResource.setUsername(USERNAME); ipResource.setOwner(username);
if (account.getParent() != null) IpResource ipResource1 = ipResourceRepository.save(ipResource);
ipResource.setUserParent(account.getParent()); ipResourceDtos.add(new IpResourceDto(ipResource1, null));
ipResource.setRegion(ipResourceRequestDto.getRegion()); ipIds.add(ipResource1.getId());
ipResource.setRegionCn(ipResourceRequestDto.getRegionCn());
ipResource.setProtocol(protocol);
ipResource.setPassword(password);
ipResource.setOwner(username);
ipResourceRepository.save(ipResource);
ipResourceDtos.add(new IpResourceDto(ipResource, null));
});
}
} catch (Exception e) {
logger.error("fail to post request", e.getMessage());
logger.error(e.getMessage());
throw new ClientRequestException(BrowserErrorCode.UNKNOWN);
} }
ipTransaction.setIpIds(ipIds);
ipTransactionRepository.save(ipTransaction);
IpTransactionDto ipTransactionDto = new IpTransactionDto(ipTransaction);
ipTransactionDto.setIpResourceDtos(ipResourceDtos);
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
RestTemplate restTemplate = new RestTemplate();
HttpHeaders header = buildPostHeader();
HashMap<String, Object> map = new HashMap<>();
map.put("name", ipResourceRequestDto.getName());
map.put("region", ipResourceRequestDto.getRegion());
if (ipResourceRequestDto.getUnit().equals("month") && ipResourceRequestDto.getPeriod() == 6)
ipResourceRequestDto.setPeriod(7);
else if (ipResourceRequestDto.getUnit().equals("month") && ipResourceRequestDto.getPeriod() == 12)
ipResourceRequestDto.setPeriod(14);
map.put("period", String.valueOf(ipResourceRequestDto.getPeriod()));
map.put("provider", ipResourceRequestDto.getVendor());
map.put("unit", ipResourceRequestDto.getUnit());
map.put("amount", String.valueOf(ipResourceRequestDto.getAmount()));
map.put("loginPassword", password);
map.put("startscript", startscript);
map.put("ipkeptperiod", ipResourceRequestDto.getIpkeptperiod());
HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(map, header);
IpBuyResultDto ipBuyResultDto = null;
try {
ipBuyResultDto = restTemplate.postForObject(URL + "/intelligroup/ipresources?accountId=browser", httpEntity, IpBuyResultDto.class);
if (StringUtils.isNotBlank(ipBuyResultDto.getErrorCode())) {
IpChargeRequestDto ipChargeRequestDto = buildIpChargeRequestDto(ipResourceRequestDto, 1);
accountService.chargeByMoney(username, -Double.valueOf(price)*ipChargeRequestDto.getAmount(), ipChargeRequestDto);
logger.error("fail to buy ip");
logger.error(ipBuyResultDto.getErrorCode());
}
if (ipBuyResultDto != null && ipBuyResultDto.getIplist() != null && ipBuyResultDto.getIplist().size() >= 1) {
AtomicInteger index = new AtomicInteger();
ipBuyResultDto.getIplist().forEach(x -> {
IpResource ipResource = ipResourceRepository.findById(ipResourceDtos.get(index.get()).getId()).orElse(null);
if (ipResource != null) {
ipResource.setAddr(x.getIp());
ipResource.setPurchasedTime(Instant.now().toEpochMilli());
ipResource.setValidTime(Instant.parse(x.getValidTill()).toEpochMilli());
ipResourceRepository.save(ipResource);
} else {
logger.error("no ipResource");
}
index.getAndIncrement();
});
if (ipBuyResultDto.getIplist().size() < ipResourceDtos.size()) {
IpChargeRequestDto ipChargeRequestDto = buildIpChargeRequestDto(ipResourceRequestDto, 1);
accountService.chargeByMoney(username, -Double.valueOf(price)*(ipResourceDtos.size() - ipBuyResultDto.getIplist().size()), ipChargeRequestDto);
}
}
ipTransaction.setStatus(1);
ipTransactionRepository.save(ipTransaction);
} catch (Exception e) {
logger.error(e.getMessage());
}
}, ThreadPoolUtils.taskExecutorPool);
IpChargeRequestDto ipChargeRequestDto = buildIpChargeRequestDto(ipResourceRequestDto, 1); IpChargeRequestDto ipChargeRequestDto = buildIpChargeRequestDto(ipResourceRequestDto, 1);
accountService.chargeByMoney(username, Double.valueOf(price), ipChargeRequestDto); accountService.chargeByMoney(username, Double.valueOf(price) * ipChargeRequestDto.getAmount(), ipChargeRequestDto);
return ipResourceDtos; return ipTransactionDto;
} }
@Override @Override
...@@ -512,6 +544,22 @@ public class IpResourceServiceImpl implements IpResourceService { ...@@ -512,6 +544,22 @@ public class IpResourceServiceImpl implements IpResourceService {
@Override @Override
public IpTransactionDto queryTransaction(String username, String tid) { public IpTransactionDto queryTransaction(String username, String tid) {
Account account = accountRepository.findByName(username);
if (account == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST);
if (account.getPermission() < 8)
throw new ClientRequestException(AccountErrorCode.NOPERMISSION);
IpTransaction ipTransaction = ipTransactionRepository.findById(tid).orElse(null);
if (ipTransaction == null)
throw new ClientRequestException(BrowserErrorCode.IPTRANSACTIONNOTEXIST);
IpTransactionDto ipTransactionDto = new IpTransactionDto(ipTransaction);
for (String id : ipTransaction.getIpIds()) {
IpResource ipResource = ipResourceRepository.findById(id).orElse(null);
if (ipResource != null) {
IpResourceDto ipResourceDto = new IpResourceDto(ipResource, null);
ipTransactionDto.getIpResourceDtos().add(ipResourceDto);
}
}
// IpInfoResultDto ipInfoResultDto = new IpInfoResultDto(); // IpInfoResultDto ipInfoResultDto = new IpInfoResultDto();
// Map<String, String> params = new HashMap<String, String>(); // Map<String, String> params = new HashMap<String, String>();
// params.put("accountId", "browser"); // params.put("accountId", "browser");
...@@ -524,6 +572,6 @@ public class IpResourceServiceImpl implements IpResourceService { ...@@ -524,6 +572,6 @@ public class IpResourceServiceImpl implements IpResourceService {
// ipResource.setPurchasedTime(Long.valueOf((String) jsonObject.get("createdWhen"))); // ipResource.setPurchasedTime(Long.valueOf((String) jsonObject.get("createdWhen")));
// ipResource.setValidTime(Long.valueOf((String)jsonObject.get("validTill"))); // ipResource.setValidTime(Long.valueOf((String)jsonObject.get("validTill")));
// } // }
return null; return ipTransactionDto;
} }
} }
...@@ -7,7 +7,7 @@ import java.util.List; ...@@ -7,7 +7,7 @@ import java.util.List;
public interface IpResourceService { public interface IpResourceService {
List<IpResourceDto> buyIp(String username, IpResourceRequestDto ipResourceRequestDto) throws Exception; IpTransactionDto buyIp(String username, IpResourceRequestDto ipResourceRequestDto) throws Exception;
IpOperationResultDto renewIp(String username, IpResourceRequestDto ipResourceRequestDto) throws Exception; IpOperationResultDto renewIp(String username, IpResourceRequestDto ipResourceRequestDto) throws Exception;
......
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