licailing il y a 5 ans
Parent
commit
0c6b1b59ee

+ 25 - 0
src/main/java/com/izouma/jiashanxia/converter/SpecificationListConverter.java

@@ -0,0 +1,25 @@
+package com.izouma.jiashanxia.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.izouma.jiashanxia.domain.Specification;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import java.util.List;
+
+public class SpecificationListConverter implements AttributeConverter<List<Specification>, String> {
+    @Override
+    public String convertToDatabaseColumn(List<Specification> list) {
+        if (list != null)
+            return JSON.toJSONString(list);
+        return null;
+    }
+
+    @Override
+    public List<Specification> convertToEntityAttribute(String s) {
+        if (StringUtils.isNotEmpty(s)) {
+            return JSON.parseArray(s, Specification.class);
+        }
+        return null;
+    }
+}

+ 25 - 0
src/main/java/com/izouma/jiashanxia/converter/StockListConverter.java

@@ -0,0 +1,25 @@
+package com.izouma.jiashanxia.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.izouma.jiashanxia.domain.Stock;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import java.util.List;
+
+public class StockListConverter implements AttributeConverter<List<Stock>, String> {
+    @Override
+    public String convertToDatabaseColumn(List<Stock> list) {
+        if (list != null)
+            return JSON.toJSONString(list);
+        return null;
+    }
+
+    @Override
+    public List<Stock> convertToEntityAttribute(String s) {
+        if (StringUtils.isNotEmpty(s)) {
+            return JSON.parseArray(s, Stock.class);
+        }
+        return null;
+    }
+}

+ 2 - 2
src/main/java/com/izouma/jiashanxia/domain/Package.java

@@ -66,8 +66,8 @@ public class Package extends BaseEntity {
     @ApiModelProperty(value = "创客奖励比例")
     private BigDecimal makerRatio;
 
-    @ApiModelProperty(value = "创客和108将奖励比例")
-    private BigDecimal generalMakerRatio;
+//    @ApiModelProperty(value = "创客和108将奖励比例")
+//    private BigDecimal generalMakerRatio;
 
     @ApiModelProperty(value = "直推奖励比例")
     private BigDecimal personalRatio0;

+ 9 - 0
src/main/java/com/izouma/jiashanxia/domain/Snack.java

@@ -0,0 +1,9 @@
+package com.izouma.jiashanxia.domain;
+
+import java.math.BigDecimal;
+
+public class Snack extends BaseEntity {
+    private String name;
+
+    private BigDecimal price;
+}

+ 12 - 0
src/main/java/com/izouma/jiashanxia/domain/Specification.java

@@ -0,0 +1,12 @@
+package com.izouma.jiashanxia.domain;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+@Data
+@NoArgsConstructor
+public class Specification {
+    private String name;
+    private BigDecimal price;
+}

+ 13 - 0
src/main/java/com/izouma/jiashanxia/domain/Stock.java

@@ -0,0 +1,13 @@
+package com.izouma.jiashanxia.domain;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@NoArgsConstructor
+public class Stock {
+    private LocalDateTime day;
+    private int inventory;
+}

+ 2 - 0
src/main/java/com/izouma/jiashanxia/repo/OrderInfoRepo.java

@@ -24,6 +24,8 @@ public interface OrderInfoRepo extends JpaRepository<OrderInfo, Long>, JpaSpecif
 
     List<OrderInfo> findAllByPaidAtBetweenAndStatus(LocalDateTime paidAt, LocalDateTime paidAt2, OrderInfoStatus status);
 
+    List<OrderInfo> findAllByPaidAtBetweenAndStatusAndUserId(LocalDateTime paidAt, LocalDateTime paidAt2, OrderInfoStatus status, Long userId);
+
     long countByUserId(Long userId);
 
     OrderInfo findByTransactionId(String transactionId);

+ 2 - 0
src/main/java/com/izouma/jiashanxia/repo/WithdrawRepo.java

@@ -19,4 +19,6 @@ public interface WithdrawRepo extends JpaRepository<Withdraw, Long>, JpaSpecific
     List<Withdraw> findAllByUserId(Long userId);
 
     List<Withdraw> findAllByStatus(WithdrawStatus status);
+
+    List<Withdraw> findAllByStatusAndUserId(WithdrawStatus status, Long userId);
 }

+ 2 - 0
src/main/java/com/izouma/jiashanxia/repo/WxFeeRepo.java

@@ -16,5 +16,7 @@ public interface WxFeeRepo extends JpaRepository<WxFee, String> {
 
     List<WxFee> findAllByCreatedAtBetween(LocalDateTime createdAt, LocalDateTime createdAt2);
 
+    List<WxFee> findAllByCreatedAtBetweenAndUserId(LocalDateTime createdAt, LocalDateTime createdAt2, Long userId);
+
     Optional<WxFee> findByTransactionId(String transactionId);
 }

+ 12 - 5
src/main/java/com/izouma/jiashanxia/service/OrderInfoService.java

@@ -233,7 +233,7 @@ public class OrderInfoService {
         BigDecimal amount = orderInfo.getPrice();
 
         // 无限级找创客/108将
-        this.makerGeneralDistribution(parentUser, amount, orderInfo.getId(), userId);
+        this.makerGeneralDistribution(parentUser, amount, orderInfo.getId(), userId, aPackage);
 
 //        Member member = parentUser.getMember();
         // 不成为佳客没有奖励
@@ -371,11 +371,18 @@ public class OrderInfoService {
     /*
     创客和108将分销
      */
-    public void makerGeneralDistribution(User parent, BigDecimal amount, Long orderId, Long userId) {
-        BigDecimal makerRatio = sysConfigService.getBigDecimal("MAKER_RATIO");
+    public void makerGeneralDistribution(User parent, BigDecimal amount, Long orderId, Long userId, Package aPackage) {
+        // 创客比例
+        BigDecimal makerRatio = aPackage.getMakerRatio();
+        if (ObjectUtil.isNull(makerRatio)) {
+            makerRatio = sysConfigService.getBigDecimal("MAKER_RATIO");
+        }
         BigDecimal maker = amount.multiply(makerRatio);
-
-        BigDecimal generalRatio = sysConfigService.getBigDecimal("GENERAL_RATIO");
+        // 108将比例
+        BigDecimal generalRatio = aPackage.getMakerRatio();
+        if (ObjectUtil.isNull(generalRatio)) {
+            generalRatio = sysConfigService.getBigDecimal("GENERAL_RATIO");
+        }
         BigDecimal general = amount.multiply(generalRatio);
 
         boolean isGeneral = true;

+ 101 - 7
src/main/java/com/izouma/jiashanxia/service/StatisticService.java

@@ -1,16 +1,20 @@
 package com.izouma.jiashanxia.service;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import com.izouma.jiashanxia.domain.OrderInfo;
 import com.izouma.jiashanxia.domain.Withdraw;
 import com.izouma.jiashanxia.domain.WxFee;
+import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.dto.StatisticDTO;
 import com.izouma.jiashanxia.enums.OrderInfoStatus;
 import com.izouma.jiashanxia.enums.WithdrawStatus;
 import com.izouma.jiashanxia.repo.*;
+import com.izouma.jiashanxia.utils.JpaUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import javax.persistence.criteria.Predicate;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -23,11 +27,13 @@ import java.util.stream.Collectors;
 @Service
 @AllArgsConstructor
 public class StatisticService {
-    private final UserRepo      userRepo;
-    private final CompanyRepo   companyRepo;
-    private final OrderInfoRepo orderInfoRepo;
-    private final WxFeeRepo     wxFeeRepo;
-    private final WithdrawRepo  withdrawRepo;
+    private final UserRepo         userRepo;
+    private final CompanyRepo      companyRepo;
+    private final OrderInfoRepo    orderInfoRepo;
+    private final WxFeeRepo        wxFeeRepo;
+    private final WithdrawRepo     withdrawRepo;
+    private final UserService      userService;
+    private final OrderInfoService orderInfoService;
 
     /*
     数据总揽
@@ -97,11 +103,64 @@ public class StatisticService {
         return dtos;
     }
 
-    public List<StatisticDTO> dayData2(Integer day) {
-        List<StatisticDTO> dtos = new ArrayList<>();
+    public List<StatisticDTO> dayData2(int day) {
         LocalDateTime now = LocalDateTime.now();
         LocalDateTime start = LocalDateTime.of(now.toLocalDate().minusDays(day - 1), LocalTime.MIN);
         List<OrderInfo> orderInfos = orderInfoRepo.findAllByPaidAtBetweenAndStatus(start, now, OrderInfoStatus.PAID);
+
+//        List<StatisticDTO> dtos = new ArrayList<>();
+//        while (day > 0) {
+//            LocalDateTime end = start.plusDays(1);
+//            LocalDateTime finalStart = start;
+//            long order = orderInfos.stream()
+//                    .filter(orderInfo -> !finalStart.isAfter(orderInfo.getPaidAt()) && end.isAfter(orderInfo.getPaidAt()))
+//                    .count();
+//            dtos.add(StatisticDTO.builder()
+//                    .date(finalStart.toLocalDate())
+//                    .dayOrder(order)
+//                    .build());
+//            day--;
+//            start = end;
+//        }
+//        return dtos;
+        return this.getDTOS(orderInfos, start, day);
+    }
+
+    public List<StatisticDTO> employee(int year, int month, Long userId) {
+        LocalDateTime start = LocalDateTime.of(year, month, 1, 0, 0);
+        LocalDateTime end = start.plusMonths(1);
+        List<Long> childrenId = userService.childrenId(userId);
+        List<OrderInfo> orderInfos = orderInfoRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = new ArrayList<>();
+            and.add(criteriaBuilder.equal(root.get("status"), OrderInfoStatus.PAID));
+            and.add(root.get("userId").in(childrenId));
+            and.add(criteriaBuilder.greaterThanOrEqualTo(root.get("paidAt"), start));
+            and.add(criteriaBuilder.lessThan(root.get("paidAt"), end));
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        }));
+        long day = end.toLocalDate().toEpochDay() - start.toLocalDate().toEpochDay() - 1;
+        return this.getDTOS(orderInfos, start, (int) day);
+    }
+
+    public List<StatisticDTO> employee2(int year, int month, Long userId) {
+        LocalDateTime start = LocalDateTime.of(year, month, 1, 0, 0);
+        LocalDateTime end = start.plusMonths(1);
+        long day = end.toLocalDate().toEpochDay() - start.toLocalDate().toEpochDay() - 1;
+        Map<Integer, List<WxFee>> collect = wxFeeRepo.findAllByCreatedAtBetweenAndUserId(start, end, userId)
+                .stream()
+                .collect(Collectors.groupingBy(WxFee::getAction));
+        List<WxFee> wxFees = collect.get(0);
+        List<WxFee> refunds = new ArrayList<>();
+        List<WxFee> wxFees1 = collect.get(1);
+        if (CollUtil.isNotEmpty(wxFees1)) {
+            refunds = wxFees1;
+        }
+        List<Withdraw> withdraws = withdrawRepo.findAllByStatusAndUserId(WithdrawStatus.SUCCESS, userId);
+        return getDTOS2(wxFees, refunds, withdraws, start, (int) day);
+    }
+
+    public List<StatisticDTO> getDTOS(List<OrderInfo> orderInfos, LocalDateTime start, int day) {
+        List<StatisticDTO> dtos = new ArrayList<>();
         while (day > 0) {
             LocalDateTime end = start.plusDays(1);
             LocalDateTime finalStart = start;
@@ -117,4 +176,39 @@ public class StatisticService {
         }
         return dtos;
     }
+
+    public List<StatisticDTO> getDTOS2(List<WxFee> wxFees, List<WxFee> refunds, List<Withdraw> withdraws,
+                                       LocalDateTime start, int day) {
+        List<StatisticDTO> dtos = new ArrayList<>();
+        while (day > 0) {
+            LocalDateTime end = start.plusDays(1);
+            LocalDateTime finalStart = start;
+//            long order = orderInfos.stream()
+//                    .filter(orderInfo -> !finalStart.isAfter(orderInfo.getPaidAt()) && end.isAfter(orderInfo.getPaidAt()))
+//                    .count();
+//            BigDecimal fee = wxFees.stream()
+//                    .filter(wxFee -> !finalStart.isAfter(wxFee.getCreatedAt()) && end.isAfter(wxFee.getCreatedAt()))
+//                    .map(WxFee::getAmount)
+//                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+//            BigDecimal refund = refunds.stream()
+//                    .filter(wxFee -> !finalStart.isAfter(wxFee.getCreatedAt()) && end.isAfter(wxFee.getCreatedAt()))
+//                    .map(WxFee::getAmount)
+//                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal withdraw = withdraws.stream()
+                    .filter(wxFee -> !finalStart.isAfter(wxFee.getAuditTime()) && end.isAfter(wxFee.getAuditTime()))
+                    .map(Withdraw::getAmount)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            dtos.add(StatisticDTO.builder()
+                    .date(finalStart.toLocalDate())
+//                    .dayOrder(order)
+//                    .dayFee(fee)
+                    .dayWithdraw(withdraw)
+//                    .dayRefund(refund)
+                    .build());
+            day--;
+            start = end;
+        }
+        return dtos;
+    }
 }

+ 13 - 2
src/main/java/com/izouma/jiashanxia/service/UserService.java

@@ -446,8 +446,19 @@ public class UserService {
      */
     public Page<User> children(PageQuery pageQuery) {
         Map<String, Object> query = pageQuery.getQuery();
-        String parent = (String) query.get("parent");
-        List<Long> users = userRepo.findIdByParentAndDelFalse(Long.parseLong(parent));
+
+        Object userId = query.get("userId");
+        Long parent = 0L;
+        if (userId instanceof String) {
+            String of = String.valueOf(userId);
+            parent = Long.parseLong(of);
+        }
+        if (userId instanceof Integer) {
+            Integer of = (Integer) userId;
+            parent = Long.valueOf(of);
+        }
+
+        List<Long> users = userRepo.findIdByParentAndDelFalse(parent);
 
         List<Long> children = new ArrayList<>(users);
         while (CollUtil.isNotEmpty(users)) {

+ 36 - 3
src/main/vue/src/components/PackageEdit.vue

@@ -58,15 +58,15 @@
                 </el-input>
                 <el-button v-else class="button-new-tag" size="small" @click="showInput">新建标签</el-button>
             </el-form-item>
-            <el-form-item prop="amount" label="金额">
-                <el-input-number type="number" v-model="formData.amount"></el-input-number>
-            </el-form-item>
             <el-form-item prop="repeatedly" label="使用次数">
                 <el-radio-group v-model="formData.repeatedly">
                     <el-radio :label="false">单次使用</el-radio>
                     <el-radio :label="true">多次使用</el-radio>
                 </el-radio-group>
             </el-form-item>
+            <el-form-item prop="amount" label="金额">
+                <el-input-number type="number" v-model="formData.amount" class="select-width"></el-input-number>
+            </el-form-item>
             <el-form-item prop="categoryId" label="套餐类型">
                 <el-select v-model="formData.categoryId" clearable filterable placeholder="请选择" class="select-width">
                     <el-option
@@ -81,6 +81,39 @@
             <el-form-item prop="detail" label="详情">
                 <rich-text v-model="formData.detail"></rich-text>
             </el-form-item>
+            <el-form-item prop="separateDistribution" label="单独分销">
+                <el-switch v-model="formData.separateDistribution"> </el-switch>
+            </el-form-item>
+            <el-form-item prop="personalRatio0" label="直推比例" v-if="formData.separateDistribution">
+                <el-input-number
+                    type="number"
+                    v-model="formData.personalRatio0"
+                    class="select-width"
+                    :max="1"
+                    :min="0"
+                    :step="0.01"
+                ></el-input-number>
+            </el-form-item>
+            <el-form-item prop="makerRatio" label="创客比例" v-if="formData.separateDistribution">
+                <el-input-number
+                    type="number"
+                    v-model="formData.makerRatio"
+                    class="select-width"
+                    :max="1"
+                    :min="0"
+                    :step="0.01"
+                ></el-input-number>
+            </el-form-item>
+            <el-form-item prop="generalRatio" label="108将比例" v-if="formData.separateDistribution">
+                <el-input-number
+                    type="number"
+                    v-model="formData.generalRatio"
+                    class="select-width"
+                    :min="0"
+                    :max="1"
+                    :step="0.01"
+                ></el-input-number>
+            </el-form-item>
             <el-form-item>
                 <el-button @click="onSave" :loading="saving" type="primary" v-if="$route.query.id">保存</el-button>
                 <el-button @click="onSave" :loading="saving" type="primary" v-else>下一步</el-button>

+ 22 - 0
src/test/java/com/izouma/jiashanxia/service/StatisticServiceTest.java

@@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 @SpringBootTest
@@ -20,4 +21,25 @@ public class StatisticServiceTest {
         List<StatisticDTO> dtos = statisticService.dayData(7);
         dtos.forEach(System.out::println);
     }
+
+    @Test
+    public void test() {
+        LocalDateTime start = LocalDateTime.of(2021, 1, 1, 0, 0);
+//        LocalDateTime next = LocalDateTime.of(2021, 2, 1, 0, 0);
+        LocalDateTime end = start.minusMonths(1);
+        System.out.println(start);
+        System.out.println(end);
+    }
+
+    @Test
+    public void test1() {
+        List<StatisticDTO> employee = statisticService.employee(2021, 1, 916L);
+        employee.forEach(System.out::println);
+    }
+
+    @Test
+    public void test2() {
+        List<StatisticDTO> employee = statisticService.employee2(2021, 1, 921L);
+        employee.forEach(System.out::println);
+    }
 }