zouxuan 3 лет назад
Родитель
Сommit
c6b1228a46

+ 10 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentOperatingVisitDao.java

@@ -4,9 +4,9 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.StudentOperatingVisit;
 import org.apache.ibatis.annotations.Param;
 
-public interface StudentOperatingVisitDao extends BaseDAO<Long, StudentOperatingVisit> {
-
+import java.util.List;
 
+public interface StudentOperatingVisitDao extends BaseDAO<Long, StudentOperatingVisit> {
     /**
     * @description: 更新本月回访标记
      * @param studentId
@@ -15,4 +15,12 @@ public interface StudentOperatingVisitDao extends BaseDAO<Long, StudentOperating
     * @date 2022/8/12 16:26
     */
     void updateVisit(@Param("studentId") Integer studentId);
+
+    void deleteByUserId(@Param("userIds") List<Integer> userIds, @Param("month") String month);
+
+    void batchAdd(@Param("userIds") List<Integer> userIds, @Param("month") String month);
+
+    List<Integer> queryUserIds(@Param("month") String month);
+
+    List<StudentOperatingVisit> sumVisit(@Param("month") String month);
 }

+ 67 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportOperatingVisitDto.java

@@ -0,0 +1,67 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Objects;
+
+public class ExportOperatingVisitDto {
+
+    @ApiModelProperty(value = "分部", required = true)
+    private String organName;
+
+    @ApiModelProperty(value = "预计回访人数", required = true)
+    private Integer expectVisitNum;
+
+    @ApiModelProperty(value = "回访人数", required = true)
+    private Integer visitNum;
+
+    @ApiModelProperty(value = "覆盖率", required = true)
+    private String coverRate;
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public Integer getExpectVisitNum() {
+        return expectVisitNum;
+    }
+
+    public void setExpectVisitNum(Integer expectVisitNum) {
+        this.expectVisitNum = expectVisitNum;
+        calcCoverRate(visitNum);
+    }
+
+    public Integer getVisitNum() {
+        return visitNum;
+    }
+
+    public void setVisitNum(Integer visitNum) {
+        this.visitNum = visitNum;
+        calcCoverRate(expectVisitNum);
+    }
+
+    public String getCoverRate() {
+        return coverRate;
+    }
+
+    public void setCoverRate(String coverRate) {
+        this.coverRate = coverRate;
+    }
+
+    private void calcCoverRate(Integer param){
+        if(Objects.nonNull(param)){
+            if(visitNum.equals(0) || expectVisitNum.equals(0)){
+                this.coverRate = "0%";
+            }else {
+                this.coverRate = new BigDecimal(visitNum).divide(new BigDecimal(expectVisitNum),BigDecimal.ROUND_HALF_UP,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).setScale(BigDecimal.ROUND_CEILING) + "%";
+            }
+        }
+    }
+}

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java

@@ -77,6 +77,7 @@ public enum ExportEnum implements BaseEnum<String, ExportEnum> {
     EXPORT_STUDENT_SUBCOURSE("EXPORT_STUDENT_SUBCOURSE", "活动资格导出"),
     EXPORT_STUDENT_SERVE_INFO("EXPORT_STUDENT_SERVE_INFO", "乐团学生服务指标导出"),
     EXPORT_TRAINING_STATISTICS("EXPORT_TRAINING_STATISTICS", "训练统计导出"),
+    EXPORT_OPERATING_VISIT_STATISTICS("EXPORT_OPERATING_VISIT_STATISTICS", "回访统计导出"),
     ;
 
     private String code;

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

@@ -181,6 +181,8 @@ public class ExportServiceImpl implements ExportService {
     private ActivityUserMapperService activityUserMapperService;
     @Autowired
     private SysMusicCompareRecordDao sysMusicCompareRecordDao;
+    @Autowired
+    private StudentOperatingVisitDao studentOperatingVisitDao;
 
     private static final ExecutorService exportExecutorService = Executors.newFixedThreadPool(10);
     @Autowired
@@ -345,6 +347,7 @@ public class ExportServiceImpl implements ExportService {
         exportFuncMap.put(ExportEnum.EXERCISES_SITUATION, info -> studentExtracurricularExercisesSituationService.queryTeacherPerformanceIndicator(getQueryInfo(info, TeacherServeQueryInfo.class, false)));
         exportFuncMap.put(ExportEnum.STUDENT_INSTRUMENT, info -> exportStudentInstrument(info));
         exportFuncMap.put(ExportEnum.EXPORT_BILL, info -> exportBill(info));
+        exportFuncMap.put(ExportEnum.EXPORT_OPERATING_VISIT_STATISTICS, info -> exportOperatorVisit(info));
 
 
         //导出到报表中心
@@ -367,6 +370,16 @@ public class ExportServiceImpl implements ExportService {
     }
 
 
+    //导出回访统计
+    private List<StudentOperatingVisit> exportOperatorVisit(Map<String, Object> info){
+        String month = getParam(info, "month", String.class);
+        if(StringUtils.isEmpty(month)){
+            throw new BizException("请选择导出时间");
+        }
+        return studentOperatingVisitDao.sumVisit(month);
+    }
+
+
     //导出对账单
     @Override
     public List exportBill(Map<String, Object> info) {
@@ -1478,6 +1491,7 @@ public class ExportServiceImpl implements ExportService {
         }
     }
 
+
     //导出训练统计
     private HttpResponseResult exportCompareRecord(Map<String, Object> info){
         ExportCompareQueryInfo queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), ExportCompareQueryInfo.class);

+ 17 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -22,6 +22,7 @@ import java.util.stream.Collectors;
 
 import javax.annotation.PostConstruct;
 
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.*;
@@ -35,22 +36,6 @@ import org.springframework.util.CollectionUtils;
 
 import com.alibaba.fastjson.JSONArray;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.CloudTeacherDao;
-import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.ym.mec.biz.dal.dao.EmployeeDao;
-import com.ym.mec.biz.dal.dao.IndexBaseMonthDataDao;
-import com.ym.mec.biz.dal.dao.MemberRankSettingDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.OrganizationDao;
-import com.ym.mec.biz.dal.dao.PracticeGroupDao;
-import com.ym.mec.biz.dal.dao.StudentDao;
-import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
-import com.ym.mec.biz.dal.dao.StudentStatisticsDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dao.SysMusicCompareRecordDao;
-import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
@@ -117,6 +102,8 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     private SysUserCashAccountDao sysUserCashAccountDao;
     @Autowired
     private ImFeignService imFeignService;
+    @Autowired
+    private StudentOperatingVisitDao studentOperatingVisitDao;
 
     @Override
     public BaseDAO<Integer, Student> getDAO() {
@@ -271,6 +258,20 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
 
         if (updateStudentList.size() > 0) {
             studentDao.batchUpdate(updateStudentList);
+            String month = DateUtil.format(new Date(), DateUtil.ISO_YEAR_MONTH_FORMAT);
+            List<Integer> operatingUserIds0 = updateStudentList.stream().filter(e -> e.getOperatingTag().equals(0)).map(e -> e.getUserId()).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(operatingUserIds0)){
+                studentOperatingVisitDao.deleteByUserId(operatingUserIds0,month);
+            }
+            List<Integer> operatingUserIds = updateStudentList.stream().filter(e -> e.getOperatingTag().equals(1)).map(e -> e.getUserId()).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(operatingUserIds)){
+                List<Integer> userIds = studentOperatingVisitDao.queryUserIds(month);
+                operatingUserIds.removeAll(userIds);
+                if(!CollectionUtils.isEmpty(operatingUserIds)){
+                    //需要新增的用户
+                    studentOperatingVisitDao.batchAdd(operatingUserIds,month);
+                }
+            }
         }
 
         return true;

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

@@ -88,8 +88,8 @@ public class StudentVisitServiceImpl extends BaseServiceImpl<Integer, StudentVis
             }
         }
         studentVisitDao.insert(studentVisit);
-        //更新学员回访数据
-//        studentOperatingVisitDao.updateVisit(studentVisit.getStudentId());
+        //更新学员回访统计数据
+        studentOperatingVisitDao.updateVisit(studentVisit.getStudentId());
         return studentVisit;
     }
 

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

@@ -236,7 +236,7 @@
     </sql>
 
     <select id="queryByOperatingTempTag" resultMap="Student">
-        SELECT *
+        SELECT operating_temp_tag_,operating_tag_,user_id_
         FROM student
         WHERE operating_temp_tag_ = #{operatingTempTag}
     </select>

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

@@ -28,7 +28,18 @@
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentOperatingVisit" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO student_operating_visit (user_id_,month_,visit_flag_,organ_id_) VALUES(#{userId},#{month},#{visitFlag},#{organId})
 	</insert>
-	
+	<insert id="batchAdd">
+		INSERT INTO student_operating_visit (user_id_,month_,visit_flag_,organ_id_)
+		select su.id_,#{month},CASE WHEN sv.student_id_ IS NULL THEN 0 ELSE 1 END visit_flag_,su.organ_id_
+		from sys_user su
+		left join student_visit sv ON sv.student_id_ = su.id_ AND DATE_FORMAT(sv.visit_time_,'%Y-%m') = #{month}
+		where su.id_ IN
+		<foreach collection="userIds" item="studentId" open="(" separator="," close=")">
+			#{studentId}
+		</foreach>
+		group by su.id_
+	</insert>
+
 	<!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentOperatingVisit">
 		UPDATE student_operating_visit <set>
@@ -51,11 +62,17 @@ month_ = #{month},
 		where user_id_ = #{studentId} and visit_flag_ = 0 and month_ = DATE_FORMAT(NOW(),'%Y-%m-%d');
 	</update>
 
-    <!-- 根据主键删除一条记录 -->
+	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
 		DELETE FROM student_operating_visit WHERE id_ = #{id} 
 	</delete>
-	
+	<delete id="deleteByUserId">
+		DELETE FROM student_operating_visit WHERE user_id_ NOT IN
+		<foreach collection="userIds" item="item" open="(" separator="," close=")">
+			#{item}
+		</foreach>
+	</delete>
+
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="StudentOperatingVisit" parameterType="map">
 		SELECT * FROM student_operating_visit ORDER BY id_ <include refid="global.limit"/>
@@ -65,4 +82,19 @@ month_ = #{month},
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(*) FROM student_operating_visit
 	</select>
+	<select id="queryUserIds" resultType="java.lang.Integer">
+		SELECT DISTINCT user_id_ FROM student_operating_visit WHERE month_ = #{month}
+	</select>
+	<resultMap id="ExportOperatingVisitDto" type="com.ym.mec.biz.dal.dto.ExportOperatingVisitDto">
+		<result property="organName" column="organ_name_" />
+		<result property="expectVisitNum" column="expect_visit_num_" />
+		<result property="visitNum" column="visit_num_" />
+	</resultMap>
+	<select id="sumVisit" resultMap="ExportOperatingVisitDto">
+		SELECT o.name_ organ_name_,count(sov.user_id_) expect_visit_num_,COUNT(CASE WHEN sov.visit_flag_ = 1 THEN 1 ELSE NULL END) visit_num_
+		FROM student_operating_visit sov
+		left join organization o on sov.organ_id_ = o.id_
+		WHERE sov.month_ = #{month}
+		group by sov.organ_id_
+	</select>
 </mapper>

+ 5 - 1
mec-web/src/main/resources/exportColumnMapper.ini

@@ -292,4 +292,8 @@ fieldColumns = ["userId","username","musicGroupName","organName","servePeriod",
 
 [训练统计导出]
 headColumns = ["分部", "学员编号", "学员姓名", "手机号", "训练时长(分)", "训练次数", "训练天数", "评测次数"]
-fieldColumns = ["organName", "userId", "username","phone", "playTime", "playNum", "playDays","heardNum"]
+fieldColumns = ["organName", "userId", "username","phone", "playTime", "playNum", "playDays","heardNum"]
+
+[回访统计导出]
+headColumns = ["分部", "预计回访人数", "实际回访人数", "覆盖率"]
+fieldColumns = ["organName","expectVisitNum","visitNum","coverRate"]