
(1)首先在.xml文件中新建查询:
记住这个selectForSum
<!-- 自定义查询-为了计算列表中的合计-->
<select id="selectForSum" parameterType="ConditionDeploymentUnit" resultMap="ConditionDeploymentUnitResult">
<include refid="selectConditionDeploymentUnitVo"/>
<where>
<if test="rounds != null "> and rounds = #{rounds}</if>
...
<if test="isDelete != null "> and is_delete = #{isDelete}</if>
</where>
</select>
(2)在service接口中配置这个方法:
public void selectForSum();
在service中写入方法实现:
@Override
public void selectForSum(){
List<ConditionDeploymentUnit> forSum = conditionDeploymentUnitMapper.selectForSum();
for (int i = 0; i < forSum.size(); i++) {
// 计算合计数量
Long SummaryClueNum = forSum.get(i).getNumChujiClue()+forSum.get(i).getNumKejiClue()+forSum.get(i).getNumKejiyixiaClue();
forSum.get(i).setSumClue(SummaryClueNum);
//将数据更新到数据库
conditionDeploymentUnitMapper.updateConditionDeploymentUnit(forSum.get(i));
}
}
(3)在controller的list方法中写入这个方法,即可在列表更新的时候调用,计算,存入数据库,然后从数据库中查询出来

(4)在编辑或者插入数据时,因为是插入一行的数据,所以如果重新计算整个列表的话,会浪费资源延迟时间,所以可以只计算增加或者编辑的那一列
将实现类中的方法更改为如下所示,通过传入id查到需要更改的对象,同时接口的方法和在controller中调用也需要更改。
public void selectForSumbyid(int i) {
ConditionDeploymentUnit forSum = conditionDeploymentUnitMapper.selectConditionDeploymentUnitById(i);
// 计算合计数量
Long SummaryClueNum = forSum.getNumChujiClue()+forSum.getNumKejiClue()+forSum.getNumKejiyixiaClue();
forSum.setSumClue(SummaryClueNum);
conditionDeploymentUnitMapper.updateConditionDeploymentUnit(forSum);
}
接口的方法:
public void selectForSumbyid(int i);
调用之前,需要先查到id
int i=conditionDeploymentUnit.getId();
conditionDeploymentUnitService.selectForSumbyid(i);
(1)在实现类中计算的时候需要考虑被除数为0的情况,
例:整改落实率=已经整改的个数getNumAlreadyUnit / 计划整改的个数SummaryFourLuoshi
如果计划整改数为0的话,直接让整改率赋值为1
**注意:**需要用浮点数,因为用int格式的话计算不会出现小数点
(2)如果需要保存小数点后两位小数的话,比如99.99%,需要利用Math.round(rateCover * 10000) * 0.0001d;保留小数点后4位小数。
// 计算问题整改落实率
double rateCover2 = 0;
if(SummaryFourLuoshi!=0){
double rateCover = (double)forSum.get(i).getNumAlreadyUnit()/(double)SummaryFourLuoshi;
rateCover2 = Math.round(rateCover * 10000) * 0.0001d;
}else{
rateCover2=1;
}
forSum.get(i).setRateWholeCover(rateCover2);
(3)在计算数据保存至数据库后,在前端读取到的是小数点后4位的小数,比如0.9999,此时要转换成99.99%
需要在前端页面*100,并且加上’%',只需要在字段下面加上如下function
