前言
需求:在《分布式預約掛號平臺》中完成上傳醫院接口開發,再通過醫院接口模擬系統(醫院管理表)調用平臺中的接口,從而實現上傳醫院的功能。另外,所有通過平臺中接口上傳的信息都需要被保存到MongoDB中,通過MongoDB來進行操作。
本篇文章根據上述需求,對《分布式醫療掛號系統》中的上傳醫院接口進行實現,項目代碼已同步至github,https://github.com/Guoqianliang/yygh_parent
一、集成MongoDB
上傳醫院接口的開發仍然在之前創建好的service-hosp
模塊中進行,由于此次額外使用了MongoDB技術,所以首先需要引入MongoDB的依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
除了引入MongoDB的依賴還需要將MongoDB數據庫添加到配置中:
spring.data.mongodb.uri=mongodb://[ip地址]:27017/[MongoDB的數據庫]
將來通過接口會向MongoDB上傳一張hospital文檔,下標對這些記錄進行說明,這些表在Java中也需要有一個對應的實體類。
二、開發Controller層
上傳醫院的接口路徑為:/api/hosp/saveHospital
,下面分析ApiController中上傳醫院接口所做的事情:
1.將從醫院管理表傳遞過來的醫院信息轉換為Object類型
2.獲取醫院管理表中的密鑰(已經使用MD5加密好了)
3.獲取醫院設置表中的密鑰并進行MD5加密 此處調用醫院設置業務層
4.密鑰不匹配就拋出錯誤
5.傳遞的圖片涉及base64編碼問題,需要將logoData記錄中所有的" "替換為+
6.執行上傳操作 此處調用醫院管理業務層
詳細代碼實現:
@RestController @RequestMapping("/api/hosp") public class ApiController { @Autowired private HospitalService hospitalService; @Autowired private HospitalSetService hospitalSetService; @ApiOperation(value = "上傳醫院到數據庫") @PostMapping("saveHospital") public Result saveHosp(HttpServletRequest request) { // 1.將從醫院管理表傳遞過來的醫院信息轉換為Object類型 Map<String, String[]> requestMap = request.getParameterMap(); Map<String, Object> paramMap = HttpRequestHelper.switchMap(requestMap); // 2.獲取醫院管理表中的密鑰(已經使用MD5加密好了) String hospSign = (String) paramMap.get("sign"); // 3.獲取醫院設置表中的密鑰并進行MD5加密 String hoscode = (String) paramMap.get("hoscode"); String signKey = hospitalSetService.getSignKey(hoscode); String signKeyMd5 = MD5.encrypt(signKey); // 4.密鑰不匹配就拋出錯誤 if (!hospSign.equals(signKeyMd5)) { throw new YyghException(ResultCodeEnum.SIGN_ERROR); } // 5.傳遞的圖片涉及base64編碼問題,需要將logoData記錄中所有的" "替換為+ String logoData = (String) paramMap.get("logoData"); logoData = logoData.replaceAll(" ", "+"); paramMap.put("logoData", logoData); // 6.執行上傳操作 hospitalService.save(paramMap); return Result.ok(); } }
三、開發Service層
醫院設置的Service層
在醫院設置的Service層中根據醫院編碼獲取SignKey,下面是接口和實現類:
public interface HospitalSetService extends IService<HospitalSet> { String getSignKey(String hoscode); }
@Service public class HospitalSetServiceImpl extends ServiceImpl<HospitalSetMapper, HospitalSet> implements HospitalSetService { @Override public String getSignKey(String hoscode) { QueryWrapper<HospitalSet> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("hoscode", hoscode); HospitalSet hospitalSet = baseMapper.selectOne(queryWrapper); return hospitalSet.getSignKey(); } }
醫院管理的Service層
分析醫院管理Service層所做的事情:
1.把參宿map集合轉換為Hospital對象(借助JSONObject工具)
2.判斷MongoDB中是否已有這條記錄
3.如果有就執行更新,沒有就執行保存
詳細代碼實現:
public interface HospitalService { void save(Map<String, Object> paramMap); }
@Service public class HospitalServiceImpl implements HospitalService { @Autowired private HospitalRepository hospitalRepository; @Override public void save(Map<String, Object> paramMap) { // 1.把參宿map集合轉換為Hospital對象(借助JSONObject工具) String mapString = JSONObject.toJSONString(paramMap); Hospital hospital = JSONObject.parseObject(mapString, Hospital.class); // 2.判斷MongoDB中是否已有這條記錄 String hoscode = hospital.getHoscode(); Hospital hospitalExist = hospitalRepository.getHospitalByHoscode(hoscode); // 3.如果有就執行更新,沒有就執行保存 if (null != hospitalExist) { hospital.setStatus(hospitalExist.getStatus()); hospital.setCreateTime(hospitalExist.getCreateTime()); hospital.setUpdateTime(new Date()); hospital.setIsDeleted(0); hospitalRepository.save(hospital); } else { //0:未上線 1:已上線 hospital.setStatus(0); hospital.setCreateTime(new Date()); hospital.setUpdateTime(new Date()); hospital.setIsDeleted(0); hospitalRepository.save(hospital); } } }
四、Respository數據層
在Respository層中僅僅進行了根據HosCode獲得記錄的方法定義,MongoDB會智能的為我們生成相應查詢代碼。(這需要我們對類名進行規范定義,當然,這并不是本篇文章所討論的內容)
@Repository public interface HospitalRepository extends MongoRepository<Hospital,String> { /** * 根據HosCode獲得記錄 * @param hoscode * @return */ Hospital getHospitalByHoscode(String hoscode); }
五、測試上傳醫院接口
運行醫院設置和醫院管理兩個微服務模塊,打開醫院管理模塊的模擬添加頁面,加入一條JSON測試記錄。
點擊保存后,調用醫院設置中的api接口,最終將數據保存到了MongoDB中:
至此,開發上傳醫院接口的后端代碼,全部完成,更多關于分布式醫療掛號系統的資料請關注其它相關文章!