Ver código fonte

Merge branch 'import_250116' into test

刘俊驰 4 meses atrás
pai
commit
58bdfb8202
40 arquivos alterados com 2154 adições e 203 exclusões
  1. 0 12
      audio-analysis/src/main/resources/logback-spring.xml
  2. 51 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/OpenFileImportInfoController.java
  3. 23 39
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java
  4. 20 25
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java
  5. 0 13
      cooleshow-app/src/main/resources/logback-spring.xml
  6. 0 12
      cooleshow-auth/auth-server/src/main/resources/logback-spring.xml
  7. 0 13
      cooleshow-cms/src/main/resources/logback-spring.xml
  8. 0 5
      cooleshow-common/pom.xml
  9. 4 1
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/EImportType.java
  10. 0 5
      cooleshow-gateway/gateway-web/pom.xml
  11. 0 13
      cooleshow-gateway/gateway-web/src/main/resources/logback-spring.xml
  12. 0 13
      cooleshow-mall/mall-admin/src/main/resources/logback-spring.xml
  13. 0 5
      cooleshow-mall/mall-common/pom.xml
  14. 0 13
      cooleshow-mall/mall-portal/src/main/resources/logback-spring.xml
  15. 0 12
      cooleshow-task/src/main/resources/logback-spring.xml
  16. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/StudentDao.java
  17. 240 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/analysis/EntitlementsImportAnalysis.java
  18. 221 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/analysis/StudentImportAnalysis.java
  19. 235 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/analysis/TeacherImportAnalysis.java
  20. 139 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/entity/EntitlementsImport.java
  21. 140 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/entity/StudentImportWrapper.java
  22. 142 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/entity/TeacherImportWrapper.java
  23. 93 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/listener/EntitlementsImportListener.java
  24. 92 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/listener/StudentImportListener.java
  25. 92 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/listener/TeacherImportListener.java
  26. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/SysUserMapper.java
  27. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantAlbumMapper.java
  28. 29 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/EasyExcelService.java
  29. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java
  30. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  31. 157 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/EasyExcelServiceImpl.java
  32. 80 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ExcelAnalyseCoreServiceImpl.java
  33. 111 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  34. 140 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  35. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/FileImportInfoWrapper.java
  36. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java
  37. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java
  38. 13 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  39. 65 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysUserMapper.xml
  40. 15 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMapper.xml

+ 0 - 12
audio-analysis/src/main/resources/logback-spring.xml

@@ -26,16 +26,6 @@
 			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
 		</encoder>
 	</appender>
-	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
-		<appName>cooleshow-audio</appName>
-		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
-		<redisAuth>dyym</redisAuth>
-		<model>sentinel</model>
-		<masterName>mymaster</masterName>
-		<env>prod</env>
-		<redisDb>10</redisDb>
-		<runModel>2</runModel>
-	</appender>
 
 	<logger name="com.yonge" level="info" />
 
@@ -67,14 +57,12 @@
 		<root level="WARN">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 	<springProfile name="prod">
 		<root level="WARN">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 

+ 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("${app-config.url.admin:}/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));
+	}
+
+}

+ 23 - 39
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java

@@ -1,26 +1,18 @@
 package com.yonge.cooleshow.admin.controller;
 
+import cn.hutool.core.net.URLEncodeUtil;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.dto.VipSubmitReq;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VipRecordSearch;
-import com.yonge.cooleshow.biz.dal.entity.Student;
-import com.yonge.cooleshow.biz.dal.entity.TenantActivationCode;
-import com.yonge.cooleshow.biz.dal.entity.TenantAlbumPurchase;
-import com.yonge.cooleshow.biz.dal.entity.TenantGroup;
-import com.yonge.cooleshow.biz.dal.entity.TenantGroupAlbum;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.service.MemberPriceSettingsService;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
-import com.yonge.cooleshow.biz.dal.service.TenantAlbumPurchaseService;
-import com.yonge.cooleshow.biz.dal.service.TenantGroupAlbumService;
-import com.yonge.cooleshow.biz.dal.service.TenantGroupService;
-import com.yonge.cooleshow.biz.dal.service.VipCardRecordService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
 import com.yonge.cooleshow.biz.dal.vo.VipRecordVo;
+import com.yonge.cooleshow.biz.dal.wrapper.FileImportInfoWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -39,55 +31,39 @@ import io.swagger.annotations.ApiOperation;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-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 org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("${app-config.url.admin:}/student")
 @Api(value = "学生表", tags = "学生表")
 public class StudentController extends BaseController {
-    @Autowired
+    @Resource
     private StudentService studentService;
-
     @Resource
     private SysUserFeignService sysUserFeignService;
-
-    @Autowired
-    private MemberPriceSettingsService memberPriceSettingsService;
-
-    @Autowired
+    @Resource
     private VipCardRecordService vipCardRecordService;
-
-    @Autowired
+    @Resource
     private TenantGroupService tenantGroupService;
-
-    @Autowired
+    @Resource
     private TenantActivationCodeService tenantActivationCodeService;
-    @Autowired
+    @Resource
     private TenantAlbumPurchaseService tenantAlbumPurchaseService;
-    @Autowired
+    @Resource
     private TenantGroupAlbumService tenantGroupAlbumService;
+    @Resource
+    private ExcelAnalyseCoreService excelAnalyseCoreService;
 
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "详情", notes = "传入id")
@@ -329,6 +305,14 @@ public class StudentController extends BaseController {
         return succeed();
     }
 
+    @PostMapping("/import")
+    @ApiOperation(value = "学员导入")
+    public HttpResponseResult<FileImportInfo> importFile(@RequestBody FileImportInfoWrapper.FileImport wrapper) {
+        // 读取数据
+        return HttpResponseResult.succeed(excelAnalyseCoreService.analyseReadExcelData(
+                JSON.parseObject(JSON.toJSONString(wrapper), FileImportInfoWrapper.FileImportInfo.class)));
+    }
+
     @PostMapping("/update")
     @ApiOperation(value = "修改", notes = "传入Student")
     public HttpResponseResult<Boolean> update(@Validated @RequestBody StudentWrapper.Student student) {

+ 20 - 25
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.admin.controller;
 
+import cn.hutool.core.net.URLEncodeUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.admin.io.request.TeacherBindingUserVo;
@@ -7,25 +8,22 @@ import com.yonge.cooleshow.admin.io.request.teacher.TeacherVO;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.TeacherDto;
-import com.yonge.cooleshow.biz.dal.dto.VipSubmitReq;
 import com.yonge.cooleshow.biz.dal.dto.req.TeacherSubmitReq;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VipRecordSearch;
+import com.yonge.cooleshow.biz.dal.entity.FileImportInfo;
 import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.queryInfo.TeacherBindingUserQueryInfo;
 import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
-import com.yonge.cooleshow.biz.dal.service.ImGroupService;
-import com.yonge.cooleshow.biz.dal.service.MemberPriceSettingsService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
-import com.yonge.cooleshow.biz.dal.service.UserBindingTeacherService;
-import com.yonge.cooleshow.biz.dal.service.VipCardRecordService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.MyFens;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 import com.yonge.cooleshow.biz.dal.vo.VipRecordVo;
 import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingCourseWrapper;
 import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.FileImportInfoWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -44,16 +42,9 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
@@ -73,21 +64,16 @@ public class TeacherController extends BaseController {
 
     @Resource
     private SysUserFeignService sysUserFeignService;
-    @Autowired
+    @Resource
     private TeacherService teacherService;
-
-    @Autowired
-    private MemberPriceSettingsService memberPriceSettingsService;
-
-
-    @Autowired
+    @Resource
     private VipCardRecordService vipCardRecordService;
-
-    @Autowired
+    @Resource
     private UserBindingTeacherService userBindingTeacherService;
-
-    @Autowired
+    @Resource
     private ImGroupService imGroupService;
+    @Resource
+    private ExcelAnalyseCoreService excelAnalyseCoreService;
 
     /**
      * 查询单条
@@ -167,6 +153,15 @@ public class TeacherController extends BaseController {
         return teacherService.submit(teacherSubmitReq);
     }
 
+    @PostMapping("/import")
+    @ApiOperation(value = "老师导入")
+    @PreAuthorize("@pcs.hasPermissions('teacher/import')")
+    public HttpResponseResult<FileImportInfo> importFile(@RequestBody FileImportInfoWrapper.FileImport wrapper) {
+        // 读取数据
+        return HttpResponseResult.succeed(excelAnalyseCoreService.analyseReadExcelData(
+                JSON.parseObject(JSON.toJSONString(wrapper), FileImportInfoWrapper.FileImportInfo.class)));
+    }
+
     @PostMapping("/updateTenant")
     @ApiOperation(value = "新增或修改机构", notes = "传入teacher")
     @PreAuthorize("@pcs.hasPermissions('teacher/updateTenant')")

+ 0 - 13
cooleshow-app/src/main/resources/logback-spring.xml

@@ -41,17 +41,6 @@
 			<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%t] %p %c{0} %m%n</pattern>
 		</encoder>
 	</appender>
-
-	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
-		<appName>cooleshow-app</appName>
-		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
-		<redisAuth>dyym</redisAuth>
-		<model>sentinel</model>
-		<masterName>mymaster</masterName>
-		<env>prod</env>
-		<redisDb>10</redisDb>
-		<runModel>2</runModel>
-	</appender>
 	<logger name="com.yonge" level="INFO" />
 
 	<!--本地环境:打印控制台 -->
@@ -92,7 +81,6 @@
 		<root level="INFO">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 		<!--总控平台Feign接口日志-->
 		<logger name="com.dayaedu.cbs.openfeign.client" level="DEBUG" additivity="false">
@@ -105,7 +93,6 @@
 		<root level="INFO">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 		<!--总控平台Feign接口日志-->
 		<logger name="com.dayaedu.cbs.openfeign.client" level="DEBUG" additivity="false">

+ 0 - 12
cooleshow-auth/auth-server/src/main/resources/logback-spring.xml

@@ -26,30 +26,18 @@
 			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
 		</encoder>
 	</appender>
-	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
-		<appName>cooleshow-auth</appName>
-		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
-		<redisAuth>dyym</redisAuth>
-		<model>sentinel</model>
-		<masterName>mymaster</masterName>
-		<env>prod</env>
-		<redisDb>10</redisDb>
-		<runModel>2</runModel>
-	</appender>
 
 	<logger name="com.yonge" level="INFO" />
 	<springProfile name="pre">
 		<root level="WARN">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 	<springProfile name="prod">
 		<root level="WARN">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 

+ 0 - 13
cooleshow-cms/src/main/resources/logback-spring.xml

@@ -27,17 +27,6 @@
 		</encoder>
 	</appender>
 
-	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
-		<appName>cooleshow-cms</appName>
-		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
-		<redisAuth>dyym</redisAuth>
-		<model>sentinel</model>
-		<masterName>mymaster</masterName>
-		<env>prod</env>
-		<redisDb>10</redisDb>
-		<runModel>2</runModel>
-	</appender>
-
 	<logger name="com.yonge" level="INFO" />
 
 	<!--本地环境:打印控制台 -->
@@ -66,7 +55,6 @@
 		<root level="WARN">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 
@@ -75,7 +63,6 @@
 		<root level="WARN">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 

+ 0 - 5
cooleshow-common/pom.xml

@@ -40,11 +40,6 @@
 			</exclusions>
 		</dependency>
 		<dependency>
-			<groupId>com.plumelog</groupId>
-			<artifactId>plumelog-logback</artifactId>
-			<version>3.5.3</version>
-		</dependency>
-		<dependency>
 			<groupId>com.yonge.toolset</groupId>
 			<artifactId>toolset-base</artifactId>
 			<version>1.0</version>

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

@@ -11,7 +11,10 @@ import com.yonge.toolset.base.enums.BaseEnum;
  */
 public enum EImportType implements BaseEnum<String, EImportType> {
 
-    TENANT("机构收入")
+    TENANT("机构收入"),
+    TEACHER("老师导入"),
+    STUDENT("学生导入"),
+    ENTITLEMENTS("学生权益"),
     ;
 
     @EnumValue

+ 0 - 5
cooleshow-gateway/gateway-web/pom.xml

@@ -26,11 +26,6 @@
 			</dependency> -->
 
 		<dependency>
-			<groupId>com.plumelog</groupId>
-			<artifactId>plumelog-logback</artifactId>
-			<version>3.5.3</version>
-		</dependency>
-		<dependency>
 			<groupId>com.alibaba.cloud</groupId>
 			<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 		</dependency>

+ 0 - 13
cooleshow-gateway/gateway-web/src/main/resources/logback-spring.xml

@@ -27,17 +27,6 @@
 		</encoder>
 	</appender>
 
-	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
-		<appName>cooleshow-gateway</appName>
-		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
-		<redisAuth>dyym</redisAuth>
-		<model>sentinel</model>
-		<masterName>mymaster</masterName>
-		<env>prod</env>
-		<redisDb>10</redisDb>
-		<runModel>2</runModel>
-	</appender>
-
 	<logger name="com.yonge" level="INFO" />
 
 	<!--本地环境:打印控制台 -->
@@ -66,7 +55,6 @@
 		<root level="WARN">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 
@@ -75,7 +63,6 @@
 		<root level="WARN">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 

+ 0 - 13
cooleshow-mall/mall-admin/src/main/resources/logback-spring.xml

@@ -27,17 +27,6 @@
 		</encoder>
 	</appender>
 
-	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
-		<appName>cooleshow-mall-admin</appName>
-		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
-		<redisAuth>dyym</redisAuth>
-		<model>sentinel</model>
-		<masterName>mymaster</masterName>
-		<env>prod</env>
-		<redisDb>10</redisDb>
-		<runModel>2</runModel>
-	</appender>
-
 	<logger name="com.yonge" level="info" />
 
 	<!--本地环境:打印控制台 -->
@@ -66,7 +55,6 @@
 		<root level="WARN">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 
@@ -75,7 +63,6 @@
 		<root level="WARN">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 

+ 0 - 5
cooleshow-mall/mall-common/pom.xml

@@ -18,11 +18,6 @@
     </parent>
 
     <dependencies>
-        <dependency>
-            <groupId>com.plumelog</groupId>
-            <artifactId>plumelog-logback</artifactId>
-            <version>3.5.3</version>
-        </dependency>
 
         <dependency>
             <groupId>com.yonge.cooleshow</groupId>

+ 0 - 13
cooleshow-mall/mall-portal/src/main/resources/logback-spring.xml

@@ -27,17 +27,6 @@
 		</encoder>
 	</appender>
 
-	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
-		<appName>cooleshow-mall-portal</appName>
-		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
-		<redisAuth>dyym</redisAuth>
-		<model>sentinel</model>
-		<masterName>mymaster</masterName>
-		<env>prod</env>
-		<redisDb>10</redisDb>
-		<runModel>2</runModel>
-	</appender>
-
 	<logger name="com.yonge" level="info" />
 
 	<!--本地环境:打印控制台 -->
@@ -66,7 +55,6 @@
 		<root level="WARN">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 
@@ -75,7 +63,6 @@
 		<root level="WARN">
 <!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 

+ 0 - 12
cooleshow-task/src/main/resources/logback-spring.xml

@@ -27,17 +27,6 @@
 		</encoder>
 	</appender>
 
-	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
-		<appName>cooleshow-task</appName>
-		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
-		<redisAuth>dyym</redisAuth>
-		<model>sentinel</model>
-		<masterName>mymaster</masterName>
-		<env>prod</env>
-		<redisDb>10</redisDb>
-		<runModel>2</runModel>
-	</appender>
-
 	<logger name="com.yonge" level="info" />
 
 	<!--本地环境:打印控制台 -->
@@ -67,7 +56,6 @@
 		<root level="WARN">
 			<appender-ref ref="stdout" />
 			<appender-ref ref="file" />
-			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 

+ 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;
+    }
+
+}

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

@@ -0,0 +1,221 @@
+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.TenantGroup;
+import com.yonge.cooleshow.biz.dal.execl.entity.StudentImportWrapper;
+import com.yonge.cooleshow.biz.dal.execl.listener.StudentImportListener;
+import com.yonge.cooleshow.biz.dal.service.EasyExcelService;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+
+@Slf4j
+@Getter
+@Setter
+public class StudentImportAnalysis extends DataAnalysis<StudentImportAnalysis> {
+
+
+    private List<StudentImportWrapper.StudentImport> studentImportWrappers;
+
+    // Excel解析服务
+    private EasyExcelService easyExcelService;
+
+    private final Map<String, StudentImportWrapper.StudentImport> recordMap = Maps.newHashMap();
+    private final Map<String, Long> subjectMap = Maps.newHashMap();
+    private final Map<String, Long> tenantMap = Maps.newHashMap();
+    private final Map<String, List<TenantGroup>> tenantGroupMap = Maps.newHashMap();
+    private final List<String> phones = Lists.newArrayList();
+    private final List<String> existPhones = Lists.newArrayList();
+    public StudentImportAnalysis(AnalysisContext context) {
+        super(context);
+    }
+
+    public static StudentImportAnalysis build(EasyExcelService easyExcelService) {
+        StudentImportAnalysis analysis = new StudentImportAnalysis(AnalysisContext.builder().build());
+        analysis.setEasyExcelService(easyExcelService);
+        analysis.setStudentImportWrappers(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, StudentImportWrapper.StudentImport.class, new StudentImportListener(getStudentImportWrappers(), 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(getStudentImportWrappers())) {
+            loadVerifyParamData();
+        }
+
+        Map<Integer, String> verifyDataMap = Maps.newLinkedHashMap();
+
+        // 校验每条入库记录数据合法性
+        StringBuffer ret = new StringBuffer();
+        for (StudentImportWrapper.StudentImport item : getStudentImportWrappers()) {
+
+            if (StringUtils.isEmpty(item.getUserName())) {
+                ret.append("学生姓名不能为空;");
+            }else {
+                if(!item.getUserName().matches("^[\\u4e00-\\u9fa5]{2,10}$")){
+                    ret.append("真实姓名格式不正确;");
+                }
+            }
+            if (StringUtils.isEmpty(item.getPhone())) {
+                ret.append("手机号不能为空;");
+            }else {
+                //手机号校验
+                if (!item.getPhone().matches("^1[3-9]\\d{9}$")) {
+                    ret.append("手机号格式不正确;");
+                }else {
+                    //校验是否重复
+                    if(phones.contains(item.getPhone())){
+                        ret.append("手机号重复;");
+                    }else {
+                        if(existPhones.contains(item.getPhone())){
+                            ret.append("手机号已存在;");
+                        }
+                        phones.add(item.getPhone());
+                    }
+                }
+            }
+            if (StringUtils.isEmpty(item.getGender())) {
+                ret.append("性别不能为空;");
+            }
+            if (StringUtils.isEmpty(item.getBirthday())) {
+                ret.append("出生日期不能为空;");
+            }else {
+                if (!item.getBirthday().matches("^\\d{4}-\\d{2}-\\d{2}$")) {
+                    ret.append("出生日期格式不正确;");
+                }
+            }
+            if (StringUtils.isEmpty(item.getSubjectName())) {
+                ret.append("声部不能为空;");
+            }else {
+                String[] split = item.getSubjectName().replaceAll(" ", "").replaceAll(",", ",").split(",");
+                for (String s : split) {
+                    if (!subjectMap.containsKey(s)) {
+                        ret.append("声部无效:").append(s);
+                    }
+                    item.setSubjectId(subjectMap.get(s));
+                }
+            }
+            if (StringUtils.isEmpty(item.getTenantName())) {
+                ret.append("机构名称不能为空;");
+            }else {
+                if (!tenantMap.containsKey(item.getTenantName())) {
+                    ret.append("机构无效:").append(item.getTenantName());
+                }
+                item.setTenantId(tenantMap.get(item.getTenantName()));
+            }
+            if (StringUtils.isEmpty(item.getTenantGroupName())) {
+                ret.append("小组名称不能为空;");
+            }else {
+                if (!tenantGroupMap.containsKey(item.getTenantGroupName())) {
+                    ret.append("小组名称无效:").append(item.getTenantGroupName());
+                }
+                List<TenantGroup> tenantGroups = tenantGroupMap.get(item.getTenantGroupName());
+                //根据机构id和小组名称获取小组id
+                if (CollectionUtils.isNotEmpty(tenantGroups)) {
+                    TenantGroup tenantGroup = tenantGroups.stream().filter(t -> t.getTenantId().equals(item.getTenantId())).findFirst().orElse(null);
+                    if (Objects.nonNull(tenantGroup)) {
+                        item.setTenantGroupId(tenantGroup.getId());
+                    } else {
+                        ret.append("小组名称无效:").append(item.getTenantGroupName());
+                    }
+                }
+            }
+            if (StringUtils.isNotEmpty(ret)) {
+                verifyDataMap.put(item.getRowIndex(), ret.toString());
+                ret = new StringBuffer(); // 重置数据状态
+            }
+        }
+
+        // 数据校验记录信息
+        getContext().total(getStudentImportWrappers().size()).failure(verifyDataMap.size())
+                .setSuccess(getContext().getTotal() - getContext().getFailure());
+
+        return verifyDataMap;
+    }
+
+    /**
+     * 数据转换
+     */
+    @Override
+    public void convert() {
+
+    }
+
+    /**
+     * 加载校验数据参数
+     */
+    private void loadVerifyParamData() {
+        //获取所有的手机号和身份证号
+        List<String> phones = getStudentImportWrappers().stream()
+                .map(StudentImportWrapper.StudentImport::getPhone)
+                .filter(StringUtils::isNotBlank)
+                .distinct()
+                .collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(phones)) {
+            existPhones.addAll(easyExcelService.getPhones(phones,"STUDENT"));
+        }
+        tenantGroupMap.putAll(easyExcelService.getTenantGroupMap());
+        subjectMap.putAll(easyExcelService.getSubjectMap());
+        tenantMap.putAll(easyExcelService.getTenantMap());
+    }
+
+
+    /**
+     * 数据对象
+     * @return RoomInfoAnalysis
+     */
+    @Override
+    public StudentImportAnalysis get() {
+        return this;
+    }
+
+}

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

@@ -0,0 +1,235 @@
+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.execl.entity.TeacherImportWrapper;
+import com.yonge.cooleshow.biz.dal.execl.listener.TeacherImportListener;
+import com.yonge.cooleshow.biz.dal.service.EasyExcelService;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+
+@Slf4j
+@Getter
+@Setter
+public class TeacherImportAnalysis extends DataAnalysis<TeacherImportAnalysis> {
+
+
+    private List<TeacherImportWrapper.TeacherImport> teacherImportWrappers;
+
+    // Excel解析服务
+    private EasyExcelService easyExcelService;
+
+    private final Map<String, TeacherImportWrapper.TeacherImport> recordMap = Maps.newHashMap();
+    private final Map<String, Long> subjectMap = Maps.newHashMap();
+    private final Map<String, Long> tenantMap = Maps.newHashMap();
+    private final List<String> phones = Lists.newArrayList();
+    private final List<String> idCardNos = Lists.newArrayList();
+    private final List<String> existPhones = Lists.newArrayList();
+    private final List<String> existIdCardNos = Lists.newArrayList();
+    public TeacherImportAnalysis(AnalysisContext context) {
+        super(context);
+    }
+
+    public static TeacherImportAnalysis build(EasyExcelService easyExcelService) {
+        TeacherImportAnalysis analysis = new TeacherImportAnalysis(AnalysisContext.builder().build());
+        analysis.setEasyExcelService(easyExcelService);
+        analysis.setTeacherImportWrappers(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, TeacherImportWrapper.TeacherImport.class, new TeacherImportListener(getTeacherImportWrappers(), 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(getTeacherImportWrappers())) {
+            loadVerifyParamData();
+        }
+
+        Map<Integer, String> verifyDataMap = Maps.newLinkedHashMap();
+
+        // 校验每条入库记录数据合法性
+        StringBuffer ret = new StringBuffer();
+        for (TeacherImportWrapper.TeacherImport item : getTeacherImportWrappers()) {
+
+            // 检测机构编号,金额,订单号,结算状态
+            if (StringUtils.isEmpty(item.getUsername())) {
+                ret.append("用户昵称不能为空;");
+            }
+            if (StringUtils.isEmpty(item.getRealName())) {
+                ret.append("真实姓名不能为空;");
+            }else {
+                if(!item.getRealName().matches("^[\\u4e00-\\u9fa5]{2,10}$")){
+                    ret.append("真实姓名格式不正确;");
+                }
+            }
+            if (StringUtils.isEmpty(item.getPhone())) {
+                ret.append("手机号不能为空;");
+            }else {
+                //手机号校验
+                if (!item.getPhone().matches("^1[3-9]\\d{9}$")) {
+                    ret.append("手机号格式不正确;");
+                }else {
+                    //校验是否重复
+                    if(phones.contains(item.getPhone())){
+                        ret.append("手机号重复;");
+                    }else {
+                        if(existPhones.contains(item.getPhone())){
+                            ret.append("手机号已存在;");
+                        }
+                        phones.add(item.getPhone());
+                    }
+                }
+            }
+            if (StringUtils.isNotEmpty(item.getIdCardNo())) {
+                //身份证校验
+                if (!item.getIdCardNo().matches("(^\\d{6}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X|x)$)|(^\\d{6}\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}$)")) {
+                    ret.append("身份证格式不正确;");
+                }else {
+                    //校验是否重复
+                    if(idCardNos.contains(item.getIdCardNo())){
+                        ret.append("身份证号重复;");
+                    }else {
+                        if(existIdCardNos.contains(item.getIdCardNo())){
+                            ret.append("身份证号已存在;");
+                        }
+                        idCardNos.add(item.getIdCardNo());
+                    }
+                }
+            }
+            if (StringUtils.isEmpty(item.getSubjectName())) {
+                ret.append("老师声部不能为空;");
+            }else {
+                String[] split = item.getSubjectName().replaceAll(" ", "").replaceAll(",", ",").split(",");
+                String subjectIds = "";
+                for (String s : split) {
+                    if (!subjectMap.containsKey(s)) {
+                        ret.append("声部无效:").append(s);
+                    }
+                    if(StringUtils.isNotEmpty(subjectIds)){
+                        subjectIds += ",";
+                    }
+                    subjectIds += subjectMap.get(s);
+                }
+                item.setSubjectId(subjectIds);
+            }
+            if (StringUtils.isEmpty(item.getTenantName())) {
+                ret.append("机构名称不能为空;");
+            }else {
+                if (!tenantMap.containsKey(item.getTenantName())) {
+                    ret.append("机构无效:").append(item.getTenantName());
+                }
+                item.setTenantId(tenantMap.get(item.getTenantName()));
+            }
+            if (item.getIsTestUser() == null) {
+                ret.append("是否测试用户不能为空;");
+            }
+            if (item.getSettlementFrom() == null) {
+                ret.append("结算方式不能为空;");
+            }
+            if (item.getCustomerService() == null) {
+                ret.append("是否客服不能为空;");
+            }
+            if (StringUtils.isNotEmpty(ret)) {
+                verifyDataMap.put(item.getRowIndex(), ret.toString());
+                ret = new StringBuffer(); // 重置数据状态
+            }
+        }
+
+        // 数据校验记录信息
+        getContext().total(getTeacherImportWrappers().size()).failure(verifyDataMap.size())
+                .setSuccess(getContext().getTotal() - getContext().getFailure());
+
+        return verifyDataMap;
+    }
+
+    /**
+     * 数据转换
+     */
+    @Override
+    public void convert() {
+
+    }
+
+    /**
+     * 加载校验数据参数
+     */
+    private void loadVerifyParamData() {
+        //获取所有的手机号和身份证号
+        List<String> phones = getTeacherImportWrappers().stream()
+                .map(TeacherImportWrapper.TeacherImport::getPhone)
+                .filter(StringUtils::isNotBlank)
+                .distinct()
+                .collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(phones)) {
+            existPhones.addAll(easyExcelService.getPhones(phones, "TEACHER"));
+        }
+        List<String> idCardNos = getTeacherImportWrappers().stream()
+                .map(TeacherImportWrapper.TeacherImport::getIdCardNo)
+                .filter(StringUtils::isNotBlank)
+                .distinct()
+                .collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(idCardNos)) {
+            existIdCardNos.addAll(easyExcelService.getIdCardNos(idCardNos, "TEACHER"));
+        }
+        subjectMap.putAll(easyExcelService.getSubjectMap());
+        tenantMap.putAll(easyExcelService.getTenantMap());
+    }
+
+
+    /**
+     * 数据对象
+     * @return RoomInfoAnalysis
+     */
+    @Override
+    public TeacherImportAnalysis 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;
+    }
+
+    public static class PeriodEnumConverter implements Converter<PeriodEnum> {
+        @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(PeriodEnum 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;
+        }
+    }
+}

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

@@ -0,0 +1,140 @@
+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.common.enums.ESettlementFrom;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+@Data
+public class StudentImportWrapper {
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class StudentImport{
+        @ExcelProperty(value = "学生姓名")
+        private String userName;
+
+        @ExcelProperty(value = "手机号")
+        private String phone;
+
+        @ExcelProperty(value = "声部")
+        private String subjectName;
+
+        @ExcelIgnore
+        private Long subjectId;
+
+        @ExcelProperty(value = "出生日期")
+        private String birthday;
+
+        @ExcelProperty(value = "性别")
+        private String gender;
+
+        @ExcelProperty(value = "所属机构")
+        private String tenantName;
+
+        @ExcelIgnore
+        private Long tenantId;
+
+        @ExcelProperty(value = "小组")
+        private String tenantGroupName;
+
+        @ExcelIgnore
+        private Long tenantGroupId;
+
+        @ExcelIgnore
+        private Long updateBy;
+
+        @ExcelIgnore
+        private Long userId;
+
+        @ExcelIgnore
+        private Integer rowIndex;
+
+        @ExcelIgnore
+        private String sheetName;
+
+
+        public StudentImport rowIndex(Integer rowIndex) {
+            this.rowIndex = rowIndex;
+            return this;
+        }
+
+        public StudentImport sheetName(String sheetName) {
+            this.sheetName = sheetName;
+            return this;
+        }
+
+    }
+
+    public static class BooleanConvert 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;
+        }
+    }
+
+
+    public static class SettlementFromConvert implements Converter<ESettlementFrom> {
+
+        @Override
+        public Class<ESettlementFrom> supportJavaTypeKey() {
+            return ESettlementFrom.class;
+        }
+
+        @Override
+        public CellDataTypeEnum supportExcelTypeKey() {
+            return CellDataTypeEnum.STRING;
+        }
+
+        @Override
+        public ESettlementFrom convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+            String stringValue = cellData.getStringValue();
+            if (StringUtils.isNotEmpty(stringValue)) {
+                if ("不结算".equals(stringValue)) {
+                    return ESettlementFrom.NO;
+                } else if ("结算给老师".equals(stringValue)) {
+                    return ESettlementFrom.TEACHER;
+                } else if ("结算给机构".equals(stringValue)) {
+                    return ESettlementFrom.TENANT;
+                }
+            }
+            return null;
+        }
+
+        @Override
+        public CellData<ESettlementFrom> convertToExcelData(ESettlementFrom o, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+            return null;
+        }
+    }
+}

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

@@ -0,0 +1,142 @@
+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.common.enums.ESettlementFrom;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+@Data
+public class TeacherImportWrapper {
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class TeacherImport{
+        @ExcelProperty(value = "老师昵称")
+        private String username;
+
+        @ExcelProperty(value = "手机号")
+        private String phone;
+
+        @ExcelProperty(value = "真实姓名")
+        private String realName;
+
+        @ExcelProperty(value = "身份证号")
+        private String idCardNo;
+
+        @ExcelProperty(value = "专业技能")
+        private String subjectName;
+
+        @ExcelIgnore
+        private String subjectId;
+
+        @ExcelProperty(value = "是否测试用户", converter = BooleanConvert.class)
+        private Boolean isTestUser;
+
+        @ExcelProperty("所属机构")
+        private String tenantName;
+
+        @ExcelIgnore
+        private Long tenantId;
+
+        @ExcelProperty(value = "结算方式", converter = SettlementFromConvert.class)
+        private ESettlementFrom settlementFrom;
+
+        @ExcelProperty(value = "是否客服", converter = BooleanConvert.class)
+        private Boolean customerService;
+
+        @ExcelIgnore
+        private Long updateBy;
+        @ExcelIgnore
+        private Long userId;
+
+        @ExcelIgnore
+        private Integer rowIndex;
+        @ExcelIgnore
+        private String sheetName;
+
+
+        public TeacherImport rowIndex(Integer rowIndex) {
+            this.rowIndex = rowIndex;
+            return this;
+        }
+
+        public TeacherImport sheetName(String sheetName) {
+            this.sheetName = sheetName;
+            return this;
+        }
+
+    }
+
+    public static class BooleanConvert 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;
+        }
+    }
+
+
+    public static class SettlementFromConvert implements Converter<ESettlementFrom> {
+
+        @Override
+        public Class<ESettlementFrom> supportJavaTypeKey() {
+            return ESettlementFrom.class;
+        }
+
+        @Override
+        public CellDataTypeEnum supportExcelTypeKey() {
+            return CellDataTypeEnum.STRING;
+        }
+
+        @Override
+        public ESettlementFrom convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+            String stringValue = cellData.getStringValue();
+            if (StringUtils.isNotEmpty(stringValue)) {
+                if ("不结算".equals(stringValue)) {
+                    return ESettlementFrom.NO;
+                } else if ("结算给老师".equals(stringValue)) {
+                    return ESettlementFrom.TEACHER;
+                } else if ("结算给机构".equals(stringValue)) {
+                    return ESettlementFrom.TENANT;
+                }
+            }
+            return null;
+        }
+
+        @Override
+        public CellData<ESettlementFrom> convertToExcelData(ESettlementFrom o, 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;
+        }
+    }
+}

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

@@ -0,0 +1,92 @@
+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.StudentImportWrapper;
+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 StudentImportListener extends AnalysisEventListener<StudentImportWrapper.StudentImport> {
+
+    // 课件信息
+    private final List<StudentImportWrapper.StudentImport> importList;
+    // sheet名称
+    private final String sheetName;
+    // 合并标识
+    private Boolean mergeFlag;
+
+    public StudentImportListener(List<StudentImportWrapper.StudentImport> examinations, String sheetName) {
+        // 单元测试数据
+        this.importList = Optional.ofNullable(examinations).orElse(Lists.newArrayList());
+        // sheet名称
+        this.sheetName = sheetName;
+    }
+
+    /**
+     * 读取每行数据触发
+     * @param  examination 数据内容
+     * @param analysisContext AnalysisContext
+     */
+    @Override
+    public void invoke(StudentImportWrapper.StudentImport 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;
+        }
+    }
+}

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

@@ -0,0 +1,92 @@
+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.TeacherImportWrapper;
+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 TeacherImportListener extends AnalysisEventListener<TeacherImportWrapper.TeacherImport> {
+
+    // 课件信息
+    private final List<TeacherImportWrapper.TeacherImport> importList;
+    // sheet名称
+    private final String sheetName;
+    // 合并标识
+    private Boolean mergeFlag;
+
+    public TeacherImportListener(List<TeacherImportWrapper.TeacherImport> examinations, String sheetName) {
+        // 单元测试数据
+        this.importList = Optional.ofNullable(examinations).orElse(Lists.newArrayList());
+        // sheet名称
+        this.sheetName = sheetName;
+    }
+
+    /**
+     * 读取每行数据触发
+     * @param  examination 数据内容
+     * @param analysisContext AnalysisContext
+     */
+    @Override
+    public void invoke(TeacherImportWrapper.TeacherImport 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;
+        }
+    }
+}

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/SysUserMapper.java

@@ -54,4 +54,16 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
     com.yonge.cooleshow.auth.api.entity.SysUser findUserByPhone(@Param("phone") String phone);
 
     com.yonge.cooleshow.auth.api.entity.SysUser getByUserId(@Param("userId") Long userId);
+
+    List<String> existPhones(@Param("phones") List<String> phones,
+                             @Param("userType") String userType);
+
+    List<String> existIdCardNos(@Param("idCardNos") List<String> idCardNos,
+                                @Param("userType") String userType);
+
+    List<com.yonge.cooleshow.auth.api.entity.SysUser> findUserByPhones(@Param("phones") List<String> phones);
+
+    void batchInsert(@Param("addUsers") List<com.yonge.cooleshow.auth.api.entity.SysUser> addUsers);
+
+    void batchUpdate(@Param("updateUsers") List<com.yonge.cooleshow.auth.api.entity.SysUser> updateUsers);
 }

+ 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);
 }

+ 29 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/EasyExcelService.java

@@ -1,9 +1,15 @@
 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.entity.TenantGroup;
+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.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by Eric.Shang on 2023/4/25.
@@ -18,4 +24,26 @@ public interface EasyExcelService {
      * @return
      */
     List<TenantAccountRecord> getRecordById(List<String> ids);
+
+    //获取声部map
+
+    Map<String,Long> getSubjectMap();
+
+    //获取机构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,List<TenantGroup>> getTenantGroupMap();
+
+    //根据手机号获取已存在的老师手机号
+    List<String> getPhones(List<String> phones, String userType);
+
+    //根据身份证号获取已存在的老师身份证号
+    List<String> getIdCardNos(List<String> idCardNos, String userType);
 }

+ 7 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.QueryMyFollowSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.execl.entity.StudentImportWrapper;
 import com.yonge.cooleshow.biz.dal.vo.MyFollow;
 import com.yonge.cooleshow.biz.dal.vo.StudentHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
@@ -125,6 +126,12 @@ public interface StudentService extends IService<Student> {
                             Long suerId);
 
     /**
+     * 导入学生
+     * @param dataList 数据列表
+     */
+    void importStudent(List<StudentImportWrapper.StudentImport> dataList);
+
+    /**
      * 学生修改机构
      * @param student 学生信息
      * @param toTenantId 机构ID

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
 import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
+import com.yonge.cooleshow.biz.dal.execl.entity.TeacherImportWrapper;
 import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
@@ -216,4 +217,6 @@ public interface TeacherService extends IService<Teacher> {
     void delFans(Long studentId, Long teacherId);
 
     TeacherFreeTimeWrapper.TeacherFreeConfig queryTeacherTime();
+
+    void importTeacher(List<TeacherImportWrapper.TeacherImport> collect);
 }

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

@@ -1,14 +1,39 @@
 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.service.EasyExcelService;
-import com.yonge.cooleshow.biz.dal.service.TenantAccountRecordService;
+import com.yonge.cooleshow.biz.dal.entity.TenantGroup;
+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;
 
 /**
  * Excel解析服务类型
@@ -18,8 +43,31 @@ import java.util.List;
 @Service
 public class EasyExcelServiceImpl implements EasyExcelService {
 
-    @Autowired
+    @Resource
     private TenantAccountRecordService tenantAccountRecordService;
+    @Resource
+    private SubjectService subjectService;
+    @Resource
+    private TenantInfoService tenantInfoService;
+    @Resource
+    private TenantGroupService tenantGroupService;
+    @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) {
@@ -28,4 +76,110 @@ public class EasyExcelServiceImpl implements EasyExcelService {
                 .list();
 
     }
+
+    @Override
+    public Map<String,Long> getSubjectMap() {
+        List<Subject> all = subjectService.getDao().getAll();
+        return CollectionUtils.isEmpty(all) ? null : all.stream().collect(Collectors.toMap(Subject::getName, Subject::getId));
+    }
+
+    @Override
+    public Map<String, Long> getTenantMap() {
+        List<TenantInfo> list = tenantInfoService.lambdaQuery().list();
+        return CollectionUtils.isEmpty(list) ? null : list.stream().collect(Collectors.toMap(TenantInfo::getName, TenantInfo::getId));
+    }
+
+    @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, List<TenantGroup>> getTenantGroupMap() {
+        List<TenantGroup> list = tenantGroupService.lambdaQuery().list();
+        return CollectionUtils.isEmpty(list) ? null : list.stream().collect(Collectors.groupingBy(TenantGroup::getName));
+    }
+
+    @Override
+    public List<String> getPhones(List<String> phones, String userType) {
+        return sysUserService.getDao().existPhones(phones,userType);
+    }
+
+    @Override
+    public List<String> getIdCardNos(List<String> idCardNos, String userType) {
+        return sysUserService.getDao().existIdCardNos(idCardNos,userType);
+    }
 }

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

@@ -1,6 +1,5 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
-import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.microsvc.toolkit.common.tools.DownloadManager;
 import com.microsvc.toolkit.common.tools.ThreadPool;
@@ -8,12 +7,14 @@ 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.EasyExcelService;
-import com.yonge.cooleshow.biz.dal.service.ExcelAnalyseCoreService;
-import com.yonge.cooleshow.biz.dal.service.FileImportInfoService;
-import com.yonge.cooleshow.biz.dal.service.TenantAccountRecordService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.wrapper.FileImportInfoWrapper;
 import com.yonge.toolset.base.exception.BizException;
 import lombok.extern.slf4j.Slf4j;
@@ -21,9 +22,9 @@ import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException;
 import org.joda.time.DateTime;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.io.File;
 import java.util.List;
 import java.util.Optional;
@@ -37,16 +38,18 @@ import java.util.stream.Collectors;
 @Service
 public class ExcelAnalyseCoreServiceImpl implements ExcelAnalyseCoreService {
 
-    @Autowired
+    @Resource
     private EasyExcelService easyExcelService;
-    @Autowired
+    @Resource
     private OssPluginContext ossPluginContext;
-
-    @Autowired
+    @Resource
     private FileImportInfoService fileImportInfoService;
-
-    @Autowired
+    @Resource
     private TenantAccountRecordService tenantAccountRecordService;
+    @Resource
+    private TeacherService teacherService;
+    @Resource
+    private StudentService studentService;
 
     /**
      * 异步读取数据
@@ -91,6 +94,16 @@ public class ExcelAnalyseCoreServiceImpl implements ExcelAnalyseCoreService {
                 case TENANT: // 课件导入
                     readTenantExcelData(wrapper);
                     break;
+                case TEACHER: // 老师导入
+                    readTeacherExcelData(wrapper);
+                    break;
+                case STUDENT: // 学生导入
+                    readStudentExcelData(wrapper);
+
+                    break;
+                case  ENTITLEMENTS:
+                    readEntitlementsExcelData(wrapper);
+                    break;
                 default:
                     break;
             }
@@ -137,6 +150,61 @@ 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对象
+        TeacherImportAnalysis analysis = TeacherImportAnalysis.build(easyExcelService).start(wrapper.getImportUrl()).get();
+
+        AnalysisContext context = analysis.getContext();
+        // 生成导入数据记录
+        createFileImportRecord(wrapper, context);
+
+        // 入库业务数据
+        if (context.getFailure() > 0) {
+            log.info("readExaminationExcelData collect.size={}", analysis.getTeacherImportWrappers().size());
+            return;
+        }
+        teacherService.importTeacher(analysis.getTeacherImportWrappers());
+    }
+
+    private void readStudentExcelData(FileImportInfoWrapper.FileImportInfo wrapper) {
+
+        // 解析excel文件,生成EchoInfoAnalysis对象
+        StudentImportAnalysis analysis = StudentImportAnalysis.build(easyExcelService).start(wrapper.getImportUrl()).get();
+
+        AnalysisContext context = analysis.getContext();
+        // 生成导入数据记录
+        createFileImportRecord(wrapper, context);
+
+        // 入库业务数据
+        if (context.getFailure() > 0) {
+            log.info("readStudentExcelData collect.size={}", analysis.getStudentImportWrappers().size());
+            return;
+        }
+        studentService.importStudent(analysis.getStudentImportWrappers());
+    }
+
     /**
      * 生成导入数据记录
      *

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

@@ -22,6 +22,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.enums.im.EImUserFriendSourceForm;
+import com.yonge.cooleshow.biz.dal.execl.entity.StudentImportWrapper;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantGroupAlbumMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantGroupMapper;
@@ -117,6 +118,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     private SysMusicCompareRecordService sysMusicCompareRecordService;
     @Resource
     private CourseScheduleService courseScheduleService;
+    @Resource
+    private UserTenantBindRecordService userTenantBindRecordService;
 
     @Override
     public StudentVo detail(Long userId) {
@@ -615,6 +618,114 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void importStudent(List<StudentImportWrapper.StudentImport> studentImports) {
+        //设置默认头像
+        Date now = new Date();
+        String defaultHeard = sysConfigService.findConfigValue(SysConfigConstant.STUDENT_AVATAR);
+        List<SysUser> existUser = sysUserMapper.findUserByPhones(studentImports.stream()
+                .map(StudentImportWrapper.StudentImport::getPhone).collect(Collectors.toList()));
+        Map<String, SysUser> existUserMap = existUser.stream().collect(Collectors.toMap(SysUser::getPhone, o -> o));
+        List<SysUser> sysUsers = new ArrayList<>();
+        for (StudentImportWrapper.StudentImport studentImport : studentImports) {
+            SysUser sysUser = existUserMap.get(studentImport.getPhone());
+            if(sysUser == null) {
+                sysUser = new SysUser();
+                sysUser.setAvatar(defaultHeard);
+                sysUser.setPhone(studentImport.getPhone());
+                sysUser.setUsername(studentImport.getUserName());
+                sysUser.setBirthdate(DateUtil.stringToDate(studentImport.getBirthday(), DateUtil.DEFAULT_PATTERN));
+                sysUser.setGender("男".equals(studentImport.getGender()) ? 1 : 0);
+                sysUser.setTenantId(studentImport.getTenantId());
+                sysUser.setCreateTime(now);
+            }
+            if(StringUtils.isEmpty(sysUser.getPassword())){
+                //初始密码,klx+手机号四位
+                String password = "klx" + sysUser.getPhone().substring(sysUser.getPhone().length() - 4);
+                sysUser.setPassword(new BCryptPasswordEncoder().encode(password));
+            }
+            if (StringUtil.isEmpty(sysUser.getUserType())) {
+                sysUser.setUserType("STUDENT");
+            } else if (!sysUser.getUserType().contains("STUDENT")) {
+                sysUser.setUserType(sysUser.getUserType() + ",STUDENT");
+            }
+            sysUser.setUpdateTime(now);
+            sysUsers.add(sysUser);
+        }
+        //获取需要新增的用户
+        List<SysUser> addUsers = sysUsers.stream().filter(o -> o.getId() == null).collect(Collectors.toList());
+        if (org.apache.commons.collections.CollectionUtils.isNotEmpty(addUsers)) {
+            sysUserMapper.batchInsert(addUsers);
+        }
+        //获取修改的用户
+        List<SysUser> updateUsers = sysUsers.stream().filter(o -> o.getId() != null).collect(Collectors.toList());
+        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 = 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));
+        List<UserTenantBindRecord> bindRecords = new ArrayList<>();
+        //保存老师信息
+        Map<String,StudentImportWrapper.StudentImport> studentImportMap = studentImports.stream()
+                .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(userId);
+            student.setTenantId(sysUser.getTenantId());
+            student.setSubjectId(studentImport.getSubjectId().toString());
+            student.setAvatar(sysUser.getAvatar());
+            student.setCreateTime(now);
+            student.setLockFlag(UserLockFlag.NORMAL);
+            student.setTenantGroupId(studentImport.getTenantGroupId());
+            students.add(student);
+
+            //机构学员添加机构绑定记录
+            UserTenantBindRecord userTenantBindRecord = userTenantBindRecordMap.get(sysUser.getId());
+            if (userTenantBindRecord == null) {
+                userTenantBindRecord = new UserTenantBindRecord();
+                userTenantBindRecord.setUserId(sysUser.getId());
+                userTenantBindRecord.setUserType("STUDENT");
+                userTenantBindRecord.setTenantId(sysUser.getTenantId());
+                userTenantBindRecord.setBindStatus(true);
+                userTenantBindRecord.setBindTime(now);
+                bindRecords.add(userTenantBindRecord);
+            }
+        }
+        this.saveBatch(students);
+        if (CollectionUtils.isNotEmpty(bindRecords)) {
+            userTenantBindRecordService.saveBatch(bindRecords);
+        }
+        for (SysUser sysUser : sysUsers) {
+            try {
+                imGroupCoreService.register(String.valueOf(sysUser.getId()), ClientEnum.STUDENT.getCode(),
+                        sysUser.getUsername(), sysUser.getAvatar());
+                // 加好友
+                if (sysUser.getTenantId() != null && sysUser.getTenantId() != -1L) {
+                    // 自动与机构老师成为好友
+                    QueryWrapper<Teacher> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.lambda().eq(Teacher::getTenantId, sysUser.getTenantId());
+                    List<Teacher> teacherList = teacherDao.selectList(queryWrapper);
+                    teacherList.forEach(next ->
+                            imUserFriendService.saveUserFriend(next.getUserId(), new HashSet<>(ImmutableList.of(sysUser.getId())), EImUserFriendSourceForm.TEACHER)
+                    );
+                }
+            } catch (Exception e) {
+                log.error("导入IM账号到三方 studentId={}", sysUser.getId(), e);
+            }
+        }
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void updateTenant(Student student, Long toTenantId) {

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

@@ -1,8 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -28,6 +26,8 @@ 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;
 import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
@@ -201,7 +201,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     private TenantGroupMapper tenantGroupMapper;
 
     @Autowired
-    private UserTenantBindRecordMapper userTenantBindRecordMapper;
+    private UserTenantBindRecordService userTenantBindRecordService;
 
     @Autowired
     private VipCardRecordService vipCardRecordService;
@@ -756,6 +756,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         return teacher;
     }
 
+
     // 清除专属客服信息
     private void clearUserCustomerRelation(Long userId) {
 
@@ -1532,7 +1533,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         bindRecord.setTenantId(tenantId);
         bindRecord.setBindStatus(bind);
         bindRecord.setBindTime(new Date());
-        userTenantBindRecordMapper.add(bindRecord);
+        userTenantBindRecordService.save(bindRecord);
     }
 
     private void sendBindUnBindSMS(Long userId, String phone, MessageTypeEnum messageType, Long tenantId) {
@@ -1695,4 +1696,139 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         teacherFreeConfig.setIntervalTime(maxTime);
         return teacherFreeConfig;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void importTeacher(List<TeacherImportWrapper.TeacherImport> teacherImports) {
+        //设置默认头像
+        Date now = new Date();
+        String defaultHeard = sysConfigService.findConfigValue(SysConfigConstant.TEACHER_AVATAR);
+        List<SysUser> existUser = sysUserMapper.findUserByPhones(teacherImports.stream().map(TeacherImportWrapper.TeacherImport::getPhone).collect(Collectors.toList()));
+        Map<String, SysUser> existUserMap = existUser.stream().collect(Collectors.toMap(SysUser::getPhone, o -> o));
+        List<SysUser> sysUsers = new ArrayList<>();
+        for (TeacherImportWrapper.TeacherImport teacherImport : teacherImports) {
+            SysUser sysUser = existUserMap.get(teacherImport.getPhone());
+            if(sysUser == null) {
+                sysUser = new SysUser();
+                sysUser.setAvatar(defaultHeard);
+                sysUser.setPhone(teacherImport.getPhone());
+                sysUser.setUsername(teacherImport.getUsername());
+                sysUser.setCreateTime(now);
+            }
+            if(StringUtils.isEmpty(sysUser.getIdCardNo()) && StringUtils.isNotEmpty(teacherImport.getIdCardNo())){
+                //通过身份证号获取身份信息
+                IdcardInfoExtractor idcardInfo = new IdcardInfoExtractor(teacherImport.getIdCardNo(), false);
+                sysUser.setIdCardNo(teacherImport.getIdCardNo());
+                sysUser.setGender(idcardInfo.getGender());
+                sysUser.setBirthdate(idcardInfo.getBirthday());
+            }
+            if(StringUtils.isEmpty(sysUser.getRealName()) && StringUtils.isNotEmpty(teacherImport.getRealName())){
+                sysUser.setRealName(teacherImport.getRealName());
+            }
+            if(StringUtils.isEmpty(sysUser.getPassword())){
+                //初始密码,klx+手机号四位
+                String password = "klx" + sysUser.getPhone().substring(sysUser.getPhone().length() - 4);
+                sysUser.setPassword(new BCryptPasswordEncoder().encode(password));
+            }
+            if (StringUtil.isEmpty(sysUser.getUserType())) {
+                sysUser.setUserType("TEACHER");
+            } else if (!sysUser.getUserType().contains("TEACHER")) {
+                sysUser.setUserType(sysUser.getUserType() + ",TEACHER");
+            }
+            sysUser.setUpdateTime(now);
+            sysUsers.add(sysUser);
+        }
+        //获取需要新增的用户
+        List<SysUser> addUsers = sysUsers.stream().filter(o -> o.getId() == null).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(addUsers)) {
+            sysUserMapper.batchInsert(addUsers);
+        }
+        //获取修改的用户
+        List<SysUser> updateUsers = sysUsers.stream().filter(o -> o.getId() != null).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(updateUsers)) {
+            sysUserMapper.batchUpdate(updateUsers);
+        }
+        //保存老师信息
+        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 = 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));
+        List<UserAccount> addAccounts = new ArrayList<>();
+
+        //机构老师添加机构绑定记录
+        List<UserTenantBindRecord> userTenantBindRecords = userTenantBindRecordService.lambdaQuery().in(UserTenantBindRecord::getUserId, userIds).list();
+        Map<Long, UserTenantBindRecord> userTenantBindRecordMap = userTenantBindRecords.stream().collect(Collectors.toMap(UserTenantBindRecord::getUserId, o -> o));
+        List<UserTenantBindRecord> bindRecords = new ArrayList<>();
+
+        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());
+            Teacher teacher = this.initTeacher(teacherImport);
+            teacher.setAvatar(sysUser.getAvatar());
+            teachers.add(teacher);
+
+            //老师账户表初始化
+            UserAccount userAccount = userAccountMap.get(sysUser.getId());
+            if (userAccount == null) {
+                userAccount = new UserAccount();
+                userAccount.setUserId(sysUser.getId());
+                addAccounts.add(userAccount);
+            }
+            //机构老师添加机构绑定记录
+            UserTenantBindRecord userTenantBindRecord = userTenantBindRecordMap.get(sysUser.getId());
+            if (userTenantBindRecord == null) {
+                userTenantBindRecord = new UserTenantBindRecord();
+                userTenantBindRecord.setUserId(sysUser.getId());
+                userTenantBindRecord.setUserType("TEACHER");
+                userTenantBindRecord.setTenantId(teacherImport.getTenantId());
+                userTenantBindRecord.setBindStatus(true);
+                userTenantBindRecord.setBindTime(now);
+                bindRecords.add(userTenantBindRecord);
+            }
+        }
+        //批量保存老师
+        this.saveBatch(teachers);
+        //批量保存老师账户表
+        if (CollectionUtils.isNotEmpty(addAccounts)) {
+            userAccountService.saveBatch(addAccounts);
+        }
+        //批量保存机构老师绑定记录
+        if (CollectionUtils.isNotEmpty(bindRecords)) {
+            userTenantBindRecordService.saveBatch(bindRecords);
+        }
+        //批量导入IM账号到三方
+        sysUsers.forEach(sysUser -> {
+            try {
+                imGroupCoreService.register(String.valueOf(sysUser.getId()), ClientEnum.TEACHER.getCode(),
+                        sysUser.getUsername(), sysUser.getAvatar());
+            } catch (Exception e) {
+                log.error("导入IM账号到三方 teacherId={}", sysUser.getId(), e);
+            }
+        });
+    }
+
+
+    private Teacher initTeacher(TeacherImportWrapper.TeacherImport teacherImport) {
+        Teacher teacher = new Teacher();
+        teacher.setUserId(teacherImport.getUserId());
+        teacher.setEntryFlag(YesOrNoEnum.NO);
+        teacher.setMusicianFlag(YesOrNoEnum.NO);
+        teacher.setSubjectId(teacherImport.getSubjectId());
+        teacher.setIsSettlement(!ESettlementFrom.NO.equals(teacherImport.getSettlementFrom()));
+        teacher.setIsTestUser(teacherImport.getIsTestUser());
+        teacher.setSettlementFrom(teacherImport.getSettlementFrom());
+        teacher.setTenantId(teacherImport.getTenantId());
+        teacher.setCustomerService(teacherImport.getCustomerService());
+        return teacher;
+    }
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/FileImportInfoWrapper.java

@@ -142,7 +142,7 @@ public class FileImportInfoWrapper {
     public static class FileImport {
 
 
-        @EnumValidation(clazz = EImportType.class, message = "数据类型不正确")
+//        @EnumValidation(clazz = EImportType.class, message = "数据类型不正确")
         @ApiModelProperty("数据类型")
         private EImportType dataType;
 

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

@@ -147,6 +147,9 @@ public class StudentWrapper {
         @ExcelProperty(value = "性别")
         private String gender;
 
+        @ExcelProperty(value = "所属机构")
+        private String tenantName;
+
         @ExcelProperty(value = "小组")
         private String tenantGroupName;
 
@@ -245,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>

+ 65 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -34,6 +34,51 @@
     <sql id="Base_Column_List">
         id_, username_, password_, salt_, phone_, avatar_, create_time_, update_time_, lock_flag_, wx_openid_, qq_openid_, user_type_, gender_, nation_, birthdate_, email_, im_token_, real_name_, id_card_no_, certificate_type_, is_super_admin_, wechat_id_, del_flag_, last_username_time_
     </sql>
+    <update id="batchUpdate">
+        <foreach collection="updateUsers" item="item" separator=";">
+            UPDATE sys_user
+            <set>
+            <if test="item.username != null and item.username != ''">
+                username_ = #{item.username},
+            </if>
+            <if test="item.password != null and item.password != ''">
+                password_ = #{item.password},
+            </if>
+            <if test="item.phone != null and item.phone != ''">
+                phone_ = #{item.phone},
+            </if>
+            <if test="item.avatar != null and item.avatar != ''">
+                avatar_ = #{item.avatar},
+            </if>
+            <if test="item.userType != null">
+                user_type_ = #{item.userType},
+            </if>
+            <if test="item.gender != null">
+                gender_ = #{item.gender},
+            </if>
+            <if test="item.birthdate != null">
+                birthdate_ = #{item.birthdate},
+            </if>
+            <if test="item.realName != null and item.realName != ''">
+                real_name_ = #{item.realName},
+            </if>
+            <if test="item.idCardNo != null and item.idCardNo != ''">
+                id_card_no_ = #{item.idCardNo},
+            </if>
+            update_time_ = now()
+            </set>
+            WHERE id_ = #{item.id}
+        </foreach>
+    </update>
+    <insert id="batchInsert" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+        insert into sys_user
+        (username_, password_, phone_, avatar_, create_time_, update_time_, user_type_, gender_,birthdate_, real_name_, id_card_no_)
+        values
+        <foreach collection="addUsers" item="item" separator="," >
+            (#{item.username}, #{item.password}, #{item.phone}, #{item.avatar}, #{item.createTime}, #{item.updateTime}, #{item.userType},
+             #{item.gender}, #{item.birthdate}, #{item.realName}, #{item.idCardNo})
+        </foreach>
+    </insert>
 
     <select id="queryCouponIssueUser" resultType="com.yonge.cooleshow.biz.dal.vo.CouponIssueUserVo">
 
@@ -133,5 +178,25 @@
         from sys_user
         where id_ = #{userId}
     </select>
+    <select id="existPhones" resultType="java.lang.String">
+        select phone_ from sys_user where phone_ in
+        <foreach collection="phones" item="phone" open="(" separator="," close=")">
+            #{phone}
+        </foreach>
+        AND user_type_ LIKE CONCAT('%',#{userType},'%')
+    </select>
+    <select id="existIdCardNos" resultType="java.lang.String">
+        select id_card_no_ from sys_user where id_card_no_ in
+        <foreach collection="idCardNos" item="idCardNo" open="(" separator="," close=")">
+            #{idCardNo}
+        </foreach>
+        AND user_type_ LIKE CONCAT('%',#{userType},'%')
+    </select>
+    <select id="findUserByPhones" resultType="com.yonge.cooleshow.auth.api.entity.SysUser">
+        select * from sys_user where phone_ in
+        <foreach collection="phones" item="phone" open="(" separator="," close=")">
+            #{phone}
+        </foreach>
+    </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>