关于获取预约状态功能的业务逻辑部分的总结

今天完成了获取预约功能的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。