Parcourir la source

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

yanite il y a 3 ans
Parent
commit
2135fbe4ee
56 fichiers modifiés avec 936 ajouts et 177 suppressions
  1. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/OrganizationDao.java
  2. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java
  3. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentGoodsSellDao.java
  4. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantOrderRecordDao.java
  5. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/DegreeRegistrationActivityDto.java
  6. 33 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantInfoDto.java
  7. 15 5
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantOrderRecordDto.java
  8. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/DegreeRegistration.java
  9. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Organization.java
  10. 21 35
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/PlatformServe.java
  11. 15 23
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/PlatformServeDetail.java
  12. 32 19
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantInfo.java
  13. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantOrderRecord.java
  14. 174 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TenantOrderRecordVo.java
  15. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/PlatformServeDetailService.java
  16. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentExtracurricularExercisesSituationService.java
  17. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantInfoService.java
  18. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  19. 17 13
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  20. 28 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java
  21. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSchoolTermCourseDetailServiceImpl.java
  22. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java
  23. 33 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java
  24. 15 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentGoodsSellServiceImpl.java
  25. 11 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  26. 11 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  27. 138 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java
  28. 9 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantOrderRecordServiceImpl.java
  29. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  30. 9 2
      mec-biz/src/main/resources/config/mybatis/DegreeRegistrationMapper.xml
  31. 2 0
      mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml
  32. 3 3
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  33. 1 1
      mec-biz/src/main/resources/config/mybatis/MusicGroupSchoolTermCourseDetailMapper.xml
  34. 7 2
      mec-biz/src/main/resources/config/mybatis/OrganizationMapper.xml
  35. 27 0
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  36. 2 2
      mec-biz/src/main/resources/config/mybatis/StudentGoodsSellMapper.xml
  37. 2 2
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  38. 4 1
      mec-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml
  39. 47 0
      mec-biz/src/main/resources/config/mybatis/TenantOrderRecordMapper.xml
  40. 4 0
      mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java
  41. 43 1
      mec-common/common-core/src/main/java/com/ym/mec/common/page/QueryWrapperUtil.java
  42. 1 1
      mec-gateway/mec-gateway-web/src/main/resources/bootstrap-test.properties
  43. 2 0
      mec-im/src/main/java/com/ym/common/ApiException.java
  44. 1 0
      mec-im/src/main/java/com/ym/common/ErrorEnum.java
  45. 1 0
      mec-im/src/main/java/com/ym/controller/RoomController.java
  46. 4 3
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  47. 1 1
      mec-monitor/src/main/resources/bootstrap-test.properties
  48. 5 3
      mec-student/src/main/java/com/ym/mec/student/controller/DegreeController.java
  49. 2 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java
  50. 72 0
      mec-util/src/main/java/com/ym/mec/util/validator/ValidationKit.java
  51. 1 1
      mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java
  52. 38 2
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  53. 8 0
      mec-web/src/main/java/com/ym/mec/web/controller/SysTenantConfigController.java
  54. 4 4
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  55. 19 6
      mec-web/src/main/java/com/ym/mec/web/controller/TenantInfoController.java
  56. 1 1
      mec-zipkin/src/main/resources/bootstrap-test.properties

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

@@ -9,6 +9,8 @@ import java.util.Set;
 
 public interface OrganizationDao extends BaseDAO<Integer, Organization> {
 
+    Organization getByName(@Param("name") String name,@Param("tenantId") Integer tenantId);
+
     /**
      * 根据父级id查询子级列表
      * @param parentId

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

@@ -160,4 +160,6 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
      * @return
      */
     int countWaitCreateHomeworkNum1(Integer teacherId);
+    
+    List<TeacherServeDto> queryTeacherPerformanceIndicator(Map<String, Object> params);
 }

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

@@ -57,7 +57,7 @@ public interface StudentGoodsSellDao extends BaseDAO<Integer, StudentGoodsSell>
      * @param autoAffirmReceiveTime:
      * @return java.util.List<java.lang.String>
      */
-    String queryNoAffirmOrderNo(String autoAffirmReceiveTime);
+    String queryNoAffirmOrderNo(@Param("autoAffirmReceiveTime") String autoAffirmReceiveTime);
 
     /**
      * @describe 自动确认收货

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantOrderRecordDao.java

@@ -1,10 +1,14 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ym.mec.biz.dal.dto.TenantOrderRecordDto;
 import com.ym.mec.biz.dal.entity.TenantOrderRecord;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 机构付款记录表(TenantOrderRecord)表数据库访问层
@@ -16,5 +20,7 @@ public interface TenantOrderRecordDao extends BaseMapper<TenantOrderRecord> {
 
     int insertBatch(@Param("entities") List<TenantOrderRecord> entities);
 
+    <T> IPage<T> queryPage(Page<T> page, @Param("param") TenantOrderRecordDto dto);
+
 }
 

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/DegreeRegistrationActivityDto.java

@@ -15,6 +15,8 @@ public class DegreeRegistrationActivityDto extends DegreeRegistration {
     private Map<CourseSchedule.CourseScheduleType, Integer> additionCourseInfo;
 
     private BigDecimal price;
+    
+    private boolean isUseBalance;
 
     public Map<CourseSchedule.CourseScheduleType, Integer> getAdditionCourseInfo() {
         return additionCourseInfo;
@@ -31,4 +33,12 @@ public class DegreeRegistrationActivityDto extends DegreeRegistration {
     public void setPrice(BigDecimal price) {
         this.price = price;
     }
+
+	public boolean isUseBalance() {
+		return isUseBalance;
+	}
+
+	public void setIsUseBalance(boolean isUseBalance) {
+		this.isUseBalance = isUseBalance;
+	}
 }

+ 33 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantInfoDto.java

@@ -69,6 +69,9 @@ public class TenantInfoDto implements Serializable {
     @ApiModelProperty(value = "机构logo")
     private String logo;
 
+    @ApiModelProperty(value = "城市id-sys_area")
+    private Integer areaId;
+
     /**
      * 客服电话
      */
@@ -106,6 +109,12 @@ public class TenantInfoDto implements Serializable {
     @ApiModelProperty(value = "机构配置参数")
     private TenantConfigDto config;
 
+    @ApiModelProperty(value = "购买的服务名称")
+    private String platformServeName;
+
+    @ApiModelProperty(value = "人数上线")
+    private Integer studentUpLimit;
+
     public Integer getId() {
         return id;
     }
@@ -162,6 +171,14 @@ public class TenantInfoDto implements Serializable {
         this.logo = logo;
     }
 
+    public Integer getAreaId() {
+        return areaId;
+    }
+
+    public void setAreaId(Integer areaId) {
+        this.areaId = areaId;
+    }
+
     public String getCustomerServicePhone() {
         return customerServicePhone;
     }
@@ -225,4 +242,20 @@ public class TenantInfoDto implements Serializable {
     public void setTsignName(String tsignName) {
         this.tsignName = tsignName;
     }
+
+    public String getPlatformServeName() {
+        return platformServeName;
+    }
+
+    public void setPlatformServeName(String platformServeName) {
+        this.platformServeName = platformServeName;
+    }
+
+    public Integer getStudentUpLimit() {
+        return studentUpLimit;
+    }
+
+    public void setStudentUpLimit(Integer studentUpLimit) {
+        this.studentUpLimit = studentUpLimit;
+    }
 }

+ 15 - 5
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantOrderRecordDto.java

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * 机构付款记录表(TenantOrderRecord)表实体类
@@ -18,9 +19,8 @@ public class TenantOrderRecordDto implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @TableField("tenant_id_")
-    @ApiModelProperty(value = "机构产品设置表id")
-    private Integer tenantId;
+    @ApiModelProperty(value = "机构产品设置表id,多个id用逗号分割")
+    private String tenantId;
 
     @TableField("order_no_")
     @ApiModelProperty(value = "订单流水")
@@ -56,11 +56,13 @@ public class TenantOrderRecordDto implements Serializable {
     @ApiModelProperty(value = "关键字")
     private String search;
 
-    public Integer getTenantId() {
+    private List<String> tenantIdList;
+
+    public String getTenantId() {
         return tenantId;
     }
 
-    public void setTenantId(Integer tenantId) {
+    public void setTenantId(String tenantId) {
         this.tenantId = tenantId;
     }
 
@@ -135,5 +137,13 @@ public class TenantOrderRecordDto implements Serializable {
     public void setSearch(String search) {
         this.search = search;
     }
+
+    public List<String> getTenantIdList() {
+        return tenantIdList;
+    }
+
+    public void setTenantIdList(List<String> tenantIdList) {
+        this.tenantIdList = tenantIdList;
+    }
 }
 

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

@@ -41,6 +41,8 @@ public class DegreeRegistration {
      */
     @ApiModelProperty(value = "性别",required = true)
     private String gender;
+    
+	private String certificateType;
 
     /**
      * 身份证号
@@ -361,4 +363,12 @@ public class DegreeRegistration {
     public void setOrganId(Integer organId) {
         this.organId = organId;
     }
+
+	public String getCertificateType() {
+		return certificateType;
+	}
+
+	public void setCertificateType(String certificateType) {
+		this.certificateType = certificateType;
+	}
 }

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

@@ -82,6 +82,9 @@ public class Organization {
 	@ApiModelProperty(value = "衔接老师",required = false)
 	private String joinTeacherName;
 
+	@ApiModelProperty(value = "机构id",required = false)
+    private Integer tenantId;
+
 	public String getJoinTeacherId() {
 		return joinTeacherId;
 	}
@@ -254,4 +257,12 @@ public class Organization {
 	public void setGradeType(GradeTypeEnum gradeType) {
 		this.gradeType = gradeType;
 	}
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
 }

+ 21 - 35
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/PlatformServe.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -8,58 +9,43 @@ import java.io.Serializable;
 import java.util.Date;
 
 /**
- * platform_product
- * @author 
+ * 服务管理(PlatformServe)表实体类
+ *
+ * @author hgw
+ * @since 2021-12-21 15:53:21
  */
-@ApiModel(value="产品管理")
+@ApiModel(value = "platform_serve-服务管理")
 public class PlatformServe implements Serializable {
-    /**
-     * 主键
-     */
-    @ApiModelProperty(value="主键")
     @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
     private Integer id;
 
-    /**
-     * 服务名称
-     */
-    @ApiModelProperty(value="服务名称")
+    @TableField("name_")
+    @ApiModelProperty(value = "服务名称")
     private String name;
 
-    /**
-     * 产品id多个用逗号分割
-     */
-    @ApiModelProperty(value="产品id多个用逗号分割")
+    @TableField("product_id_")
+    @ApiModelProperty(value = "产品id多个用逗号分割")
     private String productId;
 
-    /**
-     * 是否删除0未删除 1删除
-     */
-    @ApiModelProperty(value="是否删除0未删除 1删除")
+    @TableField("deleted_")
+    @ApiModelProperty(value = "是否删除0未删除 1删除")
     private Integer deleted;
 
-    /**
-     * 创建人
-     */
-    @ApiModelProperty(value="创建人")
+    @TableField("created_by_")
+    @ApiModelProperty(value = "创建人")
     private Integer createdBy;
 
-    /**
-     * 创建时间
-     */
-    @ApiModelProperty(value="创建时间")
+    @TableField("created_time_")
+    @ApiModelProperty(value = "创建时间")
     private Date createdTime;
 
-    /**
-     * 更新人
-     */
-    @ApiModelProperty(value="更新人")
+    @TableField("updated_by_")
+    @ApiModelProperty(value = "更新人")
     private Integer updatedBy;
 
-    /**
-     * 更新时间
-     */
-    @ApiModelProperty(value="更新时间")
+    @TableField("updated_time_")
+    @ApiModelProperty(value = "更新时间")
     private Date updatedTime;
 
     private static final long serialVersionUID = 1L;

+ 15 - 23
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/PlatformServeDetail.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -8,40 +9,31 @@ import java.io.Serializable;
 import java.math.BigDecimal;
 
 /**
- * platform_serve_detail
- * @author 
+ * 服务管理明细(PlatformServeDetail)表实体类
+ *
+ * @author hgw
+ * @since 2021-12-21 15:57:33
  */
-@ApiModel(value="服务管理明细")
+@ApiModel(value = "platform_serve_detail-服务管理明细")
 public class PlatformServeDetail implements Serializable {
-    /**
-     * 主键
-     */
-    @ApiModelProperty(value="主键")
     @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
     private Integer id;
 
-    /**
-     * 服务管理表id
-     */
-    @ApiModelProperty(value="服务管理表id")
+    @TableField("serve_id_")
+    @ApiModelProperty(value = "服务管理表id")
     private Integer serveId;
 
-    /**
-     * 付费模式 月/年
-     */
-    @ApiModelProperty(value="付费模式 月/年")
+    @TableField("mode_")
+    @ApiModelProperty(value = "付费模式 月/年")
     private String mode;
 
-    /**
-     * 学员上限
-     */
-    @ApiModelProperty(value="学员上限")
+    @TableField("student_up_limit_")
+    @ApiModelProperty(value = "学员上限")
     private Integer studentUpLimit;
 
-    /**
-     * 服务原价
-     */
-    @ApiModelProperty(value="服务原价")
+    @TableField("original_price_")
+    @ApiModelProperty(value = "服务原价")
     private BigDecimal originalPrice;
 
     private static final long serialVersionUID = 1L;

+ 32 - 19
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantInfo.java

@@ -11,10 +11,11 @@ import java.io.Serializable;
 import java.util.Date;
 
 /**
- * 机构信息表
- * 对应数据库表(tenant_info):
+ * 机构表(TenantInfo)表实体类
+ *
+ * @author hgw
  */
-@ApiModel(value = "TenantInfo机构表")
+@ApiModel(value = "tenant_info-机构表")
 public class TenantInfo implements Serializable {
     @TableId(value = "id_", type = IdType.AUTO)
     @ApiModelProperty(value = "机构id")
@@ -60,6 +61,10 @@ public class TenantInfo implements Serializable {
     @ApiModelProperty(value = "营业执照对应公司名称")
     private String tsignName;
 
+    @TableField("area_id_")
+    @ApiModelProperty(value = "城市id")
+    private Integer areaId;
+
     @TableField("domain_name_")
     @ApiModelProperty(value = "域名")
     private String domainName;
@@ -166,6 +171,30 @@ public class TenantInfo implements Serializable {
         this.remark = remark;
     }
 
+    public String getTsignCode() {
+        return tsignCode;
+    }
+
+    public void setTsignCode(String tsignCode) {
+        this.tsignCode = tsignCode;
+    }
+
+    public String getTsignName() {
+        return tsignName;
+    }
+
+    public void setTsignName(String tsignName) {
+        this.tsignName = tsignName;
+    }
+
+    public Integer getAreaId() {
+        return areaId;
+    }
+
+    public void setAreaId(Integer areaId) {
+        this.areaId = areaId;
+    }
+
     public String getDomainName() {
         return domainName;
     }
@@ -230,22 +259,6 @@ public class TenantInfo implements Serializable {
         this.updatedTime = updatedTime;
     }
 
-    public String getTsignCode() {
-        return tsignCode;
-    }
-
-    public void setTsignCode(String tsignCode) {
-        this.tsignCode = tsignCode;
-    }
-
-    public String getTsignName() {
-        return tsignName;
-    }
-
-    public void setTsignName(String tsignName) {
-        this.tsignName = tsignName;
-    }
-
     @Override
     public String toString() {
         return ToStringBuilder.reflectionToString(this);

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

@@ -57,7 +57,7 @@ public class TenantOrderRecord implements Serializable {
     private BigDecimal actualAmount;
 
     @TableField("order_state_")
-    @ApiModelProperty(value = "订单状态/0待支付、1已支付")
+    @ApiModelProperty(value = "订单状态/0待支付、1已支付、2支付失败")
     private Integer orderState;
 
     @JsonFormat(pattern = "yyyy-MM-dd")

+ 174 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TenantOrderRecordVo.java

@@ -0,0 +1,174 @@
+package com.ym.mec.biz.dal.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author hgw
+ * Created by 2021-12-21
+ */
+public class TenantOrderRecordVo implements Serializable {
+
+    @ApiModelProperty(value = "机构名称")
+    private String tenantName;
+
+    @TableField("tenant_id_")
+    @ApiModelProperty(value = "机构产品设置表id")
+    private Integer tenantId;
+
+    @TableField("order_no_")
+    @ApiModelProperty(value = "订单编号(付款前生成订单时生成的编号)")
+    private String orderNo;
+
+    @TableField("trans_no_")
+    @ApiModelProperty(value = "支付编号(付款后第三方支付给予的)")
+    private String transNo;
+
+    @TableField("order_type_")
+    @ApiModelProperty(value = "订单类型/机构开通缴费、续费、充值、激活团练宝")
+    private String orderType;
+
+    @TableField("payment_channel_")
+    @ApiModelProperty(value = "付款渠道/惠支付、双乾")
+    private String paymentChannel;
+
+    @TableField("pay_channel_")
+    @ApiModelProperty(value = "付款渠道/微信、支付宝、等")
+    private String payChannel;
+
+    @TableField("expect_amount")
+    @ApiModelProperty(value = "应付金额")
+    private BigDecimal expectAmount;
+
+    @TableField("actual_amount")
+    @ApiModelProperty(value = "实付金额")
+    private BigDecimal actualAmount;
+
+    @TableField("order_state_")
+    @ApiModelProperty(value = "订单状态/0待支付、1已支付、2支付失败")
+    private Integer orderState;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField("pay_date_")
+    @ApiModelProperty(value = "支付日期")
+    private Date payDate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField("pay_time_")
+    @ApiModelProperty(value = "支付时间")
+    private Date payTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField("created_time_")
+    @ApiModelProperty(value = "订单创建时间")
+    private Date createdTime;
+
+    public String getTenantName() {
+        return tenantName;
+    }
+
+    public void setTenantName(String tenantName) {
+        this.tenantName = tenantName;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getTransNo() {
+        return transNo;
+    }
+
+    public void setTransNo(String transNo) {
+        this.transNo = transNo;
+    }
+
+    public String getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(String orderType) {
+        this.orderType = orderType;
+    }
+
+    public String getPaymentChannel() {
+        return paymentChannel;
+    }
+
+    public void setPaymentChannel(String paymentChannel) {
+        this.paymentChannel = paymentChannel;
+    }
+
+    public String getPayChannel() {
+        return payChannel;
+    }
+
+    public void setPayChannel(String payChannel) {
+        this.payChannel = payChannel;
+    }
+
+    public BigDecimal getExpectAmount() {
+        return expectAmount;
+    }
+
+    public void setExpectAmount(BigDecimal expectAmount) {
+        this.expectAmount = expectAmount;
+    }
+
+    public BigDecimal getActualAmount() {
+        return actualAmount;
+    }
+
+    public void setActualAmount(BigDecimal actualAmount) {
+        this.actualAmount = actualAmount;
+    }
+
+    public Integer getOrderState() {
+        return orderState;
+    }
+
+    public void setOrderState(Integer orderState) {
+        this.orderState = orderState;
+    }
+
+    public Date getPayDate() {
+        return payDate;
+    }
+
+    public void setPayDate(Date payDate) {
+        this.payDate = payDate;
+    }
+
+    public Date getPayTime() {
+        return payTime;
+    }
+
+    public void setPayTime(Date payTime) {
+        this.payTime = payTime;
+    }
+
+    public Date getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+    }
+}

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

@@ -1,4 +1,7 @@
 package com.ym.mec.biz.service;
 
-public interface PlatformServeDetailService {
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.entity.PlatformServeDetail;
+
+public interface PlatformServeDetailService extends IService<PlatformServeDetail> {
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentExtracurricularExercisesSituationService.java

@@ -64,4 +64,11 @@ public interface StudentExtracurricularExercisesSituationService extends BaseSer
      * @return
      */
     int countWaitCreateHomeworkNum();
+    
+    /**
+     * 根据条件查询老师的服务指标
+     * @param queryInfo
+     * @return
+     */
+    List<TeacherServeDto> queryTeacherPerformanceIndicator(TeacherServeQueryInfo queryInfo);
 }

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantInfoService.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.dto.TenantInfoDto;
 import com.ym.mec.biz.dal.entity.TenantInfo;
 import com.ym.mec.biz.dal.vo.TenantInfoInfoPageVo;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.thirdparty.yqpay.Msg;
 
 import java.util.Map;
 
@@ -21,4 +22,9 @@ public interface TenantInfoService extends IService<TenantInfo> {
     PageInfo<TenantInfoInfoPageVo> queryPage(Map<String, Object> param);
 
     TenantInfo get(Integer tenantId);
+
+    Map<String, Object> pay(Integer tenantId) throws Exception;
+
+    Msg orderNotify(Msg msg);
+
 }

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

@@ -2802,7 +2802,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if(StringUtils.isEmpty(configValue)){
             throw new BizException("请配置会员团每学期赠送课程分钟数");
         }
-        Integer giveCourseTime = Integer.parseInt(configValue);
+        Integer giveCourseTime = Integer.parseInt(configValue)>>1;
 
         Boolean confirmGenerate = false;
         if (Objects.nonNull(classGroup4MixDtos.get(0).getConfirmGenerate())) {

+ 17 - 13
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -23,6 +23,7 @@ import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.codehaus.jackson.map.util.BeanUtil;
@@ -241,7 +242,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			attendanceRange = Integer.parseInt(gpsRange);
 		}
 		currentCourseDetail.setAttendanceRange(attendanceRange);
-        currentCourseDetail.setAdvanceSignOutMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_OUT_MINUTES)));
+		String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.ADVANCE_SIGN_OUT_MINUTES, user.getTenantId());
+		if(StringUtils.isEmpty(configValue)){
+			configValue = "360";
+		}
+		currentCourseDetail.setAdvanceSignOutMinutes(Integer.parseInt(configValue));
 		CourseSchedule courseSchedule = courseScheduleDao.get(courseID);
 		//获取课程规划
 		MusicGroupTrainPlanSaveDto schoolTerm = musicGroupTrainPlanService.getSchoolTerm(courseSchedule);
@@ -4940,18 +4945,17 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         PageInfo<CourseScheduleEndDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>(16);
         MapUtil.populateMap(params, queryInfo);
+		Integer tenantId = TenantContextHolder.getTenantId();
+		if("COURSE_TIME_ERROR".equals(queryInfo.getSearchType())){
+			String courseStartTimeError = sysTenantConfigService.getTenantConfigValue(SysConfigService.COURSE_START_TIME_ERROR, tenantId);
+			String courseEndTimeError = sysTenantConfigService.getTenantConfigValue(SysConfigService.COURSE_END_TIME_ERROR, tenantId);
+			if(StringUtils.isEmpty(courseStartTimeError) || StringUtils.isEmpty(courseEndTimeError)){
+				return pageInfo;
+			}
+			params.put("courseStartTimeError",courseStartTimeError);
+			params.put("courseEndTimeError",courseEndTimeError);
+		}
 
-//        List<CourseScheduleEndDto> results;
-//		SysUser sysUser = sysUserFeignService.queryUserInfo();
-//		List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
-		//如果当前用户只有教务老师角色,那么只能看到他所管理的课程组的信息
-//		if (!sysUser.getIsSuperAdmin() && userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
-//			List<Long> classGroupIds = classGroupDao.queryGroupClassGroupIds(sysUser.getId());
-//			if(classGroupIds.size() == 0){
-//				return pageInfo;
-//			}
-//			params.put("classGroupIds",classGroupIds);
-//		}
         int count = courseScheduleDao.endCountCourseSchedules(params);
         if(queryInfo.getIsExport() && count > 50000){
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
@@ -4964,7 +4968,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             List<Integer> teacherIds=results.stream().filter(t->Objects.nonNull(t.getActualTeacherId())).map(CourseSchedule::getActualTeacherId).collect(Collectors.toList());
 
             List<Map<Integer, String>> nameIdMaps = teacherDao.queryNameByIdList(teacherIds);
-            Map<Integer, String> nameIdMap=MapUtil.convertIntegerMap(nameIdMaps);
+            Map<Integer, String> nameIdMap = MapUtil.convertIntegerMap(nameIdMaps);
 
 			List<Map<Long, Long>> courseMergeCourseNum = courseScheduleDao.countCourseMergeCourseNum(courseScheduleIds);
 			Map<Long, Long> courseMergeCourseNumMap = new HashMap<>();

+ 28 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java

@@ -15,6 +15,7 @@ import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.util.date.DateUtil;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
@@ -29,6 +30,7 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
+
 import org.springframework.util.CollectionUtils;
 
 @Service
@@ -268,10 +270,11 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
         if(amount.compareTo(degreeRegistration.getPrice())!=0){
             throw new BizException("商品价格不符");
         }
+        
+        Integer userId = degreeRegistration.getUserId();
 
         OrderTypeEnum type = OrderTypeEnum.DEGREE_REGISTRATION;
 
-        Integer userId = degreeRegistration.getUserId();
         String channelType = "";
         StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
         studentPaymentOrder.setUserId(userId);
@@ -279,7 +282,30 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
         studentPaymentOrder.setOrderNo(orderNo);
         studentPaymentOrder.setType(type);
         studentPaymentOrder.setExpectAmount(amount);
-        studentPaymentOrder.setActualAmount(amount);
+        
+        if(degreeRegistration.isUseBalance()){
+        	SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId);
+            if (userCashAccount == null) {
+                throw new BizException("用户账户找不到");
+            }
+            BigDecimal deductBalance = BigDecimal.ZERO;
+            if (userCashAccount.getBalance().subtract(amount).doubleValue() >= 0) {
+                // 更新订单信息
+                studentPaymentOrder.setActualAmount(BigDecimal.ZERO);
+                studentPaymentOrder.setBalancePaymentAmount(amount);
+                deductBalance = amount;
+                studentPaymentOrder.setPaymentChannel("BALANCE");
+            } else {
+                studentPaymentOrder.setActualAmount(amount.subtract(userCashAccount.getBalance()));
+                studentPaymentOrder.setBalancePaymentAmount(userCashAccount.getBalance());
+                deductBalance = userCashAccount.getBalance();
+            }
+            amount = amount.subtract(deductBalance);
+            sysUserCashAccountService.updateBalance(userId, deductBalance.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "考级报名");
+        }else{
+            studentPaymentOrder.setActualAmount(amount);
+            studentPaymentOrder.setBalancePaymentAmount(BigDecimal.ZERO);
+        }
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setClassGroupId(degreeRegistration.getId());
         if(Objects.nonNull(degreeRegistration.getSporadicId())){

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

@@ -12,6 +12,7 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.redis.service.RedisCache;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
@@ -332,7 +333,13 @@ public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl
 		int week = DateUtil.date2Week1(startCourseDate);
 		int weekSize = DateUtil.getWeekDays(startCourseDate, courseDetail.getEndSchoolTerm(), week).size();
 		int i = weekSize * 4 * 45;
-		courseDetail.setTotalCourseTime(i > 3960?3960:i);
+		Integer tenantId = TenantContextHolder.getTenantId();
+		String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.MEMBER_GROUP_TERM_GIVE_COURSE_TIME,tenantId);
+		if(StringUtils.isEmpty(configValue)){
+			throw new BizException("请配置会员团每学期赠送课程分钟数");
+		}
+		Integer giveCourseTime = Integer.parseInt(configValue);
+		courseDetail.setTotalCourseTime(i > giveCourseTime?giveCourseTime:i);
 		courseDetail.setStartCourseDate(startCourseDate);
 		return courseDetail;
 	}

+ 3 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java

@@ -120,6 +120,7 @@ public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, M
         if(StringUtils.isEmpty(configValue)){
             throw new BizException("请配置会员团每学期赠送课程分钟数");
         }
+        Integer giveCourseTime = Integer.parseInt(configValue)>>1;
 
         //课程形态
         Map<String, Object> courseForm = JSON.parseObject(musicGroup.getCourseForm(), Map.class);
@@ -182,12 +183,12 @@ public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, M
 			OrganizationCourseUnitPriceSettings singleUnitPriceSettings = organizationCourseUnitPriceSettingsService.queryByOrganIdAndCourseTypeAndChargeType(musicGroup.getOrganId(), CourseScheduleType.SINGLE, musicGroup.getChargeTypeId());
 			if (singleUnitPriceSettings != null) {
 				memberCoursePrice.put(CourseScheduleType.SINGLE.name(),
-						singleUnitPriceSettings.getUnitPrice().multiply(new BigDecimal(configValue)).setScale(0, BigDecimal.ROUND_HALF_UP));
+						singleUnitPriceSettings.getUnitPrice().multiply(new BigDecimal(giveCourseTime)).setScale(0, BigDecimal.ROUND_HALF_UP));
 			}
 			OrganizationCourseUnitPriceSettings mixUnitPriceSettings = organizationCourseUnitPriceSettingsService.queryByOrganIdAndCourseTypeAndChargeType(musicGroup.getOrganId(), CourseScheduleType.MIX, musicGroup.getChargeTypeId());
 			if (mixUnitPriceSettings != null) {
 				memberCoursePrice.put(CourseScheduleType.MIX.name(),
-						mixUnitPriceSettings.getUnitPrice().multiply(new BigDecimal(configValue)).setScale(0, BigDecimal.ROUND_HALF_UP));
+						mixUnitPriceSettings.getUnitPrice().multiply(new BigDecimal(giveCourseTime)).setScale(0, BigDecimal.ROUND_HALF_UP));
 			}
 			
 			musicGroupSubjectGoodsAndInfo.setMemberCoursePrice(memberCoursePrice);

+ 33 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java

@@ -22,6 +22,7 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -546,4 +547,36 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 		}
 		return studentExtracurricularExercisesSituationDao.countWaitCreateHomeworkNum1(sysUser.getId());
 	}
+
+	@Override
+	public List<TeacherServeDto> queryTeacherPerformanceIndicator(TeacherServeQueryInfo queryInfo) {
+		if(StringUtils.isNotBlank(queryInfo.getOrganId())){
+			List<Integer> organIds = Arrays.stream(queryInfo.getOrganId().split(",")).map(e -> Integer.valueOf(e)).collect(Collectors.toList());
+			queryInfo.setOrganIds(organIds);
+		}
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<TeacherServeDto> dataList = null;
+		dataList = studentExtracurricularExercisesSituationDao.queryTeacherPerformanceIndicator(params);
+		List<Integer> teacherIds = dataList.stream().map(TeacherServeDto::getTeacherId).collect(Collectors.toList());
+		List<StudentExtracurricularExercisesSituation> teacherServeWithDate = studentExtracurricularExercisesSituationDao.findTeacherServeWithDate(queryInfo.getMonday(), queryInfo.getSunday(), teacherIds, null);
+		Map<Integer, List<StudentExtracurricularExercisesSituation>> teacherServeMap = teacherServeWithDate.stream().collect(Collectors.groupingBy(StudentExtracurricularExercisesSituation::getTeacherId));
+		for (TeacherServeDto teacherServeDto : dataList) {
+			List<StudentExtracurricularExercisesSituation> tss = teacherServeMap.get(teacherServeDto.getTeacherId());
+			Set<Long> courseIds = new HashSet<>();
+			for (StudentExtracurricularExercisesSituation ts : tss) {
+				if(teacherServeDto.getMonday().compareTo(ts.getMonday())!=0){
+					continue;
+				}
+				if(StringUtils.isBlank(ts.getCourseIds())){
+					continue;
+				}
+				Set<Long> ids = Arrays.stream(ts.getCourseIds().split(",")).map(s -> Long.valueOf(s)).collect(Collectors.toSet());
+				courseIds.addAll(ids);
+			}
+			teacherServeDto.setHomeworkNum(courseIds.size());
+		}
+		return dataList;
+	}
 }

+ 15 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentGoodsSellServiceImpl.java

@@ -16,6 +16,7 @@ import com.ym.mec.biz.service.TenantInfoService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -60,10 +61,13 @@ public class StudentGoodsSellServiceImpl extends BaseServiceImpl<Integer, Studen
             pageInfo.setTotal(count);
             params.put("offset", pageInfo.getOffset());
             dataList = studentGoodsSellDao.queryStudentGoodsOrders(params);
-            Integer autoAffirmReceiveTime = Integer.parseInt(sysConfigDao.findConfigValue("auto_affirm_receive_time"));
-            dataList.forEach(e -> {
-                e.setAutoAffirmReceiveTime(autoAffirmReceiveTime);
-            });
+            Integer tenantId = TenantContextHolder.getTenantId();
+            String autoAffirmReceiveTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.AUTO_AFFIRM_RECEIVE_TIME,tenantId);
+            if(StringUtils.isNotEmpty(autoAffirmReceiveTime)){
+                dataList.forEach(e -> {
+                    e.setAutoAffirmReceiveTime(Integer.parseInt(autoAffirmReceiveTime));
+                });
+            }
         }
         if (count == 0) {
             dataList = new ArrayList<>();
@@ -111,10 +115,13 @@ public class StudentGoodsSellServiceImpl extends BaseServiceImpl<Integer, Studen
             pageInfo.setTotal(count);
             params.put("offset", pageInfo.getOffset());
             dataList = studentGoodsSellDao.queryStudentPaymentOrders(params);
-            Integer autoAffirmReceiveTime = Integer.parseInt(sysConfigDao.findConfigValue("auto_affirm_receive_time"));
-            dataList.forEach(e -> {
-                e.setAutoAffirmReceiveTime(autoAffirmReceiveTime);
-            });
+            Integer tenantId = TenantContextHolder.getTenantId();
+            String autoAffirmReceiveTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.AUTO_AFFIRM_RECEIVE_TIME,tenantId);
+            if(StringUtils.isNotEmpty(autoAffirmReceiveTime)){
+                dataList.forEach(e -> {
+                    e.setAutoAffirmReceiveTime(Integer.parseInt(autoAffirmReceiveTime));
+                });
+            }
         }
         if (count == 0) {
             dataList = new ArrayList<>();

+ 11 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -11,15 +11,13 @@ import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.*;
-import com.ym.mec.biz.service.CloudTeacherOrderService;
-import com.ym.mec.biz.service.StudentManageService;
-import com.ym.mec.biz.service.StudentService;
-import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImResult;
 import com.ym.mec.common.entity.ImUserModel;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
@@ -104,6 +102,8 @@ public class StudentManageServiceImpl implements StudentManageService {
     private OrganizationDegreeCourseFeeDao organizationDegreeCourseFeeDao;
     @Autowired
     private ActivityUserMapperDao activityUserMapperDao;
+    @Autowired
+    private SysTenantConfigService sysTenantConfigService;
 
     @Override
     public PageInfo<StudentManageListDto> findStudentsByOrganId(StudentManageQueryInfo queryInfo) {
@@ -912,6 +912,12 @@ public class StudentManageServiceImpl implements StudentManageService {
         //学员请假异常提醒(获取前两个月的)
         Date date = new Date();
         PageInfo<StudentErrorLeaveDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+
+        Integer tenantId = TenantContextHolder.getTenantId();
+        String studentErrorLeaveNum = sysTenantConfigService.getTenantConfigValue(SysConfigService.STUDENT_ERROR_LEAVE_NUM, tenantId);
+        if(StringUtils.isEmpty(studentErrorLeaveNum)){
+            return pageInfo;
+        }
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
         params.put("offset", pageInfo.getOffset());
@@ -927,6 +933,7 @@ public class StudentManageServiceImpl implements StudentManageService {
             List<Long> classGroupIds = classGroupDao.queryGroupClassGroupIds(sysUser.getId());
             params.put("classGroupIds", classGroupIds);
         }
+        params.put("studentErrorLeaveNum",studentErrorLeaveNum);
         int count = indexBaseMonthDataDao.countStudentErrorLeave1(params);
         List<StudentErrorLeaveDto> dataList = new ArrayList<>();
         if (count > 0) {

+ 11 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -125,8 +125,11 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			advanceSignMinutes = Integer.parseInt(tenantConfigValue);
 		}
 
-		int advanceSignOutMinutes = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_OUT_MINUTES));
-		int offlineSignInEarlyForwardTime = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.OFFLINE_SIGN_IN_EARLY_FORWARD_TIME));
+//		int advanceSignOutMinutes = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_OUT_MINUTES));
+		String offlineSignInEarlyForwardTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.OFFLINE_SIGN_IN_EARLY_FORWARD_TIME, user.getTenantId());
+		if(StringUtils.isEmpty(offlineSignInEarlyForwardTime)){
+			offlineSignInEarlyForwardTime = "60";
+		}
 
 		CourseSchedule courseSchedule = courseScheduleDao.get(teacherAttendance.getCourseScheduleId());
 		teacherAttendance.setGroupType(courseSchedule.getGroupType());
@@ -148,8 +151,12 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		//上课时间
 		Date classStartDateTime = DateUtil.stringToDate(classDate + " " + startClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 		Date classEndDateTime = DateUtil.stringToDate(classDate + " " + endClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-		Date classEndDateAdd60Minutes = DateUtil.addMinutes(classEndDateTime, advanceSignOutMinutes);
-		Date add60Minutes = DateUtil.addMinutes(classStartDateTime, offlineSignInEarlyForwardTime * -1);
+		String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.ADVANCE_SIGN_OUT_MINUTES, user.getTenantId());
+		if(StringUtils.isEmpty(configValue)){
+			configValue = "360";
+		}
+		Date classEndDateAdd60Minutes = DateUtil.addMinutes(classEndDateTime, Integer.parseInt(configValue));
+		Date add60Minutes = DateUtil.addMinutes(classStartDateTime, Integer.parseInt(offlineSignInEarlyForwardTime) * -1);
 		Date add20Minutes = DateUtil.addMinutes(classStartDateTime, advanceSignMinutes * -1);
 		if(teacherAttendance.getSignInTime() == null && teacherSignOutDto.getTeacherAttendanceInfo().getStatus().equals(SignStatusEnum.SIGN_IN.getCode())){
 

+ 138 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -7,26 +8,34 @@ import com.google.common.collect.Lists;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysRole;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dao.TenantInfoDao;
 import com.ym.mec.biz.dal.dto.TenantConfigDto;
 import com.ym.mec.biz.dal.dto.TenantInfoDto;
 import com.ym.mec.biz.dal.dto.TenantProductInfoDto;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.JobNatureEnum;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.vo.TenantInfoInfoPageVo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
+import com.ym.mec.common.service.IdGeneratorService;
+import com.ym.mec.thirdparty.yqpay.Msg;
 import org.apache.commons.collections.CollectionUtils;
 import org.joda.time.LocalDate;
+import org.joda.time.LocalDateTime;
 import org.redisson.api.RBucket;
 import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
@@ -34,6 +43,7 @@ import java.util.stream.Collectors;
 
 @Service
 public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo> implements TenantInfoService {
+    private static final Logger log = LoggerFactory.getLogger(TenantInfoServiceImpl.class);
 
     @Autowired
     private SysUserFeignService sysUserFeignService;
@@ -44,11 +54,25 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
     @Autowired
     private PlatformProductService platformProductService;
     @Autowired
+    private PlatformServeService platformServeService;
+    @Autowired
+    private PlatformServeDetailService platformServeDetailService;
+    @Autowired
     private TenantConfigService tenantConfigService;
     @Autowired
     private RedissonClient redissonClient;
     @Autowired
     private SysUserTsignService sysUserTsignService;
+    @Autowired
+    private OrganizationDao organizationDao;
+    @Autowired
+    private PayService payService;
+    @Autowired
+    private IdGeneratorService idGenerator;
+    @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
+    private TenantOrderRecordService tenantOrderRecordService;
 
     /**
      * 新增机构
@@ -78,6 +102,20 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
                 tenantProductInfoService::addTenantProduct);
         //添加机构配置
         setIdByApply(tenantId, dto.getConfig(), dto.getConfig()::setTenantId, tenantConfigService::addConfig);
+        //创建一个和机构同名称的“分部”
+        createOrg(tenantInfo,dto.getAreaId());
+    }
+
+    //创建一个和机构同名称的“分部”
+    private void createOrg(TenantInfo tenantInfo,Integer areaId) {
+        Organization organization = new Organization();
+        organization.setName(tenantInfo.getName());
+        organization.setDelFlag(YesOrNoEnum.NO);
+        organization.setGradeType(GradeTypeEnum.SIX_PLUS);
+        organization.setCreateTime(new Date());
+        organization.setTenantId(tenantInfo.getId());
+        organization.setAreaId(areaId);
+        organizationDao.insert(organization);
     }
 
     /**
@@ -147,6 +185,18 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         TenantConfig tenantConfig = tenantConfigService.getOne(new QueryWrapper<TenantConfig>()
                 .eq("tenant_id_", tenantId));
         setTenantInfo(tenantConfig, new TenantConfigDto(), tenantInfoDto::setConfig);
+        //获取服务信息
+        PlatformServe platformServe = platformServeService.getOne(new QueryWrapper<PlatformServe>()
+                .eq("id_", productInfo.getServeId()));
+        Optional.ofNullable(platformServe)
+                .map(PlatformServe::getName)
+                .ifPresent(tenantInfoDto::setPlatformServeName);
+        //获取服务详情
+        PlatformServeDetail serveDetail = platformServeDetailService.getOne(new QueryWrapper<PlatformServeDetail>()
+                .eq("id_", productInfo.getServeDetailId()));
+        Optional.ofNullable(serveDetail)
+                .map(PlatformServeDetail::getStudentUpLimit)
+                .ifPresent(tenantInfoDto::setStudentUpLimit);
         return tenantInfoDto;
     }
 
@@ -283,10 +333,96 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
     /**
      * 机构缴费
      */
-    public void pay(){
+    public Map<String, Object> pay(Integer tenantId) throws Exception {
+        TenantInfo tenantInfo = Optional.ofNullable(tenantId)
+                .map(baseMapper::selectById)
+                .orElseThrow(() -> new BizException("未查询到机构信息!"));
+        //机构产品信息
+        TenantProductInfo productInfo = tenantProductInfoService.getOne(new QueryWrapper<TenantProductInfo>()
+                .eq("tenant_id_", tenantId));
+        //生成订单编号
+        String orderNo = idGenerator.generatorId("payment") + "";
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+        TenantOrderRecordEnum tenantEnum = TenantOrderRecordEnum.TENANT_OPEN;
+        //获取分部信息
+        Organization organization = organizationDao.getByName(tenantInfo.getName(), tenantId);
+        if (Objects.isNull(organization)) {
+            throw new BizException("未查询到机构分部信息!");
+        }
+        Map<String, Object> payMap = new HashMap<>();
+        int orderState = 0;
+        //消费大于0元则拉起支付
+        if (productInfo.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
+            payMap = payService.getPayMap(
+                    productInfo.getPayAmount(),
+                    BigDecimal.ZERO,
+                    orderNo,
+                    baseApiUrl + "/WEB-SERVER/tenantInfo/notify",
+                    baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
+                    tenantEnum.getMsg(),
+                    tenantEnum.getMsg(),
+                    1,//临时写死
+                    tenantEnum.getCode()
+            );
+        } else {
+            //已支付
+            orderState = 1;
+        }
+        createOrderRecord(tenantId, productInfo.getPayAmount(), orderNo, tenantEnum, orderState);
+        log.info("tenant pay >>>>> " + JSON.toJSONString(payMap));
+        return payMap;
+    }
 
+    //生成订单
+    private void createOrderRecord(Integer tenantId, BigDecimal payAmount, String orderNo, TenantOrderRecordEnum tenantEnum, Integer orderState) {
+        LocalDateTime now = LocalDateTime.now();
+        TenantOrderRecord record = new TenantOrderRecord();
+        record.setTenantId(tenantId);
+        record.setOrderNo(orderNo);
+        record.setOrderType(tenantEnum.getCode());
+        record.setPaymentChannel(PaymentChannelEnum.ADAPAY.getCode());
+        record.setExpectAmount(payAmount);
+        record.setActualAmount(payAmount);
+        record.setOrderState(orderState);
+        record.setPayDate(now.toLocalDate().toDate());
+        record.setPayTime(now.toDate());
+        record.setCreatedTime(now.toDate());
+        tenantOrderRecordService.save(record);
     }
 
+    /**
+     * 支付消息回调
+     *
+     * @param msg
+     * @return
+     */
+    @Override
+    public Msg orderNotify(Msg msg) {
+        log.info("tenant orderNotify >>>>> " + msg.toString());
+        msg.setMsg("fail");
+        Map<String, String> notifyMap = JSON.parseObject(msg.getResponseParameters(), Map.class);
+        TenantOrderRecord record = new TenantOrderRecord();
+        record.setOrderNo(notifyMap.get("merMerOrderNo"));
+        record.setTransNo(notifyMap.get("orderNo"));
+        String channelType = notifyMap.get("channelType").equals("1") ? "WXPay" : (notifyMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
+        record.setPayChannel(channelType);
+        //支付中订单存在,更新状态
+        if (msg.getResponseType().equals("1") && notifyMap.size() > 0 && msg.getCode().equals("88")) {
+            //tradeState 88就是正确的 其他错误的
+//            DealStatusEnum
+//            notifyMap.put("totalMoney", notifyMap.get("payAmount"));
+            record.setOrderState(1);
+            msg.setCode("000000");
+            msg.setMsg("success");
+        } else {
+            //支付失败
+            record.setOrderState(2);
+        }
+        tenantOrderRecordService.update(record, new QueryWrapper<TenantOrderRecord>()
+                .eq("order_no_", record.getOrderNo()));
+        log.info("tenant orderNotify return>>>>> " + msg.toString());
+        return msg;
+    }
 
     /**
      * 校验手机号

+ 9 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantOrderRecordServiceImpl.java

@@ -1,6 +1,5 @@
 package com.ym.mec.biz.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ym.mec.biz.dal.dao.TenantOrderRecordDao;
@@ -10,11 +9,11 @@ import com.ym.mec.biz.service.TenantOrderRecordService;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
 import com.ym.mec.common.page.QueryWrapperUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.Optional;
+
 /**
  * 机构付款记录表(TenantOrderRecord)表服务实现类
  *
@@ -24,21 +23,15 @@ import org.springframework.stereotype.Service;
 @Service("tenantOrderRecordService")
 public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordDao, TenantOrderRecord> implements TenantOrderRecordService {
 
-    private final static Logger logger = LoggerFactory.getLogger(TenantOrderRecordServiceImpl.class);
-
     @Override
     public PageInfo<TenantOrderRecord> queryPage(TenantOrderRecordDto dto) {
         Page<TenantOrderRecord> pageInfo = PageUtil.getPage(dto.getPage(), dto.getRows());
-        QueryWrapper<TenantOrderRecord> queryWrapper = new QueryWrapperUtil<TenantOrderRecord>()
-                .hasEq("order_no_", dto.getOrderNo())
-                .hasEq("tenant_id_", dto.getTenantId())
-                .hasEq("trans_no_", dto.getTransNo())
-                .hasEq("order_type_", dto.getOrderType())
-                .hasEq("order_state_", dto.getOrderState())
-                .queryWrapper()
-                .ge(StringUtils.isNotBlank(dto.getStartDate()), "created_time_", dto.getStartDate())
-                .le(StringUtils.isNotBlank(dto.getEndDate()), "created_time_", dto.getEndDate());
-        return PageUtil.pageInfo(this.page(pageInfo, queryWrapper));
+        pageInfo.setDesc("a.created_time_ ");
+        Optional.ofNullable(dto.getTenantId())
+                .map(QueryWrapperUtil::toList)
+                .filter(CollectionUtils::isNotEmpty)
+                .ifPresent(dto::setTenantIdList);
+        return PageUtil.pageInfo(baseMapper.queryPage(pageInfo, dto));
     }
 
 }

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

@@ -2730,7 +2730,7 @@
             AND (cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_)
         </if>
         <if test="searchType == 'COURSE_TIME_ERROR'">
-            AND cs.status_ = 'NOT_START' AND cs.is_lock_ = 0 AND (cs.start_class_time_ &lt; '06:00:00' OR cs.end_class_time_ > '21:00:00')
+            AND cs.status_ = 'NOT_START' AND cs.is_lock_ = 0 AND (cs.start_class_time_ &lt; #{courseStartTimeError} OR cs.end_class_time_ > #{courseEndTimeError})
             AND (cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_)
         </if>
         <if test="classGroupIds != null and classGroupIds.size() > 0">

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

@@ -28,6 +28,7 @@
         <result column="status_" jdbcType="TINYINT" property="status"/>
         <result column="activity_tag_" property="activityTag"/>
         <result column="degree_type_" property="degreeType"/>
+        <result column="certificate_type_" property="certificateType"/>
     </resultMap>
 
     <select id="get" parameterType="java.lang.Integer" resultMap="DegreeRegistration">
@@ -137,13 +138,13 @@
         idcard_, city_, school_,
         subject_,level_, theory_level_,theory_money_, theory_cert_,mobile_,
         money_, memo_, create_time_,
-        update_time_, status_, activity_tag_,degree_type_)
+        update_time_, status_, activity_tag_,degree_type_,certificate_type_)
         values (#{userId},#{sporadicId,jdbcType=INTEGER},#{organId,jdbcType=INTEGER}, #{orderNo,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{gender,jdbcType=VARCHAR},
         #{idcard,jdbcType=VARCHAR}, #{city,jdbcType=VARCHAR}, #{school,jdbcType=VARCHAR},
         #{subject,jdbcType=VARCHAR},#{level,jdbcType=VARCHAR},
         #{theoryLevel,jdbcType=VARCHAR},#{theoryMoney,jdbcType=DECIMAL},
         #{theoryCert,jdbcType=VARCHAR},#{mobile,jdbcType=VARCHAR},#{money,jdbcType=DECIMAL}, #{memo,jdbcType=VARCHAR},
-        #{createTime}, #{updateTime}, #{status,jdbcType=TINYINT}, #{activityTag}, #{degreeType})
+        #{createTime}, #{updateTime}, #{status,jdbcType=TINYINT}, #{activityTag}, #{degreeType},#{certificateType})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.DegreeRegistration">
         <!--@mbg.generated-->
@@ -215,6 +216,9 @@
             <if test="activityTag != null">
                 activity_tag_ = #{activityTag},
             </if>
+            <if test="certificateType != null">
+                certificate_type_ = #{certificateType},
+            </if>
                 update_time_ = NOW()
         </set>
         where id_ = #{id,jdbcType=INTEGER}
@@ -290,6 +294,9 @@
                 <if test="degree.activityTag != null">
                     activity_tag_ = #{degree.activityTag},
                 </if>
+	            <if test="degree.certificateType != null">
+	                certificate_type_ = #{degree.certificateType},
+	            </if>
                     update_time_ = NOW()
             </set>
             where id_ = #{degree.id,jdbcType=INTEGER}

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

@@ -240,6 +240,7 @@
             LEFT JOIN sys_user_role sur ON sur.user_id_ = e.user_id_
         </if>
         <where>
+                su.lock_flag_ = 0 AND su.del_flag_ = 0
             <if test="demissionflag != null and demissionflag == 1">
                 AND e.demission_date_ IS NOT NULL
             </if>
@@ -272,6 +273,7 @@
             LEFT JOIN sys_user_role sur ON sur.user_id_ = e.user_id_
         </if>
         <where>
+            su.lock_flag_ = 0 AND su.del_flag_ = 0
             <if test="organId != null">
                 AND INTE_ARRAY(e.organ_id_list_,#{organId})
             </if>

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

@@ -1588,7 +1588,7 @@
 			AND (sa.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
 		</if>
 		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m')
-		HAVING COUNT(sa.id_) > 1 AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_)) c
+		HAVING COUNT(sa.id_) >= #{studentErrorLeaveNum} AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_)) c
 	</select>
 	<resultMap id="StudentErrorLeaveDto" type="com.ym.mec.biz.dal.dto.StudentErrorLeaveDto">
 		<result property="currentNum" column="current_num_"/>
@@ -1620,7 +1620,7 @@
 		<if test="search != null and search != ''">
 			AND (sa.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
 		</if>
-		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m') HAVING COUNT(sa.id_) > 1 AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_) ORDER BY cs.class_date_ DESC)c
+		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m') HAVING COUNT(sa.id_) >= #{studentErrorLeaveNum} AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_) ORDER BY cs.class_date_ DESC)c
 		GROUP BY c.user_id_
 		<include refid="global.limit"/>
 	</select>
@@ -1688,7 +1688,7 @@
 		<if test="search != null and search != ''">
 			AND (sa.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
 		</if>
-		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m') HAVING COUNT(sa.id_) > 1 AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_) ORDER BY cs.class_date_ DESC)c
+		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m') HAVING COUNT(sa.id_) >= #{studentErrorLeaveNum} AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_) ORDER BY cs.class_date_ DESC)c
 		GROUP BY c.user_id_
 	</select>
 

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

@@ -94,6 +94,6 @@
 	</select>
     <select id="queryPushCourseTermMusicIds" resultType="java.lang.String">
 		SELECT music_group_id_ FROM music_group_school_term_course_detail
-		GROUP BY music_group_id_ HAVING DATEDIFF(NOW(),MAX(end_school_term_)) = #{remindCourseTime}
+		GROUP BY music_group_id_ HAVING DATEDIFF(MAX(end_school_term_),NOW()) = #{remindCourseTime}
 	</select>
 </mapper>

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

@@ -26,6 +26,7 @@
         <result column="organ_manager_name_" property="organManagerName"/>
         <result column="education_name_" property="educationName"/>
         <result column="repair_name_" property="repairName"/>
+        <result column="tenant_id_" property="tenantId"/>
         <result column="grade_type_" property="gradeType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
 
@@ -34,6 +35,10 @@
 		SELECT * FROM organization WHERE id_ = #{id} 
 	</select>
 
+    <select id="getByName" parameterType="object" resultMap="Organization">
+        SELECT * FROM organization WHERE name_ = #{name} and tenant_id_ = #{tenantId}
+    </select>
+
     <!-- 全查询 -->
     <select id="findAll" resultMap="Organization">
 		SELECT * FROM organization ORDER BY id_
@@ -44,11 +49,11 @@
             keyProperty="id">
         INSERT INTO organization (id_,name_,area_id_,create_time_,update_time_,
                                   register_date_,linkman_,mobile_,address_,grade_type_,organ_manager_,education_id_,repair_id_,join_teacher_id_,
-                                  organ_manager_name_,education_name_,repair_name_,join_teacher_name_)
+                                  organ_manager_name_,education_name_,repair_name_,join_teacher_name_,tenant_id_)
         VALUES(#{id},#{name},#{areaId},now(),now(),#{registerDate},#{linkman},#{mobile},#{address},
                #{gradeType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
                ,#{organManager},#{educationId},#{repairId},#{joinTeacherId},#{organManagerName},
-               #{educationName},#{repairName},#{joinTeacherName})
+               #{educationName},#{repairName},#{joinTeacherName},#{tenantId})
     </insert>
 
     <!-- 根据主键查询一条记录 -->

+ 27 - 0
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -749,4 +749,31 @@
 		AND se.expect_exercises_num_ > se.actual_exercises_num_ AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN se.monday_ AND se.sunday_
 		AND se.serve_type_ = 'HOMEWORK' AND cs.group_type_ != 'MUSIC' AND cs.class_date_ &lt;= DATE_FORMAT(NOW(), '%Y-%m-%d'))t
 	</select>
+
+	<select id="queryTeacherPerformanceIndicator" resultMap="TeacherServeDto">
+		SELECT
+			organ.name_ organ_name_,
+			sees.monday_,
+			sees.sunday_,
+			sees.teacher_id_,
+			su.real_name_ teacher_name_,
+		    tea.job_nature_,
+			SUM(expect_exercises_num_) expect_exercises_num_,
+			SUM(actual_exercises_num_) actual_exercises_num_,
+			SUM(exercises_reply_num_) exercises_reply_num_,
+			SUM(exercises_message_num_) exercises_message_num_,
+			SUM(exercises_message_timely_num_) exercises_message_timely_num_,
+			SUM(CASE sees.serve_type_ WHEN 'HOMEWORK' THEN sees.expect_exercises_num_ ELSE 0 END) homework_num_,
+			SUM(CASE sees.serve_type_ WHEN 'EXERCISE' THEN 1 ELSE 0 END) exercise_num_,
+			SUM( sees.expect_exercises_num_-sees.not_over_course_num_ )> SUM( sees.actual_exercises_num_ ) un_done_
+		FROM
+			student_extracurricular_exercises_situation_ sees
+			LEFT JOIN teacher tea ON tea.id_=sees.teacher_id_
+			LEFT JOIN organization organ ON organ.id_=tea.organ_id_
+			LEFT JOIN sys_user su ON tea.id_=su.id_
+		<include refid="queryTeacherServeInfoCondition" />
+		GROUP BY sees.teacher_id_
+		ORDER BY sees.teacher_id_
+		<include refid="global.limit"></include>
+	</select>
 </mapper>

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

@@ -153,9 +153,9 @@
     <select id="queryNoAffirmOrderNo" resultType="java.lang.String">
 		SELECT GROUP_CONCAT(DISTINCT so.order_no_) FROM sell_order so
 		LEFT JOIN student_payment_order spo ON spo.order_no_ = so.order_no_
-		WHERE spo.status_ = 'SUCCESS'
+		WHERE spo.status_ = 'SUCCESS' AND spo.receive_status_ = 'NO_RECEIVE'
 		<if test="autoAffirmReceiveTime != null and autoAffirmReceiveTime != ''">
-			AND TIMESTAMPDIFF(HOUR,spo.pay_time_,NOW()) >= #{autoAffirmReceiveTime}
+			AND TIMESTAMPDIFF(DAY,spo.pay_time_,NOW()) >= #{autoAffirmReceiveTime}
 		</if>
 	</select>
 	<resultMap type="com.ym.mec.biz.dal.dto.StudentPaymentOrderDto" id="StudentPaymentOrderDto" extends="com.ym.mec.biz.dal.dao.StudentPaymentOrderDao.StudentPaymentOrder">

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

@@ -86,7 +86,7 @@
             operating_tag_,
         </if>
         teacher_id_,create_time_,update_time_,service_tag_update_time_,cooperation_organ_id_,
-        care_package_,come_on_package_,member_rank_setting_id_,membership_start_time_,membership_end_time_)
+        care_package_,come_on_package_,member_rank_setting_id_,membership_start_time_,membership_end_time_,current_grade_num_,current_class_)
         VALUES
         (#{userId},#{schoolName},#{subjectIdList},
         <if test="serviceTag != null">
@@ -96,7 +96,7 @@
             #{operatingTag},
         </if>
         #{teacherId},NOW(),NOW(),NOW(),#{cooperationOrganId},
-         #{carePackage},#{comeOnPackage},#{memberRankSettingId},#{membershipStartTime},#{membershipEndTime})
+         #{carePackage},#{comeOnPackage},#{memberRankSettingId},#{membershipStartTime},#{membershipEndTime},#{currentGradeNum},#{currentClass})
     </insert>
 
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.Student">

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

@@ -22,11 +22,14 @@
         <result column="updated_time_" jdbcType="TIMESTAMP" property="updatedTime"/>
         <result column="tsign_code_" jdbcType="VARCHAR" property="tsignCode"/>
         <result column="tsign_name_" jdbcType="VARCHAR" property="tsignName"/>
+        <result column="area_id_" jdbcType="INTEGER" property="areaId"/>
     </resultMap>
 
     <sql id="Base_Column_List">
         id_
-        , name_, contacts_, phone_, address_, email_, logo_, customer_service_phone_, remark_, domain_name_, data_source_, pay_state_, state_, created_by_, created_time_, updated_by_, updated_time_, tsign_code_, tsign_name_
+        , name_, contacts_, phone_, address_, email_, logo_, customer_service_phone_, remark_, domain_name_,
+        data_source_, pay_state_, state_, created_by_, created_time_, updated_by_, updated_time_, tsign_code_, tsign_name_,
+        area_id_
     </sql>
 
     <resultMap id="TenantInfoInfoResult" type="com.ym.mec.biz.dal.vo.TenantInfoInfoPageVo">

+ 47 - 0
mec-biz/src/main/resources/config/mybatis/TenantOrderRecordMapper.xml

@@ -34,4 +34,51 @@
         </foreach>
     </insert>
 
+    <select id="queryPage" parameterType="com.ym.mec.biz.dal.dto.TenantOrderRecordDto" resultType="com.ym.mec.biz.dal.vo.TenantOrderRecordVo">
+        SELECT
+            b.name_ as tenantName,
+            a.tenant_id_ as tenantId,
+            a.order_no_ as orderNo,
+            a.trans_no_ as transNo,
+            a.order_type_ as orderType,
+            a.payment_channel_ as paymentChannel,
+            a.pay_channel_ AS payChannel,
+            a.expect_amount as expectAmount,
+            a.actual_amount as actualAmount,
+            a.order_state_ as orderState,
+            a.pay_date_ as payDate,
+            a.pay_time_ as payTime,
+            a.created_time_ as createdTime
+        FROM
+            tenant_order_record AS a
+                LEFT JOIN tenant_info AS b
+                          ON a.tenant_id_ = b.id_
+    <where>
+        <if test="param.orderNo != null ">
+            AND a.`order_no_` = #{param.orderNo}
+        </if>
+        <if test="param.transNo != null ">
+            AND a.`trans_no_` = #{param.transNo}
+        </if>
+        <if test="param.orderType != null ">
+            AND a.`order_type_` = #{param.orderType}
+        </if>
+        <if test="param.orderState != null ">
+            AND a.`order_state_` = #{param.orderState}
+        </if>
+        <if test="param.tenantIdList != null ">
+            AND a.`tenant_id_`  IN
+            <foreach collection="param.tenantIdList" item="id" open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+        </if>
+        <if test="param.startDate != null">
+            AND a.`created_time_` <![CDATA[ >= ]]>  #{param.startDate}
+        </if>
+        <if test="param.endDate != null ">
+            AND a.`created_time_` <![CDATA[ <= ]]>  #{param.endDate}
+        </if>
+    </where>
+    </select>
+    
 </mapper>

+ 4 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java

@@ -7,6 +7,7 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.thirdparty.exception.ThirdpartyException;
 import com.ym.mec.util.http.HttpUtil;
 import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -120,6 +121,9 @@ public class BaseController {
 		}catch (Exception exception){
 			logger.error("System Error", exception);
 		}
+        if (StringUtils.isNotBlank(ex.getMessage())) {
+            return failed(ex.getMessage());
+        }
 		return failed("系统繁忙");
 	}
 

+ 43 - 1
mec-common/common-core/src/main/java/com/ym/mec/common/page/QueryWrapperUtil.java

@@ -1,11 +1,15 @@
 package com.ym.mec.common.page;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 
-import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.function.Predicate;
+import java.util.stream.Collectors;
 
 /**
  * @author hgw
@@ -40,6 +44,22 @@ public class QueryWrapperUtil<T> {
     }
 
     /**
+     * in 查询
+     *
+     * @param column 列名称
+     * @param val    逗号分开的值
+     */
+    public QueryWrapperUtil<T> hasSplitIn(String column, String val) {
+        if (StringUtils.isNotBlank(val)) {
+            List<String> strings = QueryWrapperUtil.toList(val);
+            if (CollectionUtils.isNotEmpty(strings)) {
+                queryWrapper.in(column, strings);
+            }
+        }
+        return this;
+    }
+
+    /**
      * 可以当作结束语句
      * 或者获取QueryWrapper类还可以继续拼接其他条件SQL
      */
@@ -47,4 +67,26 @@ public class QueryWrapperUtil<T> {
         return queryWrapper;
     }
 
+
+    public static List<String> toList(String key) {
+        return toList(key, ",");
+    }
+
+    public static List<String> toList(String key, String symbol) {
+        return toListOptional(key, symbol)
+                .orElse(null);
+    }
+
+    private static Optional<List<String>> toListOptional(String key, String symbol) {
+        return Optional.ofNullable(key)
+                .filter(StringUtils::isNotBlank)
+                .map(b -> b.split(symbol))
+                .map(QueryWrapperUtil::collectToList)
+                .filter(CollectionUtils::isNotEmpty);
+    }
+
+    private static List<String> collectToList(String[] b) {
+        return Arrays.stream(b).filter(StringUtils::isNotBlank).collect(Collectors.toList());
+    }
+
 }

+ 1 - 1
mec-gateway/mec-gateway-web/src/main/resources/bootstrap-test.properties

@@ -1,7 +1,7 @@
 #\u6307\u5b9a\u5f00\u53d1\u73af\u5883
 #spring.profiles.active=dev
 #\u670d\u52a1\u5668\u5730\u5740
-spring.cloud.nacos.config.server-addr=47.114.1.200:8848
+spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
 spring.cloud.nacos.config.namespace=46f06363-b9d6-46f0-9cd7-7b33dcf26bb0
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e

+ 2 - 0
mec-im/src/main/java/com/ym/common/ApiException.java

@@ -1,5 +1,7 @@
 package com.ym.common;
 
+import com.ym.mec.util.string.MessageFormatter;
+
 /**
  * Created by weiqinxiao on 2019/2/26.
  */

+ 1 - 0
mec-im/src/main/java/com/ym/common/ErrorEnum.java

@@ -18,6 +18,7 @@ public enum ErrorEnum {
     ERR_CREATE_ROOM_ERROR(11, "Create room error"),
     ERR_JOIN_ROOM_ERROR(12, "Join room error"),
     JOIN_ROOM_ERROR(35, "加入房间失败,请前往线下教室"),
+    ROOM_NOT_START(36, "网络教室暂未开启,请稍后重试"),
     ERR_MESSAGE_ERROR(13, "IM Message send error"),
 
 

+ 1 - 0
mec-im/src/main/java/com/ym/controller/RoomController.java

@@ -165,6 +165,7 @@ public class RoomController{
     @RequestMapping(value = "/device/control", method = RequestMethod.POST)
     public Object controlDevice(@RequestBody ReqDeviceControlData data)
             throws Exception {
+        log.info("device_control: {}",JSONObject.toJSON(data));
         return new BaseResponse<>(roomService.controlDevice(data));
     }
 

+ 4 - 3
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -153,7 +153,8 @@ public class RoomServiceImpl implements RoomService {
         }
         Date addMinutes = DateUtil.addMinutes(curTime, Integer.parseInt(courseBeforeBufferTime));
         if(courseSchedule.getStartClassTime().compareTo(addMinutes) > 0 ){
-            throw new BizException("网络教室暂未开启,请在{}分钟后进入教室",DateUtil.minutesBetween(addMinutes,courseSchedule.getStartClassTime()));
+            throw new ApiException(ErrorEnum.ROOM_NOT_START);
+//            throw new BizException("网络教室暂未开启,请在{}分钟后进入教室",DateUtil.minutesBetween(addMinutes,courseSchedule.getStartClassTime()));
         }
 
         //是否是连堂课
@@ -852,14 +853,14 @@ public class RoomServiceImpl implements RoomService {
             enable = data.getMusicScoreOn();
             if(enable){
                 //保存伴奏音量
-                roomDao.updateSoundVolumeById(roomId,data.getSoundVolume());
+                roomDao.updateSoundVolumeById(roomId,data.getSoundVolume()==null?0:data.getSoundVolume());
             }
         }else if (data.getAccompanimentOn() != null) {
             typeEnum = DeviceTypeEnum.MusicScoreAccompaniment;
             enable = data.getAccompanimentOn();
             if(enable){
                 //保存伴奏音量
-                roomDao.updateSoundVolumeById(roomId,data.getSoundVolume());
+                roomDao.updateSoundVolumeById(roomId,data.getSoundVolume()==null?0:data.getSoundVolume());
             }
         } else {
             throw new ApiException(ErrorEnum.ERR_REQUEST_PARA_ERR);

+ 1 - 1
mec-monitor/src/main/resources/bootstrap-test.properties

@@ -1,7 +1,7 @@
 #\u6307\u5b9a\u5f00\u53d1\u73af\u5883
 #spring.profiles.active=dev
 #\u670d\u52a1\u5668\u5730\u5740
-spring.cloud.nacos.config.server-addr=47.96.85.100:8848
+spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
 spring.cloud.nacos.config.namespace=02105743-16b8-46ab-87df-2aca0f3dbca3
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e

+ 5 - 3
mec-student/src/main/java/com/ym/mec/student/controller/DegreeController.java

@@ -102,9 +102,11 @@ public class DegreeController extends BaseController {
         	return failed("请从正确入口进行报名");
         }
         
-        IdcardValidator idcardValidator = new IdcardValidator();
-        if (!debugMode && !idcardValidator.isValidatedAllIdcard(degreeRegistration.getIdcard())) {
-            throw new BizException("身份证号不正确,请核对");
+        if("IDENTITY".equals(degreeRegistration.getCertificateType())){
+	        IdcardValidator idcardValidator = new IdcardValidator();
+	        if (!debugMode && !idcardValidator.isValidatedAllIdcard(degreeRegistration.getIdcard())) {
+	            throw new BizException("身份证号不正确,请核对");
+	        }
         }
         SporadicChargeInfo info = sporadicChargeInfoDao.get(degreeRegistration.getSporadicId());
         if (info == null || info.getDelFlag().equals(1)) {

+ 2 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java

@@ -89,7 +89,7 @@ public class TeacherCourseScheduleController extends BaseController {
             return failed("用户机构信息异常,请联系管理员");
         }
         SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE);
-        SysConfig offlineSignInEarlyForwardTime = sysConfigService.findByParamName(SysConfigService.OFFLINE_SIGN_IN_EARLY_FORWARD_TIME);
+        String offlineSignInEarlyForwardTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.OFFLINE_SIGN_IN_EARLY_FORWARD_TIME, user.getTenantId());
         String configValue1 = sysTenantConfigService.getTenantConfigValue(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE_VIP, user.getTenantId());
         String courseBeforeBufferTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.COURSE_BEFORE_BUFFER_TIME, user.getTenantId());
         String courseAfterBufferTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.COURSE_AFTER_BUFFER_TIME, user.getTenantId());
@@ -98,7 +98,7 @@ public class TeacherCourseScheduleController extends BaseController {
         Map<String,Object> result = new HashMap<>();
         result.put("rows",teacherCourseSchedulesWithDate);
         result.put("appealHoursRange",4);
-        result.put("offlineSignInEarlyForwardTime", offlineSignInEarlyForwardTime.getParanValue(Integer.class));
+        result.put("offlineSignInEarlyForwardTime", StringUtils.isEmpty(offlineSignInEarlyForwardTime)?60:Integer.parseInt(offlineSignInEarlyForwardTime));
         result.put("enableStudentAttendanceTimeRange",sysConfig.getParanValue(Integer.class));
         result.put("enableStudentAttendanceTimeRangeVip",StringUtils.isEmpty(configValue1)?0:Integer.parseInt(configValue1));
         result.put("joinRoomBeforeTime",StringUtils.isEmpty(configValue)?0:Integer.parseInt(configValue));

+ 72 - 0
mec-util/src/main/java/com/ym/mec/util/validator/ValidationKit.java

@@ -0,0 +1,72 @@
+package com.ym.mec.util.validator;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * 个别功能在传参时只需要部分成员变量赋值,但是接收类加入了@Valid的验证,
+ * 从而不得已要在传参时把接收类所有的成员变量都赋值。
+ * 该功能可以让加入了@Valid的验证的接收类中分成员变量没有赋值的时不报出异
+ * 常,只针对你需要的值进行验证再报出异常。
+ *
+ * @author hgw
+ * Created by 2021-12-20
+ */
+public class ValidationKit {
+
+    /**
+     * 校验
+     *
+     * @param result BindingResult
+     * @param fields 只校验的字段
+     */
+    public static void validFields(BindingResult result, String... fields) {
+        if (!result.hasFieldErrors()) {
+            return;
+        }
+        Stream<String> stringStream = result.getFieldErrors().stream()
+                .map(FieldError::getField)
+                .filter(field -> ArrayUtils.contains(fields, field));
+
+        String errorCollect = concat(result, stringStream);
+        if (StringUtils.isNotBlank(errorCollect)) {
+            throw new RuntimeException(errorCollect);
+        }
+    }
+
+    /**
+     * 忽略校验部分字段
+     *
+     * @param result       BindingResult
+     * @param ignoreFields 忽略验证的字段
+     */
+    public static void ignoreFields(BindingResult result, String... ignoreFields) {
+        if (!result.hasFieldErrors()) {
+            return;
+        }
+        Stream<String> stringStream = result.getFieldErrors().stream()
+                .map(FieldError::getField)
+                .filter(field -> !ArrayUtils.contains(ignoreFields, field));
+
+        String errorCollect = concat(result, stringStream);
+        if (StringUtils.isNotBlank(errorCollect)) {
+            throw new RuntimeException(errorCollect);
+        }
+    }
+
+    private static String concat(BindingResult result, Stream<String> stringStream) {
+        return stringStream.filter(f -> Objects.nonNull(result.getFieldError(f)))
+                .map(result::getFieldError)
+                .filter(Objects::nonNull)
+                .map(FieldError::getDefaultMessage)
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.joining());
+    }
+
+}

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java

@@ -39,7 +39,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                         "/eduSubject/findSubSubjects", "/eduFinancialExpenditure/batchAdd", "/eduSendNotice/*",
                         "/oaContracts/*", "/eduStudent/organStudentOverView", "/activity/countCloudTeacherActive",
                         "/activity/organDoubleEleven2021Statis", "/activity/doubleEleven2021Statis", "/questionnaireTopic/getDetail", "/questionnaireUserResult/add",
-                        "/tenantInfo/info/*"
+                        "/tenantInfo/info/*","/tenantInfo/pay/*","/tenantInfo/notify"
                 )
                 .permitAll().anyRequest().authenticated().and().httpBasic();
     }

+ 38 - 2
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -3544,8 +3544,6 @@ public class ExportController extends BaseController {
         }
     }
 
-
-
     @ApiOperation(value = "启蒙课问卷导出")
     @RequestMapping("export/musicEnlightenmentQuestionnaires")
     @PreAuthorize("@pcs.hasPermissions('export/musicEnlightenmentQuestionnaires')")
@@ -3588,4 +3586,42 @@ public class ExportController extends BaseController {
             }
         }
     }
+
+    @ApiOperation(value = "服务指标导出")
+    @RequestMapping("export/exercisesSituation")
+    @PreAuthorize("@pcs.hasPermissions('export/exercisesSituation')")
+    public void exportExercisesSituation(TeacherServeQueryInfo queryInfo, HttpServletResponse response) throws IOException {
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        List<TeacherServeDto> list = studentExtracurricularExercisesSituationService.queryTeacherPerformanceIndicator(queryInfo);
+        if (list.size() <= 0) {
+            response.setStatus(500);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            String[] header = {"分部","老师编号","老师姓名","预计安排(人次)","实际安排(人次)","布置率(%)","提交人数","点评次数","点评率(%)","及时点评次数","及时点评率(%)"};
+            String[] body = {"organName","teacherId","teacherName","expectExercisesNum","actualExercisesNum","100 * actualExercisesNum / expectExercisesNum","exercisesReplyNum","exercisesMessageNum","100 * exercisesMessageNum / exercisesReplyNum", "exercisesMessageTimelyNum","100 * exercisesMessageTimelyNum / exercisesReplyNum"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, list);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=teacherPerformanceIndicator-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }

+ 8 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SysTenantConfigController.java

@@ -5,6 +5,7 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.SysConfig;
 import com.ym.mec.biz.service.SysTenantConfigService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import com.yonge.log.model.AuditLogAnnotation;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -48,4 +49,11 @@ public class SysTenantConfigController extends BaseController {
 		sysTenantConfigService.batchUpSet(sysConfigs,sysUser.getTenantId());
 		return succeed();
 	}
+
+	@ApiOperation(value = "获取单个配置")
+	@PostMapping(value = "findByName")
+    @PreAuthorize("@pcs.hasPermissions('sysTenantConfig/findByName')")
+	public Object findByName(String configName) {
+		return succeed(sysTenantConfigService.getTenantConfigValue(configName,TenantContextHolder.getTenantId()));
+	}
 }

+ 4 - 4
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -477,10 +477,10 @@ public class TaskController extends BaseController {
 	@ApiOperation("每天10点推送排课、续费提醒")
 	@GetMapping(value = "/musicSchoolTermPush")
 	public void musicSchoolTermPush() {
-		Object o = redisCache.get("musicSchoolTermPush");
-		if(o != null){
-			return;
-		}
+//		Object o = redisCache.get("musicSchoolTermPush");
+//		if(o != null){
+//			return;
+//		}
 		List<TenantInfo> tenantInfos = tenantInfoService.list(new QueryWrapper<TenantInfo>().eq("state_",1));
 		if(tenantInfos != null && tenantInfos.size() > 0){
 			for (TenantInfo tenantInfo : tenantInfos) {

+ 19 - 6
mec-web/src/main/java/com/ym/mec/web/controller/TenantInfoController.java

@@ -3,9 +3,12 @@ package com.ym.mec.web.controller;
 import com.ym.mec.biz.dal.dto.TenantInfoDto;
 import com.ym.mec.biz.service.TenantInfoService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.thirdparty.yqpay.Msg;
+import com.ym.mec.util.validator.ValidationKit;
 import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -25,7 +28,7 @@ public class TenantInfoController extends BaseController {
 
     @ApiOperation("添加机构信息")
     @PostMapping(value = "/add")
-//    @PreAuthorize("@pcs.hasPermissions('tenantInfo/add')")
+    @PreAuthorize("@pcs.hasPermissions('tenantInfo/add')")
     public Object addTenantInfo(@Valid @RequestBody TenantInfoDto dto) {
         tenantInfoService.addTenantInfo(dto);
         return succeed();
@@ -33,8 +36,9 @@ public class TenantInfoController extends BaseController {
 
     @ApiOperation("修改机构信息")
     @PostMapping(value = "/update")
-//    @PreAuthorize("@pcs.hasPermissions('tenantInfo/update')")
-    public Object updateTenantInfo(@Valid @RequestBody TenantInfoDto dto) {
+    @PreAuthorize("@pcs.hasPermissions('tenantInfo/update')")
+    public Object updateTenantInfo(@Valid @RequestBody TenantInfoDto dto, BindingResult bindingResult) {
+        ValidationKit.ignoreFields(bindingResult, "productInfo", "config");
         tenantInfoService.updateTenantInfo(dto);
         return succeed();
     }
@@ -49,12 +53,10 @@ public class TenantInfoController extends BaseController {
 
     @ApiOperation("查询单个机构详情")
     @GetMapping(value = "/info/{id}")
-//    @PreAuthorize("@pcs.hasPermissions('tenantInfo/info')")
     public Object queryTenantInfo(@ApiParam(value = "机构ID", required = true) @PathVariable("id") Integer id) {
         return succeed(tenantInfoService.queryTenantInfo(id));
     }
 
-
     @ApiImplicitParams({
             @ApiImplicitParam(name = "search", dataType = "String", value = "关键字"),
             @ApiImplicitParam(name = "createdName", dataType = "String", value = "创建人"),
@@ -67,9 +69,20 @@ public class TenantInfoController extends BaseController {
     })
     @ApiOperation("分页查询")
     @PostMapping(value = "/queryPage")
-//    @PreAuthorize("@pcs.hasPermissions('tenantInfo/queryPage')")
+    @PreAuthorize("@pcs.hasPermissions('tenantInfo/queryPage')")
     public Object queryPage(@RequestBody Map<String, Object> param) {
         return succeed(tenantInfoService.queryPage(param));
     }
 
+    @ApiOperation("机构支付")
+    @GetMapping(value = "/pay/{id}")
+    public Object pay(@ApiParam(value = "机构ID", required = true) @PathVariable("id") Integer id) throws Exception {
+        return succeed(tenantInfoService.pay(id));
+    }
+
+    @PostMapping("/notify")
+    public Msg notify(@ModelAttribute Msg msg) throws Exception {
+        return tenantInfoService.orderNotify(msg);
+    }
+
 }

+ 1 - 1
mec-zipkin/src/main/resources/bootstrap-test.properties

@@ -1,7 +1,7 @@
 #\u6307\u5b9a\u5f00\u53d1\u73af\u5883
 #spring.profiles.active=dev
 #\u670d\u52a1\u5668\u5730\u5740
-spring.cloud.nacos.config.server-addr=47.96.85.100:8848
+spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
 spring.cloud.nacos.config.namespace=02105743-16b8-46ab-87df-2aca0f3dbca3
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e