licailing 5 yıl önce
ebeveyn
işleme
3d12e0f4b8

+ 8 - 1
src/main/java/com/izouma/jiashanxia/domain/PackageGoods.java

@@ -6,9 +6,11 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
 import org.hibernate.annotations.Where;
 
-import javax.persistence.Entity;
+import javax.persistence.*;
 import java.math.BigDecimal;
 
 @Data
@@ -36,4 +38,9 @@ public class PackageGoods extends BaseEntity {
     private BigDecimal price;
 
     private String remark;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "goodsInfoId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    private GoodsInfo goodsInfo;
 }

+ 57 - 0
src/main/java/com/izouma/jiashanxia/dto/OrderInfoVO.java

@@ -0,0 +1,57 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.domain.Package;
+import com.izouma.jiashanxia.domain.PackageGoods;
+import com.izouma.jiashanxia.domain.User;
+import com.izouma.jiashanxia.enums.OrderInfoStatus;
+import com.izouma.jiashanxia.enums.PayMethod;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "订单")
+public class OrderInfoVO {
+
+    private Long userId;
+
+    @ApiModelProperty(value = "支付方式")
+    private PayMethod payMethod;
+
+    @ApiModelProperty(value = "支付时间")
+    private LocalDateTime paidAt;
+
+    @ApiModelProperty(value = "订单状态")
+    private OrderInfoStatus status;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderNumber;
+
+    @ApiModelProperty(value = "交易单号")
+    private String transactionId;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "充值套餐")
+    private Long packageId;
+
+    @ApiModelProperty(value = "价钱")
+    private BigDecimal price;
+
+    private User user;
+
+    private Package aPackage;
+
+    private List<PackageGoods> goods;
+}

+ 1 - 1
src/main/java/com/izouma/jiashanxia/repo/PackageGoodsRepo.java

@@ -15,5 +15,5 @@ public interface PackageGoodsRepo extends JpaRepository<PackageGoods, Long>, Jpa
     @Transactional
     void softDelete(Long id);
 
-    List<PackageGoods> findAllByPackageId(Long setId);
+    List<PackageGoods> findAllByPackageId(Long packageId);
 }

+ 69 - 2
src/main/java/com/izouma/jiashanxia/service/OrderInfoService.java

@@ -1,9 +1,13 @@
 package com.izouma.jiashanxia.service;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.izouma.jiashanxia.domain.*;
 import com.izouma.jiashanxia.domain.Package;
+import com.izouma.jiashanxia.dto.GoodsVO;
+import com.izouma.jiashanxia.dto.OrderInfoVO;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.enums.OrderInfoStatus;
 import com.izouma.jiashanxia.enums.PayMethod;
@@ -13,13 +17,19 @@ import com.izouma.jiashanxia.repo.*;
 import com.izouma.jiashanxia.utils.JpaUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
 import javax.persistence.criteria.Predicate;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -35,6 +45,7 @@ public class OrderInfoService {
     private UserPackageService   userPackageService;
     private CompanyRepo          companyRepo;
     private WithdrawService      withdrawService;
+    private GoodsInfoRepo        goodsInfoRepo;
 
     public Page<OrderInfo> all(PageQuery pageQuery) {
         return orderInfoRepo.findAll(JpaUtils.toSpecification(pageQuery, OrderInfo.class), JpaUtils.toPageRequest(pageQuery));
@@ -61,7 +72,7 @@ public class OrderInfoService {
     /*
     下订单
      */
-    public OrderInfo creatOrder(Long userId, Long packageId, PayMethod payMethod) {
+    public OrderInfo createOrder(Long userId, Long packageId, PayMethod payMethod) {
         Package setInfo = packageRepo.findById(packageId).orElseThrow(new BusinessException("无套餐"));
         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
         String localTime = df.format(LocalDateTime.now());
@@ -161,7 +172,6 @@ public class OrderInfoService {
 
     }
 
-
     /*
     公司分销
      */
@@ -187,4 +197,61 @@ public class OrderInfoService {
                 .build());
 
     }
+
+    /*
+    用户订单
+     */
+    public Page<OrderInfoVO> my(Pageable pageable, Long userId, List<OrderInfoStatus> status) {
+        return orderInfoRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = new ArrayList<>();
+            and.add(criteriaBuilder.equal(root.get("userId"), userId));
+            if (CollUtil.isNotEmpty(status)) {
+                List<Predicate> or = new ArrayList<>();
+                status.forEach(orderInfoStatus ->
+                        or.add(criteriaBuilder.equal(root.get("status"), orderInfoStatus))
+                );
+                and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));
+            }
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        }), pageable).map(this::toVo);
+//        return new PageImpl<>(this.toVO(all), pageable, all.size());
+    }
+
+    public OrderInfoVO toVo(OrderInfo orderInfo) {
+        OrderInfoVO vo = new OrderInfoVO();
+        BeanUtil.copyProperties(orderInfo, vo);
+        vo.setAPackage(packageRepo.findById(orderInfo.getPackageId()).orElseThrow(new BusinessException("无套餐")));
+        List<PackageGoods> packageGoods = packageGoodsRepo.findAllByPackageId(orderInfo.getPackageId());
+        vo.setGoods(packageGoods);
+        return vo;
+    }
+
+    public List<OrderInfoVO> toVO(List<OrderInfo> orderInfos) {
+        List<OrderInfoVO> orderInfoVOS = new ArrayList<>();
+        Set<Long> packageIds = orderInfos.stream().map(OrderInfo::getPackageId).collect(Collectors.toSet());
+        Map<Long, Package> packageMap = packageRepo.findAllById(packageIds)
+                .stream()
+                .collect(Collectors.toMap(Package::getId, apackage -> apackage));
+//        Map<Long, String> goodsMap = goodsInfoRepo.findAll()
+//                .stream()
+//                .collect(Collectors.toMap(GoodsInfo::getId, GoodsInfo::getName));
+
+        orderInfos.forEach(orderInfo -> {
+            OrderInfoVO vo = new OrderInfoVO();
+            BeanUtil.copyProperties(orderInfo, vo);
+            vo.setAPackage(packageMap.get(orderInfo.getPackageId()));
+            List<PackageGoods> packageGoods = packageGoodsRepo.findAllByPackageId(orderInfo.getPackageId());
+//            List<GoodsVO> goodsVOS = new ArrayList<>();
+//            packageGoods.forEach(goods -> {
+//                goodsVOS.add(GoodsVO.builder()
+//                        .name(goodsMap.get(goods.getGoodsInfoId()))
+//                        .num(goods.getNum().longValue())
+//                        .build());
+//            });
+            vo.setGoods(packageGoods);
+
+            orderInfoVOS.add(vo);
+        });
+        return orderInfoVOS;
+    }
 }

+ 10 - 2
src/main/java/com/izouma/jiashanxia/web/OrderInfoController.java

@@ -1,6 +1,8 @@
 package com.izouma.jiashanxia.web;
 
 import com.izouma.jiashanxia.domain.OrderInfo;
+import com.izouma.jiashanxia.dto.OrderInfoVO;
+import com.izouma.jiashanxia.enums.OrderInfoStatus;
 import com.izouma.jiashanxia.enums.PayMethod;
 import com.izouma.jiashanxia.service.OrderInfoService;
 import com.izouma.jiashanxia.dto.PageQuery;
@@ -12,6 +14,7 @@ import com.izouma.jiashanxia.utils.excel.ExcelUtils;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -69,8 +72,8 @@ public class OrderInfoController extends BaseController {
 
     @PostMapping("/create")
     @ApiOperation("创建订单")
-    public OrderInfo creat(@RequestParam Long packageId, @RequestParam PayMethod payMethod) {
-        return orderInfoService.creatOrder(SecurityUtils.getAuthenticatedUser().getId(), packageId, payMethod);
+    public OrderInfo create(@RequestParam Long packageId, @RequestParam PayMethod payMethod) {
+        return orderInfoService.createOrder(SecurityUtils.getAuthenticatedUser().getId(), packageId, payMethod);
     }
 
     @PostMapping("/cancel")
@@ -78,5 +81,10 @@ public class OrderInfoController extends BaseController {
     public OrderInfo cancel(Long orderId) {
         return orderInfoService.cancelOrder(orderId);
     }
+
+    @PostMapping("/my")
+    public Page<OrderInfoVO> my(Pageable pageable, List<OrderInfoStatus> status) {
+        return orderInfoService.my(pageable, SecurityUtils.getAuthenticatedUser().getId(), status);
+    }
 }
 

+ 17 - 8
src/main/vue/src/views/Dashboard.vue

@@ -33,22 +33,30 @@
 <script>
 import { GridLayout, GridItem } from 'vue-grid-layout';
 import UserWidget from '../widgets/UserWidget';
+import OrderWidget from '../widgets/OrderWidget';
 import LineChartWidget from '../widgets/LineChartWidget';
 import BarChartWidget from '../widgets/BarChartWidget';
 import PieChartWidget from '../widgets/PieChartWidget';
 
 export default {
-    created() {},
+    created() {
+        this.$axios.get('/statistic/data').then(res => {
+            this.user = res.data['user'];
+            this.company = res.data['company'];
+            this.order = res.data['order'];
+            this.fee = res.data['fee'];
+        });
+    },
     data() {
         return {
             layout: [
-                { x: 0, y: 0, w: 3, h: 4, i: '0', name: 'UserWidget' },
-                { x: 3, y: 0, w: 3, h: 4, i: '1', name: 'UserWidget' },
-                { x: 6, y: 0, w: 3, h: 4, i: '2', name: 'UserWidget' },
-                { x: 9, y: 0, w: 3, h: 4, i: '3', name: 'UserWidget' },
-                { x: 0, y: 4, w: 6, h: 6, i: '4', name: 'BarChartWidget' },
-                { x: 0, y: 10, w: 6, h: 6, i: '5', name: 'LineChartWidget' },
-                { x: 6, y: 4, w: 6, h: 12, i: '6', name: 'PieChartWidget' }
+                { x: 0, y: 0, w: 3, h: 4, i: '0', name: 'UserWidget', key: 'user' },
+                { x: 3, y: 0, w: 3, h: 4, i: '1', name: 'OrderWidget', key: 'company' },
+                { x: 6, y: 0, w: 3, h: 4, i: '2', name: 'UserWidget', key: 'order' },
+                { x: 9, y: 0, w: 3, h: 4, i: '3', name: 'UserWidget', key: 'fee' },
+                { x: 0, y: 4, w: 12, h: 6, i: '4', name: 'BarChartWidget' },
+                { x: 0, y: 10, w: 12, h: 6, i: '5', name: 'LineChartWidget' }
+                /*{ x: 6, y: 4, w: 6, h: 12, i: '6', name: 'PieChartWidget' }*/
             ],
             editable: false
         };
@@ -63,6 +71,7 @@ export default {
         GridLayout,
         GridItem,
         UserWidget,
+        OrderWidget,
         LineChartWidget,
         BarChartWidget,
         PieChartWidget

+ 2 - 2
src/main/vue/src/views/OrderInfoList.vue

@@ -23,8 +23,8 @@
                 <el-option v-for="item in statusOptions" :key="item.value" :value="item.value" :label="item.label">
                 </el-option>
             </el-select>
-            <el-select v-model="setMealId" class="filter-item" clearable @change="getData" placeholder="请选择套餐">
-                <el-option v-for="item in setMeals" :label="item.name" :value="item.id" :key="item.id"></el-option>
+            <el-select v-model="packageId" class="filter-item" clearable @change="getData" placeholder="请选择套餐">
+                <el-option v-for="item in packages" :label="item.name" :value="item.id" :key="item.id"></el-option>
             </el-select>
         </div>
         <el-table

+ 42 - 0
src/main/vue/src/widgets/OrderWidget.vue

@@ -0,0 +1,42 @@
+<template>
+    <widget-card :bodyStyle="bodyStyle">
+        <i class="fa-fw fas fa-file-alt fa-3x" style="color: #40c9c6;"></i>
+        <div class="info">
+            <div class="text">订单</div>
+            <div class="num">{{ value || 0 }}</div>
+        </div>
+    </widget-card>
+</template>
+<script>
+import WidgetCard from './WidgetCard';
+
+export default {
+    props: ['value'],
+    data() {
+        return {
+            bodyStyle: {
+                display: 'flex',
+                alignItems: 'center'
+            }
+        };
+    },
+    components: {
+        WidgetCard
+    }
+};
+</script>
+<style lang="less" scoped>
+.info {
+    flex-grow: 1;
+    text-align: right;
+    .text {
+        color: #999;
+        font-size: 16px;
+        margin-bottom: 12px;
+    }
+    .num {
+        font-size: 20px;
+        color: #333;
+    }
+}
+</style>

+ 3 - 2
src/main/vue/src/widgets/UserWidget.vue

@@ -2,8 +2,8 @@
     <widget-card :bodyStyle="bodyStyle">
         <i class="fa-fw fas fa-user fa-3x" style="color: #40c9c6;"></i>
         <div class="info">
-            <div class="text">User</div>
-            <div class="num">4,258</div>
+            <div class="text">用户</div>
+            <div class="num">{{ value || 0 }}</div>
         </div>
     </widget-card>
 </template>
@@ -11,6 +11,7 @@
 import WidgetCard from './WidgetCard';
 
 export default {
+    props: ['value'],
     data() {
         return {
             bodyStyle: {

+ 13 - 1
src/test/java/com/izouma/jiashanxia/service/OrderInfoServiceTest.java

@@ -1,12 +1,18 @@
 package com.izouma.jiashanxia.service;
 
+import cn.hutool.core.collection.CollUtil;
+import com.izouma.jiashanxia.dto.OrderInfoVO;
+import com.izouma.jiashanxia.enums.OrderInfoStatus;
 import com.izouma.jiashanxia.enums.PayMethod;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.domain.Pageable;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
 @SpringBootTest
 @RunWith(SpringRunner.class)
 public class OrderInfoServiceTest {
@@ -16,7 +22,7 @@ public class OrderInfoServiceTest {
 
     @Test
     public void order() {
-        System.out.println(orderInfoService.creatOrder(46L, 17L, PayMethod.WEIXIN));
+        System.out.println(orderInfoService.createOrder(46L, 17L, PayMethod.WEIXIN));
     }
 
     @Test
@@ -28,4 +34,10 @@ public class OrderInfoServiceTest {
     public void cancel() {
         System.out.println(orderInfoService.cancelOrder(58L));
     }
+
+    @Test
+    public void test() {
+        List<OrderInfoVO> content = orderInfoService.my(Pageable.unpaged(), 68L, CollUtil.newArrayList(OrderInfoStatus.PAID,OrderInfoStatus.CANCELLED)).getContent();
+        content.forEach(System.out::println);
+    }
 }