Bläddra i källkod

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

# Conflicts:
#	mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
zouxuan 5 år sedan
förälder
incheckning
0fac9c11f1
40 ändrade filer med 830 tillägg och 92 borttagningar
  1. 14 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java
  2. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupTeacherMapperDao.java
  3. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  4. 5 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/FinancialExpenditureDao.java
  5. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SellOrderDao.java
  6. 14 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserContractsDao.java
  7. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IntegerAndIntegerListDto.java
  8. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRegistration.java
  9. 6 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserContracts.java
  10. 10 10
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SellOrderQueryInfo.java
  11. 10 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupTeacherMapperService.java
  12. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java
  13. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  14. 13 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserContractsService.java
  15. 26 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java
  16. 168 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  17. 82 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  18. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/FinancialExpenditureServiceImpl.java
  19. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  20. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OperatingReportServiceImpl.java
  21. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SellOrderServiceImpl.java
  22. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java
  23. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java
  24. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  25. 14 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
  26. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserContractsServiceImpl.java
  27. 210 0
      mec-biz/src/main/resources/config/contracts/product.ftl
  28. 8 2
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  29. 8 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupTeacherMapperMapper.xml
  30. 2 2
      mec-biz/src/main/resources/config/mybatis/CooperationOrganMapper.xml
  31. 24 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  32. 40 21
      mec-biz/src/main/resources/config/mybatis/FinancialExpenditureMapper.xml
  33. 23 10
      mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml
  34. 7 3
      mec-biz/src/main/resources/config/mybatis/SysUserContractsMapper.xml
  35. 10 0
      mec-student/src/main/java/com/ym/mec/student/controller/ContractsController.java
  36. 1 0
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  37. 20 0
      mec-student/src/main/java/com/ym/mec/student/controller/RepairController.java
  38. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java
  39. 0 2
      mec-web/src/main/java/com/ym/mec/web/controller/SellOrderController.java
  40. 6 0
      mec-web/src/main/java/com/ym/mec/web/controller/StudentPaymentRouteOrderController.java

+ 14 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java

@@ -14,11 +14,13 @@ import com.ym.mec.common.security.SecurityConstants;
 import com.ym.mec.common.security.SecurityUtils;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.im.ImFeignService;
+import com.ym.mec.thirdparty.eseal.ESealPlugin;
 import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
@@ -27,6 +29,7 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Date;
+import java.util.Objects;
 
 @RestController()
 @RequestMapping("user")
@@ -43,6 +46,8 @@ public class UserController extends BaseController {
 	private SysUserRoleService sysUserRoleService;
 	@Autowired
 	private IdGeneratorService smsCodeService;
+	@Autowired
+	private ESealPlugin eSealPlugin;
 
 	@ApiOperation(value = "分页查询用户信息")
 	@ApiImplicitParams({ @ApiImplicitParam(name = "userType", value = "用户类型", required = false, dataType = "String"),
@@ -225,6 +230,15 @@ public class UserController extends BaseController {
 			if(sysUser.getBirthdate() != null && DateUtil.daysBetween(sysUser.getBirthdate(),date) <= 0){
 				throw new BizException("出生日期不可超过当前时间");
 			}
+
+			String accountId = eSealPlugin.createUserAccount(
+					sysUser.getRealName(),
+					sysUser.getIdCardNo(),
+					user.getUsername().split(":")[1]);
+			if (StringUtils.isBlank(accountId)) {
+				throw new BizException("用户信息错误");
+			}
+
 			sysUserService.updateBaseInfo(sysUser);
 			return succeed();
 		}

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

@@ -64,6 +64,8 @@ public interface ClassGroupTeacherMapperDao extends BaseDAO<Long, ClassGroupTeac
      */
     List<ClassGroupTeacherMapper> findByMusicGroup(String musicGroupId);
 
+    List<ClassGroupTeacherMapper> findAllByMusicGroup(String musicGroupId);
+
     List<ClassGroupTeacherMapper> findByClassGroup(Integer classGroupId);
 
     ClassGroupTeacherMapper findByClassGroupAndTeacher(@Param("classGroupId") Integer classGroupId,

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

@@ -61,6 +61,8 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      */
     int batchDeleteCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
+    int batchDeleteCourseSchedulesWithoutCheck(@Param("courseScheduleIds") List<Long> courseScheduleIds);
+
     int batchDeleteCourseSchedulesWithLogic(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
     int batchDeleteAllCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);
@@ -87,6 +89,9 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
                                                        @Param("status") String status);
 
 
+    List<CourseSchedule> findMusicGroupAllCourseSchedules(@Param("musicGroupId") String musicGroupId,
+                                                       @Param("groupType") String groupType);
+
     /**
      * @param musicGroupId: 乐团编号
      * @param status:       状态
@@ -1266,6 +1271,9 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      */
     List<Map<Long, Integer>> countGroupOverCourse(@Param("groupIds") List<String> groupIds, @Param("groupType") String groupType);
 
+
+    int countGroupFinishCourse(@Param("groupId") String groupId, @Param("groupType") String groupType);
+
     /**
      * @param userId:
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>

+ 5 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/FinancialExpenditureDao.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.entity.FinancialExpenditure;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -20,18 +21,19 @@ public interface FinancialExpenditureDao extends BaseDAO<Long, FinancialExpendit
 
     /**
      * 统计合作单位各类型的支出
+     *
      * @return
      */
-    List<FinancialExpenditure> getCooperationExpenditure();
+    List<FinancialExpenditure> getCooperationExpenditure(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
 
     /**
+     * @param collect:
+     * @return java.lang.Integer
      * @describe
      * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
      * @author zouxuan
      * @date 2020/9/16
      * @time 11:38
-     * @param collect:
-     * @return java.lang.Integer
      */
     List<String> countBydingTalk(@Param("collect") List<Object> collect);
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SellOrderDao.java

@@ -76,6 +76,16 @@ public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
     List<OperatingReport> getRepairGoodsSellGroupMonthReport(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
 
     /**
+     * 维修单和商品销售,总收入
+     *
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<OperatingReport> getRepairGoodsSellGroupIncome(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
+
+
+    /**
      * 根据订单号删除
      *
      * @param orderId
@@ -94,6 +104,7 @@ public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
 
     /**
      * 外部订单总收入
+     *
      * @param startTime
      * @param endTime
      * @return

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

@@ -2,8 +2,21 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.entity.SysUserContracts;
 import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface SysUserContractsDao extends BaseDAO<Long, SysUserContracts> {
 
+    /**
+     * @describe 获取用户指定类型的协议记录
+     * @author Joburgess
+     * @date 2020.09.18
+     * @param userId:
+     * @param contractType:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.SysUserContracts>
+     */
+    List<SysUserContracts> getUserContractWithType(@Param("userId") Integer userId,
+                                                   @Param("contractType") SysUserContracts.ContractType contractType);
 	
-}
+}

+ 3 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IntegerAndIntegerListDto.java

@@ -8,15 +8,15 @@ import java.util.List;
  */
 public class IntegerAndIntegerListDto {
 
-    private Integer id;
+    private Long id;
 
     private List<Integer> ids;
 
-    public Integer getId() {
+    public Long getId() {
         return id;
     }
 
-    public void setId(Integer id) {
+    public void setId(Long id) {
         this.id = id;
     }
 

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

@@ -110,6 +110,8 @@ public class StudentRegistration {
 
     //乐团
     private OwnershipType ownershipType;
+    
+    private Integer chargeTypeId;
 
     public BigDecimal getBalance() {
         return balance;
@@ -381,4 +383,12 @@ public class StudentRegistration {
     public void setOwnershipType(OwnershipType ownershipType) {
         this.ownershipType = ownershipType;
     }
+
+	public Integer getChargeTypeId() {
+		return chargeTypeId;
+	}
+
+	public void setChargeTypeId(Integer chargeTypeId) {
+		this.chargeTypeId = chargeTypeId;
+	}
 }

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

@@ -11,7 +11,12 @@ public class SysUserContracts {
 
 	public enum ContractType implements BaseEnum<String, ContractType> {
 
-		REGISTER("注册"), INSTRUMENT("乐器借用"), COURSES("课程购买"), VIP_COURSES("VIP课程购买"), PRACTICE("网管课购买");
+		REGISTER("注册"),
+		INSTRUMENT("乐器借用"),
+		COURSES("课程购买"),
+		VIP_COURSES("VIP课程购买"),
+		PRACTICE("网管课购买"),
+		PRODUCT("产品");
 
 		private String desc;
 

+ 10 - 10
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SellOrderQueryInfo.java

@@ -13,8 +13,8 @@ public class SellOrderQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "商品名称",required = false)
     private String goodsName;
 
-    @ApiModelProperty(value = "学校id",required = false)
-    private Integer schoolId;
+    @ApiModelProperty(value = "合作单位id",required = false)
+    private Integer cooperationOrganId;
 
     @ApiModelProperty(value = "销售类型",required = false)
     private SellTypeEnum type;
@@ -42,14 +42,6 @@ public class SellOrderQueryInfo extends QueryInfo {
         this.goodsName = goodsName;
     }
 
-    public Integer getSchoolId() {
-        return schoolId;
-    }
-
-    public void setSchoolId(Integer schoolId) {
-        this.schoolId = schoolId;
-    }
-
     public SellTypeEnum getType() {
         return type;
     }
@@ -73,4 +65,12 @@ public class SellOrderQueryInfo extends QueryInfo {
     public void setEndTime(Date endTime) {
         this.endTime = endTime;
     }
+
+    public Integer getCooperationOrganId() {
+        return cooperationOrganId;
+    }
+
+    public void setCooperationOrganId(Integer cooperationOrganId) {
+        this.cooperationOrganId = cooperationOrganId;
+    }
 }

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

@@ -34,7 +34,7 @@ public interface ClassGroupTeacherMapperService extends BaseService<Long, ClassG
      * @param classGroupTeacherMapperList
      * @return
      */
-    boolean classGroupTeacherMapperUpdate(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) throws Exception;
+    boolean classGroupTeacherMapperUpdate(List<ClassGroupTeacherMapper> classGroupTeacherMapperList);
 
     void createMusicGroupTeacherMapper(List<CourseSchedule> courseSchedules,String musicGroupId);
 
@@ -48,6 +48,15 @@ public interface ClassGroupTeacherMapperService extends BaseService<Long, ClassG
     void createCourseScheduleTeacherSalary(List<CourseSchedule> courseSchedules, Map<Long, CourseSchedule> oldCourseSchedules);
 
     /**
+     * @describe 初始化课程课酬,课酬为0
+     * @author Joburgess
+     * @date 2020.09.21
+     * @param courseSchedules:
+     * @return void
+     */
+    void initCourseScheduleTeacherSalary(List<CourseSchedule> courseSchedules, List<ClassGroupTeacherMapper> classGroupTeacherMapperList);
+
+    /**
      * 获取班级老师
      * @param classGroupId
      * @return

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.Map;
 
 import com.ym.mec.biz.dal.entity.SysUserTsign;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
@@ -105,4 +106,18 @@ public interface ContractService {
 	 * @return
 	 */
 	boolean transferPracticeCoursesContract(Integer userId, int courseSectionNum, Date startDate, Date endDate, BigDecimal fee);
+
+	/**
+	 * 传递产品协议
+	 * @param userId
+	 * @return
+	 */
+	boolean transferProduceContract(Integer userId,String musicGroupId);
+
+	/**
+	 * 查询产品协议
+	 * @param userId
+	 * @return
+	 */
+	Map<String, Object> queryProductContract(Integer userId,String musicGroupId);
 }

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

@@ -40,6 +40,8 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 */
 	void batchDeleteCourseSchedules(List<Long> courseScheduleIds);
 
+	void batchDeleteCourseSchedulesWithoutCheck(List<CourseSchedule> courseScheduleList);
+
 	/**
 	 * @describe 删除乐团下所有未上的课时
 	 * @author Joburgess
@@ -49,6 +51,8 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 */
 	void batchDeleteMusicGroupNotStartCourse(String musicGroupId,GroupType groupType);
 
+	void batchDeleteMusicGroup(String musicGroupId,GroupType groupType);
+
 	/**
 	 * @describe 删除指定乐团下指定状态的课程
 	 * @author Joburgess

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

@@ -3,6 +3,18 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.entity.SysUserContracts;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.List;
+
 public interface SysUserContractsService extends BaseService<Long, SysUserContracts> {
 
-}
+    /**
+     * @describe 获取用户指定类型的协议记录
+     * @author Joburgess
+     * @date 2020.09.18
+     * @param userId:
+     * @param contractType:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.SysUserContracts>
+     */
+    List<SysUserContracts> getUserContractWithType(Integer userId, SysUserContracts.ContractType contractType);
+
+}

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

@@ -155,7 +155,7 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         return classGroupTeacherMapperDao.findClassGroupTeachers(StringUtils.join(collect, ","));
     }
 
-    public boolean classGroupTeacherMapperUpdate(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) throws Exception {
+    public boolean classGroupTeacherMapperUpdate(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) {
         Date date = new Date();
         Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
         List<Integer> classGroupIds = classGroupTeacherMapperList.stream().map(classGroupTeacherMapper -> classGroupTeacherMapper.getClassGroupId()).collect(Collectors.toList());
@@ -514,6 +514,31 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         }
     }
 
+    @Override
+    public void initCourseScheduleTeacherSalary(List<CourseSchedule> courseSchedules, List<ClassGroupTeacherMapper> classGroupTeacherMapperList) {
+        List<Long> courseScheduleIds = courseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+        courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+        Date date=new Date();
+        for (CourseSchedule classGroupNoStartCourseSchedule : courseSchedules) {
+            for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
+                //课程与老师薪水表
+                CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+                courseScheduleTeacherSalary.setCourseScheduleId(classGroupNoStartCourseSchedule.getId());
+                courseScheduleTeacherSalary.setGroupType(classGroupNoStartCourseSchedule.getGroupType());
+                courseScheduleTeacherSalary.setMusicGroupId(classGroupNoStartCourseSchedule.getMusicGroupId());
+                courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
+                courseScheduleTeacherSalary.setUserId(classGroupTeacherMapper.getUserId());
+                courseScheduleTeacherSalary.setExpectSalary(BigDecimal.ZERO);
+                courseScheduleTeacherSalary.setCreateTime(date);
+                courseScheduleTeacherSalary.setUpdateTime(date);
+                courseScheduleTeacherSalary.setClassGroupId(classGroupTeacherMapper.getClassGroupId());
+                courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+            }
+        }
+        courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
+    }
+
     /**
      * @param courseSchedule:                              课程信息
      * @param teachType:                                   教师类型

+ 168 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java

@@ -5,13 +5,11 @@ import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dao.StudentDao;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.InitializingBean;
@@ -63,6 +61,9 @@ import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.freemarker.FreemarkerTemplateEngine;
 import com.ym.mec.util.money.MoneyUtil;
 import com.ym.mec.util.pdf.PDFUtil;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 @Service
 public class ContractServiceImpl implements ContractService, InitializingBean {
@@ -116,6 +117,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 	@Autowired
 	private MusicGroupService musicGroupService;
 
+	@Autowired
+	private StudentDao studentDao;
+
 	@Value("${contract.baseDir:/var/pdf}")
 	private String contractBaseDir;
 
@@ -285,6 +289,10 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 	@Override
 	public boolean transferMusicGroupCoursesContract(Integer userId, String musicGroupId) {
+		if(true){
+			return transferProduceContract(userId, musicGroupId);
+		}
+
 		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
 
 		if (sysUserTsign == null) {
@@ -477,6 +485,10 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 	@Override
 	public boolean transferVipGroupCoursesContract(Integer userId, Long vipGroupId) {
+		if(true){
+			return transferProduceContract(userId, null);
+		}
+
 		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
 
 		if (sysUserTsign == null) {
@@ -616,6 +628,10 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 	@Override
 	public boolean transferGoodsContract(Integer userId, String musicGroupId, String goodsIds, KitGroupPurchaseTypeEnum kitGroupPurchaseTypeEnum) {
+		if(true){
+			return transferProduceContract(userId, musicGroupId);
+		}
+
 		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
 
 		if (sysUserTsign == null) {
@@ -847,6 +863,10 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 	@Override
 	public boolean transferPracticeCoursesContract(Integer userId, int courseSectionNum, Date startDate, Date endDate, BigDecimal fee) {
+		if(true){
+			return transferProduceContract(userId, null);
+		}
+
 		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
 
 		if (sysUserTsign == null) {
@@ -920,4 +940,148 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		return true;
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+	public boolean transferProduceContract(Integer userId,String musicGroupId) {
+		SysUser user = studentDao.lockUserReturnInfo(userId);
+
+		List<SysUserContracts> userContracts = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT);
+		if(!CollectionUtils.isEmpty(userContracts)){
+			return true;
+		}
+
+		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
+		if (sysUserTsign == null) {
+			if (user == null) {
+				throw new BizException("用户信息查询失败");
+			}
+			sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
+		}
+		Date date = new Date();
+
+		// 合成freemarker
+		String srcPdfPath = contractBaseDir + "/product/" + dateFormat1.format(date) + "/" + userId + ".pdf";
+
+		File srcFile = new File(srcPdfPath);
+
+		File debtFile = new File(srcFile.getParent());
+		if (!debtFile.exists()) {
+			debtFile.mkdirs();
+		}
+
+		FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
+		templateEngine.setClassForTemplateLoading(ContractServiceImpl.class, "/config/contracts/");
+
+		Map<String, Object> params = new HashMap<String, Object>();
+
+		// 查询参数信息
+		StudentInfo studentInfo = studentRegistrationService.queryStudentInfo(userId);
+		params.put("studentInfo", studentInfo);
+
+		params.put("isShowVisualSeal", false);
+
+		if(StringUtils.isBlank(musicGroupId)){
+			params.put("ownershipType", "OWN");
+		}else{
+			MusicGroup musicGroup = musicGroupService.get(musicGroupId);
+			if (musicGroup == null) {
+				throw new BizException("乐团信息没找到");
+			}
+			params.put("ownershipType", musicGroup.getOwnershipType().name());
+		}
+
+		templateEngine.render(params, "product.ftl", srcFile);
+
+		// 生成借款协议PDF
+		try {
+			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath, "simsun.ttc");
+		} catch (IOException e) {
+			throw new BizException("生成产品协议失败", e);
+		}
+
+
+		String organCode = "";
+		if (OwnershipType.OWN.name().equals(params.get("ownershipType"))){
+			organCode = "91440300326364429H";
+		} else {
+			organCode = "91420106333619290A";
+		}
+		SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
+		if (organTsign == null) {
+			throw new BizException("甲方未创建签章");
+		}
+
+		eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
+		if (sysUserTsign != null) {
+			eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), srcPdfPath, srcPdfPath);
+		}
+
+		// 上传到oss
+		String dateStrOss = dateFormatOss.format(date);
+		dateStrOss = "product/" + dateStrOss + "/" + DateUtil.getHour(date);
+		String pdfFilePath = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, dateStrOss, srcFile);
+
+		SysUserContracts sysUserContracts = new SysUserContracts();
+		sysUserContracts.setCreateTime(date);
+		sysUserContracts.setType(ContractType.PRODUCT);
+		sysUserContracts.setUrl(pdfFilePath);
+		sysUserContracts.setUserId(userId);
+
+		sysUserContractsService.insert(sysUserContracts);
+
+		FileUtils.deleteQuietly(srcFile);
+		return true;
+	}
+
+	@Override
+	@Transactional(isolation = Isolation.READ_COMMITTED)
+	public Map<String, Object> queryProductContract(Integer userId,String musicGroupId) {
+		// 合成freemarker
+		String srcPdfPath = contractBaseDir + "/product/" + userId + ".pdf";
+
+		File srcFile = new File(srcPdfPath);
+
+		File debtFile = new File(srcFile.getParent());
+		if (!debtFile.exists()) {
+			debtFile.mkdirs();
+		}
+
+		FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
+		templateEngine.setClassForTemplateLoading(ContractServiceImpl.class, "/config/contracts/");
+
+		Map<String, Object> params = new HashMap<String, Object>();
+
+		StudentInfo studentInfo = studentRegistrationService.queryStudentInfo(userId);
+		params.put("studentInfo", studentInfo);
+		params.put("isShowVisualSeal", true);
+
+		if(StringUtils.isBlank(musicGroupId)){
+			params.put("ownershipType", "OWN");
+		}else{
+			MusicGroup musicGroup = musicGroupService.get(musicGroupId);
+			if (musicGroup == null) {
+				throw new BizException("乐团信息没找到");
+			}
+			params.put("ownershipType", musicGroup.getOwnershipType().name());
+		}
+
+		templateEngine.render(params, "product.ftl", srcFile);
+
+		String html = "";
+		try {
+			html = FileUtils.readFileToString(srcFile);
+		} catch (IOException e) {
+			throw new BizException("读取产品协议出错", e);
+		} finally {
+			FileUtils.deleteQuietly(srcFile);
+		}
+
+		List<SysUserContracts> userContractWithType = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT);
+
+		Map<String, Object> result = new HashMap<>();
+		result.put("exists", !CollectionUtils.isEmpty(userContractWithType));
+		result.put("productContract", html);
+		return result;
+	}
+
 }

+ 82 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -132,6 +132,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	private PracticeGroupService practiceGroupService;
     @Autowired
 	private CoursesGroupModifyLogDao coursesGroupModifyLogDao;
+    @Autowired
+	private ClassGroupTeacherMapperDao classGroupTeacherMapperDao;
 
     private final Logger LOGGER = LoggerFactory
             .getLogger(this.getClass());
@@ -220,7 +222,33 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		}
 	}
 
-    @Override
+	@Override
+	public void batchDeleteCourseSchedulesWithoutCheck(List<CourseSchedule> courseScheduleList) {
+    	if(CollectionUtils.isEmpty(courseScheduleList)){
+    		return;
+		}
+		List<Long> courseScheduleIds = courseScheduleList.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+
+		courseScheduleDao.batchDeleteCourseSchedulesWithoutCheck(courseScheduleIds);
+		courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
+		courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
+		// 删除考勤
+		teacherAttendanceDao.batchDeleteByCourseSchedules(courseScheduleIds);
+		studentAttendanceDao.deleteByCourseSchedules(courseScheduleIds);
+
+		// 删除作业
+		courseHomeworkService.delHomwworkByCourseScheduleId(courseScheduleIds);
+
+		List<Integer> classGroupIdList = courseScheduleList.stream().map(t -> t.getClassGroupId()).collect(Collectors.toList());
+		// 更新班级信息
+		if (classGroupIdList != null && classGroupIdList.size() > 0) {
+			for (Integer classGroupId : classGroupIdList) {
+				classGroupService.updateClassGroupInfo(classGroupId);
+			}
+		}
+	}
+
+	@Override
     @Transactional(rollbackFor = Exception.class)
     public void batchDeleteMusicGroupNotStartCourse(String musicGroupId, GroupType groupType) {
         if (StringUtils.isBlank(musicGroupId)) {
@@ -236,7 +264,19 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         batchDeleteCourseSchedules(courseScheduleIds);
     }
 
-    @Override
+	@Override
+	public void batchDeleteMusicGroup(String musicGroupId, GroupType groupType) {
+		if (StringUtils.isBlank(musicGroupId)) {
+			throw new BizException("请指定乐团");
+		}
+		List<CourseSchedule> musicGroupCourseSchedules = courseScheduleDao.findMusicGroupAllCourseSchedules(musicGroupId, groupType.getCode());
+		if (CollectionUtils.isEmpty(musicGroupCourseSchedules)) {
+			throw new BizException("此乐团不存在未上课程");
+		}
+		batchDeleteCourseSchedulesWithoutCheck(musicGroupCourseSchedules);
+	}
+
+	@Override
     @Transactional(rollbackFor = Exception.class)
     public void batchDeleteMusicGroupCourseWithStudent(String musicGroupId, Integer userId, GroupType groupType) {
         if (StringUtils.isBlank(musicGroupId)) {
@@ -645,13 +685,40 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         List<CourseSchedule> courseSchedules = createCourseScheduleDto.getCourseSchedules();
 
         if(!CollectionUtils.isEmpty(courseSchedules)){
-            //添加课程计划
-            batchAddCourseSchedule(courseSchedules);
+			List<ClassGroupTeacherMapper> byMusicGroup = classGroupTeacherMapperDao.findAllByMusicGroup(createCourseScheduleDto.getMusicGroupID());
+			Map<Integer, List<ClassGroupTeacherMapper>> teacherByClassGroup = byMusicGroup.stream().collect(Collectors.groupingBy(ClassGroupTeacherMapper::getClassGroupId));
+
+			Map<Integer, List<CourseSchedule>> classGroupCourseSchedules = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getClassGroupId));
+			for (Map.Entry<Integer, List<CourseSchedule>> classGroupCoursesEntry : classGroupCourseSchedules.entrySet()) {
+				List<ClassGroupTeacherMapper> classGroupTeacherMappers = teacherByClassGroup.get(classGroupCoursesEntry.getKey());
+				Set<Integer> teachingTeacherIds = classGroupTeacherMappers.stream().filter(t -> TeachTypeEnum.TEACHING.equals(t.getTeacherRole())).map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
+				classGroupCoursesEntry.getValue().sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+				for(int i=0;i<classGroupCoursesEntry.getValue().size();i++){
+					classGroupCoursesEntry.getValue().get(i).setTeachingTeacherIdList(new ArrayList<>(teachingTeacherIds));
+					if(i==0){
+						continue;
+					}
+					CourseSchedule c1=classGroupCoursesEntry.getValue().get(i-1);
+					CourseSchedule c2=classGroupCoursesEntry.getValue().get(i);
+					if(c1.getStartClassTime().compareTo(c2.getEndClassTime())<0
+						&&c1.getEndClassTime().compareTo(c2.getStartClassTime())>0){
+						throw new BizException("排课循环周期时间存在重叠");
+					}
+				}
+//				for (CourseSchedule courseSchedule : classGroupCoursesEntry.getValue()) {
+//					courseSchedule.setTeachingTeacherIdList(new ArrayList<>(teachingTeacherIds));
+//				}
+				//添加课程计划
+				batchAddCourseSchedule(classGroupCoursesEntry.getValue());
+				//创建学生单节课的缴费记录,乐团课的缴费为0
+				courseScheduleStudentPaymentService.createCourseScheduleStudentPaymentByCourseSchedules(classGroupCoursesEntry.getValue());
+				classGroupTeacherMapperService.initCourseScheduleTeacherSalary(classGroupCoursesEntry.getValue(),classGroupTeacherMappers);
+			}
+			List<Long> courseScheduleIds = courseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+			courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
             //更新课次
             List<Integer> classGroupIds = courseSchedules.stream().map(CourseSchedule::getClassGroupId).collect(Collectors.toList());
             classGroupService.batchUpdateClassCourseTimes(classGroupIds);
-            //创建学生单节课的缴费记录,乐团课的缴费为0
-            courseScheduleStudentPaymentService.createCourseScheduleStudentPaymentByCourseSchedules(courseSchedules);
         }
 
         MusicGroup musicGroup = musicGroupService.get(createCourseScheduleDto.getMusicGroupID());
@@ -1637,12 +1704,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if (!CollectionUtils.isEmpty(existCourseScheduleIds)) {
             courseScheduleTeachingTeacherIdList = courseScheduleDao.findCourseScheduleIdAndUserIdsMap(existCourseScheduleIds, TeachTypeEnum.TEACHING.getCode());
         }
-        Map<Integer, IntegerAndIntegerListDto> courseScheduleTeachingTeacherMap = courseScheduleTeachingTeacherIdList.stream()
+        Map<Long, IntegerAndIntegerListDto> courseScheduleTeachingTeacherMap = courseScheduleTeachingTeacherIdList.stream()
                 .collect(Collectors.toMap(IntegerAndIntegerListDto::getId, integerAndIntegerListDto -> integerAndIntegerListDto));
 
         //班级助教关联ID集合
         List<IntegerAndIntegerListDto> classGroupAndUserIdsMap = courseScheduleDao.findClassGroupAndUserIdsMap(newCourseScheduleClassGroupIds, TeachTypeEnum.TEACHING.getCode());
-        Map<Integer, IntegerAndIntegerListDto> classGroupTeachingTeacherMap = classGroupAndUserIdsMap.stream()
+        Map<Long, IntegerAndIntegerListDto> classGroupTeachingTeacherMap = classGroupAndUserIdsMap.stream()
                 .collect(Collectors.toMap(IntegerAndIntegerListDto::getId, integerAndIntegerListDto -> integerAndIntegerListDto));
 
         Set<Long> existCourseScheduleIdsSet=new HashSet<>(existCourseScheduleIds);
@@ -1679,9 +1746,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                             throw new BizException(courseCheckInfo(preCourseSchedule, backCourseSchedule, existCourseScheduleIds, 1));
                         }
 
-                        if(Objects.isNull(preCourseSchedule.getId())){
-                            continue;
-                        }
+//                        if(Objects.isNull(preCourseSchedule.getId())){
+//                            continue;
+//                        }
 
                         //助教冲突检测
                         if (Objects.isNull(preCourseSchedule.getId())) {
@@ -1819,12 +1886,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if (!CollectionUtils.isEmpty(existCourseScheduleIds)) {
             courseScheduleTeachingTeacherIdList = courseScheduleDao.findCourseScheduleIdAndUserIdsMap(existCourseScheduleIds, TeachTypeEnum.TEACHING.getCode());
         }
-        Map<Integer, IntegerAndIntegerListDto> courseScheduleTeachingTeacherMap = courseScheduleTeachingTeacherIdList.stream()
+        Map<Long, IntegerAndIntegerListDto> courseScheduleTeachingTeacherMap = courseScheduleTeachingTeacherIdList.stream()
                 .collect(Collectors.toMap(IntegerAndIntegerListDto::getId, integerAndIntegerListDto -> integerAndIntegerListDto));
 
         //班级助教关联ID集合
         List<IntegerAndIntegerListDto> classGroupAndUserIdsMap = courseScheduleDao.findClassGroupAndUserIdsMap(newCourseScheduleClassGroupIds, TeachTypeEnum.TEACHING.getCode());
-        Map<Integer, IntegerAndIntegerListDto> classGroupTeachingTeacherMap = classGroupAndUserIdsMap.stream()
+        Map<Long, IntegerAndIntegerListDto> classGroupTeachingTeacherMap = classGroupAndUserIdsMap.stream()
                 .collect(Collectors.toMap(IntegerAndIntegerListDto::getId, integerAndIntegerListDto -> integerAndIntegerListDto));
 
         Set<Long> existCourseScheduleIdsSet=new HashSet<>(existCourseScheduleIds);
@@ -2006,12 +2073,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if (!CollectionUtils.isEmpty(existCourseScheduleIds)) {
             courseScheduleTeachingTeacherIdList = courseScheduleDao.findCourseScheduleIdAndUserIdsMap(existCourseScheduleIds, null);
         }
-        Map<Integer, IntegerAndIntegerListDto> courseScheduleTeacherMap = courseScheduleTeachingTeacherIdList.stream()
+        Map<Long, IntegerAndIntegerListDto> courseScheduleTeacherMap = courseScheduleTeachingTeacherIdList.stream()
                 .collect(Collectors.toMap(IntegerAndIntegerListDto::getId, integerAndIntegerListDto -> integerAndIntegerListDto));
 
         //班级教师关联ID集合
         List<IntegerAndIntegerListDto> classGroupAndUserIdsMap = courseScheduleDao.findClassGroupAndUserIdsMap(newCourseScheduleClassGroupIds, null);
-        Map<Integer, IntegerAndIntegerListDto> classGroupTeachingTeacherMap = classGroupAndUserIdsMap.stream()
+        Map<Long, IntegerAndIntegerListDto> classGroupTeachingTeacherMap = classGroupAndUserIdsMap.stream()
                 .collect(Collectors.toMap(IntegerAndIntegerListDto::getId, integerAndIntegerListDto -> integerAndIntegerListDto));
 
         existCourseSchedules.sort(Comparator.comparing(CourseSchedule::getStartClassTime));

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

@@ -117,6 +117,7 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
 						Integer integer = organMap.get(row.get(s));
 						if(integer == null){
 							LOGGER.error("支出记录导入异常:分部校验失败 param:{}",objectMap);
+							continue valueIsNull;
 						}else {
 							objectMap.put("organId", integer);
 						}

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

@@ -872,6 +872,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("用户信息获取失败");
         }
         MusicGroup musicGroup = saveLog(musicGroupId, MusicGroupStatusEnum.PREPARE);
+        int finishCourseNum = courseScheduleDao.countGroupFinishCourse(musicGroupId, GroupType.MUSIC.getCode());
+        if(finishCourseNum>0){
+            throw new BizException("此乐团存在已结束课程");
+        }
+
         //乐器采购清单是否确认
         Map<String, Object> param = new HashMap<>();
         param.put("musicGroupId", musicGroupId);

+ 4 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OperatingReportServiceImpl.java

@@ -42,7 +42,7 @@ public class OperatingReportServiceImpl extends BaseServiceImpl<Integer, Operati
     public Boolean statistics() {
         Date nowDate = new Date();
         Date startTime = DateUtil.getFirstDayOfMonth(DateUtil.addDays1(nowDate, -1));
-        Date endTime = DateUtil.getLastDayOfMonth(startTime);
+        Date endTime = DateUtil.getLastTimeWithDay(DateUtil.getLastDayOfMonth(startTime));
 
         Map<Integer, OperatingReport> cooperationOperating = new HashMap<>();
         Map<Integer, OperatingReport> organOperating = new HashMap<>();
@@ -68,7 +68,7 @@ public class OperatingReportServiceImpl extends BaseServiceImpl<Integer, Operati
         }
 
         //2、获取支出费用
-        List<FinancialExpenditure> cooperationExpenditures = financialExpenditureDao.getCooperationExpenditure();
+        List<FinancialExpenditure> cooperationExpenditures = financialExpenditureDao.getCooperationExpenditure(startTime, endTime);
         for (FinancialExpenditure cooperationExpenditure : cooperationExpenditures) {
             OperatingReport organOperatingReport = new OperatingReport();
             if (organOperating.containsKey(cooperationExpenditure.getOrganId())) {
@@ -112,6 +112,7 @@ public class OperatingReportServiceImpl extends BaseServiceImpl<Integer, Operati
         reports.addAll(sellOrderDao.getOutOrderIncome(startTime, endTime));
         //3.4、乐器维修、商品销售
         reports.addAll(sellOrderDao.getRepairGoodsSellGroupMonthReport(startTime, endTime));
+        reports.addAll(sellOrderDao.getRepairGoodsSellGroupIncome(startTime, endTime));
         //3.5、零星支付充值
         reports.addAll(sellOrderDao.getRechargeMonthReport(startTime, endTime));
         //3.6、零星收费(不是充值部分的)
@@ -188,7 +189,7 @@ public class OperatingReportServiceImpl extends BaseServiceImpl<Integer, Operati
         }
         Date nowDate = new Date();
         Date startTime = DateUtil.getFirstDayOfMonth(DateUtil.addDays1(nowDate, -1));
-        Date endTime = DateUtil.getLastDayOfMonth(startTime);
+        Date endTime = DateUtil.getLastTimeWithDay(DateUtil.getLastDayOfMonth(startTime));
         Map<String, Object> params = new HashMap<>();
         params.put("startTime", startTime);
         params.put("endTime", endTime);

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

@@ -79,7 +79,7 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
             }
             goodsPrice = nowGoods.getGroupPurchasePrice();
 
-            BigDecimal goodsBalance = goodsTotalBalance.multiply(goodsPrice).divide(totalAmount, 2, BigDecimal.ROUND_HALF_UP);
+            BigDecimal goodsBalance = goodsTotalBalance.multiply(goodsPrice).divide(goodsTotalPrice, 2, BigDecimal.ROUND_HALF_UP);
             if (i == goodsNum) {
                 goodsBalance = goodsTotalBalance.subtract(hasRouteBalance);
             }
@@ -208,7 +208,9 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
                 sellOrders.add(sellOrder);
             }
         }
-        sellOrderDao.batchInsert(sellOrders);
+        if (sellOrders.size() > 0) {
+            sellOrderDao.batchInsert(sellOrders);
+        }
         return sellOrders;
     }
 

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java

@@ -17,6 +17,8 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
@@ -49,6 +51,10 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
     private SysUserCashAccountDetailService sysUserCashAccountDetailService;
     @Autowired
     private DegreeRegistrationService degreeRegistrationService;
+    @Autowired
+    private ContractService contractService;
+
+    private final Logger logger= LoggerFactory.getLogger(this.getClass());
 
     @Override
     public BaseDAO<Integer, SporadicChargeInfo> getDAO() {
@@ -65,11 +71,20 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
         Integer userId = studentPaymentOrder.getUserId();
         SysUser sysUser = sysUserFeignService.queryUserById(userId);
         SporadicChargeInfo info = sporadicChargeInfoDao.get(Integer.parseInt(studentPaymentOrder.getMusicGroupId()));
+
         Map<Integer, String> map = new HashMap();
         map.put(userId, sysUser.getPhone());
         Map<Integer, String> yimei = new HashMap();
         map.put(userId, userId.toString());
         if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
+            try {
+                if(Objects.isNull(info.getUserId())){
+                    contractService.transferProduceContract(userId, null);
+                }
+            } catch (Exception e) {
+                logger.error("产品协议生成失败", e);
+            }
+
             //福袋活动,增加课程余额
             if (info.getChargeType().getCode() == 6) {
                 sysUserCashAccountService.appendCourseBalance(userId, studentPaymentOrder.getActualAmount(), PlatformCashAccountDetailTypeEnum.SPORADIC, "活动");

+ 4 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java

@@ -89,6 +89,7 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
         studentPaymentRouteOrderDto.setRouteOrganId(studentPaymentRouteOrderDto.getOrganId());
         studentPaymentRouteOrderDto.setExpectAmount(studentPaymentRouteOrderDto.getActualAmount());
         studentPaymentRouteOrderDto.setStatus(DealStatusEnum.SUCCESS);
+        studentPaymentRouteOrderDto.setCreateTime(studentPaymentRouteOrderDto.getPayTime());
         studentPaymentRouteOrderDto.setUpdateTime(nowDate);
 
         studentPaymentOrderDao.insert(studentPaymentRouteOrderDto);
@@ -140,15 +141,15 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
                 sellOrder.setActualAmount(actualAmount);
                 sellOrder.setBalanceAmount(BigDecimal.ZERO);
                 sellOrder.setExpectAmount(actualAmount);
-                sellOrder.setSellCost(goods.getDiscountPrice().multiply(new BigDecimal(goodsMap.getValue())));
+                sellOrder.setSellCost(goods.getDiscountPrice());
                 sellOrder.setSellCost2(JSON.toJSONString(CostMap));
                 sellOrder.setNum(goodsMap.getValue());
                 sellOrder.setUserId(studentPaymentRouteOrderDto.getUserId());
                 sellOrder.setPaymentChannel(studentPaymentRouteOrderDto.getPaymentChannel());
                 sellOrder.setMerNo(studentPaymentRouteOrderDto.getMerNos());
                 sellOrder.setSellTime(studentPaymentRouteOrderDto.getCreateTime());
-                sellOrder.setCreateIme(new Date());
-                sellOrder.setUpdateTime(new Date());
+                sellOrder.setCreateIme(nowDate);
+                sellOrder.setUpdateTime(nowDate);
                 sellOrder.setType(SellTypeEnum.SCHOOL_BUY);
                 sellOrders.add(sellOrder);
             }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -20,6 +20,7 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.redis.service.RedisCache;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
+import com.ym.mec.thirdparty.eseal.ESealPlugin;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.http.HttpUtil;
@@ -93,6 +94,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     private RedisCache<String, Object> redisCache;
     @Autowired
     private SellOrderService sellOrderService;
+    @Autowired
+    private ESealPlugin eSealPlugin;
 
     @Override
     public BaseDAO<Long, StudentRegistration> getDAO() {
@@ -233,12 +236,18 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 ImResult register = imFeignService.register(new ImUserModel(userId.toString(), sysUser.getUsername(), sysUser.getAvatar()));
                 sysUser.setImToken(register.getToken());
             } else {
+                if(StringUtils.isNotEmpty(sysUser.getUsername())){
+                    if(!sysUser.getUsername().equals(studentRegistration.getName())){
+                        throw new BizException("操作失败:账户已被注册");
+                    }
+                }
                 if (!sysUser.getUserType().contains("STUDENT")) {
                     sysUser.setUserType(sysUser.getUserType() + ",STUDENT");
                 }
                 sysUser.setPhone(studentRegistration.getParentsPhone());
                 sysUser.setOrganId(studentRegistration.getOrganId());
                 sysUser.setRealName(studentRegistration.getParentsName());
+
                 sysUser.setUsername(studentRegistration.getName());
                 sysUser.setGender(studentRegistration.getGender());
                 sysUser.setBirthdate(studentRegistration.getBirthdate());
@@ -583,6 +592,11 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 sysUser.setImToken(register.getToken());
                 teacherDao.updateUser(sysUser);
             } else {
+                if(StringUtils.isNotEmpty(sysUser.getUsername())){
+                    if(!sysUser.getUsername().equals(studentRegistration.getName())){
+                        throw new BizException("操作失败:账户已被注册");
+                    }
+                }
                 if (!sysUser.getUserType().contains("STUDENT")) {
                     sysUser.setUserType(sysUser.getUserType() + ",STUDENT");
                 }

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

@@ -68,6 +68,10 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
     private SellOrderService sellOrderService;
     @Autowired
     private StudentGoodsSellDao studentGoodsSellDao;
+    @Autowired
+    private ContractService contractService;
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
     @Override
     public BaseDAO<Integer, StudentRepair> getDAO() {
@@ -182,7 +186,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         if (studentGoodsSell.getIsUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
             SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(studentId);
             if (userCashAccount == null) {
-                throw new BizException("用户账户找不到");
+                throw new BizException("用户账户不存在");
             }
             if (userCashAccount.getBalance() != null && userCashAccount.getBalance().compareTo(BigDecimal.ZERO) > 0) {
                 balance = amount.compareTo(userCashAccount.getBalance()) >= 0 ? userCashAccount.getBalance() : amount;
@@ -605,6 +609,14 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         map.put(userId, userId.toString());
 
         if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
+            if(repairInfo.getType()==1){
+                try {
+                    contractService.transferProduceContract(userId, null);
+                } catch (Exception e) {
+                    logger.error("产品协议生成失败", e);
+                }
+            }
+
             repairInfo.setPayStatus(2);
             repairInfo.setUpdateTime(nowDate);
             if (this.update(repairInfo) <= 0) {
@@ -652,7 +664,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 List<Goods> goods = JSONObject.parseArray(repairInfo.getGoodsJson(), Goods.class);
                 List<Integer> goodsIds = goods.stream().map(Goods::getId).collect(Collectors.toList());
                 if (goodsIds.size() > 0) {
-                    sellOrderService.addSellOrder(studentPaymentOrder.getId(), repairInfo.getMusicGroupId(), goodsIds, studentPaymentOrder.getExpectAmount(), studentPaymentOrder.getBalancePaymentAmount());
+                    sellOrderService.addSellOrder(studentPaymentOrder.getId(), null, goodsIds, studentPaymentOrder.getExpectAmount(), studentPaymentOrder.getBalancePaymentAmount());
                 }
             }
 

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

@@ -9,6 +9,8 @@ import com.ym.mec.biz.service.SysUserContractsService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 
+import java.util.List;
+
 @Service
 public class SysUserContractsServiceImpl extends BaseServiceImpl<Long, SysUserContracts>  implements SysUserContractsService {
 	
@@ -19,5 +21,10 @@ public class SysUserContractsServiceImpl extends BaseServiceImpl<Long, SysUserCo
 	public BaseDAO<Long, SysUserContracts> getDAO() {
 		return sysUserContractsDao;
 	}
+
+	@Override
+	public List<SysUserContracts> getUserContractWithType(Integer userId, SysUserContracts.ContractType contractType) {
+		return sysUserContractsDao.getUserContractWithType(userId, contractType);
+	}
 	
-}
+}

+ 210 - 0
mec-biz/src/main/resources/config/contracts/product.ftl

@@ -0,0 +1,210 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
+    <meta http-equiv="Pragma" content="no-cache" />
+    <meta http-equiv="Cache-Control" content="no-cache" />
+    <meta http-equiv="Expires" content="0" />
+    <title>产品与服务协议</title>
+    <style>
+        body { margin: 0; }
+        header {
+            height: 40px;
+            line-height: .40px;
+            color: #000;
+            font-size: 17px;
+            background: #fff;
+            box-shadow: 0px 1px 8px 0px rgba(0, 0, 0, 0.07);
+            text-align: center;
+        }
+        header .back {
+            width: 20px;
+            height: 20px;
+            position: absolute;
+            left: 12px;
+            top: 10px;
+        }
+        .container {
+            padding: 22px 20px 3px;
+            font-size: 14px;
+        }
+        h1 {
+            font-size: 16px;
+            text-align: center;
+        }
+        h2 {
+            font-size: 16px;
+            font-weight: bold;
+            padding-top: 15px;
+        }
+        h3 {
+            font-size: 14px;
+            font-weight: bold;
+        }
+        .signature {
+            padding-top: 50px;
+            padding-bottom: 20px;
+        }
+        .signature .sign {
+            position: relative;
+            width: 49%;
+            display: inline-block;
+        }
+        .signature span {
+            display: block;
+        }
+        .signature .cachet {
+            position: absolute;
+            top: -60px;
+            left: 0;
+            width: 150px;
+            height: 150px;
+        }
+        .iInfo {
+            display: flex;
+        }
+        .iInfo span {
+            flex: 1;
+        }
+        .iInfoContent, .iInfoContent span {
+            display: block;
+        }
+
+        .underline {
+            text-decoration: underline;
+        }
+        .bold {
+            font-weight: bold;
+        }
+        .highlight{
+            color: red;
+        }
+    </style>
+</head>
+<body style="font-family:'SimSun'">
+    <div class="container">
+        <h1>《产品与服务协议》</h1>
+        <!-- 甲方:深圳大雅乐盟网络教育股份有限公司 <br/> -->
+        <#if ownershipType == 'OWN'>
+		甲方:深圳大雅乐盟网络教育股份有限公司
+		<#else>
+		甲方:武汉长乐长风乐器销售有限公司
+		</#if>
+		<br/>
+        <div style="display: flex;">乙方:
+            <div style="flex: 1 auto;">
+                <div class="iInfo">
+                    <span>家长姓名:${studentInfo.realName!}</span>
+                    <span>电话:${studentInfo.phone!}</span>
+                </div>
+                <div class="iInfo">
+                    <span>身份证号:${studentInfo.idCardNo!}</span>
+                </div>
+                <div class="iInfo">
+                    <span>学生姓名:${studentInfo.username!}</span>
+                </div>
+                <#if studentInfo.grade?default("")?trim?length gt 1>
+                <div class="iInfo">
+                    <span>所在班级:${studentInfo.grade!} ${studentInfo.clazz!}</span>
+                </div>
+                </#if>
+                <#if studentInfo.subject.name?default("")?trim?length gt 1>
+                <div class="iInfo">
+                    <span>所在声部:${studentInfo.subject.name!}</span>
+                </div>
+                </#if>
+            </div>
+        </div>
+        <div class="underline">(本协议中“乙方“指学员及家长;”乙方学员“指购买甲方产品或服务的学员;”乙方家长“仅指乙方学员的法定监护人。)</div>
+
+        <p class="underline bold">重要须知:在注册或购买使用甲方提供的产品、服务之前,请您务必审慎阅读、充分理解本使用协议各条款内容, 特别是免除或者限制甲方责任的条款、对您权利进行限制的条款、约定争议解决方式和司法管辖的条款等。 限制、免责条款或者其他涉及您重大权益的条款可能以加粗、加下划线等形式提示您重点注意。您注册或购买使用甲方提供的产品和服务,均视为您同意本使用协议,以及同意接受本使用协议的约束。</p>
+        <h2>一、注册及购买</h2>
+        <div class="underline bold">1、无论是否源自甲方建议,乙方选择报名注册加入乐团,或选择购买使用甲方提供的产品和服务,均为乙方自主意愿的表达及独立自主的选择。</div>
+        2、乙方完成所选产品或服务缴费后,甲方向乙方开具加盖公司印章的收款凭据,乙方务必妥善保管。
+
+        <h2>二、乐团及上课规范</h2>
+        1、乙方学员在应服从甲方的管理,遵守甲方的制度。<br />
+        2、乙方学员应按时到达甲方指定上课地点,做好课前准备;如发生迟到、早退或因其他乙方原因未能按时上课的,视为乙方学员放弃该次课程,为避免影响老师后续课程的正常进行,授课老师除完成原定时间安排的授课外,将不再提供额外延长课时,也不会因乙方学员缺席而暂停教学课程。<br />
+        3、乙方学员不得携带任何食品进入教室,所有进食应在课前完成;进入教室后,不得大声喧哗、追逐嬉戏,应当听从授课老师的安排;乙方学员应爱护公共财产和教学设施,严禁在桌椅上刻、划、涂、写等不文明行为;乙方学员未经授课老师同意,不得擅自使用教室内的乐器、音响、电视、空调等器材、设施,如造成此类器材、设施损坏的,乙方应照价赔偿。<br />
+        4、未经授课老师同意,乙方家长不得进入课堂,以免影响老师和学员上课;为保证训练质量及进度,乙方学员应保证按照指导老师或教务老师所提出的要求在家练习,遇到专业问题应及时向指导老师请教,非专业问题可随时向教务老师反映。<br />
+        <span class="bold">5、乙方家长应教育及监督乙方学员务必注意个人安全,妥善保管个人财物,对于非甲方原因造成的人身安全事故或财物损失,由乙方自行承担。</span><br />
+        6、对于乐团学员出现以下情形时,甲方有权对乙方学员作出警告,如甲方作出警告后,乙方学员仍然不遵守甲方的管理制度的,甲方有权对其作出退团等处分。<br />
+        6.1上课、排练时不服从管理和指导,不遵守纪律,影响其他团员的正常上课、排练;<br />
+        6.2一个学期内发生两次及以上旷课行为;<br />
+        6.3一个学期内发生两次及以上未按老师要求回传视频作业的情形;<br />
+        6.4无特殊原因连续七天不练习,影响团员和乐团的整体水平的。<br />
+
+        <h2>三、请假</h2>
+        1、基于教学进度和质量保证,甲方对于课程延续性有严格要求,因此乙方学员应尽量参加课程,无特殊情况则应避免请假。<br />
+        <div class="bold">2、VIP课程学员如有特殊情况需要请假的,应提前4小时以上通过管乐迷App完成请假,否则当次课程将视同发生,系统将自动记录结算课时并扣除相应课程费用。</div>
+        3、VIP学员如遇特殊情况需要长期请假时,可向甲方/授课老师申请办理临时休会。学员可在6个月内申请复学,超过6个月未申请复学的,甲方有权按自动退会处理。<span class="bold">VIP课程为一对二课程的,其中一位学员申请临时休会的,还需征得同组另一位学员的同意后方可申请休会。否则将不予受理。</span><br />
+        <span class="bold">4、鉴于团课的特殊性,团课学员个人请假,当次课程仍视同发生,系统将自动记录结算课时并扣除相应课程费用。</span><br />
+        5、每期课程均有相对应的有效期,乙方应在有效期内完成课程,10次课一期的,自交费之日起4个月内有效;20次课一期的,自交费之日起8个月内有效;40次课一期的,自交费之日起16个月内有效。<span class="bold">如果由于指导老师请假等原因造成课程不能如期完成的,课程有效期将顺延;如课程超出有效期限,乙方所缴纳的课程费用将自动扣除逾期未完成的课时后自动清零。</span><br />
+
+        <h2>四、退费</h2>
+        <span class="bold">1、乐器、教辅、配件等,未经签收,自购买缴款之日起15日内提出申请可全额退还,超过上述期限则不予受理退费申请;非因商品本身存在质量问题,一经签收,无论使用与否,均不予退费;</span><br />
+        <span class="bold">2、乐保服务,在维修老师下校检查前提出申请可全额退还,下校检查日过后则不予退费;</span><br />
+        <span class="bold">3、非个别课程,包括但不限于声部基础课、合奏课、基础技能课、网基课、集训课、VIP课程项下一对二等,自购买缴款之日起15日内提出申请可全额退还,超过上述期限或实际已发生课时消耗的则一律不予受理退费;</span><br />
+        <span class="bold">4、正价购买的个别课程,包括但不限于VIP课程项下一对一、网管课等,课程有效期内可申请退费,可退款金额为:购买金额-课时原价*已消耗课时数量;</span><br />
+        <span class="bold">5、活动期间以优惠价格购买的个别课程,自购买缴款之日起15日内提出申请可全额退还,超过上述期限或实际已发生课时消耗的则一律不予受理退费;</span><br />
+        <span class="bold highlight">从您提出退费申请到您收到退款的时间,会因为您订购时所选择的付款方式而有所不同,通常符合规定的退费会在15个工作日内完成退款操作。</span><br />
+
+        <h2>五、违约责任</h2>
+        1、当事人一方不履行合同义务或者履行合同义务不符合约定的,均构成违约,守约方有权以书面通知的方式要求违约方纠正其违约行为并采取及时、有效的补救措施消除违约后果,并赔偿守约方因违约方之违约行为而遭致的损失。若违约方在收到守约方的上述通知后5日内未纠正其违约行为的,守约方有权在做出书面通知的情况下,单方解除本协议,违约方应赔偿守约方因此遭致的全部损失。<br />
+        2、乙方应始终维护甲方的知识产权以及品牌形象,本协议期间以及本协议因任何原因失效、被撤销、解除或终止后,均不得直接或间接通过任何公众媒体(包括但不限于传统大众媒体,以及微信、微博、博客、直播平台等社交平台)发表损害甲方(包括但不限于其产品、服务及甲方授课老师)声誉的言论或实施任何类似行为,否则乙方应赔偿甲方因此遭受的全部损失。<br />
+
+        <h2>六、保密条款</h2>
+        1、双方对本协议的条款、本协议的签订及履行情况以及通过签订和履行本协议而获知的对方及对方关联公司的任何信息均负有保密义务。任何一方不得以任何形式透露给第三方(有关法律法规要求和甲乙双方的法律、会计顾问、授权雇员除外),也不得擅自使用。<br />
+        2、本保密义务期限不受本协议期限的限制。本协议失效、被撤销、解除或终止等任何情况下,双方均应遵守本保密义务。<br />
+
+        <h2>七、不可抗力</h2>
+        1、一方遇到不可抗力事件(指甲乙双方无法控制、无法预见或即使预见也无法避免的事件,该事件妨碍、影响或延误任何一方履行本协议的全部或部分义务,该事件包括但不限于自然灾害(如水灾、地震等)、火灾、政府行为、法律或政策变化(含学校合作变化)、战争或其他任何类似事件)时,受影响方应当立即书面通知对方,并告知该不可抗力事件对本协议可能产生的影响,并在该不可抗力事件发生后5日内向对方提供该事件的详细信息及由有关机构出具的解释受影响方因此无法履行本协议项下全部或部分义务的相关证明。<br />
+        2、由于上述不可抗力事件致使受影响方无法履行或无法按时履行本协议项下全部或部分义务的,双方于彼此间均不承担违约责任,但双方应在相互信任的基础上协商解决,尽力减少不可抗力事件对本协议的影响,并采取合理方式进行调整(包括但不限于另行签订补充协议等),尽量避免损失的扩大。<br />
+        3、不可抗力事件消失或结束后,除双方另行协商一致外,受到不可抗力影响的一方应当立即采取措施继续履行本协议,如不可抗力事件持续30日以上的,则任何一方有权以书面通知对方的方式单方解除本协议。<br />
+
+        <h2>八、适用法律及争议解决方式</h2>
+        1、本协议的订立、效力、履行、解释及争议解决均适用中华人民共和国法律。<br />
+        2、因履行本协议发生的一切争议,甲乙双方应友好协商解决;如双方在发生争议后30日内无法通过协商解决时,任何一方有权向甲方所在地有管辖权的人民法院提起诉讼解决。<br />
+
+        <h2>九、其他</h2>
+        1、乙方同意,甲方有权在乙方学习、上课、排练和活动期间对其拍摄照片、视频,甲方对所拍摄的照片、视频享有著作权,乙方同意甲方可合理使用该等照片、视频。<br />
+        2、未经甲方事先书面同意,乙方不得将本课程转让给乙方以外的任何第三方。<br />
+        3、双方确认并同意,本协议的电子版本与纸质版本具有同等法律效力。双方发生争议时,电子合同打印件可作为证据提交。双方通过网络以在线方式签订本协议的 ,则以乙方点击“确认”或“同意”等相关按钮或以电子签名的方式作为对合同内容的同意、确认以及本协议的签署;如双方签订纸质版本协议的,则本协议壹式贰份,甲方盖公章或合同专用章并且乙方签字作为有效签署方式,并且双方各执壹份,每份具有同等法律效力。<br />
+        4、本协议自双方按照本协议约定方式签署之日起生效,有效期至双方履行完本协议约定的全部义务时止。<br />
+        5、本协议未尽事宜或对本协议的任何修改、补充,有双方另行协商后以签订补充协议的方式解决,补充协议与本协议具有同等法律效力;双方没有约定也没有协商一致的,遵照相关法律法规规定执行。<br />
+        6、双方因履行本协议而相互发出或者提供的所有通知、文件、资料,均以本协议中所列明的电话、App推送消息送达,乙方如果变更电话号码的,应当自变更后1日内通知甲方且获得甲方确认,甲方通过电话、App方式无法联系乙方或者甲方认为必要时,甲方也可以通过特快专递至乙方住址的方式向乙方发出上述任何通知、文件、资料等,并在甲方寄出特快专递后第5日视为送达成功。<br />
+
+        <div class="signature">
+        	<#if isShowVisualSeal>
+        	<#if ownershipType == 'OWN'>
+            <div class="sign">甲方签章:深圳大雅乐盟网络教育股份有限公司<img class="cachet" src="https://daya-online.oss-cn-beijing.aliyuncs.com/website/cachet.png" alt="" />
+                <span>日期:${.now?string("yyyy年MM月dd日")}</span>
+            </div>
+            <#else>
+            <div class="sign">甲方签章:武汉长乐长风乐器销售有限公司<img class="cachet" src="https://daya-online.oss-cn-beijing.aliyuncs.com/website/clcf.png" alt="" />
+                <span>日期:${.now?string("yyyy年MM月dd日")}</span>
+            </div>
+            </#if>
+            <div class="sign">乙方签章:${studentInfo.realName!}
+                <span>日期:${.now?string("yyyy年MM月dd日")} </span>
+            </div>
+        	<#else>
+        	<#if ownershipType == 'OWN'>
+            <div class="sign">甲方签章:深圳大雅乐盟网络教育股份有限公司
+                <span>日期:${.now?string("yyyy年MM月dd日")}</span>
+            </div>
+            <#else>
+            <div class="sign">甲方签章:武汉长乐长风乐器销售有限公司
+                <span>日期:${.now?string("yyyy年MM月dd日")}</span>
+            </div>
+            </#if>
+            <div class="sign">乙方签章:
+                <span>日期:${.now?string("yyyy年MM月dd日")} </span>
+            </div>
+        	</#if>
+        </div>
+    </div>
+</body>
+</html>

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

@@ -738,7 +738,7 @@
     </sql>
     <resultMap id="MusicGroupCourseScheduleDto" type="com.ym.mec.biz.dal.dto.MusicGroupCourseScheduleDto">
         <result property="courseScheduleId" column="course_schedule_id_"/>
-        <result property="classGroupName" column="course_schedule_name_"/>
+        <result property="classGroupName" column="class_group_name_"/>
         <result property="classDate" column="class_date_"/>
         <result property="startClassTime" column="start_class_time_"/>
         <result property="startClassTimeStr" column="start_class_time_"/>
@@ -774,11 +774,17 @@
     </select>
 
     <select id="queryMusicGroupCourseScheduleDetail" resultMap="MusicGroupCourseScheduleDto">
-        SELECT cs.id_ course_schedule_id_,cs.class_date_,cs.start_class_time_,cs.end_class_time_,cs.class_group_id_,cs.name_ course_schedule_name_,
+        SELECT cs.id_ course_schedule_id_,
+        cs.class_date_,
+        cs.start_class_time_,
+        cs.end_class_time_,
+        cs.class_group_id_,
+        cs.name_ course_schedule_name_,
         cs.type_ course_schedule_type_,cs.status_ course_schedule_status_,cg.name_ course_schedule_name_,
         IF(ta.sign_in_status_ IS NULL,3,ta.sign_in_status_) sign_in_status_,
         IF(ta.sign_out_status_ IS NULL,3,ta.sign_out_status_) sign_out_status_,
         csts.settlement_time_,
+        cg.name_ class_group_name_,
         ta.sign_in_time_,
         ta.sign_out_time_,
         ta.remark_

+ 8 - 0
mec-biz/src/main/resources/config/mybatis/ClassGroupTeacherMapperMapper.xml

@@ -143,6 +143,14 @@
         AND ct.teacher_role_="BISHOP"
     </select>
 
+    <select id="findAllByMusicGroup" resultMap="ClassGroupTeacherMapper">
+        SELECT u.real_name_, ct.*
+        FROM sys_user u,
+        class_group_teacher_mapper ct
+        WHERE ct.music_group_id_ = #{musicGroupId}
+        AND ct.user_id_=u.id_
+    </select>
+
     <!-- 删除对应班级老师关联关系 -->
     <delete id="delMusicGroupTeacherMapper">
         DELETE FROM class_group_teacher_mapper WHERE class_group_id_ IN

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

@@ -142,13 +142,13 @@
 
     <select id="getOrganFullJobResourceNum" resultType="com.ym.mec.biz.dal.dto.OrganFullJobResourceNumDto">
         SELECT organ_id_ organId,COUNT(*) num FROM cooperation_organ
-        WHERE full_job_resource_ =1 AND is_enable_=1 AND del_flag_ = 0
+        WHERE full_job_resource_ =1 AND del_flag_ = 0
         GROUP BY organ_id_
     </select>
 
     <!-- 获取全部使用中的合作单位 -->
     <select id="getAllCooperationOrgan" resultMap="CooperationOrgan">
         SELECT * FROM cooperation_organ
-        WHERE full_job_resource_ =1 AND del_flag_ = 0
+        WHERE del_flag_ = 0
     </select>
 </mapper>

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

@@ -302,6 +302,14 @@
         </foreach>
     </delete>
 
+    <delete id="batchDeleteCourseSchedulesWithoutCheck">
+        DELETE FROM course_schedule
+        WHERE id_ IN
+        <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
+            #{courseScheduleId}
+        </foreach>
+    </delete>
+
     <update id="batchDeleteCourseSchedulesWithLogic">
         UPDATE course_schedule
             SET del_flag_ = '1',update_time_ = NOW()
@@ -1955,6 +1963,13 @@
           AND cs.group_type_ = #{groupType}
           AND status_ = #{status}
     </select>
+    <select id="findMusicGroupAllCourseSchedules" resultMap="CourseSchedule">
+        SELECT cs.*
+        FROM course_schedule cs
+                 LEFT JOIN class_group cg ON cs.class_group_id_ = cg.id_
+        WHERE cg.music_group_id_ = #{musicGroupId}
+          AND cs.group_type_ = #{groupType}
+    </select>
     <select id="findMusicGroupCourseSchedulesWithStudent" resultMap="CourseSchedule">
         SELECT cs.*
         FROM course_schedule_student_payment cssp
@@ -2645,6 +2660,15 @@
         </foreach>
         GROUP BY cs.music_group_id_
     </select>
+    <select id="countGroupFinishCourse" resultType="int">
+        SELECT
+            COUNT(cs.Id_)
+        FROM
+            course_schedule cs
+        WHERE CONCAT(cs.class_date_, ' ', cs.start_class_time_) &lt; NOW()
+            AND cs.group_type_ = #{groupType}
+            AND cs.music_group_id_ = #{groupId}
+    </select>
     <select id="findUserCourses" resultMap="CourseSchedule">
         SELECT
         cs.id_,

+ 40 - 21
mec-biz/src/main/resources/config/mybatis/FinancialExpenditureMapper.xml

@@ -27,22 +27,31 @@
 
     <!-- 根据主键查询一条记录 -->
     <select id="get" resultMap="FinancialExpenditure">
-		SELECT * FROM financial_expenditure WHERE id_ = #{id}
-	</select>
+        SELECT *
+        FROM financial_expenditure
+        WHERE id_ = #{id}
+    </select>
 
     <!-- 全查询 -->
     <select id="findAll" resultMap="FinancialExpenditure">
-		SELECT * FROM financial_expenditure WHERE del_flag_ = 0 ORDER BY id_
-	</select>
+        SELECT *
+        FROM financial_expenditure
+        WHERE del_flag_ = 0
+        ORDER BY id_
+    </select>
 
     <!-- 向数据库增加一条记录 -->
-    <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.FinancialExpenditure" useGeneratedKeys="true" keyColumn="id"
+    <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.FinancialExpenditure" useGeneratedKeys="true"
+            keyColumn="id"
             keyProperty="id">
-        INSERT INTO financial_expenditure (batch_no_,financial_process_no_,dingtalk_process_no_,
-        organ_id_,cooperation_organ_id_,apply_user_,amount_,item_detail_,payment_time_,cause_,create_time_,update_time_,fee_project_,type_)
-        VALUES(#{batchNo},#{financialProcessNo},#{dingtalkProcessNo},#{organId},#{cooperationOrganId},#{applyUser},#{amount},
-        #{itemDetail},#{paymentTime},#{cause},now(),now(),#{feeProject,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-        #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
+        INSERT INTO financial_expenditure (batch_no_, financial_process_no_, dingtalk_process_no_,
+                                           organ_id_, cooperation_organ_id_, apply_user_, amount_, item_detail_,
+                                           payment_time_, cause_, create_time_, update_time_, fee_project_, type_)
+        VALUES (#{batchNo}, #{financialProcessNo}, #{dingtalkProcessNo}, #{organId}, #{cooperationOrganId},
+                #{applyUser}, #{amount},
+                #{itemDetail}, #{paymentTime}, #{cause}, now(), now(),
+                #{feeProject,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+                #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
     </insert>
 
     <insert id="batchInsert">
@@ -105,10 +114,14 @@
 
     <!-- 根据主键删除一条记录 -->
     <update id="delete">
-		UPDATE financial_expenditure SET del_flag_ = 1 WHERE id_ = #{id}
-	</update>
+        UPDATE financial_expenditure
+        SET del_flag_ = 1
+        WHERE id_ = #{id}
+    </update>
     <update id="batchDel">
-        UPDATE financial_expenditure SET del_flag_ = 1 WHERE FIND_IN_SET(id_,#{ids})
+        UPDATE financial_expenditure
+        SET del_flag_ = 1
+        WHERE FIND_IN_SET(id_, #{ids})
     </update>
 
     <sql id="queryPageSql">
@@ -131,7 +144,8 @@
             </if>
             <if test="search != null and search != ''">
                 AND (fe.id_ LIKE CONCAT('%',#{search},'%') OR fe.financial_process_no_ LIKE CONCAT('%',#{search},'%')
-                OR fe.dingtalk_process_no_ LIKE CONCAT('%',#{search},'%') OR fe.apply_user_ LIKE CONCAT('%',#{search},'%'))
+                OR fe.dingtalk_process_no_ LIKE CONCAT('%',#{search},'%') OR fe.apply_user_ LIKE
+                CONCAT('%',#{search},'%'))
             </if>
             <if test="organId != null and organId != ''">
                 AND FIND_IN_SET(fe.organ_id_,#{organId})
@@ -160,11 +174,12 @@
 
     <!-- 查询当前表的总记录数 -->
     <select id="queryCount" resultType="int">
-		SELECT COUNT(DISTINCT fe.id_) FROM financial_expenditure fe
+        SELECT COUNT(DISTINCT fe.id_) FROM financial_expenditure fe
         <include refid="queryPageSql"/>
-	</select>
+    </select>
 
-    <resultMap type="com.ym.mec.biz.dal.dto.FinancialExpenditureDto" id="FinancialExpenditureDto" extends="FinancialExpenditure">
+    <resultMap type="com.ym.mec.biz.dal.dto.FinancialExpenditureDto" id="FinancialExpenditureDto"
+               extends="FinancialExpenditure">
         <result column="organ_name_" property="organName"/>
         <result column="cooperation_name_" property="cooperationName"/>
     </resultMap>
@@ -183,10 +198,14 @@
     </select>
 
     <!-- 统计合作单位的支出 -->
-    <select id="getCooperationExpenditure" resultMap="FinancialExpenditure">
-        SELECT organ_id_,cooperation_organ_id_, type_, SUM(amount_) amount_ FROM financial_expenditure WHERE del_flag_ =0
-        GROUP BY organ_id_,cooperation_organ_id_,type_
-    </select>
+    <select id="getCooperationExpenditure" resultMap="FinancialExpenditure"><![CDATA[
+        SELECT organ_id_, cooperation_organ_id_, type_, SUM(amount_) amount_
+        FROM financial_expenditure
+        WHERE payment_time_ >= #{startTime}
+          AND payment_time_ <= #{endTime}
+          AND del_flag_ = 0
+        GROUP BY organ_id_, cooperation_organ_id_, type_
+        ]]></select>
     <select id="countBydingTalk" resultType="java.lang.String">
         SELECT dingtalk_process_no_ FROM financial_expenditure WHERE del_flag_ = 0 AND dingtalk_process_no_ IN
         <foreach collection="collect" separator="," open="(" close=")" item="item">

+ 23 - 10
mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml

@@ -151,7 +151,7 @@
         LEFT JOIN organization o ON o.id_ = so.organ_id_
         LEFT JOIN cooperation_organ co ON co.id_= so.cooperation_organ_id_
         <include refid="queryPageSql"/>
-        ORDER BY so.sell_time_ DESC
+        ORDER BY so.create_ime_ DESC
         <include refid="global.limit"/>
     </select>
 
@@ -190,9 +190,9 @@
     <!-- 获取分部学校的收入支出(乐团订单) -->
     <select id="getMusicGroupMonthReport" resultMap="com.ym.mec.biz.dal.dao.OperatingReportDao.OperatingReport"><![CDATA[
         SELECT spo.organ_id_,
-               co.id_                 cooperation_organ_id_,
-               SUM(so.actual_amount_) sell_amount_,
-               SUM(so.sell_cost_)     sellCost
+               co.id_                       cooperation_organ_id_,
+               SUM(so.actual_amount_)       sell_amount_,
+               SUM(so.sell_cost_ * so.num_) sell_cost_
         FROM student_payment_order spo
                  LEFT JOIN sell_order so on so.order_id_ = spo.id_
                  LEFT JOIN music_group mg ON mg.id_ = spo.music_group_id_
@@ -243,9 +243,9 @@
     <!-- 获取分部学校的收入支出(外部添加订单) -->
     <select id="getOutOrderMonthReport" resultMap="com.ym.mec.biz.dal.dao.OperatingReportDao.OperatingReport"><![CDATA[
         SELECT spo.organ_id_,
-               co.id_                 cooperation_organ_id_,
-               SUM(so.actual_amount_) sell_amount_,
-               SUM(so.sell_cost_)     sellCost
+               co.id_                       cooperation_organ_id_,
+               SUM(so.actual_amount_)       sell_amount_,
+               SUM(so.sell_cost_ * so.num_) sell_cost_
         FROM student_payment_order spo
                  LEFT JOIN sell_order so on so.order_id_ = spo.id_
                  LEFT JOIN cooperation_organ co ON co.id_ = spo.music_group_id_
@@ -309,9 +309,8 @@
     <select id="getRepairGoodsSellGroupMonthReport"
             resultMap="com.ym.mec.biz.dal.dao.OperatingReportDao.OperatingReport"><![CDATA[
         SELECT spo.organ_id_,
-               SUM(so.actual_amount_) income_total_,
-               SUM(so.actual_amount_) sell_amount_,
-               SUM(so.sell_cost_)     sellCost
+               SUM(so.actual_amount_)       sell_amount_,
+               SUM(so.sell_cost_ * so.num_) sell_cost_
         FROM student_payment_order spo
                  LEFT JOIN sell_order so on so.order_id_ = spo.id_
         WHERE spo.status_ = 'SUCCESS'
@@ -321,6 +320,20 @@
         GROUP BY spo.organ_id_
         ]]></select>
 
+    <!-- 获取分部学校的收入支出(维修、商品销售订单) -->
+    <select id="getRepairGoodsSellGroupIncome"
+            resultMap="com.ym.mec.biz.dal.dao.OperatingReportDao.OperatingReport"><![CDATA[
+        SELECT spo.organ_id_,
+               SUM(spo.actual_amount_) income_total_
+        FROM student_payment_order spo
+        WHERE spo.status_ = 'SUCCESS'
+          AND spo.group_type_ IN ('REPAIR', 'GOODS_SELL')
+          AND spo.create_time_ >= #{startTime}
+          AND spo.create_time_ <= #{endTime}
+        GROUP BY spo.organ_id_
+        ]]></select>
+
+
     <!-- 获取订单的销售列表 -->
     <select id="getOrderSellOrder" resultMap="SellOrder">
         SELECT *

+ 7 - 3
mec-biz/src/main/resources/config/mybatis/SysUserContractsMapper.xml

@@ -4,7 +4,7 @@
 <mapper namespace="com.ym.mec.biz.dal.dao.SysUserContractsDao">
 
 	<resultMap type="com.ym.mec.biz.dal.entity.SysUserContracts"
-		id="SysUserContracts">
+			   id="SysUserContracts">
 		<result column="id_" property="id" />
 		<result column="user_id_" property="userId" />
 		<result column="contract_no_" property="contractNo" />
@@ -28,7 +28,7 @@
 
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysUserContracts"
-		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+			useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
 			AS ID FROM DUAL </selectKey> -->
 		INSERT INTO sys_user_contracts
@@ -73,7 +73,7 @@
 
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="SysUserContracts"
-		parameterType="map">
+			parameterType="map">
 		SELECT * FROM sys_user_contracts ORDER BY id_
 		<include refid="global.limit" />
 	</select>
@@ -83,4 +83,8 @@
 		SELECT COUNT(*) FROM
 		sys_user_contracts
 	</select>
+
+	<select id="getUserContractWithType" resultMap="SysUserContracts">
+		SELECT * FROM sys_user_contracts WHERE user_id_=#{userId} AND type_=#{contractType}
+	</select>
 </mapper>

+ 10 - 0
mec-student/src/main/java/com/ym/mec/student/controller/ContractsController.java

@@ -2,6 +2,7 @@ package com.ym.mec.student.controller;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.Objects;
 
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -78,4 +79,13 @@ public class ContractsController extends BaseController {
 		return succeed(contractService.queryPracticeCoursesContract(sysUser.getId(), courseSectionNum, startDate, endDate, fee));
 	}
 
+	@ApiOperation("查询产品协议")
+	@GetMapping(value = "queryProduceContract")
+	public Object queryProduceContract(String musicGroupId) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("获取用户信息失败");
+		}
+		return succeed(contractService.queryProductContract(sysUser.getId(),musicGroupId));
+	}
 }

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

@@ -137,6 +137,7 @@ public class MusicGroupController extends BaseController {
             return failed("乐团在"+musicGroup.getStatus().getMsg()+",不能缴费");
         }
         studentRegistration.setOwnershipType(musicGroup.getOwnershipType());
+        studentRegistration.setChargeTypeId(musicGroup.getChargeTypeId());
 
         return succeed(studentRegistration);
     }

+ 20 - 0
mec-student/src/main/java/com/ym/mec/student/controller/RepairController.java

@@ -9,7 +9,11 @@ import com.ym.mec.biz.dal.entity.StudentRepair;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.page.GoodsCategoryQueryInfo;
+import com.ym.mec.biz.dal.page.GoodsQueryInfo;
 import com.ym.mec.biz.dal.page.RepairStudentQueryInfo;
+import com.ym.mec.biz.service.GoodsCategoryService;
+import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.biz.service.StudentPaymentOrderService;
 import com.ym.mec.biz.service.StudentRepairService;
 import com.ym.mec.common.controller.BaseController;
@@ -35,6 +39,10 @@ public class RepairController extends BaseController {
     private StudentRepairService studentRepairService;
     @Autowired
     private StudentPaymentOrderService studentPaymentOrderService;
+    @Autowired
+    private GoodsService goodsService;
+    @Autowired
+    private GoodsCategoryService goodsCategoryService;
 
     @ApiOperation("添加商品销售订单")
     @PostMapping(value = "/addGoodsSellOrder")
@@ -106,4 +114,16 @@ public class RepairController extends BaseController {
         }
         return succeed(studentRepairService.getStudentRepairer(sysUser.getId(),sysUser.getOrganId()));
     }
+
+    @ApiOperation(value = "分页查询商品(教材、辅件)列表")
+    @GetMapping("/queryGoodsPage")
+    public Object queryPage(GoodsQueryInfo queryInfo){
+        return succeed(goodsService.queryPage(queryInfo));
+    }
+
+    @ApiOperation(value = "分页查询商品分类列表")
+    @GetMapping("/queryGoodsCategoryPage")
+    public Object queryGoodsCategoryPage(GoodsCategoryQueryInfo queryInfo) {
+        return succeed(goodsCategoryService.queryPage(queryInfo));
+    }
 }

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

@@ -237,7 +237,7 @@ public class CourseScheduleController extends BaseController {
     @GetMapping("/batchDeleteMusicGroupNotStartCourse")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/batchDeleteMusicGroupNotStartCourse')")
 	public Object batchDeleteMusicGroupNotStartCourse(String musicGroupId){
-        scheduleService.batchDeleteMusicGroupNotStartCourse(musicGroupId,GroupType.MUSIC);
+        scheduleService.batchDeleteMusicGroup(musicGroupId,GroupType.MUSIC);
         return succeed();
     }
 

+ 0 - 2
mec-web/src/main/java/com/ym/mec/web/controller/SellOrderController.java

@@ -73,8 +73,6 @@ public class SellOrderController extends BaseController {
     @PostMapping(value = "/update")
     @PreAuthorize("@pcs.hasPermissions('sellOrder/update')")
     public HttpResponseResult<SellOrder> update(SellOrder sellOrder) {
-        SellOrder oldOrder = sellOrderService.get(sellOrder.getId());
-        sellOrder.setSellCost(sellOrder.getSellCost().multiply(new BigDecimal(oldOrder.getNum())));
         sellOrderService.update(sellOrder);
         return succeed(sellOrder);
     }

+ 6 - 0
mec-web/src/main/java/com/ym/mec/web/controller/StudentPaymentRouteOrderController.java

@@ -95,6 +95,12 @@ public class StudentPaymentRouteOrderController extends BaseController {
         if (studentPaymentRouteOrderDto.getSchoolId() != null) {
             studentPaymentRouteOrderDto.setMusicGroupId(studentPaymentRouteOrderDto.getSchoolId().toString());
         }
+        if (studentPaymentRouteOrderDto.getServiceAmount() == null) {
+            studentPaymentRouteOrderDto.setServiceAmount(BigDecimal.ZERO);
+        }
+        if (studentPaymentRouteOrderDto.getGoodsAmount() == null) {
+            studentPaymentRouteOrderDto.setGoodsAmount(BigDecimal.ZERO);
+        }
         studentPaymentRouteOrderDto.setActualAmount(studentPaymentRouteOrderDto.getServiceAmount().add(studentPaymentRouteOrderDto.getGoodsAmount()));
         return succeed(studentPaymentRouteOrderService.addOutOrder(studentPaymentRouteOrderDto));
     }