Bladeren bron

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

zouxuan 5 jaren geleden
bovenliggende
commit
a12784eeef

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleReviewDao.java

@@ -50,4 +50,13 @@ public interface CourseScheduleReviewDao extends BaseDAO<Integer, CourseSchedule
      */
     CourseScheduleReview findByCourseScheduleAndStudent(@Param("courseScheduleId") Long courseScheduleId,
                                                     @Param("studentId") Integer studentId);
+
+    /**
+     * @describe 获取课程的评价
+     * @author Joburgess
+     * @date 2020/3/13
+     * @param courseScheduleIds:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleReview>
+     */
+    List<CourseScheduleReview> findByCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ReviewInfoDto.java

@@ -8,7 +8,7 @@ public class ReviewInfoDto {
     @ApiModelProperty(value = "课程信息",required = false)
     private TeacherClassHeadInfo teacherClassHeadInfo;
 
-    @ApiModelProperty(value = "评价信息",required = false)
+    @ApiModelProperty(value = "老师评价信息",required = false)
     private CourseScheduleReview courseScheduleReview;
 
     public TeacherClassHeadInfo getTeacherClassHeadInfo() {

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherClassHeadInfo.java

@@ -46,6 +46,9 @@ public class TeacherClassHeadInfo {
     @ApiModelProperty(value = "下课时间",required = false)
     private String endClassTime;
 
+    @ApiModelProperty(value = "班级名称",required = false)
+    private String classGroupName;
+
 
     public Integer getTotalClassTimes() {
         return totalClassTimes;
@@ -142,4 +145,12 @@ public class TeacherClassHeadInfo {
     public void setClassDate(String classDate) {
         this.classDate = classDate;
     }
+
+    public String getClassGroupName() {
+        return classGroupName;
+    }
+
+    public void setClassGroupName(String classGroupName) {
+        this.classGroupName = classGroupName;
+    }
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseHomeworkQueryInfo.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.page;
 
+import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -17,12 +18,23 @@ public class CourseHomeworkQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "乐团ID",required = false)
     private Long musicGroupId;
 
+    @ApiModelProperty(value = "课程组类型", required = false)
+    private GroupType groupType;
+
     @ApiModelProperty(value = "班级ID",required = false)
     private Long classGroupId;
 
     @ApiModelProperty(value = "用户ID",required = false)
     private Long userId;
 
+    public GroupType getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(GroupType groupType) {
+        this.groupType = groupType;
+    }
+
     public Date getCreateTime() {
         return createTime;
     }

+ 6 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java

@@ -206,12 +206,7 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
         }
         CourseHomework homework = courseHomeworkDao.findByCourseSchedule(courseScheduleReview.getCourseScheduleId().longValue());
         courseScheduleReview.setHomeWork(homework.getContent());
-        CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleReview.getCourseScheduleId().longValue());
-
-        TeacherClassHeadInfo teacherClassGroupInfo = classGroupService.findTeacherClassGroupInfo(courseScheduleReview.getClassGroupId().longValue());
-        teacherClassGroupInfo.setClassDate(courseSchedule.getClassDate().toString());
-        teacherClassGroupInfo.setStartClassTime(courseSchedule.getStartClassTime().toString());
-        teacherClassGroupInfo.setEndClassTime(courseSchedule.getEndClassTime().toString());
+        TeacherClassHeadInfo teacherClassGroupInfo = getCourseInfoHead(courseScheduleReview.getCourseScheduleId());
 
         ReviewInfoDto reviewInfoDto = new ReviewInfoDto();
         reviewInfoDto.setCourseScheduleReview(courseScheduleReview);
@@ -222,10 +217,12 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
     @Override
     public TeacherClassHeadInfo getCourseInfoHead(Integer id) {
         CourseSchedule courseSchedule = courseScheduleDao.get(id.longValue());
+        ClassGroup classGroup = classGroupService.get(courseSchedule.getClassGroupId());
         TeacherClassHeadInfo teacherClassGroupInfo = classGroupService.findTeacherClassGroupInfo(courseSchedule.getClassGroupId().longValue());
-        teacherClassGroupInfo.setClassDate(courseSchedule.getClassDate().toString());
-        teacherClassGroupInfo.setStartClassTime(courseSchedule.getStartClassTime().toString());
-        teacherClassGroupInfo.setEndClassTime(courseSchedule.getEndClassTime().toString());
+        teacherClassGroupInfo.setClassDate(DateUtil.dateToString(courseSchedule.getClassDate(),"yyyy年MM月dd日"));
+        teacherClassGroupInfo.setStartClassTime(DateUtil.dateToString(courseSchedule.getStartClassTime(),"HH:mm"));
+        teacherClassGroupInfo.setEndClassTime(DateUtil.dateToString(courseSchedule.getEndClassTime(),"HH:mm"));
+        teacherClassGroupInfo.setClassGroupName(classGroup.getName());
         return teacherClassGroupInfo;
     }
 

+ 16 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -124,6 +124,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     private GroupDao groupDao;
     @Autowired
     private TeacherDao teacherDao;
+    @Autowired
+	private CourseScheduleReviewDao courseScheduleReviewDao;
 
     private final Logger LOGGER = LoggerFactory
             .getLogger(this.getClass());
@@ -894,7 +896,13 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         List<Map<Long, Integer>> courseLeaveStudentNumMaps = studentAttendanceDao.countCourseLeaveStudentNumWithFourHoursAgo(allCourseScheduleIds, advanceLeaveHours);
         Map<Long,Long> courseLeaveStudentNumMap = MapUtil.convertIntegerMap((courseLeaveStudentNumMaps));
 
-        for (CourseScheduleDto courseScheduleDto : teacherCourseSchedulesWithDate) {
+		List<CourseScheduleReview> AllCourseScheduleReviews = courseScheduleReviewDao.findByCourseSchedules(allCourseScheduleIds);
+		Map<Integer, List<CourseScheduleReview>> idCourseReview=new HashMap<>();
+		if(!CollectionUtils.isEmpty(AllCourseScheduleReviews)){
+			idCourseReview=AllCourseScheduleReviews.stream().collect(Collectors.groupingBy(CourseScheduleReview::getCourseScheduleId));
+		}
+
+		for (CourseScheduleDto courseScheduleDto : teacherCourseSchedulesWithDate) {
             Long studentNum = studentNumCourseMap.get(courseScheduleDto.getId());
             if (Objects.nonNull(studentNum)) {
                 courseScheduleDto.setStudentAttendanceIsFirstTime(studentNum > 0 ? 0 : 1);
@@ -925,7 +933,13 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             if(Objects.nonNull(leaveStudentNum)&&Objects.nonNull(normalStudentNum)&&leaveStudentNum.intValue()==normalStudentNum.intValue()){
                 courseScheduleDto.setEnableAdjustInToday(1);
             }
-        }
+			List<CourseScheduleReview> courseScheduleReviews = idCourseReview.get(courseScheduleDto.getId().intValue());
+            if(!CollectionUtils.isEmpty(courseScheduleReviews)){
+				courseScheduleDto.setComplaintStatus(1);
+			}else{
+            	courseScheduleDto.setComplaintStatus(0);
+			}
+		}
         return teacherCourseSchedulesWithDate;
     }
 

+ 7 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursesGroupServiceImpl.java

@@ -70,13 +70,11 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
     @Autowired
     private SysUserCashAccountDetailService sysUserCashAccountDetailService;
     @Autowired
-    private ContractService contractService;
-    @Autowired
-    private TeacherService teacherService;
-    @Autowired
     private ImFeignService imFeignService;
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+    @Autowired
+    private SysTenantAccountService sysTenantAccountService;
 
     private static final Logger LOGGER = LoggerFactory
             .getLogger(PracticeGroupService.class);
@@ -112,6 +110,10 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
 
         //总课程时长
         Integer totalCourseTime=courseCycleInfo.getCourseCount()*courseCycleInfo.getSingleClassMinutes();
+        SysTenantAccount sysTenantAccount = sysTenantAccountService.get(courseGroup.getTeacherId());
+        if(Objects.isNull(sysTenantAccount)||(sysTenantAccount.getAvailableMinutes()-totalCourseTime)<0){
+            throw new BizException("您的可用课程时长不足");
+        }
 
         Date now=new Date();
         courseGroup.setSingleClassMinutes(courseCycleInfo.getSingleClassMinutes());
@@ -123,7 +125,7 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
             newCourse.setType(CourseSchedule.CourseScheduleType.COMM);
             newCourse.setTeacherId(courseGroup.getTeacherId());
             newCourse.setActualTeacherId(courseGroup.getTeacherId());
-            newCourse.setIsLock(1);
+            newCourse.setIsLock(0);
             newCourse.setStatus(CourseStatusEnum.NOT_START);
             newCourse.setName(courseGroup.getName());
         }

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

@@ -435,8 +435,8 @@
         </where>
     </select>
     <select id="findGroupStudents" resultMap="ClassGroupStudentMapper">
-        SELECT * FROM class_group_student_mapper
-        WHERE
+        SELECT * FROM class_group_student_mapper cgsm
+        <where>
             <if test="groupType!=null">
                 AND cgsm.group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>
@@ -449,5 +449,6 @@
             <if test="status!=null">
                 AND status_=#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>
+        </where>
     </select>
 </mapper>

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

@@ -187,7 +187,7 @@
 			LEFT JOIN course_schedule cs ON ch.course_schedule_id_=cs.id_
 			LEFT JOIN course_schedule_teacher_salary csts ON ch.course_schedule_id_=csts.course_schedule_id_
 			LEFT JOIN class_group cg ON ch.class_group_id_=cg.id_
-			LEFT JOIN music_group mg ON cg.music_group_id_=mg.id_
+			LEFT JOIN music_group mg ON cg.music_group_id_=mg.id_ AND cs.group_type_='MUSIC'
 			WHERE
 			(cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
 			AND csts.user_id_=#{userId}

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

@@ -249,4 +249,10 @@
     <select id="findByCourseScheduleAndStudent" resultMap="CourseScheduleReview">
         SELECT * FROM course_schedule_review WHERE course_schedule_id_=#{courseScheduleId} AND student_id_=#{studentId}
     </select>
+    <select id="findByCourseSchedules" resultMap="CourseScheduleReview">
+        SELECT * FROM course_schedule_review WHERE course_schedule_id_ IN
+        <foreach collection="courseScheduleIds" item="courseScheduleId" separator="," open="(" close=")">
+            #{courseScheduleId}
+        </foreach>
+    </select>
 </mapper>

+ 32 - 33
mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml

@@ -25,7 +25,7 @@
         <result column="group_status_" property="groupStatus"
                 typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="be_renew_group_id_" property="beRenewGroupId"/>
-        <result column="educational_teacher_id_" property="educationalTeacherId" />
+        <result column="educational_teacher_id_" property="educationalTeacherId"/>
     </resultMap>
 
     <resultMap id="PracticeCourseDto" type="com.ym.mec.biz.dal.dto.PracticeCourseDto" extends="PracticeGroup">
@@ -58,28 +58,28 @@
         WHERE id_ = #{practiceGroupId}
     </update>
 
-	<update id="update" parameterType="com.ym.mec.biz.dal.entity.PracticeGroup">
-		UPDATE practice_group
-		<set>
-			<if test="subjectId!=null">
-				subject_id_=#{subjectId},
-			</if>
-			<if test="memo!=null">
-				memo_=#{memo},
-			</if>
-			<if test="name!=null">
-				name_=#{name},
-			</if>
-			<if test="groupStatus!=null">
-				group_status_=#{groupStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-			</if>
-			<if test="educationalTeacherId!=null">
-				educational_teacher_id_=#{educationalTeacherId},
-			</if>
-			update_time_ = NOW()
-		</set>
-		WHERE id_ = #{id}
-	</update>
+    <update id="update" parameterType="com.ym.mec.biz.dal.entity.PracticeGroup">
+        UPDATE practice_group
+        <set>
+            <if test="subjectId!=null">
+                subject_id_=#{subjectId},
+            </if>
+            <if test="memo!=null">
+                memo_=#{memo},
+            </if>
+            <if test="name!=null">
+                name_=#{name},
+            </if>
+            <if test="groupStatus!=null">
+                group_status_=#{groupStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            </if>
+            <if test="educationalTeacherId!=null">
+                educational_teacher_id_=#{educationalTeacherId},
+            </if>
+            update_time_ = NOW()
+        </set>
+        WHERE id_ = #{id}
+    </update>
 
     <update id="batchUpdate">
         <foreach collection="groups" item="group" separator=";">
@@ -116,8 +116,8 @@
         </selectKey>
         -->
         INSERT INTO practice_group
-        (id_,name_,subject_id_,user_id_,student_id_,single_class_minutes_,organ_id_,courses_start_date_,courses_expire_date_,create_time_,update_time_,memo_,buy_months_,drill_times_on_week_,drill_times_json_,group_status_,be_renew_group_id_)
-        VALUES(#{id},#{name},#{subjectId},#{userId},#{studentId},#{singleClassMinutes},#{organId},#{coursesStartDate},#{coursesExpireDate},NOW(),NOW(),#{memo},#{buyMonths},#{drillTimesOnWeek},#{drillTimesJson},#{groupStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{beRenewGroupId})
+        (id_,name_,subject_id_,user_id_,student_id_,single_class_minutes_,organ_id_,courses_start_date_,courses_expire_date_,create_time_,update_time_,memo_,buy_months_,drill_times_on_week_,drill_times_json_,group_status_,be_renew_group_id_,educational_teacher_id_)
+        VALUES(#{id},#{name},#{subjectId},#{userId},#{studentId},#{singleClassMinutes},#{organId},#{coursesStartDate},#{coursesExpireDate},NOW(),NOW(),#{memo},#{buyMonths},#{drillTimesOnWeek},#{drillTimesJson},#{groupStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{beRenewGroupId},#{educationalTeacherId})
     </insert>
 
     <select id="getUserFreePracticeGroup" resultMap="PracticeGroup">
@@ -272,7 +272,7 @@
 
     <sql id="practiceGroupReviewsQueryCondition">
         <where>
-            pg.group_status_ != 'CANCEL' AND pg.group_status_ != 'LOCK'
+            pg.group_status_ != 'LOCK'
             <if test="month != null">
                 AND DATE_FORMAT(cse.create_time_, '%Y-%m') = #{month}
             </if>
@@ -339,7 +339,7 @@
                pg.single_class_minutes_ total_minutes_
         FROM practice_group pg
                  LEFT JOIN class_group cg on pg.id_ = cg.music_group_id_ AND cg.group_type_ = 'PRACTICE'
-        WHERE cg.group_type_ = 'PRACTICE'
+         WHERE pg.group_status_ = 'NORMAL' AND cg.group_type_ = 'PRACTICE'
           AND pg.buy_months_ >= 1
           AND pg.courses_start_date_ <= #{nowDate,jdbcType=DATE}
           AND pg.courses_expire_date_ >= #{afterDate,jdbcType=DATE}
@@ -348,11 +348,9 @@
             AND DATE_FORMAT(pg.courses_expire_date_, '%d') = DATE_FORMAT(#{afterDate}, '%d')
         </if>
         <if test="afterDateIsLastDay == true">
-        <![CDATA[ AND DATE_FORMAT(pg.courses_expire_date_, '%d') >= DATE_FORMAT(#{afterDate}, '%d') ]]>
+            <![CDATA[ AND DATE_FORMAT(pg.courses_expire_date_, '%d') >= DATE_FORMAT(#{afterDate}, '%d') ]]>
         </if>
-          AND cg.del_flag_ = 0
-          AND pg.group_status_ != 'CANCEL'
-          AND pg.group_status_ != 'LOCK'
+        AND cg.del_flag_ = 0
     </select>
 
     <select id="getReportCourseTimes" resultMap="com.ym.mec.biz.dal.dao.ClassGroupDao.ClassGroup">
@@ -366,8 +364,9 @@
     </select>
 
     <select id="findByGroupId" resultMap="PracticeCourseDto">
-        SELECT pg.*,s.name_ subject_name_ FROM practice_group pg
-        LEFT JOIN subject s on pg.subject_id_ = s.id_
+        SELECT pg.*, s.name_ subject_name_
+        FROM practice_group pg
+                 LEFT JOIN subject s on pg.subject_id_ = s.id_
         WHERE pg.id_ = #{id}
     </select>
 </mapper>

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

@@ -143,13 +143,15 @@
     <sql id="queryCondition">
         <where>
             (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
-            AND cg.group_type_ = 'MUSIC'
             <if test="createTime != null">
                 AND DATE_FORMAT(ch.create_time_,"%Y%m%d") = DATE_FORMAT(#{createTime},"%Y%m%d")
             </if>
             <if test="musicGroupId != null">
                 AND cg.music_group_id_ = #{musicGroupId}
             </if>
+            <if test="groupType!=null">
+                AND cg.group_type_= #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
             <if test="classGroupId != null">
                 AND ch.class_group_id_ = #{classGroupId}
             </if>

+ 43 - 0
mec-student/src/main/java/com/ym/mec/student/controller/CourseGroupController.java

@@ -0,0 +1,43 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.CoursesGroupService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/3/8
+ */
+@Api(tags = "对外课程组服务")
+@RequestMapping("courseGroup")
+@RestController
+public class CourseGroupController extends BaseController {
+
+    @Autowired
+    private CoursesGroupService coursesGroupService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+
+    @ApiOperation(value = "购买课程组")
+    @PostMapping("/buyCourseGroup")
+    public HttpResponseResult buyCourseGroup(Long courseGroupId, boolean isUseBalancePayment){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        return coursesGroupService.buyCourseGroup(sysUser.getId(), courseGroupId, isUseBalancePayment);
+    }
+
+}

+ 41 - 0
mec-student/src/main/java/com/ym/mec/student/controller/CourseReviewController.java

@@ -0,0 +1,41 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.page.CourseReviewQueryInfo;
+import com.ym.mec.biz.service.CourseReviewService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.List;
+
+@RequestMapping("courseReview")
+@Api(tags = "课程评价")
+@RestController
+public class CourseReviewController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private CourseReviewService courseReviewService;
+
+
+    @ApiOperation(value = "评论详情")
+    @GetMapping("getReviewInfo")
+    public HttpResponseResult getReviewInfo(int id) {
+        return succeed(courseReviewService.getReviewInfo(id));
+    }
+
+}

+ 1 - 1
mec-student/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.99.212.176: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