Merge pull request 'develop' (#117) from develop into master

Reviewed-on: http://git.xdadan.loc/tanex/emis-service/pulls/117
This commit is contained in:
heyu 2025-07-14 14:36:25 +08:00
commit 67cb9b7df9
5 changed files with 237 additions and 6 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
@ -126,9 +127,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
@ -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
@ -133,4 +136,134 @@ 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.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());
}
// 检查日期交叉重复
List<EmisCommissionQuote> overlapList = checkDateOverlap(emisCommissionQuote);
if (!overlapList.isEmpty()) {
StringBuilder errorMsg = new StringBuilder();
errorMsg.append("报价[").append(emisCommissionQuote.getQuoteName()).append("]存在冲突:");
for (EmisCommissionQuote overlap : overlapList) {
// 判断是否为完全重复
boolean isDuplicate = isDuplicateQuote(emisCommissionQuote, overlap);
if (isDuplicate) {
errorMsg.append("\n- 与报价[").append(overlap.getQuoteName()).append("(ID:")
.append(overlap.getQuoteId()).append(")]重复");
} else {
errorMsg.append("\n- 与报价[").append(overlap.getQuoteName()).append("(ID:")
.append(overlap.getQuoteId()).append(")]日期交叉");
}
}
throw new EmisBizError(EmisBizErrorType.EXISTS, errorMsg.toString());
}
// 更新数据
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())&&
quote1.getStartDate()==quote2.getStartDate()&&
quote1.getEndDate()==quote2.getEndDate();
}
}

View File

@ -79,8 +79,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 +248,62 @@
#{quoteId}
</foreach>
</delete>
<select id="checkDateOverlap" parameterType="EmisCommissionQuote" resultMap="EmisCommissionQuoteResult">
<include refid="selectEmisCommissionQuoteVo"/>
<where>
del_flag='0'
and quote_id != #{quoteId}
and (
(start_date <![CDATA[ <= ]]> #{startDate} and #{startDate} <![CDATA[ < ]]> end_date)
or
(start_date <![CDATA[ < ]]> #{endDate} and #{endDate} <![CDATA[ <= ]]> end_date)
or
(start_date <![CDATA[ >= ]]> #{startDate} and end_date <![CDATA[ <= ]]> #{endDate})
)
<if test="empCode != null and empCode != ''">
and (
emp_code = #{empCode}
or FIND_IN_SET(#{empCode}, emp_code)
or FIND_IN_SET(emp_code, #{empCode})
or emp_code='-1'
)
</if>
<if test="empName != null and empName != ''">
and (
emp_name = #{empName}
or FIND_IN_SET(#{empName}, emp_name)
or FIND_IN_SET(emp_name, #{empName})
or emp_name='全部'
)
</if>
<if test="feeType != null and feeType != ''"> and fee_type=#{feeType}</if>
<if test="calcType != null and calcType != ''"> and calc_type=#{calcType}</if>
<if test="postType != null and postType != ''"> and post_type=#{postType}</if>
<if test="transType != null and transType != ''">
and (
trans_type = #{transType}
or FIND_IN_SET(#{transType}, trans_type)
or FIND_IN_SET(trans_type, #{transType})
)
</if>
<if test="fromCountry != null and fromCountry != ''">
and (
from_country = #{fromCountry}
or FIND_IN_SET(#{fromCountry}, from_country)
or FIND_IN_SET(from_country, #{fromCountry})
or from_country='-1'
)
</if>
<if test="country != null and country != ''">
and (
country = #{country}
or FIND_IN_SET(#{country}, country)
or FIND_IN_SET(country, #{country})
or country='-1'
)
</if>
</where>
order by create_time desc
</select>
</mapper>