Bladeren bron

Merge branch 'master' of http://git.dayaedu.com/yonge/mec

周箭河 5 jaren geleden
bovenliggende
commit
f86141c65c
32 gewijzigde bestanden met toevoegingen van 609 en 207 verwijderingen
  1. 13 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  2. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  3. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupDao.java
  4. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentVipGroupShowListDto.java
  5. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroup.java
  6. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java
  7. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/VipGroupTeachingRecordQueryInfo.java
  8. 31 21
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentAttendanceService.java
  9. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  10. 63 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  11. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  12. 6 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  13. 4 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  14. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  15. 3 1
      mec-biz/src/main/resources/config/mybatis/VipGroupActivityMapper.xml
  16. 30 4
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  17. 12 3
      mec-education/src/main/java/com/ym/mec/education/controller/TeacherController.java
  18. 1 1
      mec-education/src/main/java/com/ym/mec/education/enums/SignStatusEnum.java
  19. 4 0
      mec-education/src/main/java/com/ym/mec/education/req/TeacherReq.java
  20. 34 0
      mec-education/src/main/java/com/ym/mec/education/resp/TeacherDailyScheduleResp.java
  21. 2 0
      mec-education/src/main/java/com/ym/mec/education/service/ITeacherService.java
  22. 4 3
      mec-education/src/main/java/com/ym/mec/education/service/impl/StudentAttendanceServiceImpl.java
  23. 148 69
      mec-education/src/main/java/com/ym/mec/education/service/impl/TeacherServiceImpl.java
  24. 55 47
      mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseScheduleController.java
  25. 18 5
      mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java
  26. 2 5
      mec-workflow/src/main/java/com/ym/mec/workfow/controller/flow/OrderController.java
  27. 3 3
      mec-workflow/src/main/java/com/ym/mec/workfow/controller/flow/TaskController.java
  28. 9 2
      mec-workflow/src/main/java/com/ym/mec/workfow/controller/web/LeaveController.java
  29. 2 2
      mec-workflow/src/main/resources/flows/leave.snaker
  30. 29 22
      workflowy/src/main/java/org/snaker/engine/IOrderService.java
  31. 37 1
      workflowy/src/main/java/org/snaker/engine/core/OrderService.java
  32. 4 0
      workflowy/src/main/java/org/snaker/engine/model/NodeModel.java

+ 13 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java

@@ -9,11 +9,18 @@ import java.util.List;
 
 public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStudentMapper> {
 
+	/**
+	 * 批量插入学生
+	 * @param classGroupStudentMapperList
+	 * @return
+	 */
+	int classGroupStudentsInsert(@Param("classGroupStudentMapperList") List<ClassGroupStudentMapper> classGroupStudentMapperList);
 
-    /**
-     * 批量插入学生
-     * @param classGroupStudentMapperList
-     * @return
-     */
-    int classGroupStudentsInsert(@Param("classGroupStudentMapperList") List<ClassGroupStudentMapper> classGroupStudentMapperList);
+	/**
+	 * 根据班级和学生编号查询
+	 * @param classGroupId
+	 * @param userId
+	 * @return
+	 */
+	ClassGroupStudentMapper query(@Param("classGroupId") int classGroupId, @Param("userId") Integer userId);
 }

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

@@ -173,7 +173,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @Date: 2019/9/17
      * 获取课程信息
      */
-    CourseScheduleDto getCourseSchedules(@Param("classDate") Long courseScheduleId);
+    CourseScheduleDto getCourseSchedules(@Param("courseScheduleId") Long courseScheduleId);
 
 
 }

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupDao.java

@@ -44,6 +44,24 @@ public interface VipGroupDao extends BaseDAO<Long, VipGroup> {
 	 * @Author: Joburgess
 	 * @Date: 2019/10/9
 	 * @params [vipGroupId]
+	 * @return int
+	 * @describe 统计已结算课程数量
+	 */
+	int countIsSalaryNum(Long vipGroupId);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/10/9
+	 * @params [vipGroupId]
+	 * @return int
+	 * @describe 统计被投诉课程数量
+	 */
+	int countComplaintsNum(Long vipGroupId);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/10/9
+	 * @params [vipGroupId]
 	 * @return com.ym.mec.biz.dal.dto.TeachingRecordBaseInfo
 	 * @describe 获取vip课的总课次及已上课次
 	 */

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentVipGroupShowListDto.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.enums.VipGroupActivityTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.math.BigDecimal;
@@ -47,6 +48,37 @@ public class StudentVipGroupShowListDto {
     @ApiModelProperty(value = "教师头像",required = false)
     private String avatar;
 
+    /** 活动类型(基础活动、折扣、赠送课时) */
+    private VipGroupActivityTypeEnum type;
+
+    private String attribute1;
+
+    private String categoryName;
+
+    public String getCategoryName() {
+        return categoryName;
+    }
+
+    public void setCategoryName(String categoryName) {
+        this.categoryName = categoryName;
+    }
+
+    public VipGroupActivityTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(VipGroupActivityTypeEnum type) {
+        this.type = type;
+    }
+
+    public String getAttribute1() {
+        return attribute1;
+    }
+
+    public void setAttribute1(String attribute1) {
+        this.attribute1 = attribute1;
+    }
+
     public String getIntroduction() {
         return introduction;
     }

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

@@ -69,6 +69,9 @@ public class ClassGroup {
 
 	@ApiModelProperty(value = "当前课次",required = false)
 	private Integer currentClassTimes;
+	
+	@ApiModelProperty(value = "班级图标",required = false)
+	private String img;
 
 	public String getTeachMode() {
 		return teachMode;
@@ -198,6 +201,14 @@ public class ClassGroup {
 		this.expectStudentNum = expectStudentNum;
 	}
 
+	public String getImg() {
+		return img;
+	}
+
+	public void setImg(String img) {
+		this.img = img;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java

@@ -64,6 +64,16 @@ public class VipGroupActivity {
 
 	private String vipGroupCategoryNames;
 
+	private Integer enable;
+
+	public Integer getEnable() {
+		return enable;
+	}
+
+	public void setEnable(Integer enable) {
+		this.enable = enable;
+	}
+
 	public String getVipGroupCategoryNames() {
 		return vipGroupCategoryNames;
 	}

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/VipGroupTeachingRecordQueryInfo.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.page;
 
 import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
 
@@ -10,14 +11,29 @@ import java.util.Date;
  */
 public class VipGroupTeachingRecordQueryInfo extends QueryInfo {
 
+    @ApiModelProperty(value = "vip课编号")
+    private Long vipGroupId;
+
+    @ApiModelProperty(value = "开始时间")
     private Date startTime;
 
+    @ApiModelProperty(value = "结束时间")
     private Date endTime;
 
+    @ApiModelProperty(value = "vip课编号")
     private String teachMode;
 
+    @ApiModelProperty(value = "vip课编号")
     private String status;
 
+    public Long getVipGroupId() {
+        return vipGroupId;
+    }
+
+    public void setVipGroupId(Long vipGroupId) {
+        this.vipGroupId = vipGroupId;
+    }
+
     public Date getStartTime() {
         return startTime;
     }

+ 31 - 21
mec-biz/src/main/java/com/ym/mec/biz/service/StudentAttendanceService.java

@@ -1,33 +1,43 @@
 package com.ym.mec.biz.service;
 
+import java.util.List;
+import java.util.Map;
+
+import com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
-import java.util.List;
-import java.util.Map;
-
 public interface StudentAttendanceService extends BaseService<Long, StudentAttendance> {
 
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/11
-     * 批量插入学生上课签到信息
-     */
-    void addStudentAttendances(List<StudentAttendance> studentAttendances);
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/11
+	 * 批量插入学生上课签到信息
+	 */
+	void addStudentAttendances(List<StudentAttendance> studentAttendances);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/16
+	 * 获取当前课程的学生
+	 */
+	Map<String, Object> getCurrentCourseStudents(QueryInfo queryInfo);
 
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/16
-     * 获取当前课程的学生
-     */
-    Map<String, Object> getCurrentCourseStudents(QueryInfo queryInfo);
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/16
+	 * 获取学生个人签到信息
+	 */
+	PageInfo<StudentPersonalAttendanceDto> getStudentPersonalAttendances(QueryInfo queryInfo);
 
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/16
-     * 获取学生个人签到信息
-     */
-    PageInfo getStudentPersonalAttendances(QueryInfo queryInfo);
+	/**
+	 * 请假
+	 * @param userId 用户编号
+	 * @param courseScheduleId 课程编号
+	 * @param remark 请假理由
+	 * @return
+	 */
+	boolean leave(Integer userId, Long courseScheduleId, String remark);
 }

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

@@ -340,6 +340,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	public void courseScheduleCommplaint(CourseScheduleComplaints courseScheduleComplaints) {
 		SysUser user = sysUserFeignService.queryUserInfo();
 
+		courseScheduleComplaints.setUserId(user.getId());
+
 		CourseScheduleComplaints byUserAndCourse = courseScheduleComplaintsDao.findByUserAndCourse(courseScheduleComplaints.getUserId().longValue(), courseScheduleComplaints.getCourseScheduleId());
 		if(byUserAndCourse!=null){
 			throw new BizException("您已经对该课程进行过申诉操作!");

+ 63 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java

@@ -1,27 +1,37 @@
 package com.ym.mec.biz.service.impl;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
 import com.ym.mec.biz.dal.dao.CourseScheduleDao;
 import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
 import com.ym.mec.biz.dal.dao.StudentAttendanceDao;
 import com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto;
 import com.ym.mec.biz.dal.dto.StudentStatusCountUtilEntity;
+import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
+import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.StudentAttendanceQueryInfo;
 import com.ym.mec.biz.service.StudentAttendanceService;
 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 org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import com.ym.mec.util.date.DateUtil;
 
 @Service
 public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentAttendance>  implements StudentAttendanceService {
@@ -32,6 +42,9 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 	private MusicGroupStudentFeeDao studentFeeDao;
 	@Autowired
 	private CourseScheduleDao courseScheduleDao;
+	
+	@Autowired
+	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 
 	@Override
 	public BaseDAO<Long, StudentAttendance> getDAO() {
@@ -73,7 +86,7 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 	public Map<String, Object> getCurrentCourseStudents(QueryInfo queryInfo) {
 		Map<String,Object> result=new HashMap<>();
 
-		PageInfo pageInfo = super.queryPage(queryInfo);
+		PageInfo<StudentAttendance> pageInfo = super.queryPage(queryInfo);
 
 		result.put("pageInfo",pageInfo);
 
@@ -84,6 +97,8 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 				case LEAVE:
 					result.put("numberOfLeavePeoples",studentStatusCount.getNumberOfStudent());
 					break;
+			default:
+				break;
 
 			}
 		});
@@ -92,7 +107,7 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 	}
 
 	@Override
-	public PageInfo getStudentPersonalAttendances(QueryInfo queryInfo) {
+	public PageInfo<StudentPersonalAttendanceDto> getStudentPersonalAttendances(QueryInfo queryInfo) {
 		PageInfo<StudentPersonalAttendanceDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
 		Map<String, Object> params = new HashMap<String, Object>();
 		MapUtil.populateMap(params, queryInfo);
@@ -110,4 +125,43 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 		pageInfo.setRows(dataList);
 		return pageInfo;
 	}
+
+	@Override
+	@Transactional
+	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();
+		
+		if(DateUtil.addHours(date, 2).after(courseSchedule.getStartClassTime())){
+			throw new BizException("开课2个小时之前才可以请假");
+		}
+		
+		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);
+		
+		studentAttendanceDao.insert(studentAttendance);
+		
+		ClassGroupStudentMapper classGroupStudentMapper = classGroupStudentMapperDao.query(courseSchedule.getClassGroupId(), userId);
+		classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.LEAVE);
+		classGroupStudentMapperDao.update(classGroupStudentMapper);
+		
+		//发送消息至老师
+		
+		return true;
+	}
 }

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

@@ -177,7 +177,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 	@Override
 	public TeachingRecordBaseInfo findTeachingRecordBaseInfo(Long vipGroupId) {
-		return null;
+        TeachingRecordBaseInfo classTimes = vipGroupDao.getClassTimes(vipGroupId);
+        classTimes.setIsSalaryNum(vipGroupDao.countIsSalaryNum(vipGroupId));
+        classTimes.setComplaintsNum(vipGroupDao.countComplaintsNum(vipGroupId));
+        return classTimes;
 	}
 
 	@Override

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

@@ -17,6 +17,7 @@
         <result column="del_flag_" property="delFlag" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="expect_student_num_" property="expectStudentNum"/>
         <result column="total_class_times_" property="totalClassTimes"/>
+        <result column="img_" property="img"/>
         <!--<association property="musicGroupId" javaType="com.ym.mec.biz.dal.entity.MusicGroup" >-->
         <!--<result column="name_" property="name"/>-->
         <!--<result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>-->
@@ -52,6 +53,7 @@
             <if test="expectStudentNum!=null">expect_student_num_,</if>
             <if test="totalClassTimes!=null">total_class_times_,</if>
             <if test="currentClassTimes!=null">current_class_times_,</if>
+            <if test="img!=null">img_,</if>
         </trim>
         VALUES
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -66,6 +68,7 @@
             <if test="expectStudentNum!=null">#{expectStudentNum},</if>
             <if test="totalClassTimes!=null">#{totalClassTimes},</if>
             <if test="currentClassTimes!=null">#{currentClassTimes},</if>
+            <if test="img!=null">#{img},</if>
         </trim>
     </insert>
 
@@ -112,6 +115,9 @@
             <if test="currentClassTimes!=null">
                 current_class_times_=#{currentClassTimes},
             </if>
+            <if test="img!=null">
+                img_=#{img},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml

@@ -71,4 +71,8 @@
             (#{item.id},#{item.classGroupId},#{item.userId},#{item.status},#{item.createTime})
         </foreach>
     </insert>
+    
+    <select id="query" resultMap="ClassGroupStudentMapper" parameterType="map">
+		SELECT * FROM class_group_student_mapper where class_group_id_ = #{classGroupId} and user_id_ = #{userId}
+	</select>
 </mapper>

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

@@ -518,7 +518,7 @@
             cs.id_,
             cs.class_date_,
             CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
-            CONCAT(cs.class_date_,' ',cs.end_class_time_) end
+            CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
 			sc.paran_value_
         FROM
             course_schedule cs

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

@@ -16,7 +16,7 @@
 		<result column="organ_id_" property="organId" />
 		<result column="courses_start_time_" property="coursesStartTime" />
 		<result column="courses_end_time_" property="coursesEndTime" />
-		<result column="type_" property="type" />
+		<result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="attribute1_" property="attribute1" />
 		<result column="attribute2_" property="attribute2" />
 		<result column="attribute3_" property="attribute3" />
@@ -26,6 +26,7 @@
 		<result column="update_time_" property="updateTime" />
 		<result column="salary_settlement_json_" property="salarySettlementJson" />
 		<result column="vip_group_category_names_" property="vipGroupCategoryNames"/>
+		<result property="enable" column="enable"/>
 	</resultMap>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -123,6 +124,7 @@ type_ = #{type},
 	<select id="queryPage" resultMap="VipGroupActivity" parameterType="map">
 		SELECT
 		vga.*,
+		(NOW() BETWEEN start_time_ AND end_time_) enable,
 		GROUP_CONCAT(vgc.name_) vip_group_category_names_
 		FROM vip_group_activity vga
 		LEFT JOIN vip_group_category vgc ON FIND_IN_SET(vgc.id_,vga.vip_group_category_id_list_)

+ 30 - 4
mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml

@@ -56,12 +56,15 @@
         <result column="payment_expire_date_" property="paymentExpireDate"/>
         <result column="online_classes_num_" property="onlineClassesNum"/>
         <result column="offline_classes_num_" property="offlineClassesNum"/>
-        <result column="unit_price_" property="totalPrice"/>
+        <result column="total_price_" property="totalPrice"/>
         <result column="expect_student_num_" property="expectStudentNum"/>
         <result column="student_num_" property="studentNum"/>
         <result column="teacher_name_" property="teacherName"/>
         <result column="introduction_" property="introduction"/>
         <result column="avatar_" property="avatar"/>
+        <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="attribute1_" property="attribute1" />
+        <result column="category_name_" property="categoryName"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -241,7 +244,10 @@
             cg.student_num_,
             su.username_ teacher_name_,
             su.avatar_,
-            t.introduction_
+            t.introduction_,
+            vga.type_,
+            vga.attribute1_,
+            vgc.name_ category_name_
         FROM
             vip_group vg
             LEFT JOIN vip_group_class_group_mapper vgcgm ON vg.id_=vgcgm.vip_group_id_
@@ -249,6 +255,8 @@
             LEFT JOIN class_group_teacher_mapper cgtm ON vgcgm.class_group_id_=cgtm.class_group_id_
             LEFT JOIN teacher t ON cgtm.user_id_=t.id_
             LEFT JOIN sys_user su ON cgtm.user_id_=su.id_
+            LEFT JOIN vip_group_activity vga ON vg.vip_group_activity_id_=vga.id_
+            LEFT JOIN vip_group_category vgc ON vg.vip_group_category_id_=vgc.id_
             <include refid="studentVipGroupQueryCondition"/>
         ORDER BY vg.id_ DESC
         <include refid="global.limit"/>
@@ -405,7 +413,7 @@
         </where>
     </sql>
 
-    <select id="findTeachingRecord">
+    <select id="findTeachingRecord" resultMap="teachingRecord">
         SELECT
             cs.id_,
             CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
@@ -419,7 +427,7 @@
         ORDER BY cs.id_
         <include refid="global.limit"/>
     </select>
-    <select id="countTeachingRecord">
+    <select id="countTeachingRecord" resultType="int">
         SELECT
         COUNT(*)
         FROM
@@ -437,4 +445,22 @@
             LEFT JOIN class_group cg ON vgcgm.class_group_id_=cg.id_
         WHERE vgcgm.vip_group_id_=#{vipGroupId}
     </select>
+    <select id="countIsSalaryNum" resultType="int">
+        SELECT
+            COUNT(*)
+        FROM
+            vip_group_class_group_mapper vgcgm
+            LEFT JOIN course_schedule cs ON vgcgm.class_group_id_=cs.class_group_id_
+        WHERE vgcgm.vip_group_id_=#{vipGroupId} AND cs.is_salary_=1
+    </select>
+    <select id="countComplaintsNum" resultType="java.lang.Integer">
+        SELECT
+            COUNT(*)
+        FROM
+            vip_group_class_group_mapper vgcgm
+            LEFT JOIN course_schedule cs ON vgcgm.class_group_id_=cs.class_group_id_
+            LEFT JOIN course_schedule_complaints csc ON cs.id_=csc.course_schedule_id_
+        WHERE vgcgm.vip_group_id_=#{vipGroupId} AND csc.course_schedule_id_ IS NOT NULL
+
+    </select>
 </mapper>

+ 12 - 3
mec-education/src/main/java/com/ym/mec/education/controller/TeacherController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.education.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.education.base.BaseResponse;
 import com.ym.mec.education.base.PageResponse;
 import com.ym.mec.education.req.HomeWorkReq;
@@ -44,7 +45,6 @@ public class TeacherController {
 
 
     /**
-     *
      * @param req
      * @return
      */
@@ -60,12 +60,21 @@ public class TeacherController {
     }
 
     /**
-     *
      * @return
      */
     @PostMapping(value = "/teacherVipClass")
-    public PageResponse teacherVipClass(@RequestBody TeacherReq req){
+    public PageResponse teacherVipClass(@RequestBody TeacherReq req) {
 
         return teacherService.teacherVipClass(req);
     }
+
+    /**
+     * 老师的日程安排
+     * @param teacherReq
+     * @return
+     */
+    @PostMapping("/dailySchedule")
+    public PageResponse dailySchedule(@RequestBody TeacherReq teacherReq) {
+        return teacherService.dailySchedule(teacherReq);
+    }
 }

+ 1 - 1
mec-education/src/main/java/com/ym/mec/education/enums/SignStatusEnum.java

@@ -3,7 +3,7 @@ package com.ym.mec.education.enums;
 import com.ym.mec.common.enums.BaseEnum;
 import java.util.Arrays;
 
-//状态(1正常签到,0异常签到,2正常签退)
+//老师签到状态(1正常签到,0异常签到,2正常签退)
 public enum SignStatusEnum implements BaseEnum<Integer, SignStatusEnum> {
     SIGN(1,"正常签到"),
     EXCEPTION(0,"异常签到"),

+ 4 - 0
mec-education/src/main/java/com/ym/mec/education/req/TeacherReq.java

@@ -4,6 +4,7 @@ import com.ym.mec.education.base.BaseQuery;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.ToString;
+import java.util.Date;
 
 /**
  * @version V1.0
@@ -18,4 +19,7 @@ public class TeacherReq extends BaseQuery {
 
     @ApiModelProperty(value = "老师编号")
     private Integer userId;
+
+    @ApiModelProperty(value = "日程安排时间")
+    private Date date;
 }

+ 34 - 0
mec-education/src/main/java/com/ym/mec/education/resp/TeacherDailyScheduleResp.java

@@ -0,0 +1,34 @@
+package com.ym.mec.education.resp;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+
+/**
+ * @program: mec
+ * @description: 老师日程安排
+ * @author: xw
+ * @create: 2019-10-08 17:24
+ */
+@Data
+@ApiModel(description = "老师日程安排")
+@Accessors(chain = true)
+public class TeacherDailyScheduleResp implements Serializable {
+
+    @ApiModelProperty(value = "课程类型")
+    private String courseType;
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+    @ApiModelProperty(value = "老师签到情况")
+    private String signInStatus;
+    @ApiModelProperty(value = "到课比")
+    private String attendanceRate;
+    @ApiModelProperty(value = "请假人数")
+    private Integer leaveNum;
+    @ApiModelProperty(value = "上课时间")
+    private String classTime;
+    @ApiModelProperty(value = "学校名称")
+    private String schoolName;
+}

+ 2 - 0
mec-education/src/main/java/com/ym/mec/education/service/ITeacherService.java

@@ -21,4 +21,6 @@ public interface ITeacherService extends IService<Teacher> {
     BaseResponse teacherDetail(TeacherReq req);
 
     PageResponse teacherVipClass(TeacherReq req);
+
+    PageResponse dailySchedule(TeacherReq req);
 }

+ 4 - 3
mec-education/src/main/java/com/ym/mec/education/service/impl/StudentAttendanceServiceImpl.java

@@ -76,7 +76,8 @@ public class StudentAttendanceServiceImpl extends ServiceImpl<StudentAttendanceM
         QueryWrapper<StudentAttendance> leaveWrapper = new QueryWrapper<>();
         QueryWrapper<StudentAttendance> normalWrapper = new QueryWrapper<>();
         //总人数
-        Integer totalCount = count();
+        queryWrapper.lambda().eq(StudentAttendance::getClassGroupId, classGroupReq.getGroupId());
+        Integer totalCount = count(queryWrapper);
         //请假
         leaveWrapper.lambda().eq(true, StudentAttendance::getClassGroupId, classGroupReq.getGroupId())
                 .eq(true, StudentAttendance::getStatus, StudentAttendanceStatusEnum.LEAVE.getCode());
@@ -151,7 +152,7 @@ public class StudentAttendanceServiceImpl extends ServiceImpl<StudentAttendanceM
         Page<StudentAttendanceStatisticsResp> pageResult = new Page();
         ClassGroup classGroup = groupService.getById(classGroupReq.getGroupId());
         if (Objects.nonNull(classGroup)) {
-            List<String> subjectNameList = Lists.newArrayList();
+            List<String> subjectNameList;
             if (Objects.nonNull(classGroupReq.getSubjectId())) {
                 subjectNameList = Lists.newArrayList(subjectService.getById(classGroupReq.getSubjectId()).getName());
             } else {
@@ -259,7 +260,7 @@ public class StudentAttendanceServiceImpl extends ServiceImpl<StudentAttendanceM
         }
         PageResponse response = new PageResponse();
 
-        IPage<StudentAttendance> page = new Page<>(req.getPageNo(),req.getPageSize());
+        IPage<StudentAttendance> page = new Page<StudentAttendance>(req.getPageNo(),req.getPageSize());
         IPage<StudentAttendance> studentAttendanceIPage = this.page(page,new QueryWrapper<StudentAttendance>().eq("course_schedule_id_",req.getCourseScheduleId()));
 
         List<CallStudentResp> callStudentResps = new ArrayList<>();

+ 148 - 69
mec-education/src/main/java/com/ym/mec/education/service/impl/TeacherServiceImpl.java

@@ -4,19 +4,22 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.ym.mec.common.security.AuthUser;
+import com.ym.mec.common.security.SecurityUtils;
 import com.ym.mec.education.base.BaseResponse;
 import com.ym.mec.education.base.PageResponse;
 import com.ym.mec.education.entity.*;
-import com.ym.mec.education.enums.ClassGroupTypeEnum;
-import com.ym.mec.education.enums.CourseStatusEnum;
-import com.ym.mec.education.enums.ReturnCodeEnum;
+import com.ym.mec.education.enums.*;
 import com.ym.mec.education.mapper.TeacherMapper;
 import com.ym.mec.education.req.TeacherReq;
+import com.ym.mec.education.resp.TeacherDailyScheduleResp;
 import com.ym.mec.education.resp.TeacherDetailResp;
 import com.ym.mec.education.resp.TeacherResp;
 import com.ym.mec.education.resp.VipGroupClassResp;
 import com.ym.mec.education.service.*;
 import com.ym.mec.education.utils.DateUtil;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -65,34 +68,43 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher> impl
 
     @Autowired
     private ICourseScheduleService courseScheduleService;
+    @Autowired
+    private ITeacherAttendanceService teacherAttendanceService;
+    @Autowired
+    private IStudentAttendanceService studentAttendanceService;
 
 
     @Autowired
     private IVipGroupDefaultClassesCycleService vipGroupDefaultClassesCycleService;
+    @Autowired
+    private IMusicGroupService musicGroupService;
+    @Autowired
+    private ISchoolService schoolService;
+
     @Override
     public PageResponse teacherList(TeacherReq req) {
         PageResponse response = new PageResponse();
         QueryWrapper<SysUser> userQueryWrapper = new QueryWrapper<>();
         List<SysUser> userList = null;
-        if(req != null && StringUtils.isEmpty(req.getName())){
-            userQueryWrapper.like("real_name_",req.getName());
+        if (req != null && StringUtils.isEmpty(req.getName())) {
+            userQueryWrapper.like("real_name_", req.getName());
             userList = sysUserService.list(userQueryWrapper);
         }
         QueryWrapper<Teacher> queryWrapper = new QueryWrapper<>();
         List<Integer> userIds = null;
-        if(!CollectionUtils.isEmpty(userList)){
+        if (!CollectionUtils.isEmpty(userList)) {
             userIds = userList.stream().map(SysUser::getId).collect(Collectors.toList());
-            queryWrapper.in("id_",userIds);
+            queryWrapper.in("id_", userIds);
         }
 
 
-        IPage<Teacher> page = new Page(req.getPageNo() == null ? 1 : req.getPageNo(),req.getPageSize() == null ? 10 : req.getPageSize());
-        IPage<Teacher> teacherIPage = this.page(page,queryWrapper);
+        IPage<Teacher> page = new Page(req.getPageNo() == null ? 1 : req.getPageNo(), req.getPageSize() == null ? 10 : req.getPageSize());
+        IPage<Teacher> teacherIPage = this.page(page, queryWrapper);
 
         List<Teacher> teacherList = teacherIPage.getRecords();
         List<TeacherResp> teacherRespList = new ArrayList<>();
-        if(!CollectionUtils.isEmpty(teacherList)){
-            teacherList.forEach(e ->{
+        if (!CollectionUtils.isEmpty(teacherList)) {
+            teacherList.forEach(e -> {
                 TeacherResp teacherResp = new TeacherResp();
                 String ids[] = e.getSubjectId().split(",");
                 List<String> stringB = Arrays.asList(ids);
@@ -105,19 +117,19 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher> impl
                 }
                 teacherResp.setUserId(e.getId());
                 SysUser sysUser = sysUserService.getById(e.getId());
-                if(sysUser != null){
+                if (sysUser != null) {
                     teacherResp.setAvatar(sysUser.getAvatar());
                     teacherResp.setName(sysUser.getRealName());
                 }
                 QueryWrapper<ClassGroupTeacherMapper> queryWrapper1 = new QueryWrapper<>();
-                queryWrapper1.eq("user_id_",e.getId());
+                queryWrapper1.eq("user_id_", e.getId());
                 List<ClassGroupTeacherMapper> classGroupTeacherMappers = classGroupTeacherMapperService.list(queryWrapper1);
-                if(!CollectionUtils.isEmpty(classGroupTeacherMappers)){
+                if (!CollectionUtils.isEmpty(classGroupTeacherMappers)) {
                     List<Integer> classId = classGroupTeacherMappers.stream().map(ClassGroupTeacherMapper::getClassGroupId).collect(Collectors.toList());
                     QueryWrapper<ClassGroup> groupQueryWrapper = new QueryWrapper<>();
-                    groupQueryWrapper.eq("id_",classId);
+                    groupQueryWrapper.eq("id_", classId);
                     List<ClassGroup> classGroups = classGroupService.list(groupQueryWrapper);
-                    if(!CollectionUtils.isEmpty(classGroups)){
+                    if (!CollectionUtils.isEmpty(classGroups)) {
                         List<String> className = classGroups.stream().map(ClassGroup::getName).collect(Collectors.toList());
 
                         teacherResp.setClassName(className);
@@ -139,61 +151,60 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher> impl
     public BaseResponse teacherDetail(TeacherReq req) {
 
         TeacherDetailResp teacherDetailResp = new TeacherDetailResp();
-        if(req == null || req.getUserId() == null){
-            return  BaseResponse.errorParam();
+        if (req == null || req.getUserId() == null) {
+            return BaseResponse.errorParam();
         }
         QueryWrapper<ClassGroupTeacherMapper> mapperQueryWrapper = new QueryWrapper<>();
-        mapperQueryWrapper.eq("user_id_",req.getUserId());
-        List<ClassGroupTeacherMapper> groupTeacherMapperList =  classGroupTeacherMapperService.list(mapperQueryWrapper);
+        mapperQueryWrapper.eq("user_id_", req.getUserId());
+        List<ClassGroupTeacherMapper> groupTeacherMapperList = classGroupTeacherMapperService.list(mapperQueryWrapper);
 
-        if(!CollectionUtils.isEmpty(groupTeacherMapperList)){
-            List<Integer> classIds = groupTeacherMapperList.stream().map(ClassGroupTeacherMapper :: getClassGroupId).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(groupTeacherMapperList)) {
+            List<Integer> classIds = groupTeacherMapperList.stream().map(ClassGroupTeacherMapper::getClassGroupId).collect(Collectors.toList());
             QueryWrapper<ClassGroup> queryWrapper = new QueryWrapper<>();
-            queryWrapper.in("id_",classIds);
+            queryWrapper.in("id_", classIds);
             List<ClassGroup> classGroups = classGroupService.list(queryWrapper);
-            if(!CollectionUtils.isEmpty(classGroups)){
+            if (!CollectionUtils.isEmpty(classGroups)) {
                 List<ClassGroup> norClass = classGroups.stream().filter(e -> ClassGroupTypeEnum.NORMAL.getCode().equalsIgnoreCase(e.getType()) ||
-                                ClassGroupTypeEnum.MIX.getCode().equalsIgnoreCase(e.getType()) ||  ClassGroupTypeEnum.HIGH.getCode().equalsIgnoreCase(e.getType())).collect(Collectors.toList());
+                    ClassGroupTypeEnum.MIX.getCode().equalsIgnoreCase(e.getType()) || ClassGroupTypeEnum.HIGH.getCode().equalsIgnoreCase(e.getType())).collect(Collectors.toList());
 
                 List<ClassGroup> vipClass = classGroups.stream().filter(e -> ClassGroupTypeEnum.VIP.getCode().equalsIgnoreCase(e.getType())).collect(Collectors.toList());
-                if(!CollectionUtils.isEmpty(norClass)){
+                if (!CollectionUtils.isEmpty(norClass)) {
                     Integer norCount = norClass.stream().mapToInt(ClassGroup::getTotalClassTimes).sum();
                     teacherDetailResp.setGroupClassNum(norCount * norClass.size());
                 }
 
-                if(!CollectionUtils.isEmpty(vipClass)){
+                if (!CollectionUtils.isEmpty(vipClass)) {
                     Integer vipCount = vipClass.stream().mapToInt(ClassGroup::getTotalClassTimes).sum();
                     teacherDetailResp.setVipClassNum(vipCount * vipClass.size());
                 }
                 QueryWrapper<DemoGroup> demoGroupQueryWrapper = new QueryWrapper<>();
-                demoGroupQueryWrapper.eq("user_id_",req.getUserId());
+                demoGroupQueryWrapper.eq("user_id_", req.getUserId());
                 List<DemoGroup> demoGroupList = demoGroupService.list(demoGroupQueryWrapper);
-                if(!CollectionUtils.isEmpty(demoGroupList)){
-                    List<Long> demoId = demoGroupList.stream().map(e ->e.getId()).collect(Collectors.toList());
+                if (!CollectionUtils.isEmpty(demoGroupList)) {
+                    List<Long> demoId = demoGroupList.stream().map(e -> e.getId()).collect(Collectors.toList());
                     QueryWrapper<DemoGroupCoursesPlan> planQueryWrapper = new QueryWrapper<>();
-                    planQueryWrapper.in("demo_group_id_",demoId);
-                    List<DemoGroupCoursesPlan> demoGroupCoursesPlans =  iDemoGroupCoursesPlanService.list(planQueryWrapper);
-                    if(!CollectionUtils.isEmpty(demoGroupCoursesPlans)){
+                    planQueryWrapper.in("demo_group_id_", demoId);
+                    List<DemoGroupCoursesPlan> demoGroupCoursesPlans = iDemoGroupCoursesPlanService.list(planQueryWrapper);
+                    if (!CollectionUtils.isEmpty(demoGroupCoursesPlans)) {
                         Map<Date, List<DemoGroupCoursesPlan>> collect = demoGroupCoursesPlans.stream()
-                                .collect(
-                                        Collectors.groupingBy(DemoGroupCoursesPlan::getCourseDate));
-
+                            .collect(
+                                Collectors.groupingBy(DemoGroupCoursesPlan::getCourseDate));
 
 
-                        if(!CollectionUtils.isEmpty(collect)) {
+                        if (!CollectionUtils.isEmpty(collect)) {
                             List<TeacherDetailResp.InnerDemoGroup> innerDemoGroups = new ArrayList<>();
                             for (Date key : collect.keySet()) {
                                 TeacherDetailResp.InnerDemoGroup demoGroup = new TeacherDetailResp.InnerDemoGroup();
-                                demoGroup.setDateStr(DateUtil.date2String(key,DateUtil.DATE_FORMAT));
+                                demoGroup.setDateStr(DateUtil.date2String(key, DateUtil.DATE_FORMAT));
                                 demoGroup.setWeek(DateUtil.date2Week(key));
 
                                 List<DemoGroupCoursesPlan> demoGroupCoursesPlans1 = collect.get(key);
-                                if(!CollectionUtils.isEmpty(demoGroupCoursesPlans1)){
+                                if (!CollectionUtils.isEmpty(demoGroupCoursesPlans1)) {
                                     List<TeacherDetailResp.DemoGroupPlan> planList = new ArrayList<>();
-                                    demoGroupCoursesPlans1.forEach(e ->{
+                                    demoGroupCoursesPlans1.forEach(e -> {
                                         TeacherDetailResp.DemoGroupPlan demoGroupPlan = new TeacherDetailResp.DemoGroupPlan();
-                                        demoGroupPlan.setStartTime(DateUtil.date2String(e.getStartTime(),DateUtil.TIME_FORMAT));
-                                        demoGroupPlan.setEndTime(DateUtil.date2String(e.getEndTime(),DateUtil.TIME_FORMAT));
+                                        demoGroupPlan.setStartTime(DateUtil.date2String(e.getStartTime(), DateUtil.TIME_FORMAT));
+                                        demoGroupPlan.setEndTime(DateUtil.date2String(e.getEndTime(), DateUtil.TIME_FORMAT));
                                         planList.add(demoGroupPlan);
                                     });
                                     demoGroup.setDemoGroupPlans(planList);
@@ -202,12 +213,12 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher> impl
                             }
 
                             QueryWrapper<CourseSchedule> scheduleQueryWrapper = new QueryWrapper<>();
-                            scheduleQueryWrapper.eq("teacher_id_",req.getUserId());
+                            scheduleQueryWrapper.eq("teacher_id_", req.getUserId());
                             scheduleQueryWrapper.eq("status_", CourseStatusEnum.OVER.getCode());
                             List<CourseSchedule> courseSchedules = courseScheduleService.list(scheduleQueryWrapper);
-                            if(!CollectionUtils.isEmpty(courseSchedules)){
+                            if (!CollectionUtils.isEmpty(courseSchedules)) {
                                 teacherDetailResp.setUsed(courseSchedules.size());
-                            }else{
+                            } else {
                                 teacherDetailResp.setUsed(0);
                             }
 
@@ -221,14 +232,14 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher> impl
             }
 
             QueryWrapper<TeacherLeaveRecord> teacherLeaveRecordQueryWrapper = new QueryWrapper<>();
-            teacherLeaveRecordQueryWrapper.eq("user_id_",req.getUserId());
+            teacherLeaveRecordQueryWrapper.eq("user_id_", req.getUserId());
             List<TeacherLeaveRecord> teacherLeaveRecordList = teacherLeaveRecordService.list(teacherLeaveRecordQueryWrapper);
-            if(!CollectionUtils.isEmpty(teacherLeaveRecordList)){
+            if (!CollectionUtils.isEmpty(teacherLeaveRecordList)) {
                 AtomicReference<Integer> count = new AtomicReference<>(0);
-                teacherLeaveRecordList.forEach(e ->{
+                teacherLeaveRecordList.forEach(e -> {
 
-                    Integer hour = DateUtil.subMin(e.getStartTime(),e.getEndTime());
-                    if (hour != null){
+                    Integer hour = DateUtil.subMin(e.getStartTime(), e.getEndTime());
+                    if (hour != null) {
                         count.set(count.get() + hour);
                     }
                 });
@@ -243,56 +254,56 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher> impl
     public PageResponse teacherVipClass(TeacherReq req) {
 
         PageResponse response = new PageResponse();
-        if(req == null && req.getUserId() == null){
+        if (req == null && req.getUserId() == null) {
             return PageResponse.errorParam();
         }
 
-        IPage page = new Page(req.getPageNo() == null ? 1 : req.getPageNo(),req.getPageSize() == null ? 10 : req.getPageSize());
+        IPage page = new Page(req.getPageNo() == null ? 1 : req.getPageNo(), req.getPageSize() == null ? 10 : req.getPageSize());
         QueryWrapper<VipGroup> vipGroupQueryWrapper = new QueryWrapper<>();
-        vipGroupQueryWrapper.eq("user_id_",req.getUserId());
-        IPage<VipGroup> vipGroupPage = vipGroupService.page(page,vipGroupQueryWrapper);
+        vipGroupQueryWrapper.eq("user_id_", req.getUserId());
+        IPage<VipGroup> vipGroupPage = vipGroupService.page(page, vipGroupQueryWrapper);
 
         List<VipGroup> vipGroupList = vipGroupPage.getRecords();
         List<VipGroupClassResp> vipGroupClassRespList = new ArrayList<>();
-        if(!CollectionUtils.isEmpty(vipGroupList)){
+        if (!CollectionUtils.isEmpty(vipGroupList)) {
 
-            vipGroupList.forEach(e ->{
+            vipGroupList.forEach(e -> {
                 VipGroupClassResp vipGroupClassResp = new VipGroupClassResp();
                 vipGroupClassResp.setVipGroupName(e.getName());
 
-                VipGroupCategory vipGroupCategory =  vipGroupCategoryService.getById(e.getVipGroupCategoryId());
-                if(vipGroupCategory != null){
+                VipGroupCategory vipGroupCategory = vipGroupCategoryService.getById(e.getVipGroupCategoryId());
+                if (vipGroupCategory != null) {
                     vipGroupClassResp.setVipClassType(vipGroupCategory.getName());
                 }
 
                 QueryWrapper<CourseSchedule> scheduleQueryWrapper = new QueryWrapper<>();
-                scheduleQueryWrapper.eq("teacher_id_",req.getUserId());
+                scheduleQueryWrapper.eq("teacher_id_", req.getUserId());
                 List<CourseSchedule> courseSchedules = courseScheduleService.list(scheduleQueryWrapper);
-                if(!CollectionUtils.isEmpty(courseSchedules)){
-                    courseSchedules.forEach(c ->{
-                        c.setClassDateStr(DateUtil.date2String(c.getClassDate(),DateUtil.DATE_FORMAT_EXTRA));
+                if (!CollectionUtils.isEmpty(courseSchedules)) {
+                    courseSchedules.forEach(c -> {
+                        c.setClassDateStr(DateUtil.date2String(c.getClassDate(), DateUtil.DATE_FORMAT_EXTRA));
 
                     });
-                    Map<String,List<CourseSchedule>> map = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getClassDateStr));
+                    Map<String, List<CourseSchedule>> map = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getClassDateStr));
 
-                    if(!CollectionUtils.isEmpty(map)){
+                    if (!CollectionUtils.isEmpty(map)) {
 
                         int count1 = map.size();
-                        int count2 =0;
+                        int count2 = 0;
                         for (Map.Entry<String, List<CourseSchedule>> entry : map.entrySet()) {
 
-                            if(!CollectionUtils.isEmpty(entry.getValue())){
+                            if (!CollectionUtils.isEmpty(entry.getValue())) {
                                 count2 = count2 + entry.getValue().size();
                             }
 
                         }
                         //月平均排課
 
-                        if(count1 <= count2){
+                        if (count1 <= count2) {
                             vipGroupClassResp.setClassNum(1);
-                        }else{
+                        } else {
 
-                            vipGroupClassResp.setClassNum(count2%count1);
+                            vipGroupClassResp.setClassNum(count2 % count1);
                         }
 
                     }
@@ -306,4 +317,72 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher> impl
         response.setMessage(ReturnCodeEnum.CODE_200.getValue());
         return response;
     }
+
+    @Override
+    public PageResponse dailySchedule(TeacherReq req) {
+        AuthUser user = SecurityUtils.getUser();
+        Optional<AuthUser> optional = Optional.ofNullable(user);
+        Page<TeacherDailyScheduleResp> pageResult = new Page<>();
+        Integer userId;
+        if (optional.isPresent()) {
+            userId = optional.get().getUserId();
+        } else {
+            if (Objects.isNull(req.getUserId())) {
+                return PageResponse.errorParam();
+            }
+            userId = req.getUserId();
+        }
+        List<TeacherDailyScheduleResp> list = Lists.newArrayList();
+        Page<CourseSchedule> courseSchedulePage = new Page<>(req.getPageNo(), req.getPageSize());
+        QueryWrapper<CourseSchedule> courseScheduleQueryWrapper = new QueryWrapper<>();
+        courseScheduleQueryWrapper.lambda().eq(CourseSchedule::getTeacherId, userId)
+            .eq(Objects.isNull(req.getDate()), CourseSchedule::getClassDate, req.getDate());
+        IPage<CourseSchedule> page = courseScheduleService.page(courseSchedulePage, courseScheduleQueryWrapper);
+        BeanUtils.copyProperties(page, pageResult);
+        if (!CollectionUtils.isEmpty(page.getRecords())) {
+            page.getRecords().forEach(courseSchedule -> {
+                TeacherDailyScheduleResp teacherDailyScheduleResp = new TeacherDailyScheduleResp();
+                teacherDailyScheduleResp.setCourseName(courseSchedule.getName())
+                    .setCourseType(CourseSchedule.CourseScheduleType.getMsgByCode(courseSchedule.getType()));
+                if (Objects.nonNull(courseSchedule.getStartClassTime()) && Objects.nonNull(courseSchedule.getEndClassTime())) {
+                    teacherDailyScheduleResp.setClassTime(DateUtil.time2String(courseSchedule.getStartClassTime()) + "-" +
+                        DateUtil.time2String(courseSchedule.getEndClassTime()));
+                }
+                QueryWrapper<TeacherAttendance> teacherAttendanceQueryWrapper = new QueryWrapper<>();
+                teacherAttendanceQueryWrapper.lambda().eq(TeacherAttendance::getCourseScheduleId, courseSchedule.getId())
+                    .eq(TeacherAttendance::getTeacherId, courseSchedule.getTeacherId())
+                    .eq(TeacherAttendance::getClassGroupId, courseSchedule.getClassGroupId());
+                TeacherAttendance teacherAttendance = teacherAttendanceService.getOne(teacherAttendanceQueryWrapper);
+                Optional.ofNullable(teacherAttendance).ifPresent(attendance -> teacherDailyScheduleResp.setSignInStatus
+                    (SignStatusEnum.getMsgByCode(attendance.getSignInStatus())));
+                //考勤总人数
+                QueryWrapper<StudentAttendance> totalQueryWrapper = new QueryWrapper<>();
+                totalQueryWrapper.lambda().eq(StudentAttendance::getCourseScheduleId, courseSchedule.getId());
+                int totalCount = studentAttendanceService.count(totalQueryWrapper);
+                QueryWrapper<StudentAttendance> leaveWrapper = new QueryWrapper<>();
+                //请假人数
+                leaveWrapper.lambda().eq(StudentAttendance::getCourseScheduleId, courseSchedule.getId())
+                    .eq(StudentAttendance::getStatus, StudentAttendanceStatusEnum.LEAVE.getCode());
+                Integer leaveCount = studentAttendanceService.count(leaveWrapper);
+                //已到人数
+                QueryWrapper<StudentAttendance> normalWrapper = new QueryWrapper<>();
+                normalWrapper.lambda().eq(StudentAttendance::getCourseScheduleId, courseSchedule.getId())
+                    .eq(StudentAttendance::getStatus, StudentAttendanceStatusEnum.NORMAL.getCode());
+                Integer normalCount = studentAttendanceService.count(normalWrapper);
+                teacherDailyScheduleResp.setAttendanceRate(normalCount + "/" + totalCount)
+                    .setLeaveNum(leaveCount);
+                ClassGroup classGroup = classGroupService.getById(courseSchedule.getClassGroupId());
+                if (Objects.nonNull(classGroup)) {
+                    MusicGroup musicGroup = musicGroupService.getById(classGroup.getMusicGroupId());
+                    if (Objects.nonNull(musicGroup)) {
+                        School school = schoolService.getById(musicGroup.getSchoolId());
+                        Optional.ofNullable(school).ifPresent(value -> teacherDailyScheduleResp.setSchoolName(value.getName()));
+                    }
+                }
+                list.add(teacherDailyScheduleResp);
+                pageResult.setRecords(list);
+            });
+        }
+        return PageResponse.success(pageResult);
+    }
 }

+ 55 - 47
mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseScheduleController.java

@@ -1,21 +1,28 @@
 package com.ym.mec.student.controller;
 
-import com.ym.mec.biz.dal.dto.ClassDateAdjustDto;
-import com.ym.mec.biz.dal.entity.CourseScheduleComplaints;
-import com.ym.mec.biz.dal.page.StudentCourseScheduleRecordQueryInfo;
-import com.ym.mec.biz.service.CourseScheduleService;
-import com.ym.mec.biz.service.StudentAttendanceService;
-import com.ym.mec.common.controller.BaseController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.*;
 
 import java.util.Date;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+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.RequestParam;
+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.CourseScheduleComplaints;
+import com.ym.mec.biz.dal.page.StudentCourseScheduleRecordQueryInfo;
+import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.StudentAttendanceService;
+import com.ym.mec.common.controller.BaseController;
+
 /**
  * @Author Joburgess
  * @Date 2019/9/24
@@ -25,49 +32,50 @@ import java.util.Date;
 @RestController
 public class StudentCourseScheduleController extends BaseController {
 
-    @Autowired
-    private CourseScheduleService scheduleService;
-    @Autowired
-    private StudentAttendanceService studentAttendanceService;
+	@Autowired
+	private CourseScheduleService scheduleService;
+
+	@Autowired
+	private StudentAttendanceService studentAttendanceService;
 
-    @ApiOperation(value = "根据月份获取乐团在该月有课的日期")
-    @GetMapping("/getCourseScheduleDateByMonth")
-    public Object getCourseScheduleDateByMonth(@ApiParam(value = "月份", required = true) @RequestParam Date month,
-                                               @ApiParam(value = "未上课", required = true) Integer isAttend) {
-        return succeed(scheduleService.getCourseScheduleDateByStudent(month,isAttend));
-    }
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
 
-    @ApiOperation(value = "根据日期获取当日排课")
-    @GetMapping("/getCourseSchedulesWithDate")
-    public Object getCourseSchedulesWithDate(@ApiParam(value = "日期", required = true) Date date){
-        return succeed(scheduleService.getStudentCourseSchedulesWithDate(date));
-    }
+	@ApiOperation(value = "根据月份获取乐团在该月有课的日期")
+	@GetMapping("/getCourseScheduleDateByMonth")
+	public Object getCourseScheduleDateByMonth(@ApiParam(value = "月份", required = true) @RequestParam Date month,
+			@ApiParam(value = "未上课", required = true) Integer isAttend) {
+		return succeed(scheduleService.getCourseScheduleDateByStudent(month, isAttend));
+	}
 
-    @ApiOperation(value = "课时调整")
-    @PostMapping(value = "/classStartDateAdjust",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
-    public Object classStartDateAdjust(ClassDateAdjustDto classDateAdjustDto){
-        scheduleService.classStartDateAdjust(classDateAdjustDto);
-        return succeed();
-    }
+	@ApiOperation(value = "根据日期获取当日排课")
+	@GetMapping("/getCourseSchedulesWithDate")
+	public Object getCourseSchedulesWithDate(@ApiParam(value = "日期", required = true) Date date) {
+		return succeed(scheduleService.getStudentCourseSchedulesWithDate(date));
+	}
 
-    @ApiOperation(value = "课时交换")
-    @GetMapping(value = "/courseSwap",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
-    public Object courseSwap(Long courseScheduleId1,Long courseScheduleId2){
-        scheduleService.courseSwap(courseScheduleId1,courseScheduleId2);
-        return succeed();
-    }
+	@ApiOperation(value = "上课记录")
+	@GetMapping(value = "/findStudentCourseScheduleRecords")
+	public Object findStudentCourseScheduleRecords(StudentCourseScheduleRecordQueryInfo queryInfo) {
+		return succeed(scheduleService.findStudentCourseScheduleRecords(queryInfo));
+	}
 
-    @ApiOperation(value = "上课记录")
-    @GetMapping(value = "/findStudentCourseScheduleRecords")
-    public Object findStudentCourseScheduleRecords(StudentCourseScheduleRecordQueryInfo queryInfo){
-        return succeed(scheduleService.findStudentCourseScheduleRecords(queryInfo));
-    }
+	@ApiModelProperty(value = "课程投诉")
+	@PostMapping("/courseScheduleCommplaint")
+	public Object courseScheduleCommplaint(CourseScheduleComplaints courseScheduleComplaints) {
+		scheduleService.courseScheduleCommplaint(courseScheduleComplaints);
+		return succeed();
+	}
 
-    @ApiModelProperty(value = "课程投诉")
-    @PostMapping("/courseScheduleCommplaint")
-    public Object courseScheduleCommplaint(CourseScheduleComplaints courseScheduleComplaints){
-        scheduleService.courseScheduleCommplaint(courseScheduleComplaints);
-        return succeed();
-    }
+	@ApiModelProperty(value = "请假")
+	@PostMapping("/leave")
+	public Object leave(long courseScheduleId, String reason) {
+		SysUser user = sysUserFeignService.queryUserInfo();
+		if (user == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		studentAttendanceService.leave(user.getId(), courseScheduleId, reason);
+		return succeed();
+	}
 
 }

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

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.dto.VipGroupApplyDto;
 import com.ym.mec.biz.dal.entity.StudentApplyRefunds;
 import com.ym.mec.biz.dal.page.VipGroupAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupQueryInfo;
+import com.ym.mec.biz.dal.page.VipGroupTeachingRecordQueryInfo;
 import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.controller.BaseController;
 import io.swagger.annotations.Api;
@@ -37,34 +38,46 @@ public class VipGroupManageController extends BaseController {
     }
 
     @ApiOperation(value = "获取小课学员")
-    @GetMapping("/findVipGroupStudents")
+    @GetMapping(value = "/findVipGroupStudents")
     public Object findVipGroupStudents(VipGroupQueryInfo queryInfo){
         return succeed(vipGroupService.findVipGroupStudents(queryInfo));
     }
 
-    @ApiOperation("vip课详情")
+    @ApiOperation(value = "vip课详情")
     @GetMapping("/getVipGroupDetail/{vipGroupId}")
     public Object getVipGroupDetail(@PathVariable("vipGroupId") Long vipGroupId){
         return succeed(vipGroupService.getVipGroupDetail(vipGroupId));
     }
 
-    @ApiOperation("获取vip课考勤记录")
+    @ApiOperation(value = "获取vip课考勤记录")
     @PostMapping("/getVipGroupAttendances")
     public Object getVipGroupAttendances(@RequestBody VipGroupAttendanceQueryInfo queryInfo){
         return succeed(vipGroupService.findVipGroupAttendances(queryInfo));
     }
 
-    @ApiOperation("退课申请")
+    @ApiOperation(value = "退课申请")
     @PostMapping("/applyRefundForStudent")
     public Object applyRefundForStudent(Long vipGroupId,Long studentId){
         vipGroupService.applyRefund(vipGroupId,studentId);
         return succeed();
     }
 
-    @ApiOperation("退课申请审核")
+    @ApiOperation(value = "退课申请审核")
     @PostMapping("/applyRefundAudit")
     public Object applyRefundAudit(StudentApplyRefunds studentApplyRefunds){
         vipGroupService.applyRefundAudit(studentApplyRefunds);
         return succeed();
     }
+
+    @ApiOperation(value = "获取VIP课教学记录")
+    @GetMapping("/findVipGroupTeachingRecord")
+    public Object findVipGroupTeachingRecord(VipGroupTeachingRecordQueryInfo queryInfo){
+        return succeed(vipGroupService.findVipGroupTeachingRecord(queryInfo));
+    }
+
+    @ApiOperation(value = "获取vip课基本信息")
+    @GetMapping("/findTeachingRecordBaseInfo")
+    public Object findTeachingRecordBaseInfo(Long vipGroupId){
+        return succeed(vipGroupService.findTeachingRecordBaseInfo(vipGroupId));
+    }
 }

+ 2 - 5
mec-workflow/src/main/java/com/ym/mec/workfow/controller/flow/OrderController.java

@@ -13,12 +13,10 @@ import org.snaker.engine.entity.HistoryTask;
 import org.snaker.engine.entity.Process;
 import org.snaker.engine.entity.Task;
 import org.snaker.engine.helper.AssertHelper;
-import org.snaker.engine.model.ProcessModel;
 import org.springframework.beans.factory.annotation.Autowired;
 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.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
@@ -61,15 +59,14 @@ public class OrderController extends BaseController {
 	}
 
 	@GetMapping(value = "detail")
-	@ResponseBody
 	public Object json(String processId, String orderId) {
 		Process process = snakerEngine.process().getProcessById(processId);
 		AssertHelper.notNull(process);
-		ProcessModel model = process.getModel();
 		Map<String, Object> jsonMap = new HashMap<String, Object>();
+		/*ProcessModel model = process.getModel();
 		if (model != null) {
 			jsonMap.put("process", model);
-		}
+		}*/
 
 		if (StringUtils.isNotEmpty(orderId)) {
 			List<Task> tasks = snakerEngine.query().getActiveTasks(new QueryFilter().setOrderId(orderId));

+ 3 - 3
mec-workflow/src/main/java/com/ym/mec/workfow/controller/flow/TaskController.java

@@ -183,13 +183,13 @@ public class TaskController extends BaseController {
 
 	/**
 	 * 历史任务撤回
-	 * @param taskId
+	 * @param orderId
 	 * @return
 	 */
 	@PostMapping(value = "undo")
-	public Object historyTaskUndo(String taskId) {
+	public Object historyTaskUndo(String orderId) {
 		SysUser user = SysUserFeignService.queryUserInfo();
-		snakerEngine.task().withdrawTask(taskId, user.getUsername());
+		snakerEngine.order().withdraw(orderId, user.getUsername());
 		return succeed();
 	}
 }

+ 9 - 2
mec-workflow/src/main/java/com/ym/mec/workfow/controller/web/LeaveController.java

@@ -53,13 +53,20 @@ public class LeaveController extends BaseController {
 	}
 
 	@PostMapping(value = "approve")
-	public Object approve(String taskId) {
+	public Object approve(String taskId, boolean isAgree) {
 		SysUser user = SysUserFeignService.queryUserInfo();
 
 		System.out.println(user.getUsername() + "审批***************");
 
-		List<Task> tasks = snakerEngine.executeTask(taskId, user.getUsername());
+		List<Task> tasks = null;
 
+		// 审批同意
+		if (isAgree) {
+			tasks = snakerEngine.executeTask(taskId, user.getUsername());
+		} else {
+			// 审批驳回
+			tasks = snakerEngine.executeAndJumpTask(taskId, user.getUsername(), null, null);
+		}
 		if (tasks.size() == 0) {
 			System.out.println("**********流程已结束*********");
 		}

+ 2 - 2
mec-workflow/src/main/resources/flows/leave.snaker

@@ -11,8 +11,8 @@
 <transition g="" name="transition3" offset="0,0" to="decision1"/>
 </task>
 <decision displayName="decision1" layout="426,124,-1,-1" name="decision1">
-<transition displayName="&lt;=5天" expr="${days} &lt;= 5" g="" name="transition4" offset="0,0" to="end1"/>
-<transition displayName="&gt;5天" expr="${days} &gt; 5" g="" name="transition5" offset="0,0" to="approveBoss"/>
+<transition displayName="&lt;=5天" expr="#days &lt;= 5" g="" name="transition4" offset="0,0" to="end1"/>
+<transition displayName="&gt;5天" expr="#days &gt; 5" g="" name="transition5" offset="0,0" to="approveBoss"/>
 </decision>
 <task assignee="boss" displayName="总经理审批" layout="404,231,-1,-1" name="approveBoss" performType="ANY">
 <transition g="" name="transition6" offset="0,0" to="end1"/>

+ 29 - 22
workflowy/src/main/java/org/snaker/engine/IOrderService.java

@@ -33,7 +33,7 @@ public interface IOrderService {
 	 * @return Order 活动流程实例对象
 	 */
 	Order createOrder(Process process, String operator, Map<String, Object> args);
-	
+
 	/**
 	 * 根据流程、操作人员、父流程实例ID创建流程实例
 	 * @param process 流程定义对象
@@ -45,40 +45,40 @@ public interface IOrderService {
 	 */
 	Order createOrder(Process process, String operator, Map<String, Object> args, String parentId, String parentNodeName);
 
-    /**
-     * 向指定实例id添加全局变量数据
-     * @param orderId 实例id
-     * @param args 变量数据
-     */
-    void addVariable(String orderId, Map<String ,Object> args);
-	
+	/**
+	 * 向指定实例id添加全局变量数据
+	 * @param orderId 实例id
+	 * @param args 变量数据
+	 */
+	void addVariable(String orderId, Map<String, Object> args);
+
 	/**
 	 * 创建抄送实例
 	 * @param orderId 流程实例id
 	 * @param actorIds 参与者id
-     * @param creator 创建人id
+	 * @param creator 创建人id
 	 * @since 1.5
 	 */
 	void createCCOrder(String orderId, String creator, String... actorIds);
-	
+
 	/**
 	 * 流程实例正常完成
 	 * @param orderId 流程实例id
 	 */
 	void complete(String orderId);
-	
+
 	/**
 	 * 保存流程实例
 	 * @param order 流程实例对象
 	 */
 	void saveOrder(Order order);
-	
+
 	/**
 	 * 流程实例强制终止
 	 * @param orderId 流程实例id
 	 */
 	void terminate(String orderId);
-	
+
 	/**
 	 * 流程实例强制终止
 	 * @param orderId 流程实例id
@@ -86,26 +86,33 @@ public interface IOrderService {
 	 */
 	void terminate(String orderId, String operator);
 
-    /**
-     * 唤醒历史流程实例
-     * @param orderId 流程实例id
-     * @return 活动实例对象
-     */
-    Order resume(String orderId);
-	
+	/**
+	 * 撤销流程实例
+	 * @param orderId 流程实例id
+	 * @param operator 处理人员
+	 */
+	void withdraw(String orderId, String operator);
+
+	/**
+	 * 唤醒历史流程实例
+	 * @param orderId 流程实例id
+	 * @return 活动实例对象
+	 */
+	Order resume(String orderId);
+
 	/**
 	 * 更新流程实例
 	 * @param order 流程实例对象
 	 */
 	void updateOrder(Order order);
-	
+
 	/**
 	 * 更新抄送记录为已阅
 	 * @param orderId 流程实例id
 	 * @param actorIds 参与者id
 	 */
 	void updateCCStatus(String orderId, String... actorIds);
-	
+
 	/**
 	 * 删除抄送记录
 	 * @param orderId 流程实例id

+ 37 - 1
workflowy/src/main/java/org/snaker/engine/core/OrderService.java

@@ -17,9 +17,11 @@ package org.snaker.engine.core;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.lang.StringUtils;
 import org.snaker.engine.Completion;
 import org.snaker.engine.IOrderService;
 import org.snaker.engine.SnakerEngine;
+import org.snaker.engine.SnakerException;
 import org.snaker.engine.access.QueryFilter;
 import org.snaker.engine.entity.*;
 import org.snaker.engine.entity.Process;
@@ -210,7 +212,41 @@ public class OrderService extends AccessService implements IOrderService {
         }
 	}
 
-    /**
+	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+	public void withdraw(String orderId, String operator) {
+		Order order = access().getOrder(orderId);
+		
+		if(!StringUtils.equals(operator, order.getCreator())){
+			throw new SnakerException("当前参与者[" + operator + "]不允许撤销流程实例[orderId=" + orderId + "]");
+		}
+		
+		SnakerEngine engine = ServiceContext.getEngine();
+		
+		List<HistoryTask> historyTasks = engine.query().getHistoryTasks(new QueryFilter().setOrderId(orderId));
+		for(HistoryTask historyTask : historyTasks){
+			if(!StringUtils.equals(operator, historyTask.getOperator())){
+				throw new SnakerException("流程实例在处理中,不能被撤销");
+			}
+		}
+		
+		List<Task> tasks = engine.query().getActiveTasks(new QueryFilter().setOrderId(orderId));
+		for(Task task : tasks) {
+			access().deleteTask(task);
+		}
+		
+		HistoryOrder history = new HistoryOrder(order);
+		history.setOrderState(STATE_TERMINATION);
+		history.setEndTime(DateHelper.getTime());
+		
+		access().updateHistory(history);
+		access().deleteOrder(order);
+        Completion completion = getCompletion();
+        if(completion != null) {
+            completion.complete(history);
+        }
+	}
+
+	/**
      * 激活已完成的历史流程实例
      * @param orderId 实例id
      * @return 活动实例对象

+ 4 - 0
workflowy/src/main/java/org/snaker/engine/model/NodeModel.java

@@ -26,6 +26,8 @@ import org.snaker.engine.core.Execution;
 import org.snaker.engine.helper.ClassHelper;
 import org.snaker.engine.helper.StringHelper;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
 /**
  * 节点元素(存在输入输出的变迁)
  * @author yuqs
@@ -40,10 +42,12 @@ public abstract class NodeModel extends BaseModel implements Action {
 	/**
 	 * 输入变迁集合
 	 */
+	@JsonIgnore
 	private List<TransitionModel> inputs = new ArrayList<TransitionModel>();
 	/**
 	 * 输出变迁集合
 	 */
+	@JsonIgnore
 	private List<TransitionModel> outputs = new ArrayList<TransitionModel>();
 	/**
 	 * layout