✨ 新增毛利分析报表及提成设置
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
package com.bms.price.service;
|
||||
|
||||
import java.util.List;
|
||||
import com.bms.price.domain.PrcProfitCommissionRate;
|
||||
import com.bms.price.domain.vo.PrcProfitReportOrderRow;
|
||||
import com.bms.price.domain.vo.PrcProfitReportProductRow;
|
||||
import com.bms.price.domain.vo.PrcProfitReportQuery;
|
||||
import com.bms.price.domain.vo.PrcProfitReportSummary;
|
||||
|
||||
/** 毛利报表服务。 */
|
||||
public interface IPrcProfitReportService
|
||||
{
|
||||
List<PrcProfitReportOrderRow> selectOrderRows(PrcProfitReportQuery query);
|
||||
|
||||
List<PrcProfitReportProductRow> selectProductRows(PrcProfitReportQuery query);
|
||||
|
||||
List<PrcProfitReportSummary> selectSummary(PrcProfitReportQuery query);
|
||||
|
||||
List<PrcProfitCommissionRate> selectCommissionRates();
|
||||
|
||||
void saveCommissionRate(PrcProfitCommissionRate rate);
|
||||
|
||||
int deleteCommissionRate(Long rateId);
|
||||
}
|
||||
+139
@@ -0,0 +1,139 @@
|
||||
package com.bms.price.service.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.math.BigDecimal;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import com.bms.common.annotation.DataScope;
|
||||
import com.bms.common.exception.ServiceException;
|
||||
import com.bms.common.utils.SecurityUtils;
|
||||
import com.bms.price.domain.PrcProfitCommissionRate;
|
||||
import com.bms.price.mapper.PrcProfitCommissionRateMapper;
|
||||
import com.bms.price.domain.vo.PrcProfitReportOrderRow;
|
||||
import com.bms.price.domain.vo.PrcProfitReportProductRow;
|
||||
import com.bms.price.domain.vo.PrcProfitReportQuery;
|
||||
import com.bms.price.domain.vo.PrcProfitReportSummary;
|
||||
import com.bms.price.mapper.PrcProfitReportMapper;
|
||||
import com.bms.price.service.IPrcProfitReportService;
|
||||
|
||||
/** 毛利报表:以 prc_income_bill 为金额事实表,不关联应付模块。 */
|
||||
@Service
|
||||
public class PrcProfitReportServiceImpl implements IPrcProfitReportService
|
||||
{
|
||||
private static final int MULTI_VALUE_FILTER_LIMIT = 2000;
|
||||
|
||||
@Autowired
|
||||
private PrcProfitReportMapper profitReportMapper;
|
||||
|
||||
@Autowired
|
||||
private PrcProfitCommissionRateMapper commissionRateMapper;
|
||||
|
||||
@Override
|
||||
@DataScope(deptAlias = "su", deptField = "dept_id", userAlias = "su", userField = "user_id", permission = "report:profit:list")
|
||||
public List<PrcProfitReportOrderRow> selectOrderRows(PrcProfitReportQuery query)
|
||||
{
|
||||
normalizeMultiValueFilters(query);
|
||||
return profitReportMapper.selectOrderRows(query);
|
||||
}
|
||||
|
||||
@Override
|
||||
@DataScope(deptAlias = "su", deptField = "dept_id", userAlias = "su", userField = "user_id", permission = "report:profit:list")
|
||||
public List<PrcProfitReportProductRow> selectProductRows(PrcProfitReportQuery query)
|
||||
{
|
||||
normalizeMultiValueFilters(query);
|
||||
return profitReportMapper.selectProductRows(query);
|
||||
}
|
||||
|
||||
@Override
|
||||
@DataScope(deptAlias = "su", deptField = "dept_id", userAlias = "su", userField = "user_id", permission = "report:profit:list")
|
||||
public List<PrcProfitReportSummary> selectSummary(PrcProfitReportQuery query)
|
||||
{
|
||||
normalizeMultiValueFilters(query);
|
||||
return profitReportMapper.selectSummary(query);
|
||||
}
|
||||
|
||||
/** 将报表的多行输入拆分为去重后的查询条件,支持换行、空格、逗号和分号分隔。 */
|
||||
private void normalizeMultiValueFilters(PrcProfitReportQuery query)
|
||||
{
|
||||
if (query == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
query.setOrderNos(splitFilterValues(query.getOrderNo(), "订单号"));
|
||||
query.setCustomerCodes(splitFilterValues(query.getCustomerCode(), "客户代码"));
|
||||
query.setCustomerNames(splitFilterValues(query.getCustomerName(), "客户名称"));
|
||||
}
|
||||
|
||||
private List<String> splitFilterValues(String rawValue, String fieldName)
|
||||
{
|
||||
LinkedHashSet<String> values = new LinkedHashSet<>();
|
||||
if (rawValue != null && !rawValue.trim().isEmpty())
|
||||
{
|
||||
for (String item : rawValue.split("[\\s,,;;]+"))
|
||||
{
|
||||
String value = item.trim();
|
||||
if (!value.isEmpty())
|
||||
{
|
||||
values.add(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (values.size() > MULTI_VALUE_FILTER_LIMIT)
|
||||
{
|
||||
throw new ServiceException(fieldName + "最多输入 " + MULTI_VALUE_FILTER_LIMIT + " 个不重复值");
|
||||
}
|
||||
return new ArrayList<>(values);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PrcProfitCommissionRate> selectCommissionRates()
|
||||
{
|
||||
return commissionRateMapper.selectAll();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void saveCommissionRate(PrcProfitCommissionRate rate)
|
||||
{
|
||||
if (rate == null || rate.getBelongSalerCode() == null || rate.getBelongSalerCode().trim().isEmpty())
|
||||
{
|
||||
throw new ServiceException("业务员编码不能为空");
|
||||
}
|
||||
BigDecimal commissionRate = rate.getCommissionRate();
|
||||
if (commissionRate == null || commissionRate.compareTo(BigDecimal.ZERO) < 0
|
||||
|| commissionRate.compareTo(new BigDecimal("100")) > 0)
|
||||
{
|
||||
throw new ServiceException("提成比例必须在 0 至 100 之间");
|
||||
}
|
||||
String status = rate.getStatus();
|
||||
if (!"0".equals(status) && !"1".equals(status))
|
||||
{
|
||||
throw new ServiceException("提成比例状态不正确");
|
||||
}
|
||||
String salerCode = rate.getBelongSalerCode().trim();
|
||||
String salerName = rate.getBelongSaler() == null ? null : rate.getBelongSaler().trim();
|
||||
if (salerCode.length() > 64 || (salerName != null && salerName.length() > 64)
|
||||
|| (rate.getRemark() != null && rate.getRemark().length() > 500))
|
||||
{
|
||||
throw new ServiceException("业务员编码、名称或备注超过最大长度");
|
||||
}
|
||||
rate.setBelongSalerCode(salerCode);
|
||||
rate.setBelongSaler(salerName);
|
||||
rate.setCreateBy(SecurityUtils.getUsername());
|
||||
commissionRateMapper.upsert(rate);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public int deleteCommissionRate(Long rateId)
|
||||
{
|
||||
if (rateId == null)
|
||||
{
|
||||
throw new ServiceException("提成比例配置ID不能为空");
|
||||
}
|
||||
return commissionRateMapper.deleteById(rateId);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user