浏览代码

Merge remote-tracking branch 'origin/master'

Joburgess 5 年之前
父节点
当前提交
f83e28c3b0
共有 27 个文件被更改,包括 464 次插入199 次删除
  1. 5 0
      mec-biz/pom.xml
  2. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  3. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  4. 10 10
      mec-biz/src/main/resources/config/contracts/courses.ftl
  5. 17 17
      mec-biz/src/main/resources/config/contracts/goods.ftl
  6. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  7. 8 0
      mec-education/src/main/java/com/ym/mec/education/controller/VipGroupController.java
  8. 5 133
      mec-education/src/main/java/com/ym/mec/education/entity/CourseSchedule.java
  9. 34 0
      mec-education/src/main/java/com/ym/mec/education/enums/CourseStatusEnum.java
  10. 1 1
      mec-education/src/main/java/com/ym/mec/education/mapper/VipGroupClassGroupMapperMapper.java
  11. 2 0
      mec-education/src/main/java/com/ym/mec/education/resp/TeacherDetailResp.java
  12. 42 0
      mec-education/src/main/java/com/ym/mec/education/resp/VipClassAttendanceResp.java
  13. 37 0
      mec-education/src/main/java/com/ym/mec/education/resp/VipClassScheduleResp.java
  14. 1 1
      mec-education/src/main/java/com/ym/mec/education/resp/VipGroupClassResp.java
  15. 1 1
      mec-education/src/main/java/com/ym/mec/education/service/IVipGroupClassGroupMapperService.java
  16. 2 0
      mec-education/src/main/java/com/ym/mec/education/service/IVipGroupService.java
  17. 1 2
      mec-education/src/main/java/com/ym/mec/education/service/impl/MusicGroupServiceImpl.java
  18. 54 4
      mec-education/src/main/java/com/ym/mec/education/service/impl/TeacherServiceImpl.java
  19. 1 1
      mec-education/src/main/java/com/ym/mec/education/service/impl/VipGroupClassGroupMapperServiceImpl.java
  20. 153 0
      mec-education/src/main/java/com/ym/mec/education/service/impl/VipGroupServiceImpl.java
  21. 32 0
      mec-workflow/src/main/java/com/ym/mec/workfow/controller/flow/OrderController.java
  22. 0 21
      mec-workflow/src/main/java/com/ym/mec/workfow/controller/flow/ProcessController.java
  23. 4 3
      mec-workflow/src/main/java/com/ym/mec/workfow/controller/web/LeaveController.java
  24. 3 3
      mec-workflow/src/main/resources/application.yml
  25. 16 0
      mec-workflow/src/main/resources/bootstrap.properties
  26. 1 1
      mec-workflow/src/main/resources/flows/leave.snaker
  27. 16 0
      mec-workflow/src/main/resources/flows/viprefund.snaker

+ 5 - 0
mec-biz/pom.xml

@@ -34,5 +34,10 @@
 			<groupId>com.ym</groupId>
 			<artifactId>mec-thirdparty</artifactId>
 		</dependency>
+		
+		<dependency>
+			<groupId>com.ym</groupId>
+			<artifactId>snakerflowy</artifactId>
+		</dependency>
     </dependencies>
 </project>

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java

@@ -19,6 +19,7 @@ import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.StudentInfo;
 import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.entity.SysUserContracts;
 import com.ym.mec.biz.dal.entity.SysUserContracts.ContractType;
 import com.ym.mec.biz.dal.entity.SysUserTsign;
@@ -26,6 +27,7 @@ import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.service.ContractService;
 import com.ym.mec.biz.service.StudentPaymentOrderService;
 import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.SubjectService;
 import com.ym.mec.biz.service.SysUserContractsService;
 import com.ym.mec.biz.service.SysUserTsignService;
 import com.ym.mec.common.exception.BizException;
@@ -51,6 +53,9 @@ public class ContractServiceImpl implements ContractService {
 	
 	@Autowired
 	private StudentPaymentOrderService studentPaymentOrderService;
+	
+	@Autowired
+	private SubjectService subjectService;
 
 	@Autowired
 	private ESealPlugin eSealPlugin;
@@ -280,6 +285,10 @@ public class ContractServiceImpl implements ContractService {
 		
 		//查询参数信息
 		StudentInfo studentInfo = studentRegistrationService.queryStudentInfo(userId);
+		
+		Subject subject = subjectService.get(studentInfo.getSubject().getId());
+		studentInfo.setSubject(subject);
+		
 		params.put("studentInfo", studentInfo);
 		
 		List<Goods> goodsList = studentPaymentOrderService.queryApplyGoodsList(musicGroupId, OrderDetailTypeEnum.MUSICAL);

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

@@ -12,10 +12,12 @@ import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
@@ -71,11 +73,17 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup>
 				}
 			}
 			//保存乐团声部规划
+			if (musicGroupSubjectPlans == null) {
+				musicGroupSubjectPlans = new ArrayList<MusicGroupSubjectPlan>();
+			}
 			musicGroupSubjectPlans.forEach(e ->{
 				e.setMusicGroupId(musicGroupId);
 				musicGroupSubjectPlanDao.insert(e);
 			});
 			//保存乐团声部商品规划
+			if (musicGroupSubjectGoodsGroups == null) {
+				musicGroupSubjectGoodsGroups = new ArrayList<MusicGroupSubjectGoodsGroup>();
+			}
 			musicGroupSubjectGoodsGroups.forEach(e->{
 				e.setMusicGroupId(musicGroupId);
 				musicGroupSubjectGoodsGroupDao.insert(e);

+ 10 - 10
mec-biz/src/main/resources/config/contracts/courses.ftl

@@ -76,22 +76,22 @@
     <div class="container">
         <h1>《课程服务协议》</h1>
         <!-- 甲方:深圳大雅乐盟网络教育股份有限公司 <br/> -->
-        甲方:{{proto}} <br/>
+        甲方:深圳大雅乐盟网络教育股份有限公司 <br/>
         <div style="display: flex;">乙方:
             <div style="flex: 1 auto;">
                 <div class="iInfo">
-                    <span>家长姓名 {{proto}}</span>
-                    <span>电话:{{proto}}</span>
+                    <span>家长姓名 ${studentInfo.realName}</span>
+                    <span>电话: ${studentInfo.phone}</span>
                 </div>
                 <div class="iInfo">
-                    <span>身份证号:{{proto}}</span>
+                    <span>身份证号:${studentInfo.idCardNo}</span>
                 </div>
                 <div class="iInfo">
-                    <span>学生姓名:{{proto}}</span>
-                    <span>所在班级:{{proto}}</span>
+                    <span>学生姓名:${studentInfo.name}</span>
+                    <span>所在班级:${studentInfo.grade} ${studentInfo.clazz}</span>
                 </div>
                 <div class="iInfo">
-                    <span>所在声部:{{proto}}</span>
+                    <span>所在声部:${studentInfo.subject.name}</span>
                 </div>
             </div>
         </div>  
@@ -153,11 +153,11 @@
         6、双方因履行本协议而相互发出或者提供的所有通知、文件、资料,均以本协议中所列明的电话、APP推送消息送达,乙方如果变更电话号码的,应当自变更后1日内通知甲方且获得甲方确认,甲方通过电话、APP方式无法联系乙方或者甲方认为必要时,甲方也可以通过特快专递至乙方住址的方式向乙方发出上述任何通知、文件、资料等,并在甲方寄出特快专递后第5日视为送达成功。<br/>
 
         <div class="signature">
-            <div class="sign">甲方签章:
-                <span>日期:{{proto}}</span>
+            <div class="sign">甲方签章:深圳大雅乐盟网络教育股份有限公司
+                <span>日期:${.now?string("yyyy年MM月dd日")}</span>
             </div>
             <div class="sign">乙方签字:{{proto}}
-                <span>日期:{{proto}} </span>
+                <span>日期:${.now?string("yyyy年MM月dd日")} </span>
             </div>
         </div>
     </div>

+ 17 - 17
mec-biz/src/main/resources/config/contracts/goods.ftl

@@ -72,30 +72,30 @@
         }
     </style>
 </head>
-<body>
+<body style="font-family:'SimSun'">
     <div class="container">
         <h1>《乐器借用协议》</h1>
-        甲方:{{proto}} <br/>
+        甲方:深圳大雅乐盟网络教育股份有限公司 <br/>
         <div style="display: flex;">乙方:
             <div style="flex: 1 auto;">
                 <div class="iInfo">
-                    <span>家长姓名 {{proto}}</span>
-                    <span>电话:{{proto}}</span>
+                    <span>家长姓名 ${studentInfo.realName}</span>
+                    <span>电话: ${studentInfo.phone}</span>
                 </div>
                 <div class="iInfo">
-                    <span>身份证号:{{proto}}</span>
+                    <span>身份证号:${studentInfo.idCardNo}</span>
                 </div>
                 <div class="iInfo">
-                    <span>学生姓名:{{proto}}</span>
-                    <span>所在班级:{{proto}}</span>
+                    <span>学生姓名:${studentInfo.name}</span>
+                    <span>所在班级:${studentInfo.grade} ${studentInfo.clazz}</span>
                 </div>
                 <div class="iInfo">
-                    <span>所在声部:{{proto}}</span>
+                    <span>所在声部:${studentInfo.subject.name}</span>
                 </div>
             </div>
         </div>                     
         
-        为了促进学校乐团健康、持续发展,让更多的学生在校园拥有良好的器乐学习机会,甲方基于公益普惠的原则,决定提供价值{{proto}}元的KEY品牌全新乐器供乙方在学校乐团期间免费使用。现根据《中华人民共和国合同法》等法律法规规定,为明确甲乙双方权利义务,经协商一致,就乙方借用乐器事宜达成如下协议:
+        为了促进学校乐团健康、持续发展,让更多的学生在校园拥有良好的器乐学习机会,甲方基于公益普惠的原则,决定提供价值${goodsList[0].marketPrice?string("#.##")}元的KEY品牌全新乐器供乙方在学校乐团期间免费使用。现根据《中华人民共和国合同法》等法律法规规定,为明确甲乙双方权利义务,经协商一致,就乙方借用乐器事宜达成如下协议:
         <h2>一、甲方权利与义务:</h2>
         1、乙方所借用的乐器为甲方资产,乐器所有权归属甲方所有,甲方有权在必要时向乙方收回借用乐器并退还押金。<br/>
         2、甲方所提供乐器为全新的KEY品牌乐器。在乙方签订本协议、交纳乐器使用押金后,甲方即将乐器交付给乙方供其在学校乐团期间免费使用。<br/>
@@ -108,12 +108,12 @@
         4、乙方终止乐团学习2个月内,仍未将乐器归还给甲方的,则视为乙方违约,乙方所交押金甲方有权不予退还,同时乙方须按乐器团购价格进行赔付。
         <h2>三、乐器标准:</h2> 
         <div class="iInfo">
-            <span>名称:{{proto}}</span>
-            <span>品牌:{{proto}}</span>  
+            <span>名称:${goodsList[0].name}</span>
+            <span>品牌:${goodsList[0].brand}</span>  
         </div>
         <div class="iInfo">
-            <span>型号:{{proto.}}</span>
-            <span>团购价格:{{proto}}</span>
+            <span>型号:${goodsList[0].specification}</span>
+            <span>团购价格:${goodsList[0].groupPurchasePrice?string("#.##")}</span>
         </div>
 
         <h2>四、违约责任</h2>  
@@ -135,11 +135,11 @@
         3、本协议未尽事宜或对本协议的任何修改、补充,由双方另行协商后以签订补充协议的方式解决,补充协议与本协议具有同等法律效力;双方没有约定也没有协商一致的,遵照相关法律法规规定执行。<br/>
         4、双方因履行本协议而相互发出或者提供的所有通知、文件、资料,均以本协议中所列明的电话、APP推送消息送达,乙方如果变更电话号码的,应当自变更后1日内通知甲方且获得甲方确认,甲方通过电话、APP方式无法联系乙方或者甲方认为必要时,甲方也可以通过特快专递至乙方住址的方式向乙方发出上述任何通知、文件、资料等,并在甲方寄出特快专递后第5日视为送达成功。
         <div class="signature">
-            <div class="sign">甲方签章:
-                <span>日期:{{proto}}</span>
+            <div class="sign">甲方签章:深圳大雅乐盟网络教育股份有限公司
+                <span>日期:${.now?string("yyyy年MM月dd日")}</span>
             </div>
-            <div class="sign">乙方签字:{{proto}}
-                <span>日期:{{proto}} </span>
+            <div class="sign">乙方签字:${studentInfo.realName}
+                <span>日期:${.now?string("yyyy年MM月dd日")} </span>
             </div>
         </div>
     </div>

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

@@ -250,6 +250,6 @@
     </update>
     
     <select id="queryStudentInfo" resultMap="StudentInfo">
-        SELECT u.*,sr.name_,sr.current_class_,sr.current_grade_,sr.actual_subject_id_ FROM sys_user u left join student_registration  sr on u.id_ = sr.user_id_ where u.id_ = #{userId}
+        SELECT u.*,sr.name_,sr.current_class_,sr.current_grade_,sr.actual_subject_id_ FROM sys_user u left join student_registration  sr on u.id_ = sr.user_id_ where u.id_ = #{userId} order by sr.create_time_ desc limit 0,1
     </select>
 </mapper>

+ 8 - 0
mec-education/src/main/java/com/ym/mec/education/controller/VipGroupController.java

@@ -1,6 +1,7 @@
 package com.ym.mec.education.controller;
 
 import com.ym.mec.education.base.BaseResponse;
+import com.ym.mec.education.base.PageResponse;
 import com.ym.mec.education.req.VipGroupReq;
 import com.ym.mec.education.service.IVipGroupService;
 import io.swagger.annotations.Api;
@@ -30,4 +31,11 @@ public class VipGroupController {
     public BaseResponse info(@RequestBody VipGroupReq vipGroupReq) {
         return BaseResponse.success(vipGroupService.getInfo(vipGroupReq));
     }
+    @PostMapping("/courseList")
+    @ApiOperation("小课详情-le")
+    public PageResponse courseList(@RequestBody VipGroupReq vipGroupReq){
+
+        return null;
+
+    }
 }

+ 5 - 133
mec-education/src/main/java/com/ym/mec/education/entity/CourseSchedule.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.ym.mec.common.enums.BaseEnum;
+import lombok.Data;
+
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.sql.Time;
@@ -21,6 +23,7 @@ import java.util.Date;
  * @since 2019-09-25
  */
 @TableName("course_schedule")
+@Data
 public class CourseSchedule extends Model<CourseSchedule> {
 
     private static final long serialVersionUID = 1L;
@@ -84,6 +87,8 @@ public class CourseSchedule extends Model<CourseSchedule> {
      */
     @TableField("class_date_")
     private Date classDate;
+    @TableField(exist = false)
+    private String classDateStr;
     /**
      * 上课时间
      */
@@ -129,139 +134,6 @@ public class CourseSchedule extends Model<CourseSchedule> {
     @TableField("name_")
     private String name;
 
-    public Long getId() {
-        return id;
-    }
-
-    public CourseSchedule setId(Long id) {
-        this.id = id;
-        return this;
-    }
-
-    public Integer getClassGroupId() {
-        return classGroupId;
-    }
-
-    public CourseSchedule setClassGroupId(Integer classGroupId) {
-        this.classGroupId = classGroupId;
-        return this;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public CourseSchedule setStatus(String status) {
-        this.status = status;
-        return this;
-    }
-
-    public BigDecimal getSubsidy() {
-        return subsidy;
-    }
-
-    public CourseSchedule setSubsidy(BigDecimal subsidy) {
-        this.subsidy = subsidy;
-        return this;
-    }
-
-    public Date getClassDate() {
-        return classDate;
-    }
-
-    public CourseSchedule setClassDate(Date classDate) {
-        this.classDate = classDate;
-        return this;
-    }
-
-    public Time getStartClassTime() {
-        return startClassTime;
-    }
-
-    public CourseSchedule setStartClassTime(Time startClassTime) {
-        this.startClassTime = startClassTime;
-        return this;
-    }
-
-    public Time getEndClassTime() {
-        return endClassTime;
-    }
-
-    public CourseSchedule setEndClassTime(Time endClassTime) {
-        this.endClassTime = endClassTime;
-        return this;
-    }
-
-    public Integer getTeacherId() {
-        return teacherId;
-    }
-
-    public CourseSchedule setTeacherId(Integer teacherId) {
-        this.teacherId = teacherId;
-        return this;
-    }
-
-    public Integer getActualTeacherId() {
-        return actualTeacherId;
-    }
-
-    public CourseSchedule setActualTeacherId(Integer actualTeacherId) {
-        this.actualTeacherId = actualTeacherId;
-        return this;
-    }
-
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    public CourseSchedule setCreateTime(Date createTime) {
-        this.createTime = createTime;
-        return this;
-    }
-
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    public CourseSchedule setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-        return this;
-    }
-
-    public String getTeachMode() {
-        return teachMode;
-    }
-
-    public CourseSchedule setTeachMode(String teachMode) {
-        this.teachMode = teachMode;
-        return this;
-    }
-
-    public String getComplaintStatus() {
-        return complaintStatus;
-    }
-
-    public CourseSchedule setComplaintStatus(String complaintStatus) {
-        this.complaintStatus = complaintStatus;
-        return this;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 34 - 0
mec-education/src/main/java/com/ym/mec/education/enums/CourseStatusEnum.java

@@ -0,0 +1,34 @@
+package com.ym.mec.education.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum CourseStatusEnum implements BaseEnum<String, CourseStatusEnum> {
+    NOT_START("NOT_START","未开始"),
+    UNDERWAY("UNDERWAY","进行中"),
+    OVER("OVER","已结束");
+
+    private String code;
+
+    private String msg;
+
+    CourseStatusEnum(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }}

+ 1 - 1
mec-education/src/main/java/com/ym/mec/education/mapper/VipGroupClassGroupMapperMapper.java

@@ -1,7 +1,7 @@
 package com.ym.mec.education.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ym.mec.education.entity.VipGroupClassGroupMapper;
-import com.baomidou.mybatisplus.mapper.BaseMapper;
 
 /**
  * <p>

+ 2 - 0
mec-education/src/main/java/com/ym/mec/education/resp/TeacherDetailResp.java

@@ -35,6 +35,8 @@ public class TeacherDetailResp implements Serializable {
 
     private Integer hourCount;
 
+    private Integer used;
+
     @Data
     public static class InnerDemoGroup{
         private String dateStr;

+ 42 - 0
mec-education/src/main/java/com/ym/mec/education/resp/VipClassAttendanceResp.java

@@ -0,0 +1,42 @@
+package com.ym.mec.education.resp;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @version V1.0
+ * @Description: TODO
+ * @date Date : 2019年10月03日 14:59
+ */
+
+@Data
+@ToString
+public class VipClassAttendanceResp implements Serializable {
+
+    private String dateStr;
+
+    private String week;
+
+    private String startTime;
+
+    private String endTime;
+
+    private String className;
+
+
+    private String status;
+
+    private Integer currentNum;
+
+    private Integer totalNum;
+
+    private Integer classGroupId;
+
+    private Integer leaveNum;
+
+    private List<String> studentList;
+
+}

+ 37 - 0
mec-education/src/main/java/com/ym/mec/education/resp/VipClassScheduleResp.java

@@ -0,0 +1,37 @@
+package com.ym.mec.education.resp;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * @version V1.0
+ * @Description: TODO
+ * @date Date : 2019年10月03日 14:59
+ */
+
+@Data
+@ToString
+public class VipClassScheduleResp implements Serializable {
+
+    private String dateStr;
+
+    private String week;
+
+    private String startTime;
+
+    private String endTime;
+
+    private String className;
+
+
+    private String status;
+
+    private Integer currentNum;
+
+    private Integer totalNum;
+
+    private Integer classGroupId;
+
+}

+ 1 - 1
mec-education/src/main/java/com/ym/mec/education/resp/VipGroupClassResp.java

@@ -20,7 +20,7 @@ public class VipGroupClassResp implements Serializable {
 
     private String vipClassType;
 
-    private String classNum;
+    private Integer classNum;
 
     private String longTime;
 

+ 1 - 1
mec-education/src/main/java/com/ym/mec/education/service/IVipGroupClassGroupMapperService.java

@@ -1,7 +1,7 @@
 package com.ym.mec.education.service;
 
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.education.entity.VipGroupClassGroupMapper;
-import com.baomidou.mybatisplus.service.IService;
 
 /**
  * <p>

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

@@ -2,6 +2,7 @@ package com.ym.mec.education.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.education.base.BaseResponse;
+import com.ym.mec.education.base.PageResponse;
 import com.ym.mec.education.entity.VipGroup;
 import com.ym.mec.education.req.VipGroupReq;
 
@@ -17,4 +18,5 @@ public interface IVipGroupService extends IService<VipGroup> {
 
     BaseResponse getInfo(VipGroupReq vipGroupReq);
 
+    PageResponse courseList(VipGroupReq vipGroupReq);
 }

+ 1 - 2
mec-education/src/main/java/com/ym/mec/education/service/impl/MusicGroupServiceImpl.java

@@ -115,11 +115,10 @@ public class MusicGroupServiceImpl extends ServiceImpl<MusicGroupMapper, MusicGr
             }
             musicGroupResps.add(musicGroupResp);
         });
-        int count = this.count(queryWrapper);
         response.setRecords(musicGroupResps);
         response.setReturnCode(ReturnCodeEnum.CODE_200.getCode());
         response.setMessage(ReturnCodeEnum.CODE_200.getValue());
-        response.setTotal(count);
+        response.setTotal(Math.toIntExact(page.getTotal()));
         return response;
     }
 

+ 54 - 4
mec-education/src/main/java/com/ym/mec/education/service/impl/TeacherServiceImpl.java

@@ -8,6 +8,7 @@ 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.mapper.TeacherMapper;
 import com.ym.mec.education.req.TeacherReq;
@@ -62,6 +63,9 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher> impl
     @Autowired
     private IVipGroupCategoryService vipGroupCategoryService;
 
+    @Autowired
+    private ICourseScheduleService courseScheduleService;
+
 
     @Autowired
     private IVipGroupDefaultClassesCycleService vipGroupDefaultClassesCycleService;
@@ -119,6 +123,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher> impl
                         teacherResp.setClassName(className);
                     }
                 }
+
                 teacherRespList.add(teacherResp);
             });
 
@@ -194,6 +199,17 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher> impl
                                     demoGroup.setDemoGroupPlans(planList);
                                 }
                             }
+
+                            QueryWrapper<CourseSchedule> scheduleQueryWrapper = new QueryWrapper<>();
+                            scheduleQueryWrapper.eq("teacher_id_",req.getUserId());
+                            scheduleQueryWrapper.eq("status_", CourseStatusEnum.OVER.getCode());
+                            List<CourseSchedule> courseSchedules = courseScheduleService.list(scheduleQueryWrapper);
+                            if(!CollectionUtils.isEmpty(courseSchedules)){
+                                teacherDetailResp.setUsed(courseSchedules.size());
+                            }else{
+                                teacherDetailResp.setUsed(0);
+                            }
+
                             teacherDetailResp.setDemoGroups(innerDemoGroups);
 
                         }
@@ -225,6 +241,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher> impl
     @Override
     public PageResponse teacherVipClass(TeacherReq req) {
 
+        PageResponse response = new PageResponse();
         if(req == null && req.getUserId() == null){
             return PageResponse.errorParam();
         }
@@ -246,12 +263,45 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher> impl
                     vipGroupClassResp.setVipClassType(vipGroupCategory.getName());
                 }
 
-                vipGroupDefaultClassesCycleService.list()
-               // vipGroupClassResp.setClassNum();
+                QueryWrapper<CourseSchedule> scheduleQueryWrapper = new QueryWrapper<>();
+                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));
+
+                    });
+                    Map<String,List<CourseSchedule>> map = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getClassDateStr));
+
+                    if(!CollectionUtils.isEmpty(map)){
+
+                        int count1 = map.size();
+                        int count2 =0;
+                        for (Map.Entry<String, List<CourseSchedule>> entry : map.entrySet()) {
+
+                            if(!CollectionUtils.isEmpty(entry.getValue())){
+                                count2 = count2 + entry.getValue().size();
+                            }
 
+                        }
+                        //月平均排課
+
+                        if(count1 <= count2){
+                            vipGroupClassResp.setClassNum(1);
+                        }else{
+
+                            vipGroupClassResp.setClassNum(count2%count1);
+                        }
+
+                    }
+                    vipGroupClassRespList.add(vipGroupClassResp);
+                }
             });
         }
-
-        return null;
+        response.setTotal(Math.toIntExact(page.getTotal()));
+        response.setRecords(vipGroupClassRespList);
+        response.setReturnCode(ReturnCodeEnum.CODE_200.getCode());
+        response.setMessage(ReturnCodeEnum.CODE_200.getValue());
+        return response;
     }
 }

+ 1 - 1
mec-education/src/main/java/com/ym/mec/education/service/impl/VipGroupClassGroupMapperServiceImpl.java

@@ -1,9 +1,9 @@
 package com.ym.mec.education.service.impl;
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ym.mec.education.entity.VipGroupClassGroupMapper;
 import com.ym.mec.education.mapper.VipGroupClassGroupMapperMapper;
 import com.ym.mec.education.service.IVipGroupClassGroupMapperService;
-import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
 /**

+ 153 - 0
mec-education/src/main/java/com/ym/mec/education/service/impl/VipGroupServiceImpl.java

@@ -1,17 +1,27 @@
 package com.ym.mec.education.service.impl;
 
 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.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 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.StudentAttendanceStatusEnum;
 import com.ym.mec.education.mapper.VipGroupMapper;
 import com.ym.mec.education.req.VipGroupReq;
+import com.ym.mec.education.resp.VipClassAttendanceResp;
+import com.ym.mec.education.resp.VipClassScheduleResp;
 import com.ym.mec.education.resp.VipGroupResp;
 import com.ym.mec.education.service.*;
+import com.ym.mec.education.utils.DateUtil;
+import org.apache.velocity.util.ArrayListWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -36,7 +46,11 @@ public class VipGroupServiceImpl extends ServiceImpl<VipGroupMapper, VipGroup> i
     private IClassGroupService classGroupService;
     @Autowired
     private IClassGroupStudentMapperService classGroupStudentMapperService;
+    @Autowired
+    private IVipGroupClassGroupMapperService vipGroupClassGroupMapperService;
 
+    @Autowired
+    private IStudentAttendanceService studentAttendanceService;
     @Override
     public BaseResponse getInfo(VipGroupReq vipGroupReq) {
         if (Objects.isNull(vipGroupReq.getVipGroupId())) {
@@ -77,4 +91,143 @@ public class VipGroupServiceImpl extends ServiceImpl<VipGroupMapper, VipGroup> i
         }
         return BaseResponse.success(vipGroupResp);
     }
+
+    /**
+     * @param vipGroupReq
+     * @return
+     */
+    @Override
+    public PageResponse courseList(VipGroupReq vipGroupReq) {
+        QueryWrapper<VipGroupClassGroupMapper> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("vip_group_id_",vipGroupReq.getVipGroupId());
+        VipGroupClassGroupMapper vipGroupClassGroupMapper = vipGroupClassGroupMapperService.getOne(queryWrapper);
+        if(vipGroupClassGroupMapper == null){
+            return PageResponse.errorParam();
+        }
+
+        PageResponse response = new PageResponse();
+
+        IPage page = new Page(vipGroupReq.getPageNo() == null ? 1: vipGroupReq.getPageNo(),vipGroupReq.getPageSize() == null ? 10: vipGroupReq.getPageSize());
+
+        QueryWrapper<CourseSchedule> scheduleQueryWrapper = new QueryWrapper<>();
+        scheduleQueryWrapper.eq("class_group_id_",vipGroupClassGroupMapper.getClassGroupId());
+        IPage<CourseSchedule> scheduleIPage = courseScheduleService.page(page,scheduleQueryWrapper);
+
+
+        List<VipClassScheduleResp> vipClassScheduleRespList = new ArrayList<>();
+        List<CourseSchedule> courseSchedules = scheduleIPage.getRecords();
+        if(!CollectionUtils.isEmpty(courseSchedules)){
+            ClassGroup classGroup = classGroupService.getById(vipGroupClassGroupMapper.getClassGroupId());
+            courseSchedules.forEach(e ->{
+                VipClassScheduleResp vipClassScheduleResp = new VipClassScheduleResp();
+                vipClassScheduleResp.setClassGroupId(e.getClassGroupId());
+                vipClassScheduleResp.setClassName(e.getName());
+                vipClassScheduleResp.setDateStr(DateUtil.date2String(e.getClassDate(),DateUtil.DATE_FORMAT));
+                vipClassScheduleResp.setStartTime(DateUtil.date2String(e.getStartClassTime(),DateUtil.TIME_FORMAT));
+                vipClassScheduleResp.setEndTime(DateUtil.date2String(e.getEndClassTime(),DateUtil.TIME_FORMAT));
+                vipClassScheduleResp.setStatus(e.getStatus());
+                vipClassScheduleResp.setWeek(DateUtil.date2Week(e.getClassDate()));
+                if(classGroup != null){
+                    vipClassScheduleResp.setCurrentNum(classGroup.getCurrentClassTimes());
+                    vipClassScheduleResp.setTotalNum(classGroup.getTotalClassTimes());
+                }
+                vipClassScheduleRespList.add(vipClassScheduleResp);
+            });
+
+        }
+
+        response.setCurrent(Math.toIntExact(scheduleIPage.getCurrent()));
+        response.setSize(Math.toIntExact(scheduleIPage.getSize()));
+        response.setTotal(Math.toIntExact(scheduleIPage.getTotal()));
+        response.setRecords(vipClassScheduleRespList);
+        return response;
+    }
+
+
+
+    /**
+     * @param vipGroupReq
+     * @return
+     */
+    public PageResponse attendanceList(VipGroupReq vipGroupReq) {
+        QueryWrapper<VipGroupClassGroupMapper> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("vip_group_id_",vipGroupReq.getVipGroupId());
+        VipGroupClassGroupMapper vipGroupClassGroupMapper = vipGroupClassGroupMapperService.getOne(queryWrapper);
+        if(vipGroupClassGroupMapper == null){
+            return PageResponse.errorParam();
+        }
+
+        PageResponse response = new PageResponse();
+
+        IPage page = new Page(vipGroupReq.getPageNo() == null ? 1: vipGroupReq.getPageNo(),vipGroupReq.getPageSize() == null ? 10: vipGroupReq.getPageSize());
+
+        QueryWrapper<StudentAttendance> studentAttendanceQueryWrapper = new QueryWrapper<>();
+        studentAttendanceQueryWrapper.eq("class_group_id_",vipGroupClassGroupMapper.getClassGroupId());
+        IPage<StudentAttendance> studentAttendanceIPage = studentAttendanceService.page(page,studentAttendanceQueryWrapper);
+
+
+        List<StudentAttendance> studentAttendanceList = studentAttendanceIPage.getRecords();
+        if(!CollectionUtils.isEmpty(studentAttendanceList)){
+            List<String> studentList =new ArrayList<>();
+            int leaveNum = 0;
+            QueryWrapper<StudentAttendance> queryWrapper1 = new QueryWrapper<>();
+            queryWrapper1.eq("class_group_id_",vipGroupClassGroupMapper.getClassGroupId());
+            List<StudentAttendance> allList = studentAttendanceService.list(queryWrapper1);
+
+
+            if(!CollectionUtils.isEmpty(allList)){
+
+                List<StudentAttendance> norList = allList.stream().filter(e ->StudentAttendanceStatusEnum.NORMAL.getCode().equals(e.getStatus())).collect(Collectors.toList());
+                if(!CollectionUtils.isEmpty(norList)){
+                    List<Integer> userIds = norList.stream().map(StudentAttendance::getUserId).collect(Collectors.toList());
+                    QueryWrapper<SysUser> queryWrapper2 = new QueryWrapper<>();
+                    queryWrapper2.in("id_",userIds);
+                    List<SysUser> sysUserList = userService.list(queryWrapper2);
+                    if(!CollectionUtils.isEmpty(sysUserList)){
+                        studentList = sysUserList.stream().map(SysUser::getRealName).collect(Collectors.toList());
+                    }
+                }
+
+                List<StudentAttendance> leaveList = allList.stream().filter(e ->StudentAttendanceStatusEnum.LEAVE.getCode().equals(e.getStatus())).collect(Collectors.toList());
+                if(!CollectionUtils.isEmpty(leaveList)){
+                    leaveNum = leaveList.size();
+                }
+            }
+
+            List<String> finalStudentList = studentList;
+            int finalLeaveNum = leaveNum;
+            List<VipClassAttendanceResp> vipClassAttendanceRespList = new ArrayList<>();
+            studentAttendanceList.forEach(e ->{
+                VipClassAttendanceResp vipClassAttendanceResp = new VipClassAttendanceResp();
+                vipClassAttendanceResp.setClassGroupId(vipGroupClassGroupMapper.getClassGroupId());
+
+                CourseSchedule courseSchedule  = courseScheduleService.getById(e.getCourseScheduleId());
+                if(courseSchedule != null){
+                    vipClassAttendanceResp.setDateStr(DateUtil.date2String(courseSchedule.getClassDate(),DateUtil.DATE_FORMAT));
+                    vipClassAttendanceResp.setStartTime(DateUtil.date2String(courseSchedule.getStartClassTime(),DateUtil.TIME_FORMAT));
+                    vipClassAttendanceResp.setEndTime(DateUtil.date2String(courseSchedule.getEndClassTime(),DateUtil.TIME_FORMAT));
+                    vipClassAttendanceResp.setWeek(DateUtil.date2Week(courseSchedule.getClassDate()));
+                    vipClassAttendanceResp.setClassName(courseSchedule.getName());
+                }
+                ClassGroup classGroup = classGroupService.getById(vipGroupClassGroupMapper.getClassGroupId());
+                if(classGroup != null){
+                    vipClassAttendanceResp.setCurrentNum(classGroup.getCurrentClassTimes());
+                    vipClassAttendanceResp.setTotalNum(classGroup.getTotalClassTimes());
+                }
+                vipClassAttendanceResp.setStudentList(finalStudentList);
+                vipClassAttendanceResp.setLeaveNum(finalLeaveNum);
+                vipClassAttendanceRespList.add(vipClassAttendanceResp);
+            });
+            response.setCurrent(Math.toIntExact(studentAttendanceIPage.getCurrent()));
+            response.setSize(Math.toIntExact(studentAttendanceIPage.getSize()));
+            response.setTotal(Math.toIntExact(studentAttendanceIPage.getTotal()));
+            response.setRecords(vipClassAttendanceRespList);
+            return response;
+
+        }
+
+        return PageResponse.success(studentAttendanceIPage);
+    }
+
+
 }

+ 32 - 0
mec-workflow/src/main/java/com/ym/mec/workfow/controller/flow/OrderController.java

@@ -1,13 +1,24 @@
 package com.ym.mec.workfow.controller.flow;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
 import org.snaker.engine.SnakerEngine;
 import org.snaker.engine.access.Page;
 import org.snaker.engine.access.QueryFilter;
 import org.snaker.engine.entity.HistoryOrder;
+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;
@@ -49,4 +60,25 @@ public class OrderController extends BaseController {
 		return succeed();
 	}
 
+	@GetMapping(value = "json")
+	@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>();
+		if (model != null) {
+			jsonMap.put("process", model);
+		}
+
+		if (StringUtils.isNotEmpty(orderId)) {
+			List<Task> tasks = snakerEngine.query().getActiveTasks(new QueryFilter().setOrderId(orderId));
+			jsonMap.put("tasks", tasks);
+
+			List<HistoryTask> historyTasks = snakerEngine.query().getHistoryTasks(new QueryFilter().setOrderId(orderId));
+			jsonMap.put("historyTasks", historyTasks);
+		}
+		return jsonMap;
+	}
+
 }

+ 0 - 21
mec-workflow/src/main/java/com/ym/mec/workfow/controller/flow/ProcessController.java

@@ -104,25 +104,4 @@ public class ProcessController extends BaseController {
 		return succeed();
 	}
 
-	@GetMapping(value = "json")
-	@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>();
-		if (model != null) {
-			jsonMap.put("process", model);
-		}
-
-		if (StringUtils.isNotEmpty(orderId)) {
-			List<Task> tasks = snakerEngine.query().getActiveTasks(new QueryFilter().setOrderId(orderId));
-			jsonMap.put("tasks", tasks);
-
-			List<HistoryTask> historyTasks = snakerEngine.query().getHistoryTasks(new QueryFilter().setOrderId(orderId));
-			jsonMap.put("historyTasks", historyTasks);
-		}
-		return jsonMap;
-	}
-
 }

+ 4 - 3
mec-workflow/src/main/java/com/ym/mec/workfow/controller/web/LeaveController.java

@@ -31,13 +31,14 @@ public class LeaveController extends BaseController {
 	 * 请假申请路由方法
 	 */
 	@PostMapping(value = "apply")
-	public Object apply(String processId, int days, String deptManager) {
+	public Object apply(String processId, int days, String deptManager, String boss) {
 		SysUser user = SysUserFeignService.queryUserInfo();
 
 		Map<String, Object> params = new HashMap<String, Object>();
 		params.put("applyer", user.getUsername());
 		params.put("days", days);
 		params.put("deptManager", deptManager);
+		params.put("boss", boss);
 
 		// 开启实例
 		Order order = snakerEngine.startInstanceById(processId, user.getUsername(), params);
@@ -55,12 +56,12 @@ public class LeaveController extends BaseController {
 	public Object approve(String taskId) {
 		SysUser user = SysUserFeignService.queryUserInfo();
 
+		System.out.println(user.getUsername() + "审批***************");
+
 		List<Task> tasks = snakerEngine.executeTask(taskId, user.getUsername());
 
 		if (tasks.size() == 0) {
 			System.out.println("**********流程已结束*********");
-		} else {
-			System.out.println("**********审批中*********");
 		}
 
 		return succeed();

+ 3 - 3
mec-workflow/src/main/resources/application.yml

@@ -12,9 +12,9 @@ spring:
     
   datasource:
     name: test
-    url: jdbc:mysql://120.26.238.168:3306/snaker_web?useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai
-    username: snaker_web
-    password: snaker_web
+    url: jdbc:mysql://47.99.212.176:3306/mec_dev?useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai
+    username: mec_dev
+    password: mec_dev
     # 使用druid数据源
     type: com.alibaba.druid.pool.DruidDataSource
     driver-class-name: com.mysql.cj.jdbc.Driver

+ 16 - 0
mec-workflow/src/main/resources/bootstrap.properties

@@ -0,0 +1,16 @@
+#\u6307\u5b9a\u5f00\u53d1\u73af\u5883
+#spring.profiles.active=dev
+#\u670d\u52a1\u5668\u5730\u5740
+spring.cloud.nacos.config.server-addr=47.99.212.176:8848
+#\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
+spring.cloud.nacos.config.namespace=e246d169-227d-4012-8c34-e90e057d95d2
+#\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
+spring.cloud.nacos.config.group=DEFAULT_GROUP
+#\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
+spring.cloud.nacos.config.prefix=workflow
+#\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
+spring.cloud.nacos.config.file-extension=yaml
+#\u662f\u5426\u52a8\u6001\u5237\u65b0
+spring.cloud.nacos.config.refresh.enabled=true
+#\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
+spring.cloud.nacos.config.enabled=true

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

@@ -14,7 +14,7 @@
 <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">
+<task assignee="${boss}" displayName="总经理审批" layout="404,231,-1,-1" name="approveBoss" performType="ANY">
 <transition g="" name="transition6" offset="0,0" to="end1"/>
 </task>
 </process>

+ 16 - 0
mec-workflow/src/main/resources/flows/viprefund.snaker

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<process displayName="vip课退费申请" name="viprefund">
+<start displayName="start1" layout="154,161,-1,-1" name="start1">
+<transition g="" name="transition1" offset="0,0" to="apply"/>
+</start>
+<end displayName="end1" layout="785,160,-1,-1" name="end1"/>
+<task assignee="${student}" autoExecute="Y" displayName="学生申请" layout="280,158,-1,-1" name="apply" performType="ANY" taskType="Major">
+<transition g="" name="transition2" offset="0,0" to="task1"/>
+</task>
+<task assignee="${eduTeacher}" autoExecute="Y" displayName="教务老师审批" layout="425,157,-1,-1" name="task1" performType="ANY" taskType="Major">
+<transition g="" name="transition3" offset="0,0" to="task2"/>
+</task>
+<task assignee="${deptManager}" autoExecute="Y" displayName="分部经理审批" layout="598,158,-1,-1" name="task2" performType="ANY" taskType="Major">
+<transition g="" name="transition4" offset="0,0" to="end1"/>
+</task>
+</process>