Browse Source

实习数据统计

dzx 4 months ago
parent
commit
8ca8dd86d5

+ 91 - 0
src/main/java/com/xjrsoft/module/databoard/controller/DataboardController.java

@@ -11,6 +11,8 @@ import com.xjrsoft.common.enums.StudyStatusEnum;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
 import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.entity.BaseSemester;
+import com.xjrsoft.module.base.service.IBaseSemesterService;
 import com.xjrsoft.module.courseTable.entity.CourseTable;
 import com.xjrsoft.module.courseTable.service.ICourseTableService;
 import com.xjrsoft.module.databoard.dto.StatisticsDetailDto;
@@ -36,6 +38,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -58,6 +62,7 @@ public class DataboardController {
     private final IBaseStudentService studentService;
     private final ITeacherbaseManagerService teacherService;
     private final IWorkflowFormRelationService formRelationService;
+    private final IBaseSemesterService semesterService;
 
     @GetMapping(value = "/process-statistics")
     @ApiOperation(value = "流程统计")
@@ -605,4 +610,90 @@ public class DataboardController {
         return RT.ok(result);
     }
 
+    @GetMapping(value = "/internship-statistics")
+    @ApiOperation(value = "实习统计")
+    @SaCheckPermission("databoard:detail")
+    @XjrLog(value = "实习统计", saveResponseData = true)
+    public RT<InternshipStatisticsVo> internshipStatistics(@Valid StatisticsDetailDto dto) {
+        BaseSemester semester = semesterService.getCurrentSemester();
+
+        InternshipStatisticsVo result = new InternshipStatisticsVo();
+
+        String sql = " SELECT DISTINCT t1.participant_user_id FROM internship_plan_manage_participant t1" +
+                " INNER JOIN internship_plan_manage t2 ON t1.internship_plan_manage_id = t2.id" +
+                " INNER JOIN xjr_user t3 ON t1.participant_user_id = t3.id" +
+                " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND t3.delete_mark = 0" +
+                " and t2.base_semester_id = " + semester.getId();
+
+        List<Map<String, Object>> studentlist = SqlRunnerAdapter.db().selectList(sql);
+
+
+        sql = "SELECT DISTINCT t3.id FROM student_internship_alone_apply t1" +
+            " INNER JOIN xjr_workflow_form_relation t2 ON t1.id = CAST(t2.form_key_value AS SIGNED)" +
+            " INNER JOIN xjr_user t3 ON t3.id = t1.student_user_id" +
+            " INNER JOIN internship_plan_manage t4 ON t1.internship_plan_manage_id = t4.id" +
+            " WHERE t1.delete_mark = 0 AND t3.delete_mark = 0 AND t4.delete_mark = 0" +
+            " and t2.base_semester_id = " + semester.getId() +
+            " AND t2.current_state = 'COMPLETED'";
+        List<Map<String, Object>> list2 = SqlRunnerAdapter.db().selectList(sql);
+
+        int studentCount = studentlist.size() + list2.size();
+        result.setStudentCount(studentCount);
+
+        //实习班级
+        sql = " SELECT DISTINCT t3.id FROM internship_plan_class t1" +
+            " INNER JOIN internship_plan_manage t2 ON t1.internship_plan_manage_id = t2.id" +
+            " INNER JOIN base_class t3 ON t1.class_id = t3.id" +
+            " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND t3.delete_mark = 0" +
+            " and t2.base_semester_id = " + semester.getId();
+        List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
+        result.setClassCount(list.size());
+
+        //实习企业
+        sql = " SELECT * FROM company_coop WHERE delete_mark = 0";
+        list = SqlRunnerAdapter.db().selectList(sql);
+        result.setCompanyCount(list.size());
+
+
+        sql = "SELECT DISTINCT t3.id FROM student_special_constitution t1" +
+            " INNER JOIN xjr_workflow_form_relation t2 ON t1.id = CAST(t2.form_key_value AS SIGNED)" +
+            " INNER JOIN xjr_user t3 ON t3.id = t1.student_user_id" +
+            " WHERE t1.delete_mark = 0 AND t3.delete_mark = 0" +
+            " AND t2.current_state = 'COMPLETED'";
+        List<Map<String, Object>> specialConstitutions = SqlRunnerAdapter.db().selectList(sql);
+
+        int allCount = specialConstitutions.size() + studentCount;
+
+        List<ItemCountRatioVo> studentList = new ArrayList<>();
+        //统一实习
+        ItemCountRatioVo item = new ItemCountRatioVo();
+        item.setItem("统一实习");
+        item.setCount(studentlist.size());
+        //计算占比
+        BigDecimal divide = BigDecimal.valueOf(studentlist.size()).divide(BigDecimal.valueOf(allCount), 4, RoundingMode.HALF_UP);
+        item.setRatio(divide.doubleValue());
+        studentList.add(item);
+
+        //自主实习
+        item = new ItemCountRatioVo();
+        item.setItem("自主实习");
+        item.setCount(list2.size());
+        //计算占比
+        divide = BigDecimal.valueOf(list2.size()).divide(BigDecimal.valueOf(allCount), 4, RoundingMode.HALF_UP);
+        item.setRatio(divide.doubleValue());
+        studentList.add(item);
+
+        //自主实习
+        item = new ItemCountRatioVo();
+        item.setItem("自主实习");
+        item.setCount(specialConstitutions.size());
+        //计算占比
+        divide = BigDecimal.valueOf(specialConstitutions.size()).divide(BigDecimal.valueOf(allCount), 4, RoundingMode.HALF_UP);
+        item.setRatio(divide.doubleValue());
+        studentList.add(item);
+
+        result.setStudentList(studentList);
+        return RT.ok(result);
+    }
+
 }

+ 125 - 0
src/main/java/com/xjrsoft/module/databoard/controller/DatadetailController.java

@@ -16,6 +16,7 @@ import com.xjrsoft.common.utils.SqlRunnerAdapterUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseSemester;
 import com.xjrsoft.module.base.mapper.BaseSemesterMapper;
+import com.xjrsoft.module.base.service.IBaseSemesterService;
 import com.xjrsoft.module.databoard.dto.StatisticsDetailDto;
 import com.xjrsoft.module.databoard.dto.TeacherChangeStatisticsDetailDto;
 import com.xjrsoft.module.databoard.vo.CourseCountListVo;
@@ -24,6 +25,10 @@ import com.xjrsoft.module.databoard.vo.DistributionVo;
 import com.xjrsoft.module.databoard.vo.DurationVo;
 import com.xjrsoft.module.databoard.vo.HealthItemCountVo;
 import com.xjrsoft.module.databoard.vo.HealthStatisticsDetailVo;
+import com.xjrsoft.module.databoard.vo.InternshipStatisticsDetailClassVo;
+import com.xjrsoft.module.databoard.vo.InternshipStatisticsDetailCompanyVo;
+import com.xjrsoft.module.databoard.vo.InternshipStatisticsDetailEvaluateVo;
+import com.xjrsoft.module.databoard.vo.InternshipStatisticsDetailVo;
 import com.xjrsoft.module.databoard.vo.ItemCount2Vo;
 import com.xjrsoft.module.databoard.vo.ItemCountAmountVo;
 import com.xjrsoft.module.databoard.vo.ItemCountRatioVo;
@@ -96,6 +101,7 @@ public class DatadetailController {
     private final IBaseStudentService studentService;
     private final IWfSubscriptionService subscriptionService;
     private final BaseSemesterMapper baseSemesterMapper;
+    private final IBaseSemesterService semesterService;
 
     @GetMapping(value = "/process-statistics")
     @ApiOperation(value = "流程统计详情")
@@ -963,4 +969,123 @@ public class DatadetailController {
         return RT.ok(result);
     }
 
+
+    @GetMapping(value = "/internship-statistics")
+    @ApiOperation(value = "实习统计")
+    @SaCheckPermission("databoard:detail")
+    @XjrLog(value = "实习统计", saveResponseData = true)
+    public RT<InternshipStatisticsDetailVo> internshipStatistics(@Valid StatisticsDetailDto dto) {
+        InternshipStatisticsDetailVo result = new InternshipStatisticsDetailVo();
+        BaseSemester semester = semesterService.getCurrentSemester();
+        String sql = " SELECT DISTINCT t1.participant_user_id FROM internship_plan_manage_participant t1" +
+                " INNER JOIN internship_plan_manage t2 ON t1.internship_plan_manage_id = t2.id" +
+                " INNER JOIN xjr_user t3 ON t1.participant_user_id = t3.id" +
+                " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND t3.delete_mark = 0" +
+                " and t2.base_semester_id = " + semester.getId();
+
+        List<Map<String, Object>> studentlist = SqlRunnerAdapter.db().selectList(sql);
+
+
+        sql = "SELECT DISTINCT t3.id FROM student_internship_alone_apply t1" +
+                " INNER JOIN xjr_workflow_form_relation t2 ON t1.id = CAST(t2.form_key_value AS SIGNED)" +
+                " INNER JOIN xjr_user t3 ON t3.id = t1.student_user_id" +
+                " INNER JOIN internship_plan_manage t4 ON t1.internship_plan_manage_id = t4.id" +
+                " WHERE t1.delete_mark = 0 AND t3.delete_mark = 0 AND t4.delete_mark = 0" +
+                " and t2.base_semester_id = " + semester.getId() +
+                " AND t2.current_state = 'COMPLETED'";
+        List<Map<String, Object>> list2 = SqlRunnerAdapter.db().selectList(sql);
+
+        int studentCount = studentlist.size() + list2.size();
+        result.setStudentCount(studentCount);
+
+        //实习班级
+        sql = " SELECT DISTINCT t3.id FROM internship_plan_class t1" +
+                " INNER JOIN internship_plan_manage t2 ON t1.internship_plan_manage_id = t2.id" +
+                " INNER JOIN base_class t3 ON t1.class_id = t3.id" +
+                " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND t3.delete_mark = 0" +
+                " and t2.base_semester_id = " + semester.getId();
+        List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
+        result.setClassCount(list.size());
+
+        //实习企业
+        sql = " SELECT * FROM company_coop WHERE delete_mark = 0";
+        list = SqlRunnerAdapter.db().selectList(sql);
+        result.setCompanyCount(list.size());
+
+
+        sql = "SELECT DISTINCT t3.name,\n" +
+            "(SELECT COUNT(participant_user_id) FROM internship_plan_manage_participant\n" +
+            "WHERE class_id = t3.id AND internship_plan_manage_id = t2.id and delete_mark = 0) AS unite_count,\n" +
+            "(SELECT COUNT(a1.student_user_id) FROM student_internship_alone_apply a1" +
+            " INNER JOIN xjr_workflow_form_relation a2 ON t1.id = CAST(t2.form_key_value AS SIGNED)" +
+            " WHERE a1.class_id = t3.id AND a1.internship_plan_manage_id = t2.id and a1.delete_mark = 0" +
+            " and a2.current_state = 'COMPLETED'" +
+            " ) AS alone_count,\n" +
+            "(SELECT COUNT(student_user_id) FROM student_special_constitution a1" +
+            " INNER JOIN xjr_workflow_form_relation a2 ON t1.id = CAST(t2.form_key_value AS SIGNED)" +
+            " WHERE a1.class_id = t3.id and a1.delete_mark = 0 and a2.current_state = 'COMPLETED') AS special_count\n" +
+            "FROM internship_plan_class t1\n" +
+            "INNER JOIN internship_plan_manage t2 ON t1.internship_plan_manage_id = t2.id\n" +
+            "INNER JOIN base_class t3 ON t1.class_id = t3.id\n" +
+            "WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND t3.delete_mark = 0" +
+            " and t2.base_semester_id = " + semester.getId();
+        List<Map<String, Object>> classDatas = SqlRunnerAdapter.db().selectList(sql);
+
+        List<InternshipStatisticsDetailClassVo> classList = new ArrayList<>();
+        for (Map<String, Object> objectMap : classDatas) {
+            classList.add(new InternshipStatisticsDetailClassVo(){{
+                setClassName(objectMap.get("name").toString());
+                setUniteCount(Integer.parseInt(objectMap.get("unite_count").toString()));
+                setAloneCount(Integer.parseInt(objectMap.get("alone_count").toString()));
+                setSpecialCount(Integer.parseInt(objectMap.get("special_count").toString()));
+            }});
+        }
+        result.setClassList(classList);
+
+        sql = "SELECT t1.company_name,\n" +
+            "(SELECT COUNT(*) FROM internship_plan_manage_participant WHERE delete_mark = 0 AND internship_plan_manage_id = t2.id) AS counts\n" +
+            "FROM company_coop t1\n" +
+            "INNER JOIN internship_plan_manage t2 ON t1.id = t2.internship_unit_id\n" +
+            "WHERE t1.delete_mark = 0 AND t2.delete_mark = 0" +
+            " and t2.base_semester_id = " + semester.getId();
+        List<Map<String, Object>> companyDatas = SqlRunnerAdapter.db().selectList(sql);
+        List<InternshipStatisticsDetailCompanyVo> companyList = new ArrayList<>();
+        for (Map<String, Object> companyData : companyDatas) {
+            companyList.add(new InternshipStatisticsDetailCompanyVo(){{
+                setCompanyName(companyData.get("company_name").toString());
+                setStudentCount(Integer.parseInt(companyData.get("counts").toString()));
+            }});
+        }
+        result.setCompanyList(companyList);
+
+        sql = "SELECT t3.name,\n" +
+                "(SELECT COUNT(*) FROM internship_plan_manage_participant WHERE delete_mark = 0\n" +
+                "AND result = '1' AND class_id = t3.id AND internship_plan_manage_id = t2.id\n" +
+                ") AS unqualified, \n" +
+                "(SELECT COUNT(*) FROM internship_plan_manage_participant WHERE delete_mark = 0\n" +
+                "AND result = '2' AND class_id = t3.id AND internship_plan_manage_id = t2.id\n" +
+                ") AS qualified, \n" +
+                "(SELECT COUNT(*) FROM internship_plan_manage_participant WHERE delete_mark = 0\n" +
+                "AND result = '3' AND class_id = t3.id AND internship_plan_manage_id = t2.id\n" +
+                ") AS excellent\n" +
+                "FROM internship_plan_class t1\n" +
+                "INNER JOIN internship_plan_manage t2 ON t1.internship_plan_manage_id = t2.id\n" +
+                "INNER JOIN base_class t3 ON t1.class_id = t3.id\n" +
+                "WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND t3.delete_mark = 0" +
+                " and t2.base_semester_id = " + semester.getId();
+        List<Map<String, Object>> evaluateDatas = SqlRunnerAdapter.db().selectList(sql);
+        List<InternshipStatisticsDetailEvaluateVo> evaluateList = new ArrayList<>();
+        for (Map<String, Object> companyData : evaluateDatas) {
+            evaluateList.add(new InternshipStatisticsDetailEvaluateVo(){{
+                setClassName(companyData.get("name").toString());
+                setUnqualifiedCount(Integer.parseInt(companyData.get("unqualified").toString()));
+                setQualifiedCount(Integer.parseInt(companyData.get("qualified").toString()));
+                setExcellentCount(Integer.parseInt(companyData.get("excellent").toString()));
+            }});
+        }
+        result.setEvaluateList(evaluateList);
+
+        return RT.ok(result);
+    }
+
 }

+ 37 - 0
src/main/java/com/xjrsoft/module/databoard/vo/InternshipStatisticsDetailClassVo.java

@@ -0,0 +1,37 @@
+package com.xjrsoft.module.databoard.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @title: 实习详情统计-班级
+ * @Author dzx
+ * @Date: 2025年7月14日
+ * @Version 1.0
+ */
+@Data
+public class InternshipStatisticsDetailClassVo {
+
+    /**
+     * 发起流程总数
+     */
+    @ApiModelProperty("班级名称")
+    private String className;
+    /**
+     * 完成总数
+     */
+    @ApiModelProperty("统一实习学生数量")
+    private Integer uniteCount;
+    /**
+     * 未完成总数
+     */
+    @ApiModelProperty("自主实习学生数量")
+    private Integer aloneCount;
+
+
+    @ApiModelProperty("特殊体质学生数量")
+    private Integer specialCount;
+
+}

+ 28 - 0
src/main/java/com/xjrsoft/module/databoard/vo/InternshipStatisticsDetailCompanyVo.java

@@ -0,0 +1,28 @@
+package com.xjrsoft.module.databoard.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @title: 实习详情统计-实习企业
+ * @Author dzx
+ * @Date: 2025年7月14日
+ * @Version 1.0
+ */
+@Data
+public class InternshipStatisticsDetailCompanyVo {
+
+    /**
+     * 发起流程总数
+     */
+    @ApiModelProperty("实习学生数量")
+    private Integer studentCount;
+    /**
+     * 完成总数
+     */
+    @ApiModelProperty("企业名称")
+    private String companyName;
+
+}

+ 34 - 0
src/main/java/com/xjrsoft/module/databoard/vo/InternshipStatisticsDetailEvaluateVo.java

@@ -0,0 +1,34 @@
+package com.xjrsoft.module.databoard.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @title: 实习详情统计-实习类型
+ * @Author dzx
+ * @Date: 2025年7月14日
+ * @Version 1.0
+ */
+@Data
+public class InternshipStatisticsDetailEvaluateVo {
+
+    @ApiModelProperty("班级名称")
+    private String className;
+    /**
+     * 完成总数
+     */
+    @ApiModelProperty("不合格数量")
+    private Integer unqualifiedCount;
+    /**
+     * 未完成总数
+     */
+    @ApiModelProperty("合格数量")
+    private Integer qualifiedCount;
+
+
+    @ApiModelProperty("优秀数量")
+    private Integer excellentCount;
+
+}

+ 43 - 0
src/main/java/com/xjrsoft/module/databoard/vo/InternshipStatisticsDetailVo.java

@@ -0,0 +1,43 @@
+package com.xjrsoft.module.databoard.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @title: 数据看板-流程统计出参
+ * @Author dzx
+ * @Date: 2024年8月2日
+ * @Version 1.0
+ */
+@Data
+public class InternshipStatisticsDetailVo {
+
+    /**
+     * 发起流程总数
+     */
+    @ApiModelProperty("实习学生数量")
+    private Integer studentCount;
+    /**
+     * 完成总数
+     */
+    @ApiModelProperty("实习班级数量")
+    private Integer classCount;
+    /**
+     * 未完成总数
+     */
+    @ApiModelProperty("实习企业数量")
+    private Integer companyCount;
+
+
+    @ApiModelProperty("实习企业")
+    private List<InternshipStatisticsDetailCompanyVo> companyList;
+
+    @ApiModelProperty("实习班级")
+    private List<InternshipStatisticsDetailClassVo> classList;
+
+    @ApiModelProperty("实习结果")
+    private List<InternshipStatisticsDetailEvaluateVo> evaluateList;
+
+}

+ 37 - 0
src/main/java/com/xjrsoft/module/databoard/vo/InternshipStatisticsVo.java

@@ -0,0 +1,37 @@
+package com.xjrsoft.module.databoard.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @title: 数据看板-流程统计出参
+ * @Author dzx
+ * @Date: 2024年8月2日
+ * @Version 1.0
+ */
+@Data
+public class InternshipStatisticsVo {
+
+    /**
+     * 发起流程总数
+     */
+    @ApiModelProperty("实习学生数量")
+    private Integer studentCount;
+    /**
+     * 完成总数
+     */
+    @ApiModelProperty("实习班级数量")
+    private Integer classCount;
+    /**
+     * 未完成总数
+     */
+    @ApiModelProperty("实习企业数量")
+    private Integer companyCount;
+
+
+    @ApiModelProperty("学生组成占比")
+    private List<ItemCountRatioVo> studentList;
+
+}