Browse Source

Merge branch 'saas' of http://git.dayaedu.com/yonge/mec into zx_saas_0303

zouxuan 3 years ago
parent
commit
04edbc08c2
39 changed files with 1160 additions and 338 deletions
  1. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  2. 5 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/OrganizationDao.java
  3. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserTenantDao.java
  4. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EmployeeDto.java
  5. 135 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportStudentCourseInfoDto.java
  6. 41 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OrganizationDto.java
  7. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Employee.java
  8. 16 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/HfMember.java
  9. 51 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Organization.java
  10. 85 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserTenant.java
  11. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java
  12. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java
  13. 56 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/SysUserTenantVo.java
  14. 0 8
      mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java
  15. 11 8
      mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java
  16. 8 4
      mec-biz/src/main/java/com/ym/mec/biz/service/OrganizationService.java
  17. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserTenantService.java
  18. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudCoachPaymentProgramServiceImpl.java
  19. 51 188
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  20. 43 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  21. 120 30
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  22. 4 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  23. 68 13
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrganizationServiceImpl.java
  24. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  25. 61 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  26. 48 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserTenantServiceImpl.java
  27. 32 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java
  28. 72 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  29. 11 4
      mec-biz/src/main/resources/config/mybatis/HfMemberMapper.xml
  30. 18 2
      mec-biz/src/main/resources/config/mybatis/OrganizationMapper.xml
  31. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  32. 37 0
      mec-biz/src/main/resources/config/mybatis/SysUserTenantMapper.xml
  33. 6 0
      mec-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml
  34. 17 34
      mec-student/src/main/java/com/ym/mec/student/controller/ContractsController.java
  35. 27 5
      mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  36. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/OrganizationController.java
  37. 29 0
      mec-web/src/main/java/com/ym/mec/web/controller/SysUserTenantController.java
  38. 0 2
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  39. 8 0
      mec-web/src/main/resources/exportColumnMapper.ini

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -570,4 +570,11 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
     List<StudentVipPracticeExportDto> exportStudentVipPractice(@Param("organId") String organId, @Param("tenantId") Integer tenantId);
     List<StudentVipPracticeExportDto> exportStudentVipPractice(@Param("organId") String organId, @Param("tenantId") Integer tenantId);
 
 
     List<BaseNameDto> queryLastOverTeacher(@Param("studentIds") List<Integer> studentIds, @Param("groupType") String groupType);
     List<BaseNameDto> queryLastOverTeacher(@Param("studentIds") List<Integer> studentIds, @Param("groupType") String groupType);
+
+    List<Mapper> queryUserMusicGroupCourseNumByClassTime(@Param("groupType") GroupType groupType, @Param("musicGroupIds") Set<String> musicGroupIds,
+			@Param("userId") Integer userId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
+    
+	Boolean hasStudentMusicTheoryCourseInfo(@Param("organId") String organId, @Param("tenantId") Integer tenantId, @Param("groupType") String groupType);
+
+    List<ExportStudentCourseInfoDto> queryStudentCourseInfo(@Param("organId") String organId, @Param("tenantId") Integer tenantId, @Param("groupType") String groupType);
 }
 }

+ 5 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/OrganizationDao.java

@@ -1,12 +1,14 @@
 package com.ym.mec.biz.dal.dao;
 package com.ym.mec.biz.dal.dao;
 
 
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.common.dal.BaseDAO;
-import org.apache.ibatis.annotations.Param;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.Set;
 import java.util.Set;
 
 
+import org.apache.ibatis.annotations.Param;
+
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.common.dal.BaseDAO;
+
 public interface OrganizationDao extends BaseDAO<Integer, Organization> {
 public interface OrganizationDao extends BaseDAO<Integer, Organization> {
 
 
     /**
     /**

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserTenantDao.java

@@ -0,0 +1,23 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.SysUserTenant;
+import com.ym.mec.biz.dal.vo.SysUserTenantVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 平台用户与机构关系表(SysUserTenant)表数据库访问层
+ *
+ * @author hgw
+ * @since 2022-03-02 11:09:34
+ */
+public interface SysUserTenantDao extends BaseMapper<SysUserTenant> {
+
+    int insertBatch(@Param("entities") List<SysUserTenant> entities);
+
+    List<SysUserTenantVo> queryUserTenant(@Param("userId") Integer userId);
+
+}
+

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EmployeeDto.java

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 package com.ym.mec.biz.dal.dto;
 
 
+import com.ym.mec.biz.dal.vo.SysUserTenantVo;
+import com.ym.mec.biz.dal.vo.TenantInfoPageVo;
 import com.ym.mec.common.enums.UserGenderEnum;
 import com.ym.mec.common.enums.UserGenderEnum;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 
 
@@ -77,6 +79,8 @@ public class EmployeeDto {
     @ApiModelProperty(value = "岗位管理范围",required = false)
     @ApiModelProperty(value = "岗位管理范围",required = false)
     private String postDeptIds;
     private String postDeptIds;
 
 
+    private List<SysUserTenantVo> userTenantList;
+
     public String getPositionNames() {
     public String getPositionNames() {
         return positionNames;
         return positionNames;
     }
     }
@@ -252,4 +256,12 @@ public class EmployeeDto {
     public void setDeptId(Integer deptId) {
     public void setDeptId(Integer deptId) {
         this.deptId = deptId;
         this.deptId = deptId;
     }
     }
+
+    public List<SysUserTenantVo> getUserTenantList() {
+        return userTenantList;
+    }
+
+    public void setUserTenantList(List<SysUserTenantVo> userTenantList) {
+        this.userTenantList = userTenantList;
+    }
 }
 }

+ 135 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportStudentCourseInfoDto.java

@@ -0,0 +1,135 @@
+package com.ym.mec.biz.dal.dto;
+
+public class ExportStudentCourseInfoDto {
+    //分部
+    private String organName;
+
+    //学员
+    private String username;
+
+    //学员编号
+    private Integer userId;
+
+    //老师
+    private String teacherName;
+
+    //老师编号
+    private Integer teacherId;
+
+    //教务
+    private String eduName;
+
+    //教务编号
+    private Integer eduId;
+
+    //总课次
+    private Integer totalClassNum;
+
+    //已进行课时
+    private Integer startClassNum;
+
+    //剩余课时
+    private Integer subClassNum;
+
+    //上次课时
+    private String beforeClassNum;
+
+    //年纪
+    private Integer grade;
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getEduName() {
+        return eduName;
+    }
+
+    public void setEduName(String eduName) {
+        this.eduName = eduName;
+    }
+
+    public Integer getEduId() {
+        return eduId;
+    }
+
+    public void setEduId(Integer eduId) {
+        this.eduId = eduId;
+    }
+
+    public Integer getTotalClassNum() {
+        return totalClassNum;
+    }
+
+    public void setTotalClassNum(Integer totalClassNum) {
+        this.totalClassNum = totalClassNum;
+    }
+
+    public Integer getStartClassNum() {
+        return startClassNum;
+    }
+
+    public void setStartClassNum(Integer startClassNum) {
+        this.startClassNum = startClassNum;
+    }
+
+    public Integer getSubClassNum() {
+        return subClassNum;
+    }
+
+    public void setSubClassNum(Integer subClassNum) {
+        this.subClassNum = subClassNum;
+    }
+
+    public String getBeforeClassNum() {
+        return beforeClassNum;
+    }
+
+    public void setBeforeClassNum(String beforeClassNum) {
+        this.beforeClassNum = beforeClassNum;
+    }
+
+    public Integer getGrade() {
+        return grade;
+    }
+
+    public void setGrade(Integer grade) {
+        this.grade = grade;
+    }
+}

+ 41 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OrganizationDto.java

@@ -0,0 +1,41 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.Organization;
+
+public class OrganizationDto extends Organization {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -3461575801207273457L;
+
+	private String corporateName;
+	
+	private String corporateCode;
+	
+	private String memberId;
+
+	public String getCorporateName() {
+		return corporateName;
+	}
+
+	public void setCorporateName(String corporateName) {
+		this.corporateName = corporateName;
+	}
+
+	public String getCorporateCode() {
+		return corporateCode;
+	}
+
+	public void setCorporateCode(String corporateCode) {
+		this.corporateCode = corporateCode;
+	}
+
+	public String getMemberId() {
+		return memberId;
+	}
+
+	public void setMemberId(String memberId) {
+		this.memberId = memberId;
+	}
+}

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Employee.java

@@ -92,6 +92,12 @@ public class Employee extends SysUser {
 	@ApiModelProperty(value = "职位id列表",required = false)
 	@ApiModelProperty(value = "职位id列表",required = false)
 	private List<Integer> positionIds;
 	private List<Integer> positionIds;
 
 
+	@ApiModelProperty(value = "机构id列表")
+	private List<Integer> tenantIds;
+
+	@ApiModelProperty(value = "创建该机构的人")
+    private Integer createTenantUserId;
+
 	private String contactAddress;
 	private String contactAddress;
 
 
 	private String postalCode;
 	private String postalCode;
@@ -292,4 +298,20 @@ public class Employee extends SysUser {
 	public void setDeptId(Integer deptId) {
 	public void setDeptId(Integer deptId) {
 		this.deptId = deptId;
 		this.deptId = deptId;
 	}
 	}
+
+    public List<Integer> getTenantIds() {
+        return tenantIds;
+    }
+
+    public void setTenantIds(List<Integer> tenantIds) {
+        this.tenantIds = tenantIds;
+    }
+
+    public Integer getCreateTenantUserId() {
+        return createTenantUserId;
+    }
+
+    public void setCreateTenantUserId(Integer createTenantUserId) {
+        this.createTenantUserId = createTenantUserId;
+    }
 }
 }

+ 16 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/HfMember.java

@@ -10,8 +10,15 @@ import java.math.BigDecimal;
 import java.util.Date;
 import java.util.Date;
 
 
 public class HfMember extends BaseEntity {
 public class HfMember extends BaseEntity {
-    @ApiModelProperty(value = "id",required = true)
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = -490352140698445380L;
+
+	@ApiModelProperty(value = "id",required = true)
     private Integer Id;
     private Integer Id;
+    
+    private Integer organId;
 
 
     @ApiModelProperty(value = "商户号",required = true)
     @ApiModelProperty(value = "商户号",required = true)
     private String memberId;
     private String memberId;
@@ -283,4 +290,12 @@ public class HfMember extends BaseEntity {
     public void setRouteOrganId(Integer routeOrganId) {
     public void setRouteOrganId(Integer routeOrganId) {
         this.routeOrganId = routeOrganId;
         this.routeOrganId = routeOrganId;
     }
     }
+
+	public Integer getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
 }
 }

+ 51 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Organization.java

@@ -1,19 +1,26 @@
 package com.ym.mec.biz.dal.entity;
 package com.ym.mec.biz.dal.entity;
 
 
-import com.ym.mec.biz.dal.enums.GradeTypeEnum;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-import com.ym.mec.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
-import org.apache.commons.lang3.builder.ToStringBuilder;
 
 
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
 
 
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import com.ym.mec.biz.dal.enums.GradeTypeEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.common.entity.BaseEntity;
+
 /**
 /**
  * 对应数据库表(organization):
  * 对应数据库表(organization):
  */
  */
 public class Organization extends BaseEntity {
 public class Organization extends BaseEntity {
 
 
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -8979746516597046410L;
+
 	/**  */
 	/**  */
 	private Integer id;
 	private Integer id;
 	
 	
@@ -29,6 +36,14 @@ public class Organization extends BaseEntity {
 	@ApiModelProperty(value = "区域编码",required = false)
 	@ApiModelProperty(value = "区域编码",required = false)
 	private Integer areaId;
 	private Integer areaId;
 	
 	
+	private String corporateName;
+	
+	private String corporateCode;
+	
+	private String corporateSeal;
+	
+	private String corporateFinancialSeal;
+	
 	/** 创建时间 */
 	/** 创建时间 */
 	private Date createTime;
 	private Date createTime;
 	
 	
@@ -166,4 +181,36 @@ public class Organization extends BaseEntity {
 		this.gradeType = gradeType;
 		this.gradeType = gradeType;
 	}
 	}
 
 
+	public String getCorporateName() {
+		return corporateName;
+	}
+
+	public void setCorporateName(String corporateName) {
+		this.corporateName = corporateName;
+	}
+
+	public String getCorporateCode() {
+		return corporateCode;
+	}
+
+	public void setCorporateCode(String corporateCode) {
+		this.corporateCode = corporateCode;
+	}
+
+	public String getCorporateSeal() {
+		return corporateSeal;
+	}
+
+	public void setCorporateSeal(String corporateSeal) {
+		this.corporateSeal = corporateSeal;
+	}
+
+	public String getCorporateFinancialSeal() {
+		return corporateFinancialSeal;
+	}
+
+	public void setCorporateFinancialSeal(String corporateFinancialSeal) {
+		this.corporateFinancialSeal = corporateFinancialSeal;
+	}
+
 }
 }

+ 85 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserTenant.java

@@ -0,0 +1,85 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+
+/**
+ * 平台用户与机构关系表(SysUserTenant)表实体类
+ *
+ * @author hgw
+ * @since 2022-03-02 11:09:34
+ */
+@ApiModel(value = "sys_user_tenant-平台用户与机构关系表")
+public class SysUserTenant implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("user_id_")
+    @ApiModelProperty(value = "用户id")
+    private Integer userId;
+
+    @TableField("tenant_id_")
+    @ApiModelProperty(value = "机构id")
+    private Integer tenantId;
+
+    @TableField("created_by_")
+    @ApiModelProperty(value = "创建人")
+    private Integer createdBy;
+
+    @TableField("created_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public Integer getCreatedBy() {
+        return createdBy;
+    }
+
+    public void setCreatedBy(Integer createdBy) {
+        this.createdBy = createdBy;
+    }
+
+    public Date getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+    }
+
+}
+

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java

@@ -70,6 +70,8 @@ public enum ExportEnum implements BaseEnum<String, ExportEnum> {
     STUDENT_INSTRUMENT("STUDENT_INSTRUMENT", "乐保导出"),
     STUDENT_INSTRUMENT("STUDENT_INSTRUMENT", "乐保导出"),
     EXPORT_BILL("EXPORT_BILL", "对账单导出"),
     EXPORT_BILL("EXPORT_BILL", "对账单导出"),
     QUESTIONNAIRE_USER_RESULT("QUESTIONNAIRE_USER_RESULT", "问卷调查导出"),
     QUESTIONNAIRE_USER_RESULT("QUESTIONNAIRE_USER_RESULT", "问卷调查导出"),
+    STUDENT_VIP_COURSE_INFO("STUDENT_VIP_COURSE_INFO", "VIP课学员课程信息导出"),
+    STUDENT_MUSIC_THEORY_COURSE_INFO("STUDENT_MUSIC_THEORY_COURSE_INFO", "乐理课学员课程信息导出"),
     EXERCISES_SITUATION("EXERCISES_SITUATION", "服务指标导出");
     EXERCISES_SITUATION("EXERCISES_SITUATION", "服务指标导出");
 
 
     private String code;
     private String code;

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java

@@ -6,7 +6,9 @@ public enum ExportTypeEnum implements BaseEnum<Integer, ExportTypeEnum> {
 	ORDER(0, "订单列表"),
 	ORDER(0, "订单列表"),
 	COURSE_SCHEDULE(1, "课表列表"),
 	COURSE_SCHEDULE(1, "课表列表"),
 	ROUTE_ORDER(2, "财务管理"),
 	ROUTE_ORDER(2, "财务管理"),
-	STUDENT_VIP_PRACTICE(3, "学员小课记录");
+	STUDENT_VIP_PRACTICE(3, "学员小课记录"),
+	STUDENT_MUSIC_THEORY_COURSE_INFO(4, "网管课学员课程信息导出"),
+	STUDENT_VIP_COURSE_INFO(5, "VIP课学员课程信息导出");
 
 
 	private Integer code;
 	private Integer code;
 
 

+ 56 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/SysUserTenantVo.java

@@ -0,0 +1,56 @@
+package com.ym.mec.biz.dal.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @author hgw
+ * Created by 2022-03-02
+ */
+public class SysUserTenantVo implements Serializable {
+
+    @ApiModelProperty(value = "关系表id")
+    private Integer id;
+
+    @ApiModelProperty(value = "机构id")
+    private Integer userId;
+
+    @ApiModelProperty(value = "机构id")
+    private Integer tenantId;
+
+    @ApiModelProperty(value = "机构名称")
+    private String tenantName;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getTenantName() {
+        return tenantName;
+    }
+
+    public void setTenantName(String tenantName) {
+        this.tenantName = tenantName;
+    }
+}

+ 0 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java

@@ -8,7 +8,6 @@ import com.ym.mec.biz.dal.dto.OAFinancialDto;
 import com.ym.mec.biz.dal.entity.SysUserTsign;
 import com.ym.mec.biz.dal.entity.SysUserTsign;
 import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
-import com.ym.mec.common.entity.HttpResponseResult;
 
 
 public interface ContractService {
 public interface ContractService {
 
 
@@ -120,13 +119,6 @@ public interface ContractService {
 	void transferProduceContract(Integer userId, String musicGroupId, CourseViewTypeEnum courseViewType);
 	void transferProduceContract(Integer userId, String musicGroupId, CourseViewTypeEnum courseViewType);
 
 
 	/**
 	/**
-	 * 传递产品协议-仅生成课程协议
-	 * @param userId
-	 * @return
-	 */
-	HttpResponseResult transferProduceContractOnlyWithCourseList(Integer userId);
-
-	/**
 	 * 查询产品协议
 	 * 查询产品协议
 	 * @param userId
 	 * @param userId
 	 * @return
 	 * @return

+ 11 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java

@@ -255,6 +255,12 @@ public interface ExportService {
     //学员小课记录导出
     //学员小课记录导出
     HttpResponseResult exportStudentVipPractice(Map<String, Object> info,List<String> headColumns);
     HttpResponseResult exportStudentVipPractice(Map<String, Object> info,List<String> headColumns);
 
 
+    //学员小课记录导出
+    HttpResponseResult exportStudentVipCourseInfo(Map<String, Object> info, List<String> headColumns);
+
+    //学员小课记录导出
+    HttpResponseResult exportStudentMusicTheoryCourseInfo(Map<String, Object> info, List<String> headColumns);
+
     //订单列表导出
     //订单列表导出
     HttpResponseResult orderList(Map<String, Object> info,List<String> headColumns);
     HttpResponseResult orderList(Map<String, Object> info,List<String> headColumns);
 
 
@@ -264,16 +270,13 @@ public interface ExportService {
     //保存下载记录
     //保存下载记录
     ManagerDownload saveManagerDownload(ExportTypeEnum exportTypeEnum, Integer userId);
     ManagerDownload saveManagerDownload(ExportTypeEnum exportTypeEnum, Integer userId);
 
 
-    @Async
-    abstract void orderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException;
+    void orderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException;
 
 
+    void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException;
 
 
-    @Async
-    abstract void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException;
+    void superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) throws FileNotFoundException;
 
 
-    @Async
-    abstract void superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) throws FileNotFoundException;
+    void studentVipPractice(String organId, ManagerDownload managerDownload, Integer tenantId,List<String> headColumns) throws FileNotFoundException;
 
 
-    @Async
-    abstract void studentVipPractice(String organId, ManagerDownload managerDownload, Integer tenantId,List<String> headColumns) throws FileNotFoundException;
+    void queryStudentCourseInfo(String organId, Integer tenantId, String vip, ManagerDownload managerDownload, List<String> headColumns,ExportEnum exportEnum) throws FileNotFoundException;
 }
 }

+ 8 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/OrganizationService.java

@@ -1,12 +1,15 @@
 package com.ym.mec.biz.service;
 package com.ym.mec.biz.service;
 
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.enums.SysUserRoleEnum;
 import com.ym.mec.biz.dal.page.EducationBaseQueryInfo;
 import com.ym.mec.biz.dal.page.EducationBaseQueryInfo;
 import com.ym.mec.common.service.BaseService;
 import com.ym.mec.common.service.BaseService;
 
 
-import java.util.*;
-
 public interface OrganizationService extends BaseService<Integer, Organization> {
 public interface OrganizationService extends BaseService<Integer, Organization> {
 
 
     Set<Integer>  EXCLUDE_ORGAN_IDS = new HashSet<>(Arrays.asList(36,38,39,41,42,43,44,45,46,47,48,49,50,52,54,55,56,2,27,22,24));
     Set<Integer>  EXCLUDE_ORGAN_IDS = new HashSet<>(Arrays.asList(36,38,39,41,42,43,44,45,46,47,48,49,50,52,54,55,56,2,27,22,24));
@@ -75,5 +78,6 @@ public interface OrganizationService extends BaseService<Integer, Organization>
     * @date 2022/1/6 18:11
     * @date 2022/1/6 18:11
     */
     */
     <T extends EducationBaseQueryInfo> T onlyEducation(T queryInfo);
     <T extends EducationBaseQueryInfo> T onlyEducation(T queryInfo);
-
+    
+    boolean updateBasicInfo(Organization organization);
 }
 }

+ 25 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysUserTenantService.java

@@ -0,0 +1,25 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.SysUserTenantDao;
+import com.ym.mec.biz.dal.entity.SysUserTenant;
+import com.ym.mec.biz.dal.vo.SysUserTenantVo;
+
+import java.util.List;
+
+/**
+ * 平台用户与机构关系表(SysUserTenant)表服务接口
+ *
+ * @author hgw
+ * @since 2022-03-02 11:09:34
+ */
+public interface SysUserTenantService extends IService<SysUserTenant> {
+
+    SysUserTenantDao getDao();
+
+    List<SysUserTenantVo> queryUserTenant(Integer userId);
+
+    void deleteByUserId(Integer userId);
+
+}
+

+ 3 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudCoachPaymentProgramServiceImpl.java

@@ -126,18 +126,18 @@ public class CloudCoachPaymentProgramServiceImpl extends BaseServiceImpl<Long, C
 			cloudTeacherOrderDao.batchInsert(cloudTeacherOrder,cloudCoachPaymentProgram.getUserIds());
 			cloudTeacherOrderDao.batchInsert(cloudTeacherOrder,cloudCoachPaymentProgram.getUserIds());
 		}else {
 		}else {
 			//推送缴费消息
 			//推送缴费消息
-			TenantInfo tenantInfo = tenantInfoDao.selectById(cloudCoachPaymentProgram.getTenantId());
+			//TenantInfo tenantInfo = tenantInfoDao.selectById(cloudCoachPaymentProgram.getTenantId());
 			Map<Integer, String> phoneMaps = MapUtil.convertMybatisMap(teacherDao.queryPhoneByIds(StringUtils.join(userIds,",")));
 			Map<Integer, String> phoneMaps = MapUtil.convertMybatisMap(teacherDao.queryPhoneByIds(StringUtils.join(userIds,",")));
 			String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
 			String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
 			StringBuffer pushUrl = new StringBuffer(baseApiUrl).append("/#/studentMember?id=").append(cloudCoachPaymentProgram.getId());
 			StringBuffer pushUrl = new StringBuffer(baseApiUrl).append("/#/studentMember?id=").append(cloudCoachPaymentProgram.getId());
 			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_CLOUD_PAYMENT,phoneMaps,
 			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_CLOUD_PAYMENT,phoneMaps,
-					null,0,"",null,tenantInfo.getName(), HttpUtil.getSortUrl(pushUrl.toString()));
+					null,0,"",null, HttpUtil.getSortUrl(pushUrl.toString()));
 
 
 			StringBuffer notifyUrl = new StringBuffer("8?").append(baseApiUrl).append("/#/studentMember?id=").append(cloudCoachPaymentProgram.getId());
 			StringBuffer notifyUrl = new StringBuffer("8?").append(baseApiUrl).append("/#/studentMember?id=").append(cloudCoachPaymentProgram.getId());
 			Map<Integer, String> userIdMaps = new HashMap<>(userIds.size());
 			Map<Integer, String> userIdMaps = new HashMap<>(userIds.size());
 			userIds.forEach(e->userIdMaps.put(e,e.toString()));
 			userIds.forEach(e->userIdMaps.put(e,e.toString()));
 			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_CLOUD_PAYMENT,userIdMaps,
 			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_CLOUD_PAYMENT,userIdMaps,
-					null,0,notifyUrl.toString(),"STUDENT",tenantInfo.getName());
+					null,0,notifyUrl.toString(),"STUDENT");
 		}
 		}
 	}
 	}
 
 

+ 51 - 188
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java

@@ -24,7 +24,6 @@ import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Lazy;
-import org.springframework.http.HttpStatus;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Isolation;
@@ -39,7 +38,6 @@ import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
 import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
 import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
 import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.dao.StudentDao;
-import java.nio.charset.Charset;
 import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
 import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
 import com.ym.mec.biz.dal.dao.SysUserContractsDao;
 import com.ym.mec.biz.dal.dao.SysUserContractsDao;
 import com.ym.mec.biz.dal.dto.CirculationUser;
 import com.ym.mec.biz.dal.dto.CirculationUser;
@@ -52,6 +50,7 @@ import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
+import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.entity.SysUserContracts;
 import com.ym.mec.biz.dal.entity.SysUserContracts;
@@ -68,6 +67,7 @@ import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.biz.service.MusicGroupService;
 import com.ym.mec.biz.service.MusicGroupService;
 import com.ym.mec.biz.service.MusicGroupSubjectGoodsGroupService;
 import com.ym.mec.biz.service.MusicGroupSubjectGoodsGroupService;
 import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
 import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
+import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.StudentRegistrationService;
 import com.ym.mec.biz.service.StudentRegistrationService;
 import com.ym.mec.biz.service.SubjectService;
 import com.ym.mec.biz.service.SubjectService;
 import com.ym.mec.biz.service.SysUserContractsService;
 import com.ym.mec.biz.service.SysUserContractsService;
@@ -76,8 +76,6 @@ import com.ym.mec.biz.service.TenantConfigService;
 import com.ym.mec.biz.service.TenantContractTemplateService;
 import com.ym.mec.biz.service.TenantContractTemplateService;
 import com.ym.mec.biz.service.TenantInfoService;
 import com.ym.mec.biz.service.TenantInfoService;
 import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.biz.service.VipGroupService;
-import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.thirdparty.eseal.ESealPlugin;
 import com.ym.mec.thirdparty.eseal.ESealPlugin;
 import com.ym.mec.thirdparty.storage.StoragePluginContext;
 import com.ym.mec.thirdparty.storage.StoragePluginContext;
@@ -155,6 +153,10 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
     private TenantConfigService tenantConfigService;
     private TenantConfigService tenantConfigService;
     
     
     @Autowired
     @Autowired
+    @Lazy
+    private OrganizationService organizationService;
+    
+    @Autowired
     private TenantContractTemplateService tenantContractTemplateService;
     private TenantContractTemplateService tenantContractTemplateService;
 
 
     @Value("${contract.baseDir:/var/pdf}")
     @Value("${contract.baseDir:/var/pdf}")
@@ -198,9 +200,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 
 		SysUserTsign sysUserTsign = null;
 		SysUserTsign sysUserTsign = null;
 
 
-		SysUserTsign orignSysUserTsign = sysUserTsignService.get(-userId);
+		SysUserTsign orignSysUserTsign = sysUserTsignService.queryByCardNo(organCode);
 
 
-		if (orignSysUserTsign == null || !StringUtils.equals(orignSysUserTsign.getCardNo(), organCode)) {
+		if (orignSysUserTsign == null) {
 
 
 			String accountId = eSealPlugin.createOrganAccount(orgName, organCode);
 			String accountId = eSealPlugin.createOrganAccount(orgName, organCode);
 			if (StringUtils.isBlank(accountId)) {
 			if (StringUtils.isBlank(accountId)) {
@@ -213,16 +215,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			}
 			}
 
 
 			sysUserTsign = new SysUserTsign(-userId, accountId, sealData, orgName, organCode, tenantId);
 			sysUserTsign = new SysUserTsign(-userId, accountId, sealData, orgName, organCode, tenantId);
-
-			if (orignSysUserTsign == null) {
-				sysUserTsignService.insert(sysUserTsign);
-			} else {
-				orignSysUserTsign.setAccountId(accountId);
-				orignSysUserTsign.setSealData(sealData);
-				orignSysUserTsign.setName(orgName);
-				orignSysUserTsign.setCardNo(organCode);
-				sysUserTsignService.update(orignSysUserTsign);
-			}
+			sysUserTsignService.insert(sysUserTsign);
 
 
 		} else if (!StringUtils.equals(orignSysUserTsign.getName(), orgName)) {
 		} else if (!StringUtils.equals(orignSysUserTsign.getName(), orgName)) {
 			if (eSealPlugin.updateOrganAccount(orignSysUserTsign.getAccountId(), orgName, organCode)) {
 			if (eSealPlugin.updateOrganAccount(orignSysUserTsign.getAccountId(), orgName, organCode)) {
@@ -987,18 +980,21 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
             return;
             return;
         }
         }
         
         
-		TenantInfo tenantInfo = tenantInfoService.get(studentInfo.getTenantId());
-		if(tenantInfo == null){
-			throw new BizException("机构信息不存在");
-		}
-		
-		TenantConfig tenantConfig = tenantConfigService.queryByTenantId(studentInfo.getTenantId());
-		if(tenantConfig == null){
-			throw new BizException("机构配置信息查询失败");
+        //如果分部有企业信息,就用分部上的企业信息,否则用机构上的企业信息
+        String companyName = null;
+        TenantInfo tenantInfo = null;
+        Organization organizationDto = organizationService.get(user.getOrganId());
+		if (organizationDto == null || StringUtils.isBlank(organizationDto.getCorporateName()) || StringUtils.isBlank(organizationDto.getCorporateCode())) {
+
+			tenantInfo = tenantInfoService.get(studentInfo.getTenantId());
+			if (tenantInfo == null) {
+				throw new BizException("机构信息不存在");
+			}
+			companyName = tenantInfo.getTsignName();
+		} else {
+			companyName = organizationDto.getCorporateName();
 		}
 		}
-		
-		params.put("companyName", tenantInfo.getTsignName());
-		params.put("sealPicture", tenantConfig.getCorporateChops());
+		params.put("companyName", companyName);
         
         
 		if (studentInfo.getTenantId() == 1) {
 		if (studentInfo.getTenantId() == 1) {
 			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
 			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
@@ -1020,22 +1016,17 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
             return;
             return;
         }
         }
 
 
-
-        String organCode = "";
+        String organCode = tenantInfo == null ? organizationDto.getCorporateCode() : tenantInfo.getTsignCode();
         
         
 		if (user.getTenantId() == 1) {
 		if (user.getTenantId() == 1) {
-			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
-				organCode = "91440300326364429H";
-			} else {
+			if (!OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
 				organCode = "91420106333619290A";
 				organCode = "91420106333619290A";
 			}
 			}
-		} else {
-			organCode = tenantInfo.getTsignCode();
 		}
 		}
         SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
         SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
         if (organTsign == null) {
         if (organTsign == null) {
-            logger.error("甲方未创建签章");
-            return;
+            //创建企业签章
+            addTsign(tenantInfo.getUserId(), organCode, companyName, user.getTenantId());
         }
         }
 
 
         eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
         eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
@@ -1054,6 +1045,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
         sysUserContracts.setUrl(pdfFilePath);
         sysUserContracts.setUrl(pdfFilePath);
         sysUserContracts.setUserId(userId);
         sysUserContracts.setUserId(userId);
         sysUserContracts.setVersion(tenantContractTemplate.getVersion());
         sysUserContracts.setVersion(tenantContractTemplate.getVersion());
+        sysUserContracts.setTenantId(user.getTenantId());
 
 
         sysUserContractsService.insert(sysUserContracts);
         sysUserContractsService.insert(sysUserContracts);
 
 
@@ -1113,18 +1105,31 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
             ownershipType = courseViewType;
             ownershipType = courseViewType;
         }
         }
         
         
-		TenantInfo tenantInfo = tenantInfoService.get(studentInfo.getTenantId());
-		if(tenantInfo == null){
-			throw new BizException("机构信息不存在");
-		}
-		
-		TenantConfig tenantConfig = tenantConfigService.queryByTenantId(studentInfo.getTenantId());
-		if(tenantConfig == null){
-			throw new BizException("机构配置信息查询失败");
+        //如果分部有企业信息,就用分部上的企业信息,否则用机构上的企业信息
+        String companyName = null, sealPicture = null;
+        TenantInfo tenantInfo = null;
+        Organization organizationDto = organizationService.get(studentInfo.getOrganId());
+		if (organizationDto == null || StringUtils.isBlank(organizationDto.getCorporateName()) || StringUtils.isBlank(organizationDto.getCorporateCode())) {
+
+			tenantInfo = tenantInfoService.get(studentInfo.getTenantId());
+			if (tenantInfo == null) {
+				throw new BizException("机构信息不存在");
+			}
+	        
+			TenantConfig tenantConfig = tenantConfigService.queryByTenantId(studentInfo.getTenantId());
+			if(tenantConfig == null){
+				throw new BizException("机构配置信息查询失败");
+			}
+			
+			companyName = tenantInfo.getTsignName();
+			sealPicture = tenantConfig.getCorporateChops();
+		} else {
+			companyName = organizationDto.getCorporateName();
+			sealPicture = organizationDto.getCorporateSeal();
 		}
 		}
 		
 		
-		params.put("companyName", tenantInfo.getTsignName());
-		params.put("sealPicture", tenantConfig.getCorporateChops());
+		params.put("companyName", companyName);
+		params.put("sealPicture", sealPicture);
         
         
 		if (studentInfo.getTenantId() == 1) {
 		if (studentInfo.getTenantId() == 1) {
 			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
 			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
@@ -1162,148 +1167,6 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
     }
     }
 
 
     @Override
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult transferProduceContractOnlyWithCourseList(Integer userId) {
-        SysUser user = studentDao.lockUserReturnInfo(userId);
-        if (user == null) {
-            logger.error("用户不存在({})", userId);
-            return BaseController.failed("用户不存在");
-        }
-
-        int validContactNum = sysUserContractsDao.countUserValidContact(userId);
-        if (validContactNum > 0) {
-            return BaseController.succeed();
-        }
-
-        if (StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCardNo())) {
-            return BaseController.failed(HttpStatus.PARTIAL_CONTENT, user, "");
-        }
-
-        SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
-        if (sysUserTsign == null) {
-            try {
-                sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
-            } catch (Exception e) {
-                logger.error("用户电子签章注册失败", e);
-                return BaseController.failed("用户电子签章注册失败");
-            }
-        }
-        Date date = new Date();
-
-        // 合成freemarker
-        String srcPdfPath = contractBaseDir + "/product/" + dateFormat1.format(date) + "/" + userId + "_" + LocalDateTime.now().getSecond() + ".pdf";
-
-        File srcFile = new File(srcPdfPath);
-
-        File debtFile = new File(srcFile.getParent());
-        if (!debtFile.exists()) {
-            debtFile.mkdirs();
-        }
-
-        FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
-        templateEngine.setClassForTemplateLoading(ContractServiceImpl.class, "/config/contracts/");
-
-        Map<String, Object> params = new HashMap<String, Object>();
-
-        // 查询参数信息
-        StudentInfo studentInfo = studentRegistrationService.queryStudentInfo(userId);
-        params.put("studentInfo", studentInfo);
-
-        params.put("isShowVisualSeal", false);
-
-        params.put("ownershipType", "OWN");
-		
-        // 查询最新协议模板
-		TenantContractTemplate tenantContractTemplate = tenantContractTemplateService.queryLatestContractTemplate(user.getTenantId(), null, null);
-		if(tenantContractTemplate == null){
-			logger.error("最新协议模板查询失败");
-            return BaseController.succeed();
-		}
-		String mainContent = tenantContractTemplate.getContractTemplateContent();
-		params.put("contractMainContent", mainContent);
-
-        // 查询是否已生成协议
-        List<SysUserContracts> userContracts = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT, tenantContractTemplate.getVersion());
-        if (!CollectionUtils.isEmpty(userContracts)) {
-            return BaseController.succeed();
-        }
-        
-		TenantInfo tenantInfo = tenantInfoService.get(studentInfo.getTenantId());
-		if(tenantInfo == null){
-			throw new BizException("机构信息不存在");
-		}
-		
-		TenantConfig tenantConfig = tenantConfigService.queryByTenantId(studentInfo.getTenantId());
-		if(tenantConfig == null){
-			throw new BizException("机构配置信息查询失败");
-		}
-		
-		params.put("companyName", tenantInfo.getTsignName());
-		params.put("sealPicture", tenantConfig.getCorporateChops());
-        
-		if (studentInfo.getTenantId() == 1) {
-			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
-				//params.put("companyName", "深圳大雅乐盟网络教育股份有限公司");
-				//params.put("sealPicture", "https://daya-online.oss-cn-beijing.aliyuncs.com/website/cachet.png");
-			} else {
-				params.put("companyName", "武汉长乐长风乐器销售有限公司");
-				params.put("sealPicture", "https://daya-online.oss-cn-beijing.aliyuncs.com/website/clcf.png");
-			}
-		}
-
-        templateEngine.render(params, "latest_contract_template.ftl", srcFile);
-
-        // 生成借款协议PDF
-        try {
-            PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile, Charset.defaultCharset()), srcPdfPath, "simsun.ttc");
-        } catch (IOException e) {
-            logger.error("生成产品协议失败", e);
-            return BaseController.failed("生成产品协议失败");
-        }
-
-        String organCode = "";
-        
-		if (user.getTenantId() == 1) {
-			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
-				organCode = "91440300326364429H";
-			} else {
-				organCode = "91420106333619290A";
-			}
-		} else {
-			organCode = tenantInfo.getTsignCode();
-		}
-
-        SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
-        if (organTsign == null) {
-            logger.error("甲方未创建签章");
-            return BaseController.failed("甲方未创建签章");
-        }
-
-        eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
-        if (sysUserTsign != null && CertificateTypeEnum.IDENTITY.getCode().equals(user.getCertificateType())) {
-            eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), srcPdfPath, srcPdfPath);
-        }
-
-        // 上传到oss
-        String dateStrOss = dateFormatOss.format(date);
-        dateStrOss = "product/" + dateStrOss + "/" + DateUtil.getHour(date);
-        String pdfFilePath = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, dateStrOss, srcFile);
-
-        SysUserContracts sysUserContracts = new SysUserContracts();
-        sysUserContracts.setCreateTime(date);
-        sysUserContracts.setType(ContractType.PRODUCT);
-        sysUserContracts.setUrl(pdfFilePath);
-        sysUserContracts.setUserId(userId);
-        sysUserContracts.setVersion(2);
-        sysUserContracts.setTenantId(user.getTenantId());
-
-        sysUserContractsService.insert(sysUserContracts);
-
-        FileUtils.deleteQuietly(srcFile);
-        return BaseController.succeed();
-    }
-
-    @Override
     public String transferOaFinancial(OAFinancialDto financialDto) {
     public String transferOaFinancial(OAFinancialDto financialDto) {
         List<Integer> circulationUserIds = financialDto.getCirculationUsers().stream().map(CirculationUser::getUserId).collect(Collectors.toList());
         List<Integer> circulationUserIds = financialDto.getCirculationUsers().stream().map(CirculationUser::getUserId).collect(Collectors.toList());
         List<Integer> executorIds = financialDto.getExecutors().stream().map(CirculationUser::getUserId).collect(Collectors.toList());
         List<Integer> executorIds = financialDto.getExecutors().stream().map(CirculationUser::getUserId).collect(Collectors.toList());

+ 43 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java

@@ -7,10 +7,7 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.EmployeeDto;
 import com.ym.mec.biz.dal.dto.EmployeeDto;
 import com.ym.mec.biz.dal.dto.EmployeeLevelDto;
 import com.ym.mec.biz.dal.dto.EmployeeLevelDto;
-import com.ym.mec.biz.dal.entity.Employee;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
-import com.ym.mec.biz.dal.entity.TenantInfo;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.EmployeeOperateEnum;
 import com.ym.mec.biz.dal.enums.EmployeeOperateEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.ParamEnum;
 import com.ym.mec.biz.dal.enums.ParamEnum;
@@ -31,6 +28,7 @@ import com.ym.mec.im.entity.GroupModel;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.security.authentication.LockedException;
 import org.springframework.security.authentication.LockedException;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -76,6 +74,8 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
     private SysEmployeePositionService employeePositionService;
     private SysEmployeePositionService employeePositionService;
     @Autowired
     @Autowired
     private SysEmployeePositionDao employeePositionDao;
     private SysEmployeePositionDao employeePositionDao;
+    @Autowired
+    private SysUserTenantService sysUserTenantService;
 
 
     @Override
     @Override
     public BaseDAO<Integer, Employee> getDAO() {
     public BaseDAO<Integer, Employee> getDAO() {
@@ -138,11 +138,42 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
         if (user != null) {
         if (user != null) {
             employee.setAvatar(user.getAvatar());
             employee.setAvatar(user.getAvatar());
         }
         }
-
+        Integer userId = employee.getId();
+        if(Objects.nonNull(employee.getCreateTenantUserId())){
+            userId = employee.getCreateTenantUserId();
+        }
+        //添加平台用户和机构的关系
+        addUserTenant(employee.getTenantIds(), tenantId, userId);
         //添加到OA
         //添加到OA
         oaUserService.addOaUser(employee);
         oaUserService.addOaUser(employee);
     }
     }
 
 
+    /**
+     * 添加平台用户和机构的关系
+     *
+     * @param tenantIds    机构id集合
+     * @param userTenantId 用户当前机构id
+     * @param userId       用户id
+     */
+    private void addUserTenant(List<Integer> tenantIds, Integer userTenantId, Integer userId) {
+        if (Objects.nonNull(userTenantId) && userTenantId == -1) {
+            if (CollectionUtils.isEmpty(tenantIds)) {
+                throw new BizException("平台账号必须指定一个机构!");
+            }
+            Date now = new Date();
+            tenantIds.forEach(t -> {
+                SysUserTenant userTenant = new SysUserTenant();
+                userTenant.setUserId(userId);
+                userTenant.setTenantId(t);
+                userTenant.setCreatedTime(now);
+                try {
+                    sysUserTenantService.save(userTenant);
+                } catch (DuplicateKeyException ignored) {
+                }
+            });
+        }
+    }
+
     @Override
     @Override
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public void updateEmployee(Employee employee) {
     public void updateEmployee(Employee employee) {
@@ -193,6 +224,9 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
             tenantInfo.setUpdatedBy(sysUser.getId());
             tenantInfo.setUpdatedBy(sysUser.getId());
             tenantInfoService.updateById(tenantInfo);
             tenantInfoService.updateById(tenantInfo);
         }
         }
+        //更新用户与机构的关系
+        sysUserTenantService.deleteByUserId(employee.getId());
+        addUserTenant(employee.getTenantIds(), employee.getTenantId(), employee.getId());
 
 
         //更新OA信息
         //更新OA信息
         oaUserService.updateOaUser(employee);
         oaUserService.updateOaUser(employee);
@@ -221,6 +255,10 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
             for (EmployeeDto employeeDto : dataList) {
             for (EmployeeDto employeeDto : dataList) {
                 employeeDto.setPositionIds(positionMap.get(employeeDto.getId()));
                 employeeDto.setPositionIds(positionMap.get(employeeDto.getId()));
                 employeeDto.setPositionNames(positionNameMap.get(employeeDto.getId()));
                 employeeDto.setPositionNames(positionNameMap.get(employeeDto.getId()));
+                //平台账户查询所拥有的机构
+                if(Objects.nonNull(queryInfo.getTenantId()) && queryInfo.getTenantId() == -1){
+                    employeeDto.setUserTenantList(sysUserTenantService.queryUserTenant(employeeDto.getId()));
+                }
                 if (StringUtils.isBlank(employeeDto.getOrganIdStr())) {
                 if (StringUtils.isBlank(employeeDto.getOrganIdStr())) {
                     continue;
                     continue;
                 }
                 }

+ 120 - 30
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -209,13 +209,13 @@ public class ExportServiceImpl implements ExportService {
             throw new BizException("请登录");
             throw new BizException("请登录");
         }
         }
         if(exportEnum == ExportEnum.ORDER_LIST1 || exportEnum == ExportEnum.ORDER_LIST2){
         if(exportEnum == ExportEnum.ORDER_LIST1 || exportEnum == ExportEnum.ORDER_LIST2){
-            if(sysUser.getTenantId() <= 0){
+            if(sysUser.getTenantId() <= 1){
                 exportEnum = ExportEnum.ORDER_LIST1;
                 exportEnum = ExportEnum.ORDER_LIST1;
             }else {
             }else {
                 exportEnum = ExportEnum.ORDER_LIST2;
                 exportEnum = ExportEnum.ORDER_LIST2;
             }
             }
         }else if(exportEnum == ExportEnum.ROUTE_ORDER_LIST1 || exportEnum == ExportEnum.ROUTE_ORDER_LIST2){
         }else if(exportEnum == ExportEnum.ROUTE_ORDER_LIST1 || exportEnum == ExportEnum.ROUTE_ORDER_LIST2){
-            if(sysUser.getTenantId() <= 0){
+            if(sysUser.getTenantId() <= 1){
                 exportEnum = ExportEnum.ROUTE_ORDER_LIST1;
                 exportEnum = ExportEnum.ROUTE_ORDER_LIST1;
             }else {
             }else {
                 exportEnum = ExportEnum.ROUTE_ORDER_LIST2;
                 exportEnum = ExportEnum.ROUTE_ORDER_LIST2;
@@ -344,6 +344,8 @@ public class ExportServiceImpl implements ExportService {
         exportManageFuncMap.put(ExportEnum.ORDER_LIST1, (info,headColumns) -> orderList(info,headColumns));
         exportManageFuncMap.put(ExportEnum.ORDER_LIST1, (info,headColumns) -> orderList(info,headColumns));
         exportManageFuncMap.put(ExportEnum.ORDER_LIST2, (info,headColumns) -> orderList(info,headColumns));
         exportManageFuncMap.put(ExportEnum.ORDER_LIST2, (info,headColumns) -> orderList(info,headColumns));
         exportManageFuncMap.put(ExportEnum.STUDENT_VIP_PRACTICE, (info,headColumns) -> exportStudentVipPractice(info,headColumns));
         exportManageFuncMap.put(ExportEnum.STUDENT_VIP_PRACTICE, (info,headColumns) -> exportStudentVipPractice(info,headColumns));
+        exportManageFuncMap.put(ExportEnum.STUDENT_VIP_COURSE_INFO, (info,headColumns) -> exportStudentVipCourseInfo(info,headColumns));
+        exportManageFuncMap.put(ExportEnum.STUDENT_MUSIC_THEORY_COURSE_INFO, (info,headColumns) -> exportStudentMusicTheoryCourseInfo(info,headColumns));
 
 
     }
     }
 
 
@@ -1389,11 +1391,14 @@ public class ExportServiceImpl implements ExportService {
         }
         }
         queryInfo.setRoutingOrganId(null);
         queryInfo.setRoutingOrganId(null);
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.ROUTE_ORDER,sysUser.getId());
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.ROUTE_ORDER,sysUser.getId());
-        try {
-            this.routeOrderList(params, managerDownload, headColumns);
-        } catch (FileNotFoundException e) {
-            return BaseController.failed(e.getMessage());
-        }
+        ExecutorService executor = Executors.newCachedThreadPool();
+        CompletableFuture.runAsync(()->{
+            try {
+                this.routeOrderList(params, managerDownload, headColumns);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            }
+        },executor);
         HttpResponseResult<Object> succeed = BaseController.succeed();
         HttpResponseResult<Object> succeed = BaseController.succeed();
         succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
         succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
         return succeed;
         return succeed;
@@ -1410,11 +1415,62 @@ public class ExportServiceImpl implements ExportService {
         Integer tenantId = TenantContextHolder.getTenantId();
         Integer tenantId = TenantContextHolder.getTenantId();
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.STUDENT_VIP_PRACTICE,sysUser.getId());
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.STUDENT_VIP_PRACTICE,sysUser.getId());
-        try {
-            this.studentVipPractice(organId, managerDownload, tenantId,headColumns);
-        } catch (FileNotFoundException e) {
-            return BaseController.failed(e.getMessage());
+        ExecutorService executor = Executors.newCachedThreadPool();
+        CompletableFuture.runAsync(()->{
+            try {
+                this.studentVipPractice(organId, managerDownload, tenantId,headColumns);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            }
+        },executor);
+        HttpResponseResult<Object> succeed = BaseController.succeed();
+        succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
+        return succeed;
+    }
+
+    //学员小课记录导出
+    @Override
+    public HttpResponseResult exportStudentVipCourseInfo(Map<String, Object> info, List<String> headColumns){
+        String organId = getParam(info, "organId", String.class);
+        Integer tenantId = TenantContextHolder.getTenantId();
+        Boolean hasCourse = courseScheduleStudentPaymentDao.hasStudentMusicTheoryCourseInfo(organId, tenantId,"VIP");
+        if (hasCourse == null || !hasCourse) {
+            return BaseController.failed("没有可导出的数据");
         }
         }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.STUDENT_VIP_COURSE_INFO,sysUser.getId());
+        ExecutorService executor = Executors.newCachedThreadPool();
+        CompletableFuture.runAsync(()->{
+            try {
+                this.queryStudentCourseInfo(organId, tenantId,"VIP", managerDownload,headColumns,ExportEnum.STUDENT_VIP_COURSE_INFO);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            }
+        },executor);
+        HttpResponseResult<Object> succeed = BaseController.succeed();
+        succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
+        return succeed;
+    }
+
+    //学员小课记录导出
+    @Override
+    public HttpResponseResult exportStudentMusicTheoryCourseInfo(Map<String, Object> info, List<String> headColumns){
+        String organId = getParam(info, "organId", String.class);
+        Integer tenantId = TenantContextHolder.getTenantId();
+        Boolean hasCourse = courseScheduleStudentPaymentDao.hasStudentMusicTheoryCourseInfo(organId, tenantId,"THEORY");
+        if (hasCourse == null || !hasCourse) {
+            return BaseController.failed("没有可导出的数据");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.STUDENT_MUSIC_THEORY_COURSE_INFO,sysUser.getId());
+        ExecutorService executor = Executors.newCachedThreadPool();
+        CompletableFuture.runAsync(()->{
+            try {
+                this.queryStudentCourseInfo(organId, tenantId,"THEORY", managerDownload,headColumns,ExportEnum.STUDENT_MUSIC_THEORY_COURSE_INFO);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            }
+        },executor);
         HttpResponseResult<Object> succeed = BaseController.succeed();
         HttpResponseResult<Object> succeed = BaseController.succeed();
         succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
         succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
         return succeed;
         return succeed;
@@ -1447,11 +1503,14 @@ public class ExportServiceImpl implements ExportService {
             return BaseController.failed("数据集太大,不能导出.最大数据集不能超过50000");
             return BaseController.failed("数据集太大,不能导出.最大数据集不能超过50000");
         }
         }
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.ORDER,sysUser.getId());
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.ORDER,sysUser.getId());
-        try {
-            this.orderList(params, managerDownload, headColumns);
-        } catch (FileNotFoundException e) {
-            return BaseController.failed(e.getMessage());
-        }
+        ExecutorService executor = Executors.newCachedThreadPool();
+        CompletableFuture.runAsync(()->{
+            try {
+                this.orderList(params, managerDownload, headColumns);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            }
+        },executor);
         HttpResponseResult<Object> succeed = BaseController.succeed();
         HttpResponseResult<Object> succeed = BaseController.succeed();
         succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
         succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
         return succeed;
         return succeed;
@@ -1476,11 +1535,14 @@ public class ExportServiceImpl implements ExportService {
             return BaseController.failed("数据集太大,不能导出.最大数据集不能超过50000");
             return BaseController.failed("数据集太大,不能导出.最大数据集不能超过50000");
         }
         }
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.COURSE_SCHEDULE,sysUser.getId());
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.COURSE_SCHEDULE,sysUser.getId());
-        try {
-            this.superFindCourseSchedules(queryInfo, managerDownload);
-        } catch (FileNotFoundException e) {
-            return BaseController.failed(e.getMessage());
-        }
+        ExecutorService executor = Executors.newCachedThreadPool();
+        CompletableFuture.runAsync(()->{
+            try {
+                this.superFindCourseSchedules(queryInfo, managerDownload);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            }
+        },executor);
         HttpResponseResult<Object> succeed = BaseController.succeed();
         HttpResponseResult<Object> succeed = BaseController.succeed();
         succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
         succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
         return succeed;
         return succeed;
@@ -1497,7 +1559,7 @@ public class ExportServiceImpl implements ExportService {
                 .append(DateUtil.getDate(nowDate))
                 .append(DateUtil.getDate(nowDate))
                 .append(".xls").toString();
                 .append(".xls").toString();
         ManagerDownload managerDownload = new ManagerDownload();
         ManagerDownload managerDownload = new ManagerDownload();
-        managerDownload.setType(ExportTypeEnum.COURSE_SCHEDULE);
+        managerDownload.setType(exportTypeEnum);
         managerDownload.setUserId(userId);
         managerDownload.setUserId(userId);
         managerDownload.setName(fileName);
         managerDownload.setName(fileName);
         managerDownload.setFileUrl("");
         managerDownload.setFileUrl("");
@@ -1509,7 +1571,6 @@ public class ExportServiceImpl implements ExportService {
 
 
 
 
     @Override
     @Override
-    @Async
     public void orderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException {
     public void orderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException {
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderService.ExportQueryPage(params);
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderService.ExportQueryPage(params);
         long i = 1;
         long i = 1;
@@ -1826,7 +1887,6 @@ public class ExportServiceImpl implements ExportService {
     }
     }
 
 
     @Override
     @Override
-    @Async
     public void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException {
     public void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException {
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentRouteOrderDao.ExportQueryPage(params);
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentRouteOrderDao.ExportQueryPage(params);
 
 
@@ -2339,7 +2399,6 @@ public class ExportServiceImpl implements ExportService {
     }
     }
 
 
     @Override
     @Override
-    @Async
     public void superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) throws FileNotFoundException {
     public void superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) throws FileNotFoundException {
         List<CourseScheduleEndDto> rows = courseScheduleService.endFindCourseSchedules(queryInfo).getRows();
         List<CourseScheduleEndDto> rows = courseScheduleService.endFindCourseSchedules(queryInfo).getRows();
         for (CourseScheduleEndDto row : rows) {
         for (CourseScheduleEndDto row : rows) {
@@ -2380,7 +2439,6 @@ public class ExportServiceImpl implements ExportService {
     }
     }
 
 
     @Override
     @Override
-    @Async
     public void studentVipPractice(String organId, ManagerDownload managerDownload, Integer tenantId,List<String> headColumns) throws FileNotFoundException {
     public void studentVipPractice(String organId, ManagerDownload managerDownload, Integer tenantId,List<String> headColumns) throws FileNotFoundException {
         List<StudentVipPracticeExportDto> studentVipPracticeExportDtos = courseScheduleStudentPaymentDao.exportStudentVipPractice(organId, tenantId);
         List<StudentVipPracticeExportDto> studentVipPracticeExportDtos = courseScheduleStudentPaymentDao.exportStudentVipPractice(organId, tenantId);
         if(studentVipPracticeExportDtos != null && studentVipPracticeExportDtos.size() > 0){
         if(studentVipPracticeExportDtos != null && studentVipPracticeExportDtos.size() > 0){
@@ -2418,10 +2476,6 @@ public class ExportServiceImpl implements ExportService {
 
 
         HSSFWorkbook workbook = null;
         HSSFWorkbook workbook = null;
         try {
         try {
-            /*String[] header = {"分部", "学员编号", "学生姓名", "课程余额", "声部", "VIP已结束课时数", "VIP未开始课时数", "已结束VIP上课老师编号", "已结束VIP上课老师",
-                    "网管课已结束课时数", "网管课未开始课时数", "已结束网管课上课老师编号", "已结束网管课上课老师", "指导老师编号", "指导老师"};
-            String[] body = {"organName","userId", "username","courseBalance", "subjectName", "vipOverNum", "vipNotStartNum", "vipOverTeacherId", "vipOverTeacherName"
-                    , "practiceOverNum", "practiceNotStartNum", "practiceOverTeacherId", "practiceOverTeacherName","teacherId","teacherName"};*/
             Map<String, String> headMap = getExportMap(new ExportDto(ExportEnum.STUDENT_VIP_PRACTICE, headColumns));
             Map<String, String> headMap = getExportMap(new ExportDto(ExportEnum.STUDENT_VIP_PRACTICE, headColumns));
             String[] header = headMap.keySet().toArray(new String[headMap.keySet().size()]);
             String[] header = headMap.keySet().toArray(new String[headMap.keySet().size()]);
             String[] body = headMap.values().toArray(new String[headMap.keySet().size()]);
             String[] body = headMap.values().toArray(new String[headMap.keySet().size()]);
@@ -2448,4 +2502,40 @@ public class ExportServiceImpl implements ExportService {
             }
             }
         }
         }
     }
     }
+
+    @Override
+    public void queryStudentCourseInfo(String organId, Integer tenantId, String groupType, ManagerDownload managerDownload, List<String> headColumns,ExportEnum exportEnum) throws FileNotFoundException {
+        List<ExportStudentCourseInfoDto> studentCourseInfoDtos = courseScheduleStudentPaymentDao.queryStudentCourseInfo(organId,tenantId,groupType);
+        String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
+        File file = new File(basePath + "/" + managerDownload.getName());
+        FileOutputStream fileOutputStream = new FileOutputStream(file);
+
+        HSSFWorkbook workbook = null;
+        try {
+            Map<String, String> headMap = getExportMap(new ExportDto(exportEnum, headColumns));
+            String[] header = headMap.keySet().toArray(new String[headMap.keySet().size()]);
+            String[] body = headMap.values().toArray(new String[headMap.keySet().size()]);
+            workbook = POIUtil.exportExcel(header, body, studentCourseInfoDtos);
+            workbook.write(fileOutputStream);
+            fileOutputStream.getFD().sync();
+            fileOutputStream.close();
+
+            String folder = "download/" + UploadUtil.getFileFloder();
+            String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, folder, file);
+            //把记录插入下载表
+            managerDownload.setFileUrl(url);
+            managerDownload.setStatus(1);
+            managerDownloadDao.update(managerDownload);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                fileOutputStream.close();
+                workbook.close();
+                file.delete();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }
 }

+ 4 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -321,10 +321,8 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		LocalDate nowDate = LocalDate.now();
 		LocalDate nowDate = LocalDate.now();
 		
 		
 		List<Organization> allOrgans = organizationService.findAllOrgans(tenantId);
 		List<Organization> allOrgans = organizationService.findAllOrgans(tenantId);
-		if(CollectionUtils.isEmpty(this.organIds.get())){
-			this.organIds.get().clear();
-			this.organIds.get().addAll(allOrgans.stream().map(Organization::getId).collect(Collectors.toSet()));
-		}
+		this.organIds.get().clear();
+		this.organIds.get().addAll(allOrgans.stream().map(Organization::getId).collect(Collectors.toSet()));
 
 
 		if(StringUtils.isBlank(dayStr)){
 		if(StringUtils.isBlank(dayStr)){
 			dayStr = nowDate.plusDays(-1).toString();
 			dayStr = nowDate.plusDays(-1).toString();
@@ -580,7 +578,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		boolean specialType = IndexDataType.NEWLY_STUDENT_NUM.equals(indexDataType)||IndexDataType.QUIT_MUSIC_GROUP_STUDENT_NUM.equals(indexDataType);
 		boolean specialType = IndexDataType.NEWLY_STUDENT_NUM.equals(indexDataType)||IndexDataType.QUIT_MUSIC_GROUP_STUDENT_NUM.equals(indexDataType);
 		Set<Integer> ignoreOrganIds = new HashSet<>();
 		Set<Integer> ignoreOrganIds = new HashSet<>();
 		if(specialType){
 		if(specialType){
-			List<IndexBaseMonthData> indexBaseDatas = indexBaseMonthDataDao.getWithDayAndDataType(dayStr, indexDataType,TenantContextHolder.getTenantId());
+			List<IndexBaseMonthData> indexBaseDatas = indexBaseMonthDataDao.getWithDayAndDataType(dayStr, indexDataType, tenantId);
 			if(!CollectionUtils.isEmpty(indexBaseDatas)) {
 			if(!CollectionUtils.isEmpty(indexBaseDatas)) {
 				ignoreOrganIds = indexBaseDatas.stream().map(IndexBaseMonthData::getOrganId).collect(Collectors.toSet());
 				ignoreOrganIds = indexBaseDatas.stream().map(IndexBaseMonthData::getOrganId).collect(Collectors.toSet());
 			}
 			}
@@ -753,6 +751,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 				params.put("jobNature", JobNatureEnum.FULL_TIME);
 				params.put("jobNature", JobNatureEnum.FULL_TIME);
 				params.put("unDone",1);
 				params.put("unDone",1);
 				params.put("reminded",0);
 				params.put("reminded",0);
+				params.put("tenantId",tenantId);
 				int serveErrTeacherNum = studentExtracurricularExercisesSituationDao.countTeacherServeInfo(params);
 				int serveErrTeacherNum = studentExtracurricularExercisesSituationDao.countTeacherServeInfo(params);
 				fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_SERVE_ERROR, IndexErrorType.TEACHER_SERVE_ERROR.getMsg(), serveErrTeacherNum, null));
 				fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_SERVE_ERROR, IndexErrorType.TEACHER_SERVE_ERROR.getMsg(), serveErrTeacherNum, null));
 			}
 			}

+ 68 - 13
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrganizationServiceImpl.java

@@ -1,19 +1,37 @@
 package com.ym.mec.biz.service.impl;
 package com.ym.mec.biz.service.impl;
 
 
+import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.EDUCATION;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.ClassGroupDao;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dao.OrganizationDao;
 import com.ym.mec.biz.dal.dao.OrganizationDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.TenantContractTemplateDao;
+import com.ym.mec.biz.dal.dao.TenantInfoDao;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.TenantContractTemplate;
 import com.ym.mec.biz.dal.entity.TenantInfo;
 import com.ym.mec.biz.dal.entity.TenantInfo;
 import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
 import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
 import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
 import com.ym.mec.biz.dal.page.EducationBaseQueryInfo;
 import com.ym.mec.biz.dal.page.EducationBaseQueryInfo;
+import com.ym.mec.biz.service.ContractService;
 import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.SysEmployeePositionService;
 import com.ym.mec.biz.service.SysEmployeePositionService;
 import com.ym.mec.biz.service.TenantInfoService;
 import com.ym.mec.biz.service.TenantInfoService;
@@ -21,17 +39,6 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.common.tenant.TenantContextHolder;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.EDUCATION;
 
 
 @Service
 @Service
 public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organization> implements OrganizationService {
 public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organization> implements OrganizationService {
@@ -48,6 +55,14 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 	private SysUserFeignService sysUserFeignService;
 	private SysUserFeignService sysUserFeignService;
 	@Autowired
 	@Autowired
 	private SysEmployeePositionService employeePositionService;
 	private SysEmployeePositionService employeePositionService;
+	@Autowired
+    @Lazy
+	private ContractService contractService;
+	@Autowired
+	private TenantInfoDao tenantInfoDao;
+	
+	@Autowired
+	private TenantContractTemplateDao tenantContractTemplateDao;
 
 
 	@Override
 	@Override
 	public BaseDAO<Integer, Organization> getDAO() {
 	public BaseDAO<Integer, Organization> getDAO() {
@@ -155,7 +170,6 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 		return organizationDao.getOrgans(organIds,tenantId);
 		return organizationDao.getOrgans(organIds,tenantId);
 	}
 	}
 
 
-
     @Override
     @Override
     public <T extends EducationBaseQueryInfo> T onlyEducation(T queryInfo) {
     public <T extends EducationBaseQueryInfo> T onlyEducation(T queryInfo) {
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
@@ -170,4 +184,45 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 		}
 		}
 		return queryInfo;
 		return queryInfo;
     }
     }
+
+	@Override
+	@Transactional
+	public boolean updateBasicInfo(Organization organization) {
+		
+		Organization orginOrgan = get(organization.getId());
+		
+		if(orginOrgan == null){
+			throw new BizException("分部原始信息查询失败");
+		}
+		
+		update(organization);
+		
+		//是否修改了机构名称或机构编码
+        if (!StringUtils.equals(orginOrgan.getCorporateName(), organization.getCorporateName()) || !StringUtils.equals(orginOrgan.getCorporateCode(), organization.getCorporateCode())) {
+        	
+        	Integer tenantId = organization.getTenantId();
+            //升级机构协议版本号
+            TenantContractTemplate tenantContractTemplate = tenantContractTemplateDao.queryLatestContractTemplate(null, null, tenantId);
+            if (tenantContractTemplate != null) {
+            	tenantInfoDao.getLocked(tenantId);
+
+                Integer maxVersion = tenantContractTemplateDao.queryMaxVersion();
+                int version = maxVersion == null ? 1 : maxVersion + 1;
+
+                tenantContractTemplate.setVersion(version);
+                Date date = new Date();
+                tenantContractTemplate.setUpdateTime(date);
+
+                tenantContractTemplateDao.update(tenantContractTemplate);
+            }
+            
+			if (StringUtils.isNotBlank(organization.getCorporateName()) && StringUtils.isNotBlank(organization.getCorporateCode())) {
+				// 添加签章信息
+				contractService.addTsign(organization.getId(), organization.getCorporateCode(), organization.getCorporateName(), tenantId);
+			}
+        }
+		
+		return true;
+	}
+
 }
 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -768,6 +768,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 studentPaymentOrder.setClassGroupId(206);
                 studentPaymentOrder.setClassGroupId(206);
             }
             }
             studentPaymentOrderService.update(studentPaymentOrder);
             studentPaymentOrderService.update(studentPaymentOrder);
+            studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
         }
         }
         return studentPaymentOrder;
         return studentPaymentOrder;
     }
     }

+ 61 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java

@@ -21,8 +21,10 @@ import org.springframework.util.CollectionUtils;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.time.DayOfWeek;
 import java.time.DayOfWeek;
+import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -341,15 +343,20 @@ public class StudentServeServiceImpl implements StudentServeService {
 //            return;
 //            return;
 //        }
 //        }
 
 
+        //查询需要生成服务指标的学员
         List<StudentServeCourseDto> studentFutureCourseInfo = studentDao.getStudentFutureCourseInfo(monDayDate.toString(), DateUtil.dateToString(nextMonday, "yyyy-MM-dd"), studentIds, tenantId);
         List<StudentServeCourseDto> studentFutureCourseInfo = studentDao.getStudentFutureCourseInfo(monDayDate.toString(), DateUtil.dateToString(nextMonday, "yyyy-MM-dd"), studentIds, tenantId);
         if(CollectionUtils.isEmpty(studentFutureCourseInfo)){
         if(CollectionUtils.isEmpty(studentFutureCourseInfo)){
             return;
             return;
         }
         }
         Map<Integer, List<StudentServeCourseDto>> studentCourseMap = studentFutureCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getStudentId));
         Map<Integer, List<StudentServeCourseDto>> studentCourseMap = studentFutureCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getStudentId));
+        //有单技课或合奏课,且需要服务的学员
         Set<Integer> musicCourseStudentIds = studentFutureCourseInfo.stream().filter(s -> CourseSchedule.CourseScheduleType.SINGLE.equals(s.getType()) || CourseSchedule.CourseScheduleType.MIX.equals(s.getType())).map(StudentServeCourseDto::getStudentId).collect(Collectors.toSet());
         Set<Integer> musicCourseStudentIds = studentFutureCourseInfo.stream().filter(s -> CourseSchedule.CourseScheduleType.SINGLE.equals(s.getType()) || CourseSchedule.CourseScheduleType.MIX.equals(s.getType())).map(StudentServeCourseDto::getStudentId).collect(Collectors.toSet());
 
 
+        //有课且被服务的学生
         Set<Integer> haveCourseBeServeStudentIds = studentCourseMap.keySet();
         Set<Integer> haveCourseBeServeStudentIds = studentCourseMap.keySet();
+        //查询所有开启了服务状态的学员
         List<Integer> allServeStudentIds = studentDao.getServeStudentIds(tenantId);
         List<Integer> allServeStudentIds = studentDao.getServeStudentIds(tenantId);
+        //没课但需要服务的学员
         Set<Integer> noCourseServeStudentIds = allServeStudentIds.stream().filter(id -> !haveCourseBeServeStudentIds.contains(id)).collect(Collectors.toSet());
         Set<Integer> noCourseServeStudentIds = allServeStudentIds.stream().filter(id -> !haveCourseBeServeStudentIds.contains(id)).collect(Collectors.toSet());
 
 
         Set<Integer> musicStudentIds = new HashSet<>();
         Set<Integer> musicStudentIds = new HashSet<>();
@@ -361,6 +368,7 @@ public class StudentServeServiceImpl implements StudentServeService {
         }
         }
         List<StudentServeCourseDto> noCourseBeServeStudentInfo = new ArrayList<>();
         List<StudentServeCourseDto> noCourseBeServeStudentInfo = new ArrayList<>();
         if(!CollectionUtils.isEmpty(musicStudentIds)){
         if(!CollectionUtils.isEmpty(musicStudentIds)){
+        	//查询进行中的乐团,且需要服务的学生、老师、乐团信息
             noCourseBeServeStudentInfo = studentDao.getNoCourseBeServeStudentInfo(new ArrayList<>(musicStudentIds), tenantId);
             noCourseBeServeStudentInfo = studentDao.getNoCourseBeServeStudentInfo(new ArrayList<>(musicStudentIds), tenantId);
         }
         }
 
 
@@ -371,22 +379,48 @@ public class StudentServeServiceImpl implements StudentServeService {
 
 
         for (Map.Entry<Integer, List<StudentServeCourseDto>> studentCourseMapEntry : studentCourseMap.entrySet()) {
         for (Map.Entry<Integer, List<StudentServeCourseDto>> studentCourseMapEntry : studentCourseMap.entrySet()) {
             Map<CourseSchedule.CourseScheduleType, List<StudentServeCourseDto>> typeCourseMap = studentCourseMapEntry.getValue().stream().collect(Collectors.groupingBy(StudentServeCourseDto::getType));
             Map<CourseSchedule.CourseScheduleType, List<StudentServeCourseDto>> typeCourseMap = studentCourseMapEntry.getValue().stream().collect(Collectors.groupingBy(StudentServeCourseDto::getType));
-
-            if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.SINGLE)){
-                Set<String> musicGroupIds = noCourseStudentMusicIdsMap.get(studentCourseMapEntry.getKey());
-                if(Objects.isNull(musicGroupIds)){
-                    musicGroupIds = new HashSet<>();
-                }
-
+            
+            Integer userId = studentCourseMapEntry.getKey();
+            
+            Set<String> musicGroupIds = noCourseStudentMusicIdsMap.get(studentCourseMapEntry.getKey());
+            if(Objects.isNull(musicGroupIds)){
+                musicGroupIds = new HashSet<>();
+            }
+            //查询用户在指定乐团截止本周末的课程数
+            List<Mapper> mapperList = new ArrayList<Mapper>();
+            if(musicGroupIds.size() > 0){
+            	mapperList = courseScheduleStudentPaymentDao.queryUserMusicGroupCourseNumByClassTime(GroupType.MUSIC, musicGroupIds, userId, new Date(0, 1, 1), LocalDateToUdate(sunDayDate));
+            }
+            Map<Object, Object> map = mapperList.stream().collect(Collectors.toMap(Mapper :: getKey, Mapper :: getValue));
+            
+            //是否在乐团生成服务指标
+            boolean isServiceWithMusicGroup = false;
+            //判断截止本周末是否有乐团课
+            for(Mapper m : mapperList){
+            	if((long)m.getValue() > 0){
+            		isServiceWithMusicGroup = true;
+            	}
+            }
+            
+            //有未上的单技课
+            if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.SINGLE) && isServiceWithMusicGroup){
+                
                 List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.SINGLE).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
                 List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.SINGLE).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
                 if(!CollectionUtils.isEmpty(weekCourseInfo)){
                 if(!CollectionUtils.isEmpty(weekCourseInfo)){
                     Map<String, List<StudentServeCourseDto>> groupCourseInfo = weekCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getMusicGroupId));
                     Map<String, List<StudentServeCourseDto>> groupCourseInfo = weekCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getMusicGroupId));
                     Map<Integer, Set<Long>> teacherNotOverCourseIds = new HashMap<>();
                     Map<Integer, Set<Long>> teacherNotOverCourseIds = new HashMap<>();
                     Map<Integer, Set<Long>> teacherServiceCourseIdMap = new HashMap<>();
                     Map<Integer, Set<Long>> teacherServiceCourseIdMap = new HashMap<>();
                     for (Map.Entry<String, List<StudentServeCourseDto>> groupCourseInfoEntry : groupCourseInfo.entrySet()) {
                     for (Map.Entry<String, List<StudentServeCourseDto>> groupCourseInfoEntry : groupCourseInfo.entrySet()) {
+                    	
                         if(musicGroupIds.contains(groupCourseInfoEntry.getKey())) {
                         if(musicGroupIds.contains(groupCourseInfoEntry.getKey())) {
                             musicGroupIds.remove(groupCourseInfoEntry.getKey());
                             musicGroupIds.remove(groupCourseInfoEntry.getKey());
                         }
                         }
+                        
+                        //学生在当前乐团没有上过课,就不需要生成服务指标
+                        if(map.get(groupCourseInfoEntry.getKey()) != null && (long)map.get(groupCourseInfoEntry.getKey()) == 0){
+                        	continue;
+                        }
+                        
                         StudentServeCourseDto courseInfo = groupCourseInfoEntry.getValue().stream().min(Comparator.comparing(StudentServeCourseDto::getCourseStartTime)).get();
                         StudentServeCourseDto courseInfo = groupCourseInfoEntry.getValue().stream().min(Comparator.comparing(StudentServeCourseDto::getCourseStartTime)).get();
                         if(!teacherServiceCourseIdMap.containsKey(courseInfo.getActualTeacherId())){
                         if(!teacherServiceCourseIdMap.containsKey(courseInfo.getActualTeacherId())){
                             teacherServiceCourseIdMap.put(courseInfo.getActualTeacherId(), new HashSet<>());
                             teacherServiceCourseIdMap.put(courseInfo.getActualTeacherId(), new HashSet<>());
@@ -443,7 +477,7 @@ public class StudentServeServiceImpl implements StudentServeService {
                     studentExtracurricularExercisesSituation.setExpectExercisesNum(teacherNumMapEntry.getValue());
                     studentExtracurricularExercisesSituation.setExpectExercisesNum(teacherNumMapEntry.getValue());
                     results.add(studentExtracurricularExercisesSituation);
                     results.add(studentExtracurricularExercisesSituation);
                 }
                 }
-            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.VIP)){
+            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.VIP)){ //有未上的VIP
                 List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.VIP);
                 List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.VIP);
                 List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.VIP).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
                 List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.VIP).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
                 if(CollectionUtils.isEmpty(weekCourseInfo)){
                 if(CollectionUtils.isEmpty(weekCourseInfo)){
@@ -478,13 +512,16 @@ public class StudentServeServiceImpl implements StudentServeService {
                         results.add(studentExtracurricularExercisesSituation);
                         results.add(studentExtracurricularExercisesSituation);
                     }
                     }
                 }
                 }
-            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.MIX)){
-                Set<String> musicGroupIds = noCourseStudentMusicIdsMap.get(studentCourseMapEntry.getKey());
-                if(CollectionUtils.isEmpty(musicGroupIds)){
-                    continue;
-                }
+            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.MIX)){//有未上的合奏课
+                
                 Map<Integer, Integer> teacherNumMap = new HashMap<>();
                 Map<Integer, Integer> teacherNumMap = new HashMap<>();
                 for (String groupId : musicGroupIds) {
                 for (String groupId : musicGroupIds) {
+                	
+                    //学生在当前乐团没有上过课,就不需要生成服务指标
+                    if(map.get(groupId) == null || (long)map.get(groupId) == 0){
+                    	continue;
+                    }
+                    
                     Integer teacherId = null;
                     Integer teacherId = null;
                     List<BaseMapDto<Integer, Integer>> studentTeacherIdList = classGroupStudentMapperDao.getStudentClassGroupBishopTeacherMap(Arrays.asList(studentCourseMapEntry.getKey()), groupId);
                     List<BaseMapDto<Integer, Integer>> studentTeacherIdList = classGroupStudentMapperDao.getStudentClassGroupBishopTeacherMap(Arrays.asList(studentCourseMapEntry.getKey()), groupId);
                     if(!CollectionUtils.isEmpty(studentTeacherIdList)){
                     if(!CollectionUtils.isEmpty(studentTeacherIdList)){
@@ -512,7 +549,7 @@ public class StudentServeServiceImpl implements StudentServeService {
                     studentExtracurricularExercisesSituation.setExpectExercisesNum(teacherNumMapEntry.getValue());
                     studentExtracurricularExercisesSituation.setExpectExercisesNum(teacherNumMapEntry.getValue());
                     results.add(studentExtracurricularExercisesSituation);
                     results.add(studentExtracurricularExercisesSituation);
                 }
                 }
-            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.PRACTICE)){
+            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.PRACTICE)){//有未上的陪练课
                 List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.PRACTICE);
                 List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.PRACTICE);
                 List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.PRACTICE).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
                 List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.PRACTICE).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
                 if(CollectionUtils.isEmpty(weekCourseInfo)){
                 if(CollectionUtils.isEmpty(weekCourseInfo)){
@@ -561,8 +598,10 @@ public class StudentServeServiceImpl implements StudentServeService {
             if(CollectionUtils.isEmpty(musicGroupIds)){
             if(CollectionUtils.isEmpty(musicGroupIds)){
                 continue;
                 continue;
             }
             }
+            
             Map<Integer, Integer> teacherNumMap = new HashMap<>();
             Map<Integer, Integer> teacherNumMap = new HashMap<>();
             for (String groupId : musicGroupIds) {
             for (String groupId : musicGroupIds) {
+            	
                 Integer teacherId = null;
                 Integer teacherId = null;
                 List<BaseMapDto<Integer, Integer>> studentTeacherIdList = classGroupStudentMapperDao.getStudentClassGroupBishopTeacherMap(Arrays.asList(noCourseServeStudentId), groupId);
                 List<BaseMapDto<Integer, Integer>> studentTeacherIdList = classGroupStudentMapperDao.getStudentClassGroupBishopTeacherMap(Arrays.asList(noCourseServeStudentId), groupId);
                 if(!CollectionUtils.isEmpty(studentTeacherIdList)){
                 if(!CollectionUtils.isEmpty(studentTeacherIdList)){
@@ -627,7 +666,6 @@ public class StudentServeServiceImpl implements StudentServeService {
                         .collect(Collectors.groupingBy(StudentServeCourseHomeworkDto::getUserId));
                         .collect(Collectors.groupingBy(StudentServeCourseHomeworkDto::getUserId));
             }
             }
 
 
-
             List<ExtracurricularExercisesReply> allStudentExercises = extracurricularExercisesReplyDao.getStudentExercisesWithTimeZone(monDayDate.toString(), sunDayDate.toString(), new ArrayList<>(allStudentIds), TenantContextHolder.getTenantId());
             List<ExtracurricularExercisesReply> allStudentExercises = extracurricularExercisesReplyDao.getStudentExercisesWithTimeZone(monDayDate.toString(), sunDayDate.toString(), new ArrayList<>(allStudentIds), TenantContextHolder.getTenantId());
             if(!CollectionUtils.isEmpty(allStudentExercises)){
             if(!CollectionUtils.isEmpty(allStudentExercises)){
                 studentExercisesMap = allStudentExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getUserId));
                 studentExercisesMap = allStudentExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getUserId));
@@ -1182,4 +1220,12 @@ public class StudentServeServiceImpl implements StudentServeService {
         }
         }
         return result;
         return result;
     }
     }
+    
+
+    
+	private Date LocalDateToUdate(LocalDate localDate) {
+		ZoneId zone = ZoneId.systemDefault();
+		Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
+		return Date.from(instant);
+	}
 }
 }

+ 48 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserTenantServiceImpl.java

@@ -0,0 +1,48 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.SysUserTenantDao;
+import com.ym.mec.biz.dal.entity.SysUserTenant;
+import com.ym.mec.biz.dal.vo.SysUserTenantVo;
+import com.ym.mec.biz.service.SysUserTenantService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 平台用户与机构关系表(SysUserTenant)表服务实现类
+ *
+ * @author hgw
+ * @since 2022-03-02 11:09:34
+ */
+@Service("sysUserTenantService")
+public class SysUserTenantServiceImpl extends ServiceImpl<SysUserTenantDao, SysUserTenant> implements SysUserTenantService {
+
+    private final static Logger log = LoggerFactory.getLogger(SysUserTenantServiceImpl.class);
+
+    @Override
+    public SysUserTenantDao getDao() {
+        return this.baseMapper;
+    }
+
+    @Override
+    public List<SysUserTenantVo> queryUserTenant(Integer userId) {
+        return baseMapper.queryUserTenant(userId);
+    }
+
+    /**
+     * 根据用户id删除用户与机构关系
+     *
+     * @param userId 用户id
+     */
+    @Override
+    public void deleteByUserId(Integer userId) {
+        baseMapper.delete(new QueryWrapper<SysUserTenant>().eq("user_id_", userId));
+    }
+
+}
+

+ 32 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java

@@ -18,6 +18,7 @@ import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.TenantContractRecord.TenantContractRecordEnum;
 import com.ym.mec.biz.dal.entity.TenantContractRecord.TenantContractRecordEnum;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.vo.PlatformServePageVo;
 import com.ym.mec.biz.dal.vo.PlatformServePageVo;
+import com.ym.mec.biz.dal.vo.SysUserTenantVo;
 import com.ym.mec.biz.dal.vo.TenantInfoPageVo;
 import com.ym.mec.biz.dal.vo.TenantInfoPageVo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.exception.BizException;
@@ -119,6 +120,8 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
     private TenantContractRecordService tenantContractRecordService;
     private TenantContractRecordService tenantContractRecordService;
     @Autowired
     @Autowired
     private TenantContractTemplateDao tenantContractTemplateDao;
     private TenantContractTemplateDao tenantContractTemplateDao;
+    @Autowired
+    private SysUserTenantService sysUserTenantService;
 
 
     @Value("${contract.baseDir:/var/pdf}")
     @Value("${contract.baseDir:/var/pdf}")
     private String contractBaseDir;
     private String contractBaseDir;
@@ -182,6 +185,12 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
             preJoin.setState(1);
             preJoin.setState(1);
             tenantPreJoinService.updateById(preJoin);
             tenantPreJoinService.updateById(preJoin);
         }
         }
+        //添加人员机构关联关系
+        SysUserTenant userTenant = new SysUserTenant();
+        userTenant.setUserId(userId);
+        userTenant.setTenantId(tenantId);
+        userTenant.setCreatedTime(new Date());
+        sysUserTenantService.save(userTenant);
         //释放
         //释放
         bucket.delete();
         bucket.delete();
     }
     }
@@ -483,6 +492,8 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         e.setUserType(SysUserType.SYSTEM.getCode());
         e.setUserType(SysUserType.SYSTEM.getCode());
         e.setOrganIdList(String.valueOf(orgId));
         e.setOrganIdList(String.valueOf(orgId));
         e.setPassword(pw);
         e.setPassword(pw);
+        e.setTenantIds(Lists.newArrayList(tenantInfo.getId()));
+        e.setCreateTenantUserId(tenantInfo.getCreatedBy());
         try {
         try {
             log.info("createUser >>>> {}", e);
             log.info("createUser >>>> {}", e);
             employeeService.add(e);
             employeeService.add(e);
@@ -514,6 +525,20 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
      */
      */
     @Override
     @Override
     public PageInfo<TenantInfoPageVo> queryPage(Map<String, Object> param) {
     public PageInfo<TenantInfoPageVo> queryPage(Map<String, Object> param) {
+        //获取当前登录用户
+        SysUser user = getUser();
+        if (Objects.nonNull(user.getIsSuperAdmin()) && user.getTenantId() == -1) {
+            //不是超级管理员 但是 是平台账号,则需要查询自己关联的机构有哪些
+            if (!user.getIsSuperAdmin()) {
+                List<SysUserTenantVo> sysUserTenantVos = sysUserTenantService.queryUserTenant(user.getId());
+                if (CollectionUtils.isNotEmpty(sysUserTenantVos)) {
+                    List<Integer> tenantIds = sysUserTenantVos.stream().map(SysUserTenantVo::getTenantId).collect(Collectors.toList());
+                    param.put("tenantIds", tenantIds);
+                } else {
+                    throw new BizException("您的账号暂无机构权限,请联系平台管理员配置");
+                }
+            }
+        }
         Page<TenantInfoPageVo> pageInfo = PageUtil.getPageInfo(param);
         Page<TenantInfoPageVo> pageInfo = PageUtil.getPageInfo(param);
         pageInfo.setAsc("a.id_");
         pageInfo.setAsc("a.id_");
         return PageUtil.pageInfo(baseMapper.queryPage(pageInfo, param));
         return PageUtil.pageInfo(baseMapper.queryPage(pageInfo, param));
@@ -978,11 +1003,17 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
 
 
     private Integer getUserId() {
     private Integer getUserId() {
         //修改机构基础信息
         //修改机构基础信息
-        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+        return Optional.ofNullable(getUser())
                 .map(SysUser::getId)
                 .map(SysUser::getId)
                 .orElseThrow(() -> new BizException("用户信息获取失败,请刷新页面或者重新登录!"));
                 .orElseThrow(() -> new BizException("用户信息获取失败,请刷新页面或者重新登录!"));
     }
     }
 
 
+    private SysUser getUser() {
+        //修改机构基础信息
+        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+                .orElseThrow(() -> new BizException("用户信息获取失败,请刷新页面或者重新登录!"));
+    }
+
     private void checkTsign(String code) {
     private void checkTsign(String code) {
         //校验营业信息
         //校验营业信息
         SysUserTsign sysUserTsign = sysUserTsignService.queryByCardNo(code);
         SysUserTsign sysUserTsign = sysUserTsignService.queryByCardNo(code);

+ 72 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -36,6 +36,11 @@
 		<result column="course_status_" property="courseStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="course_status_" property="courseStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="course_start_time_" property="courseStartTime"/>
 		<result column="course_start_time_" property="courseStartTime"/>
 	</resultMap>
 	</resultMap>
+	
+	<resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
+		<result column="key_" property="key" />
+		<result column="value_" property="value" />
+	</resultMap>
 
 
 	<!-- 根据主键查询一条记录 -->
 	<!-- 根据主键查询一条记录 -->
 	<select id="get" resultMap="CourseScheduleStudentPayment" >
 	<select id="get" resultMap="CourseScheduleStudentPayment" >
@@ -874,4 +879,71 @@
 		LEFT JOIN sys_user su ON su.id_ = cs.actual_teacher_id_
 		LEFT JOIN sys_user su ON su.id_ = cs.actual_teacher_id_
 		WHERE cssp.user_id_ = c.user_id_ AND CONCAT(cs.class_date_,' ',cs.start_class_time_) = c.class_date_ AND cssp.group_type_ = #{groupType}
 		WHERE cssp.user_id_ = c.user_id_ AND CONCAT(cs.class_date_,' ',cs.start_class_time_) = c.class_date_ AND cssp.group_type_ = #{groupType}
 	</select>
 	</select>
+    <select id="hasStudentMusicTheoryCourseInfo" resultType="java.lang.Boolean">
+		SELECT CASE WHEN cssp.user_id_ = NULL THEN 0 ELSE 1 END hasCourse
+		FROM `course_schedule_student_payment` cssp
+				 LEFT JOIN `course_schedule` cs on cssp.`course_schedule_id_` = cs.`id_`
+				 LEFT JOIN `vip_group` vg on vg.`id_` = cssp.`music_group_id_` AND cssp.`group_type_` = 'VIP'
+				 LEFT JOIN `sys_user` u on u.`id_` = cssp.`user_id_`
+		<include refid="hasStudentMusicTheoryCourseInfo"/>
+		LIMIT 1
+	</select>
+	<resultMap id="ExportStudentCourseInfoDto" type="com.ym.mec.biz.dal.dto.ExportStudentCourseInfoDto">
+		<result property="username" column="username_"/>
+		<result property="userId" column="user_id_"/>
+		<result property="organName" column="organ_name_"/>
+		<result property="teacherId" column="teacher_id_"/>
+		<result property="teacherName" column="teacher_name_"/>
+		<result property="beforeClassNum" column="before_class_num_"/>
+		<result property="eduId" column="edu_id_"/>
+		<result property="eduName" column="edu_name_"/>
+		<result property="grade" column="current_grade_num_"/>
+		<result property="startClassNum" column="start_class_num_"/>
+		<result property="subClassNum" column="sub_class_num_"/>
+		<result property="totalClassNum" column="total_class_num_"/>
+	</resultMap>
+	<select id="queryStudentCourseInfo" resultMap="ExportStudentCourseInfoDto">
+		SELECT o.`name_` organ_name_,u.`username_`,u.`id_` user_id_,tu.`real_name_` teacher_name_,
+		       tu.`id_` teacher_id_,edu.`real_name_` edu_name_ ,edu.`id_` edu_id_ ,
+			   count(vg.`online_classes_num_` + vg.`offline_classes_num_` )  total_class_num_,
+			   sum(case when cs.`status_` != 'NOT_START' then 1 else 0 end) start_class_num_,
+			   sum(case when cs.`status_` = 'NOT_START' then 1 else 0 end) sub_class_num_,
+			   max(case when cs.`status_` != 'NOT_START' then cs.`class_date_` end) before_class_num_,s.`current_grade_num_`
+		FROM `course_schedule_student_payment` cssp
+				 LEFT JOIN `course_schedule` cs on cssp.`course_schedule_id_` = cs.`id_`
+				 LEFT JOIN `vip_group` vg on vg.`id_` = cssp.`music_group_id_` AND cssp.`group_type_` = 'VIP'
+				 LEFT JOIN `sys_user` u on u.`id_` = cssp.`user_id_`
+				 LEFT JOIN `student` s on s.`user_id_` = cssp.`user_id_`
+				 LEFT JOIN `sys_user` tu on tu.`id_` = s.`teacher_id_`
+				 LEFT JOIN `sys_user` edu on edu.`id_` = vg.`educational_teacher_id_`
+				 LEFT JOIN `organization` o on o.`id_` = u.`organ_id_`
+		<include refid="hasStudentMusicTheoryCourseInfo"/>
+		GROUP BY cssp.`user_id_` ;
+	</select>
+	<sql id="hasStudentMusicTheoryCourseInfo">
+		<where>
+			cssp.`group_type_` = 'VIP' AND cs.`del_flag_` != 1 AND cs.`is_lock_` != 1
+			AND u.`organ_id_` NOT IN (38,43,56,36) AND vg.`group_status_` IN (2,4)
+			<if test="groupType == 'VIP'">
+				AND vg.`vip_group_category_id_` != 16
+			</if>
+			<if test="groupType != 'VIP'">
+				AND vg.`vip_group_category_id_` = 16
+			</if>
+			<if test="organId != null and organId != ''">
+				AND FIND_IN_SET(u.organ_id_,#{organId})
+			</if>
+		</where>
+	</sql>
+	
+	<select id="queryUserMusicGroupCourseNumByClassTime" resultMap="Mapper" parameterType="map">
+		select cssp.music_group_id_ key_,count(cssp.id_) value_ from course_schedule_student_payment cssp left join course_schedule cs on cssp.course_schedule_id_ = cs.id_
+		where cssp.group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} and 
+		cssp.music_group_id_ IN
+                <foreach collection="musicGroupIds" separator="," item="musicGroupId" open="(" close=")">
+                    #{musicGroupId}
+                </foreach>
+		and cssp.user_id_ = #{userId} and cs.class_date_ between #{startDate} and #{endDate}
+		group by cssp.music_group_id_
+	</select>
 </mapper>
 </mapper>

+ 11 - 4
mec-biz/src/main/resources/config/mybatis/HfMemberMapper.xml

@@ -26,6 +26,7 @@
         <result column="route_organ_id_" property="routeOrganId"/>
         <result column="route_organ_id_" property="routeOrganId"/>
         <result column="create_time_" property="createTime"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
         <result column="update_time_" property="updateTime"/>
+        <result column="organ_id_" property="organId"/>
 		<result column="tenant_id_" property="tenantId" />
 		<result column="tenant_id_" property="tenantId" />
     </resultMap>
     </resultMap>
     <sql id="Base_Column_List">
     <sql id="Base_Column_List">
@@ -34,7 +35,7 @@
         business_scope_, legal_person_, legal_cert_id_, legal_cert_id_expires_, legal_mp_,
         business_scope_, legal_person_, legal_cert_id_, legal_cert_id_expires_, legal_mp_,
         address_, zip_code_, card_no_,
         address_, zip_code_, card_no_,
         bank_code_,settle_account_id_,status_,month_max_receipt_,route_member_id_,route_organ_id_, create_time_,
         bank_code_,settle_account_id_,status_,month_max_receipt_,route_member_id_,route_organ_id_, create_time_,
-        update_time_,tenant_id_
+        update_time_,tenant_id_,organ_id_
     </sql>
     </sql>
     <select id="get" parameterType="java.lang.Integer" resultMap="hfMember">
     <select id="get" parameterType="java.lang.Integer" resultMap="hfMember">
         <!--@mbg.generated-->
         <!--@mbg.generated-->
@@ -56,13 +57,13 @@
         business_scope_, legal_person_, legal_cert_id_,
         business_scope_, legal_person_, legal_cert_id_,
         legal_cert_id_expires_, legal_mp_, address_,
         legal_cert_id_expires_, legal_mp_, address_,
         zip_code_, card_no_, bank_code_,status_,
         zip_code_, card_no_, bank_code_,status_,
-        create_time_, update_time_,tenant_id_)
+        create_time_, update_time_,organ_id_,tenant_id_)
         values (#{name}, #{memberId}, #{provCode},
         values (#{name}, #{memberId}, #{provCode},
         #{areaCode}, #{socialCreditCode}, #{socialCreditCodeExpires},
         #{areaCode}, #{socialCreditCode}, #{socialCreditCodeExpires},
         #{businessScope}, #{legalPerson}, #{legalCertId},
         #{businessScope}, #{legalPerson}, #{legalCertId},
         #{legalCertIdExpires}, #{legalMp}, #{address},
         #{legalCertIdExpires}, #{legalMp}, #{address},
         #{zipCode}, #{cardNo}, #{bankCode},#{status},
         #{zipCode}, #{cardNo}, #{bankCode},#{status},
-        #{createTime}, #{updateTime},#{tenantId})
+        #{createTime}, #{updateTime},#{organId},#{tenantId})
     </insert>
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.HfMember">
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.HfMember">
         <!--@mbg.generated-->
         <!--@mbg.generated-->
@@ -137,8 +138,11 @@
             <if test="updateTime != null">
             <if test="updateTime != null">
                 update_time_ = #{updateTime},
                 update_time_ = #{updateTime},
             </if>
             </if>
+            <if test="organId != null">
+                organ_id_ = #{organId},
+            </if>
         </set>
         </set>
-        where id_ = #{id,jdbcType=INTEGER} and tenant_id_ = #{tennatId}
+        where id_ = #{id,jdbcType=INTEGER} and tenant_id_ = #{tenantId}
     </update>
     </update>
 
 
     <!-- 分页查询 -->
     <!-- 分页查询 -->
@@ -161,6 +165,9 @@
             <if test="status != null">
             <if test="status != null">
                 AND status_ = #{status}
                 AND status_ = #{status}
             </if>
             </if>
+            <if test="organId != null">
+                AND organ_id_ = #{organId}
+            </if>
         </where>
         </where>
     </sql>
     </sql>
 
 

+ 18 - 2
mec-biz/src/main/resources/config/mybatis/OrganizationMapper.xml

@@ -18,6 +18,10 @@
         <result column="linkman_" property="linkman"/>
         <result column="linkman_" property="linkman"/>
         <result column="mobile_" property="mobile"/>
         <result column="mobile_" property="mobile"/>
         <result column="address_" property="address"/>
         <result column="address_" property="address"/>
+        <result column="corporate_name_" property="corporateName"/>
+        <result column="corporate_code_" property="corporateCode"/>
+        <result column="corporate_seal_" property="corporateSeal"/>
+        <result column="corporate_financial_seal_" property="corporateFinancialSeal"/>
         <result column="tenant_id_" property="tenantId"/>
         <result column="tenant_id_" property="tenantId"/>
         <result column="grade_type_" property="gradeType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="grade_type_" property="gradeType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
     </resultMap>
@@ -36,9 +40,9 @@
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.Organization" useGeneratedKeys="true" keyColumn="id"
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.Organization" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
             keyProperty="id">
         INSERT INTO organization (id_,name_,area_id_,create_time_,update_time_,
         INSERT INTO organization (id_,name_,area_id_,create_time_,update_time_,
-                                  register_date_,linkman_,mobile_,address_,grade_type_,tenant_id_)
+                                  register_date_,linkman_,mobile_,address_,grade_type_,tenant_id_,corporate_name_,corporate_code_,corporate_seal_,corporate_financial_seal_)
         VALUES(#{id},#{name},#{areaId},now(),now(),#{registerDate},#{linkman},#{mobile},#{address},
         VALUES(#{id},#{name},#{areaId},now(),now(),#{registerDate},#{linkman},#{mobile},#{address},
-               #{gradeType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{tenantId})
+               #{gradeType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{tenantId},#{corporateName},#{corporateCode},#{corporateSeal},#{corporateFinancialSeal})
     </insert>
     </insert>
 
 
     <!-- 根据主键查询一条记录 -->
     <!-- 根据主键查询一条记录 -->
@@ -69,6 +73,18 @@
             <if test="address != null">
             <if test="address != null">
                 address_ = #{address},
                 address_ = #{address},
             </if>
             </if>
+            <if test="corporateName != null">
+                corporate_name_ = #{corporateName},
+            </if>
+            <if test="corporateCode != null">
+                corporate_code_ = #{corporateCode},
+            </if>
+            <if test="corporateSeal != null">
+                corporate_seal_ = #{corporateSeal},
+            </if>
+            <if test="corporateFinancialSeal != null">
+                corporate_financial_seal_ = #{corporateFinancialSeal},
+            </if>
             <if test="gradeType != null">
             <if test="gradeType != null">
                 grade_type_ = #{gradeType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 grade_type_ = #{gradeType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
             </if>

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -536,7 +536,7 @@
 
 
 	<sql id="queryTeacherServeInfoCondition">
 	<sql id="queryTeacherServeInfoCondition">
 		<where>
 		<where>
-			sees.tenant_id_ = #{tenantId}
+			sees.tenant_id_ = #{tenantId} 
 			<if test="organIds != null and organIds.size()>0">
 			<if test="organIds != null and organIds.size()>0">
 				AND tea.organ_id_ IN
 				AND tea.organ_id_ IN
 				<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
 				<foreach collection="organIds" item="organId" open="(" close=")" separator=",">

+ 37 - 0
mec-biz/src/main/resources/config/mybatis/SysUserTenantMapper.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ym.mec.biz.dal.dao.SysUserTenantDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.SysUserTenant">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="user_id_" jdbcType="INTEGER" property="userId"/>
+        <result column="tenant_id_" jdbcType="INTEGER" property="tenantId"/>
+        <result column="created_by_" jdbcType="INTEGER" property="createdBy"/>
+        <result column="created_time_" jdbcType="TIMESTAMP" property="createdTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_
+        , user_id_, tenant_id_, created_by_, created_time_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.ym.mec.biz.dal.entity.SysUserTenant">
+        insert into sys_user_tenant(user_id_, tenant_id_, created_by_, created_time_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.userId}, #{entity.tenantId}, #{entity.createdBy}, #{entity.createdTime})
+        </foreach>
+    </insert>
+
+    <select id="queryUserTenant" resultType="com.ym.mec.biz.dal.vo.SysUserTenantVo">
+        select
+            a.id_ as id,
+            a.user_id_ as userId,
+            b.id_ as tenantId,
+            b.name_ as tenantName
+        from sys_user_tenant as a
+                 left join tenant_info as b on a.tenant_id_ = b.id_
+        where a.user_id_ = #{userId}
+    </select>
+
+</mapper>

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml

@@ -116,6 +116,12 @@
                 OR a.`phone_` LIKE CONCAT('%', #{param.search},'%')
                 OR a.`phone_` LIKE CONCAT('%', #{param.search},'%')
                 )
                 )
             </if>
             </if>
+            <if test="param.tenantIds != null ">
+                AND a.id_ in
+                <foreach collection="param.tenantIds" item="tenantId" open="(" close=")" separator=",">
+                    #{tenantId}
+                </foreach>
+            </if>
             <if test="param.tenantId != null ">
             <if test="param.tenantId != null ">
                 AND a.`id_` = #{param.tenantId}
                 AND a.`id_` = #{param.tenantId}
             </if>
             </if>

+ 17 - 34
mec-student/src/main/java/com/ym/mec/student/controller/ContractsController.java

@@ -1,28 +1,29 @@
 package com.ym.mec.student.controller;
 package com.ym.mec.student.controller;
 
 
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.stream.Collectors;
-
-import com.ym.mec.biz.dal.entity.SysUserContracts;
-import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
-import com.ym.mec.biz.service.SysUserContractsService;
-import com.ym.mec.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 
 
+import java.math.BigDecimal;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
 import org.springframework.beans.factory.annotation.Autowired;
 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.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.SysUserContracts;
+import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 import com.ym.mec.biz.service.ContractService;
 import com.ym.mec.biz.service.ContractService;
+import com.ym.mec.biz.service.SysUserContractsService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
 
 
 @RequestMapping("contracts")
 @RequestMapping("contracts")
 @Api(tags = "协议服务")
 @Api(tags = "协议服务")
@@ -101,22 +102,9 @@ public class ContractsController extends BaseController {
 		return succeed(contractService.queryProductContract(userId,musicGroupId, courseViewType));
 		return succeed(contractService.queryProductContract(userId,musicGroupId, courseViewType));
 	}
 	}
 
 
-	@ApiOperation(value = "生成学生课程协议")
-	@GetMapping("/transferProduceContractOnlyWithCourseList")
-	public HttpResponseResult transferProduceContractOnlyWithCourseList(Integer userId){
-		if(Objects.isNull(userId)){
-			SysUser sysUser = sysUserFeignService.queryUserInfo();
-			if (sysUser == null) {
-				return failed("获取用户信息失败");
-			}
-			userId = sysUser.getId();
-		}
-		return contractService.transferProduceContractOnlyWithCourseList(userId);
-	}
-
 	@ApiOperation(value = "查询学生最新协议")
 	@ApiOperation(value = "查询学生最新协议")
 	@GetMapping("/getLatest")
 	@GetMapping("/getLatest")
-	public HttpResponseResult<List<SysUserContracts>> getLatest(Integer userId) {
+	public HttpResponseResult<SysUserContracts> getLatest(Integer userId) {
 		if(Objects.isNull(userId)){
 		if(Objects.isNull(userId)){
 			SysUser sysUser = sysUserFeignService.queryUserInfo();
 			SysUser sysUser = sysUserFeignService.queryUserInfo();
 			if (sysUser == null) {
 			if (sysUser == null) {
@@ -126,18 +114,13 @@ public class ContractsController extends BaseController {
 		}
 		}
 		List<SysUserContracts> sysUserContracts = sysUserContractsService.getUserAllContracts(userId);
 		List<SysUserContracts> sysUserContracts = sysUserContractsService.getUserAllContracts(userId);
 
 
-		if(CollectionUtils.isEmpty(sysUserContracts)){
-			return succeed(Collections.EMPTY_LIST);
+		if(sysUserContracts == null || sysUserContracts.size() == 0){
+			return succeed();
 		}
 		}
+		
+		sysUserContracts = sysUserContracts.stream().sorted(Comparator.comparing(SysUserContracts::getCreateTime).reversed()).collect(Collectors.toList());
 
 
-		Map<Integer, List<SysUserContracts>> versionContractMap = sysUserContracts.stream().collect(Collectors.groupingBy(SysUserContracts::getVersion));
-
-		List<SysUserContracts> result = new ArrayList<>();
-		for (Map.Entry<Integer, List<SysUserContracts>> versionContractMapEntry : versionContractMap.entrySet()) {
-			versionContractMapEntry.getValue().sort(Comparator.comparing(SysUserContracts::getCreateTime).reversed());
-			result.add(versionContractMapEntry.getValue().get(0));
-		}
 
 
-		return succeed(result);
+		return succeed(sysUserContracts.get(0));
 	}
 	}
 }
 }

+ 27 - 5
mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -12,16 +12,19 @@ import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.adapay.Payment;
 import com.ym.mec.thirdparty.adapay.Payment;
 import com.ym.mec.thirdparty.yqpay.Msg;
 import com.ym.mec.thirdparty.yqpay.Msg;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
 import com.ym.mec.util.http.HttpUtil;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
+
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
@@ -33,6 +36,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
+
 import java.io.IOException;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.net.URLEncoder;
@@ -99,6 +103,9 @@ public class StudentOrderController extends BaseController {
     private MusicGroupPaymentCalenderActivityService musicGroupPaymentCalenderActivityService;
     private MusicGroupPaymentCalenderActivityService musicGroupPaymentCalenderActivityService;
     @Autowired
     @Autowired
     private TenantConfigService tenantConfigService;
     private TenantConfigService tenantConfigService;
+    
+    @Autowired
+    private OrganizationService organizationService;
 
 
     @Value("${spring.profiles.active:dev}")
     @Value("${spring.profiles.active:dev}")
     private String profiles;
     private String profiles;
@@ -164,11 +171,26 @@ public class StudentOrderController extends BaseController {
         HashMap<String, Object> orderDetail = new HashMap<>();
         HashMap<String, Object> orderDetail = new HashMap<>();
         orderDetail.put("order", orderByOrderNo);
         orderDetail.put("order", orderByOrderNo);
         orderDetail.put("groupType", orderByOrderNo.getGroupType());
         orderDetail.put("groupType", orderByOrderNo.getGroupType());
-        TenantConfig tenantConfig = tenantConfigService.getOne(new QueryWrapper<TenantConfig>()
-                .eq("tenant_id_", orderByOrderNo.getTenantId()));
-        if (Objects.nonNull(tenantConfig)) {
-            orderDetail.put("financeChops", tenantConfig.getCorporateFinanceChops());
-        }
+        
+        //查询财务章
+        //如果分部有企业信息,就用分部上的企业信息,否则用机构上的企业信息
+        String financeChops = null;
+        Organization organizationDto = organizationService.get(orderByOrderNo.getOrganId());
+		if (organizationDto == null || StringUtils.isBlank(organizationDto.getCorporateName()) || StringUtils.isBlank(organizationDto.getCorporateCode())) {
+
+			TenantConfig tenantConfig = tenantConfigService.queryByTenantId(orderByOrderNo.getTenantId());
+			if(tenantConfig == null){
+				throw new BizException("机构配置信息查询失败");
+			}
+			
+			financeChops = tenantConfig.getCorporateFinanceChops();
+		} else {
+			financeChops = organizationDto.getCorporateFinancialSeal();
+		}
+		if(StringUtils.isNotBlank(financeChops)){
+			orderDetail.put("financeChops", financeChops);
+		}
+		
         if (OrderTypeEnum.APPLY.equals(orderByOrderNo.getType())) {
         if (OrderTypeEnum.APPLY.equals(orderByOrderNo.getType())) {
             StudentRegistration studentRegistration = studentRegistrationDao.getStudentRegister(orderByOrderNo.getMusicGroupId(), orderByOrderNo.getUserId());
             StudentRegistration studentRegistration = studentRegistrationDao.getStudentRegister(orderByOrderNo.getMusicGroupId(), orderByOrderNo.getUserId());
             if (studentRegistration.getPayingStatus().equals(2)) {
             if (studentRegistration.getPayingStatus().equals(2)) {

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/OrganizationController.java

@@ -71,7 +71,7 @@ public class OrganizationController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('organization/update')")
     @PreAuthorize("@pcs.hasPermissions('organization/update')")
     public Object update(Organization organization){
     public Object update(Organization organization){
         organization.setUpdateTime(new Date());
         organization.setUpdateTime(new Date());
-        return succeed(organizationService.update(organization));
+        return succeed(organizationService.updateBasicInfo(organization));
     }
     }
 
 
     @ApiOperation(value = "根据分部编号查询分部详情")
     @ApiOperation(value = "根据分部编号查询分部详情")

+ 29 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SysUserTenantController.java

@@ -0,0 +1,29 @@
+package com.ym.mec.web.controller;
+
+
+import com.ym.mec.biz.dal.entity.SysUserTenant;
+import com.ym.mec.biz.service.SysUserTenantService;
+import org.springframework.web.bind.annotation.*;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+
+import javax.annotation.Resource;
+
+/**
+ * 平台用户与机构关系表(SysUserTenant)表控制层
+ *
+ * @author hgw
+ * @since 2022-03-02 11:09:33
+ */
+@Api(tags = "平台用户与机构关系表")
+@RestController
+@RequestMapping("/sysUserTenant")
+public class SysUserTenantController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private SysUserTenantService sysUserTenantService;
+
+}
+

+ 0 - 2
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -460,9 +460,7 @@ public class TaskController extends BaseController {
 		List<TenantInfo> tenantInfos = tenantInfoService.list(new QueryWrapper<TenantInfo>().eq("state_",1));
 		List<TenantInfo> tenantInfos = tenantInfoService.list(new QueryWrapper<TenantInfo>().eq("state_",1));
 		if(tenantInfos != null && tenantInfos.size() > 0){
 		if(tenantInfos != null && tenantInfos.size() > 0){
 			for (TenantInfo tenantInfo : tenantInfos) {
 			for (TenantInfo tenantInfo : tenantInfos) {
-				TenantContextHolder.setTenantId(tenantInfo.getId());
 				indexBaseMonthDataService.indexBaseDataTask(tenantInfo.getId(), month, dataTypeSet);
 				indexBaseMonthDataService.indexBaseDataTask(tenantInfo.getId(), month, dataTypeSet);
-				TenantContextHolder.clearTenantId();
 			}
 			}
 		}
 		}
 	}
 	}

+ 8 - 0
mec-web/src/main/resources/exportColumnMapper.ini

@@ -262,6 +262,14 @@ fieldColumns = ["userName","phone","currentGrade","currentClass","subjectName ==
 headColumns = ["交易流水号", "订单号", "订单日期", "分部", "学员姓名", "学员编号", "所属乐团", "学员状态", "维修技师", "乐器名称", "具体型号", "乐保类型"]
 headColumns = ["交易流水号", "订单号", "订单日期", "分部", "学员姓名", "学员编号", "所属乐团", "学员状态", "维修技师", "乐器名称", "具体型号", "乐保类型"]
 fieldColumns = ["transNo", "orderNo", "createTime", "organName", "studentName", "studentId", "musicGroupName", "studentStatus.msg", "repairerName", "goodsName", "specification", "type == '0' ? '新增' : '续费'"]
 fieldColumns = ["transNo", "orderNo", "createTime", "organName", "studentName", "studentId", "musicGroupName", "studentStatus.msg", "repairerName", "goodsName", "specification", "type == '0' ? '新增' : '续费'"]
 
 
+[VIP课学员课程信息导出]
+headColumns = ["分部", "学员姓名", "学员编号", "指导老师", "指导老师编号", "教务老师", "教务老师编号", "总课次", "已进行课次", "剩余课次", "上次课时间", "年级"]
+fieldColumns = ["organName", "username", "userId", "teacherName", "teacherId", "eduName", "eduId", "totalClassNum", "startClassNum", "subClassNum", "beforeClassNum", "grade"]
+
+[乐理课学员课程信息导出]
+headColumns = ["分部", "学员姓名", "学员编号", "指导老师", "指导老师编号", "教务老师", "教务老师编号", "总课次", "已进行课次", "剩余课次", "上次课时间", "年级"]
+fieldColumns = ["organName", "username", "userId", "teacherName", "teacherId", "eduName", "eduId", "totalClassNum", "startClassNum", "subClassNum", "beforeClassNum", "grade"]
+
 [服务指标导出]
 [服务指标导出]
 headColumns = ["分部","老师编号","老师姓名","预计安排(人次)","实际安排(人次)","布置率(%)","提交人数","点评次数","点评率(%)","及时点评次数","及时点评率(%)"]
 headColumns = ["分部","老师编号","老师姓名","预计安排(人次)","实际安排(人次)","布置率(%)","提交人数","点评次数","点评率(%)","及时点评次数","及时点评率(%)"]
 fieldColumns = ["organName","teacherId","teacherName","expectExercisesNum","actualExercisesNum", "100 * actualExercisesNum / expectExercisesNum","exercisesReplyNum","exercisesMessageNum", "100 * exercisesMessageNum / exercisesReplyNum", "exercisesMessageTimelyNum","100 * exercisesMessageTimelyNum / exercisesReplyNum"]
 fieldColumns = ["organName","teacherId","teacherName","expectExercisesNum","actualExercisesNum", "100 * actualExercisesNum / expectExercisesNum","exercisesReplyNum","exercisesMessageNum", "100 * exercisesMessageNum / exercisesReplyNum", "exercisesMessageTimelyNum","100 * exercisesMessageTimelyNum / exercisesReplyNum"]