浏览代码

Merge remote-tracking branch 'origin/master'

Joburgess 4 年之前
父节点
当前提交
fb28cf0604

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import java.util.List;
+import java.util.Set;
 
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import org.apache.ibatis.annotations.Param;
@@ -34,5 +35,5 @@ public interface ImUserFriendDao extends BaseDAO<Long, ImUserFriend> {
 	 * @param teachers
 	 * @param teacherId
 	 */
-	void batchInsert(@Param("teachers") List<BasicUserDto> teachers, @Param("teacherId") Integer teacherId);
+	void batchInsert(@Param("teachers") Set<BasicUserDto> teachers, @Param("teacherId") Integer teacherId);
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.entity;
 
+import java.math.BigDecimal;
 import java.util.Objects;
 
 /**
@@ -24,6 +25,9 @@ public class MusicGroupPaymentCalenderStudentDetail {
 	
 	/** 现价 */
 	private java.math.BigDecimal courseCurrentPrice;
+
+	/** 学员需要扣减的课程余额 */
+	private java.math.BigDecimal cutAmount = BigDecimal.ZERO;
 	
 	/** 课程类型 */
 	private String courseType;
@@ -42,7 +46,15 @@ public class MusicGroupPaymentCalenderStudentDetail {
 	
 	/**  */
 	private java.util.Date updateTime;
-	
+
+	public BigDecimal getCutAmount() {
+		return cutAmount;
+	}
+
+	public void setCutAmount(BigDecimal cutAmount) {
+		this.cutAmount = cutAmount;
+	}
+
 	public void setId(Integer id){
 		this.id = id;
 	}

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

@@ -144,7 +144,7 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      * @param masterTotalPrice 主乐团剩余课程价值
      * @return
      */
-    void insertStudent(String studentIds,String oldMusicGroupId,String newMusicGroupId,BigDecimal masterTotalPrice);
+    void insertStudent(String studentIds,String oldMusicGroupId,String newMusicGroupId,Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect);
 
     /**
      * 获取班级学生

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

@@ -3639,10 +3639,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 }else {
                     //如果剩余课程余额大于等于总价值,那么补交0元
                     if(bigDecimal.doubleValue() >= totalPrice.doubleValue()){
+                        calenderDto.setCutAmount(totalPrice);
                         calenderDto.setCourseCurrentPrice(BigDecimal.ZERO);
                         calenderDto.setCourseOriginalPrice(BigDecimal.ZERO);
                     }else {
                         calenderDto.setCourseCurrentPrice(totalPrice.subtract(bigDecimal));
+                        calenderDto.setCutAmount(bigDecimal);
                         calenderDto.setCourseOriginalPrice(totalPrice.subtract(bigDecimal));
                     }
                     //剩余课程余额减去主班对应课程类型总的课程价值,负数就是需要补交的金额
@@ -3709,7 +3711,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if(hasStudent){
             throw new BizException("操作失败: 主班包含部分已选学员");
         }
-        
         //学员列表
         List<Integer> classGroupIds = mergeClassSplitClassAffirmDto.getClassGroupIds();
         //班级和学员关联
@@ -3723,9 +3724,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         BigDecimal masterTotalPrice = getMasterTotalPrice(masterClassGroupId);
         //是否有需要审核的缴费项目
         //将学员加入新乐团、扣除原乐团剩余课程余额、补充到现有乐团
+        Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect = musicGroupPaymentCalenderStudentDetails.stream().collect(Collectors.groupingBy(e -> e.getUserId()));
         for (Map<Integer, String> classGroupStudent : classGroupStudents) {
             Integer classGroupId = classGroupStudent.keySet().iterator().next();
-            studentRegistrationService.insertStudent(classGroupStudent.get(classGroupId),musicGroupDao.findByClassGroupId(classGroupId).getId(),musicGroup.getId(),masterTotalPrice);
+            studentRegistrationService.insertStudent(classGroupStudent.get(classGroupId),musicGroupDao.findByClassGroupId(classGroupId).getId(),musicGroup.getId(),collect);
         }
 
         paymentCalenderDto.setMusicGroupId(musicGroup.getId());
@@ -3793,14 +3795,21 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //删除学员课程
         courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds, studentIds);
         //删除班级关联的学员
+        List<Integer> classGroupIds = new ArrayList<>();
         if (classGroupStudents != null && classGroupStudents.size() > 0) {
             for (Map<String, String> classGroupStudent : classGroupStudents) {
                 Set<String> integers = classGroupStudent.keySet();
                 for (String integer : integers) {
+                    classGroupIds.add(Integer.parseInt(integer));
                     classGroupStudentMapperDao.deleteByClassGroupIdAndStudents(Integer.parseInt(integer), classGroupStudent.get(integer));
                 }
             }
         }
+        //解冻课程
+        courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds,0);
+        //解冻班级
+        classGroupIds.add(masterClassGroupId);
+        classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds,0);
         //获取没有学员的课程
         List<Long> delCourseIds = courseScheduleDao.findNoStudentCourseIds(courseIds);
         if (delCourseIds != null && delCourseIds.size() > 0) {

+ 26 - 32
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -17,6 +17,7 @@ import java.util.stream.Collectors;
 import javax.annotation.Resource;
 
 import com.ym.mec.auth.api.enums.CertificateTypeEnum;
+import com.ym.mec.biz.dal.entity.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -56,29 +57,6 @@ import com.ym.mec.biz.dal.dto.StudentFeeDetailDto;
 import com.ym.mec.biz.dal.dto.StudentInfo;
 import com.ym.mec.biz.dal.dto.StudentMusicDetailDto;
 import com.ym.mec.biz.dal.dto.StudentMusicGroupDto;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
-import com.ym.mec.biz.dal.entity.CooperationOrgan;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
-import com.ym.mec.biz.dal.entity.Goods;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
-import com.ym.mec.biz.dal.entity.Student;
-import com.ym.mec.biz.dal.entity.StudentCourseFeeDetail;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
-import com.ym.mec.biz.dal.entity.StudentRegistration;
-import com.ym.mec.biz.dal.entity.Subject;
-import com.ym.mec.biz.dal.entity.SubjectChange;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
-import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.enums.CourseStatusEnum;
@@ -322,7 +300,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         }
 
         StudentRegistration hasReg = getByPhoneAndMusicGroupId(studentRegistration.getMusicGroupId(), studentRegistration.getParentsPhone());
-        if (hasReg != null) {
+        if (hasReg != null && hasReg.getMusicGroupStatus() != StudentMusicGroupStatusEnum.QUIT) {
             throw new BizException("该乐团您已报名");
         }
 
@@ -352,18 +330,24 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         studentRegistration.setUpdateTime(date);
         studentRegistration.setUserId(sysUser.getId());
         studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.APPLY);
-        studentRegistrationDao.insert(studentRegistration);
+        if(hasReg != null){
+            studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
+            studentRegistration.setId(hasReg.getId());
+            studentRegistrationDao.update(studentRegistration);
+        }else {
+            studentRegistrationDao.insert(studentRegistration);
+        }
 
         // 增加报名学生数
-        musicGroupSubjectPlanService.addApplyStudentNum(studentRegistration.getMusicGroupId(), studentRegistration.getActualSubjectId(), 1);
+        musicGroupSubjectPlanService.addApplyStudentNum(studentRegistration.getMusicGroupId(), studentRegistration.getSubjectId(), 1);
         // 报名成功后,发送短信
         // String studentApplyUrl = sysConfigDao.findConfigValue(SysConfigService.STUDENT_APPLY_URL) + studentRegistration.getMusicGroupId();
         String serverPhone = sysConfigDao.findConfigValue(SysConfigService.SERVER_PHONE);
-        Subject subject = subjectDao.get(studentRegistration.getActualSubjectId());
+        Subject subject = subjectDao.get(studentRegistration.getSubjectId());
         // MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
 
         Map<Integer, String> map = new HashMap<>(1);
-        map.put(studentRegistration.getUserId(), studentRegistration.getParentsPhone());
+        map.put(sysUser.getId(), studentRegistration.getParentsPhone());
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_APPLY_MESSAGE, map, null, 0, "", "",
                 studentRegistration.getParentsName(), subject.getName(), serverPhone);
 
@@ -841,16 +825,20 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public void insertStudent(String studentIds,String oldMusicGroupId,String newMusicGroupId,BigDecimal masterTotalPrice){
-        if(oldMusicGroupId == newMusicGroupId){
-            return;
-        }
+    public void insertStudent(String studentIds,String oldMusicGroupId,String newMusicGroupId,Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect){
         SysUser sysUser1 = sysUserFeignService.queryUserInfo();
         //获取旧乐团学员注册信息
         List<StudentRegistration> studentRegistrations = studentRegistrationDao.queryByUserIdsAndMusicGroupId(studentIds,oldMusicGroupId);
         List<StudentCourseFeeDetail> studentCourseFeeDetails = new ArrayList<>();
         BigDecimal amount = BigDecimal.ZERO;
         for (StudentRegistration studentRegistration : studentRegistrations) {
+            BigDecimal masterTotalPrice = collect.get(studentRegistration.getUserId()).stream().map(e->e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+            if(masterTotalPrice.doubleValue() > studentRegistration.getSurplusCourseFee().doubleValue()){
+                throw new BizException("用户信息发生变动,请重新提交");
+            }
+            if(oldMusicGroupId == newMusicGroupId){
+                continue;
+            }
             //记录课程余额消费日志
             if(studentRegistration.getSurplusCourseFee().doubleValue() > 0d && masterTotalPrice.doubleValue() > 0d){
                 StudentCourseFeeDetail studentCourseFeeDetail = new StudentCourseFeeDetail();
@@ -875,6 +863,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             StudentRegistration registration = studentRegistrationDao.getByPhoneAndMusicGroupId(newMusicGroupId, studentRegistration.getParentsPhone());
             if (registration != null) {
                 //修改剩余课程余额
+                registration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
                 registration.setSurplusCourseFee(registration.getSurplusCourseFee().add(amount));
                 studentRegistrationDao.update(registration);
             }else {
@@ -1618,6 +1607,11 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     @Transactional(rollbackFor = Exception.class)
     public Boolean batchDelRegs(String musicGroupId, List<Integer> userIds) {
         List<StudentRegistration> registrations = studentRegistrationDao.findStudentListByUserIdList(musicGroupId, userIds);
+        for (StudentRegistration registration : registrations) {
+            if(registration.getPaymentStatus().equals(PaymentStatusEnum.OPEN)||registration.getPaymentStatus().equals(PaymentStatusEnum.YES)){
+                throw new BizException("开启缴费/已缴费的学员不能删除");
+            }
+        }
         if (registrations.size() <= 0) {
             throw new BizException("删除的学员不存在,请核查");
         }

+ 51 - 17
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java

@@ -52,6 +52,8 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 	@Autowired
 	private MusicGroupDao musicGroupDao;
 	@Autowired
+	private StudentRegistrationDao studentRegistrationDao;
+	@Autowired
 	private DemoGroupDao demoGroupDao;
 	@Autowired
 	private OrganizationDao organizationDao;
@@ -238,6 +240,45 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 
 	@Transactional(rollbackFor = Exception.class)
 	public void queryGroupStudents1(Integer teacherId, String search) {
+		List<ImUserFriendDto> imUserFriendDtos = imUserFriendDao.queryFriendListByUserId(teacherId, search);
+		if(imUserFriendDtos.size() > 0){
+			return;
+		}
+		Set<BasicUserDto> basicUserDtos = new HashSet<>();
+		//学员关联的通讯录
+		//获取相关课程,班级老师列表
+		Set<Integer> teacherIds = teacherDao.findMusicTeacherIds(teacherId);
+		//获取学员所在乐团列表
+		List<String> musicGroupIds = studentRegistrationDao.queryStudentMusicGroup(teacherId);
+		if (musicGroupIds != null && musicGroupIds.size() > 0) {
+			List<MusicGroup> musicGroups = musicGroupDao.queryListByIds(StringUtils.join(musicGroupIds, ","));
+			musicGroups.forEach(e -> {
+				teacherIds.add(e.getDirectorUserId());
+				teacherIds.add(e.getEducationalTeacherId());
+				teacherIds.add(e.getTeamTeacherId());
+			});
+		}
+		//获取相关vip课老师列表
+		teacherIds.addAll(teacherDao.findVipTeacherIds(teacherId));
+		//获取陪练课老师列表
+		teacherIds.addAll(teacherDao.findPracticeTeacherIds(teacherId));
+		//获取对外课程老师列表
+		teacherIds.addAll(teacherDao.findCloseCourseTeacherIds(teacherId));
+		//获取陪练课课程教务老师
+		teacherIds.addAll(teacherDao.findPracticeEducationalTeacherId(teacherId));
+		//获取VIP课程教务老师
+		teacherIds.addAll(teacherDao.findVipEducationalTeacherId(teacherId));
+		//获取对外课程务老师
+		teacherIds.addAll(teacherDao.findCommEducationalTeacherId(teacherId));
+		//获取关联的指导老师
+		Student student = studentDao.get(teacherId);
+		if (student != null && student.getTeacherId() != null) {
+			teacherIds.add(student.getTeacherId());
+		}
+		if (teacherIds.size() > 0) {
+			basicUserDtos.addAll(teacherDao.queryTeacherBaseInfo(teacherIds, search));
+		}
+
 		//获取关联的学员列表
 		Set<Integer> studentIds = teacherDao.queryCourseClassStudentIds(teacherId);
 		//获取关联的老师列表
@@ -256,7 +297,7 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 		}
 		studentIds.removeAll(Collections.singleton(null));
 		List<ImGroupModel> musicGroups =  musicGroupDao.queryTeacherGroups(teacherId,search);
-		List<BasicUserDto> teachers = new ArrayList<>();
+
 		if(musicGroups != null && musicGroups.size() > 0){
 			Set<String> musicGroupId = musicGroups.stream().map(ImGroupModel::getId).collect(Collectors.toSet());
 			List<MusicGroup> musicGroupList = musicGroupDao.queryListByIds(StringUtils.join(musicGroupId, ","));
@@ -271,15 +312,16 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 			teacherIdSet.remove(teacherId);
 			teacherIdSet.removeAll(Collections.singleton(null));
 			if(teacherIdSet.size() > 0){
-				teachers = teacherDao.queryMusicGroupStudents(StringUtils.join(teacherIdSet,","), search);
+				basicUserDtos.addAll(teacherDao.queryMusicGroupStudents(StringUtils.join(teacherIdSet,","), search));
 			}
 		}
+
 		List<BasicUserDto> userDtos = teacherDao.queryGroupStudents(teacherId, search);
 		if(userDtos != null && userDtos.size() > 0){
-			teachers.addAll(userDtos);
-			Set<String> musicGroupIds = userDtos.stream().map(e -> e.getMusicGroupId()).collect(Collectors.toSet());
-			if(musicGroupIds != null && musicGroupIds.size() > 0){
-				Map<String, String> musicGroupNameMap = MapUtil.convertIntegerMap(musicGroupDao.queryMusicGroupNameMap(musicGroupIds));
+			basicUserDtos.addAll(userDtos);
+			Set<String> musicGroupIds1 = userDtos.stream().map(e -> e.getMusicGroupId()).collect(Collectors.toSet());
+			if(musicGroupIds1 != null && musicGroupIds1.size() > 0){
+				Map<String, String> musicGroupNameMap = MapUtil.convertIntegerMap(musicGroupDao.queryMusicGroupNameMap(musicGroupIds1));
 				userDtos.forEach(e->{
 					e.setMusicGroupName(musicGroupNameMap.get(e.getMusicGroupId()));
 				});
@@ -287,20 +329,12 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 		}
 		studentIds.removeAll(userDtos.stream().map(e->e.getUserId()).collect(Collectors.toSet()));
 		studentIds.remove(teacherId);
-		//获取课程关联的学生列表
-//		teachers.addAll(teacherDao.findCloseCourseStudentIds(teacherId, search));
-		//获取相关vip陪练教务的学员编号
-//		teachers.addAll(teacherDao.findVipEducationalStudentId(teacherId,search));
-//		teachers.addAll(teacherDao.findCommEducationalStudentId(teacherId,search));
-//		teachers.addAll(teacherDao.findPracticeEducationalStudentId(teacherId,search));
 		if(studentIds.size() > 0){
-			teachers.addAll(teacherDao.queryTeacherBaseInfo(studentIds,search));
+			basicUserDtos.addAll(teacherDao.queryTeacherBaseInfo(studentIds,search));
 		}
-		if(teachers.size() > 0){
-			//删除现有的用户通讯录
-			imUserFriendDao.deleteByUserId(teacherId);
+		if(basicUserDtos.size() > 0){
 			//批量新增
-			imUserFriendDao.batchInsert(teachers,teacherId);
+			imUserFriendDao.batchInsert(basicUserDtos,teacherId);
 		}
 	}
 

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

@@ -254,7 +254,7 @@
                 AND sci.charge_type_ = #{chargeType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>
             <if test="noneTqType != null">
-                and spo.mer_no_ != '淘器微信'
+                AND spo.mer_nos_ != '淘器微信'
             </if>
         </where>
     </sql>

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

@@ -393,7 +393,7 @@
 
     <!-- 根据乐团编号和手机号查询注册乐团注册信息-->
     <select id="getByPhoneAndMusicGroupId" resultMap="StudentRegistration">
-        SELECT * FROM student_registration WHERE music_group_id_ = #{musicGroupId} AND parents_phone_ = #{parentsPhone} AND music_group_status_ != 'QUIT' LIMIT 1
+        SELECT * FROM student_registration WHERE music_group_id_ = #{musicGroupId} AND parents_phone_ = #{parentsPhone}
     </select>
 
     <resultMap type="com.ym.mec.auth.api.entity.SysUser" id="FindSysUser">
@@ -740,4 +740,11 @@
         LEFT JOIN sys_user su ON su.id_ = sr.user_id_
         WHERE sr.music_group_id_ = #{musicGroupId} AND FIND_IN_SET(sr.user_id_,#{studentIds}) AND sr.music_group_status_ != 'QUIT'
     </select>
+    <!-- 批量删除信息 -->
+    <delete id="batchDelete">
+        DELETE FROM student_registration WHERE id_ IN
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </delete>
 </mapper>

+ 4 - 4
mec-util/src/main/java/com/ym/mec/util/web/WebUtil.java

@@ -7,17 +7,17 @@
  */
 package com.ym.mec.util.web;
 
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
 
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.ym.mec.util.encode.AES;
 import org.apache.commons.lang3.StringUtils;
 
+import static com.ym.mec.util.encode.AES.encrypt;
+
 /**
  * 
  */

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

@@ -4,7 +4,6 @@ import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
-import com.ym.mec.common.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;