+8
-12
@@ -7,7 +7,7 @@ import com.yunhai.bschclassmanage.entity.SchTeacherGroup;
|
|||||||
import com.yunhai.bschclassmanage.model.dto.TeacherBaseInfoDTO;
|
import com.yunhai.bschclassmanage.model.dto.TeacherBaseInfoDTO;
|
||||||
import com.yunhai.bschclassmanage.annotation.SyncOpLog;
|
import com.yunhai.bschclassmanage.annotation.SyncOpLog;
|
||||||
import com.yunhai.bschclassmanage.enums.SyncDataType;
|
import com.yunhai.bschclassmanage.enums.SyncDataType;
|
||||||
import com.yunhai.platform.openapi.core.YschOpenCall;
|
import com.yunhai.bschclassmanage.service.ISendUserBaseService;
|
||||||
import com.yunhai.platform.utils.model.BoaUser;
|
import com.yunhai.platform.utils.model.BoaUser;
|
||||||
import com.yunhai.platform.utils.exception.DException;
|
import com.yunhai.platform.utils.exception.DException;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -17,12 +17,12 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/** 开放接口只修改四项资料,通过平台签名客户端同步基础平台。 */
|
/** 开放接口只修改四项资料,经既有教师同步通道(SendUserBaseService)推送用户中心。 */
|
||||||
@Service
|
@Service
|
||||||
public class SchTeacherBaseInfoService {
|
public class SchTeacherBaseInfoService {
|
||||||
@Autowired private SchTeacherRepository teacherRepository;
|
@Autowired private SchTeacherRepository teacherRepository;
|
||||||
@Autowired private SchTeacherGroupRepository groupRepository;
|
@Autowired private SchTeacherGroupRepository groupRepository;
|
||||||
@Autowired private YschOpenCall openCall;
|
@Autowired private ISendUserBaseService sendUserBaseService;
|
||||||
@Autowired private SchTeacherCacheService cacheService;
|
@Autowired private SchTeacherCacheService cacheService;
|
||||||
|
|
||||||
public TeacherBaseInfoDTO get(Integer schId, Integer teaId) {
|
public TeacherBaseInfoDTO get(Integer schId, Integer teaId) {
|
||||||
@@ -33,7 +33,7 @@ public class SchTeacherBaseInfoService {
|
|||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@SyncOpLog(SyncDataType.SEND_EDIT_TEACHER)
|
@SyncOpLog(SyncDataType.SEND_EDIT_TEACHER)
|
||||||
public TeacherBaseInfoDTO edit(TeacherBaseInfoDTO dto) {
|
public TeacherBaseInfoDTO edit(TeacherBaseInfoDTO dto) {
|
||||||
requireMembership(dto.getSchId(), dto.getTeaId());
|
List<SchTeacherGroup> memberships = requireMembership(dto.getSchId(), dto.getTeaId());
|
||||||
List<SchTeacher> teachers = teachers(dto.getTeaId());
|
List<SchTeacher> teachers = teachers(dto.getTeaId());
|
||||||
String name = dto.getName() == null ? "" : dto.getName().trim();
|
String name = dto.getName() == null ? "" : dto.getName().trim();
|
||||||
if (name.isEmpty()) throw new DException("姓名不能为空");
|
if (name.isEmpty()) throw new DException("姓名不能为空");
|
||||||
@@ -52,15 +52,11 @@ public class SchTeacherBaseInfoService {
|
|||||||
teacher.setUpdateUserId(dto.getTeaId());
|
teacher.setUpdateUserId(dto.getTeaId());
|
||||||
}
|
}
|
||||||
// 先同步;失败抛异常并回滚本地事务。teaId 可能对应多行,统一修改。
|
// 先同步;失败抛异常并回滚本地事务。teaId 可能对应多行,统一修改。
|
||||||
Map<String, Object> profile = new LinkedHashMap<>();
|
// 复用管理端同款教师同步(用户中心 /oapi/user/edit/{id},身份追加语义、不改密码);
|
||||||
profile.put("realName", name);
|
// groupId 仅用于解析学校范围,不会移动教师分组。
|
||||||
profile.put("gender", dto.getGender());
|
BoaUser synced = sendUserBaseService.editTeacher(teachers.get(0), null, memberships.get(0).getGroupId());
|
||||||
profile.put("phone", trim(dto.getPhone()));
|
|
||||||
profile.put("idcard", trim(dto.getIdcard()));
|
|
||||||
BoaUser synced = openCall.post("userbase", "/oapi/user/editBasicInfo/" + dto.getTeaId(),
|
|
||||||
null, profile, BoaUser.class);
|
|
||||||
if (synced == null || !dto.getTeaId().equals(synced.getId())) {
|
if (synced == null || !dto.getTeaId().equals(synced.getId())) {
|
||||||
throw new DException("基础平台未返回有效教师信息,同步失败");
|
throw new DException("用户中心未返回有效教师信息,同步失败");
|
||||||
}
|
}
|
||||||
teacherRepository.saveAll(teachers);
|
teacherRepository.saveAll(teachers);
|
||||||
Set<Integer> schools = groupRepository.findByTeaIdIn(Collections.singletonList(dto.getTeaId())).stream()
|
Set<Integer> schools = groupRepository.findByTeaIdIn(Collections.singletonList(dto.getTeaId())).stream()
|
||||||
|
|||||||
+11
-8
@@ -3,7 +3,7 @@ package com.yunhai.bschclassmanage.service.impl.teacher;
|
|||||||
import com.yunhai.bschclassmanage.Repository.*;
|
import com.yunhai.bschclassmanage.Repository.*;
|
||||||
import com.yunhai.bschclassmanage.entity.*;
|
import com.yunhai.bschclassmanage.entity.*;
|
||||||
import com.yunhai.bschclassmanage.model.dto.TeacherBaseInfoDTO;
|
import com.yunhai.bschclassmanage.model.dto.TeacherBaseInfoDTO;
|
||||||
import com.yunhai.platform.openapi.core.YschOpenCall;
|
import com.yunhai.bschclassmanage.service.ISendUserBaseService;
|
||||||
import com.yunhai.platform.utils.exception.DException;
|
import com.yunhai.platform.utils.exception.DException;
|
||||||
import com.yunhai.platform.utils.model.BoaUser;
|
import com.yunhai.platform.utils.model.BoaUser;
|
||||||
import org.junit.jupiter.api.*;
|
import org.junit.jupiter.api.*;
|
||||||
@@ -20,7 +20,7 @@ class SchTeacherBaseInfoServiceTest {
|
|||||||
@InjectMocks private SchTeacherBaseInfoService service;
|
@InjectMocks private SchTeacherBaseInfoService service;
|
||||||
@Mock private SchTeacherRepository teacherRepository;
|
@Mock private SchTeacherRepository teacherRepository;
|
||||||
@Mock private SchTeacherGroupRepository groupRepository;
|
@Mock private SchTeacherGroupRepository groupRepository;
|
||||||
@Mock private YschOpenCall openCall;
|
@Mock private ISendUserBaseService sendUserBaseService;
|
||||||
@Mock private SchTeacherCacheService cacheService;
|
@Mock private SchTeacherCacheService cacheService;
|
||||||
|
|
||||||
private SchTeacherGroup group(int school) {
|
private SchTeacherGroup group(int school) {
|
||||||
@@ -44,7 +44,7 @@ class SchTeacherBaseInfoServiceTest {
|
|||||||
|
|
||||||
@Test void updatesAllTeacherRowsAndInvalidatesAllSchoolsAfterSync() {
|
@Test void updatesAllTeacherRowsAndInvalidatesAllSchoolsAfterSync() {
|
||||||
List<SchTeacher> rows = givenTeacher();
|
List<SchTeacher> rows = givenTeacher();
|
||||||
when(openCall.post(eq("userbase"), eq("/oapi/user/editBasicInfo/101"), isNull(), any(), eq(BoaUser.class)))
|
when(sendUserBaseService.editTeacher(any(SchTeacher.class), isNull(), eq(31)))
|
||||||
.thenReturn(new BoaUser(101, "teacher", "新姓名"));
|
.thenReturn(new BoaUser(101, "teacher", "新姓名"));
|
||||||
when(groupRepository.findByTeaIdIn(Collections.singletonList(101))).thenReturn(Arrays.asList(group(3),group(4)));
|
when(groupRepository.findByTeaIdIn(Collections.singletonList(101))).thenReturn(Arrays.asList(group(3),group(4)));
|
||||||
assertEquals("新姓名", service.edit(request()).getName());
|
assertEquals("新姓名", service.edit(request()).getName());
|
||||||
@@ -52,8 +52,8 @@ class SchTeacherBaseInfoServiceTest {
|
|||||||
assertEquals("新姓名", t.getName()); assertEquals(1,t.getGender());
|
assertEquals("新姓名", t.getName()); assertEquals(1,t.getGender());
|
||||||
assertNull(t.getTel()); assertEquals("teacher",t.getAccount()); assertEquals(1,t.getStatus());
|
assertNull(t.getTel()); assertEquals("teacher",t.getAccount()); assertEquals(1,t.getStatus());
|
||||||
}
|
}
|
||||||
InOrder order = inOrder(openCall,teacherRepository,cacheService);
|
InOrder order = inOrder(sendUserBaseService,teacherRepository,cacheService);
|
||||||
order.verify(openCall).post(eq("userbase"),eq("/oapi/user/editBasicInfo/101"),isNull(),any(),eq(BoaUser.class));
|
order.verify(sendUserBaseService).editTeacher(any(SchTeacher.class), isNull(), eq(31));
|
||||||
order.verify(teacherRepository).saveAll(rows);
|
order.verify(teacherRepository).saveAll(rows);
|
||||||
order.verify(cacheService).clearTeacherCaches(new HashSet<>(Arrays.asList(3,4)));
|
order.verify(cacheService).clearTeacherCaches(new HashSet<>(Arrays.asList(3,4)));
|
||||||
}
|
}
|
||||||
@@ -62,13 +62,16 @@ class SchTeacherBaseInfoServiceTest {
|
|||||||
SchTeacherGroup out = group(3); out.setTransferStatus(1);
|
SchTeacherGroup out = group(3); out.setTransferStatus(1);
|
||||||
when(groupRepository.findByTeaIdAndSchId(101,3)).thenReturn(Collections.singletonList(out));
|
when(groupRepository.findByTeaIdAndSchId(101,3)).thenReturn(Collections.singletonList(out));
|
||||||
assertThrows(DException.class, () -> service.edit(request()));
|
assertThrows(DException.class, () -> service.edit(request()));
|
||||||
verifyNoInteractions(openCall,teacherRepository,cacheService);
|
verifyNoInteractions(sendUserBaseService,teacherRepository,cacheService);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test void syncFailureDoesNotSaveOrClearCache() {
|
@Test void syncFailureDoesNotSaveOrClearCache() {
|
||||||
givenTeacher();
|
List<SchTeacher> rows = givenTeacher();
|
||||||
when(openCall.post(anyString(),anyString(),isNull(),any(),eq(BoaUser.class))).thenThrow(new DException("平台失败"));
|
when(sendUserBaseService.editTeacher(any(SchTeacher.class), isNull(), eq(31)))
|
||||||
|
.thenThrow(new DException("平台失败"));
|
||||||
assertThrows(DException.class, () -> service.edit(request()));
|
assertThrows(DException.class, () -> service.edit(request()));
|
||||||
verify(teacherRepository,never()).saveAll(any()); verifyNoInteractions(cacheService);
|
verify(teacherRepository,never()).saveAll(any()); verifyNoInteractions(cacheService);
|
||||||
|
// 同步前已就地改写的实体随事务回滚,不落库
|
||||||
|
assertEquals("新姓名", rows.get(0).getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user