## 尚医通开发项目(三)
实现科室的添加展示和删除:
效果如图:
先看模块api部分(添加):
Service:
@Override
public boolean saveDepartment(String data) {
JSONArray jsonArray = new JSONArray();
if(!data.startsWith("[")) {
JSONObject jsonObject = JSONObject.parseObject(data);
jsonArray.add(jsonObject);
} else {
jsonArray = JSONArray.parseArray(data);
}
for(int i=0, len=jsonArray.size(); i<len; i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("hoscode",this.getHoscode());
paramMap.put("depcode",jsonObject.getString("depcode"));
paramMap.put("depname",jsonObject.getString("depname"));
paramMap.put("intro",jsonObject.getString("intro"));
paramMap.put("bigcode", jsonObject.getString("bigcode"));
paramMap.put("bigname",jsonObject.getString("bigname"));
paramMap.put("timestamp", HttpRequestHelper.getTimestamp());
paramMap.put("sign",MD5.encrypt(this.getSignKey()));
JSONObject respone = HttpRequestHelper.sendRequest(paramMap,this.getApiUrl()+"/api/hosp/saveDepartment");
System.out.println(respone.toJSONString());
if(null == respone || 200 != respone.getIntValue("code")) {
throw new YyghException(respone.getString("message"), 201);
}
}
return true;
}
Controller:
@RequestMapping(value="/department/save",method=RequestMethod.POST)
public String save(String data, HttpServletRequest request) {
try {
apiService.saveDepartment(data);
} catch (YyghException e) {
return this.failurePage(e.getMessage(),request);
} catch (Exception e) {
return this.failurePage("数据异常",request);
}
return this.successPage(null,request);
}
直接解释Service:
因为是以json文件的形式发送的,里边都是数据,可以看出是把数据依次读取来一条条的存储.
截取了一部分json展示:
[
{"hoscode":"1000_0","depcode":"200050923","depname":"门诊部核酸检测门诊(东院)","intro":"门诊部核酸检测门诊(东院)","bigcode":"44f162029abb45f9ff0a5f743da0650d","bigname":"全部科室"},
{"hoscode":"1000_0","depcode":"200050924","depname":"国际医疗部门诊","intro":"国际医疗部门诊","bigcode":"44f162029abb45f9ff0a5f743da0650d","bigname":"全部科室"},
{"hoscode":"1000_0","depcode":"200050931","depname":"临床营养科(西院国际医疗)","intro":"临床营养科(西院国际医疗)","bigcode":"44f162029abb45f9ff0a5f743da0650d","bigname":"全部科室"},
{"hoscode":"1000_0","depcode":"200050964","depname":"内分泌科互联网诊疗","intro":"内分泌科互联网诊疗","bigcode":"44f162029abb45f9ff0a5f743da0650d","bigname":"全部科室"},
{"hoscode":"1000_0","depcode":"200051188","depname":"心内科互联网诊疗","intro":"心内科互联网诊疗","bigcode":"44f162029abb45f9ff0a5f743da0650d","bigname":"全部科室"},
{"hoscode":"1000_0","depcode":"200051469","depname":"特需心理医学科门诊2","intro":"特需心理医学科门诊2","bigcode":"44f162029abb45f9ff0a5f743da0650d","bigname":"全部科室"},
{"hoscode":"1000_0","depcode":"200041542","depname":"特需心内科门诊2","intro":"特需心内科门诊2","bigcode":"1c87253ca8aa8fc966a2443eeaac0fc1","bigname":"内科"},
{"hoscode":"1000_0","depcode":"200042374","depname":"特需消化内科门诊2","intro":"特需消化内科门诊2","bigcode":"1c87253ca8aa8fc966a2443eeaac0fc1","bigname":"内科"},
{"hoscode":"1000_0","depcode":"200040886","depname":"特需内分泌科门诊(西院)1","intro":"特需内分泌科门诊(西院)1","bigcode":"1c87253ca8aa8fc966a2443eeaac0fc1","bigname":"内科"},]
流程就是把里边的属性都依次取出来然后封装到map中传递给后端接口开发。
后端开发部分:
Controller:
/*
保存科室到mong
* */
@PostMapping("saveDepartment")
public Result saveDepartment(HttpServletRequest request){
Map<String, String[]> parameterMap = request.getParameterMap();
Map<String, Object> map = HttpRequestHelper.switchMap(parameterMap);
//验证数字签名
//1.获取医院传递过来的签名,签名是进行md5的加密
String sign = (String)map.get("sign");
//再查询数据库中的签名,然后对比
String hoscode=(String) map.get("hoscode");
String signKey = hospitalSetService.getSignKey(hoscode);
//3.查出来的签名进行加密
String signKeyMD5= MD5.encrypt(signKey);
//4.判断签名是否一致
if(!sign.equals(signKeyMD5)){
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
departmentService.saveDepartment(map);
return Result.ok();
}
大体就是:
得到map对象中的唯一签名sign和唯一标识id,然后从数据库中根据唯一标识id查出数据与传递过来的签名进行比对,如果相同就执行保存的方法。
Service:
//保存科室信息
void saveDepartment(Map<String, Object> map);
实现:
//上传科室
@Override
public void saveDepartment(Map<String, Object> map) {
//map转化为对象
String mapString = JSONObject.toJSONString(map);
Department department = JSONObject.parseObject(mapString, Department.class);
//根据医院编号和科室编号查询是否已经存在
Department dept= departmentRepository.getDepartmentByHoscodeAndDepcode(department.getHoscode(),department.getDepcode());
if (dept != null) {
//修改更新的时间等,注意要把查询出来的id传进save里,要不然就是新增
department.setId(dept.getId());
department.setUpdateTime(new Date());
department.setIsDeleted(0);
departmentRepository.save(department);
}
else {
department.setCreateTime(new Date());
department.setUpdateTime(new Date());
department.setIsDeleted(0);
departmentRepository.save(department);
}
}
大体意思:
首先把map集合转为对象Department类型:
String mapString = JSONObject.toJSONString(map);
Department department = JSONObject.parseObject(mapString, Department.class);
接下来就是先判断是否数据库中已经存在,如果存在就更新,不存在就保存.(根据医院唯一id以及科室编号)
对应方法:
Department getDepartmentByHoscodeAndDepcode(String hoscode, String depcode);
然后因为是Mongo数据库,它的这个更新和保存是同一个方法,有人说:注意要把查询出来的id传进save里,要不然就是新增,意思就是如果数据存在,数据库会执行更新方法,因为你从request域中保存的数据是没有id的,要是直接更新mongo会把它当做新数据插入.
列表分页展示部分:
不得不说我感觉Mongo数据库条件查询太麻烦了,我直接不想写。
首先看API部分:
Controller:
@RequestMapping("/department/list")
public String findDepartment(ModelMap model,
@RequestParam(defaultValue = "1") int pageNum,
@RequestParam(defaultValue = "10") int pageSize,
HttpServletRequest request,RedirectAttributes redirectAttributes) {
try {
HospitalSet hospitalSet = hospitalSetMapper.selectById(1);
if(null == hospitalSet || StringUtils.isEmpty(hospitalSet.getHoscode()) || StringUtils.isEmpty(hospitalSet.getSignKey())) {
this.failureMessage("先设置医院code与签名key", redirectAttributes);
return "redirect:/hospitalSet/index";
}
model.addAllAttributes(apiService.findDepartment(pageNum, pageSize));
} catch (YyghException e) {
this.failureMessage(e.getMessage(), request);
} catch (Exception e) {
this.failureMessage("数据异常", request);
}
return "department/index";
}
大体:
前端传递过来当前页以及每页显示的数量,然后就是先判断有没有唯一id和签名,
然后把pageNum和pageSize传递给Service如下:
Service:
@Override
public Map<String, Object> findDepartment(int pageNum, int pageSize) {
Map<String, Object> result = new HashMap();
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("hoscode",this.getHoscode());
//paramMap.put("depcode",depcode);
paramMap.put("page",pageNum);
paramMap.put("limit",pageSize);
paramMap.put("timestamp", HttpRequestHelper.getTimestamp());
paramMap.put("sign", HttpRequestHelper.getSign(paramMap, this.getSignKey()));
JSONObject respone = HttpRequestHelper.sendRequest(paramMap,this.getApiUrl()+"/api/hosp/department/list");
if(null != respone && 200 == respone.getIntValue("code")) {
JSONObject jsonObject = respone.getJSONObject("data");
result.put("total", jsonObject.getLong("totalElements"));
result.put("pageNum", pageNum);
result.put("list", jsonObject.getJSONArray("content"));
} else {
throw new YyghException(respone.getString("message"), 201);
}
return result;
}
解释:
首先就是获得hoscode,page,limit,签名然后封装为map然后传递到我们的接口中去,获得hoscode以及sign主要是把根据hoscode查出来的签名,但根本没必要,看代码可以发现这两者的数据都是在同一个数据库中查出的同一条数据.
然后看后端开发接口部分:
Controller:
/*
查询科室
* */
@PostMapping("department/list")
public Result listDept(HttpServletRequest request){
Map<String, String[]> parameterMap = request.getParameterMap();
Map<String, Object> map = HttpRequestHelper.switchMap(parameterMap);
//医院编号
String hoscode =(String) map.get("hoscode");
//当前页
Integer page=Integer.parseInt((String)map.get("page"));
if(page==0){
page = 1;
}
Integer limit=Integer.parseInt((String) map.get("limit"));
if (limit == 0) {
limit = 1;
}
//TODO签名校验
//验证数字签名
//1.获取医院传递过来的签名,签名是进行md5的加密
String sign = (String)map.get("sign");
//再查询数据库中的签名,然后对比
String signKey = hospitalSetService.getSignKey(hoscode);
//3.查出来的签名进行加密
String signKeyMD5= MD5.encrypt(signKey);
//4.判断签名是否一致
if(!sign.equals(signKeyMD5)){
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
DepartmentQueryVo departmentQueryVo=new DepartmentQueryVo();
departmentQueryVo.setHoscode(hoscode);
Page<Department> page1= departmentService.findPageDepartment(page,limit,departmentQueryVo);
return Result.ok(page1);
}
解释:
首先就是判断签名是否一致,其次就是调用Service方法:
@Override
public Page<Department> findPageDepartment(int page, int limit, DepartmentQueryVo departmentQueryVo) {
Department department=new Department();
BeanUtils.copyProperties(departmentQueryVo,department);
department.setIsDeleted(0);
//pageable对象
Pageable pageable= PageRequest.of(page-1,limit);
//example:构建条件查询对象
ExampleMatcher matcher = ExampleMatcher.matching().withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
.withIgnoreCase();
Example<Department> example = Example.of(department,matcher);
Page<Department> all = departmentRepository.findAll(example, pageable);
return all;
}
注:
这里边的 DepartmentQueryVo类就比Department少了一个属性,其实没有必要,我直接用的Department类来写的.
Example<Department> example = Example.of(department,matcher)
这个意思是:创建一个包含匹配器的实例,找出department中hoscode=…的数据。
然后调用mongdb配置类departmentRepository.findAll()方法查找后返回。
删除:
不说了简单。