demand: TMS系统- 提成管理 - 新增加二级菜单功能“销售计提比例配置”

committer: heyu
This commit is contained in:
aike 2025-07-23 14:48:31 +08:00
parent 5641204efe
commit fcd13b31bb
6 changed files with 497 additions and 0 deletions

View File

@ -0,0 +1,95 @@
package com.xdadan.erp.web.emis;
import com.xdadan.erp.common.annotation.Log;
import com.xdadan.erp.common.core.controller.BaseController;
import com.xdadan.erp.common.core.domain.AjaxResult;
import com.xdadan.erp.common.core.page.TableDataInfo;
import com.xdadan.erp.common.enums.BusinessType;
import com.xdadan.erp.common.utils.poi.ExcelUtil;
import com.xdadan.erp.emis.domain.EmisSalesCommissionRatio;
import com.xdadan.erp.emis.service.IEmisSalesCommissionRatioService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 销售计提比例配置Controller
* 提供增删改查和导出等接口
*/
@RestController
@RequestMapping("/emis/salesCommissionRatio")
public class EmisSalesCommissionRatioController extends BaseController {
@Autowired
private IEmisSalesCommissionRatioService emisSalesCommissionRatioService;
/**
* 查询销售计提比例配置列表
*/
@PreAuthorize("@ss.hasPermi('emis:salesCommissionRatio:list')")
@GetMapping("/list")
public TableDataInfo list(EmisSalesCommissionRatio query) {
startPage();
List<EmisSalesCommissionRatio> list = emisSalesCommissionRatioService.selectEmisSalesCommissionRatioList(query);
return getDataTable(list);
}
/**
* 根据ID获取配置
*/
@PreAuthorize("@ss.hasPermi('emis:salesCommissionRatio:query')")
@GetMapping("/{id}")
public AjaxResult getInfo(@PathVariable Long id) {
return AjaxResult.success(emisSalesCommissionRatioService.selectEmisSalesCommissionRatioById(id));
}
/**
* 新增配置
*/
@PreAuthorize("@ss.hasPermi('emis:salesCommissionRatio:add')")
@Log(title = "销售计提比例配置", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody EmisSalesCommissionRatio entity) {
try {
return toAjax(emisSalesCommissionRatioService.insertEmisSalesCommissionRatio(entity));
} catch (Exception e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 修改配置
*/
@PreAuthorize("@ss.hasPermi('emis:salesCommissionRatio:edit')")
@Log(title = "销售计提比例配置", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody EmisSalesCommissionRatio entity) {
try {
return toAjax(emisSalesCommissionRatioService.updateEmisSalesCommissionRatio(entity));
} catch (Exception e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 批量删除配置
*/
@PreAuthorize("@ss.hasPermi('emis:salesCommissionRatio:remove')")
@Log(title = "销售计提比例配置", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids) {
return toAjax(emisSalesCommissionRatioService.deleteEmisSalesCommissionRatioByIds(ids));
}
/**
* 导出配置
*/
@PreAuthorize("@ss.hasPermi('emis:salesCommissionRatio:export')")
@Log(title = "销售计提比例配置", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(javax.servlet.http.HttpServletResponse response, EmisSalesCommissionRatio query) {
List<EmisSalesCommissionRatio> list = emisSalesCommissionRatioService.selectEmisSalesCommissionRatioList(query);
ExcelUtil<EmisSalesCommissionRatio> util = new ExcelUtil<>(EmisSalesCommissionRatio.class);
util.exportExcel(response, list, "销售计提比例配置数据");
}
}

View File

@ -0,0 +1,29 @@
package com.xdadan.erp.emis.domain;
import lombok.Data;
import com.xdadan.erp.common.core.domain.BaseEntity;
import java.math.BigDecimal;
/**
* 销售计提比例配置实体类
* 对应表:emis_sales_commission_ratio
*/
@Data
public class EmisSalesCommissionRatio extends BaseEntity {
/** 主键ID */
private Long id;
/** 销售主管 */
private String salesExecutive;
/** 销售主管占比 */
private BigDecimal salesExecutiveRatio;
/** 销售联系人 */
private String salesmen;
/** 销售联系人占比 */
private BigDecimal salesmenRatio;
/** 销售支持 */
private String salesSupport;
/** 销售支持占比 */
private BigDecimal salesSupportRatio;
/** 启用状态 1-启用 0-未启用 **/
private String status;
}

View File

@ -0,0 +1,83 @@
/**
* @Project: emis
* @Title: EmisSalesCommissionRatioMapper.java
* @author
* @date
* @Copyright: ShangHai Doitinfo 2022 All rights reserved.
* @version v1.0
* @Description: <p> 销售计提比例配置 Mapper 接口 </p>
* <span style='color:red'> Warning : This file is generate by ai tools,don't edit!!! </span>
*/
package com.xdadan.erp.emis.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xdadan.erp.emis.domain.EmisSalesCommissionRatio;
/**
* @ClassName EmisSalesCommissionRatioMapper
* @Description
* <p>
* 销售计提比例配置 Mapper 接口
* </p>
* @author
* @date
*/
public interface EmisSalesCommissionRatioMapper extends BaseMapper<EmisSalesCommissionRatio> {
/**
* 主键查询
*
* @param id
* @return
*/
EmisSalesCommissionRatio selectEmisSalesCommissionRatioById(Long id);
/**
* 查询列表
*
* @param emisSalesCommissionRatio
* @return 集合
*/
List<EmisSalesCommissionRatio> selectEmisSalesCommissionRatioList(
EmisSalesCommissionRatio emisSalesCommissionRatio);
/**
* 新增
*
* @param emisSalesCommissionRatio
* @return
*/
int insertEmisSalesCommissionRatio(EmisSalesCommissionRatio emisSalesCommissionRatio);
/**
* 修改
*
* @param emisSalesCommissionRatio
* @return
*/
int updateEmisSalesCommissionRatio(EmisSalesCommissionRatio emisSalesCommissionRatio);
/**
* 删除
*
* @param id 主键
* @return 结果
*/
int deleteEmisSalesCommissionRatioById(Long id);
/**
* 批量删除
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
int deleteEmisSalesCommissionRatioByIds(Long[] ids);
/**
* 验重:salesExecutive、salesmen、salesSupport、status都相同视为重复
*
* @param emisSalesCommissionRatio
* @return 重复数量
*/
int checkUnique(EmisSalesCommissionRatio emisSalesCommissionRatio);
}

View File

@ -0,0 +1,46 @@
package com.xdadan.erp.emis.service;
import com.xdadan.erp.emis.domain.EmisSalesCommissionRatio;
import com.xdadan.erp.emis.domain.exception.EmisBizError;
import java.util.List;
/**
* 销售计提比例配置Service接口
*/
public interface IEmisSalesCommissionRatioService {
/**
* 主键查询
*/
EmisSalesCommissionRatio selectEmisSalesCommissionRatioById(Long id);
/**
* 查询销售计提比例配置列表
*/
List<EmisSalesCommissionRatio> selectEmisSalesCommissionRatioList(EmisSalesCommissionRatio query);
/**
* 新增销售计提比例配置
*/
int insertEmisSalesCommissionRatio(EmisSalesCommissionRatio entity) throws EmisBizError;
/**
* 修改销售计提比例配置
*/
int updateEmisSalesCommissionRatio(EmisSalesCommissionRatio entity) throws EmisBizError;
/**
* 批量删除销售计提比例配置
*/
int deleteEmisSalesCommissionRatioByIds(Long[] ids);
/**
* 删除单个销售计提比例配置
*/
int deleteEmisSalesCommissionRatioById(Long id);
/**
* 校验比例和是否有效(<=100%)
*/
boolean checkRatioValid(EmisSalesCommissionRatio entity);
}

View File

@ -0,0 +1,117 @@
package com.xdadan.erp.emis.service.impl;
import com.xdadan.erp.emis.domain.EmisSalesCommissionRatio;
import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType;
import com.xdadan.erp.emis.domain.exception.EmisBizError;
import com.xdadan.erp.emis.mapper.EmisSalesCommissionRatioMapper;
import com.xdadan.erp.emis.service.IEmisSalesCommissionRatioService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
/**
* 销售计提比例配置Service实现类
* 负责销售计提比例配置的增删改查等业务逻辑处理
*
* @author heyu
*/
@Service
public class EmisSalesCommissionRatioServiceImpl implements IEmisSalesCommissionRatioService {
@Autowired
private EmisSalesCommissionRatioMapper emisSalesCommissionRatioMapper;
/**
* 根据主键ID查询销售计提比例配置
*
* @param id 主键ID
* @return 配置实体
*/
@Override
public EmisSalesCommissionRatio selectEmisSalesCommissionRatioById(Long id) {
return emisSalesCommissionRatioMapper.selectById(id);
}
/**
* 查询销售计提比例配置列表
*
* @param query 查询条件
* @return 配置列表
*/
@Override
public List<EmisSalesCommissionRatio> selectEmisSalesCommissionRatioList(EmisSalesCommissionRatio query) {
return emisSalesCommissionRatioMapper.selectEmisSalesCommissionRatioList(query);
}
/**
* 新增销售计提比例配置
*
* @param entity 配置实体
* @return 影响行数
* @throws IllegalArgumentException 占比校验不通过时抛出
*/
@Override
public int insertEmisSalesCommissionRatio(EmisSalesCommissionRatio entity) throws EmisBizError {
if (emisSalesCommissionRatioMapper.checkUnique(entity) > 0) {
throw new EmisBizError(EmisBizErrorType.EXISTS, "已存在相同的销售计提比例配置");
}
if (!checkRatioValid(entity)) {
throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "占比总和必须小于等于100%");
}
return emisSalesCommissionRatioMapper.insertEmisSalesCommissionRatio(entity);
}
/**
* 修改销售计提比例配置
*
* @param entity 配置实体
* @return 影响行数
* @throws IllegalArgumentException 占比校验不通过时抛出
*/
@Override
public int updateEmisSalesCommissionRatio(EmisSalesCommissionRatio entity) throws EmisBizError {
if (emisSalesCommissionRatioMapper.checkUnique(entity) > 0) {
throw new EmisBizError(EmisBizErrorType.EXISTS, "已存在相同的销售计提比例配置");
}
if (!checkRatioValid(entity)) {
throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "占比总和必须小于等于100%");
}
return emisSalesCommissionRatioMapper.updateEmisSalesCommissionRatio(entity);
}
/**
* 批量删除销售计提比例配置
*
* @param ids 主键ID数组
* @return 影响行数
*/
@Override
public int deleteEmisSalesCommissionRatioByIds(Long[] ids) {
return emisSalesCommissionRatioMapper.deleteEmisSalesCommissionRatioByIds(ids);
}
/**
* 删除单个销售计提比例配置
*
* @param id 主键ID
* @return 影响行数
*/
@Override
public int deleteEmisSalesCommissionRatioById(Long id) {
return emisSalesCommissionRatioMapper.deleteEmisSalesCommissionRatioById(id);
}
/**
* 校验销售计提比例总和是否有效(<=100%)
*
* @param entity 配置实体
* @return true-有效,false-无效
*/
@Override
public boolean checkRatioValid(EmisSalesCommissionRatio entity) {
java.math.BigDecimal sum = entity.getSalesExecutiveRatio()
.add(entity.getSalesmenRatio())
.add(entity.getSalesSupportRatio());
return sum.compareTo(new java.math.BigDecimal("100.00")) <= 0;
}
}

View File

@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xdadan.erp.emis.mapper.EmisSalesCommissionRatioMapper">
<resultMap type="com.xdadan.erp.emis.domain.EmisSalesCommissionRatio" id="EmisSalesCommissionRatioResult" extends="com.xdadan.erp.emis.mapper.EmisBaseMapper.EmisBaseResult">
<result property="id" column="id" />
<result property="salesExecutive" column="sales_executive" />
<result property="salesExecutiveRatio" column="sales_executive_ratio" />
<result property="salesmen" column="salesmen" />
<result property="salesmenRatio" column="salesmen_ratio" />
<result property="salesSupport" column="sales_support" />
<result property="salesSupportRatio" column="sales_support_ratio" />
<result property="status" column="status" />
</resultMap>
<sql id="selectEmisSalesCommissionRatioVo">
select id, sales_executive, sales_executive_ratio, salesmen, salesmen_ratio, sales_support, sales_support_ratio, status, remark, del_flag, create_by, create_time, update_by, update_time, create_site, update_site from emis_sales_commission_ratio
</sql>
<!-- 查询列表 -->
<select id="selectEmisSalesCommissionRatioList" parameterType="com.xdadan.erp.emis.domain.EmisSalesCommissionRatio" resultMap="EmisSalesCommissionRatioResult">
<include refid="selectEmisSalesCommissionRatioVo"/>
<where>
<if test="salesExecutive != null and salesExecutive != ''">AND sales_executive like concat('%', #{salesExecutive}, '%')</if>
<if test="salesmen != null and salesmen != ''">AND salesmen like concat('%', #{salesmen}, '%')</if>
<if test="salesSupport != null and salesSupport != ''">AND sales_support like concat('%', #{salesSupport}, '%')</if>
<if test="status != null and status != ''">AND status = #{status}</if>
<if test="delFlag != null and delFlag != ''">AND del_flag = #{delFlag}</if>
</where>
ORDER BY id DESC
</select>
<!-- 主键查询 -->
<select id="selectEmisSalesCommissionRatioById" parameterType="long" resultMap="EmisSalesCommissionRatioResult">
<include refid="selectEmisSalesCommissionRatioVo"/>
where id = #{id}
</select>
<!-- 新增 -->
<insert id="insertEmisSalesCommissionRatio" parameterType="com.xdadan.erp.emis.domain.EmisSalesCommissionRatio" useGeneratedKeys="true" keyProperty="id">
insert into emis_sales_commission_ratio
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="salesExecutive != null and salesExecutive != ''">sales_executive,</if>
<if test="salesExecutiveRatio != null">sales_executive_ratio,</if>
<if test="salesmen != null and salesmen != ''">salesmen,</if>
<if test="salesmenRatio != null">salesmen_ratio,</if>
<if test="salesSupport != null and salesSupport != ''">sales_support,</if>
<if test="salesSupportRatio != null">sales_support_ratio,</if>
<if test="status != null">status,</if>
<if test="remark != null and remark != ''">remark,</if>
<if test="delFlag != null and delFlag != ''">del_flag,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null and updateBy != ''">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="createSite != null and createSite != ''">create_site,</if>
<if test="updateSite != null and updateSite != ''">update_site,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="salesExecutive != null and salesExecutive != ''">#{salesExecutive},</if>
<if test="salesExecutiveRatio != null">#{salesExecutiveRatio},</if>
<if test="salesmen != null and salesmen != ''">#{salesmen},</if>
<if test="salesmenRatio != null">#{salesmenRatio},</if>
<if test="salesSupport != null and salesSupport != ''">#{salesSupport},</if>
<if test="salesSupportRatio != null">#{salesSupportRatio},</if>
<if test="status != null">#{status},</if>
<if test="remark != null and remark != ''">#{remark},</if>
<if test="delFlag != null and delFlag != ''">#{delFlag},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null and updateBy != ''">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="createSite != null and createSite != ''">#{createSite},</if>
<if test="updateSite != null and updateSite != ''">#{updateSite},</if>
</trim>
</insert>
<!-- 修改 -->
<update id="updateEmisSalesCommissionRatio" parameterType="com.xdadan.erp.emis.domain.EmisSalesCommissionRatio">
UPDATE emis_sales_commission_ratio
<set>
<if test="salesExecutive != null">sales_executive = #{salesExecutive},</if>
<if test="salesExecutiveRatio != null">sales_executive_ratio = #{salesExecutiveRatio},</if>
<if test="salesmen != null">salesmen = #{salesmen},</if>
<if test="salesmenRatio != null">salesmen_ratio = #{salesmenRatio},</if>
<if test="salesSupport != null">sales_support = #{salesSupport},</if>
<if test="salesSupportRatio != null">sales_support_ratio = #{salesSupportRatio},</if>
<if test="status != null">status = #{status},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="delFlag != null">del_flag = #{delFlag},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
update_time = NOW(),
<if test="updateSite != null">update_site = #{updateSite},</if>
</set>
WHERE id = #{id}
</update>
<!-- 软删除 -->
<update id="deleteEmisSalesCommissionRatioById" parameterType="long">
UPDATE emis_sales_commission_ratio
SET del_flag = '1', update_time = NOW()
WHERE id = #{id}
</update>
<!-- 批量软删除 -->
<update id="deleteEmisSalesCommissionRatioByIds" parameterType="long">
UPDATE emis_sales_commission_ratio
SET del_flag = '1', update_time = NOW()
WHERE id IN
<foreach collection="array" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
<!-- 验重:salesExecutive、salesmen、salesSupport、status都相同视为重复 -->
<select id="checkUnique" parameterType="com.xdadan.erp.emis.domain.EmisSalesCommissionRatio" resultType="int">
SELECT COUNT(1)
FROM emis_sales_commission_ratio
WHERE sales_executive = #{salesExecutive}
AND salesmen = #{salesmen}
AND sales_support = #{salesSupport}
AND status = #{status}
AND del_flag = '0'
<if test="id != null">AND id != #{id}</if>
</select>
</mapper>