feat: 佛山三院科室和用户推送信息处理同步

master
wyb 1 year ago
parent a3358a509a
commit a3f4dd0da3

@ -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 "<Response>\n" +
" <Header>\n" +
" <SourceSystem>" + source + "</SourceSystem>\n" +
" <MessageID>" + msgId + "</MessageID>\n" +
" </Header>\n" +
" <Body>\n" +
" <ResultCode>AA</ResultCode>\n" +
" <ResultContent>成功</ResultContent>\n" +
" </Body>\n" +
"</Response>";
}
private String userFail(String source, String msgId, String message) {
return "<Response>\n" +
" <Header>\n" +
" <SourceSystem>" + source + "</SourceSystem>\n" +
" <MessageID>" + msgId + "</MessageID>\n" +
" </Header>\n" +
" <Body>\n" +
" <ResultCode>AE</ResultCode>\n" +
" <ResultContent>" + message + "</ResultContent>\n" +
" </Body>\n" +
"</Response>";
}
private String deptSuccess(String source, String msgId) {
return "<Response>\n" +
" <Header>\n" +
" <SourceSystem>" + source + "</SourceSystem>\n" +
" <MessageID>" + msgId + "</MessageID>\n" +
" </Header>\n" +
" <Body>\n" +
" <ResultCode>AA</ResultCode>\n" +
" <ResultContent>成功</ResultContent>\n" +
" </Body>\n" +
"</Response>";
}
private String deptFail(String source, String msgId, String message) {
return "<Response>\n" +
" <Header>\n" +
" <SourceSystem>" + source + "</SourceSystem>\n" +
" <MessageID>" + msgId + "</MessageID>\n" +
" </Header>\n" +
" <Body>\n" +
" <ResultCode>AE</ResultCode>\n" +
" <ResultContent>" + message + "</ResultContent>\n" +
" </Body>\n" +
"</Response>";
}
}

@ -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 + '\'' +
'}';
}
}

@ -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;
}
}

@ -13,4 +13,6 @@ public interface DeptInfoSyncService {
* @author YongBin Wen
*/
void fullSync();
}

@ -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);
}

@ -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);
}

@ -14,4 +14,6 @@ public interface UserInfoSyncService {
* @author YongBin Wen
*/
void fullSync();
}

@ -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<PowerDept> powerDeptList=parsePowerDept(message);
if(Func.isNotEmpty(powerDeptList)){
saveOrUpdate(powerDeptList);
}
}
private List<PowerDept> parsePowerDept(String message) {
ArrayList<PowerDept> 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<PowerDept> iuPowerDeptList) {
Date nowDate = new Date();
List<String> iuDeptCodes = iuPowerDeptList.stream()
.map(PowerDept::getDeptCode)
.collect(Collectors.toList());
List<PowerDept> existsPowerDeptList = powerDeptMapper.findByDeptCodes(iuDeptCodes);
Map<String, PowerDept> existsPowerDeptMap = existsPowerDeptList.stream().collect(Collectors.toMap(PowerDept::getDeptCode, Function.identity()));
List<PowerDept> insertDeptList = new ArrayList<>();
List<PowerDept> 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);
}
}
}

@ -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<PowerUser> powerUserList = parsePowerUser(message);
if (Func.isNotEmpty(powerUserList)) {
saveOrUpdate(powerUserList);
}
}
private List<PowerUser> parsePowerUser(String message) {
List<PowerUser> 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<PowerUser> iuPowerUserList) {
Date nowDate = new Date();
List<String> iuUserNames = iuPowerUserList.stream()
.map(PowerUser::getUserName)
.collect(Collectors.toList());
List<PowerUser> existsPowerUserList = powerUserMapper.findByUserNames(iuUserNames);
Map<String, PowerUser> existsPowerUserMap = existsPowerUserList.stream().collect(Collectors.toMap(PowerUser::getUserName, Function.identity()));
final String delimiter = ",";
List<PowerUser> insertUserList = new ArrayList<>();
List<PowerUser> 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<String> 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<String> 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);
}
}
}
Loading…
Cancel
Save