diff --git a/src/main/java/com/docus/server/archive/controller/FoShanThreeHospUnifyMessageReceiveController.java b/src/main/java/com/docus/server/archive/controller/FoShanThreeHospUnifyMessageReceiveController.java new file mode 100644 index 0000000..1cac62c --- /dev/null +++ b/src/main/java/com/docus/server/archive/controller/FoShanThreeHospUnifyMessageReceiveController.java @@ -0,0 +1,159 @@ +package com.docus.server.archive.controller; + +import com.docus.infrastructure.core.exception.BaseException; +import com.docus.infrastructure.web.api.ResultCode; +import com.docus.server.archive.dto.Message; +import com.docus.server.archive.dto.MessageResponse; +import com.docus.server.archive.service.FoShanThreeHospDeptInfoSyncService; +import com.docus.server.archive.service.FoShanThreeHospUserInfoSyncService; +import com.docus.server.archive.utils.XmlUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.w3c.dom.Node; + +/** + * @author YongBin Wen + * @date 2024/7/10 9:35 + */ +@Slf4j +@RequestMapping("/fssy-basic-receive") +@Api(tags = "佛山三院基础信息统一消息转发接收接口") +@RestController +public class FoShanThreeHospUnifyMessageReceiveController { + + + @Autowired + private FoShanThreeHospUserInfoSyncService userInfoSyncService; + + @Autowired + private FoShanThreeHospDeptInfoSyncService deptInfoSyncService; + + + @PostMapping("/user/do") + @ApiOperation("佛山三院用户信息推送接收") + public MessageResponse userSyncByUnifyMessageReceive(@RequestBody Message message) { + log.info("佛山三院用户信息推送接收:{}", message); + String source = "unknown"; + String msgId = "unknown"; + try { + XmlUtil xmlUtil = XmlUtil.of(message.getMessage()); + Node sourceNode = xmlUtil.getNode("/Request/Header/SourceSystem"); + Node msgIdNode = xmlUtil.getNode("/Request/Header/MessageID"); + if (sourceNode != null) { + source = sourceNode.getTextContent(); + } + if (msgIdNode != null) { + msgId = msgIdNode.getTextContent(); + } + userInfoSyncService.syncByUnifyMessageReceive(message.getMessage()); + return new MessageResponse(ResultCode.SUCCESS.getCode(), userSuccess(source, msgId)); + } catch (BaseException baseException) { + log.error(baseException.getMessage(), baseException); + // 业务异常,不希望重试,直接消息返回错误 + MessageResponse response = new MessageResponse(ResultCode.FAILED.getCode(), userFail(source, msgId, baseException.getMessage())); + response.setRetry(0); + return response; + } catch (Exception ex) { + log.error(ex.getMessage(), ex); + // 不可知的错误,希望重试 + MessageResponse response = new MessageResponse(ResultCode.FAILED.getCode(), userFail(source, msgId, "系统错误")); + response.setRetry(1); + return response; + } + } + + + @PostMapping("/dept/do") + @ApiOperation("佛山三院科室信息推送接收") + public MessageResponse deptSyncByUnifyMessageReceive(@RequestBody Message message) { + log.info("佛山三院科室信息推送接收:{}", message); + String source = "unknown"; + String msgId = "unknown"; + try { + XmlUtil xmlUtil = XmlUtil.of(message.getMessage()); + Node sourceNode = xmlUtil.getNode("/Request/Header/SourceSystem"); + Node msgIdNode = xmlUtil.getNode("/Request/Header/MessageID"); + if (sourceNode != null) { + source = sourceNode.getTextContent(); + } + if (msgIdNode != null) { + msgId = msgIdNode.getTextContent(); + } + deptInfoSyncService.syncByUnifyMessageReceive(message.getMessage()); + return new MessageResponse(ResultCode.SUCCESS.getCode(), deptSuccess(source, msgId)); + } catch (BaseException baseException) { + log.error(baseException.getMessage(), baseException); + // 业务异常,不希望重试,直接消息返回错误 + MessageResponse response = new MessageResponse(ResultCode.FAILED.getCode(), deptFail(source, msgId, baseException.getMessage())); + response.setRetry(0); + return response; + } catch (Exception ex) { + log.error(ex.getMessage(), ex); + // 不可知的错误,希望重试 + MessageResponse response = new MessageResponse(ResultCode.FAILED.getCode(), deptFail(source, msgId, "系统错误")); + response.setRetry(1); + return response; + } + } + + + private String userSuccess(String source, String msgId) { + return "\n" + + "
\n" + + " " + source + "\n" + + " " + msgId + "\n" + + "
\n" + + " \n" + + " AA\n" + + " 成功\n" + + " \n" + + "
"; + + } + + private String userFail(String source, String msgId, String message) { + return "\n" + + "
\n" + + " " + source + "\n" + + " " + msgId + "\n" + + "
\n" + + " \n" + + " AE\n" + + " " + message + "\n" + + " \n" + + "
"; + } + + private String deptSuccess(String source, String msgId) { + return "\n" + + "
\n" + + " " + source + "\n" + + " " + msgId + "\n" + + "
\n" + + " \n" + + " AA\n" + + " 成功\n" + + " \n" + + "
"; + } + + private String deptFail(String source, String msgId, String message) { + return "\n" + + "
\n" + + " " + source + "\n" + + " " + msgId + "\n" + + "
\n" + + " \n" + + " AE\n" + + " " + message + "\n" + + " \n" + + "
"; + } + +} diff --git a/src/main/java/com/docus/server/archive/dto/Message.java b/src/main/java/com/docus/server/archive/dto/Message.java new file mode 100644 index 0000000..b711dfa --- /dev/null +++ b/src/main/java/com/docus/server/archive/dto/Message.java @@ -0,0 +1,30 @@ +package com.docus.server.archive.dto; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author wyb + */ +@Getter +@Setter +public class Message { + private String method; + private String message; + + public Message() { + } + + public Message(String method, String message) { + this.method = method; + this.message = message; + } + + @Override + public String toString() { + return "Message{" + + "method='" + method + '\'' + + ", message='" + message + '\'' + + '}'; + } +} diff --git a/src/main/java/com/docus/server/archive/dto/MessageResponse.java b/src/main/java/com/docus/server/archive/dto/MessageResponse.java new file mode 100644 index 0000000..5a450a0 --- /dev/null +++ b/src/main/java/com/docus/server/archive/dto/MessageResponse.java @@ -0,0 +1,27 @@ +package com.docus.server.archive.dto; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author wyb + */ +@Getter +@Setter +public class MessageResponse { + /** + * @see com.docus.infrastructure.web.api.ResultCode#SUCCESS + * @see com.docus.infrastructure.web.api.ResultCode#FAILED + */ + private Integer respCode; + private String respMessage; + /** + * 是否需要重试 0:否 1 是 + */ + private int retry; + + public MessageResponse(Integer respCode, String respMessage) { + this.respCode = respCode; + this.respMessage = respMessage; + } +} diff --git a/src/main/java/com/docus/server/archive/service/DeptInfoSyncService.java b/src/main/java/com/docus/server/archive/service/DeptInfoSyncService.java index e4be672..64673a1 100644 --- a/src/main/java/com/docus/server/archive/service/DeptInfoSyncService.java +++ b/src/main/java/com/docus/server/archive/service/DeptInfoSyncService.java @@ -13,4 +13,6 @@ public interface DeptInfoSyncService { * @author YongBin Wen */ void fullSync(); + + } diff --git a/src/main/java/com/docus/server/archive/service/FoShanThreeHospDeptInfoSyncService.java b/src/main/java/com/docus/server/archive/service/FoShanThreeHospDeptInfoSyncService.java new file mode 100644 index 0000000..6f259f2 --- /dev/null +++ b/src/main/java/com/docus/server/archive/service/FoShanThreeHospDeptInfoSyncService.java @@ -0,0 +1,12 @@ +package com.docus.server.archive.service; + +/** + * 科室同步服务 + * + * @author YongBin Wen + * @date 2024/3/27 16:25 + */ +public interface FoShanThreeHospDeptInfoSyncService { + + void syncByUnifyMessageReceive(String message); +} diff --git a/src/main/java/com/docus/server/archive/service/FoShanThreeHospUserInfoSyncService.java b/src/main/java/com/docus/server/archive/service/FoShanThreeHospUserInfoSyncService.java new file mode 100644 index 0000000..57826d9 --- /dev/null +++ b/src/main/java/com/docus/server/archive/service/FoShanThreeHospUserInfoSyncService.java @@ -0,0 +1,12 @@ +package com.docus.server.archive.service; + +/** + * 用户同步服务 + * + * @author YongBin Wen + * @date 2024/3/27 16:25 + */ +public interface FoShanThreeHospUserInfoSyncService { + + void syncByUnifyMessageReceive(String message); +} diff --git a/src/main/java/com/docus/server/archive/service/UserInfoSyncService.java b/src/main/java/com/docus/server/archive/service/UserInfoSyncService.java index 16f9172..dc56233 100644 --- a/src/main/java/com/docus/server/archive/service/UserInfoSyncService.java +++ b/src/main/java/com/docus/server/archive/service/UserInfoSyncService.java @@ -14,4 +14,6 @@ public interface UserInfoSyncService { * @author YongBin Wen */ void fullSync(); + + } diff --git a/src/main/java/com/docus/server/archive/service/impl/FoShanThreeHospDeptInfoSyncServiceImpl.java b/src/main/java/com/docus/server/archive/service/impl/FoShanThreeHospDeptInfoSyncServiceImpl.java new file mode 100644 index 0000000..fa11567 --- /dev/null +++ b/src/main/java/com/docus/server/archive/service/impl/FoShanThreeHospDeptInfoSyncServiceImpl.java @@ -0,0 +1,113 @@ +package com.docus.server.archive.service.impl; + +import com.docus.core.util.Func; +import com.docus.infrastructure.core.exception.BaseException; +import com.docus.infrastructure.redis.service.IdService; +import com.docus.server.archive.constans.SyncConstant; +import com.docus.server.archive.entity.PowerDept; +import com.docus.server.archive.mapper.PowerDeptMapper; +import com.docus.server.archive.service.FoShanThreeHospDeptInfoSyncService; +import com.docus.server.archive.utils.XmlUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.w3c.dom.Node; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author YongBin Wen + * @date 2024/3/27 16:25 + */ +@Service("fssy" + SyncConstant.DEPT_INFO_SYNC_SERVICE_SUFFIX) +@Slf4j +public class FoShanThreeHospDeptInfoSyncServiceImpl implements FoShanThreeHospDeptInfoSyncService { + @Resource + private PowerDeptMapper powerDeptMapper; + @Resource + private IdService idService; + + @Override + public void syncByUnifyMessageReceive(String message) { + List powerDeptList=parsePowerDept(message); + if(Func.isNotEmpty(powerDeptList)){ + saveOrUpdate(powerDeptList); + } + } + + + private List parsePowerDept(String message) { + ArrayList depts = new ArrayList<>(); + + XmlUtil xmlUtil = XmlUtil.of(message); + Node deptCodeNode = xmlUtil.getNode("/Request/Body/ResultContent/Dept/DEPT_CODE"); + Node deptNameNode = xmlUtil.getNode("/Request/Body/ResultContent/Dept/DEPT_NAME"); +// Node deptStopNode = xmlUtil.getNode("/Request/Body/ResultContent/Dept/IS_STOP"); + String deptCode = deptCodeNode.getTextContent(); + String deptName = deptNameNode.getTextContent(); + if(Func.isBlank(deptCode)){ + throw new BaseException("科室编码不能为空!"); + } + if(Func.isBlank(deptName)){ + throw new BaseException("科室名称不能为空!"); + } + + PowerDept dept = new PowerDept(); + dept.setDeptCode(deptCode); + dept.setDeptName(deptName); + dept.setEffective(1); + + depts.add(dept); + return depts; + } + + /** + * 根据修改的科室信息,根据科室code判断是否存在,如果存在则更新科室名称状态信息,如果不存在则插入科室信息 + * + * @param iuPowerDeptList 修改的科室信息 + */ + private void saveOrUpdate(List iuPowerDeptList) { + Date nowDate = new Date(); + List iuDeptCodes = iuPowerDeptList.stream() + .map(PowerDept::getDeptCode) + .collect(Collectors.toList()); + List existsPowerDeptList = powerDeptMapper.findByDeptCodes(iuDeptCodes); + Map existsPowerDeptMap = existsPowerDeptList.stream().collect(Collectors.toMap(PowerDept::getDeptCode, Function.identity())); + + + List insertDeptList = new ArrayList<>(); + List updateDeptList = new ArrayList<>(); + for (PowerDept iuPowerDept : iuPowerDeptList) { + if (existsPowerDeptMap.containsKey(iuPowerDept.getDeptCode())) { + PowerDept powerDept = existsPowerDeptMap.get(iuPowerDept.getDeptCode()); + powerDept.setDeptName(iuPowerDept.getDeptName()); + powerDept.setEffective(iuPowerDept.getEffective()); + powerDept.setUpdateDate(nowDate); + powerDept.setUpdater("java-sync"); + updateDeptList.add(powerDept); + continue; + } + iuPowerDept.setDeptId(idService.getDateSeq()); + iuPowerDept.setUpdater("java-sync"); + iuPowerDept.setUpdateDate(nowDate); + iuPowerDept.setCreater("java-sync"); + iuPowerDept.setCreateDate(nowDate); + iuPowerDept.setType(1); + iuPowerDept.setSort(0); + insertDeptList.add(iuPowerDept); + } + if (Func.isNotEmpty(insertDeptList)) { + powerDeptMapper.insertBatch(insertDeptList); + } + + if (Func.isNotEmpty(updateDeptList)) { + powerDeptMapper.updateBatch(updateDeptList); + } + + } +} diff --git a/src/main/java/com/docus/server/archive/service/impl/FoShanThreeHospUserInfoSyncServiceImpl.java b/src/main/java/com/docus/server/archive/service/impl/FoShanThreeHospUserInfoSyncServiceImpl.java new file mode 100644 index 0000000..be8e14c --- /dev/null +++ b/src/main/java/com/docus/server/archive/service/impl/FoShanThreeHospUserInfoSyncServiceImpl.java @@ -0,0 +1,166 @@ +package com.docus.server.archive.service.impl; + +import com.docus.core.util.Func; +import com.docus.infrastructure.core.exception.BaseException; +import com.docus.infrastructure.redis.service.IdService; +import com.docus.server.archive.config.DocusProperties; +import com.docus.server.archive.constans.SyncConstant; +import com.docus.server.archive.entity.PowerUser; +import com.docus.server.archive.mapper.PowerUserMapper; +import com.docus.server.archive.service.FoShanThreeHospUserInfoSyncService; +import com.docus.server.archive.utils.XmlUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.annotation.Resource; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author YongBin Wen + * @date 2024/3/27 16:25 + */ +@Service("fssy" + SyncConstant.USER_INFO_SYNC_SERVICE_SUFFIX) +@Slf4j +public class FoShanThreeHospUserInfoSyncServiceImpl implements FoShanThreeHospUserInfoSyncService { + @Resource + private PowerUserMapper powerUserMapper; + @Resource + private IdService idService; + @Resource + private DocusProperties docusProperties; + + @Override + public void syncByUnifyMessageReceive(String message) { + List powerUserList = parsePowerUser(message); + if (Func.isNotEmpty(powerUserList)) { + saveOrUpdate(powerUserList); + } + + } + + private List parsePowerUser(String message) { + List powerUserList = new ArrayList<>(); + XmlUtil xmlUtil = XmlUtil.of(message); + NodeList employeeNodeList = xmlUtil.getNodeList("/Request/Body/ResultContent/Employee"); + if (employeeNodeList != null && employeeNodeList.getLength() > 0) { + int nodeListLength = employeeNodeList.getLength(); + for (int i = 0; i < nodeListLength; i++) { + String userName = ""; + String name = ""; + String deptId = ""; + Integer effective = 1; + Integer enabled = 1; + + Node employeeNode = employeeNodeList.item(i); + NodeList childNodes = employeeNode.getChildNodes(); + int childNodesLength = childNodes.getLength(); + for (int j = 0; j < childNodesLength; j++) { + Node node = childNodes.item(j); + String nodeName = node.getNodeName(); + if ("BANK_ACCOUNT".equals(nodeName)) { + userName = node.getTextContent(); + continue; + } + if ("EMPL_NAME".equals(nodeName)) { + name = node.getTextContent(); + continue; + } + if ("DEPT_CODE".equals(nodeName)) { + deptId = node.getTextContent(); + } + } + if(Func.isBlank(userName)){ + throw new BaseException("用户工号不能为空!"); + } + if(Func.isBlank(name)){ + throw new BaseException("用户姓名不能为空!"); + } + PowerUser powerUser = new PowerUser(); + powerUser.setUserName(userName); + powerUser.setName(name); + powerUser.setDeptId(deptId); + powerUser.setEffective(effective); + powerUser.setEnabled(enabled); + powerUser.setPowerDept(deptId); + powerUserList.add(powerUser); + } + } + return powerUserList; + } + + /** + * 根据修改的用户信息,根据工号判断是否存在,如果存在则更新名字,科室 状态等信息,如果不存在则插入用户信息 + * + * @param iuPowerUserList 修改的用户信息 + */ + private void saveOrUpdate(List iuPowerUserList) { + Date nowDate = new Date(); + List iuUserNames = iuPowerUserList.stream() + .map(PowerUser::getUserName) + .collect(Collectors.toList()); + + List existsPowerUserList = powerUserMapper.findByUserNames(iuUserNames); + Map existsPowerUserMap = existsPowerUserList.stream().collect(Collectors.toMap(PowerUser::getUserName, Function.identity())); + final String delimiter = ","; + + List insertUserList = new ArrayList<>(); + List updateUserList = new ArrayList<>(); + for (PowerUser iuPowerUser : iuPowerUserList) { + if (existsPowerUserMap.containsKey(iuPowerUser.getUserName())) { + PowerUser powerUser = existsPowerUserMap.get(iuPowerUser.getUserName()); + // 如果修改的管辖科室不为空,获取原来的,加上现在的,得到最新的,下面管辖医生同理 + String powerDept = powerUser.getPowerDept(); + if (Func.isNotBlank(iuPowerUser.getPowerDept())) { + HashSet powerDepts = new HashSet<>(); + if (Func.isNotBlank(powerDept)) { + Collections.addAll(powerDepts, powerDept.split(delimiter)); + } + powerDepts.add(iuPowerUser.getPowerDept()); + powerDept = String.join(delimiter, powerDepts); + } + String powerAttending = powerUser.getPowerAttending(); + if (Func.isNotBlank(iuPowerUser.getPowerAttending())) { + HashSet powerAttendings = new HashSet<>(); + if (Func.isNotBlank(powerAttending)) { + Collections.addAll(powerAttendings, powerAttending.split(delimiter)); + } + powerAttendings.add(iuPowerUser.getPowerAttending()); + powerAttending = String.join(delimiter, powerAttendings); + } + powerUser.setName(iuPowerUser.getName()); + powerUser.setEnabled(iuPowerUser.getEnabled()); + powerUser.setEffective(iuPowerUser.getEffective()); + powerUser.setDeptId(iuPowerUser.getDeptId()); + powerUser.setPowerDept(powerDept); + powerUser.setPowerAttending(powerAttending); + powerUser.setUpdateDate(nowDate); + powerUser.setUpdater("java-sync"); + updateUserList.add(powerUser); + continue; + } + iuPowerUser.setUserId(idService.getDateSeq()); + iuPowerUser.setUpdater("java-sync"); + iuPowerUser.setUpdateDate(nowDate); + iuPowerUser.setCreater("java-sync"); + iuPowerUser.setCreateDate(nowDate); + iuPowerUser.setAccountState(0); + iuPowerUser.setIsThird(0); + iuPowerUser.setLoginFlag(0); + iuPowerUser.setPwdChange(0); + iuPowerUser.setUserPwd(docusProperties.getDefaultUserPwd()); + insertUserList.add(iuPowerUser); + } + + if (Func.isNotEmpty(insertUserList)) { + powerUserMapper.insertBatch(insertUserList); + } + + if (Func.isNotEmpty(updateUserList)) { + powerUserMapper.updateBatch(updateUserList); + } + } +}