尚医通笔记-后台管理
項目分為后臺管理系統和前臺用戶系統。
后臺管理系統主要有醫院設置展示,設置醫院編號、名稱、聯系人、狀態等;醫院展示,醫院列表、詳情、科室信息等;數據字典展示,醫院等級、地區信息、證件類型等,用戶展示,前臺登錄過的用戶、用戶添加的就診人等信息,及預約掛號的統計情況,根據醫院名稱或者日期展示預約人數。
前臺用戶系統主要展示醫院列表,科室信息,點擊科室進行掛號,提交掛號訂單,及用戶登錄等功能。
1.后臺系統
1.醫院設置
數據庫:yygh_hosp 表:hospital_set
模塊:service_hosp
接口:HospitalSetController
主要功能:
1.查詢醫院設置列表
條件分頁查詢,前端傳過來當前頁和每頁記錄數,及條件查詢的條件,這里主要是醫院編號和醫院名稱,編號匹配查詢,名稱模糊查詢。返回給前端自定義的Result類型。
//條件查詢 分頁@PostMapping("findPageHospSet/{current}/{limit}")public Result findPageHospSet(@PathVariable Long current, @PathVariable Long limit, @RequestBody(required = false)HospitalSetQueryVo hospitalSetQueryVo){//創建page對象,傳遞當前頁,每頁記錄數Page<HospitalSet> page = new Page<>(current,limit);//當前頁 每頁記錄//構建條件QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();String hosname = hospitalSetQueryVo.getHosname();//醫院名稱String hoscode = hospitalSetQueryVo.getHoscode();//醫院編號if(!StringUtils.isEmpty(hosname)) {wrapper.like("hosname",hospitalSetQueryVo.getHosname());}if(!StringUtils.isEmpty(hoscode)) {wrapper.eq("hoscode",hospitalSetQueryVo.getHoscode());}//調用方法實現分頁查詢IPage<HospitalSet> pageHospitalSet = hospitalSetService.page(page, wrapper);//返回結果return Result.ok(pageHospitalSet);}
2.邏輯刪除醫院
增加is_deleted字段,表示數據被刪除的狀態。同時在實體類相應字段上加@TableLogic注解,即可實現邏輯刪除。
//2 邏輯刪除醫院設置@ApiOperation(value = "邏輯刪除醫院設置") //為了swagger界面顯示中文@DeleteMapping("{id}")public Result removeHospitalSet(@PathVariable Long id){boolean flag = hospitalSetService.removeById(id);if(flag){return Result.ok(flag);}else {return Result.fail();}}
3.醫院添加及修改
前端傳過來用戶輸入的信息,封裝為HospitalSet對象,后臺使用@RequestBody注解進行解析及封裝,調用mybaitplus封裝好的sava方法進行保存。
//添加醫院@PostMapping("saveHospitalSet")public Result saveHospitalSet(@RequestBody HospitalSet hospitalSet){//設置狀態 1 使用 0 不能使用hospitalSet.setStatus(1);//簽名秘鑰Random random = new Random();hospitalSet.setSignKey(MD5.encrypt(System.currentTimeMillis()+""+random.nextInt(1000)));//調用serviceboolean save = hospitalSetService.save(hospitalSet);if(save) {return Result.ok();} else {return Result.fail();}}
4.批量刪除醫院設置
前端傳過來要刪除的id的集合,后端使用后臺使用@RequestBody注解進行解析及封裝,調用mybaitplus封裝好的方法進行刪除。
//7 批量刪除醫院設置@DeleteMapping("batchRemove")public Result batchRemoveHospitalSet(@RequestBody List<Long> idList) {hospitalSetService.removeByIds(idList);return Result.ok();}
5.醫院設置中用到swagger
1.pom
<!--swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><!--swagger ui--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.7.0</version></dependency>
2.配置類
@Configuration
@EnableSwagger2
public class Swagger2Config {//指定路徑顯示@Beanpublic Docket webApiConfig(){return new Docket(DocumentationType.SWAGGER_2).groupName("webApi").apiInfo(webApiInfo()).select()//只顯示api路徑下的頁面.paths(Predicates.and(PathSelectors.regex("/api/.*"))).build();}//指定路徑顯示@Beanpublic Docket adminApiConfig(){return new Docket(DocumentationType.SWAGGER_2).groupName("adminApi").apiInfo(adminApiInfo()).select()//只顯示admin路徑下的頁面.paths(Predicates.and(PathSelectors.regex("/admin/.*"))).build();}//指定顯示信息private ApiInfo webApiInfo(){return new ApiInfoBuilder().title("網站-API文檔").description("本文檔描述了網站微服務接口定義").version("1.0").contact(new Contact("atguigu", "http://atguigu.com", "493211102@qq.com")).build();}指定顯示信息private ApiInfo adminApiInfo(){return new ApiInfoBuilder().title("后臺管理系統-API文檔").description("本文檔描述了后臺管理系統微服務接口定義").version("1.0").contact(new Contact("atguigu", "http://atguigu.com", "49321112@qq.com")).build();}
}
3.controller添加注解@Api 并且可以指定中文標題
每個接口方法也可以指定為中文標題
5.實體類及字段也可以指定中文
界面可以展示
6.調用
localhost:項目端口/swagger-ui.html
2.數據字典
數據庫:yygh_cmn 表:dict
模塊:service_cmn
接口:DictController
展示一和三級分類的數據信息。
導入和導出功能,用到easyexcel。
1.pom
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version></dependency>
2.導出用到實體類
@Data
public class DictEeVo {@ExcelProperty(value = "id" ,index = 0)private Long id;@ExcelProperty(value = "上級id" ,index = 1)private Long parentId;@ExcelProperty(value = "名稱" ,index = 2)private String name;@ExcelProperty(value = "值" ,index = 3)private String value;@ExcelProperty(value = "編碼" ,index = 4)private String dictCode;
}
3.前端發送請求,直接調用service方法
4.service
//導出@Override@CacheEvict(value = "dict", allEntries=true)public void exportData(HttpServletResponse response) {try {//設置下載的信息response.setContentType("application/vnd.ms-excel");//格式excelresponse.setCharacterEncoding("utf-8");
這里URLEncoder.encode可以防止中文亂碼 當然和easyexcel沒有關系String fileName = URLEncoder.encode("數據字典", "UTF-8");//Content-disposition:以下載的方式執行此操作response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");//查數據庫 查出list對象的集合 封裝到表頭的dicteevo對象的listList<Dict> dictList = baseMapper.selectList(null);List<DictEeVo> dictVoList = new ArrayList<>(dictList.size());for(Dict dict : dictList) {DictEeVo dictVo = new DictEeVo();BeanUtils.copyProperties(dict, dictVo);dictVoList.add(dictVo);}EasyExcel.write(response.getOutputStream(), DictEeVo.class).sheet("數據字典").doWrite(dictVoList);} catch (IOException e) {e.printStackTrace();}}
5.導入
創建監聽器,重寫invoke方法
public class DictListener extends AnalysisEventListener<DictEeVo> {private DictMapper dictMapper;public DictListener(DictMapper dictMapper) {this.dictMapper = dictMapper;}@Overridepublic void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) {//調用方法添加數據庫Dict dict = new Dict();BeanUtils.copyProperties(dictEeVo,dict);dict.setIsDeleted(0);dictMapper.insert(dict);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}
6.controller
7.service
//導入@Overridepublic void importData(MultipartFile file) {try {EasyExcel.read(file.getInputStream(),DictEeVo.class,new DictListener(baseMapper)).sheet().doRead();} catch (IOException e) {e.printStackTrace();}}
8.前端通過該屬性顯示上傳圖標,點擊選擇文件進行上傳。
3.醫院上傳接口
數據庫:mongodb
模塊:service_hosp
接口:APIController
類:hosptal
通過hospital-manage模塊模擬醫院模塊,調用本地后臺接口實現醫院信息科室信息排班信息上傳。
醫院設置 更新數據到表
1.醫院添加
manage模塊controller:
manage模塊service
調用HttpRequestHelper.sendRequest將封裝好的數據發送到hospital模塊。
@Overridepublic boolean saveHospital(String data) {JSONObject jsonObject = JSONObject.parseObject(data);Map<String, Object> paramMap = new HashMap<>();paramMap.put("hoscode",jsonObject.getString("hoscode"));paramMap.put("hosname",jsonObject.getString("hosname"));paramMap.put("hostype",jsonObject.getString("hostype"));paramMap.put("provinceCode",jsonObject.getString("provinceCode"));paramMap.put("cityCode", jsonObject.getString("cityCode"));paramMap.put("districtCode",jsonObject.getString("districtCode"));paramMap.put("address",jsonObject.getString("address"));paramMap.put("intro",jsonObject.getString("intro"));paramMap.put("route",jsonObject.getString("route"));//圖片paramMap.put("logoData", jsonObject.getString("logoData"));JSONObject bookingRule = jsonObject.getJSONObject("bookingRule");paramMap.put("bookingRule",bookingRule.toJSONString());paramMap.put("timestamp", HttpRequestHelper.getTimestamp());// paramMap.put("sign",MD5.encrypt(this.getSignKey()));JSONObject respone = HttpRequestHelper.sendRequest(paramMap,this.getApiUrl()+"/api/hosp/saveHospital");System.out.println(respone.toJSONString());if(null != respone && 200 == respone.getIntValue("code")) {return true;} else {throw new YyghException(respone.getString("message"), 201);}}
hosp接口:
獲取傳過來的醫院信息將數據保存到mongodb
@ApiOperation(value = "上傳醫院") //把數據傳到mongodb中@PostMapping("saveHospital")public Result saveHospital(HttpServletRequest request) {Map<String, String[]> requestMap = request.getParameterMap();//getParameterMap獲取的是map集合 value是一個string數組 需要轉化為對象!!!!Map<String, Object> paramMap = HttpRequestHelper.switchMap(requestMap);//獲取傳過來的map中的簽名key 帶MD5//加密String hospSign = (String)paramMap.get("sign");
// if(StringUtils.isEmpty(hoscode)) {
// throw new YyghException(ResultCodeEnum.PARAM_ERROR);
// }
//簽名校驗//醫院編碼String hoscode = (String)paramMap.get("hoscode");//根據編碼查詢數據庫 獲取簽名//String signKey = hospitalSetService.getSignKey(hoscode);//進行MD5加密//String signKeyMD5 = MD5.encrypt(signKey);// if(!hospSign.equals(signKeyMD5)){// throw new YyghException(ResultCodeEnum.SIGN_ERROR);// }
// //傳輸過程中“+”轉換為了“ ”,因此我們要轉換回來 //醫院logoString logoData = (String)paramMap.get("logoData");logoData = logoData.replaceAll(" ", "+");paramMap.put("logoData", logoData);hospitalService.save(paramMap);return Result.ok();}
hosp service:
//上傳醫院信息 保存@Overridepublic void save(Map<String, Object> paramMap) {
// String mappstring =JSONObject.toJSONString(paramMap)//將傳過來的paramMap線轉化為字符串 再轉化為hospital對象!!!!!類中要定義規則Hospital hospital = JSONObject.parseObject(JSONObject.toJSONString(paramMap),Hospital.class);//判斷是否存在Hospital targetHospital = hospitalRepository.getHospitalByHoscode(hospital.getHoscode());if(null != targetHospital) {hospital.setStatus(targetHospital.getStatus());hospital.setCreateTime(targetHospital.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);}}
科室及排班上傳流程相同,需要注意定義為唯一索引的字段不可以重復,否則存入mongodb的時候會報錯
4.醫院列表
在mongodb中進行條件分頁查詢
//查詢醫院列表@Overridepublic Page<Hospital> selectHospPage(Integer page, Integer limit, HospitalQueryVo hospitalQueryVo) {//創建pageable對象Pageable pageable = PageRequest.of(page-1,limit);//創建條件匹配器ExampleMatcher matcher = ExampleMatcher.matching().withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING).withIgnoreCase(true);//hospitalSetQueryVo轉換Hospital對象Hospital hospital = new Hospital();BeanUtils.copyProperties(hospitalQueryVo,hospital);//創建對象Example<Hospital> example = Example.of(hospital,matcher);//調用方法實現查詢 //查詢mongodb中的數據Page<Hospital> pages = hospitalRepository.findAll(example, pageable);//獲取查詢list集合,遍歷進行醫院等級封裝pages.getContent().stream().forEach(item -> {//調用方法 遠程調用cmn中的接口 查詢醫院等級和位置this.setHospitalHosType(item);});return pages;}
5.查看醫院排班
1.查詢科室列表
controller
//根據醫院編號,查詢醫院所有科室列表@ApiOperation(value = "查詢醫院所有科室列表")@GetMapping("getDeptList/{hoscode}")public Result getDeptList(@PathVariable String hoscode){List<DepartmentVo> list = departmentService.findDeptTree(hoscode);return Result.ok(list);}
service
@Override//排班管理會調用 查詢所有排班public List<DepartmentVo> findDeptTree(String hoscode) {//創建list集合 封裝最后的數據 departmentvo 科室編號,科室名稱 下級節點(包含departmentvo對象)List<DepartmentVo> result=new ArrayList<>();//根據醫院編號,查詢醫院所有科室信息Department departmentQuery = new Department();departmentQuery.setHoscode(hoscode);Example example = Example.of(departmentQuery);//springdata查詢條件//所有科室列表 departmentList 根據醫院編號查詢List<Department> departmentList = departmentRepository.findAll(example);//根據大科室編號 bigcode 分組,獲取每個大科室里面下級子科室Map<String, List<Department>> deparmentMap =departmentList.stream().collect(Collectors.groupingBy(Department::getBigcode));//遍歷map集合 deparmentMap //大科室集合 一共12個for(Map.Entry<String,List<Department>> entry:deparmentMap.entrySet()){//大科室編號String bigcode = entry.getKey();//大科室編號對應的全局數據 每個大科室下邊的小科室List<Department> deparment1List = entry.getValue();//封裝大科室DepartmentVo departmentVo1 = new DepartmentVo();departmentVo1.setDepcode(bigcode);//get0是因為list中存的bigname都一樣 隨便取一個就行departmentVo1.setDepname(deparment1List.get(0).getBigname());//封裝小科室List<DepartmentVo> children = new ArrayList<>();//遍歷這個大科室下的list集合for(Department department: deparment1List) {DepartmentVo departmentVo2 = new DepartmentVo();departmentVo2.setDepcode(department.getDepcode());departmentVo2.setDepname(department.getDepname());//封裝到list集合children.add(departmentVo2);}//把小科室list集合放到大科室children里面departmentVo1.setChildren(children);//放到最終result里面result.add(departmentVo1);}//返回return result;}
2.查詢排班信息
controller:
//根據醫院編號 和 科室編號 ,查詢排班規則數據@ApiOperation(value ="查詢排班規則數據")@GetMapping("getScheduleRule/{page}/{limit}/{hoscode}/{depcode}")public Result getScheduleRule(@PathVariable long page,@PathVariable long limit,@PathVariable String hoscode,@PathVariable String depcode){Map<String,Object> map = scheduleService.getRuleSchedule(page,limit,hoscode,depcode);return Result.ok(map);}
@Override//排班管理調用public Map<String, Object> getRuleSchedule(long page, long limit, String hoscode, String depcode) {//1 根據醫院編號 和 科室編號 查詢Criteria criteria = Criteria.where("hoscode").is(hoscode).and("depcode").is(depcode);//2 根據工作日workDate期進行分組Aggregation agg = Aggregation.newAggregation(Aggregation.match(criteria),//匹配條件Aggregation.group("workDate")//分組字段.first("workDate").as("workDate")//3 統計號源數量.count().as("docCount").sum("reservedNumber").as("reservedNumber").sum("availableNumber").as("availableNumber"),//排序Aggregation.sort(Sort.Direction.DESC,"workDate"),//4 實現分頁Aggregation.skip((page-1)*limit),Aggregation.limit(limit));//調用方法,最終執行AggregationResults<BookingScheduleRuleVo> aggResults =mongoTemplate.aggregate(agg, Schedule.class, BookingScheduleRuleVo.class);List<BookingScheduleRuleVo> bookingScheduleRuleVoList = aggResults.getMappedResults();//分組查詢的總記錄數Aggregation totalAgg = Aggregation.newAggregation(Aggregation.match(criteria),Aggregation.group("workDate"));AggregationResults<BookingScheduleRuleVo> totalAggResults =mongoTemplate.aggregate(totalAgg, Schedule.class, BookingScheduleRuleVo.class);int total = totalAggResults.getMappedResults().size();//把日期對應星期獲取for(BookingScheduleRuleVo bookingScheduleRuleVo:bookingScheduleRuleVoList) {Date workDate = bookingScheduleRuleVo.getWorkDate();String dayOfWeek = this.getDayOfWeek(new DateTime(workDate));bookingScheduleRuleVo.setDayOfWeek(dayOfWeek);}//設置最終數據,進行返回Map<String, Object> result = new HashMap<>();result.put("bookingScheduleRuleList",bookingScheduleRuleVoList);result.put("total",total);//獲取醫院名稱String hosName = hospitalService.getHospName(hoscode);//其他基礎數據Map<String, String> baseMap = new HashMap<>();baseMap.put("hosname",hosName);result.put("baseMap",baseMap);return result;}
3.查詢某一天排班具體信息
controller:
//根據醫院編號 、科室編號和工作日期,查詢排班詳細信息@ApiOperation(value = "查詢排班詳細信息")@GetMapping("getScheduleDetail/{hoscode}/{depcode}/{workDate}")public Result getScheduleDetail( @PathVariable String hoscode,@PathVariable String depcode,@PathVariable String workDate) {List<Schedule> list = scheduleService.getDetailSchedule(hoscode,depcode,workDate);return Result.ok(list);}
service
//根據醫院編號 、科室編號和工作日期,查詢排班詳細信息@Override//排班管理調用public List<Schedule> getDetailSchedule(String hoscode, String depcode, String workDate) {//根據參數查詢mongodbList<Schedule> scheduleList =scheduleRepository.findScheduleByHoscodeAndDepcodeAndWorkDate(hoscode,depcode,new DateTime(workDate).toDate());//把得到list集合遍歷,向設置其他值:醫院名稱、科室名稱、日期對應星期scheduleList.stream().forEach(item->{this.packageSchedule(item);});return scheduleList;}
總結
以上是生活随笔為你收集整理的尚医通笔记-后台管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用妇保康栓好转的症状
- 下一篇: 超实用的54套ASP网站设计源码