瀏覽代碼

购物车/用户地址

licailing 4 年之前
父節點
當前提交
09eec5f6d4
共有 38 個文件被更改,包括 1290 次插入129 次删除
  1. 7 0
      src/main/java/com/izouma/jiashanxia/domain/Address.java
  2. 7 0
      src/main/java/com/izouma/jiashanxia/domain/Coupon.java
  3. 29 0
      src/main/java/com/izouma/jiashanxia/domain/GroupBuy.java
  4. 1 1
      src/main/java/com/izouma/jiashanxia/domain/OrderInfo.java
  5. 12 0
      src/main/java/com/izouma/jiashanxia/domain/Package.java
  6. 6 4
      src/main/java/com/izouma/jiashanxia/domain/ShoppingCart.java
  7. 2 0
      src/main/java/com/izouma/jiashanxia/domain/Stock.java
  8. 0 3
      src/main/java/com/izouma/jiashanxia/domain/UserPackageFlow.java
  9. 34 0
      src/main/java/com/izouma/jiashanxia/dto/CreateCart.java
  10. 54 0
      src/main/java/com/izouma/jiashanxia/dto/PackageVO.java
  11. 21 0
      src/main/java/com/izouma/jiashanxia/repo/AddressRepo.java
  12. 3 0
      src/main/java/com/izouma/jiashanxia/repo/PackageRepo.java
  13. 16 0
      src/main/java/com/izouma/jiashanxia/repo/ShoppingCartRepo.java
  14. 20 0
      src/main/java/com/izouma/jiashanxia/service/AddressService.java
  15. 48 34
      src/main/java/com/izouma/jiashanxia/service/OrderInfoService.java
  16. 30 6
      src/main/java/com/izouma/jiashanxia/service/PackageService.java
  17. 57 0
      src/main/java/com/izouma/jiashanxia/service/ShoppingCartService.java
  18. 10 39
      src/main/java/com/izouma/jiashanxia/service/UserPackageFlowService.java
  19. 10 3
      src/main/java/com/izouma/jiashanxia/service/UserService.java
  20. 7 0
      src/main/java/com/izouma/jiashanxia/service/WithdrawService.java
  21. 66 0
      src/main/java/com/izouma/jiashanxia/web/AddressController.java
  22. 9 1
      src/main/java/com/izouma/jiashanxia/web/OrderInfoController.java
  23. 60 0
      src/main/java/com/izouma/jiashanxia/web/ShoppingCartController.java
  24. 1 0
      src/main/resources/genjson/Address.json
  25. 0 0
      src/main/resources/genjson/ShoppingCart.json
  26. 32 9
      src/main/vue/src/components/PackageEdit.vue
  27. 21 0
      src/main/vue/src/mixins/getInfo.js
  28. 41 0
      src/main/vue/src/router.js
  29. 110 0
      src/main/vue/src/views/AddressEdit.vue
  30. 166 0
      src/main/vue/src/views/AddressList.vue
  31. 8 2
      src/main/vue/src/views/CouponEdit.vue
  32. 33 11
      src/main/vue/src/views/CouponList.vue
  33. 39 10
      src/main/vue/src/views/PackageList.vue
  34. 145 0
      src/main/vue/src/views/ShoppingCartEdit.vue
  35. 165 0
      src/main/vue/src/views/ShoppingCartList.vue
  36. 2 2
      src/main/vue/src/views/attractions/AttractionsList.vue
  37. 17 3
      src/main/vue/src/views/attractions/UserCouponList.vue
  38. 1 1
      src/main/vue/src/views/employee/EmployeeList.vue

+ 7 - 0
src/main/java/com/izouma/jiashanxia/domain/Address.java

@@ -7,10 +7,14 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 
 
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
 @Data
 @Data
 @AllArgsConstructor
 @AllArgsConstructor
 @NoArgsConstructor
 @NoArgsConstructor
 @Builder
 @Builder
+@Entity
 @ApiModel("收件地址")
 @ApiModel("收件地址")
 public class Address extends BaseEntity {
 public class Address extends BaseEntity {
     private Long userId;
     private Long userId;
@@ -26,4 +30,7 @@ public class Address extends BaseEntity {
     @ApiModelProperty(value = "详细地址")
     @ApiModelProperty(value = "详细地址")
     private String address;
     private String address;
 
 
+    @Column(nullable = false)
+    private Boolean isDefault = false;
+
 }
 }

+ 7 - 0
src/main/java/com/izouma/jiashanxia/domain/Coupon.java

@@ -24,8 +24,12 @@ public class Coupon extends BaseEntity {
     @ApiModelProperty(value = "品牌")
     @ApiModelProperty(value = "品牌")
     private Long attractionsId;
     private Long attractionsId;
 
 
+    @ApiModelProperty(value = "名称")
     private String name;
     private String name;
 
 
+    @ApiModelProperty(value = "小标题")
+    private String title;
+
     private BigDecimal price;
     private BigDecimal price;
 
 
     private String content;
     private String content;
@@ -33,6 +37,9 @@ public class Coupon extends BaseEntity {
     @ApiModelProperty(value = "有效期")
     @ApiModelProperty(value = "有效期")
     private LocalDateTime period;
     private LocalDateTime period;
 
 
+    @ApiModelProperty(value = "适用门店")
+    private String store;
+
     @Transient
     @Transient
     private String attractionsName;
     private String attractionsName;
 }
 }

+ 29 - 0
src/main/java/com/izouma/jiashanxia/domain/GroupBuy.java

@@ -0,0 +1,29 @@
+package com.izouma.jiashanxia.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "团购")
+public class GroupBuy extends BaseEntity {
+    /*
+    没达到成团
+    团购流程
+     */
+
+    @ApiModelProperty(value = "发起人")
+    private Long createUserId;
+
+    @ApiModelProperty(value = "成功时间")
+    private LocalDateTime successTime;
+
+    @ApiModelProperty(value = "成团人数")
+    private Integer numberOfPeople;
+}

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

@@ -68,7 +68,7 @@ public class OrderInfo extends BaseEntity {
     @NotFound(action = NotFoundAction.IGNORE)
     @NotFound(action = NotFoundAction.IGNORE)
     private User user;
     private User user;
 
 
-    private boolean isUse;
+//    private boolean isUse;
 
 
     @ApiModelProperty(value = "分享此链接的用户")
     @ApiModelProperty(value = "分享此链接的用户")
     private Long parentUserId;
     private Long parentUserId;

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

@@ -38,6 +38,9 @@ public class Package extends BaseEntity {
     @ApiModelProperty(value = "金额")
     @ApiModelProperty(value = "金额")
     private BigDecimal amount;
     private BigDecimal amount;
 
 
+    @ApiModelProperty(value = "原价")
+    private BigDecimal originalPrice;
+
     @Column(columnDefinition = "TEXT")
     @Column(columnDefinition = "TEXT")
     @ApiModelProperty(value = "详情")
     @ApiModelProperty(value = "详情")
     private String detail;
     private String detail;
@@ -109,6 +112,15 @@ public class Package extends BaseEntity {
 
 
     private boolean buyPhone;
     private boolean buyPhone;
 
 
+    @ApiModelProperty(value = "销量")
+    private int sale;
+
+    @ApiModelProperty(value = "库存")
+    private int inventory;
+
+    @ApiModelProperty(value = "分享数")
+    private int shareNum;
+
     @Transient
     @Transient
     private String attractionsName;
     private String attractionsName;
 
 

+ 6 - 4
src/main/java/com/izouma/jiashanxia/domain/ShoppingCart.java

@@ -6,6 +6,7 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 
 
+import javax.persistence.Entity;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDate;
 
 
@@ -13,6 +14,7 @@ import java.time.LocalDate;
 @AllArgsConstructor
 @AllArgsConstructor
 @NoArgsConstructor
 @NoArgsConstructor
 @Builder
 @Builder
+@Entity
 public class ShoppingCart extends BaseEntity {
 public class ShoppingCart extends BaseEntity {
 
 
     private Long userId;
     private Long userId;
@@ -32,11 +34,11 @@ public class ShoppingCart extends BaseEntity {
     @ApiModelProperty(value = "选择的规格Id")
     @ApiModelProperty(value = "选择的规格Id")
     private Long stockId;
     private Long stockId;
 
 
-    @ApiModelProperty(value = "规格")
-    private String    specification;
+//    @ApiModelProperty(value = "规格")
+//    private String specification;
 
 
-    @ApiModelProperty(value = "日期")
-    private LocalDate day;
+//    @ApiModelProperty(value = "日期")
+//    private LocalDate day;
 
 
     @ApiModelProperty(value = "真实姓名")
     @ApiModelProperty(value = "真实姓名")
     private String realName;
     private String realName;

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

@@ -27,6 +27,8 @@ public class Stock extends BaseEntity {
     private LocalDate  day;
     private LocalDate  day;
     @ApiModelProperty(value = "库存")
     @ApiModelProperty(value = "库存")
     private int        inventory;
     private int        inventory;
+    @ApiModelProperty(value = "销售")
+    private int        sale;
     private BigDecimal price;
     private BigDecimal price;
     @ApiModelProperty(value = "原价")
     @ApiModelProperty(value = "原价")
     private BigDecimal originalPrice;
     private BigDecimal originalPrice;

+ 0 - 3
src/main/java/com/izouma/jiashanxia/domain/UserPackageFlow.java

@@ -36,9 +36,6 @@ public class UserPackageFlow extends BaseEntity {
     @Enumerated(EnumType.STRING)
     @Enumerated(EnumType.STRING)
     private PackageType packageType;
     private PackageType packageType;
 
 
-//    @ApiModelProperty(value = "套餐有效期id")
-//    private Long userPackagePeriodId;
-
     private Long orderInfoId;
     private Long orderInfoId;
 
 
     /*
     /*

+ 34 - 0
src/main/java/com/izouma/jiashanxia/dto/CreateCart.java

@@ -0,0 +1,34 @@
+package com.izouma.jiashanxia.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CreateCart {
+    @ApiModelProperty(value = "数量")
+    private Integer num;
+
+    @ApiModelProperty(value = "套餐")
+    private Long packageId;
+
+    @ApiModelProperty(value = "分享此链接的用户")
+    private Long parentUserId;
+
+    @ApiModelProperty(value = "选择的规格Id")
+    private Long stockId;
+
+    @ApiModelProperty(value = "真实姓名")
+    private String realName;
+
+    @ApiModelProperty(value = "身份证")
+    private String IDNo;
+
+    @ApiModelProperty(value = "购买手机")
+    private String buyPhone;
+}

+ 54 - 0
src/main/java/com/izouma/jiashanxia/dto/PackageVO.java

@@ -0,0 +1,54 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.domain.Stock;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class PackageVO {
+    private Long id;
+
+    @ApiModelProperty(value = "套餐名称")
+    private String name;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "套餐标签")
+    private List<String> tag;
+
+    @ApiModelProperty(value = "金额")
+    private String amount;
+
+    @ApiModelProperty(value = "原价")
+    private String originalPrice;
+
+    @ApiModelProperty(value = "详情")
+    private String detail;
+
+    @ApiModelProperty(value = "图")
+    private List<String> img;
+
+    @ApiModelProperty(value = "活动流程")
+    private String workflow;
+
+    @ApiModelProperty(value = "注意事项")
+    private String note;
+
+    @ApiModelProperty(value = "销量")
+    private int sale;
+
+    @ApiModelProperty(value = "分享数")
+    private int shareNum;
+
+    @ApiModelProperty(value = "规格等")
+    private List<Stock> stocks;
+}

+ 21 - 0
src/main/java/com/izouma/jiashanxia/repo/AddressRepo.java

@@ -0,0 +1,21 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.Address;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface AddressRepo extends JpaRepository<Address, Long>, JpaSpecificationExecutor<Address> {
+    @Query("update Address t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    @Query("update Address a set a.isDefault = false where a.userId = ?1 and a.id <> ?2")
+    @Modifying
+    @Transactional
+    void updateDefault(Long userId, Long id);
+}

+ 3 - 0
src/main/java/com/izouma/jiashanxia/repo/PackageRepo.java

@@ -29,4 +29,7 @@ public interface PackageRepo extends JpaRepository<Package, Long>, JpaSpecificat
             "left join attractions a on p.attractions_id = a.id " +
             "left join attractions a on p.attractions_id = a.id " +
             "left join category c on c.id = p.category_id where p.id = ?1")
             "left join category c on c.id = p.category_id where p.id = ?1")
     PackageDTO findInformationById(Long id);
     PackageDTO findInformationById(Long id);
+
+    @Query("update Package t set t.shareNum = t.shareNum + 1 where t.id = ?1")
+    Package addShareNum(Long id);
 }
 }

+ 16 - 0
src/main/java/com/izouma/jiashanxia/repo/ShoppingCartRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.ShoppingCart;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface ShoppingCartRepo extends JpaRepository<ShoppingCart, Long>, JpaSpecificationExecutor<ShoppingCart> {
+    @Query("update ShoppingCart t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 20 - 0
src/main/java/com/izouma/jiashanxia/service/AddressService.java

@@ -0,0 +1,20 @@
+package com.izouma.jiashanxia.service;
+
+import com.izouma.jiashanxia.domain.Address;
+import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.repo.AddressRepo;
+import com.izouma.jiashanxia.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class AddressService {
+
+    private final AddressRepo addressRepo;
+
+    public Page<Address> all(PageQuery pageQuery) {
+        return addressRepo.findAll(JpaUtils.toSpecification(pageQuery, Address.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

+ 48 - 34
src/main/java/com/izouma/jiashanxia/service/OrderInfoService.java

@@ -4,7 +4,6 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
-import com.alibaba.fastjson.JSONObject;
 import com.izouma.jiashanxia.domain.*;
 import com.izouma.jiashanxia.domain.*;
 import com.izouma.jiashanxia.domain.Package;
 import com.izouma.jiashanxia.domain.Package;
 import com.izouma.jiashanxia.dto.*;
 import com.izouma.jiashanxia.dto.*;
@@ -39,10 +38,10 @@ public class OrderInfoService {
     private final UserPackageService   userPackageService;
     private final UserPackageService   userPackageService;
     private final CompanyRepo          companyRepo;
     private final CompanyRepo          companyRepo;
     private final WithdrawService      withdrawService;
     private final WithdrawService      withdrawService;
-    private final UserPackageFlowRepo  userPackageFlowRepo;
     private final UserService          userService;
     private final UserService          userService;
     private final StockRepo            stockRepo;
     private final StockRepo            stockRepo;
     private final SmsService           smsService;
     private final SmsService           smsService;
+    private final ShoppingCartRepo     shoppingCartRepo;
 
 
     public Page<OrderInfo> all(PageQuery pageQuery) {
     public Page<OrderInfo> all(PageQuery pageQuery) {
         pageQuery.setSort("createdAt,desc");
         pageQuery.setSort("createdAt,desc");
@@ -181,51 +180,41 @@ public class OrderInfoService {
         order.setPaidAt(LocalDateTime.now());
         order.setPaidAt(LocalDateTime.now());
         orderInfoRepo.save(order);
         orderInfoRepo.save(order);
 
 
+        Integer num = order.getNum();
         if (ObjectUtil.isNotEmpty(order.getStockId())) {
         if (ObjectUtil.isNotEmpty(order.getStockId())) {
             Stock stock = stockRepo.findById(order.getStockId()).orElseThrow(new BusinessException("无规格"));
             Stock stock = stockRepo.findById(order.getStockId()).orElseThrow(new BusinessException("无规格"));
-            stock.setInventory(stock.getInventory() - order.getNum());
+            // 减库存
+            stock.setInventory(stock.getInventory() - num);
+            // 加销量
+            stock.setSale(stock.getSale() + num);
             stockRepo.save(stock);
             stockRepo.save(stock);
         }
         }
+        Package aPackage = packageRepo.findById(order.getPackageId()).orElseThrow(new BusinessException("无套餐"));
+        aPackage.setSale(aPackage.getSale() + num);
+        aPackage.setInventory(aPackage.getInventory() - num);
 
 
         Long userId = order.getUserId();
         Long userId = order.getUserId();
 
 
-        // 套餐内商品
-        List<PackageGoods> packageGoodsList = packageGoodsRepo.findAllByPackageId(order.getPackageId());
+
         if (order.isRepeatedly()) {
         if (order.isRepeatedly()) {
+            // 套餐内商品
+            List<PackageGoods> packageGoodsList = packageGoodsRepo.findAllByPackageId(order.getPackageId());
             // 多次使用加入套餐余额
             // 多次使用加入套餐余额
-            userPackageService.joinUserPackage1(userId, packageGoodsList, order.getNum());
+            userPackageService.joinUserPackage1(userId, packageGoodsList, num);
         }
         }
         // 记录套餐流水 (没有*数量)
         // 记录套餐流水 (没有*数量)
-        List<GoodsDTO> goodsDTOS = JSONObject.parseArray(JSONObject.toJSONString(packageGoodsList), GoodsDTO.class);
-        userPackageFlowRepo.save(UserPackageFlow.builder()
-                .userId(userId)
-                .type(FlowType.BUY)
-                .orderInfoId(orderInfoId)
-                .content(goodsDTOS)
-                .build());
+//        List<GoodsDTO> goodsDTOS = JSONObject.parseArray(JSONObject.toJSONString(packageGoodsList), GoodsDTO.class);
+//        userPackageFlowRepo.save(UserPackageFlow.builder()
+//                .userId(userId)
+//                .type(FlowType.BUY)
+//                .orderInfoId(orderInfoId)
+//                .content(goodsDTOS)
+//                .build());
 
 
-        // 用户id和上级id相同
-//        if (!userId.equals(parent)) {
-//            // 如果是别人分享的链接购买的
-//            if (ObjectUtil.isNotEmpty(order.getParentUserId())) {
-//                parent = order.getParentUserId();
-//                // 是否设为上级
-//                if (ObjectUtil.isEmpty(user.getParent())) {
-//                    List<OrderInfo> orderInfos = orderInfoRepo.findAllByUserId(userId);
-//                    long count = orderInfos.stream()
-//                            .filter(orderInfo -> !OrderInfoStatus.UNPAID.equals(orderInfo.getStatus()) || !OrderInfoStatus.CANCELLED
-//                                    .equals(orderInfo.getStatus()))
-//                            .count();
-//                    if (count <= 0) {
-//                        user.setParent(parent);
-//                        userRepo.save(user);
-//                    }
-//                }
-//            }
-//        }
         // 上级分销
         // 上级分销
         this.distribution2(order);
         this.distribution2(order);
-        User user = order.getUser();
+        // 短信通知
+//        User user = order.getUser();
 //        if (ObjectUtil.isNotNull(user.getPhone())) {
 //        if (ObjectUtil.isNotNull(user.getPhone())) {
 //            smsService.sendNotification(user.getPhone(), order.getName(), order.getOrderNumber());
 //            smsService.sendNotification(user.getPhone(), order.getName(), order.getOrderNumber());
 //        }
 //        }
@@ -247,7 +236,7 @@ public class OrderInfoService {
             case SHIPPED:
             case SHIPPED:
                 throw new BusinessException("订单已发货,无法取消");
                 throw new BusinessException("订单已发货,无法取消");
             case RECEIVED:
             case RECEIVED:
-                throw new BusinessException("订单已收,无法取消");
+                throw new BusinessException("订单已收,无法取消");
             case CANCELLED:
             case CANCELLED:
                 return orderInfo;
                 return orderInfo;
         }
         }
@@ -669,5 +658,30 @@ public class OrderInfoService {
         }), JpaUtils.toPageRequest(pageQuery));
         }), JpaUtils.toPageRequest(pageQuery));
     }
     }
 
 
+    /*
+    购物车一起付款
+     */
+    public void batchByCart(List<Long> shoppingCartIds,PayMethod payMethod) {
+        List<ShoppingCart> carts = shoppingCartRepo.findAllById(shoppingCartIds);
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        String localTime = df.format(LocalDateTime.now());
+        carts.forEach(cart -> {
+            OrderInfo orderInfo = new OrderInfo();
+            BeanUtil.copyProperties(cart, orderInfo);
+            orderInfo.setStatus(OrderInfoStatus.UNPAID);
+            orderInfo.setPayMethod(payMethod);
+            // 订单号
+            String orderNum = String.format("%05d", orderInfoRepo.orderNum() + 1);
+            orderInfo.setOrderNumber(localTime + orderNum);
+            // 规格
+            if (ObjectUtil.isNotNull(cart.getStockId())) {
+                Stock stock = stockRepo.findById(cart.getStockId()).orElseThrow(new BusinessException("无规格"));
+                orderInfo.setSpecification(stock.getSpecification());
+                orderInfo.setDay(stock.getDay());
+                orderInfo.setPrice(stock.getPrice());
+            }
+            orderInfoRepo.save(orderInfo);
+        });
+    }
 
 
 }
 }

+ 30 - 6
src/main/java/com/izouma/jiashanxia/service/PackageService.java

@@ -1,8 +1,11 @@
 package com.izouma.jiashanxia.service;
 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.ObjectUtil;
 import com.izouma.jiashanxia.domain.*;
 import com.izouma.jiashanxia.domain.*;
 import com.izouma.jiashanxia.domain.Package;
 import com.izouma.jiashanxia.domain.Package;
+import com.izouma.jiashanxia.dto.PackageVO;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.enums.AuthorityName;
 import com.izouma.jiashanxia.enums.AuthorityName;
 import com.izouma.jiashanxia.enums.OrderInfoStatus;
 import com.izouma.jiashanxia.enums.OrderInfoStatus;
@@ -19,6 +22,8 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatter;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.List;
 import java.util.Set;
 import java.util.Set;
 
 
@@ -27,12 +32,13 @@ import java.util.Set;
 @AllArgsConstructor
 @AllArgsConstructor
 public class PackageService {
 public class PackageService {
 
 
-    private PackageRepo        packageRepo;
-    private PackageGoodsRepo   packageGoodsRepo;
-    private UserPackageService userPackageService;
-    private CompanyRepo        companyRepo;
-    private UserRepo           userRepo;
-    private OrderInfoRepo      orderInfoRepo;
+    private final PackageRepo        packageRepo;
+    private final PackageGoodsRepo   packageGoodsRepo;
+    private final UserPackageService userPackageService;
+    private final CompanyRepo        companyRepo;
+    private final UserRepo           userRepo;
+    private final OrderInfoRepo      orderInfoRepo;
+    private final StockRepo          stockRepo;
 
 
     public Page<Package> all(PageQuery pageQuery) {
     public Page<Package> all(PageQuery pageQuery) {
         return packageRepo.findAll(JpaUtils.toSpecification(pageQuery, Package.class), JpaUtils.toPageRequest(pageQuery));
         return packageRepo.findAll(JpaUtils.toSpecification(pageQuery, Package.class), JpaUtils.toPageRequest(pageQuery));
@@ -117,5 +123,23 @@ public class PackageService {
         userPackageService.joinUserPackage(userId, setGoodsList, num, PackageType.TEAM);
         userPackageService.joinUserPackage(userId, setGoodsList, num, PackageType.TEAM);
     }
     }
 
 
+    /*
+    转VO
+     */
+    public PackageVO toVO(Package aPackage) {
+        PackageVO vo = new PackageVO();
+        BeanUtil.copyProperties(aPackage, vo);
+
 
 
+        List<Stock> stocks = stockRepo.findAllByPackageId(aPackage.getId());
+        if (CollUtil.isNotEmpty(stocks)) {
+            stocks.sort(Comparator.comparing(Stock::getPrice));
+            Stock min = stocks.get(0);
+            Stock max = stocks.get(stocks.size() - 1);
+            vo.setAmount(min.getPrice() + " - " + max.getPrice());
+            vo.setAmount(min.getOriginalPrice() + " - " + max.getOriginalPrice());
+            vo.setStocks(stocks);
+        }
+        return vo;
+    }
 }
 }

+ 57 - 0
src/main/java/com/izouma/jiashanxia/service/ShoppingCartService.java

@@ -0,0 +1,57 @@
+package com.izouma.jiashanxia.service;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.izouma.jiashanxia.domain.Package;
+import com.izouma.jiashanxia.domain.ShoppingCart;
+import com.izouma.jiashanxia.domain.Stock;
+import com.izouma.jiashanxia.dto.CreateCart;
+import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.exception.BusinessException;
+import com.izouma.jiashanxia.repo.PackageRepo;
+import com.izouma.jiashanxia.repo.ShoppingCartRepo;
+import com.izouma.jiashanxia.repo.StockRepo;
+import com.izouma.jiashanxia.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class ShoppingCartService {
+
+    private final ShoppingCartRepo shoppingCartRepo;
+    private final StockRepo        stockRepo;
+    private final PackageRepo      packageRepo;
+
+    public Page<ShoppingCart> all(PageQuery pageQuery) {
+        return shoppingCartRepo.findAll(JpaUtils.toSpecification(pageQuery, ShoppingCart.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    public ShoppingCart save(CreateCart createCart, Long userId) {
+        ShoppingCart cart = new ShoppingCart();
+        BeanUtil.copyProperties(createCart, cart);
+        cart.setUserId(userId);
+        if (ObjectUtil.isNotNull(createCart.getStockId())) {
+            Stock stock = stockRepo.findById(createCart.getStockId()).orElseThrow(new BusinessException("无规格"));
+            cart.setPrice(stock.getPrice());
+        }
+        Package aPackage = packageRepo.findById(createCart.getPackageId()).orElseThrow(new BusinessException("无套餐"));
+        this.getMust(aPackage, createCart.getRealName(), createCart.getBuyPhone(), createCart.getIDNo());
+        return shoppingCartRepo.save(cart);
+    }
+
+    public void getMust(Package aPackage, String realName, String buyPhone, String IDNo) {
+
+        if (aPackage.isRealName() && StrUtil.isEmpty(realName)) {
+            throw new BusinessException("请填写真实姓名");
+        }
+        if (aPackage.isBuyPhone() && StrUtil.isEmpty(buyPhone)) {
+            throw new BusinessException("请填写手机号");
+        }
+        if (aPackage.isIDNo() && StrUtil.isEmpty(IDNo)) {
+            throw new BusinessException("请填写身份证信息");
+        }
+    }
+}

+ 10 - 39
src/main/java/com/izouma/jiashanxia/service/UserPackageFlowService.java

@@ -126,9 +126,9 @@ public class UserPackageFlowService {
     核销
     核销
     */
     */
     public UserPackageFlow writeOff(WriteOffSaveVO writeOffSaveVO) {
     public UserPackageFlow writeOff(WriteOffSaveVO writeOffSaveVO) {
-        if (writeOffSaveVO.getUserId().equals(writeOffSaveVO.getWriteOffUserId())) {
-            throw new BusinessException("不可自己核销自己");
-        }
+//        if (writeOffSaveVO.getUserId().equals(writeOffSaveVO.getWriteOffUserId())) {
+//            throw new BusinessException("不可自己核销自己");
+//        }
 
 
         // 用户已有套餐
         // 用户已有套餐
         Map<Long, UserPackage> userPackageMap = userPackageRepo.findAllByUserId(writeOffSaveVO.getUserId())
         Map<Long, UserPackage> userPackageMap = userPackageRepo.findAllByUserId(writeOffSaveVO.getUserId())
@@ -153,14 +153,11 @@ public class UserPackageFlowService {
             goodsDTO.setNum(-goodsDTO.getNum());
             goodsDTO.setNum(-goodsDTO.getNum());
         });
         });
 
 
-        // 保存套餐流水
         return userPackageFlowRepo.save(
         return userPackageFlowRepo.save(
                 UserPackageFlow.builder()
                 UserPackageFlow.builder()
                         .userId(writeOffSaveVO.getUserId())
                         .userId(writeOffSaveVO.getUserId())
                         .content(goodsDTOS)
                         .content(goodsDTOS)
                         .type(FlowType.WRITE_OFF)
                         .type(FlowType.WRITE_OFF)
-//                        .userPackagePeriodId(writeOffSaveVO.getUserPackagePeriodId())
-//                        .packageType(writeOffSaveVO.getType())
                         .writeOffUserId(writeOffSaveVO.getWriteOffUserId())
                         .writeOffUserId(writeOffSaveVO.getWriteOffUserId())
                         .build());
                         .build());
     }
     }
@@ -173,6 +170,8 @@ public class UserPackageFlowService {
             throw new BusinessException("不可自己核销自己");
             throw new BusinessException("不可自己核销自己");
         }
         }
         Long orderInfoId = writeOffSaveVO.getOrderInfoId();
         Long orderInfoId = writeOffSaveVO.getOrderInfoId();
+
+        // 核销订单类的
         if (ObjectUtil.isNotEmpty(orderInfoId)) {
         if (ObjectUtil.isNotEmpty(orderInfoId)) {
             OrderInfo orderInfo = orderInfoRepo.findById(orderInfoId)
             OrderInfo orderInfo = orderInfoRepo.findById(orderInfoId)
                     .orElseThrow(new BusinessException("无订单"));
                     .orElseThrow(new BusinessException("无订单"));
@@ -183,8 +182,8 @@ public class UserPackageFlowService {
 //            orderInfo.setUse(true);
 //            orderInfo.setUse(true);
             orderInfo.setStatus(OrderInfoStatus.USED);
             orderInfo.setStatus(OrderInfoStatus.USED);
             orderInfoRepo.save(orderInfo);
             orderInfoRepo.save(orderInfo);
-            UserPackageFlow flow = userPackageFlowRepo.findByOrderInfoId(orderInfoId);
-            flow.getContent().forEach(goods -> goods.setNum(-goods.getNum()));
+//            UserPackageFlow flow = userPackageFlowRepo.findByOrderInfoId(orderInfoId);
+//            flow.getContent().forEach(goods -> goods.setNum(-goods.getNum()));
 
 
             // 上级分销变 可提现
             // 上级分销变 可提现
             commissionRecordService.canWithdraw(orderInfoId);
             commissionRecordService.canWithdraw(orderInfoId);
@@ -192,41 +191,13 @@ public class UserPackageFlowService {
             return userPackageFlowRepo.save(
             return userPackageFlowRepo.save(
                     UserPackageFlow.builder()
                     UserPackageFlow.builder()
                             .userId(writeOffSaveVO.getUserId())
                             .userId(writeOffSaveVO.getUserId())
-                            .content(flow.getContent())
+//                            .content(flow.getContent())
                             .type(FlowType.WRITE_OFF)
                             .type(FlowType.WRITE_OFF)
                             .writeOffUserId(writeOffSaveVO.getWriteOffUserId())
                             .writeOffUserId(writeOffSaveVO.getWriteOffUserId())
                             .build());
                             .build());
         }
         }
-        // 用户已有套餐
-        Map<Long, UserPackage> userPackageMap = userPackageRepo.findAllByUserId(writeOffSaveVO.getUserId())
-                .stream()
-                .collect(Collectors.toMap(UserPackage::getGoodsInfoId, userPackage -> userPackage));
-
-        List<GoodsDTO> goodsDTOS = JSONObject.parseArray(writeOffSaveVO.getContent(), GoodsDTO.class);
-        goodsDTOS.forEach(goodsDTO -> {
-            UserPackage userPackage = userPackageMap.get(goodsDTO.getGoodsInfoId());
-            if (ObjectUtil.isEmpty(userPackage)) {
-                throw new BusinessException("无此项目");
-            }
-            if (userPackage.getNum() <= 0) {
-                throw new BusinessException("无余额");
-            }
-            if (goodsDTO.getNum() > userPackage.getNum()) {
-                throw new BusinessException("核销数量大于套餐数量");
-            }
-            userPackage.setNum(userPackage.getNum() - goodsDTO.getNum());
-
-            userPackageRepo.save(userPackage);
-            goodsDTO.setNum(-goodsDTO.getNum());
-        });
-
-        return userPackageFlowRepo.save(
-                UserPackageFlow.builder()
-                        .userId(writeOffSaveVO.getUserId())
-                        .content(goodsDTOS)
-                        .type(FlowType.WRITE_OFF)
-                        .writeOffUserId(writeOffSaveVO.getWriteOffUserId())
-                        .build());
+        // 余额类的
+        return this.writeOff(writeOffSaveVO);
     }
     }
 
 
     public WriteOffRecordDTO getDTO(Long id) {
     public WriteOffRecordDTO getDTO(Long id) {

+ 10 - 3
src/main/java/com/izouma/jiashanxia/service/UserService.java

@@ -450,7 +450,7 @@ public class UserService {
     public Page<UserDTO> children(PageQuery pageQuery) {
     public Page<UserDTO> children(PageQuery pageQuery) {
         Map<String, Object> query = pageQuery.getQuery();
         Map<String, Object> query = pageQuery.getQuery();
 
 
-        Long parent = JpaUtils.getLong(query,"parent");
+        Long parent = JpaUtils.getLong(query, "parent");
 
 
 //        List<Long> users = userRepo.findIdByParentAndDelFalse(parent);
 //        List<Long> users = userRepo.findIdByParentAndDelFalse(parent);
         List<User> users;
         List<User> users;
@@ -464,13 +464,20 @@ public class UserService {
         }
         }
 
 
         Map<Long, String> parentMap = children.stream().collect(Collectors.toMap(User::getId, User::getNickname));
         Map<Long, String> parentMap = children.stream().collect(Collectors.toMap(User::getId, User::getNickname));
+        User user1 = userRepo.findById(parent).orElseThrow(new BusinessException("无用户"));
 
 
         query.remove("parent");
         query.remove("parent");
         return userRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
         return userRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
             List<Predicate> and = JpaUtils.toPredicates(pageQuery, User.class, root, criteriaQuery, criteriaBuilder);
             List<Predicate> and = JpaUtils.toPredicates(pageQuery, User.class, root, criteriaQuery, criteriaBuilder);
-            and.add(root.get("parent").in(parentMap.keySet()));
+            and.add(root.get("id").in(parentMap.keySet()));
             return criteriaBuilder.and(and.toArray(new Predicate[0]));
             return criteriaBuilder.and(and.toArray(new Predicate[0]));
-        }), JpaUtils.toPageRequest(pageQuery)).map(user -> new UserDTO(user, parentMap.get(user.getParent()), null));
+        }), JpaUtils.toPageRequest(pageQuery)).map(user -> {
+            String nickname = parentMap.get(user.getParent());
+            if (nickname == null) {
+                nickname = user1.getNickname();
+            }
+            return new UserDTO(user, nickname, null);
+        });
     }
     }
 
 
     /*
     /*

+ 7 - 0
src/main/java/com/izouma/jiashanxia/service/WithdrawService.java

@@ -43,6 +43,7 @@ public class WithdrawService {
     private final CommissionRecordRepo commissionRecordRepo;
     private final CommissionRecordRepo commissionRecordRepo;
     private final WxPayService         wxPayService;
     private final WxPayService         wxPayService;
     private final WxFeeRepo            wxFeeRepo;
     private final WxFeeRepo            wxFeeRepo;
+    private final SysConfigService     sysConfigService;
 
 
     public Page<Withdraw> all(PageQuery pageQuery) {
     public Page<Withdraw> all(PageQuery pageQuery) {
         pageQuery.setSort("createdAt,desc");
         pageQuery.setSort("createdAt,desc");
@@ -85,6 +86,12 @@ public class WithdrawService {
         if (amount.compareTo(user.getAmount()) > 0) {
         if (amount.compareTo(user.getAmount()) > 0) {
             throw new BusinessException("提现金额大于余额");
             throw new BusinessException("提现金额大于余额");
         }
         }
+        // 最低提现金额
+        BigDecimal minWithdraw = sysConfigService.getBigDecimal("MIN_WITHDRAW");
+        if (amount.compareTo(minWithdraw) < 0) {
+            throw new BusinessException("提现金额必须大于" + minWithdraw);
+        }
+
         // 先扣款
         // 先扣款
         BigDecimal subtract = user.getAmount().subtract(amount);
         BigDecimal subtract = user.getAmount().subtract(amount);
         user.setAmount(subtract);
         user.setAmount(subtract);

+ 66 - 0
src/main/java/com/izouma/jiashanxia/web/AddressController.java

@@ -0,0 +1,66 @@
+package com.izouma.jiashanxia.web;
+
+import com.izouma.jiashanxia.domain.Address;
+import com.izouma.jiashanxia.service.AddressService;
+import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.exception.BusinessException;
+import com.izouma.jiashanxia.repo.AddressRepo;
+import com.izouma.jiashanxia.utils.ObjUtils;
+import com.izouma.jiashanxia.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/address")
+@AllArgsConstructor
+public class AddressController extends BaseController {
+    private final AddressService addressService;
+    private final AddressRepo    addressRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public Address save(@RequestBody Address record) {
+        if (record.getId() != null) {
+            Address orig = addressRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            record = addressRepo.save(orig);
+        } else {
+            record = addressRepo.save(record);
+        }
+        if (record.getIsDefault()) {
+            addressRepo.updateDefault(record.getUserId(), record.getId());
+        }
+        return record;
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<Address> all(@RequestBody PageQuery pageQuery) {
+        return addressService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public Address get(@PathVariable Long id) {
+        return addressRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        addressRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<Address> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 9 - 1
src/main/java/com/izouma/jiashanxia/web/OrderInfoController.java

@@ -1,5 +1,6 @@
 package com.izouma.jiashanxia.web;
 package com.izouma.jiashanxia.web;
 
 
+import com.izouma.jiashanxia.converter.LongArrayConverter;
 import com.izouma.jiashanxia.domain.OrderInfo;
 import com.izouma.jiashanxia.domain.OrderInfo;
 import com.izouma.jiashanxia.dto.CreateOrder;
 import com.izouma.jiashanxia.dto.CreateOrder;
 import com.izouma.jiashanxia.dto.OrderInfoVO;
 import com.izouma.jiashanxia.dto.OrderInfoVO;
@@ -75,7 +76,7 @@ public class OrderInfoController extends BaseController {
     @ApiOperation("创建订单")
     @ApiOperation("创建订单")
     public OrderInfo create(@RequestBody CreateOrder order) {
     public OrderInfo create(@RequestBody CreateOrder order) {
 //        return orderInfoService.createOrder(SecurityUtils.getAuthenticatedUser().getId(), packageId, payMethod);
 //        return orderInfoService.createOrder(SecurityUtils.getAuthenticatedUser().getId(), packageId, payMethod);
-        return orderInfoService.createOrder1(order,SecurityUtils.getAuthenticatedUser().getId());
+        return orderInfoService.createOrder1(order, SecurityUtils.getAuthenticatedUser().getId());
     }
     }
 
 
     @PostMapping("/cancel")
     @PostMapping("/cancel")
@@ -98,5 +99,12 @@ public class OrderInfoController extends BaseController {
     public Page<OrderInfo> children(@RequestBody PageQuery pageQuery) {
     public Page<OrderInfo> children(@RequestBody PageQuery pageQuery) {
         return orderInfoService.children(pageQuery);
         return orderInfoService.children(pageQuery);
     }
     }
+
+    @ApiOperation("多个购物车下单")
+    public void batchByCart(String cartIds, PayMethod payMethod) {
+        LongArrayConverter converter = new LongArrayConverter();
+        List<Long> shoppingCart = converter.convertToEntityAttribute(cartIds);
+        orderInfoService.batchByCart(shoppingCart, payMethod);
+    }
 }
 }
 
 

+ 60 - 0
src/main/java/com/izouma/jiashanxia/web/ShoppingCartController.java

@@ -0,0 +1,60 @@
+package com.izouma.jiashanxia.web;
+import com.izouma.jiashanxia.domain.ShoppingCart;
+import com.izouma.jiashanxia.service.ShoppingCartService;
+import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.exception.BusinessException;
+import com.izouma.jiashanxia.repo.ShoppingCartRepo;
+import com.izouma.jiashanxia.utils.ObjUtils;
+import com.izouma.jiashanxia.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/shoppingCart")
+@AllArgsConstructor
+public class ShoppingCartController extends BaseController {
+    private ShoppingCartService shoppingCartService;
+    private ShoppingCartRepo shoppingCartRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public ShoppingCart save(@RequestBody ShoppingCart record) {
+        if (record.getId() != null) {
+            ShoppingCart orig = shoppingCartRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return shoppingCartRepo.save(orig);
+        }
+        return shoppingCartRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<ShoppingCart> all(@RequestBody PageQuery pageQuery) {
+        return shoppingCartService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public ShoppingCart get(@PathVariable Long id) {
+        return shoppingCartRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        shoppingCartRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<ShoppingCart> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 1 - 0
src/main/resources/genjson/Address.json

@@ -0,0 +1 @@
+{"tableName":"Address","className":"Address","remark":"用户地址","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/jiashanxia/src/main/java/com/izouma/jiashanxia","viewPath":"/Users/qiufangchao/Desktop/project/jiashanxia/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/jiashanxia/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/jiashanxia/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"userId","modelName":"userId","remark":"userId","showInList":true,"showInForm":true,"formType":"number"},{"name":"name","modelName":"name","remark":"姓名","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"phone","modelName":"phone","remark":"电话","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"province","modelName":"province","remark":"省","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"city","modelName":"city","remark":"市","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"address","modelName":"address","remark":"详细地址","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"isDefault","modelName":"isDefault","remark":"默认地址","showInList":true,"showInForm":true,"formType":"switch"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.jiashanxia","tablePackage":"com.izouma.jiashanxia.domain.Address"}

文件差異過大導致無法顯示
+ 0 - 0
src/main/resources/genjson/ShoppingCart.json


+ 32 - 9
src/main/vue/src/components/PackageEdit.vue

@@ -7,7 +7,7 @@
             label-width="90px"
             label-width="90px"
             label-position="right"
             label-position="right"
             size="small"
             size="small"
-            style="max-width: 800px;"
+            style="max-width: 900px;"
         >
         >
             <el-form-item prop="attractionsId" label="景区">
             <el-form-item prop="attractionsId" label="景区">
                 <el-select
                 <el-select
@@ -83,11 +83,11 @@
                 <div v-for="(item, index) in stockList" :key="index">
                 <div v-for="(item, index) in stockList" :key="index">
                     <div class="spec" v-if="!item.del">
                     <div class="spec" v-if="!item.del">
                         <el-row>
                         <el-row>
-                            <el-col :span="10">
+                            <el-col :span="8">
                                 <span>规格</span>
                                 <span>规格</span>
                                 <el-input placeholder="规格" class="input" v-model="item.specification"></el-input>
                                 <el-input placeholder="规格" class="input" v-model="item.specification"></el-input>
                             </el-col>
                             </el-col>
-                            <el-col :span="10">
+                            <el-col :span="8">
                                 <span>日期</span>
                                 <span>日期</span>
                                 <el-date-picker
                                 <el-date-picker
                                     type="date"
                                     type="date"
@@ -98,9 +98,7 @@
                                 >
                                 >
                                 </el-date-picker>
                                 </el-date-picker>
                             </el-col>
                             </el-col>
-                        </el-row>
-                        <el-row>
-                            <el-col :span="10">
+                            <el-col :span="8">
                                 <span>库存</span>
                                 <span>库存</span>
                                 <el-input-number
                                 <el-input-number
                                     type="number"
                                     type="number"
@@ -109,7 +107,18 @@
                                     v-model="item.inventory"
                                     v-model="item.inventory"
                                 ></el-input-number>
                                 ></el-input-number>
                             </el-col>
                             </el-col>
-                            <el-col :span="10">
+                        </el-row>
+                        <el-row>
+                            <el-col :span="8">
+                                <span>原价</span>
+                                <el-input-number
+                                    type="number"
+                                    :min="0"
+                                    class="input"
+                                    v-model="item.originalPrice"
+                                ></el-input-number>
+                            </el-col>
+                            <el-col :span="8">
                                 <span>价格</span>
                                 <span>价格</span>
                                 <el-input-number
                                 <el-input-number
                                     type="number"
                                     type="number"
@@ -208,7 +217,7 @@
                 <crop-upload v-model="formData.poster"></crop-upload>
                 <crop-upload v-model="formData.poster"></crop-upload>
             </el-form-item>
             </el-form-item>
             <el-form-item label="小程序海报" prop="smallPoster">
             <el-form-item label="小程序海报" prop="smallPoster">
-                <crop-upload v-model="formData.smallPoster"></crop-upload>
+                <multi-upload v-model="formData.smallPoster"></multi-upload>
             </el-form-item>
             </el-form-item>
             <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-if="$route.query.id">保存</el-button>
@@ -365,6 +374,7 @@ export default {
                 .then(res => {
                 .then(res => {
                     this.saving = false;
                     this.saving = false;
                     // this.$message.success('成功');
                     // this.$message.success('成功');
+                    this.packageId = res.id;
                     this.$nextTick(() => {
                     this.$nextTick(() => {
                         this.$http.post('/stock/batchSave', {
                         this.$http.post('/stock/batchSave', {
                             stocks: this.saveOtherJson
                             stocks: this.saveOtherJson
@@ -479,9 +489,22 @@ export default {
         padding: 0 15px 0 15px;
         padding: 0 15px 0 15px;
     }
     }
     .input {
     .input {
-        width: 200px;
+        width: 180px;
         margin: 0 10px 5px 0;
         margin: 0 10px 5px 0;
     }
     }
+    .el-button {
+        height: 34px;
+        border-width: 0;
+        margin-right: 30px;
+        float: right;
+
+        &.del {
+            width: 34px;
+            padding: 9px 5px;
+            font-size: 16px;
+            margin-left: 10px;
+        }
+    }
 }
 }
 .stock {
 .stock {
     display: flex;
     display: flex;

+ 21 - 0
src/main/vue/src/mixins/getInfo.js

@@ -0,0 +1,21 @@
+import { mapState } from 'vuex';
+
+export default {
+    computed: {
+        ...mapState(['userInfo'])
+    },
+    methods: {
+        getAdmin() {
+            let data = this.userInfo.authorities;
+            for (let item in data) {
+                if (data[item].name === 'ROLE_ADMIN') {
+                    return true;
+                }
+            }
+            return false;
+        },
+        getUserAttractions() {
+            return this.userInfo.attractionsId;
+        }
+    }
+};

+ 41 - 0
src/main/vue/src/router.js

@@ -96,6 +96,15 @@ const router = new Router({
                         title: '员工列表'
                         title: '员工列表'
                     }
                     }
                 },
                 },
+                {
+                    path: '/writeOffUserList2',
+                    name: 'WriteOffUserList2',
+                    component: () =>
+                        import(/* webpackChunkName: "writeOffUserList" */ '@/views/attractions/WriteOffUserList2.vue'),
+                    meta: {
+                        title: '员工列表'
+                    }
+                },
                 {
                 {
                     path: '/employeeDashboard',
                     path: '/employeeDashboard',
                     name: 'employeeDashboard',
                     name: 'employeeDashboard',
@@ -474,6 +483,38 @@ const router = new Router({
                     meta: {
                     meta: {
                         title: '用户优惠券'
                         title: '用户优惠券'
                     }
                     }
+                },
+                {
+                    path: '/addressEdit',
+                    name: 'AddressEdit',
+                    component: () => import(/* webpackChunkName: "addressEdit" */ '@/views/AddressEdit.vue'),
+                    meta: {
+                        title: '用户地址编辑'
+                    }
+                },
+                {
+                    path: '/addressList',
+                    name: 'AddressList',
+                    component: () => import(/* webpackChunkName: "addressList" */ '@/views/AddressList.vue'),
+                    meta: {
+                        title: '用户地址'
+                    }
+                },
+                {
+                    path: '/shoppingCartEdit',
+                    name: 'ShoppingCartEdit',
+                    component: () => import(/* webpackChunkName: "shoppingCartEdit" */ '@/views/ShoppingCartEdit.vue'),
+                    meta: {
+                        title: '购物车编辑'
+                    }
+                },
+                {
+                    path: '/shoppingCartList',
+                    name: 'ShoppingCartList',
+                    component: () => import(/* webpackChunkName: "shoppingCartList" */ '@/views/ShoppingCartList.vue'),
+                    meta: {
+                        title: '购物车'
+                    }
                 }
                 }
                 /**INSERT_LOCATION**/
                 /**INSERT_LOCATION**/
             ]
             ]

+ 110 - 0
src/main/vue/src/views/AddressEdit.vue

@@ -0,0 +1,110 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="80px"
+            label-position="right"
+            size="small"
+            style="max-width: 500px;"
+        >
+            <el-form-item prop="userId" label="userId">
+                <el-input-number type="number" v-model="formData.userId"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="name" label="姓名">
+                <el-input v-model="formData.name"></el-input>
+            </el-form-item>
+            <el-form-item prop="phone" label="电话">
+                <el-input v-model="formData.phone"></el-input>
+            </el-form-item>
+            <el-form-item prop="province" label="省">
+                <el-input v-model="formData.province"></el-input>
+            </el-form-item>
+            <el-form-item prop="city" label="市">
+                <el-input v-model="formData.city"></el-input>
+            </el-form-item>
+            <el-form-item prop="address" label="详细地址">
+                <el-input v-model="formData.address"></el-input>
+            </el-form-item>
+            <el-form-item prop="isDefault" label="默认地址">
+                <el-switch v-model="formData.isDefault"></el-switch>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'AddressEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('address/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {}
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+
+            this.saving = true;
+            this.$http
+                .post('/address/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/address/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 166 - 0
src/main/vue/src/views/AddressList.vue

@@ -0,0 +1,166 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="userId" label="userId"> </el-table-column>
+            <el-table-column prop="name" label="姓名"> </el-table-column>
+            <el-table-column prop="phone" label="电话"> </el-table-column>
+            <el-table-column prop="province" label="省"> </el-table-column>
+            <el-table-column prop="city" label="市"> </el-table-column>
+            <el-table-column prop="address" label="详细地址"> </el-table-column>
+            <el-table-column prop="isDefault" label="默认地址">
+                <template slot-scope="{ row }">
+                    <el-tag :type="row.isDefault ? '' : 'info'">{{ row.isDefault }}</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'AddressList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/address/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/addressEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/addressEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/address/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/address/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 8 - 2
src/main/vue/src/views/CouponEdit.vue

@@ -4,10 +4,10 @@
             :model="formData"
             :model="formData"
             :rules="rules"
             :rules="rules"
             ref="form"
             ref="form"
-            label-width="66px"
+            label-width="80px"
             label-position="right"
             label-position="right"
             size="small"
             size="small"
-            style="max-width: 500px;"
+            style="max-width: 600px;"
         >
         >
             <el-form-item prop="attractionsId" label="品牌">
             <el-form-item prop="attractionsId" label="品牌">
                 <el-select v-model="formData.attractionsId" clearable filterable placeholder="请选择">
                 <el-select v-model="formData.attractionsId" clearable filterable placeholder="请选择">
@@ -23,6 +23,9 @@
             <el-form-item prop="name" label="名称">
             <el-form-item prop="name" label="名称">
                 <el-input v-model="formData.name"></el-input>
                 <el-input v-model="formData.name"></el-input>
             </el-form-item>
             </el-form-item>
+            <el-form-item prop="title" label="小标题">
+                <el-input v-model="formData.title"></el-input>
+            </el-form-item>
             <el-form-item prop="price" label="价格">
             <el-form-item prop="price" label="价格">
                 <el-input-number type="number" v-model="formData.price"></el-input-number>
                 <el-input-number type="number" v-model="formData.price"></el-input-number>
             </el-form-item>
             </el-form-item>
@@ -38,6 +41,9 @@
                 >
                 >
                 </el-date-picker>
                 </el-date-picker>
             </el-form-item>
             </el-form-item>
+            <el-form-item prop="store" label="适用门店">
+                <el-input v-model="formData.store"></el-input>
+            </el-form-item>
             <el-form-item>
             <el-form-item>
                 <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
                 <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
                 <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
                 <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>

+ 33 - 11
src/main/vue/src/views/CouponList.vue

@@ -12,7 +12,14 @@
                 class="filter-item"
                 class="filter-item"
                 >导出EXCEL
                 >导出EXCEL
             </el-button> -->
             </el-button> -->
-            <el-select v-model="attractionsId" clearable filterable placeholder="请选择景区/品牌" @change="getData">
+            <el-select
+                v-model="attractionsId"
+                clearable
+                filterable
+                placeholder="请选择品牌"
+                @change="getData"
+                v-if="display"
+            >
                 <el-option v-for="item in attractionsOptions" :key="item.value" :label="item.label" :value="item.value">
                 <el-option v-for="item in attractionsOptions" :key="item.value" :label="item.label" :value="item.value">
                 </el-option>
                 </el-option>
             </el-select>
             </el-select>
@@ -32,7 +39,7 @@
             <el-table-column prop="attractionsName" label="品牌名称" show-overflow-tooltip> </el-table-column>
             <el-table-column prop="attractionsName" label="品牌名称" show-overflow-tooltip> </el-table-column>
             <el-table-column prop="name" label="名称"> </el-table-column>
             <el-table-column prop="name" label="名称"> </el-table-column>
             <el-table-column prop="price" label="价格"> </el-table-column>
             <el-table-column prop="price" label="价格"> </el-table-column>
-            <el-table-column prop="content" label="详情"> </el-table-column>
+            <el-table-column prop="title" label="小标题"> </el-table-column>
             <el-table-column prop="period" label="有效期"> </el-table-column>
             <el-table-column prop="period" label="有效期"> </el-table-column>
             <el-table-column label="操作" align="center" fixed="right" min-width="150">
             <el-table-column label="操作" align="center" fixed="right" min-width="150">
                 <template slot-scope="{ row }">
                 <template slot-scope="{ row }">
@@ -78,7 +85,8 @@ export default {
             url: '/coupon/all',
             url: '/coupon/all',
             downloading: false,
             downloading: false,
             attractionsOptions: [],
             attractionsOptions: [],
-            attractionsId: ''
+            attractionsId: '',
+            display: false
         };
         };
     },
     },
     created() {
     created() {
@@ -86,7 +94,7 @@ export default {
             this.attractionsId = Number(this.$route.query.id);
             this.attractionsId = Number(this.$route.query.id);
         }
         }
         this.$http
         this.$http
-            .post('/attractions/all', { size: 1000, query: { del: false } }, { body: 'json' })
+            .post('/attractions/all', { size: 1000, query: { del: false, brand: true } }, { body: 'json' })
             .then(res => {
             .then(res => {
                 if (res.content.length > 0) {
                 if (res.content.length > 0) {
                     res.content.forEach(item => {
                     res.content.forEach(item => {
@@ -101,20 +109,25 @@ export default {
                 console.log(e);
                 console.log(e);
                 this.$message.error(e.error);
                 this.$message.error(e.error);
             });
             });
+        this.getAdmin();
     },
     },
     computed: {
     computed: {
         selection() {
         selection() {
             return this.$refs.table.selection.map(i => i.id);
             return this.$refs.table.selection.map(i => i.id);
-        }
+        },
+        ...mapState(['userInfo'])
     },
     },
     methods: {
     methods: {
         beforeGetData() {
         beforeGetData() {
-            return {
-                search: this.search,
-                query: {
-                    attractionsId: this.attractionsId
-                }
-            };
+            let data = { query: {} };
+            if (this.search) {
+                data.search = this.search;
+            }
+            if (!this.display) {
+                this.attractionsId = this.userInfo.attractionsId;
+            }
+            data.query.attractionsId = this.attractionsId;
+            return data;
         },
         },
         toggleMultipleMode(multipleMode) {
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;
             this.multipleMode = multipleMode;
@@ -185,6 +198,15 @@ export default {
                         this.$message.error(e.error);
                         this.$message.error(e.error);
                     }
                     }
                 });
                 });
+        },
+        getAdmin() {
+            let data = this.userInfo.authorities;
+            for (let item in data) {
+                if (data[item].name === 'ROLE_ADMIN') {
+                    this.display = true;
+                    break;
+                }
+            }
         }
         }
     }
     }
 };
 };

+ 39 - 10
src/main/vue/src/views/PackageList.vue

@@ -4,7 +4,14 @@
             <!-- <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
             <!-- <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
             <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button> -->
             <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button> -->
             <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
             <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
-            <el-select v-model="attractionsId" clearable filterable placeholder="请选择景区/品牌" @change="getData">
+            <el-select
+                v-model="attractionsId"
+                clearable
+                filterable
+                placeholder="请选择景区"
+                @change="getData"
+                v-if="display"
+            >
                 <el-option v-for="item in attractionsOptions" :key="item.value" :label="item.label" :value="item.value">
                 <el-option v-for="item in attractionsOptions" :key="item.value" :label="item.label" :value="item.value">
                 </el-option>
                 </el-option>
             </el-select>
             </el-select>
@@ -78,8 +85,9 @@
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
-import { mapState } from 'vuex';
 import pageableTable from '@/mixins/pageableTable';
 import pageableTable from '@/mixins/pageableTable';
+import { mapState } from 'vuex';
+// import getInfo from '@/mixins/getInfo';
 
 
 export default {
 export default {
     name: 'PackageList',
     name: 'PackageList',
@@ -104,6 +112,7 @@ export default {
                 console.log(e);
                 console.log(e);
                 this.$message.error(e.error);
                 this.$message.error(e.error);
             });
             });
+        this.getAdmin();
     },
     },
     data() {
     data() {
         return {
         return {
@@ -116,13 +125,15 @@ export default {
                 { label: '个人', value: 'PERSONAL' }
                 { label: '个人', value: 'PERSONAL' }
             ],
             ],
             attractionsId: '',
             attractionsId: '',
-            attractionsOptions: []
+            attractionsOptions: [],
+            display: false
         };
         };
     },
     },
     computed: {
     computed: {
         selection() {
         selection() {
             return this.$refs.table.selection.map(i => i.id);
             return this.$refs.table.selection.map(i => i.id);
-        }
+        },
+        ...mapState(['userInfo'])
     },
     },
     methods: {
     methods: {
         typeFormatter(row, column, cellValue, index) {
         typeFormatter(row, column, cellValue, index) {
@@ -133,12 +144,21 @@ export default {
             return '';
             return '';
         },
         },
         beforeGetData() {
         beforeGetData() {
-            return {
-                search: this.search,
-                query: {
-                    attractionsId: this.attractionsId || Number(this.$route.query.id)
-                }
-            };
+            // return {
+            //     search: this.search,
+            //     query: {
+            //         attractionsId: this.attractionsId
+            //     }
+            // };
+            let data = { query: {} };
+            if (this.search) {
+                data.search = this.search;
+            }
+            if (!this.display) {
+                this.attractionsId = this.userInfo.attractionsId;
+            }
+            data.query.attractionsId = this.attractionsId;
+            return data;
         },
         },
         toggleMultipleMode(multipleMode) {
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;
             this.multipleMode = multipleMode;
@@ -210,6 +230,15 @@ export default {
                         this.$message.error(e.error);
                         this.$message.error(e.error);
                     }
                     }
                 });
                 });
+        },
+        getAdmin() {
+            let data = this.userInfo.authorities;
+            for (let item in data) {
+                if (data[item].name === 'ROLE_ADMIN') {
+                    this.display = true;
+                    break;
+                }
+            }
         }
         }
     }
     }
 };
 };

+ 145 - 0
src/main/vue/src/views/ShoppingCartEdit.vue

@@ -0,0 +1,145 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="136px"
+            label-position="right"
+            size="small"
+            style="max-width: 500px;"
+        >
+            <el-form-item prop="userId" label="userId">
+                <el-input-number type="number" v-model="formData.userId"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="num" label="数量">
+                <el-input-number type="number" v-model="formData.num"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="packageId" label="套餐">
+                <el-select v-model="formData.packageId" clearable filterable placeholder="请选择">
+                    <el-option
+                        v-for="item in packageIdOptions"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                    >
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="price" label="价钱">
+                <el-input-number type="number" v-model="formData.price"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="parentUserId" label="分享此链接的用户">
+                <el-input-number type="number" v-model="formData.parentUserId"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="specification" label="规格">
+                <el-input v-model="formData.specification"></el-input>
+            </el-form-item>
+            <el-form-item prop="day" label="日期">
+                <el-date-picker v-model="formData.day" type="date" value-format="yyyy-MM-dd" placeholder="选择日期">
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item prop="realName" label="真实姓名">
+                <el-input v-model="formData.realName"></el-input>
+            </el-form-item>
+            <el-form-item prop="IDNo" label="身份证">
+                <el-input v-model="formData.IDNo"></el-input>
+            </el-form-item>
+            <el-form-item prop="buyPhone" label="购买手机">
+                <el-input v-model="formData.buyPhone"></el-input>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'ShoppingCartEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('shoppingCart/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+        this.$http
+            .get('/packageGoods/all', { size: 1000, query: { del: false } })
+            .then(res => {
+                if (res.content.length > 0) {
+                    res.content.forEach(item => {
+                        this.packageIdOptions.push({
+                            label: item.name,
+                            value: item.id
+                        });
+                    });
+                }
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {},
+            packageIdOptions: []
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+
+            this.saving = true;
+            this.$http
+                .post('/shoppingCart/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/shoppingCart/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 165 - 0
src/main/vue/src/views/ShoppingCartList.vue

@@ -0,0 +1,165 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="userId" label="userId"> </el-table-column>
+            <el-table-column prop="num" label="数量"> </el-table-column>
+            <el-table-column prop="packageId" label="套餐"> </el-table-column>
+            <el-table-column prop="price" label="价钱"> </el-table-column>
+            <el-table-column prop="parentUserId" label="分享此链接的用户"> </el-table-column>
+            <el-table-column prop="specification" label="规格"> </el-table-column>
+            <el-table-column prop="day" label="日期"> </el-table-column>
+            <el-table-column prop="realName" label="真实姓名"> </el-table-column>
+            <el-table-column prop="IDNo" label="身份证"> </el-table-column>
+            <el-table-column prop="buyPhone" label="购买手机"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'ShoppingCartList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/shoppingCart/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/shoppingCartEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/shoppingCartEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/shoppingCart/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/shoppingCart/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 2 - 2
src/main/vue/src/views/attractions/AttractionsList.vue

@@ -41,8 +41,8 @@
             <el-table-column prop="address" label="地址"> </el-table-column>
             <el-table-column prop="address" label="地址"> </el-table-column>
             <el-table-column label="操作" align="center" fixed="right" min-width="200">
             <el-table-column label="操作" align="center" fixed="right" min-width="200">
                 <template slot-scope="{ row }">
                 <template slot-scope="{ row }">
-                    <el-button @click="handleCommand1(row.id)" size="mini">套餐</el-button>
-                    <el-button @click="handleCommand(row.id)" size="mini">核销员</el-button>
+                    <!-- <el-button @click="handleCommand1(row.id)" size="mini">套餐</el-button> -->
+                    <!-- <el-button @click="handleCommand(row.id)" size="mini">核销员</el-button> -->
                     <el-button @click="handleCommand2(row.id)" size="mini">订单</el-button>
                     <el-button @click="handleCommand2(row.id)" size="mini">订单</el-button>
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
                     <!-- <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button> -->
                     <!-- <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button> -->

+ 17 - 3
src/main/vue/src/views/attractions/UserCouponList.vue

@@ -3,7 +3,7 @@
         <div class="filters-container">
         <div class="filters-container">
             <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
             <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
             <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
             <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
-            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <!-- <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button> -->
             <!-- <el-button
             <!-- <el-button
                 @click="download"
                 @click="download"
                 type="primary"
                 type="primary"
@@ -74,16 +74,18 @@ export default {
             search: '',
             search: '',
             url: '/userCoupon/backAll',
             url: '/userCoupon/backAll',
             downloading: false,
             downloading: false,
-            attractionsId: 0
+            display: false
         };
         };
     },
     },
     computed: {
     computed: {
         selection() {
         selection() {
             return this.$refs.table.selection.map(i => i.id);
             return this.$refs.table.selection.map(i => i.id);
-        }
+        },
+        ...mapState(['userInfo'])
     },
     },
     methods: {
     methods: {
         beforeGetData() {
         beforeGetData() {
+            this.getAdmin();
             let data = { sort: 'createdAt,desc', query: { isUse: true } };
             let data = { sort: 'createdAt,desc', query: { isUse: true } };
             if (this.search) {
             if (this.search) {
                 data.search = this.search;
                 data.search = this.search;
@@ -91,6 +93,9 @@ export default {
             if (this.$route.query.id) {
             if (this.$route.query.id) {
                 data.query.attractionsId = Number(this.$route.query.id);
                 data.query.attractionsId = Number(this.$route.query.id);
             }
             }
+            if (!this.display) {
+                data.query.attractionsId = this.userInfo.attractionsId;
+            }
             return data;
             return data;
             // return {
             // return {
             //     sort: 'createdAt,desc',
             //     sort: 'createdAt,desc',
@@ -170,6 +175,15 @@ export default {
                         this.$message.error(e.error);
                         this.$message.error(e.error);
                     }
                     }
                 });
                 });
+        },
+        getAdmin() {
+            let data = this.userInfo.authorities;
+            for (let item in data) {
+                if (data[item].name === 'ROLE_ADMIN') {
+                    this.display = true;
+                    break;
+                }
+            }
         }
         }
     }
     }
 };
 };

+ 1 - 1
src/main/vue/src/views/employee/EmployeeList.vue

@@ -107,7 +107,7 @@ export default {
             return {
             return {
                 search: this.search,
                 search: this.search,
                 query: {
                 query: {
-                    member: 'EMPLOYEE'
+                    member: 'EXPERT,BIG_EXPERT'
                 }
                 }
             };
             };
         },
         },

部分文件因文件數量過多而無法顯示