package com.izouma.nineth.service;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.huifu.adapay.core.exception.BaseAdaPayException;
import com.huifu.adapay.model.Payment;
import com.izouma.nineth.ApplicationTests;
import com.izouma.nineth.TokenHistory;
import com.izouma.nineth.domain.*;
import com.izouma.nineth.domain.Collection;
import com.izouma.nineth.dto.UserBankCard;
import com.izouma.nineth.enums.AssetStatus;
import com.izouma.nineth.enums.AuthStatus;
import com.izouma.nineth.enums.OrderStatus;
import com.izouma.nineth.exception.BusinessException;
import com.izouma.nineth.repo.*;
import com.izouma.nineth.utils.FileUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.EncoderException;
import org.apache.commons.collections.MapUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
@Slf4j
public class OrderServiceTest extends ApplicationTests {
@Autowired
private OrderService orderService;
@Autowired
private OrderRepo orderRepo;
@Autowired
private AssetRepo assetRepo;
@Autowired
private TokenHistoryRepo tokenHistoryRepo;
@Autowired
private AssetService assetService;
@Autowired
private CollectionRepo collectionRepo;
@Autowired
private UserRepo userRepo;
@Autowired
private IdentityAuthRepo identityAuthRepo;
@Autowired
private UserBankCardRepo userBankCardRepo;
@Autowired
private CollectionService collectionService;
@Test
public void create() throws EncoderException, WxPayException {
Order order = orderService.create(1110L, 1777L, 1, null, 1896L, null);
assert order.getStatus() == OrderStatus.FINISH;
}
@Test
public void setNumber() {
orderService.setNumber();
}
@Test
public void setSales() {
orderService.setSales();
}
@Test
public void commission() {
orderService.commission(orderRepo.findById(4437L).get());
}
@Test
public void refund() throws WxPayException {
orderService.refund(4627L);
}
@Test
public void cancel() {
orderService.cancel(6721L);
}
@Test
public void fixNotPaid() throws BaseAdaPayException {
List errOrders = new ArrayList<>();
orderRepo.findByStatus(OrderStatus.FINISH).stream().parallel().forEach(order -> {
if (order.getCreatedAt().isAfter(LocalDateTime.of(2021, 11, 30, 1, 1))) {
try {
Map res = Payment.query(order.getTransactionId());
String status = MapUtils.getString(res, "status");
String errMsg = MapUtils.getString(res, "error_msg");
if (!"succeeded".equals(status) && !"对应支付记录不存在".equals(errMsg)) {
System.out.println(order.getId());
errOrders.add(order);
}
} catch (Exception e) {
}
}
});
System.out.println(errOrders.stream().map(o -> o.getId().toString()).collect(Collectors.joining(",")));
for (Order errOrder : errOrders) {
Collection collection = collectionRepo.findById(errOrder.getCollectionId()).orElse(null);
if (collection == null) continue;
List assets = assetRepo.findByOrderId(errOrder.getId());
for (Asset asset : assets) {
if (asset.getStatus() == AssetStatus.NORMAL) {
if (asset.isPublicShow()) {
assetService.cancelPublic(asset);
}
tokenHistoryRepo.deleteByTokenId(asset.getTokenId());
assetRepo.delete(asset);
}
}
orderRepo.delete(errOrder);
collectionRepo.increaseStock(collection.getId(), 1);
collectionRepo.increaseSale(collection.getId(), -1);
}
}
@Test
public void fixTokenHistory() {
for (TokenHistory tokenHistory : tokenHistoryRepo.findError()) {
List assets = assetRepo.findByTokenIdOrderByCreatedAt(tokenHistory.getTokenId());
if (assets.size() == 2) {
userRepo.findById(assets.get(0).getUserId()).ifPresent(fromUser -> {
tokenHistory.setFromUserId(assets.get(0).getUserId());
tokenHistory.setFromUser(fromUser.getNickname());
tokenHistory.setFromAvatar(fromUser.getAvatar());
tokenHistoryRepo.save(tokenHistory);
});
}
}
}
@Test
public void fixPay() {
String s = "\n订单ID\t金额\t手续费\t版税\t收款用户ID\t收款人\t银行卡号\t银行";
for (Long orderId : new Long[]{5417L, 5919L, 5923L, 8166L}) {
try {
Order order = orderRepo.findById(orderId).get();
List assets = assetRepo.findByTokenIdOrderByCreatedAt(assetRepo.findById(order.getAssetId())
.get()
.getTokenId());
Asset asset = assets.stream().filter(a -> a.getStatus() == AssetStatus.TRANSFERRED).findAny().get();
User user = userRepo.findById(asset.getUserId()).get();
Optional identityAuth = identityAuthRepo.findByUserIdAndDelFalse(user.getId()).stream()
.filter(i -> i.getStatus() == AuthStatus.SUCCESS).findAny();
Optional bankCard = userBankCardRepo.findByUserId(user.getId()).stream().findAny();
s += "\n"
+ orderId + "\t"
+ order.getTotalPrice().subtract(order.getGasPrice()) + "\t"
+ order.getServiceCharge() + "\t"
+ order.getRoyalties() + "\t"
+ user.getId() + "\t"
+ identityAuth.map(IdentityAuth::getRealName).orElse("") + "\t"
+ bankCard.map(UserBankCard::getBankNo).orElse("") + "\t"
+ bankCard.map(UserBankCard::getBankName).orElse("");
} catch (Exception e) {
}
}
log.info(s);
}
@Test
public void consignmentFix() throws IOException {
String s = FileUtils.readFile("/Users/drew/Downloads/app.log").replaceAll("
\n", "");
String[] arr = s.split("\n");
for (int i = 0; i < arr.length; i++) {
if (arr[i].contains("insert into collection_info")) {
// arr[i][2]
}
}
}
@Test
public void mint() {
for (Order order : orderRepo.findByStatus(OrderStatus.PROCESSING)) {
if (order.getPayTime().isBefore(LocalDateTime.of(2021, 12, 18, 15, 8))) {
try {
Collection collection = collectionRepo.findById(order.getCollectionId())
.orElseThrow(new BusinessException("无记录"));
User user = userRepo.findById(order.getUserId()).orElseThrow(new BusinessException("无记录"));
Future f = assetService.createAsset(collection, user, order.getId(), order.getPrice(), "出售",
collectionService.getNextNumber(order.getCollectionId()));
while (true) {
if (f.isDone()) {
break;
}
Thread.sleep(300);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
@Test
public void removeDuplicate() {
List ids = new ArrayList<>();
orderRepo.findByCollectionId(8012L).stream()
.filter(o -> o.getStatus() == OrderStatus.FINISH || o.getStatus() == OrderStatus.PROCESSING)
.parallel().forEach(order -> {
List assets = assetRepo.findByOrderId(order.getId());
if (assets.size() > 1) {
assets.sort(Comparator.comparing(BaseEntity::getCreatedAt));
for (int i = 1; i < assets.size(); i++) {
assetRepo.delete(assets.get(i));
tokenHistoryRepo.deleteByTokenId(assets.get(i).getTokenId());
if (assets.get(i).getPublicCollectionId() != null) {
collectionRepo.findById(assets.get(i).getPublicCollectionId()).ifPresent(c -> {
collectionRepo.delete(c);
});
}
}
ids.add(order.getId());
}
});
System.out.println(ids);
}
@Test
public void setNumber1() {
final int[] number = {1};
orderRepo.findByCollectionId(8012L).stream()
.filter(o -> o.getStatus() == OrderStatus.FINISH || o.getStatus() == OrderStatus.PROCESSING)
.sorted(Comparator.comparing(Order::getCreatedAt))
.forEach(order -> {
Asset asset = assetRepo.findByOrderId(order.getId()).get(0);
asset.setNumber(number[0]);
assetRepo.save(asset);
if (asset.getPublicCollectionId() != null) {
collectionRepo.findById(asset.getPublicCollectionId()).ifPresent(c -> {
c.setNumber(asset.getNumber());
collectionRepo.save(c);
});
}
number[0]++;
});
assetRepo.findByCollectionId(8012L).stream().parallel().forEach(asset -> {
});
}
}