Browse Source

Merge remote-tracking branch 'origin/master_saas' into master_saas

zouxuan 3 years ago
parent
commit
c88a8b3098
39 changed files with 894 additions and 307 deletions
  1. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  2. 5 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/OrganizationDao.java
  3. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserTenantDao.java
  4. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EmployeeDto.java
  5. 41 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OrganizationDto.java
  6. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Employee.java
  7. 16 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/HfMember.java
  8. 51 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Organization.java
  9. 85 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserTenant.java
  10. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomMemberVo.java
  11. 56 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/SysUserTenantVo.java
  12. 0 8
      mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java
  13. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomService.java
  14. 8 4
      mec-biz/src/main/java/com/ym/mec/biz/service/OrganizationService.java
  15. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserTenantService.java
  16. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudCoachPaymentProgramServiceImpl.java
  17. 50 188
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  18. 39 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  19. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  20. 47 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  21. 65 13
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrganizationServiceImpl.java
  22. 43 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  23. 48 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserTenantServiceImpl.java
  24. 30 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java
  25. 12 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  26. 11 4
      mec-biz/src/main/resources/config/mybatis/HfMemberMapper.xml
  27. 3 0
      mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMapper.xml
  28. 18 10
      mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMemberMapper.xml
  29. 18 2
      mec-biz/src/main/resources/config/mybatis/OrganizationMapper.xml
  30. 3 3
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  31. 37 0
      mec-biz/src/main/resources/config/mybatis/SysUserTenantMapper.xml
  32. 6 0
      mec-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml
  33. 1 0
      mec-im/src/main/java/com/ym/controller/LiveRoomController.java
  34. 42 7
      mec-im/src/main/java/com/ym/pojo/RecordNotifyOutput.java
  35. 8 2
      mec-im/src/main/java/com/ym/service/Impl/LiveRoomServiceImpl.java
  36. 17 34
      mec-student/src/main/java/com/ym/mec/student/controller/ContractsController.java
  37. 2 4
      mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java
  38. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/OrganizationController.java
  39. 29 0
      mec-web/src/main/java/com/ym/mec/web/controller/SysUserTenantController.java

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -570,4 +570,8 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
     List<StudentVipPracticeExportDto> exportStudentVipPractice(@Param("organId") String organId, @Param("tenantId") Integer tenantId);
 
     List<BaseNameDto> queryLastOverTeacher(@Param("studentIds") List<Integer> studentIds, @Param("groupType") String groupType);
+
+	List<Mapper> queryUserMusicGroupCourseNumByClassTime(@Param("groupType") GroupType groupType, @Param("musicGroupIds") Set<String> musicGroupIds,
+			@Param("userId") Integer userId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
+
 }

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

@@ -1,12 +1,14 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.common.dal.BaseDAO;
-import org.apache.ibatis.annotations.Param;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.ibatis.annotations.Param;
+
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.common.dal.BaseDAO;
+
 public interface OrganizationDao extends BaseDAO<Integer, Organization> {
 
     /**

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserTenantDao.java

@@ -0,0 +1,23 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.SysUserTenant;
+import com.ym.mec.biz.dal.vo.SysUserTenantVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 平台用户与机构关系表(SysUserTenant)表数据库访问层
+ *
+ * @author hgw
+ * @since 2022-03-02 11:09:34
+ */
+public interface SysUserTenantDao extends BaseMapper<SysUserTenant> {
+
+    int insertBatch(@Param("entities") List<SysUserTenant> entities);
+
+    List<SysUserTenantVo> queryUserTenant(@Param("userId") Integer userId);
+
+}
+

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EmployeeDto.java

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.vo.SysUserTenantVo;
+import com.ym.mec.biz.dal.vo.TenantInfoPageVo;
 import com.ym.mec.common.enums.UserGenderEnum;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -77,6 +79,8 @@ public class EmployeeDto {
     @ApiModelProperty(value = "岗位管理范围",required = false)
     private String postDeptIds;
 
+    private List<SysUserTenantVo> userTenantList;
+
     public String getPositionNames() {
         return positionNames;
     }
@@ -252,4 +256,12 @@ public class EmployeeDto {
     public void setDeptId(Integer deptId) {
         this.deptId = deptId;
     }
+
+    public List<SysUserTenantVo> getUserTenantList() {
+        return userTenantList;
+    }
+
+    public void setUserTenantList(List<SysUserTenantVo> userTenantList) {
+        this.userTenantList = userTenantList;
+    }
 }

+ 41 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OrganizationDto.java

@@ -0,0 +1,41 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.Organization;
+
+public class OrganizationDto extends Organization {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -3461575801207273457L;
+
+	private String corporateName;
+	
+	private String corporateCode;
+	
+	private String memberId;
+
+	public String getCorporateName() {
+		return corporateName;
+	}
+
+	public void setCorporateName(String corporateName) {
+		this.corporateName = corporateName;
+	}
+
+	public String getCorporateCode() {
+		return corporateCode;
+	}
+
+	public void setCorporateCode(String corporateCode) {
+		this.corporateCode = corporateCode;
+	}
+
+	public String getMemberId() {
+		return memberId;
+	}
+
+	public void setMemberId(String memberId) {
+		this.memberId = memberId;
+	}
+}

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

@@ -92,6 +92,9 @@ public class Employee extends SysUser {
 	@ApiModelProperty(value = "职位id列表",required = false)
 	private List<Integer> positionIds;
 
+	@ApiModelProperty(value = "机构id列表")
+	private List<Integer> tenantIds;
+
 	private String contactAddress;
 
 	private String postalCode;
@@ -292,4 +295,12 @@ public class Employee extends SysUser {
 	public void setDeptId(Integer deptId) {
 		this.deptId = deptId;
 	}
+
+    public List<Integer> getTenantIds() {
+        return tenantIds;
+    }
+
+    public void setTenantIds(List<Integer> tenantIds) {
+        this.tenantIds = tenantIds;
+    }
 }

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

@@ -10,8 +10,15 @@ import java.math.BigDecimal;
 import java.util.Date;
 
 public class HfMember extends BaseEntity {
-    @ApiModelProperty(value = "id",required = true)
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = -490352140698445380L;
+
+	@ApiModelProperty(value = "id",required = true)
     private Integer Id;
+    
+    private Integer organId;
 
     @ApiModelProperty(value = "商户号",required = true)
     private String memberId;
@@ -283,4 +290,12 @@ public class HfMember extends BaseEntity {
     public void setRouteOrganId(Integer routeOrganId) {
         this.routeOrganId = routeOrganId;
     }
+
+	public Integer getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
 }

+ 51 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Organization.java

@@ -1,19 +1,26 @@
 package com.ym.mec.biz.dal.entity;
 
-import com.ym.mec.biz.dal.enums.GradeTypeEnum;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-import com.ym.mec.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
-import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.util.Date;
 import java.util.List;
 
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import com.ym.mec.biz.dal.enums.GradeTypeEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.common.entity.BaseEntity;
+
 /**
  * 对应数据库表(organization):
  */
 public class Organization extends BaseEntity {
 
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -8979746516597046410L;
+
 	/**  */
 	private Integer id;
 	
@@ -29,6 +36,14 @@ public class Organization extends BaseEntity {
 	@ApiModelProperty(value = "区域编码",required = false)
 	private Integer areaId;
 	
+	private String corporateName;
+	
+	private String corporateCode;
+	
+	private String corporateSeal;
+	
+	private String corporateFinancialSeal;
+	
 	/** 创建时间 */
 	private Date createTime;
 	
@@ -166,4 +181,36 @@ public class Organization extends BaseEntity {
 		this.gradeType = gradeType;
 	}
 
+	public String getCorporateName() {
+		return corporateName;
+	}
+
+	public void setCorporateName(String corporateName) {
+		this.corporateName = corporateName;
+	}
+
+	public String getCorporateCode() {
+		return corporateCode;
+	}
+
+	public void setCorporateCode(String corporateCode) {
+		this.corporateCode = corporateCode;
+	}
+
+	public String getCorporateSeal() {
+		return corporateSeal;
+	}
+
+	public void setCorporateSeal(String corporateSeal) {
+		this.corporateSeal = corporateSeal;
+	}
+
+	public String getCorporateFinancialSeal() {
+		return corporateFinancialSeal;
+	}
+
+	public void setCorporateFinancialSeal(String corporateFinancialSeal) {
+		this.corporateFinancialSeal = corporateFinancialSeal;
+	}
+
 }

+ 85 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserTenant.java

@@ -0,0 +1,85 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+
+/**
+ * 平台用户与机构关系表(SysUserTenant)表实体类
+ *
+ * @author hgw
+ * @since 2022-03-02 11:09:34
+ */
+@ApiModel(value = "sys_user_tenant-平台用户与机构关系表")
+public class SysUserTenant implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("user_id_")
+    @ApiModelProperty(value = "用户id")
+    private Integer userId;
+
+    @TableField("tenant_id_")
+    @ApiModelProperty(value = "机构id")
+    private Integer tenantId;
+
+    @TableField("created_by_")
+    @ApiModelProperty(value = "创建人")
+    private Integer createdBy;
+
+    @TableField("created_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public Integer getCreatedBy() {
+        return createdBy;
+    }
+
+    public void setCreatedBy(Integer createdBy) {
+        this.createdBy = createdBy;
+    }
+
+    public Date getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+    }
+
+}
+

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomMemberVo.java

@@ -11,6 +11,12 @@ import java.util.Date;
  */
 public class ImLiveBroadcastRoomMemberVo implements java.io.Serializable {
 
+    @ApiModelProperty(value = "房间编号")
+    private String roomUid;
+
+    @ApiModelProperty(value = "房间标题")
+    private String roomTitle;
+
     @ApiModelProperty(value = "学生编号")
     private Integer studentId;
 
@@ -77,4 +83,20 @@ public class ImLiveBroadcastRoomMemberVo implements java.io.Serializable {
     public void setTotalViewTime(Integer totalViewTime) {
         this.totalViewTime = totalViewTime;
     }
+
+    public String getRoomUid() {
+        return roomUid;
+    }
+
+    public void setRoomUid(String roomUid) {
+        this.roomUid = roomUid;
+    }
+
+    public String getRoomTitle() {
+        return roomTitle;
+    }
+
+    public void setRoomTitle(String roomTitle) {
+        this.roomTitle = roomTitle;
+    }
 }

+ 56 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/SysUserTenantVo.java

@@ -0,0 +1,56 @@
+package com.ym.mec.biz.dal.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @author hgw
+ * Created by 2022-03-02
+ */
+public class SysUserTenantVo implements Serializable {
+
+    @ApiModelProperty(value = "关系表id")
+    private Integer id;
+
+    @ApiModelProperty(value = "机构id")
+    private Integer userId;
+
+    @ApiModelProperty(value = "机构id")
+    private Integer tenantId;
+
+    @ApiModelProperty(value = "机构名称")
+    private String tenantName;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getTenantName() {
+        return tenantName;
+    }
+
+    public void setTenantName(String tenantName) {
+        this.tenantName = tenantName;
+    }
+}

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

@@ -8,7 +8,6 @@ import com.ym.mec.biz.dal.dto.OAFinancialDto;
 import com.ym.mec.biz.dal.entity.SysUserTsign;
 import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
-import com.ym.mec.common.entity.HttpResponseResult;
 
 public interface ContractService {
 
@@ -120,13 +119,6 @@ public interface ContractService {
 	void transferProduceContract(Integer userId, String musicGroupId, CourseViewTypeEnum courseViewType);
 
 	/**
-	 * 传递产品协议-仅生成课程协议
-	 * @param userId
-	 * @return
-	 */
-	HttpResponseResult transferProduceContractOnlyWithCourseList(Integer userId);
-
-	/**
 	 * 查询产品协议
 	 * @param userId
 	 * @return

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

@@ -47,7 +47,7 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     void createLiveRoom();
 
-    void test();
+    String test(String roomUid, Integer userId);
 
     /**
     * @description: 分享直播链接

+ 8 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/OrganizationService.java

@@ -1,12 +1,15 @@
 package com.ym.mec.biz.service;
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.enums.SysUserRoleEnum;
 import com.ym.mec.biz.dal.page.EducationBaseQueryInfo;
 import com.ym.mec.common.service.BaseService;
 
-import java.util.*;
-
 public interface OrganizationService extends BaseService<Integer, Organization> {
 
     Set<Integer>  EXCLUDE_ORGAN_IDS = new HashSet<>(Arrays.asList(36,38,39,41,42,43,44,45,46,47,48,49,50,52,54,55,56,2,27,22,24));
@@ -75,5 +78,6 @@ public interface OrganizationService extends BaseService<Integer, Organization>
     * @date 2022/1/6 18:11
     */
     <T extends EducationBaseQueryInfo> T onlyEducation(T queryInfo);
-
+    
+    boolean updateBasicInfo(Organization organization);
 }

+ 25 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysUserTenantService.java

@@ -0,0 +1,25 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.SysUserTenantDao;
+import com.ym.mec.biz.dal.entity.SysUserTenant;
+import com.ym.mec.biz.dal.vo.SysUserTenantVo;
+
+import java.util.List;
+
+/**
+ * 平台用户与机构关系表(SysUserTenant)表服务接口
+ *
+ * @author hgw
+ * @since 2022-03-02 11:09:34
+ */
+public interface SysUserTenantService extends IService<SysUserTenant> {
+
+    SysUserTenantDao getDao();
+
+    List<SysUserTenantVo> queryUserTenant(Integer userId);
+
+    void deleteByUserId(Integer userId);
+
+}
+

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

@@ -122,18 +122,18 @@ public class CloudCoachPaymentProgramServiceImpl extends BaseServiceImpl<Long, C
 			cloudTeacherOrderDao.batchInsert(cloudTeacherOrder,cloudCoachPaymentProgram.getUserIds());
 		}else {
 			//推送缴费消息
-			TenantInfo tenantInfo = tenantInfoDao.selectById(cloudCoachPaymentProgram.getTenantId());
+			//TenantInfo tenantInfo = tenantInfoDao.selectById(cloudCoachPaymentProgram.getTenantId());
 			Map<Integer, String> phoneMaps = MapUtil.convertMybatisMap(teacherDao.queryPhoneByIds(StringUtils.join(userIds,",")));
 			String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
 			StringBuffer pushUrl = new StringBuffer(baseApiUrl).append("/#/studentMember?id=").append(cloudCoachPaymentProgram.getId());
 			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_CLOUD_PAYMENT,phoneMaps,
-					null,0,"",null,tenantInfo.getName(), HttpUtil.getSortUrl(pushUrl.toString()));
+					null,0,"",null, HttpUtil.getSortUrl(pushUrl.toString()));
 
 			StringBuffer notifyUrl = new StringBuffer("8?").append(baseApiUrl).append("/#/studentMember?id=").append(cloudCoachPaymentProgram.getId());
 			Map<Integer, String> userIdMaps = new HashMap<>(userIds.size());
 			userIds.forEach(e->userIdMaps.put(e,e.toString()));
 			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_CLOUD_PAYMENT,userIdMaps,
-					null,0,notifyUrl.toString(),"STUDENT",tenantInfo.getName());
+					null,0,notifyUrl.toString(),"STUDENT");
 		}
 	}
 

+ 50 - 188
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java

@@ -24,7 +24,6 @@ import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Lazy;
-import org.springframework.http.HttpStatus;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
@@ -39,7 +38,6 @@ import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
 import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
 import com.ym.mec.biz.dal.dao.StudentDao;
-import java.nio.charset.Charset;
 import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
 import com.ym.mec.biz.dal.dao.SysUserContractsDao;
 import com.ym.mec.biz.dal.dto.CirculationUser;
@@ -52,6 +50,7 @@ import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
+import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.entity.SysUserContracts;
@@ -68,6 +67,7 @@ import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.biz.service.MusicGroupService;
 import com.ym.mec.biz.service.MusicGroupSubjectGoodsGroupService;
 import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
+import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.StudentRegistrationService;
 import com.ym.mec.biz.service.SubjectService;
 import com.ym.mec.biz.service.SysUserContractsService;
@@ -76,8 +76,6 @@ import com.ym.mec.biz.service.TenantConfigService;
 import com.ym.mec.biz.service.TenantContractTemplateService;
 import com.ym.mec.biz.service.TenantInfoService;
 import com.ym.mec.biz.service.VipGroupService;
-import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.thirdparty.eseal.ESealPlugin;
 import com.ym.mec.thirdparty.storage.StoragePluginContext;
@@ -155,6 +153,10 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
     private TenantConfigService tenantConfigService;
     
     @Autowired
+    @Lazy
+    private OrganizationService organizationService;
+    
+    @Autowired
     private TenantContractTemplateService tenantContractTemplateService;
 
     @Value("${contract.baseDir:/var/pdf}")
@@ -198,9 +200,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 		SysUserTsign sysUserTsign = null;
 
-		SysUserTsign orignSysUserTsign = sysUserTsignService.get(-userId);
+		SysUserTsign orignSysUserTsign = sysUserTsignService.queryByCardNo(organCode);
 
-		if (orignSysUserTsign == null || !StringUtils.equals(orignSysUserTsign.getCardNo(), organCode)) {
+		if (orignSysUserTsign == null) {
 
 			String accountId = eSealPlugin.createOrganAccount(orgName, organCode);
 			if (StringUtils.isBlank(accountId)) {
@@ -213,16 +215,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			}
 
 			sysUserTsign = new SysUserTsign(-userId, accountId, sealData, orgName, organCode, tenantId);
-
-			if (orignSysUserTsign == null) {
-				sysUserTsignService.insert(sysUserTsign);
-			} else {
-				orignSysUserTsign.setAccountId(accountId);
-				orignSysUserTsign.setSealData(sealData);
-				orignSysUserTsign.setName(orgName);
-				orignSysUserTsign.setCardNo(organCode);
-				sysUserTsignService.update(orignSysUserTsign);
-			}
+			sysUserTsignService.insert(sysUserTsign);
 
 		} else if (!StringUtils.equals(orignSysUserTsign.getName(), orgName)) {
 			if (eSealPlugin.updateOrganAccount(orignSysUserTsign.getAccountId(), orgName, organCode)) {
@@ -987,18 +980,21 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
             return;
         }
         
-		TenantInfo tenantInfo = tenantInfoService.get(studentInfo.getTenantId());
-		if(tenantInfo == null){
-			throw new BizException("机构信息不存在");
-		}
-		
-		TenantConfig tenantConfig = tenantConfigService.queryByTenantId(studentInfo.getTenantId());
-		if(tenantConfig == null){
-			throw new BizException("机构配置信息查询失败");
+        //如果分部有企业信息,就用分部上的企业信息,否则用机构上的企业信息
+        String companyName = null;
+        TenantInfo tenantInfo = null;
+        Organization organizationDto = organizationService.get(user.getOrganId());
+		if (organizationDto == null || StringUtils.isBlank(organizationDto.getCorporateName()) || StringUtils.isBlank(organizationDto.getCorporateCode())) {
+
+			tenantInfo = tenantInfoService.get(studentInfo.getTenantId());
+			if (tenantInfo == null) {
+				throw new BizException("机构信息不存在");
+			}
+			companyName = tenantInfo.getTsignName();
+		} else {
+			companyName = organizationDto.getCorporateName();
 		}
-		
-		params.put("companyName", tenantInfo.getTsignName());
-		params.put("sealPicture", tenantConfig.getCorporateChops());
+		params.put("companyName", companyName);
         
 		if (studentInfo.getTenantId() == 1) {
 			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
@@ -1020,22 +1016,17 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
             return;
         }
 
-
-        String organCode = "";
+        String organCode = tenantInfo == null ? organizationDto.getCorporateCode() : tenantInfo.getTsignCode();
         
 		if (user.getTenantId() == 1) {
-			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
-				organCode = "91440300326364429H";
-			} else {
+			if (!OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
 				organCode = "91420106333619290A";
 			}
-		} else {
-			organCode = tenantInfo.getTsignCode();
 		}
         SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
         if (organTsign == null) {
-            logger.error("甲方未创建签章");
-            return;
+            //创建企业签章
+            addTsign(tenantInfo.getUserId(), organCode, companyName, user.getTenantId());
         }
 
         eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
@@ -1113,18 +1104,31 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
             ownershipType = courseViewType;
         }
         
-		TenantInfo tenantInfo = tenantInfoService.get(studentInfo.getTenantId());
-		if(tenantInfo == null){
-			throw new BizException("机构信息不存在");
-		}
-		
-		TenantConfig tenantConfig = tenantConfigService.queryByTenantId(studentInfo.getTenantId());
-		if(tenantConfig == null){
-			throw new BizException("机构配置信息查询失败");
+        //如果分部有企业信息,就用分部上的企业信息,否则用机构上的企业信息
+        String companyName = null, sealPicture = null;
+        TenantInfo tenantInfo = null;
+        Organization organizationDto = organizationService.get(studentInfo.getOrganId());
+		if (organizationDto == null || StringUtils.isBlank(organizationDto.getCorporateName()) || StringUtils.isBlank(organizationDto.getCorporateCode())) {
+
+			tenantInfo = tenantInfoService.get(studentInfo.getTenantId());
+			if (tenantInfo == null) {
+				throw new BizException("机构信息不存在");
+			}
+	        
+			TenantConfig tenantConfig = tenantConfigService.queryByTenantId(studentInfo.getTenantId());
+			if(tenantConfig == null){
+				throw new BizException("机构配置信息查询失败");
+			}
+			
+			companyName = tenantInfo.getTsignName();
+			sealPicture = tenantConfig.getCorporateChops();
+		} else {
+			companyName = organizationDto.getCorporateName();
+			sealPicture = organizationDto.getCorporateSeal();
 		}
 		
-		params.put("companyName", tenantInfo.getTsignName());
-		params.put("sealPicture", tenantConfig.getCorporateChops());
+		params.put("companyName", companyName);
+		params.put("sealPicture", sealPicture);
         
 		if (studentInfo.getTenantId() == 1) {
 			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
@@ -1162,148 +1166,6 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult transferProduceContractOnlyWithCourseList(Integer userId) {
-        SysUser user = studentDao.lockUserReturnInfo(userId);
-        if (user == null) {
-            logger.error("用户不存在({})", userId);
-            return BaseController.failed("用户不存在");
-        }
-
-        int validContactNum = sysUserContractsDao.countUserValidContact(userId);
-        if (validContactNum > 0) {
-            return BaseController.succeed();
-        }
-
-        if (StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCardNo())) {
-            return BaseController.failed(HttpStatus.PARTIAL_CONTENT, user, "");
-        }
-
-        SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
-        if (sysUserTsign == null) {
-            try {
-                sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
-            } catch (Exception e) {
-                logger.error("用户电子签章注册失败", e);
-                return BaseController.failed("用户电子签章注册失败");
-            }
-        }
-        Date date = new Date();
-
-        // 合成freemarker
-        String srcPdfPath = contractBaseDir + "/product/" + dateFormat1.format(date) + "/" + userId + "_" + LocalDateTime.now().getSecond() + ".pdf";
-
-        File srcFile = new File(srcPdfPath);
-
-        File debtFile = new File(srcFile.getParent());
-        if (!debtFile.exists()) {
-            debtFile.mkdirs();
-        }
-
-        FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
-        templateEngine.setClassForTemplateLoading(ContractServiceImpl.class, "/config/contracts/");
-
-        Map<String, Object> params = new HashMap<String, Object>();
-
-        // 查询参数信息
-        StudentInfo studentInfo = studentRegistrationService.queryStudentInfo(userId);
-        params.put("studentInfo", studentInfo);
-
-        params.put("isShowVisualSeal", false);
-
-        params.put("ownershipType", "OWN");
-		
-        // 查询最新协议模板
-		TenantContractTemplate tenantContractTemplate = tenantContractTemplateService.queryLatestContractTemplate(user.getTenantId(), null, null);
-		if(tenantContractTemplate == null){
-			logger.error("最新协议模板查询失败");
-            return BaseController.succeed();
-		}
-		String mainContent = tenantContractTemplate.getContractTemplateContent();
-		params.put("contractMainContent", mainContent);
-
-        // 查询是否已生成协议
-        List<SysUserContracts> userContracts = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT, tenantContractTemplate.getVersion());
-        if (!CollectionUtils.isEmpty(userContracts)) {
-            return BaseController.succeed();
-        }
-        
-		TenantInfo tenantInfo = tenantInfoService.get(studentInfo.getTenantId());
-		if(tenantInfo == null){
-			throw new BizException("机构信息不存在");
-		}
-		
-		TenantConfig tenantConfig = tenantConfigService.queryByTenantId(studentInfo.getTenantId());
-		if(tenantConfig == null){
-			throw new BizException("机构配置信息查询失败");
-		}
-		
-		params.put("companyName", tenantInfo.getTsignName());
-		params.put("sealPicture", tenantConfig.getCorporateChops());
-        
-		if (studentInfo.getTenantId() == 1) {
-			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
-				//params.put("companyName", "深圳大雅乐盟网络教育股份有限公司");
-				//params.put("sealPicture", "https://daya-online.oss-cn-beijing.aliyuncs.com/website/cachet.png");
-			} else {
-				params.put("companyName", "武汉长乐长风乐器销售有限公司");
-				params.put("sealPicture", "https://daya-online.oss-cn-beijing.aliyuncs.com/website/clcf.png");
-			}
-		}
-
-        templateEngine.render(params, "latest_contract_template.ftl", srcFile);
-
-        // 生成借款协议PDF
-        try {
-            PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile, Charset.defaultCharset()), srcPdfPath, "simsun.ttc");
-        } catch (IOException e) {
-            logger.error("生成产品协议失败", e);
-            return BaseController.failed("生成产品协议失败");
-        }
-
-        String organCode = "";
-        
-		if (user.getTenantId() == 1) {
-			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
-				organCode = "91440300326364429H";
-			} else {
-				organCode = "91420106333619290A";
-			}
-		} else {
-			organCode = tenantInfo.getTsignCode();
-		}
-
-        SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
-        if (organTsign == null) {
-            logger.error("甲方未创建签章");
-            return BaseController.failed("甲方未创建签章");
-        }
-
-        eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
-        if (sysUserTsign != null && CertificateTypeEnum.IDENTITY.getCode().equals(user.getCertificateType())) {
-            eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), srcPdfPath, srcPdfPath);
-        }
-
-        // 上传到oss
-        String dateStrOss = dateFormatOss.format(date);
-        dateStrOss = "product/" + dateStrOss + "/" + DateUtil.getHour(date);
-        String pdfFilePath = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, dateStrOss, srcFile);
-
-        SysUserContracts sysUserContracts = new SysUserContracts();
-        sysUserContracts.setCreateTime(date);
-        sysUserContracts.setType(ContractType.PRODUCT);
-        sysUserContracts.setUrl(pdfFilePath);
-        sysUserContracts.setUserId(userId);
-        sysUserContracts.setVersion(2);
-        sysUserContracts.setTenantId(user.getTenantId());
-
-        sysUserContractsService.insert(sysUserContracts);
-
-        FileUtils.deleteQuietly(srcFile);
-        return BaseController.succeed();
-    }
-
-    @Override
     public String transferOaFinancial(OAFinancialDto financialDto) {
         List<Integer> circulationUserIds = financialDto.getCirculationUsers().stream().map(CirculationUser::getUserId).collect(Collectors.toList());
         List<Integer> executorIds = financialDto.getExecutors().stream().map(CirculationUser::getUserId).collect(Collectors.toList());

+ 39 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java

@@ -7,10 +7,7 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.EmployeeDto;
 import com.ym.mec.biz.dal.dto.EmployeeLevelDto;
-import com.ym.mec.biz.dal.entity.Employee;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
-import com.ym.mec.biz.dal.entity.TenantInfo;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.EmployeeOperateEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.ParamEnum;
@@ -31,6 +28,7 @@ import com.ym.mec.im.entity.GroupModel;
 import com.ym.mec.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.security.authentication.LockedException;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
@@ -76,6 +74,8 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
     private SysEmployeePositionService employeePositionService;
     @Autowired
     private SysEmployeePositionDao employeePositionDao;
+    @Autowired
+    private SysUserTenantService sysUserTenantService;
 
     @Override
     public BaseDAO<Integer, Employee> getDAO() {
@@ -138,11 +138,38 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
         if (user != null) {
             employee.setAvatar(user.getAvatar());
         }
-
+        //添加平台用户和机构的关系
+        addUserTenant(employee.getTenantIds(), tenantId, employee.getId());
         //添加到OA
         oaUserService.addOaUser(employee);
     }
 
+    /**
+     * 添加平台用户和机构的关系
+     *
+     * @param tenantIds    机构id集合
+     * @param userTenantId 用户当前机构id
+     * @param userId       用户id
+     */
+    private void addUserTenant(List<Integer> tenantIds, Integer userTenantId, Integer userId) {
+        if (Objects.nonNull(userTenantId) && userTenantId == -1) {
+            if (CollectionUtils.isEmpty(tenantIds)) {
+                throw new BizException("平台账号必须指定一个机构!");
+            }
+            Date now = new Date();
+            tenantIds.forEach(t -> {
+                SysUserTenant userTenant = new SysUserTenant();
+                userTenant.setUserId(userId);
+                userTenant.setTenantId(t);
+                userTenant.setCreatedTime(now);
+                try {
+                    sysUserTenantService.save(userTenant);
+                } catch (DuplicateKeyException ignored) {
+                }
+            });
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateEmployee(Employee employee) {
@@ -193,6 +220,9 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
             tenantInfo.setUpdatedBy(sysUser.getId());
             tenantInfoService.updateById(tenantInfo);
         }
+        //更新用户与机构的关系
+        sysUserTenantService.deleteByUserId(employee.getId());
+        addUserTenant(employee.getTenantIds(), employee.getTenantId(), employee.getId());
 
         //更新OA信息
         oaUserService.updateOaUser(employee);
@@ -226,6 +256,10 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
                 }
                 List<Integer> organIds = Arrays.stream(employeeDto.getOrganIdStr().split(",")).map(s -> Integer.valueOf(s)).collect(Collectors.toList());
                 allOrganIds.addAll(organIds);
+                //平台账户查询所拥有的机构
+                if(Objects.nonNull(queryInfo.getTenantId()) && queryInfo.getTenantId() == -1){
+                    employeeDto.setUserTenantList(sysUserTenantService.queryUserTenant(employeeDto.getId()));
+                }
             }
             if (!CollectionUtils.isEmpty(allOrganIds)) {
                 List<Organization> allOrgans = organizationDao.findOrgans(allOrganIds);

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

@@ -209,7 +209,7 @@ public class ExportServiceImpl implements ExportService {
             throw new BizException("请登录");
         }
         if(exportEnum == ExportEnum.ORDER_LIST1 || exportEnum == ExportEnum.ORDER_LIST2){
-            if(sysUser.getTenantId() <= 0){
+            if(sysUser.getTenantId() <= 1){
                 exportEnum = ExportEnum.ORDER_LIST1;
             }else {
                 exportEnum = ExportEnum.ORDER_LIST2;

+ 47 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomDao;
@@ -140,6 +141,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     public PageInfo<ImLiveBroadcastRoomVo> queryPage(Map<String, Object> param) {
         Page<ImLiveBroadcastRoomVo> pageInfo = PageUtil.getPageInfo(param);
         pageInfo.setDesc("a.created_time_");
+        param.put("tenantId",TenantContextHolder.getTenantId());
         IPage<ImLiveBroadcastRoomVo> page = baseMapper.queryPage(pageInfo, param);
         return PageUtil.pageInfo(page);
     }
@@ -298,6 +300,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     @Override
     public void quitRoom(List<ImUserState> userState) {
+        if (CollectionUtils.isEmpty(userState)) {
+            return;
+        }
         userState.forEach(user -> {
             log.info("quitRoom>>>> {}", JSONObject.toJSONString(user));
             if (StringUtils.isBlank(user.getStatus()) || user.getStatus().equals("0")) {
@@ -447,12 +452,13 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         //关闭直播
         RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
         RoomSpeakerInfo roomSpeakerInfo = speakerCache.get();
-
-        if (Objects.nonNull(roomSpeakerInfo.getWhetherVideo()) && roomSpeakerInfo.getWhetherVideo() == 0) {
+        boolean stateFlag = Objects.nonNull(roomSpeakerInfo.getState()) && roomSpeakerInfo.getState() == 0;
+        if (Objects.nonNull(roomSpeakerInfo.getWhetherVideo()) && roomSpeakerInfo.getWhetherVideo() == 0
+                && stateFlag) {
             //停止录制视频
             imFeignService.stopRecord(roomUid);
         }
-        if (Objects.nonNull(roomSpeakerInfo.getState()) && roomSpeakerInfo.getState() == 0) {
+        if (stateFlag) {
             roomSpeakerInfo.setState(1);
             //计算时长
             int minutesBetween = getMinutesBetween(roomSpeakerInfo.getStartLiveTime(), new Date());
@@ -562,8 +568,42 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     /**
      * 测试
      */
-    public void test() {
+    public String test(String roomUid, Integer userId) {
+        String result = "roomUid: " + roomUid + "  userId : " + userId + "  ";
+        //点赞
+        Object like = redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomUid)).get();
+        if (Objects.isNull(like)) {
+            like = 0;
+        }
+        //0用户数量
+        RList<Object> list = redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomUid));
+        int size = list.size();
+        //0累计总用户数量
+        int totalLook = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid)).size();
+        result = result + " 点赞数量:" + like + "  用户数量:" + size + "  累计总用户数量:" + totalLook + ">>>>>>>>>>>>";
 
+        //获取用户信息
+        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+        if (speakerCache.isExists()) {
+            RoomSpeakerInfo roomSpeakerInfo = speakerCache.get();
+            result = result + "  主讲人信息:" + "createRoomTime :" + DateUtil.dateToString(roomSpeakerInfo.getCreateRoomTime(), DateUtil.EXPANDED_DATE_TIME_FORMAT) +
+                    "joinRoomTime :" + DateUtil.dateToString(roomSpeakerInfo.getJoinRoomTime(), DateUtil.EXPANDED_DATE_TIME_FORMAT) +
+                    ",roomUid:" + roomSpeakerInfo.getRoomUid() + ",speakerId:" + roomSpeakerInfo.getSpeakerId() + ",speakerName:" + roomSpeakerInfo.getSpeakerName() +
+                    ",tenantId:" + roomSpeakerInfo.getTenantId() + " ,totalLiveTime:" + roomSpeakerInfo.getTotalLiveTime() + ", whetherVideo:" + roomSpeakerInfo.getWhetherVideo()
+                    + ">>>>>>>>>>>>";
+        } else {
+            result = result + "  主讲人信息:" + "主讲人信息不存在" + ">>>>>>>>>>>>";
+        }
+
+        //获取总用户信息
+        RMap<Integer, RoomUserInfoVo> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
+        if (roomTotalUser.isExists()) {
+            List<RoomUserInfoVo> collect = new ArrayList<>(roomTotalUser.values());
+            result = result + "  总人员信息:" + JSONObject.toJSONString(collect);
+        } else {
+            result = result + "  总人员信息:" + "总人员信息不存在" + ">>>>>>>>>>>>";
+        }
+        return result;
     }
 
     @Override
@@ -633,10 +673,13 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         //房间创建时间
         private Date createRoomTime;
         //进入房间时间
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
         private Date joinRoomTime;
         //开始直播时间
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
         private Date startLiveTime;
         //退出房间时间
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
         private Date exitRoomTime;
         //总直播时间
         private Integer totalLiveTime = 0;

+ 65 - 13
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrganizationServiceImpl.java

@@ -1,19 +1,37 @@
 package com.ym.mec.biz.service.impl;
 
+import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.EDUCATION;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.ClassGroupDao;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dao.OrganizationDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.TenantContractTemplateDao;
+import com.ym.mec.biz.dal.dao.TenantInfoDao;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.TenantContractTemplate;
 import com.ym.mec.biz.dal.entity.TenantInfo;
 import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
 import com.ym.mec.biz.dal.page.EducationBaseQueryInfo;
+import com.ym.mec.biz.service.ContractService;
 import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.SysEmployeePositionService;
 import com.ym.mec.biz.service.TenantInfoService;
@@ -21,17 +39,6 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.EDUCATION;
 
 @Service
 public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organization> implements OrganizationService {
@@ -48,6 +55,14 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 	private SysUserFeignService sysUserFeignService;
 	@Autowired
 	private SysEmployeePositionService employeePositionService;
+	@Autowired
+    @Lazy
+	private ContractService contractService;
+	@Autowired
+	private TenantInfoDao tenantInfoDao;
+	
+	@Autowired
+	private TenantContractTemplateDao tenantContractTemplateDao;
 
 	@Override
 	public BaseDAO<Integer, Organization> getDAO() {
@@ -155,7 +170,6 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 		return organizationDao.getOrgans(organIds,tenantId);
 	}
 
-
     @Override
     public <T extends EducationBaseQueryInfo> T onlyEducation(T queryInfo) {
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
@@ -170,4 +184,42 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 		}
 		return queryInfo;
     }
+
+	@Override
+	@Transactional
+	public boolean updateBasicInfo(Organization organization) {
+		
+		Organization orginOrgan = get(organization.getId());
+		
+		if(orginOrgan == null){
+			throw new BizException("分部原始信息查询失败");
+		}
+		
+		update(organization);
+		
+		//是否修改了机构名称或机构编码
+        if (!StringUtils.equals(orginOrgan.getCorporateName(), organization.getCorporateName()) || !StringUtils.equals(orginOrgan.getCorporateCode(), organization.getCorporateCode())) {
+        	
+        	Integer tenantId = organization.getTenantId();
+            //升级机构协议版本号
+            TenantContractTemplate tenantContractTemplate = tenantContractTemplateDao.queryLatestContractTemplate(null, null, tenantId);
+            if (tenantContractTemplate != null) {
+            	tenantInfoDao.getLocked(tenantId);
+
+                Integer maxVersion = tenantContractTemplateDao.queryMaxVersion();
+                int version = maxVersion == null ? 1 : maxVersion + 1;
+
+                tenantContractTemplate.setVersion(version);
+                Date date = new Date();
+                tenantContractTemplate.setUpdateTime(date);
+
+                tenantContractTemplateDao.update(tenantContractTemplate);
+            }
+            //添加签章信息
+            contractService.addTsign(organization.getId(), organization.getCorporateCode(), organization.getCorporateName(), tenantId);
+        }
+		
+		return true;
+	}
+
 }

+ 43 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java

@@ -21,8 +21,10 @@ import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.time.DayOfWeek;
+import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -341,15 +343,20 @@ public class StudentServeServiceImpl implements StudentServeService {
 //            return;
 //        }
 
+        //查询需要生成服务指标的学员
         List<StudentServeCourseDto> studentFutureCourseInfo = studentDao.getStudentFutureCourseInfo(monDayDate.toString(), DateUtil.dateToString(nextMonday, "yyyy-MM-dd"), studentIds, tenantId);
         if(CollectionUtils.isEmpty(studentFutureCourseInfo)){
             return;
         }
         Map<Integer, List<StudentServeCourseDto>> studentCourseMap = studentFutureCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getStudentId));
+        //有单技课或合奏课,且需要服务的学员
         Set<Integer> musicCourseStudentIds = studentFutureCourseInfo.stream().filter(s -> CourseSchedule.CourseScheduleType.SINGLE.equals(s.getType()) || CourseSchedule.CourseScheduleType.MIX.equals(s.getType())).map(StudentServeCourseDto::getStudentId).collect(Collectors.toSet());
 
+        //有课且被服务的学生
         Set<Integer> haveCourseBeServeStudentIds = studentCourseMap.keySet();
+        //查询所有开启了服务状态的学员
         List<Integer> allServeStudentIds = studentDao.getServeStudentIds(tenantId);
+        //没课但需要服务的学员
         Set<Integer> noCourseServeStudentIds = allServeStudentIds.stream().filter(id -> !haveCourseBeServeStudentIds.contains(id)).collect(Collectors.toSet());
 
         Set<Integer> musicStudentIds = new HashSet<>();
@@ -361,6 +368,7 @@ public class StudentServeServiceImpl implements StudentServeService {
         }
         List<StudentServeCourseDto> noCourseBeServeStudentInfo = new ArrayList<>();
         if(!CollectionUtils.isEmpty(musicStudentIds)){
+        	//查询进行中的乐团,且需要服务的学生、老师、乐团信息
             noCourseBeServeStudentInfo = studentDao.getNoCourseBeServeStudentInfo(new ArrayList<>(musicStudentIds), tenantId);
         }
 
@@ -371,13 +379,19 @@ public class StudentServeServiceImpl implements StudentServeService {
 
         for (Map.Entry<Integer, List<StudentServeCourseDto>> studentCourseMapEntry : studentCourseMap.entrySet()) {
             Map<CourseSchedule.CourseScheduleType, List<StudentServeCourseDto>> typeCourseMap = studentCourseMapEntry.getValue().stream().collect(Collectors.groupingBy(StudentServeCourseDto::getType));
+            
+            Integer userId = studentCourseMapEntry.getKey();
 
+            //有未上的单技课
             if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.SINGLE)){
                 Set<String> musicGroupIds = noCourseStudentMusicIdsMap.get(studentCourseMapEntry.getKey());
                 if(Objects.isNull(musicGroupIds)){
                     musicGroupIds = new HashSet<>();
                 }
-
+                
+                List<Mapper> mapperList = courseScheduleStudentPaymentDao.queryUserMusicGroupCourseNumByClassTime(GroupType.MUSIC, musicGroupIds, userId, new Date(2019, 1, 1), LocalDateToUdate(monDayDate));
+                Map<Object, Object> map = mapperList.stream().collect(Collectors.toMap(Mapper :: getKey, Mapper :: getValue));
+                
                 List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.SINGLE).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
                 if(!CollectionUtils.isEmpty(weekCourseInfo)){
                     Map<String, List<StudentServeCourseDto>> groupCourseInfo = weekCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getMusicGroupId));
@@ -387,6 +401,12 @@ public class StudentServeServiceImpl implements StudentServeService {
                         if(musicGroupIds.contains(groupCourseInfoEntry.getKey())) {
                             musicGroupIds.remove(groupCourseInfoEntry.getKey());
                         }
+                        
+                        //学生在当前乐团没有上过课,就不需要生成服务指标
+                        if(map.get(groupCourseInfoEntry.getKey()) != null && (int)map.get(groupCourseInfoEntry.getKey()) == 0){
+                        	continue;
+                        }
+                        
                         StudentServeCourseDto courseInfo = groupCourseInfoEntry.getValue().stream().min(Comparator.comparing(StudentServeCourseDto::getCourseStartTime)).get();
                         if(!teacherServiceCourseIdMap.containsKey(courseInfo.getActualTeacherId())){
                             teacherServiceCourseIdMap.put(courseInfo.getActualTeacherId(), new HashSet<>());
@@ -443,7 +463,7 @@ public class StudentServeServiceImpl implements StudentServeService {
                     studentExtracurricularExercisesSituation.setExpectExercisesNum(teacherNumMapEntry.getValue());
                     results.add(studentExtracurricularExercisesSituation);
                 }
-            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.VIP)){
+            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.VIP)){ //有未上的VIP
                 List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.VIP);
                 List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.VIP).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
                 if(CollectionUtils.isEmpty(weekCourseInfo)){
@@ -478,13 +498,24 @@ public class StudentServeServiceImpl implements StudentServeService {
                         results.add(studentExtracurricularExercisesSituation);
                     }
                 }
-            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.MIX)){
+            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.MIX)){//有未上的合奏课
                 Set<String> musicGroupIds = noCourseStudentMusicIdsMap.get(studentCourseMapEntry.getKey());
                 if(CollectionUtils.isEmpty(musicGroupIds)){
                     continue;
                 }
+                
+                List<Mapper> mapperList = courseScheduleStudentPaymentDao.queryUserMusicGroupCourseNumByClassTime(GroupType.MUSIC, musicGroupIds, userId, new Date(2019, 1, 1), LocalDateToUdate(monDayDate));
+                Map<Object, Object> map = mapperList.stream().collect(Collectors.toMap(Mapper :: getKey, Mapper :: getValue));
+                
+                
                 Map<Integer, Integer> teacherNumMap = new HashMap<>();
                 for (String groupId : musicGroupIds) {
+                	
+                    //学生在当前乐团没有上过课,就不需要生成服务指标
+                    if(map.get(groupId) != null && (int)map.get(groupId) == 0){
+                    	continue;
+                    }
+                    
                     Integer teacherId = null;
                     List<BaseMapDto<Integer, Integer>> studentTeacherIdList = classGroupStudentMapperDao.getStudentClassGroupBishopTeacherMap(Arrays.asList(studentCourseMapEntry.getKey()), groupId);
                     if(!CollectionUtils.isEmpty(studentTeacherIdList)){
@@ -512,7 +543,7 @@ public class StudentServeServiceImpl implements StudentServeService {
                     studentExtracurricularExercisesSituation.setExpectExercisesNum(teacherNumMapEntry.getValue());
                     results.add(studentExtracurricularExercisesSituation);
                 }
-            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.PRACTICE)){
+            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.PRACTICE)){//有未上的陪练课
                 List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.PRACTICE);
                 List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.PRACTICE).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
                 if(CollectionUtils.isEmpty(weekCourseInfo)){
@@ -1182,4 +1213,12 @@ public class StudentServeServiceImpl implements StudentServeService {
         }
         return result;
     }
+    
+
+    
+	private Date LocalDateToUdate(LocalDate localDate) {
+		ZoneId zone = ZoneId.systemDefault();
+		Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
+		return Date.from(instant);
+	}
 }

+ 48 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserTenantServiceImpl.java

@@ -0,0 +1,48 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.SysUserTenantDao;
+import com.ym.mec.biz.dal.entity.SysUserTenant;
+import com.ym.mec.biz.dal.vo.SysUserTenantVo;
+import com.ym.mec.biz.service.SysUserTenantService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 平台用户与机构关系表(SysUserTenant)表服务实现类
+ *
+ * @author hgw
+ * @since 2022-03-02 11:09:34
+ */
+@Service("sysUserTenantService")
+public class SysUserTenantServiceImpl extends ServiceImpl<SysUserTenantDao, SysUserTenant> implements SysUserTenantService {
+
+    private final static Logger log = LoggerFactory.getLogger(SysUserTenantServiceImpl.class);
+
+    @Override
+    public SysUserTenantDao getDao() {
+        return this.baseMapper;
+    }
+
+    @Override
+    public List<SysUserTenantVo> queryUserTenant(Integer userId) {
+        return baseMapper.queryUserTenant(userId);
+    }
+
+    /**
+     * 根据用户id删除用户与机构关系
+     *
+     * @param userId 用户id
+     */
+    @Override
+    public void deleteByUserId(Integer userId) {
+        baseMapper.delete(new QueryWrapper<SysUserTenant>().eq("user_id_", userId));
+    }
+
+}
+

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

@@ -18,6 +18,7 @@ import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.TenantContractRecord.TenantContractRecordEnum;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.vo.PlatformServePageVo;
+import com.ym.mec.biz.dal.vo.SysUserTenantVo;
 import com.ym.mec.biz.dal.vo.TenantInfoPageVo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
@@ -119,6 +120,8 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
     private TenantContractRecordService tenantContractRecordService;
     @Autowired
     private TenantContractTemplateDao tenantContractTemplateDao;
+    @Autowired
+    private SysUserTenantService sysUserTenantService;
 
     @Value("${contract.baseDir:/var/pdf}")
     private String contractBaseDir;
@@ -182,6 +185,12 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
             preJoin.setState(1);
             tenantPreJoinService.updateById(preJoin);
         }
+        //添加人员机构关联关系
+        SysUserTenant userTenant = new SysUserTenant();
+        userTenant.setUserId(userId);
+        userTenant.setTenantId(tenantId);
+        userTenant.setCreatedTime(new Date());
+        sysUserTenantService.save(userTenant);
         //释放
         bucket.delete();
     }
@@ -514,6 +523,20 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
      */
     @Override
     public PageInfo<TenantInfoPageVo> queryPage(Map<String, Object> param) {
+        //获取当前登录用户
+        SysUser user = getUser();
+        if (Objects.nonNull(user.getIsSuperAdmin()) && user.getTenantId() == -1) {
+            //不是超级管理员 但是 是平台账号,则需要查询自己关联的机构有哪些
+            if (!user.getIsSuperAdmin()) {
+                List<SysUserTenantVo> sysUserTenantVos = sysUserTenantService.queryUserTenant(user.getId());
+                if (CollectionUtils.isNotEmpty(sysUserTenantVos)) {
+                    List<Integer> tenantIds = sysUserTenantVos.stream().map(SysUserTenantVo::getTenantId).collect(Collectors.toList());
+                    param.put("tenantIds", tenantIds);
+                } else {
+                    throw new BizException("您的账号暂无机构权限,请联系平台管理员配置");
+                }
+            }
+        }
         Page<TenantInfoPageVo> pageInfo = PageUtil.getPageInfo(param);
         pageInfo.setAsc("a.id_");
         return PageUtil.pageInfo(baseMapper.queryPage(pageInfo, param));
@@ -978,11 +1001,17 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
 
     private Integer getUserId() {
         //修改机构基础信息
-        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+        return Optional.ofNullable(getUser())
                 .map(SysUser::getId)
                 .orElseThrow(() -> new BizException("用户信息获取失败,请刷新页面或者重新登录!"));
     }
 
+    private SysUser getUser() {
+        //修改机构基础信息
+        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+                .orElseThrow(() -> new BizException("用户信息获取失败,请刷新页面或者重新登录!"));
+    }
+
     private void checkTsign(String code) {
         //校验营业信息
         SysUserTsign sysUserTsign = sysUserTsignService.queryByCardNo(code);

+ 12 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -36,6 +36,11 @@
 		<result column="course_status_" property="courseStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="course_start_time_" property="courseStartTime"/>
 	</resultMap>
+	
+	<resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
+		<result column="key_" property="key" />
+		<result column="value_" property="value" />
+	</resultMap>
 
 	<!-- 根据主键查询一条记录 -->
 	<select id="get" resultMap="CourseScheduleStudentPayment" >
@@ -874,4 +879,11 @@
 		LEFT JOIN sys_user su ON su.id_ = cs.actual_teacher_id_
 		WHERE cssp.user_id_ = c.user_id_ AND CONCAT(cs.class_date_,' ',cs.start_class_time_) = c.class_date_ AND cssp.group_type_ = #{groupType}
 	</select>
+	
+	<select id="queryUserMusicGroupCourseNumByClassTime" resultMap="Mapper" parameterType="map">
+		select cssp.music_group_id_ key_,count(cssp.id_) value_ from course_schedule_student_payment cssp left join course_schedule cs on cssp.course_schedule_id_ = cs.id_
+		where cssp.group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} and find_in_set(cssp.music_group_id_ , #{musicGroupIds}) and cssp.user_id_ = #{userId}
+		and cs.class_date_ between #{startDate} and #{endDate}
+		group by cssp.music_group_id_
+	</select>
 </mapper>

+ 11 - 4
mec-biz/src/main/resources/config/mybatis/HfMemberMapper.xml

@@ -26,6 +26,7 @@
         <result column="route_organ_id_" property="routeOrganId"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
+        <result column="organ_id_" property="organId"/>
 		<result column="tenant_id_" property="tenantId" />
     </resultMap>
     <sql id="Base_Column_List">
@@ -34,7 +35,7 @@
         business_scope_, legal_person_, legal_cert_id_, legal_cert_id_expires_, legal_mp_,
         address_, zip_code_, card_no_,
         bank_code_,settle_account_id_,status_,month_max_receipt_,route_member_id_,route_organ_id_, create_time_,
-        update_time_,tenant_id_
+        update_time_,tenant_id_,organ_id_
     </sql>
     <select id="get" parameterType="java.lang.Integer" resultMap="hfMember">
         <!--@mbg.generated-->
@@ -56,13 +57,13 @@
         business_scope_, legal_person_, legal_cert_id_,
         legal_cert_id_expires_, legal_mp_, address_,
         zip_code_, card_no_, bank_code_,status_,
-        create_time_, update_time_,tenant_id_)
+        create_time_, update_time_,organ_id_,tenant_id_)
         values (#{name}, #{memberId}, #{provCode},
         #{areaCode}, #{socialCreditCode}, #{socialCreditCodeExpires},
         #{businessScope}, #{legalPerson}, #{legalCertId},
         #{legalCertIdExpires}, #{legalMp}, #{address},
         #{zipCode}, #{cardNo}, #{bankCode},#{status},
-        #{createTime}, #{updateTime},#{tenantId})
+        #{createTime}, #{updateTime},#{organId},#{tenantId})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.HfMember">
         <!--@mbg.generated-->
@@ -137,8 +138,11 @@
             <if test="updateTime != null">
                 update_time_ = #{updateTime},
             </if>
+            <if test="organId != null">
+                organ_id_ = #{organId},
+            </if>
         </set>
-        where id_ = #{id,jdbcType=INTEGER} and tenant_id_ = #{tennatId}
+        where id_ = #{id,jdbcType=INTEGER} and tenant_id_ = #{tenantId}
     </update>
 
     <!-- 分页查询 -->
@@ -161,6 +165,9 @@
             <if test="status != null">
                 AND status_ = #{status}
             </if>
+            <if test="organId != null">
+                AND organ_id_ = #{organId}
+            </if>
         </where>
     </sql>
 

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

@@ -69,6 +69,9 @@
                 OR a.`room_title_` LIKE CONCAT('%', #{param.search},'%')
                 )
             </if>
+            <if test="param.tenantId != null ">
+                AND a.tenant_id_ = #{param.tenantId}
+            </if>
             <if test="param.roomUid != null">
                 and a.room_uid_ = #{param.roomUid}
             </if>

+ 18 - 10
mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMemberMapper.xml

@@ -25,18 +25,26 @@
     </insert>
 
     <select id="queryMemberPage" resultType="com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomMemberVo">
-        select
-            a.user_id_ as studentId,
-            su.username_ as studentName,
-            su.phone_ as phone,
-            b.name_ as subName,
-            a.join_time_ as joinTime,
-            a.total_time_ as totalViewTime
+        select i.room_uid_ as roomUid,
+        i.room_title_ as roomTitle,
+        a.user_id_ as studentId,
+        su.username_ as studentName,
+        su.phone_ as phone,
+        b.name_ as subName,
+        a.join_time_ as joinTime,
+        a.total_time_ as totalViewTime
         from im_live_broadcast_room_member as a
-                 left join sys_user as su on su.id_ = a.user_id_
-                 left join student st on su.id_ = st.user_id_
-                 left join subject as b on st.subject_id_list_ = b.id_
+        left join im_live_broadcast_room as i on a.room_uid_ = i.room_uid_
+        left join sys_user as su on su.id_ = a.user_id_
+        left join student st on su.id_ = st.user_id_
+        left join subject as b on st.subject_id_list_ = b.id_
         where a.room_uid_ = #{param.roomUid}
+        <if test="param.search != null ">
+            AND (
+            a.room_uid_ LIKE CONCAT('%', #{param.search},'%')
+            OR i.room_title_ LIKE CONCAT('%', #{param.search},'%')
+            )
+        </if>
     </select>
 
 </mapper>

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

@@ -18,6 +18,10 @@
         <result column="linkman_" property="linkman"/>
         <result column="mobile_" property="mobile"/>
         <result column="address_" property="address"/>
+        <result column="corporate_name_" property="corporateName"/>
+        <result column="corporate_code_" property="corporateCode"/>
+        <result column="corporate_seal_" property="corporateSeal"/>
+        <result column="corporate_financial_seal_" property="corporateFinancialSeal"/>
         <result column="tenant_id_" property="tenantId"/>
         <result column="grade_type_" property="gradeType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
@@ -36,9 +40,9 @@
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.Organization" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
         INSERT INTO organization (id_,name_,area_id_,create_time_,update_time_,
-                                  register_date_,linkman_,mobile_,address_,grade_type_,tenant_id_)
+                                  register_date_,linkman_,mobile_,address_,grade_type_,tenant_id_,corporate_name_,corporate_code_,corporate_seal_,corporate_financial_seal_)
         VALUES(#{id},#{name},#{areaId},now(),now(),#{registerDate},#{linkman},#{mobile},#{address},
-               #{gradeType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{tenantId})
+               #{gradeType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{tenantId},#{corporateName},#{corporateCode},#{corporateSeal},#{corporateFinancialSeal})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -69,6 +73,18 @@
             <if test="address != null">
                 address_ = #{address},
             </if>
+            <if test="corporateName != null">
+                corporate_name_ = #{corporateName},
+            </if>
+            <if test="corporateCode != null">
+                corporate_code_ = #{corporateCode},
+            </if>
+            <if test="corporateSeal != null">
+                corporate_seal_ = #{corporateSeal},
+            </if>
+            <if test="corporateFinancialSeal != null">
+                corporate_financial_seal_ = #{corporateFinancialSeal},
+            </if>
             <if test="gradeType != null">
                 grade_type_ = #{gradeType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>

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

@@ -536,7 +536,7 @@
 
 	<sql id="queryTeacherServeInfoCondition">
 		<where>
-			sees.tenant_id_ = #{tenantId}
+			sees.tenant_id_ = #{tenantId} AND tea.job_nature_= 'FULL_TIME'
 			<if test="organIds != null and organIds.size()>0">
 				AND tea.organ_id_ IN
 				<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
@@ -558,9 +558,9 @@
 			<if test="operatorId!=null">
 				AND EXISTS (SELECT id_ FROM teacher_remind WHERE operator_id_=#{operatorId} AND teacher_id_=sees.teacher_id_ AND monday_ = sees.monday_ AND type_='SERVICE')
 			</if>
-			<if test="jobNature!=null">
+			<!-- <if test="jobNature!=null">
 				AND tea.job_nature_=#{jobNature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-			</if>
+			</if> -->
 		</where>
 	</sql>
 

+ 37 - 0
mec-biz/src/main/resources/config/mybatis/SysUserTenantMapper.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ym.mec.biz.dal.dao.SysUserTenantDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.SysUserTenant">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="user_id_" jdbcType="INTEGER" property="userId"/>
+        <result column="tenant_id_" jdbcType="INTEGER" property="tenantId"/>
+        <result column="created_by_" jdbcType="INTEGER" property="createdBy"/>
+        <result column="created_time_" jdbcType="TIMESTAMP" property="createdTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_
+        , user_id_, tenant_id_, created_by_, created_time_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.ym.mec.biz.dal.entity.SysUserTenant">
+        insert into sys_user_tenant(user_id_, tenant_id_, created_by_, created_time_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.userId}, #{entity.tenantId}, #{entity.createdBy}, #{entity.createdTime})
+        </foreach>
+    </insert>
+
+    <select id="queryUserTenant" resultType="com.ym.mec.biz.dal.vo.SysUserTenantVo">
+        select
+            a.id_ as id,
+            a.user_id_ as userId,
+            b.id_ as tenantId,
+            b.name_ as tenantName
+        from sys_user_tenant as a
+                 left join tenant_info as b on a.tenant_id_ = b.id_
+        where a.user_id_ = #{userId}
+    </select>
+
+</mapper>

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

@@ -116,6 +116,12 @@
                 OR a.`phone_` LIKE CONCAT('%', #{param.search},'%')
                 )
             </if>
+            <if test="param.tenantIds != null ">
+                AND a.id_ in
+                <foreach collection="param.tenantIds" item="tenantId" open="(" close=")" separator=",">
+                    #{tenantId}
+                </foreach>
+            </if>
             <if test="param.tenantId != null ">
                 AND a.`id_` = #{param.tenantId}
             </if>

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

@@ -47,6 +47,7 @@ public class LiveRoomController {
     @ApiOperation("录制结果回调")
     @RequestMapping(value = "/recordSync")
     public void recordSync(@RequestBody String body){
+        log.info("recordSync body:{}",body);
         RecordNotify recordNotify = JSONObject.parseObject(body, RecordNotify.class);
         liveRoomService.recordSync(recordNotify);
     }

+ 42 - 7
mec-im/src/main/java/com/ym/pojo/RecordNotifyOutput.java

@@ -10,13 +10,48 @@ public class RecordNotifyOutput {
     Long audioSample;
     //视频分辨率,如 640x480
     String videoResoulation;
+    //切片生成的录制文件大小
+    Integer fileSize;
+    //已上传到的第三方存储的 URL
+    String fileUrl;
 
-    @Override
-    public String toString() {
-        return "RecordNotifyOutput{" +
-                "fileName='" + fileName + '\'' +
-                ", audioSample=" + audioSample +
-                ", videoResoulation='" + videoResoulation + '\'' +
-                '}';
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public Long getAudioSample() {
+        return audioSample;
+    }
+
+    public void setAudioSample(Long audioSample) {
+        this.audioSample = audioSample;
+    }
+
+    public String getVideoResoulation() {
+        return videoResoulation;
+    }
+
+    public void setVideoResoulation(String videoResoulation) {
+        this.videoResoulation = videoResoulation;
+    }
+
+    public Integer getFileSize() {
+        return fileSize;
+    }
+
+    public void setFileSize(Integer fileSize) {
+        this.fileSize = fileSize;
+    }
+
+    public String getFileUrl() {
+        return fileUrl;
+    }
+
+    public void setFileUrl(String fileUrl) {
+        this.fileUrl = fileUrl;
     }
 }

+ 8 - 2
mec-im/src/main/java/com/ym/service/Impl/LiveRoomServiceImpl.java

@@ -130,7 +130,6 @@ public class LiveRoomServiceImpl implements LiveRoomService {
         String body = paramJson.toJSONString();
         HttpURLConnection conn = httpHelper.createIMRtcPostHttpConnection("/rtc/record/stop.json", "application/json",roomId);
         httpHelper.setBodyParameter(body, conn);
-        httpHelper.returnResult(conn, body);
         RBucket<String> bucket = redissonClient.getBucket("sessionId:" + roomId);
         bucket.delete();
         log.info("结束录制直播 roomId :{},{}",roomId,httpHelper.returnResult(conn, body));
@@ -138,7 +137,14 @@ public class LiveRoomServiceImpl implements LiveRoomService {
 
     @Override
     public void recordSync(RecordNotify recordNotify) {
-        log.info("recordSync recordNotify:{}",recordNotify);
+        if(recordNotify.getCode().equals(200)){
+            if(recordNotify.getType() != null && recordNotify.getType() == 4){
+                // TODO 云端录制文件地址
+                String fileUrl = recordNotify.getOutput().getFileUrl();
+                String roomId = recordNotify.getRoomId();
+
+            }
+        }
     }
 
     public String getRoomSessionId(String roomId){

+ 17 - 34
mec-student/src/main/java/com/ym/mec/student/controller/ContractsController.java

@@ -1,28 +1,29 @@
 package com.ym.mec.student.controller;
 
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.stream.Collectors;
-
-import com.ym.mec.biz.dal.entity.SysUserContracts;
-import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
-import com.ym.mec.biz.service.SysUserContractsService;
-import com.ym.mec.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
+import java.math.BigDecimal;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.SysUserContracts;
+import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 import com.ym.mec.biz.service.ContractService;
+import com.ym.mec.biz.service.SysUserContractsService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
 
 @RequestMapping("contracts")
 @Api(tags = "协议服务")
@@ -101,22 +102,9 @@ public class ContractsController extends BaseController {
 		return succeed(contractService.queryProductContract(userId,musicGroupId, courseViewType));
 	}
 
-	@ApiOperation(value = "生成学生课程协议")
-	@GetMapping("/transferProduceContractOnlyWithCourseList")
-	public HttpResponseResult transferProduceContractOnlyWithCourseList(Integer userId){
-		if(Objects.isNull(userId)){
-			SysUser sysUser = sysUserFeignService.queryUserInfo();
-			if (sysUser == null) {
-				return failed("获取用户信息失败");
-			}
-			userId = sysUser.getId();
-		}
-		return contractService.transferProduceContractOnlyWithCourseList(userId);
-	}
-
 	@ApiOperation(value = "查询学生最新协议")
 	@GetMapping("/getLatest")
-	public HttpResponseResult<List<SysUserContracts>> getLatest(Integer userId) {
+	public HttpResponseResult<SysUserContracts> getLatest(Integer userId) {
 		if(Objects.isNull(userId)){
 			SysUser sysUser = sysUserFeignService.queryUserInfo();
 			if (sysUser == null) {
@@ -126,18 +114,13 @@ public class ContractsController extends BaseController {
 		}
 		List<SysUserContracts> sysUserContracts = sysUserContractsService.getUserAllContracts(userId);
 
-		if(CollectionUtils.isEmpty(sysUserContracts)){
-			return succeed(Collections.EMPTY_LIST);
+		if(sysUserContracts == null || sysUserContracts.size() == 0){
+			return succeed();
 		}
+		
+		sysUserContracts = sysUserContracts.stream().sorted(Comparator.comparing(SysUserContracts::getCreateTime).reversed()).collect(Collectors.toList());
 
-		Map<Integer, List<SysUserContracts>> versionContractMap = sysUserContracts.stream().collect(Collectors.groupingBy(SysUserContracts::getVersion));
-
-		List<SysUserContracts> result = new ArrayList<>();
-		for (Map.Entry<Integer, List<SysUserContracts>> versionContractMapEntry : versionContractMap.entrySet()) {
-			versionContractMapEntry.getValue().sort(Comparator.comparing(SysUserContracts::getCreateTime).reversed());
-			result.add(versionContractMapEntry.getValue().get(0));
-		}
 
-		return succeed(result);
+		return succeed(sysUserContracts.get(0));
 	}
 }

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

@@ -145,11 +145,9 @@ public class ImLiveBroadcastRoomController extends BaseController {
         return succeed();
     }
 
-
     @GetMapping("/test")
-    public HttpResponseResult test() {
-        imLiveBroadcastRoomService.test();
-        return succeed();
+    public HttpResponseResult test(String roomUid, Integer userId) {
+        return succeed(imLiveBroadcastRoomService.test(roomUid, userId));
     }
 
     @GetMapping("/shareGroup")

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

@@ -71,7 +71,7 @@ public class OrganizationController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('organization/update')")
     public Object update(Organization organization){
         organization.setUpdateTime(new Date());
-        return succeed(organizationService.update(organization));
+        return succeed(organizationService.updateBasicInfo(organization));
     }
 
     @ApiOperation(value = "根据分部编号查询分部详情")

+ 29 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SysUserTenantController.java

@@ -0,0 +1,29 @@
+package com.ym.mec.web.controller;
+
+
+import com.ym.mec.biz.dal.entity.SysUserTenant;
+import com.ym.mec.biz.service.SysUserTenantService;
+import org.springframework.web.bind.annotation.*;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+
+import javax.annotation.Resource;
+
+/**
+ * 平台用户与机构关系表(SysUserTenant)表控制层
+ *
+ * @author hgw
+ * @since 2022-03-02 11:09:33
+ */
+@Api(tags = "平台用户与机构关系表")
+@RestController
+@RequestMapping("/sysUserTenant")
+public class SysUserTenantController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private SysUserTenantService sysUserTenantService;
+
+}
+