package com.yihu.wlyy.service.app.team; import com.yihu.wlyy.entity.doctor.profile.Doctor; import com.yihu.wlyy.entity.doctor.team.admin.AdminTeam; import com.yihu.wlyy.entity.doctor.team.admin.AdminTeamMember; import com.yihu.wlyy.entity.patient.Patient; import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao; import com.yihu.wlyy.repository.doctor.DoctorAdminTeamMemberDao; import com.yihu.wlyy.service.BaseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.*; /** * 医生行政团队服务。 * * @author Sand */ @Component @Transactional public class AdminTeamService extends BaseService { @Autowired DoctorAdminTeamDao teamDao; @Autowired DoctorAdminTeamMemberDao memberDao; /** * 获取团队数量。 * * @return */ public long getTeamCount() { return teamDao.count(); } /** * 创建团队。 * * @param teamName * @param leaderCode * @param orgCode * @return */ public AdminTeam createTeam(String teamName, String leaderCode, String orgCode) { AdminTeam team = new AdminTeam(); team.setName(teamName); team.setLeaderCode(leaderCode); team.setOrgCode(orgCode); team.setAvailable(true); team.setCreateTime(new Date()); saveTeam(team); return team; } /** * 获取团队信息。 * * @param id */ public AdminTeam getTeam(long id) { AdminTeam team = teamDao.findOne(id); return team; } /** * 更新团队名称。 * * @param teamId * @param teamName * @return */ public AdminTeam updateTeamName(long teamId, String teamName) { AdminTeam team = getTeam(teamId); if (team != null) { if (teamName != null) team.setName(teamName); saveTeam(team); } return team; } /** * 更新团队领导。 * * @param teamId * @param doctorCode * @return */ public AdminTeam updateTeamLeader(long teamId, String doctorCode) { AdminTeam team = getTeam(teamId); if (team != null) { if (doctorCode != null) team.setLeaderCode(doctorCode); saveTeam(team); } return team; } /** * 获取此医生所在的团队列表。 * * @param doctorCode * @return */ public List getDoctorTeams(String doctorCode) { return memberDao.findDoctorTeams(doctorCode); } /** * 添加成员。 * * @param teamId * @param doctorCode */ public void addMember(long teamId, String doctorCode) { Integer count = memberDao.isMemberExist(teamId, doctorCode); if (count == null || count == 0) { AdminTeamMember member = new AdminTeamMember(); member.setTeamId(teamId); member.setDoctorCode(doctorCode); member.setJoinTime(new Date()); saveMember(member); } } /** * 移除成员。 *

* 如果成员已经有跟团队内的某医生合作与患者签约,那么不能移除,必须等签约患者交接后才可以。 * * @param teamId * @param doctorCode */ public void removeMember(long teamId, String doctorCode) { AdminTeamMember member = memberDao.findByTeamIdAndDoctorCodeOrderByDoctorCodeAsc(teamId, doctorCode); if (member != null) memberDao.delete(member); } public List getMembers(long teamId) { return memberDao.findAllMembers(teamId); } /** * 获取不在当前团队内的机构成员。 * * @param orgCode * @param teamId * @param page * @param size * @return */ public List getExcludedMembers(String orgCode, String doctorName, long teamId, int page, int size) { Pageable pageable = new PageRequest(page, size); if (StringUtils.isEmpty(doctorName)) { doctorName = "%"; } else { doctorName = "%" + doctorName + "%"; } Page doctors = memberDao.findTeamExcludedMembers(orgCode, doctorName, teamId, pageable); if (doctors == null) return null; return doctors.getContent(); } /** * 团队内所有成员的签约人数。 * * @param doctors * @return */ public Map getMemberSigningCount(List doctors) { Map counts = new HashMap<>(); for (Doctor doctor : doctors) { if (doctor.isProfessionalDoctor()) continue; boolean isHealthDoctor = doctor.isHealthDoctor(); List partners = new ArrayList<>(); for (Doctor partner : doctors) { if (partner == doctor) continue; if (isHealthDoctor && partner.isGeneralDoctor()) { partners.add(partner.getCode()); } else if (!isHealthDoctor && partner.isHealthDoctor()) { partners.add(partner.getCode()); } } Integer signingCount; if (partners.isEmpty()) { signingCount = 0; } else if (isHealthDoctor) { signingCount = teamDao.getHealthDoctorSignCount(doctor.getCode(), partners); } else { signingCount = teamDao.getDoctorSignCount(doctor.getCode(), partners); } counts.put(doctor.getCode(), signingCount); } return counts; } /** * 团队内所有成员的签约患者列表。以健康管理师为中心,与全科医生为准的交集。 * * @param teamId * @param healthDoctorCode * @param page * @param size * @return */ public List getMemberSigningPatients(long teamId, String healthDoctorCode, int page, int size) { List generalDoctors = new ArrayList<>(); List doctors = getMembers(teamId); for (Doctor doctor : doctors) { if (doctor.getLevel() != 2) continue; generalDoctors.add(doctor.getCode()); } Page result = teamDao.getHealthDoctorSigningPatients( healthDoctorCode, generalDoctors, new PageRequest(page, size)); return result.getContent(); } /** * 保存团队。 * * @param team */ private void saveTeam(AdminTeam team) { teamDao.save(team); } /** * 保存成员。 * * @param member */ private void saveMember(AdminTeamMember member) { memberDao.save(member); } }