进一步优化账户统计的查询逻辑

This commit is contained in:
季圣华
2023-10-20 19:36:37 +08:00
parent 7bc3ccd183
commit 8d835431a7
4 changed files with 83 additions and 130 deletions

View File

@@ -2,29 +2,22 @@ package com.jsh.erp.controller;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.jsh.erp.constants.BusinessConstants;
import com.jsh.erp.constants.ExceptionConstants;
import com.jsh.erp.datasource.entities.Account; import com.jsh.erp.datasource.entities.Account;
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;
import com.jsh.erp.exception.BusinessRunTimeException;
import com.jsh.erp.service.account.AccountService; 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 com.jsh.erp.utils.Tools;
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;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Description;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -128,12 +121,11 @@ public class AccountController {
for (AccountVo4InOutList aEx : dataList) { for (AccountVo4InOutList aEx : dataList) {
String type = aEx.getType().replace("其它", ""); String type = aEx.getType().replace("其它", "");
aEx.setType(type); aEx.setType(type);
String timeStr = aEx.getOperTime().toString(); String endTime = aEx.getOperTime();
String endTime = timeStr;
BigDecimal balance = accountService.getAccountSum(accountId, null, endTime, forceFlag) BigDecimal balance = accountService.getAccountSum(accountId, null, endTime, forceFlag)
.add(accountService.getAccountSumByHead(accountId, null, endTime, forceFlag)) .add(accountService.getAccountSumByHead(accountId, null, endTime, forceFlag))
.add(accountService.getAccountSumByDetail(accountId, timeStr, "date", forceFlag)) .add(accountService.getAccountSumByDetail(accountId, null, endTime, forceFlag))
.add(accountService.getManyAccountSum(accountId, timeStr, "date", forceFlag)).add(initialAmount); .add(accountService.getManyAccountSum(accountId, null, endTime, forceFlag)).add(initialAmount);
aEx.setBalance(balance); aEx.setBalance(balance);
aEx.setAccountId(accountId); aEx.setAccountId(accountId);
dataArray.add(aEx); dataArray.add(aEx);

View File

@@ -1,7 +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.AccountExample; 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;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@@ -40,6 +40,18 @@ public interface AccountMapperEx {
@Param("endTime") String endTime, @Param("endTime") String endTime,
@Param("forceFlag") Boolean forceFlag); @Param("forceFlag") Boolean forceFlag);
BigDecimal getAccountSumByDetail(
@Param("accountId") Long accountId,
@Param("beginTime") String beginTime,
@Param("endTime") String endTime,
@Param("forceFlag") Boolean forceFlag);
List<DepotHead> getManyAccountSum(
@Param("accountId") Long accountId,
@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,

View File

@@ -16,7 +16,6 @@ import com.jsh.erp.utils.StringUtil;
import com.jsh.erp.utils.Tools; import com.jsh.erp.utils.Tools;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.RequestContextHolder;
@@ -112,8 +111,8 @@ public class AccountService {
DecimalFormat df = new DecimalFormat(".##"); DecimalFormat df = new DecimalFormat(".##");
BigDecimal thisMonthAmount = getAccountSum(al.getId(), bTime, eTime, forceFlag) BigDecimal thisMonthAmount = getAccountSum(al.getId(), bTime, eTime, forceFlag)
.add(getAccountSumByHead(al.getId(), bTime, eTime, forceFlag)) .add(getAccountSumByHead(al.getId(), bTime, eTime, forceFlag))
.add(getAccountSumByDetail(al.getId(), timeStr, "month", forceFlag)) .add(getAccountSumByDetail(al.getId(), bTime, eTime, forceFlag))
.add(getManyAccountSum(al.getId(), timeStr, "month", forceFlag)); .add(getManyAccountSum(al.getId(), bTime, eTime, forceFlag));
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);
@@ -121,8 +120,8 @@ public class AccountService {
al.setThisMonthAmount(thisMonthAmountFmt); //本月发生额 al.setThisMonthAmount(thisMonthAmountFmt); //本月发生额
BigDecimal currentAmount = getAccountSum(al.getId(), null, null, forceFlag) BigDecimal currentAmount = getAccountSum(al.getId(), null, null, forceFlag)
.add(getAccountSumByHead(al.getId(), null, null, forceFlag)) .add(getAccountSumByHead(al.getId(), null, null, forceFlag))
.add(getAccountSumByDetail(al.getId(), "", "month", forceFlag)) .add(getAccountSumByDetail(al.getId(), null, null, forceFlag))
.add(getManyAccountSum(al.getId(), "", "month", forceFlag)) .add(al.getInitialAmount()) ; .add(getManyAccountSum(al.getId(), null, null, forceFlag)).add(al.getInitialAmount()) ;
al.setCurrentAmount(currentAmount); al.setCurrentAmount(currentAmount);
resList.add(al); resList.add(al);
} }
@@ -282,7 +281,7 @@ public class AccountService {
* 单个账户的金额求和-入库和出库 * 单个账户的金额求和-入库和出库
* @return * @return
*/ */
public BigDecimal getAccountSum(Long accountId, String beginTime, String endTime, Boolean forceFlag) throws Exception{ public BigDecimal getAccountSum(Long accountId, String beginTime, String endTime, Boolean forceFlag) {
return accountMapperEx.getAccountSum(accountId, beginTime, endTime, forceFlag); return accountMapperEx.getAccountSum(accountId, beginTime, endTime, forceFlag);
} }
@@ -290,110 +289,25 @@ public class AccountService {
* 单个账户的金额求和-收入、支出、转账的单据表头的合计 * 单个账户的金额求和-收入、支出、转账的单据表头的合计
* @return * @return
*/ */
public BigDecimal getAccountSumByHead(Long accountId, String beginTime, String endTime, Boolean forceFlag) throws Exception{ public BigDecimal getAccountSumByHead(Long accountId, String beginTime, String endTime, Boolean forceFlag) {
return accountMapperEx.getAccountSumByHead(accountId, beginTime, endTime, forceFlag); return accountMapperEx.getAccountSumByHead(accountId, beginTime, endTime, forceFlag);
} }
/** /**
* 单个账户的金额求和-收款、付款、转账、收预付款的单据明细的合计 * 单个账户的金额求和-收款、付款、转账、收预付款的单据明细的合计
*
* @param id
* @return * @return
*/ */
public BigDecimal getAccountSumByDetail(Long id, String timeStr, String type, Boolean forceFlag)throws Exception { public BigDecimal getAccountSumByDetail(Long accountId, String beginTime, String endTime, Boolean forceFlag) {
BigDecimal accountSum =BigDecimal.ZERO ; return accountMapperEx.getAccountSumByDetail(accountId, beginTime, endTime, forceFlag);
try {
AccountHeadExample example = new AccountHeadExample();
AccountHeadExample.Criteria criteria = example.createCriteria();
if (!timeStr.equals("")) {
if (type.equals("month")) {
Date bTime = StringUtil.getDateByString(Tools.firstDayOfMonth(timeStr) + BusinessConstants.DAY_FIRST_TIME, null);
Date eTime = StringUtil.getDateByString(Tools.lastDayOfMonth(timeStr) + BusinessConstants.DAY_LAST_TIME, null);
criteria.andBillTimeGreaterThanOrEqualTo(bTime).andBillTimeLessThanOrEqualTo(eTime)
.andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
} else if (type.equals("date")) {
Date mTime = StringUtil.getDateByString(timeStr, null);
criteria.andBillTimeLessThanOrEqualTo(mTime)
.andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
}
}
List<AccountHead> dataList=null;
try{
if(forceFlag) {
criteria.andStatusEqualTo("1");
}
dataList = accountHeadMapper.selectByExample(example);
}catch(Exception e){
JshException.readFail(logger, e);
}
if (dataList != null) {
String ids = "";
for (AccountHead accountHead : dataList) {
ids = ids + accountHead.getId() + ",";
}
if (!ids.equals("")) {
ids = ids.substring(0, ids.length() - 1);
}
AccountItemExample exampleAi = new AccountItemExample();
if (!ids.equals("")) {
List<Long> idList = StringUtil.strToLongList(ids);
exampleAi.createCriteria().andAccountIdEqualTo(id).andHeaderIdIn(idList)
.andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
List<AccountItem> dataListOne = accountItemMapper.selectByExample(exampleAi);
if (dataListOne != null) {
for (AccountItem accountItem : dataListOne) {
if(accountItem.getEachAmount()!=null) {
accountSum = accountSum.add(accountItem.getEachAmount());
}
}
}
}
}
} catch (DataAccessException e) {
logger.error(">>>>>>>>>查找进销存信息异常", e);
} catch (Exception e) {
logger.error(">>>>>>>>>异常信息:", e);
}
return accountSum;
} }
/** /**
* 单个账户的金额求和-多账户的明细合计 * 单个账户的金额求和-多账户的明细合计
*
* @param id
* @return * @return
*/ */
public BigDecimal getManyAccountSum(Long id, String timeStr, String type, Boolean forceFlag)throws Exception { public BigDecimal getManyAccountSum(Long accountId, String beginTime, String endTime, Boolean forceFlag) {
BigDecimal accountSum = BigDecimal.ZERO; BigDecimal accountSum = BigDecimal.ZERO;
try { List<DepotHead> dataList = accountMapperEx.getManyAccountSum(accountId, beginTime, endTime, forceFlag);
DepotHeadExample example = new DepotHeadExample();
DepotHeadExample.Criteria criteria = example.createCriteria();
if (!timeStr.equals("")) {
if (type.equals("month")) {
Date bTime = StringUtil.getDateByString(Tools.firstDayOfMonth(timeStr) + BusinessConstants.DAY_FIRST_TIME, null);
Date eTime = StringUtil.getDateByString(Tools.lastDayOfMonth(timeStr) + BusinessConstants.DAY_LAST_TIME, null);
criteria.andAccountIdListLike("%" +id.toString() + "%")
.andOperTimeGreaterThanOrEqualTo(bTime).andOperTimeLessThanOrEqualTo(eTime)
.andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
} else if (type.equals("date")) {
Date mTime = StringUtil.getDateByString(timeStr, null);
criteria.andAccountIdListLike("%" +id.toString() + "%")
.andOperTimeLessThanOrEqualTo(mTime)
.andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
}
} else {
example.createCriteria().andAccountIdListLike("%" +id.toString() + "%")
.andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
}
List<DepotHead> dataList=null;
try{
if(forceFlag) {
criteria.andStatusEqualTo("1");
}
dataList = depotHeadMapper.selectByExample(example);
}catch(Exception e){
JshException.readFail(logger, e);
}
if (dataList != null) { if (dataList != null) {
for (DepotHead depotHead : dataList) { for (DepotHead depotHead : dataList) {
String accountIdList = depotHead.getAccountIdList(); String accountIdList = depotHead.getAccountIdList();
@@ -402,8 +316,8 @@ public class AccountService {
String[] aList = accountIdList.split(","); String[] aList = accountIdList.split(",");
String[] amList = accountMoneyList.split(","); String[] amList = accountMoneyList.split(",");
for (int i = 0; i < aList.length; i++) { for (int i = 0; i < aList.length; i++) {
if (aList[i].toString().equals(id.toString())) { if (aList[i].equals(accountId.toString())) {
if(amList!=null && amList.length>0) { if(amList.length>0) {
accountSum = accountSum.add(new BigDecimal(amList[i])); accountSum = accountSum.add(new BigDecimal(amList[i]));
} }
} }
@@ -411,9 +325,6 @@ public class AccountService {
} }
} }
} }
} catch (DataAccessException e) {
logger.error(">>>>>>>>>查找信息异常", e);
}
return accountSum; return accountSum;
} }
@@ -496,8 +407,8 @@ public class AccountService {
DecimalFormat df = new DecimalFormat(".##"); DecimalFormat df = new DecimalFormat(".##");
BigDecimal thisMonthAmount = getAccountSum(al.getId(), bTime, eTime, forceFlag) BigDecimal thisMonthAmount = getAccountSum(al.getId(), bTime, eTime, forceFlag)
.add(getAccountSumByHead(al.getId(), bTime, eTime, forceFlag)) .add(getAccountSumByHead(al.getId(), bTime, eTime, forceFlag))
.add(getAccountSumByDetail(al.getId(), timeStr, "month", forceFlag)) .add(getAccountSumByDetail(al.getId(), bTime, eTime, forceFlag))
.add(getManyAccountSum(al.getId(), timeStr, "month", forceFlag)); .add(getManyAccountSum(al.getId(), bTime, eTime, forceFlag));
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);
@@ -505,8 +416,8 @@ public class AccountService {
al.setThisMonthAmount(thisMonthAmountFmt); //本月发生额 al.setThisMonthAmount(thisMonthAmountFmt); //本月发生额
BigDecimal currentAmount = getAccountSum(al.getId(), null, null, forceFlag) BigDecimal currentAmount = getAccountSum(al.getId(), null, null, forceFlag)
.add(getAccountSumByHead(al.getId(), null, null, forceFlag)) .add(getAccountSumByHead(al.getId(), null, null, forceFlag))
.add(getAccountSumByDetail(al.getId(), "", "month", forceFlag)) .add(getAccountSumByDetail(al.getId(), null, null, forceFlag))
.add(getManyAccountSum(al.getId(), "", "month", forceFlag)) .add(al.getInitialAmount()) ; .add(getManyAccountSum(al.getId(), null, null, forceFlag)).add(al.getInitialAmount()) ;
al.setCurrentAmount(currentAmount); al.setCurrentAmount(currentAmount);
resList.add(al); resList.add(al);
} }
@@ -541,12 +452,12 @@ public class AccountService {
for (Account a : list) { for (Account a : list) {
BigDecimal monthAmount = getAccountSum(a.getId(), bTime, eTime, forceFlag) BigDecimal monthAmount = getAccountSum(a.getId(), bTime, eTime, forceFlag)
.add(getAccountSumByHead(a.getId(), bTime, eTime, forceFlag)) .add(getAccountSumByHead(a.getId(), bTime, eTime, forceFlag))
.add(getAccountSumByDetail(a.getId(), timeStr, "month", forceFlag)) .add(getAccountSumByDetail(a.getId(), bTime, eTime, forceFlag))
.add(getManyAccountSum(a.getId(), timeStr, "month", forceFlag)); .add(getManyAccountSum(a.getId(), bTime, eTime, forceFlag));
BigDecimal currentAmount = getAccountSum(a.getId(), null, null, forceFlag) BigDecimal currentAmount = getAccountSum(a.getId(), null, null, forceFlag)
.add(getAccountSumByHead(a.getId(), null, null, forceFlag)) .add(getAccountSumByHead(a.getId(), null, null, forceFlag))
.add(getAccountSumByDetail(a.getId(), "", "month", forceFlag)) .add(getAccountSumByDetail(a.getId(), null, null, forceFlag))
.add(getManyAccountSum(a.getId(), "", "month", forceFlag)).add(a.getInitialAmount()); .add(getManyAccountSum(a.getId(), null, null, forceFlag)).add(a.getInitialAmount());
allMonthAmount = allMonthAmount.add(monthAmount); allMonthAmount = allMonthAmount.add(monthAmount);
allCurrentAmount = allCurrentAmount.add(currentAmount); allCurrentAmount = allCurrentAmount.add(currentAmount);
} }

View File

@@ -110,6 +110,44 @@
and ifnull(ah.delete_flag,'0') !='1' and ifnull(ah.delete_flag,'0') !='1'
</select> </select>
<select id="getAccountSumByDetail" resultType="java.math.BigDecimal">
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
<if test="accountId != null">
and ai.account_id = #{accountId}
</if>
<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'
</select>
<select id="getManyAccountSum" 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
<if test="accountId != null">
<bind name="bindAccountId" value="'%'+accountId+'%'"/>
and dh.account_id_list like #{bindAccountId}
</if>
<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