Преглед изворни кода

Merge branch 'dev' into 特权藏品

# Conflicts:
#	src/main/java/com/izouma/nineth/web/UserController.java
licailing пре 4 година
родитељ
комит
ee41efb6e3

+ 18 - 0
src/main/java/com/izouma/nineth/dto/MarketSettlement.java

@@ -0,0 +1,18 @@
+package com.izouma.nineth.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+public class MarketSettlement {
+    private Long userId;
+
+    private String name;
+
+    private String bankNo;
+
+    private BigDecimal amount;
+}

+ 2 - 0
src/main/java/com/izouma/nineth/repo/IdentityAuthRepo.java

@@ -45,4 +45,6 @@ public interface IdentityAuthRepo extends JpaRepository<IdentityAuth, Long>, Jpa
     @Modifying
     @Transactional
     int deleteDuplicated(Long userId, Long id);
+
+    List<IdentityAuth> findByUserIdInAndStatus(Iterable<Long> userId, AuthStatus status);
 }

+ 3 - 0
src/main/java/com/izouma/nineth/repo/OrderRepo.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.repo;
 
 import com.izouma.nineth.domain.Order;
+import com.izouma.nineth.enums.CollectionSource;
 import com.izouma.nineth.enums.OrderStatus;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -52,4 +53,6 @@ public interface OrderRepo extends JpaRepository<Order, Long>, JpaSpecificationE
             "where (status = 'FINISH' or status = 'PROCESSING') " +
             "group by user_id order by sum(price) desc limit 50")
     List<Object[]> sumPrice();
+
+    List<Order> findByCreatedAtBetweenAndSourceAndStatusIn(LocalDateTime start, LocalDateTime end, CollectionSource source, Collection<OrderStatus> statuses);
 }

+ 2 - 0
src/main/java/com/izouma/nineth/repo/UserBankCardRepo.java

@@ -11,6 +11,8 @@ import java.util.List;
 public interface UserBankCardRepo extends JpaRepository<UserBankCard, Long>, JpaSpecificationExecutor<UserBankCard> {
     List<UserBankCard> findByUserId(Long userId);
 
+    List<UserBankCard> findByUserIdIn(Iterable<Long> userId);
+
     @Transactional
     @Modifying
     int deleteByUserId(Long userId);

+ 40 - 0
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -1,5 +1,6 @@
 package com.izouma.nineth.service;
 
+import com.alibaba.excel.EasyExcel;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.serializer.SerializerFeature;
@@ -20,7 +21,9 @@ import com.huifu.adapay.model.Refund;
 import com.izouma.nineth.config.*;
 import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.*;
+import com.izouma.nineth.dto.MarketSettlement;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.UserBankCard;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.event.CreateAssetEvent;
 import com.izouma.nineth.event.CreateOrderEvent;
@@ -34,6 +37,7 @@ import com.izouma.nineth.utils.AESEncryptUtil;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.SecurityUtils;
 import com.izouma.nineth.utils.SnowflakeIdWorker;
+import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.EncoderException;
@@ -54,6 +58,7 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.ui.Model;
 
+import java.io.File;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.Duration;
@@ -63,6 +68,7 @@ import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 @Service
 @AllArgsConstructor
@@ -94,6 +100,8 @@ public class OrderService {
     private ShowCollectionRepo            showCollectionRepo;
     private ShowroomService               showroomService;
     private CollectionPrivilegeRepo       collectionPrivilegeRepo;
+    private UserBankCardRepo              userBankCardRepo;
+    private IdentityAuthRepo              identityAuthRepo;
 
     public Page<Order> all(PageQuery pageQuery) {
         return orderRepo.findAll(JpaUtils.toSpecification(pageQuery, Order.class), JpaUtils.toPageRequest(pageQuery));
@@ -912,4 +920,36 @@ public class OrderService {
     public void releaseOrderLock(Long orderId) {
         redisTemplate.delete(RedisKeys.ORDER_LOCK + orderId);
     }
+
+    public void calcSettle(LocalDateTime start, LocalDateTime end) {
+        List<Order> orders = orderRepo.findByCreatedAtBetweenAndSourceAndStatusIn(start, end, CollectionSource.TRANSFER, Arrays.asList(OrderStatus.PROCESSING, OrderStatus.FINISH));
+        List<Asset> assets = assetRepo.findAllById(orders.stream().map(Order::getAssetId).collect(Collectors.toSet()));
+        List<UserBankCard> bankCards = userBankCardRepo.findByUserIdIn(assets.stream().map(Asset::getUserId).collect(Collectors.toSet()));
+        List<MarketSettlement> settlements = new ArrayList<>();
+        for (Order order : orders) {
+            BigDecimal amount = order.getTotalPrice()
+                    .subtract(order.getGasPrice())
+                    .multiply(new BigDecimal("100")
+                            .subtract(BigDecimal.valueOf(order.getServiceCharge()))
+                            .subtract(BigDecimal.valueOf(order.getRoyalties()))
+                            .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP))
+                    .setScale(2, RoundingMode.HALF_UP);
+            Long userId = assets.stream().filter(a -> a.getId().equals(order.getAssetId())).map(Asset::getUserId).findAny().orElse(null);
+            if (userId != null) {
+                UserBankCard userBankCard = bankCards.stream().filter(b -> b.getUserId().equals(userId)).findAny().orElse(null);
+                MarketSettlement marketSettlement = settlements.stream().filter(s -> s.getUserId().equals(userId)).findAny().orElse(null);
+                if (marketSettlement == null) {
+                    marketSettlement = new MarketSettlement(userId,
+                            Optional.ofNullable(userBankCard).map(UserBankCard::getRealName).orElse(null),
+                            Optional.ofNullable(userBankCard).map(UserBankCard::getBankNo).orElse(null),
+                            amount);
+                    settlements.add(marketSettlement);
+                } else {
+                    marketSettlement.setAmount(marketSettlement.getAmount()
+                            .add(amount));
+                }
+            }
+        }
+        EasyExcel.write(new File("/Users/drew/Downloads/结算.xlsx"), MarketSettlement.class).sheet("sheet").doWrite(settlements);
+    }
 }

+ 1 - 1
src/main/java/com/izouma/nineth/web/UserController.java

@@ -88,7 +88,7 @@ public class UserController extends BaseController {
     }
 
     @PostMapping("/minterList")
-    public Page<Minter> getMinter(@RequestBody PageQuery pageQuery) {
+    public Page<Minter> toMinter(@RequestBody PageQuery pageQuery) {
         pageQuery.getQuery().put("minter", true);
         return userService.toMinterDTO(userService.all(pageQuery).toPage());
     }

+ 6 - 0
src/test/java/com/izouma/nineth/service/OrderServiceTest.java

@@ -257,4 +257,10 @@ public class OrderServiceTest extends ApplicationTests {
         System.out.println(orderRepo.countByUserIdAndCollectionIdAndVipTrueAndStatusIn(9850L, 196308L,
                 Arrays.asList(OrderStatus.FINISH, OrderStatus.NOT_PAID, OrderStatus.PROCESSING)));
     }
+
+    @Test
+    public void calcSettle() {
+        orderService.calcSettle(LocalDateTime.of(2022, 4, 4, 0, 0, 0),
+                LocalDateTime.of(2022, 4, 5, 23, 59, 59, 99999));
+    }
 }