Browse Source

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

zouxuan 6 months ago
parent
commit
ca954b9321
19 changed files with 817 additions and 51 deletions
  1. 23 25
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java
  2. 3 1
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/EImportType.java
  3. 235 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/analysis/TeacherImportAnalysis.java
  4. 142 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/entity/TeacherImportWrapper.java
  5. 92 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/listener/TeacherImportListener.java
  6. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/SysUserMapper.java
  7. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/EasyExcelService.java
  8. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  9. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  10. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/DiscountCardRecordServiceImpl.java
  11. 35 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/EasyExcelServiceImpl.java
  12. 36 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ExcelAnalyseCoreServiceImpl.java
  13. 17 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  14. 133 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  15. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  16. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  17. 0 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  18. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  19. 65 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysUserMapper.xml

+ 23 - 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,18 @@ 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) {
+
+        wrapper.setImportUrl(URLEncodeUtil.encode(wrapper.getImportUrl()));
+
+        // 读取数据
+        return HttpResponseResult.succeed(excelAnalyseCoreService.analyseReadExcelData(
+                JSON.parseObject(JSON.toJSONString(wrapper), FileImportInfoWrapper.FileImportInfo.class)));
+    }
+
     @PostMapping("/updateTenant")
     @ApiOperation(value = "新增或修改机构", notes = "传入teacher")
     @PreAuthorize("@pcs.hasPermissions('teacher/updateTenant')")

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

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

+ 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));
+        }
+        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));
+        }
+        subjectMap.putAll(easyExcelService.getSubjectMap());
+        tenantMap.putAll(easyExcelService.getTenantMap());
+    }
+
+
+    /**
+     * 数据对象
+     * @return RoomInfoAnalysis
+     */
+    @Override
+    public TeacherImportAnalysis get() {
+        return this;
+    }
+
+}

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

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

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

@@ -4,6 +4,7 @@ import com.yonge.cooleshow.biz.dal.entity.TenantAccountRecord;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by Eric.Shang on 2023/4/25.
@@ -18,4 +19,17 @@ public interface EasyExcelService {
      * @return
      */
     List<TenantAccountRecord> getRecordById(List<String> ids);
+
+    //获取声部map
+
+    Map<String,Long> getSubjectMap();
+
+    //获取机构map
+    Map<String,Long> getTenantMap();
+
+    //根据手机号获取已存在的老师手机号
+    List<String> getPhones(List<String> phones);
+
+    //根据身份证号获取已存在的老师身份证号
+    List<String> getIdCardNos(List<String> idCardNos);
 }

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

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

@@ -2627,6 +2627,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 .set(CourseSchedule::getEndTime, endTime)
                 .set(CourseSchedule::getFreeEndTime, freeEndTime)
         );
+        //修改开课时间
+        courseGroupService.getDao().updateCourseStartTime(courseSchedule.getCourseGroupId());
 
         if (CollectionUtils.isNotEmpty(studentPayments)) {
             SysUser teacher = sysUserService.getByUserId(teacherId);

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

@@ -397,6 +397,7 @@ public class DiscountCardRecordServiceImpl extends ServiceImpl<DiscountCardRecor
                 .eq(DiscountCardRecord::getEfficientFlag, true)
                 .eq(DiscountCardRecord::getMsgStatus, 0)
                 .lt(DiscountCardRecord::getEndTime, DateUtil.localDateTimeToDate(LocalDateTime.now().plusDays(4)))
+                .gt(DiscountCardRecord::getEndTime, DateUtil.localDateTimeToDate(LocalDateTime.now().plusDays(3)))
                 .list();
         if(CollectionUtils.isNotEmpty(records)){
             //获取用户编号
@@ -413,6 +414,7 @@ public class DiscountCardRecordServiceImpl extends ServiceImpl<DiscountCardRecor
                 .eq(DiscountCardRecord::getEfficientFlag, true)
                 .in(DiscountCardRecord::getMsgStatus, 0,1)
                 .lt(DiscountCardRecord::getEndTime, DateUtil.localDateTimeToDate(LocalDateTime.now().plusDays(1)))
+                .gt(DiscountCardRecord::getEndTime, DateUtil.localDateTimeToDate(LocalDateTime.now()))
                 .list();
         if (CollectionUtils.isNotEmpty(expireRecords)) {
             //获取用户编号

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

@@ -1,14 +1,17 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+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.TenantInfo;
+import com.yonge.cooleshow.biz.dal.service.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * Excel解析服务类型
@@ -18,8 +21,14 @@ 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 SysUserService sysUserService;
 
     @Override
     public List<TenantAccountRecord> getRecordById(List<String> ids) {
@@ -28,4 +37,26 @@ 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 List<String> getPhones(List<String> phones) {
+        return sysUserService.getDao().existPhones(phones,"TEACHER");
+    }
+
+    @Override
+    public List<String> getIdCardNos(List<String> idCardNos) {
+        return sysUserService.getDao().existIdCardNos(idCardNos,"TEACHER");
+    }
 }

+ 36 - 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,11 @@ 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.TeacherImportAnalysis;
 import com.yonge.cooleshow.biz.dal.execl.analysis.TenantAccountRecordImportAnalysis;
+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 +19,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 +35,16 @@ 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;
 
     /**
      * 异步读取数据
@@ -91,6 +89,11 @@ public class ExcelAnalyseCoreServiceImpl implements ExcelAnalyseCoreService {
                 case TENANT: // 课件导入
                     readTenantExcelData(wrapper);
                     break;
+                case TEACHER: // 老师导入
+                    readTeacherExcelData(wrapper);
+                    break;
+                case STUDENT: // 学生导入
+                    break;
                 default:
                     break;
             }
@@ -137,6 +140,27 @@ public class ExcelAnalyseCoreServiceImpl implements ExcelAnalyseCoreService {
         tenantAccountRecordService.updatePostStatus(collect);
     }
 
+    private void readTeacherExcelData(FileImportInfoWrapper.FileImportInfo wrapper) {
+
+        // 解析excel文件,生成EchoInfoAnalysis对象
+        TeacherImportAnalysis analysis = TeacherImportAnalysis.build(easyExcelService).start(wrapper.getImportUrl()).get();
+
+        AnalysisContext context = analysis.getContext();
+        // 生成导入数据记录
+        createFileImportRecord(wrapper, context);
+
+        // 入库业务数据
+        List<TeacherImportWrapper.TeacherImport> collect = analysis.getTeacherImportWrappers().stream()
+                .filter(x -> !Optional.ofNullable(x.getPhone()).orElse("").equals("."))
+                .collect(Collectors.toList());
+        if (context.getFailure() > 0) {
+            log.info("readTeacherExcelData collect.size={}", collect.size());
+            return;
+        }
+
+        teacherService.importTeacher(collect);
+    }
+
     /**
      * 生成导入数据记录
      *

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

@@ -379,6 +379,23 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                 }
             }
         }
+        if (query.getId() != null) {
+            List<AlbumMusicRelate> list = albumMusicRelateService.lambdaQuery()
+                    .eq(AlbumMusicRelate::getAlbumId, query.getId())
+                    .in(AlbumMusicRelate::getMusicSheetId, records.stream().map(MusicSheetVo::getId).collect(Collectors.toList()))
+                    .list();
+            if (CollectionUtils.isNotEmpty(list)) {
+                Map<Long, AlbumMusicRelate> collect = list.stream().collect(Collectors.toMap(AlbumMusicRelate::getMusicSheetId, o -> o, (o1, o2) -> o1));
+                for (MusicSheetVo record : records) {
+                    AlbumMusicRelate albumMusicRelate = collect.get(record.getId());
+                    if (albumMusicRelate != null) {
+                        record.setAlbumCategoryLevelId(albumMusicRelate.getAlbumCategoryLevelId());
+                        record.setAlbumCategoryTypeId(albumMusicRelate.getAlbumCategoryTypeId());
+                        record.setAlbumSortNumber(albumMusicRelate.getSortNumber());
+                    }
+                }
+            }
+        }
         
         // 设置专辑
         List<Long> albumCategoryIds = records.stream().flatMap(o -> Lists.newArrayList(o.getAlbumCategoryTypeId(), o.getAlbumCategoryLevelId()).stream())

+ 133 - 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,7 @@ import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
 import com.yonge.cooleshow.biz.dal.enums.TeacherTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.im.EImUserFriendSourceForm;
+import com.yonge.cooleshow.biz.dal.execl.entity.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;
@@ -193,7 +192,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     private TenantGroupMapper tenantGroupMapper;
 
     @Autowired
-    private UserTenantBindRecordMapper userTenantBindRecordMapper;
+    private UserTenantBindRecordService userTenantBindRecordService;
 
     @Autowired
     private VipCardRecordService vipCardRecordService;
@@ -751,6 +750,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         return teacher;
     }
 
+
     // 清除专属客服信息
     private void clearUserCustomerRelation(Long userId) {
 
@@ -1527,7 +1527,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) {
@@ -1690,4 +1690,133 @@ 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<Long> userIds = sysUsers.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) {
+            //老师表初始化
+            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 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java

@@ -1418,6 +1418,7 @@ DISCOUNT("畅学卡")
                 }
                 break;
             }
+            case VIP_COURSE:
             case PRACTICE: {
                 Teacher teacher = teacherService.getById(payTypeReq.getBizId());
                 if (Objects.isNull(teacher)) {

+ 1 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -96,7 +96,7 @@
         left join course_schedule_student_payment a on t.user_id_ = a.user_id_
         left join course_schedule b on a.course_id_ = b.id_
         LEFT JOIN course_group cg ON cg.id_ = b.course_group_id_
-        where b.lock_ = 0 AND cg.status_ IN ('COMPLETE','ING')
+        where b.lock_ = 0 AND cg.status_ IN ('COMPLETE','ING','APPLY')
             <if test="userId != null and userId != ''">
                 and t.user_id_ = #{userId}
             </if>

+ 0 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -326,9 +326,6 @@
             where find_in_set(mt.id_,t.music_tag_) and mt.del_flag_ = 0  and mt.state_ = 1) as musicTagNames
         ,(select group_concat(s.name_) from subject s
             where find_in_set(s.id_,t.music_subject_) and s.del_flag_ = 0 ) as subjectNames
-        ,amr.sort_number_ as albumSortNumber
-        ,amr.album_category_level_id_ as albumCategoryLevelId
-        ,amr.album_category_type_id_ as albumCategoryTypeId
         from music_sheet t
         left join album_music_relate amr on t.id_ = amr.music_sheet_id_
         left join sys_user su on t.create_by_ = su.id_

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

@@ -137,7 +137,7 @@
             <if test="param.entitlementsList != null and param.entitlementsList.size() > 0">
                 and
                 <foreach collection="param.entitlementsList" item="item" separator=" and " open="(" close=")">
-                    t.entitlements_ like concat('%',#{item},'%')
+                    find_in_set(#{item},t.entitlements_)
                 </foreach>
 
             </if>

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