Преглед изворни кода

Merge branch 'zouxuan1' of http://git.dayaedu.com/yonge/mec into feature-operating-report

zouxuan пре 5 година
родитељ
комит
aa3b9a1cdb
69 измењених фајлова са 1835 додато и 961 уклоњено
  1. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  2. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/FinancialExpenditureDao.java
  3. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  4. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDetailDao.java
  5. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseFormDto.java
  6. 40 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/FinancialExpenditureDto.java
  7. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RegisterPayDto.java
  8. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  9. 85 25
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/EmployeeInfo.java
  10. 15 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupSubjectGoodsGroup.java
  11. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Organization.java
  12. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SporadicChargeInfo.java
  13. 12 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrder.java
  14. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrderDetail.java
  15. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRepair.java
  16. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ClassGroupTypeEnum.java
  17. 6 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderDetailTypeEnum.java
  18. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/StaffStatusEnum.java
  19. 33 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TemplateTypeEnum.java
  20. 18 7
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/EmployeeInfoQueryInfo.java
  21. 95 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/FinancialExpenditureQueryInfo.java
  22. 13 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/GoodsQueryInfo.java
  23. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  24. 18 1
      mec-biz/src/main/java/com/ym/mec/biz/service/FinancialExpenditureService.java
  25. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  26. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SporadicChargeInfoService.java
  27. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderDetailService.java
  28. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  29. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  30. 198 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  31. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  32. 39 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/FinancialExpenditureServiceImpl.java
  33. 3 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java
  34. 59 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  35. 27 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java
  36. 676 674
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  37. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java
  38. 61 31
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  39. 1 1
      mec-biz/src/main/resources/config/mybatis/CooperationOrganMapper.xml
  40. 28 8
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  41. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  42. 38 22
      mec-biz/src/main/resources/config/mybatis/EmployeeInfoMapper.xml
  43. 71 7
      mec-biz/src/main/resources/config/mybatis/FinancialExpenditureMapper.xml
  44. 5 2
      mec-biz/src/main/resources/config/mybatis/GoodsMapper.xml
  45. 2 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  46. 5 4
      mec-biz/src/main/resources/config/mybatis/MusicGroupSubjectGoodsGroupMapper.xml
  47. 9 2
      mec-biz/src/main/resources/config/mybatis/OrganizationMapper.xml
  48. 1 1
      mec-biz/src/main/resources/config/mybatis/SchoolMapper.xml
  49. 6 2
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderDetailMapper.xml
  50. 6 2
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  51. 2 1
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  52. 6 2
      mec-biz/src/main/resources/config/mybatis/StudentRepairMapper.xml
  53. 5 0
      mec-im/pom.xml
  54. 1 0
      mec-im/src/main/java/com/ym/common/ErrorEnum.java
  55. 4 3
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  56. 6 2
      mec-student/src/main/java/com/ym/mec/student/controller/RepairController.java
  57. 1 17
      mec-student/src/main/java/com/ym/mec/student/controller/SporadicChargeInfoController.java
  58. 2 0
      mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  59. 9 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java
  60. 7 36
      mec-util/src/main/java/com/ym/mec/util/excel/POIUtil.java
  61. 16 0
      mec-web/src/main/java/com/ym/mec/web/controller/EmployeeInfoController.java
  62. 5 5
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  63. 7 14
      mec-web/src/main/java/com/ym/mec/web/controller/FinancialExpenditureController.java
  64. 4 14
      mec-web/src/main/java/com/ym/mec/web/controller/ImportController.java
  65. 1 10
      mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupController.java
  66. 0 13
      mec-web/src/main/java/com/ym/mec/web/controller/OrganizationController.java
  67. 10 5
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduRepairController.java
  68. 7 6
      mec-web/src/main/resources/columnMapper.ini
  69. BIN
      mec-web/src/main/resources/excelTemplate/商品导入模板.xls

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -1479,6 +1479,8 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      */
     List<CourseGroupExportDto> getStudentCourseInfo(@Param("studentIds") Set<Integer> studentIds, @Param("groupType") GroupType groupType);
 
+    List<CourseGroupExportDto> getStudentVipCourseInfo(@Param("studentIds") Set<Integer> studentIds);
+
     /**
      * 获取上一次连堂课
      * @param classGroupId

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/FinancialExpenditureDao.java

@@ -1,12 +1,20 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.FinancialExpenditureDto;
 import com.ym.mec.biz.dal.entity.FinancialExpenditure;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 public interface FinancialExpenditureDao extends BaseDAO<Long, FinancialExpenditure> {
 
     void batchInsert(@Param("financialExpenditures") List<FinancialExpenditure> financialExpenditures);
+
+    int findFinancialExpenditureCount(Map<String, Object> params);
+
+    List<FinancialExpenditureDto> queryFinancialExpenditurePage(Map<String, Object> params);
+
+    void batchDel(String ids);
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java

@@ -281,5 +281,5 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
      * @param organId:
      * @return java.util.List<com.ym.mec.biz.dal.dto.MusicCardDto>
      */
-    List<MusicCardDto> queryOrganMusicInfos(String organId);
+    List<MusicCardDto> queryOrganMusicInfos(@Param("organId") Integer organId);
 }

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

@@ -78,4 +78,11 @@ public interface StudentPaymentOrderDetailDao extends BaseDAO<Long, StudentPayme
      * @return
      */
     StudentPaymentOrderDetail findApplyOrderMusical(@Param("orderId") Long orderId);
+
+    /**
+     *
+     * @param orderId
+     * @return
+     */
+    List<String> getOrderDetailType(@Param("orderId") Long orderId);
 }

+ 26 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseFormDto.java

@@ -0,0 +1,26 @@
+package com.ym.mec.biz.dal.dto;
+
+import java.math.BigDecimal;
+
+public class CourseFormDto {
+
+    private String type;
+
+    private BigDecimal price;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public BigDecimal getPrice() {
+        return price;
+    }
+
+    public void setPrice(BigDecimal price) {
+        this.price = price;
+    }
+}

+ 40 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/FinancialExpenditureDto.java

@@ -0,0 +1,40 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.FinancialExpenditure;
+import io.swagger.annotations.ApiModelProperty;
+
+public class FinancialExpenditureDto extends FinancialExpenditure {
+
+    @ApiModelProperty(value = "批次号",required = false)
+    private String organName;
+
+    @ApiModelProperty(value = "批次号",required = false)
+    private String cooperationName;
+
+    @ApiModelProperty(value = "批次号",required = false)
+    private String realName;
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getCooperationName() {
+        return cooperationName;
+    }
+
+    public void setCooperationName(String cooperationName) {
+        this.cooperationName = cooperationName;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+}

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RegisterPayDto.java

@@ -1,6 +1,9 @@
 package com.ym.mec.biz.dal.dto;
 
+import io.swagger.annotations.ApiModelProperty;
+
 import java.math.BigDecimal;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -23,6 +26,9 @@ public class RegisterPayDto {
     //是否余额支付
     private Boolean isUseBalancePayment = false;
 
+    @ApiModelProperty(value = "可选课程的key",required = false)
+    private List<String> courseKeys;
+
 
     public Integer getRegisterId() {
         return registerId;
@@ -79,4 +85,12 @@ public class RegisterPayDto {
     public void setGoodsGroups(Map<Long, String> goodsGroups) {
         this.goodsGroups = goodsGroups;
     }
+
+    public List<String> getCourseKeys() {
+        return courseKeys;
+    }
+
+    public void setCourseKeys(List<String> courseKeys) {
+        this.courseKeys = courseKeys;
+    }
 }

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

@@ -29,7 +29,7 @@ public class CourseSchedule {
 
 		SINGLE("SINGLE", "单技课"), MIX("MIX", "合奏课"), HIGH("HIGH", "小班课"), VIP("VIP", "vip课"), DEMO("DEMO", "试听课"), COMPREHENSIVE("COMPREHENSIVE", "综合课"), PRACTICE(
 				"PRACTICE", "网管课"), ENLIGHTENMENT("ENLIGHTENMENT", "启蒙课"), TRAINING_SINGLE("TRAINING_SINGLE", "集训单技课"), TRAINING_MIX("TRAINING_MIX", "集训合奏课"), CLASSROOM(
-				"CLASSROOM", "课堂课"),COMM("COMM","对外课程"),HIGH_ONLINE("HIGH_ONLINE","线上基础技能课"),MUSIC_NETWORK("MUSIC_NETWORK","乐团网管课");
+				"CLASSROOM", "课堂课"),COMM("COMM","对外课程"),HIGH_ONLINE("HIGH_ONLINE","网络基础训练课"),MUSIC_NETWORK("MUSIC_NETWORK","乐团网管课");
 
 		private String code;
 

+ 85 - 25
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/EmployeeInfo.java

@@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModelProperty;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
-import com.ym.mec.biz.dal.enums.JobNatureEnum;
 import com.ym.mec.biz.dal.enums.JobTypeEnum;
+import com.ym.mec.biz.dal.enums.StaffStatusEnum;
 
 /**
  * 对应数据库表(employee_info):
@@ -31,7 +31,7 @@ public class EmployeeInfo {
 	private Integer age;
 
 	@ApiModelProperty(value = "性别", required = false)
-	private boolean gender;
+	private Boolean gender;
 
 	@ApiModelProperty(value = "出生年月日", required = false)
 	private java.util.Date birthdate;
@@ -55,28 +55,32 @@ public class EmployeeInfo {
 	private String educationalBackground;
 
 	@ApiModelProperty(value = "声部", required = false)
-	private Integer subjectId;
+	private String subjectIdList;
+	
+	private String subjectName;
 
-	@ApiModelProperty(value = "是否评估", required = false)
-	private boolean isInterviewed;
+	@ApiModelProperty(value = "评估结果", required = false)
+	private String assessmentResult;
 
 	@ApiModelProperty(value = "其他综合情况", required = false)
 	private String otherComment;
 
 	@ApiModelProperty(value = "入职日期", required = false)
 	private java.util.Date entryDate;
-	
+
 	@ApiModelProperty(value = "分部", required = false)
 	private Integer organId;
+	
+	private String organName;
 
 	@ApiModelProperty(value = "职位", required = false)
 	private JobTypeEnum position;
 
-	@ApiModelProperty(value = "工作性质(全职/兼职)", required = false)
-	private JobNatureEnum jobNature;
+	@ApiModelProperty(value = "人员状态", required = false)
+	private StaffStatusEnum status;
 
 	@ApiModelProperty(value = "是否是试用期", required = false)
-	private boolean isProbationPeriod;
+	private Boolean isProbationPeriod;
 
 	@ApiModelProperty(value = "银行卡号", required = false)
 	private String bankCardNo;
@@ -87,6 +91,14 @@ public class EmployeeInfo {
 	@ApiModelProperty(value = "离职日期", required = false)
 	private java.util.Date resignationDate;
 
+	@ApiModelProperty(value = "操作人编号", required = false)
+	private Integer operatorId;
+	
+	private String operatorName;
+
+	@ApiModelProperty(value = "信息来源", required = false)
+	private String sourceFrom;
+
 	/**  */
 	private java.util.Date createTime;
 
@@ -141,11 +153,11 @@ public class EmployeeInfo {
 		return this.age;
 	}
 
-	public void setGender(boolean gender) {
+	public void setGender(Boolean gender) {
 		this.gender = gender;
 	}
 
-	public boolean isGender() {
+	public Boolean getGender() {
 		return this.gender;
 	}
 
@@ -205,20 +217,20 @@ public class EmployeeInfo {
 		return this.educationalBackground;
 	}
 
-	public void setSubjectId(Integer subjectId) {
-		this.subjectId = subjectId;
+	public String getSubjectIdList() {
+		return subjectIdList;
 	}
 
-	public Integer getSubjectId() {
-		return this.subjectId;
+	public void setSubjectIdList(String subjectIdList) {
+		this.subjectIdList = subjectIdList;
 	}
 
-	public void setIsInterviewed(boolean isInterviewed) {
-		this.isInterviewed = isInterviewed;
+	public String getAssessmentResult() {
+		return assessmentResult;
 	}
 
-	public boolean isIsInterviewed() {
-		return this.isInterviewed;
+	public void setAssessmentResult(String assessmentResult) {
+		this.assessmentResult = assessmentResult;
 	}
 
 	public void setOtherComment(String otherComment) {
@@ -237,6 +249,14 @@ public class EmployeeInfo {
 		return this.entryDate;
 	}
 
+	public Integer getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
+
 	public void setPosition(JobTypeEnum position) {
 		this.position = position;
 	}
@@ -245,19 +265,19 @@ public class EmployeeInfo {
 		return this.position;
 	}
 
-	public void setJobNature(JobNatureEnum jobNature) {
-		this.jobNature = jobNature;
+	public StaffStatusEnum getStatus() {
+		return status;
 	}
 
-	public JobNatureEnum getJobNature() {
-		return this.jobNature;
+	public void setStatus(StaffStatusEnum status) {
+		this.status = status;
 	}
 
-	public void setIsProbationPeriod(boolean isProbationPeriod) {
+	public void setIsProbationPeriod(Boolean isProbationPeriod) {
 		this.isProbationPeriod = isProbationPeriod;
 	}
 
-	public boolean isIsProbationPeriod() {
+	public Boolean getIsProbationPeriod() {
 		return this.isProbationPeriod;
 	}
 
@@ -301,6 +321,46 @@ public class EmployeeInfo {
 		return this.updateTime;
 	}
 
+	public Integer getOperatorId() {
+		return operatorId;
+	}
+
+	public void setOperatorId(Integer operatorId) {
+		this.operatorId = operatorId;
+	}
+
+	public String getSourceFrom() {
+		return sourceFrom;
+	}
+
+	public void setSourceFrom(String sourceFrom) {
+		this.sourceFrom = sourceFrom;
+	}
+
+	public String getSubjectName() {
+		return subjectName;
+	}
+
+	public void setSubjectName(String subjectName) {
+		this.subjectName = subjectName;
+	}
+
+	public String getOrganName() {
+		return organName;
+	}
+
+	public void setOrganName(String organName) {
+		this.organName = organName;
+	}
+
+	public String getOperatorName() {
+		return operatorName;
+	}
+
+	public void setOperatorName(String operatorName) {
+		this.operatorName = operatorName;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 15 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupSubjectGoodsGroup.java

@@ -52,9 +52,14 @@ public class MusicGroupSubjectGoodsGroup {
 	//购买方式
 	private KitGroupPurchaseTypeEnum kitGroupPurchaseType;
 
-	//购买方式-减免金额 json
+	//购买方式-乐器减免金额 json
+	@ApiModelProperty(value = "购买方式-乐器减免金额 json",required = false)
 	private String kitGroupPurchaseTypeJson;
 
+	//购买方式-减免金额 json
+	@ApiModelProperty(value = "购买方式-课程减免金额 json",required = false)
+	private String coursePurchaseTypeJson;
+
 
 	/**  */
 	private java.util.Date createTime;
@@ -178,6 +183,14 @@ public class MusicGroupSubjectGoodsGroup {
 		this.kitGroupPurchaseType = kitGroupPurchaseType;
 	}
 
+	public String getCoursePurchaseTypeJson() {
+		return coursePurchaseTypeJson;
+	}
+
+	public void setCoursePurchaseTypeJson(String coursePurchaseTypeJson) {
+		this.coursePurchaseTypeJson = coursePurchaseTypeJson;
+	}
+
 
 	public String getKitGroupPurchaseTypeJson() {
 		return kitGroupPurchaseTypeJson;
@@ -191,4 +204,5 @@ public class MusicGroupSubjectGoodsGroup {
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
 	}
+
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Organization.java

@@ -51,9 +51,20 @@ public class Organization {
 	@ApiModelProperty(value = "地址",required = false)
 	private String address;
 
+	@ApiModelProperty(value = "是否全职资源",required = false)
+	private Integer fullJobResource;
+
 	@ApiModelProperty(value = "子节点列表",required = false)
 	private List<Organization> organizations;
 
+	public Integer getFullJobResource() {
+		return fullJobResource;
+	}
+
+	public void setFullJobResource(Integer fullJobResource) {
+		this.fullJobResource = fullJobResource;
+	}
+
 	public String getAreaName() {
 		return areaName;
 	}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SporadicChargeInfo.java

@@ -60,6 +60,17 @@ public class SporadicChargeInfo {
 	@ApiModelProperty(value = "所属乐团", required = true)
 	private String musicGroupId;
 
+	@ApiModelProperty(value = "所属乐团名称", required = true)
+	private String musicGroupName;
+
+	public String getMusicGroupName() {
+		return musicGroupName;
+	}
+
+	public void setMusicGroupName(String musicGroupName) {
+		this.musicGroupName = musicGroupName;
+	}
+
 	public String getMusicGroupId() {
 		return musicGroupId;
 	}

+ 12 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrder.java

@@ -111,9 +111,12 @@ public class StudentPaymentOrder {
 	
 	private SysUser user = new SysUser();
 
-	//优惠金额
+	//乐器优惠金额
 	private BigDecimal remitFee;
 
+	//课程优惠金额
+	private BigDecimal courseRemitFee;
+
 	public void setId(Long id){
 		this.id = id;
 	}
@@ -342,4 +345,12 @@ public class StudentPaymentOrder {
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
 	}
+
+	public BigDecimal getCourseRemitFee() {
+		return courseRemitFee;
+	}
+
+	public void setCourseRemitFee(BigDecimal courseRemitFee) {
+		this.courseRemitFee = courseRemitFee;
+	}
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrderDetail.java

@@ -45,6 +45,9 @@ public class StudentPaymentOrderDetail {
 	//商品成本价
 	private String goodsPrices;
 
+	//减免费用
+	private BigDecimal remitFee;
+
 	public void setId(Long id){
 		this.id = id;
 	}
@@ -121,4 +124,12 @@ public class StudentPaymentOrderDetail {
 	public void setGoodsPrices(String goodsPrices) {
 		this.goodsPrices = goodsPrices;
 	}
+
+	public BigDecimal getRemitFee() {
+		return remitFee;
+	}
+
+	public void setRemitFee(BigDecimal remitFee) {
+		this.remitFee = remitFee;
+	}
 }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRepair.java

@@ -142,6 +142,12 @@ public class StudentRepair {
     private String address;
 
     /**
+    * 所选商品
+    */
+    @ApiModelProperty(value = "商品", required = false)
+    private String goodsJson;
+
+    /**
     * 支付状态 0-未支付 1-支付中 2-已支付
     */
     @ApiModelProperty(value = "支付状态 0-未支付 1-支付中 2-已支付", required = false)
@@ -171,6 +177,14 @@ public class StudentRepair {
     @ApiModelProperty(value = "更新时间", required = false)
     private Date updateTime;
 
+    public String getGoodsJson() {
+        return goodsJson;
+    }
+
+    public void setGoodsJson(String goodsJson) {
+        this.goodsJson = goodsJson;
+    }
+
     public String getOrganName() {
         return organName;
     }

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

@@ -7,7 +7,7 @@ import com.ym.mec.common.enums.BaseEnum;
  */
 public enum ClassGroupTypeEnum implements BaseEnum<String, ClassGroupTypeEnum> {
 	NORMAL("NORMAL", "普通班级"), MIX("MIX", "合奏班级"), HIGH("HIGH", "提高班"), VIP("VIP", "vip课"), DEMO("DEMO", "试听课"), PRACTICE("PRACTICE", "网管课"), SNAP("SNAP",
-			"临时班级"), COMM("COMM", "对外课程"), HIGH_ONLINE("HIGH_ONLINE", "线上基础技能课"),MUSIC_NETWORK("MUSIC_NETWORK","乐团网管课");
+			"临时班级"), COMM("COMM", "对外课程"), HIGH_ONLINE("HIGH_ONLINE", "网络基础训练课"),MUSIC_NETWORK("MUSIC_NETWORK","乐团网管课");
 
 	private String code;
 

+ 6 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderDetailTypeEnum.java

@@ -10,7 +10,12 @@ public enum OrderDetailTypeEnum implements BaseEnum<String, OrderDetailTypeEnum>
 	ACCESSORIES("ACCESSORIES", "辅件"),
 	TEACHING("TEACHING", "教谱"),
 	OTHER("OTHER", "其他"),
-	COURSE("COURSE", "课程");
+	COURSE("COURSE", "课程"),
+	MUSIC_COURSE("MUSIC_COURSE", "乐团声部训练"),
+	MIX_COURSE("MIX_COURSE", "乐团合奏训练"),
+	HIGH_ONLINE_COURSE("HIGH_ONLINE_COURSE", "网络基础训练"),
+	HOLIDAY_COURSE("HOLIDAY_COURSE", "假期集中训练"),
+	NETWORK_COURSE("NETWORK_COURSE", "乐团云课堂");
 
 	private String code;
 

+ 24 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/StaffStatusEnum.java

@@ -0,0 +1,24 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum StaffStatusEnum implements BaseEnum<String, StaffStatusEnum> {
+
+	NOT_EMPLOYED("未录用"), INTERVIEWING("面试中"), RESERVE("储备"), PART_TIME("兼职"), FULL_TIME("全职"), DIMISSION("离职");
+
+	private String desc;
+
+	StaffStatusEnum(String desc) {
+		this.desc = desc;
+	}
+
+	public String getDesc() {
+		return desc;
+	}
+
+	@Override
+	public String getCode() {
+		return this.name();
+	}
+
+}

+ 33 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TemplateTypeEnum.java

@@ -0,0 +1,33 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum TemplateTypeEnum implements BaseEnum<String, TemplateTypeEnum> {
+    GOODS("GOODS","商品导入模板"),
+    FINANCIAL_EXPENDITURE("FINANCIAL_EXPENDITURE","财务支出导入模板");
+
+    private String code;
+
+    private String msg;
+
+    TemplateTypeEnum(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }}

+ 18 - 7
mec-biz/src/main/java/com/ym/mec/biz/dal/page/EmployeeInfoQueryInfo.java

@@ -2,14 +2,17 @@ package com.ym.mec.biz.dal.page;
 
 import io.swagger.annotations.ApiModelProperty;
 
-import com.ym.mec.biz.dal.enums.JobNatureEnum;
 import com.ym.mec.biz.dal.enums.JobTypeEnum;
+import com.ym.mec.biz.dal.enums.StaffStatusEnum;
 import com.ym.mec.common.page.QueryInfo;
 
 public class EmployeeInfoQueryInfo extends QueryInfo {
 
 	@ApiModelProperty(value = "姓名/编号/手机号", required = false)
 	private String userNameOrIdOrMobile;
+	
+	@ApiModelProperty(value = "信息来源", required = false)
+	private String sourceFrom;
 
 	@ApiModelProperty(value = "分部", required = false)
 	private Integer organId;
@@ -20,8 +23,8 @@ public class EmployeeInfoQueryInfo extends QueryInfo {
 	@ApiModelProperty(value = "职位", required = false)
 	private JobTypeEnum position;
 
-	@ApiModelProperty(value = "工作性质(全职/兼职)", required = false)
-	private JobNatureEnum jobNature;
+	@ApiModelProperty(value = "状态", required = false)
+	private StaffStatusEnum status;
 
 	public String getUserNameOrIdOrMobile() {
 		return userNameOrIdOrMobile;
@@ -55,11 +58,19 @@ public class EmployeeInfoQueryInfo extends QueryInfo {
 		this.position = position;
 	}
 
-	public JobNatureEnum getJobNature() {
-		return jobNature;
+	public StaffStatusEnum getStatus() {
+		return status;
 	}
 
-	public void setJobNature(JobNatureEnum jobNature) {
-		this.jobNature = jobNature;
+	public void setStatus(StaffStatusEnum status) {
+		this.status = status;
+	}
+
+	public String getSourceFrom() {
+		return sourceFrom;
+	}
+
+	public void setSourceFrom(String sourceFrom) {
+		this.sourceFrom = sourceFrom;
 	}
 }

+ 95 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/FinancialExpenditureQueryInfo.java

@@ -0,0 +1,95 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class FinancialExpenditureQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "批次号",required = false)
+    private String batchNo;
+    /**  */
+    @ApiModelProperty(value = "财务流程编号",required = false)
+    private String financialProcessNo;
+    /**  */
+    @ApiModelProperty(value = "钉钉流程编号",required = false)
+    private String dingtalkProcessNo;
+    /**  */
+    @ApiModelProperty(value = "分部",required = false)
+    private Integer organId;
+    /**  */
+    @ApiModelProperty(value = "学校/合作单位",required = false)
+    private Integer cooperationOrganId;
+    /**  */
+    @ApiModelProperty(value = "申请人编号",required = false)
+    private Integer applyUserId;
+    /**  */
+    @ApiModelProperty(value = "开始时间",required = false)
+    private String startTime;
+    /**  */
+    @ApiModelProperty(value = "结束时间",required = false)
+    private String endTime;
+
+    public String getBatchNo() {
+        return batchNo;
+    }
+
+    public void setBatchNo(String batchNo) {
+        this.batchNo = batchNo;
+    }
+
+    public String getFinancialProcessNo() {
+        return financialProcessNo;
+    }
+
+    public void setFinancialProcessNo(String financialProcessNo) {
+        this.financialProcessNo = financialProcessNo;
+    }
+
+    public String getDingtalkProcessNo() {
+        return dingtalkProcessNo;
+    }
+
+    public void setDingtalkProcessNo(String dingtalkProcessNo) {
+        this.dingtalkProcessNo = dingtalkProcessNo;
+    }
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public Integer getCooperationOrganId() {
+        return cooperationOrganId;
+    }
+
+    public void setCooperationOrganId(Integer cooperationOrganId) {
+        this.cooperationOrganId = cooperationOrganId;
+    }
+
+    public Integer getApplyUserId() {
+        return applyUserId;
+    }
+
+    public void setApplyUserId(Integer applyUserId) {
+        this.applyUserId = applyUserId;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+}

+ 13 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/page/GoodsQueryInfo.java

@@ -1,9 +1,9 @@
 package com.ym.mec.biz.dal.page;
 
-import io.swagger.annotations.ApiModelProperty;
-
+import com.ym.mec.biz.dal.enums.GoodsType;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
 
 public class GoodsQueryInfo extends QueryInfo {
 
@@ -22,6 +22,17 @@ public class GoodsQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "状态(1,上架  0,下架)",required = false)
     private YesOrNoEnum status;
 
+    @ApiModelProperty(value = "商品类型", required = false)
+    private GoodsType type;
+
+    public GoodsType getType() {
+        return type;
+    }
+
+    public void setType(GoodsType type) {
+        this.type = type;
+    }
+
     public Integer getGoodsCategoryId() {
         return goodsCategoryId;
     }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java

@@ -257,6 +257,16 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 */
 	void checkNewCourseSchedules(List<CourseSchedule> courseSchedules,boolean checkExistCourseSchedule);
 
+	/**
+	 * @describe 检测并校正冲突课程
+	 * @author Joburgess
+	 * @date 2020.09.09
+	 * @param courseSchedules:
+	 * @param checkExistCourseSchedule:
+	 * @return void
+	 */
+	void checkAllCourseSchedules(List<CourseSchedule> courseSchedules,boolean checkExistCourseSchedule);
+
 	void checkNewCourseSchedulesWithoutMusicGroup(List<CourseSchedule> courseSchedules,boolean checkExistCourseSchedule);
 
 	/**

+ 18 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/FinancialExpenditureService.java

@@ -1,6 +1,10 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.FinancialExpenditureDto;
 import com.ym.mec.biz.dal.entity.FinancialExpenditure;
+import com.ym.mec.biz.dal.page.FinancialExpenditureQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -17,5 +21,18 @@ public interface FinancialExpenditureService extends BaseService<Long, Financial
      * @param file:
      * @return java.lang.Object
      */
-    List<FinancialExpenditure> importFinancialExpenditure(MultipartFile file) throws IOException;
+    List<FinancialExpenditure> importFinancialExpenditure(MultipartFile file) throws Exception;
+
+    PageInfo<FinancialExpenditureDto> queryFinancialExpenditurePage(FinancialExpenditureQueryInfo queryInfo);
+
+    /**
+     * @describe 批量删除
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/9
+     * @time 11:44
+     * @param ids:
+     * @return void
+     */
+    void batchDel(String ids);
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java

@@ -291,7 +291,7 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	 * @param :
 	 * @return java.util.List<com.ym.mec.biz.dal.dto.MusicCardDto>
 	 */
-	List<MusicCardDto> queryOrganMusicInfos(String organId);
+	List<MusicCardDto> queryOrganMusicInfos(Integer organId);
 
 	/**
 	 * 补全musicGroupStudentFee表数据

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SporadicChargeInfoService.java

@@ -42,4 +42,15 @@ public interface SporadicChargeInfoService extends BaseService<Integer, Sporadic
      * @param id
      */
     void del(Integer id);
+
+    /**
+     * @describe 获取详情
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/10
+     * @time 15:20
+     * @param id:
+     * @return com.ym.mec.biz.dal.entity.SporadicChargeInfo
+     */
+    SporadicChargeInfo findDetail(Integer id, Integer userId);
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderDetailService.java

@@ -70,4 +70,11 @@ public interface StudentPaymentOrderDetailService extends BaseService<Long, Stud
      * @return
      */
     StudentPaymentOrderDetail findApplyOrderMusical(Long orderId);
+
+    /**
+     * 获取订单类型的详情
+     * @param orderId
+     * @return
+     */
+    List<String> getOrderDetailType(Long orderId);
 }

+ 3 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java

@@ -89,7 +89,8 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
 	 * @return
 	 */
 	StudentPaymentOrder addOrder(StudentRegistration studentRegistration, BigDecimal amount, String orderNo, String paymentChannel, BigDecimal courseFee,
-			List<MusicGroupSubjectGoodsGroup> goodsGroups, List<Goods> goodsList, List<Goods> otherGoodsList) throws Exception;
+			List<MusicGroupSubjectGoodsGroup> goodsGroups, List<Goods> goodsList, List<Goods> otherGoodsList,List<CourseFormDto> courseForms,
+								 BigDecimal remitFee,BigDecimal courseRemitFee) throws Exception;
 
 	/**
 	 * 学生注册缴费重新下订单
@@ -103,7 +104,7 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
 	StudentPaymentOrder reAddOrder(
 			Integer userId, BigDecimal amount, String orderNo, String paymentChannel, BigDecimal courseFee,
 			List<MusicGroupSubjectGoodsGroup> goodsGroups, List<Goods> goodsList, List<Goods> otherGoodsList,
-			String musicGroupId,StudentPaymentOrder oldOrder);
+			String musicGroupId,StudentPaymentOrder oldOrder,List<CourseFormDto> courseForms,BigDecimal remitFee,BigDecimal courseRemitFee);
 
 	/**
 	 * 查询用户指定乐团的报名信息

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -75,7 +75,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         ClassGroup classGroup = classGroupService.get(classGroupId);
         Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupId);
         if (classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) && studentNum <= 3) {
-            throw new BizException(classGroup.getName()+"(线上基础技能课班级)人数不能少于3,请调整");
+            throw new BizException(classGroup.getName()+"(网络基础训练课班级)人数不能少于3,请调整");
         }
 
         ClassGroupStudentMapper classStudentMapper = findClassStudentMapperByUserIdAndClassGroupId(userId, classGroupId, "NORMAL");
@@ -203,7 +203,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupId);
         if (classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) &&
                 ((studentNum + userIdStrSet.size()) < 3 || (studentNum + userIdStrSet.size()) > 5)) {
-            throw new BizException("线上基础技能课班级人数不能小于3大于5");
+            throw new BizException("网络基础训练课班级人数不能小于3大于5");
         }
 
         //1、班级关系添加

+ 198 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -1404,6 +1404,200 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         }
     }
 
+
+
+	@Override
+	public void checkAllCourseSchedules(List<CourseSchedule> courseSchedules, boolean checkExistCourseSchedule) {
+		if (CollectionUtils.isEmpty(courseSchedules)) {
+			return;
+		}
+		List<String> classDates = courseSchedules.stream().map(courseSchedule -> DateUtil.dateToString(courseSchedule.getClassDate(), "yyyy-MM-dd"))
+				.collect(Collectors.toList());
+
+		List<CourseSchedule> existCourseSchedules = courseScheduleDao.findByClassDate(classDates);
+
+		//只需要调整课程信息的课程编号列表
+		List<Long> updateCourseScheduleIds = courseSchedules
+				.stream()
+				.filter(courseSchedule -> Objects.nonNull(courseSchedule.getId()))
+				.map(CourseSchedule::getId)
+				.collect(Collectors.toList());
+
+		//排除只需调整的课程
+		existCourseSchedules = existCourseSchedules.stream()
+				.filter(courseSchedule -> !updateCourseScheduleIds.contains(courseSchedule.getId()))
+				.collect(Collectors.toList());
+		//新课程对应的班级编号列表
+		List<Integer> newCourseScheduleClassGroupIds = courseSchedules
+				.stream()
+				.map(CourseSchedule::getClassGroupId)
+				.distinct()
+				.collect(Collectors.toList());
+
+		List<Long> existCourseScheduleIds = existCourseSchedules.stream()
+				.map(CourseSchedule::getId)
+				.collect(Collectors.toList());
+
+		HashSet<Long> courseScheduleIdsSet = new HashSet<>(existCourseScheduleIds);
+
+		//合并新课程和已存在的课程
+		List<CourseSchedule> allCourseSchedules;
+		if (!CollectionUtils.isEmpty(existCourseSchedules)) {
+			allCourseSchedules = ListUtils.sum(courseSchedules, existCourseSchedules);
+		} else {
+			allCourseSchedules = courseSchedules;
+		}
+
+		//所有课程编号
+		List<Long> allCourseScheduleIds = allCourseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+		//所有课程学员签到记录
+		List<StudentAttendance> studentAttendances = studentAttendanceDao.findByCourseIds(allCourseScheduleIds);
+		//课程请假学员字典
+		Map<Long, Set<Integer>> courseLeaveStudentMap = studentAttendances.stream()
+				.filter(e -> StudentAttendanceStatusEnum.LEAVE.equals(e.getStatus()))
+				.collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId, Collectors.mapping(StudentAttendance::getUserId, Collectors.toSet())));
+
+		//所有课程的班级编号
+		List<Integer> classGroupIds = allCourseSchedules
+				.stream()
+				.map(CourseSchedule::getClassGroupId)
+				.distinct()
+				.collect(Collectors.toList());
+		//班级与学生的关联记录
+		List<ClassGroupStudentMapper> classGroupStudentMappers = classGroupStudentMapperDao.findByClassGroups(classGroupIds);
+		Map<Integer, List<ClassGroupStudentMapper>> classGroupStudentsMap = classGroupStudentMappers
+				.stream()
+				.collect(Collectors.groupingBy(ClassGroupStudentMapper::getClassGroupId));
+
+		//根据课程获取助教id关联集合
+		List<IntegerAndIntegerListDto> courseScheduleTeachingTeacherIdList = new ArrayList<>();
+		if (!CollectionUtils.isEmpty(existCourseScheduleIds)) {
+			courseScheduleTeachingTeacherIdList = courseScheduleDao.findCourseScheduleIdAndUserIdsMap(existCourseScheduleIds, TeachTypeEnum.TEACHING.getCode());
+		}
+		Map<Integer, IntegerAndIntegerListDto> courseScheduleTeachingTeacherMap = courseScheduleTeachingTeacherIdList.stream()
+				.collect(Collectors.toMap(IntegerAndIntegerListDto::getId, integerAndIntegerListDto -> integerAndIntegerListDto));
+
+		//班级助教关联ID集合
+		List<IntegerAndIntegerListDto> classGroupAndUserIdsMap = courseScheduleDao.findClassGroupAndUserIdsMap(newCourseScheduleClassGroupIds, TeachTypeEnum.TEACHING.getCode());
+		Map<Integer, IntegerAndIntegerListDto> classGroupTeachingTeacherMap = classGroupAndUserIdsMap.stream()
+				.collect(Collectors.toMap(IntegerAndIntegerListDto::getId, integerAndIntegerListDto -> integerAndIntegerListDto));
+
+		Set<Long> existCourseScheduleIdsSet=new HashSet<>(existCourseScheduleIds);
+
+		Map<String, List<CourseSchedule>> existClassDateCoursesMap = allCourseSchedules.stream().collect(Collectors.groupingBy(c -> DateUtil.dateToString(c.getClassDate(), "yyyy-MM-dd")));
+		Map<String, List<CourseSchedule>> newClassDateCoursesMap = courseSchedules.stream().collect(Collectors.groupingBy(c -> DateUtil.dateToString(c.getClassDate(), "yyyy-MM-dd")));
+		if (allCourseSchedules.size() > 1) {
+			for (Map.Entry<String, List<CourseSchedule>> classDateCourseEntry : newClassDateCoursesMap.entrySet()) {
+				List<CourseSchedule> existClassDateCourses = existClassDateCoursesMap.get(classDateCourseEntry.getKey());
+				if(CollectionUtils.isEmpty(existClassDateCourses)){
+					continue;
+				}
+				List<CourseSchedule> newClassDateCourses=classDateCourseEntry.getValue();
+				existClassDateCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+				newClassDateCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+				for (CourseSchedule preCourseSchedule : newClassDateCourses) {
+					for (CourseSchedule backCourseSchedule : existClassDateCourses) {
+
+						//判断前后两节课是否存在冲突
+						if (!preCourseSchedule.getStartClassTime().before(backCourseSchedule.getEndClassTime())
+								||!preCourseSchedule.getEndClassTime().after(backCourseSchedule.getStartClassTime())) {
+							continue;
+						}
+						if (!checkExistCourseSchedule
+								&& !courseScheduleIdsSet.contains(backCourseSchedule.getId())) {
+							continue;
+						}
+
+						//如果存在时间重叠,则需要判断前后两节课的教师和学生是否存在冲突
+						//主教冲突检测
+						if (Objects.nonNull(preCourseSchedule.getActualTeacherId())
+								&& preCourseSchedule.getActualTeacherId().equals(backCourseSchedule.getActualTeacherId())) {
+
+							throw new BizException(courseCheckInfo(preCourseSchedule, backCourseSchedule, existCourseScheduleIds, 1));
+						}
+
+						if(Objects.isNull(preCourseSchedule.getId())){
+							continue;
+						}
+
+						//助教冲突检测
+						if (Objects.isNull(preCourseSchedule.getId())) {
+							IntegerAndIntegerListDto integerAndIntegerListDto = classGroupTeachingTeacherMap.get(preCourseSchedule.getClassGroupId());
+							if (Objects.nonNull(integerAndIntegerListDto)) {
+								preCourseSchedule.setTeachingTeacherIdList(integerAndIntegerListDto.getIds());
+							}
+						} else if (existCourseScheduleIdsSet.contains(preCourseSchedule.getId())) {
+							IntegerAndIntegerListDto integerAndIntegerListDto = courseScheduleTeachingTeacherMap.get(preCourseSchedule.getId());
+							if (Objects.nonNull(integerAndIntegerListDto)) {
+								preCourseSchedule.setTeachingTeacherIdList(integerAndIntegerListDto.getIds());
+							}
+						}
+						if (Objects.isNull(backCourseSchedule.getId())) {
+							IntegerAndIntegerListDto integerAndIntegerListDto = classGroupTeachingTeacherMap.get(backCourseSchedule.getClassGroupId());
+							if (Objects.nonNull(integerAndIntegerListDto)) {
+								backCourseSchedule.setTeachingTeacherIdList(integerAndIntegerListDto.getIds());
+							}
+						} else if (existCourseScheduleIdsSet.contains(backCourseSchedule.getId())) {
+							IntegerAndIntegerListDto integerAndIntegerListDto = courseScheduleTeachingTeacherMap.get(backCourseSchedule.getId());
+							if (Objects.nonNull(integerAndIntegerListDto)) {
+								backCourseSchedule.setTeachingTeacherIdList(integerAndIntegerListDto.getIds());
+							}
+						}
+						if (!CollectionUtils.isEmpty(preCourseSchedule.getTeachingTeacherIdList())
+								&& !CollectionUtils.isEmpty(backCourseSchedule.getTeachingTeacherIdList())) {
+							List<Integer> repeatIds = preCourseSchedule.getTeachingTeacherIdList()
+									.stream().filter(backCourseSchedule.getTeachingTeacherIdList()::contains)
+									.collect(Collectors.toList());
+							if (!CollectionUtils.isEmpty(repeatIds)) {
+								throw new BizException(courseCheckInfo(preCourseSchedule, backCourseSchedule, existCourseScheduleIds, 2));
+							}
+						}
+						//学生冲突检测
+						if (preCourseSchedule.getClassGroupId().equals(backCourseSchedule.getClassGroupId())) {
+							//如果班级相同,则学生肯定存在冲突
+							throw new BizException(courseCheckInfo(preCourseSchedule, backCourseSchedule, existCourseScheduleIds, 3));
+						}
+						//如果班级不同,则需要检测两个班级是否存在重复的学生
+						List<ClassGroupStudentMapper> preClassGroupStudents = classGroupStudentsMap.get(preCourseSchedule.getClassGroupId());
+						List<ClassGroupStudentMapper> backClassGroupStudents = classGroupStudentsMap.get(backCourseSchedule.getClassGroupId());
+						//如果有一个存在没有学生的班级则不存在冲突
+						if (CollectionUtils.isEmpty(preClassGroupStudents) || CollectionUtils.isEmpty(backClassGroupStudents)) {
+							continue;
+						}
+						//课程对应请假学员编号集合
+						Set<Integer> preLeaveStudentIds = courseLeaveStudentMap.get(preCourseSchedule.getId());
+						if(null == preLeaveStudentIds){
+							preLeaveStudentIds = Collections.EMPTY_SET;
+						}
+						Set<Integer> backLeaveStudentIds = courseLeaveStudentMap.get(backCourseSchedule.getId());
+						if(null == backLeaveStudentIds){
+							backLeaveStudentIds = Collections.EMPTY_SET;
+						}
+
+						//当前课程所在班级的学生编号列表
+						Set<Integer> finalPreLeaveStudentIds = preLeaveStudentIds;
+						List<Integer> preClassGroupStudentIds = preClassGroupStudents.stream()
+								.filter(e->!finalPreLeaveStudentIds.contains(e.getUserId()))
+								.map(ClassGroupStudentMapper::getUserId)
+								.collect(Collectors.toList());
+						//后面一节课程所在班级的学生编号列表
+						Set<Integer> finalBackLeaveStudentIds = backLeaveStudentIds;
+						Set<Integer> backClassGroupStudentIds = backClassGroupStudents.stream()
+								.filter(e->!finalBackLeaveStudentIds.contains(e.getUserId()))
+								.map(ClassGroupStudentMapper::getUserId)
+								.collect(Collectors.toSet());
+						List<Integer> repeatStudentIds = preClassGroupStudentIds.stream()
+								.filter(backClassGroupStudentIds::contains)
+								.collect(Collectors.toList());
+						if (!CollectionUtils.isEmpty(repeatStudentIds)) {
+							throw new BizException(courseCheckInfo(preCourseSchedule, backCourseSchedule, existCourseScheduleIds, 3));
+						}
+					}
+				}
+			}
+		}
+	}
+
     @Override
     public void checkNewCourseSchedulesWithoutMusicGroup(List<CourseSchedule> courseSchedules, boolean checkExistCourseSchedule) {
         if (CollectionUtils.isEmpty(courseSchedules)) {
@@ -2151,6 +2345,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if(vipGroupCourseAdjustInfo.getCourseCreateStartTime().after(now)){
             teacherAttendanceDao.batchCleanCourseTeacherSignInfo(courseScheduleIds);
         }
+        studentAttendanceDao.deleteByCourseSchedules(courseScheduleIds);
 		//删除作业
 		courseHomeworkService.delHomwworkByCourseScheduleId(courseScheduleIds);
 		//删除评论
@@ -2403,7 +2598,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				List<StudentAttendance> studentAttendanceList = studentAttendanceDao.findByCourseId(oldCourseSchedule.getId());
 
 				for (StudentAttendance studentAttendance : studentAttendanceList) {
-					if (studentAttendance.getStatus() != StudentAttendanceStatusEnum.LEAVE) {
+					if (studentAttendance.getStatus() != StudentAttendanceStatusEnum.LEAVE
+						|| (studentAttendance.getStatus() == StudentAttendanceStatusEnum.LEAVE
+							&&DateUtil.addHours(studentAttendance.getCreateTime(),4).compareTo(oldCourseSchedule.getStartClassTime())>=0)) {
 						throw new BizException("{}[{}] {}-{}课程已点名", oldCourseSchedule.getName(), oldCourseSchedule.getId(), DateUtil.dateToString(
 								oldCourseSchedule.getStartClassTime(), DateUtil.EXPANDED_DATE_TIME_FORMAT), DateUtil.dateToString(
 								oldCourseSchedule.getEndClassTime(), DateUtil.EXPANDED_DATE_TIME_FORMAT));

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

@@ -543,7 +543,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         if(!CollectionUtils.isEmpty(studentAttendances)){
             courseNormalStudentsMap =studentAttendances.stream()
                     .filter(studentAttendance -> StudentAttendanceStatusEnum.NORMAL.equals(studentAttendance.getStatus()))
-                    .collect(Collectors.groupingBy(StudentAttendance::getId, Collectors.counting()));
+                    .collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId, Collectors.counting()));
         }
 
         //课程对应乐团结算方式集合

+ 39 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/FinancialExpenditureServiceImpl.java

@@ -3,11 +3,17 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.dao.FinancialExpenditureDao;
+import com.ym.mec.biz.dal.dto.FinancialExpenditureDto;
 import com.ym.mec.biz.dal.entity.FinancialExpenditure;
+import com.ym.mec.biz.dal.enums.TemplateTypeEnum;
+import com.ym.mec.biz.dal.page.FinancialExpenditureQueryInfo;
 import com.ym.mec.biz.service.FinancialExpenditureService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.excel.IniFileUtil;
 import com.ym.mec.util.excel.POIUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -19,9 +25,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
+import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -40,11 +47,10 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public List<FinancialExpenditure> importFinancialExpenditure(MultipartFile file) throws IOException {
-		Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(file.getInputStream(), 2, file.getOriginalFilename());
-		String fileName = file.getOriginalFilename().split("\\.")[0];
+	public List<FinancialExpenditure> importFinancialExpenditure(MultipartFile file) throws Exception {
+		Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(new ByteArrayInputStream(file.getBytes()), 2, file.getOriginalFilename());
 		InputStream inputStream = new ClassPathResource("columnMapper.ini").getInputStream();
-		Map<String,String> columns = IniFileUtil.readIniFile(inputStream,fileName);
+		Map<String,String> columns = IniFileUtil.readIniFile(inputStream,TemplateTypeEnum.FINANCIAL_EXPENDITURE.getMsg());
 		List<FinancialExpenditure> financialExpenditures = new ArrayList<>();
 		Map<String, Integer> organMap = getMap("organization", "name_", "id_", true, String.class, Integer.class);
 		Map<String, Integer> cooperationOrganMap = getMap("cooperation_organ", "name_", "id_", true, String.class, Integer.class);
@@ -115,4 +121,32 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
 		}
 		return financialExpenditures;
 	}
+
+	@Override
+	public PageInfo<FinancialExpenditureDto> queryFinancialExpenditurePage(FinancialExpenditureQueryInfo queryInfo){
+		PageInfo<FinancialExpenditureDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<FinancialExpenditureDto> dataList = null;
+		int count = financialExpenditureDao.findFinancialExpenditureCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = financialExpenditureDao.queryFinancialExpenditurePage(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@Override
+	public void batchDel(String ids) {
+		if(StringUtils.isEmpty(ids)){
+			throw new BizException("参数校验失败");
+		}
+		financialExpenditureDao.batchDel(ids);
+	}
 }

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

@@ -1,17 +1,16 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
-import com.ym.mec.biz.dal.dao.GoodsCategoryDao;
 import com.ym.mec.biz.dal.dao.GoodsDao;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.enums.GoodsType;
+import com.ym.mec.biz.dal.enums.TemplateTypeEnum;
 import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.biz.service.UploadFileService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.UploadReturnBean;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.excel.IniFileUtil;
 import com.ym.mec.util.excel.POIUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -38,8 +37,6 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	private GoodsDao goodsDao;
 	@Autowired
 	private UploadFileService uploadFileService;
-	@Autowired
-	private GoodsCategoryDao goodsCategoryDao;
 
 	@Override
 	public BaseDAO<Integer, Goods> getDAO() {
@@ -68,10 +65,9 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public List<Goods> importGoods(MultipartFile file) throws Exception {
-		Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(file.getInputStream(), 2, file.getOriginalFilename());
+		Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(new ByteArrayInputStream(file.getBytes()), 2, file.getOriginalFilename());
 		InputStream inputStream = new ClassPathResource("columnMapper.ini").getInputStream();
-		String fileName = file.getOriginalFilename().split(".")[0];
-		Map<String,String> columns = IniFileUtil.readIniFile(inputStream,fileName);
+		Map<String,String> columns = IniFileUtil.readIniFile(inputStream, TemplateTypeEnum.GOODS.getMsg());
 		List<Goods> goodsList = new ArrayList<>();
 //		Map<String, Integer> map = MapUtil.convertIntegerMap(goodsCategoryDao.queryCategotyMap());
 		Map<String, Integer> map = getMap("goods_category","name_","id_",true,String.class,Integer.class);

+ 59 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
 import com.ym.mec.auth.api.client.SysUserFeignService;
@@ -409,6 +410,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         orderAmount = orderAmount.add(courseFee);
 
         BigDecimal remitFee = BigDecimal.ZERO;
+        BigDecimal courseRemitFee = BigDecimal.ZERO;
 
         //乐器及打包辅件
         List<MusicGroupSubjectGoodsGroup> goodsGroups = new ArrayList<>();
@@ -451,6 +453,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
                 Map<String, BigDecimal> groupType = JSONObject.parseObject(goodsGroup.getKitGroupPurchaseTypeJson(), new TypeReference<Map<String, BigDecimal>>() {
                 });
+                Map<String, BigDecimal> coursePurchase = JSONObject.parseObject(goodsGroup.getCoursePurchaseTypeJson(), new TypeReference<Map<String, BigDecimal>>() {
+                });
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
                     String kitGroupPurchaseType = registerPayDto.getGoodsGroups().get(goodsGroup.getId());
                     if (!groupType.containsKey(kitGroupPurchaseType)) {
@@ -460,12 +464,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                         goodsGroup.setPrice(kitGroupPurchaseType.equals("FREE") ? new BigDecimal(0) : goodsGroup.getDepositFee());
                     }
                     goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.valueOf(kitGroupPurchaseType));
-                    remitFee = groupType.get(kitGroupPurchaseType);
+                    remitFee = groupType.get(kitGroupPurchaseType) == null ? BigDecimal.ZERO : groupType.get(kitGroupPurchaseType);
+                    courseRemitFee = coursePurchase.get(kitGroupPurchaseType) == null ? BigDecimal.ZERO : coursePurchase.get(kitGroupPurchaseType);
                 }
                 orderAmount = orderAmount.add(goodsGroup.getPrice());
                 goodsGroup.setGoodsList(goodsService.findGoodsByIds(goodsGroup.getGoodsIdList()));
             }
-            orderAmount = orderAmount.subtract(remitFee);
+            orderAmount = orderAmount.subtract(remitFee).subtract(courseRemitFee);
         }
 
         //单独辅件
@@ -485,6 +490,27 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 orderAmount = orderAmount.add(goods.getGroupPurchasePrice());
             }
         }
+        //可选课程
+        List<CourseFormDto> courseForms = new ArrayList<>();
+        if (registerPayDto.getCourseKeys() != null && registerPayDto.getCourseKeys().size() > 0) {
+            MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
+            if (musicGroup.getCourseForm() == null) {
+                throw new BizException("可选课程不存在");
+            }
+            JSONObject courseForm = JSON.parseObject(musicGroup.getCourseForm());
+            for (String courseKey : registerPayDto.getCourseKeys()) {
+                if (courseForm.get(courseKey) == null) {
+                    throw new BizException("可选课程不存在");
+                }
+                CourseFormDto courseFormDto = new CourseFormDto();
+                JSONObject jsonObject = JSON.parseObject(courseForm.getString(courseKey));
+                orderAmount = orderAmount.add(jsonObject.getBigDecimal("value"));
+                courseFormDto.setType(courseKey);
+                courseFormDto.setPrice(jsonObject.getBigDecimal("value"));
+                courseForms.add(courseFormDto);
+            }
+        }
+
         if (amount.compareTo(orderAmount) != 0) {
             throw new BizException("商品价格不符");
         }
@@ -496,7 +522,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         String channelType = "";
 
-        StudentPaymentOrder studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration, amount, orderNo, channelType, courseFee, goodsGroups, goodsList, otherGoodsList);
+        StudentPaymentOrder studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration, amount, orderNo, channelType, courseFee, goodsGroups, goodsList, otherGoodsList, courseForms,remitFee,courseRemitFee);
         studentPaymentOrder.setVersion(0);
 
         Date date = new Date();
@@ -518,6 +544,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
         studentPaymentOrder.setPaymentChannel("BALANCE");
         studentPaymentOrder.setRemitFee(remitFee);
+        studentPaymentOrder.setCourseRemitFee(courseRemitFee);
         studentPaymentOrder.setOrganId(musicGroup.getOrganId());
         studentPaymentOrder.setRoutingOrganId(musicGroup.getOrganId());
         studentPaymentOrder.setUpdateTime(date);
@@ -589,6 +616,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         orderAmount = orderAmount.add(courseFee);
 
         BigDecimal remitFee = BigDecimal.ZERO;
+        BigDecimal courseRemitFee = BigDecimal.ZERO;
 
         //乐器及打包辅件
         List<MusicGroupSubjectGoodsGroup> goodsGroups = new ArrayList<>();
@@ -631,6 +659,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
                 Map<String, BigDecimal> groupType = JSONObject.parseObject(goodsGroup.getKitGroupPurchaseTypeJson(), new TypeReference<Map<String, BigDecimal>>() {
                 });
+                Map<String, BigDecimal> coursePurchase = JSONObject.parseObject(goodsGroup.getCoursePurchaseTypeJson(), new TypeReference<Map<String, BigDecimal>>() {
+                });
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
                     String kitGroupPurchaseType = registerPayDto.getGoodsGroups().get(goodsGroup.getId());
                     if (!groupType.containsKey(kitGroupPurchaseType)) {
@@ -641,11 +671,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                     }
                     goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.valueOf(kitGroupPurchaseType));
                     remitFee = groupType.get(kitGroupPurchaseType);
+                    courseRemitFee = coursePurchase.get(kitGroupPurchaseType) == null ? BigDecimal.ZERO : coursePurchase.get(kitGroupPurchaseType);
                 }
                 orderAmount = orderAmount.add(goodsGroup.getPrice());
                 goodsGroup.setGoodsList(goodsService.findGoodsByIds(goodsGroup.getGoodsIdList()));
             }
-            orderAmount = orderAmount.subtract(remitFee);
+            orderAmount = orderAmount.subtract(remitFee).subtract(courseRemitFee);
         }
 
         //单独辅件
@@ -665,6 +696,27 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 orderAmount = orderAmount.add(goods.getGroupPurchasePrice());
             }
         }
+        //可选课程
+        List<CourseFormDto> courseForms = new ArrayList<>();
+        if (registerPayDto.getCourseKeys() != null && registerPayDto.getCourseKeys().size() > 0) {
+            MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
+            if (musicGroup.getCourseForm() == null) {
+                throw new BizException("可选课程不存在");
+            }
+            JSONObject courseForm = JSON.parseObject(musicGroup.getCourseForm());
+            for (String courseKey : registerPayDto.getCourseKeys()) {
+                if (courseForm.get(courseKey) == null) {
+                    throw new BizException("可选课程不存在");
+                }
+                CourseFormDto courseFormDto = new CourseFormDto();
+                JSONObject jsonObject = JSON.parseObject(courseForm.getString(courseKey));
+                orderAmount = orderAmount.add(jsonObject.getBigDecimal("value"));
+                courseFormDto.setType(courseKey);
+                courseFormDto.setPrice(jsonObject.getBigDecimal("value"));
+                courseForms.add(courseFormDto);
+            }
+        }
+
         if (amount.compareTo(orderAmount) != 0) {
             throw new BizException("商品价格不符");
         }
@@ -677,7 +729,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         String channelType = "";
 
-        StudentPaymentOrder studentPaymentOrder = studentRegistrationService.reAddOrder(userId, amount, orderNo, channelType, courseFee, goodsGroups, goodsList, otherGoodsList, studentRegistration.getMusicGroupId(), ApplyOrder);
+        StudentPaymentOrder studentPaymentOrder = studentRegistrationService.reAddOrder(userId, amount, orderNo, channelType, courseFee, goodsGroups, goodsList, otherGoodsList, studentRegistration.getMusicGroupId(), ApplyOrder, courseForms,remitFee,courseRemitFee);
         studentPaymentOrder.setVersion(0);
         Date date = new Date();
 
@@ -699,6 +751,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
         studentPaymentOrder.setPaymentChannel("BALANCE");
         studentPaymentOrder.setRemitFee(remitFee);
+        studentPaymentOrder.setCourseRemitFee(courseRemitFee);
         studentPaymentOrder.setOrganId(musicGroup.getOrganId());
         studentPaymentOrder.setRoutingOrganId(musicGroup.getOrganId());
         studentPaymentOrder.setUpdateTime(date);
@@ -996,7 +1049,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     }
 
     @Override
-    public List<MusicCardDto> queryOrganMusicInfos(String organId) {
+    public List<MusicCardDto> queryOrganMusicInfos(Integer organId) {
         return musicGroupDao.queryOrganMusicInfos(organId);
     }
 

+ 27 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java

@@ -2,14 +2,8 @@ package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.OrganizationDao;
-import com.ym.mec.biz.dal.dao.SporadicChargeInfoDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
-import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
@@ -48,6 +42,8 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
     @Autowired
     private TeacherDao teacherDao;
     @Autowired
+    private MusicGroupDao musicGroupDao;
+    @Autowired
     private SysUserCashAccountService sysUserCashAccountService;
     @Autowired
     private SysUserCashAccountDetailService sysUserCashAccountDetailService;
@@ -210,4 +206,27 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
             throw new BizException("当前缴费项目存在收费记录,请走关闭流程");
         }
     }
+
+    @Override
+    public SporadicChargeInfo findDetail(Integer id, Integer userId) {
+        if (userId == null) {
+            SysUser sysUser = sysUserFeignService.queryUserInfo();
+            if (sysUser == null || sysUser.getId() == null) {
+                throw new BizException("用户不存在");
+            }
+            userId = sysUser.getId();
+        }
+        SporadicChargeInfo chargeInfo = sporadicChargeInfoDao.get(id);
+        MusicGroup musicGroup = musicGroupDao.get(chargeInfo.getMusicGroupId());
+        if(musicGroup != null){
+            chargeInfo.setMusicGroupName(musicGroup.getName());
+        }
+        if (chargeInfo != null) {
+            SysUserCashAccount locked = sysUserCashAccountService.getLocked(userId);
+            chargeInfo.setBalance(locked.getBalance());
+        } else {
+            throw new BizException("信息不存在");
+        }
+        return chargeInfo;
+    }
 }

+ 676 - 674
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java

@@ -20,6 +20,7 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,693 +33,694 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
-public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentAttendance>  implements StudentAttendanceService {
-
-	@Autowired
-	private StudentAttendanceDao studentAttendanceDao;
-	@Autowired
-	private MusicGroupStudentFeeDao studentFeeDao;
-	@Autowired
-	private CourseScheduleDao courseScheduleDao;
-	@Autowired
-	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
-	@Autowired
-	private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
-	@Autowired
-	private ClassGroupDao classGroupDao;
-	@Autowired
-	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
-	@Autowired
-	private SysUserFeignService sysUserFeignService;
-	@Autowired
-	private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
-	@Autowired
-	private MusicGroupQuitDao musicGroupQuitDao;
-	@Autowired
-	private SysMessageService sysMessageService;
-	@Autowired
-	private SysConfigDao sysConfigDao;
-	@Autowired
-	private SchoolDao schoolDao;
-	@Autowired
-	private SysConfigService sysConfigService;
-	@Autowired
-	private TeacherAttendanceDao teacherAttendanceDao;
-	@Autowired
-	private StudentDao studentDao;
-
-	@Override
-	public BaseDAO<Long, StudentAttendance> getDAO() {
-		return studentAttendanceDao;
-	}
-	private static final Logger log = LoggerFactory.getLogger(StudentAttendanceServiceImpl.class);
-
-	@Override
-	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-	public void addStudentAttendances(StudentAttendanceDto studentAttendanceInfos) {
-		List<StudentAttendance> studentAttendances=studentAttendanceInfos.getStudentAttendances();
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if(Objects.isNull(sysUser)){
-			throw new BizException("请登录");
-		}
-		studentDao.lockUser(sysUser.getId());
-		if(CollectionUtils.isEmpty(studentAttendances)){
-			throw new BizException("无点名信息");
-		}
-		Long courseScheduleId=studentAttendances.get(0).getCourseScheduleId();
-		CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
-		if(Objects.isNull(courseSchedule)){
-			throw new BizException("请指定课程");
-		}
-		if(TeachModeEnum.ONLINE.equals(courseSchedule.getTeachMode())){
-			throw new BizException("线上课程请进入房间授课");
-		}
-		Date date = new Date();
-		SysConfig attendanceTimeRange;
-		if(courseSchedule.getGroupType().equals(GroupType.MUSIC)){
-			attendanceTimeRange = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE);
-		}else{
-			SysConfig beforeAttendanceTimeRange=sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_BEFOR_COURSE_START_TIME_RANGE_VIP);
-			int courseStartTime = DateUtil.minutesBetween(date, courseSchedule.getStartClassTime());
-			if(date.before(courseSchedule.getStartClassTime())&&courseStartTime>beforeAttendanceTimeRange.getParanValue(Integer.class)){
-				throw new BizException("VIP课开课前{}分钟禁止点名",beforeAttendanceTimeRange.getParanValue(Integer.class));
-			}
-			attendanceTimeRange = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE_VIP);
-		}
-		int courseEndTime = DateUtil.minutesBetween(courseSchedule.getEndClassTime(), date);
-		if(date.after(courseSchedule.getEndClassTime())&&courseEndTime>attendanceTimeRange.getParanValue(Integer.class)){
-			throw new BizException("{}课结束{}分钟后禁止点名",
-					courseSchedule.getGroupType().equals(GroupType.MUSIC)?"乐团":"VIP",
-					attendanceTimeRange.getParanValue(Integer.class));
-		}
-		studentAttendanceDao.deleteStudentAttendancesByCourse(courseScheduleId);
-		int classTimes=courseScheduleDao.countClassTimes(courseSchedule.getClassGroupId().longValue(),courseSchedule.getStartClassTime());
-		studentAttendances.forEach(studentAttendance -> {
-			studentAttendance.setTeacherId(sysUser.getId());
-			studentAttendance.setCurrentClassTimes(classTimes+1);
-			StudentAttendance studentAttendanceInfo = studentAttendanceDao.getStudentAttendanceInfo(studentAttendance);
-			studentAttendanceInfo.setGroupType(courseSchedule.getGroupType());
-			studentAttendanceInfo.setMusicGroupId(courseSchedule.getMusicGroupId());
-			if (studentAttendance.getStatus() != StudentAttendanceStatusEnum.DROP_OUT) {
-				//判断是否为连续旷课
-				if(StudentAttendanceStatusEnum.TRUANT.equals(studentAttendance.getStatus())
-						||StudentAttendanceStatusEnum.LEAVE.equals(studentAttendance.getStatus())){
-					StudentAttendance studentLatestAttendanceInfo = studentAttendanceDao.getStudentLatestAttendanceInfo(studentAttendanceInfo);
-					if(Objects.nonNull(studentLatestAttendanceInfo)){
-						if(StudentAttendanceStatusEnum.TRUANT.equals(studentLatestAttendanceInfo.getStatus())
-								||StudentAttendanceStatusEnum.LEAVE.equals(studentLatestAttendanceInfo.getStatus())){
-							studentFeeDao.updateStudentAbsenteeismTimes(studentAttendanceInfo.getUserId(),
-									studentAttendanceInfo.getMusicGroupId(),
-									YesOrNoEnum.YES.getCode());
-						}
-					}else{
-						studentFeeDao.updateStudentAbsenteeismTimes(studentAttendanceInfo.getUserId(),
-								studentAttendanceInfo.getMusicGroupId(),
-								YesOrNoEnum.YES.getCode());
-					}
-				}else{
-					studentFeeDao.updateStudentAbsenteeismTimes(studentAttendanceInfo.getUserId(),
-							studentAttendanceInfo.getMusicGroupId(),
-							YesOrNoEnum.NO.getCode());
-				}
-				if(studentAttendanceInfo.getStatus() == StudentAttendanceStatusEnum.NORMAL){
-					studentAttendanceInfo.setSignInTime(courseSchedule.getStartClassTime());
-					studentAttendanceInfo.setSignOutTime(courseSchedule.getEndClassTime());
-				}
-				studentAttendanceDao.insert(studentAttendanceInfo);
-			}else{
-				studentFeeDao.updateStudentAbsenteeismTimes(studentAttendanceInfo.getUserId(),
-						studentAttendanceInfo.getMusicGroupId(),
-						YesOrNoEnum.NO.getCode());
-			}
-		});
-		//获取正常签到的学生信息
-		List<StudentAttendance> normal = studentAttendances.stream().filter(studentAttendance -> studentAttendance.getStatus() == StudentAttendanceStatusEnum.NORMAL).collect(Collectors.toList());
-		if(normal != null && normal.size() > 0){
-			Map<Integer,String> receivers = new HashMap<>();
-			normal.forEach(e->{
-				receivers.put(e.getUserId(),e.getUserId().toString());
-			});
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.STUDENT_PUSH_NAMES_ACHIEVE,
-					receivers,null,0,"2","STUDENT",DateUtil.format(new Date(),DateUtil.DATE_FORMAT_MIN));
-		}
-		Map<StudentAttendanceStatusEnum, List<StudentAttendance>> studentAttendanceGroupByStatus = studentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getStatus));
-		Integer studentNum=studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL)==null?0:studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL).size();
-		Integer leaveStudentNum=studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE)==null?0:studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE).size();
-		courseSchedule.setStudentNum(studentNum);
-		courseSchedule.setLeaveStudentNum(leaveStudentNum);
-		courseScheduleDao.update(courseSchedule);
-
-		if(!courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.VIP)){
-			return;
-		}
-
-		if(StringUtils.isBlank(studentAttendanceInfos.getSignInLongitudeLatitude())){
-			throw new BizException("未获取到您的位置");
-		}
-
-		School school = schoolDao.get(courseSchedule.getSchoolId());
-
-		//是否在范围内
-		boolean isInScore = true;
-		if(Objects.nonNull(school)){
-			if(StringUtils.isBlank(school.getLongitudeLatitude())){
-				if(studentAttendanceInfos.getUpdate().equals(YesOrNoEnum.YES.getCode())){
-					school.setLongitudeLatitude(studentAttendanceInfos.getSignInLongitudeLatitude());
-					schoolDao.update(school);
-				}
-			}else{
-				SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE);
-				double attendanceRange = Double.valueOf(sysConfig.getParanValue());
-				double distance = MapUtil.distance(studentAttendanceInfos.getSignInLongitudeLatitude(),
-						school.getLongitudeLatitude());
-				if(distance>attendanceRange){
-					isInScore=false;
-				}
-			}
-		}
-
-		TeacherAttendance teacherAttendance=teacherAttendanceDao.findByTeacherAttendanceInfo(sysUser.getId().longValue(),courseSchedule.getId());
-
-		teacherAttendance.setSignInLongitudeLatitude(studentAttendanceInfos.getSignInLongitudeLatitude());
-
-		if(Objects.isNull(teacherAttendance)){
-			teacherAttendance= new TeacherAttendance();
-			teacherAttendance.setTeacherId(sysUser.getId());
-			teacherAttendance.setCreateTime(date);
-		}
-
-		teacherAttendance.setSignInTime(courseSchedule.getStartClassTime());
-		teacherAttendance.setSignInStatus(YesOrNoEnum.YES);
-		teacherAttendance.setSignOutTime(courseSchedule.getEndClassTime());
-		teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
-		teacherAttendance.setCurrentClassTimes(classTimes + 1);
-		if(Objects.nonNull(teacherAttendance.getId())){
-			teacherAttendanceDao.update(teacherAttendance);
-		}else{
-			teacherAttendanceDao.insert(teacherAttendance);
-		}
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void updateStudentAttendances(StudentAttendanceDto studentAttendanceInfo) {
-		if(Objects.isNull(studentAttendanceInfo.getCourseScheduleId())){
-			throw new BizException("请指定课程编号");
-		}
-		List<StudentAttendance> studentAttendances=studentAttendanceInfo.getStudentAttendances();
-		if(CollectionUtils.isEmpty(studentAttendances)){
-			throw new BizException("无点名信息");
-		}
-		CourseSchedule courseSchedule = courseScheduleDao.get(studentAttendanceInfo.getCourseScheduleId().longValue());
-		if(Objects.isNull(courseSchedule)){
-			throw new BizException("课程不存在");
-		}
-
-		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedule(studentAttendanceInfo.getCourseScheduleId());
-		if(!CollectionUtils.isEmpty(courseScheduleTeacherSalaries)&&Objects.nonNull(courseScheduleTeacherSalaries.get(0).getSettlementTime())){
-			throw new BizException("此课程已结算");
-		}
-
-		List<Integer> userIds = studentAttendances.stream().map(StudentAttendance::getUserId).collect(Collectors.toList());
-		studentAttendanceDao.deleteStudentAttendancesByCourseAndUsers(studentAttendanceInfo.getCourseScheduleId().longValue(),userIds);
-		for (StudentAttendance studentAttendance : studentAttendances) {
-			studentAttendance.setGroupType(courseSchedule.getGroupType());
-			studentAttendance.setMusicGroupId(courseSchedule.getMusicGroupId());
-			studentAttendance.setClassGroupId(courseSchedule.getClassGroupId());
-			studentAttendance.setTeacherId(courseSchedule.getActualTeacherId());
-			studentAttendance.setCourseScheduleId(courseSchedule.getId());
-		}
-		studentAttendanceDao.addStudentAttendances(studentAttendances);
-		List<StudentAttendance> allStudentAttendances = studentAttendanceDao.findByCourseId(studentAttendanceInfo.getCourseScheduleId());
-		Map<StudentAttendanceStatusEnum, List<StudentAttendance>> studentAttendanceGroupByStatus = allStudentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getStatus));
-		Integer studentNum=studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL)==null?0:studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL).size();
-		Integer leaveStudentNum=studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE)==null?0:studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE).size();
-		courseSchedule.setStudentNum(studentNum);
-		courseSchedule.setLeaveStudentNum(leaveStudentNum);
-		courseScheduleDao.update(courseSchedule);
-	}
-
-	@Override
-	public Map<String, Object> getCurrentCourseStudents(QueryInfo queryInfo) {
-		Map<String,Object> result=new HashMap<>();
-
-		PageInfo<StudentAttendance> pageInfo = super.queryPage(queryInfo);
-
-		result.put("pageInfo",pageInfo);
-
-		List<StudentStatusCountUtilEntity> stringIntegerMap = studentAttendanceDao.countStudentStatus(((StudentAttendanceQueryInfo) queryInfo).getClassGroupId());
-
-		stringIntegerMap.forEach(studentStatusCount->{
-			switch (studentStatusCount.getStudentStatus()){
-				case LEAVE:
-					result.put("numberOfLeavePeoples",studentStatusCount.getNumberOfStudent());
-					break;
-				default:
-					break;
-
-			}
-		});
-
-		return result;
-	}
-
-	@Override
-	public PageInfo<StudentPersonalAttendanceDto> getStudentPersonalAttendances(QueryInfo queryInfo) {
-		PageInfo<StudentPersonalAttendanceDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<>();
-		MapUtil.populateMap(params, queryInfo);
-
-		List<StudentPersonalAttendanceDto> dataList = null;
-		int count = studentAttendanceDao.queryStudentPersonalAttendancesCount(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = studentAttendanceDao.queryStudentPersonalAttendances(params);
-		}
-		if (count == 0) {
-			dataList = new ArrayList<>();
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public boolean leave(Integer userId, Long courseScheduleId, String remark) {
-
-		CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
-		if(courseSchedule == null){
-			throw new BizException("课程编号异常");
-		}
-
-		if(courseSchedule.getStatus() == CourseStatusEnum.OVER){
-			throw new BizException("课程已结束");
-		}
-
-		Date date = new Date();
-
-		int hours = 4;
-		String str = sysConfigDao.findConfigValue(SysConfigService.ADVANCE_LEAVE_HOURS);
-		if (StringUtils.isNotBlank(str)) {
-			hours = Integer.parseInt(str);
-		}
-
-		int earliestTimeForLeave = 168;
-		SysConfig earliestTimeForLeaveConfig = sysConfigService.findByParamName(SysConfigService.EARLIEST_TIME_FOR_LEAVE);
-		if(Objects.nonNull(earliestTimeForLeaveConfig)){
-			earliestTimeForLeave = Integer.parseInt(earliestTimeForLeaveConfig.getParanValue());
-		}
-
-		if(DateUtil.addHours(date, hours).after(courseSchedule.getStartClassTime())){
-			throw new BizException("开课{}小时之前才可以请假",hours);
-		}
-
-		if(DateUtil.addHours(date, 168).before(courseSchedule.getStartClassTime())){
-			throw new BizException("请在开课前{}天内请假",earliestTimeForLeave/24);
-		}
-
-		StudentAttendance studentAttendance  = studentAttendanceDao.findByStatusAndCourseScheduleId(userId,courseScheduleId.intValue());
-		if(Objects.isNull(studentAttendance)){
-			studentAttendance=new StudentAttendance();
-		}
-		studentAttendance.setClassGroupId(courseSchedule.getClassGroupId());
-		studentAttendance.setCourseScheduleId(courseScheduleId);
-		studentAttendance.setCreateTime(date);
-		studentAttendance.setCurrentClassTimes(0);
-		studentAttendance.setRemark(remark);
-		studentAttendance.setStatus(StudentAttendanceStatusEnum.LEAVE);
-		studentAttendance.setUserId(userId);
-		studentAttendance.setGroupType(courseSchedule.getGroupType());
-		studentAttendance.setMusicGroupId(courseSchedule.getMusicGroupId());
-
-		if(Objects.nonNull(studentAttendance.getId())){
-			studentAttendanceDao.update(studentAttendance);
-		}else{
-			studentAttendanceDao.insert(studentAttendance);
-		}
-
-		ClassGroupStudentMapper classGroupStudentMapper = classGroupStudentMapperDao.query(courseSchedule.getClassGroupId(), userId);
-		if(Objects.isNull(classGroupStudentMapper)){
-			throw new BizException("您不在此课程对应班级上");
-		}
-
-		Map<Integer,String> sendArgs=new HashMap<>();
-		sendArgs.put(courseSchedule.getActualTeacherId(),courseSchedule.getActualTeacherId() + "");
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		//发送消息至老师
-		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
-				MessageTypeEnum.TEACHER_PUSH_STUDENT_LEAVE,
-				sendArgs,
-				null,0,"1","TEACHER",DateUtil.getDate(courseSchedule.getClassDate()),DateUtil.getTime(courseSchedule.getStartClassTime()),courseSchedule.getName(),sysUser.getUsername());
-		return true;
-	}
-
-	@Override
-	public PageInfo statisticsList(CourseHomeworkQueryInfo queryInfo) {
-
-		if(Objects.isNull(queryInfo.getClassGroupId())){
-			throw new BizException("请指定班级");
-		}
-
-		PageInfo pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<String, Object>();
-		MapUtil.populateMap(params, queryInfo);
-
-		List<StudentAttendanceStatisticsResponse> dataList = null;
-		int count = courseScheduleStudentPaymentDao.countStudentByClassGroup(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			ClassGroup classGroup = classGroupDao.get(queryInfo.getClassGroupId().intValue());
-			if(Objects.isNull(classGroup)){
-				throw new BizException("班级不存在");
-			}
-			dataList = courseScheduleStudentPaymentDao.findStudentByClassGroup(params);
-			//学生编号列表
-			List<Integer> userIds = dataList.stream().map(StudentAttendanceStatisticsResponse::getUserId).collect(Collectors.toList());
-			//学生-旷课次数关联集合
-			List<Map<Integer, Integer>> continuousAbsenteeismTimesByUsersAndMusicGroup = musicGroupStudentFeeDao.findContinuousAbsenteeismTimesByUsersAndMusicGroup(classGroup.getMusicGroupId(), userIds);
-			Map<Integer,Integer> continuousAbsenteeismTimesWithUser=MapUtil.convertIntegerMap(continuousAbsenteeismTimesByUsersAndMusicGroup);
-			//学生签到记录列表
-			List<StudentAttendanceResponse> studentAttendances = studentAttendanceDao.findByClassGroupAndUsers(queryInfo.getClassGroupId(), userIds);
-			//学生签到状态统计列表
-			List<StudentAttendanceStatusCountDto> studentAttendanceStatusCountDtos = studentAttendanceDao.countStudentAttendanceStatus(queryInfo.getClassGroupId(), userIds);
-			Map<Integer, List<StudentAttendanceStatusCountDto>> studentAttendanceStatusCountDtosByUser = studentAttendanceStatusCountDtos.stream().collect(Collectors.groupingBy(StudentAttendanceStatusCountDto::getUserId));
-
-			if(!CollectionUtils.isEmpty(studentAttendances)){
-				//学生-签到记录关联集合
-				Map<Integer, List<StudentAttendanceResponse>> studentAttendanceByUser = studentAttendances.stream().collect(Collectors.groupingBy(StudentAttendanceResponse::getUserId));
-
-				dataList.forEach(student->{
-					//判断是否是连续签到
-					Integer continuousAbsenteeismTimes = continuousAbsenteeismTimesWithUser.get(student.getUserId());
-					if(Objects.nonNull(continuousAbsenteeismTimes)){
-						if(continuousAbsenteeismTimes>=3){
-							student.setTruant(true);
-						}
-					}
-					//当前学生的签到状态统计
-					List<StudentAttendanceStatusCountDto> currentStudentAttendanceStatusCountDtos = studentAttendanceStatusCountDtosByUser.get(student.getUserId());
-					if(!CollectionUtils.isEmpty(currentStudentAttendanceStatusCountDtos)){
-						Map<StudentAttendanceStatusEnum, Integer> statusAndNumMap = currentStudentAttendanceStatusCountDtos.stream().collect(Collectors.toMap(StudentAttendanceStatusCountDto::getStatus, StudentAttendanceStatusCountDto::getNum));
-						student.setNormalDay(statusAndNumMap.get(StudentAttendanceStatusEnum.NORMAL));
-						student.setTruantDay(statusAndNumMap.get(StudentAttendanceStatusEnum.TRUANT));
-						student.setLeaveDay(statusAndNumMap.get(StudentAttendanceStatusEnum.LEAVE));
-					}
-
-					//当前学生签到记录
-					List<StudentAttendanceResponse> studentAttendanceResps = studentAttendanceByUser.get(student.getUserId());
-					if(Objects.nonNull(studentAttendanceResps)){
-						student.setList(studentAttendanceResps);
-					}
-				});
-			}
-		}
-		if (count == 0) {
-			dataList = new ArrayList<>();
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
-
-	@Override
-	public CourseScheduleResponse getStatisticsInfo(Integer classGroupId) {
-		if(Objects.isNull(classGroupId)){
-			throw new BizException("请指定班级");
-		}
-		ClassGroup classGroup = classGroupDao.get(classGroupId);
-		CourseScheduleResponse courseScheduleResp = new CourseScheduleResponse();
-		if (Objects.nonNull(classGroup)) {
-			if (Objects.nonNull(classGroup.getCurrentClassTimes()) && Objects.nonNull(classGroup.getTotalClassTimes())) {
-				courseScheduleResp.setAlreadyInClass(classGroup.getCurrentClassTimes() + "/" + classGroup.getTotalClassTimes());
-			}
-			if (Objects.nonNull(classGroup.getStudentNum())) {
-				courseScheduleResp.setStudentNum(classGroup.getStudentNum());
-			}
-			Date latestSignInDate = studentAttendanceDao.findLatestSignInDate(classGroupId);
-			if(Objects.nonNull(latestSignInDate)){
-				courseScheduleResp.setClassDate(DateUtil.format(latestSignInDate,DateUtil.DATE_FORMAT_MIN));
-				courseScheduleResp.setClassTime(DateUtil.date2Week(latestSignInDate));
-			}
-			courseScheduleResp.setLeagueNum(musicGroupQuitDao.countMusicGroupQuitNum(classGroup.getMusicGroupId()));
-		}
-		return courseScheduleResp;
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-	public void addStudentAttendanceRecord(Integer courseScheduleId, Integer userId, StudentAttendanceStatusEnum statusEnum,SignStatusEnum signStatusEnum) {
-		CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId.longValue());
-		ClassGroup classGroup = classGroupDao.findByCourseSchedule(courseScheduleId,0);
-		StudentAttendance studentAttendance = studentAttendanceDao.findByStatusAndCourseScheduleId(userId,courseScheduleId);
-		Date date = new Date();
-		if(studentAttendance == null){
-			studentAttendance = new StudentAttendance();
-			studentAttendance.setClassGroupId(classGroup.getId());
-			studentAttendance.setCourseScheduleId(courseScheduleId.longValue());
-			studentAttendance.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1);
-			studentAttendance.setGroupType(classGroup.getGroupType());
-			studentAttendance.setMusicGroupId(classGroup.getMusicGroupId());
-			studentAttendance.setUserId(userId);
-			studentAttendance.setTeacherId(courseSchedule.getActualTeacherId());
-			if(signStatusEnum == SignStatusEnum.SIGN_IN){
-				if(courseSchedule.getStudentNum() == null){
-					courseSchedule.setStudentNum(0);
-				}
-				courseSchedule.setStudentNum(courseSchedule.getStudentNum() + 1);
-			}
-			studentAttendanceDao.insert(studentAttendance);
-		}else {
-			studentAttendance.setTeacherId(courseSchedule.getActualTeacherId());
-			studentAttendance.setUpdateTime(date);
-		}
+public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentAttendance> implements StudentAttendanceService {
+
+    @Autowired
+    private StudentAttendanceDao studentAttendanceDao;
+    @Autowired
+    private MusicGroupStudentFeeDao studentFeeDao;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+    @Autowired
+    private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
+    @Autowired
+    private ClassGroupDao classGroupDao;
+    @Autowired
+    private ClassGroupStudentMapperDao classGroupStudentMapperDao;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
+    @Autowired
+    private MusicGroupQuitDao musicGroupQuitDao;
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
+    private SchoolDao schoolDao;
+    @Autowired
+    private SysConfigService sysConfigService;
+    @Autowired
+    private TeacherAttendanceDao teacherAttendanceDao;
+    @Autowired
+    private StudentDao studentDao;
+
+    @Override
+    public BaseDAO<Long, StudentAttendance> getDAO() {
+        return studentAttendanceDao;
+    }
+
+    private static final Logger log = LoggerFactory.getLogger(StudentAttendanceServiceImpl.class);
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public void addStudentAttendances(StudentAttendanceDto studentAttendanceInfos) {
+        List<StudentAttendance> studentAttendances = studentAttendanceInfos.getStudentAttendances();
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(sysUser)) {
+            throw new BizException("请登录");
+        }
+        studentDao.lockUser(sysUser.getId());
+        if (CollectionUtils.isEmpty(studentAttendances)) {
+            throw new BizException("无点名信息");
+        }
+        Long courseScheduleId = studentAttendances.get(0).getCourseScheduleId();
+        CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
+        if (Objects.isNull(courseSchedule)) {
+            throw new BizException("请指定课程");
+        }
+        if (TeachModeEnum.ONLINE.equals(courseSchedule.getTeachMode())) {
+            throw new BizException("线上课程请进入房间授课");
+        }
+        Date date = new Date();
+        SysConfig attendanceTimeRange;
+        if (courseSchedule.getGroupType().equals(GroupType.MUSIC)) {
+            attendanceTimeRange = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE);
+        } else {
+            SysConfig beforeAttendanceTimeRange = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_BEFOR_COURSE_START_TIME_RANGE_VIP);
+            int courseStartTime = DateUtil.minutesBetween(date, courseSchedule.getStartClassTime());
+            if (date.before(courseSchedule.getStartClassTime()) && courseStartTime > beforeAttendanceTimeRange.getParanValue(Integer.class)) {
+                throw new BizException("VIP课开课前{}分钟禁止点名", beforeAttendanceTimeRange.getParanValue(Integer.class));
+            }
+            attendanceTimeRange = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE_VIP);
+        }
+        int courseEndTime = DateUtil.minutesBetween(courseSchedule.getEndClassTime(), date);
+        if (date.after(courseSchedule.getEndClassTime()) && courseEndTime > attendanceTimeRange.getParanValue(Integer.class)) {
+            throw new BizException("{}课结束{}分钟后禁止点名",
+                    courseSchedule.getGroupType().equals(GroupType.MUSIC) ? "乐团" : "VIP",
+                    attendanceTimeRange.getParanValue(Integer.class));
+        }
+        studentAttendanceDao.deleteStudentAttendancesByCourse(courseScheduleId);
+        int classTimes = courseScheduleDao.countClassTimes(courseSchedule.getClassGroupId().longValue(), courseSchedule.getStartClassTime());
+        studentAttendances.forEach(studentAttendance -> {
+            studentAttendance.setTeacherId(sysUser.getId());
+            studentAttendance.setCurrentClassTimes(classTimes + 1);
+            StudentAttendance studentAttendanceInfo = studentAttendanceDao.getStudentAttendanceInfo(studentAttendance);
+            studentAttendanceInfo.setGroupType(courseSchedule.getGroupType());
+            studentAttendanceInfo.setMusicGroupId(courseSchedule.getMusicGroupId());
+            if (studentAttendance.getStatus() != StudentAttendanceStatusEnum.DROP_OUT) {
+                //判断是否为连续旷课
+                if (StudentAttendanceStatusEnum.TRUANT.equals(studentAttendance.getStatus())
+                        || StudentAttendanceStatusEnum.LEAVE.equals(studentAttendance.getStatus())) {
+                    StudentAttendance studentLatestAttendanceInfo = studentAttendanceDao.getStudentLatestAttendanceInfo(studentAttendanceInfo);
+                    if (Objects.nonNull(studentLatestAttendanceInfo)) {
+                        if (StudentAttendanceStatusEnum.TRUANT.equals(studentLatestAttendanceInfo.getStatus())
+                                || StudentAttendanceStatusEnum.LEAVE.equals(studentLatestAttendanceInfo.getStatus())) {
+                            studentFeeDao.updateStudentAbsenteeismTimes(studentAttendanceInfo.getUserId(),
+                                    studentAttendanceInfo.getMusicGroupId(),
+                                    YesOrNoEnum.YES.getCode());
+                        }
+                    } else {
+                        studentFeeDao.updateStudentAbsenteeismTimes(studentAttendanceInfo.getUserId(),
+                                studentAttendanceInfo.getMusicGroupId(),
+                                YesOrNoEnum.YES.getCode());
+                    }
+                } else {
+                    studentFeeDao.updateStudentAbsenteeismTimes(studentAttendanceInfo.getUserId(),
+                            studentAttendanceInfo.getMusicGroupId(),
+                            YesOrNoEnum.NO.getCode());
+                }
+                if (studentAttendanceInfo.getStatus() == StudentAttendanceStatusEnum.NORMAL) {
+                    studentAttendanceInfo.setSignInTime(courseSchedule.getStartClassTime());
+                    studentAttendanceInfo.setSignOutTime(courseSchedule.getEndClassTime());
+                }
+                studentAttendanceDao.insert(studentAttendanceInfo);
+            } else {
+                studentFeeDao.updateStudentAbsenteeismTimes(studentAttendanceInfo.getUserId(),
+                        studentAttendanceInfo.getMusicGroupId(),
+                        YesOrNoEnum.NO.getCode());
+            }
+        });
+        //获取正常签到的学生信息
+        List<StudentAttendance> normal = studentAttendances.stream().filter(studentAttendance -> studentAttendance.getStatus() == StudentAttendanceStatusEnum.NORMAL).collect(Collectors.toList());
+        if (normal != null && normal.size() > 0) {
+            Map<Integer, String> receivers = new HashMap<>();
+            normal.forEach(e -> {
+                receivers.put(e.getUserId(), e.getUserId().toString());
+            });
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_NAMES_ACHIEVE,
+                    receivers, null, 0, "2", "STUDENT", DateUtil.format(new Date(), DateUtil.DATE_FORMAT_MIN));
+        }
+        Map<StudentAttendanceStatusEnum, List<StudentAttendance>> studentAttendanceGroupByStatus = studentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getStatus));
+        Integer studentNum = studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL) == null ? 0 : studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL).size();
+        Integer leaveStudentNum = studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE) == null ? 0 : studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE).size();
+        courseSchedule.setStudentNum(studentNum);
+        courseSchedule.setLeaveStudentNum(leaveStudentNum);
+        courseScheduleDao.update(courseSchedule);
+
+        if (!courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.VIP)) {
+            return;
+        }
+
+        if (StringUtils.isBlank(studentAttendanceInfos.getSignInLongitudeLatitude())) {
+            throw new BizException("未获取到您的位置");
+        }
+
+        School school = schoolDao.get(courseSchedule.getSchoolId());
+
+        //是否在范围内
+        boolean isInScore = true;
+        if (Objects.nonNull(school)) {
+            if (StringUtils.isBlank(school.getLongitudeLatitude())) {
+                if (studentAttendanceInfos.getUpdate().equals(YesOrNoEnum.YES.getCode())) {
+                    school.setLongitudeLatitude(studentAttendanceInfos.getSignInLongitudeLatitude());
+                    schoolDao.update(school);
+                }
+            } else {
+                SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE);
+                double attendanceRange = Double.valueOf(sysConfig.getParanValue());
+                double distance = MapUtil.distance(studentAttendanceInfos.getSignInLongitudeLatitude(),
+                        school.getLongitudeLatitude());
+                if (distance > attendanceRange) {
+                    isInScore = false;
+                }
+            }
+        }
+
+        TeacherAttendance teacherAttendance = teacherAttendanceDao.findByTeacherAttendanceInfo(sysUser.getId().longValue(), courseSchedule.getId());
+
+        teacherAttendance.setSignInLongitudeLatitude(studentAttendanceInfos.getSignInLongitudeLatitude());
+
+        if (Objects.isNull(teacherAttendance)) {
+            teacherAttendance = new TeacherAttendance();
+            teacherAttendance.setTeacherId(sysUser.getId());
+            teacherAttendance.setCreateTime(date);
+        }
+
+        teacherAttendance.setSignInTime(courseSchedule.getStartClassTime());
+        teacherAttendance.setSignInStatus(YesOrNoEnum.YES);
+        teacherAttendance.setSignOutTime(courseSchedule.getEndClassTime());
+        teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
+        teacherAttendance.setCurrentClassTimes(classTimes + 1);
+        if (Objects.nonNull(teacherAttendance.getId())) {
+            teacherAttendanceDao.update(teacherAttendance);
+        } else {
+            teacherAttendanceDao.insert(teacherAttendance);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateStudentAttendances(StudentAttendanceDto studentAttendanceInfo) {
+        if (Objects.isNull(studentAttendanceInfo.getCourseScheduleId())) {
+            throw new BizException("请指定课程编号");
+        }
+        List<StudentAttendance> studentAttendances = studentAttendanceInfo.getStudentAttendances();
+        if (CollectionUtils.isEmpty(studentAttendances)) {
+            throw new BizException("无点名信息");
+        }
+        CourseSchedule courseSchedule = courseScheduleDao.get(studentAttendanceInfo.getCourseScheduleId().longValue());
+        if (Objects.isNull(courseSchedule)) {
+            throw new BizException("课程不存在");
+        }
+
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedule(studentAttendanceInfo.getCourseScheduleId());
+        if (!CollectionUtils.isEmpty(courseScheduleTeacherSalaries) && Objects.nonNull(courseScheduleTeacherSalaries.get(0).getSettlementTime())) {
+            throw new BizException("此课程已结算");
+        }
+
+        List<Integer> userIds = studentAttendances.stream().map(StudentAttendance::getUserId).collect(Collectors.toList());
+        studentAttendanceDao.deleteStudentAttendancesByCourseAndUsers(studentAttendanceInfo.getCourseScheduleId().longValue(), userIds);
+        for (StudentAttendance studentAttendance : studentAttendances) {
+            studentAttendance.setGroupType(courseSchedule.getGroupType());
+            studentAttendance.setMusicGroupId(courseSchedule.getMusicGroupId());
+            studentAttendance.setClassGroupId(courseSchedule.getClassGroupId());
+            studentAttendance.setTeacherId(courseSchedule.getActualTeacherId());
+            studentAttendance.setCourseScheduleId(courseSchedule.getId());
+        }
+        studentAttendanceDao.addStudentAttendances(studentAttendances);
+        List<StudentAttendance> allStudentAttendances = studentAttendanceDao.findByCourseId(studentAttendanceInfo.getCourseScheduleId());
+        Map<StudentAttendanceStatusEnum, List<StudentAttendance>> studentAttendanceGroupByStatus = allStudentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getStatus));
+        Integer studentNum = studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL) == null ? 0 : studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL).size();
+        Integer leaveStudentNum = studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE) == null ? 0 : studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE).size();
+        courseSchedule.setStudentNum(studentNum);
+        courseSchedule.setLeaveStudentNum(leaveStudentNum);
+        courseScheduleDao.update(courseSchedule);
+    }
+
+    @Override
+    public Map<String, Object> getCurrentCourseStudents(QueryInfo queryInfo) {
+        Map<String, Object> result = new HashMap<>();
+
+        PageInfo<StudentAttendance> pageInfo = super.queryPage(queryInfo);
+
+        result.put("pageInfo", pageInfo);
+
+        List<StudentStatusCountUtilEntity> stringIntegerMap = studentAttendanceDao.countStudentStatus(((StudentAttendanceQueryInfo) queryInfo).getClassGroupId());
+
+        stringIntegerMap.forEach(studentStatusCount -> {
+            switch (studentStatusCount.getStudentStatus()) {
+                case LEAVE:
+                    result.put("numberOfLeavePeoples", studentStatusCount.getNumberOfStudent());
+                    break;
+                default:
+                    break;
+
+            }
+        });
+
+        return result;
+    }
+
+    @Override
+    public PageInfo<StudentPersonalAttendanceDto> getStudentPersonalAttendances(QueryInfo queryInfo) {
+        PageInfo<StudentPersonalAttendanceDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<StudentPersonalAttendanceDto> dataList = null;
+        int count = studentAttendanceDao.queryStudentPersonalAttendancesCount(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentAttendanceDao.queryStudentPersonalAttendances(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean leave(Integer userId, Long courseScheduleId, String remark) {
+
+        CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
+        if (courseSchedule == null) {
+            throw new BizException("课程编号异常");
+        }
+
+        if (courseSchedule.getStatus() == CourseStatusEnum.OVER) {
+            throw new BizException("课程已结束");
+        }
+
+        Date date = new Date();
+
+        int hours = 4;
+        String str = sysConfigDao.findConfigValue(SysConfigService.ADVANCE_LEAVE_HOURS);
+        if (StringUtils.isNotBlank(str)) {
+            hours = Integer.parseInt(str);
+        }
+
+        int earliestTimeForLeave = 7;
+        SysConfig earliestTimeForLeaveConfig = sysConfigService.findByParamName(SysConfigService.EARLIEST_TIME_FOR_LEAVE);
+        if (Objects.nonNull(earliestTimeForLeaveConfig)) {
+            earliestTimeForLeave = Integer.parseInt(earliestTimeForLeaveConfig.getParanValue());
+        }
+
+        if (DateUtil.addHours(date, hours).after(courseSchedule.getStartClassTime())) {
+            throw new BizException("开课{}小时之前才可以请假", hours);
+        }
+
+        if (DateUtil.addDays(DateUtils.truncate(date, Calendar.DAY_OF_MONTH), earliestTimeForLeave).compareTo(courseSchedule.getClassDate())<=0) {
+            throw new BizException("请在开课前{}天内请假", earliestTimeForLeave);
+        }
+
+        StudentAttendance studentAttendance = studentAttendanceDao.findByStatusAndCourseScheduleId(userId, courseScheduleId.intValue());
+        if (Objects.isNull(studentAttendance)) {
+            studentAttendance = new StudentAttendance();
+        }
+        studentAttendance.setClassGroupId(courseSchedule.getClassGroupId());
+        studentAttendance.setCourseScheduleId(courseScheduleId);
+        studentAttendance.setCreateTime(date);
+        studentAttendance.setCurrentClassTimes(0);
+        studentAttendance.setRemark(remark);
+        studentAttendance.setStatus(StudentAttendanceStatusEnum.LEAVE);
+        studentAttendance.setUserId(userId);
+        studentAttendance.setGroupType(courseSchedule.getGroupType());
+        studentAttendance.setMusicGroupId(courseSchedule.getMusicGroupId());
+
+        if (Objects.nonNull(studentAttendance.getId())) {
+            studentAttendanceDao.update(studentAttendance);
+        } else {
+            studentAttendanceDao.insert(studentAttendance);
+        }
+
+        ClassGroupStudentMapper classGroupStudentMapper = classGroupStudentMapperDao.query(courseSchedule.getClassGroupId(), userId);
+        if (Objects.isNull(classGroupStudentMapper)) {
+            throw new BizException("您不在此课程对应班级上");
+        }
+
+        Map<Integer, String> sendArgs = new HashMap<>();
+        sendArgs.put(courseSchedule.getActualTeacherId(), courseSchedule.getActualTeacherId() + "");
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        //发送消息至老师
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                MessageTypeEnum.TEACHER_PUSH_STUDENT_LEAVE,
+                sendArgs,
+                null, 0, "1", "TEACHER", DateUtil.getDate(courseSchedule.getClassDate()), DateUtil.getTime(courseSchedule.getStartClassTime()), courseSchedule.getName(), sysUser.getUsername());
+        return true;
+    }
+
+    @Override
+    public PageInfo statisticsList(CourseHomeworkQueryInfo queryInfo) {
+
+        if (Objects.isNull(queryInfo.getClassGroupId())) {
+            throw new BizException("请指定班级");
+        }
+
+        PageInfo pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<StudentAttendanceStatisticsResponse> dataList = null;
+        int count = courseScheduleStudentPaymentDao.countStudentByClassGroup(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            ClassGroup classGroup = classGroupDao.get(queryInfo.getClassGroupId().intValue());
+            if (Objects.isNull(classGroup)) {
+                throw new BizException("班级不存在");
+            }
+            dataList = courseScheduleStudentPaymentDao.findStudentByClassGroup(params);
+            //学生编号列表
+            List<Integer> userIds = dataList.stream().map(StudentAttendanceStatisticsResponse::getUserId).collect(Collectors.toList());
+            //学生-旷课次数关联集合
+            List<Map<Integer, Integer>> continuousAbsenteeismTimesByUsersAndMusicGroup = musicGroupStudentFeeDao.findContinuousAbsenteeismTimesByUsersAndMusicGroup(classGroup.getMusicGroupId(), userIds);
+            Map<Integer, Integer> continuousAbsenteeismTimesWithUser = MapUtil.convertIntegerMap(continuousAbsenteeismTimesByUsersAndMusicGroup);
+            //学生签到记录列表
+            List<StudentAttendanceResponse> studentAttendances = studentAttendanceDao.findByClassGroupAndUsers(queryInfo.getClassGroupId(), userIds);
+            //学生签到状态统计列表
+            List<StudentAttendanceStatusCountDto> studentAttendanceStatusCountDtos = studentAttendanceDao.countStudentAttendanceStatus(queryInfo.getClassGroupId(), userIds);
+            Map<Integer, List<StudentAttendanceStatusCountDto>> studentAttendanceStatusCountDtosByUser = studentAttendanceStatusCountDtos.stream().collect(Collectors.groupingBy(StudentAttendanceStatusCountDto::getUserId));
+
+            if (!CollectionUtils.isEmpty(studentAttendances)) {
+                //学生-签到记录关联集合
+                Map<Integer, List<StudentAttendanceResponse>> studentAttendanceByUser = studentAttendances.stream().collect(Collectors.groupingBy(StudentAttendanceResponse::getUserId));
+
+                dataList.forEach(student -> {
+                    //判断是否是连续签到
+                    Integer continuousAbsenteeismTimes = continuousAbsenteeismTimesWithUser.get(student.getUserId());
+                    if (Objects.nonNull(continuousAbsenteeismTimes)) {
+                        if (continuousAbsenteeismTimes >= 3) {
+                            student.setTruant(true);
+                        }
+                    }
+                    //当前学生的签到状态统计
+                    List<StudentAttendanceStatusCountDto> currentStudentAttendanceStatusCountDtos = studentAttendanceStatusCountDtosByUser.get(student.getUserId());
+                    if (!CollectionUtils.isEmpty(currentStudentAttendanceStatusCountDtos)) {
+                        Map<StudentAttendanceStatusEnum, Integer> statusAndNumMap = currentStudentAttendanceStatusCountDtos.stream().collect(Collectors.toMap(StudentAttendanceStatusCountDto::getStatus, StudentAttendanceStatusCountDto::getNum));
+                        student.setNormalDay(statusAndNumMap.get(StudentAttendanceStatusEnum.NORMAL));
+                        student.setTruantDay(statusAndNumMap.get(StudentAttendanceStatusEnum.TRUANT));
+                        student.setLeaveDay(statusAndNumMap.get(StudentAttendanceStatusEnum.LEAVE));
+                    }
+
+                    //当前学生签到记录
+                    List<StudentAttendanceResponse> studentAttendanceResps = studentAttendanceByUser.get(student.getUserId());
+                    if (Objects.nonNull(studentAttendanceResps)) {
+                        student.setList(studentAttendanceResps);
+                    }
+                });
+            }
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public CourseScheduleResponse getStatisticsInfo(Integer classGroupId) {
+        if (Objects.isNull(classGroupId)) {
+            throw new BizException("请指定班级");
+        }
+        ClassGroup classGroup = classGroupDao.get(classGroupId);
+        CourseScheduleResponse courseScheduleResp = new CourseScheduleResponse();
+        if (Objects.nonNull(classGroup)) {
+            if (Objects.nonNull(classGroup.getCurrentClassTimes()) && Objects.nonNull(classGroup.getTotalClassTimes())) {
+                courseScheduleResp.setAlreadyInClass(classGroup.getCurrentClassTimes() + "/" + classGroup.getTotalClassTimes());
+            }
+            if (Objects.nonNull(classGroup.getStudentNum())) {
+                courseScheduleResp.setStudentNum(classGroup.getStudentNum());
+            }
+            Date latestSignInDate = studentAttendanceDao.findLatestSignInDate(classGroupId);
+            if (Objects.nonNull(latestSignInDate)) {
+                courseScheduleResp.setClassDate(DateUtil.format(latestSignInDate, DateUtil.DATE_FORMAT_MIN));
+                courseScheduleResp.setClassTime(DateUtil.date2Week(latestSignInDate));
+            }
+            courseScheduleResp.setLeagueNum(musicGroupQuitDao.countMusicGroupQuitNum(classGroup.getMusicGroupId()));
+        }
+        return courseScheduleResp;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public void addStudentAttendanceRecord(Integer courseScheduleId, Integer userId, StudentAttendanceStatusEnum statusEnum, SignStatusEnum signStatusEnum) {
+        CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId.longValue());
+        ClassGroup classGroup = classGroupDao.findByCourseSchedule(courseScheduleId, 0);
+        StudentAttendance studentAttendance = studentAttendanceDao.findByStatusAndCourseScheduleId(userId, courseScheduleId);
+        Date date = new Date();
+        if (studentAttendance == null) {
+            studentAttendance = new StudentAttendance();
+            studentAttendance.setClassGroupId(classGroup.getId());
+            studentAttendance.setCourseScheduleId(courseScheduleId.longValue());
+            studentAttendance.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1);
+            studentAttendance.setGroupType(classGroup.getGroupType());
+            studentAttendance.setMusicGroupId(classGroup.getMusicGroupId());
+            studentAttendance.setUserId(userId);
+            studentAttendance.setTeacherId(courseSchedule.getActualTeacherId());
+            if (signStatusEnum == SignStatusEnum.SIGN_IN) {
+                if (courseSchedule.getStudentNum() == null) {
+                    courseSchedule.setStudentNum(0);
+                }
+                courseSchedule.setStudentNum(courseSchedule.getStudentNum() + 1);
+            }
+            studentAttendanceDao.insert(studentAttendance);
+        } else {
+            studentAttendance.setTeacherId(courseSchedule.getActualTeacherId());
+            studentAttendance.setUpdateTime(date);
+        }
 //		Date signInTime = studentAttendance.getSignInTime();
-		//没有签到信息才会生成
-		if(signStatusEnum == SignStatusEnum.SIGN_IN && studentAttendance.getSignInTime() == null){
-			//判断是否在签到时间段内(课程开始前20~结束前)
+        //没有签到信息才会生成
+        if (signStatusEnum == SignStatusEnum.SIGN_IN && studentAttendance.getSignInTime() == null) {
+            //判断是否在签到时间段内(课程开始前20~结束前)
 //			int advanceSignMinutes = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES));
 //			String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
 //			String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 //			String endClassTime = DateUtil.format(courseSchedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-			//上课时间
+            //上课时间
 //			Date classStartDateTime = DateUtil.stringToDate(classDate + " " + startClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 //			Date classEndDateTime = DateUtil.stringToDate(classDate + " " + endClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 //			Date addMinutes = DateUtil.addMinutes(classStartDateTime, -60);
-			//课程结束前进入,算正常
-			studentAttendance.setStatus(statusEnum);
-			studentAttendance.setSignInTime(date);
+            //课程结束前进入,算正常
+            studentAttendance.setStatus(statusEnum);
+            studentAttendance.setSignInTime(date);
 
-			courseSchedule.setUpdateTime(date);
+            courseSchedule.setUpdateTime(date);
 //				courseSchedule.setStudentNum((courseSchedule.getStudentNum() == null?0:courseSchedule.getStudentNum()) + 1);
-			courseScheduleDao.update(courseSchedule);
+            courseScheduleDao.update(courseSchedule);
 			/*if(DateUtil.minutesBetween(addMinutes,date) >= 0 && DateUtil.minutesBetween(date,classEndDateTime) > 0){
 
 			}*/
-		}else if(signStatusEnum == SignStatusEnum.SIGN_OUT){
-			String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
-			String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-			String endClassTime = DateUtil.format(courseSchedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-			//上课时间
-			Date classStartDateTime = DateUtil.stringToDate(classDate + " " + startClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-			Date classEndDateTime = DateUtil.stringToDate(classDate + " " + endClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-			if(DateUtil.minutesBetween(classEndDateTime,date) >= 0){
-				String continueCourseTime = sysConfigDao.findConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME);
-				if(StringUtils.isEmpty(continueCourseTime)){
-					continueCourseTime = "5";
-				}
-				List<CourseSchedule> courseSchedules = new ArrayList<>();
-				CourseSchedule cs = courseSchedule;
-				while (true){
-					//获取当前课程的所有连堂课列表
-					String courseClassDate = DateUtil.format(cs.getClassDate(), DateUtil.DEFAULT_PATTERN);
-					String courseEndDateTime = DateUtil.format(cs.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-					cs = courseScheduleDao.queryRepairContinueCourse(cs,continueCourseTime,courseClassDate + " " + courseEndDateTime);
-					//存在连堂课
-					if(cs != null){
-						courseSchedules.add(cs);
-					}else {
-						break;
-					}
-				}
-				if(courseSchedules.size() > 0){
-					//获取总上课时长
-					int totalMinutes = DateUtil.minutesBetween(classStartDateTime, date);
-					//减去第一节课时长
-					int firstMinutes = courseScheduleDao.getSingleClassMinutes(courseScheduleId.longValue());
-					totalMinutes -= firstMinutes;
-					if(totalMinutes > 0){
-						String courseClassDate;
-						String courseStartDateTime;
-						String courseEndDateTime;
-						for (int i = 0; i < courseSchedules.size(); i++) {
-							courseClassDate = DateUtil.format(courseSchedules.get(i).getClassDate(), DateUtil.DEFAULT_PATTERN);
-							courseStartDateTime = DateUtil.format(courseSchedules.get(i).getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-							courseEndDateTime = DateUtil.format(courseSchedules.get(i).getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-							Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-							Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-							StudentAttendance byStatusAndCourseScheduleId = studentAttendanceDao.findByStatusAndCourseScheduleId(userId, courseSchedules.get(i).getId().intValue());
-							Date signOutTime = date;
-							if(date.before(startDateTime)){
-								continue;
-							}
-							if(i < courseSchedules.size() - 1 && date.after(endDateTime)){
-								//不是最后一节连堂课,并且签退时间大于课程结束时间,签退时间等于课程结束时间
-								signOutTime = endDateTime;
-							}
-							if(byStatusAndCourseScheduleId != null){
-								if(byStatusAndCourseScheduleId.getSignOutTime() != null){
-									continue;
-								}
-								if(byStatusAndCourseScheduleId.getSignInTime() != null){
-									startDateTime = null;
-								}
-								byStatusAndCourseScheduleId.setSignInTime(startDateTime);
-								byStatusAndCourseScheduleId.setSignOutTime(signOutTime);
-								byStatusAndCourseScheduleId.setStatus(statusEnum);
-								byStatusAndCourseScheduleId.setUpdateTime(date);
-								studentAttendanceDao.update(byStatusAndCourseScheduleId);
-							}else {
-								byStatusAndCourseScheduleId = new StudentAttendance();
-								byStatusAndCourseScheduleId.setSignOutTime(signOutTime);
-								byStatusAndCourseScheduleId.setStatus(statusEnum);
-								byStatusAndCourseScheduleId.setSignInTime(startDateTime);
-								byStatusAndCourseScheduleId.setUpdateTime(date);
-								byStatusAndCourseScheduleId.setUserId(userId);
-								byStatusAndCourseScheduleId.setTeacherId(courseSchedule.getActualTeacherId());
-								byStatusAndCourseScheduleId.setClassGroupId(courseSchedules.get(i).getClassGroupId());
-								byStatusAndCourseScheduleId.setCourseScheduleId(courseSchedules.get(i).getId());
-								byStatusAndCourseScheduleId.setMusicGroupId(courseSchedules.get(i).getMusicGroupId());
-								byStatusAndCourseScheduleId.setGroupType(courseSchedules.get(i).getGroupType());
-								byStatusAndCourseScheduleId.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1);
-								studentAttendanceDao.insert(byStatusAndCourseScheduleId);
-							}
-							if(studentAttendance.getSignOutTime() == null){
-								studentAttendance.setStatus(statusEnum);
-								studentAttendance.setSignOutTime(classEndDateTime);
-							}
-						}
-					}
-				}else {
-					studentAttendance.setStatus(statusEnum);
-					studentAttendance.setSignOutTime(date);
-				}
-				if(studentAttendance.getSignOutTime() == null){
-					studentAttendance.setStatus(statusEnum);
-					studentAttendance.setSignOutTime(date);
-				}
-			}else {
-				studentAttendance.setStatus(statusEnum);
-				studentAttendance.setSignOutTime(date);
-			}
-		}
-		studentAttendanceDao.update(studentAttendance);
-	}
-
-	@Override
-	public PageInfo<StudentAttendance> findStudentAttendance(QueryInfo queryInfo) {
-		PageInfo<StudentAttendance> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<>();
-		MapUtil.populateMap(params, queryInfo);
-
-		List<StudentAttendance> dataList = null;
-		int count = studentAttendanceDao.countStudentAttendance(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = studentAttendanceDao.findStudentAttendance(params);
-		}
-		if (count == 0) {
-			dataList = new ArrayList<>();
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
-
-	@Override
-	public void repairStudentAttendance(Integer month) {
-		//获取所有有老师考勤的课程记录,正常签退,当月线上课,有学员签到记录
-		List<CourseSchedule> courseScheduleList = courseScheduleDao.queryScheduleByAttendance(month);
-		//是否是连堂课
-		String continueCourseTime = sysConfigDao.findConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME);
-		if(StringUtils.isEmpty(continueCourseTime)){
-			continueCourseTime = "5";
-		}
-		Date date = new Date();
-		for (CourseSchedule courseSchedule : courseScheduleList) {
-			log.info("课程编号: {}",courseSchedule.getId());
-			//只会修复签到的学员考勤
-			List<StudentAttendance> byCourseId = studentAttendanceDao.findByCourseId(courseSchedule.getId());
-			if(byCourseId == null || byCourseId.size() == 0){
-				break;
-			}
-			List<CourseSchedule> courseSchedules = new ArrayList<>();
-			CourseSchedule cs = courseSchedule;
-			while (true){
-				//获取当前课程的所有连堂课列表
-				String courseClassDate = DateUtil.format(cs.getClassDate(), DateUtil.DEFAULT_PATTERN);
-				String courseEndDateTime = DateUtil.format(cs.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-				cs = courseScheduleDao.queryRepairContinueCourse(cs,continueCourseTime,courseClassDate + " " + courseEndDateTime);
-				//存在连堂课
-				if(cs != null){
-					courseSchedules.add(cs);
-				}else {
-					break;
-				}
-			}
+        } else if (signStatusEnum == SignStatusEnum.SIGN_OUT) {
+            String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
+            String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+            String endClassTime = DateUtil.format(courseSchedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+            //上课时间
+            Date classStartDateTime = DateUtil.stringToDate(classDate + " " + startClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+            Date classEndDateTime = DateUtil.stringToDate(classDate + " " + endClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+            if (DateUtil.minutesBetween(classEndDateTime, date) >= 0) {
+                String continueCourseTime = sysConfigDao.findConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME);
+                if (StringUtils.isEmpty(continueCourseTime)) {
+                    continueCourseTime = "5";
+                }
+                List<CourseSchedule> courseSchedules = new ArrayList<>();
+                CourseSchedule cs = courseSchedule;
+                while (true) {
+                    //获取当前课程的所有连堂课列表
+                    String courseClassDate = DateUtil.format(cs.getClassDate(), DateUtil.DEFAULT_PATTERN);
+                    String courseEndDateTime = DateUtil.format(cs.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+                    cs = courseScheduleDao.queryRepairContinueCourse(cs, continueCourseTime, courseClassDate + " " + courseEndDateTime);
+                    //存在连堂课
+                    if (cs != null) {
+                        courseSchedules.add(cs);
+                    } else {
+                        break;
+                    }
+                }
+                if (courseSchedules.size() > 0) {
+                    //获取总上课时长
+                    int totalMinutes = DateUtil.minutesBetween(classStartDateTime, date);
+                    //减去第一节课时长
+                    int firstMinutes = courseScheduleDao.getSingleClassMinutes(courseScheduleId.longValue());
+                    totalMinutes -= firstMinutes;
+                    if (totalMinutes > 0) {
+                        String courseClassDate;
+                        String courseStartDateTime;
+                        String courseEndDateTime;
+                        for (int i = 0; i < courseSchedules.size(); i++) {
+                            courseClassDate = DateUtil.format(courseSchedules.get(i).getClassDate(), DateUtil.DEFAULT_PATTERN);
+                            courseStartDateTime = DateUtil.format(courseSchedules.get(i).getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+                            courseEndDateTime = DateUtil.format(courseSchedules.get(i).getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+                            Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+                            Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+                            StudentAttendance byStatusAndCourseScheduleId = studentAttendanceDao.findByStatusAndCourseScheduleId(userId, courseSchedules.get(i).getId().intValue());
+                            Date signOutTime = date;
+                            if (date.before(startDateTime)) {
+                                continue;
+                            }
+                            if (i < courseSchedules.size() - 1 && date.after(endDateTime)) {
+                                //不是最后一节连堂课,并且签退时间大于课程结束时间,签退时间等于课程结束时间
+                                signOutTime = endDateTime;
+                            }
+                            if (byStatusAndCourseScheduleId != null) {
+                                if (byStatusAndCourseScheduleId.getSignOutTime() != null) {
+                                    continue;
+                                }
+                                if (byStatusAndCourseScheduleId.getSignInTime() != null) {
+                                    startDateTime = null;
+                                }
+                                byStatusAndCourseScheduleId.setSignInTime(startDateTime);
+                                byStatusAndCourseScheduleId.setSignOutTime(signOutTime);
+                                byStatusAndCourseScheduleId.setStatus(statusEnum);
+                                byStatusAndCourseScheduleId.setUpdateTime(date);
+                                studentAttendanceDao.update(byStatusAndCourseScheduleId);
+                            } else {
+                                byStatusAndCourseScheduleId = new StudentAttendance();
+                                byStatusAndCourseScheduleId.setSignOutTime(signOutTime);
+                                byStatusAndCourseScheduleId.setStatus(statusEnum);
+                                byStatusAndCourseScheduleId.setSignInTime(startDateTime);
+                                byStatusAndCourseScheduleId.setUpdateTime(date);
+                                byStatusAndCourseScheduleId.setUserId(userId);
+                                byStatusAndCourseScheduleId.setTeacherId(courseSchedule.getActualTeacherId());
+                                byStatusAndCourseScheduleId.setClassGroupId(courseSchedules.get(i).getClassGroupId());
+                                byStatusAndCourseScheduleId.setCourseScheduleId(courseSchedules.get(i).getId());
+                                byStatusAndCourseScheduleId.setMusicGroupId(courseSchedules.get(i).getMusicGroupId());
+                                byStatusAndCourseScheduleId.setGroupType(courseSchedules.get(i).getGroupType());
+                                byStatusAndCourseScheduleId.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1);
+                                studentAttendanceDao.insert(byStatusAndCourseScheduleId);
+                            }
+                            if (studentAttendance.getSignOutTime() == null) {
+                                studentAttendance.setStatus(statusEnum);
+                                studentAttendance.setSignOutTime(classEndDateTime);
+                            }
+                        }
+                    }
+                } else {
+                    studentAttendance.setStatus(statusEnum);
+                    studentAttendance.setSignOutTime(date);
+                }
+                if (studentAttendance.getSignOutTime() == null) {
+                    studentAttendance.setStatus(statusEnum);
+                    studentAttendance.setSignOutTime(date);
+                }
+            } else {
+                studentAttendance.setStatus(statusEnum);
+                studentAttendance.setSignOutTime(date);
+            }
+        }
+        studentAttendanceDao.update(studentAttendance);
+    }
+
+    @Override
+    public PageInfo<StudentAttendance> findStudentAttendance(QueryInfo queryInfo) {
+        PageInfo<StudentAttendance> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<StudentAttendance> dataList = null;
+        int count = studentAttendanceDao.countStudentAttendance(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentAttendanceDao.findStudentAttendance(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public void repairStudentAttendance(Integer month) {
+        //获取所有有老师考勤的课程记录,正常签退,当月线上课,有学员签到记录
+        List<CourseSchedule> courseScheduleList = courseScheduleDao.queryScheduleByAttendance(month);
+        //是否是连堂课
+        String continueCourseTime = sysConfigDao.findConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME);
+        if (StringUtils.isEmpty(continueCourseTime)) {
+            continueCourseTime = "5";
+        }
+        Date date = new Date();
+        for (CourseSchedule courseSchedule : courseScheduleList) {
+            log.info("课程编号: {}", courseSchedule.getId());
+            //只会修复签到的学员考勤
+            List<StudentAttendance> byCourseId = studentAttendanceDao.findByCourseId(courseSchedule.getId());
+            if (byCourseId == null || byCourseId.size() == 0) {
+                break;
+            }
+            List<CourseSchedule> courseSchedules = new ArrayList<>();
+            CourseSchedule cs = courseSchedule;
+            while (true) {
+                //获取当前课程的所有连堂课列表
+                String courseClassDate = DateUtil.format(cs.getClassDate(), DateUtil.DEFAULT_PATTERN);
+                String courseEndDateTime = DateUtil.format(cs.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+                cs = courseScheduleDao.queryRepairContinueCourse(cs, continueCourseTime, courseClassDate + " " + courseEndDateTime);
+                //存在连堂课
+                if (cs != null) {
+                    courseSchedules.add(cs);
+                } else {
+                    break;
+                }
+            }
 
 //			List<BasicUserDto> students = courseScheduleStudentPaymentDao.findStudents(courseSchedule.getId());
-			if(courseSchedules.size() > 0) {
-				//获取当前课程老师总上课时长
-				int totalMinutes = teacherAttendanceDao.getTotalMinutes(courseSchedule.getId(),courseSchedule.getActualTeacherId());
-				int firstMinutes = courseScheduleDao.getSingleClassMinutes(courseSchedule.getId());
-				totalMinutes -= firstMinutes;
-				if (totalMinutes > 0) {
-					String courseClassDate;
-					String courseStartDateTime;
-					String courseEndDateTime;
-					for (CourseSchedule e:courseSchedules) {
-						//获取当前课程的单节课时长
-						int signClassMinutes = courseScheduleDao.getSingleClassMinutes(e.getId());
-						totalMinutes -= signClassMinutes;
-						if (totalMinutes >= 0) {
-							//补充签到签退时间
-							courseClassDate = DateUtil.format(e.getClassDate(), DateUtil.DEFAULT_PATTERN);
-							courseStartDateTime = DateUtil.format(e.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-							courseEndDateTime = DateUtil.format(e.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-							Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-							Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-							byCourseId.forEach(student->{
-								StudentAttendance byStatusAndCourseScheduleId = studentAttendanceDao.findByStatusAndCourseScheduleId(student.getUserId(), e.getId().intValue());
-								if(byStatusAndCourseScheduleId == null){
-									byStatusAndCourseScheduleId = new StudentAttendance();
-									byStatusAndCourseScheduleId.setSignOutTime(endDateTime);
-									byStatusAndCourseScheduleId.setStatus(StudentAttendanceStatusEnum.NORMAL);
-									byStatusAndCourseScheduleId.setSignInTime(startDateTime);
-									byStatusAndCourseScheduleId.setUpdateTime(date);
-									byStatusAndCourseScheduleId.setUserId(student.getUserId());
-									byStatusAndCourseScheduleId.setTeacherId(e.getActualTeacherId());
-									byStatusAndCourseScheduleId.setClassGroupId(e.getClassGroupId());
-									byStatusAndCourseScheduleId.setMusicGroupId(e.getMusicGroupId());
-									byStatusAndCourseScheduleId.setGroupType(e.getGroupType());
-									byStatusAndCourseScheduleId.setCourseScheduleId(e.getId());
-									studentAttendanceDao.insert(byStatusAndCourseScheduleId);
-								}
-							});
-						}
-					}
-				}
-			}
-		}
-	}
-
-	@Override
-	public StudentAttendance findByStatusAndCourseScheduleId(Long courseId, Integer userId) {
-		return studentAttendanceDao.findByStatusAndCourseScheduleId(userId,courseId.intValue());
-	}
-
-	@Override
-	public void cleanCourseStudentSignOut(Long courseId, Integer userId) {
-		studentAttendanceDao.cleanCourseStudentSignOut(courseId,userId);
-	}
+            if (courseSchedules.size() > 0) {
+                //获取当前课程老师总上课时长
+                int totalMinutes = teacherAttendanceDao.getTotalMinutes(courseSchedule.getId(), courseSchedule.getActualTeacherId());
+                int firstMinutes = courseScheduleDao.getSingleClassMinutes(courseSchedule.getId());
+                totalMinutes -= firstMinutes;
+                if (totalMinutes > 0) {
+                    String courseClassDate;
+                    String courseStartDateTime;
+                    String courseEndDateTime;
+                    for (CourseSchedule e : courseSchedules) {
+                        //获取当前课程的单节课时长
+                        int signClassMinutes = courseScheduleDao.getSingleClassMinutes(e.getId());
+                        totalMinutes -= signClassMinutes;
+                        if (totalMinutes >= 0) {
+                            //补充签到签退时间
+                            courseClassDate = DateUtil.format(e.getClassDate(), DateUtil.DEFAULT_PATTERN);
+                            courseStartDateTime = DateUtil.format(e.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+                            courseEndDateTime = DateUtil.format(e.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+                            Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+                            Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+                            byCourseId.forEach(student -> {
+                                StudentAttendance byStatusAndCourseScheduleId = studentAttendanceDao.findByStatusAndCourseScheduleId(student.getUserId(), e.getId().intValue());
+                                if (byStatusAndCourseScheduleId == null) {
+                                    byStatusAndCourseScheduleId = new StudentAttendance();
+                                    byStatusAndCourseScheduleId.setSignOutTime(endDateTime);
+                                    byStatusAndCourseScheduleId.setStatus(StudentAttendanceStatusEnum.NORMAL);
+                                    byStatusAndCourseScheduleId.setSignInTime(startDateTime);
+                                    byStatusAndCourseScheduleId.setUpdateTime(date);
+                                    byStatusAndCourseScheduleId.setUserId(student.getUserId());
+                                    byStatusAndCourseScheduleId.setTeacherId(e.getActualTeacherId());
+                                    byStatusAndCourseScheduleId.setClassGroupId(e.getClassGroupId());
+                                    byStatusAndCourseScheduleId.setMusicGroupId(e.getMusicGroupId());
+                                    byStatusAndCourseScheduleId.setGroupType(e.getGroupType());
+                                    byStatusAndCourseScheduleId.setCourseScheduleId(e.getId());
+                                    studentAttendanceDao.insert(byStatusAndCourseScheduleId);
+                                }
+                            });
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public StudentAttendance findByStatusAndCourseScheduleId(Long courseId, Integer userId) {
+        return studentAttendanceDao.findByStatusAndCourseScheduleId(userId, courseId.intValue());
+    }
+
+    @Override
+    public void cleanCourseStudentSignOut(Long courseId, Integer userId) {
+        studentAttendanceDao.cleanCourseStudentSignOut(courseId, userId);
+    }
 }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java

@@ -211,4 +211,9 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
     public StudentPaymentOrderDetail findApplyOrderMusical(Long orderId) {
         return studentPaymentOrderDetailDao.findApplyOrderMusical(orderId);
     }
+
+    @Override
+    public List<String> getOrderDetailType(Long orderId) {
+        return studentPaymentOrderDetailDao.getOrderDetailType(orderId);
+    }
 }

+ 61 - 31
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -277,7 +277,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
     @Override
     @Transactional
-    public StudentPaymentOrder addOrder(StudentRegistration studentRegistration, BigDecimal amount, String orderNo, String paymentChannel, BigDecimal courseFee, List<MusicGroupSubjectGoodsGroup> goodsGroups, List<Goods> goodsList, List<Goods> otherGoodsList) throws Exception {
+    public StudentPaymentOrder addOrder(StudentRegistration studentRegistration, BigDecimal amount, String orderNo, String paymentChannel, BigDecimal courseFee, List<MusicGroupSubjectGoodsGroup> goodsGroups, List<Goods> goodsList, List<Goods> otherGoodsList, List<CourseFormDto> courseForms,BigDecimal remitFee,BigDecimal courseRemitFee) throws Exception {
         Date date = new Date();
         StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
         studentPaymentOrder.setUserId(studentRegistration.getUserId());
@@ -294,7 +294,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         ArrayList<StudentPaymentOrderDetail> studentPaymentOrderDetailList = new ArrayList<>();
         StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
         studentPaymentOrderDetail.setType(OrderDetailTypeEnum.COURSE);
-        studentPaymentOrderDetail.setPrice(courseFee);
+        studentPaymentOrderDetail.setPrice(courseFee.subtract(courseRemitFee));
+        studentPaymentOrderDetail.setRemitFee(courseRemitFee);
         studentPaymentOrderDetail.setCreateTime(date);
         studentPaymentOrderDetail.setUpdateTime(date);
         studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
@@ -302,25 +303,18 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         //乐器及打包辅件
         if (goodsGroups != null && goodsGroups.size() > 0) {
             for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
-                List<Map<String, Object>> goodsPrices = new ArrayList<>();
-                for (Goods goods : goodsGroup.getGoodsList()) {
-                    HashMap<String, Object> goodsPrice = new HashMap<>();
-                    goodsPrice.put("id", goods.getId());
-                    goodsPrice.put("discountPrice", goods.getDiscountPrice());
-                    goodsPrice.put("agreeCostPrice", goods.getAgreeCostPrice());
-                    goodsPrices.add(goodsPrice);
-                }
-
                 StudentPaymentOrderDetail studentPaymentOrderDetail4goodsGroup = new StudentPaymentOrderDetail();
+                studentPaymentOrderDetail4goodsGroup.setRemitFee(BigDecimal.ZERO);
                 OrderDetailTypeEnum type = null;
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
                     type = OrderDetailTypeEnum.MUSICAL;
+                    goodsGroup.setPrice(goodsGroup.getPrice().subtract(remitFee));
+                    studentPaymentOrderDetail4goodsGroup.setRemitFee(remitFee);
                 } else if (goodsGroup.getType().equals(GoodsType.ACCESSORIES)) {
                     type = OrderDetailTypeEnum.ACCESSORIES;
                 } else if (goodsGroup.getType().equals(GoodsType.OTHER)) {
                     type = OrderDetailTypeEnum.TEACHING;
                 }
-                studentPaymentOrderDetail4goodsGroup.setGoodsPrices(JSON.toJSONString(goodsPrices));
                 studentPaymentOrderDetail4goodsGroup.setType(type);
                 studentPaymentOrderDetail4goodsGroup.setPrice(goodsGroup.getPrice());
                 studentPaymentOrderDetail4goodsGroup.setGoodsIdList(goodsGroup.getGoodsIdList());
@@ -334,17 +328,9 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
         //单独辅件
         if (goodsList != null && goodsList.size() > 0) {
-            List<Map<String, Object>> goodsPrices = new ArrayList<>();
             for (Goods goods : goodsList) {
-                HashMap<String, Object> goodsPrice = new HashMap<>();
-                goodsPrice.put("id", goods.getId());
-                goodsPrice.put("discountPrice", goods.getDiscountPrice());
-                goodsPrice.put("agreeCostPrice", goods.getAgreeCostPrice());
-                goodsPrices.add(goodsPrice);
-
                 StudentPaymentOrderDetail studentPaymentOrderDetail4goods = new StudentPaymentOrderDetail();
                 OrderDetailTypeEnum orderDetailType = goods.getType().equals(GoodsType.INSTRUMENT) ? OrderDetailTypeEnum.MUSICAL : OrderDetailTypeEnum.ACCESSORIES;
-                studentPaymentOrderDetail4goods.setGoodsPrices(JSON.toJSONString(goodsPrices));
                 studentPaymentOrderDetail4goods.setType(orderDetailType);
                 studentPaymentOrderDetail4goods.setPrice(goods.getGroupPurchasePrice());
                 studentPaymentOrderDetail4goods.setGoodsIdList(goods.getId().toString());
@@ -356,17 +342,9 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         }
         //单独教谱
         if (otherGoodsList != null && otherGoodsList.size() > 0) {
-            List<Map<String, Object>> goodsPrices = new ArrayList<>();
 
             for (Goods goods : otherGoodsList) {
-                HashMap<String, Object> goodsPrice = new HashMap<>();
-                goodsPrice.put("id", goods.getId());
-                goodsPrice.put("discountPrice", goods.getDiscountPrice());
-                goodsPrice.put("agreeCostPrice_", goods.getAgreeCostPrice());
-                goodsPrices.add(goodsPrice);
-
                 StudentPaymentOrderDetail studentPaymentOrderDetail4otherGoods = new StudentPaymentOrderDetail();
-                studentPaymentOrderDetail4otherGoods.setGoodsPrices(JSON.toJSONString(goodsPrices));
                 studentPaymentOrderDetail4otherGoods.setType(OrderDetailTypeEnum.TEACHING);
                 studentPaymentOrderDetail4otherGoods.setPrice(goods.getGroupPurchasePrice());
                 studentPaymentOrderDetail4otherGoods.setGoodsIdList(goods.getId().toString());
@@ -376,6 +354,30 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 studentPaymentOrderDetailList.add(studentPaymentOrderDetail4otherGoods);
             }
         }
+        //可选课程
+        if (courseForms != null && courseForms.size() > 0) {
+            for (CourseFormDto courseForm : courseForms) {
+                OrderDetailTypeEnum courType = OrderDetailTypeEnum.MUSIC_COURSE;
+                if (courseForm.getType().equals("soundInfo")) {
+                    courType = OrderDetailTypeEnum.MUSIC_COURSE;
+                } else if (courseForm.getType().equals("allInfo")) {
+                    courType = OrderDetailTypeEnum.MIX_COURSE;
+                } else if (courseForm.getType().equals("baseInfo")) {
+                    courType = OrderDetailTypeEnum.HIGH_ONLINE_COURSE;
+                } else if (courseForm.getType().equals("holidayInfo")) {
+                    courType = OrderDetailTypeEnum.HOLIDAY_COURSE;
+                } else if (courseForm.getType().equals("networkInfo")) {
+                    courType = OrderDetailTypeEnum.NETWORK_COURSE;
+                }
+                StudentPaymentOrderDetail studentPaymentOrderDetailCourse = new StudentPaymentOrderDetail();
+                studentPaymentOrderDetailCourse.setType(courType);
+                studentPaymentOrderDetailCourse.setPrice(courseForm.getPrice());
+                studentPaymentOrderDetailCourse.setCreateTime(date);
+                studentPaymentOrderDetailCourse.setUpdateTime(date);
+                studentPaymentOrderDetailCourse.setPaymentOrderId(studentPaymentOrder.getId());
+                studentPaymentOrderDetailList.add(studentPaymentOrderDetailCourse);
+            }
+        }
 
         studentPaymentOrderDetailService.batchAdd(studentPaymentOrderDetailList);
 
@@ -407,7 +409,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
     @Override
     @Transactional
-    public StudentPaymentOrder reAddOrder(Integer userId, BigDecimal amount, String orderNo, String paymentChannel, BigDecimal courseFee, List<MusicGroupSubjectGoodsGroup> goodsGroups, List<Goods> goodsList, List<Goods> otherGoodsList, String musicGroupId, StudentPaymentOrder oldOrder) {
+    public StudentPaymentOrder reAddOrder(Integer userId, BigDecimal amount, String orderNo, String paymentChannel, BigDecimal courseFee, List<MusicGroupSubjectGoodsGroup> goodsGroups, List<Goods> goodsList, List<Goods> otherGoodsList, String musicGroupId, StudentPaymentOrder oldOrder, List<CourseFormDto> courseForms,BigDecimal remitFee,BigDecimal courseRemitFee) {
         //关闭老订单
         oldOrder.setStatus(DealStatusEnum.CLOSE);
         studentPaymentOrderService.update(oldOrder);
@@ -427,10 +429,11 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         studentPaymentOrder.setMusicGroupId(musicGroupId);
         studentPaymentOrderService.insert(studentPaymentOrder);
 
-        ArrayList<StudentPaymentOrderDetail> studentPaymentOrderDetailList = new ArrayList<>();
+        List<StudentPaymentOrderDetail> studentPaymentOrderDetailList = new ArrayList<>();
         StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
         studentPaymentOrderDetail.setType(OrderDetailTypeEnum.COURSE);
-        studentPaymentOrderDetail.setPrice(courseFee);
+        studentPaymentOrderDetail.setPrice(courseFee.subtract(courseRemitFee));
+        studentPaymentOrderDetail.setRemitFee(courseRemitFee);
         studentPaymentOrderDetail.setCreateTime(date);
         studentPaymentOrderDetail.setUpdateTime(date);
         studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
@@ -439,9 +442,12 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         if (goodsGroups != null && goodsGroups.size() > 0) {
             for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
                 StudentPaymentOrderDetail studentPaymentOrderDetail4goodsGroup = new StudentPaymentOrderDetail();
+                studentPaymentOrderDetail4goodsGroup.setRemitFee(BigDecimal.ZERO);
                 OrderDetailTypeEnum type = null;
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
                     type = OrderDetailTypeEnum.MUSICAL;
+                    goodsGroup.setPrice(goodsGroup.getPrice().subtract(remitFee));
+                    studentPaymentOrderDetail4goodsGroup.setRemitFee(remitFee);
                 } else if (goodsGroup.getType().equals(GoodsType.ACCESSORIES)) {
                     type = OrderDetailTypeEnum.ACCESSORIES;
                 } else if (goodsGroup.getType().equals(GoodsType.OTHER)) {
@@ -486,6 +492,30 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 studentPaymentOrderDetailList.add(studentPaymentOrderDetail4otherGoods);
             }
         }
+        //可选课程
+        if (courseForms != null && courseForms.size() > 0) {
+            for (CourseFormDto courseForm : courseForms) {
+                OrderDetailTypeEnum courType = OrderDetailTypeEnum.MUSIC_COURSE;
+                if (courseForm.getType().equals("soundInfo")) {
+                    courType = OrderDetailTypeEnum.MUSIC_COURSE;
+                } else if (courseForm.getType().equals("allInfo")) {
+                    courType = OrderDetailTypeEnum.MIX_COURSE;
+                } else if (courseForm.getType().equals("baseInfo")) {
+                    courType = OrderDetailTypeEnum.HIGH_ONLINE_COURSE;
+                } else if (courseForm.getType().equals("holidayInfo")) {
+                    courType = OrderDetailTypeEnum.HOLIDAY_COURSE;
+                } else if (courseForm.getType().equals("networkInfo")) {
+                    courType = OrderDetailTypeEnum.NETWORK_COURSE;
+                }
+                StudentPaymentOrderDetail studentPaymentOrderDetailCourse = new StudentPaymentOrderDetail();
+                studentPaymentOrderDetailCourse.setType(courType);
+                studentPaymentOrderDetailCourse.setPrice(courseForm.getPrice());
+                studentPaymentOrderDetailCourse.setCreateTime(date);
+                studentPaymentOrderDetailCourse.setUpdateTime(date);
+                studentPaymentOrderDetailCourse.setPaymentOrderId(studentPaymentOrder.getId());
+                studentPaymentOrderDetailList.add(studentPaymentOrderDetailCourse);
+            }
+        }
 
         studentPaymentOrderDetailService.batchAdd(studentPaymentOrderDetailList);
 

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

@@ -121,7 +121,7 @@
 	</select>
 
     <select id="queryByOrganId" resultMap="CooperationOrgan">
-        SELECT * FROM cooperation_organ WHERE FIND_IN_SET(organ_id_,#{organId}) AND del_flag_ != 1
+        SELECT * FROM cooperation_organ WHERE FIND_IN_SET(organ_id_,#{organId}) AND del_flag_ != 1 AND is_enable_ = 1
     </select>
 
     <select id="queryNameByIds" resultType="java.util.Map">

+ 28 - 8
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -3030,15 +3030,15 @@
 
     <select id="getVipGroupExport" resultMap="com.ym.mec.biz.dal.dao.PracticeGroupDao.courseGroupExport">
         SELECT cssp.user_id_ student_id_,
-        su.username_ student_name_,
-        o.name_ organ_name_,
-        GROUP_CONCAT(DISTINCT edut.`real_name_`) edu_teacher_name_,
-        GROUP_CONCAT(DISTINCT edut.`id_`) edu_teacher_ids_
+            su.username_ student_name_,
+            o.name_ organ_name_,
+            GROUP_CONCAT(DISTINCT edut.`real_name_`) edu_teacher_name_,
+            GROUP_CONCAT(DISTINCT edut.`id_`) edu_teacher_ids_
         FROM `course_schedule_student_payment` cssp
-        LEFT JOIN `vip_group` vg ON vg.`id_` = cssp.`music_group_id_` AND cssp.`group_type_` = 'VIP'
-        LEFT JOIN `organization` o ON o.`id_` = vg.`organ_id_`
-        LEFT JOIN `sys_user` su ON su.`id_` = cssp.`user_id_`
-        LEFT JOIN `sys_user` edut ON edut.`id_` = vg.`educational_teacher_id_`
+            LEFT JOIN `vip_group` vg ON vg.`id_` = cssp.`music_group_id_` AND cssp.`group_type_` = 'VIP'
+            LEFT JOIN `organization` o ON o.`id_` = vg.`organ_id_`
+            LEFT JOIN `sys_user` su ON su.`id_` = cssp.`user_id_`
+            LEFT JOIN `sys_user` edut ON edut.`id_` = vg.`educational_teacher_id_`
         WHERE cssp.`group_type_` = 'VIP'
         AND vg.group_status_!=3
         <if test="organIds != null and organIds != ''">
@@ -3063,6 +3063,26 @@
         AND (cs.del_flag_ IS NULL OR cs.del_flag_ =0)
         GROUP BY cssp.user_id_;
     </select>
+
+    <select id="getStudentVipCourseInfo" resultMap="com.ym.mec.biz.dal.dao.PracticeGroupDao.courseGroupExport">
+        SELECT MIN(concat(cs.`class_date_`,' ',cs.`start_class_time_` )) class_start_date_,
+        MAX(concat(cs.`class_date_`,' ',cs.`start_class_time_` )) class_end_date_,cssp.user_id_ student_id_,
+        GROUP_CONCAT(DISTINCT su.`real_name_`) teacher_name_,GROUP_CONCAT(DISTINCT cs.`actual_teacher_id_`) teacher_ids_
+        FROM course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs on cs.id_ = cssp.course_schedule_id_
+        LEFT JOIN sys_user su on cs.actual_teacher_id_ = su.id_
+        LEFT JOIN vip_group vg ON cssp.music_group_id_=vg.id_
+        WHERE cssp.user_id_ IN
+        <foreach collection="studentIds" separator="," open="(" close=")" item="studentId">
+            #{studentId}
+        </foreach>
+        AND cssp.group_type_ = 'VIP'
+        AND vg.group_status_!=3
+        AND (cs.is_lock_ IS NULL OR cs.is_lock_ =0)
+        AND (cs.del_flag_ IS NULL OR cs.del_flag_ =0)
+        GROUP BY cssp.user_id_;
+    </select>
+
     <select id="getLastCourse" resultMap="CourseSchedule">
         SELECT cs.* FROM course_schedule cs
         LEFT JOIN teacher_attendance ta ON cs.id_ = ta.course_schedule_id_ AND ta.teacher_id_ = cs.actual_teacher_id_

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

@@ -640,7 +640,7 @@
 		CASE WHEN cs.type_ = 'SINGLE' THEN '单技课' WHEN cs.type_ = 'MIX' THEN '合奏课' WHEN cs.type_ = 'HIGH' THEN '小班课'  WHEN cs.type_ = 'VIP' THEN 'vip课'
 		WHEN cs.type_ = 'DEMO' THEN '试听课'  WHEN cs.type_ = 'COMPREHENSIVE' THEN '综合课'  WHEN cs.type_ = 'PRACTICE' THEN '练习课'  WHEN cs.type_ = 'ENLIGHTENMENT' THEN '启蒙课'
 		WHEN cs.type_ = 'TRAINING_SINGLE' THEN '集训单技课'  WHEN cs.type_ = 'TRAINING_MIX' THEN '集训合奏课' WHEN cs.type_ = 'CLASSROOM' THEN '课堂课'
-		WHEN cs.type_ = 'COMM' THEN '对外课程'  WHEN cs.type_ = 'HIGH_ONLINE' THEN '线上基础技能课'  ELSE '乐团网管课' END courseScheduleType,
+		WHEN cs.type_ = 'COMM' THEN '对外课程'  WHEN cs.type_ = 'HIGH_ONLINE' THEN '网络基础训练课'  ELSE '乐团网管课' END courseScheduleType,
 		cs.class_date_ classDate,cs.start_class_time_ courseScheduleStartTime,cs.end_class_time_ courseScheduleEndTime,
 		ROUND((UNIX_TIMESTAMP(cs.end_class_time_)-UNIX_TIMESTAMP(cs.start_class_time_))/60) signCourseScheduleTime,
 		ts.actual_salary_ price,CASE WHEN s.name_ IS NULL THEN '网络教室' ELSE s.name_ END address,

+ 38 - 22
mec-biz/src/main/resources/config/mybatis/EmployeeInfoMapper.xml

@@ -18,19 +18,24 @@
 		<result column="live_city_" property="liveCity" />
 		<result column="intention_city_" property="intentionCity" />
 		<result column="educational_background_" property="educationalBackground" />
-		<result column="subject_id_" property="subjectId" />
-		<result column="is_interviewed_" property="isInterviewed" />
+		<result column="subject_id_list_" property="subjectIdList" />
+		<result column="assessment_result_" property="assessmentResult" />
 		<result column="other_comment_" property="otherComment" />
 		<result column="entry_date_" property="entryDate" />
 		<result column="position_" property="position" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
-		<result column="job_nature_" property="jobNature" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
+		<result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
 		<result column="is_probation_period_" property="isProbationPeriod" />
 		<result column="bank_card_no_" property="bankCardNo" />
 		<result column="bank_address_" property="bankAddress" />
 		<result column="resignation_date_" property="resignationDate" />
 		<result column="organ_id_" property="organId" />
+		<result column="operator_id_" property="operatorId" />
+		<result column="source_from_" property="sourceFrom" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
+		<result column="organName" property="organName" />
+		<result column="subjectName" property="subjectName" />
+		<result column="operatorName" property="operatorName" />
 	</resultMap>
 
 	<!-- 根据主键查询一条记录 -->
@@ -51,8 +56,8 @@
 		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
 			AS ID FROM DUAL </selectKey> -->
 		INSERT INTO employee_info
-		(id_,real_name_,mobile_no_,wechat_no_,id_card_,age_,gender_,birthdate_,emergency_contact_name_,emergency_contact_relation_,emergency_contact_phone_,live_city_,intention_city_,educational_background_,subject_id_,is_interviewed_,other_comment_,entry_date_,organ_id_,position_,job_nature_,is_probation_period_,bank_card_no_,bank_address_,resignation_date_,create_time_,update_time_)
-		VALUES(#{id},#{realName},#{mobileNo},#{wechatNo},#{idCard},#{age},#{gender},#{birthdate},#{emergencyContactName},#{emergencyContactRelation},#{emergencyContactPhone},#{liveCity},#{intentionCity},#{educationalBackground},#{subjectId},#{isInterviewed},#{otherComment},#{entryDate},#{organId},#{position,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{jobNature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{isProbationPeriod},#{bankCardNo},#{bankAddress},#{resignationDate},#{createTime},#{updateTime})
+		(id_,real_name_,mobile_no_,wechat_no_,id_card_,age_,gender_,birthdate_,emergency_contact_name_,emergency_contact_relation_,emergency_contact_phone_,live_city_,intention_city_,educational_background_,subject_id_list_,assessment_result_,other_comment_,entry_date_,organ_id_,position_,status_,is_probation_period_,bank_card_no_,bank_address_,resignation_date_,operator_id_,source_from_,create_time_,update_time_)
+		VALUES(#{id},#{realName},#{mobileNo},#{wechatNo},#{idCard},#{age},#{gender},#{birthdate},#{emergencyContactName},#{emergencyContactRelation},#{emergencyContactPhone},#{liveCity},#{intentionCity},#{educationalBackground},#{subjectIdList},#{assessmentResult},#{otherComment},#{entryDate},#{organId},#{position,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{isProbationPeriod},#{bankCardNo},#{bankAddress},#{resignationDate},#{operatorId},#{sourceFrom},#{createTime},#{updateTime})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -62,8 +67,8 @@
 			<if test="isProbationPeriod != null">
 				is_probation_period_ = #{isProbationPeriod},
 			</if>
-			<if test="subjectId != null">
-				subject_id_ = #{subjectId},
+			<if test="subjectIdList != null">
+				subject_id_list_ = #{subjectIdList},
 			</if>
 			<if test="gender != null">
 				gender_ = #{gender},
@@ -74,8 +79,8 @@
 			<if test="otherComment != null">
 				other_comment_ = #{otherComment},
 			</if>
-			<if test="jobNature != null">
-				job_nature_ = #{jobNature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			<if test="status != null">
+				status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
 			</if>
 			<if test="educationalBackground != null">
 				educational_background_ = #{educationalBackground},
@@ -83,9 +88,7 @@
 			<if test="emergencyContactPhone != null">
 				emergency_contact_phone_ = #{emergencyContactPhone},
 			</if>
-			<if test="resignationDate != null">
 				resignation_date_ = #{resignationDate},
-			</if>
 			<if test="position != null">
 				position_ = #{position,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
 			</if>
@@ -122,8 +125,8 @@
 			<if test="wechatNo != null">
 				wechat_no_ = #{wechatNo},
 			</if>
-			<if test="isInterviewed != null">
-				is_interviewed_ = #{isInterviewed},
+			<if test="assessmentResult != null">
+				assessment_result_ = #{assessmentResult},
 			</if>
 			<if test="mobileNo != null">
 				mobile_no_ = #{mobileNo},
@@ -140,6 +143,12 @@
 			<if test="organId != null">
 				organ_id_ = #{organId},
 			</if>
+			<if test="operatorId != null">
+				operator_id_ = #{operatorId},
+			</if>
+			<if test="sourceFrom != null">
+				source_from_ = #{sourceFrom},
+			</if>
 		</set>
 		WHERE id_ = #{id}
 	</update>
@@ -152,34 +161,41 @@
 	<sql id="queryPageMap">
 		<where>
 			<if test="organId != null">
-            	AND organ_id_ = #{organId}
+            	AND ei.organ_id_ = #{organId}
 	        </if>
 	        <if test="userNameOrIdOrMobile != null">
-	            AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%') OR t.id_ = #{search})
+	            AND (ei.real_name_ LIKE CONCAT('%',#{userNameOrIdOrMobile},'%') OR ei.mobile_no_ LIKE CONCAT('%',#{userNameOrIdOrMobile},'%') OR ei.id_ = #{userNameOrIdOrMobile})
 	        </if>
 	        <if test="subjectId != null">
-	            AND subject_id_ = #{subjectId}
+	            AND find_in_set(#{subjectId},ei.subject_id_list_)
+	        </if>
+	        <if test="sourceFrom != null">
+	            AND ei.source_from_ = #{sourceFrom}
 	        </if>
 	        <if test="position != null">
-	            AND position_ = #{position,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+	            AND ei.position_ = #{position,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 	        </if>
-	        <if test="jobNature != null">
-	            AND job_nature_ = #{jobNature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+	        <if test="status != null">
+	            AND ei.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 	        </if>
 		</where>
     </sql>
 
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="EmployeeInfo" parameterType="map">
-		SELECT * FROM employee_info 
+		SELECT o.name_ organName,group_concat(s.name_) subjectName,u.real_name_ operatorName,ei.* FROM employee_info ei
+		left join subject s on find_in_set(s.id_,ei.subject_id_list_)
+		left join organization o on o.id_ = ei.organ_id_
+		left join sys_user u on u.id_ = ei.operator_id_
         <include refid="queryPageMap"/>
-		ORDER BY id_
+        GROUP BY ei.id_
+		ORDER BY ei.update_time_
 		<include refid="global.limit" />
 	</select>
 
 	<!-- 查询当前表的总记录数 -->
 	<select id="queryCount" resultType="int">
-		SELECT COUNT(*) FROM employee_info
+		SELECT COUNT(ei.id_) FROM employee_info ei
         <include refid="queryPageMap"/>
 	</select>
 </mapper>

+ 71 - 7
mec-biz/src/main/resources/config/mybatis/FinancialExpenditureMapper.xml

@@ -53,7 +53,7 @@
 
     <!-- 根据主键查询一条记录 -->
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.FinancialExpenditure">
-        UPDATE charge_type
+        UPDATE financial_expenditure
         <set>
             <if test="delFlag != null">
                 del_flag_ = #{delFlag},
@@ -94,19 +94,83 @@
     </update>
 
     <!-- 根据主键删除一条记录 -->
-    <delete id="delete">
-		UPDATE charge_type SET del_flag_ = 1 WHERE id_ = #{id}
-	</delete>
+    <update id="delete">
+		UPDATE financial_expenditure SET del_flag_ = 1 WHERE id_ = #{id}
+	</update>
+    <update id="batchDel">
+        UPDATE financial_expenditure SET del_flag_ = 1 WHERE FIND_IN_SET(id_,#{ids})
+    </update>
+
+    <sql id="queryPageSql">
+        <where>
+            fe.del_flag_ = 0
+            <if test="batchNo != null and batchNo != ''">
+                AND fe.batch_no_ = #{batchNo}
+            </if>
+            <if test="financialProcessNo != null and financialProcessNo != ''">
+                AND fe.financial_process_no_ = #{financialProcessNo}
+            </if>
+            <if test="dingtalkProcessNo != null and dingtalkProcessNo != ''">
+                AND fe.dingtalk_process_no_ = #{dingtalkProcessNo}
+            </if>
+            <if test="search != null and search != ''">
+                AND (fe.batch_no_ LIKE CONCAT('%',#{search},'%') OR fe.financial_process_no_ LIKE CONCAT('%',#{search},'%')
+                OR fe.dingtalk_process_no_ LIKE CONCAT('%',#{search},'%') OR su.real_name_ LIKE CONCAT('%',#{search},'%'))
+            </if>
+            <if test="organId != null">
+                AND fe.organ_id_ = #{organId}
+            </if>
+            <if test="cooperationOrganId != null">
+                AND fe.cooperation_organ_id_ = #{cooperationOrganId}
+            </if>
+            <if test="applyUserId != null">
+                AND fe.apply_user_id_ = #{applyUserId}
+            </if>
+            <if test="startTime != null and startTime != ''">
+                AND DATE_FORMAT(fe.payment_time_,'%Y%m%d') &gt;= #{startTime}
+            </if>
+            <if test="endTime != null and endTime != ''">
+                AND DATE_FORMAT(fe.payment_time_,'%Y%m%d') &lt;= #{endTime}
+            </if>
+        </where>
+    </sql>
 
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="FinancialExpenditure" parameterType="map">
-        SELECT * FROM financial_expenditure
-        WHERE del_flag_ = 0
+        SELECT fe.*,o.name_ organ_name_,co.name_ cooperation_name_,su.real_name_
+        FROM financial_expenditure fe
+        LEFT JOIN organization o ON o.id_ = fe.organ_id_
+        LEFT JOIN sys_user su ON su.id_ = fe.apply_user_id_
+        LEFT JOIN cooperation_organ co ON co.id_ = fe.cooperation_organ_id_
+        <include refid="queryPageSql"/>
         <include refid="global.limit"/>
     </select>
 
     <!-- 查询当前表的总记录数 -->
     <select id="queryCount" resultType="int">
-		SELECT COUNT(*) FROM financial_expenditure WHERE del_flag_ = 0
+		SELECT COUNT(DISTINCT fe.id_) FROM financial_expenditure fe
+        LEFT JOIN sys_user su ON su.id_ = fe.apply_user_id_
+        <include refid="queryPageSql"/>
 	</select>
+
+    <resultMap type="com.ym.mec.biz.dal.dto.FinancialExpenditureDto" id="FinancialExpenditureDto" extends="FinancialExpenditure">
+        <result column="organ_name_" property="organName"/>
+        <result column="cooperation_name_" property="cooperationName"/>
+        <result column="real_name_" property="realName"/>
+    </resultMap>
+
+    <select id="findFinancialExpenditureCount" resultType="java.lang.Integer">
+        SELECT COUNT(DISTINCT fe.id_) FROM financial_expenditure fe
+        LEFT JOIN sys_user su ON su.id_ = fe.apply_user_id_
+        <include refid="queryPageSql"/>
+    </select>
+    <select id="queryFinancialExpenditurePage" resultMap="FinancialExpenditureDto">
+        SELECT fe.*,o.name_ organ_name_,co.name_ cooperation_name_,su.real_name_
+        FROM financial_expenditure fe
+        LEFT JOIN organization o ON o.id_ = fe.organ_id_
+        LEFT JOIN sys_user su ON su.id_ = fe.apply_user_id_
+        LEFT JOIN cooperation_organ co ON co.id_ = fe.cooperation_organ_id_
+        <include refid="queryPageSql"/>
+        <include refid="global.limit"/>
+    </select>
 </mapper>

+ 5 - 2
mec-biz/src/main/resources/config/mybatis/GoodsMapper.xml

@@ -59,12 +59,12 @@
     <insert id="batchInsert">
         INSERT INTO goods
         (goods_category_id_,name_,brand_,specification_,image_,market_price_,
-        discount_price_,group_purchase_price_,desc_,update_time_,create_time_,type_,agree_cost_price_)
+        discount_price_,group_purchase_price_,desc_,update_time_,create_time_,type_,agree_cost_price_,sn_)
         VALUES
         <foreach collection="goodsList" separator="," item="goods">
             (#{goods.goodsCategoryId},#{goods.name},#{goods.brand},#{goods.specification},#{goods.image},#{goods.marketPrice},
             #{goods.discountPrice},#{goods.groupPurchasePrice},#{goods.desc},now(),now(),
-            #{goods.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{goods.agreeCostPrice})
+            #{goods.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{goods.agreeCostPrice},#{goods.sn})
         </foreach>
     </insert>
     <!-- 根据主键查询一条记录 -->
@@ -160,6 +160,9 @@
             <if test="goodsCategoryId != null">
                 g.goods_category_id_ = #{goodsCategoryId}
             </if>
+            <if test="type != null">
+                g.type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
             <if test="isNew != null">
                 g.is_new_ = #{isNew,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>

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

@@ -592,8 +592,8 @@
         mg.id_ music_group_id_
         FROM music_group mg
         WHERE mg.status_ IN ('APPLY','PAY','PREPARE','PROGRESS')
-        <if test="organId != null and organId != ''">
-            AND FIND_IN_SET(mg.organ_id_,#{organId})
+        <if test="organId != null">
+            AND mg.organ_id_ = #{organId}
         </if>
         ORDER BY mg.create_time_ DESC
     </select>

+ 5 - 4
mec-biz/src/main/resources/config/mybatis/MusicGroupSubjectGoodsGroupMapper.xml

@@ -18,6 +18,7 @@
         <result column="deposit_fee_" property="depositFee"/>
         <result column="remission_course_fee_" property="remissionCourseFee"/>
         <result column="kit_group_purchase_type_json_" property="kitGroupPurchaseTypeJson"/>
+        <result column="course_purchase_type_json_" property="coursePurchaseTypeJson"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -38,16 +39,16 @@
             parameterType="com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup"
             useGeneratedKeys="true" keyColumn="id" keyProperty="id">
         INSERT INTO music_group_subject_goods_group
-        (id_,name_,type_,music_group_id_,subject_id_,goods_id_list_,create_time_,update_time_,price_,deposit_fee_,remission_course_fee_,kit_group_purchase_type_json_)
-        VALUES(#{id},#{name},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{musicGroupId},#{subjectId},#{goodsIdList},NOW(),NOW(),#{price},#{depositFee},#{remissionCourseFee},#{kitGroupPurchaseTypeJson})
+        (id_,name_,type_,music_group_id_,subject_id_,goods_id_list_,create_time_,update_time_,price_,deposit_fee_,remission_course_fee_,kit_group_purchase_type_json_,course_purchase_type_json_)
+        VALUES(#{id},#{name},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{musicGroupId},#{subjectId},#{goodsIdList},NOW(),NOW(),#{price},#{depositFee},#{remissionCourseFee},#{kitGroupPurchaseTypeJson},#{coursePurchaseTypeJson})
     </insert>
 
     <insert id="batchInsert" parameterType="java.util.List">
         INSERT INTO music_group_subject_goods_group
-        (name_,type_,music_group_id_,subject_id_,goods_id_list_,create_time_,update_time_,price_,deposit_fee_,remission_course_fee_,kit_group_purchase_type_json_) VALUES
+        (name_,type_,music_group_id_,subject_id_,goods_id_list_,create_time_,update_time_,price_,deposit_fee_,remission_course_fee_,kit_group_purchase_type_json_,course_purchase_type_json_) VALUES
         <foreach collection="lists" item="item" index="index" separator=",">
             (#{item.name},#{item.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-            #{musicGroupId},#{item.subjectId},#{item.goodsIdList},now(),now(),#{item.price},#{item.depositFee},#{item.remissionCourseFee},#{item.kitGroupPurchaseTypeJson})
+            #{musicGroupId},#{item.subjectId},#{item.goodsIdList},now(),now(),#{item.price},#{item.depositFee},#{item.remissionCourseFee},#{item.kitGroupPurchaseTypeJson},#{item.coursePurchaseTypeJson})
         </foreach>
     </insert>
 

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

@@ -18,6 +18,7 @@
         <result column="linkman_" property="linkman"/>
         <result column="mobile_" property="mobile"/>
         <result column="address_" property="address"/>
+        <result column="full_job_resource_" property="fullJobResource"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -33,8 +34,8 @@
     <!-- 向数据库增加一条记录 -->
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.Organization" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
-        INSERT INTO organization (id_,name_,area_id_,create_time_,update_time_,register_date_,linkman_,mobile_,address_)
-        VALUES(#{id},#{name},#{areaId},now(),now(),#{registerDate},#{linkman},#{mobile},#{address})
+        INSERT INTO organization (id_,name_,area_id_,create_time_,update_time_,register_date_,linkman_,mobile_,address_,full_job_resource_)
+        VALUES(#{id},#{name},#{areaId},now(),now(),#{registerDate},#{linkman},#{mobile},#{address},#{fullJobResource})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -44,6 +45,9 @@
             <if test="delFlag != null">
                 del_flag_ = #{delFlag,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
+            <if test="fullJobResource != null">
+                full_job_resource_ = #{fullJobResource},
+            </if>
             <if test="areaId != null">
                 area_id_ = #{areaId},
             </if>
@@ -76,6 +80,9 @@
 
     <sql id="queryPageSql">
         <where>
+            <if test="fullJobResource != null">
+                and o.full_job_resource_ = #{fullJobResource}
+            </if>
             <if test="delFlag != null">
                 and o.del_flag_ = #{delFlag,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>

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

@@ -122,7 +122,7 @@
     <select id="queryByOrganId" resultMap="School">
         SELECT * FROM school
         <where>
-            del_flag_ != 1 and user_id_ is null
+            del_flag_ = 0 and user_id_ is null
             <if test="organId != null">
                 AND FIND_IN_SET(organ_id_,#{organId})
             </if>

+ 6 - 2
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderDetailMapper.xml

@@ -88,11 +88,11 @@
 
     <insert id="batchAdd" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id_">
         INSERT INTO student_payment_order_detail
-        (id_,type_,goods_id_list_,price_,create_time_,update_time_,payment_order_id_,kit_group_purchase_type_)
+        (id_,type_,goods_id_list_,price_,remit_fee_,create_time_,update_time_,payment_order_id_,kit_group_purchase_type_)
         VALUES
         <foreach collection="studentPaymentOrderDetailList" item="orderDetail" separator=",">
             (#{orderDetail.id},#{orderDetail.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-            #{orderDetail.goodsIdList},#{orderDetail.price},now(),now(),#{orderDetail.paymentOrderId},
+            #{orderDetail.goodsIdList},#{orderDetail.price},#{orderDetail.remitFee},now(),now(),#{orderDetail.paymentOrderId},
             #{orderDetail.kitGroupPurchaseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
         </foreach>
     </insert>
@@ -163,4 +163,8 @@
     <select id="findApplyOrderMusical" resultMap="StudentPaymentOrderDetail">
         SELECT * FROM student_payment_order_detail WHERE payment_order_id_ = #{orderId} AND type_ = 'MUSICAL' LIMIT 1
     </select>
+
+    <select id="getOrderDetailType" resultType="java.lang.String">
+        SELECT DISTINCT type_ FROM student_payment_order_detail WHERE payment_order_id_ = #{orderId}
+    </select>
 </mapper>

+ 6 - 2
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -18,6 +18,7 @@
         <result column="per_amount_" property="perAmount"/>
         <result column="balance_payment_amount_" property="balancePaymentAmount"/>
         <result column="remit_fee_" property="remitFee"/>
+        <result column="course_remit_fee_" property="courseRemitFee"/>
         <result column="trans_no_" property="transNo"/>
         <result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="memo_" property="memo"/>
@@ -85,14 +86,14 @@
         INSERT INTO student_payment_order
         (id_, group_type_, user_id_, organ_id_, routing_organ_id_, type_, expect_amount_, actual_amount_, com_amount_,
          per_amount_,
-         balance_payment_amount_, remit_fee_, trans_no_,
+         balance_payment_amount_, remit_fee_,course_remit_fee_, trans_no_,
          status_, memo_, create_time_, update_time_, payment_channel_, payment_business_channel_,
          payment_account_no_, mer_nos_, order_no_, music_group_id_, class_group_id_, pay_time_)
         VALUES (#{id}, #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 #{userId}, #{organId}, #{routingOrganId},
                 #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 #{expectAmount}, #{actualAmount}, #{comAmount}, #{perAmount}, #{balancePaymentAmount},
-                #{remitFee}, #{transNo},
+                #{remitFee},#{courseRemitFee}, #{transNo},
                 #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{memo}, now(), now(),
                 #{paymentChannel}, #{paymentBusinessChannel}, #{paymentAccountNo}, #{merNos}, #{orderNo},
                 #{musicGroupId},
@@ -157,6 +158,9 @@
             <if test="remitFee != null">
                 remit_fee_ = #{remitFee},
             </if>
+            <if test="courseRemitFee != null">
+                course_remit_fee_ = #{courseRemitFee},
+            </if>
             <if test="type != null">
                 type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>

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

@@ -302,9 +302,10 @@
 		FROM student_payment_order spo
         LEFT JOIN student_payment_order_detail spod ON spod.payment_order_id_ = spo.id_
         LEFT JOIN goods g ON FIND_IN_SET(g.id_,spod.goods_id_list_)
-        WHERE spo.type_ = 'APPLY' AND spo.group_type_ = 'MUSIC' AND spo.user_id_ = #{studentId} AND spo.music_group_id_ = #{musicGroupId}
+        WHERE spo.type_ = 'APPLY' AND spo.group_type_ = 'MUSIC' AND spo.user_id_ = #{studentId} AND spo.music_group_id_ = #{musicGroupId} AND spo.status_='SUCCESS'
         GROUP BY spo.id_,spod.type_
         ORDER BY spo.id_ DESC
+        LIMIT 1
     </select>
 
     <!-- 根据乐团和声部获取未分班的学生 -->

+ 6 - 2
mec-biz/src/main/resources/config/mybatis/StudentRepairMapper.xml

@@ -30,6 +30,7 @@
         <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
         <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime"/>
         <result column="username_" jdbcType="VARCHAR" property="studentName"/>
+        <result column="goods_json_" jdbcType="VARCHAR" property="goodsJson"/>
     </resultMap>
     <!-- 根据主键查询一条记录 -->
     <select id="get" resultMap="StudentRepair">
@@ -48,7 +49,7 @@
         description_, amount_, finish_time_,
         send_type_, contact_name_, contact_mobile_,
         address_, pay_status_, create_time_,
-        update_time_,repair_status_)
+        update_time_,repair_status_,goods_json_)
         values (#{id,jdbcType=INTEGER}, #{transNo,jdbcType=VARCHAR}, #{organId,jdbcType=INTEGER},
         #{studentId,jdbcType=INTEGER}, #{studentName,jdbcType=VARCHAR}, #{studentSchool,jdbcType=VARCHAR},
         #{employeeId,jdbcType=INTEGER}, #{employeeName,jdbcType=VARCHAR}, #{subjectId,jdbcType=INTEGER},
@@ -56,11 +57,14 @@
         #{feeList,jdbcType=VARCHAR},#{description,jdbcType=VARCHAR}, #{amount,jdbcType=DECIMAL},
         #{finishTime,jdbcType=TIMESTAMP},#{sendType,jdbcType=INTEGER}, #{contactName,jdbcType=VARCHAR},
         #{contactMobile,jdbcType=VARCHAR},#{address,jdbcType=VARCHAR}, #{payStatus,jdbcType=INTEGER},
-        #{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP},#{repairStatus})
+        #{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP},#{repairStatus},#{goodsJson})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentRepair">
         UPDATE student_repair
         <set>
+            <if test="goodsJson != null">
+                goods_json_ = #{goodsJson},
+            </if>
             <if test="transNo != null">
                 trans_no_ = #{transNo},
             </if>

+ 5 - 0
mec-im/pom.xml

@@ -96,6 +96,11 @@
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
     </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-all</artifactId>
+      <version>4.1.24.Final</version>
+    </dependency>
   </dependencies>
 
   <build>

+ 1 - 0
mec-im/src/main/java/com/ym/common/ErrorEnum.java

@@ -17,6 +17,7 @@ public enum ErrorEnum {
     ERR_IM_TOKEN_ERROR(10, "IM token error"),
     ERR_CREATE_ROOM_ERROR(11, "Create room error"),
     ERR_JOIN_ROOM_ERROR(12, "Join room error"),
+    JOIN_ROOM_ERROR(35, "Join room error"),
     ERR_MESSAGE_ERROR(13, "IM Message send error"),
 
 

+ 4 - 3
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -22,6 +22,7 @@ import com.ym.mec.biz.dal.entity.TeacherAttendance;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.SignStatusEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
+import com.ym.mec.biz.dal.enums.TeachModeEnum;
 import com.ym.mec.biz.service.StudentAttendanceService;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.TeacherAttendanceService;
@@ -124,6 +125,9 @@ public class RoomServiceImpl implements RoomService {
         String userId = sysUser.getId().toString();
         Teacher teacher = teacherDao.get(Integer.parseInt(userId));
         CourseSchedule courseSchedule = courseScheduleDao.get(Long.parseLong(roomId));
+        /*if(courseSchedule.getTeachMode() == TeachModeEnum.OFFLINE){
+            throw new ApiException(ErrorEnum.JOIN_ROOM_ERROR, "加入房间失败,请前往线下教室");
+        }*/
         if(teacher != null && userId.equals(courseSchedule.getActualTeacherId())){
             courseScheduleStudentPaymentDao.adjustPlayMidi(Long.parseLong(roomId),null,null);
             userName = sysUser.getRealName();
@@ -161,9 +165,6 @@ public class RoomServiceImpl implements RoomService {
                 log.error("joinRoom IM error: roomId={}, {}", roomId, resultInfo.getErrorMessage());
                 throw new ApiException(ErrorEnum.ERR_CREATE_ROOM_ERROR, resultInfo.getErrorMessage());
             }
-//            else {
-//                scheduleManager.addExpiredTask(this, roomId);
-//            }
         } else {
             display = roomList.get(0).getDisplay();
         }

+ 6 - 2
mec-student/src/main/java/com/ym/mec/student/controller/RepairController.java

@@ -6,7 +6,9 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.StudentRepair;
+import com.ym.mec.biz.dal.page.GoodsQueryInfo;
 import com.ym.mec.biz.dal.page.RepairStudentQueryInfo;
+import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.biz.service.StudentRepairService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -14,6 +16,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -32,6 +35,9 @@ public class RepairController extends BaseController {
     @Autowired
     private StudentRepairService studentRepairService;
 
+    @Autowired
+    private GoodsService goodsService;
+
     @ApiOperation("获取维修记录")
     @GetMapping(value = "/getStudentRepairList")
     public HttpResponseResult getStudentRepairList(RepairStudentQueryInfo queryInfo) {
@@ -80,6 +86,4 @@ public class RepairController extends BaseController {
         }
         return succeed(studentRepairService.getStudentRepairer(sysUser.getId(),sysUser.getOrganId()));
     }
-
-
 }

+ 1 - 17
mec-student/src/main/java/com/ym/mec/student/controller/SporadicChargeInfoController.java

@@ -33,8 +33,6 @@ public class SporadicChargeInfoController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
     @Autowired
-    private SysUserCashAccountDao sysUserCashAccountDao;
-    @Autowired
     private StudentPaymentOrderService studentPaymentOrderService;
     @Autowired
     private MusicGroupService musicGroupService;
@@ -42,21 +40,7 @@ public class SporadicChargeInfoController extends BaseController {
     @ApiOperation(value = "单查询")
     @GetMapping("/get")
     public Object get(Integer id, Integer userId) {
-        if (userId == null) {
-            SysUser sysUser = sysUserFeignService.queryUserInfo();
-            if (sysUser == null || sysUser.getId() == null) {
-                return failed("用户不存在");
-            }
-            userId = sysUser.getId();
-        }
-        SporadicChargeInfo chargeInfo = sporadicChargeInfoService.get(id);
-        if (chargeInfo != null) {
-            SysUserCashAccount locked = sysUserCashAccountDao.getLocked(userId);
-            chargeInfo.setBalance(locked.getBalance());
-        } else {
-            throw new BizException("信息不存在");
-        }
-        return succeed(chargeInfo);
+        return succeed(sporadicChargeInfoService.findDetail(id,userId));
     }
 
 

+ 2 - 0
mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -129,9 +129,11 @@ public class StudentOrderController extends BaseController {
         if (orderByOrderNo.getGroupType().equals(GroupType.MUSIC)) {
             MusicGroup musicGroup = musicGroupService.get(orderByOrderNo.getMusicGroupId());
             List<Goods> goodsList = studentPaymentOrderDetailService.findApplyOrderGoods(orderByOrderNo.getId());
+            List<String> orderDetailType = studentPaymentOrderDetailService.getOrderDetailType(orderByOrderNo.getId());
             orderDetail.put("goods", goodsList);
             orderDetail.put("course", musicGroup.getCourseForm());
             orderDetail.put("ownershipType", musicGroup.getOwnershipType());
+            orderDetail.put("detailType",orderDetailType);
         } else if (orderByOrderNo.getGroupType().equals(GroupType.VIP)) {
             VipBuyResultDto vipBuyResultInfo = vipGroupService.findVipBuyResultInfo(Integer.valueOf(orderByOrderNo.getMusicGroupId()));
             orderDetail.put("detail", vipBuyResultInfo);

+ 9 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java

@@ -4,6 +4,7 @@ import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
 import com.ym.mec.biz.dal.dao.StudentAttendanceDao;
+import com.ym.mec.biz.dal.dto.BatchInsertCoursesDto;
 import com.ym.mec.biz.dal.dto.ClassDateAdjustDto;
 import com.ym.mec.biz.dal.dto.CourseScheduleDto;
 import com.ym.mec.biz.dal.dto.TeacherRemarkCommitDto;
@@ -30,6 +31,7 @@ import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.text.SimpleDateFormat;
@@ -166,6 +168,13 @@ public class TeacherCourseScheduleController extends BaseController {
         return succeed(studentAttendanceService.getCurrentCourseStudents(queryInfo));
     }
 
+    @ApiOperation(value = "课程批量调整")
+    @PostMapping("/batchUpdateCourseSchedule")
+    public Object batchUpdateCourseSchedule(@RequestBody BatchInsertCoursesDto batchInsertCoursesDto){
+        scheduleService.batchUpdateCourseSchedule(batchInsertCoursesDto);
+        return succeed();
+    }
+
     @ApiOperation(value = "课时调整")
     @PostMapping(value = "/classStartDateAdjust",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
     public Object classStartDateAdjust(ClassDateAdjustDto classDateAdjustDto){

+ 7 - 36
mec-util/src/main/java/com/ym/mec/util/excel/POIUtil.java

@@ -13,10 +13,7 @@ import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.text.SimpleDateFormat;
@@ -426,37 +423,15 @@ public class POIUtil {
 	 * @return
 	 * @throws IOException
 	 */
-	public static Map<String, List<Map<String, Object>>> importExcel(InputStream inputStream, int startRowNum, String extName) throws IOException {
-
-		Map<String, List<Map<String, Object>>> result = new HashMap<String, List<Map<String, Object>>>();
-
-		Workbook workbook = null;
-
-		try {
-			if (extName.endsWith(".xlsx")) {
-				// 支持excel2007 xlsx格式
-				workbook = new XSSFWorkbook(inputStream);
-			} else if (extName.endsWith(".xls")) {
-				// 支持excel2003以前 xls格式
-				workbook = new HSSFWorkbook(inputStream);
-			} else {
-				throw new UtilException("excel文件的扩展名是.xls or .xlsx!");
-			}
-		} catch (Exception ex) {
-			LOGGER.error("excel open error.", ex);
-			return result;
-		} finally {
-			if (inputStream != null) {
-				inputStream.close();
-			}
-		}
+	public static Map<String, List<Map<String, Object>>> importExcel(InputStream inputStream, int startRowNum, String extName) throws Exception {
 
+		Map<String, List<Map<String, Object>>> result = new HashMap<>();
+		Workbook workbook = WorkbookFactory.create(inputStream);
 		int sheetCount = workbook.getNumberOfSheets();
 		Sheet sheet = null;
 		Row row = null;
 		Cell cell = null;
 		int currentRowNum = 0, currentCellNum = 0;
-		// Object fieldValue = null;
 		Iterator<Row> rowIter = null;
 		Iterator<Cell> cellIter = null;
 
@@ -468,9 +443,9 @@ public class POIUtil {
 			sheet = workbook.getSheetAt(i);
 
 			Map<String, List<PictureData>> picMap = null;
-			if (extName.endsWith(".xlsx")) {
+			if(sheet instanceof  XSSFSheet){
 				picMap = getXlsxPictures((XSSFSheet) sheet);
-			} else if (extName.endsWith(".xls")) {
+			}else if(sheet instanceof  HSSFSheet){
 				picMap = getXlsPictures((HSSFSheet) sheet);
 			}
 
@@ -487,7 +462,6 @@ public class POIUtil {
 					if (currentRowNum == 1) {// 第一列表示英文名称对应表字段
 						cellIter = row.iterator();
 						// 列号清零
-						currentCellNum = 0;
 						List<String> names = new ArrayList<String>();
 						while (cellIter.hasNext()) {
 							cell = cellIter.next();
@@ -496,15 +470,12 @@ public class POIUtil {
 						fieldsName = names.toArray(new String[names.size()]);
 						continue;
 					}
-
 					// 跳过指定的行
 					if (currentRowNum < startRowNum) {
 						continue;
 					}
-
 					// 实例化对象
-					obj = new HashMap<String, Object>();// clazz.newInstance();
-
+					obj = new HashMap<>();
 					cellIter = row.iterator();
 					// 列号清零
 					currentCellNum = 0;

+ 16 - 0
mec-web/src/main/java/com/ym/mec/web/controller/EmployeeInfoController.java

@@ -13,6 +13,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.EmployeeInfo;
 import com.ym.mec.biz.dal.page.EmployeeInfoQueryInfo;
 import com.ym.mec.biz.service.EmployeeInfoService;
@@ -25,11 +27,20 @@ public class EmployeeInfoController extends BaseController {
 
     @Autowired
     private EmployeeInfoService employeeInfoService;
+    
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
 
     @ApiOperation(value = "新增员工信息")
     @PostMapping("/insert")
     @PreAuthorize("@pcs.hasPermissions('employeeInfo/insert')")
     public Object insert(@RequestBody EmployeeInfo employeeInfo) {
+    	SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		employeeInfo.setOperatorId(sysUser.getId());
     	Date date = new Date();
     	employeeInfo.setUpdateTime(date);
     	employeeInfo.setCreateTime(date);
@@ -41,6 +52,11 @@ public class EmployeeInfoController extends BaseController {
     @PostMapping("/update")
     @PreAuthorize("@pcs.hasPermissions('employeeInfo/update')")
     public Object update(@RequestBody EmployeeInfo employeeInfo) {
+    	SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		employeeInfo.setOperatorId(sysUser.getId());
     	Date date = new Date();
     	employeeInfo.setUpdateTime(date);
     	employeeInfoService.update(employeeInfo);

+ 5 - 5
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -806,7 +806,7 @@ public class ExportController extends BaseController {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (!sysUser.getIsSuperAdmin()) {
             Employee employee = employeeDao.get(sysUser.getId());
-            if (StringUtils.isEmpty(queryInfo.getRoutingOrganId()) && queryInfo.getOrderType().equals("3")) {
+            if (StringUtils.isEmpty(queryInfo.getRoutingOrganId()) && "3".equals(queryInfo.getOrderType())) {
                 queryInfo.setRoutingOrganId(employee.getOrganIdList());
             } else if (StringUtils.isEmpty(queryInfo.getOrganId())) {
                 queryInfo.setOrganId(employee.getOrganIdList());
@@ -950,9 +950,9 @@ public class ExportController extends BaseController {
 
         try {
             String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "应付金额", "现金支付", "余额支付", "到账时间",
-                    "关联乐团ID/VIP课ID", "课程形态", "课程费用", "减免费用", "押金", "乐器", "教辅费用", "零星收款费用", "零星收款类别", "手续费", "专业", "分部", "单位/学校", "合作机构", "备注"};
+                    "关联乐团ID/VIP课ID", "课程形态", "课程费用", "乐器减免费用","课程减免费用", "押金", "乐器", "教辅费用", "零星收款费用", "零星收款类别", "手续费", "专业", "分部", "单位/学校", "合作机构", "备注"};
             String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "expectAmount", "actualAmount", "balancePaymentAmount", "payTime", "musicGroupId",
-                    "groupType.desc", "courseFee", "remitFee", "leaseFee", "musicalFee", "teachingFee", "sporadicAmount", "sporadicType", "transferFee", "subjectName", "organName", "schoolName", "cooperationOrganName", "memo"};
+                    "groupType.desc", "courseFee", "remitFee","courseRemitFee", "leaseFee", "musicalFee", "teachingFee", "sporadicAmount", "sporadicType", "transferFee", "subjectName", "organName", "schoolName", "cooperationOrganName", "memo"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
@@ -1225,7 +1225,7 @@ public class ExportController extends BaseController {
         }
         OutputStream outputStream = response.getOutputStream();
         Set<Integer> studentIds = vipGroupExports.stream().map(CourseGroupExportDto::getStudentId).collect(Collectors.toSet());
-        List<CourseGroupExportDto> studentCourseInfos = courseScheduleDao.getStudentCourseInfo(studentIds, GroupType.VIP);
+        List<CourseGroupExportDto> studentCourseInfos = courseScheduleDao.getStudentVipCourseInfo(studentIds);
         List<CourseGroupExportDto> totalClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.VIP, null);
         List<CourseGroupExportDto> noStartClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.VIP, CourseStatusEnum.NOT_START);
         for (CourseGroupExportDto vipGroupExport : vipGroupExports) {
@@ -2063,7 +2063,7 @@ public class ExportController extends BaseController {
 
             String[] header = {"老师编号", "姓名", "分部", "工作类型", "在职状态", "老师状态", "1v1", "1v2", "1v3", "1v4", "1v5", "1v6", "1v7", "网管课", "单技课2.0", "合奏课2.0", "综合课2.0", "集训单技课2.0", "集训合奏课2.0",
                     "基础技能课2.0", "课堂课2.0", "单技课3.0", "合奏课3.0", "综合课3.0", "集训单技课3.0", "集训合奏课3.0",
-                    "基础技能课3.0", "课堂课3.0", "线上基础技能课1v3", "线上基础技能课1v4", "线上基础技能课1v5", "乐团网管课1v1"};
+                    "基础技能课3.0", "课堂课3.0", "网络基础训练课1v3", "网络基础训练课1v4", "网络基础训练课1v5", "乐团网管课1v1"};
             String[] body = {"userId", "realName", "organName", "jobNature", "demissionStatus", "status", "vip1", "vip2", "vip3", "vip4", "vip5", "vip6", "vip7",
                     "practiceSalary", "singleSalary2", "mixSalary2", "comprehensiveSalary2", "traningSigleSalary2", "traningMixSalary2", "highSalary2",
                     "classroomSalary2", "singleSalary", "mixSalary", "comprehensiveSalary", "traningSigleSalary", "traningMixSalary", "highSalary",

+ 7 - 14
mec-web/src/main/java/com/ym/mec/web/controller/FinancialExpenditureController.java

@@ -1,6 +1,7 @@
 package com.ym.mec.web.controller;
 
 import com.ym.mec.biz.dal.entity.FinancialExpenditure;
+import com.ym.mec.biz.dal.page.FinancialExpenditureQueryInfo;
 import com.ym.mec.biz.service.FinancialExpenditureService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.page.QueryInfo;
@@ -19,27 +20,19 @@ public class FinancialExpenditureController extends BaseController {
     @Autowired
     private FinancialExpenditureService financialExpenditureService;
 
-    @ApiOperation(value = "修改财务支出")
-    @PostMapping("/update")
-    @PreAuthorize("@pcs.hasPermissions('financialExpenditure/update')")
-    public Object upSet(@RequestBody FinancialExpenditure financialExpenditure) {
-        financialExpenditureService.update(financialExpenditure);
-        return succeed();
-    }
-
     @ApiOperation(value = "删除财务支出")
-    @PostMapping("/del/{id}")
-    @PreAuthorize("@pcs.hasPermissions('financialExpenditure/del')")
-    public Object del(@ApiParam(value = "财务支出编号", required = true) @PathVariable("id") Long id) {
-        financialExpenditureService.delete(id);
+    @PostMapping("/batchDel")
+    @PreAuthorize("@pcs.hasPermissions('financialExpenditure/batchDel')")
+    public Object batchDel(String ids) {
+        financialExpenditureService.batchDel(ids);
         return succeed();
     }
 
     @ApiOperation(value = "分页查询财务支出列表")
     @GetMapping("/queryPage")
     @PreAuthorize("@pcs.hasPermissions('financialExpenditure/queryPage')")
-    public Object queryPage(QueryInfo queryInfo) {
-        return succeed(financialExpenditureService.queryPage(queryInfo));
+    public Object queryPage(FinancialExpenditureQueryInfo queryInfo) {
+        return succeed(financialExpenditureService.queryFinancialExpenditurePage(queryInfo));
     }
 
 }

+ 4 - 14
mec-web/src/main/java/com/ym/mec/web/controller/ImportController.java

@@ -2,6 +2,7 @@ package com.ym.mec.web.controller;
 
 import com.ym.mec.biz.dal.entity.FinancialExpenditure;
 import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.enums.TemplateTypeEnum;
 import com.ym.mec.biz.service.FinancialExpenditureService;
 import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.common.controller.BaseController;
@@ -50,23 +51,12 @@ public class ImportController extends BaseController {
     @ApiOperation(value = "下载导入模板")
     @GetMapping(value = "downloadTemplate")
     @PreAuthorize("@pcs.hasPermissions('import/downloadTemplate')")
-    public void getGoodsTemplate(HttpServletResponse response,String templateType) throws IOException {
-        String templateName = null;
-        switch (templateType){
-            case "goods":
-                templateName = "商品导入模板";
-                break;
-            case "financialExpenditure":
-                templateName = "财务支出导入模板";
-                break;
-            default:
-                templateName = "商品导入模板";
-        }
-        InputStream inputStream = new ClassPathResource("excelTemplate/" + templateName + ".xls").getInputStream();
+    public void getGoodsTemplate(HttpServletResponse response, TemplateTypeEnum templateType) throws IOException {
+        InputStream inputStream = new ClassPathResource("excelTemplate/" + templateType.getMsg() + ".xls").getInputStream();
         OutputStream outputStream = response.getOutputStream();
         try {
             response.setContentType("application/octet-stream");
-            response.setHeader("Content-Disposition", "attachment;filename=" + templateName + "-" + DateUtil.getDate(new Date()) + ".xls");
+            response.setHeader("Content-Disposition", "attachment;filename=" + templateType.getMsg() + "-" + DateUtil.getDate(new Date()) + ".xls");
             response.flushBuffer();
             outputStream = response.getOutputStream();
             IOUtils.copy(inputStream, outputStream);

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

@@ -262,16 +262,7 @@ public class MusicGroupController extends BaseController {
 	@ApiOperation("获取分部乐团列表名称")
 	@GetMapping(value = "/queryOrganMusicInfos")
 	@PreAuthorize("@pcs.hasPermissions('musicGroup/queryOrganMusicInfos')")
-	public Object queryOrganMusicInfos() {
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			return failed("用户信息获取失败");
-		}
-		String organId = null;
-		if(!sysUser.getIsSuperAdmin()){
-			Employee employee = employeeDao.get(sysUser.getId());
-			organId = employee.getOrganIdList();
-		}
+	public Object queryOrganMusicInfos(Integer organId) {
 		return succeed(musicGroupService.queryOrganMusicInfos(organId));
 	}
 

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

@@ -33,19 +33,6 @@ public class OrganizationController extends BaseController {
 		if (sysUser == null) {
 			return failed("用户信息获取失败");
 		}
-		/*if(!sysUser.getIsSuperAdmin()){
-			Employee employee = employeeDao.get(sysUser.getId());
-			if (StringUtils.isEmpty(queryInfo.getOrganId())) {
-				queryInfo.setOrganId(employee.getOrganIdList());
-			}else if(StringUtils.isEmpty(employee.getOrganIdList())){
-				return failed("用户所在分部异常");
-			}else {
-				List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
-				if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
-					return failed("非法请求");
-				}
-			}
-		}*/
         return succeed(organizationService.queryPage(queryInfo));
     }
 

+ 10 - 5
mec-web/src/main/java/com/ym/mec/web/controller/education/EduRepairController.java

@@ -7,7 +7,9 @@ import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.StudentRepair;
+import com.ym.mec.biz.dal.page.GoodsQueryInfo;
 import com.ym.mec.biz.dal.page.RepairStudentQueryInfo;
+import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.biz.service.StudentRepairService;
 import com.ym.mec.biz.service.SubjectService;
 import com.ym.mec.common.controller.BaseController;
@@ -16,19 +18,14 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.apache.commons.lang3.StringUtils;
-import org.snaker.engine.access.Page;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.Arrays;
 import java.util.Date;
-import java.util.List;
 import java.util.Objects;
 
 @RequestMapping("eduRepair")
@@ -45,6 +42,8 @@ public class EduRepairController extends BaseController {
     private StudentRepairService studentRepairService;
     @Autowired
     private SubjectService subjectService;
+    @Autowired
+    private GoodsService goodsService;
 
     @ApiOperation("获取学生列表")
     @GetMapping(value = "/getStudents")
@@ -142,4 +141,10 @@ public class EduRepairController extends BaseController {
         return succeed();
     }
 
+    @ApiOperation(value = "分页查询商品(教材、辅件)列表")
+    @GetMapping("/queryGoodsPage")
+    public Object queryPage(GoodsQueryInfo queryInfo){
+        return succeed(goodsService.queryPage(queryInfo));
+    }
+
 }

+ 7 - 6
mec-web/src/main/resources/columnMapper.ini

@@ -1,15 +1,16 @@
 [商品导入模板]
 品牌 = brand
+货号 = sn
 商品名称 = name
 商品类型 = type
 商品分类 = goodsCategoryName
-商品型号 = specification
-商品价格 = marketPrice
-商品团购价 = groupPurchasePrice
-商品采购价 = discountPrice
+具体型号 = specification
+商品价格(元) = marketPrice
+商品团购价(元) = groupPurchasePrice
+商品采购价1(元) = discountPrice
 商品图片(插入一张图片) = image
-商品描述 = desc
-协议成本价 = agreeCostPrice
+商品明细 = desc
+商品采购价2(元) = agreeCostPrice
 
 [财务支出导入模板]
 批次号 = batchNo

BIN
mec-web/src/main/resources/excelTemplate/商品导入模板.xls