fubojin hace 3 semanas
padre
commit
677f25ae46
Se han modificado 36 ficheros con 839 adiciones y 177 borrados
  1. 17 2
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/Channel.java
  2. 23 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsFailureRecord.java
  3. 6 2
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsRecharge.java
  4. 1 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsRecord.java
  5. 4 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/User.java
  6. 53 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/vo/ChannelVO.java
  7. 33 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/vo/PointsFailureRecordVO.java
  8. 37 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/vo/PointsRechargeVO.java
  9. 43 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/vo/RecordExportVO.java
  10. 53 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/vo/UserPointsVO.java
  11. 1 0
      yami-shop-common/src/main/java/com/yami/shop/common/exception/GlobalException.java
  12. 42 0
      yami-shop-common/src/main/java/com/yami/shop/common/util/CommonUtils.java
  13. 6 6
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/AdvertInfoController.java
  14. 25 15
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ChannelController.java
  15. 3 3
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/DeliveryController.java
  16. 5 5
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/HotSearchController.java
  17. 2 3
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/OrderController.java
  18. 27 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/PointsFailureRecordController.java
  19. 28 3
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/PointsRechargeController.java
  20. 10 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/UserController.java
  21. 3 0
      yami-shop-service/src/main/java/com/yami/shop/dao/ChannelMapper.java
  22. 8 0
      yami-shop-service/src/main/java/com/yami/shop/dao/PointsFailureRecordMapper.java
  23. 10 0
      yami-shop-service/src/main/java/com/yami/shop/dao/PointsRechargeMapper.java
  24. 3 0
      yami-shop-service/src/main/java/com/yami/shop/dao/UserMapper.java
  25. 10 0
      yami-shop-service/src/main/java/com/yami/shop/service/ChannelService.java
  26. 15 0
      yami-shop-service/src/main/java/com/yami/shop/service/PointsFailureRecordService.java
  27. 15 1
      yami-shop-service/src/main/java/com/yami/shop/service/PointsRechargeService.java
  28. 10 0
      yami-shop-service/src/main/java/com/yami/shop/service/UserService.java
  29. 7 0
      yami-shop-service/src/main/java/com/yami/shop/service/impl/ChannelServiceImpl.java
  30. 57 1
      yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsFailureRecordServiceImpl.java
  31. 113 62
      yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsRechargeServiceImpl.java
  32. 6 0
      yami-shop-service/src/main/java/com/yami/shop/service/impl/UserServiceImpl.java
  33. 27 1
      yami-shop-service/src/main/resources/mapper/ChannelMapper.xml
  34. 26 0
      yami-shop-service/src/main/resources/mapper/PointsFailureRecordMapper.xml
  35. 17 0
      yami-shop-service/src/main/resources/mapper/PointsRechargeMapper.xml
  36. 93 71
      yami-shop-service/src/main/resources/mapper/UserMapper.xml

+ 17 - 2
yami-shop-bean/src/main/java/com/yami/shop/bean/model/Channel.java

@@ -10,12 +10,13 @@
 
 package com.yami.shop.bean.model;
 
-import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * 渠道管理
@@ -33,6 +34,10 @@ public class Channel implements Serializable {
     @TableId
     private Long id;
 
+    /**
+     * 企业编号
+     */
+        private String channelNo;
     /**
      * 渠道名称
      */
@@ -41,6 +46,16 @@ public class Channel implements Serializable {
     /**
      * 渠道类型(1-企业用户,2-B端用户,3-C端用户)
      */
-    private String type;
+    private Integer type;
+
+    /**
+     * 企业状态(0-正常,1-停用)
+     */
+    private Integer status;
+    /**
+     * 创建日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
 
 }

+ 23 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsFailureRecord.java

@@ -1,5 +1,7 @@
 package com.yami.shop.bean.model;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
@@ -26,6 +28,15 @@ public class PointsFailureRecord implements Serializable {
      */
     @TableId
     private Long id;
+    /**
+     * 充值编号
+     */
+    private String code;
+
+    /**
+     * 充值状态(0-成功,1-失败)
+     */
+    private Integer rechargeStatus;
 
     /**
      * 失败原因
@@ -62,4 +73,16 @@ public class PointsFailureRecord implements Serializable {
      */
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date expiryDate;
+    /**
+     * 创建日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 创建者
+     */
+    private Long createBy;
+
+
 }

+ 6 - 2
yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsRecharge.java

@@ -30,7 +30,11 @@ public class PointsRecharge implements Serializable {
     /**
      * 用户ID
      */
-    private Long userId;
+    private String userId;
+    /**
+     * 充值编号
+     */
+    private String code;
 
     /**
      * 员工名称
@@ -81,7 +85,7 @@ public class PointsRecharge implements Serializable {
     /**
      * 创建者
      */
-    private String createBy;
+    private Long createBy;
 
     /**
      * 创建时间

+ 1 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsRecord.java

@@ -30,7 +30,7 @@ public class PointsRecord implements Serializable {
     /**
      * 用户ID
      */
-    private Long userId;
+    private String userId;
 
     /**
      * 渠道(企业ID)

+ 4 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/model/User.java

@@ -151,5 +151,8 @@ public class User implements Serializable {
     @TableField(exist = false)
     private String levelName;
 
-    private Integer platform;
+    /**
+     * 1铜仁移动(企业用户) 2夫妻店(B端) 3 市民请集合(C端)
+     */
+    private Long platform;
 }

+ 53 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/vo/ChannelVO.java

@@ -0,0 +1,53 @@
+
+package com.yami.shop.bean.vo;
+
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 渠道统计
+ *
+ * @author fbj 2025/09/28
+ */
+@Data
+public class ChannelVO {
+
+    /**
+     * 渠道ID
+     */
+    private String id;
+    /**
+     * 企业编号
+     */
+    private String channelNo;
+    /**
+     * 渠道名称
+     */
+    private String channelName;
+
+    /**
+     * 渠道类型(1-企业用户,2-B端用户,3-C端用户)
+     */
+    private Integer type;
+
+    /**
+     * 企业状态(0-正常,1-停用)
+     */
+    private Integer status;
+
+    /**
+     * 总员工数
+     */
+    private Integer staffCount;
+    /**
+     * 正常员工数
+     */
+    private Integer normalCount;
+    /**
+     * 创建日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+}

+ 33 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/vo/PointsFailureRecordVO.java

@@ -0,0 +1,33 @@
+package com.yami.shop.bean.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PointsFailureRecordVO {
+
+    @ApiModelProperty("任务名称")
+    private String name;
+
+    @ApiModelProperty("任务编号")
+    private String code;
+
+    @ApiModelProperty("时间")
+    private String createTime;
+
+    @ApiModelProperty("操作人")
+    private String createBy;
+
+    @ApiModelProperty("成功状态数量")
+    private Integer successStatus;
+
+    @ApiModelProperty("失败状态数量")
+    private Integer failureStatus;
+
+    @ApiModelProperty("操作人名称")
+    private String createByName;
+    @ApiModelProperty("操作人角色")
+    private String  createByRole;
+
+}

+ 37 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/vo/PointsRechargeVO.java

@@ -0,0 +1,37 @@
+package com.yami.shop.bean.vo;
+
+
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 充值积分记录统计列表
+ */
+@Data
+public class PointsRechargeVO {
+
+
+    /**
+     * 渠道(企业)名称
+     */
+    private String channelName;
+
+    /**
+     * 总充值积分
+     */
+    private Integer totalPoints;
+
+    /**
+     * 总充值人数
+     */
+    private Integer  totalUserCount;
+
+    /**
+     * 操作时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+}

+ 43 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/vo/RecordExportVO.java

@@ -0,0 +1,43 @@
+package com.yami.shop.bean.vo;
+
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 积分导出VO
+ */
+@Data
+public class RecordExportVO {
+
+    @ExcelProperty(value = "所属企业", index = 0)
+    @ColumnWidth(30)
+    private String channelName;
+
+    @ExcelProperty(value = "员工", index = 1)
+    @ColumnWidth(20)
+    private String userName;
+
+    @ExcelProperty(value = "员工手机号", index = 2)
+    @ColumnWidth(30)
+    private String userPhone;
+
+    @ExcelProperty(value = "充值积分", index = 3)
+    @ColumnWidth(20)
+    private BigDecimal points;
+
+    @ExcelProperty(value = "过期日期", index = 4)
+    @ColumnWidth(20)
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date expiryDate;
+
+    @ExcelProperty(value = "失败原因", index = 5)
+    @ColumnWidth(80)
+    private String reasonForFailure;
+
+}

+ 53 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/vo/UserPointsVO.java

@@ -0,0 +1,53 @@
+package com.yami.shop.bean.vo;
+
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 企业管理-员工列表及积分数据统计
+ */
+@Data
+public class UserPointsVO {
+
+    /**
+     * 员工ID
+     */
+    private String userId;
+    /**
+     * 渠道名称
+     */
+    private String channelName;
+
+    /**
+     * 员工名称
+     */
+    private String realName;
+    /**
+     * 员工手机号码
+     */
+    private String mobile;
+
+    /**
+     * 员工总积分
+     */
+    private Integer totalPoints;
+    /**
+     * 员工当前可用积分
+     */
+    private Integer availablePoints;
+    /**
+     * 员工过期积分
+     */
+    private Integer expirePoints;
+    /**
+     * 员工消耗积分
+     */
+    private Integer consumePoints;
+
+}

+ 1 - 0
yami-shop-common/src/main/java/com/yami/shop/common/exception/GlobalException.java

@@ -59,6 +59,7 @@ public class GlobalException extends RuntimeException {
     }
 
 
+
     public String getMessage() {
         return errorMsg;
     }

+ 42 - 0
yami-shop-common/src/main/java/com/yami/shop/common/util/CommonUtils.java

@@ -0,0 +1,42 @@
+package com.yami.shop.common.util;
+
+import com.yami.shop.common.exception.GlobalException;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Random;
+
+/**
+ * 自定义Utils 类
+ */
+public class CommonUtils {
+
+
+    /**
+     * 获取单号规则
+     * @param orderType 自定义单号类型
+     * @return 单号
+     */
+    public static String getOrderNo(String orderType){
+        StringBuffer sb = new StringBuffer();
+        sb.append(orderType);
+        sb.append(System.currentTimeMillis());
+        Random rd = new Random();
+        sb.append(rd.nextInt(10)).append(rd.nextInt(10)).append(rd.nextInt(10));
+        return sb.toString();
+    }
+
+
+    /**
+     * 校验参数是否需要抛出异常
+     * @param shouldThrow     是否应抛出异常
+     * @param message 异常具体信息
+     */
+    public static void validateCondition(Boolean shouldThrow, String message) {
+        if (shouldThrow) {
+            throw new GlobalException(message);
+        }
+    }
+
+}

+ 6 - 6
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/AdvertInfoController.java

@@ -32,7 +32,7 @@ public class AdvertInfoController {
      * 分页获取广告列表
      */
     @GetMapping("/page")
-    @PreAuthorize("@pms.hasPermission('platform:advertInfo:page')")
+//    @PreAuthorize("@pms.hasPermission('platform:advertInfo:page')")
     public R<IPage<AdvertInfo>> page(
             @RequestParam(required = false) String advertName,
             @RequestParam(required = false) Integer status,
@@ -47,7 +47,7 @@ public class AdvertInfoController {
      * 根据ID获取广告详情
      */
     @GetMapping("/info/{id}")
-    @PreAuthorize("@pms.hasPermission('platform:advertInfo:info')")
+//    @PreAuthorize("@pms.hasPermission('platform:advertInfo:info')")
     public R<AdvertInfoParam> info(@PathVariable("id") Integer id) {
         ResponseEntity<AdvertInfoParam> response = advertInfoService.get(id);
         return R.SUCCESS(response.getBody());
@@ -57,7 +57,7 @@ public class AdvertInfoController {
      * 添加广告
      */
     @PostMapping
-    @PreAuthorize("@pms.hasPermission('platform:advertInfo:save')")
+//    @PreAuthorize("@pms.hasPermission('platform:advertInfo:save')")
     public R<Void> save(@Valid @RequestBody AdvertInfoParam param) {
         ResponseEntity<Void> response = advertInfoService.addOrUpdate(param);
         return R.SUCCESS();
@@ -67,7 +67,7 @@ public class AdvertInfoController {
      * 更新广告
      */
     @PutMapping
-    @PreAuthorize("@pms.hasPermission('platform:advertInfo:update')")
+//    @PreAuthorize("@pms.hasPermission('platform:advertInfo:update')")
     public R<Void> update(@Valid @RequestBody AdvertInfoParam param) {
         ResponseEntity<Void> response = advertInfoService.addOrUpdate(param);
         return R.SUCCESS();
@@ -77,7 +77,7 @@ public class AdvertInfoController {
      * 删除广告
      */
     @DeleteMapping("/{id}")
-    @PreAuthorize("@pms.hasPermission('platform:advertInfo:delete')")
+//    @PreAuthorize("@pms.hasPermission('platform:advertInfo:delete')")
     public R<Void> delete(@PathVariable("id") Integer id) {
         ResponseEntity<Void> response = advertInfoService.del(id);
         return R.SUCCESS();
@@ -87,7 +87,7 @@ public class AdvertInfoController {
      * 操作广告状态(启用/禁用)
      */
     @PutMapping("/operate/{id}")
-    @PreAuthorize("@pms.hasPermission('platform:advertInfo:operate')")
+//    @PreAuthorize("@pms.hasPermission('platform:advertInfo:operate')")
     public R<Void> operate(@PathVariable("id") Integer id) {
         ResponseEntity<Void> response = advertInfoService.operate(id);
         return R.SUCCESS();

+ 25 - 15
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ChannelController.java

@@ -2,20 +2,19 @@
 package com.yami.shop.platform.controller;
 
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.model.Channel;
-import com.yami.shop.bean.model.ChannelProd;
-import com.yami.shop.bean.model.ShopDetail;
+import com.yami.shop.bean.vo.ChannelVO;
 import com.yami.shop.common.util.PageParam;
 import com.yami.shop.common.util.R;
 import com.yami.shop.service.ChannelService;
+import com.yami.shop.service.UserService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -29,15 +28,15 @@ import java.util.List;
 @AllArgsConstructor
 public class ChannelController {
     private final ChannelService channelService;
+    private final UserService userService;
 
     /**
      * 查询全部
      */
     @GetMapping("/listAll")
-    @ApiOperation(value = "根据渠道ID获取商品列表")
+    @ApiOperation(value = "查询全部")
     public R<List<Channel>> listAll() {
         List<Channel> channels = channelService.list();
-
         return R.SUCCESS(channels);
     }
 
@@ -50,17 +49,26 @@ public class ChannelController {
         Channel channel = channelService.getById(id);
         return R.SUCCESS(channel);
     }
+//    /**
+//     * 分页获取
+//     */
+//    @GetMapping("/page")
+//    @ApiOperation(value = "分页获取")
+//    public R<IPage<Channel>> page(@ModelAttribute PageParam pageParam,
+//                                 @ModelAttribute Channel channel ) {
+//        IPage<Channel> page = channelService.page(pageParam,new LambdaQueryWrapper<Channel>()
+//                .eq(ObjectUtils.isNotEmpty(channel.getChannelName()),Channel::getChannelName, channel.getChannelName())
+//                .eq(ObjectUtils.isNotEmpty(channel.getStatus()), Channel::getStatus, channel.getStatus()));
+//        return R.SUCCESS(page);
+//    }
+
     /**
-     * 分页获取
+     * 分页获取政企列表统计
      */
-    @GetMapping("/page")
-    @ApiOperation(value = "分页获取")
-    public R<IPage<Channel>> page(@ModelAttribute PageParam pageParam,
-                                 @ModelAttribute Channel channel ) {
-        IPage<Channel> page = channelService.page(pageParam,new LambdaQueryWrapper<Channel>()
-                .eq(ObjectUtils.isNotEmpty(channel.getChannelName()),Channel::getChannelName, channel.getChannelName())
-                .eq(ObjectUtils.isNotEmpty(channel.getType()), Channel::getType, channel.getType()));
-
+    @GetMapping("/statisticsPage")
+    @ApiOperation(value = "分页获取政企列表统计")
+    public R<IPage<ChannelVO>> statisticsPage(PageParam pageParam, Channel channel ) {
+        IPage<ChannelVO> page = channelService.statisticsPage(pageParam,channel);
         return R.SUCCESS(page);
     }
 
@@ -70,6 +78,8 @@ public class ChannelController {
     @PostMapping
     @ApiOperation(value = "添加")
     public R add(@RequestBody Channel channel) {
+        channel.setCreateTime(new Date());
+        //获取最后一条数据编号
         channelService.save(channel);
         return R.SUCCESS();
     }

+ 3 - 3
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/DeliveryController.java

@@ -66,7 +66,7 @@ public class DeliveryController {
      */
     @SysLog("新增物流公司" )
     @PostMapping
-    @PreAuthorize("@pms.hasPermission('platform:delivery:save')" )
+//    @PreAuthorize("@pms.hasPermission('platform:delivery:save')" )
     public R<Boolean> save(@RequestBody @Valid Delivery delivery) {
         delivery.setRecTime(new Date());
         delivery.setModifyTime(new Date());
@@ -80,7 +80,7 @@ public class DeliveryController {
      */
     @SysLog("修改物流公司" )
     @PutMapping
-    @PreAuthorize("@pms.hasPermission('platform:delivery:update')" )
+//    @PreAuthorize("@pms.hasPermission('platform:delivery:update')" )
     public R<Boolean> updateById(@RequestBody @Valid Delivery delivery) {
         return R.SUCCESS(deliveryService.updateById(delivery));
     }
@@ -92,7 +92,7 @@ public class DeliveryController {
      */
     @SysLog("删除物流公司" )
     @DeleteMapping("/{dvyId}" )
-    @PreAuthorize("@pms.hasPermission('platform:delivery:delete')" )
+//    @PreAuthorize("@pms.hasPermission('platform:delivery:delete')" )
     public R<Boolean> removeById(@PathVariable Long dvyId) {
         return R.SUCCESS(deliveryService.removeById(dvyId));
     }

+ 5 - 5
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/HotSearchController.java

@@ -45,7 +45,7 @@ public class HotSearchController {
 	 * 分页获取
 	 */
     @GetMapping("/page")
-	@PreAuthorize("@pms.hasPermission('platform:hotSearch:page')")
+//	@PreAuthorize("@pms.hasPermission('platform:hotSearch:page')")
 	public R<IPage<HotSearch>> page(HotSearch hotSearch, PageParam<HotSearch> page){
 		IPage<HotSearch> hotSearchs = hotSearchService.page(page,new LambdaQueryWrapper<HotSearch>()
 			.eq(HotSearch::getShopId, Constant.PLATFORM_SHOP_ID)
@@ -60,7 +60,7 @@ public class HotSearchController {
 	 * 获取信息
 	 */
 	@GetMapping("/info/{id}")
-	@PreAuthorize("@pms.hasPermission('platform:hotSearch:info')")
+//	@PreAuthorize("@pms.hasPermission('platform:hotSearch:info')")
 	public R<HotSearch> info(@PathVariable("id") Long id){
 		HotSearch hotSearch = hotSearchService.getById(id);
 		return R.SUCCESS(hotSearch);
@@ -70,7 +70,7 @@ public class HotSearchController {
 	 * 保存
 	 */
 	@PostMapping
-	@PreAuthorize("@pms.hasPermission('platform:hotSearch:save')")
+//	@PreAuthorize("@pms.hasPermission('platform:hotSearch:save')")
 	public R<Void> save(@RequestBody @Valid HotSearch hotSearch){
 		hotSearch.setRecDate(new Date());
 		hotSearch.setShopId(Constant.PLATFORM_SHOP_ID);
@@ -84,7 +84,7 @@ public class HotSearchController {
 	 * 修改
 	 */
 	@PutMapping
-	@PreAuthorize("@pms.hasPermission('platform:hotSearch:update')")
+//	@PreAuthorize("@pms.hasPermission('platform:hotSearch:update')")
 	public R<Void> update(@RequestBody @Valid HotSearch hotSearch){
 		hotSearchService.updateById(hotSearch);
 		//清除缓存
@@ -96,7 +96,7 @@ public class HotSearchController {
 	 * 删除
 	 */
 	@DeleteMapping
-	@PreAuthorize("@pms.hasPermission('platform:hotSearch:delete')")
+//	@PreAuthorize("@pms.hasPermission('platform:hotSearch:delete')")
 	public R<Void> delete(@RequestBody List<Long> ids){
 		hotSearchService.removeByIds(ids);
 		//清除缓存

+ 2 - 3
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/OrderController.java

@@ -18,15 +18,14 @@ import com.yami.shop.bean.model.UserAddrOrder;
 import com.yami.shop.bean.param.OrderParam;
 import com.yami.shop.bean.param.OrderPayParam;
 import com.yami.shop.common.exception.GlobalException;
-import com.yami.shop.common.exception.YamiShopBindException;
 import com.yami.shop.common.util.PageParam;
+import com.yami.shop.common.util.R;
 import com.yami.shop.service.OrderItemService;
 import com.yami.shop.service.OrderService;
 import com.yami.shop.service.UserAddrOrderService;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.format.annotation.DateTimeFormat;
-import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -37,7 +36,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import javax.servlet.http.HttpServletResponse;
 import java.util.Date;
 import java.util.List;
-import com.yami.shop.common.util.R;
+
 /**
  * 订单信息管理实现
  *

+ 27 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/PointsFailureRecordController.java

@@ -1,17 +1,26 @@
 // PointsFailureRecordController.java
 package com.yami.shop.platform.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.model.PointsFailureRecord;
+import com.yami.shop.bean.model.PointsRecharge;
+import com.yami.shop.bean.vo.PointsFailureRecordVO;
 import com.yami.shop.common.util.PageParam;
 import com.yami.shop.common.util.R;
+import com.yami.shop.security.platform.model.YamiSysUser;
+import com.yami.shop.security.platform.util.SecurityUtils;
 import com.yami.shop.service.PointsFailureRecordService;
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.util.Arrays;
+import java.util.List;
 
 /**
  * 积分充值失败记录 Controller
@@ -35,6 +44,14 @@ public class PointsFailureRecordController {
         IPage<PointsFailureRecord> page = pointsFailureRecordService.page(pageParam);
         return R.SUCCESS(page);
     }
+    /**
+     * 获取积分充值记录列表
+     */
+    @GetMapping("/groupByCode")
+    public R<List<PointsFailureRecordVO>> groupByCode(PointsFailureRecord pointsFailureRecord) {
+        List<PointsFailureRecordVO> list = pointsFailureRecordService.groupByCode(pointsFailureRecord);
+        return R.SUCCESS(list);
+    }
 
     /**
      * 根据ID获取积分充值失败记录
@@ -71,4 +88,14 @@ public class PointsFailureRecordController {
         pointsFailureRecordService.removeByIds(Arrays.asList(ids));
         return R.SUCCESS();
     }
+
+
+    /**
+     * 根据编号导出积分充值数据
+     */
+    @GetMapping("/export")
+    @ApiOperation(value = "导出积分充值数据", notes = "导出积分充值数据")
+    public void exportPointsRecharge(HttpServletResponse response, PointsFailureRecord pointsFailureRecord) {
+        pointsFailureRecordService.exportPointsRecharge(response,pointsFailureRecord);
+    }
 }

+ 28 - 3
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/PointsRechargeController.java

@@ -1,20 +1,29 @@
 // PointsRechargeController.java
 package com.yami.shop.platform.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yami.shop.bean.model.PointsRecharge;
+import com.yami.shop.bean.vo.PointsRechargeVO;
 import com.yami.shop.common.util.PageParam;
 import com.yami.shop.common.util.R;
+import com.yami.shop.security.platform.model.YamiSysUser;
+import com.yami.shop.security.platform.util.SecurityUtils;
 import com.yami.shop.service.PointsRechargeService;
+import com.yami.shop.service.UserService;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.util.Arrays;
+import java.util.List;
 
 /**
  * 积分充值 Controller
@@ -34,8 +43,21 @@ public class PointsRechargeController {
      * 分页获取积分充值列表
      */
     @GetMapping("/page")
-    public R<IPage<PointsRecharge>> page(PageParam<PointsRecharge> pageParam) {
-        IPage<PointsRecharge> page = pointsRechargeService.page(pageParam);
+    public R<IPage<PointsRecharge>> page(PageParam<PointsRecharge> pageParam, PointsRecharge pointsRecharge) {
+        IPage<PointsRecharge> page = pointsRechargeService.page(pageParam,new LambdaQueryWrapper<PointsRecharge>()
+                .eq(ObjectUtils.isNotEmpty(pointsRecharge.getChannelId()),PointsRecharge::getChannelId,pointsRecharge.getChannelId())
+                .eq(ObjectUtils.isNotEmpty(pointsRecharge.getUserPhone()),PointsRecharge::getUserPhone,pointsRecharge.getUserPhone())
+        );
+        return R.SUCCESS(page);
+    }
+
+
+    /**
+     * 获取积分充值统计列表
+     */
+    @GetMapping("/statisticsList")
+    public R<IPage<PointsRechargeVO>> statisticsList(PageParam<PointsRecharge> pageParam, PointsRecharge pointsRecharge) {
+        IPage<PointsRechargeVO> page = pointsRechargeService.statisticsList(pointsRecharge);
         return R.SUCCESS(page);
     }
 
@@ -96,8 +118,11 @@ public class PointsRechargeController {
     @PostMapping("/import")
     @ApiOperation(value = "导入积分充值数据", notes = "导入积分充值数据")
     public R<String> importPointsRecharge(@RequestParam("file") MultipartFile file) {
+        //需要填写操作人
+        YamiSysUser sysUser = SecurityUtils.getSysUser();
+        Long userId = sysUser.getUserId();
         try {
-            String result = pointsRechargeService.importPointsRecharge(file);
+            String result = pointsRechargeService.importPointsRecharge(file,userId);
             return R.SUCCESS(result);
         } catch (Exception e) {
             log.error("导入积分充值数据失败:", e);

+ 10 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/UserController.java

@@ -12,6 +12,7 @@ package com.yami.shop.platform.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.model.User;
+import com.yami.shop.bean.vo.UserPointsVO;
 import com.yami.shop.common.util.PageParam;
 import com.yami.shop.common.util.R;
 import com.yami.shop.common.util.RedisUtil;
@@ -120,4 +121,13 @@ public class UserController {
         }
     }
 
+
+    /**
+     * 员工列表-积分统计
+     */
+    @GetMapping("/statisticsList")
+    public R<IPage<UserPointsVO>> statisticsList(PageParam<User> pageParam, User user) {
+        IPage<UserPointsVO> page = userService.statisticsList(pageParam, user);
+        return R.SUCCESS(page);
+    }
 }

+ 3 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/ChannelMapper.java

@@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.model.Channel;
 import com.yami.shop.bean.model.ChannelProd;
+import com.yami.shop.bean.vo.ChannelVO;
 import com.yami.shop.common.util.PageParam;
 import org.apache.ibatis.annotations.Param;
 
@@ -30,4 +31,6 @@ public interface ChannelMapper extends BaseMapper<Channel> {
      * @return 渠道信息
      */
     Channel selectByName(@Param("channelName") String channelName);
+
+    IPage<ChannelVO> statisticsPage(@Param("pageParam")PageParam pageParam, @Param("channel")Channel channel);
 }

+ 8 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/PointsFailureRecordMapper.java

@@ -2,6 +2,10 @@ package com.yami.shop.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yami.shop.bean.model.PointsFailureRecord;
+import com.yami.shop.bean.vo.PointsFailureRecordVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 积分充值失败记录 Mapper接口
@@ -11,4 +15,8 @@ import com.yami.shop.bean.model.PointsFailureRecord;
  */
 public interface PointsFailureRecordMapper extends BaseMapper<PointsFailureRecord> {
 
+    /**
+     * 通过条件code分组获取积分充值失败记录列表
+     */
+    List<PointsFailureRecordVO> groupByCode(PointsFailureRecord pointsFailureRecord);
 }

+ 10 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/PointsRechargeMapper.java

@@ -2,6 +2,10 @@ package com.yami.shop.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yami.shop.bean.model.PointsRecharge;
+import com.yami.shop.bean.vo.PointsRechargeVO;
+import com.yami.shop.common.util.PageParam;
+
+import java.util.List;
 
 /**
  * 积分充值 Mapper接口
@@ -11,4 +15,10 @@ import com.yami.shop.bean.model.PointsRecharge;
  */
 public interface PointsRechargeMapper extends BaseMapper<PointsRecharge> {
 
+    /**
+     * 积分充值统计
+     * @param pointsRecharge 查询参数
+     * @return 积分充值统计列表
+     */
+    List<PointsRechargeVO> statisticsList(PointsRecharge pointsRecharge);
 }

+ 3 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/UserMapper.java

@@ -14,6 +14,7 @@ import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.model.User;
+import com.yami.shop.bean.vo.UserPointsVO;
 import com.yami.shop.common.util.PageParam;
 import org.apache.ibatis.annotations.Param;
 
@@ -32,4 +33,6 @@ public interface UserMapper extends BaseMapper<User> {
     void updateBatchById(@Param("userList") List<User> userList);
 
     IPage<User> getUserPage(PageParam<User> page, @Param("user") User user);
+
+    IPage<UserPointsVO> statisticsList(PageParam<User> pageParam, @Param("user")User user);
 }

+ 10 - 0
yami-shop-service/src/main/java/com/yami/shop/service/ChannelService.java

@@ -1,8 +1,11 @@
 package com.yami.shop.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yami.shop.bean.model.Channel;
 import com.yami.shop.bean.model.ChannelProd;
+import com.yami.shop.bean.vo.ChannelVO;
+import com.yami.shop.common.util.PageParam;
 
 /**
  * 渠道管理服务接口
@@ -10,5 +13,12 @@ import com.yami.shop.bean.model.ChannelProd;
  */
 public interface ChannelService extends IService<Channel> {
 
+    /**
+     * 渠道统计分页
+     * @param pageParam 分页参数
+     * @param channel 渠道参数
+     * @return 渠道统计分页数据
+     */
+    IPage<ChannelVO> statisticsPage(PageParam pageParam, Channel channel);
 }
 

+ 15 - 0
yami-shop-service/src/main/java/com/yami/shop/service/PointsFailureRecordService.java

@@ -3,6 +3,11 @@ package com.yami.shop.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yami.shop.bean.model.PointsFailureRecord;
+import com.yami.shop.bean.model.PointsRecharge;
+import com.yami.shop.bean.vo.PointsFailureRecordVO;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * 积分充值失败记录 Service接口
@@ -12,4 +17,14 @@ import com.yami.shop.bean.model.PointsFailureRecord;
  */
 public interface PointsFailureRecordService extends IService<PointsFailureRecord> {
 
+    /**
+     * 导出积分充值数据
+     * @param response HTTP响应对象
+     */
+    void exportPointsRecharge(HttpServletResponse response,PointsFailureRecord pointsFailureRecord);
+
+    /**
+     * 通过条件code分组获取积分充值失败记录列表
+     */
+    List<PointsFailureRecordVO> groupByCode(PointsFailureRecord pointsFailureRecord);
 }

+ 15 - 1
yami-shop-service/src/main/java/com/yami/shop/service/PointsRechargeService.java

@@ -1,11 +1,15 @@
 // PointsRechargeService.java
 package com.yami.shop.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yami.shop.bean.model.PointsRecharge;
+import com.yami.shop.bean.vo.PointsRechargeVO;
+import com.yami.shop.common.util.PageParam;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * 积分充值 Service接口
@@ -24,8 +28,18 @@ public interface PointsRechargeService extends IService<PointsRecharge> {
     /**
      * 导入积分充值数据
      * @param file 导入文件
+     * @param userId 当前操作人
      * @return 导入结果
      * @throws Exception 导入异常
      */
-    String importPointsRecharge(MultipartFile file) throws Exception;
+    String importPointsRecharge(MultipartFile file, Long userId) throws Exception;
+
+
+
+    /**
+     * 获取积分充值统计列表
+     * @param pointsRecharge 查询参数
+     * @return 积分充值统计列表
+     */
+    IPage<PointsRechargeVO> statisticsList(PointsRecharge pointsRecharge);
 }

+ 10 - 0
yami-shop-service/src/main/java/com/yami/shop/service/UserService.java

@@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yami.shop.bean.app.param.UserRegisterParam;
 import com.yami.shop.bean.model.User;
+import com.yami.shop.bean.vo.UserPointsVO;
 import com.yami.shop.bean.vo.UserVO;
 import com.yami.shop.common.util.PageParam;
 
@@ -32,4 +33,13 @@ public interface UserService extends IService<User> {
     void validate(UserRegisterParam userRegisterParam, String checkRegisterSmsFlag);
 
     IPage<User> getUserPage(PageParam<User> page, User user);
+
+    /**
+     * 获取用户统计列表
+     * @param pageParam 分页参数
+     * @param user 查询参数
+     * @return 用户统计列表
+     */
+    IPage<UserPointsVO> statisticsList(PageParam<User> pageParam, User user);
+
 }

+ 7 - 0
yami-shop-service/src/main/java/com/yami/shop/service/impl/ChannelServiceImpl.java

@@ -1,7 +1,10 @@
 package com.yami.shop.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yami.shop.bean.model.Channel;
+import com.yami.shop.bean.vo.ChannelVO;
+import com.yami.shop.common.util.PageParam;
 import com.yami.shop.dao.ChannelMapper;
 import com.yami.shop.service.ChannelService;
 import lombok.AllArgsConstructor;
@@ -18,4 +21,8 @@ import org.springframework.stereotype.Service;
 @AllArgsConstructor
 public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> implements ChannelService {
 
+    @Override
+    public IPage<ChannelVO> statisticsPage(PageParam pageParam, Channel channel) {
+         return baseMapper.statisticsPage(pageParam, channel);
+    }
 }

+ 57 - 1
yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsFailureRecordServiceImpl.java

@@ -1,13 +1,28 @@
-// PointsFailureRecordServiceImpl.java
+
 package com.yami.shop.service.impl;
 
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yami.shop.bean.model.PointsFailureRecord;
+import com.yami.shop.bean.vo.ChannelProdExportVO;
+import com.yami.shop.bean.vo.PointsFailureRecordVO;
+import com.yami.shop.bean.vo.RecordExportVO;
 import com.yami.shop.dao.PointsFailureRecordMapper;
 import com.yami.shop.service.PointsFailureRecordService;
 import lombok.AllArgsConstructor;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.stereotype.Service;
 
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * 积分充值失败记录 Service实现类
  *
@@ -20,4 +35,45 @@ public class PointsFailureRecordServiceImpl extends ServiceImpl<PointsFailureRec
 
     private final PointsFailureRecordMapper pointsFailureRecordMapper;
 
+    @Override
+    public void exportPointsRecharge(HttpServletResponse response, PointsFailureRecord pointsFailureRecord) {
+        // 查询数据
+
+            List<PointsFailureRecord> dataList = pointsFailureRecordMapper.selectList(new LambdaQueryWrapper<PointsFailureRecord>()
+                    .eq(PointsFailureRecord::getRechargeStatus, 1)
+                    .eq(ObjectUtils.isNotEmpty(pointsFailureRecord.getCode()), PointsFailureRecord::getCode, pointsFailureRecord.getCode())
+                    .last("LIMIT 1000")
+            );
+            // 转换为导出VO
+            List<RecordExportVO> exportData = new ArrayList<>();
+            for (PointsFailureRecord record : dataList) {
+                RecordExportVO exportVO = new RecordExportVO();
+                exportVO.setPoints(record.getPoints());
+                exportVO.setChannelName(record.getChannelName());
+                exportVO.setUserName(record.getUserName());
+                exportVO.setUserPhone(record.getUserPhone());
+                exportVO.setExpiryDate(record.getExpiryDate());
+                exportVO.setReasonForFailure(record.getReasonForFailure());
+                exportData.add(exportVO);
+            }
+        try {
+            // 设置响应头
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+            response.setCharacterEncoding("utf-8");
+            String fileName = URLEncoder.encode("积分导入失败数据导出", "UTF-8").replaceAll("\\+", "%20");
+            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+            // 写入Excel
+            EasyExcel.write(response.getOutputStream(), RecordExportVO.class)
+                    .sheet("积分导入失败数据")
+                    .doWrite(exportData);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public List<PointsFailureRecordVO> groupByCode(PointsFailureRecord pointsFailureRecord) {
+        List<PointsFailureRecordVO> list = pointsFailureRecordMapper.groupByCode(pointsFailureRecord);
+        return list;
+    }
 }

+ 113 - 62
yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsRechargeServiceImpl.java

@@ -3,15 +3,20 @@ package com.yami.shop.service.impl;
 
 import com.alibaba.excel.EasyExcel;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yami.shop.bean.model.*;
+import com.yami.shop.bean.vo.PointsRechargeVO;
 import com.yami.shop.common.exception.GlobalException;
+import com.yami.shop.common.util.CommonUtils;
+import com.yami.shop.common.util.PageParam;
 import com.yami.shop.dao.*;
 import com.yami.shop.service.PointsFailureRecordService;
 import com.yami.shop.service.PointsRechargeService;
-import com.yami.shop.service.impl.PointsRechargeTemplateDTO;
+import com.yami.shop.service.PointsRecordService;
 import lombok.AllArgsConstructor;
-import lombok.extern.log4j.Log4j;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -30,13 +35,14 @@ import java.util.List;
  */
 @Service
 @AllArgsConstructor
-//@Log4j
+@Slf4j
 public class PointsRechargeServiceImpl extends ServiceImpl<PointsRechargeMapper, PointsRecharge> implements PointsRechargeService {
 
     private final PointsRechargeMapper pointsRechargeMapper;
     private final PointsFailureRecordService pointsFailureRecordService;
-    private final TzSysUserMapper sysUserMapper;
+    private final UserMapper userMapper;
     private final ChannelMapper channelMapper;
+    private final PointsRecordService pointsRecordService;
 
     @Override
     public void exportTemplate(HttpServletResponse response) throws Exception {
@@ -47,7 +53,7 @@ public class PointsRechargeServiceImpl extends ServiceImpl<PointsRechargeMapper,
         response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
 
         // 创建示例数据
-        List<PointsRechargeTemplateDTO> templateData = new ArrayList<>();
+        List<com.yami.shop.service.impl.PointsRechargeTemplateDTO> templateData = new ArrayList<>();
         // 使用EasyExcel导出模板
         EasyExcel.write(response.getOutputStream(), com.yami.shop.service.impl.PointsRechargeTemplateDTO.class)
                 .sheet("积分充值导入模板")
@@ -56,103 +62,148 @@ public class PointsRechargeServiceImpl extends ServiceImpl<PointsRechargeMapper,
 
 
     @Override
-    public String importPointsRecharge(MultipartFile file) {
+    public String importPointsRecharge(MultipartFile file, Long userId) throws Exception {
         // 读取Excel数据
-        List<PointsRechargeTemplateDTO> importData = null;
+        List<com.yami.shop.service.impl.PointsRechargeTemplateDTO> importData = null;
         try {
-            importData = EasyExcel.read(file.getInputStream())
-                    .head(PointsRechargeTemplateDTO.class)
-                    .sheet()
-                    .doReadSync();
+            importData = EasyExcel.read(file.getInputStream()).head(com.yami.shop.service.impl.PointsRechargeTemplateDTO.class).sheet().doReadSync();
         } catch (IOException e) {
-            e.printStackTrace();
+            log.info("导入失败,解析模板有误");
+            throw new GlobalException("导入失败,解析模板有误");
         }
 
         int successCount = 0;
         int failCount = 0;
+        String code = CommonUtils.getOrderNo("JF");
+        //回去当前登录用户信息
+
 
         for (int i = 0; i < importData.size(); i++) {
-            PointsRechargeTemplateDTO templateDTO = importData.get(i);
+            com.yami.shop.service.impl.PointsRechargeTemplateDTO templateDTO = importData.get(i);
             try {
-
                 // 数据校验
-                if (templateDTO.getChannelName() == null) {
-                    throw new GlobalException("所属企业不能为空");
-                }
+                CommonUtils.validateCondition(templateDTO.getChannelName() == null,"所属企业不能为空");
                 //判断是否存在对应渠道商
                 Channel channel = channelMapper.selectOne(new LambdaQueryWrapper<Channel>()
                         .eq(Channel::getChannelName, templateDTO.getChannelName().trim()));
-                if (channel == null) {
-                    throw new GlobalException("渠道商不存在");
-                }
-
-                if (templateDTO.getUserName() == null) {
-                    throw new GlobalException("员工名称不能为空");
-                }
+                CommonUtils.validateCondition(channel == null,"渠道商不存在");
+                String userName = templateDTO.getUserName();
+                CommonUtils.validateCondition(userName == null,"员工名称不能为空");
+                CommonUtils.validateCondition(templateDTO.getPoints() == null,"充值积分不能为空");
+                CommonUtils.validateCondition(templateDTO.getExpiryDate() == null,"过期时间不能为空");
 
-                if (templateDTO.getPoints() == null) {
-                    throw new GlobalException("充值积分不能为空");
-                }
-
-                if (templateDTO.getExpiryDate() == null) {
-                    throw new GlobalException("过期时间不能为空");
-                }
                 // 构造实体对象
                 PointsRecharge pointsRecharge = new PointsRecharge();
                 String userPhone = templateDTO.getUserPhone();
-                if (userPhone == null) {
-                    throw new GlobalException("员工电话号码不能为空");
-                }
+                CommonUtils.validateCondition(userPhone == null,"员工电话号码不能为空");
+
+                userName = userName.trim();
                 userPhone = userPhone.trim();
                 //电话号码格式验证
-                if (!userPhone.matches("^1[3-9]\\d{8}$")) {
-                    throw new GlobalException("手机号码格式错误");
-                }
+                CommonUtils.validateCondition(!userPhone.matches("^(1(3[0-9]|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\\d{8})$"),"手机号码格式错误");
+
                 //通过用户名称和电话号码校验员工是否存在(存在用户绑定用户,不存在正常添加数据)
-                SysUser sysUser = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>()
-                        .eq(SysUser::getUsername, templateDTO.getUserName().trim())
-                        .eq(SysUser::getMobile, userPhone)
+                User user = userMapper.selectOne(new LambdaQueryWrapper<User>()
+                        .eq(User::getUserMobile, userPhone)
+                        .eq(User::getStatus, 1)
                         .last("LIMIT 1"));
-                if (sysUser != null) {
-                    pointsRecharge.setUserId(sysUser.getUserId());
-                }
 
-                pointsRecharge.setUserName(templateDTO.getUserName());
-                pointsRecharge.setUserPhone(templateDTO.getUserPhone());
+                CommonUtils.validateCondition(user == null,"员工手机号码不存在");
+                pointsRecharge.setUserId(user.getUserId());
+                CommonUtils.validateCondition(!userName.equals(user.getRealName()),"员工姓名不正确!");
+                CommonUtils.validateCondition(user.getPlatform() == null,"员工未绑定企业,不能导入积分!");
+                //小程序注册未绑定企业没有绑定企业可以正常添加,绑定了必须相同
+                CommonUtils.validateCondition(!channel.getId().equals(user.getPlatform()),"该员工属于企业("+channel.getChannelName()+"),所属企业不匹配!");
+
+
                 pointsRecharge.setChannelId(channel.getId());
+                pointsRecharge.setUserName(userName);
+                pointsRecharge.setUserPhone(templateDTO.getUserPhone());
                 pointsRecharge.setChannelName(templateDTO.getChannelName());
                 pointsRecharge.setPoints(templateDTO.getPoints());
                 pointsRecharge.setExpiryDate(templateDTO.getExpiryDate());
                 pointsRecharge.setType(0);
                 pointsRecharge.setCreateTime(new Date());
                 pointsRecharge.setUpdateTime(new Date());
-                pointsRecharge.setRechargeStatus(1); // 默认未过期状态
+                pointsRecharge.setRechargeStatus(1);
+                pointsRecharge.setCode(code);
+                pointsRecharge.setCreateBy(userId);
 
                 // 生成充值单号
-                String rechargeNumber = "RC" + System.currentTimeMillis();
-                pointsRecharge.setRechargeNumber(rechargeNumber);
+                pointsRecharge.setRechargeNumber(CommonUtils.getOrderNo("CZ"));
 
-                // 保存数据
+                // 保存数据(因为有过期时间每次导入的都是新增)
+                log.info("保存数据:{}", pointsRecharge);
                 this.save(pointsRecharge);
+                log.info("保存数据成功:{}", pointsRecharge);
+                // 添加积分记录明细
+                PointsRecord pointsRecord = new PointsRecord();
+                pointsRecord.setUserId(pointsRecharge.getUserId());
+                pointsRecord.setChannelId(pointsRecharge.getChannelId());
+                pointsRecord.setPointsId(pointsRecharge.getId());
+                pointsRecord.setCode(pointsRecharge.getCode());
+                pointsRecord.setPoints(pointsRecharge.getPoints());
+                pointsRecord.setPointsType(1);
+                pointsRecord.setPointsAudit(1);
+                pointsRecord.setCreationDate(new Date());
+                pointsRecord.setExpiryDate(pointsRecharge.getExpiryDate());
+                pointsRecordService. save(pointsRecord);
+
                 successCount++;
+                addImportRecord(1, "成功", templateDTO, code,userId);
             } catch (GlobalException e) {
-                // 失败数据保存到积分充值失败记录表
-                PointsFailureRecord failureRecord = new PointsFailureRecord();
-                failureRecord.setReasonForFailure(e.getMessage());
-                failureRecord.setChannelName(templateDTO.getChannelName());
-                failureRecord.setUserName(templateDTO.getUserName());
-                failureRecord.setUserPhone(templateDTO.getUserPhone());
-                failureRecord.setPoints(templateDTO.getPoints());
-                failureRecord.setExpiryDate(templateDTO.getExpiryDate());
-
-                // 保存失败记录
-                pointsFailureRecordService.save(failureRecord);
-//                log.error("导入第{}行数据失败!", i + 1, e);
+                log.info("导入失败:{}", e.getMessage());
                 failCount++;
+                addImportRecord(0, e.getMessage(), templateDTO, code,userId);
+            } catch (Exception e) {
+                failCount++;
+                addImportRecord(0, "系统异常,请联系管理员", templateDTO, code,userId);
             }
         }
 
-        return String.format("导入完成,成功:%d条,失败:%d条", successCount, failCount);
+        if (successCount > 0 && failCount == 0) {
+            return String.format("导入完成,全部成功:%d条", successCount);
+        } else if (successCount == 0 && failCount > 0) {
+            return String.format("导入完成,全部失败:%d条", failCount);
+        } else {
+            return String.format("导入完成,成功:%d条,失败:%d条", successCount, failCount);
+        }
+    }
+
+
+
+
+    /**
+     * 封装新增导入记录方法
+     *
+     * @param status  状态
+     * @param message 成功还是失败原因
+     */
+    private void addImportRecord(int status, String message, com.yami.shop.service.impl.PointsRechargeTemplateDTO templateDTO, String code,Long userId) {
+        // 数据保存到积分充值失败记录表
+        PointsFailureRecord failureRecord = new PointsFailureRecord();
+        failureRecord.setCode(code);
+        failureRecord.setRechargeStatus(status);
+        failureRecord.setReasonForFailure(message);
+        failureRecord.setChannelName(templateDTO.getChannelName());
+        failureRecord.setUserName(templateDTO.getUserName());
+        failureRecord.setUserPhone(templateDTO.getUserPhone());
+        failureRecord.setPoints(templateDTO.getPoints());
+        failureRecord.setExpiryDate(templateDTO.getExpiryDate());
+        failureRecord.setCreateTime(new Date());
+        failureRecord.setCreateBy(userId);
+
+        // 保存记录
+        pointsFailureRecordService.save(failureRecord);
     }
 
+    @Override
+    public IPage<PointsRechargeVO> statisticsList(PointsRecharge pointsRecharge) {
+        List<PointsRechargeVO> pointsRechargeVOS = pointsRechargeMapper.statisticsList(pointsRecharge);
+        IPage<PointsRechargeVO> page = new Page<>(0, 1000);
+        page.setRecords(pointsRechargeVOS);
+        page.setTotal(pointsRechargeVOS.size());
+
+        return  page;
+    }
 }

+ 6 - 0
yami-shop-service/src/main/java/com/yami/shop/service/impl/UserServiceImpl.java

@@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yami.shop.bean.app.param.UserRegisterParam;
 import com.yami.shop.bean.model.User;
+import com.yami.shop.bean.vo.UserPointsVO;
 import com.yami.shop.common.exception.GlobalException;
 import com.yami.shop.common.exception.YamiShopBindException;
 import com.yami.shop.common.util.PageParam;
@@ -84,4 +85,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     public IPage<User> getUserPage(PageParam<User> page, User user) {
         return  userMapper.getUserPage(page,user);
     }
+
+    @Override
+    public IPage<UserPointsVO> statisticsList(PageParam<User> pageParam, User user) {
+        return userMapper.statisticsList(pageParam,user);
+    }
 }

+ 27 - 1
yami-shop-service/src/main/resources/mapper/ChannelMapper.xml

@@ -3,6 +3,32 @@
 <mapper namespace="com.yami.shop.dao.ChannelMapper">
 
     <select id="selectByName" resultType="com.yami.shop.bean.model.Channel">
-        select * from tz_channel where channel_name = #{channelName}
+        select *
+        from tz_channel
+        where channel_name = #{channelName}
+    </select>
+    <select id="statisticsPage" resultType="com.yami.shop.bean.vo.ChannelVO">
+
+        select
+        c.id AS id,
+        c.channel_no AS channelNo,
+        c.channel_name AS channelName,
+        c.type AS type,
+        c.status AS status,
+        c.create_time AS createTime,
+        count(tu.user_id) AS staffCount,
+        count(if(tu.status = 1, tu.user_id, null)) AS normalCount
+
+        from tz_channel c left join tz_user tu on c.id = tu.channel_id
+        <where>
+            <if test="channel.channelName != null">
+                and c.channel_name like concat('%',#{channel.channelName},'%')
+            </if>
+            <if test="channel.status != null">
+                and c.status = #{channel.status}
+            </if>
+        </where>
+        group by c.id
+
     </select>
 </mapper>

+ 26 - 0
yami-shop-service/src/main/resources/mapper/PointsFailureRecordMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yami.shop.dao.PointsFailureRecordMapper">
+
+
+    <select id="groupByCode" resultType="com.yami.shop.bean.vo.PointsFailureRecordVO">
+        SELECT
+        '导入积分' AS name,
+        p.code,
+        max(p.create_time) AS createTime,
+        p.create_by AS createBy,
+        p.channel_name AS channelName,
+        COUNT(IF(p.recharge_status = 1, 1, NULL)) AS successStatus,
+        COUNT(IF(p.recharge_status = 0, 1, NULL)) AS failureStatus,
+        u.username AS createByName,
+        r.role_name AS createByRole
+        from tz_points_failure_record p
+        left join tz_sys_user u on p.create_by = u.user_id
+        left join tz_sys_user_role ur on u.user_id = ur.user_id
+        left join tz_sys_role r on ur.role_id = r.role_id
+        <where>
+            <if test="channelId != null">p.channel_id = #{channelId}</if>
+        </where>
+        GROUP BY p.code
+    </select>
+</mapper>

+ 17 - 0
yami-shop-service/src/main/resources/mapper/PointsRechargeMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yami.shop.dao.PointsRechargeMapper">
+
+    <select id="statisticsList" resultType="com.yami.shop.bean.vo.PointsRechargeVO">
+        SELECT
+        sum(points) AS totalPoints,
+        count(id) AS totalUserCount,
+        channel_name AS channelName,
+        max(create_time) AS createTime
+        FROM tz_points_recharge
+        <where>
+              <if test="channelId != null"> channel_id = #{channelId}</if>
+        </where>
+        GROUP BY channel_id
+    </select>
+</mapper>

+ 93 - 71
yami-shop-service/src/main/resources/mapper/UserMapper.xml

@@ -1,83 +1,105 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.yami.shop.dao.UserMapper">
-  <resultMap id="BaseResultMap" type="com.yami.shop.bean.model.User">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    <id column="user_id" jdbcType="VARCHAR" property="userId" />
-    <result column="nick_name" jdbcType="VARCHAR" property="nickName" />
-    <result column="real_name" jdbcType="VARCHAR" property="realName" />
-    <result column="user_mail" jdbcType="VARCHAR" property="userMail" />
-    <result column="login_password" jdbcType="VARCHAR" property="loginPassword" />
-    <result column="pay_password" jdbcType="VARCHAR" property="payPassword" />
-    <result column="user_mobile" jdbcType="VARCHAR" property="userMobile" />
-    <result column="modify_time" jdbcType="TIMESTAMP" property="modifyTime" />
-    <result column="user_regtime" jdbcType="TIMESTAMP" property="userRegtime" />
-    <result column="user_regip" jdbcType="VARCHAR" property="userRegip" />
-    <result column="user_memo" jdbcType="VARCHAR" property="userMemo" />
-    <result column="sex" jdbcType="CHAR" property="sex" />
-    <result column="birth_date" jdbcType="CHAR" property="birthDate" />
-    <result column="growth" jdbcType="BIGINT" property="growth" />
-    <result column="score" jdbcType="BIGINT" property="score" />
-    <result column="level" jdbcType="INTEGER" property="level" />
-    <result column="level_type" jdbcType="INTEGER" property="levelType" />
-    <result column="pic" jdbcType="VARCHAR" property="pic" />
-    <result column="status" jdbcType="INTEGER" property="status" />
-  </resultMap>
+    <resultMap id="BaseResultMap" type="com.yami.shop.bean.model.User">
+        <!--
+          WARNING - @mbg.generated
+        -->
+        <id column="user_id" jdbcType="VARCHAR" property="userId"/>
+        <result column="nick_name" jdbcType="VARCHAR" property="nickName"/>
+        <result column="real_name" jdbcType="VARCHAR" property="realName"/>
+        <result column="user_mail" jdbcType="VARCHAR" property="userMail"/>
+        <result column="login_password" jdbcType="VARCHAR" property="loginPassword"/>
+        <result column="pay_password" jdbcType="VARCHAR" property="payPassword"/>
+        <result column="user_mobile" jdbcType="VARCHAR" property="userMobile"/>
+        <result column="modify_time" jdbcType="TIMESTAMP" property="modifyTime"/>
+        <result column="user_regtime" jdbcType="TIMESTAMP" property="userRegtime"/>
+        <result column="user_regip" jdbcType="VARCHAR" property="userRegip"/>
+        <result column="user_memo" jdbcType="VARCHAR" property="userMemo"/>
+        <result column="sex" jdbcType="CHAR" property="sex"/>
+        <result column="birth_date" jdbcType="CHAR" property="birthDate"/>
+        <result column="growth" jdbcType="BIGINT" property="growth"/>
+        <result column="score" jdbcType="BIGINT" property="score"/>
+        <result column="level" jdbcType="INTEGER" property="level"/>
+        <result column="level_type" jdbcType="INTEGER" property="levelType"/>
+        <result column="pic" jdbcType="VARCHAR" property="pic"/>
+        <result column="status" jdbcType="INTEGER" property="status"/>
+    </resultMap>
 
-  <select id="getUserByBizUserId" resultMap="BaseResultMap">
-    select * from tz_user u where u.user_id =  (select user_id from tz_app_connect ac where ac.app_id = #{appId} and ac.biz_user_id = #{bizUserId})
-  </select>
+    <select id="getUserByBizUserId" resultMap="BaseResultMap">
+        select *
+        from tz_user u
+        where u.user_id =
+              (select user_id from tz_app_connect ac where ac.app_id = #{appId} and ac.biz_user_id = #{bizUserId})
+    </select>
     <update id="setUserLevelBylevelId">
-      UPDATE
+        UPDATE
+            tz_user
+        SET `level` = #{level} - 1
+        WHERE `level` = #{level}
+    </update>
+    <update id="setMaxUserLevelBylevelId">
+        UPDATE
         tz_user
-      SET
-        `level` = #{level}-1
-      WHERE `level` = #{level}
+        SET
+        `level` = #{level}
+        WHERE user_id IN
+        (SELECT user_id FROM tz_user_extension WHERE growth &gt; #{minNeedGrowth}
+        <if test="maxNeedGrowth != null">
+            AND growth &lt; #{maxNeedGrowth}
+        </if>)
     </update>
-  <update id="setMaxUserLevelBylevelId">
-    UPDATE
-    tz_user
-    SET
-    `level` = #{level}
-    WHERE user_id IN
-    (SELECT user_id FROM tz_user_extension WHERE growth &gt; #{minNeedGrowth}
-    <if test="maxNeedGrowth != null">
-      AND growth &lt; #{maxNeedGrowth}
-    </if>)
-  </update>
 
-  <select id="selectMemberByEndTime" resultMap="BaseResultMap">
-    select * from tz_user u where vip_end_time &lt; #{endOfDay} and level_type=1
-  </select>
+    <select id="selectMemberByEndTime" resultMap="BaseResultMap">
+        select *
+        from tz_user u
+        where vip_end_time &lt; #{endOfDay}
+          and level_type = 1
+    </select>
 
-  <update id="updateBatchById">
-    <foreach collection="userList" item="user"  separator=";">
-      update tz_user set level =#{user.level},level_type=0 where user_id = #{user.userId}
-    </foreach>
-  </update>
+    <update id="updateBatchById">
+        <foreach collection="userList" item="user" separator=";">
+            update tz_user set level =#{user.level},level_type=0 where user_id = #{user.userId}
+        </foreach>
+    </update>
     <select id="getUserPage" resultType="com.yami.shop.bean.model.User">
-      SELECT u.nick_name,u.status,u.pic,u.level,u.level_type,ul.level_name, u.user_id,u.real_name,u.user_mobile,ue.score
-      FROM tz_user u
-      left JOIN tz_user_level ul ON ul.level = u.level AND ul.level_type = u.level_type
-      JOIN tz_user_extension ue ON ue.`user_id` = u.user_id
-      <where>
-        <if test="user.nickName != null and user.nickName != ''">
-          AND u.nick_name LIKE CONCAT("%",#{user.nickName},"%")
-        </if>
-        <if test="user.status != null">
-          AND u.status = #{user.status}
-        </if>
-        <if test="user.levelType != null and user.levelType != ''">
-          AND u.level_Type = #{user.levelType}
-        </if>
-        <if test="user.realName != null and user.realName != ''">
-          AND u.real_name LIKE CONCAT("%",#{user.realName},"%")
-        </if>
-        <if test="user.userMobile != null and user.userMobile != ''">
-          AND u.user_mobile LIKE CONCAT("%",#{user.userMobile},"%")
-        </if>
-      </where>
+        SELECT u.nick_name,u.status,u.pic,u.level,u.level_type,ul.level_name,
+        u.user_id,u.real_name,u.user_mobile,ue.score
+        FROM tz_user u
+        left JOIN tz_user_level ul ON ul.level = u.level AND ul.level_type = u.level_type
+        JOIN tz_user_extension ue ON ue.`user_id` = u.user_id
+        <where>
+            <if test="user.nickName != null and user.nickName != ''">
+                AND u.nick_name LIKE CONCAT("%",#{user.nickName},"%")
+            </if>
+            <if test="user.status != null">
+                AND u.status = #{user.status}
+            </if>
+            <if test="user.levelType != null and user.levelType != ''">
+                AND u.level_Type = #{user.levelType}
+            </if>
+            <if test="user.realName != null and user.realName != ''">
+                AND u.real_name LIKE CONCAT("%",#{user.realName},"%")
+            </if>
+            <if test="user.userMobile != null and user.userMobile != ''">
+                AND u.user_mobile LIKE CONCAT("%",#{user.userMobile},"%")
+            </if>
+        </where>
     </select>
+    <select id="statisticsList" resultType="com.yami.shop.bean.vo.UserPointsVO">
+
+        SELECT u.user_id,u.real_name,u.user_mobile,
+               c.channel_name,
+        sum(IF(pr.points_type = 1, pr.points, 0)) AS successStatus,
+        sum(IF(pr.expiry_date IS NOT NULL AND pr.expiry_date &lt;= NOW() and pr.points_type = 1, pr.points - pr.variable_points, 0, 0)) AS availablePoints,
+        sum(IF(pr.points_type = 1, pr.points, 0)) AS successStatus
+
+        FROM tz_user u
+        left JOIN tz_points_record pr ON pr.user_id = u.user_id
+        left join tz_channel c ON c.id = pr.channel_id
+        <where>
+
+        </where>
+    </select>
+
 </mapper>