This commit is contained in:
linfso 2025-07-14 18:56:31 +08:00
commit f1b77c5f4d
5 changed files with 274 additions and 18 deletions

View File

@ -34,6 +34,7 @@ import com.xdadan.erp.common.utils.poi.ExcelUtil;
import com.xdadan.erp.emis.domain.EmisCommissionQuote;
import com.xdadan.erp.emis.service.IEmisCommissionQuoteService;
import com.xdadan.erp.emis.domain.exception.EmisBizError;
/**
* 员工提成方案报价Controller
@ -105,9 +106,12 @@ public class EmisCommissionQuoteController extends BaseController
@PreAuthorize("@ss.hasPermi('emis:emisCommissionQuote:add')")
@Log(title = "员工提成方案报价", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody EmisCommissionQuote emisCommissionQuote)
{
return toAjax(emisCommissionQuoteService.insertEmisCommissionQuote(emisCommissionQuote));
public AjaxResult add(@RequestBody EmisCommissionQuote emisCommissionQuote) {
try {
return toAjax(emisCommissionQuoteService.insertEmisCommissionQuote(emisCommissionQuote));
} catch (EmisBizError e) {
return AjaxResult.error(e.getMessage(), e.getErrorCode());
}
}
/**
@ -116,9 +120,12 @@ public class EmisCommissionQuoteController extends BaseController
@PreAuthorize("@ss.hasPermi('emis:emisCommissionQuote:edit')")
@Log(title = "员工提成方案报价", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody EmisCommissionQuote emisCommissionQuote)
{
return toAjax(emisCommissionQuoteService.updateEmisCommissionQuote(emisCommissionQuote));
public AjaxResult edit(@RequestBody EmisCommissionQuote emisCommissionQuote) {
try {
return toAjax(emisCommissionQuoteService.updateEmisCommissionQuote(emisCommissionQuote));
} catch (EmisBizError e) {
return AjaxResult.error(e.getMessage(), e.getErrorCode());
}
}
/**
@ -126,9 +133,23 @@ public class EmisCommissionQuoteController extends BaseController
*/
@PreAuthorize("@ss.hasPermi('emis:emisCommissionQuote:remove')")
@Log(title = "员工提成方案报价", businessType = BusinessType.DELETE)
@DeleteMapping("/{quoteIds}")
public AjaxResult remove(@PathVariable Long[] quoteIds)
{
@DeleteMapping("/{quoteIds}")
public AjaxResult remove(@PathVariable Long[] quoteIds) {
return toAjax(emisCommissionQuoteService.deleteEmisCommissionQuoteByQuoteIds(quoteIds));
}
/**
* 批量修改员工提成方案报价
*/
@PreAuthorize("@ss.hasPermi('emis:emisCommissionQuote:batchUpdate')")
@Log(title = "员工提成方案报价", businessType = BusinessType.UPDATE)
@PutMapping("/batchUpdate")
public AjaxResult batchUpdate(@RequestBody List<EmisCommissionQuote> emisCommissionQuoteList) {
try {
int result = emisCommissionQuoteService.batchUpdateEmisCommissionQuote(emisCommissionQuoteList);
return toAjax(result);
} catch (EmisBizError e) {
return AjaxResult.error(e.getMessage(), e.getErrorCode());
}
}
}

View File

@ -87,4 +87,12 @@ public interface EmisCommissionQuoteMapper extends BaseMapper<EmisCommissionQuot
* @return 结果
*/
public int deleteEmisCommissionQuoteByQuoteIds(Long[] quoteIds);
/**
* 检查日期交叉重复
*
* @param emisCommissionQuote 员工提成方案报价
* @return 重复的报价列表
*/
public List<EmisCommissionQuote> checkDateOverlap(EmisCommissionQuote emisCommissionQuote);
}

View File

@ -11,6 +11,7 @@ package com.xdadan.erp.emis.service;
import java.util.List;
import com.xdadan.erp.emis.domain.EmisCommissionQuote;
import com.xdadan.erp.emis.domain.exception.EmisBizError;
/**
* @ClassName EmisCommissionQuoteService
@ -50,7 +51,7 @@ public interface IEmisCommissionQuoteService
* @param emisCommissionQuote 员工提成方案报价
* @return 结果
*/
public int insertEmisCommissionQuote(EmisCommissionQuote emisCommissionQuote);
public int insertEmisCommissionQuote(EmisCommissionQuote emisCommissionQuote) throws EmisBizError;
/**
* 修改员工提成方案报价
@ -58,7 +59,7 @@ public interface IEmisCommissionQuoteService
* @param emisCommissionQuote 员工提成方案报价
* @return 结果
*/
public int updateEmisCommissionQuote(EmisCommissionQuote emisCommissionQuote);
public int updateEmisCommissionQuote(EmisCommissionQuote emisCommissionQuote) throws EmisBizError;
/**
* 批量删除员工提成方案报价
@ -75,4 +76,20 @@ public interface IEmisCommissionQuoteService
* @return 结果
*/
public int deleteEmisCommissionQuoteByQuoteId(Long quoteId);
/**
* 批量修改员工提成方案报价
*
* @param emisCommissionQuoteList 员工提成方案报价列表
* @return 结果
*/
public int batchUpdateEmisCommissionQuote(List<EmisCommissionQuote> emisCommissionQuoteList) throws EmisBizError;
/**
* 检查日期交叉重复
*
* @param emisCommissionQuote 员工提成方案报价
* @return 重复的报价列表
*/
public List<EmisCommissionQuote> checkDateOverlap(EmisCommissionQuote emisCommissionQuote);
}

View File

@ -14,14 +14,17 @@ import java.util.List;
import com.xdadan.erp.emis.domain.EmisCommissionExpression;
import com.xdadan.erp.emis.mapper.EmisCommissionExpressionMapper;
import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType;
import com.xdadan.erp.emis.domain.exception.EmisBizError;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.xdadan.erp.emis.domain.EmisCommissionQuote;
import com.xdadan.erp.emis.mapper.EmisCommissionQuoteMapper;
import com.xdadan.erp.emis.service.IEmisCommissionQuoteService;
import org.springframework.util.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
/**
/**
* 员工提成方案报价Service业务层处理
*
* @author linfso
@ -73,6 +76,25 @@ public class EmisCommissionQuoteServiceImpl implements IEmisCommissionQuoteServi
return emisCommissionQuoteMapper.checkUnique(emisCommissionQuote);
}
/**
* 公共验重方法,检查日期交叉和完全重复
*
* @param emisCommissionQuote 当前报价
* @throws EmisBizError 存在冲突时抛出
*/
private void checkQuoteConflict(EmisCommissionQuote emisCommissionQuote) throws EmisBizError {
List<EmisCommissionQuote> overlapList = checkDateOverlap(emisCommissionQuote);
if (!overlapList.isEmpty()) {
StringBuilder errorMsg = new StringBuilder();
errorMsg.append("报价[").append(emisCommissionQuote.getQuoteName());
for (EmisCommissionQuote overlap : overlapList) {
errorMsg.append("\n- 与报价[").append(overlap.getQuoteName()).append("(ID:")
.append(overlap.getQuoteId()).append(")]重复");
}
throw new EmisBizError(EmisBizErrorType.EXISTS, errorMsg.toString());
}
}
/**
* 新增员工提成方案报价
*
@ -80,8 +102,8 @@ public class EmisCommissionQuoteServiceImpl implements IEmisCommissionQuoteServi
* @return 结果
*/
@Override
public int insertEmisCommissionQuote(EmisCommissionQuote emisCommissionQuote)
{
public int insertEmisCommissionQuote(EmisCommissionQuote emisCommissionQuote) throws EmisBizError {
checkQuoteConflict(emisCommissionQuote);
// 插入提成方案
emisCommissionQuoteMapper.insertEmisCommissionQuote(emisCommissionQuote);
@ -104,8 +126,8 @@ public class EmisCommissionQuoteServiceImpl implements IEmisCommissionQuoteServi
* @return 结果
*/
@Override
public int updateEmisCommissionQuote(EmisCommissionQuote emisCommissionQuote)
{
public int updateEmisCommissionQuote(EmisCommissionQuote emisCommissionQuote) throws EmisBizError {
checkQuoteConflict(emisCommissionQuote);
return emisCommissionQuoteMapper.updateEmisCommissionQuote(emisCommissionQuote);
}
@ -133,4 +155,126 @@ public class EmisCommissionQuoteServiceImpl implements IEmisCommissionQuoteServi
return emisCommissionQuoteMapper.deleteEmisCommissionQuoteByQuoteId(quoteId);
}
/**
* 批量修改员工提成方案报价
*
* @param emisCommissionQuoteList 员工提成方案报价列表
* @return 结果
*/
@Override
public int batchUpdateEmisCommissionQuote(List<EmisCommissionQuote> emisCommissionQuoteList) throws EmisBizError {
int result = 0;
for (EmisCommissionQuote emisCommissionQuote : emisCommissionQuoteList) {
// 先查询数据库中的完整数据
EmisCommissionQuote dbQuote = emisCommissionQuoteMapper
.selectEmisCommissionQuoteByQuoteId(emisCommissionQuote.getQuoteId());
if (dbQuote == null) {
continue;
}
// 补齐前端未传的字段
if (emisCommissionQuote.getQuoteCode() == null) {
emisCommissionQuote.setQuoteCode(dbQuote.getQuoteCode());
}
if (emisCommissionQuote.getQuoteName() == null) {
emisCommissionQuote.setQuoteName(dbQuote.getQuoteName());
}
if (emisCommissionQuote.getTransLineCode() == null) {
emisCommissionQuote.setTransLineCode(dbQuote.getTransLineCode());
}
if (emisCommissionQuote.getSendSiteCode() == null) {
emisCommissionQuote.setSendSiteCode(dbQuote.getSendSiteCode());
}
if (emisCommissionQuote.getNextSiteCode() == null) {
emisCommissionQuote.setNextSiteCode(dbQuote.getNextSiteCode());
}
if (emisCommissionQuote.getProdCode() == null) {
emisCommissionQuote.setProdCode(dbQuote.getProdCode());
}
if (emisCommissionQuote.getFromCountry() == null) {
emisCommissionQuote.setFromCountry(dbQuote.getFromCountry());
}
if (emisCommissionQuote.getCountry() == null) {
emisCommissionQuote.setCountry(dbQuote.getCountry());
}
if (emisCommissionQuote.getFeeType() == null) {
emisCommissionQuote.setFeeType(dbQuote.getFeeType());
}
if (emisCommissionQuote.getCalcType() == null) {
emisCommissionQuote.setCalcType(dbQuote.getCalcType());
}
if (emisCommissionQuote.getPostType() == null) {
emisCommissionQuote.setPostType(dbQuote.getPostType());
}
if (emisCommissionQuote.getTransType() == null) {
emisCommissionQuote.setTransType(dbQuote.getTransType());
}
if (emisCommissionQuote.getBlOpen() == null) {
emisCommissionQuote.setBlOpen(dbQuote.getBlOpen());
}
if (emisCommissionQuote.getTransLineCode() == null) {
emisCommissionQuote.setTransLineCode(dbQuote.getTransLineCode());
}
if (emisCommissionQuote.getProdCode() == null) {
emisCommissionQuote.setProdCode(dbQuote.getProdCode());
}
if (emisCommissionQuote.getBlOpen() == null) {
emisCommissionQuote.setBlOpen(dbQuote.getBlOpen());
}
if (emisCommissionQuote.getEmpCode() == null) {
emisCommissionQuote.setEmpCode(dbQuote.getEmpCode());
}
if (emisCommissionQuote.getEmpName() == null) {
emisCommissionQuote.setEmpName(dbQuote.getEmpName());
}
if (emisCommissionQuote.getStartDate() == null) {
emisCommissionQuote.setStartDate(dbQuote.getStartDate());
}
if (emisCommissionQuote.getEndDate() == null) {
emisCommissionQuote.setEndDate(dbQuote.getEndDate());
}
if (emisCommissionQuote.getPriorityLevel() == null) {
emisCommissionQuote.setPriorityLevel(dbQuote.getPriorityLevel());
}
checkQuoteConflict(emisCommissionQuote);
// 更新数据
result += emisCommissionQuoteMapper.updateEmisCommissionQuote(emisCommissionQuote);
}
return result;
}
/**
* 检查日期交叉重复
*
* @param emisCommissionQuote 员工提成方案报价
* @return 重复的报价列表
*/
@Override
public List<EmisCommissionQuote> checkDateOverlap(EmisCommissionQuote emisCommissionQuote) {
return emisCommissionQuoteMapper.checkDateOverlap(emisCommissionQuote);
}
/**
* 判断两个报价是否完全重复
*
* @param quote1 报价1
* @param quote2 报价2
* @return 是否完全重复
*/
private boolean isDuplicateQuote(EmisCommissionQuote quote1, EmisCommissionQuote quote2) {
// 比较关键字段是否完全相同
return StringUtils.equals(quote1.getEmpCode(), quote2.getEmpCode()) &&
StringUtils.equals(quote1.getEmpName(), quote2.getEmpName()) &&
StringUtils.equals(quote1.getFeeType(), quote2.getFeeType()) &&
StringUtils.equals(quote1.getCalcType(), quote2.getCalcType()) &&
StringUtils.equals(quote1.getPostType(), quote2.getPostType()) &&
StringUtils.equals(quote1.getTransType(), quote2.getTransType()) &&
StringUtils.equals(quote1.getFromCountry(), quote2.getFromCountry()) &&
StringUtils.equals(quote1.getCountry(), quote2.getCountry()) &&
StringUtils.equals(quote1.getTransLineCode(), quote2.getTransLineCode()) &&
StringUtils.equals(quote1.getProdCode(), quote2.getProdCode()) &&
quote1.getStartDate() == quote2.getStartDate() &&
quote1.getEndDate() == quote2.getEndDate();
}
}

View File

@ -65,6 +65,13 @@
<if test="transLineCode != null and transLineCode != ''"> and trans_line_code=#{transLineCode} </if>
<if test="prodCode != null and prodCode != ''"> and FIND_IN_SET(#{prodCode},prod_code) </if>
<if test="startDate != null">
and DATE(start_date) &gt;= DATE(#{startDate})
</if>
<if test="endDate != null">
and DATE(end_date) &lt;= DATE(#{endDate})
</if>
</where>
order by create_time desc
</select>
@ -79,8 +86,8 @@
</if>
<if test="quoteName != null and quoteName != ''"> and quote_name like concat('%', #{quoteName}, '%')</if>
<if test="fromCountry != null and fromCountry != ''"> and ( FIND_IN_SET(#{fromCountry},from_country) or from_country='-1' or from_country is null or from_country='' or ( #{fromCountry}!='0086' and from_country='-2' ) )</if>
<if test="country != null and country != ''"> and ( FIND_IN_SET(#{country},country) or country='-1' or country is null or country='' or ( #{country}!='0086' and country='-2' ) ) </if>
<if test="fromCountry != null and fromCountry != ''"> and ( FIND_IN_SET(#{fromCountry},from_country) or from_country='-1' or from_country is null or from_country='' or ( #{fromCountry}!='0086' and from_country='-2' ) or from_country='-3')</if>
<if test="country != null and country != ''"> and ( FIND_IN_SET(#{country},country) or country='-1' or country is null or country='' or ( #{country}!='0086' and country='-2' ) or from_country='-3' ) </if>
<if test="sendSiteCode != null and sendSiteCode != ''"> and ( ( FIND_IN_SET(#{sendSiteCode},send_site_code) and send_site_code is not null ) or send_site_code is null ) </if>
<if test="nextSiteCode != null and nextSiteCode != ''"> and ( ( FIND_IN_SET(#{nextSiteCode},next_site_code) and next_site_code is not null ) or next_site_code is null ) </if>
@ -248,4 +255,63 @@
#{quoteId}
</foreach>
</delete>
<select id="checkDateOverlap" parameterType="EmisCommissionQuote" resultMap="EmisCommissionQuoteResult">
<include refid="selectEmisCommissionQuoteVo"/>
<where>
del_flag='0'
<if test="quoteId != null and quoteId != ''">
and quote_id != #{quoteId}
</if>
and (
start_date &lt;= #{endDate} and end_date &gt;= #{startDate}
)
and (
emp_code = #{empCode}
or FIND_IN_SET(#{empCode}, emp_code)
or FIND_IN_SET(emp_code, #{empCode})
or emp_code='-1'
)
and (
emp_name = #{empName}
or FIND_IN_SET(#{empName}, emp_name)
or FIND_IN_SET(emp_name, #{empName})
or emp_name='全部'
)
and fee_type=#{feeType}
and bl_open=#{blOpen}
and calc_type=#{calcType}
and post_type=#{postType}
and (
trans_type = #{transType}
or FIND_IN_SET(#{transType}, trans_type)
or FIND_IN_SET(trans_type, #{transType})
)
and (
from_country = #{fromCountry}
or FIND_IN_SET(#{fromCountry}, from_country)
or FIND_IN_SET(from_country, #{fromCountry})
or from_country='-1'
)
and (
country = #{country}
or FIND_IN_SET(#{country}, country)
or FIND_IN_SET(country, #{country})
or country='-1'
)
and (
trans_line_code = #{transLineCode}
or FIND_IN_SET(#{transLineCode}, trans_line_code)
or FIND_IN_SET(trans_line_code, #{transLineCode})
or trans_line_code='-1'
)
and (
prod_code = #{prodCode}
or FIND_IN_SET(#{prodCode}, prod_code)
or FIND_IN_SET(prod_code, #{prodCode})
or prod_code='-1'
)
</where>
order by create_time desc
</select>
</mapper>