ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskDetailController.java
@@ -1,5 +1,6 @@ package com.ruoyi.web.controller.smartor; import com.ruoyi.common.annotation.AddOrgId; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -9,12 +10,11 @@ import com.ruoyi.common.utils.DtoConversionUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.service.ISysConfigService; import com.smartor.domain.*; import com.smartor.domain.DTO.QuestionResultDTO; import com.smartor.domain.DTO.ServiceSubtaskDetailDTO; import com.smartor.domain.*; import com.smartor.domain.VO.MydTrendReqVO; import com.smartor.domain.VO.MzMydScoreRankVO; import com.smartor.domain.VO.QuestionCountKsOrBqVO; import com.smartor.domain.VO.QuestionResultVO; import com.smartor.domain.VO.SltdMydTotalVO; import com.smartor.domain.entity.ServiceSubtaskEntity; import com.smartor.service.IServiceSubtaskDetailService; @@ -22,7 +22,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.collections4.CollectionUtils; import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -281,4 +280,11 @@ return success(serviceSubtaskService.sltdMydTotalByDimension(mydTrendReqVO)); } @ApiOperation("门诊满意度综合得分排名(按科室或病区)") @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid") @PostMapping("/mzMydScoreRank") public Map<String, Object> mzMydScoreRank(@RequestBody MzMydScoreRankVO mzMydScoreRankVO) { return success(serviceSubtaskService.mzMydScoreRank(mzMydScoreRankVO)); } } smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java
@@ -2,9 +2,11 @@ import com.smartor.domain.*; import com.smartor.domain.DTO.MydTrendReqDTO; import com.smartor.domain.DTO.MzMydScoreRankDTO; import com.smartor.domain.DTO.QuestionCountKsOrBqDTO; import com.smartor.domain.VO.PatSatisfactionReqVO; import com.smartor.domain.VO.HeLibraryCountVO; import com.smartor.domain.VO.MzMydScoreRankVO; import com.smartor.domain.VO.QuestionCountKsOrBqVO; import com.smartor.domain.VO.ServiceSubtaskCotinueCountVO; import com.smartor.domain.entity.ServiceSubtaskEntity; @@ -290,4 +292,15 @@ */ List<QuestionCountKsOrBqDTO> statQuestionOptionByKsOrBq(QuestionCountKsOrBqVO questionCountKsOrBqVO); /** * 门诊满意度综合得分排名(按科室或病区) * <p> * 综合满意度 = Σ(评分明细权重) / 评分明细条数 × 100%, * 权重只取 1、0.8、0.6、0.4、0.2 五档。 * * @param mzMydScoreRankVO 查询条件(dimensionType、serviceType、时间区间、科室/病区编号、orgid/campusid) * @return 每个科室/病区的综合得分与项数,已按综合得分降序 */ List<MzMydScoreRankDTO> selectMzMydScoreRank(MzMydScoreRankVO mzMydScoreRankVO); } smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java
@@ -3,6 +3,7 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.smartor.domain.*; import com.smartor.domain.DTO.MydTrendReqDTO; import com.smartor.domain.DTO.MzMydScoreRankDTO; import com.smartor.domain.DTO.QuestionCountKsOrBqDTO; import com.smartor.domain.DTO.QuestionResultDTO; import com.smartor.domain.ServiceSubtask; @@ -249,4 +250,15 @@ public List<MydTrendReqDTO> sltdMydTotalByDimension(MydTrendReqVO mydTrendReqVO); public Integer matchOptionIndex(String url, String questionText, String voiceText, List<IvrTaskTemplateTargetoption> options, String uuid); /** * 门诊满意度综合得分排名(按科室或病区) * <p> * 综合满意度 = Σ(评分明细权重) / 评分明细条数 × 100%, * 权重只取 1、0.8、0.6、0.4、0.2 五档。 * * @param mzMydScoreRankVO 查询条件 * @return 排名结果,已按综合得分降序并填充名次(从 1 开始) */ public List<MzMydScoreRankDTO> mzMydScoreRank(MzMydScoreRankVO mzMydScoreRankVO); } smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -22,6 +22,7 @@ import com.smartor.common.ScheduleSubtaskBuilder; import com.smartor.config.PhoneUtils; import com.smartor.domain.DTO.MydTrendReqDTO; import com.smartor.domain.DTO.MzMydScoreRankDTO; import com.smartor.domain.DTO.QuestionCountKsOrBqDTO; import com.smartor.domain.DTO.ServiceSubtaskDetailDTO; import com.smartor.domain.*; @@ -6415,4 +6416,32 @@ return result; } /** * 门诊满意度综合得分排名(按科室或病区) * <p> * 综合满意度 = Σ(评分明细权重) / 评分明细条数 × 100%, * 权重只取 1、0.8、0.6、0.4、0.2 五档(很满意、满意、一般、不满意、很不满意)。 * * @param mzMydScoreRankVO 查询条件 * @return 排名结果,名次从 1 开始顺序编号 */ @Override public List<MzMydScoreRankDTO> mzMydScoreRank(MzMydScoreRankVO mzMydScoreRankVO) { if (StringUtils.isEmpty(mzMydScoreRankVO.getDimensionType())) { mzMydScoreRankVO.setDimensionType("1"); } if (StringUtils.isEmpty(mzMydScoreRankVO.getServiceType())) { mzMydScoreRankVO.setServiceType("14"); } List<MzMydScoreRankDTO> list = serviceSubtaskMapper.selectMzMydScoreRank(mzMydScoreRankVO); if (CollectionUtils.isEmpty(list)) { return new ArrayList<>(); } // 名次:SQL 已按综合得分降序返回,这里顺序编号 for (int i = 0; i < list.size(); i++) { list.get(i).setRank(i + 1); } return list; } } smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -3457,6 +3457,86 @@ and endtime </select> <!-- 门诊满意度综合得分排名(按科室或病区) --> <!-- 综合满意度 = Σ(评分明细权重) / 评分明细条数 × 100%,权重只取 1、0.8、0.6、0.4、0.2 五档 --> <select id="selectMzMydScoreRank" parameterType="com.smartor.domain.VO.MzMydScoreRankVO" resultType="com.smartor.domain.DTO.MzMydScoreRankDTO"> SELECT t.code AS code, t.name AS name, ROUND(AVG(t.w) * 100, 2) AS score, COUNT(*) AS itemCount FROM ( SELECT <choose> <when test='dimensionType == "2"'> s.leavehospitaldistrictcode AS code, s.leavehospitaldistrictname AS name, </when> <otherwise> s.deptcode AS code, s.deptname AS name, </otherwise> </choose> CAST(d.score AS DECIMAL(10,4)) AS w FROM service_subtask s INNER JOIN service_subtask_detail d ON d.sub_id = s.id WHERE s.del_flag = '0' AND d.del_flag = '0' AND s.sendstate = 6 AND s.service_type = #{serviceType} <!-- <!– 只取公式里的五档权重,空值/0/未答等既不进分子也不进分母 –>--> <!-- AND CAST(d.score AS DECIMAL(10,4)) IN (1, 0.8, 0.6, 0.4, 0.2)--> <!-- 同一子任务同一题目只保留最新一条,避免重答被重复计入项数 --> AND d.id = ( SELECT MAX(d2.id) FROM service_subtask_detail d2 WHERE d2.sub_id = d.sub_id AND d2.questiontext <=> d.questiontext AND d2.del_flag = '0' ) <if test="orgid != null and orgid != ''"> AND s.orgid = #{orgid} </if> <if test="campusid != null and campusid != ''"> AND s.campusid = #{campusid} </if> <if test="startFinishTime != null"> AND s.finishtime >= #{startFinishTime} </if> <if test="endFinishTime != null"> AND s.finishtime < DATE_ADD(#{endFinishTime}, INTERVAL 1 DAY) </if> <choose> <when test='dimensionType == "2"'> AND s.leavehospitaldistrictcode IS NOT NULL AND s.leavehospitaldistrictcode <> '' AND s.leavehospitaldistrictname IS NOT NULL AND s.leavehospitaldistrictname <> '' <if test="districtCodes != null and districtCodes.size() > 0"> AND s.leavehospitaldistrictcode IN <foreach collection="districtCodes" item="districtCode" open="(" separator="," close=")"> #{districtCode} </foreach> </if> </when> <otherwise> AND s.deptcode IS NOT NULL AND s.deptcode <> '' AND s.deptname IS NOT NULL AND s.deptname <> '' <if test="deptCodes != null and deptCodes.size() > 0"> AND s.deptcode IN <foreach collection="deptCodes" item="deptCode" open="(" separator="," close=")"> #{deptCode} </foreach> </if> </otherwise> </choose> ) t GROUP BY t.code, t.name ORDER BY AVG(t.w) DESC, COUNT(*) DESC <if test="limit != null and limit > 0"> LIMIT #{limit} </if> </select> </mapper>