瀏覽代碼

Merge remote-tracking branch 'origin/vip_price_827' into vip_price_827

zouxuan 4 年之前
父節點
當前提交
b388587e74

+ 74 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupQuit.java

@@ -1,12 +1,14 @@
 package com.ym.mec.biz.dal.entity;
 
 import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import com.ym.mec.auth.api.entity.SysUser;
 
-import java.math.BigDecimal;
-
 /**
  * 对应数据库表(music_group_quit):
  */
@@ -37,9 +39,23 @@ public class MusicGroupQuit {
 
 	private ApprovalStatus status;
 	
+	private Integer applyUserId;
+	
+	private Boolean isVisit;
+	
+	private Date visitTime;
+	
+	private String feeJson;
+	
+	private BigDecimal returnTotalFee;
+	
+	private String currentApproveRole;
+	
 	private SysUser user = new SysUser();
 	
 	private MusicGroup musicGroup = new MusicGroup();
+	
+	private MusicGroupReturnFeeDto returnFeeDto = new MusicGroupReturnFeeDto();
 
 	@ApiModelProperty(value = "是否有乐保",required = false)
 	private Boolean hasMaintenance = false;
@@ -135,6 +151,46 @@ public class MusicGroupQuit {
 		this.musicGroup = musicGroup;
 	}
 
+	public Integer getApplyUserId() {
+		return applyUserId;
+	}
+
+	public void setApplyUserId(Integer applyUserId) {
+		this.applyUserId = applyUserId;
+	}
+
+	public Boolean getIsVisit() {
+		return isVisit;
+	}
+
+	public void setIsVisit(Boolean isVisit) {
+		this.isVisit = isVisit;
+	}
+
+	public Date getVisitTime() {
+		return visitTime;
+	}
+
+	public void setVisitTime(Date visitTime) {
+		this.visitTime = visitTime;
+	}
+
+	public String getFeeJson() {
+		return feeJson;
+	}
+
+	public void setFeeJson(String feeJson) {
+		this.feeJson = feeJson;
+	}
+
+	public String getCurrentApproveRole() {
+		return currentApproveRole;
+	}
+
+	public void setCurrentApproveRole(String currentApproveRole) {
+		this.currentApproveRole = currentApproveRole;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
@@ -155,4 +211,20 @@ public class MusicGroupQuit {
 	public void setCloudTeacherAmount(BigDecimal cloudTeacherAmount) {
 		this.cloudTeacherAmount = cloudTeacherAmount;
 	}
+
+	public MusicGroupReturnFeeDto getReturnFeeDto() {
+		return returnFeeDto;
+	}
+
+	public void setReturnFeeDto(MusicGroupReturnFeeDto returnFeeDto) {
+		this.returnFeeDto = returnFeeDto;
+	}
+
+	public BigDecimal getReturnTotalFee() {
+		return returnTotalFee;
+	}
+
+	public void setReturnTotalFee(BigDecimal returnTotalFee) {
+		this.returnTotalFee = returnTotalFee;
+	}
 }

+ 106 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupReturnFeeDto.java

@@ -0,0 +1,106 @@
+package com.ym.mec.biz.dal.entity;
+
+import java.math.BigDecimal;
+
+public class MusicGroupReturnFeeDto {
+
+	private Boolean isReturnCourseFee;
+	
+	private BigDecimal courseFee;
+	
+	private Boolean isReturnMemberFee;
+	
+	private BigDecimal memberFee;
+	
+	private Boolean isReturnMusicalFee;
+	
+	private BigDecimal musicalFee;
+	
+	private Boolean isReturnAccessoriesFee;
+	
+	private BigDecimal accessoriesFee;
+	
+	private Boolean isReturnMaintenanceFee;
+	
+	private BigDecimal maintenanceFee;
+
+	public Boolean getIsReturnCourseFee() {
+		return isReturnCourseFee;
+	}
+
+	public void setIsReturnCourseFee(Boolean isReturnCourseFee) {
+		this.isReturnCourseFee = isReturnCourseFee;
+	}
+
+	public BigDecimal getCourseFee() {
+		return courseFee;
+	}
+
+	public void setCourseFee(BigDecimal courseFee) {
+		this.courseFee = courseFee;
+	}
+
+	public Boolean getIsReturnMemberFee() {
+		return isReturnMemberFee;
+	}
+
+	public void setIsReturnMemberFee(Boolean isReturnMemberFee) {
+		this.isReturnMemberFee = isReturnMemberFee;
+	}
+
+	public BigDecimal getMemberFee() {
+		return memberFee;
+	}
+
+	public void setMemberFee(BigDecimal memberFee) {
+		this.memberFee = memberFee;
+	}
+
+	public Boolean getIsReturnMusicalFee() {
+		return isReturnMusicalFee;
+	}
+
+	public void setIsReturnMusicalFee(Boolean isReturnMusicalFee) {
+		this.isReturnMusicalFee = isReturnMusicalFee;
+	}
+
+	public BigDecimal getMusicalFee() {
+		return musicalFee;
+	}
+
+	public void setMusicalFee(BigDecimal musicalFee) {
+		this.musicalFee = musicalFee;
+	}
+
+	public Boolean getIsReturnAccessoriesFee() {
+		return isReturnAccessoriesFee;
+	}
+
+	public void setIsReturnAccessoriesFee(Boolean isReturnAccessoriesFee) {
+		this.isReturnAccessoriesFee = isReturnAccessoriesFee;
+	}
+
+	public BigDecimal getAccessoriesFee() {
+		return accessoriesFee;
+	}
+
+	public void setAccessoriesFee(BigDecimal accessoriesFee) {
+		this.accessoriesFee = accessoriesFee;
+	}
+
+	public Boolean getIsReturnMaintenanceFee() {
+		return isReturnMaintenanceFee;
+	}
+
+	public void setIsReturnMaintenanceFee(Boolean isReturnMaintenanceFee) {
+		this.isReturnMaintenanceFee = isReturnMaintenanceFee;
+	}
+
+	public BigDecimal getMaintenanceFee() {
+		return maintenanceFee;
+	}
+
+	public void setMaintenanceFee(BigDecimal maintenanceFee) {
+		this.maintenanceFee = maintenanceFee;
+	}
+}

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

@@ -140,11 +140,11 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 
 	/**
 	 * 申请退团
-	 * @param musicGroupId 乐团编号
-	 * @param reason
+	 * @param reqMusicGroupQuit 
+	 * @param operatorId
 	 * @return
 	 */
-	boolean applyQuitMusicGroup(String musicGroupId, String reason);
+	boolean applyQuitMusicGroup(MusicGroupQuit reqMusicGroupQuit, Integer operatorId);
 
 	/**
 	 * 取消退团
@@ -157,18 +157,11 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 
 	/**
 	 * 审批退团
-	 * @param id
-	 * @param status
-	 * @param reason
-	 * @param isRefundCourseFee 是否退还课程费用
-	 * @param isRefundInstrumentFee 是否退还乐器费用
-	 * @param isRefundTeachingAssistantsFee 是否退还教辅费用
-	 * @param maintenanceFee
-	 * @param cloudTeacherAmount
+	 * @param currentOperatorRoleIds
+	 * @param reqMusicGroupQuit
 	 * @return
 	 */
-	boolean approveQuitMusicGroup(Long id, ApprovalStatus status, String reason, boolean isRefundCourseFee, boolean isRefundInstrumentFee,
-								  boolean isRefundTeachingAssistantsFee,boolean isRefundMemberFee, BigDecimal maintenanceFee, BigDecimal cloudTeacherAmount);
+	boolean approveQuitMusicGroup(List<Integer> currentOperatorRoleIds, MusicGroupQuit reqMusicGroupQuit);
 
 	/**
 	 * 一键退团

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

@@ -66,7 +66,7 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      * @param musicGroupId
      * @return
      */
-    List<StudentPaymentOrderDetail> queryRefundsDetail(Integer studentId, String musicGroupId);
+    Map<String, BigDecimal> queryRefundsDetail(Integer studentId, String musicGroupId);
 
     /**
      * 获取未分配的班级的学生

+ 68 - 25
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -109,6 +109,7 @@ import com.ym.mec.biz.dal.entity.MusicGroupQuit;
 import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
+import com.ym.mec.biz.dal.entity.MusicGroupReturnFeeDto;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
 import com.ym.mec.biz.dal.entity.MusicMemberDto;
@@ -186,6 +187,7 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
+import com.ym.mec.util.json.JsonUtil;
 
 @Service
 public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> implements MusicGroupService {
@@ -1900,11 +1902,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public boolean applyQuitMusicGroup(String musicGroupId, String reason) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+    public boolean applyQuitMusicGroup(MusicGroupQuit reqMusicGroupQuit, Integer operatorId) {
+    	
+    	Integer userId = reqMusicGroupQuit.getUserId();
+    	String musicGroupId = reqMusicGroupQuit.getMusicGroupId();
+    	String reason = reqMusicGroupQuit.getReason();
+    	
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团不存在");
@@ -1913,7 +1916,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroup.getStatus() == MusicGroupStatusEnum.CANCELED || musicGroup.getStatus() == MusicGroupStatusEnum.PAUSE) {
             throw new BizException("申请失败,乐团状态[已取消]或[已暂停]");
         }
-        Integer userId = sysUser.getId();
 
         StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
         if (studentRegistration == null) {
@@ -1931,8 +1933,17 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroupQuit.setCreateTime(new Date());
         musicGroupQuit.setJoinDate(studentRegistration.getCreateTime());
         musicGroupQuit.setMusicGroupId(musicGroupId);
-        musicGroupQuit.setUserId(sysUser.getId());
+        musicGroupQuit.setUserId(userId);
         musicGroupQuit.setUserComment(reason);
+        musicGroupQuit.setApplyUserId(userId);
+        musicGroupQuit.setFeeJson(JsonUtil.toJSONString(reqMusicGroupQuit.getReturnFeeDto()));
+        musicGroupQuit.setIsVisit(reqMusicGroupQuit.getIsVisit());
+        musicGroupQuit.setVisitTime(reqMusicGroupQuit.getVisitTime());
+        if(operatorId == userId.intValue()){
+        	musicGroupQuit.setCurrentApproveRole(SysUserRole.EDUCATIONAL_TEACHER + "");
+        }else{
+        	musicGroupQuit.setCurrentApproveRole(SysUserRole.SECTION_MANAGER + "");
+        }
         musicGroupQuit.setStatus(PROCESSING);
 
         musicGroupQuitDao.insert(musicGroupQuit);
@@ -1943,6 +1954,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         Map<String, Object> memo = new HashMap<>(2);
         memo.put("Id", musicGroupQuit.getId());
         memo.put("type", "MUSICGROUP");
+        
+        SysUser sysUser = sysUserFeignService.queryUserById(userId);
 
         sysMessageService.batchSeoMessage(integers,
                 MessageTypeEnum.BACKSTAGE_STUDENT_APPLY_QUIT_GROUP, JSONObject.toJSONString(memo), sysUser.getUsername());
@@ -1986,14 +1999,37 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public boolean approveQuitMusicGroup(Long id, ApprovalStatus status, String reason, boolean isRefundCourseFee, boolean isRefundInstrumentFee,
-                                         boolean isRefundTeachingAssistantsFee,boolean isRefundMemberFee, BigDecimal maintenanceFee, BigDecimal cloudTeacherAmount) {
-
+    public boolean approveQuitMusicGroup(List<Integer> currentOperatorRoleIds, MusicGroupQuit reqMusicGroupQuit) {
+    	
+    	Long id = reqMusicGroupQuit.getId();
+    	ApprovalStatus status = reqMusicGroupQuit.getStatus();
+    	String reason = reqMusicGroupQuit.getReason();
+    	Date visitDate = reqMusicGroupQuit.getVisitTime();
+    	MusicGroupReturnFeeDto returnFeeDto = reqMusicGroupQuit.getReturnFeeDto();
+    	
         MusicGroupQuit musicGroupQuit = musicGroupQuitDao.get(id);
         if (musicGroupQuit == null) {
             throw new BizException("数据不存在");
         }
+    	
         Date date = new Date();
+    	
+    	if (!currentOperatorRoleIds.contains(SysUserRole.SECTION_MANAGER) && currentOperatorRoleIds.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+    		
+    		if(!StringUtils.equals(musicGroupQuit.getCurrentApproveRole(), SysUserRole.EDUCATIONAL_TEACHER + "")){
+    			throw new BizException("只有分部经理才能审核");
+    		}
+    		
+			if(status == ApprovalStatus.APPROVED){
+				throw new BizException("只能分部经理操作退团");
+			}
+		}
+    	
+    	if(currentOperatorRoleIds.contains(SysUserRole.SECTION_MANAGER) && !currentOperatorRoleIds.contains(SysUserRole.EDUCATIONAL_TEACHER)){
+    		if(!StringUtils.equals(musicGroupQuit.getCurrentApproveRole(), SysUserRole.SECTION_MANAGER + "")){
+    			throw new BizException("先需乐团主管审核");
+    		}
+    	}
 
         String musicGroupId = musicGroupQuit.getMusicGroupId();
         Integer userId = musicGroupQuit.getUserId();
@@ -2029,6 +2065,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroupQuit.setStatus(status);
         musicGroupQuit.setReason(reason);
         musicGroupQuit.setQuitDate(date);
+        musicGroupQuit.setFeeJson(JsonUtil.toJSONString(returnFeeDto));
+		if (visitDate != null) {
+			musicGroupQuit.setVisitTime(visitDate);
+			musicGroupQuit.setIsVisit(true);
+		} else {
+			musicGroupQuit.setIsVisit(false);
+		}
         musicGroupQuitDao.update(musicGroupQuit);
 
         courseScheduleStudentPaymentService.updateCourseActualPrice(Arrays.asList(musicGroupId), Arrays.asList(userId), GroupType.MUSIC);
@@ -2142,14 +2185,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 groupEventSource.musicGroupStudentChangeEvent(musicGroupId, StudentMusicGroupStatusEnum.QUIT, new ArrayList<>(Arrays.asList(userId)));
 
             }
-            if (isRefundMemberFee){
+            if (returnFeeDto.getIsReturnMemberFee()){
                 if(musicGroup.getCourseViewType() != CourseViewTypeEnum.MEMBER_FEE){
                     throw new BizException("非会员乐团不允许退云教练");
                 }
                 //删除乐团会员时长
                 studentRegistrationDao.cleanMusicMember(userId,null);
                 //退云教练费用
-                if (cloudTeacherAmount != null) {
+                if (returnFeeDto.getMemberFee() != null) {
                     Date nowDate = new Date();
                     List<CloudTeacherOrder> cloudTeacherOrders = cloudTeacherOrderService.getStudentCloudTeacherOrder(userId);
                     BigDecimal orderAmount = BigDecimal.ZERO;
@@ -2162,12 +2205,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                                 orderAmount = orderAmount.add(cloudTeacherOrder.getAmount());
                             }
                         }
-                        cloudTeacherOrderService.quitCloudTeacherOrders(quitCloudTeacherOrders, cloudTeacherAmount);
+                        cloudTeacherOrderService.quitCloudTeacherOrders(quitCloudTeacherOrders, returnFeeDto.getMemberFee());
                     }
-                    if (cloudTeacherAmount.compareTo(orderAmount) > 0) {
+                    if (returnFeeDto.getMemberFee().compareTo(orderAmount) > 0) {
                         throw new BizException("云教练退费金额不能大于原始订单金额");
                     }
-                    amount = amount.add(cloudTeacherAmount);
+                    amount = amount.add(returnFeeDto.getMemberFee());
                     //清除学员云教练
                     studentService.cleanMember(userId);
                     //如果有试用会员,不清除
@@ -2184,7 +2227,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 studentRegistrationDao.cleanMusicMember(userId,musicGroupId);
             }
 
-            if (isRefundCourseFee) {
+            if (returnFeeDto.getIsReturnCourseFee()) {
                 // 退课程费用
                 amount = amount.add(surplusCourseFee);
             }
@@ -2198,12 +2241,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 List<StudentPaymentOrderDetail> orderDetailList = studentPaymentOrderDetailDao.getWithIds(paymentOrderIdList);
 
                 SubjectChange studentLastChange = null;
-                if (isRefundInstrumentFee || isRefundTeachingAssistantsFee) {
+                if (returnFeeDto.getIsReturnMusicalFee() || returnFeeDto.getIsReturnAccessoriesFee()) {
                     studentLastChange = subjectChangeDao.getStudentLastChange(userId, musicGroupId);
                 }
                 
     			if (studentLastChange != null && minPaymentOrderId <= studentLastChange.getOriginalOrderId()) {
-    				if (isRefundInstrumentFee) {
+    				if (returnFeeDto.getIsReturnMusicalFee()) {
     					amount = amount.add(studentLastChange.getChangeMusicalPrice());
     					
     					StudentInstrument studentMaintenance = studentInstrumentDao.getByOrderId(studentLastChange.getOrderId().longValue());
@@ -2213,14 +2256,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     		            }
     				}
 
-    				if (isRefundTeachingAssistantsFee) {
+    				if (returnFeeDto.getIsReturnAccessoriesFee()) {
     					amount = amount.add(studentLastChange.getChangeAccessoriesPrice());
     				}
     			} else {
     				for (StudentPaymentOrderDetail detail : orderDetailList) {
 
     					// 退乐器费用
-    					if (isRefundInstrumentFee && detail.getType() == OrderDetailTypeEnum.MUSICAL) {
+    					if (returnFeeDto.getIsReturnMusicalFee() && detail.getType() == OrderDetailTypeEnum.MUSICAL) {
     						amount = amount.add(detail.getPrice()).subtract(detail.getRemitFee());
     						
     						StudentInstrument studentMaintenance = studentInstrumentDao.getStudentMaintenance(userId, musicGroupId);
@@ -2231,7 +2274,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     					}
 
     					// 退教辅费用
-    					if (isRefundTeachingAssistantsFee
+    					if (returnFeeDto.getIsReturnAccessoriesFee()
     							&& (detail.getType() == OrderDetailTypeEnum.ACCESSORIES || detail.getType() == OrderDetailTypeEnum.TEACHING)) {
     						amount = amount.add(detail.getPrice()).subtract(detail.getRemitFee());
     					}
@@ -2240,15 +2283,15 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             }
 
             //退乐保费用
-            if (maintenanceFee != null) {
+            if (returnFeeDto.getMaintenanceFee() != null) {
                 StudentInstrument studentMaintenance = studentInstrumentDao.getStudentMaintenance(userId, musicGroupId);
-                if (maintenanceFee.compareTo(BigDecimal.ZERO) > 0) {
+                if (returnFeeDto.getMaintenanceFee().compareTo(BigDecimal.ZERO) > 0) {
                     if (studentMaintenance == null) {
                         throw new BizException("学生没有有效期内的乐保,不能退乐保费用");
                     }
                 }
-                amount = amount.add(maintenanceFee);
-                if (maintenanceFee.compareTo(BigDecimal.ZERO) > 0 && studentMaintenance != null) {
+                amount = amount.add(returnFeeDto.getMaintenanceFee());
+                if (returnFeeDto.getMaintenanceFee().compareTo(BigDecimal.ZERO) > 0 && studentMaintenance != null) {
                     studentMaintenance.setStatus(0);
                     studentMaintenance.setStartTime(null);
                     studentMaintenance.setEndTime(null);

+ 60 - 22
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -392,28 +392,66 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 	}
 
     @Override
-	public List<StudentPaymentOrderDetail> queryRefundsDetail(Integer studentId, String musicGroupId) {
-    	
-    	List<StudentPaymentOrderDetail> detailList = queryFeeDetail(studentId, musicGroupId);
-    	
-    	Map<OrderDetailTypeEnum,List<StudentPaymentOrderDetail>> detailMap = detailList.stream().collect(Collectors.groupingBy(StudentPaymentOrderDetail :: getType));
-    	
-    	Map<String, BigDecimal> map = new HashMap<String, BigDecimal>();
-    	
-    	if(detailMap.containsKey(OrderDetailTypeEnum.MUSICAL)){
-    		
-    	}else{
-        	map.put(OrderDetailTypeEnum.MUSICAL.getCode(), BigDecimal.ZERO);
-    	}
-    	
-    	
-    	map.put(OrderDetailTypeEnum.MAINTENANCE.getCode(), BigDecimal.valueOf(300));
-    	map.put(OrderDetailTypeEnum.ACCESSORIES.getCode(), BigDecimal.valueOf(300));
-    	map.put(OrderDetailTypeEnum.CLOUD_TEACHER.getCode(), BigDecimal.valueOf(300));
-    	map.put(OrderDetailTypeEnum.COURSE.getCode(), BigDecimal.valueOf(300));
-    
-    	return null;
-    }
+	public Map<String, BigDecimal> queryRefundsDetail(Integer studentId, String musicGroupId) {
+
+		List<StudentPaymentOrderDetail> detailList = queryFeeDetail(studentId, musicGroupId);
+
+		Map<OrderDetailTypeEnum, List<StudentPaymentOrderDetail>> detailMap = detailList.stream().collect(
+				Collectors.groupingBy(StudentPaymentOrderDetail::getType));
+
+		Map<String, BigDecimal> map = new HashMap<String, BigDecimal>();
+
+		if (detailMap.containsKey(OrderDetailTypeEnum.MUSICAL)) {
+			detailList = detailMap.get(OrderDetailTypeEnum.MUSICAL);
+			if (detailList == null) {
+				detailList = new ArrayList<StudentPaymentOrderDetail>();
+			}
+			map.put(OrderDetailTypeEnum.MUSICAL.getCode(), detailList.stream().map(StudentPaymentOrderDetail::getPrice)
+					.reduce(BigDecimal.ZERO, BigDecimal::add));
+		} else {
+			map.put(OrderDetailTypeEnum.MUSICAL.getCode(), BigDecimal.ZERO);
+		}
+
+		if (detailMap.containsKey(OrderDetailTypeEnum.ACCESSORIES)) {
+			detailList = detailMap.get(OrderDetailTypeEnum.ACCESSORIES);
+			if (detailList == null) {
+				detailList = new ArrayList<StudentPaymentOrderDetail>();
+			}
+			map.put(OrderDetailTypeEnum.ACCESSORIES.getCode(),
+					detailList.stream().map(StudentPaymentOrderDetail::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add));
+		} else {
+			map.put(OrderDetailTypeEnum.ACCESSORIES.getCode(), BigDecimal.ZERO);
+		}
+
+		StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(studentId, musicGroupId);
+		if (studentRegistration == null) {
+			throw new BizException("学生报名信息查询失败");
+		}
+		map.put(OrderDetailTypeEnum.COURSE.getCode(), studentRegistration.getSurplusCourseFee());
+
+		map.put(OrderDetailTypeEnum.MAINTENANCE.getCode(), BigDecimal.valueOf(300));
+
+		// 查询云教练订单
+		BigDecimal cloudAmount = BigDecimal.ZERO;
+		List<Integer> studentIds = new ArrayList<Integer>();
+		studentIds.add(studentId);
+		List<CloudTeacherOrder> studentCloudTeacherOrders = cloudTeacherOrderService.getStudentCloudTeacherOrders(studentIds, musicGroupId);
+		if (studentCloudTeacherOrders != null && studentCloudTeacherOrders.size() > 0) {
+			Date nowDate = new Date();
+			for (CloudTeacherOrder cloudTeacherOrder : studentCloudTeacherOrders) {
+				if (cloudTeacherOrder.getEndTime() == null
+						|| DateUtil.stringToDate(DateUtil.format(cloudTeacherOrder.getEndTime(), DateUtil.ISO_EXPANDED_DATE_FORMAT),
+								DateUtil.ISO_EXPANDED_DATE_FORMAT).compareTo(
+								DateUtil.stringToDate(DateUtil.format(nowDate, DateUtil.ISO_EXPANDED_DATE_FORMAT), DateUtil.ISO_EXPANDED_DATE_FORMAT)) >= 0) {
+					cloudAmount = cloudAmount.add(cloudTeacherOrder.getAmount());
+				}
+			}
+		}
+
+		map.put(OrderDetailTypeEnum.CLOUD_TEACHER.getCode(), cloudAmount);
+
+		return map;
+	}
 
 	@Override
     public List<Map<String, Object>> getNoClassStuBySubjectId(String musicGroupId, String actualSubjectId) {

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

@@ -13,6 +13,12 @@
         <result column="create_time_" property="createTime"/>
         <result column="reason_" property="reason"/>
         <result column="user_comment_" property="userComment"/>
+        <result column="apply_user_id_" property="applyUserId"/>
+        <result column="is_visit_" property="isVisit"/>
+        <result column="visit_time_" property="vistTime"/>
+        <result column="return_total_fee_" property="returnTotalFee"/>
+        <result column="fee_json_" property="feeJson"/>
+        <result column="current_approve_role_" property="currentApproveRole"/>
         <result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <association property="musicGroup" javaType="com.ym.mec.biz.dal.entity.MusicGroup">
             <result column="music_group_name_" property="name"/>
@@ -41,9 +47,9 @@
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MusicGroupQuit"
             useGeneratedKeys="true" keyColumn="id" keyProperty="id">
         INSERT INTO music_group_quit
-        (id_,user_id_,music_group_id_,join_date_,quit_date_,create_time_,reason_,user_comment_,status_)
+        (id_,user_id_,music_group_id_,join_date_,quit_date_,create_time_,reason_,user_comment_,status_,apply_user_id_,is_visit_,visit_time_,fee_json_,current_approve_role_,return_total_fee_)
         VALUES(#{id},#{userId},#{musicGroupId},#{joinDate},#{quitDate},#{createTime},#{reason},#{userComment},
-        #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
+        #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{applyUserId},#{isVisit},#{vistTime},#{feeJson},#{currentApproveRole},#{returnTotalFee})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -74,6 +80,24 @@
             <if test="createTime != null">
                 create_time_ = #{createTime},
             </if>
+            <if test="applyUserId != null">
+                apply_user_id_ = #{applyUserId},
+            </if>
+            <if test="isVisit != null">
+                is_visit_ = #{isVisit},
+            </if>
+            <if test="vistTime != null">
+                visit_time_ = #{vistTime},
+            </if>
+            <if test="feeJson != null">
+                fee_json_ = #{feeJson},
+            </if>
+            <if test="returnTotalFee != null">
+                return_total_fee_ = #{returnTotalFee},
+            </if>
+            <if test="currentApproveRole != null">
+                current_approve_role_ = #{currentApproveRole},
+            </if>
             <if test="status != null">
                 status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>

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

@@ -35,6 +35,7 @@ import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
+import com.ym.mec.biz.dal.entity.MusicGroupQuit;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
 import com.ym.mec.biz.dal.entity.StudentPreRegistration;
@@ -291,7 +292,15 @@ public class MusicGroupController extends BaseController {
     @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "String"),
             @ApiImplicitParam(name = "reason", value = "原因", required = true, dataType = "String")})
     public HttpResponseResult quitMusicGroup(String musicGroupId, String reason) throws Exception {
-        return succeed(musicGroupService.applyQuitMusicGroup(musicGroupId, reason));
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		MusicGroupQuit musicGroupQuit = new MusicGroupQuit();
+		musicGroupQuit.setUserId(sysUser.getId());
+		musicGroupQuit.setMusicGroupId(musicGroupId);
+		musicGroupQuit.setReason(reason);
+        return succeed(musicGroupService.applyQuitMusicGroup(musicGroupQuit, sysUser.getId()));
     }
 
     @ApiOperation(value = "取消退团申请")

+ 81 - 27
mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupQuitController.java

@@ -1,38 +1,50 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.auth.api.entity.SysUserRole;
-import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
-import com.ym.mec.biz.dal.dao.StudentInstrumentDao;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.page.MusicGroupQuitQueryInfo;
-import com.ym.mec.biz.service.EmployeeService;
-import com.ym.mec.common.page.PageInfo;
-import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.commons.lang3.StringUtils;
 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.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.auth.api.entity.SysUserRole;
+import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
+import com.ym.mec.biz.dal.dao.StudentInstrumentDao;
+import com.ym.mec.biz.dal.entity.ApprovalStatus;
+import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupQuit;
+import com.ym.mec.biz.dal.entity.MusicGroupReturnFeeDto;
+import com.ym.mec.biz.dal.entity.StudentInstrument;
+import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
+import com.ym.mec.biz.dal.page.MusicGroupQuitQueryInfo;
+import com.ym.mec.biz.service.EmployeeService;
 import com.ym.mec.biz.service.MusicGroupQuitService;
 import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.StudentRegistrationService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
-
-import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.json.JsonUtil;
 
 @RequestMapping("musicGroupQuit")
 @Api(tags = "退团服务")
@@ -44,6 +56,9 @@ public class MusicGroupQuitController extends BaseController {
 
     @Autowired
     private MusicGroupQuitService musicGroupQuitService;
+    
+    @Autowired
+    private StudentRegistrationService studentRegistrationService;
 
     @Autowired
     private SysUserFeignService sysUserFeignService;
@@ -121,26 +136,65 @@ public class MusicGroupQuitController extends BaseController {
 
         MusicGroup musicGroup = musicGroupService.get(musicGroupQuit.getMusicGroupId());
         musicGroupQuit.setMusicGroup(musicGroup);
+        
+        if(StringUtils.isBlank(musicGroupQuit.getFeeJson())){
+        	//从数据库中查询费用
+        	Map<String,BigDecimal> map = studentRegistrationService.queryRefundsDetail(musicGroupQuit.getUserId(), musicGroupQuit.getMusicGroupId());
+        	MusicGroupReturnFeeDto dto = new MusicGroupReturnFeeDto();
+        	dto.setIsReturnAccessoriesFee(false);
+        	dto.setAccessoriesFee(map.get(OrderDetailTypeEnum.ACCESSORIES.getCode()));
+        	
+        	dto.setIsReturnCourseFee(false);
+        	dto.setCourseFee(map.get(OrderDetailTypeEnum.COURSE.getCode()));
+        	
+        	dto.setIsReturnMaintenanceFee(false);
+        	dto.setMaintenanceFee(map.get(OrderDetailTypeEnum.MAINTENANCE.getCode()));
+        	
+        	dto.setIsReturnMemberFee(false);
+        	dto.setMemberFee(map.get(OrderDetailTypeEnum.CLOUD_TEACHER.getCode()));
+        	
+        	dto.setIsReturnMusicalFee(false);
+        	dto.setMusicalFee(map.get(OrderDetailTypeEnum.MUSICAL.getCode()));
+        	
+        	musicGroupQuit.setReturnFeeDto(dto);
+        } else {
+        	musicGroupQuit.setReturnFeeDto(JsonUtil.parseObject(musicGroupQuit.getFeeJson(), MusicGroupReturnFeeDto.class));
+        }
 
         return succeed(musicGroupQuit);
     }
 
+    @ApiOperation(value = "申请退团")
+    @PostMapping("/apply")
+    @PreAuthorize("@pcs.hasPermissions('musicGroupQuit/apply')")
+    public HttpResponseResult applyQuitMusicGroup(@RequestBody MusicGroupQuit musicGroupQuit) throws Exception {
+    	
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		
+        return succeed(musicGroupService.applyQuitMusicGroup(musicGroupQuit, sysUser.getId()));
+    }
+
     @ApiOperation(value = "退团")
     @PostMapping("/quitMusicGroup")
     @PreAuthorize("@pcs.hasPermissions('musicGroupQuit/quitMusicGroup')")
-    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "退团申请id", required = true, dataType = "Long"),
-            @ApiImplicitParam(name = "status", value = "审批状态(APPROVED, DENIED, PROCESSING)", required = true, dataType = "String"),
-            @ApiImplicitParam(name = "reason", value = "原因", required = true, dataType = "String"),
-            @ApiImplicitParam(name = "isRefundMemberFee", value = "是否退还云教练费用", required = true, dataType = "Boolean"),
-            @ApiImplicitParam(name = "isRefundCourseFee", value = "是否退还课程费用", required = true, dataType = "Boolean"),
-            @ApiImplicitParam(name = "isRefundInstrumentFee", value = "是否退还乐器费用(租金)", required = true, dataType = "Boolean"),
-            @ApiImplicitParam(name = "isRefundTeachingAssistantsFee", value = "是否退还教辅费用", required = true, dataType = "Boolean"),
-            @ApiImplicitParam(name = "maintenanceFee", value = "退乐保费用", required = true, dataType = "num")
-    })
-    public HttpResponseResult quitMusicGroup(Long id, ApprovalStatus status, String reason, boolean isRefundCourseFee, boolean isRefundInstrumentFee,
-                                             boolean isRefundTeachingAssistantsFee,boolean isRefundMemberFee, BigDecimal maintenanceFee,BigDecimal cloudTeacherAmount) throws Exception {
-        return succeed(musicGroupService.approveQuitMusicGroup(id, status, reason, isRefundCourseFee, isRefundInstrumentFee, isRefundTeachingAssistantsFee
-                ,isRefundMemberFee, maintenanceFee, cloudTeacherAmount));
+    public HttpResponseResult quitMusicGroup(@RequestBody MusicGroupQuit musicGroupQuit) throws Exception {
+    	
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+
+		List<Integer> roleIds = sysUser.getRoles();
+
+
+		if (!(roleIds.contains(SysUserRole.SECTION_MANAGER) || roleIds.contains(SysUserRole.EDUCATIONAL_TEACHER))) {
+			throw new BizException("未经授权,不能操作");
+		}
+    	
+        return succeed(musicGroupService.approveQuitMusicGroup(roleIds, musicGroupQuit));
     }
 
     @ApiOperation(value = "一键退团")