feat(personnelMatters): 添加面试登记表详细信息功能

- 新增 RzInterviewerDetail 类用于存储面试登记表详细信息
- 在 RzInterviewer 中添加表单数据字段
- 实现面试登记表信息的导入和导出功能
- 优化面试信息的添加和更新逻辑
This commit is contained in:
tzy 2025-05-30 10:51:32 +08:00
parent 95f42c9fa1
commit 25098b059d
27 changed files with 513 additions and 293 deletions

View File

@ -0,0 +1,22 @@
package com.evo.attendance.domain.vo;
import com.evo.common.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/*
* @Author tzy
* @Description 用于导入销售提成
*/
@Data
public class RzSalaryVo {
@Excel(name = "姓名")
private String name;
@Excel(name = "提成金额")
private BigDecimal sale;
@Excel(name = "日期", width = 30, dateFormat = "yyyy-MM")
private Date date;
}

View File

@ -6,6 +6,8 @@ import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.evo.common.core.domain.BaseEntity;
@ -15,6 +17,7 @@ import com.evo.common.core.domain.BaseEntity;
*
* @author evo
*/
@Data
public class SysDept extends BaseEntity
{
private static final long serialVersionUID = 1L;
@ -46,39 +49,12 @@ public class SysDept extends BaseEntity
/** 父部门名称 */
private String parentName;
/** 是否加班 */
private String isOverTime;
/** 子部门 */
private List<SysDept> children = new ArrayList<SysDept>();
public Long getDeptId()
{
return deptId;
}
public void setDeptId(Long deptId)
{
this.deptId = deptId;
}
public Long getParentId()
{
return parentId;
}
public void setParentId(Long parentId)
{
this.parentId = parentId;
}
public String getAncestors()
{
return ancestors;
}
public void setAncestors(String ancestors)
{
this.ancestors = ancestors;
}
@NotBlank(message = "部门名称不能为空")
@Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
public String getDeptName()
@ -86,86 +62,11 @@ public class SysDept extends BaseEntity
return deptName;
}
public void setDeptName(String deptName)
{
this.deptName = deptName;
}
public String getLeader()
{
return leader;
}
public void setLeader(String leader)
{
this.leader = leader;
}
@Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符")
public String getPhone()
{
return phone;
}
public void setPhone(String phone)
{
this.phone = phone;
}
public String getStatus()
{
return status;
}
public void setStatus(String status)
{
this.status = status;
}
public String getDelFlag()
{
return delFlag;
}
public void setDelFlag(String delFlag)
{
this.delFlag = delFlag;
}
public String getParentName()
{
return parentName;
}
public void setParentName(String parentName)
{
this.parentName = parentName;
}
public List<SysDept> getChildren()
{
return children;
}
public void setChildren(List<SysDept> children)
{
this.children = children;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("deptId", getDeptId())
.append("parentId", getParentId())
.append("ancestors", getAncestors())
.append("deptName", getDeptName())
.append("leader", getLeader())
.append("phone", getPhone())
.append("status", getStatus())
.append("delFlag", getDelFlag())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.toString();
}
}

View File

@ -4,10 +4,14 @@ import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import com.evo.attendance.domain.vo.RzAttendanceDetailVO;
import com.evo.attendance.domain.vo.RzSalaryVo;
import com.evo.common.constant.Constants;
import com.evo.common.core.domain.entity.SysDept;
import com.evo.common.core.domain.entity.SysDictData;
import com.evo.common.utils.StringUtils;
import com.evo.common.utils.poi.ExcelUtil;
import com.evo.common.utils.poi.ExcelUtilSs;
import com.evo.finance.domain.vo.SalaryVo;
import com.evo.system.mapper.SysDictDataMapper;
@ -30,6 +34,8 @@ import com.evo.common.enums.BusinessType;
import com.evo.finance.domain.RzSalaryDetail;
import com.evo.finance.service.IRzSalaryDetailService;
import com.evo.common.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
/**
@ -491,5 +497,17 @@ public class RzSalaryDetailController extends BaseController
String footer = "制表: "+"审核: "+"经理签字: "+"总经理签字: ";
return util.exportExcel(list,lists,"总表",sheetNameList,title,footer);
}
/**
* 导入销售提成
*/
@PreAuthorize("@ss.hasPermi('finance:financeDetail:importSalesCommissions')")
@Log(title = "导入销售提成", businessType = BusinessType.IMPORT)
@PostMapping("/importSalesCommissions")
public AjaxResult importSalesCommissions(MultipartFile file) throws Exception
{
ExcelUtil<RzSalaryVo> util = new ExcelUtil<>(RzSalaryVo.class);
List<RzSalaryVo> attendanceList = util.importExcel(file.getInputStream());
return success(rzSalaryDetailService.importSalesCommissions(attendanceList));
}
}

View File

@ -184,17 +184,28 @@ public class RzSalaryDetail extends BaseEntity
@Excel(name = "本月应缴个税")
private BigDecimal taxPayable;
/** 实发工资 */
@Excel(name = "实发工资")
private BigDecimal netPayroll;
@Excel(name = "销售提成")
private BigDecimal salesCommission;
/** 备注 */
@Excel(name = "备注")
private String remarks;
/** 删除标识 */
private String delFlag;
public BigDecimal getSalesCommission() {
return salesCommission;
}
public void setSalesCommission(BigDecimal salesCommission) {
this.salesCommission = salesCommission;
}
public BigDecimal getMonthSalary() {
return monthSalary;
}
@ -609,54 +620,54 @@ public class RzSalaryDetail extends BaseEntity
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("staffId", getStaffId())
.append("name", getName())
.append("month", getMonth())
.append("wbFlag", getWbFlag())
.append("deptId", getDeptId())
.append("basicSalary", getBasicSalary())
.append("jobSalary", getJobSalary())
.append("dailyWage", getDailyWage())
.append("hoursSalary", getHoursSalary())
.append("overtimeSalary", getOvertimeSalary())
.append("levelSubsidies", getLevelSubsidies())
.append("contractSubsidies", getContractSubsidies())
.append("senioritySalary", getSenioritySalary())
.append("socialSubsidies", getSocialSubsidies())
.append("fullSubsidies", getFullSubsidies())
.append("nightSubsidies", getNightSubsidies())
.append("dinnerSubsidies", getDinnerSubsidies())
.append("subsidyOrBonus", getSubsidyOrBonus())
.append("absenteeismSalary", getAbsenteeismSalary())
.append("absenteeismSubsidies", getAbsenteeismSubsidies())
.append("mealFee", getMealFee())
.append("deductions", getDeductions())
.append("salary", getSalary())
.append("payInsurance", getPayInsurance())
.append("endowmentInsurance", getEndowmentInsurance())
.append("medicalInsurance", getMedicalInsurance())
.append("employmentInjuryInsurance", getEmploymentInjuryInsurance())
.append("maternityInsurance", getMaternityInsurance())
.append("unemploymentInsurance", getUnemploymentInsurance())
.append("accumulationFund", getAccumulationFund())
.append("salaryBeforeTax", getSalaryBeforeTax())
.append("totalWages", getTotalWages())
.append("annualExemptionAmount", getAnnualExemptionAmount())
.append("specialDeduction", getSpecialDeduction())
.append("taxableIncome", getTaxableIncome())
.append("taxRate", getTaxRate())
.append("slowDownTheDeduction", getSlowDownTheDeduction())
.append("aggregatePersonalIncomeTax", getAggregatePersonalIncomeTax())
.append("taxPayable", getTaxPayable())
.append("netPayroll", getNetPayroll())
.append("remarks", getRemarks())
.append("delFlag", getDelFlag())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.toString();
return "RzSalaryDetail{" +
"id=" + id +
", staffId=" + staffId +
", name='" + name + '\'' +
", month=" + month +
", wbFlag='" + wbFlag + '\'' +
", deptId=" + deptId +
", deptName='" + deptName + '\'' +
", monthSalary=" + monthSalary +
", basicSalary=" + basicSalary +
", jobSalary=" + jobSalary +
", dailyWage=" + dailyWage +
", hoursSalary=" + hoursSalary +
", overtimeSalary=" + overtimeSalary +
", levelSubsidies=" + levelSubsidies +
", contractSubsidies=" + contractSubsidies +
", senioritySalary=" + senioritySalary +
", socialSubsidies=" + socialSubsidies +
", fullSubsidies=" + fullSubsidies +
", middleSubsidies=" + middleSubsidies +
", nightSubsidies=" + nightSubsidies +
", dinnerSubsidies=" + dinnerSubsidies +
", subsidyOrBonus=" + subsidyOrBonus +
", absenteeismSalary=" + absenteeismSalary +
", absenteeismSubsidies=" + absenteeismSubsidies +
", mealFee=" + mealFee +
", deductions=" + deductions +
", salary=" + salary +
", payInsurance=" + payInsurance +
", endowmentInsurance=" + endowmentInsurance +
", medicalInsurance=" + medicalInsurance +
", employmentInjuryInsurance=" + employmentInjuryInsurance +
", maternityInsurance=" + maternityInsurance +
", unemploymentInsurance=" + unemploymentInsurance +
", accumulationFund=" + accumulationFund +
", salaryBeforeTax=" + salaryBeforeTax +
", totalWages=" + totalWages +
", annualExemptionAmount=" + annualExemptionAmount +
", specialDeduction=" + specialDeduction +
", taxableIncome=" + taxableIncome +
", taxRate=" + taxRate +
", slowDownTheDeduction=" + slowDownTheDeduction +
", aggregatePersonalIncomeTax=" + aggregatePersonalIncomeTax +
", taxPayable=" + taxPayable +
", netPayroll=" + netPayroll +
", salesCommission=" + salesCommission +
", remarks='" + remarks + '\'' +
", delFlag='" + delFlag + '\'' +
'}';
}
}

View File

@ -2,7 +2,10 @@ package com.evo.finance.mapper;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.evo.finance.domain.RzSalaryDetail;
import com.evo.system.domain.SysStaff;
import org.apache.ibatis.annotations.Param;
/**
@ -11,7 +14,7 @@ import org.apache.ibatis.annotations.Param;
* @author evo
* @date 2024-11-26
*/
public interface RzSalaryDetailMapper
public interface RzSalaryDetailMapper extends BaseMapper<RzSalaryDetail>
{
/**
* 查询工资详情

View File

@ -2,6 +2,8 @@ package com.evo.finance.service;
import java.util.Date;
import java.util.List;
import com.evo.attendance.domain.vo.RzSalaryVo;
import com.evo.common.core.domain.AjaxResult;
import com.evo.finance.domain.RzSalaryDetail;
import org.apache.ibatis.annotations.Param;
@ -66,4 +68,5 @@ public interface IRzSalaryDetailService
*/
public List<RzSalaryDetail> selectSalaryDetailByWbFlag(String wbFlag,Date date);
AjaxResult importSalesCommissions(List<RzSalaryVo> attendanceList);
}

View File

@ -1,13 +1,14 @@
package com.evo.finance.service.impl;
import com.evo.attendance.domain.RzAttendance;
import com.evo.attendance.domain.RzAttendanceStatistical;
import com.evo.attendance.domain.RzSpecialOverTime;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evo.attendance.domain.vo.RzSalaryVo;
import com.evo.attendance.mapper.RzAttendanceMapper;
import com.evo.attendance.mapper.RzAttendanceStatisticalMapper;
import com.evo.attendance.mapper.RzSpecialOverTimeMapper;
import com.evo.common.constant.Constants;
import com.evo.common.core.domain.AjaxResult;
import com.evo.common.core.domain.entity.SysDept;
import com.evo.common.utils.DateUtils;
import com.evo.common.utils.SecurityUtils;
import com.evo.common.utils.StringUtils;
@ -16,7 +17,6 @@ import com.evo.finance.domain.RzSalaryStatistics;
import com.evo.finance.mapper.RzSalaryDetailMapper;
import com.evo.finance.mapper.RzSalaryStatisticsMapper;
import com.evo.finance.service.IRzSalaryDetailService;
import com.evo.personnelMatters.domain.RzHoliday;
import com.evo.personnelMatters.mapper.RzHolidayMapper;
import com.evo.restaurant.domain.RzRestaurantStatistics;
import com.evo.restaurant.mapper.RzRestaurantStatisticsMapper;
@ -26,13 +26,11 @@ import com.evo.system.mapper.SysDeptMapper;
import com.evo.system.mapper.SysStaffDetailMapper;
import com.evo.system.mapper.SysStaffMapper;
import com.evo.system.service.ISysDictDataService;
import com.evo.utils.DateUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
@ -45,7 +43,7 @@ import java.util.List;
* @date 2024-11-26
*/
@Service
public class RzSalaryDetailServiceImpl implements IRzSalaryDetailService
public class RzSalaryDetailServiceImpl extends ServiceImpl<RzSalaryDetailMapper, RzSalaryDetail> implements IRzSalaryDetailService
{
@Resource
private RzSalaryDetailMapper rzSalaryDetailMapper;
@ -69,6 +67,7 @@ public class RzSalaryDetailServiceImpl implements IRzSalaryDetailService
private RzSpecialOverTimeMapper rzSpecialOverTimeMapper;
@Resource
private ISysDictDataService sysDictDataService;
/**
* 查询工资详情
*
@ -554,4 +553,34 @@ public class RzSalaryDetailServiceImpl implements IRzSalaryDetailService
public List<RzSalaryDetail> selectSalaryDetailByWbFlag(String wbFlag,Date date){
return rzSalaryDetailMapper.selectSalaryDetailByWbFlag(wbFlag,date);
}
@Override
public AjaxResult importSalesCommissions(List<RzSalaryVo> attendanceList) {
LambdaQueryWrapper<SysDept> wa = new LambdaQueryWrapper<>();
wa.eq(SysDept::getDelFlag,Constants.DELETE_FLAG_0)
.eq(SysDept::getDeptName,"销售部");
SysDept sysDept = deptMapper.selectOne(wa);
//更新工资单详情,写入销售提成
for (RzSalaryVo rzSalaryVo : attendanceList) {
if (rzSalaryVo.getSale() != null ){
//根据本门查询 月份工资单
List<RzSalaryDetail> rzSalaryDetails = rzSalaryDetailMapper.selectSalaryDetailByDeptId(sysDept.getDeptId(),rzSalaryVo.getDate());
if (!rzSalaryDetails.isEmpty()){
for (RzSalaryDetail rzSalaryDetail : rzSalaryDetails) {
if (rzSalaryDetail.getName().equals(rzSalaryVo.getName())){
//更新销售提成
rzSalaryDetail.setSalesCommission(rzSalaryVo.getSale());
rzSalaryDetail.setUpdateTime(DateUtils.getNowDate());
rzSalaryDetail.setUpdateBy(SecurityUtils.getUsername());
rzSalaryDetailMapper.updateById(rzSalaryDetail);
}
}
}
}
}
return AjaxResult.success();
}
}

View File

@ -120,6 +120,7 @@ public class SecurityConfig
.antMatchers("/api/v1/verify_user").permitAll()
.antMatchers("/api/v1/record/face").permitAll()
.antMatchers("/api/v2/verify_user_yt").permitAll()
.antMatchers("/dev-api/personnelMatters/interviewer").permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();
})

View File

@ -1,5 +1,8 @@
package com.evo.personnelMatters.controller;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.evo.common.annotation.Anonymous;
import com.evo.common.annotation.Log;
import com.evo.common.core.controller.BaseController;
import com.evo.common.core.domain.AjaxResult;
@ -58,17 +61,33 @@ public class RzInterviewerController extends BaseController
*/
@PreAuthorize("@ss.hasPermi('personnelMatters:interviewer:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(rzInterviewerService.selectRzInterviewerById(id));
try {
RzInterviewer interviewer = rzInterviewerService.selectRzInterviewerById(id);
if (interviewer == null) {
return AjaxResult.error("未找到相关数据");
}
// 解析JSON数据
if (interviewer.getFromData() != null && !interviewer.getFromData().isEmpty()) {
JSONObject formData = JSON.parseObject(interviewer.getFromData());
interviewer.setFromData(formData.toJSONString());
}
return AjaxResult.success(interviewer);
} catch (Exception e) {
logger.error("获取面试登记表信息失败", e);
return AjaxResult.error("获取数据失败:" + e.getMessage());
}
}
/**
* 新增面试信息
*/
@PreAuthorize("@ss.hasPermi('personnelMatters:interviewer:add')")
@Log(title = "面试信息", businessType = BusinessType.INSERT)
@PostMapping
@Anonymous
public AjaxResult add(@RequestBody RzInterviewer rzInterviewer)
{
return toAjax(rzInterviewerService.insertRzInterviewer(rzInterviewer));

View File

@ -3,6 +3,7 @@ package com.evo.personnelMatters.domain;
import com.evo.common.annotation.Excel;
import com.evo.common.core.domain.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
@ -14,6 +15,7 @@ import java.util.Date;
* @author chenyj
* @date 2024-09-07
*/
@Data
public class RzInterviewer extends BaseEntity
{
private static final long serialVersionUID = 1L;
@ -53,118 +55,15 @@ public class RzInterviewer extends BaseEntity
/** 备注 */
@Excel(name = "备注")
private String remarks;
/** 提交时间 */
@Excel(name = "提交时间")
private String submitTime;
/** 表单数据 */
@Excel(name = "表单数据")
private String fromData;
/** 删除标记 */
private String delFlag;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setPhone(String phone)
{
this.phone = phone;
}
public String getPhone()
{
return phone;
}
public void setPost(String post)
{
this.post = post;
}
public String getPost()
{
return post;
}
public void setContent(String content)
{
this.content = content;
}
public String getContent()
{
return content;
}
public void setAddress(String address)
{
this.address = address;
}
public String getAddress()
{
return address;
}
public void setInterviewDate(Date interviewDate)
{
this.interviewDate = interviewDate;
}
public Date getInterviewDate()
{
return interviewDate;
}
public void setYtFlag(String ytFlag)
{
this.ytFlag = ytFlag;
}
public String getYtFlag()
{
return ytFlag;
}
public void setRemarks(String remarks)
{
this.remarks = remarks;
}
public String getRemarks()
{
return remarks;
}
public void setDelFlag(String delFlag)
{
this.delFlag = delFlag;
}
public String getDelFlag()
{
return delFlag;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("name", getName())
.append("phone", getPhone())
.append("post", getPost())
.append("content", getContent())
.append("address", getAddress())
.append("interviewDate", getInterviewDate())
.append("ytFlag", getYtFlag())
.append("remarks", getRemarks())
.append("delFlag", getDelFlag())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.toString();
}
}

View File

@ -0,0 +1,12 @@
package com.evo.personnelMatters.domain.vo;
import lombok.Data;
@Data
public class EducationExperience {
private String start;
private String school;
private String major;
private String certificate;
private String remark;
}

View File

@ -0,0 +1,13 @@
package com.evo.personnelMatters.domain.vo;
import lombok.Data;
@Data
public class FamilyMember {
private String relation;
private String name;
private String age;
private String address;
private String company;
private String job;
}

View File

@ -0,0 +1,150 @@
package com.evo.personnelMatters.domain.vo;
import com.evo.common.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.List;
@Data
public class RzInterviewerDetail {
private static final long serialVersionUID = 1L;
/** 主键 */
private Long id;
/** 应聘部门 */
@Excel(name = "应聘部门")
private String department;
/** 应聘岗位 */
@Excel(name = "应聘岗位")
private String post;
/** 期望薪资 */
@Excel(name = "期望薪资")
private String salary;
/** 填写日期 */
@Excel(name = "填写日期")
private String fillDate;
/** 姓名 */
@Excel(name = "姓名")
private String name;
/** 性别 */
@Excel(name = "性别")
private String gender;
/** 出生年月 */
@JsonFormat(pattern = "yyyy-MM")
@Excel(name = "出生年月", width = 30, dateFormat = "yyyy-MM")
private String birth;
/** 民族 */
@Excel(name = "民族")
private String nation;
/** 婚姻状况 */
@Excel(name = "婚姻状况")
private String maritalStatus;
/** 政治面貌 */
@Excel(name = "政治面貌")
private String politicalStatus;
/** 身份证号 */
@Excel(name = "身份证号")
private String idCard;
/** 目前工作状况 */
@Excel(name = "目前工作状况")
private String jobStatus;
/** 最高学历 */
@Excel(name = "最高学历")
private String education;
/** 专业 */
@Excel(name = "专业")
private String major;
/** 毕业学校 */
@Excel(name = "毕业学校")
private String school;
/** 学位 */
@Excel(name = "学位")
private String degree;
/** 职称 */
@Excel(name = "职称")
private String title;
/** 到岗时间 */
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "到岗时间", width = 30, dateFormat = "yyyy-MM-dd")
private String arrivalDate;
/** 户口所在地 */
@Excel(name = "户口所在地")
private String registeredAddress;
/** 现居住地址 */
@Excel(name = "现居住地址")
private String currentAddress;
/** 联系电话 */
@Excel(name = "联系电话")
private String phone;
/** 教育经历列表 */
private List<EducationExperience> educationList;
/** 工作经历列表 */
private List<WorkExperience> workList;
/** 家庭成员列表 */
private List<FamilyMember> familyList;
/** 人才招聘会 */
@Excel(name = "人才招聘会")
private Boolean channelJobFair;
/** 招聘网站 */
@Excel(name = "招聘网站")
private Boolean channelWebsite;
/** 朋友推荐 */
@Excel(name = "朋友推荐")
private Boolean channelFriend;
/** 其他渠道 */
@Excel(name = "其他渠道")
private Boolean channelOther;
/** 介绍人 */
@Excel(name = "介绍人")
private String referrer;
/** 介绍人关系 */
@Excel(name = "介绍人关系")
private String referrerRelation;
/** 介绍人职务 */
@Excel(name = "介绍人职务")
private String referrerJob;
/** 是否同意承诺 */
@Excel(name = "是否同意承诺")
private Boolean promiseAgreed;
/** 删除标记 */
private String delFlag;
/** 表单数据 */
@Excel(name = "表单数据")
private String fromData;
}

View File

@ -0,0 +1,13 @@
package com.evo.personnelMatters.domain.vo;
import lombok.Data;
@Data
public class WorkExperience {
private String start;
private String company;
private String position;
private String content;
private String salary;
private String reason;
}

View File

@ -1,13 +1,19 @@
package com.evo.personnelMatters.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.evo.common.constant.Constants;
import com.evo.common.utils.DateUtils;
import com.evo.common.utils.SecurityUtils;
import com.evo.personnelMatters.domain.RzInterviewer;
import com.evo.personnelMatters.domain.vo.RzInterviewerDetail;
import com.evo.personnelMatters.mapper.RzInterviewerMapper;
import com.evo.personnelMatters.service.IRzInterviewerService;
import com.evo.system.domain.SysStaff;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
@ -55,8 +61,15 @@ public class RzInterviewerServiceImpl implements IRzInterviewerService
@Override
public int insertRzInterviewer(RzInterviewer rzInterviewer)
{
// 解析JSON数据
if (rzInterviewer.getFromData() != null && !rzInterviewer.getFromData().isEmpty()) {
JSONObject formData = JSON.parseObject(rzInterviewer.getFromData());
//将JSON 转换为RzInterviewerDetail
RzInterviewerDetail rzInterviewerDetail = formData.toJavaObject(RzInterviewerDetail.class);
rzInterviewer.setInterviewDate(DateUtils.getNowDate());
rzInterviewer.setAddress(rzInterviewerDetail.getCurrentAddress());
}
rzInterviewer.setYtFlag("");
rzInterviewer.setCreateBy(SecurityUtils.getUsername());
rzInterviewer.setCreateTime(DateUtils.getNowDate());
rzInterviewer.setDelFlag(Constants.DELETE_FLAG_0);
return rzInterviewerMapper.insertRzInterviewer(rzInterviewer);
@ -69,8 +82,30 @@ public class RzInterviewerServiceImpl implements IRzInterviewerService
* @return 结果
*/
@Override
public int updateRzInterviewer(RzInterviewer rzInterviewer)
{
public int updateRzInterviewer(RzInterviewer rzInterviewer) {
if (rzInterviewer.getYtFlag().equals("")){
//同步员工信息中
SysStaff sysStaff = new SysStaff();
sysStaff.setName(rzInterviewer.getName());
String fromData = rzInterviewer.getFromData();
RzInterviewerDetail detail = JSON.parseObject(fromData).toJavaObject(RzInterviewerDetail.class);
sysStaff.setPhone(detail.getPhone());
sysStaff.setIdCard(detail.getIdCard());
sysStaff.setSex(detail.getGender());
//根据出生年月计算年龄
String birth = detail.getBirth();
if (birth != null && !birth.isEmpty()) {
int year = Integer.parseInt(birth.substring(0,4));
int age = Integer.parseInt(new SimpleDateFormat("yyyy").format(new Date())) - year;
sysStaff.setAge(Long.parseLong(age+""));
}
sysStaff.setAddress(detail.getCurrentAddress());
sysStaff.setLevel(detail.getEducation());
sysStaff.setMajor(detail.getMajor());
sysStaff.setSchool(detail.getSchool());
}
rzInterviewer.setUpdateBy(SecurityUtils.getUsername());
rzInterviewer.setUpdateTime(DateUtils.getNowDate());
return rzInterviewerMapper.updateRzInterviewer(rzInterviewer);

View File

@ -58,4 +58,5 @@ public class RzRestaurantImagesController extends BaseController
public AjaxResult uploadPDF(@RequestParam("name") String name,@RequestParam("file") MultipartFile filePath){
return rzRestaurantImagesService.insertRzRestaurantImages(name,filePath);
}
}

View File

@ -8,6 +8,7 @@ import com.evo.common.utils.Collections;
import com.evo.common.utils.DateUtils;
import com.evo.common.utils.SecurityUtils;
import com.evo.common.utils.StringUtils;
import com.evo.common.utils.file.FileUploadUtils;
import com.evo.equipment.domain.vo.StaffData;
import com.evo.equipment.domain.vo.StaffDto;
import com.evo.equipment.service.IEqSnDetailService;
@ -20,10 +21,7 @@ import com.evo.restaurant.service.IRzRestaurantImagesService;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.*;
import java.util.Date;
import java.util.List;

View File

@ -5,6 +5,7 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson2.JSON;
import com.evo.attendance.domain.vo.RzSalaryVo;
import com.evo.system.domain.SysStaff;
import com.evo.system.domain.vo.SysStaffVo;
import com.evo.system.service.ISysStaffService;
@ -162,5 +163,16 @@ public class SysStaffController extends BaseController
List<SysStaff> list = sysStaffService.queryysStaffByDeptId(dept);
return list;
}
/**
* 导入销售提成
*/
@PreAuthorize("@ss.hasPermi('system:staff:importSalesCommissions')")
@Log(title = "导入销售提成", businessType = BusinessType.IMPORT)
@PostMapping("/importSalesCommissions")
public AjaxResult importSalesCommissions(MultipartFile file) throws Exception
{
ExcelUtil<RzSalaryVo> util = new ExcelUtil<>(RzSalaryVo.class);
List<RzSalaryVo> attendanceList = util.importExcel(file.getInputStream());
return success(sysStaffService.importSalesCommissions(attendanceList));
}
}

View File

@ -163,6 +163,9 @@ public class SysStaffDetail extends BaseEntity
/** 本年累计已缴个税 */
@Excel(name = "本年累计已缴个税")
private BigDecimal aggregatePersonalIncomeTax;
/** 本年累计已缴个税 */
@Excel(name = "销售提成")
private BigDecimal salesCommission;
/** 备注 */
@Excel(name = "备注")

View File

@ -1,6 +1,8 @@
package com.evo.system.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import com.evo.common.core.domain.entity.SysDept;
@ -9,7 +11,7 @@ import com.evo.common.core.domain.entity.SysDept;
*
* @author evo
*/
public interface SysDeptMapper
public interface SysDeptMapper extends BaseMapper<SysDept>
{
/**
* 查询部门管理数据

View File

@ -1,14 +1,12 @@
package com.evo.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.evo.attendance.domain.RzAttendanceStatistical;
import com.evo.attendance.domain.vo.RzSalaryVo;
import com.evo.common.core.domain.AjaxResult;
import com.evo.common.core.domain.entity.SysUser;
import com.evo.system.domain.SysStaff;
import com.evo.system.domain.vo.SysStaffVo;
import org.springframework.web.multipart.MultipartFile;
import java.util.Date;
import java.util.List;
/**
@ -98,4 +96,8 @@ public interface ISysStaffService extends IService<SysStaff>
public void calculationOfSeniority();
public SysStaff selectSysStaffByName(String employeeName);
SysStaff selectByDepId(Long deptId);
AjaxResult importSalesCommissions(List<RzSalaryVo> attendanceList);
}

View File

@ -59,7 +59,11 @@ public class SysStaffDetailServiceImpl extends ServiceImpl<SysStaffDetailMapper,
@Override
public SysStaffDetail selectSysStaffDetailByUserId(Long id) {
return SubsidyCalculationUtils.subsidyCalculation(sysStaffService.selectSysStaffByUserId(id),getOne(new LambdaQueryWrapper<SysStaffDetail>().eq(SysStaffDetail::getDelFlag, Constants.DELETE_FLAG_0).eq(SysStaffDetail::getStaffId, id).orderByDesc(SysStaffDetail::getCreateTime), false), rzSubsidyInfoService.list());
return SubsidyCalculationUtils.subsidyCalculation(sysStaffService.selectSysStaffByUserId(id),
getOne(new LambdaQueryWrapper<SysStaffDetail>()
.eq(SysStaffDetail::getDelFlag, Constants.DELETE_FLAG_0)
.eq(SysStaffDetail::getStaffId, id)
.orderByDesc(SysStaffDetail::getCreateTime), false), rzSubsidyInfoService.list());
}
/**

View File

@ -3,6 +3,7 @@ package com.evo.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evo.attendance.service.IRzAttendanceStatisticalService;
import com.evo.attendance.domain.vo.RzSalaryVo;
import com.evo.common.annotation.DataScope;
import com.evo.common.constant.Constants;
import com.evo.common.core.domain.AjaxResult;
@ -861,7 +862,52 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
public SysStaff selectSysStaffByName(String employeeName) {
LambdaQueryWrapper<SysStaff> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysStaff::getName,employeeName);
return getBaseMapper().selectOne(wrapper);
}
@Override
public SysStaff selectByDepId(Long deptId) {
LambdaQueryWrapper<SysStaff> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysStaff::getDeptId,deptId);
return getBaseMapper().selectOne(wrapper);
}
@Override
public AjaxResult importSalesCommissions(List<RzSalaryVo> attendanceList) {
// 获取销售部门信息
SysDept sysDept = deptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
.eq(SysDept::getDelFlag, Constants.DELETE_FLAG_0)
.eq(SysDept::getDeptName, "销售部"));
if (sysDept == null) {
return AjaxResult.error("销售部门未找到,请确认部门是否存在且未被删除!");
}
// 更新工资单详情写入销售提成
for (RzSalaryVo rzSalaryVo : attendanceList) {
if (rzSalaryVo.getSale() != null && rzSalaryVo.getName() != null) {
// 直接根据姓名和部门ID查询员工信息
SysStaff sysStaff = getBaseMapper().selectOne(new LambdaQueryWrapper<SysStaff>()
.eq(SysStaff::getName, rzSalaryVo.getName())
.eq(SysStaff::getDeptId, sysDept.getDeptId())
.eq(SysStaff::getDelFlag, Constants.DELETE_FLAG_0));
if (sysStaff != null) {
// 获取员工详情
SysStaffDetail sysStaffDetail = sysStaffDetailMapper.selectSysStaffDetailByStaffId(sysStaff.getUserId());
if (sysStaffDetail != null) {
// 更新销售提成
sysStaffDetail.setSalesCommission(rzSalaryVo.getSale());
sysStaffDetail.setUpdateTime(new Date());
sysStaffDetail.setUpdateBy(SecurityUtils.getUsername());
sysStaffDetailMapper.updateById(sysStaffDetail);
}
}
}
}
return AjaxResult.success();
}
}

View File

@ -45,6 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="taxRate" column="tax_rate" />
<result property="slowDownTheDeduction" column="slow_down_the_deduction" />
<result property="aggregatePersonalIncomeTax" column="aggregate_personal_income_tax" />
<result property="salesCommission" column="sales_commission" />
<result property="taxPayable" column="tax_payable" />
<result property="netPayroll" column="net_payroll" />
<result property="remarks" column="remarks" />
@ -56,7 +57,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectRzSalaryDetailVo">
select id, staff_id, name, month, wb_flag, dept_id,month_salary, basic_salary, job_salary, daily_wage, hours_salary, overtime_salary, level_subsidies, contract_subsidies, seniority_salary, social_subsidies, full_subsidies, night_subsidies, dinner_subsidies, subsidy_or_bonus, absenteeism_salary, absenteeism_subsidies, meal_fee, deductions, salary, pay_insurance, endowment_insurance, medical_insurance, employment_injury_insurance, maternity_insurance, unemployment_insurance, accumulation_fund, salary_before_tax, total_wages, annual_exemption_amount, special_deduction, taxable_income, tax_rate, slow_down_the_deduction, aggregate_personal_income_tax, aggregate_tax, tax_payable, net_payroll, remarks, del_flag, create_by, create_time, update_by, update_time from rz_salary_detail
select id, staff_id, name, month, wb_flag, dept_id,month_salary, basic_salary, job_salary, daily_wage, hours_salary, overtime_salary, level_subsidies, contract_subsidies, seniority_salary, social_subsidies, full_subsidies, night_subsidies, dinner_subsidies, subsidy_or_bonus, absenteeism_salary, absenteeism_subsidies, meal_fee, deductions, salary, pay_insurance, endowment_insurance, medical_insurance, employment_injury_insurance, maternity_insurance, unemployment_insurance, accumulation_fund, salary_before_tax, total_wages, annual_exemption_amount, special_deduction, taxable_income, tax_rate, slow_down_the_deduction, aggregate_personal_income_tax, aggregate_tax, tax_payable, net_payroll,sales_commissions, remarks, del_flag, create_by, create_time, update_by, update_time from rz_salary_detail
</sql>
<select id="selectRzSalaryDetailList" parameterType="RzSalaryDetail" resultMap="RzSalaryDetailResult">
@ -119,6 +120,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="taxPayable != null">tax_payable,</if>
<if test="netPayroll != null">net_payroll,</if>
<if test="remarks != null">remarks,</if>
<if test="salesCommission != null">salesCommission,</if>
<if test="delFlag != null">del_flag,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
<if test="createTime != null">create_time,</if>
@ -167,6 +169,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="aggregatePersonalIncomeTax != null">#{aggregatePersonalIncomeTax},</if>
<if test="taxPayable != null">#{taxPayable},</if>
<if test="netPayroll != null">#{netPayroll},</if>
<if test="salesCommission != null">#{salesCommission},</if>
<if test="remarks != null">#{remarks},</if>
<if test="delFlag != null">#{delFlag},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
@ -220,6 +223,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="aggregatePersonalIncomeTax != null">aggregate_personal_income_tax = #{aggregatePersonalIncomeTax},</if>
<if test="taxPayable != null">tax_payable = #{taxPayable},</if>
<if test="netPayroll != null">net_payroll = #{netPayroll},</if>
<if test="salesCommission != null">net_payroll = #{salesCommission},</if>
<if test="remarks != null">remarks = #{remarks},</if>
<if test="delFlag != null">del_flag = #{delFlag},</if>
<if test="createBy != null and createBy != ''">create_by = #{createBy},</if>

View File

@ -19,10 +19,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="submitTime" column="submit_time" />
<result property="fromData" column="from_data" />
</resultMap>
<sql id="selectRzInterviewerVo">
select id, name, phone, post, content, address, interview_date, yt_flag, remarks, del_flag, create_by, create_time, update_by, update_time from rz_interviewer
select id, name, phone, post, content, address, interview_date, yt_flag, remarks, del_flag, create_by, create_time, update_by, update_time,submit_time, from_data from rz_interviewer
</sql>
<select id="selectRzInterviewerList" parameterType="RzInterviewer" resultMap="RzInterviewerResult">
@ -33,6 +35,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="post != null and post != ''"> and post like concat('%', #{post}, '%')</if>
<if test="content != null and content != ''"> and content like concat('%', #{content}, '%')</if>
<if test="ytFlag != null and ytFlag != ''"> and yt_flag = #{ytFlag}</if>
<if test="submitTime != null and submitTime != ''"> and submit_time = #{submitTime}</if>
<if test="fromData != null and fromData != ''"> and from_data = #{fromData}</if>
</where>
</select>
@ -57,6 +61,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="submitTime != null">submit_time,</if>
<if test="fromData != null">from_data,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="name != null">#{name},</if>
@ -72,6 +78,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="submitTime != null">#{submitTime},</if>
<if test="fromData != null">#{fromData},</if>
</trim>
</insert>
@ -91,6 +99,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="submitTime != null">submit_time = #{submitTime},</if>
<if test="fromData != null">from_data = #{fromData},</if>
</trim>
where id = #{id}
</update>

View File

@ -18,10 +18,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="isOverTime" column="is_over_time" />
</resultMap>
<sql id="selectDeptVo">
select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.leader, d.phone,d.status, d.del_flag, d.create_by, d.create_time
select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.leader, d.phone,d.status, d.del_flag,d.is_over_time, d.create_by, d.create_time
from sys_dept d
</sql>
@ -40,6 +41,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="status != null and status != ''">
AND status = #{status}
</if>
<if test="isOverTime != null and status != ''">
AND is_over_time = #{isOverTime}
</if>
<!-- 数据范围过滤 -->
${params.dataScope}
order by d.parent_id
@ -57,7 +61,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectDeptById" parameterType="Long" resultMap="SysDeptResult">
select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.leader, d.phone, d.status,
select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.leader, d.phone, d.status,d.is_over_time,
(select dept_name from sys_dept where dept_id = d.parent_id) parent_name
from sys_dept d
where d.dept_id = #{deptId}
@ -94,6 +98,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="leader != null and leader != ''">leader,</if>
<if test="phone != null and phone != ''">phone,</if>
<if test="status != null">status,</if>
<if test="isOverTime != null">is_over_time,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
create_time
)values(
@ -104,6 +109,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="leader != null and leader != ''">#{leader},</if>
<if test="phone != null and phone != ''">#{phone},</if>
<if test="status != null">#{status},</if>
<if test="isOverTime != null">#{isOverTime},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
sysdate()
)
@ -118,6 +124,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="leader != null">leader = #{leader},</if>
<if test="phone != null">phone = #{phone},</if>
<if test="status != null and status != ''">status = #{status},</if>
<if test="isOverTime != null">is_over_time = #{isOverTime},</if>
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
update_time = sysdate()
</set>

View File

@ -41,6 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="specialDeduction" column="special_deduction" />
<result property="totalWages" column="total_wages" />
<result property="aggregatePersonalIncomeTax" column="aggregate_personal_income_tax" />
<result property="salesCommission" column="sales_commission" />
<result property="remarks" column="remarks" />
<result property="delFlag" column="del_flag" />
<result property="createBy" column="create_by" />
@ -196,6 +197,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="specialDeduction != null">special_deduction = #{specialDeduction},</if>
<if test="totalWages != null">total_wages = #{totalWages},</if>
<if test="aggregatePersonalIncomeTax != null">aggregate_personal_income_tax = #{aggregatePersonalIncomeTax},</if>
<if test="salesCommission != null">sales_commission = #{salesCommission},</if>
<if test="remarks != null">remarks = #{remarks},</if>
<if test="delFlag != null and delFlag != ''">del_flag = #{delFlag},</if>
<if test="createBy != null and createBy != ''">create_by = #{createBy},</if>