Browse Source

1、处理问题

yys 1 tháng trước cách đây
mục cha
commit
6355fc6404

+ 35 - 0
fs-admin/src/main/java/com/fs/course/controller/FsUserCourseCategoryController.java

@@ -11,6 +11,7 @@ import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.course.domain.DuplicateFans;
 import com.fs.course.domain.FsUserCourse;
+import com.fs.course.dto.FsCourseCategoryImportDTO;
 import com.fs.framework.web.service.TokenService;
 import com.fs.his.domain.FsExportTask;
 import com.fs.his.domain.FsStoreProductCategory;
@@ -35,6 +36,7 @@ import com.fs.course.domain.FsUserCourseCategory;
 import com.fs.course.service.IFsUserCourseCategoryService;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.common.core.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 课堂分类Controller
@@ -207,4 +209,37 @@ public class FsUserCourseCategoryController extends BaseController
         List<OptionsVO> list = fsUserCourseCategoryService.selectCateListByPid(pid);
         return R.ok().put("data", list);
     }
+
+    // 下载模板
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate() {
+        ExcelUtil<FsCourseCategoryImportDTO> util = new ExcelUtil<>(FsCourseCategoryImportDTO.class);
+        return util.importTemplateExcel("课堂分类导入模板");
+    }
+
+    @Log(title = "导入", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('course:userCourseCategory:importData')")
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file) throws Exception {
+        ExcelUtil<FsCourseCategoryImportDTO> util = new ExcelUtil<>(FsCourseCategoryImportDTO.class);
+        List<FsCourseCategoryImportDTO> list = util.importExcel(file.getInputStream());
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long userId = loginUser.getUser().getUserId();
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        if (ObjectUtil.isEmpty(config.getIsBound()) || !config.getIsBound()){
+            userId = null;
+        }
+
+        return AjaxResult.success(fsUserCourseCategoryService.importData(list, userId));
+    }
+
+    @PreAuthorize("@ss.hasPermi('course:userCourseCategory:exportFail')")
+    @Log(title = "课堂分类", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportFail")
+    public AjaxResult exportFail(@RequestBody List<FsCourseCategoryImportDTO> list) {
+        ExcelUtil<FsCourseCategoryImportDTO> util = new ExcelUtil<>(FsCourseCategoryImportDTO.class);
+        return util.exportExcel(list, "课堂分类错误数据");
+    }
 }

+ 14 - 0
fs-service/src/main/java/com/fs/course/dto/FsCourseCategoryImportDTO.java

@@ -0,0 +1,14 @@
+package com.fs.course.dto;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class FsCourseCategoryImportDTO {
+
+    @Excel(name = "父分类")
+    private String rootCate;
+
+    @Excel(name = "子分类")
+    private String subCate;
+}

+ 20 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseCategoryMapper.java

@@ -104,4 +104,24 @@ public interface FsUserCourseCategoryMapper
     List<OptionsVO> selectAllFsUserCourseCategoryPidList();
 
     List<DuplicateFans> exportFans(@Param("courseNames") List<String> courseNames);
+
+    /**
+     * 查询公域分类
+     *
+     * @return
+     */
+    @Select("select cate_id dict_value, cate_name dict_label  from fs_user_course_category WHERE pid = 0 and is_del=0 and is_open_class = #{isOpenClass} ")
+    List<OptionsVO> selectFsUserCourseCategoryIsOpenClassList( @Param("isOpenClass") String isOpenClass);
+
+    /**
+     * 根据名称和上级ID查询分类
+     */
+    @Select("select * from fs_user_course_category where cate_name = #{name} and pid = #{parentId} and is_del = 0")
+    FsUserCourseCategory selectFsUserCourseCategoryByNameAndParentId(@Param("name") String name, @Param("parentId") Long parentId);
+
+    /**
+     * 获取序号
+     */
+    @Select("select ifnull(max(sort), 0) + 1 from fs_user_course_category where pid = #{parentId}")
+    Long getSortByParentId(@Param("parentId") Long parentId);
 }

+ 14 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCourseCategoryService.java

@@ -1,10 +1,12 @@
 package com.fs.course.service;
 
 import java.util.List;
+import java.util.Map;
 
 import com.fs.course.domain.DuplicateFans;
 import com.fs.course.domain.FsUserCourse;
 import com.fs.course.domain.FsUserCourseCategory;
+import com.fs.course.dto.FsCourseCategoryImportDTO;
 import com.fs.his.vo.OptionsVO;
 
 /**
@@ -73,4 +75,16 @@ public interface IFsUserCourseCategoryService
     List<OptionsVO> selectCateListByPid(Long pid);
 
     void exportFans(FsUserCourse param);
+    /**
+     * 课堂分类导入
+     */
+    Map<String, Object> importData(List<FsCourseCategoryImportDTO> list, Long userId);
+
+    /**
+     * 查询公域私域课程
+     *
+     * @param isOpenClass
+     * @return
+     */
+    List<OptionsVO> selectFsUserCourseCategoryIsOpenClassList(String isOpenClass);
 }

+ 90 - 2
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseCategoryServiceImpl.java

@@ -1,13 +1,16 @@
 package com.fs.course.service.impl;
 
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.course.domain.DuplicateFans;
 import com.fs.course.domain.FsUserCourse;
+import com.fs.course.dto.FsCourseCategoryImportDTO;
 import com.fs.his.domain.FsExportTask;
 import com.fs.his.mapper.FsExportTaskMapper;
 import com.fs.his.vo.OptionsVO;
@@ -143,4 +146,89 @@ public class FsUserCourseCategoryServiceImpl implements IFsUserCourseCategorySer
         task.setFileUrl(result.get("msg").toString());
         fsExportTaskMapper.updateFsExportTask(task);
     }
+
+    /**
+     * 课堂分类导入
+     */
+    @Override
+    public Map<String, Object> importData(List<FsCourseCategoryImportDTO> list, Long userId) {
+        int suCnt = 0;
+        int filCnt = 0;
+        List<FsCourseCategoryImportDTO> failedList = new ArrayList<>();
+
+        if (list == null || list.isEmpty()) {
+            throw new CustomException("导入数据不能为空");
+        }
+
+        Map<String, List<FsCourseCategoryImportDTO>> rootMap = list.stream()
+                .filter(dto -> StringUtils.isNotBlank(dto.getRootCate()))
+                .collect(Collectors.groupingBy(FsCourseCategoryImportDTO::getRootCate));
+        for (Map.Entry<String, List<FsCourseCategoryImportDTO>> entry : rootMap.entrySet()) {
+            if (StringUtils.isBlank(entry.getKey())) {
+                failedList.addAll(entry.getValue());
+                filCnt += entry.getValue().size();
+                continue;
+            }
+
+            String rootCate = entry.getKey().trim();
+            FsUserCourseCategory root = fsUserCourseCategoryMapper.selectFsUserCourseCategoryByNameAndParentId(rootCate, 0L);
+            if (Objects.isNull(root)) {
+                root = new FsUserCourseCategory();
+                root.setPid(0L);
+                root.setCateName(rootCate);
+                root.setSort(fsUserCourseCategoryMapper.getSortByParentId(0L));
+                root.setIsShow(1);
+                root.setCreateTime(new Date());
+                root.setIsDel(0);
+                root.setUserId(userId);
+                fsUserCourseCategoryMapper.insertFsUserCourseCategory(root);
+            }
+
+            Long parentId = root.getCateId();
+            long curSort = fsUserCourseCategoryMapper.getSortByParentId(root.getCateId());
+            List<FsCourseCategoryImportDTO> subList = entry.getValue();
+            for (FsCourseCategoryImportDTO child : subList) {
+                try {
+                    if (StringUtils.isBlank(child.getSubCate())) {
+                        failedList.add(child);
+                        filCnt++;
+                        continue;
+                    }
+
+                    String cateName = child.getSubCate().trim();
+                    FsUserCourseCategory sub = fsUserCourseCategoryMapper.selectFsUserCourseCategoryByNameAndParentId(cateName, parentId);
+                    if (Objects.nonNull(sub)) {
+                        failedList.add(child);
+                        filCnt++;
+                        continue;
+                    }
+
+                    sub = new FsUserCourseCategory();
+                    sub.setPid(parentId);
+                    sub.setCateName(cateName);
+                    sub.setSort(curSort++);
+                    sub.setIsShow(1);
+                    sub.setCreateTime(new Date());
+                    sub.setIsDel(0);
+                    sub.setUserId(userId);
+                    fsUserCourseCategoryMapper.insertFsUserCourseCategory(sub);
+
+                    suCnt++;
+                } catch (Exception e) {
+                    filCnt++;
+                }
+            }
+        }
+
+        String message = "导入完成!成功" + suCnt + "条,失败" + filCnt + "条。";
+        Map<String, Object> resp = new HashMap<>();
+        resp.put("message", message);
+        resp.put("failList", failedList);
+        return resp;
+    }
+
+    @Override
+    public List<OptionsVO> selectFsUserCourseCategoryIsOpenClassList(String isOpenClass) {
+        return fsUserCourseCategoryMapper.selectFsUserCourseCategoryIsOpenClassList(isOpenClass);
+    }
 }

+ 19 - 0
fs-service/src/main/java/com/fs/live/param/LiveCouponVerifyParam.java

@@ -0,0 +1,19 @@
+package com.fs.live.param;
+
+import lombok.Data;
+
+/**
+ * 直播优惠券核销参数
+ */
+@Data
+public class LiveCouponVerifyParam {
+
+    /** 核销码(扫码获取) */
+    private String verifyCode;
+
+    /** 优惠券发放记录id(可选,与核销码二选一) */
+    private Long couponUserId;
+
+    /** 销售用户ID(服务端填充) */
+    private Long verifyUserId;
+}

+ 74 - 0
fs-service/src/main/java/com/fs/live/vo/LiveCouponUserDetailVo.java

@@ -0,0 +1,74 @@
+package com.fs.live.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户优惠券详情(App端列表/详情展示)
+ */
+@Data
+public class LiveCouponUserDetailVo {
+
+    /** 优惠券发放记录id */
+    private Long id;
+
+    /** 优惠券模板id */
+    private Long couponId;
+
+    /** 优惠券所属用户 */
+    private Integer userId;
+
+    /** 优惠券名称 */
+    private String couponTitle;
+
+    /** 优惠券的面值 */
+    private BigDecimal couponPrice;
+
+    /** 最低消费多少金额可用优惠券 */
+    private BigDecimal useMinPrice;
+
+    /** 优惠券结束时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date limitTime;
+
+    /** 使用时间/核销时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date useTime;
+
+    /** 获取方式 */
+    private String type;
+
+    /** 状态(0:未核销,1:已核销,2:已过期) */
+    private Integer status;
+
+    /** 状态描述 */
+    private String statusName;
+
+    /** 是否有效 */
+    private Integer isFail;
+
+    /** 商品ID */
+    private Long goodsId;
+
+    /** 核销码(用于生成二维码) */
+    private String verifyCode;
+
+    /** 核销销售用户ID */
+    private Long verifyUserId;
+
+    /** 核销销售姓名 */
+    private String verifyUserName;
+
+    /** 领取时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /** 用户昵称 */
+    private String nickname;
+
+    /** 用户手机号 */
+    private String phone;
+}

+ 1 - 1
fs-service/src/main/resources/mapper/course/FsUserCourseMapper.xml

@@ -209,7 +209,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND c.is_show = #{maps.isShow}
         </if>
 
-        <if test="maps.companyIdsList != null and maps.companyIdsList.size() > 0">
+        <if test="maps.companyIdsList != null and maps.companyIdsList.length > 0">
             AND (
             <foreach collection="maps.companyIdsList"
                      item="item"