소스 검색

Merge branch 'import_250116' of http://git.dayaedu.com/yonge/cooleshow into develop-new

zouxuan 4 달 전
부모
커밋
4b40992823
16개의 변경된 파일749개의 추가작업 그리고 6개의 파일을 삭제
  1. 51 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/OpenFileImportInfoController.java
  2. 2 1
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/EImportType.java
  3. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/StudentDao.java
  4. 240 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/analysis/EntitlementsImportAnalysis.java
  5. 139 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/entity/EntitlementsImport.java
  6. 93 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/listener/EntitlementsImportListener.java
  7. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantAlbumMapper.java
  8. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/EasyExcelService.java
  9. 114 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/EasyExcelServiceImpl.java
  10. 28 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ExcelAnalyseCoreServiceImpl.java
  11. 8 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  12. 9 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  13. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java
  14. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java
  15. 13 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  16. 15 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMapper.xml

+ 51 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/OpenFileImportInfoController.java

@@ -0,0 +1,51 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.microsvc.toolkit.common.response.template.R;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.FileImportInfo;
+import com.yonge.cooleshow.biz.dal.service.ExcelAnalyseCoreService;
+import com.yonge.cooleshow.biz.dal.wrapper.FileImportInfoWrapper;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import static com.yonge.cooleshow.common.entity.HttpResponseResult.failed;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/fileImportInfo")
+@Api(tags = "文件数据导入")
+public class OpenFileImportInfoController {
+
+    @Autowired
+    private ExcelAnalyseCoreService excelAnalyseCoreService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "新增", notes = "文件数据导入- 传入 FileImportInfoVo.FileImportInfo")
+	@PostMapping("/save")
+	public HttpResponseResult<FileImportInfo> add(@Validated @RequestBody  FileImportInfoWrapper.FileImport info) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || user.getId() == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        // 新增数据
+        FileImportInfoWrapper.FileImportInfo wrapper = FileImportInfoWrapper.FileImportInfo.from(info.jsonString());
+        wrapper.setSysAccId(user.getId());
+
+        // 读取数据
+        return HttpResponseResult.succeed(excelAnalyseCoreService.analyseReadExcelData(wrapper));
+	}
+
+}

+ 2 - 1
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/EImportType.java

@@ -13,7 +13,8 @@ public enum EImportType implements BaseEnum<String, EImportType> {
 
     TENANT("机构收入"),
     TEACHER("老师导入"),
-    STUDENT("学生导入")
+    STUDENT("学生导入"),
+    ENTITLEMENTS("学生权益"),
     ;
 
     @EnumValue

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/StudentDao.java

@@ -87,4 +87,6 @@ public interface StudentDao extends BaseMapper<Student> {
     List<String> selectEntitlements(@Param("userId") Long userId);
 
     List<Long> selectInitEntitlements(@Param("page") IPage<Object> objectPage);
+
+    List<StudentWrapper.SmallStudent> selectStudentByPhoneList(@Param("phoneList") List<String> phoneList);
 }

+ 240 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/analysis/EntitlementsImportAnalysis.java

@@ -0,0 +1,240 @@
+package com.yonge.cooleshow.biz.dal.execl.analysis;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.enums.CellExtraTypeEnum;
+import com.alibaba.excel.metadata.Sheet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.microsvc.toolkit.middleware.excel.analysis.AnalysisContext;
+import com.microsvc.toolkit.middleware.excel.analysis.DataAnalysis;
+import com.microsvc.toolkit.middleware.excel.util.DownloadManager;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.TenantAccountRecord;
+import com.yonge.cooleshow.biz.dal.enums.PeriodEnum;
+import com.yonge.cooleshow.biz.dal.execl.entity.EntitlementsImport;
+import com.yonge.cooleshow.biz.dal.execl.entity.TenantAccountRecordImport;
+import com.yonge.cooleshow.biz.dal.execl.listener.EntitlementsImportListener;
+import com.yonge.cooleshow.biz.dal.execl.listener.TenantAccountRecordImportListener;
+import com.yonge.cooleshow.biz.dal.service.EasyExcelService;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+
+@Slf4j
+@Getter
+@Setter
+public class EntitlementsImportAnalysis extends DataAnalysis<EntitlementsImportAnalysis> {
+
+
+    private List<EntitlementsImport> entitlementsImports;
+
+    private Map<String, StudentWrapper.SmallStudent> studentMap;
+
+    private Map<Long, List<TenantAlbumWrapper.SmallTenantAlbum>> tenantAlbumMap;
+
+    // Excel解析服务
+    private EasyExcelService easyExcelService;
+
+    private final Map<String, EntitlementsImport> recordMap = Maps.newHashMap();
+    public EntitlementsImportAnalysis(AnalysisContext context) {
+        super(context);
+    }
+
+    public static EntitlementsImportAnalysis build(EasyExcelService easyExcelService) {
+        EntitlementsImportAnalysis analysis = new EntitlementsImportAnalysis(AnalysisContext.builder().build());
+        analysis.setEasyExcelService(easyExcelService);
+        analysis.setEntitlementsImports(Lists.newArrayList());
+        return analysis;
+
+    }
+
+
+    /**
+     * 读取文件数据到内存
+     *
+     * @param path 本地文件地址
+     */
+    @Override
+    public void read(String path) {
+
+        File file = new File(path);
+        List<Sheet> sheets = EasyExcel.read(file).build().getSheets();
+        if (CollectionUtils.isNotEmpty(sheets)) {
+
+            sheets.forEach(item -> {
+                // 读取数据
+                EasyExcel.read(file, EntitlementsImport.class, new EntitlementsImportListener(getEntitlementsImports(), item.getSheetName()))
+                        .extraRead(CellExtraTypeEnum.MERGE).sheet(item.getSheetName()).doRead();
+            });
+
+        }
+
+        // 删除本地缓存文件
+        DownloadManager.getInstance().deleteOnExit(path);
+    }
+
+    /**
+     * 校验数据合法
+     *
+     * @return Map<Integer, String>
+     */
+    @Override
+    public Map<Integer, String> verify() {
+
+        // 加载校验数据参数
+        if (Objects.nonNull(getEntitlementsImports())) {
+            loadVerifyParamData();
+        }
+
+        Map<Integer, String> verifyDataMap = Maps.newLinkedHashMap();
+
+        // 校验每条入库记录数据合法性
+        String ret = "";
+
+        for (EntitlementsImport item : getEntitlementsImports()) {
+
+            StudentWrapper.SmallStudent smallStudent = null;
+            if (StringUtils.isBlank(item.getName())) {
+                ret += "姓名不能为空;";
+            }
+            if (StringUtils.isBlank(item.getPhone())) {
+                ret += "手机号不能为空;";
+            } else {
+                smallStudent = studentMap.get(item.getPhone());
+                if (Objects.isNull(smallStudent)) {
+                    ret += "学生信息不存在或已注销;";
+                } else if (!smallStudent.getName().equals(item.getName())) {
+                    ret += "学生姓名与手机号不匹配;";
+                } else {
+                    item.setUserId(smallStudent.getUserId());
+                }
+            }
+            if (StringUtils.isBlank(item.getEntitlementName())) {
+                ret += "权益类型不能为空;";
+            } else if (item.getEntitlementName().equals("机构专辑")) {
+                if (StringUtils.isBlank(item.getTenantAlbumName())) {
+                    ret += "机构专辑名称不能为空;";
+                } else if (smallStudent != null) {
+                    if (MapUtils.isNotEmpty(tenantAlbumMap)) {
+                        List<TenantAlbumWrapper.SmallTenantAlbum> tenantAlbums = tenantAlbumMap.get(smallStudent.getTenantId());
+                        if (CollectionUtils.isEmpty(tenantAlbums)) {
+                            ret += "机构专辑不存在;";
+                        } else {
+                            List<TenantAlbumWrapper.SmallTenantAlbum> collect = tenantAlbums.stream()
+                                    .filter(o -> o.getName().equals(item.getTenantAlbumName())).collect(Collectors.toList());
+                            if (CollectionUtils.isEmpty(collect)) {
+                                ret += "机构专辑不存在;";
+                            }else if (collect.size() > 1) {
+                                ret += "机构专辑名称重复;";
+                            } else {
+                                item.setTenantAlbumId(collect.get(0).getId());
+                            }
+                        }
+                    }
+                }
+                item.setEntitlementType("TENANT_ALBUM");
+            }else {
+                // VIP/SVIP/畅学卡/机构专辑
+                switch (item.getEntitlementName()) {
+                    case "VIP":
+                        item.setEntitlementType("VIP");
+                        break;
+                    case "SVIP":
+                        item.setEntitlementType("SVIP");
+                        break;
+                    case "畅学卡":
+                        item.setEntitlementType("DISCOUNT");
+                        break;
+                    default:
+                        ret += "权益类型错误;";
+                }
+            }
+            if (item.getPeriod() == null) {
+                ret += "周期错误;";
+            } else if (item.getPeriod() == PeriodEnum.PERPETUAL) {
+                if (!"SVIP".equals(item.getEntitlementType()) && "TENANT_ALBUM".equals(item.getEntitlementType())) {
+                    ret += "仅SVIP、机构专辑支持永久;";
+                }
+                item.setNumber("100");
+            } else if (StringUtils.isBlank(item.getNumber())) {
+                ret += "数量不能为空;";
+            } else {
+                try {
+                    Integer.parseInt(item.getNumber());
+                } catch (NumberFormatException e) {
+                    ret += "数量错误;";
+                }
+            }
+            if (StringUtils.isBlank(item.getReason())) {
+                ret += "原因不能为空;";
+            }
+            if (item.getSendPush()== null) {
+                ret += "是否发送推送错误;";
+            }
+            if (StringUtils.isNotEmpty(ret)) {
+                verifyDataMap.put(item.getRowIndex(), ret);
+                ret = ""; // 重置数据状态
+            }
+        }
+
+        // 数据校验记录信息
+        getContext().total(getEntitlementsImports().size()).failure(verifyDataMap.size())
+                .setSuccess(getContext().getTotal() - getContext().getFailure());
+
+        return verifyDataMap;
+    }
+
+    /**
+     * 数据转换
+     */
+    @Override
+    public void convert() {
+
+    }
+
+    /**
+     * 加载校验数据参数
+     */
+    private void loadVerifyParamData() {
+
+        // 手机号, 查询学生用户信息
+        List<String> phoneList = getEntitlementsImports().stream().map(EntitlementsImport::getPhone).distinct().collect(Collectors.toList());
+
+        studentMap = easyExcelService.getStudentMap(phoneList);
+
+        // 查询机构专辑
+        List<Long> tenantIds = studentMap.values().stream().map(o -> o.getTenantId())
+                .filter(Objects::nonNull)
+                .filter(o -> o > 0)
+                .distinct().collect(Collectors.toList());
+        tenantAlbumMap = easyExcelService.getTenantAlbumMap(tenantIds);
+
+
+    }
+
+
+    /**
+     * 数据对象
+     * @return RoomInfoAnalysis
+     */
+    @Override
+    public EntitlementsImportAnalysis get() {
+        return this;
+    }
+
+}

+ 139 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/entity/EntitlementsImport.java

@@ -0,0 +1,139 @@
+package com.yonge.cooleshow.biz.dal.execl.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.yonge.cooleshow.biz.dal.enums.PeriodEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class EntitlementsImport {
+
+
+    @ExcelProperty("学生姓名")
+    private String name;
+
+    @ExcelProperty("手机号")
+    private String phone;
+
+    @ExcelProperty("权益类型")
+    private String entitlementName;
+
+    @ExcelProperty("专辑名称")
+    private String tenantAlbumName;
+
+    @ExcelProperty("数量")
+    private String number;
+
+    @ExcelProperty(value = "周期",converter = PeriodEnumConverter.class)
+    private PeriodEnum period;
+
+    @ExcelProperty("原因")
+    private String reason;
+
+    @ExcelProperty(value = "是否发送推送",converter = BooleanConverter.class)
+    private Boolean sendPush;
+
+
+    @ExcelIgnore
+    private Integer rowIndex;
+    @ExcelIgnore
+    private String sheetName;
+
+    @ExcelIgnore
+    private Long userId;
+
+    @ExcelIgnore
+    private Long tenantId;
+
+    @ExcelIgnore
+    private Long tenantAlbumId;
+
+    @ExcelIgnore
+    private String entitlementType;
+
+
+    public EntitlementsImport rowIndex(Integer rowIndex) {
+        this.rowIndex = rowIndex;
+        return this;
+    }
+
+    public EntitlementsImport sheetName(String sheetName) {
+        this.sheetName = sheetName;
+        return this;
+    }
+
+    private class PeriodEnumConverter implements Converter {
+        @Override
+        public Class<PeriodEnum> supportJavaTypeKey() {
+            return PeriodEnum.class;
+        }
+
+        @Override
+        public CellDataTypeEnum supportExcelTypeKey() {
+            return CellDataTypeEnum.STRING;
+        }
+
+        @Override
+        public PeriodEnum convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+            String stringValue = cellData.getStringValue();
+            if (StringUtils.isNotEmpty(stringValue)) {
+                switch (stringValue) {
+                    case "天":
+                        return PeriodEnum.DAY;
+                    case "月":
+                        return PeriodEnum.MONTH;
+                    case "年":
+                        return PeriodEnum.YEAR;
+                    case "永久":
+                        return PeriodEnum.PERPETUAL;
+                }
+            }
+            return null;
+        }
+
+        @Override
+        public CellData convertToExcelData(Object value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+            return null;
+        }
+    }
+
+
+    public static class BooleanConverter implements Converter<Boolean> {
+
+        @Override
+        public Class<Boolean> supportJavaTypeKey() {
+            return Boolean.class;
+        }
+
+        @Override
+        public CellDataTypeEnum supportExcelTypeKey() {
+            return CellDataTypeEnum.STRING;
+        }
+
+        @Override
+        public Boolean convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+            String stringValue = cellData.getStringValue();
+            if (StringUtils.isNotEmpty(stringValue)) {
+                return "是".equals(stringValue) || "1".equals(stringValue);
+            }
+            return null;
+        }
+
+        @Override
+        public CellData convertToExcelData(Boolean aBoolean, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+            return null;
+        }
+    }
+}

+ 93 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/listener/EntitlementsImportListener.java

@@ -0,0 +1,93 @@
+package com.yonge.cooleshow.biz.dal.execl.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.enums.RowTypeEnum;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.metadata.CellExtra;
+import com.google.common.collect.Lists;
+import com.yonge.cooleshow.biz.dal.execl.entity.EntitlementsImport;
+import com.yonge.cooleshow.biz.dal.execl.entity.TenantAccountRecordImport;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 课件信息读取监听器
+ * Created by Eric.Shang on 2020/7/1.
+ */
+@Slf4j
+@Getter
+public class EntitlementsImportListener extends AnalysisEventListener<EntitlementsImport> {
+
+    // 课件信息
+    private final List<EntitlementsImport> importList;
+    // sheet名称
+    private final String sheetName;
+    // 合并标识
+    private Boolean mergeFlag;
+
+    public EntitlementsImportListener(List<EntitlementsImport> examinations, String sheetName) {
+        // 单元测试数据
+        this.importList = Optional.ofNullable(examinations).orElse(Lists.newArrayList());
+        // sheet名称
+        this.sheetName = sheetName;
+    }
+
+    /**
+     * 读取每行数据触发
+     * @param  examination 数据内容
+     * @param analysisContext AnalysisContext
+     */
+    @Override
+    public void invoke(EntitlementsImport examination, AnalysisContext analysisContext) {
+        // 忽略空行读取
+        //analysisContext.readWorkbookHolder().setIgnoreEmptyRow(false);
+        // 读取数据
+        getImportList().add(examination.rowIndex(getImportList().size() + 2).sheetName(getSheetName()));
+    }
+
+    /**
+     * 空行数据判定
+     * @param context AnalysisContext
+     * @return boolean
+     */
+    @Override
+    public boolean hasNext(AnalysisContext context) {
+        // 忽略空行判定
+        if (RowTypeEnum.EMPTY.equals(context.readRowHolder().getRowType())){
+            doAfterAllAnalysed(context);
+            return false;
+        }
+
+        return super.hasNext(context);
+    }
+
+    /**
+     * 数据解板读完触发
+     * @param analysisContext AnalysisContext
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
+    }
+
+    /**
+     * 额外信息(批注、超链接、合并单元格信息读取)
+     * @param extra CellExtra
+     * @param context AnalysisContext
+     */
+    @Override
+    public void extra(CellExtra extra, AnalysisContext context) {
+        switch (extra.getType()) {
+            case MERGE:
+                mergeFlag = false;
+                break;
+            case COMMENT:
+            case HYPERLINK:
+            default:
+                break;
+        }
+    }
+}

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantAlbumMapper.java

@@ -23,5 +23,6 @@ public interface TenantAlbumMapper extends BaseMapper<TenantAlbum> {
 	 * @return List<TenantAlbumWrapper.TenantAlbum>
 	 */
 	List<TenantAlbumWrapper.TenantAlbum> selectPage(@Param("page") IPage<TenantAlbumWrapper.TenantAlbum> page, @Param("param") TenantAlbumWrapper.TenantAlbumQuery param);
-	
+
+	List<TenantAlbumWrapper.SmallTenantAlbum> selectListByTenantIds(@Param("tenantIds") List<Long> tenantIds);
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/EasyExcelService.java

@@ -1,6 +1,11 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.TenantAccountRecord;
+import com.yonge.cooleshow.biz.dal.entity.TenantAlbum;
+import com.yonge.cooleshow.biz.dal.execl.entity.EntitlementsImport;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
 
 import java.util.List;
 import java.util.Map;
@@ -26,6 +31,12 @@ public interface EasyExcelService {
     //获取机构map
     Map<String,Long> getTenantMap();
 
+    Map<String, StudentWrapper.SmallStudent> getStudentMap(List<String> phoneList);
+
+    Map<Long, List<TenantAlbumWrapper.SmallTenantAlbum>> getTenantAlbumMap(List<Long> tenantIds);
+
+    void importEntitlements(List<EntitlementsImport> entitlementsImports,Long createId);
+
     //获取小组map
     Map<String,Long> getTenantGroupMap();
 

+ 114 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/EasyExcelServiceImpl.java

@@ -1,5 +1,20 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.StudentDao;
+import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.EVipRecordStatus;
+import com.yonge.cooleshow.biz.dal.enums.EVipType;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import com.yonge.cooleshow.biz.dal.execl.entity.EntitlementsImport;
+import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMapper;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.wrapper.DiscountCardRecordWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.VipCardRecordWrapper;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.TenantAccountRecord;
 import com.yonge.cooleshow.biz.dal.entity.TenantGroup;
@@ -7,11 +22,17 @@ import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
 import com.yonge.cooleshow.biz.dal.service.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.redisson.api.RLock;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -33,6 +54,21 @@ public class EasyExcelServiceImpl implements EasyExcelService {
     @Resource
     private SysUserService sysUserService;
 
+    @Autowired
+    private StudentDao studentDao;
+
+    @Autowired
+    private TenantAlbumMapper tenantAlbumMapper;
+
+    @Autowired
+    private VipCardRecordService vipCardRecordService;
+
+    @Autowired
+    private DiscountCardRecordService discountCardRecordService;
+
+    @Autowired
+    private UserTenantAlbumRecordService userTenantAlbumRecordService;
+
     @Override
     public List<TenantAccountRecord> getRecordById(List<String> ids) {
         return tenantAccountRecordService.lambdaQuery()
@@ -54,6 +90,84 @@ public class EasyExcelServiceImpl implements EasyExcelService {
     }
 
     @Override
+    public Map<String, StudentWrapper.SmallStudent> getStudentMap(List<String> phoneList) {
+        if (CollectionUtils.isEmpty(phoneList)) {
+            return Collections.emptyMap();
+        }
+        List<StudentWrapper.SmallStudent> smallStudents = studentDao.selectStudentByPhoneList(phoneList);
+        if (CollectionUtils.isEmpty(smallStudents)) {
+            return Collections.emptyMap();
+        }
+        return smallStudents.stream().collect(Collectors.toMap(StudentWrapper.SmallStudent::getPhone, o->o, (o1, o2) -> o1));
+
+    }
+
+    @Override
+    public Map<Long, List<TenantAlbumWrapper.SmallTenantAlbum>> getTenantAlbumMap(List<Long> tenantIds) {
+        if (CollectionUtils.isEmpty(tenantIds)) {
+            return Collections.emptyMap();
+        }
+        List<TenantAlbumWrapper.SmallTenantAlbum> smallTenantAlbums = tenantAlbumMapper.selectListByTenantIds(tenantIds);
+        if (CollectionUtils.isEmpty(smallTenantAlbums)) {
+            return Collections.emptyMap();
+        }
+        return smallTenantAlbums.stream().collect(Collectors.groupingBy(TenantAlbumWrapper.SmallTenantAlbum::getTenantId));
+
+
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void importEntitlements(List<EntitlementsImport> entitlementsImports,Long createId) {
+        for (EntitlementsImport entitlementsImport : entitlementsImports) {
+            switch (entitlementsImport.getEntitlementType()) {
+                case "TENANT_ALBUM":
+
+                    // 新增数据
+                    UserTenantAlbumRecord userTenantAlbumRecord = new UserTenantAlbumRecord();
+                    userTenantAlbumRecord.setTenantId(entitlementsImport.getTenantId());
+                    userTenantAlbumRecord.setTenantAlbumId(entitlementsImport.getTenantAlbumId());
+                    userTenantAlbumRecord.setTimes(StringUtils.isBlank(entitlementsImport.getNumber())?100:Integer.parseInt(entitlementsImport.getNumber()));
+                    userTenantAlbumRecord.setType(entitlementsImport.getPeriod().getCode());
+                    userTenantAlbumRecord.setReason(entitlementsImport.getReason());
+                    userTenantAlbumRecord.setUserId(entitlementsImport.getUserId());
+                    userTenantAlbumRecord.setClientType(ClientEnum.STUDENT);
+                    userTenantAlbumRecord.setSourceType(SourceTypeEnum.BACKEND_GIVE);
+                    userTenantAlbumRecord.setCreateBy(createId);
+                    userTenantAlbumRecordService.add(userTenantAlbumRecord,entitlementsImport.getSendPush());
+                    break;
+                case "VIP":
+                case "SVIP":
+                    VipCardRecordWrapper.AddVipCardRecord addVipCardRecord = new VipCardRecordWrapper.AddVipCardRecord();
+                    addVipCardRecord.setUserId(entitlementsImport.getUserId());
+                    addVipCardRecord.setClientType(ClientEnum.STUDENT);
+                    addVipCardRecord.setStatus(EVipRecordStatus.ADD);
+                    addVipCardRecord.setVipType(EVipType.valueOf(entitlementsImport.getEntitlementType()));
+                    addVipCardRecord.setType(entitlementsImport.getPeriod());
+                    addVipCardRecord.setTimes(StringUtils.isBlank(entitlementsImport.getNumber())?100:Integer.parseInt(entitlementsImport.getNumber()));
+                    addVipCardRecord.setReason(entitlementsImport.getReason());
+                    addVipCardRecord.setSendMsg(entitlementsImport.getSendPush());
+                    addVipCardRecord.setCreateBy(createId);
+                    addVipCardRecord.setSourceType(SourceTypeEnum.BACKEND_GIVE);
+                    vipCardRecordService.add(addVipCardRecord);
+                    break;
+                case "DISCOUNT":
+                    DiscountCardRecordWrapper.AddDiscountCardRecord addDiscountCardRecord = new DiscountCardRecordWrapper.AddDiscountCardRecord();
+                    addDiscountCardRecord.setUserId(entitlementsImport.getUserId());
+                    addDiscountCardRecord.setClientType(ClientEnum.STUDENT);
+                    addDiscountCardRecord.setCreateBy(createId);
+                    addDiscountCardRecord.setType(entitlementsImport.getPeriod());
+                    addDiscountCardRecord.setTimes(StringUtils.isBlank(entitlementsImport.getNumber())?100:Integer.parseInt(entitlementsImport.getNumber()));
+                    addDiscountCardRecord.setReason(entitlementsImport.getReason());
+                    addDiscountCardRecord.setSendMsg(entitlementsImport.getSendPush());
+                    discountCardRecordService.addStudentVip(addDiscountCardRecord);
+                    break;
+            }
+        }
+
+    }
+
+    @Override
     public Map<String, Long> getTenantGroupMap() {
         List<TenantGroup> list = tenantGroupService.lambdaQuery().list();
         return CollectionUtils.isEmpty(list) ? null : list.stream().collect(Collectors.toMap(TenantGroup::getName, TenantGroup::getId));

+ 28 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ExcelAnalyseCoreServiceImpl.java

@@ -7,9 +7,12 @@ import com.microsvc.toolkit.middleware.excel.analysis.AnalysisContext;
 import com.microsvc.toolkit.middleware.oss.OssPluginContext;
 import com.microsvc.toolkit.middleware.oss.impl.TencentOssPlugin;
 import com.yonge.cooleshow.biz.dal.entity.FileImportInfo;
+import com.yonge.cooleshow.biz.dal.execl.analysis.EntitlementsImportAnalysis;
 import com.yonge.cooleshow.biz.dal.execl.analysis.StudentImportAnalysis;
 import com.yonge.cooleshow.biz.dal.execl.analysis.TeacherImportAnalysis;
 import com.yonge.cooleshow.biz.dal.execl.analysis.TenantAccountRecordImportAnalysis;
+import com.yonge.cooleshow.biz.dal.execl.entity.EntitlementsImport;
+import com.yonge.cooleshow.biz.dal.execl.entity.TeacherImportWrapper;
 import com.yonge.cooleshow.biz.dal.execl.entity.TenantAccountRecordImport;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.wrapper.FileImportInfoWrapper;
@@ -96,6 +99,10 @@ public class ExcelAnalyseCoreServiceImpl implements ExcelAnalyseCoreService {
                     break;
                 case STUDENT: // 学生导入
                     readStudentExcelData(wrapper);
+
+                    break;
+                case  ENTITLEMENTS:
+                    readEntitlementsExcelData(wrapper);
                     break;
                 default:
                     break;
@@ -143,6 +150,27 @@ public class ExcelAnalyseCoreServiceImpl implements ExcelAnalyseCoreService {
         tenantAccountRecordService.updatePostStatus(collect);
     }
 
+
+    private void readEntitlementsExcelData(FileImportInfoWrapper.FileImportInfo wrapper) {
+
+        // 解析excel文件,生成EchoInfoAnalysis对象
+        EntitlementsImportAnalysis analysis = EntitlementsImportAnalysis.build(easyExcelService).start(wrapper.getImportUrl()).get();
+
+        AnalysisContext context = analysis.getContext();
+        // 生成导入数据记录
+        createFileImportRecord(wrapper, context);
+
+        // 入库业务数据
+        List<EntitlementsImport> collect = analysis.getEntitlementsImports().stream()
+                .collect(Collectors.toList());
+        if (context.getFailure() > 0) {
+            log.info("readEntitlementsExcelData collect.size={}", collect.size());
+            return;
+        }
+
+        easyExcelService.importEntitlements(collect,wrapper.getSysAccId());
+    }
+
     private void readTeacherExcelData(FileImportInfoWrapper.FileImportInfo wrapper) {
 
         // 解析excel文件,生成EchoInfoAnalysis对象

+ 8 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java

@@ -53,6 +53,7 @@ import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
 import com.yonge.toolset.utils.string.ValueUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.kafka.common.protocol.types.Field;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.BeanUtils;
@@ -665,8 +666,11 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         if (org.apache.commons.collections.CollectionUtils.isNotEmpty(updateUsers)) {
             sysUserMapper.batchUpdate(updateUsers);
         }
+        List<SysUser> userByPhones = sysUserMapper.findUserByPhones(studentImports.stream()
+                .map(StudentImportWrapper.StudentImport::getPhone).collect(Collectors.toList()));
+        Map<String, Long> userByPhoneMap = userByPhones.stream().collect(Collectors.toMap(SysUser::getPhone, SysUser::getId));
         //获取所有用户编号
-        List<Long> userIds = sysUsers.stream().map(SysUser::getId).collect(Collectors.toList());
+        List<Long> userIds = userByPhones.stream().map(SysUser::getId).collect(Collectors.toList());
         //机构学员添加机构绑定记录
         List<UserTenantBindRecord> userTenantBindRecords = userTenantBindRecordService.lambdaQuery().in(UserTenantBindRecord::getUserId, userIds).list();
         Map<Long, UserTenantBindRecord> userTenantBindRecordMap = userTenantBindRecords.stream().collect(Collectors.toMap(UserTenantBindRecord::getUserId, o -> o));
@@ -676,9 +680,11 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
                 .collect(Collectors.toMap(StudentImportWrapper.StudentImport::getPhone, o -> o));
         List<Student> students = new ArrayList<>();
         for (SysUser sysUser : sysUsers) {
+            Long userId = userByPhoneMap.get(sysUser.getPhone());
+            sysUser.setId(userId);
             StudentImportWrapper.StudentImport studentImport = studentImportMap.get(sysUser.getPhone());
             Student student = new Student();
-            student.setUserId(sysUser.getId());
+            student.setUserId(userId);
             student.setTenantId(sysUser.getTenantId());
             student.setSubjectId(studentImport.getSubjectId().toString());
             student.setAvatar(sysUser.getAvatar());

+ 9 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java

@@ -26,6 +26,7 @@ import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
 import com.yonge.cooleshow.biz.dal.enums.TeacherTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.im.EImUserFriendSourceForm;
+import com.yonge.cooleshow.biz.dal.execl.entity.StudentImportWrapper;
 import com.yonge.cooleshow.biz.dal.execl.entity.TeacherImportWrapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantGroupMapper;
 import com.yonge.cooleshow.biz.dal.mapper.UserTenantBindRecordMapper;
@@ -1743,9 +1744,13 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             sysUserMapper.batchUpdate(updateUsers);
         }
         //保存老师信息
-        Map<String,TeacherImportWrapper.TeacherImport> teacherImportMap = teacherImports.stream().collect(Collectors.toMap(TeacherImportWrapper.TeacherImport::getPhone, o -> o));
+        Map<String,TeacherImportWrapper.TeacherImport> teacherImportMap = teacherImports.stream()
+                .collect(Collectors.toMap(TeacherImportWrapper.TeacherImport::getPhone, o -> o));
+        List<SysUser> userByPhones = sysUserMapper.findUserByPhones(teacherImports.stream()
+                .map(TeacherImportWrapper.TeacherImport::getPhone).collect(Collectors.toList()));
+        Map<String, Long> userByPhoneMap = userByPhones.stream().collect(Collectors.toMap(SysUser::getPhone, SysUser::getId));
         //获取所有用户编号
-        List<Long> userIds = sysUsers.stream().map(SysUser::getId).collect(Collectors.toList());
+        List<Long> userIds = userByPhones.stream().map(SysUser::getId).collect(Collectors.toList());
         //获取所有老师账户表
         List<UserAccount> userAccounts = userAccountService.lambdaQuery().in(UserAccount::getUserId, userIds).list();
         Map<Long, UserAccount> userAccountMap = userAccounts.stream().collect(Collectors.toMap(UserAccount::getUserId, o -> o));
@@ -1758,6 +1763,8 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
         List<Teacher> teachers = new ArrayList<>();
         for (SysUser sysUser : sysUsers) {
+            Long userId = userByPhoneMap.get(sysUser.getPhone());
+            sysUser.setId(userId);
             //老师表初始化
             TeacherImportWrapper.TeacherImport teacherImport = teacherImportMap.get(sysUser.getPhone());
             teacherImport.setUserId(sysUser.getId());

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java

@@ -248,4 +248,16 @@ public class StudentWrapper {
         @ApiModelProperty("声部")
         private String subjectName;
     }
+
+    @Data
+    public static class SmallStudent {
+
+        private Long userId;
+
+        private String name;
+
+        private String phone;
+
+        private Long tenantId;
+    }
 }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java

@@ -400,4 +400,14 @@ public class TenantAlbumWrapper {
         private BigDecimal price;
     }
 
+    @Data
+    public static class SmallTenantAlbum {
+        // 专辑id
+        private Long id;
+        // 专辑名称
+        private String name;
+       // 专辑机构ID
+        private Long tenantId;
+
+    }
 }

+ 13 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -428,4 +428,17 @@
     <select id="selectInitEntitlements" resultType="java.lang.Long">
         select user_id_ from student
     </select>
+
+    <select id="selectStudentByPhoneList"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper$SmallStudent">
+        SELECT
+           t.user_id_ as userId,u.username_ as name ,u.phone_ as phone,t.tenant_id_ as tenantId
+        from student t
+        left join sys_user u on t.user_id_ = u.id_
+        where u.phone_ in
+        <foreach collection="phoneList" item="phone" separator="," open="(" close=")">
+            #{phone}
+        </foreach>
+        and u.del_flag_ = 0
+    </select>
 </mapper>

+ 15 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMapper.xml

@@ -47,4 +47,19 @@
         </where>
         order by t.create_time_ DESC
     </select>
+
+    <select id="selectListByTenantIds"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper$SmallTenantAlbum">
+        SELECT
+            t.id_ as id ,
+        t.name_ as name,
+        r.tenant_id_ as tenantId
+        from tenant_album t
+        left join tenant_album_ref r on t.id_ = r.tenant_album_id_
+        where tenant_id_ in
+        <foreach collection="tenantIds" item="tenantId" open="(" close=")" separator=",">
+            #{tenantId}
+        </foreach>
+        and t.del_flag_ =0 and t.status_ = 1
+    </select>
 </mapper>