关于获取预约状态功能的业务逻辑部分的总结
今天完成了获取预约功能的Controller、Service、Dao层代码的编写,其中我遇到了两个问题,现总结如下:
1.因为项目是前后端分离的,所以我在Dao层访问数据库的时候应该使用的是Entity作为输入参数,访问数据库,而不是Dto。如果输入参数并不属于数据库字段,我需要新建一个Entity来封装参数,同时该Entity应该继承另一个对应的数据库表的Entity.
2.在业务逻辑方面有一个分组的逻辑非常不错,值得借鉴:
//获取预约状态(指定时间范围的预约状态<以日期分组>) public AppoimentResponseDto getappoimentstatuslist(AppoimentRequestDto ard) throws Exception { int storeid=DataUtil.getCurrent().getStoreid(); HcDmsAppointmentOrderStartToEnd starttoend=new HcDmsAppointmentOrderStartToEnd(); starttoend.setStartdate(ard.getStartdate()); starttoend.setEnddate(ard.getEnddate()); //先查出指定时间范围内的所有预约状态记录 List<HcDmsAppointmentOrder> hdaolist = dmsAppointmentDao.getappoimentstatuslist(starttoend); List<AppoimentlistResponseDto> list = new ArrayList<>(); for (HcDmsAppointmentOrder hcDmsAppointmentOrder : hdaolist) { AppoimentlistResponseDto appoimentlistResponseDto = null; String appoimentdate = hcDmsAppointmentOrder.getAodate(); //预约时间 appoimentdate = appoimentdate.substring(0, 8); //预约日期 for (AppoimentlistResponseDto value : list) { if (value.getDate().equals(appoimentdate)) { //判断日期是否匹配 appoimentlistResponseDto = value; //切换日期对应的对象 } } if (appoimentlistResponseDto == null) { appoimentlistResponseDto = new AppoimentlistResponseDto(); appoimentlistResponseDto.setDate(appoimentdate); //设置日期 list.add(appoimentlistResponseDto); } AppoimentdetailResponseDto dto = new AppoimentdetailResponseDto(); dto.setAoid(hcDmsAppointmentOrder.getAoid()); dto.setAotype(hcDmsAppointmentOrder.getAotype()); dto.setAostoreid(storeid); dto.setAoorderno(hcDmsAppointmentOrder.getAoorderno()); dto.setAovin(hcDmsAppointmentOrder.getAovin()); dto.setAocarplate(hcDmsAppointmentOrder.getAocarplate()); dto.setAodate(hcDmsAppointmentOrder.getAodate()); appoimentlistResponseDto.getDetaillist().add(dto); } AppoimentResponseDto responseDto = new AppoimentResponseDto(); responseDto.setList(list); return responseDto; }
这里的业务逻辑并没有通过if匹配日期来分组,而是通过了切换appoimentlistResponseDto对象的方式。
具体的原理是:
首先查出指定时间范围内的所有预约状态记录。
然后通过遍历该记录集合,将数据封装到List<AppoimentlistResponseDto>中去,AppoimentlistResponseDto中有两个属性,一个是日期字符串String date,另一个是对应该日期的预约状态记录的集合。这个集合的泛型是AppoimentdetailResponseDto 。
创建一个AppoimentdetailResponseDto 对象,在当前循环中先将处了预约时间之外的字段封装进去。
添加一个判断,判断如果AppoimentdetailResponseDto 是一个新的对象的话就封装当前预约状态记录的预约时间给它,并和date属性一起添加到List<AppoimentlistResponseDto>中去。
如果AppoimentlistResponseDto集合中已经有了该date日期的AppoimentlistResponseDto对象,就将它取出来,那么最后一句appoimentlistResponseDto.getDetaillist().add(dto)就可以将封装好的AppoimentdetailResponseDto 对象添加到该AppoimentlistResponseDto对象中。
注意:该分组方法的核心思想是切换封装对象。
--------------------------------------------------------
2018/6/15
今天做二手车项目时,需要取出uc_common_value表中的数据,并根据大分类名分类,表格如下:
取出数据之后需要分组,我又使用了之前的写法,代码如下:
/** * @User zy * @Description 查询车辆登记模块中下拉列表的值 * @return */ public UcCommonValueList getList() { List<UcCommonValueDto> list=transferDao.getList(); //所有常用值 UcCommonValueList ucCommonValueLists=new UcCommonValueList(); List<UcCommonValueListDto> ucCommonValueListDtos=new ArrayList<>(); //按照大分类名分类 for(UcCommonValueDto dto:list){ UcCommonValueListDto ucCommonValueListDto=null; for(UcCommonValueListDto valueListDto:ucCommonValueListDtos){ if(valueListDto.getCvType().equals(dto.getCvType())){ ucCommonValueListDto=valueListDto; } } if(ucCommonValueListDto==null){ ucCommonValueListDto=new UcCommonValueListDto(); ucCommonValueListDto.setCvType(dto.getCvType()); ucCommonValueListDtos.add(ucCommonValueListDto); } ucCommonValueListDto.getUcCommonValueDtoList().add(dto); } ucCommonValueLists.setUcCommonValueListDtoList(ucCommonValueListDtos); return ucCommonValueLists; }注意:测试时我遇到了
ucCommonValueListDto.getUcCommonValueDtoList()
ucCommonValueLists.setUcCommonValueListDtoList(ucCommonValueListDtos);
这两处报空指针的错误,原因是我在对应的Bean中没有初始化List。