finance的客户关怀支出再总结

数据库表两个:第一个是客户支出途径用的,第二个很绕,里面就是用于显示需要的字段(多个用于时间段查询的),但是新增的时候是两个表的所有内容!两个表用客户id关联。

     另外,数据库表两个,但后台的实体类其实是三个,第一,用于显示(6个显示的+id+搜索时间,共8个),第二用于接受客户支出途径项的(4个,id+客户id用于关联+支出途径和途径支出金额),第三,用于综合两者,也可以说用于新增的(共10个,用于显示的6个+客户支出途径的两个+客户id+一个List(支出途径项))。下面的是用户支出途径表:

说下面之前要清楚一点dao service serviceImpl都是继承或者实现的用于显示的那个pojo类。

Controller就不需要了,但是注入的service也是用于显示的那个:

1. 列表

要清楚,列表只是一个显示,做的时候可以在数据库添加一条,然后显示出来就好了。所以service和controller不需要写太多,就是需要做筛选,和列表显示有关系,所以在findpage里需要做一些筛选操作,注意筛选是写在service实现类里。而且是有专门的一个实体类用于显示的,所以不用写专门的sql用于查询,用通用mapper就可以了:selectByExampledao层及以下都不用写它。

2. 新增(最重要!两个新增的组合)

       由于新增里头的内容最多,不能用用于显示的来接收,专门有一个实体类用于新增,实体类里有数据库的两张表的所有内容(除了做筛选用的时间段的字段),客户id(client_id)是桥梁,一个就好,注意字段的类型。然后还有一个List类型的字段:这个很重要,我是可能想不到的:

这两个就是另一个表的字段,另一个表还有自己的id和客户id。

用于新增的sql就两个:

Dao层和sql保持一致(注意:说的是新增块)

Service块:只是多了一个,用的通用mapper(insert

)所以dao没有

Service实现层就是具体的实现,没什么说的,就是插入有客户支出途径用的通用的mapper:insert。

Controller:(关键中的关键)实质:一个妈俩孩子,注意add的参数列表。

@MethodDesc(value = "添加客户关怀支出", type = MethodDesc.Type.ADD)
   
@RequiresPermissions("clientExpense:add")
   
@RequestMapping("/add")
   
public ResultObject add(SysWayResultObject sysWayResultObject){


        SysClientExpense sysClientExpense = new SysClientExpense();
//      新增的实体类最全,从里面获得数据往显示列表的实体类里塞,注意,增加的时候id自增,不需要赋id
       
sysClientExpense.setClientName(sysWayResultObject.getClientName());//客户姓名
        sysClientExpense.setType(sysWayResultObject.getType());//支出类型
        sysClientExpense.setCreateName(sysWayResultObject.getCreateName());//创建人
        sysClientExpense.setExpense(sysWayResultObject.getExpense());//支出总金额
        sysClientExpense.setTime(sysWayResultObject.getTime());//时间
        sysClientExpense.setDetails(sysWayResultObject.getDetails());//费用事由


        //新增客户支出项   新增客户支出并返回新增ID 返回一个int,下面获取id
       
sysClientExpenseService.insertClientEx(sysClientExpense);
//******************************************************************************************
        //
获取新增ID,新增id就赋给新增客户支出项的id , SQLLAST_INSERT_ID()获取的.客户支出项的id和支出类型的id是同一个  注意不是insertClientEx的返回值 而是执行该方法后id有值了 不然是得不到id的(相当于新增的时候查询到当前最大id然后主动获取到了id一样)
        Long clientId = sysClientExpense.getId();
         /* 获取支出途径和对应支出金额都是String类型*/
       
//支出途径("打车","吃饭","送礼")????????????????????????
       
String way = sysWayResultObject.getWay();
       
String[] split = way.split(","); //得到数组["打车","吃饭","送礼"]
        //
支出金额
        String wayExpense = sysWayResultObject.getWayExpense();
       
String[] split1 = wayExpense.split(",");

       
//新增多条支出途径项
        for(int i = 0;i<split.length;i++){
           
//SysExpenseWay没有用吗?
            SysExpense sysExpense = new SysExpense();
           
//支出途径  Integer类型  0为送礼,1为吃饭,2为打车
            sysExpense.setWayType(Integer.valueOf(split[i]));
           
//支出金额  Double类型
            sysExpense.setWayExpense(Double.valueOf(split1[i]));
           
//客户id
           
sysExpense.setClientId((long)clientId);
           
//新增客户的支出途径
            sysClientExpenseService.insertExpense(sysExpense);
       
}
       
return new ResultObject();
   
}

测试:

证明:新增客户支出返回的id正是客户表的客户id

3. 查看单条客户关怀支出(两个get孩子归一个爸爸)

Mapper(sql):把sys_expense_way看成一个外表,查询不可以用通用mapper,只能写sql加注解?不是,service实现类里点之后没发现此类型的通用方法,不知为何。(下面解释)

Dao

Service:

serviceImpl:

客户支出项是通用mapper,支出途径单独写的sql

关于查询客户支出途径表不能用通用mapper的原因解析:

没搞清楚需求:下面是客户支出途径表sys_expense_way:

再看sql语句的图,已经换成了带框的,我们是根据客户支出途径表sys_expense_way的客户id:client_id来查询的,不是根据主键,根据主键只能查询一条,我们是查询list,一个client_id可以有多条记录,对应多种客户支出途径,所以:(serviceImpl)

只能用:

然后又觉得不爽,为什么呢,因为我是查询的客户支出途径的,应该用客户支出途径的mapper,即sysExpenseMapper,我凭什么用sysClientExpenseMapper的呢,于是我改成:

也没报错,喜滋滋的运行tomcat,发现:

没找到,然后突然就想起之前陈某在指导我的时候遇到的一样的问题,我知道原因了:

客户支出途径的mapper里虽然有该方法存在,但是我只有一个mapper.xml,它的头清清楚楚的印着的并不是sysExpenseMapper!!!!!

所以问题很清楚了,必须再写一个mapper,头换成SysExpenseMapper的就可以了,不想麻烦的话,毕竟就为了一个方法建立一个mapper.xml太浪费,就用:

可以了。

然后要明白,想用通用mapper,必须用dao层的mapper文件,即使里面是空的,(因为通用mapper是调用了封装好的sql,你看不见),所以我们在service实现层使用insert方法插入所有的客户支出途径,就是使用的通用的mapper方法,所以有了sysExpenseMapper诞生,(里面是空的哦)

插曲:发现一个问题:sql里不是如果传参是基本类型的话,#{}内的内容可以随便写嘛,发现不只是sql,dao service即实现类里的参数都可以随便写!只有controller不可以,不然会报:服务器出错!为了看的人明白,还是改成该填的吧。

然后:dao层加注解我不知道是干嘛,去掉了也没错,试过了。

于是我好奇的改成:

就报错了:

不认识它,懵逼!

Controller:(这才是重点)

首先要清楚,新增客户支出项id客户id是一个,这就方便了查看。

(还是因为两个孩子一个爸爸的故事,两个孩子都是一个id

所以才可以get方法只传递一个参数即可。

注意:查看的html必须给hidden的id,因为要根据它修改。

@MethodDesc(value = "查询单条客户关怀支出", type = MethodDesc.Type.VIEW)
   
@RequiresPermissions("clientExpense:view")
   
@RequestMapping("/get")
   
public ResultObject get(Long id){//必须是id,不能ids
//      根据ID获取当前客户支出项
        SysClientExpense sysProjectExpense = sysClientExpenseService.get(id);
       
//根据ID查找客户对应的多条支出途径(有单独的数据库表和sql
        List<SysExpense> expense = sysClientExpenseService.getExpense(id);
       
//用于显示的对象
        SysWayResultObject result = new SysWayResultObject();

       
//往对象里塞客户支出项,显示的时候要给id(新增时不要给,上面已说)
       
result.setClientId(sysProjectExpense.getId());
       
result.setClientName(sysProjectExpense.getClientName());//客户姓名
        result.setType(sysProjectExpense.getType());//类型
        result.setCreateName(sysProjectExpense.getCreateName());//创建人
        result.setExpense(sysProjectExpense.getExpense());//支出总金额
        result.setDetails(sysProjectExpense.getDetails());//费用事由
        result.setTime(sysProjectExpense.getTime());//时间

        //往结果集塞客户支出途径多条支出途径是个List,前端each遍历
        result.setList(expense);
        //result
        
return new ResultObject(result);
   
}

客户支出项是先查出来一条,没一条的每个属性值往result里放,而客户支出途径是查询到的一个List集合,所以要往SysWayResultObject的List字段里放,前端遍历。这个List可能在你新增的时候没有想到要这个字段,查看的时候要用到,所以只有经验多的不行的时候才可以做到横向开发!

插曲:(都在图中)

上面的查看和客户支出的也是,返回了result。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值