Commit 51b4192f authored by Administrator's avatar Administrator

Merge branch 'revert-ff764b99' into 'master'

Revert "Merge branch 'staging' into 'master'"

See merge request !149
parents ff764b99 0d060c9d
......@@ -103,12 +103,12 @@
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.110.ALL</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>de.flapdoodle.embed</groupId>-->
<!-- <artifactId>de.flapdoodle.embed.mongo</artifactId>-->
<!-- <version>1.50.3</version>-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>1.50.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
......
......@@ -55,7 +55,7 @@ public class BrowserBackendApplication {
@Bean
public TaskScheduler taskScheduler() {
final ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
scheduler.setPoolSize(5);
return scheduler;
}
......
......@@ -30,9 +30,7 @@ import java.security.Principal;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.*;
@RestController
@RequestMapping("/user")
......@@ -82,7 +80,11 @@ public class AccountController {
resultDto.setStatus(0);
resultDto.setData(userDtos);
} catch (ClientRequestException e) {
dealClientRequestException(resultDto, 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;
}
......@@ -100,7 +102,11 @@ public class AccountController {
resultDto.setStatus(0);
resultDto.setData(account1);
} catch (ClientRequestException e) {
dealClientRequestException(resultDto, 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;
}
......@@ -113,29 +119,32 @@ public class AccountController {
resultDto.setStatus(0);
} catch (ClientRequestException e) {
logger.error("fail to send sms", e);
dealClientRequestException(resultDto, 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;
}
/**
* 用户注册
*/
@RequestMapping(path = "/signUp", method = RequestMethod.POST)
public ResultDto createNewAccount(@Valid @RequestBody User user) {
ResultDto resultDto = new ResultDto();
try {
Account account = new Account();
if (!StringUtils.isEmpty(user.getEmail())) {
if (!StringUtils.isEmpty(user.getEmail()))
account = accountService.create(user);
} else {
else
account = accountService.createWithSms(user);
}
resultDto.setStatus(0);
resultDto.setData(account);
} catch (ClientRequestException e) {
dealClientRequestException(resultDto, 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;
}
......@@ -153,10 +162,7 @@ public class AccountController {
emailService.sendHtmlMail("sales@cloudam.io", "客户联系:" + contactUs.getName(), sb.toString());
}
/**
* 费用明细
*/
// 消费总览
@RequestMapping(path = "/userbilling", method = RequestMethod.POST)
public ResultDto getUserBills0(Principal principal, @RequestBody UserPrePaidBillingRequestDto userPrePaidBillingRequestDto) {
ResultDto resultDto = new ResultDto();
......@@ -164,7 +170,11 @@ public class AccountController {
resultDto.setData(accountService.getUserPrePaidBills(principal.getName(), userPrePaidBillingRequestDto));
resultDto.setStatus(0);
} catch (ClientRequestException e) {
dealClientRequestException(resultDto, 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;
}
......@@ -204,7 +214,11 @@ public class AccountController {
accountService.resetPassword(principal.getName(), user);
resultDto.setStatus(0);
} catch (ClientRequestException e) {
dealClientRequestException(resultDto, 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;
}
......@@ -221,30 +235,25 @@ public class AccountController {
accountService.resetPasswordWithOtp(user);
resultDto.setStatus(0);
} catch (ClientRequestException e) {
dealClientRequestException(resultDto, 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;
}
/**
* 使用微信进行账户充值
*/
@RequestMapping(path = "/0xwxpayputorder/{amount}", method = RequestMethod.GET)
public UserPaymentDto wechatPayCallback(Principal principal, @PathVariable int amount) {
return paymentService.wxPutPayOrder(principal.getName(), amount);
}
/**
* 使用微信进行账户充值成功后,微信会调用该接口
*/
@RequestMapping(path = "/0xwxpaycallback/{tradno}", method = RequestMethod.GET)
public String wechatPayCallback(@PathVariable String tradno) {
return paymentService.wechatPayCallback(tradno);
}
/**
* 使用微信进行账户充值成功后,微信会调用该接口
*/
@RequestMapping(path = "/0xwxcheckorderstatus/{tradno}/{chargeType}", method = RequestMethod.GET)
public UserPaymentDto wechatCheckOrderStatus(Principal principal, @PathVariable String tradno, @PathVariable int chargeType) {
return paymentService.wxCheckOrderStatus(tradno, chargeType);
......@@ -255,28 +264,19 @@ public class AccountController {
return paymentService.wxCheckOrderStatus(tradno, chargeType);
}
/**
* 使用 支付宝 充值 成功后回调
*/
@RequestMapping(path = "/0xalipaycallback/{tradno}", method = RequestMethod.GET)
public void alipayPayCallback(@PathVariable String tradno) {
paymentService.alipaCallback(tradno);
}
/**
* 使用 支付宝 充值 成功后回调
*/
@RequestMapping(path = "/0xalicheckorderstatus/{tradno}/{chargeType}", method = RequestMethod.GET)
public UserPaymentDto alipayCheckOrderStatus(Principal principal, @PathVariable(required = false) String tradno, @PathVariable int chargeType) {
return paymentService.aliCheckOrderStatus(tradno, chargeType);
}
/**
* 使用 支付宝 充值
*/
@RequestMapping(path = "/0xalipay/{amount}", method = RequestMethod.GET)
public void alipayPutOrder(HttpServletRequest request, HttpServletResponse response, @PathVariable int amount) throws Exception {
String by = request.getParameter("by");
String form = paymentService.alipayPutPayOrder(request.getUserPrincipal().getName(), amount, by);
response.setContentType("text/html;charset=utf-8");
......@@ -428,7 +428,11 @@ public class AccountController {
accountService.authorizeCompany(principal.getName(), companyAuthorizeDto);
resultDto.setStatus(0);
} catch (ClientRequestException e) {
dealClientRequestException(resultDto, 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;
}
......@@ -473,13 +477,12 @@ public class AccountController {
else
resultDto.setStatus(-1);
} catch (ClientRequestException e) {
dealClientRequestException(resultDto, 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;
}
private void dealClientRequestException(ResultDto resultDto, ClientRequestException e) {
dealClientRequestException(resultDto, e);
}
}
......@@ -67,14 +67,8 @@ public class Account {
*/
private int permission = -1;
/**
* 注册成功后,当前用户的邀请码相关信息,用于邀请别人获取佣金
*/
private Promotion promotion;
/**
* 注册时,其他用户给当前用户的邀请码
*/
private String promotionCode;
private String comment;
......
package com.edgec.browserbackend.account.domain;
import lombok.Data;
@Data
public class IpChargeRequestDto {
private int period;
private int amount;
private String region;
private String unit = "month";
private String unit="month";
private String target;
//0 -- 充值, 1 -- newip, 2 --renew, 3 -- 退还
......@@ -21,10 +18,83 @@ public class IpChargeRequestDto {
private String services;
/**
* 续费ip
*/
private String chargeIp;
public String getServices() {
return services;
}
public void setServices(String services) {
this.services = services;
}
public String getTradeNo() {
return tradeNo;
}
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
public float getDaysPerMonth() {
return daysPerMonth;
}
public void setDaysPerMonth(float daysPerMonth) {
this.daysPerMonth = daysPerMonth;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
public int getChargeType() {
return chargeType;
}
public void setChargeType(int chargeType) {
this.chargeType = chargeType;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
public int getPeriod() {
return period;
}
public void setPeriod(int period) {
this.period = period;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public int getPayMethod() {
return payMethod;
}
public void setPayMethod(int payMethod) {
this.payMethod = payMethod;
}
}
package com.edgec.browserbackend.account.domain;
import lombok.Data;
@Data
public class IpChargeResultDto {
/**
* 充值状态
*/
private boolean success;
private int balance;
/**
* 到账金额
*/
private int approvedAmount;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
public int getApprovedAmount() {
return approvedAmount;
}
public void setApprovedAmount(int approvedAmount) {
this.approvedAmount = approvedAmount;
}
}
package com.edgec.browserbackend.account.domain;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@Document(collection = "phoneotp")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Otp {
/**
* 手机号
*/
@Id
private String phone;
/**
* 发送给用户的短信验证码
*/
private String otp;
/**
* 短信验证码的发送时间
*/
private long createdAt;
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getOtp() {
return otp;
}
public void setOtp(String otp) {
this.otp = otp;
}
public long getCreatedAt() {
return createdAt;
}
public void setCreatedAt(long createdAt) {
this.createdAt = createdAt;
}
}
package com.edgec.browserbackend.account.domain;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.Setter;
/**
* @Desc
* @Author jason
* @CreateTime 2020/3/12 3:14 下午
**/
@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true)
public class Promotion {
/**
* 邀请码(用户邀请好友使用本产品)
*/
private String code;
/**
* 邀请人数
*/
//邀请人数
private int invitedUsers;
/**
* 好友本月以前总消费
*/
//好友本月以前总消费
private int totalCommission;
/**
* 好友当月消费
*/
//好友当月消费
private int commission;
/**
* 好友上月总消费
*/
//好友上月总消费
private int commissionLastMonth;
/**
* 是否是本公司的销售
*/
//是否是本公司的销售
private boolean isSale;
/**
* 当月礼金
*/
//当月礼金
private double gift;
/**
* 所有未提现金额
*/
//所有未提现金额
private double allGift;
/**
* 已提现金额
*/
//已提现金额
private double withdrawn;
public int getCommission() {
return commission;
}
public void setCommission(int commission) {
this.commission = commission;
}
public int getInvitedUsers() {
return invitedUsers;
}
public void setInvitedUsers(int invitedUsers) {
this.invitedUsers = invitedUsers;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public boolean isSale() {
return isSale;
}
public void setSale(boolean sale) {
isSale = sale;
}
public double getGift() {
return gift;
}
public void setGift(double gift) {
this.gift = gift;
}
public int getCommissionLastMonth() {
return commissionLastMonth;
}
public void setCommissionLastMonth(int commissionLastMonth) {
this.commissionLastMonth = commissionLastMonth;
}
public double getAllGift() {
return allGift;
}
public void setAllGift(double allGift) {
this.allGift = allGift;
}
public double getWithdrawn() {
return withdrawn;
}
public void setWithdrawn(double withdrawn) {
this.withdrawn = withdrawn;
}
public int getTotalCommission() {
return totalCommission;
}
public void setTotalCommission(int totalCommission) {
this.totalCommission = totalCommission;
}
}
package com.edgec.browserbackend.account.domain;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Email;
......@@ -8,16 +7,15 @@ import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Data
public class User {
@Length(min = 3, max = 20, message = "Name length should be between 3 - 20")
@Length(min = 3, max = 20, message="Name length should be between 3 - 20")
private String username;
@Length(min = 6, max = 40, message = "Password length should be between 6 - 40")
@Length(min = 6, max = 40, message="Password length should be between 6 - 40")
private String password;
@Email(message = "Invalid email address")
@Email(message ="Invalid email address")
private String email;
private String phone;
......@@ -30,12 +28,108 @@ public class User {
private String lockReason;
public String getAuthCode() {
return authCode;
}
public void setAuthCode(String authCode) {
this.authCode = authCode;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
private boolean allowedToCreateSubUser = true;
private int permission;
private List<String> whiteList = new ArrayList<>();
private String verificationCode = UUID.randomUUID().toString();
private String verificationCode= UUID.randomUUID().toString();
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public String getVerificationCode() {
return verificationCode;
}
public void setVerificationCode(String verificationCode) {
this.verificationCode = verificationCode;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isAllowedToCreateSubUser() {
return allowedToCreateSubUser;
}
public void setAllowedToCreateSubUser(boolean allowedToCreateSubUser) {
allowedToCreateSubUser = allowedToCreateSubUser;
}
public int getPermission() {
return permission;
}
public void setPermission(int permission) {
this.permission = permission;
}
public String getLockReason() {
return lockReason;
}
public void setLockReason(String lockReason) {
this.lockReason = lockReason;
}
public List<String> getWhiteList() {
return whiteList;
}
public void setWhiteList(List<String> whiteList) {
this.whiteList = whiteList;
}
public String getPromotionCode() {
return promotionCode;
}
public void setPromotionCode(String promotionCode) {
this.promotionCode = promotionCode;
}
}
......@@ -2,27 +2,41 @@ package com.edgec.browserbackend.account.domain;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Getter
@Setter
@Document(collection = "userbalance")
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserBalance {
/**
* 用户手机号
*/
@Id
private String username;
/**
* 账户余额
*/
private float balanced;
private float used;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public float getBalanced() {
return balanced;
}
public void setBalanced(float balanced) {
this.balanced = balanced;
}
public float getUsed() {
return used;
}
public void setUsed(float used) {
this.used = used;
}
}
......@@ -2,16 +2,12 @@ package com.edgec.browserbackend.account.domain;
import com.edgec.browserbackend.account.service.SmsUtils;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.text.SimpleDateFormat;
import java.util.Date;
@Getter
@Setter
@Document(collection = "userpayment")
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserPayment {
......@@ -19,7 +15,7 @@ public class UserPayment {
@Id
private String id;
private String tradeNo = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + SmsUtils.createRandom(true, 4);
private String tradeNo = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+SmsUtils.createRandom(true, 4);
private String username;
......@@ -32,4 +28,69 @@ public class UserPayment {
private PaymentMethod paymentMethod;
private String transId;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTradeNo() {
return tradeNo;
}
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public boolean isSucceed() {
return succeed;
}
public void setSucceed(boolean succeed) {
this.succeed = succeed;
}
public Date getPaymentDate() {
return paymentDate;
}
public void setPaymentDate(Date paymentDate) {
this.paymentDate = paymentDate;
}
public PaymentMethod getPaymentMethod() {
return paymentMethod;
}
public void setPaymentMethod(PaymentMethod paymentMethod) {
this.paymentMethod = paymentMethod;
}
public String getTransId() {
return transId;
}
public void setTransId(String transId) {
this.transId = transId;
}
}
package com.edgec.browserbackend.account.domain;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.CompoundIndex;
import org.springframework.data.mongodb.core.mapping.Document;
......@@ -10,8 +9,6 @@ import org.springframework.data.mongodb.core.mapping.Document;
import java.util.ArrayList;
import java.util.List;
@Getter
@Setter
@Document(collection = "userprepaidbilling")
@JsonIgnoreProperties(ignoreUnknown = true)
@CompoundIndex(name = "idx_username_timestamp", def = "{'username': 1, 'timestamp': 1}")
......@@ -40,21 +37,13 @@ public class UserPrePaidBilling {
private BillStatus status;
/**
* 0 -- 余额, 1 -- 支付宝, 2 -- 微信, 3 -- 银行转账
*/
//0 -- 余额, 1 -- 支付宝, 2 -- 微信, 3 -- 银行转账
private int payMethod;
private boolean isPrepaid;
/**
* 本次消费金额
*/
private float total;
/**
* 0 -- 充值, 1 -- newip, 2 -- renew, 3 -- return, 4 -- 礼金提现
*/
//0 -- 充值, 1 -- newip, 2 -- renew, 3 -- return, 4 -- 礼金提现
private int chargeType;
private String unit = "month";
......@@ -63,15 +52,161 @@ public class UserPrePaidBilling {
private float balanced;
/**
* 购买或者续费的ip 号
*/
private String chargeIp;
private List<DeductionRecord> deductionRecords = new ArrayList<>();
public float getRate() {
return rate;
}
public float getTotal() {
return total;
}
public void setRate(float rate) {
this.rate = rate;
}
public void setTotal(float total) {
this.total = total;
}
public int getChargeType() {
return chargeType;
}
public void setChargeType(int chargeType) {
this.chargeType = chargeType;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public Services getServices() {
return services;
}
public void setServices(Services services) {
this.services = services;
}
public BillStatus getStatus() {
return status;
}
public void setStatus(BillStatus status) {
this.status = status;
}
public boolean isPrepaid() {
return isPrepaid;
}
public void setPrepaid(boolean prepaid) {
this.isPrepaid = prepaid;
}
public List<DeductionRecord> getDeductionRecords() {
return deductionRecords;
}
public void setDeductionRecords(List<DeductionRecord> deductionRecords) {
this.deductionRecords = deductionRecords;
}
public void addDeductionRecord(DeductionRecord record) {
this.deductionRecords.add(record);
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public int getPeriod() {
return period;
}
public void setPeriod(int period) {
this.period = period;
}
public int getPayMethod() {
return payMethod;
}
public void setPayMethod(int payMethod) {
this.payMethod = payMethod;
}
public String getTradeNo() {
return tradeNo;
}
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
public String getAdministrator() {
return administrator;
}
public void setAdministrator(String administrator) {
this.administrator = administrator;
}
public float getBalanced() {
return balanced;
}
public void setBalanced(float balanced) {
this.balanced = balanced;
}
}
package com.edgec.browserbackend.account.dto;
import com.edgec.browserbackend.account.domain.Promotion;
import com.edgec.browserbackend.account.domain.UserPrePaidBilling;
import org.springframework.data.domain.Page;
import java.util.List;
public class BillQueryResultDto {
double parentExpense;
......
......@@ -59,6 +59,8 @@ public class AccountRepositoryCustomImpl implements AccountRepositoryCustom {
basicQuery.addCriteria(where("promotion.code").is(code).and("parent").exists(false));
Account account = mongoTemplate.findOne(basicQuery, Account.class);
if (account == null)
return null;
return account;
}
}
......@@ -24,7 +24,10 @@ public class UserPaymentRepositoryCustomImpl implements UserPaymentRepositoryCus
update.set("succeed", result);
UpdateResult operation = mongoTemplate.updateFirst(basicQuery, update, UserPayment.class);
return operation.getModifiedCount() >= 1;
if (operation.getModifiedCount() < 1)
return false;
else
return true;
}
}
......@@ -21,7 +21,6 @@ import com.edgec.browserbackend.browser.service.ShopService;
import com.edgec.browserbackend.common.commons.error.ClientRequestException;
import com.edgec.browserbackend.common.utils.Aes;
import com.edgec.browserbackend.common.utils.FileUtil;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -187,15 +186,13 @@ public class AccountServiceImpl implements AccountService {
@Override
public IpChargeResultDto chargeByMoney(String name, double money, IpChargeRequestDto requestDto) {
IpChargeResultDto charge = new IpChargeResultDto();
CompletableFuture.runAsync(
() -> {
CompletableFuture.runAsync(() -> {
charge.setApprovedAmount(0);
charge.setSuccess(true);
Account account = accountRepository.findByName(name).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account != null) {
UserBalance userBalance = userBalanceRepository.findById(name).orElse(null);
// 如果 userBalance 不存在,则创建
if (userBalance == null) {
userBalance = new UserBalance();
userBalance.setBalanced(0);
......@@ -204,22 +201,41 @@ public class AccountServiceImpl implements AccountService {
userBalanceRepository.save(userBalance);
}
// 更新 userbalance
userBalanceRepository.incrementBalance(userBalance, -(float) money, (float) money);
// 获取更新后的 userbalance
userBalance = userBalanceRepository.findById(name).orElse(null);
charge.setBalance(Math.round(userBalance.getBalanced()));
charge.setSuccess(true);
// 封装 userprepaidbilling 信息 并保存
UserPrePaidBilling bill = getUserPrePaidBilling(name, (float) money, requestDto, account, userBalance);
UserPrePaidBilling bill = new UserPrePaidBilling();
if (account.getParent() != null)
bill.setAdministrator(account.getParent());
else
bill.setAdministrator(account.getName());
bill.setTradeNo(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + SmsUtils.createRandom(true, 4));
bill.setChargeType(requestDto.getChargeType());
bill.setAmount(requestDto.getAmount());
bill.setUnit(requestDto.getUnit());
bill.setPeriod(requestDto.getPeriod());
bill.setPayMethod(requestDto.getPayMethod());
bill.setUsername(name);
bill.setTotal((float) money);
bill.setStatus(BillStatus.PAID);
bill.setPrepaid(true);
bill.setTimestamp(Instant.now().toEpochMilli());
final YearMonth lastmonth = YearMonth.now();
int monthValue = lastmonth.getMonthValue();
int year = lastmonth.getYear();
bill.setYear(year);
bill.setMonth(monthValue);
bill.setBalanced(userBalance.getBalanced());
prePaidBillingRepository.save(bill);
}
},
AccountServicePool.taskPool
).join();
}, AccountServicePool.taskPool).join();
return charge;
}
......@@ -237,37 +253,27 @@ public class AccountServiceImpl implements AccountService {
return "success";
}
/**
* 封装 预充值扣费 信息
*/
@Override
public IpChargeResultDto preChargeByMoney(String name, double money) {
IpChargeResultDto precharge = new IpChargeResultDto();
CompletableFuture.runAsync(
() -> {
CompletableFuture.runAsync(() -> {
precharge.setApprovedAmount(0);
precharge.setSuccess(false);
Account account = accountRepository.findByName(name).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account != null) {
UserBalance userBalance = userBalanceRepository.findById(name).orElse(null);
float balance = 0;
if (userBalance != null) {
if (userBalance != null)
balance = userBalance.getBalanced();
}
// 如果账户余额 比 扣费的 多,则设置为成功,并重新设置账户余额
if (balance >= money) {
precharge.setBalance((int) Math.round(balance - money));
precharge.setSuccess(true);
} else {
// todo 钱不够了,不是应该提示该充值么
precharge.setBalance(Math.round(balance));
}
}
},
AccountServicePool.taskPool
).join();
}, AccountServicePool.taskPool).join();
return precharge;
}
......@@ -420,17 +426,25 @@ public class AccountServiceImpl implements AccountService {
@Override
public Account createWithSms(User user) {
// 1. 校验注册用户是否已存在
Account existing1 = accountRepository.findByName(user.getUsername()).orElse(null);
Account existing2 = accountRepository.findByPhoneNumber(user.getUsername());
Account existing3 = accountRepository.findByPhoneNumber(user.getPhone());
Account existing4 = accountRepository.findByName(user.getPhone()).orElse(null);
if (existing1 != null || existing2 != null || existing3 != null || existing4 != null) {
Account existing = accountRepository.findByName(user.getUsername()).orElse(null);
if (existing != null)
throw new ClientRequestException(AccountErrorCode.NAMEEXIST, "account already exists: " + user.getUsername());
}
// 2. 校验用户输入的短信验证码是否正确
existing = accountRepository.findByPhoneNumber(user.getUsername());
if (existing != null)
throw new ClientRequestException(AccountErrorCode.NAMEEXIST, "account already exists: " + user.getUsername());
existing = accountRepository.findByPhoneNumber(user.getPhone());
if (existing != null)
throw new ClientRequestException(AccountErrorCode.PHONEEXIST, "phone number already exists: " + user.getPhone());
existing = accountRepository.findByName(user.getPhone()).orElse(null);
if (existing != null)
throw new ClientRequestException(AccountErrorCode.PHONEEXIST, "phone number already exists: " + user.getPhone());
Otp otp = otpRepository.findByPhoneAndCreatedAtGreaterThanEqual(user.getUsername(), Instant.now().minusSeconds(600).toEpochMilli());
if (otp == null) {
throw new ClientRequestException(AccountErrorCode.OTPWRONG, AccountErrorCode.OTPWRONG.getReason());
}
......@@ -440,69 +454,85 @@ public class AccountServiceImpl implements AccountService {
// otpRepository.delete(otp);
}
// 3. 若用户注册时输入了邀请码,则更新邀请人的 account 信息
Account account = new Account();
account.setName(user.getUsername());
account.setLastSeen(new Date());
account.setEmail(user.getEmail());
account.setPhoneNumber(user.getUsername());
account.setPermission(15);
if (user.getPromotionCode() != null) {
account.setPromotionCode(user.getPromotionCode());
}
Account inviter = accountRepository.findByPromotion(user.getPromotionCode());
if (inviter != null) {
inviter.getPromotion().setInvitedUsers(inviter.getPromotion().getInvitedUsers() + 1);
accountRepository.save(inviter);
}
// 4. 创建 User
Account pExisting = null;
String random = null;
do {
random = String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
pExisting = accountRepository.findByPromotion(random);
} while (pExisting != null);
Promotion promotion = new Promotion();
promotion.setCode(random);
promotion.setInvitedUsers(0);
promotion.setCommission(0);
account.setPromotion(promotion);
account.setAllowedToCreateSubUser(true);
List<String> whiteList = new ArrayList<>();
if (user.getWhiteList() != null && user.getWhiteList().size() > 0)
whiteList.addAll(user.getWhiteList());
account.setWhiteList(whiteList);
user.setEnabled(true);
userService.create(new com.edgec.browserbackend.auth.domain.User(user));
// 5. 封装用户账户 并 创建
Account account = buildAccount(user);
userService.create(new com.edgec.browserbackend.auth.domain.User(user));
accountRepository.save(account);
JSONObject param = new JSONObject();
param.put("newuser", account.getName());
if (inviter != null) {
if (inviter != null)
param.put("referral", inviter.getName() + "(" + user.getPromotionCode() + ")");
} else {
else
param.put("referral", "123456");
}
com.edgec.browserbackend.common.commons.utils.SmsUtils.sendNewAccountSms("15919921106", com.edgec.browserbackend.common.commons.utils.SmsUtils.SmsTemplateCode.NEWACCOUNT, param);
com.edgec.browserbackend.common.commons.utils.SmsUtils.sendNewAccountSms("13570690305", com.edgec.browserbackend.common.commons.utils.SmsUtils.SmsTemplateCode.NEWACCOUNT, param);
com.edgec.browserbackend.common.commons.utils.SmsUtils.sendNewAccountSms("13802945832", com.edgec.browserbackend.common.commons.utils.SmsUtils.SmsTemplateCode.NEWACCOUNT, param);
// 6. 使用手机注册就送 12 元体验金
paymentService.bankTransferInsertion(account.getName(), 12);
log.info("new account has been created: " + account.getName());
// 7. 发送注册成功的邮件
notifyCustomerRegister(account);
return account;
}
public Account create(User user, String parentName) {
// 1. 校验用户是否已注册
Account existing = accountRepository.findByName(user.getUsername()).orElse(null);
if (existing != null) {
if (existing != null)
throw new ClientRequestException(AccountErrorCode.NAMEEXIST, "account already exists: " + user.getUsername());
}
existing = accountRepository.findByPhoneNumber(user.getUsername());
if (existing != null) {
if (existing != null)
throw new ClientRequestException(AccountErrorCode.NAMEEXIST, "account already exists: " + user.getUsername());
}
existing = accountRepository.findByEmail(user.getEmail());
if (existing != null) {
if (existing != null)
throw new ClientRequestException(AccountErrorCode.EMAILEXIST, "email already exists: " + user.getEmail());
}
// 2. 发送校验邮件
emailService.sendEmailVerification(user.getUsername(), user.getEmail(), user.getVerificationCode());
// 3. 创建 User
user.setEnabled(false);
userService.create(new com.edgec.browserbackend.auth.domain.User(user));
// 4. 创建用户账户
Account account = new Account();
account.setName(user.getUsername());
account.setLastSeen(new Date());
account.setEmail(user.getEmail());
if (StringUtils.isEmpty(parentName)) {
account.setAllowedToCreateSubUser(true);
account.setPermission(Integer.valueOf("1111", 2));
......@@ -510,23 +540,42 @@ public class AccountServiceImpl implements AccountService {
account.setAllowedToCreateSubUser(user.isAllowedToCreateSubUser());
account.setPermission(user.getPermission());
}
account.setParent(parentName);
emailService.sendEmailVerification(user.getUsername(), user.getEmail(), user.getVerificationCode());
userService.create(new com.edgec.browserbackend.auth.domain.User(user));
accountRepository.save(account);
log.info("new account has been created: " + account.getName());
// SmsUtils.notifyNewUserRegistered();
// 5. 发送注册成功的邮件
notifyCustomerRegister(account);
return account;
}
private void notifyCustomerRegister(Account contactUs) {
StringBuilder sb = new StringBuilder();
sb.append("Name: " + contactUs.getName() + "<br/>");
sb.append("Email: " + contactUs.getEmail() + "<br/>");
sb.append("Phone: " + contactUs.getPhoneNumber() + "<br/>");
sb.append("Company: " + contactUs.getCompanyName() + "<br/>");
sb.append("Title: " + contactUs.getJobTitle() + "<br/>");
try {
emailService.sendHtmlMail("sales@cloudam.io", "新客户注册:" + contactUs.getName(), sb.toString());
} catch (Exception e) {
log.error("sending email fails on customer regisration", e);
}
}
@Override
public List<UserDto> getAllDesendentUsers(String name, int level) {
if (level == -1) {
//find its parent.
String parent = accountRepository.findByName(name).get().getParent();
String parent = accountRepository.findByName(name).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST)).getParent();
if (StringUtils.isEmpty(parent))
return Arrays.asList();
......@@ -655,6 +704,8 @@ public class AccountServiceImpl implements AccountService {
@Override
public void createSubUsers(String name, SubUsersRequestDto subUsersRequestDto) {
Account existing = accountRepository.findByName(name).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (existing == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST, "account does not exist: " + name);
if (!existing.isAllowedToCreateSubUser() && !StringUtils.isEmpty(existing.getParent()))
throw new ClientRequestException(AccountErrorCode.NOTALLOWEDTOCREATESUBUSER, "Not allowed to create sub user");
......@@ -1149,87 +1200,4 @@ public class AccountServiceImpl implements AccountService {
return false;
}
}
private void notifyCustomerRegister(Account contactUs) {
StringBuilder sb = new StringBuilder();
sb.append("Name: " + contactUs.getName() + "<br/>");
sb.append("Email: " + contactUs.getEmail() + "<br/>");
sb.append("Phone: " + contactUs.getPhoneNumber() + "<br/>");
sb.append("Company: " + contactUs.getCompanyName() + "<br/>");
sb.append("Title: " + contactUs.getJobTitle() + "<br/>");
try {
emailService.sendHtmlMail("sales@cloudam.io", "新客户注册:" + contactUs.getName(), sb.toString());
} catch (Exception e) {
log.error("sending email fails on customer regisration", e);
}
}
@NotNull
private UserPrePaidBilling getUserPrePaidBilling(String name, float money, IpChargeRequestDto requestDto, Account account, UserBalance userBalance) {
UserPrePaidBilling bill = new UserPrePaidBilling();
if (account.getParent() != null) {
bill.setAdministrator(account.getParent());
} else {
bill.setAdministrator(account.getName());
}
bill.setTradeNo(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + SmsUtils.createRandom(true, 4));
bill.setChargeType(requestDto.getChargeType());
if (requestDto.getChargeIp() != null) {
bill.setChargeIp(requestDto.getChargeIp());
}
bill.setAmount(requestDto.getAmount());
bill.setUnit(requestDto.getUnit());
bill.setPeriod(requestDto.getPeriod());
bill.setPayMethod(requestDto.getPayMethod());
bill.setUsername(name);
bill.setTotal(money);
bill.setStatus(BillStatus.PAID);
bill.setPrepaid(true);
bill.setTimestamp(Instant.now().toEpochMilli());
final YearMonth lastmonth = YearMonth.now();
int monthValue = lastmonth.getMonthValue();
int year = lastmonth.getYear();
bill.setYear(year);
bill.setMonth(monthValue);
bill.setBalanced(userBalance.getBalanced());
return bill;
}
@NotNull
private Account buildAccount(User user) {
Account account = new Account();
account.setName(user.getUsername());
account.setLastSeen(new Date());
account.setEmail(user.getEmail());
account.setPhoneNumber(user.getUsername());
account.setPermission(15);
if (user.getPromotionCode() != null) {
account.setPromotionCode(user.getPromotionCode());
}
Account pExisting = null;
String random = null;
do {
random = String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
pExisting = accountRepository.findByPromotion(random);
} while (pExisting != null);
Promotion promotion = new Promotion();
promotion.setCode(random);
promotion.setInvitedUsers(0);
promotion.setCommission(0);
account.setPromotion(promotion);
account.setAllowedToCreateSubUser(true);
List<String> whiteList = new ArrayList<>();
if (user.getWhiteList() != null && user.getWhiteList().size() > 0) {
whiteList.addAll(user.getWhiteList());
}
account.setWhiteList(whiteList);
return account;
}
}
......@@ -366,6 +366,8 @@ public class AdministratorServiceImpl implements AdministratorService {
@Override
public void addPromotionCode(String username, String promotionCode) {
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST);
account.setPromotionCode(promotionCode);
accountRepository.save(account);
}
......@@ -495,6 +497,8 @@ public class AdministratorServiceImpl implements AdministratorService {
@Override
public void addUserWhiteList(String username, String website) {
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST);
account.getWhiteList().add(website);
accountRepository.save(account);
}
......
......@@ -37,20 +37,18 @@ public class EmailServiceImpl implements EmailService {
context.setVariable("code", code);
context.setVariable("time", ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss")));
String emailContent = templateEngine.process("reset", context);
sendHtmlMail(email, "Cloudam云端软件 | 密码重置", emailContent);
sendHtmlMail(email,"Cloudam云端软件 | 密码重置",emailContent);
}
@Override
public void sendEmailVerification(String username, String email, String code) {
Context context = new Context();
context.setVariable("id", username);
context.setVariable("code", code);
context.setVariable("time", ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss")));
String emailContent = templateEngine.process("verification", context);
sendHtmlMail(email, "Cloudam云端软件 | 注册邮箱验证", emailContent);
sendHtmlMail(email,"Cloudam云端软件 | 注册邮箱验证",emailContent);
}
@Override
public void sendHtmlMail(String to, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();
try {
......
......@@ -26,7 +26,6 @@ import com.edgec.browserbackend.common.commons.error.ClientRequestException;
import com.edgec.browserbackend.wxpay.*;
import com.google.gson.Gson;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -67,8 +66,9 @@ public class PaymentServiceImpl implements PaymentService {
@Override
public String wechatPayCallback(String tradno) {
// 当微信回调该接口时,说明微信那边已经充值成功,这个时候需要更新系统中 userpayment 充值状态
UserPayment byTradeNo = userPaymentRepository.findByTradeNo(tradno);
if (byTradeNo != null && !byTradeNo.isSucceed()) {
wxCheckOrderStatus(byTradeNo.getTradeNo(), 0);
}
......@@ -82,6 +82,7 @@ public class PaymentServiceImpl implements PaymentService {
@Override
public void alipaCallback(String tradno) {
UserPayment byTradeNo = userPaymentRepository.findByTradeNo(tradno);
if (byTradeNo != null && !byTradeNo.isSucceed()) {
aliCheckOrderStatus(byTradeNo.getTradeNo(), 0);
}
......@@ -89,53 +90,130 @@ public class PaymentServiceImpl implements PaymentService {
@Override
public UserPaymentDto wxCheckOrderStatus(String tradeno, int chargeType) {
// 校验数据
UserPaymentDto result = new UserPaymentDto();
result.setPaid(false);
if (StringUtils.isBlank(tradeno)) {
if (StringUtils.isBlank(tradeno))
return result;
}
try {
UserPayment byTradeNo = userPaymentRepository.findByTradeNo(tradeno);
if (byTradeNo == null) {
if (byTradeNo == null)
return result;
if (PaymentMethod.ALIPAY.equals(byTradeNo.getPaymentMethod()))
return aliCheckOrderStatus(tradeno, chargeType);
UserBalance balance = userBalanceRepository.findById(byTradeNo.getUsername()).orElse(null);
if (balance != null)
result.setBalance(Math.round(balance.getBalanced()));
if (byTradeNo == null)
return result;
}
if (byTradeNo.isSucceed()) {
result.setPaid(true);
return result;
}
Account byName = accountService.findByName(byTradeNo.getUsername());
// 如果订单是用支付宝支付的,则调用支付宝相关的代码
if (PaymentMethod.ALIPAY.equals(byTradeNo.getPaymentMethod())) {
return aliCheckOrderStatus(tradeno, chargeType);
}
try {
UserBalance balance = getUserBalance(result, byTradeNo);
Account byName = accountService.findByName(byTradeNo.getUsername());
if (byName == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST, "account does not exist: " + byTradeNo.getUsername());
// 1. 构建微信支付订单查询数据,并获取微信支付订单信息
// 获取微信支付订单存在失败的情况,所以针对失败情况去使用定时任务来重新调用本方法
boolean isVpsClient = true;
WXPayConfig ourWxPayConfig = isVpsClient ? new FGLWxConfig() : new CloudamWxConfig();
WXPay wxPay = new WXPay(ourWxPayConfig);
Map<String, String> data = encapsulateWxOrderDataMap(tradeno, ourWxPayConfig);
Map<String, String> data = new HashMap<>();
data.put("appid", ourWxPayConfig.getAppID());
data.put("mch_id", ourWxPayConfig.getMchID()); //商户号
data.put("out_trade_no", tradeno); //交易号
data.put("nonce_str", SmsUtils.createRandom(false, 24)); // 随机字符串小于32位
String s = WXPayUtil.generateSignature(data, ourWxPayConfig.getKey()); //签名
data.put("sign", s);
Map<String, String> respData = wxPay.orderQuery(data);
if (respData.get("return_code").equals("SUCCESS") && respData.get("return_msg").equals("OK") && "SUCCESS".equals(respData.get("result_code"))) {
/*
* SUCCESS—支付成功
* REFUND—转入退款
* NOTPAY—未支付
* CLOSED—已关闭
* REVOKED—已撤销(付款码支付)
* USERPAYING--用户支付中(付款码支付)
* PAYERROR--支付失败(其他原因,如银行返回失败)
/**
*
SUCCESS—支付成功
REFUND—转入退款
NOTPAY—未支付
CLOSED—已关闭
REVOKED—已撤销(付款码支付)
USERPAYING--用户支付中(付款码支付)
PAYERROR--支付失败(其他原因,如银行返回失败) *
*/
result.setStatus(respData.get("trade_state"));
// 2. 如果订单支付成功(具体业务逻辑)
if ("SUCCESS".equals(respData.get("trade_state"))) {
dealPaySuccess(chargeType, result, byTradeNo, byName, balance);
byTradeNo.setSucceed(true);
boolean b = userPaymentRepository.updatePaymentResult(byTradeNo, true);
if (b) {
if (balance == null) {
balance = new UserBalance();
balance.setUsername(byTradeNo.getUsername());
}
PayBack payBack = payBackRepository.findByPay(byTradeNo.getAmount());
if (payBack == null)
payBack = new PayBack();
if (chargeType == 0) {
UserPrePaidBilling bill = new UserPrePaidBilling();
Account account = accountRepository.findByName(byTradeNo.getUsername()).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account != null && account.getParent() != null)
bill.setAdministrator(account.getParent());
else
bill.setAdministrator(account.getName());
bill.setTradeNo(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + SmsUtils.createRandom(true, 4));
bill.setChargeType(0);
bill.setAmount(0);
bill.setUnit(null);
bill.setPeriod(0);
bill.setPayMethod(2);
bill.setUsername(byTradeNo.getUsername());
bill.setTotal((float) byTradeNo.getAmount());
bill.setStatus(BillStatus.PAID);
bill.setPrepaid(true);
bill.setTimestamp(Instant.now().toEpochMilli());
bill.setBalanced(balance.getBalanced() + byTradeNo.getAmount() + payBack.getBack());
final YearMonth lastmonth = YearMonth.now();
int monthValue = lastmonth.getMonthValue();
int year = lastmonth.getYear();
bill.setYear(year);
bill.setMonth(monthValue);
userPrePaidBillingRepository.save(bill);
}
balance.setBalanced(balance.getBalanced() + byTradeNo.getAmount() + payBack.getBack());
userBalanceRepository.save(balance);
if (byName.getPromotionCode() != null) {
Account account = accountRepository.findByPromotion(byName.getPromotionCode());
if (account != null) {
account.getPromotion().setCommission(account.getPromotion().getCommission() + byTradeNo.getAmount());
accountRepository.save(account);
}
}
}
result.setBalance(Math.round(balance.getBalanced()));
result.setPaid(true);
return result;
}
}
......@@ -165,33 +243,42 @@ public class PaymentServiceImpl implements PaymentService {
public UserPaymentDto aliCheckOrderStatus(String tradno, int chargeType) {
UserPaymentDto result = new UserPaymentDto();
result.setPaid(false);
if (StringUtils.isBlank(tradno)) {
if (StringUtils.isBlank(tradno))
return result;
}
try {
UserPayment byTradeNo = userPaymentRepository.findByTradeNo(tradno);
if (byTradeNo == null) {
UserBalance balance = userBalanceRepository.findById(byTradeNo.getUsername()).orElse(null);
if (balance != null)
result.setBalance(Math.round(balance.getBalanced()));
if (byTradeNo == null)
return result;
}
if (byTradeNo.isSucceed()) {
result.setPaid(true);
return result;
}
Account byName = accountService.findByName(byTradeNo.getUsername());
try {
UserBalance balance = getUserBalance(result, byTradeNo);
if (byName == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST, "account does not exist: " + byTradeNo.getUsername());
boolean isVpsClient = true;
AlipayConfig alipayConfig = new VpsAlipayConfig();
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getURL(), alipayConfig.getAPPID(),
alipayConfig.getAPP_PRIVATE_KEY(), "json", alipayConfig.getCHARSET(),
alipayConfig.getALIPAY_PUBLIC_KEY(), alipayConfig.getSIGN_TYPE());
AlipayTradeQueryRequest alipayRequest = buildAlipayTradeQueryRequest(byTradeNo);
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getURL(), alipayConfig.getAPPID(), alipayConfig.getAPP_PRIVATE_KEY(),
"json", alipayConfig.getCHARSET(), alipayConfig.getALIPAY_PUBLIC_KEY(), alipayConfig.getSIGN_TYPE());
AlipayTradeQueryResponse response = alipayClient.execute(alipayRequest);
AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
String out_trade_no = byTradeNo.getTradeNo();
alipayRequest.setBizContent(""
+ "{"
+ "\"out_trade_no\":\"" + out_trade_no + "\""
+ "}"
);
AlipayTradeQueryResponse response = alipayClient.execute(alipayRequest);
log.info("ali order status :" + JSONObject.toJSONString(response));
if (response.getTradeStatus() == null) {
result.setPaid(false);
......@@ -201,8 +288,63 @@ public class PaymentServiceImpl implements PaymentService {
result.setStatus(convertAlipayStatus(response.getTradeStatus()));
if ("TRADE_SUCCESS".equals(response.getTradeStatus()) || "TRADE_FINISHED".equals(response.getTradeStatus())) {
// 2. 如果订单支付成功(具体业务逻辑)
dealPaySuccess(chargeType, result, byTradeNo, byName, balance);
byTradeNo.setSucceed(true);
boolean b = userPaymentRepository.updatePaymentResult(byTradeNo, true);
if (b) {
if (balance == null) {
balance = new UserBalance();
balance.setUsername(byTradeNo.getUsername());
}
PayBack payBack = payBackRepository.findByPay(byTradeNo.getAmount());
if (payBack == null)
payBack = new PayBack();
if (chargeType == 0) {
UserPrePaidBilling bill = new UserPrePaidBilling();
Account account = accountRepository.findByName(byTradeNo.getUsername()).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account != null && account.getParent() != null)
bill.setAdministrator(account.getParent());
else
bill.setAdministrator(account.getName());
bill.setTradeNo(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + SmsUtils.createRandom(true, 4));
bill.setChargeType(0);
bill.setAmount(0);
bill.setUnit(null);
bill.setPeriod(0);
bill.setPayMethod(1);
bill.setUsername(byTradeNo.getUsername());
bill.setTotal((float) byTradeNo.getAmount());
bill.setStatus(BillStatus.PAID);
bill.setPrepaid(true);
bill.setTimestamp(Instant.now().toEpochMilli());
bill.setBalanced(balance.getBalanced() + byTradeNo.getAmount() + payBack.getBack());
final YearMonth lastmonth = YearMonth.now();
int monthValue = lastmonth.getMonthValue();
int year = lastmonth.getYear();
bill.setYear(year);
bill.setMonth(monthValue);
userPrePaidBillingRepository.save(bill);
}
balance.setBalanced(balance.getBalanced() + byTradeNo.getAmount() + payBack.getBack());
userBalanceRepository.save(balance);
if (byName.getPromotionCode() != null) {
Account account = accountRepository.findByPromotion(byName.getPromotionCode());
if (account != null) {
account.getPromotion().setCommission(account.getPromotion().getCommission() + byTradeNo.getAmount());
accountRepository.save(account);
}
}
}
result.setBalance(Math.round(balance.getBalanced()));
result.setPaid(true);
return result;
}
......@@ -214,45 +356,48 @@ public class PaymentServiceImpl implements PaymentService {
return result;
}
@NotNull
private UserBalance getUserBalance(UserPaymentDto result, UserPayment byTradeNo) {
UserBalance balance = userBalanceRepository.findById(byTradeNo.getUsername()).orElse(null);
if (balance != null) {
result.setBalance(Math.round(balance.getBalanced()));
}
if (balance == null) {
balance = new UserBalance();
balance.setUsername(byTradeNo.getUsername());
}
return balance;
}
@Override
public String alipayPutPayOrder(String username, int amount, String by) {
Account byName = accountService.findByName(username);
if (byName.getPermission() < 4) {
if (byName == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST, "account does not exist: " + username);
if (byName.getPermission() < 4)
throw new ClientRequestException(AccountErrorCode.NOPERMISSION, "account does not have permission: " + username);
}
boolean isVpsClient = true;
UserPayment internalOrder = new UserPayment();
internalOrder.setAmount(amount);
internalOrder.setPaymentMethod(PaymentMethod.ALIPAY);
internalOrder.setSucceed(false);
internalOrder.setUsername(username);
try {
// 创建并封装 UserPayment 信息
UserPayment internalOrder = getUserPayment(username, amount, PaymentMethod.ALIPAY);
// 获取支付宝支付的配置信息
boolean isVpsClient = true;
AlipayConfig alipayConfig = isVpsClient ? new VpsAlipayConfig() : new CloudamAlipayConfig();
// 获取支付宝的 client
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getURL(), alipayConfig.getAPPID(),
alipayConfig.getAPP_PRIVATE_KEY(), "json", alipayConfig.getCHARSET(),
alipayConfig.getALIPAY_PUBLIC_KEY(), alipayConfig.getSIGN_TYPE());
// 构建请求信息 并设置请求成功的回调 url
AlipayTradePagePayRequest alipayRequest = buildAlipayTradePagePayRequest(amount, by, internalOrder, isVpsClient, alipayConfig);
// 调用 支付宝支付接口
AlipayTradePagePayResponse response = alipayClient.pageExecute(alipayRequest);
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getURL(), alipayConfig.getAPPID(), alipayConfig.getAPP_PRIVATE_KEY(),
"json", alipayConfig.getCHARSET(), alipayConfig.getALIPAY_PUBLIC_KEY(), alipayConfig.getSIGN_TYPE());
// 将支付信息保存到 userPayment
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(alipayConfig.getReturnUrl(isVpsClient, by) + internalOrder.getTradeNo());
alipayRequest.setNotifyUrl(alipayConfig.getNOTIFY_URL() + internalOrder.getTradeNo());
String out_trade_no = internalOrder.getTradeNo();
String product_code = "FAST_INSTANT_TRADE_PAY";
String total_amount = "" + amount + ".00";
String subject = "订单" + out_trade_no;
String body = "";
alipayRequest.setBizContent(""
+ "{"
+ "\"out_trade_no\":\"" + out_trade_no + "\","
+ "\"product_code\":\"" + product_code + "\","
+ "\"total_amount\":\"" + total_amount + "\","
+ "\"subject\":\"" + subject + "\","
+ "\"body\":\"" + body + "\""
+ "}"
);
AlipayTradePagePayResponse response = alipayClient.pageExecute(alipayRequest);
internalOrder.setTransId(response.getTradeNo());
userPaymentRepository.save(internalOrder);
......@@ -267,31 +412,44 @@ public class PaymentServiceImpl implements PaymentService {
@Override
public UserPaymentDto wxPutPayOrder(String username, int amount) {
Account byName = accountService.findByName(username);
if (byName.getPermission() < 4) {
if (byName == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST, "account does not exist: " + username);
if (byName.getPermission() < 4)
throw new ClientRequestException(AccountErrorCode.NOPERMISSION, "account does not have permission: " + username);
}
boolean isVpsClient = true;
UserPayment internalOrder = new UserPayment();
internalOrder.setAmount(amount);
internalOrder.setPaymentMethod(PaymentMethod.WECHAT);
internalOrder.setSucceed(false);
internalOrder.setUsername(username);
try {
// 创建并封装 UserPayment 信息
UserPayment internalOrder = getUserPayment(username, amount, PaymentMethod.WECHAT);
// 回调的url
String notifyUrl = AccountController.WECHAT_PAY_CALLBACK_URL + internalOrder.getTradeNo();
// 获取微信支付的配置信息
boolean isVpsClient = true;
WXPayConfig ourWxPayConfig = isVpsClient ? new FGLWxConfig() : new CloudamWxConfig();
WXPay wxPay = new WXPay(ourWxPayConfig);
// 封装请求 微信支付 的数据
Map<String, String> data = encapsulateDataMap(amount, internalOrder, notifyUrl, ourWxPayConfig);
Map<String, String> data = new HashMap<>();
data.put("appid", ourWxPayConfig.getAppID());
data.put("mch_id", ourWxPayConfig.getMchID()); //商户号
data.put("body", ourWxPayConfig.getBody());
data.put("trade_type", "NATIVE"); //NATIVE 扫码支付
data.put("notify_url", notifyUrl); //回调地址
data.put("spbill_create_ip", "127.0.0.1"); //终端ip
data.put("total_fee", "" + amount * 100); //订单总金额
data.put("fee_type", "CNY"); //默认人民币
data.put("out_trade_no", internalOrder.getTradeNo()); //交易号
data.put("nonce_str", internalOrder.getTradeNo()); // 随机字符串小于32位
String s = WXPayUtil.generateSignature(data, ourWxPayConfig.getKey()); //签名
data.put("sign", s);
// 调用微信支付接口,支付成功后会回调 notifyUrl, 并返回支付结果
WXPay wxPay = new WXPay(ourWxPayConfig);
Map<String, String> respData = wxPay.unifiedOrder(data);
if (respData.get("return_code").equals("SUCCESS") && respData.get("result_code").equals("SUCCESS")) {
// 若微信支付成功,则将支付信息保存到 userPayment
userPaymentRepository.save(internalOrder);
UserPaymentDto result = new UserPaymentDto();
result.setTradeNo(internalOrder.getTradeNo());
......@@ -320,7 +478,7 @@ public class PaymentServiceImpl implements PaymentService {
UserBalance userBalance = userBalanceRepository.findById(username).orElse(null);
UserPrePaidBilling bill = new UserPrePaidBilling();
Account account = accountRepository.findByName(username).get();
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account != null && account.getParent() != null)
bill.setAdministrator(account.getParent());
else
......@@ -527,49 +685,66 @@ public class PaymentServiceImpl implements PaymentService {
}
}
@Deprecated
@Override
public UserPaymentDto wxCheckOrderStatus(String tradeno) {
UserPaymentDto result = new UserPaymentDto();
result.setPaid(false);
try {
UserPayment byTradeNo = userPaymentRepository.findByTradeNo(tradeno);
if (byTradeNo == null)
return result;
if (byTradeNo.isSucceed()) {
result.setPaid(true);
return result;
}
Account byName = accountService.findByName(byTradeNo.getUsername());
if (PaymentMethod.ALIPAY.equals(byTradeNo.getPaymentMethod())) {
if (PaymentMethod.ALIPAY.equals(byTradeNo.getPaymentMethod()))
return aliCheckOrderStatus(tradeno);
}
try {
UserBalance balance = userBalanceRepository.findById(byTradeNo.getUsername()).orElse(null);
if (balance != null) {
if (balance != null)
result.setBalance(Math.round(balance.getBalanced()));
if (byTradeNo == null)
return result;
if (byTradeNo.isSucceed()) {
result.setPaid(true);
return result;
}
Account byName = accountService.findByName(byTradeNo.getUsername());
if (byName == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST, "account does not exist: " + byTradeNo.getUsername());
boolean isVpsClient = true;
WXPayConfig ourWxPayConfig = isVpsClient ? new FGLWxConfig() : new CloudamWxConfig();
WXPay wxPay = new WXPay(ourWxPayConfig);
Map<String, String> data = encapsulateWxOrderDataMap(tradeno, ourWxPayConfig);
Map<String, String> data = new HashMap<>();
data.put("appid", ourWxPayConfig.getAppID());
data.put("mch_id", ourWxPayConfig.getMchID()); //商户号
data.put("out_trade_no", tradeno); //交易号
data.put("nonce_str", SmsUtils.createRandom(false, 24)); // 随机字符串小于32位
String s = WXPayUtil.generateSignature(data, ourWxPayConfig.getKey()); //签名
data.put("sign", s);
Map<String, String> respData = wxPay.orderQuery(data);
if (respData.get("return_code").equals("SUCCESS") && respData.get("return_msg").equals("OK") && "SUCCESS".equals(respData.get("result_code"))) {
/*
* SUCCESS—支付成功
* REFUND—转入退款
* NOTPAY—未支付
* CLOSED—已关闭
* REVOKED—已撤销(付款码支付)
* USERPAYING--用户支付中(付款码支付)
* PAYERROR--支付失败(其他原因,如银行返回失败)
/**
*
SUCCESS—支付成功
REFUND—转入退款
NOTPAY—未支付
CLOSED—已关闭
REVOKED—已撤销(付款码支付)
USERPAYING--用户支付中(付款码支付)
PAYERROR--支付失败(其他原因,如银行返回失败) *
*/
result.setStatus(respData.get("trade_state"));
if ("SUCCESS".equals(respData.get("trade_state"))) {
......@@ -584,10 +759,8 @@ public class PaymentServiceImpl implements PaymentService {
}
// 充值返现
PayBack payBack = payBackRepository.findByPay(byTradeNo.getAmount());
if (payBack == null) {
if (payBack == null)
payBack = new PayBack();
}
balance.setBalanced(balance.getBalanced() + byTradeNo.getAmount() + payBack.getBack());
balance = userBalanceRepository.save(balance);
}
......@@ -605,7 +778,6 @@ public class PaymentServiceImpl implements PaymentService {
return result;
}
@Deprecated
@Override
public UserPaymentDto aliCheckOrderStatus(String tradno) {
UserPaymentDto result = new UserPaymentDto();
......@@ -635,7 +807,14 @@ public class PaymentServiceImpl implements PaymentService {
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getURL(), alipayConfig.getAPPID(), alipayConfig.getAPP_PRIVATE_KEY(),
"json", alipayConfig.getCHARSET(), alipayConfig.getALIPAY_PUBLIC_KEY(), alipayConfig.getSIGN_TYPE());
AlipayTradeQueryRequest alipayRequest = buildAlipayTradeQueryRequest(byTradeNo);
AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
String out_trade_no = byTradeNo.getTradeNo();
alipayRequest.setBizContent(""
+ "{"
+ "\"out_trade_no\":\"" + out_trade_no + "\""
+ "}"
);
AlipayTradeQueryResponse response = alipayClient.execute(alipayRequest);
log.info("ali order status :" + JSONObject.toJSONString(response));
result.setStatus(convertAlipayStatus(response.getTradeStatus()));
......@@ -671,154 +850,4 @@ public class PaymentServiceImpl implements PaymentService {
return result;
}
@NotNull
private UserPayment getUserPayment(String username, int amount, PaymentMethod paymentMethod) {
UserPayment internalOrder = new UserPayment();
internalOrder.setUsername(username);
internalOrder.setAmount(amount);
internalOrder.setPaymentMethod(paymentMethod);
// 此时充值尚未成功,需要等 微信或者支付宝 回调才能确认是否成功
internalOrder.setSucceed(false);
return internalOrder;
}
@NotNull
private Map<String, String> encapsulateDataMap(int amount, UserPayment internalOrder, String notifyUrl, WXPayConfig ourWxPayConfig) throws Exception {
Map<String, String> data = new HashMap<>();
data.put("appid", ourWxPayConfig.getAppID());
data.put("mch_id", ourWxPayConfig.getMchID()); //商户号
data.put("body", ourWxPayConfig.getBody());
data.put("trade_type", "NATIVE"); //NATIVE 扫码支付
data.put("notify_url", notifyUrl); //回调地址
data.put("spbill_create_ip", "127.0.0.1"); //终端ip
data.put("total_fee", "" + amount * 100); //订单总金额
data.put("fee_type", "CNY"); //默认人民币
data.put("out_trade_no", internalOrder.getTradeNo()); //交易号
data.put("nonce_str", internalOrder.getTradeNo()); // 随机字符串小于32位
String s = WXPayUtil.generateSignature(data, ourWxPayConfig.getKey()); //签名
data.put("sign", s);
return data;
}
@NotNull
private Map<String, String> encapsulateWxOrderDataMap(String tradeno, WXPayConfig ourWxPayConfig) throws Exception {
Map<String, String> data = new HashMap<>();
data.put("appid", ourWxPayConfig.getAppID());
data.put("mch_id", ourWxPayConfig.getMchID()); //商户号
data.put("out_trade_no", tradeno); //交易号
data.put("nonce_str", SmsUtils.createRandom(false, 24)); // 随机字符串小于32位
String s = WXPayUtil.generateSignature(data, ourWxPayConfig.getKey()); //签名
data.put("sign", s);
return data;
}
@NotNull
private UserPrePaidBilling getUserPrePaidBilling(UserPayment byTradeNo, Account byName, UserBalance balance, PayBack payBack) {
UserPrePaidBilling bill = new UserPrePaidBilling();
if (byName != null && byName.getParent() != null) {
bill.setAdministrator(byName.getParent());
} else {
bill.setAdministrator(byName.getName());
}
bill.setTradeNo(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + SmsUtils.createRandom(true, 4));
bill.setChargeType(0);
bill.setAmount(0);
bill.setUnit(null);
bill.setPeriod(0);
if (byTradeNo.getPaymentMethod().equals(PaymentMethod.ALIPAY)) {
bill.setPayMethod(1);
}
if (byTradeNo.getPaymentMethod().equals(PaymentMethod.WECHAT)) {
bill.setPayMethod(2);
}
bill.setUsername(byTradeNo.getUsername());
bill.setTotal((float) byTradeNo.getAmount());
bill.setStatus(BillStatus.PAID);
bill.setPrepaid(true);
bill.setTimestamp(Instant.now().toEpochMilli());
// 设置到账金额为 账户余额 + 充值金额 + 充值优惠赠送
bill.setBalanced(balance.getBalanced() + byTradeNo.getAmount() + payBack.getBack());
final YearMonth lastmonth = YearMonth.now();
int monthValue = lastmonth.getMonthValue();
int year = lastmonth.getYear();
bill.setYear(year);
bill.setMonth(monthValue);
return bill;
}
@NotNull
private AlipayTradePagePayRequest buildAlipayTradePagePayRequest(int amount, String by, UserPayment internalOrder, boolean isVpsClient, AlipayConfig alipayConfig) {
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(alipayConfig.getReturnUrl(isVpsClient, by) + internalOrder.getTradeNo());
// 调用支付宝支付接口,支付成功后会回调 notifyUrl
alipayRequest.setNotifyUrl(alipayConfig.getNOTIFY_URL() + internalOrder.getTradeNo());
String out_trade_no = internalOrder.getTradeNo();
String product_code = "FAST_INSTANT_TRADE_PAY";
String total_amount = "" + amount + ".00";
String subject = "订单" + out_trade_no;
String body = "";
alipayRequest.setBizContent(""
+ "{"
+ "\"out_trade_no\":\"" + out_trade_no + "\","
+ "\"product_code\":\"" + product_code + "\","
+ "\"total_amount\":\"" + total_amount + "\","
+ "\"subject\":\"" + subject + "\","
+ "\"body\":\"" + body + "\""
+ "}"
);
return alipayRequest;
}
@NotNull
private AlipayTradeQueryRequest buildAlipayTradeQueryRequest(UserPayment byTradeNo) {
AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
String out_trade_no = byTradeNo.getTradeNo();
alipayRequest.setBizContent(""
+ "{"
+ "\"out_trade_no\":\"" + out_trade_no + "\""
+ "}"
);
return alipayRequest;
}
private void dealPaySuccess(int chargeType, UserPaymentDto result, UserPayment byTradeNo, Account byName, UserBalance balance) {
byTradeNo.setSucceed(true);
// 2.1 更新 userPayment 的支付状态为成功
boolean b = userPaymentRepository.updatePaymentResult(byTradeNo, true);
if (b) {
// 2.2 获取充值优惠赠送
PayBack payBack = payBackRepository.findByPay(byTradeNo.getAmount());
if (payBack == null) {
payBack = new PayBack();
}
// chargeType 为 0 代表 充值
if (chargeType == 0) {
// 2.3 构建用户充值信息并保存
UserPrePaidBilling bill = getUserPrePaidBilling(byTradeNo, byName, balance, payBack);
userPrePaidBillingRepository.save(bill);
}
// 2.4 更新账户余额 userBalance
balance.setBalanced(balance.getBalanced() + byTradeNo.getAmount() + payBack.getBack());
userBalanceRepository.save(balance);
// 2.5 如果当前用户通过邀请码注册的,则更新邀请人的佣金
if (byName.getPromotionCode() != null) {
Account account = accountRepository.findByPromotion(byName.getPromotionCode());
if (account != null) {
account.getPromotion().setCommission(account.getPromotion().getCommission() + byTradeNo.getAmount());
accountRepository.save(account);
}
}
}
result.setBalance(Math.round(balance.getBalanced()));
result.setPaid(true);
}
}
......@@ -30,13 +30,9 @@ public class UserLackMoneyServiceImpl implements UserLackMoneyService {
//用户名,欠费金额,账单Id,账单总数
String username = billings.get(0).getUsername();
float totalUnpaid = billings.stream().filter(x -> x.getStatus() == BillStatus.UNPAID)
.map(
x -> x.getTotal() - (
x.getDeductionRecords() != null ? (x.getDeductionRecords().stream().collect(Collectors.summingDouble(DeductionRecord::getDeductionAmount)).longValue()) : (0)
)
)
.collect(Collectors.summingDouble(Float::floatValue))
.floatValue();
.map(x -> x.getTotal() - (x.getDeductionRecords() != null ? (x.getDeductionRecords().stream().collect(Collectors.summingDouble(
DeductionRecord::getDeductionAmount
)).longValue()) : (0))).collect(Collectors.summingDouble(Float::floatValue)).floatValue();
List<String> ids = billings.stream().filter(x -> x.getStatus() == BillStatus.UNPAID).map(UserPrePaidBilling::getId).collect(Collectors.toList());
int billsAmount = (int) billings.stream().filter(x -> x.getStatus() == BillStatus.UNPAID).count();
......
......@@ -15,6 +15,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Service
public class UserServiceImpl implements UserService {
......@@ -94,11 +96,11 @@ public class UserServiceImpl implements UserService {
@Override
public void create(User user) {
repository.findById(user.getUsername()).ifPresent(
it -> {
Optional<User> existing = repository.findById(user.getUsername());
existing.ifPresent(it -> {
throw new ClientRequestException(AuthErrorCode.NAMEEXIST, "user already exists: " + it.getUsername());
}
);
});
String hash = encoder.encode(user.getPassword());
user.setPassword(hash);
......
......@@ -14,7 +14,6 @@ public enum BrowserErrorCode implements ErrorCode {
IPNOTEXIST(BROWSER_BASE + 201, "The ip do not exist"),
IPNOTBINDTOSHOP(BROWSER_BASE + 202, "The ip does not bind this shop."),
USER_NOT_BIND_SHOP(BROWSER_BASE + 203, "The shop does not bind this user."),
GROUPNOTEXIST(BROWSER_BASE + 301, "The group does not exist"),
......
......@@ -22,9 +22,6 @@ public class GroupController {
@Autowired
private GroupService groupService;
/**
* 添加分组
*/
@RequestMapping("/add")
public ResultDto addGroup(Principal principal, @RequestBody GroupDto groupDto) {
ResultDto resultDto = new ResultDto();
......@@ -33,8 +30,12 @@ public class GroupController {
groupDto1.setId(groupService.addGroup(principal.getName(), groupDto.getName()));
resultDto.setData(groupDto1);
resultDto.setStatus(0);
} catch (ClientRequestException e) {
dealClientRequestException(resultDto, e);
}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;
}
......@@ -45,8 +46,12 @@ public class GroupController {
try {
groupService.updateGroup(principal.getName(), group);
resultDto.setStatus(0);
} catch (ClientRequestException e) {
dealClientRequestException(resultDto, e);
}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;
}
......@@ -57,15 +62,16 @@ public class GroupController {
try {
groupService.deleteGroup(principal.getName(), groupDto.getId());
resultDto.setStatus(0);
} catch (ClientRequestException e) {
dealClientRequestException(resultDto, e);
}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;
}
/**
* 分组列表
*/
@RequestMapping("/list")
public ResultDto getGroupList(Principal principal) {
ResultDto resultDto = new ResultDto();
......@@ -73,19 +79,14 @@ public class GroupController {
List<GroupDto> groupDtos = groupService.getGroupList(principal.getName());
resultDto.setData(groupDtos);
resultDto.setStatus(0);
} catch (ClientRequestException e) {
dealClientRequestException(resultDto, e);
}
return resultDto;
}
private void dealClientRequestException(ResultDto resultDto, ClientRequestException e) {
}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;
}
}
......@@ -138,9 +138,6 @@ public class ShopController {
return resultDto;
}
/**
* 店铺分配
*/
@RequestMapping(value = "/assign", method = RequestMethod.POST)
public ResultDto assignShop(Principal principal, @RequestBody ShopRequestDto shopRequestDto) {
ResultDto resultDto = new ResultDto();
......@@ -153,9 +150,6 @@ public class ShopController {
return resultDto;
}
/**
* 获取带有 ip 资源信息的 shop
*/
@RequestMapping(value = "/list", method = RequestMethod.POST)
public ResultDto getShopList(Principal principal, @RequestBody ShopRequestDto shopRequestDto) {
logger.info("shop list params {}", JSONObject.toJSONString(shopRequestDto));
......@@ -171,9 +165,6 @@ public class ShopController {
return resultDto;
}
/**
* 获取当前登录用户已经绑定了当前商铺的 所有子用户名
*/
@RequestMapping(value = "/subusers", method = RequestMethod.POST)
public ResultDto getShopSubUsers(Principal principal, @RequestBody ShopRequestDto shopRequestDto) {
ResultDto resultDto = new ResultDto();
......@@ -200,9 +191,6 @@ public class ShopController {
return resultDto;
}
/**
* 查询店铺信息
*/
@RequestMapping(value = "/query", method = RequestMethod.POST)
public ResultDto queryShop(Principal principal, @RequestBody ShopRequestDto shopRequestDto) {
ResultDto resultDto = new ResultDto();
......@@ -216,22 +204,6 @@ public class ShopController {
return resultDto;
}
/**
* 恢复部分缺失数据,仅仅调用一次就好了
*/
@GetMapping(value = "/deal_dirtydata")
public ResultDto dealDirtydata() {
Integer num = shopService.dealDirtyData();
ResultDto resultDto = new ResultDto();
resultDto.setStatus(0);
resultDto.setData("修复脏数据" + num + "条");
return resultDto;
}
private void dealClientRequestException(ResultDto resultDto, ClientRequestException e) {
resultDto.setStatus(-1);
Map<String, Object> statusInfo = new HashMap<>();
......
......@@ -21,129 +21,42 @@ public class IpResource implements Serializable {
@Id
private String id;
/**
* ip 地址
*/
private String addr;
/**
* ip 类型,默认是 ip代理 模式
*/
private IpType ipType = IpType.VENDOR;
/**
* ip 的具体代理使用
*/
private Vendor vendor;
private String vendorCn;
/**
* ip 地域
*/
private String region;
private String regionCn;
/**
* ip 的状态
* 0:正常, 1:已过期, 2:即将过期, 3:正在分配, 4:未使用, 5:已失效, 6:未分配, 7:未缴费, 8:分配成功
*/
//0:正常, 1:已过期, 2:即将过期, 3:正在分配, 4:未使用, 5:已失效, 6:未分配, 7:未缴费, 8:分配成功
private int status;
/**
* ip 端口号
*/
private List<String> port;
/**
* ip的购买时间点
*/
private long purchasedTime;
/**
* ip的过期的时间点
*/
private long validTime;
private String details;
/**
* ip的绑定历史
*/
private List<BindHistory> bindHistory = new ArrayList<>();
/**
* ip的状态
* 当 ip 资源过期的时候,系统不会直接删除 ip 资源,而是将 isDeleted 设置为 true
* 过期7天后再删除这个ip资源
*/
private boolean isDeleted;
/**
* 如果 使用的 ip 资源 是在我们系统申请的,则默认为 fangguanlianbrowser
*/
private String username;
/**
* ip 资源的购买者(拥有者)
*/
private String owner;
private String userParent;
/**
* ip访问协议
*/
private List<String> protocol;
private String password;
private double price;
/**
* 是否使用专线
*/
private boolean specialLine;
private boolean specialLine; //是否使用专线
private boolean usingSpecialLine; //是否正在使用专线
//专线数据
private String proxyUsername; //专线的代理用户名
private String proxyPassword; //专线的代理密码
/**
* 是否正在使用专线
*/
private boolean usingSpecialLine;
/**
* 专线的代理用户名
*/
private String proxyUsername;
/**
* 专线的代理密码
*/
private String proxyPassword;
/**
* ip 资源绑定的 商铺号
*/
private String shopId;
private List<String> shopIds = new ArrayList<>();
/**
* 绑定状态
*/
private boolean bind;
private boolean isLocked;
private long lockTimestamp;
private long healthLockTimestamp;
/**
* 购买方式(按月、按周)
*/
private String unit;
/**
* 购买数量
* 例如 购买了 2 个月 的 ip资源,则
* period:2
* unit:month
*/
private int period;
@Override
......
......@@ -14,5 +14,5 @@ public enum IpType {
/**
* 自有ip,即该ip不是从我们系统购买的
*/
OWN
OWN;
}
......@@ -4,44 +4,14 @@ import java.util.ArrayList;
import java.util.List;
public class IpBuyResultDto {
private String errorCode = "";
private String errorCode="";
private String requestid = "";
private String requestid ="";
private int balance = 0;
private List<IPData> iplist = new ArrayList<>();
public static class IPData {
private String ip;
private String validTill;
public IPData(String ip, String validTill) {
this.ip = ip;
this.validTill = validTill;
}
public IPData() {
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getValidTill() {
return validTill;
}
public void setValidTill(String validTill) {
this.validTill = validTill;
}
}
public String getErrorCode() {
return errorCode;
}
......@@ -73,4 +43,34 @@ public class IpBuyResultDto {
public void setIplist(List<IPData> iplist) {
this.iplist = iplist;
}
public static class IPData {
private String ip;
private String validTill;
public IPData(String ip, String validTill) {
this.ip = ip;
this.validTill = validTill;
}
public IPData() {
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getValidTill() {
return validTill;
}
public void setValidTill(String validTill) {
this.validTill = validTill;
}
}
}
package com.edgec.browserbackend.browser.dto;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class IpOperationResultDto {
List<String> successList;
List<String> failList;
List<String> successList = new ArrayList<>();
List<String> failList = new ArrayList<>();
public List<String> getSuccessList() {
return successList;
}
public void setSuccessList(List<String> successList) {
this.successList = successList;
}
public List<String> getFailList() {
return failList;
}
public void setFailList(List<String> failList) {
this.failList = failList;
}
}
......@@ -10,58 +10,27 @@ import java.util.List;
@JsonIgnoreProperties(ignoreUnknown = true)
public class IpResourceRequestDto {
private String name;
/**
* ip 所在地域(英文)
*/
private String region;
/**
* ip 所在地域(中文)
*/
private String regionCn;
/**
* ip 厂商
*/
private String vendor = "aliyun";
private String vendor="aliyun";
private String logintype = "password";
private String shopId;
/**
* 0:余额, 1:支付宝, 2:微信
*/
//0 -- 余额, 1 -- 支付宝, 2 -- 微信
private int payMethod = 0;
@Max(12)
@Min(1)
private int period = 1;
/**
* 例如 period :2,unit = month
* 代表:购买 ip 2 个 月
*/
private String unit = "month";
/**
* 购买的ip数量(用户可以一次购买多个ip)
*/
private String unit="month";
private int amount = 1;
private boolean autorenew = false;
private int ipkeptperiod = 7;
private String startscript = "";
/**
* ip 是否需要使用专线
*/
private boolean specialLine;
/**
* 自有IP需要传proxy的账号
*/
//自有IP需要传proxy的账号
private String username;
private String password;
private String instanceSpecKey;
......@@ -75,7 +44,6 @@ public class IpResourceRequestDto {
private List<String> ipId = new ArrayList<>();
public String getName() {
return name;
}
......
......@@ -4,12 +4,36 @@ import java.util.ArrayList;
import java.util.List;
public class RenewIpResultDto {
private String errorCode = "";
private String errorCode="";
private int balance = 0;
private List<IpBuyResultDto.IPData> iplist = new ArrayList<>();
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
public List<IpBuyResultDto.IPData> getIplist() {
return iplist;
}
public void setIplist(List<IpBuyResultDto.IPData> iplist) {
this.iplist = iplist;
}
public static class IPData {
private String ip;
private String validTill;
......@@ -20,6 +44,7 @@ public class RenewIpResultDto {
}
public IPData() {
}
public String getIp() {
......@@ -39,28 +64,4 @@ public class RenewIpResultDto {
}
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
public List<IpBuyResultDto.IPData> getIplist() {
return iplist;
}
public void setIplist(List<IpBuyResultDto.IPData> iplist) {
this.iplist = iplist;
}
}
\ No newline at end of file
......@@ -35,7 +35,10 @@ public class IpResourceRepositoryCustomImpl implements IpResourceRepositoryCusto
update.set("isLocked", true).set("lockTimestamp", Instant.now().toEpochMilli());
UpdateResult result = mongoTemplate.updateFirst(basicQuery, update, IpResource.class);
return result.getModifiedCount() >= 1;
if (result.getModifiedCount() < 1)
return false;
else
return true;
}
@Override
......
......@@ -9,12 +9,7 @@ import java.util.List;
public interface ShopRepository extends MongoRepository<Shop, String> {
Page<Shop> findByShopIdInAndShopAccountLikeOrderByCreateTimeDesc(List<String> shopIds, String shopAccount, Pageable pageable);
Page<Shop> findByShopIdInAndShopNameLikeOrderByCreateTimeDesc(List<String> shopIds, String shopName, Pageable pageable);
Page<Shop> findByShopIdInOrderByCreateTimeDesc(List<String> shopIds, Pageable pageable);
List<Shop> findByShopIdIn(List<String> shopIds);
List<Shop> findByOwnerIn(List<String> owners);
}
......@@ -35,26 +35,20 @@ public class GroupServiceImpl implements GroupService {
@Override
public String addGroup(String username, String groupName) {
// 1. 校验传参
if (StringUtils.isBlank(username) || StringUtils.isBlank(groupName)) {
if (StringUtils.isBlank(username) || StringUtils.isBlank(groupName))
throw new ClientRequestException(BrowserErrorCode.INFORMATIONNOTCOMPELETE);
}
// 2. 获取account信息并校验account
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account.getGroupCount() >= 100) {
if (account == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST);
if (account.getGroupCount() >= 100)
throw new ClientRequestException(AccountErrorCode.GROUPMAX);
}
Group group = new Group();
group.setOwner(username);
group.setName(groupName);
String id;
try {
// 3. 保存 group信息
Group group1 = groupRepository.save(group);
// 4. 更新 account 的 分组数
//可以优化
account.setGroupCount(account.getGroupCount() + 1);
accountRepository.save(account);
id = group1.getId();
......@@ -86,6 +80,8 @@ public class GroupServiceImpl implements GroupService {
if (StringUtils.isBlank(username) || StringUtils.isBlank(groupId))
throw new ClientRequestException(BrowserErrorCode.INFORMATIONNOTCOMPELETE);
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST);
try {
userShopRepository.updateGroupId(groupId, null);
groupRepository.deleteById(groupId);
......@@ -100,17 +96,20 @@ public class GroupServiceImpl implements GroupService {
@Override
public List<GroupDto> getGroupList(String username) {
if (StringUtils.isBlank(username)) {
if (StringUtils.isBlank(username))
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST);
}
List<GroupDto> groupDtos = new ArrayList<>();
List<Group> groups = groupRepository.findByOwner(username);
groups.forEach(
x -> groupDtos.add(new GroupDto(x.getId(), x.getName(), x.getDetails()))
);
if (groups == null)
return new ArrayList<>();
List<GroupDto> groupDtos = new ArrayList<>();
try {
groups.stream().forEach(x -> {
groupDtos.add(new GroupDto(x.getId(), x.getName(), x.getDetails()));
});
} catch (Exception e) {
logger.error("fail to delete group", e.getMessage());
throw new ClientRequestException(BrowserErrorCode.UNKNOWN);
}
return groupDtos;
}
}
......@@ -20,7 +20,6 @@ import com.edgec.browserbackend.common.utils.FileUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -159,36 +158,36 @@ public class IpResourceServiceImpl implements IpResourceService {
@Override
public List<String> buyIp(String username, IpResourceRequestDto ipResourceRequestDto) throws Exception {
// 1. 数据校验
if (ipResourceRequestDto.getRegion() == null || ipResourceRequestDto.getRegionCn() == null) {
throw new ClientRequestException(BrowserErrorCode.INFORMATIONNOTCOMPELETE);
}
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account.getPermission() < 4) {
if (account == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST);
if (account.getPermission() < 4)
throw new ClientRequestException(AccountErrorCode.NOPERMISSION);
}
// 2. 计算 ip 单价信息
double newprice = 0;
if (!"own".equals(ipResourceRequestDto.getVendor())) {
Map<String, List<String>> priceList = ipOptionsRepository.findAll().get(0).getIpPlatForm();
if (ipResourceRequestDto.getRegion() == null)
throw new ClientRequestException(BrowserErrorCode.INFORMATIONNOTCOMPELETE);
if (ipResourceRequestDto.getRegionCn() == null)
throw new ClientRequestException(BrowserErrorCode.INFORMATIONNOTCOMPELETE);
double newprice = 0;
if (!ipResourceRequestDto.getVendor().equals("own")) {
List<String> vendorPrices = priceList.get(ipResourceRequestDto.getRegionCn());
String price = vendorPrices.stream()
.filter(x -> Vendor.valueOf(ipResourceRequestDto.getVendor()).getValue().equals(x.substring(0, x.indexOf("-"))))
.map(x -> x.substring(x.lastIndexOf("-") + 1))
.collect(Collectors.joining());
newprice = "week".equals(ipResourceRequestDto.getUnit()) ? (Integer.valueOf(price) / 3) : Integer.valueOf(price);
.map(x -> x.substring(x.lastIndexOf("-") + 1)).collect(Collectors.joining());
newprice = ipResourceRequestDto.getUnit().equals("week") ? (Integer.valueOf(price) / 3) : Integer.valueOf(price);
}
// 3. 计算总共需要花费多少钱 并 校验账户余额 够不够扣费
IpChargeResultDto ipChargeResultDto = accountService.preChargeByMoney(username, newprice * ipResourceRequestDto.getAmount() * ipResourceRequestDto.getPeriod());
if (!ipChargeResultDto.isSuccess()) {
throw new ClientRequestException(AccountErrorCode.NOTENOUGHBALANCE);
}
// 生成随机密码
String password = StringUtils.isNotBlank(ipResourceRequestDto.getPassword()) ? ipResourceRequestDto.getPassword() : genRandom(3, 12);
String password;
if (StringUtils.isNotBlank(ipResourceRequestDto.getPassword()))
password = ipResourceRequestDto.getPassword();
else
password = genRandom(3, 12);
List<IpResourceDto> ipResourceDtos = new ArrayList<>();
List<String> ipIds = new ArrayList<>();
......@@ -197,37 +196,28 @@ public class IpResourceServiceImpl implements IpResourceService {
IpResource ipResource = new IpResource();
ipResource.setPeriod(ipResourceRequestDto.getPeriod());
//充6送1
if (ipResourceRequestDto.getUnit().equals("month")) {
if (ipResourceRequestDto.getPeriod() == 6) {
if (ipResourceRequestDto.getUnit().equals("month") && ipResourceRequestDto.getPeriod() == 6)
ipResource.setPeriod(7);
}
if (ipResourceRequestDto.getPeriod() == 12) {
else if (ipResourceRequestDto.getUnit().equals("month") && ipResourceRequestDto.getPeriod() == 12)
ipResource.setPeriod(14);
}
}
// 根据 ip 的 vendor 来封装部分的 ipResource 信息
if (ipResourceRequestDto.getVendor().equals("local")) {
ipResource.setAddr("本地Ip未使用");
ipResource.setIpType(IpType.LOCAL);
ipResource.setVendor(Vendor.valueOf(ipResourceRequestDto.getVendor()));
ipResource.setVendorCn("本地");
ipResource.setStatus(4);
long validTime = 0;
if (ipResourceRequestDto.getUnit().equals("week")) {
validTime = Instant.now().atZone(ZoneOffset.UTC).plusWeeks(ipResource.getPeriod()).toInstant().toEpochMilli();
} else {
validTime = Instant.now().atZone(ZoneOffset.UTC).plusMonths(ipResource.getPeriod()).toInstant().toEpochMilli();
}
ipResource.setValidTime(validTime);
ipResource.setUsername(USERNAME);
if (ipResourceRequestDto.getUnit().equals("week"))
ipResource.setValidTime(Instant.now().atZone(ZoneOffset.UTC).plusWeeks(ipResource.getPeriod()).toInstant().toEpochMilli());
else
ipResource.setValidTime(Instant.now().atZone(ZoneOffset.UTC).plusMonths(ipResource.getPeriod()).toInstant().toEpochMilli());
ipResource.setPort(port);
} else if (ipResourceRequestDto.getVendor().equals("own")) {
if (ipResourceRequestDto.getAddr() == null || ipResourceRequestDto.getAddr().isEmpty() || StringUtils.isBlank(ipResourceRequestDto.getAddr().get(i))) {
if (ipResourceRequestDto.getAddr() == null || ipResourceRequestDto.getAddr().size() == 0)
throw new ClientRequestException(BrowserErrorCode.INFORMATIONNOTCOMPELETE);
if (StringUtils.isBlank(ipResourceRequestDto.getAddr().get(i)))
throw new ClientRequestException(BrowserErrorCode.INFORMATIONNOTCOMPELETE);
}
ipResource.setSpecialLine(ipResourceRequestDto.isSpecialLine());
ipResource.setAddr(ipResourceRequestDto.getAddr().get(i));
ipResource.setIpType(IpType.OWN);
......@@ -251,38 +241,26 @@ public class IpResourceServiceImpl implements IpResourceService {
case "aws":
ipResource.setVendorCn("亚马逊云");
break;
default:
break;
}
ipResource.setStatus(6);
long validTime = 0;
if (ipResourceRequestDto.getUnit().equals("week")) {
validTime = Instant.now().atZone(ZoneOffset.UTC).plusWeeks(ipResource.getPeriod()).toInstant().toEpochMilli();
} else {
validTime = Instant.now().atZone(ZoneOffset.UTC).plusMonths(ipResource.getPeriod()).toInstant().toEpochMilli();
}
ipResource.setValidTime(validTime);
if (ipResourceRequestDto.getUnit().equals("week"))
ipResource.setValidTime(Instant.now().atZone(ZoneOffset.UTC).plusWeeks(ipResource.getPeriod()).toInstant().toEpochMilli());
else
ipResource.setValidTime(Instant.now().atZone(ZoneOffset.UTC).plusMonths(ipResource.getPeriod()).toInstant().toEpochMilli());
ipResource.setUsername(USERNAME);
ipResource.setPort(port);
}
ipResource.setPurchasedTime(Instant.now().toEpochMilli());
if (account.getParent() != null) {
if (account.getParent() != null)
ipResource.setUserParent(account.getParent());
}
ipResource.setRegion(ipResourceRequestDto.getRegion());
// 只要 申请的 ip 地域不是在 大陆,则一定会执行下面 if 中的代码块
boolean condition1 = StringUtils.isNotBlank(ipResource.getRegion()) && region.contains(ipResource.getRegion());
boolean condition2 = ipResourceRequestDto.getVendor().equals("own") && ipResource.isSpecialLine();
if (condition1 || condition2) {
if ((StringUtils.isNotBlank(ipResource.getRegion()) && region.contains(ipResource.getRegion())) || (ipResourceRequestDto.getVendor().equals("own") && ipResource.isSpecialLine())) {
ipResource.setProxyUsername(ipResource.getAddr());
ipResource.setProxyPassword(genRandom(3, 12));
ipResource.setSpecialLine(true);
ipResource.setHealthLockTimestamp(Instant.now().minusSeconds(60 * 20).toEpochMilli());
}
ipResource.setPurchasedTime(Instant.now().toEpochMilli());
ipResource.setRegionCn(ipResourceRequestDto.getRegionCn());
ipResource.setProtocol(protocol);
ipResource.setPassword(password);
......@@ -291,22 +269,16 @@ public class IpResourceServiceImpl implements IpResourceService {
ipResource.setLockTimestamp(Instant.now().toEpochMilli());
ipResource.setUnit(ipResourceRequestDto.getUnit());
ipResource.setPrice(newprice);
IpResource ipResource1 = ipResourceRepository.save(ipResource);
ipResourceDtos.add(new IpResourceDto(ipResource1, null, false));
ipIds.add(ipResource1.getId());
}
if (!ipResourceRequestDto.getVendor().equals("own")) {
// 封装购买 ip 的费用 信息
IpChargeRequestDto ipChargeRequestDto = buildIpChargeRequestDto(ipResourceRequestDto, 1, ipResourceRequestDto.getPayMethod());
// 用来记录购买与消费的操作 userbalance 与 费用明细 userprepaidbilling
accountService.chargeByMoney(username, newprice * ipChargeRequestDto.getAmount() * ipChargeRequestDto.getPeriod(), ipChargeRequestDto);
}
// 如果ip需要绑定店铺,则将店铺与ip绑定 todo 感觉这个地方代码用不到,
if (ipResourceRequestDto.getShopId() != null) {
ShopRequestDto shopRequestDto = new ShopRequestDto();
shopRequestDto.setIpId(ipResourceDtos.get(0).getId());
......@@ -319,94 +291,104 @@ public class IpResourceServiceImpl implements IpResourceService {
@Override
public IpOperationResultDto renewIp(String username, IpResourceRequestDto ipResourceRequestDto) {
// 1. 校验当前用户是否存在
accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
String URL = (profiles.equals("dev") || profiles.equals("staging")) ? TESTURL : CLOUDAMURL;
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST);
// 2. 获取 ip 资源 地域 - 云厂商 - 价格 信息
Map<String, List<String>> ipPlatForm = ipOptionsRepository.findAll().get(0).getIpPlatForm();
List<String> failedList = ipResourceRequestDto.getAddr();
// 3. 计算如果是按月续费ip一个月一共需要花费多少钱,如果是按周学费,则在原来的基础上除以3。
AtomicReference<Double> totalprice = getDoubleAtomicReference(ipResourceRequestDto, ipPlatForm);
String unit = ipResourceRequestDto.getUnit();
double newprice = unit.equals("week") ? (int) (totalprice.get() / 3) : totalprice.get().intValue();
Map<String, List<String>> priceList = ipOptionsRepository.findAll().get(0).getIpPlatForm();
AtomicReference<Double> totalprice = new AtomicReference<>((double) 0);
ipResourceRequestDto.getAddr().stream().map(x -> ipResourceRepository.findByAddrAndIsDeleted(x, false))
.forEach(ipResource -> {
List<String> prices;
if (!ipResourceRequestDto.getVendor().equals("own"))
prices = priceList.get(ipResource.getRegionCn());
else {
if (ipResource.isSpecialLine())
prices = priceList.get("自有专线");
else
prices = priceList.get("自有");
}
for (String vendorprice : prices) {
if (ipResource.getVendor().getValue().equals(vendorprice.substring(0, vendorprice.indexOf("-"))))
totalprice.updateAndGet(v -> new Double(v + Double.valueOf(vendorprice.substring(vendorprice.lastIndexOf("-") + 1))));
}
});
// 4. 计算总共需要花费多少钱 并 校验账户余额 够不够扣费, todo 这个地方 * ipResourceRequestDto.getAmount() 应该是多余的,因为在续费的时候,这个值始终为1
double newprice = ipResourceRequestDto.getUnit().equals("week") ? (int) (totalprice.get() / 3) : totalprice.get().intValue();
IpChargeResultDto ipChargeResultDto = accountService.preChargeByMoney(username, newprice * ipResourceRequestDto.getPeriod() * ipResourceRequestDto.getAmount());
if (!ipChargeResultDto.isSuccess()) {
throw new ClientRequestException(AccountErrorCode.NOTENOUGHBALANCE);
}
int period = ipResourceRequestDto.getPeriod();
IpOperationResultDto ipOperationResultDto = new IpOperationResultDto();
// 5. 按月充值充6送1
period = setAndGetPeriod(unit, period);
int period = 0;
period = ipResourceRequestDto.getPeriod();
//充6送1
if (ipResourceRequestDto.getUnit().equals("month") && ipResourceRequestDto.getPeriod() == 6)
period = 7;
else if (ipResourceRequestDto.getUnit().equals("month") && ipResourceRequestDto.getPeriod() == 12)
period = 14;
// 6. 实际业务逻辑
IpOperationResultDto ipOperationResultDto = new IpOperationResultDto();
List<String> failedList = ipResourceRequestDto.getAddr();
if (ipResourceRequestDto.getAddr() != null && ipResourceRequestDto.getAddr().size() > 0) {
// 6.1 远程调用 云E 续费 传入的所有的 ip,校验是否续费成功
RenewIpResultDto renewIpResultDto = getRenewIpResultDto(ipResourceRequestDto, period);
RestTemplate restTemplate = new RestTemplate();
HashMap<String, Object> map = new HashMap<>();
map.put("iplist", ipResourceRequestDto.getAddr());
map.put("period", period);
map.put("unit", ipResourceRequestDto.getUnit());
HttpHeaders headers = buildPostHeader();
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(map, headers);
ResponseEntity<String> result = restTemplate.exchange(URL + "/intelligroup/renewip?accountId=browser", HttpMethod.PUT, entity, String.class);
RenewIpResultDto renewIpResultDto = JSON.parseObject(result.getBody(), RenewIpResultDto.class);
if (StringUtils.isNotBlank(renewIpResultDto.getErrorCode())) {
logger.error(renewIpResultDto.getErrorCode());
throw new ClientRequestException(BrowserErrorCode.UNKNOWN);
}
// 6.2 远程续费成功后的业务
renewIpResultDto.getIplist().forEach(
x -> {
renewIpResultDto.getIplist().forEach(x -> {
IpResource ipResource = ipResourceRepository.findByAddrAndIsDeleted(x.getIp(), false);
List<String> vendorPrices = ipPlatForm.get(ipResource.getRegionCn());
// 计算 ip 价格
List<String> vendorPrices = priceList.get(ipResource.getRegionCn());
String price = vendorPrices.stream()
.filter(vendorprice -> ipResource.getVendor().getValue().equals(vendorprice.substring(0, vendorprice.indexOf("-"))))
.map(vendorprice -> vendorprice.substring(vendorprice.lastIndexOf("-") + 1))
.collect(Collectors.joining());
double newprice1 = ipResourceRequestDto.getUnit().equals("week") ? (Integer.valueOf(price) / 3) : Integer.valueOf(price);
.map(vendorprice -> vendorprice.substring(vendorprice.lastIndexOf("-") + 1)).collect(Collectors.joining());
// 封装 ip 的续费 信息
double newprice1 = ipResourceRequestDto.getUnit().equals("week") ? (Integer.valueOf(price) / 3) : Integer.valueOf(price);
IpChargeRequestDto ipChargeRequestDto = buildIpChargeRequestDto(ipResourceRequestDto, 2, ipResourceRequestDto.getPayMethod());
ipChargeRequestDto.setChargeIp(x.getIp());
// 用来记录购买与消费的操作 userbalance 与 费用明细 userprepaidbilling
accountService.chargeByMoney(username, newprice1 * ipResourceRequestDto.getPeriod() * ipResourceRequestDto.getAmount(), ipChargeRequestDto);
// 更新ip资源的到期时间
ipResource.setValidTime(Instant.parse(x.getValidTill()).toEpochMilli());
ipResourceRepository.save(ipResource);
// 封装 ipOperationResultDto
ipOperationResultDto.getSuccessList().add(x.getIp());
failedList.remove(x.getIp());
}
);
});
// 封装 ipOperationResultDto
ipOperationResultDto.setFailList(failedList);
}
if (ipResourceRequestDto.getIpId() != null && ipResourceRequestDto.getIpId().size() > 0) {
int finalPeriod = period;
ipResourceRequestDto.getIpId().forEach(
x -> {
ipResourceRequestDto.getIpId().forEach(x -> {
IpResource ipResource = ipResourceRepository.findByIdAndIsDeleted(x, false);
List<String> vendorPrices;
if (!ipResourceRequestDto.getVendor().equals("own"))
vendorPrices = ipPlatForm.get(ipResource.getRegionCn());
vendorPrices = priceList.get(ipResource.getRegionCn());
else {
if (ipResource.isSpecialLine())
vendorPrices = ipPlatForm.get("自有专线");
vendorPrices = priceList.get("自有专线");
else
vendorPrices = ipPlatForm.get("自有");
vendorPrices = priceList.get("自有");
}
String price = vendorPrices.stream()
.filter(vendorprice -> ipResource.getVendor().getValue().equals(vendorprice.substring(0, vendorprice.indexOf("-"))))
.map(vendorprice -> vendorprice.substring(vendorprice.lastIndexOf("-") + 1))
.collect(Collectors.joining());
.map(vendorprice -> vendorprice.substring(vendorprice.lastIndexOf("-") + 1)).collect(Collectors.joining());
double newprice1 = ipResourceRequestDto.getUnit().equals("week") ? (Integer.valueOf(price) / 3) : Integer.valueOf(price);
IpChargeRequestDto ipChargeRequestDto = buildIpChargeRequestDto(ipResourceRequestDto, 2, ipResourceRequestDto.getPayMethod());
ipChargeRequestDto.setChargeIp(x);
accountService.chargeByMoney(username, newprice1 * ipResourceRequestDto.getPeriod() * ipResourceRequestDto.getAmount(), ipChargeRequestDto);
if (ipResourceRequestDto.getUnit().equals("week")) {
......@@ -420,8 +402,7 @@ public class IpResourceServiceImpl implements IpResourceService {
ipOperationResultDto.getSuccessList().add(x);
failedList.remove(x);
}
);
});
}
return ipOperationResultDto;
......@@ -705,6 +686,8 @@ public class IpResourceServiceImpl implements IpResourceService {
@Override
public boolean queryIpExist(String username, IpResourceUpdateDto ipResourceUpdateDto) {
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST);
IpResource ipResource = ipResourceRepository.findByAddrAndIsDeleted(ipResourceUpdateDto.getAddr(), false);
if (ipResource != null) {
return true;
......@@ -715,6 +698,8 @@ public class IpResourceServiceImpl implements IpResourceService {
@Override
public IpResourceDto queryIp(String username, IpResourceRequestDto ipResourceRequestDto) {
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST);
IpResource ipResource = null;
if (ipResourceRequestDto.getAddr() != null && ipResourceRequestDto.getAddr().size() > 0)
ipResource = ipResourceRepository.findByAddrAndIsDeleted(ipResourceRequestDto.getAddr().get(0), false);
......@@ -790,14 +775,13 @@ public class IpResourceServiceImpl implements IpResourceService {
}
}
private IpChargeRequestDto buildIpChargeRequestDto(IpResourceRequestDto request, int chargeType, int payMethod) {
IpChargeRequestDto ipChargeRequestDto = new IpChargeRequestDto();
ipChargeRequestDto.setAmount(request.getAmount());
ipChargeRequestDto.setChargeType(chargeType);
ipChargeRequestDto.setRegion(request.getRegion());
ipChargeRequestDto.setPeriod(request.getPeriod());
ipChargeRequestDto.setUnit(request.getUnit());
ipChargeRequestDto.setChargeType(chargeType);
ipChargeRequestDto.setPayMethod(payMethod);
return ipChargeRequestDto;
}
......@@ -913,57 +897,4 @@ public class IpResourceServiceImpl implements IpResourceService {
}
return ipResources1;
}
private int setAndGetPeriod(String unit, int period) {
if (unit.equals("month")) {
if (period == 6) {
period = 7;
}
if (period == 12) {
period = 14;
}
}
return period;
}
@NotNull
private AtomicReference<Double> getDoubleAtomicReference(IpResourceRequestDto ipResourceRequestDto, Map<String, List<String>> ipPlatForm) {
AtomicReference<Double> totalprice = new AtomicReference<>((double) 0);
ipResourceRequestDto.getAddr().stream()
.map(x -> ipResourceRepository.findByAddrAndIsDeleted(x, false))
.forEach(
ipResource -> {
List<String> regionAndPriceInfos;
if (!ipResourceRequestDto.getVendor().equals("own")) {
regionAndPriceInfos = ipPlatForm.get(ipResource.getRegionCn());
} else {
regionAndPriceInfos = ipResource.isSpecialLine() ? ipPlatForm.get("自有专线") : ipPlatForm.get("自有");
}
for (String vendorprice : regionAndPriceInfos) {
if (ipResource.getVendor().getValue().equals(vendorprice.substring(0, vendorprice.indexOf("-"))))
totalprice.updateAndGet(
v -> new Double(v + Double.valueOf(vendorprice.substring(vendorprice.lastIndexOf("-") + 1)))
);
}
}
);
return totalprice;
}
@Nullable
private RenewIpResultDto getRenewIpResultDto(IpResourceRequestDto ipResourceRequestDto, int period) {
RestTemplate restTemplate = new RestTemplate();
HashMap<String, Object> map = new HashMap<>();
map.put("iplist", ipResourceRequestDto.getAddr());
map.put("period", period);
map.put("unit", ipResourceRequestDto.getUnit());
HttpHeaders headers = buildPostHeader();
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(map, headers);
String URL = (profiles.equals("dev") || profiles.equals("staging")) ? TESTURL : CLOUDAMURL;
ResponseEntity<String> result = restTemplate.exchange(URL + "/intelligroup/renewip?accountId=browser", HttpMethod.PUT, entity, String.class);
return JSON.parseObject(result.getBody(), RenewIpResultDto.class);
}
}
......@@ -26,7 +26,9 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.time.Instant;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Service
......@@ -169,7 +171,7 @@ public class ShopServiceImpl implements ShopService {
ids.add(id);
} catch (Exception e) {
logger.error("fail to add shops", e);
logger.error("fail to add shops", e.getMessage());
throw new ClientRequestException(BrowserErrorCode.INFORMATIONNOTCOMPELETE);
}
}
......@@ -201,7 +203,7 @@ public class ShopServiceImpl implements ShopService {
// 4. 更新店铺信息
shopRepository.save(shop_old);
} catch (Exception e) {
logger.error("fail to update", e);
logger.error("fail to update", e.getMessage());
throw new ClientRequestException(BrowserErrorCode.INFORMATIONNOTCOMPELETE);
}
return shop_old.getShopId();
......@@ -234,19 +236,20 @@ public class ShopServiceImpl implements ShopService {
ipAndShopService.unBindShop(username, shopRequestDto);
}
// 4. 获取当前店铺关联的所有的 usershop信息 并删除数据库中 usershop信息
List<UserShop> userShops = userShopRepository.findByShopId(shopId);
// 4. 删除当前店铺关联的所有的 usershop信息
boolean result = userShopRepository.deleteByShopId(shopId);
if (result) {
// 5. 删除当前店铺,并更新 account信息 todo
shopRepository.deleteById(shopId);
// 6. 更新 和店铺关联的所有的 account 的信息
List<UserShop> userShops = userShopRepository.findByShopId(shopId);
List<Account> accountList = accountRepository.findByNameIn(userShops.stream().map(UserShop::getUsername).collect(Collectors.toList()));
for (Account a : accountList) {
a.setShopCount(account.getShopCount() - 1);
accountRepository.save(a);
}
} else {
throw new ClientRequestException(AccountErrorCode.NOPERMISSION);
}
......@@ -254,29 +257,19 @@ public class ShopServiceImpl implements ShopService {
@Override
public void transferShop(String username, String shopId, String groupId) {
// 1. 校验当前用户是否存在账户信息
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
// 2. 校验 shop 是否存在
Shop shop = shopRepository.findById(shopId).orElseThrow(() -> new ClientRequestException(BrowserErrorCode.SHOPNOTEXIST));
// 3. 校验 分组信息是否存在 以及 group 是否是当前 用户创建
Group group = groupRepository.findById(groupId).orElseThrow(() -> new ClientRequestException(BrowserErrorCode.GROUPNOTEXIST));
if (!group.getId().equals("-1") && group.getOwner() != null && !group.getOwner().equals(username)) {
throw new ClientRequestException(AccountErrorCode.NOPERMISSION);
}
// 4. 获取 usershop 信息 并校验
UserShop userShop = userShopRepository.findByUsernameAndShopId(username, shopId);
if (userShop == null) {
throw new ClientRequestException(BrowserErrorCode.USER_NOT_BIND_SHOP);
Group group = groupRepository.findById(groupId).orElseThrow(() -> new ClientRequestException(BrowserErrorCode.GROUPNOTEXIST));
if (userShop == null || (!group.getId().equals("-1") && group.getOwner() != null && !group.getOwner().equals(username))) {
throw new ClientRequestException(AccountErrorCode.NOPERMISSION);
}
Shop shop = shopRepository.findById(shopId).orElseThrow(() -> new ClientRequestException(BrowserErrorCode.SHOPNOTEXIST));
try {
// 5.更该 店铺 分组 并保存
userShop.setGroupId(groupId);
userShopRepository.save(userShop);
} catch (Exception e) {
logger.error("fail to unbind", e);
logger.error("fail to unbind", e.getMessage());
throw new ClientRequestException(BrowserErrorCode.UNKNOWN);
}
......@@ -284,115 +277,98 @@ public class ShopServiceImpl implements ShopService {
@Override
public void assignShops(String username, List<String> shopIds, List<String> users) {
// 1. 查询当前登录用户信息,并校验是否具备分配权限
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account.getPermission() < 8) {
throw new ClientRequestException(AccountErrorCode.NOPERMISSION);
}
// 2. 校验当前用户是否绑定了对应的 shops,并获取 usershops信息
List<UserShop> userShops = userShopRepository.findByUsernameAndShopIdIn(username, shopIds);
if (userShops == null || userShops.size() < 1) {
throw new ClientRequestException(BrowserErrorCode.USER_NOT_BIND_SHOP);
if (account.getPermission() < 8 || userShops == null || userShops.size() < 1) {
throw new ClientRequestException(AccountErrorCode.NOPERMISSION);
}
// 3. 查询 目标 账户是否存在,并获取账户信息。注意:目标账户只能是当前用户的子账户
Pageable pageable = PageRequest.of(0, 100);
List<Shop> shops = shopRepository.findByShopIdInOrderByCreateTimeDesc(shopIds, pageable).getContent();
if (shops == null || shops.size() < 1)
throw new ClientRequestException(BrowserErrorCode.SHOPNOTEXIST);
List<Account> accounts = accountRepository.findByNameIn(users);
if (accounts == null || accounts.size() != users.size()) {
if (accounts == null || accounts.size() != users.size())
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST);
}
for (Account ac : accounts) {
if (ac.getParent() == null || !ac.getParent().equals(username)) {
throw new ClientRequestException(AccountErrorCode.NOPERMISSION);
}
}
// 4. 获取 shop 信息 并校验
Pageable pageable = PageRequest.of(0, 100);
List<Shop> shops = shopRepository.findByShopIdInOrderByCreateTimeDesc(shopIds, pageable).getContent();
if (shops == null || shops.size() < 1) {
throw new ClientRequestException(BrowserErrorCode.SHOPNOTEXIST);
}
try {
if (shops.size() == 1) {
// 5. 删除除当前用户外的所有 usershop 信息
try {
userShopRepository.deleteByShopIdExceptOwner(shops.get(0).getShopId(), shops.get(0).getOwner());
for (Account account1 : accounts) {
// todo 这个地方有点多余
UserShop userShop1 = userShopRepository.findByUsernameAndShopId(account1.getName(), shops.get(0).getShopId());
if (userShop1 != null) {
if (userShop1 != null)
continue;
}
// 6. 封装 目标账户的 usershop信息并保存
userShop1 = new UserShop(account1.getName(), shops.get(0).getShopId(), "-1");
userShopRepository.save(userShop1);
}
} catch (Exception e) {
logger.error("fail to assign", e.getMessage());
throw new ClientRequestException(BrowserErrorCode.UNKNOWN);
}
} else {
shops.forEach(
shop -> {
shops.forEach(shop -> {
try {
for (Account account1 : accounts) {
UserShop userShop1 = userShopRepository.findByUsernameAndShopId(account1.getName(), shop.getShopId());
if (userShop1 != null) {
return;
}
if (userShop1 != null)
continue;
userShop1 = new UserShop(account1.getName(), shop.getShopId(), "-1");
userShopRepository.save(userShop1);
}
}
);
}
} catch (Exception e) {
logger.error("fail to assign", e);
logger.error("fail to assign", e.getMessage());
throw new ClientRequestException(BrowserErrorCode.UNKNOWN);
}
});
}
}
@Override
public ShopResultDto queryShop(String username, String shopId) {
// 1. 校验 账户、商铺、IP资源、usershop 信息
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
Shop shop = shopRepository.findById(shopId).orElseThrow(() -> new ClientRequestException(BrowserErrorCode.SHOPNOTEXIST));
IpResource ipResource = ipResourceRepository.findFirstByShopIdsIsAndIsDeleted(shopId, false);
if (ipResource == null) {
throw new ClientRequestException(BrowserErrorCode.IPNOTEXIST);
}
UserShop userShop = userShopRepository.findByUsernameAndShopId(username, shopId);
if (userShop == null) {
throw new ClientRequestException(AccountErrorCode.NOPERMISSION);
}
// 2. 封装 ip 资源信息
IpResourceDto ipResourceDto = null;
Shop shop = shopRepository.findById(shopId).orElse(null);
if (shop == null) {
throw new ClientRequestException(BrowserErrorCode.SHOPNOTEXIST);
}
IpResource ipResource = ipResourceRepository.findFirstByShopIdsIsAndIsDeleted(shopId, false);
if (ipResource == null)
throw new ClientRequestException(BrowserErrorCode.IPNOTEXIST);
String group = userShopRepository.findByUsernameAndShopId(username, shop.getShopId()).getGroupId();
ShopResultDto shopResultDto = null;
if (ipResource.isSpecialLine()) {
SpecialLine specialLine = specialLineRepository.findAll().get(0);
ipResourceDto = new IpResourceDto(ipResource, null, false, specialLine);
} else {
ipResourceDto = new IpResourceDto(ipResource, null, false);
}
// 3. 封装 ShopResultDto 信息并返回
return ShopResultDto.of(shop, userShop.getGroupId(), ipResourceDto);
shopResultDto = ShopResultDto.of(shop, group, new IpResourceDto(ipResource, null, false, specialLine));
} else
shopResultDto = ShopResultDto.of(shop, group, new IpResourceDto(ipResource, null, false));
return shopResultDto;
}
@Override
public ShopPageResultDto getShopList(String username, String groupId, int pageNum, int amount, ShopFilterDto shopFilterDto) {
// 1. 校验当前登录用户的账户是否存在
// 当前登录用户的账户是否存在
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
// 2. 如有有分组校验当前查询的分组信息是否正确
// 当前查询的分组信息是否正确
Group group = null;
if (groupId != null) {
group = groupRepository.findById(groupId).orElseThrow(() -> new ClientRequestException(BrowserErrorCode.GROUPNOTEXIST));
if (group.getOwner() != null && !group.getOwner().equals(username)) {
throw new ClientRequestException(AccountErrorCode.NOPERMISSION);
}
}
// 3. 根据 groupId 与 username 来查询 shopIds (如果当前用户是父账户,则查询结果包含子账户的shopId)
// 根据 groupId 与 username 来查询 shopIds (如果当前用户是父账户,则查询结果包含子账户的shopId)
List<String> allIds = null;
if ("-1".equals(groupId)) {
allIds = userShopRepository.findByUsername(username).stream()
......@@ -403,7 +379,6 @@ public class ShopServiceImpl implements ShopService {
.map(UserShop::getShopId).collect(Collectors.toList());
}
// 4. 根据传入的过滤条件得到 shopIds
List<String> shopIds = new ArrayList<>();
if (shopFilterDto.getBindIp() == 0) {
shopIds = allIds;
......@@ -418,8 +393,8 @@ public class ShopServiceImpl implements ShopService {
} else {
// 店铺绑定的 ip 资源被删除的 店铺
for (String id : allIds) {
IpResource ipResource = ipResourceRepository.findFirstByShopIdsIsAndIsDeleted(id, true);
if (ipResource != null) {
IpResource ipResource = ipResourceRepository.findFirstByShopIdsIsAndIsDeleted(id, false);
if (ipResource == null) {
shopIds.add(id);
}
}
......@@ -427,15 +402,13 @@ public class ShopServiceImpl implements ShopService {
amount = Math.min(amount, 100);
Pageable pageable = PageRequest.of(pageNum, amount);
// 5. 根据过滤后的商铺ids 与 其他过滤条件 得到商铺信息并分页
// 根据商铺ids 与 过滤条件 得到商铺
Page<Shop> shops = getShopsByFilter(shopFilterDto, shopIds, pageable);
// 6. 封装 shopResultDtos 信息并返回
ShopPageResultDto<ShopResultDto> shopPageResultDto = new ShopPageResultDto<>();
if (shops != null && shops.getNumberOfElements() >= 1) {
List<ShopResultDto> shopResultDtos = new ArrayList<>();
shops.getContent().forEach(
// 设置ip资源状态 并 封装 shopResultDto信息
x -> {
IpResource ipResource = ipResourceRepository.findFirstByShopIdsIsAndIsDeleted(x.getShopId(), false);
// 如果 ip资源非空 且 addr 也非空
......@@ -473,7 +446,7 @@ public class ShopServiceImpl implements ShopService {
ipResource.setStatus(1);
ipResourceRepository.save(ipResource);
// 4. 其他,将ip资源状态设置为 未使用
// 4. 其他
} else {
if ((ipResource.getStatus() == 0 || ipResource.getStatus() == 1 || ipResource.getStatus() == 2) && ipResource.getVendor() != Vendor.local) {
ipResource.setStatus(0);
......@@ -503,7 +476,6 @@ public class ShopServiceImpl implements ShopService {
public ShopSummary getShopSummary(String username) {
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
ShopSummary shopSummary = new ShopSummary();
List<String> allShopIds = userShopRepository.findByUsername(username).stream()
.map(UserShop::getShopId).collect(Collectors.toList());
......@@ -533,25 +505,21 @@ public class ShopServiceImpl implements ShopService {
@Override
public List<String> getShopUsers(String username, String shopId) {
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account.getParent() != null) {
if (account == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST);
if (account.getParent() != null)
throw new ClientRequestException(AccountErrorCode.NOPERMISSION);
}
// 获取当前登录用户绑定了当前商铺的 所有子用户名
List<String> shopUsers = userShopRepository.findByShopId(shopId).stream()
.map(UserShop::getUsername)
.filter(x -> !x.equals(username))
.collect(Collectors.toList());
List<String> shopUsers = userShopRepository.findByShopId(shopId).stream().map(x -> x.getUsername()).filter(x -> !x.equals(username)).collect(Collectors.toList());
return shopUsers;
}
@Override
public List<String> getBatchShopUsers(String username, List<String> shopIds) {
Account account = accountRepository.findByName(username).orElseThrow(() -> new ClientRequestException(AccountErrorCode.NAMENOTEXIST));
if (account.getParent() != null) {
if (account == null)
throw new ClientRequestException(AccountErrorCode.NAMENOTEXIST);
if (account.getParent() != null)
throw new ClientRequestException(AccountErrorCode.NOPERMISSION);
}
List<String> shopUsers = new ArrayList<>();
if (shopIds != null && shopIds.size() > 0) {
String maxShopId = null;
......@@ -563,83 +531,20 @@ public class ShopServiceImpl implements ShopService {
maxShopId = shopId;
}
}
if (maxShopId == null) {
return shopUsers;
}
List<String> users = userShopRepository.findByShopId(maxShopId).stream().map(UserShop::getUsername).filter(x -> !x.equals(username)).collect(Collectors.toList());
if (maxShopId == null)
return new ArrayList<>();
List<String> users = userShopRepository.findByShopId(maxShopId).stream().map(x -> x.getUsername()).filter(x -> !x.equals(username)).collect(Collectors.toList());
for (String user : users) {
int shopCount = userShopRepository.countByUsernameAndShopIdIn(user, shopIds);
if (shopCount < shopIds.size()) {
if (shopCount < shopIds.size())
continue;
} else {
else
shopUsers.add(user);
}
}
}
return shopUsers;
}
@Override
public Integer dealDirtyData() {
List<Account> all = accountRepository.findAll();
List<Account> parents = all.stream().filter(x -> StringUtils.isEmpty(x.getParent())).collect(Collectors.toList());
// 移除 父账户,剩下的都是子账户了
all.removeAll(parents);
// 父账户, 子账户列表
Map<Account, List<Account>> map = new HashMap<>();
for (Account account : parents) {
List<Account> list = new ArrayList<>();
for (Account child : all) {
if (child.getParent().equals(account.getName())) {
list.add(child);
}
}
if (list.size() != 0) {
map.put(account, list);
}
}
int result = 0;
for (Map.Entry<Account, List<Account>> entry : map.entrySet()) {
List<Account> children = entry.getValue();
// 查找子类所拥有的店铺
List<Shop> childrenShop = shopRepository.findByOwnerIn(children.stream().map(Account::getName).collect(Collectors.toList()));
if (childrenShop.size() == 0) {
continue;
}
List<String> ids = childrenShop.stream().map(Shop::getShopId).collect(Collectors.toList());
// 查出来 父账户已有的 usershop信息
List<UserShop> parentUserShops = userShopRepository.findByUsernameAndShopIdIn(entry.getKey().getName(), ids);
List<String> parentShopIds = parentUserShops.stream().map(UserShop::getShopId).collect(Collectors.toList());
// 剩下的就是 父账户的 usershop 缺失的信息
ids.removeAll(parentShopIds);
// 构建父账户缺失的 usershop 信息并保存
List<UserShop> userShops = new ArrayList<>();
for (String id : ids) {
UserShop userShop = new UserShop();
userShop.setShopId(id);
userShop.setUsername(entry.getKey().getName());
userShop.setGroupId("-1");
userShops.add(userShop);
}
if (userShops.size() != 0) {
// 将父账户缺失的 usershop 信息补充完整
List<UserShop> userShops1 = userShopRepository.saveAll(userShops);
result += userShops1.size();
}
}
return result;
}
private String getShopId(String username, ShopResultDto shopResultDto) {
Shop shop = new Shop();
......
package com.edgec.browserbackend.browser.service;
import com.edgec.browserbackend.browser.domain.Shop;
import com.edgec.browserbackend.browser.domain.ShopSummary;
import com.edgec.browserbackend.browser.dto.ShopFilterDto;
import com.edgec.browserbackend.browser.dto.ShopPageResultDto;
import com.edgec.browserbackend.browser.dto.ShopResultDto;
import com.edgec.browserbackend.browser.dto.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
......@@ -32,6 +31,4 @@ public interface ShopService {
List<String> getShopUsers(String username, String shopId);
List<String> getBatchShopUsers(String username, List<String> shopIds);
Integer dealDirtyData();
}
......@@ -101,15 +101,12 @@ public class BrowserTask {
}
/**
* 购买ip的定时任务,每分钟一次
*/
@Scheduled(cron = "0 0/1 * * * ?")
public void buyIpTasks() {
String URL = (profiles.equals("dev") || profiles.equals("staging")) ? TESTURL : CLOUDAMURL;
long time = Instant.now().minusSeconds(300).toEpochMilli();
List<IpResource> ipResources = ipResourceRepository.sampleTasks(6, time);
log.info("buyIpTasks sample {} tasks", ipResources.size());
log.error("buyIpTasks sample {} tasks", ipResources.size());
List<CompletableFuture> futureList = new ArrayList<>();
for (IpResource ipResource : ipResources) {
long start = System.currentTimeMillis();
......@@ -142,8 +139,8 @@ public class BrowserTask {
}
if (ipBuyResultDto != null && ipBuyResultDto.getIplist() != null && ipBuyResultDto.getIplist().size() >= 1) {
AtomicInteger index = new AtomicInteger();
ipBuyResultDto.getIplist().forEach(
x -> {
ipBuyResultDto.getIplist().forEach(x -> {
if (ipResource != null) {
ipResource.setAddr(x.getIp());
ipResource.setStatus(3);
ipResource.setValidTime(Instant.parse(x.getValidTill()).toEpochMilli());
......@@ -153,10 +150,11 @@ public class BrowserTask {
ipResource.setSpecialLine(true);
}
ipResourceRepository.save(ipResource);
index.getAndIncrement();
} else {
log.error("no ipResource");
}
);
index.getAndIncrement();
});
result = true;
}
} catch (Exception e) {
......
......@@ -32,34 +32,25 @@ public class PaymentTask {
long now = System.currentTimeMillis();
Date date_5min = new Date(now - 5 * 60 * 1000);
Date date_10min = new Date(now - 10 * 60 * 1000);
// 查找 5-10 分钟内 支付状态为 false 的订单
List<UserPayment> unfinishedPayments = userPaymentRepository.findAllByPaymentDateBetweenAndSucceed(
ZonedDateTime.ofInstant(date_10min.toInstant(), ZoneId.systemDefault()),
ZonedDateTime.ofInstant(date_5min.toInstant(), ZoneId.systemDefault()),
false);
ZonedDateTime.ofInstant(date_10min.toInstant(), ZoneId.systemDefault())
, ZonedDateTime.ofInstant(date_5min.toInstant(), ZoneId.systemDefault()), false);
if (unfinishedPayments != null && !unfinishedPayments.isEmpty()) {
unfinishedPayments.forEach(
payment -> {
if (unfinishedPayments != null && unfinishedPayments.size() > 0) {
unfinishedPayments.stream().forEach(payment -> {
PaymentMethod paymentMethod = payment.getPaymentMethod();
try {
/*
* 自动调用 微信或者支付宝的支付接口来确认 支付状态
* chargeType 取值范围为 0-4
* 此处设置为 100 仅仅只是为了避免 wxCheckOrderStatus() 方法中 chargeType == 0 相关代码块
*/
if (PaymentMethod.WECHAT.equals(paymentMethod)) {
paymentService.wxCheckOrderStatus(payment.getTradeNo(), 100);
}
if (PaymentMethod.ALIPAY.equals(paymentMethod)) {
paymentService.aliCheckOrderStatus(payment.getTradeNo(), 100);
paymentService.wxCheckOrderStatus(payment.getTradeNo());
} else if (PaymentMethod.ALIPAY.equals(paymentMethod)) {
paymentService.aliCheckOrderStatus(payment.getTradeNo());
}
} catch (Exception e) {
log.error("checkPayments", e);
}
}
);
});
}
}
}
......@@ -12,7 +12,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.Instant;
import java.time.YearMonth;
import java.time.ZoneOffset;
import java.util.Arrays;
import java.util.List;
......@@ -27,48 +29,35 @@ public class PromotionTask {
@Autowired
private UserPrePaidBillingRepository userPrePaidBillingRepository;
//临时修改为7月2号的11点执行执行一次
@SchedulerLock(name = "countGift", lockAtLeastForString = "PT1H", lockAtMostForString = "PT2H")
//@Scheduled(cron = "0 0 1 1 * ?")
@Scheduled(cron = "0 0 3 2 * ?")
@Scheduled(cron = "0 0 1 1 * ?")
public void countGift() {
log.info("Start scheduled task:Scheduled.countGift...");
List<Account> accounts = accountRepository.findByParentIsNull();
for (Account account : accounts) {
// 1. 获取当前账户的邀请码信息
String code = account.getPromotion().getCode();
// 2. 获取被当前账户邀请的所有账户
List<Account> promotes = accountRepository.findByPromotionCodeAndParentIsNull(code);
double totalCommission = 0;
double secondCommission = 0;
// 3. 计算所有被当前账户邀请的账户上个月的消费信息,以及如果当前账户是销售账户则还需要计算销售账户的下下级账户的上个月消费信息
for (Account promote : promotes) {
// 3.1 获取被邀请的用户上个月的消费信息,todo 感觉这个地方最好加上支付状态
List<UserPrePaidBilling> userPrePaidBillings = userPrePaidBillingRepository.findByAdministratorAndYearAndMonthAndPayMethodIn(
promote.getName(), YearMonth.now().minusMonths(1).getYear(), YearMonth.now().minusMonths(1).getMonthValue(), Arrays.asList(1, 2, 3)
);
// 3.2. 计算被邀请的用户上个月的总消费金额
List<UserPrePaidBilling> userPrePaidBillings = userPrePaidBillingRepository.findByAdministratorAndYearAndMonthAndPayMethodIn(promote.getName(),
YearMonth.now().minusMonths(1).getYear(),
YearMonth.now().minusMonths(1).getMonthValue(), Arrays.asList(1,2,3));
totalCommission += userPrePaidBillings.stream().mapToDouble(UserPrePaidBilling::getTotal).sum();
// 3.3. 如果当前账户是本公司销售,则计算下下级用户(例如:销售人员A 邀请了 用户B,用户B 邀请了 其他用户,其他用户就是A的下下级用户)上个月总消费金额
if (account.getPromotion().isSale() && promote.getParent() == null) {
// 获取下下级账户
List<Account> secondPromotes = accountRepository.findByPromotionCodeAndParentIsNull(promote.getPromotion().getCode());
if (secondPromotes != null && !secondPromotes.isEmpty()) {
if (secondPromotes != null && secondPromotes.size() > 0) {
for (Account secondPromote : secondPromotes) {
List<UserPrePaidBilling> userPrePaidBillings1 = userPrePaidBillingRepository.findByAdministratorAndYearAndMonthAndPayMethodIn(
secondPromote.getName(), YearMonth.now().minusMonths(1).getYear(), YearMonth.now().minusMonths(1).getMonthValue(), Arrays.asList(1, 2, 3)
);
List<UserPrePaidBilling> userPrePaidBillings1 = userPrePaidBillingRepository.findByAdministratorAndYearAndMonthAndPayMethodIn(secondPromote.getName(),
YearMonth.now().minusMonths(1).getYear(),
YearMonth.now().minusMonths(1).getMonthValue(), Arrays.asList(1,2,3));
secondCommission += userPrePaidBillings1.stream().mapToDouble(UserPrePaidBilling::getTotal).sum();
}
}
}
}
// 4. 封装当前账户的返佣相关信息(总消费、上月消费、上月礼金、总共未提现礼金)并保存
Promotion promotion = account.getPromotion();
promotion.setTotalCommission((int) (promotion.getTotalCommission() + totalCommission));
promotion.setCommissionLastMonth((int) totalCommission);
promotion.setTotalCommission((int)(promotion.getTotalCommission() + totalCommission));
promotion.setCommissionLastMonth((int)totalCommission);
promotion.setGift(totalCommission * 0.08);
if (account.getPromotion().isSale()) {
promotion.setGift(totalCommission * 0.1 + secondCommission * 0.02);
......@@ -76,52 +65,41 @@ public class PromotionTask {
promotion.setAllGift(promotion.getAllGift() + promotion.getGift());
accountRepository.save(account);
}
log.info("End scheduled task:Scheduled.countGift...");
}
//临时修改为7月2号的12点执行执行一次
@SchedulerLock(name = "countCommission", lockAtLeastForString = "PT1H", lockAtMostForString = "PT2H")
//@Scheduled(cron = "0 0 1 * * ?")
@Scheduled(cron = "0 0 4 2 * ?")
@Scheduled(cron = "0 0 1 * * ?")
public void countCommission() {
log.info("Start scheduled task:Scheduled.countCommission...");
List<Account> accounts = accountRepository.findByParentIsNull();
for (Account account : accounts) {
// 1. 获取被当前账户邀请的所有账户
String code = account.getPromotion().getCode();
List<Account> promotes = accountRepository.findByPromotionCodeAndParentIsNull(code);
double totalCommission = 0;
double secondCommission = 0;
// 2. 计算所有被当前账户邀请的账户当月当前的消费信息,以及如果当前账户是销售账户则还需要计算销售账户的下下级账户的当月当前消费信息
for (Account promote : promotes) {
List<UserPrePaidBilling> userPrePaidBillings = userPrePaidBillingRepository.findByAdministratorAndYearAndMonthAndPayMethodIn(
promote.getName(), YearMonth.now().getYear(), YearMonth.now().getMonthValue(), Arrays.asList(1, 2, 3)
);
List<UserPrePaidBilling> userPrePaidBillings = userPrePaidBillingRepository.findByAdministratorAndYearAndMonthAndPayMethodIn(promote.getName(),
YearMonth.now().getYear(),
YearMonth.now().getMonthValue(), Arrays.asList(1,2,3));
totalCommission += userPrePaidBillings.stream().mapToDouble(UserPrePaidBilling::getTotal).sum();
if (account.getPromotion().isSale() && promote.getParent() == null) {
List<Account> secondPromotes = accountRepository.findByPromotionCodeAndParentIsNull(promote.getPromotion().getCode());
if (secondPromotes != null && secondPromotes.size() > 0) {
for (Account secondPromote : secondPromotes) {
List<UserPrePaidBilling> userPrePaidBillings1 = userPrePaidBillingRepository.findByAdministratorAndYearAndMonthAndPayMethodIn(
secondPromote.getName(), YearMonth.now().getYear(), YearMonth.now().getMonthValue(), Arrays.asList(1, 2, 3)
);
List<UserPrePaidBilling> userPrePaidBillings1 = userPrePaidBillingRepository.findByAdministratorAndYearAndMonthAndPayMethodIn(secondPromote.getName(),
YearMonth.now().getYear(),
YearMonth.now().getMonthValue(), Arrays.asList(1,2,3));
secondCommission += userPrePaidBillings1.stream().mapToDouble(UserPrePaidBilling::getTotal).sum();
}
}
}
}
// 3. 封装当前账户的返佣相关信息(当月当前的消费、当月当前的返佣)并保存
Promotion promotion = account.getPromotion();
promotion.setCommission((int) totalCommission);
promotion.setCommission((int)totalCommission);
promotion.setGift(totalCommission * 0.08);
if (account.getPromotion().isSale()) {
promotion.setGift(totalCommission * 0.1 + secondCommission * 0.02);
}
accountRepository.save(account);
}
log.info("End scheduled task:Scheduled.countCommission...");
}
}
......@@ -56,8 +56,8 @@ public class Trans {
* @param args
*/
public static void main(String[] args) {
String url = "https://china-merchant.wish.com/login";
Trans trans = new Trans("8.210.96.188", "WC5w4M5jkdz1aA1");
String url = "http://free.ipwhois.io/json/";
Trans trans = new Trans("112.74.47.217", 20001, "fangguanlianbrowser", "5D753F36QKqIaA1");
String rs = trans.get(url);
System.out.println(rs);
}
......
......@@ -18,12 +18,10 @@ public class FGLWxConfig extends WXPayConfig {
return "acdkgjef237ckgSriEICRe2408sdjEDC";
}
@Override
public int getHttpConnectTimeoutMs() {
return 8000;
}
@Override
public int getHttpReadTimeoutMs() {
return 10000;
}
......@@ -37,12 +35,10 @@ public class FGLWxConfig extends WXPayConfig {
public IWXPayDomain getWXPayDomain() {
IWXPayDomain iwxPayDomain = new IWXPayDomain() {
@Override
public void report(String domain, long elapsedTimeMillis, Exception ex) {
}
@Override
public DomainInfo getDomain(WXPayConfig config) {
return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true);
}
......
package com.edgec.browserbackend;
import com.edgec.browserbackend.account.domain.Account;
import com.edgec.browserbackend.account.repository.AccountRepository;
import com.edgec.browserbackend.account.repository.UserPaymentRepository;
import com.edgec.browserbackend.account.repository.UserPrePaidBillingRepository;
import com.edgec.browserbackend.browser.repository.IpOptionsRepository;
import com.edgec.browserbackend.browser.repository.IpResourceRepository;
import com.edgec.browserbackend.browser.repository.ShopRepository;
import com.edgec.browserbackend.browser.repository.UserShopRepository;
import com.edgec.browserbackend.browser.service.IpResourceService;
import com.edgec.browserbackend.browser.service.ShopService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
@SpringBootTest
class BrowserBackendApplicationTests {
@Autowired
ShopService shopService;
@Autowired
MongoTemplate mongoTemplate;
@Autowired
private UserShopRepository userShopRepository;
@Autowired
IpResourceRepository ipResourceRepository;
@Autowired
ShopRepository shopRepository;
@Autowired
AccountRepository accountRepository;
@Autowired
IpOptionsRepository ipOptionsRepository;
@Autowired
IpResourceService ipResourceService;
@Autowired
UserPaymentRepository userPaymentRepository;
@Autowired
UserPrePaidBillingRepository userPrePaidBillingRepository;
@Test
void contextLoads() {
}
@Test
public void testShopList() throws Exception {
/*List<Account> all = accountRepository.findAll();
List<Account> parents = all.stream().filter(x -> StringUtils.isEmpty(x.getParent())).collect(Collectors.toList());
// 移除 父账户,剩下的都是子账户了
all.removeAll(parents);
// 父账户, 子账户列表
Map<Account, List<Account>> map = new HashMap<>();
for (Account account : parents) {
List<Account> list = new ArrayList<>();
for (Account child : all) {
if (child.getParent().equals(account.getName())) {
list.add(child);
}
}
if (list.size() != 0) {
map.put(account, list);
}
}
Iterator<Map.Entry<Account, List<Account>>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Account, List<Account>> entry = entries.next();
List<Account> children = entry.getValue();
// 查找子类所拥有的店铺
List<Shop> childrenShop = shopRepository.findByOwnerIn(children.stream().map(Account::getName).collect(Collectors.toList()));
if (childrenShop.size() == 0) {
continue;
}
List<String> ids = childrenShop.stream().map(x -> x.getShopId()).collect(Collectors.toList());
// 查出来 父账户已有的 usershop信息
List<UserShop> parentUserShops = userShopRepository.findByUsernameAndShopIdIn(entry.getKey().getName(), ids);
List<String> parentShopIds = parentUserShops.stream().map(x -> x.getShopId()).collect(Collectors.toList());
// 剩下的就是 父账户的 usershop 缺失的信息
ids.removeAll(parentShopIds);
List<UserShop> userShops = new ArrayList<>();
for (String id : ids) {
UserShop userShop = new UserShop();
userShop.setShopId(id);
userShop.setUsername(entry.getKey().getName());
userShop.setGroupId("-1");
userShops.add(userShop);
}
if (userShops.size() != 0) {
// 将父账户缺失的 usershop 信息补充完整
List<UserShop> userShops1 = userShopRepository.saveAll(userShops);
}
}
//shopService.getShopUsers("18622987110", "5e82dbd407f16f1c782b9f1e");
/*IpResource ipResource = ipResourceRepository.findFirstByShopIdsIsAndIsDeleted("5e82e3d407f16f1c782b9f26", false);
IpResourceDto ipResourceDto = new IpResourceDto(ipResource, null, false);
IpResourceDto ipResourceDto1 = new IpResourceDto(ipResource, null, false, null);
System.out.println(ipResourceDto.equals(ipResourceDto1));
Map<String, List<String>> priceList = ipOptionsRepository.findAll().get(0).getIpPlatForm();
System.out.println(priceList);
String json = "{\"addr\":[\"8.210.63.174\"],\"ipId\":[],\"period\":1,\"unit\":\"month\",\"payMethod\":0}";
IpResourceRequestDto ipResourceRequestDto = JSON.parseObject(json, IpResourceRequestDto.class);
String username = "15919921106";
try {
ipResourceService.renewIp(username, ipResourceRequestDto);
} catch (Exception e) {
e.printStackTrace();
}
UserPayment byTradeNo = userPaymentRepository.findByTradeNo("202003141459128356");
if (byTradeNo.getPaymentMethod().equals(PaymentMethod.ALIPAY)) {
System.out.println("hhhh");
}
if (byTradeNo.getPaymentMethod().equals(PaymentMethod.WECHAT)) {
System.out.println("wwww");
}
// 输入json 字符串的快捷方式 alt + enter、alt+enter
String json = "{\"region\":\"us\",\"regionCn\":\"美国随机\",\"vendor\":\"aliyun\",\"period\":1,\"unit\":\"week\",\"amount\":2,\"price\":24,\"payMethod\":0}";
IpResourceRequestDto ipResourceRequestDto = JSON.parseObject(json, IpResourceRequestDto.class);
String username = "15919921106";
List<String> ipResourceDto = ipResourceService.buyIp(username, ipResourceRequestDto);
System.out.println(ipResourceDto);
Optional<Shop> shop = shopRepository.findById("5efbfec70718e43054d65168");
String shopCookie = shop.get().getShopCookie();
List<Account> accounts = accountRepository.findByParentIsNull();
for (Account account : accounts) {
if (account.getName().equals("17665464606")) {
// 1. 获取当前账户的邀请码信息
String code = account.getPromotion().getCode();
// 2. 获取被当前账户邀请的所有账户
List<Account> promotes = accountRepository.findByPromotionCodeAndParentIsNull(code);
double totalCommission = 0;
double secondCommission = 0;
// 3. 计算所有被当前账户邀请的账户上个月的消费信息,以及如果当前账户是销售账户则还需要计算销售账户的下下级账户的上个月消费信息
for (Account promote : promotes) {
// 3.1 获取被邀请的用户上个月的消费信息,todo 感觉这个地方最好加上支付状态
List<UserPrePaidBilling> userPrePaidBillings = userPrePaidBillingRepository.findByAdministratorAndYearAndMonthAndPayMethodIn(
promote.getName(), YearMonth.now().minusMonths(1).getYear(), YearMonth.now().minusMonths(1).getMonthValue(), Arrays.asList(1, 2, 3)
);
// 3.2. 计算被邀请的用户上个月的总消费金额
totalCommission += userPrePaidBillings.stream().mapToDouble(UserPrePaidBilling::getTotal).sum();
// 3.3. 如果当前账户是本公司销售,则计算下下级用户(例如:销售人员A 邀请了 用户B,用户B 邀请了 其他用户,其他用户就是A的下下级用户)上个月总消费金额
if (account.getPromotion().isSale() && promote.getParent() == null) {
// 获取下下级账户
List<Account> secondPromotes = accountRepository.findByPromotionCodeAndParentIsNull(promote.getPromotion().getCode());
if (secondPromotes != null && !secondPromotes.isEmpty()) {
for (Account secondPromote : secondPromotes) {
List<UserPrePaidBilling> userPrePaidBillings1 = userPrePaidBillingRepository.findByAdministratorAndYearAndMonthAndPayMethodIn(
secondPromote.getName(), YearMonth.now().minusMonths(1).getYear(), YearMonth.now().minusMonths(1).getMonthValue(), Arrays.asList(1, 2, 3)
);
secondCommission += userPrePaidBillings1.stream().mapToDouble(UserPrePaidBilling::getTotal).sum();
}
}
}
}
// 4. 封装当前账户的返佣相关信息(总消费、上月消费、当月礼金、总共未体现礼金)并保存
Promotion promotion = account.getPromotion();
promotion.setTotalCommission((int) (promotion.getTotalCommission() + totalCommission));
promotion.setCommissionLastMonth((int) totalCommission);
promotion.setGift(totalCommission * 0.08);
if (account.getPromotion().isSale()) {
promotion.setGift(totalCommission * 0.1 + secondCommission * 0.02);
}
promotion.setAllGift(promotion.getAllGift() + promotion.getGift());
System.out.println(111);
}
}*/
Account account = new Account();
account.setName("110110110");
account.setPhoneNumber("110110110");
accountRepository.save(account);
Account byName = accountRepository.findByName("110110110").get();
byName.setParent("110");
accountRepository.save(byName);
}
}
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