Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
39fee88bdd | ||
|
|
dd117937f0 | ||
|
|
2f88db00da | ||
|
|
ce60d0986f | ||
|
|
5f6fc4216b | ||
|
|
45da1138bf | ||
|
|
f07b0b7e16 | ||
|
|
8e7d331c65 | ||
|
|
0a87b28282 | ||
|
|
6b43aa02ae | ||
|
|
90622c0e0b |
@ -15,6 +15,8 @@ public class RzSalaryVo {
|
||||
|
||||
@Excel(name = "姓名")
|
||||
private String name;
|
||||
@Excel(name = "身份证号")
|
||||
private String idCard;
|
||||
@Excel(name = "提成金额")
|
||||
private BigDecimal sale;
|
||||
@Excel(name = "日期", width = 30, dateFormat = "yyyy-MM")
|
||||
|
||||
@ -101,11 +101,20 @@ public class KQDeviceExchangeProcessor implements PunchTheClockStrategyExchangeP
|
||||
//如果最后一条数据的卡类型为下班卡,则返回上班卡和加班卡权限 or 检查当前人员是否存在特殊加班中 或者 检查当前人员部门是否开启加班 or 暂时取消这个判定 当天打过加班卡 ( || rzAttendanceDetailMapper.checkOverTimeCard(sysStaff.getUserId(), new Date()) > 0)
|
||||
if(ObjectUtils.isNotEmpty(eqOverStaffMapper.selectEqOverStaffByUserId(sysStaff.getUserId())) || ObjectUtils.isEmpty(sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>().eq(SysDept::getDeptId, sysStaff.getDeptId()).eq(SysDept::getIsOverTime,"1")))){
|
||||
//如果存在特殊加班, 或者当前部门没有开启加班 或者当天打过加班, 则无法打加班卡
|
||||
return initMessage(0,"验证通过", "111000000");
|
||||
// return initMessage(0,"验证通过", "111000000");
|
||||
return initMessage(0,"验证通过", "000000000");
|
||||
}
|
||||
return initMessage(0,"验证通过", "111100000");
|
||||
//检查最后一条打卡记录是否为钉钉的下班卡, 如果不存在禁止打加班卡
|
||||
// return initMessage(0,"验证通过", "111100000");
|
||||
return initMessage(0,"验证通过", "000100000");
|
||||
}else{
|
||||
//检查钉钉是否存在今天的下班卡, 和加班卡
|
||||
if("加班卡".equals(rzAttendanceDetail.getButtonType())){
|
||||
return initMessage(0,"验证通过", "000011000");
|
||||
}else{
|
||||
return initMessage(0,"验证通过", "000000000");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -211,11 +220,13 @@ public class KQDeviceExchangeProcessor implements PunchTheClockStrategyExchangeP
|
||||
}
|
||||
|
||||
public Boolean checkToDayCard(String userId, String rules, Date date){
|
||||
return ObjectUtils.isNotEmpty(rzAttendanceDetailService.getOne(new LambdaQueryWrapper<RzAttendanceDetail>()
|
||||
//原位getOne, 修正钉钉打打卡后 会出现多条记录, 所以改为list
|
||||
return ObjectUtils.isNotEmpty(rzAttendanceDetailService.list(new LambdaQueryWrapper<RzAttendanceDetail>()
|
||||
.like(RzAttendanceDetail::getButtonType,"%"+rules+"%")
|
||||
.eq(RzAttendanceDetail::getStaffId, Long.valueOf(userId))
|
||||
.eq(RzAttendanceDetail::getDelFlag, Constants.DELETE_FLAG_0)
|
||||
.apply(" date_format(date_time,'%Y%m%d') = date_format({0},'%Y%m%d') ", date)));
|
||||
.apply(" date_format(date_time,'%Y%m%d') = date_format({0},'%Y%m%d') ", date)
|
||||
.orderByDesc(RzAttendanceDetail::getCreateTime)));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -80,7 +80,7 @@ public class RzAttendanceDetailServiceImpl extends ServiceImpl<RzAttendanceDetai
|
||||
//.apply( " DATE_FORMAT(date_time,'%Y%m%d') = DATE_FORMAT({0},'%Y%m%d')", date)
|
||||
//以下为特殊规则, 只针对下班卡起作用
|
||||
.orderByAsc("下班卡".equals(rules), RzAttendanceDetail::getDateTime)
|
||||
.last("下班卡".equals(rules)," limit 1 ")
|
||||
.last(" limit 1 ")
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -30,6 +30,9 @@ import com.evo.system.mapper.SysDeptMapper;
|
||||
import com.evo.system.mapper.SysStaffMapper;
|
||||
import com.evo.system.service.ISysStaffService;
|
||||
import com.evo.wechat.service.SendClientService;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
@ -146,6 +149,19 @@ public class RzAttendanceServiceImpl extends ServiceImpl<RzAttendanceMapper, RzA
|
||||
*/
|
||||
@Override
|
||||
public int attendenceCount() {
|
||||
// Map<String, String> addressMap = ParamUtils.checkKqAddressCount();
|
||||
// Map<String, Integer> resultMap = Collections.emptyMap();
|
||||
// ObjectMapper mapper = new ObjectMapper();
|
||||
// addressMap.keySet().stream().forEach(key -> {
|
||||
// try {
|
||||
// Map<String, String> limitMap = mapper.readValue(addressMap.get(key), new TypeReference<Map<String, String>>() {});
|
||||
// limitMap.get()
|
||||
// resultMap.put(key, getBaseMapper().attendenceCount())
|
||||
// } catch (JsonProcessingException e) {
|
||||
// throw new RuntimeException(e);
|
||||
// }
|
||||
// });
|
||||
|
||||
List<RzAttendance> list = getBaseMapper().attendenceCount();
|
||||
return list.size();
|
||||
}
|
||||
|
||||
@ -40,7 +40,7 @@ public class CallbackController extends BaseController {
|
||||
List<DingCallBackExchangeProcessor> dingCallBackExchangeProcessorList;
|
||||
@PostMapping("/ding/clock")
|
||||
public Map<String, String> dingDingClock(@RequestBody Map<String, Object> params){
|
||||
System.out.println(JSONObject.toJSONString(params));
|
||||
log.info(JSONObject.toJSONString(params));
|
||||
try {
|
||||
// 1. 从http请求中获取加解密参数
|
||||
|
||||
@ -50,7 +50,7 @@ public class CallbackController extends BaseController {
|
||||
String encryptMsg = String.valueOf(params.get("encrypt"));
|
||||
String decryptMsg = callbackCrypto.getDecryptMsg(String.valueOf(params.get("msg_signature")), String.valueOf(params.get("timestamp")), String.valueOf(params.get("nonce")), encryptMsg);
|
||||
|
||||
System.out.println("==============>"+decryptMsg);
|
||||
log.info("==============>"+decryptMsg);
|
||||
// 3. 反序列化回调事件json数据
|
||||
JSONObject eventJson = JSON.parseObject(decryptMsg);
|
||||
String eventType = eventJson.getString("EventType");
|
||||
|
||||
@ -57,6 +57,9 @@ public class SysDept extends BaseEntity
|
||||
/** 是否加班 */
|
||||
private String isOverTime;
|
||||
|
||||
/** 是否加班 */
|
||||
private String isShowFinancial;
|
||||
|
||||
private String dingId;
|
||||
|
||||
/** 子部门 */
|
||||
|
||||
@ -7,6 +7,9 @@ import com.evo.attendance.service.IRzSysParamService;
|
||||
import com.evo.personnelMatters.domain.RzHoliday;
|
||||
import com.evo.personnelMatters.service.IRzHolidayService;
|
||||
import com.evo.system.service.ISysDictDataService;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@ -198,7 +201,16 @@ public class ParamUtils {
|
||||
* @return
|
||||
*/
|
||||
public static List<String> getTsDevSn(){
|
||||
RzSysParam param= paramService.getRzSysParam("获取特殊类型的打卡机型号", "ts_device_sn","ET74336,ET74335","获取特殊类型的打卡机型号, 多个参数使用,隔开");
|
||||
RzSysParam param= paramService.getRzSysParam("获取特殊类型的打卡机型号", "ts_device_sn","T71474,RT64815","获取特殊类型的打卡机型号, 多个参数使用,隔开");
|
||||
return Collections.asList(param.getParamValue().split(","));
|
||||
}
|
||||
|
||||
/***
|
||||
* 获取餐厅设备信息
|
||||
* @return
|
||||
*/
|
||||
public static List<String> getRestaurantDevSn(){
|
||||
RzSysParam param= paramService.getRzSysParam("获取餐厅打卡机型号", "restaurant_device_sn","T71474,RT64815","获取餐厅打卡机型号, 多个参数使用,隔开");
|
||||
return Collections.asList(param.getParamValue().split(","));
|
||||
}
|
||||
|
||||
@ -217,6 +229,24 @@ public class ParamUtils {
|
||||
if(StringUtils.isEmpty(rulesVal)) return false;
|
||||
return Collections.asList(rulesVal.split(",")).contains(rules);
|
||||
}
|
||||
|
||||
/***
|
||||
* 检查各厂考勤人数
|
||||
* sn 设备号
|
||||
* rules 规则
|
||||
* @return
|
||||
*/
|
||||
public static Map<String, String> checkKqAddressCount(){
|
||||
try {
|
||||
RzSysParam param= paramService.getRzSysParam("检查各厂考勤人数规则", "check_kq_address_count","{\"北厂\":\"{\"longScope\":\"123-456\",\"latScope\":\"123-456\"}\"}","特殊打卡机的打卡按钮规则, 使用json格式, 如果打卡机存在多个按钮规则用,分割");
|
||||
String val = param.getParamValue();
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
// 第一层:外层 Map<String, String>
|
||||
return mapper.readValue(param.getParamValue(), new TypeReference<Map<String, String>>() {});
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
/***
|
||||
* 获取特殊加班的考勤规则
|
||||
* sn 设备号
|
||||
@ -360,6 +390,11 @@ public class ParamUtils {
|
||||
return Collections.asList(param.getParamValue().split(",")).stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static List<String> getWeBaoTaxCompany(){
|
||||
RzSysParam param= paramService.getRzSysParam("需要扣税的外包公司名称", "we_bao_tax_company","YTLW","需要扣税的外包公司名称)");
|
||||
return Collections.asList(param.getParamValue().split(",")).stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
||||
/***
|
||||
* 获取80%假期
|
||||
@ -371,7 +406,16 @@ public class ParamUtils {
|
||||
}
|
||||
|
||||
/***
|
||||
* 获取80%假期
|
||||
* 获取基本薪假期
|
||||
* @return
|
||||
*/
|
||||
public static List<Long> getBasicVacation(){
|
||||
RzSysParam param= paramService.getRzSysParam("基本薪假期类型", "basic_vacation","58","80%的假期类型; 58-陪产假");
|
||||
return Collections.asList(param.getParamValue().split(",")).stream().filter(StringUtils::isNotEmpty).map(Long::valueOf).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/***
|
||||
* 特殊年度免征额计算
|
||||
* @param nameAndIdCard 姓名-身份证
|
||||
* @return
|
||||
*/
|
||||
|
||||
@ -35,6 +35,11 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC
|
||||
SpringUtils.applicationContext = applicationContext;
|
||||
}
|
||||
|
||||
public static ApplicationContext getApplicationContext() throws BeansException
|
||||
{
|
||||
return SpringUtils.applicationContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取对象
|
||||
*
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package com.evo.ding.processor.callback.impl;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.dingtalk.api.response.OapiAttendanceGroupQueryResponse;
|
||||
import com.dingtalk.api.response.OapiAttendanceShiftQueryResponse;
|
||||
@ -45,6 +46,8 @@ public class DingCallBackGroupChangeExchangeProcessor implements DingCallBackExc
|
||||
@Autowired
|
||||
DingShiftGroupService dingShiftGroupService;
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public boolean accept(String eventType) {
|
||||
return EVENT_TYPE_ATTEND_GROUP_CHANGE.equals(eventType);
|
||||
@ -79,7 +82,7 @@ public class DingCallBackGroupChangeExchangeProcessor implements DingCallBackExc
|
||||
for (Long shiftId : groupDetail.getShiftIds()) {
|
||||
String strShiftId = String.valueOf(shiftId);
|
||||
if(map.containsKey(strShiftId)){
|
||||
DingShift dingShift = dingShiftService.selectByDingId(strShiftId);
|
||||
DingShift dingShift = dingShiftService.selectByDingIdEmptyCreate(strShiftId);
|
||||
for (DingShiftGroup dingShiftGroup : map.get(strShiftId)){
|
||||
dingShiftGroup.setCheckTime(("OnDuty".equals(dingShiftGroup.getType()) ? dingShift.getOnDutyCheckTime() : dingShift.getOffDutyCheckTime()));
|
||||
dingShiftGroupService.updateById(dingShiftGroup);
|
||||
@ -97,7 +100,7 @@ public class DingCallBackGroupChangeExchangeProcessor implements DingCallBackExc
|
||||
}
|
||||
}
|
||||
public void crateDingShiftGroup(String groupId, String shiftId){
|
||||
DingShift dingShift = dingShiftService.selectByDingId(shiftId);
|
||||
DingShift dingShift = dingShiftService.selectByDingIdEmptyCreate(shiftId);
|
||||
//直接更新上班, 下班
|
||||
for (int i = 0; i < 2; i++) {
|
||||
DingShiftGroup dingShiftGroup = new DingShiftGroup();
|
||||
|
||||
@ -18,5 +18,7 @@ public interface DingShiftService extends IService<DingShift> {
|
||||
|
||||
public DingShift selectByDingId(String dingId);
|
||||
|
||||
public DingShift selectByDingIdEmptyCreate(String dingId);
|
||||
|
||||
public List<DingShift> selectList(DingShift dingShift);
|
||||
}
|
||||
|
||||
@ -1,12 +1,17 @@
|
||||
package com.evo.ding.service.impl;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.evo.common.utils.Collections;
|
||||
import com.evo.ding.domain.DingShift;
|
||||
import com.evo.ding.domain.DingShiftGroup;
|
||||
import com.evo.ding.mapper.DingShiftGroupMapper;
|
||||
import com.evo.ding.mapper.DingShiftMapper;
|
||||
import com.evo.ding.processor.callback.impl.DingCallBackShiftChangeExchangeProcessor;
|
||||
import com.evo.ding.service.DingShiftGroupService;
|
||||
import com.evo.ding.service.DingShiftService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
@ -21,11 +26,24 @@ import java.util.List;
|
||||
*/
|
||||
@Service
|
||||
public class DingShiftServiceImpl extends ServiceImpl<DingShiftMapper, DingShift> implements DingShiftService {
|
||||
@Autowired
|
||||
@Lazy
|
||||
DingCallBackShiftChangeExchangeProcessor dingCallBackShiftChangeExchangeProcessor;
|
||||
@Override
|
||||
public DingShift selectByDingId(String dingId) {
|
||||
return getBaseMapper().selectByDingId(dingId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DingShift selectByDingIdEmptyCreate(String dingId) {
|
||||
DingShift dingShift = getBaseMapper().selectByDingId(dingId);
|
||||
if(dingShift == null){
|
||||
dingCallBackShiftChangeExchangeProcessor.exchange(JSONObject.from(Collections.asMap("id", dingId)));
|
||||
return selectByDingId(dingId);
|
||||
}
|
||||
return dingShift;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<DingShift> selectList(DingShift dingShift) {
|
||||
return getBaseMapper().selectList(dingShift);
|
||||
|
||||
@ -2,6 +2,7 @@ package com.evo.equipment.service.impl;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.evo.common.utils.ParamUtils;
|
||||
import com.evo.equipment.constant.Constants;
|
||||
import com.evo.common.core.domain.AjaxResult;
|
||||
import com.evo.common.utils.DateUtils;
|
||||
@ -113,7 +114,7 @@ public class EqImagesServiceImpl implements IEqImagesService
|
||||
|
||||
//定义公共打卡机
|
||||
List<String> dkj_list = new ArrayList<String>();
|
||||
dkj_list.add(Constants.EQ_DEVICE_CODE); //食堂
|
||||
dkj_list.addAll(ParamUtils.getRestaurantDevSn()); //食堂
|
||||
// dkj_list.add(Constants.EQ_DEVICE_PUBLIC_CODE); //公共
|
||||
dkj_list.add(eqImages.getTimeClock());
|
||||
|
||||
@ -265,7 +266,7 @@ public class EqImagesServiceImpl implements IEqImagesService
|
||||
Row row = sheet.getRow(p);
|
||||
if(StringUtils.isNotNull(row)){
|
||||
dkj_list = new ArrayList<String>();
|
||||
dkj_list.add(Constants.EQ_DEVICE_CODE); //食堂
|
||||
dkj_list.addAll(ParamUtils.getRestaurantDevSn()); //食堂
|
||||
// dkj_list.add(Constants.EQ_DEVICE_PUBLIC_CODE); //公共
|
||||
dkj_list.add(row.getCell(4).getStringCellValue());
|
||||
cau = new StaffDto();
|
||||
|
||||
@ -46,7 +46,7 @@ import java.util.stream.Collectors;
|
||||
* @date 2024-08-07
|
||||
*/
|
||||
@Service
|
||||
public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDetail> implements IEqSnDetailService, ApplicationRunner
|
||||
public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDetail> implements IEqSnDetailService
|
||||
{
|
||||
@Resource
|
||||
private SysStaffMapper sysStaffMapper;
|
||||
@ -118,8 +118,15 @@ public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDet
|
||||
public EqSnDetail selectEqSnDetailBySn(String sn){
|
||||
return getBaseMapper().selectEqSnDetailBySn(sn);
|
||||
}
|
||||
//com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE,
|
||||
static List<String> tsSn = Collections.asList(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE);
|
||||
//com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE, Collections.asList(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE)
|
||||
static List<String> tsSn = Collections.emptyList();
|
||||
|
||||
public List<String> getTsSn(){
|
||||
tsSn.clear();
|
||||
tsSn.addAll(ParamUtils.getTsDevSn());
|
||||
tsSn.addAll(ParamUtils.getRestaurantDevSn());
|
||||
return tsSn;
|
||||
}
|
||||
|
||||
private List<Map<String, String>> getPhoto(List<SysStaff> userList){
|
||||
List<Map<String, String>> userPhotoList = Collections.emptyList();
|
||||
@ -141,11 +148,12 @@ public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDet
|
||||
public Map<String, List<Map<String, String>>> initTsDkDevice(String deviceSn){
|
||||
Map<String, List<Map<String, String>>> snUserPhotoList = Collections.emptyMap();
|
||||
//如果有且只有一个设备信息, 并且设备信息为公共打卡机, 或者是 食堂打卡机
|
||||
if(tsSn.contains(deviceSn)) {
|
||||
if(getTsSn().contains(deviceSn)) {
|
||||
List<Map<String, String>> userPhotoList = Collections.emptyList();
|
||||
List<SysStaff> userList = Collections.emptyList();
|
||||
//deviceSn.equals(com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE) ||
|
||||
if (deviceSn.equals(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE)) {
|
||||
//deviceSn.equals(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE)
|
||||
if (ParamUtils.getRestaurantDevSn().contains(deviceSn)) {
|
||||
//获取所有未删除的, 没有离职的员工信息
|
||||
userList = sysStaffMapper.selectList(new LambdaQueryWrapper<SysStaff>().eq(SysStaff::getDelFlag, Constants.DELETE_FLAG_0).ne(SysStaff::getStatus, Constants.JOB_STATIS_11).select(SysStaff::getUserId, SysStaff::getDeptId, SysStaff::getName));
|
||||
}
|
||||
@ -154,8 +162,8 @@ public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDet
|
||||
List<Long> userIds = eqOverStaffMapper.selectList(new LambdaQueryWrapper<EqOverStaff>().eq(EqOverStaff::getDelFlag, Constants.DELETE_FLAG_0).select(EqOverStaff::getUserId)).stream().map(EqOverStaff::getUserId).collect(Collectors.toList());
|
||||
userList = sysStaffMapper.selectList((new LambdaQueryWrapper<SysStaff>().in(SysStaff::getUserId, userIds).eq(SysStaff::getDelFlag, Constants.DELETE_FLAG_0).ne(SysStaff::getStatus, Constants.JOB_STATIS_11).select(SysStaff::getUserId, SysStaff::getDeptId, SysStaff::getName)));
|
||||
}
|
||||
//如果是下发的食堂打卡机, 则需要查找餐饮人员的数据
|
||||
if (deviceSn.equals(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE)) {
|
||||
//如果是下发的食堂打卡机, 则需要查找餐饮人员的数据 deviceSn.equals(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE)deviceSn.equals(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE)
|
||||
if (ParamUtils.getRestaurantDevSn().contains(deviceSn)) {
|
||||
List<RzRestaurantImages> list = rzRestaurantImagesMapper.selectList(new LambdaQueryWrapper<RzRestaurantImages>().eq(RzRestaurantImages::getDelFlag, Constants.DELETE_FLAG_0));
|
||||
for (RzRestaurantImages img : list) {
|
||||
userPhotoList.add(Collections.asMap("userId", String.valueOf(img.getId()), "name", img.getName(), "photoUrl", img.getImageUrl(), "deptName", "实习生"));
|
||||
@ -204,14 +212,14 @@ public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDet
|
||||
Map<String, List<Map<String, String>>> snUserPhotoList = Collections.emptyMap();
|
||||
if(Collections.isEmpty(userPhotoList)){
|
||||
//如果有且只有一个设备信息, 并且设备信息为公共打卡机, 或者是 食堂打卡机
|
||||
if(snList.size() ==1 && tsSn.contains(snList.get(0))){
|
||||
if(snList.size() ==1 && getTsSn().contains(snList.get(0))){
|
||||
snUserPhotoList.putAll(initTsDkDevice(snList.get(0)));
|
||||
}else{
|
||||
List<String> allSnList = new ArrayList<String>(){{addAll(snList);}};
|
||||
List<String> tsDeviceSn = Collections.findDuplicatesList(allSnList, tsSn);
|
||||
List<String> tsDeviceSn = Collections.findDuplicatesList(allSnList, getTsSn());
|
||||
//所有所有不是特殊打卡机人员信息
|
||||
snList.remove(tsDeviceSn);
|
||||
snList.stream().filter(sn-> !tsSn.contains(sn)).forEach(sn ->{
|
||||
snList.stream().filter(sn-> !getTsSn().contains(sn)).forEach(sn ->{
|
||||
//获取所有未删除的, 没有离职的员工信息
|
||||
List<SysStaff> userList = sysStaffMapper.selectList((new LambdaQueryWrapper<SysStaff>().like(SysStaff::getTimeClock, sn).eq(SysStaff::getDelFlag, Constants.DELETE_FLAG_0).ne(SysStaff::getStatus,Constants.JOB_STATIS_11).select(SysStaff::getUserId, SysStaff::getDeptId, SysStaff::getName)));
|
||||
snUserPhotoList.put(sn, getPhoto(userList));
|
||||
@ -304,8 +312,10 @@ public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDet
|
||||
update(new UpdateWrapper<EqSnDetail>().set("type","连接已断开").set("session_id","").eq( "session_id", sessionId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(ApplicationArguments args) throws Exception {
|
||||
tsSn.addAll(ParamUtils.getTsDevSn());
|
||||
}
|
||||
//
|
||||
// @Override
|
||||
// public void run(ApplicationArguments args) throws Exception {
|
||||
// tsSn.addAll(ParamUtils.getTsDevSn());
|
||||
// tsSn.addAll(ParamUtils.getRestaurantDevSn());
|
||||
// }
|
||||
}
|
||||
|
||||
@ -3,11 +3,7 @@ package com.evo.finance.controller;
|
||||
import java.util.List;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import com.evo.common.annotation.Log;
|
||||
import com.evo.common.core.controller.BaseController;
|
||||
import com.evo.common.core.domain.AjaxResult;
|
||||
@ -51,4 +47,15 @@ public class RzSalaryStatisticsController extends BaseController
|
||||
{
|
||||
return rzSalaryStatisticsService.deleteRzSalaryStatisticsById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 确认发放工资
|
||||
*/
|
||||
@PreAuthorize("@ss.hasPermi('finance:financeStatistics:confirm')")
|
||||
@Log(title = "工资统计", businessType = BusinessType.UPDATE)
|
||||
@PutMapping("/{id}")
|
||||
public AjaxResult confirm(@PathVariable Long id)
|
||||
{
|
||||
return rzSalaryStatisticsService.confirmRzSalaryStatisticsById(id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -198,6 +198,11 @@ public class RzSalaryDetail extends BaseEntity
|
||||
|
||||
@TableField(exist = false)
|
||||
private BigDecimal bjAmount;
|
||||
/***
|
||||
* 扣减费用,. 劳务税率计算
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
private BigDecimal kjAmount;
|
||||
//基本工资全薪
|
||||
@TableField(exist = false)
|
||||
private BigDecimal basicAmount;
|
||||
@ -659,6 +664,14 @@ public class RzSalaryDetail extends BaseEntity
|
||||
this.socialSecurityDeduction = socialSecurityDeduction;
|
||||
}
|
||||
|
||||
public BigDecimal getKjAmount() {
|
||||
return kjAmount;
|
||||
}
|
||||
|
||||
public void setKjAmount(BigDecimal kjAmount) {
|
||||
this.kjAmount = kjAmount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "RzSalaryDetail{" +
|
||||
|
||||
@ -5,6 +5,7 @@ import java.util.Date;
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||
import com.evo.common.annotation.Excel;
|
||||
@ -16,6 +17,7 @@ import com.evo.common.core.domain.BaseEntity;
|
||||
* @author evo
|
||||
* @date 2024-11-26
|
||||
*/
|
||||
@Data
|
||||
public class RzSalaryStatistics extends BaseEntity
|
||||
{
|
||||
private static final long serialVersionUID = 1L;
|
||||
@ -43,61 +45,12 @@ public class RzSalaryStatistics extends BaseEntity
|
||||
|
||||
/** 删除标识 */
|
||||
private String delFlag;
|
||||
/***
|
||||
* 发放信息
|
||||
*/
|
||||
private String salaryInfo;
|
||||
|
||||
public void setId(Long id)
|
||||
{
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Long getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
public void setMonth(Date month)
|
||||
{
|
||||
this.month = month;
|
||||
}
|
||||
|
||||
public Date getMonth()
|
||||
{
|
||||
return month;
|
||||
}
|
||||
public void setNumber(int number)
|
||||
{
|
||||
this.number = number;
|
||||
}
|
||||
|
||||
public int getNumber()
|
||||
{
|
||||
return number;
|
||||
}
|
||||
public void setStatus(String status)
|
||||
{
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public String getStatus()
|
||||
{
|
||||
return status;
|
||||
}
|
||||
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() {
|
||||
|
||||
@ -3,10 +3,11 @@ package com.evo.finance.domain.vo;
|
||||
import com.evo.common.annotation.Excel;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
@Data
|
||||
public class SalaryVo {
|
||||
public class SalaryVo implements Serializable {
|
||||
|
||||
@Excel(name = "序号")
|
||||
private Integer seqNo;
|
||||
|
||||
@ -62,6 +62,14 @@ public interface RzSalaryDetailMapper extends BaseMapper<RzSalaryDetail>
|
||||
* @return 工资详情集合
|
||||
*/
|
||||
public List<RzSalaryDetail> selectRzSalaryDetailByMonth(Date month);
|
||||
|
||||
/**
|
||||
* 根据月份删除工资详情列表
|
||||
*
|
||||
* @param month 工资详情
|
||||
* @return 工资详情集合
|
||||
*/
|
||||
public int deleteRzSalaryDetailByMonth(Date month);
|
||||
/**
|
||||
* 根据部门查询工资单
|
||||
* @return
|
||||
|
||||
@ -0,0 +1,19 @@
|
||||
package com.evo.finance.processor;
|
||||
|
||||
import com.evo.finance.domain.RzSalaryDetail;
|
||||
import com.evo.system.domain.SysStaffDetail;
|
||||
|
||||
/**
|
||||
* @desc: 接口
|
||||
* @ClassName:CalculationProcessor
|
||||
* @date: 2026年05月04日 14:36
|
||||
* @author: andy.shi
|
||||
* @contact: 17330188597
|
||||
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
||||
*/
|
||||
public interface CalculationProcessor {
|
||||
|
||||
boolean accept(String companyName);
|
||||
|
||||
RzSalaryDetail calculation(SysStaffDetail detail, RzSalaryDetail rzSalaryDetail);
|
||||
}
|
||||
@ -14,12 +14,15 @@ import com.evo.system.mapper.SysStaffDetailMapper;
|
||||
import com.evo.system.utils.SubsidyCalculationUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@ -39,6 +42,9 @@ public interface SalaryCalculationStrategyExchangeProcessor {
|
||||
SimpleDateFormat ymd = new SimpleDateFormat("yyyy-MM-dd");
|
||||
SimpleDateFormat ym = new SimpleDateFormat("yyyy-MM");
|
||||
SimpleDateFormat y = new SimpleDateFormat("yyyy");
|
||||
|
||||
|
||||
|
||||
boolean accept(SysStaffDetail detail);
|
||||
|
||||
/***
|
||||
@ -74,7 +80,7 @@ public interface SalaryCalculationStrategyExchangeProcessor {
|
||||
* 计算新薪资
|
||||
* @return
|
||||
*/
|
||||
void exchangeSalaryCalculation(SysStaff sysStaff, SysStaffDetail detail, RzSalaryDetail rzSalaryDetail, RzAttendanceStatistical attendanceStatistical, Map<Long, Boolean> overTimeMap);
|
||||
void exchangeSalaryCalculation(SysStaff sysStaff, SysStaffDetail detail, RzSalaryDetail rzSalaryDetail, RzAttendanceStatistical attendanceStatistical, Map<Long, Boolean> overTimeMap, List<Map<String,Object>> salaryInfoMapList);
|
||||
|
||||
void monthSalary(Date limitMonth, Date month, Date limitDate ,SysStaff sysStaff, SysStaffDetail sysStaffDetail, RzSalaryDetail rzSalaryDetail, RzAttendanceStatistical attendanceStatistical);
|
||||
|
||||
@ -219,7 +225,7 @@ public interface SalaryCalculationStrategyExchangeProcessor {
|
||||
* 开始计算薪资
|
||||
*/
|
||||
|
||||
default void calculation(SysStaff sysStaff, SysStaffDetail detail, RzSalaryDetail rzSalaryDetail){
|
||||
default void calculation(SysStaff sysStaff, SysStaffDetail detail, RzSalaryDetail rzSalaryDetail, List<Map<String,Object>> salaryInfoMapList){
|
||||
RzSalaryDetailMapper rzSalaryDetailMapper = SpringUtils.getBean(RzSalaryDetailMapper.class);
|
||||
SysStaffDetailMapper sysStaffDetailMapper = SpringUtils.getBean(SysStaffDetailMapper.class);
|
||||
|
||||
@ -259,109 +265,148 @@ public interface SalaryCalculationStrategyExchangeProcessor {
|
||||
}
|
||||
|
||||
//判断是否外包,外包公司员工不做税(月薪50000不上税)
|
||||
if(ParamUtils.getWebCompany().contains(sysStaff.getCompanyName().toUpperCase())){
|
||||
// 实发工资 = 税前工资
|
||||
rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getMealFee()));
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(DataUtils.DEFAULT_VALUE);
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(DataUtils.DEFAULT_VALUE);
|
||||
// 本年累计已缴税额
|
||||
rzSalaryDetail.setAggregatePersonalIncomeTax(DataUtils.DEFAULT_VALUE);
|
||||
rzSalaryDetail.setTaxPayable(DataUtils.DEFAULT_VALUE);
|
||||
}else {
|
||||
|
||||
// 判断应纳税所得额额度(额度不一样税率不一样)
|
||||
if (rzSalaryDetail.getTaxableIncome().doubleValue() > 0 && rzSalaryDetail.getTaxableIncome().doubleValue() <= 36000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.03"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0"));
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 36000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 144000L) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.10"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("2520"));
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 144000L && rzSalaryDetail.getTaxableIncome().doubleValue() <= 300000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.20"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("16920"));
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 300000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 420000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.25"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("31920"));
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 420000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 660000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.30"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("52920"));
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 660000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 960000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.35"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("85920"));
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 960000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.45"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("181920"));
|
||||
} else {
|
||||
// 应纳税所得额小于0(免征额+专项扣除>应发工资时)
|
||||
// 此阶税率为百分之0,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.00"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0"));
|
||||
Map<String, CalculationProcessor> calculationProcessorMap = SpringUtils.getApplicationContext().getBeansOfType(CalculationProcessor.class);
|
||||
for (CalculationProcessor processor : calculationProcessorMap.values()) {
|
||||
if (processor.accept(sysStaff.getCompanyName().toUpperCase())) {
|
||||
rzSalaryDetail = processor.calculation(detail, rzSalaryDetail);
|
||||
}
|
||||
|
||||
|
||||
// 判断税前工资是否大于5000,如果小于,则不在计算个税
|
||||
if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() > 5000.00){
|
||||
// 本月应缴税额(本月应纳税所得额*税率-速减数-本年累计已预缴个税)
|
||||
rzSalaryDetail.setTaxPayable(rzSalaryDetail.getTaxableIncome().multiply(rzSalaryDetail.getTaxRate()).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(rzSalaryDetail.getSlowDownTheDeduction()).subtract(detail.getAggregatePersonalIncomeTax()));
|
||||
if (rzSalaryDetail.getTaxPayable().doubleValue() <= 0) {
|
||||
rzSalaryDetail.setTaxPayable(new BigDecimal("0.00"));
|
||||
}
|
||||
} else {
|
||||
// 应纳税所得额
|
||||
rzSalaryDetail.setTaxableIncome(new BigDecimal("0.00"));
|
||||
rzSalaryDetail.setTaxPayable(new BigDecimal("0.00"));
|
||||
}
|
||||
// 实发工资(税前工资-本月应缴个人所得税)
|
||||
rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getTaxPayable()).subtract(rzSalaryDetail.getMealFee()));
|
||||
// 本年累计已缴税额
|
||||
rzSalaryDetail.setAggregatePersonalIncomeTax(detail.getAggregatePersonalIncomeTax().add(rzSalaryDetail.getTaxPayable()));
|
||||
}
|
||||
// if(ParamUtils.getWebCompany().contains(sysStaff.getCompanyName().toUpperCase())){
|
||||
// // 实发工资 = 税前工资
|
||||
// rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getMealFee()));
|
||||
// // 此阶税率为百分之3,速减数为0
|
||||
// rzSalaryDetail.setTaxRate(DataUtils.DEFAULT_VALUE);
|
||||
// // 速算扣除数(速算扣除数跟税率同步)
|
||||
// rzSalaryDetail.setSlowDownTheDeduction(DataUtils.DEFAULT_VALUE);
|
||||
// // 本年累计已缴税额
|
||||
// rzSalaryDetail.setAggregatePersonalIncomeTax(DataUtils.DEFAULT_VALUE);
|
||||
// rzSalaryDetail.setTaxPayable(DataUtils.DEFAULT_VALUE);
|
||||
// }else if (DataUtils.DEFAULT_VALUE.compareTo(ParamUtils.getWeBaoTaxCompany(sysStaff.getCompanyName().toUpperCase())) > 0){
|
||||
// //劳务
|
||||
// // 判断应纳税所得额额度(额度不一样税率不一样)
|
||||
// rzSalaryDetail.setTaxRate(ParamUtils.getWeBaoTaxCompany(sysStaff.getCompanyName().toUpperCase()));
|
||||
// // 速算扣除数(速算扣除数跟税率同步)
|
||||
// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0"));
|
||||
// rzSalaryDetail.setTaxPayable(rzSalaryDetail.getTaxableIncome().multiply(rzSalaryDetail.getTaxRate()).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(rzSalaryDetail.getSlowDownTheDeduction()).subtract(detail.getAggregatePersonalIncomeTax()));
|
||||
// if (rzSalaryDetail.getTaxPayable().doubleValue() <= 0) {
|
||||
// rzSalaryDetail.setTaxPayable(new BigDecimal("0.00"));
|
||||
// }
|
||||
// rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getTaxPayable()).subtract(rzSalaryDetail.getMealFee()));
|
||||
// // 本年累计已缴税额
|
||||
// rzSalaryDetail.setAggregatePersonalIncomeTax(detail.getAggregatePersonalIncomeTax().add(rzSalaryDetail.getTaxPayable()));
|
||||
// }else {
|
||||
// // 判断应纳税所得额额度(额度不一样税率不一样)
|
||||
// if (rzSalaryDetail.getTaxableIncome().doubleValue() > 0 && rzSalaryDetail.getTaxableIncome().doubleValue() <= 36000l) {
|
||||
// // 此阶税率为百分之3,速减数为0
|
||||
// rzSalaryDetail.setTaxRate(new BigDecimal("0.03"));
|
||||
// // 速算扣除数(速算扣除数跟税率同步)
|
||||
// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0"));
|
||||
// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 36000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 144000L) {
|
||||
// // 此阶税率为百分之3,速减数为0
|
||||
// rzSalaryDetail.setTaxRate(new BigDecimal("0.10"));
|
||||
// // 速算扣除数(速算扣除数跟税率同步)
|
||||
// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("2520"));
|
||||
// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 144000L && rzSalaryDetail.getTaxableIncome().doubleValue() <= 300000l) {
|
||||
// // 此阶税率为百分之3,速减数为0
|
||||
// rzSalaryDetail.setTaxRate(new BigDecimal("0.20"));
|
||||
// // 速算扣除数(速算扣除数跟税率同步)
|
||||
// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("16920"));
|
||||
// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 300000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 420000l) {
|
||||
// // 此阶税率为百分之3,速减数为0
|
||||
// rzSalaryDetail.setTaxRate(new BigDecimal("0.25"));
|
||||
// // 速算扣除数(速算扣除数跟税率同步)
|
||||
// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("31920"));
|
||||
// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 420000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 660000l) {
|
||||
// // 此阶税率为百分之3,速减数为0
|
||||
// rzSalaryDetail.setTaxRate(new BigDecimal("0.30"));
|
||||
// // 速算扣除数(速算扣除数跟税率同步)
|
||||
// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("52920"));
|
||||
// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 660000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 960000l) {
|
||||
// // 此阶税率为百分之3,速减数为0
|
||||
// rzSalaryDetail.setTaxRate(new BigDecimal("0.35"));
|
||||
// // 速算扣除数(速算扣除数跟税率同步)
|
||||
// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("85920"));
|
||||
// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 960000l) {
|
||||
// // 此阶税率为百分之3,速减数为0
|
||||
// rzSalaryDetail.setTaxRate(new BigDecimal("0.45"));
|
||||
// // 速算扣除数(速算扣除数跟税率同步)
|
||||
// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("181920"));
|
||||
// } else {
|
||||
// // 应纳税所得额小于0(免征额+专项扣除>应发工资时)
|
||||
// // 此阶税率为百分之0,速减数为0
|
||||
// rzSalaryDetail.setTaxRate(new BigDecimal("0.00"));
|
||||
// // 速算扣除数(速算扣除数跟税率同步)
|
||||
// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0"));
|
||||
// }
|
||||
//
|
||||
//
|
||||
// // 判断税前工资是否大于5000,如果小于,则不在计算个税
|
||||
// if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() > 5000.00){
|
||||
// // 本月应缴税额(本月应纳税所得额*税率-速减数-本年累计已预缴个税)
|
||||
// rzSalaryDetail.setTaxPayable(rzSalaryDetail.getTaxableIncome().multiply(rzSalaryDetail.getTaxRate()).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(rzSalaryDetail.getSlowDownTheDeduction()).subtract(detail.getAggregatePersonalIncomeTax()));
|
||||
// if (rzSalaryDetail.getTaxPayable().doubleValue() <= 0) {
|
||||
// rzSalaryDetail.setTaxPayable(new BigDecimal("0.00"));
|
||||
// }
|
||||
// } else {
|
||||
// // 应纳税所得额
|
||||
// rzSalaryDetail.setTaxableIncome(new BigDecimal("0.00"));
|
||||
// rzSalaryDetail.setTaxPayable(new BigDecimal("0.00"));
|
||||
// }
|
||||
// // 实发工资(税前工资-本月应缴个人所得税)
|
||||
// rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getTaxPayable()).subtract(rzSalaryDetail.getMealFee()));
|
||||
// // 本年累计已缴税额
|
||||
// rzSalaryDetail.setAggregatePersonalIncomeTax(detail.getAggregatePersonalIncomeTax().add(rzSalaryDetail.getTaxPayable()));
|
||||
// }
|
||||
rzSalaryDetail.setId(null);
|
||||
//更新下全年累计
|
||||
rzSalaryDetail.setSpecialDeduction(detail.getSpecialDeduction().add(kouChu));
|
||||
if(rzSalaryDetailMapper.insert(rzSalaryDetail)< 0){
|
||||
throw new RuntimeException("生成员工考勤详情失败");
|
||||
}
|
||||
//判断统计月缴费公司和上一次是否一个公司
|
||||
Map<String, Object> salaryInfoMap = Collections.asMap("detailId", detail.getId());
|
||||
if(StringUtils.isNull(old_rzSalary)
|
||||
|| !old_rzSalary.getWbFlag().equals(sysStaff.getCompanyName())
|
||||
//判断12月, 是个税系统, 每年12月更新, 开始累计次年1月数据
|
||||
|| curr_month == 12){
|
||||
// 把本年累计已缴个税保存到员工信息表中
|
||||
detail.setAggregatePersonalIncomeTax(rzSalaryDetail.getTaxPayable());
|
||||
salaryInfoMap.put("aggregatePersonalIncomeTax", rzSalaryDetail.getTaxPayable());
|
||||
// 把本年累计专项扣除保存到员工信息表中
|
||||
detail.setSpecialDeduction(kouChu);
|
||||
salaryInfoMap.put("specialDeduction", kouChu);
|
||||
// 把本年累计已发工资保存到员工信息表中
|
||||
detail.setTotalWages(rzSalaryDetail.getSalaryBeforeTax());
|
||||
|
||||
salaryInfoMap.put("totalWages", rzSalaryDetail.getSalaryBeforeTax());
|
||||
}else{
|
||||
// 把本年累计个税
|
||||
detail.setAggregatePersonalIncomeTax(rzSalaryDetail.getAggregatePersonalIncomeTax());
|
||||
// 把本年累计已缴个税保存到员工信息表中
|
||||
salaryInfoMap.put("aggregatePersonalIncomeTax", rzSalaryDetail.getAggregatePersonalIncomeTax());
|
||||
// 把本年累计专项扣除保存到员工信息表中
|
||||
detail.setSpecialDeduction(detail.getSpecialDeduction().add(kouChu));
|
||||
salaryInfoMap.put("specialDeduction", detail.getSpecialDeduction().add(kouChu));
|
||||
// 把本年累计已发工资保存到员工信息表中
|
||||
detail.setTotalWages(rzSalaryDetail.getTotalWages());
|
||||
}
|
||||
if(sysStaffDetailMapper.updateSysStaffDetail(detail)< 0){
|
||||
throw new RuntimeException("更新员工详情信息异常");
|
||||
salaryInfoMap.put("totalWages", rzSalaryDetail.getTotalWages());
|
||||
}
|
||||
salaryInfoMapList.add(salaryInfoMap);
|
||||
|
||||
//判断统计月缴费公司和上一次是否一个公司
|
||||
// if(StringUtils.isNull(old_rzSalary)
|
||||
// || !old_rzSalary.getWbFlag().equals(sysStaff.getCompanyName())
|
||||
// //判断12月, 是个税系统, 每年12月更新, 开始累计次年1月数据
|
||||
// || curr_month == 12){
|
||||
// // 把本年累计已缴个税保存到员工信息表中
|
||||
// detail.setAggregatePersonalIncomeTax(rzSalaryDetail.getTaxPayable());
|
||||
// // 把本年累计专项扣除保存到员工信息表中
|
||||
// detail.setSpecialDeduction(kouChu);
|
||||
// // 把本年累计已发工资保存到员工信息表中
|
||||
// detail.setTotalWages(rzSalaryDetail.getSalaryBeforeTax());
|
||||
//
|
||||
// }else{
|
||||
// // 把本年累计个税
|
||||
// detail.setAggregatePersonalIncomeTax(rzSalaryDetail.getAggregatePersonalIncomeTax());
|
||||
// // 把本年累计专项扣除保存到员工信息表中
|
||||
// detail.setSpecialDeduction(detail.getSpecialDeduction().add(kouChu));
|
||||
// // 把本年累计已发工资保存到员工信息表中
|
||||
// detail.setTotalWages(rzSalaryDetail.getTotalWages());
|
||||
// }
|
||||
// if(sysStaffDetailMapper.updateSysStaffDetail(detail)< 0){
|
||||
// throw new RuntimeException("更新员工详情信息异常");
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -42,11 +42,11 @@ public class DailyWageStrategyExchangeProcessor implements SalaryCalculationStra
|
||||
@Override
|
||||
public boolean accept(SysStaffDetail detail) {
|
||||
//日薪不为空, 并且大于0
|
||||
return detail.getDailyWage() != null && detail.getDailyWage().compareTo(new BigDecimal(0)) > 0;
|
||||
return detail != null && detail.getDailyWage() != null && detail.getDailyWage().compareTo(new BigDecimal(0)) > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void exchangeSalaryCalculation(SysStaff sysStaff, SysStaffDetail sysStaffDetail, RzSalaryDetail rzSalaryDetail, RzAttendanceStatistical attendanceStatistical, Map<Long, Boolean> overTimeMap) {
|
||||
public void exchangeSalaryCalculation(SysStaff sysStaff, SysStaffDetail sysStaffDetail, RzSalaryDetail rzSalaryDetail, RzAttendanceStatistical attendanceStatistical, Map<Long, Boolean> overTimeMap, List<Map<String,Object>> salaryInfoMapList) {
|
||||
// //计算社保
|
||||
// socialSecurity(sysStaff,sysStaffDetail, attendanceStatistical);
|
||||
|
||||
@ -54,7 +54,7 @@ public class DailyWageStrategyExchangeProcessor implements SalaryCalculationStra
|
||||
buildRzSalaryDetail(false, sysStaff, sysStaffDetail,rzSalaryDetail, attendanceStatistical);
|
||||
|
||||
//计算薪资
|
||||
calculation(sysStaff, sysStaffDetail,rzSalaryDetail);
|
||||
calculation(sysStaff, sysStaffDetail,rzSalaryDetail, salaryInfoMapList);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,71 @@
|
||||
package com.evo.finance.processor.impl;
|
||||
|
||||
import com.evo.common.utils.DataUtils;
|
||||
import com.evo.common.utils.ParamUtils;
|
||||
import com.evo.finance.domain.RzSalaryDetail;
|
||||
import com.evo.finance.processor.CalculationProcessor;
|
||||
import com.evo.system.domain.SysStaffDetail;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @desc:
|
||||
* @ClassName:LWTaxCalculationProcessor
|
||||
* @date: 2026年05月04日 14:42
|
||||
* @author: andy.shi
|
||||
* @contact: 17330188597
|
||||
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
||||
*/
|
||||
@Service
|
||||
public class LWTaxCalculationProcessor implements CalculationProcessor {
|
||||
private String companyName;
|
||||
@Override
|
||||
public boolean accept(String companyName) {
|
||||
this.companyName = companyName;;
|
||||
return ParamUtils.getWeBaoTaxCompany().contains(companyName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RzSalaryDetail calculation(SysStaffDetail detail, RzSalaryDetail rzSalaryDetail) {
|
||||
//年度免征额 强制归0
|
||||
rzSalaryDetail.setAnnualExemptionAmount(DataUtils.DEFAULT_VALUE);
|
||||
|
||||
if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() <= 4000) {
|
||||
rzSalaryDetail.setTaxableIncome(rzSalaryDetail.getSalaryBeforeTax().subtract(BigDecimal.valueOf(800)));
|
||||
if (rzSalaryDetail.getTaxableIncome().doubleValue() <= 0) {
|
||||
rzSalaryDetail.setTaxableIncome(new BigDecimal("0.00"));
|
||||
}
|
||||
}else{
|
||||
rzSalaryDetail.setTaxableIncome(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getSalaryBeforeTax().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_HALF_UP)));
|
||||
}
|
||||
|
||||
if (rzSalaryDetail.getTaxableIncome().doubleValue() <= 20000L) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.20"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(DataUtils.DEFAULT_VALUE);
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 20000L && rzSalaryDetail.getTaxableIncome().doubleValue() <= 50000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.3"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("2000"));
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 50000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.40"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("7000"));
|
||||
}
|
||||
rzSalaryDetail.setTaxPayable(rzSalaryDetail.getTaxableIncome().multiply(rzSalaryDetail.getTaxRate()).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(rzSalaryDetail.getSlowDownTheDeduction()));
|
||||
if (rzSalaryDetail.getTaxPayable().doubleValue() < 0) {
|
||||
rzSalaryDetail.setTaxPayable(new BigDecimal("0.00"));
|
||||
}
|
||||
|
||||
// 实发工资(税前工资-本月应缴个人所得税)
|
||||
rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getTaxPayable()).subtract(rzSalaryDetail.getMealFee()));
|
||||
// 本年累计已缴税额
|
||||
rzSalaryDetail.setAggregatePersonalIncomeTax(rzSalaryDetail.getTaxPayable());
|
||||
|
||||
return rzSalaryDetail;
|
||||
}
|
||||
}
|
||||
@ -12,6 +12,8 @@ import com.evo.finance.processor.SalaryCalculationStrategyExchangeProcessor;
|
||||
import com.evo.personnelMatters.mapper.RzLeaveDetailMapper;
|
||||
import com.evo.system.domain.SysStaff;
|
||||
import com.evo.system.domain.SysStaffDetail;
|
||||
import com.evo.utils.DateUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@ -36,12 +38,14 @@ public class MonthlySalaryStrategyExchangeProcessor implements SalaryCalculation
|
||||
private RzAttendanceMapper rzAttendanceMapper;
|
||||
@Resource
|
||||
private RzLeaveDetailMapper rzLeaveDetailMapper;
|
||||
@Autowired
|
||||
private DateUtil dateUtil1;
|
||||
|
||||
|
||||
@Override
|
||||
public boolean accept(SysStaffDetail detail) {
|
||||
//基本工资不为空, 并且大于0 并且岗位工资不为空, 并且大于0
|
||||
return (detail.getBasicSalary() != null && detail.getBasicSalary().compareTo(new BigDecimal(0)) > 0) && (detail.getJobsSalary() != null && detail.getJobsSalary().compareTo(new BigDecimal(0)) > 0);
|
||||
return (detail != null && detail.getBasicSalary() != null && detail.getBasicSalary().compareTo(new BigDecimal(0)) > 0) && (detail.getJobsSalary() != null && detail.getJobsSalary().compareTo(new BigDecimal(0)) > 0);
|
||||
}
|
||||
|
||||
/***
|
||||
@ -52,13 +56,13 @@ public class MonthlySalaryStrategyExchangeProcessor implements SalaryCalculation
|
||||
* @param overTimeMap
|
||||
*/
|
||||
@Override
|
||||
public void exchangeSalaryCalculation(SysStaff sysStaff, SysStaffDetail sysStaffDetail, RzSalaryDetail rzSalaryDetail, RzAttendanceStatistical attendanceStatistical, Map<Long, Boolean> overTimeMap) {
|
||||
public void exchangeSalaryCalculation(SysStaff sysStaff, SysStaffDetail sysStaffDetail, RzSalaryDetail rzSalaryDetail, RzAttendanceStatistical attendanceStatistical, Map<Long, Boolean> overTimeMap, List<Map<String,Object>> salaryInfoMapList) {
|
||||
//计算社保
|
||||
//socialSecurity(sysStaff,sysStaffDetail, attendanceStatistical);
|
||||
//组件基础数据
|
||||
buildRzSalaryDetail(true, sysStaff, sysStaffDetail,rzSalaryDetail, attendanceStatistical);
|
||||
//计算薪资
|
||||
calculation(sysStaff, sysStaffDetail,rzSalaryDetail);
|
||||
calculation(sysStaff, sysStaffDetail,rzSalaryDetail, salaryInfoMapList);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -116,6 +120,28 @@ public class MonthlySalaryStrategyExchangeProcessor implements SalaryCalculation
|
||||
// rzSalaryDetail.setMonthSalary(rzSalaryDetail.getMonthSalary().add(gs));
|
||||
rzSalaryDetail.setBjAmount(gs);
|
||||
}
|
||||
if(sysStaff.getName().equals("史国臣")){
|
||||
System.out.println("11111");
|
||||
}
|
||||
|
||||
BigDecimal basic = new BigDecimal("0");
|
||||
Long basicHour = 0l;
|
||||
for (Long type: ParamUtils.getBasicVacation()) {
|
||||
Long hour = rzLeaveDetailMapper.selectLeaveHourByUserIdAndDateAndType(sysStaff.getUserId(), rzSalaryDetail.getMonth(), type);
|
||||
if(hour.compareTo(0l)> 0){
|
||||
basicHour = basicHour+ hour;
|
||||
}
|
||||
}
|
||||
if(basicHour.compareTo(0l)> 0){
|
||||
//存在工伤假, 需要计算
|
||||
basic = rzSalaryDetail.getBasicSalary().divide(new BigDecimal(ParamUtils.getMonthWorkDayNum(DateUtils.getYear(rzSalaryDetail.getMonth()), DateUtils.getMonth(rzSalaryDetail.getMonth()))),2, RoundingMode.HALF_UP).multiply(new BigDecimal(basicHour).divide(Constants.DAY_WORK_HOUR,2,RoundingMode.HALF_UP));
|
||||
// rzSalaryDetail.setMonthSalary(rzSalaryDetail.getMonthSalary().add(gs));
|
||||
// rzSalaryDetail.setBjAmount(DataUtils.findDefaultValue(rzSalaryDetail.getBjAmount(), DataUtils.DEFAULT_VALUE).add(basic));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
BigDecimal gsj = new BigDecimal(0);
|
||||
Long totalAllHour = 0l;
|
||||
for (Long type: ParamUtils.getFullPaidLeave()) {
|
||||
@ -157,7 +183,7 @@ public class MonthlySalaryStrategyExchangeProcessor implements SalaryCalculation
|
||||
//计算社保占比
|
||||
socialSecurity(sysStaff, detail, gsj, attendanceStatistical);
|
||||
|
||||
//请假时长
|
||||
rzSalaryDetail.setAbsenteeismSalary(hourlyWage.multiply(attendanceStatistical.getAbsenteeism().subtract(new BigDecimal(totalAllHour))));
|
||||
//缺勤扣款
|
||||
rzSalaryDetail.setAbsenteeismSalary(hourlyWage.multiply(attendanceStatistical.getAbsenteeism().subtract(new BigDecimal(totalAllHour))).subtract(basic));
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,39 @@
|
||||
package com.evo.finance.processor.impl;
|
||||
|
||||
import com.evo.common.utils.DataUtils;
|
||||
import com.evo.common.utils.ParamUtils;
|
||||
import com.evo.finance.domain.RzSalaryDetail;
|
||||
import com.evo.finance.processor.CalculationProcessor;
|
||||
import com.evo.system.domain.SysStaffDetail;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* @desc:
|
||||
* @ClassName:NotTaxCalculationProcessor
|
||||
* @date: 2026年05月04日 14:40
|
||||
* @author: andy.shi
|
||||
* @contact: 17330188597
|
||||
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
||||
*/
|
||||
@Service
|
||||
public class NotTaxCalculationProcessor implements CalculationProcessor {
|
||||
@Override
|
||||
public boolean accept(String companyName) {
|
||||
return ParamUtils.getWebCompany().contains(companyName.toUpperCase());
|
||||
}
|
||||
|
||||
@Override
|
||||
public RzSalaryDetail calculation(SysStaffDetail detail, RzSalaryDetail rzSalaryDetail) {
|
||||
// 实发工资 = 税前工资
|
||||
rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getMealFee()));
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(DataUtils.DEFAULT_VALUE);
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(DataUtils.DEFAULT_VALUE);
|
||||
// 本年累计已缴税额
|
||||
rzSalaryDetail.setAggregatePersonalIncomeTax(DataUtils.DEFAULT_VALUE);
|
||||
rzSalaryDetail.setTaxPayable(DataUtils.DEFAULT_VALUE);
|
||||
|
||||
return rzSalaryDetail;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,91 @@
|
||||
package com.evo.finance.processor.impl;
|
||||
|
||||
import com.evo.common.utils.DataUtils;
|
||||
import com.evo.common.utils.ParamUtils;
|
||||
import com.evo.finance.domain.RzSalaryDetail;
|
||||
import com.evo.finance.processor.CalculationProcessor;
|
||||
import com.evo.system.domain.SysStaffDetail;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @desc:
|
||||
* @ClassName:TaxCalculationProcessor
|
||||
* @date: 2026年05月04日 14:42
|
||||
* @author: andy.shi
|
||||
* @contact: 17330188597
|
||||
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
||||
*/
|
||||
@Service
|
||||
public class TaxCalculationProcessor implements CalculationProcessor {
|
||||
@Override
|
||||
public boolean accept(String companyName) {
|
||||
return !ParamUtils.getWeBaoTaxCompany().contains(companyName) && !ParamUtils.getWebCompany().contains(companyName.toUpperCase()) ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RzSalaryDetail calculation(SysStaffDetail detail, RzSalaryDetail rzSalaryDetail) {
|
||||
// 判断应纳税所得额额度(额度不一样税率不一样)
|
||||
if (rzSalaryDetail.getTaxableIncome().doubleValue() > 0 && rzSalaryDetail.getTaxableIncome().doubleValue() <= 36000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.03"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0"));
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 36000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 144000L) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.10"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("2520"));
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 144000L && rzSalaryDetail.getTaxableIncome().doubleValue() <= 300000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.20"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("16920"));
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 300000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 420000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.25"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("31920"));
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 420000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 660000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.30"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("52920"));
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 660000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 960000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.35"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("85920"));
|
||||
} else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 960000l) {
|
||||
// 此阶税率为百分之3,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.45"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("181920"));
|
||||
} else {
|
||||
// 应纳税所得额小于0(免征额+专项扣除>应发工资时)
|
||||
// 此阶税率为百分之0,速减数为0
|
||||
rzSalaryDetail.setTaxRate(new BigDecimal("0.00"));
|
||||
// 速算扣除数(速算扣除数跟税率同步)
|
||||
rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0"));
|
||||
}
|
||||
// 判断税前工资是否大于5000,如果小于,则不在计算个税
|
||||
if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() > 5000.00){
|
||||
// 本月应缴税额(本月应纳税所得额*税率-速减数-本年累计已预缴个税)
|
||||
rzSalaryDetail.setTaxPayable(rzSalaryDetail.getTaxableIncome().multiply(rzSalaryDetail.getTaxRate()).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(rzSalaryDetail.getSlowDownTheDeduction()).subtract(detail.getAggregatePersonalIncomeTax()));
|
||||
if (rzSalaryDetail.getTaxPayable().doubleValue() <= 0) {
|
||||
rzSalaryDetail.setTaxPayable(new BigDecimal("0.00"));
|
||||
}
|
||||
} else {
|
||||
// 应纳税所得额
|
||||
rzSalaryDetail.setTaxableIncome(new BigDecimal("0.00"));
|
||||
rzSalaryDetail.setTaxPayable(new BigDecimal("0.00"));
|
||||
}
|
||||
// 实发工资(税前工资-本月应缴个人所得税)
|
||||
rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getTaxPayable()).subtract(rzSalaryDetail.getMealFee()));
|
||||
// 本年累计已缴税额
|
||||
rzSalaryDetail.setAggregatePersonalIncomeTax(detail.getAggregatePersonalIncomeTax().add(rzSalaryDetail.getTaxPayable()));
|
||||
|
||||
return rzSalaryDetail;
|
||||
}
|
||||
}
|
||||
@ -35,4 +35,6 @@ public interface IRzSalaryStatisticsService extends IService<RzSalaryStatistics>
|
||||
* @return 结果
|
||||
*/
|
||||
public AjaxResult deleteRzSalaryStatisticsById(Long id);
|
||||
|
||||
public AjaxResult confirmRzSalaryStatisticsById(Long id);
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package com.evo.finance.service.impl;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.evo.attendance.domain.RzAttendanceStatistical;
|
||||
@ -139,10 +140,31 @@ public class RzSalaryDetailServiceImpl extends ServiceImpl<RzSalaryDetailMapper,
|
||||
e.printStackTrace();
|
||||
}
|
||||
Map<Long, Boolean> overTimeMap = deptMapper.selectList(new LambdaQueryWrapper<SysDept>().eq(SysDept::getDelFlag, Constants.DELETE_FLAG_0).select(SysDept::getIsOverTime, SysDept::getDeptId)).stream().collect(Collectors.toMap(SysDept::getDeptId,d->"0".equals(d.getIsOverTime())));
|
||||
|
||||
List<Map<String,Object>> salaryInfoMapList = Collections.emptyList();
|
||||
for (SysStaff sysStaff : st_list) {
|
||||
calculation(sysStaff, rzSalaryDetail.getMonth(), overTimeMap, 1);
|
||||
//<<<<<<< HEAD
|
||||
// RzSalaryDetail newRzSalaryDetail = new RzSalaryDetail();
|
||||
// newRzSalaryDetail.setMonth(rzSalaryDetail.getMonth());
|
||||
// newRzSalaryDetail.setStaffId(sysStaff.getUserId()); //员工ID
|
||||
// newRzSalaryDetail.setDeptId(sysStaff.getDeptId()); //部门
|
||||
// newRzSalaryDetail.setName(sysStaff.getName()); //姓名
|
||||
// newRzSalaryDetail.setWbFlag(sysStaff.getCompanyName()); //公司
|
||||
// newRzSalaryDetail.setDelFlag(Constants.DELETE_FLAG_0);
|
||||
// //查询考勤统计
|
||||
// RzAttendanceStatistical attendanceStatistical = rzAttendanceStatisticalMapper.getRzAttendanceStatisticalByDateAndName(sysStaff.getUserId(), rzSalaryDetail.getMonth());
|
||||
// //查询员工详情
|
||||
// SysStaffDetail sysStaffDetail = sysStaffDetailMapper.selectSysStaffDetailByStaffId(sysStaff.getUserId());
|
||||
// Map<String, SalaryCalculationStrategyExchangeProcessor> salaryCalculationExchangeProcessorMap = applicationContext.getBeansOfType(SalaryCalculationStrategyExchangeProcessor.class);
|
||||
// for (SalaryCalculationStrategyExchangeProcessor processor : salaryCalculationExchangeProcessorMap.values()) {
|
||||
// if (processor.accept(sysStaffDetail)) {
|
||||
// processor.exchangeSalaryCalculation(sysStaff, sysStaffDetail, newRzSalaryDetail, attendanceStatistical, overTimeMap, salaryInfoMapList);
|
||||
// }
|
||||
// }
|
||||
//=======
|
||||
calculation(sysStaff, rzSalaryDetail.getMonth(), overTimeMap, 1, salaryInfoMapList);
|
||||
}
|
||||
rzSalaryStatistics.setSalaryInfo(JSON.toJSONString(salaryInfoMapList));
|
||||
rzSalaryStatisticsMapper.updateById(rzSalaryStatistics);
|
||||
//关闭日志记录
|
||||
ParamUtils.updateLogOperation(false);
|
||||
return AjaxResult.success();
|
||||
@ -159,18 +181,15 @@ public class RzSalaryDetailServiceImpl extends ServiceImpl<RzSalaryDetailMapper,
|
||||
}else{
|
||||
date = sysStaff.getEmploymentDate();
|
||||
}
|
||||
List<Map<String,Object>> salaryInfoMapList = Collections.emptyList();
|
||||
//进行离职工资计算操作
|
||||
while (date.compareTo(sysStaff.getQuitDate()) < 1){
|
||||
calculation(sysStaff, date, overTimeMap ,2);
|
||||
calculation(sysStaff, date, overTimeMap ,2, salaryInfoMapList);
|
||||
date = DateUtils.addMonths(date, 1);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println(DateUtils.parseDate("2025-05-21").compareTo(DateUtils.parseDate("2025-05-21 12:21:21")));
|
||||
}
|
||||
|
||||
public void calculation(SysStaff sysStaff, Date date, Map<Long, Boolean> overTimeMap, Integer type){
|
||||
public void calculation(SysStaff sysStaff, Date date, Map<Long, Boolean> overTimeMap, Integer type,List<Map<String,Object>> salaryInfoMapList){
|
||||
RzSalaryDetail newRzSalaryDetail = new RzSalaryDetail();
|
||||
newRzSalaryDetail.setMonth(date);
|
||||
newRzSalaryDetail.setStaffId(sysStaff.getUserId()); //员工ID
|
||||
@ -187,7 +206,7 @@ public class RzSalaryDetailServiceImpl extends ServiceImpl<RzSalaryDetailMapper,
|
||||
Map<String, SalaryCalculationStrategyExchangeProcessor> salaryCalculationExchangeProcessorMap = applicationContext.getBeansOfType(SalaryCalculationStrategyExchangeProcessor.class);
|
||||
for (SalaryCalculationStrategyExchangeProcessor processor : salaryCalculationExchangeProcessorMap.values()) {
|
||||
if (processor.accept(sysStaffDetail)) {
|
||||
processor.exchangeSalaryCalculation(sysStaff, sysStaffDetail, newRzSalaryDetail, attendanceStatistical, overTimeMap);
|
||||
processor.exchangeSalaryCalculation(sysStaff, sysStaffDetail, newRzSalaryDetail, attendanceStatistical, overTimeMap, salaryInfoMapList);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -306,7 +325,7 @@ public class RzSalaryDetailServiceImpl extends ServiceImpl<RzSalaryDetailMapper,
|
||||
deptLists.add(depts);
|
||||
}
|
||||
SalaryVo result = sumSalaryVo(allList);
|
||||
result.setDeptName(sheetCompanyName+"总计");
|
||||
result.setDeptName(sheetCompanyName+"合计");
|
||||
result.setPeopleNum(dataList.size());
|
||||
allList.add(result);
|
||||
|
||||
@ -317,10 +336,16 @@ public class RzSalaryDetailServiceImpl extends ServiceImpl<RzSalaryDetailMapper,
|
||||
hjResult.setPeopleNum(dataList.size());
|
||||
List<SalaryVo> sortList = dataList.stream().sorted((x,y) -> {return x.getDeptName().compareTo(y.getDeptName()); }).collect(Collectors.toList());
|
||||
sortList.add(hjResult);
|
||||
companyLists.add(sortList);
|
||||
List<SalaryVo> ewSalaryVoList = Collections.emptyList();
|
||||
for (SalaryVo salaryVo : sortList){
|
||||
SalaryVo allResult = new SalaryVo();
|
||||
BeanUtils.copyProperties(salaryVo,allResult);
|
||||
ewSalaryVoList.add(allResult);
|
||||
}
|
||||
companyLists.add(ewSalaryVoList);
|
||||
}else{
|
||||
SalaryVo result = sumSalaryVo(dataList);
|
||||
result.setDeptName(sheetCompanyName+"总计");
|
||||
result.setDeptName(sheetCompanyName+"合计");
|
||||
result.setPeopleNum(dataList.size());
|
||||
allList.add(result);
|
||||
|
||||
@ -345,13 +370,18 @@ public class RzSalaryDetailServiceImpl extends ServiceImpl<RzSalaryDetailMapper,
|
||||
// allSheetNames.remove("河北伊特");
|
||||
companyLists.addAll(deptLists);
|
||||
|
||||
companyLists.stream().forEach(dataList
|
||||
->{
|
||||
for (List<SalaryVo> dataList : companyLists){
|
||||
int x = 1;
|
||||
for (SalaryVo salaryVo : dataList){
|
||||
salaryVo.setSeqNo(x++);
|
||||
}
|
||||
});
|
||||
}
|
||||
// companyLists.stream().forEach(dataList ->{
|
||||
// int x = 1;
|
||||
// for (SalaryVo salaryVo : dataList){
|
||||
// salaryVo.setSeqNo(x++);
|
||||
// }
|
||||
// });
|
||||
|
||||
return util.exportExcel(allList,companyLists,"总表", allSheetNames, new SimpleDateFormat("yyyy-MM").format(rzSalaryDetail.getMonth())+"月工资", "制表: "+"审核: "+"经理签字: "+"总经理签字:");
|
||||
|
||||
@ -360,24 +390,28 @@ public class RzSalaryDetailServiceImpl extends ServiceImpl<RzSalaryDetailMapper,
|
||||
private List<SalaryVo> buildExportData(RzSalaryDetail rzSalaryDetail) {
|
||||
// 获取所有部门列表
|
||||
List<SysDept> deptList = deptMapper.selectList(new LambdaQueryWrapper<SysDept>());
|
||||
Map<Long, String> deptNameMap = Collections.emptyMap(); //deptList.stream().collect(Collectors.toMap(SysDept::getDeptId, SysDept::getDeptName));
|
||||
for (SysDept dept : deptList) {
|
||||
deptNameMap.put(dept.getDeptId(), buildDept(dept.getDeptId(), deptList, deptNameMap));
|
||||
}
|
||||
//部门列表转换为部门ID到部门名称的映射
|
||||
Map<Long, String> deptNameMap = deptList.stream().collect(Collectors.toMap(SysDept::getDeptId, SysDept::getDeptName));
|
||||
// Map<Long, String> deptNameMap = deptList.stream().collect(Collectors.toMap(SysDept::getDeptId, SysDept::getDeptName));
|
||||
//键为部门ID,值为部门名称,用于快速查找父部门为根部门(ID为0)的部门名称
|
||||
Map<String, String> nameAndDeptIdMap = deptList.stream().filter(d -> d.getParentId().equals(0l)).collect(Collectors.toMap(d->String.valueOf(d.getDeptId()), SysDept::getDeptName));
|
||||
Map<String, String> topDeptNameAndDeptIdMap = deptList.stream().filter(d -> d.getParentId().equals(0l)).collect(Collectors.toMap(d->String.valueOf(d.getDeptId()), SysDept::getDeptName));
|
||||
Map<Long, String> companyNameMap = Collections.emptyMap();
|
||||
// 过滤出所有非根部门(即parentId不等于0的部门),并为每个部门执行以下操作
|
||||
deptList.stream().filter(d -> !d.getParentId().equals(0l)).forEach(d ->{
|
||||
// 将当前部门的祖ID字符串拆分成List以便后续处理
|
||||
List<String> parentIdList = Collections.asList(d.getAncestors().split(","));
|
||||
Iterator<String> it = nameAndDeptIdMap.keySet().iterator();
|
||||
Iterator<String> it = topDeptNameAndDeptIdMap.keySet().iterator();
|
||||
while (it.hasNext()){
|
||||
String pid = it.next();
|
||||
if(parentIdList.contains(pid)){
|
||||
companyNameMap.put(d.getDeptId(), nameAndDeptIdMap.get(pid));
|
||||
companyNameMap.put(d.getDeptId(), topDeptNameAndDeptIdMap.get(pid));
|
||||
}
|
||||
}
|
||||
});
|
||||
nameAndDeptIdMap.entrySet().stream().forEach(d->{
|
||||
topDeptNameAndDeptIdMap.entrySet().stream().forEach(d->{
|
||||
companyNameMap.put(Long.valueOf(d.getKey()), d.getValue());
|
||||
});
|
||||
|
||||
@ -402,6 +436,21 @@ public class RzSalaryDetailServiceImpl extends ServiceImpl<RzSalaryDetailMapper,
|
||||
return voResult;
|
||||
}
|
||||
|
||||
public String buildDept(Long deptId, List<SysDept> deptList, Map<Long,String> showDeptNameMap){
|
||||
if(showDeptNameMap.containsKey(deptList)){
|
||||
return showDeptNameMap.get(deptId);
|
||||
}
|
||||
SysDept sysDept = deptList.stream().filter(d -> d.getDeptId().equals(deptId)).findFirst().orElse(null);
|
||||
if(sysDept != null){
|
||||
if("1".equals(sysDept.getIsShowFinancial())){
|
||||
return sysDept.getDeptName();
|
||||
}else{
|
||||
return buildDept(sysDept.getParentId(), deptList, showDeptNameMap);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<RzSalaryDetail> selectRzSalaryDetaiList(RzSalaryDetail rzSalaryDetail) {
|
||||
return getBaseMapper().selectRzSalaryDetailList(rzSalaryDetail);
|
||||
}
|
||||
|
||||
@ -4,12 +4,17 @@ import java.text.SimpleDateFormat;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.evo.common.constant.Constants;
|
||||
import com.evo.common.core.domain.AjaxResult;
|
||||
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.finance.domain.RzSalaryDetail;
|
||||
import com.evo.finance.mapper.RzSalaryDetailMapper;
|
||||
import com.evo.system.domain.SysStaffDetail;
|
||||
@ -64,38 +69,53 @@ public class RzSalaryStatisticsServiceImpl extends ServiceImpl<RzSalaryStatistic
|
||||
*/
|
||||
@Override
|
||||
@Transactional
|
||||
public AjaxResult deleteRzSalaryStatisticsById(Long id)
|
||||
{
|
||||
public AjaxResult deleteRzSalaryStatisticsById(Long id){
|
||||
RzSalaryStatistics rzSalaryStatistics = rzSalaryStatisticsMapper.selectRzSalaryStatisticsById(id);
|
||||
//根据月份查询员工的工资统计
|
||||
List<RzSalaryDetail> gz_list = rzSalaryDetailMapper.selectRzSalaryDetailByMonth(rzSalaryStatistics.getMonth());
|
||||
for (RzSalaryDetail rzSalaryDetail : gz_list) {
|
||||
//根据员工ID查询员工详情,修改员工详情
|
||||
SysStaffDetail sysStaffDetail = sysStaffDetailMapper.selectSysStaffDetailByStaffId(rzSalaryDetail.getStaffId());
|
||||
//修改个人详情
|
||||
sysStaffDetail.setAggregatePersonalIncomeTax(sysStaffDetail.getAggregatePersonalIncomeTax().subtract(rzSalaryDetail.getTaxPayable()));
|
||||
sysStaffDetail.setSpecialDeduction(sysStaffDetail.getSpecialDeduction().subtract(sysStaffDetail.getSpecialDeduction().subtract(rzSalaryDetail.getSpecialDeduction())));
|
||||
sysStaffDetail.setTotalWages(sysStaffDetail.getTotalWages().subtract(rzSalaryDetail.getSalaryBeforeTax()));
|
||||
int i = sysStaffDetailMapper.updateSysStaffDetail(sysStaffDetail);
|
||||
if(i < 1){
|
||||
return AjaxResult.error();
|
||||
}
|
||||
//删除个人员工工资详情
|
||||
rzSalaryDetail.setDelFlag(Constants.DELETE_FLAG_1);
|
||||
rzSalaryDetail.setUpdateBy(SecurityUtils.getUsername());
|
||||
rzSalaryDetail.setUpdateTime(DateUtils.getNowDate());
|
||||
i = rzSalaryDetailMapper.updateRzSalaryDetail(rzSalaryDetail);
|
||||
if(i < 1){
|
||||
return AjaxResult.error();
|
||||
}
|
||||
}
|
||||
rzSalaryStatistics.setDelFlag(Constants.DELETE_FLAG_1);
|
||||
rzSalaryStatistics.setUpdateTime(DateUtils.getNowDate());
|
||||
rzSalaryStatistics.setUpdateBy(SecurityUtils.getUsername());
|
||||
int p = rzSalaryStatisticsMapper.updateRzSalaryStatistics(rzSalaryStatistics);
|
||||
if(p< 1){
|
||||
return AjaxResult.error();
|
||||
}
|
||||
//根据月份直接物理删除
|
||||
rzSalaryDetailMapper.deleteRzSalaryDetailByMonth(rzSalaryStatistics.getMonth());
|
||||
rzSalaryStatisticsMapper.deleteById(rzSalaryStatistics);
|
||||
// if(rzSalaryDetailMapper.deleteRzSalaryDetailByMonth(rzSalaryStatistics.getMonth()) < 1 || rzSalaryStatisticsMapper.deleteById(rzSalaryStatistics)< 1){
|
||||
// return AjaxResult.error();
|
||||
// }
|
||||
return AjaxResult.success();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaxResult confirmRzSalaryStatisticsById(Long id) {
|
||||
RzSalaryStatistics rzSalaryStatistics = rzSalaryStatisticsMapper.selectById(id);
|
||||
if(rzSalaryStatistics == null){
|
||||
return AjaxResult.error("未找到统计信息");
|
||||
}
|
||||
if("已确认".equals(rzSalaryStatistics.getStatus())){
|
||||
return AjaxResult.error("当前信息已确认发放");
|
||||
}
|
||||
if(StringUtils.isEmpty(rzSalaryStatistics.getSalaryInfo())){
|
||||
return AjaxResult.error("未找到当前月份的薪资详情");
|
||||
}
|
||||
List<Long> detailIds = Collections.emptyList();
|
||||
JSONArray jsonArray = JSON.parseArray(rzSalaryStatistics.getSalaryInfo());
|
||||
for (int i = 0; i <jsonArray.size(); i++) {
|
||||
JSONObject jb = jsonArray.getJSONObject(i);
|
||||
if(jb != null){
|
||||
SysStaffDetail detail = sysStaffDetailMapper.selectSysStaffDetailById(jb.getLong("detailId"));
|
||||
if(detail != null){
|
||||
detail.setAggregatePersonalIncomeTax(jb.getBigDecimal("aggregatePersonalIncomeTax"));
|
||||
detail.setSpecialDeduction(jb.getBigDecimal("specialDeduction"));
|
||||
detail.setTotalWages(jb.getBigDecimal("totalWages"));
|
||||
sysStaffDetailMapper.updateById(detail);
|
||||
}else{
|
||||
detailIds.add(jb.getLong("detailId"));
|
||||
}
|
||||
}
|
||||
}
|
||||
if(Collections.isNotEmpty(detailIds)){
|
||||
return AjaxResult.error("部分员工详情未找到: 未找到的员工详情Id为: " + String.format(",", detailIds));
|
||||
}
|
||||
|
||||
rzSalaryStatistics.setStatus("已确认");
|
||||
rzSalaryStatisticsMapper.updateById(rzSalaryStatistics);
|
||||
return AjaxResult.success();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -335,6 +335,7 @@ public class RzLeaveDetailServiceImpl extends ServiceImpl<RzLeaveDetailMapper, R
|
||||
beginDate = DateUtils.addDays(beginDate,-1);
|
||||
//记录最终需要增加多少天
|
||||
Integer endDays = 0;
|
||||
Integer wordDays = holidayDates.size();
|
||||
//请假类型及不包含法休, 也不包含公休
|
||||
if(ParamUtils.getLeaveTypeNotIncludedFaXiuAndPublicHoliday().contains(flag)){
|
||||
//获取结果当中的假期时间
|
||||
@ -344,6 +345,7 @@ public class RzLeaveDetailServiceImpl extends ServiceImpl<RzLeaveDetailMapper, R
|
||||
rzLeaveDetail.setRemarks("不包含法定假日和周末");
|
||||
}
|
||||
endDays = new BigDecimal(endDays).add(new BigDecimal(holidays.size())).intValue();
|
||||
wordDays = endDays;
|
||||
}
|
||||
}else
|
||||
//请假类型不包含法休
|
||||
@ -355,10 +357,16 @@ public class RzLeaveDetailServiceImpl extends ServiceImpl<RzLeaveDetailMapper, R
|
||||
rzLeaveDetail.setRemarks("不包含法定假日");
|
||||
}
|
||||
}
|
||||
//因为包含公休, 所以需要剔除公休时长
|
||||
for (String year : yearList){
|
||||
List<String> holidays = Collections.findDuplicatesList(ParamUtils.getHoliddayList(Integer.valueOf(year), 2), holidayDates);
|
||||
//现有工作时长, 需要减去公休时长
|
||||
wordDays = new BigDecimal(wordDays).subtract(new BigDecimal(holidays.size())).intValue();
|
||||
}
|
||||
}
|
||||
//计算结束时间和请假时长 此处使用beginDate 而不使用rzLeaveDetail.getLeaveStartTime() 的原因是, 上面获取全部请假日期的时候, 已经处理过时间, 只需要增加公休,法休时间就可以了
|
||||
rzLeaveDetail.setLeaveEndTime(DateUtils.addDays(beginDate, endDays));
|
||||
rzLeaveDetail.setLeaveHour(new BigDecimal(sysDictData.getDictValue()).multiply(Constants.DAY_WORK_HOUR).intValue());
|
||||
rzLeaveDetail.setLeaveHour(new BigDecimal(wordDays).multiply(Constants.DAY_WORK_HOUR).intValue());
|
||||
}else{
|
||||
rzLeaveDetail = leaveHour(rzLeaveDetail);
|
||||
// //不需要计算, 过滤节假日啥的, 只过滤周末就好了
|
||||
|
||||
@ -90,7 +90,7 @@ public class RzRestaurantDetailController extends BaseController
|
||||
*/
|
||||
@RequestMapping("/verify_user_yt")
|
||||
public String verifyUser(@RequestBody String json){
|
||||
return "接口停止使用";//rzRestaurantDetailService.insertRzRestaurantDetail(json);
|
||||
return rzRestaurantDetailService.insertRzRestaurantDetail(json);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -54,6 +54,8 @@ public class RzRestaurantDetail extends BaseEntity
|
||||
/** 删除标记 */
|
||||
private String delFlag;
|
||||
|
||||
private String deviceSn;
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
||||
@ -83,7 +83,6 @@ public class RzRestaurantDetailServiceImpl extends ServiceImpl<RzRestaurantDetai
|
||||
@Override
|
||||
public String insertRzRestaurantDetail(String json)
|
||||
{
|
||||
System.out.println(json.toString());
|
||||
//需要返回的对象
|
||||
RestaurantVo cfiv = new RestaurantVo();
|
||||
RestaurantData cfd = new RestaurantData();
|
||||
@ -98,7 +97,6 @@ public class RzRestaurantDetailServiceImpl extends ServiceImpl<RzRestaurantDetai
|
||||
if(!ParamUtils.getCanteenOpenHour().contains(hour)){
|
||||
cfiv.setResult(2);
|
||||
cfiv.setMsg("不在打卡时间内");
|
||||
System.out.println(JSONObject.toJSONString(cfiv));
|
||||
return JSONObject.toJSONString(cfiv);
|
||||
}
|
||||
|
||||
@ -132,6 +130,7 @@ public class RzRestaurantDetailServiceImpl extends ServiceImpl<RzRestaurantDetai
|
||||
RzRestaurantStatistics restaurantStatistics = rzRestaurantStatisticsMapper.selectRzRestaurantStatisticsByUserIdAndDate(Long.valueOf(userId),new Date());
|
||||
//增加打卡记录
|
||||
RzRestaurantDetail cyFaceInfo = new RzRestaurantDetail();
|
||||
cyFaceInfo.setDeviceSn(jsonObject.getString("sn"));
|
||||
cyFaceInfo.setDate(new Date());
|
||||
cyFaceInfo.setStaffId(restaurantStatistics.getStaffId());
|
||||
cyFaceInfo.setName(restaurantStatistics.getName());
|
||||
|
||||
@ -5,10 +5,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.evo.common.constant.Constants;
|
||||
import com.evo.common.core.domain.AjaxResult;
|
||||
import com.evo.common.core.domain.entity.RzUpload;
|
||||
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.*;
|
||||
import com.evo.common.utils.file.FileUploadUtils;
|
||||
import com.evo.equipment.domain.vo.StaffData;
|
||||
import com.evo.equipment.domain.vo.StaffDto;
|
||||
@ -22,6 +19,7 @@ import com.evo.restaurant.service.IRzRestaurantImagesService;
|
||||
import com.evo.restaurant.service.IRzRestaurantStatisticsService;
|
||||
import com.evo.system.service.RzUploadService;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import javax.annotation.Resource;
|
||||
@ -45,6 +43,9 @@ public class RzRestaurantImagesServiceImpl extends ServiceImpl<RzRestaurantImage
|
||||
private IEqSnDetailService eqSnDetailService;//餐饮统计
|
||||
@Resource
|
||||
private RzUploadService rzUploadService;//文件上传
|
||||
@Autowired
|
||||
private ParamUtils paramUtils;
|
||||
|
||||
/**
|
||||
* 查询餐饮照片管理列表
|
||||
*
|
||||
@ -68,8 +69,7 @@ public class RzRestaurantImagesServiceImpl extends ServiceImpl<RzRestaurantImage
|
||||
{
|
||||
//根据id查询信息
|
||||
RzRestaurantImages rzRestaurantImages = getBaseMapper().selectRzRestaurantImagesById(id);
|
||||
//删除打卡机照片
|
||||
String message = "";
|
||||
|
||||
//需要返回的对象
|
||||
StaffDto cau = new StaffDto();
|
||||
//发送的数据
|
||||
@ -78,8 +78,6 @@ public class RzRestaurantImagesServiceImpl extends ServiceImpl<RzRestaurantImage
|
||||
cau.setCmd("to_device");
|
||||
//无用值,空串
|
||||
cau.setForm("");
|
||||
//设备号
|
||||
cau.setTo(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE);
|
||||
//给服务端预留的补充字段,设备端不处理这个字段内容。设备在响应这条指令时原样返回
|
||||
cau.setExtra("");
|
||||
//发送的数据
|
||||
@ -88,7 +86,12 @@ public class RzRestaurantImagesServiceImpl extends ServiceImpl<RzRestaurantImage
|
||||
caud.setUser_id(id+"");
|
||||
cau.setData(caud);
|
||||
//调用websocket,推送给设备
|
||||
ParamUtils.getRestaurantDevSn().stream().forEach(deviceNo ->{
|
||||
//设备号 com.evo.equipment.constant.Constants.EQ_DEVICE_CODE
|
||||
cau.setTo(deviceNo);
|
||||
WebSocketUsers.sendMessageToUsersByText(JSONObject.toJSONString(cau));
|
||||
});
|
||||
|
||||
//删除照片
|
||||
String img_name = rzRestaurantImages.getImageUrl().substring(rzRestaurantImages.getImageUrl().lastIndexOf("/")+1);
|
||||
File file = new File(com.evo.equipment.constant.Constants.STAFF_IMAGE_ADDRESS + img_name);
|
||||
@ -134,7 +137,7 @@ public class RzRestaurantImagesServiceImpl extends ServiceImpl<RzRestaurantImage
|
||||
log.error("处理上传照片信息出现错误", e);
|
||||
}
|
||||
//下发照片
|
||||
eqSnDetailService.sendPhoto(Collections.asList(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE),
|
||||
eqSnDetailService.sendPhoto(Collections.asList(ParamUtils.getRestaurantDevSn()),
|
||||
Collections.asList(Collections.asMap("userId", String.valueOf(rzRestaurantImages.getId()),
|
||||
"name", rzRestaurantImages.getName(), "photoUrl", rzRestaurantImages.getImageUrl())));
|
||||
}
|
||||
|
||||
@ -166,12 +166,12 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
|
||||
if(CollectionUtils.isNotEmpty(sysStaff.getTimeClockList())){
|
||||
sysStaff.setTimeClock(sysStaff.getTimeClockList().stream().collect(Collectors.joining(",")));
|
||||
}
|
||||
//新增员工信息到金蝶
|
||||
if(StringUtils.isNotEmpty(sysStaff.getJobCode())){
|
||||
sysStaff.setExtended(KingdeeRequestUtils.employeeSave(Collections.asMap("userName", sysStaff.getName(), "userCode", sysStaff.getCode(), "jobCode", sysStaff.getJobCode().split("_")[0],"deptCode", sysStaff.getJobCode().split("_")[1])));
|
||||
}else if(StringUtils.isEmpty(sysStaff.getJobCode())){
|
||||
sysStaff.setExtended(KingdeeRequestUtils.employeeSaveEmptyJob(Collections.asMap("userName", sysStaff.getName(), "userCode", sysStaff.getCode())));
|
||||
}
|
||||
// //新增员工信息到金蝶
|
||||
// if(StringUtils.isNotEmpty(sysStaff.getJobCode())){
|
||||
// sysStaff.setExtended(KingdeeRequestUtils.employeeSave(Collections.asMap("userName", sysStaff.getName(), "userCode", sysStaff.getCode(), "jobCode", sysStaff.getJobCode().split("_")[0],"deptCode", sysStaff.getJobCode().split("_")[1])));
|
||||
// }else if(StringUtils.isEmpty(sysStaff.getJobCode())){
|
||||
// sysStaff.setExtended(KingdeeRequestUtils.employeeSaveEmptyJob(Collections.asMap("userName", sysStaff.getName(), "userCode", sysStaff.getCode())));
|
||||
// }
|
||||
|
||||
int i = getBaseMapper().insertSysStaff(sysStaff);
|
||||
if(i < 1){
|
||||
@ -281,13 +281,19 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
|
||||
//不为空, 准备下发
|
||||
if(upload != null){
|
||||
List<String> dkj_list = new ArrayList<String>();
|
||||
dkj_list.add(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE); //食堂
|
||||
dkj_list.addAll(ParamUtils.getRestaurantDevSn()); //食堂
|
||||
// dkj_list.add(com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE); //公共
|
||||
if(Collections.isNotEmpty(sysStaff.getTimeClockList())){
|
||||
dkj_list.addAll(sysStaff.getTimeClockList());
|
||||
}
|
||||
// dkj_list.add(sysStaff.getTimeClockList().get(1));
|
||||
//下发照片
|
||||
SysDept sysDept = deptMapper.selectDeptById(sysStaff.getDeptId());
|
||||
try {
|
||||
eqSnDetailService.sendPhoto(dkj_list, Collections.asList(Collections.asMap("userId", String.valueOf(sysStaff.getUserId()), "name", sysStaff.getName(), "photoUrl", ParamUtils.getGlobalStaticUrl()+upload.getFileName(), "deptName", sysDept.getDeptName())));
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("员工新增成功, 但是照片下发失败了,请截图联系管理员: 直白原因: "+ e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -915,13 +921,13 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
|
||||
@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("销售部门未找到,请确认部门是否存在且未被删除!");
|
||||
}
|
||||
// SysDept sysDept = deptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
|
||||
// .eq(SysDept::getDelFlag, Constants.DELETE_FLAG_0)
|
||||
// .eq(SysDept::getDeptName, "销售部"));
|
||||
//
|
||||
// if (sysDept == null) {
|
||||
// return AjaxResult.error("销售部门未找到,请确认部门是否存在且未被删除!");
|
||||
// }
|
||||
|
||||
|
||||
sysStaffDetailMapper.resetSalesCommission();
|
||||
@ -932,7 +938,7 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
|
||||
// 直接根据姓名和部门ID查询员工信息
|
||||
SysStaff sysStaff = getBaseMapper().selectOne(new LambdaQueryWrapper<SysStaff>()
|
||||
.eq(SysStaff::getName, rzSalaryVo.getName())
|
||||
.eq(SysStaff::getDeptId, sysDept.getDeptId())
|
||||
.eq(SysStaff::getIdCard, rzSalaryVo.getIdCard())
|
||||
.eq(SysStaff::getDelFlag, Constants.DELETE_FLAG_0));
|
||||
|
||||
if (sysStaff != null) {
|
||||
|
||||
@ -32,9 +32,9 @@ spring:
|
||||
druid:
|
||||
# 主库数据源
|
||||
master:
|
||||
url: jdbc:mysql://192.168.5.23:3306/dev_evo_cw_new?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
||||
url: jdbc:mysql://192.168.5.232:3306/evo_cw_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
||||
username: root
|
||||
password: yite
|
||||
password: hbyt123456
|
||||
#username: root
|
||||
#password: yj.chen@001
|
||||
# 从库数据源
|
||||
|
||||
@ -32,7 +32,7 @@ spring:
|
||||
druid:
|
||||
# 主库数据源
|
||||
master:
|
||||
url: jdbc:mysql://localhost:3306/evo_cw_dev_ding?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
||||
url: jdbc:mysql://localhost:3306/evo_cw_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
||||
username: root
|
||||
password: hbyt123456
|
||||
#username: root
|
||||
|
||||
@ -50,7 +50,7 @@ spring:
|
||||
# 国际化资源文件路径
|
||||
basename: i18n/messages
|
||||
profiles:
|
||||
active: ${profiles.active:druid}
|
||||
active: ${profiles.active:dev}
|
||||
# 文件上传
|
||||
servlet:
|
||||
multipart:
|
||||
|
||||
@ -77,6 +77,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="month != null "> and DATE_FORMAT( month, '%Y%m' ) = DATE_FORMAT( #{month} , '%Y%m' )</if>
|
||||
<if test="deptId != null "> and dept_id = #{deptId}</if>
|
||||
</where>
|
||||
order by month desc
|
||||
</select>
|
||||
|
||||
<select id="selectRzSalaryDetailById" parameterType="Long" resultMap="RzSalaryDetailResult">
|
||||
@ -258,6 +259,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<include refid="selectRzSalaryDetailVo"/>
|
||||
where del_flag = '0' and DATE_FORMAT( month, '%Y%m' ) = DATE_FORMAT( #{month} , '%Y%m' )
|
||||
</select>
|
||||
|
||||
<delete id="deleteRzSalaryDetailByMonth">
|
||||
delete from rz_salary_detail where DATE_FORMAT( month, '%Y%m' ) = DATE_FORMAT( #{month} , '%Y%m' )
|
||||
</delete>
|
||||
|
||||
|
||||
<!-- 根据部门查询员工工资情况 -->
|
||||
<select id="selectSalaryDetailByDeptId" resultMap="RzSalaryDetailResult">
|
||||
<include refid="selectRzSalaryDetailVo"/>
|
||||
|
||||
@ -27,6 +27,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
del_flag = '0'
|
||||
<if test="month != null "> and month = #{month}</if>
|
||||
</where>
|
||||
order by month desc
|
||||
</select>
|
||||
|
||||
<select id="selectRzSalaryStatisticsById" parameterType="Long" resultMap="RzSalaryStatisticsResult">
|
||||
|
||||
@ -20,7 +20,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectRzRestaurantDetailVo">
|
||||
select id, staff_id,name, date, time, sign, del_flag, create_by, create_time, update_by, update_time from rz_restaurant_detail
|
||||
select id, staff_id,name, date, time, sign, del_flag, device_sn, create_by, create_time, update_by, update_time from rz_restaurant_detail
|
||||
</sql>
|
||||
|
||||
<select id="selectRzRestaurantDetailList" parameterType="RzRestaurantDetail" resultMap="RzRestaurantDetailResult">
|
||||
@ -57,6 +57,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="time != null">time,</if>
|
||||
<if test="sign != null">sign,</if>
|
||||
<if test="delFlag != null">del_flag,</if>
|
||||
<if test="deviceSn != null">device_sn,</if>
|
||||
<if test="createBy != null">create_by,</if>
|
||||
<if test="createTime != null">create_time,</if>
|
||||
<if test="updateBy != null">update_by,</if>
|
||||
@ -69,6 +70,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="time != null">#{time},</if>
|
||||
<if test="sign != null">#{sign},</if>
|
||||
<if test="delFlag != null">#{delFlag},</if>
|
||||
<if test="deviceSn != null">#{deviceSn},</if>
|
||||
<if test="createBy != null">#{createBy},</if>
|
||||
<if test="createTime != null">#{createTime},</if>
|
||||
<if test="updateBy != null">#{updateBy},</if>
|
||||
|
||||
@ -19,10 +19,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="updateBy" column="update_by" />
|
||||
<result property="updateTime" column="update_time" />
|
||||
<result property="isOverTime" column="is_over_time" />
|
||||
<result property="isShowFinancial" column="is_show_financial" />
|
||||
</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.is_over_time, d.create_by, d.create_time, d.ding_id
|
||||
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.is_show_financial, d.create_by, d.create_time, d.ding_id
|
||||
from sys_dept d
|
||||
</sql>
|
||||
|
||||
@ -41,9 +42,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="status != null and status != ''">
|
||||
AND status = #{status}
|
||||
</if>
|
||||
<if test="isOverTime != null and status != ''">
|
||||
<if test="isOverTime != null and isOverTime != ''">
|
||||
AND is_over_time = #{isOverTime}
|
||||
</if>
|
||||
<if test="isShowFinancial != null and isShowFinancial != ''">
|
||||
AND is_show_financial = #{isShowFinancial}
|
||||
</if>
|
||||
<!-- 数据范围过滤 -->
|
||||
${params.dataScope}
|
||||
order by d.parent_id
|
||||
@ -99,6 +103,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="phone != null and phone != ''">phone,</if>
|
||||
<if test="status != null">status,</if>
|
||||
<if test="isOverTime != null">is_over_time,</if>
|
||||
<if test="isShowFinancial != null">is_show_financial,</if>
|
||||
<if test="createBy != null and createBy != ''">create_by,</if>
|
||||
<if test="dingId != null ">ding_id,</if>
|
||||
|
||||
@ -112,6 +117,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="phone != null and phone != ''">#{phone},</if>
|
||||
<if test="status != null">#{status},</if>
|
||||
<if test="isOverTime != null">#{isOverTime},</if>
|
||||
<if test="isShowFinancial != null">#{isShowFinancial},</if>
|
||||
<if test="createBy != null and createBy != ''">#{createBy},</if>
|
||||
<if test="dingId != null ">#{dingId},</if>
|
||||
sysdate()
|
||||
@ -128,6 +134,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<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="isShowFinancial != null">is_show_financial = #{isShowFinancial},</if>
|
||||
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
|
||||
<if test="dingId != null ">ding_id = #{dingId},</if>
|
||||
update_time = sysdate()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user