优化账户统计的查询逻辑,提高查询速度

This commit is contained in:
季圣华
2023-10-25 00:12:18 +08:00
parent 372c8f74ff
commit 4bc7915dec
5 changed files with 256 additions and 29 deletions

View File

@@ -9,6 +9,7 @@ import com.jsh.erp.service.account.AccountService;
import com.jsh.erp.service.systemConfig.SystemConfigService; import com.jsh.erp.service.systemConfig.SystemConfigService;
import com.jsh.erp.utils.BaseResponseInfo; import com.jsh.erp.utils.BaseResponseInfo;
import com.jsh.erp.utils.ErpInfo; import com.jsh.erp.utils.ErpInfo;
import com.jsh.erp.utils.StringUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -178,8 +179,8 @@ public class AccountController {
BaseResponseInfo res = new BaseResponseInfo(); BaseResponseInfo res = new BaseResponseInfo();
try { try {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
List<AccountVo4List> list = accountService.listWithBalance(name, serialNo, (currentPage-1)*pageSize, pageSize); List<AccountVo4List> list = accountService.listWithBalance(StringUtil.toNull(name), StringUtil.toNull(serialNo), (currentPage-1)*pageSize, pageSize);
Long count = accountService.listWithBalanceCount(name, serialNo); Long count = accountService.listWithBalanceCount(StringUtil.toNull(name), StringUtil.toNull(serialNo));
map.put("rows", list); map.put("rows", list);
map.put("total", count); map.put("total", count);
res.code = 200; res.code = 200;
@@ -204,7 +205,7 @@ public class AccountController {
HttpServletRequest request) throws Exception { HttpServletRequest request) throws Exception {
BaseResponseInfo res = new BaseResponseInfo(); BaseResponseInfo res = new BaseResponseInfo();
try { try {
Map<String, Object> map = accountService.getStatistics(name, serialNo); Map<String, Object> map = accountService.getStatistics(StringUtil.toNull(name), StringUtil.toNull(serialNo));
res.code = 200; res.code = 200;
res.data = map; res.data = map;
} catch(Exception e){ } catch(Exception e){

View File

@@ -0,0 +1,47 @@
package com.jsh.erp.datasource.entities;
import java.math.BigDecimal;
public class AccountVo4Sum {
private Long id;
private BigDecimal accountSum;
private BigDecimal accountSumByHead;
private BigDecimal accountSumByDetail;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public BigDecimal getAccountSum() {
return accountSum;
}
public void setAccountSum(BigDecimal accountSum) {
this.accountSum = accountSum;
}
public BigDecimal getAccountSumByHead() {
return accountSumByHead;
}
public void setAccountSumByHead(BigDecimal accountSumByHead) {
this.accountSumByHead = accountSumByHead;
}
public BigDecimal getAccountSumByDetail() {
return accountSumByDetail;
}
public void setAccountSumByDetail(BigDecimal accountSumByDetail) {
this.accountSumByDetail = accountSumByDetail;
}
}

View File

@@ -1,6 +1,7 @@
package com.jsh.erp.datasource.mappers; package com.jsh.erp.datasource.mappers;
import com.jsh.erp.datasource.entities.Account; import com.jsh.erp.datasource.entities.Account;
import com.jsh.erp.datasource.entities.AccountVo4Sum;
import com.jsh.erp.datasource.entities.DepotHead; import com.jsh.erp.datasource.entities.DepotHead;
import com.jsh.erp.datasource.vo.AccountVo4InOutList; import com.jsh.erp.datasource.vo.AccountVo4InOutList;
import com.jsh.erp.datasource.vo.AccountVo4List; import com.jsh.erp.datasource.vo.AccountVo4List;
@@ -52,6 +53,20 @@ public interface AccountMapperEx {
@Param("endTime") String endTime, @Param("endTime") String endTime,
@Param("forceFlag") Boolean forceFlag); @Param("forceFlag") Boolean forceFlag);
List<AccountVo4Sum> getAccountSumByParam(
@Param("name") String name,
@Param("serialNo") String serialNo,
@Param("beginTime") String beginTime,
@Param("endTime") String endTime,
@Param("forceFlag") Boolean forceFlag,
@Param("offset") Integer offset,
@Param("rows") Integer rows);
List<DepotHead> getManyAccountSumByParam(
@Param("beginTime") String beginTime,
@Param("endTime") String endTime,
@Param("forceFlag") Boolean forceFlag);
List<AccountVo4InOutList> findAccountInOutList( List<AccountVo4InOutList> findAccountInOutList(
@Param("accountId") Long accountId, @Param("accountId") Long accountId,
@Param("offset") Integer offset, @Param("offset") Integer offset,
@@ -61,4 +76,5 @@ public interface AccountMapperEx {
@Param("accountId") Long accountId); @Param("accountId") Long accountId);
int batchDeleteAccountByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]); int batchDeleteAccountByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
} }

View File

@@ -106,22 +106,43 @@ public class AccountService {
String bTime = Tools.firstDayOfMonth(timeStr) + BusinessConstants.DAY_FIRST_TIME; String bTime = Tools.firstDayOfMonth(timeStr) + BusinessConstants.DAY_FIRST_TIME;
String eTime = Tools.lastDayOfMonth(timeStr) + BusinessConstants.DAY_LAST_TIME; String eTime = Tools.lastDayOfMonth(timeStr) + BusinessConstants.DAY_LAST_TIME;
Boolean forceFlag = systemConfigService.getForceApprovalFlag(); Boolean forceFlag = systemConfigService.getForceApprovalFlag();
Map<Long, BigDecimal> thisMonthAccountSumMap = new HashMap<>();
Map<Long, BigDecimal> thisMonthAccountSumByHeadMap = new HashMap<>();
Map<Long, BigDecimal> thisMonthAccountSumByDetailMap = new HashMap<>();
Map<Long, BigDecimal> currentAccountSumMap = new HashMap<>();
Map<Long, BigDecimal> currentAccountSumByHeadMap = new HashMap<>();
Map<Long, BigDecimal> currentAccountSumByDetailMap = new HashMap<>();
List<AccountVo4Sum> thisMonthAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, bTime, eTime, forceFlag, offset, rows);
List<AccountVo4Sum> currentAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, null, null, forceFlag, offset, rows);
List<DepotHead> thisMonthManyAmountList = accountMapperEx.getManyAccountSumByParam(bTime, eTime, forceFlag);
List<DepotHead> currentManyAmountList = accountMapperEx.getManyAccountSumByParam(null, null, forceFlag);
for (AccountVo4Sum thisMonthAmount: thisMonthAmountList) {
thisMonthAccountSumMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSum());
thisMonthAccountSumByHeadMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByHead());
thisMonthAccountSumByDetailMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByDetail());
}
for (AccountVo4Sum currentAmount: currentAmountList) {
currentAccountSumMap.put(currentAmount.getId(), currentAmount.getAccountSum());
currentAccountSumByHeadMap.put(currentAmount.getId(), currentAmount.getAccountSumByHead());
currentAccountSumByDetailMap.put(currentAmount.getId(), currentAmount.getAccountSumByDetail());
}
if (null != list) { if (null != list) {
for (AccountVo4List al : list) { for (AccountVo4List al : list) {
DecimalFormat df = new DecimalFormat(".##"); DecimalFormat df = new DecimalFormat(".##");
BigDecimal thisMonthAmount = getAccountSum(al.getId(), bTime, eTime, forceFlag) BigDecimal thisMonthAmount = thisMonthAccountSumMap.get(al.getId())
.add(getAccountSumByHead(al.getId(), bTime, eTime, forceFlag)) .add(thisMonthAccountSumByHeadMap.get(al.getId()))
.add(getAccountSumByDetail(al.getId(), bTime, eTime, forceFlag)) .add(thisMonthAccountSumByDetailMap.get(al.getId()))
.add(getManyAccountSum(al.getId(), bTime, eTime, forceFlag)); .add(getManyAccountSumParse(al.getId(), thisMonthManyAmountList));
String thisMonthAmountFmt = "0"; String thisMonthAmountFmt = "0";
if ((thisMonthAmount.compareTo(BigDecimal.ZERO))!=0) { if ((thisMonthAmount.compareTo(BigDecimal.ZERO))!=0) {
thisMonthAmountFmt = df.format(thisMonthAmount); thisMonthAmountFmt = df.format(thisMonthAmount);
} }
al.setThisMonthAmount(thisMonthAmountFmt); //本月发生额 al.setThisMonthAmount(thisMonthAmountFmt); //本月发生额
BigDecimal currentAmount = getAccountSum(al.getId(), null, null, forceFlag) BigDecimal currentAmount = currentAccountSumMap.get(al.getId())
.add(getAccountSumByHead(al.getId(), null, null, forceFlag)) .add(currentAccountSumByHeadMap.get(al.getId()))
.add(getAccountSumByDetail(al.getId(), null, null, forceFlag)) .add(currentAccountSumByDetailMap.get(al.getId()))
.add(getManyAccountSum(al.getId(), null, null, forceFlag)).add(al.getInitialAmount()) ; .add(getManyAccountSumParse(al.getId(), currentManyAmountList))
.add(al.getInitialAmount()) ;
al.setCurrentAmount(currentAmount); al.setCurrentAmount(currentAmount);
resList.add(al); resList.add(al);
} }
@@ -328,6 +349,32 @@ public class AccountService {
return accountSum; return accountSum;
} }
/**
* 单个账户的金额求和-多账户的明细合计(格式化)
* @return
*/
public BigDecimal getManyAccountSumParse(Long accountId, List<DepotHead> manyAmountList) {
BigDecimal accountSum = BigDecimal.ZERO;
if (manyAmountList != null) {
for (DepotHead depotHead : manyAmountList) {
String accountIdList = depotHead.getAccountIdList();
String accountMoneyList = depotHead.getAccountMoneyList();
if(StringUtil.isNotEmpty(accountIdList) && StringUtil.isNotEmpty(accountMoneyList)) {
String[] aList = accountIdList.split(",");
String[] amList = accountMoneyList.split(",");
for (int i = 0; i < aList.length; i++) {
if (aList[i].equals(accountId.toString())) {
if(amList.length>0) {
accountSum = accountSum.add(new BigDecimal(amList[i]));
}
}
}
}
}
}
return accountSum;
}
public List<AccountVo4InOutList> findAccountInOutList(Long accountId, Integer offset, Integer rows) throws Exception{ public List<AccountVo4InOutList> findAccountInOutList(Long accountId, Integer offset, Integer rows) throws Exception{
List<AccountVo4InOutList> list=null; List<AccountVo4InOutList> list=null;
try{ try{
@@ -402,22 +449,43 @@ public class AccountService {
String bTime = Tools.firstDayOfMonth(timeStr) + BusinessConstants.DAY_FIRST_TIME; String bTime = Tools.firstDayOfMonth(timeStr) + BusinessConstants.DAY_FIRST_TIME;
String eTime = Tools.lastDayOfMonth(timeStr) + BusinessConstants.DAY_LAST_TIME; String eTime = Tools.lastDayOfMonth(timeStr) + BusinessConstants.DAY_LAST_TIME;
Boolean forceFlag = systemConfigService.getForceApprovalFlag(); Boolean forceFlag = systemConfigService.getForceApprovalFlag();
Map<Long, BigDecimal> thisMonthAccountSumMap = new HashMap<>();
Map<Long, BigDecimal> thisMonthAccountSumByHeadMap = new HashMap<>();
Map<Long, BigDecimal> thisMonthAccountSumByDetailMap = new HashMap<>();
Map<Long, BigDecimal> currentAccountSumMap = new HashMap<>();
Map<Long, BigDecimal> currentAccountSumByHeadMap = new HashMap<>();
Map<Long, BigDecimal> currentAccountSumByDetailMap = new HashMap<>();
List<AccountVo4Sum> thisMonthAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, bTime, eTime, forceFlag, offset, rows);
List<AccountVo4Sum> currentAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, null, null, forceFlag, offset, rows);
List<DepotHead> thisMonthManyAmountList = accountMapperEx.getManyAccountSumByParam(bTime, eTime, forceFlag);
List<DepotHead> currentManyAmountList = accountMapperEx.getManyAccountSumByParam(null, null, forceFlag);
for (AccountVo4Sum thisMonthAmount: thisMonthAmountList) {
thisMonthAccountSumMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSum());
thisMonthAccountSumByHeadMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByHead());
thisMonthAccountSumByDetailMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByDetail());
}
for (AccountVo4Sum currentAmount: currentAmountList) {
currentAccountSumMap.put(currentAmount.getId(), currentAmount.getAccountSum());
currentAccountSumByHeadMap.put(currentAmount.getId(), currentAmount.getAccountSumByHead());
currentAccountSumByDetailMap.put(currentAmount.getId(), currentAmount.getAccountSumByDetail());
}
if (null != list) { if (null != list) {
for (AccountVo4List al : list) { for (AccountVo4List al : list) {
DecimalFormat df = new DecimalFormat(".##"); DecimalFormat df = new DecimalFormat(".##");
BigDecimal thisMonthAmount = getAccountSum(al.getId(), bTime, eTime, forceFlag) BigDecimal thisMonthAmount = thisMonthAccountSumMap.get(al.getId())
.add(getAccountSumByHead(al.getId(), bTime, eTime, forceFlag)) .add(thisMonthAccountSumByHeadMap.get(al.getId()))
.add(getAccountSumByDetail(al.getId(), bTime, eTime, forceFlag)) .add(thisMonthAccountSumByDetailMap.get(al.getId()))
.add(getManyAccountSum(al.getId(), bTime, eTime, forceFlag)); .add(getManyAccountSumParse(al.getId(), thisMonthManyAmountList));
String thisMonthAmountFmt = "0"; String thisMonthAmountFmt = "0";
if ((thisMonthAmount.compareTo(BigDecimal.ZERO))!=0) { if ((thisMonthAmount.compareTo(BigDecimal.ZERO))!=0) {
thisMonthAmountFmt = df.format(thisMonthAmount); thisMonthAmountFmt = df.format(thisMonthAmount);
} }
al.setThisMonthAmount(thisMonthAmountFmt); //本月发生额 al.setThisMonthAmount(thisMonthAmountFmt); //本月发生额
BigDecimal currentAmount = getAccountSum(al.getId(), null, null, forceFlag) BigDecimal currentAmount = currentAccountSumMap.get(al.getId())
.add(getAccountSumByHead(al.getId(), null, null, forceFlag)) .add(currentAccountSumByHeadMap.get(al.getId()))
.add(getAccountSumByDetail(al.getId(), null, null, forceFlag)) .add(currentAccountSumByDetailMap.get(al.getId()))
.add(getManyAccountSum(al.getId(), null, null, forceFlag)).add(al.getInitialAmount()) ; .add(getManyAccountSumParse(al.getId(), currentManyAmountList))
.add(al.getInitialAmount());
al.setCurrentAmount(currentAmount); al.setCurrentAmount(currentAmount);
resList.add(al); resList.add(al);
} }
@@ -448,22 +516,43 @@ public class AccountService {
BigDecimal allMonthAmount = BigDecimal.ZERO; BigDecimal allMonthAmount = BigDecimal.ZERO;
BigDecimal allCurrentAmount = BigDecimal.ZERO; BigDecimal allCurrentAmount = BigDecimal.ZERO;
Boolean forceFlag = systemConfigService.getForceApprovalFlag(); Boolean forceFlag = systemConfigService.getForceApprovalFlag();
if (null != list && null !=timeStr) { Map<Long, BigDecimal> thisMonthAccountSumMap = new HashMap<>();
Map<Long, BigDecimal> thisMonthAccountSumByHeadMap = new HashMap<>();
Map<Long, BigDecimal> thisMonthAccountSumByDetailMap = new HashMap<>();
Map<Long, BigDecimal> currentAccountSumMap = new HashMap<>();
Map<Long, BigDecimal> currentAccountSumByHeadMap = new HashMap<>();
Map<Long, BigDecimal> currentAccountSumByDetailMap = new HashMap<>();
List<AccountVo4Sum> thisMonthAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, bTime, eTime, forceFlag, null, null);
List<AccountVo4Sum> currentAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, null, null, forceFlag, null, null);
List<DepotHead> thisMonthManyAmountList = accountMapperEx.getManyAccountSumByParam(bTime, eTime, forceFlag);
List<DepotHead> currentManyAmountList = accountMapperEx.getManyAccountSumByParam(null, null, forceFlag);
for (AccountVo4Sum thisMonthAmount: thisMonthAmountList) {
thisMonthAccountSumMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSum());
thisMonthAccountSumByHeadMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByHead());
thisMonthAccountSumByDetailMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByDetail());
}
for (AccountVo4Sum currentAmount: currentAmountList) {
currentAccountSumMap.put(currentAmount.getId(), currentAmount.getAccountSum());
currentAccountSumByHeadMap.put(currentAmount.getId(), currentAmount.getAccountSumByHead());
currentAccountSumByDetailMap.put(currentAmount.getId(), currentAmount.getAccountSumByDetail());
}
if (null != list) {
for (Account a : list) { for (Account a : list) {
BigDecimal monthAmount = getAccountSum(a.getId(), bTime, eTime, forceFlag) BigDecimal monthAmount = thisMonthAccountSumMap.get(a.getId())
.add(getAccountSumByHead(a.getId(), bTime, eTime, forceFlag)) .add(thisMonthAccountSumByHeadMap.get(a.getId()))
.add(getAccountSumByDetail(a.getId(), bTime, eTime, forceFlag)) .add(thisMonthAccountSumByDetailMap.get(a.getId()))
.add(getManyAccountSum(a.getId(), bTime, eTime, forceFlag)); .add(getManyAccountSumParse(a.getId(), thisMonthManyAmountList));
BigDecimal currentAmount = getAccountSum(a.getId(), null, null, forceFlag) BigDecimal currentAmount = currentAccountSumMap.get(a.getId())
.add(getAccountSumByHead(a.getId(), null, null, forceFlag)) .add(currentAccountSumByHeadMap.get(a.getId()))
.add(getAccountSumByDetail(a.getId(), null, null, forceFlag)) .add(currentAccountSumByDetailMap.get(a.getId()))
.add(getManyAccountSum(a.getId(), null, null, forceFlag)).add(a.getInitialAmount()); .add(getManyAccountSumParse(a.getId(), currentManyAmountList))
.add(a.getInitialAmount());
allMonthAmount = allMonthAmount.add(monthAmount); allMonthAmount = allMonthAmount.add(monthAmount);
allCurrentAmount = allCurrentAmount.add(currentAmount); allCurrentAmount = allCurrentAmount.add(currentAmount);
} }
} }
map.put("allCurrentAmount", priceFormat(allCurrentAmount)); //当前总金额
map.put("allMonthAmount", priceFormat(allMonthAmount)); //本月发生额 map.put("allMonthAmount", priceFormat(allMonthAmount)); //本月发生额
map.put("allCurrentAmount", priceFormat(allCurrentAmount)); //当前总金额
} catch (Exception e) { } catch (Exception e) {
JshException.readFail(logger, e); JshException.readFail(logger, e);
} }

View File

@@ -148,6 +148,80 @@
and ifnull(dh.delete_flag,'0') !='1' and ifnull(dh.delete_flag,'0') !='1'
</select> </select>
<select id="getAccountSumByParam" resultType="com.jsh.erp.datasource.entities.AccountVo4Sum">
select a.id,
(select ifnull(sum(dh.change_amount),0) from jsh_depot_head dh
where 1=1 and dh.pay_type != '预付款'
and dh.account_id = a.id
<if test="beginTime != null">
and dh.oper_time >= #{beginTime}
</if>
<if test="endTime != null">
and dh.oper_time &lt;= #{endTime}
</if>
<if test="forceFlag">
and dh.status = '1'
</if>
and ifnull(dh.delete_flag,'0') !='1') accountSum,
(select ifnull(sum(ah.change_amount),0) from jsh_account_head ah
where 1=1 and ah.account_id = a.id
<if test="beginTime != null">
and ah.bill_time >= #{beginTime}
</if>
<if test="endTime != null">
and ah.bill_time &lt;= #{endTime}
</if>
<if test="forceFlag">
and ah.status = '1'
</if>
and ifnull(ah.delete_flag,'0') !='1') accountSumByHead,
(select ifnull(sum(ai.each_amount),0) from jsh_account_head ah
left join jsh_account_item ai on ah.id = ai.header_id and ifnull(ai.delete_flag,'0') !='1'
where 1=1 and ai.account_id = a.id
<if test="beginTime != null">
and ah.bill_time >= #{beginTime}
</if>
<if test="endTime != null">
and ah.bill_time &lt;= #{endTime}
</if>
<if test="forceFlag">
and ah.status = '1'
</if>
and ifnull(ah.delete_flag,'0') !='1') accountSumByDetail
from jsh_account a
where 1=1
<if test="name != null">
<bind name="bindName" value="'%'+name+'%'"/>
and a.name like #{bindName}
</if>
<if test="serialNo != null and serialNo !=''">
<bind name="bindSerialNo" value="'%'+serialNo+'%'"/>
and a.serial_no like #{bindSerialNo}
</if>
and ifnull(a.delete_flag,'0') !='1'
order by a.sort asc, a.id desc
<if test="offset != null and rows != null">
limit #{offset},#{rows}
</if>
</select>
<select id="getManyAccountSumByParam" resultType="com.jsh.erp.datasource.entities.DepotHead">
select dh.account_id_list accountIdList, dh.account_money_list accountMoneyList
from jsh_depot_head dh
where 1=1
and dh.account_id_list !=''
<if test="beginTime != null">
and dh.oper_time >= #{beginTime}
</if>
<if test="endTime != null">
and dh.oper_time &lt;= #{endTime}
</if>
<if test="forceFlag">
and dh.status = '1'
</if>
and ifnull(dh.delete_flag,'0') !='1'
</select>
<select id="findAccountInOutList" parameterType="com.jsh.erp.datasource.entities.AccountExample" resultMap="ResultInOutList"> <select id="findAccountInOutList" parameterType="com.jsh.erp.datasource.entities.AccountExample" resultMap="ResultInOutList">
<!--主表出入库涉及的账户 --> <!--主表出入库涉及的账户 -->
select dh.number,concat(dh.sub_type,dh.type) as newType, 'bill' as fromType, s.supplier,dh.change_amount,date_format(dh.oper_time,'%Y-%m-%d %H:%i:%S') as oTime,'' as AList,'' as AMList select dh.number,concat(dh.sub_type,dh.type) as newType, 'bill' as fromType, s.supplier,dh.change_amount,date_format(dh.oper_time,'%Y-%m-%d %H:%i:%S') as oTime,'' as AList,'' as AMList