Merge remote-tracking branch 'origin/master'

master
wanglei 7 months ago
commit a2d8c3d774

@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.toolkit.Db;
import com.ruoyi.common.utils.BeanCopyUtils;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
@ -188,5 +189,14 @@ public interface BaseMapperPlus<M, T, V> extends BaseMapper<T> {
voPage.setRecords(BeanCopyUtils.copyList(pageData.getRecords(), voClass));
return (P) voPage;
}
/**
*
*
* @return
*/
@Select("DELETE FROM pay_butie_emplyee WHERE date = #{thisMonth}")
void deleteSgrButieEmplyeeByDate(String month);
@Select("SELECT COUNT(*) FROM pay_butie_emplyee WHERE date = #{month}")
Integer getLatestDate(String month);
}

@ -1,9 +1,10 @@
package com.ruoyi.pay.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.pay.util.AttendanceExcelUtil;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
@ -17,13 +18,13 @@ import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.core.validate.QueryGroup;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.pay.domain.vo.PayAttendanceVo;
import com.ruoyi.pay.domain.bo.PayAttendanceBo;
import com.ruoyi.pay.service.IPayAttendanceService;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
*
@ -58,6 +59,39 @@ public class PayAttendanceController extends BaseController {
List<PayAttendanceVo> list = iPayAttendanceService.queryList(bo);
ExcelUtil.exportExcel(list, "考勤", PayAttendanceVo.class, response);
}
/**
*
*/
@SaCheckPermission("pay:attendance:import")
@Log(title = "考勤", businessType = BusinessType.IMPORT)
@PostMapping("/import")
public R<Void> importData(MultipartFile file, boolean updateSupport,String date,String kaoqinType,Long tenantId) throws Exception {
PayAttendanceBo attendance = new PayAttendanceBo();
attendance.setKaoqinjiNum(kaoqinType);
attendance.setKaoqinYearMonth(date);
List<PayAttendanceVo> occupaAttendance= iPayAttendanceService.queryList(attendance);
if(occupaAttendance!=null&&occupaAttendance.size()>0){
if(!updateSupport){ //判断是否为更新
return R.fail("已有当月考勤信息,如需更新请勾选更新考勤");
}else{ //选择是更新数据时根据年月和考勤机删除原来记录的当月数据
List<Long> ids = new ArrayList<>();
for(PayAttendanceVo attendance1:occupaAttendance){
ids.add(attendance1.getId()) ;
}
iPayAttendanceService.deleteWithValidByIds(ids,true);
}
}
List<PayAttendanceBo> attendanceList;
//判断考勤机(综合办与网机用一个模板,围栏一个模板)
if(!kaoqinType.equals("2")){
attendanceList = new AttendanceExcelUtil().importKaoQinExcel(StringUtils.EMPTY,file.getInputStream(),3,date,kaoqinType,tenantId);
}else{
attendanceList = new AttendanceExcelUtil().importKaoQinExcel2(StringUtils.EMPTY,file.getInputStream(),2,date,kaoqinType,tenantId);
}
String message = iPayAttendanceService.importAttendance(attendanceList, updateSupport, date);
return R.ok(message);
}
/**
*
@ -79,7 +113,15 @@ public class PayAttendanceController extends BaseController {
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody PayAttendanceBo bo) {
return toAjax(iPayAttendanceService.insertByBo(bo));
// 验证本人当日的考勤是否存在
PayAttendanceBo query = new PayAttendanceBo();
query.setEmpName(bo.getEmpName());
query.setKaoqinDate(bo.getKaoqinDate());
List<PayAttendanceVo> attendances=iPayAttendanceService.queryList(query);
if (attendances==null||attendances.size()==0){
return toAjax(iPayAttendanceService.insertByBo(bo));
}
return R.fail("已存在"+bo.getEmpName()+"的考勤");
}
/**

@ -1,9 +1,21 @@
package com.ruoyi.pay.controller;
import java.util.List;
import java.util.Arrays;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import com.ruoyi.pay.domain.PayButie;
import com.ruoyi.pay.domain.PayEmployeeInfo;
import com.ruoyi.pay.domain.bo.PayButieBo;
import com.ruoyi.pay.domain.bo.PayEmployeeInfoBo;
import com.ruoyi.pay.domain.vo.ButieSummaryVo;
import com.ruoyi.pay.domain.vo.PayButieVo;
import com.ruoyi.pay.domain.vo.PayEmployeeInfoVo;
import com.ruoyi.pay.service.IPayButieService;
import com.ruoyi.pay.service.IPayEmployeeInfoService;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
@ -38,6 +50,8 @@ import com.ruoyi.common.core.page.TableDataInfo;
public class PayButieEmplyeeController extends BaseController {
private final IPayButieEmplyeeService iPayButieEmplyeeService;
private final IPayEmployeeInfoService employeeInfoService;
private final IPayButieService butieService;
/**
*
@ -105,4 +119,70 @@ public class PayButieEmplyeeController extends BaseController {
@PathVariable Long[] ids) {
return toAjax(iPayButieEmplyeeService.deleteWithValidByIds(Arrays.asList(ids), true));
}
/**
*
*
* @return EmployeeInfoVo
*/
@SaCheckPermission("pay:butieEmplyee:gen")
@Log(title = "月度补贴生成", businessType = BusinessType.INSERT)
@PostMapping("/gen")
public R<Void> generateBuTieEmpByMonth(@RequestBody JSONObject object) {
return iPayButieEmplyeeService.generateBuTieEmpByMonth(object.get("month", String.class), object.get("cover", Boolean.class));
}
@PostMapping("/check")
public R<Void> checkDataExist(@RequestBody JSONObject object) {
return iPayButieEmplyeeService.checkDataExist(object.get("month", String.class));
}
/**
*
*
*/
@SaCheckPermission("pay:butieEmplyee:list")
@DeleteMapping("/summary")
public TableDataInfo<ButieSummaryVo> summary(PayButieEmplyeeBo bo, PageQuery pageQuery) {
String date;
if (null==(bo.getDate())) { // 默认查询本月的数据
date = DateUtil.format(new Date(), "yyyy-MM");
} else {
date = bo.getDate();
}
PayEmployeeInfoBo employeeInfo = new PayEmployeeInfoBo();
employeeInfo.setId(bo.getEmployeeId());
TableDataInfo<PayEmployeeInfoVo> payEmployeeTableDataInfo = employeeInfoService.queryPageList(employeeInfo, pageQuery);
List<ButieSummaryVo> butieSummaryVos = this.buildEmployeeInfo(payEmployeeTableDataInfo.getRows(), date);
return TableDataInfo.build(butieSummaryVos);
}
private List<ButieSummaryVo> buildEmployeeInfo(List<PayEmployeeInfoVo> list, String date) {
List<PayButieVo> sgrButies = butieService.queryList(new PayButieBo());
ArrayList<ButieSummaryVo> summaryVos = new ArrayList<>();
list.parallelStream().forEachOrdered(emp -> {
ButieSummaryVo butieSummaryVo = new ButieSummaryVo();
butieSummaryVo.setEmpName(emp.getName());
butieSummaryVo.setDate(date);
HashMap<String, Object> map = new HashMap<>();
for (PayButieVo butie : sgrButies) {
PayButieEmplyeeBo query = new PayButieEmplyeeBo();
query.setEmployeeId(emp.getId());
query.setButieId(butie.getId());
query.setDate(date);
List<PayButieEmplyeeVo> butieEmplyeeVos = iPayButieEmplyeeService.queryList(query);
BigDecimal money =butieEmplyeeVos.get(0).getMoney();
HashMap<String, Object> inMap = new HashMap<>();
inMap.put("btid", butie.getId());
inMap.put("money",money);
map.put(butie.getName(), inMap);
}
butieSummaryVo.setButieMap(map);
butieSummaryVo.setEdit(false);
butieSummaryVo.setEmpId(emp.getId());
summaryVos.add(butieSummaryVo);
});
return summaryVos;
}
}

@ -106,6 +106,17 @@ public class PayEmployeeInfoController extends BaseController {
return toAjax(iPayEmployeeInfoService.updateByBo(bo));
}
/**
*
*/
@SaCheckPermission("pay:empinfo:edithour")
@Log(title = "员工信息", businessType = BusinessType.UPDATE)
@PutMapping("/edithour")
public R<Void> edit(@RequestParam("oldHour") String oldHour, @RequestParam("newHour") String newHour)
{
return toAjax(iPayEmployeeInfoService.updateSgrEmployeeHour(oldHour,newHour));
}
/**
*
*

@ -1,9 +1,11 @@
package com.ruoyi.pay.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import com.ruoyi.pay.domain.PayRequireAttendanceReport;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
@ -24,6 +26,7 @@ import com.ruoyi.pay.domain.vo.PayRequireAttendanceReportVo;
import com.ruoyi.pay.domain.bo.PayRequireAttendanceReportBo;
import com.ruoyi.pay.service.IPayRequireAttendanceReportService;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
*
@ -59,6 +62,37 @@ public class PayRequireAttendanceReportController extends BaseController {
ExcelUtil.exportExcel(list, "应出勤报", PayRequireAttendanceReportVo.class, response);
}
/**
*
*/
@SaCheckPermission("pay:requireAttendanceReport:import")
@Log(title = "应出勤报", businessType = BusinessType.EXPORT)
@PostMapping("/import")
public R<Void> importData(MultipartFile file, boolean updateSupport, String date,Long tenantId) throws Exception {
PayRequireAttendanceReportBo report = new PayRequireAttendanceReportBo();
report.setYear(date.split("-")[0]);
report.setMonth(date.split("-")[1]);
List<PayRequireAttendanceReportVo> occupaReports= iPayRequireAttendanceReportService.queryList(report);
if(occupaReports!=null&&occupaReports.size()>0){//判断是否有当月应出勤信息
if(!updateSupport){
return R.ok("已有当月应出勤信息,如需更新请勾选更新选项");
}else{//更新则删除之前信息
List<Long> ids = new ArrayList<>();
for(PayRequireAttendanceReportVo re:occupaReports){
ids.add(re.getId()) ;
}
iPayRequireAttendanceReportService.deleteWithValidByIds(ids,true);
}
}
List<PayRequireAttendanceReportVo> requireAttendanceReports = ExcelUtil.importExcel(file.getInputStream(), PayRequireAttendanceReportVo.class);
String message = iPayRequireAttendanceReportService.importAttendanceReport(requireAttendanceReports, updateSupport, date,tenantId);
return R.ok(message);
}
/**
*
*

@ -52,22 +52,27 @@ public class PayAttendance extends BaseEntity {
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date amStartTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date amEndTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date pmStartTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date pmEndTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd")
private Date kaoqinDate;
/**
* (yyyy-MM)

@ -42,6 +42,10 @@ public class PayEmployeeInfo extends BaseEntity {
*
*/
private Long deptId;
/**
*
*/
private String deptName;
/**
*
*/

@ -62,30 +62,35 @@ public class PayAttendanceBo extends BaseEntity {
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@NotNull(message = "上午开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date amStartTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@NotNull(message = "上午结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date amEndTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@NotNull(message = "下午开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date pmStartTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@NotNull(message = "下午结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date pmEndTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd")
@NotNull(message = "考勤日期不能为空", groups = { AddGroup.class, EditGroup.class })
private Date kaoqinDate;

@ -39,7 +39,7 @@ public class PayEmployeeInfoBo extends BaseEntity {
/**
* id
*/
@NotNull(message = "登录用户id不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotNull(message = "登录用户id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long userId;
/**
@ -48,6 +48,12 @@ public class PayEmployeeInfoBo extends BaseEntity {
@NotNull(message = "员工所属部门不能为空", groups = { AddGroup.class, EditGroup.class })
private Long deptId;
/**
*
*/
@NotBlank(message = "部门名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String deptName;
/**
*
*/
@ -57,13 +63,13 @@ public class PayEmployeeInfoBo extends BaseEntity {
/**
* 0 1)
*/
@NotBlank(message = "性别0男 1女)不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "性别0男 1女)不能为空", groups = { AddGroup.class, EditGroup.class })
private String sex;
/**
*
*/
@NotNull(message = "年龄不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotNull(message = "年龄不能为空", groups = { AddGroup.class, EditGroup.class })
private Long age;
/**
@ -75,19 +81,19 @@ public class PayEmployeeInfoBo extends BaseEntity {
/**
*
*/
@NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class })
private String idcard;
/**
*
*/
@NotBlank(message = "银行卡号不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "银行卡号不能为空", groups = { AddGroup.class, EditGroup.class })
private String bankCardNumber;
/**
*
*/
@NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class })
private String openingBank;
/**
@ -99,19 +105,19 @@ public class PayEmployeeInfoBo extends BaseEntity {
/**
*
*/
@NotNull(message = "日薪不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotNull(message = "日薪不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal daySalary;
/**
*
*/
@NotNull(message = "时薪不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotNull(message = "时薪不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal hourSalary;
/**
* (0 : 1: 2 3 4 5)
*/
@NotBlank(message = "休息类型(0 :周休 1:非周休 2天休 3小时 4包月 5周二天)不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "休息类型(0 :周休 1:非周休 2天休 3小时 4包月 5周二天)不能为空", groups = { AddGroup.class, EditGroup.class })
private String restType;
/**
@ -135,61 +141,61 @@ public class PayEmployeeInfoBo extends BaseEntity {
/**
*
*/
@NotBlank(message = "学历不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "学历不能为空", groups = { AddGroup.class, EditGroup.class })
private String education;
/**
*
*/
@NotBlank(message = "家庭住址不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "家庭住址不能为空", groups = { AddGroup.class, EditGroup.class })
private String address;
/**
*
*/
@NotBlank(message = "紧急联系人不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "紧急联系人不能为空", groups = { AddGroup.class, EditGroup.class })
private String contact;
/**
*
*/
@NotBlank(message = "紧急联系人电话不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "紧急联系人电话不能为空", groups = { AddGroup.class, EditGroup.class })
private String contactPhone;
/**
* (1- 0-)
*/
@NotNull(message = "质检(1-是 0-否)不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotNull(message = "质检(1-是 0-否)不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer zhijian;
/**
* (1- 0-)
*/
@NotNull(message = "业务员(1-是 0-否)不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotNull(message = "业务员(1-是 0-否)不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer yewu;
/**
*
*/
@NotNull(message = "合同补助开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotNull(message = "合同补助开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date htstime;
/**
*
*/
@NotNull(message = "合同补助结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotNull(message = "合同补助结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date htetime;
/**
* 1: 0:
*/
@NotNull(message = "删除标志1:删除 0:未删除)不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotNull(message = "删除标志1:删除 0:未删除)不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer deleted;
/**
*
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;

@ -0,0 +1,70 @@
package com.ruoyi.pay.domain.vo;
import java.util.Map;
public class ButieSummaryVo {
/** 员工名称 */
private String empName;
/** 员工ID */
private Long empId;
/** 日期 */
private String date;
/** 补贴金额map */
private Map<String, Object> butieMap;
/** 是否可编辑 */
private boolean edit;
public Long getEmpId() {
return empId;
}
public void setEmpId(Long empId) {
this.empId = empId;
}
public boolean isEdit() {
return edit;
}
public void setEdit(boolean edit) {
this.edit = edit;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public Map<String, Object> getButieMap() {
return butieMap;
}
public void setButieMap(Map<String, Object> butieMap) {
this.butieMap = butieMap;
}
@Override
public String toString() {
return "ButieSummaryVo{" +
"empName='" + empName + '\'' +
", date='" + date + '\'' +
", butieMap=" + butieMap +
", edit=" + edit +
'}';
}
}

@ -62,30 +62,35 @@ public class PayAttendanceVo {
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "上午开始时间")
private Date amStartTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "上午结束时间")
private Date amEndTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "下午开始时间")
private Date pmStartTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "下午结束时间")
private Date pmEndTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd")
@ExcelProperty(value = "考勤日期")
private Date kaoqinDate;

@ -48,6 +48,12 @@ public class PayEmployeeInfoVo {
@ExcelProperty(value = "员工所属部门")
private Long deptId;
/**
*
*/
@ExcelProperty(value = "部门名称")
private String deptName;
/**
*
*/

@ -3,6 +3,7 @@ package com.ruoyi.pay.mapper;
import com.ruoyi.pay.domain.PayAttendance;
import com.ruoyi.pay.domain.vo.PayAttendanceVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Select;
/**
* Mapper
@ -11,5 +12,7 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
* @date 2025-05-12
*/
public interface PayAttendanceMapper extends BaseMapperPlus<PayAttendanceMapper, PayAttendance, PayAttendanceVo> {
@Select({" select e.id employeeId,d.dept_id deptId,d.dept_name deptName from pay_employee_info e join sys_dept d on e.dept_id=d.dept_id " +
" where e.name=#{name} and e.deleted=0"} )
PayAttendance selectEmpInfoByName(String empName);
}

@ -3,6 +3,7 @@ package com.ruoyi.pay.mapper;
import com.ruoyi.pay.domain.PayEmployeeInfo;
import com.ruoyi.pay.domain.vo.PayEmployeeInfoVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Update;
/**
* Mapper
@ -11,5 +12,6 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
* @date 2025-05-12
*/
public interface PayEmployeeInfoMapper extends BaseMapperPlus<PayEmployeeInfoMapper, PayEmployeeInfo, PayEmployeeInfoVo> {
@Update("update pay_employee_info e set e.hours_per_day = #{newHour} where e.hours_per_day = #{oldHour}")
int updateSgrEmployeeHour(String oldHour, String newHour);
}

@ -46,4 +46,8 @@ public interface IPayAttendanceService {
*
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
PayAttendance selectEmpInfoByName(String empName);
String importAttendance(List<PayAttendanceBo> attendanceList, boolean updateSupport, String date);
}

@ -1,5 +1,6 @@
package com.ruoyi.pay.service;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.pay.domain.PayButieEmplyee;
import com.ruoyi.pay.domain.vo.PayButieEmplyeeVo;
import com.ruoyi.pay.domain.bo.PayButieEmplyeeBo;
@ -46,4 +47,8 @@ public interface IPayButieEmplyeeService {
*
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
R<Void> generateBuTieEmpByMonth(String month, Boolean cover);
R<Void> checkDataExist(String month);
}

@ -46,4 +46,6 @@ public interface IPayEmployeeInfoService {
*
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
int updateSgrEmployeeHour(String oldHour, String newHour);
}

@ -46,4 +46,6 @@ public interface IPayRequireAttendanceReportService {
*
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
String importAttendanceReport(List<PayRequireAttendanceReportVo> requireAttendanceReports, boolean updateSupport, String date,Long tenantId);
}

@ -1,6 +1,7 @@
package com.ruoyi.pay.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
@ -15,6 +16,7 @@ import com.ruoyi.pay.domain.PayAttendance;
import com.ruoyi.pay.mapper.PayAttendanceMapper;
import com.ruoyi.pay.service.IPayAttendanceService;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;
import java.util.Collection;
@ -117,4 +119,90 @@ public class PayAttendanceServiceImpl implements IPayAttendanceService {
}
return baseMapper.deleteBatchIds(ids) > 0;
}
@Override
public PayAttendance selectEmpInfoByName(String empName) {
return baseMapper.selectEmpInfoByName(empName);
}
@Override
public String importAttendance(List<PayAttendanceBo> attendanceList, boolean updateSupport, String date) {
if (null==attendanceList || attendanceList.size() == 0)
{
throw new ServiceException("导入考勤数据不能为空!");
}
int successNum = 0;
int failureNum = 0;
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
for (PayAttendanceBo attendance : attendanceList)
{
try
{
// 验证本人当日的考勤是否存在注意在controller中更新数据时 以根据年月和考勤机删除原来记录数据)
PayAttendanceBo query = new PayAttendanceBo();
query.setKaoqinDate(attendance.getKaoqinDate());
query.setEmpName(attendance.getEmpName());
List<PayAttendanceVo> attendances=this.queryList(query);
if (null==attendances||attendances.size()==0)
{
this.insertByBo(attendance);
successNum++;
if(!updateSupport) {
successMsg.append("<br/>" + successNum +": "+attendance.getEmpName()+new SimpleDateFormat("yyyy-MM-dd").format(attendance.getKaoqinDate())+ "考勤导入成功");
}else{
successMsg.append("<br/>" + successNum +": "+attendance.getEmpName()+new SimpleDateFormat("yyyy-MM-dd").format(attendance.getKaoqinDate())+"考勤更新成功");
}
} else { //员工在多个考勤机录入考勤 时进入 (注意:要求员工上午或下午打卡必须在同一个考勤机)
if(updateSupport){
if(attendance.getAmStartTime()==null&&attendance.getAmEndTime()==null){
attendance.setAmStartTime(attendances.get(0).getAmStartTime());
attendance.setAmEndTime(attendances.get(0).getAmEndTime());
}
if(attendance.getPmStartTime()==null&&attendance.getPmEndTime()==null){
attendance.setPmStartTime(attendances.get(0).getPmStartTime());
attendance.setPmEndTime(attendances.get(0).getPmEndTime());
}
this.updateByBo(attendance);
successNum++;
successMsg.append("<br/>" + successNum +": "+attendance.getEmpName()+new SimpleDateFormat("yyyy-MM-dd").format(attendance.getKaoqinDate())+ "考勤更新成功");
}else{
String kaoqinji="";
switch (attendances.get(0).getKaoqinjiNum()){
case "0":
kaoqinji ="综合办";
break;
case "1":
kaoqinji ="网机";
break;
case "2":
kaoqinji ="围栏";
break;
case "3":
kaoqinji ="手动添加";
break;
}
failureNum++;
failureMsg.append("<br/>" + failureNum +": "+attendance.getEmpName()+new SimpleDateFormat("yyyy-MM-dd").format(attendance.getKaoqinDate())+" "+kaoqinji+"考勤机已存在");
}
}
} catch (Exception e) {
failureNum++;
String msg = "<br/>" + failureNum+ ": "+attendance.getEmpName() +" "+attendance.getEmpName()+new SimpleDateFormat("yyyy-MM-dd").format(attendance.getKaoqinDate()) + " 导入失败:";
failureMsg.append(msg + e.getMessage());
System.err.println(msg+e);
}
}
if (failureNum > 0)
{
failureMsg.insert(0, "导入成功"+successNum+"条,导入失败" + failureNum + " 条,错误如下:");
throw new ServiceException(failureMsg.toString());
}
else
{
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
}

@ -1,12 +1,21 @@
package com.ruoyi.pay.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.pay.domain.PayButie;
import com.ruoyi.pay.domain.PayEmployeeInfo;
import com.ruoyi.pay.domain.bo.PayButieBo;
import com.ruoyi.pay.domain.vo.PayButieVo;
import com.ruoyi.pay.domain.vo.PayEmployeeInfoVo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.ruoyi.pay.domain.bo.PayButieEmplyeeBo;
@ -15,9 +24,11 @@ import com.ruoyi.pay.domain.PayButieEmplyee;
import com.ruoyi.pay.mapper.PayButieEmplyeeMapper;
import com.ruoyi.pay.service.IPayButieEmplyeeService;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.Optional;
/**
* Service
@ -30,6 +41,8 @@ import java.util.Collection;
public class PayButieEmplyeeServiceImpl implements IPayButieEmplyeeService {
private final PayButieEmplyeeMapper baseMapper;
private final PayButieServiceImpl butieService;
private final PayEmployeeInfoServiceImpl employeeInfoService;
/**
*
@ -110,4 +123,81 @@ public class PayButieEmplyeeServiceImpl implements IPayButieEmplyeeService {
}
return baseMapper.deleteBatchIds(ids) > 0;
}
@Override
public R<Void> generateBuTieEmpByMonth(String month, Boolean cover) {
if (ObjectUtil.isNull(month)) {
throw new SecurityException("请完善月份信息");
}
String lastMonth = DateUtil.format(DateUtil.offset(DateUtil.parse(month, "yyyy-MM"), DateField.MONTH, -1).toJdkDate(), "yyyy-MM");
// 先删除本月数据
baseMapper.deleteSgrButieEmplyeeByDate(month);
List<PayButieVo> butieList = butieService.queryList(null); // 获取补贴列表
List<PayEmployeeInfoVo> employeeInfoList = employeeInfoService.queryList(null);// 获取员工列表
employeeInfoList.forEach(emp -> {
// 首先获取用户上个月份的补贴信息
PayButieEmplyeeBo butieEmplyee = new PayButieEmplyeeBo();
butieEmplyee.setDate(lastMonth);
butieEmplyee.setEmployeeId(emp.getId());
List<PayButieEmplyeeVo> butieEmplyeeList = this.queryList(butieEmplyee);
if (ObjectUtil.isNotNull(butieEmplyeeList) && butieEmplyeeList.size() > 0) { // 具有某员工的上个月数据
// 固定项继承, 非固定相为0
for (PayButieVo butie : butieList) {
Optional<PayButieEmplyeeVo> first = butieEmplyeeList.stream().filter(btemp -> btemp.getButieId().equals(butie.getId())).findFirst();
PayButieEmplyee payButieEmplyee = new PayButieEmplyee();
// PayEmployeeInfo employeeInfo = employeeInfoService.selectSgrEmployeeInfoById(payButieEmplyee.getEmployeeId());
if (first.isPresent()) { // 如果找到和补贴类型ID相同的项
payButieEmplyee = BeanUtil.toBean(first.get(),PayButieEmplyee.class);
payButieEmplyee.setId(null); // ID 设置为null
payButieEmplyee.setDate(month); // 本月的年月
payButieEmplyee.setCreateBy("system");
payButieEmplyee.setCreateTime(null);
payButieEmplyee.setUpdateBy(null);
payButieEmplyee.setUpdateTime(null);
payButieEmplyee.setRemark(null);
if ("0".equals(butie.getFixed())) { //非固定项金额不继承
payButieEmplyee.setMoney(BigDecimal.ZERO);
}
// 此处应该在上面是否非固定的判断中进行再判断
//// 判断是否是合同补助项如果合同补助项不在时间范围内继承的金额也设置为0
//if ("合同补助".equals(sgrButie.getName())) {
// Date date = new Date();
// if (ObjectUtil.isNull(employeeInfo.getHtstime()) || date.before(employeeInfo.getHtstime()) || date.after(employeeInfo.getHtstime())) {
// sgrButieEmplyee.setMoney(BigDecimal.ZERO);
// }
//}
} else { // 未找到相同项
payButieEmplyee.setButieId(butie.getId());
payButieEmplyee.setEmployeeId(emp.getId());
payButieEmplyee.setDate(month);
payButieEmplyee.setCreateBy("system");
payButieEmplyee.setMoney(BigDecimal.ZERO);
}
baseMapper.insert(payButieEmplyee);
}
} else { // 没有某员工的上个月数据
for (PayButieVo butie : butieList) { // 对应生成某员工所有补贴类型的数据项
PayButieEmplyee PaybutieEmplyee = new PayButieEmplyee();
PaybutieEmplyee.setButieId(butie.getId());
PaybutieEmplyee.setEmployeeId(emp.getId());
PaybutieEmplyee.setMoney(BigDecimal.ZERO);
PaybutieEmplyee.setDate(month);
PaybutieEmplyee.setCreateBy("system");
baseMapper.insert(PaybutieEmplyee);
}
}
});
return R.ok(month+"月份数据已生成");
}
@Override
public R<Void> checkDataExist(String month) {
Integer count = baseMapper.getLatestDate(month);
if (count > 0) {
return R.ok("数据已经存在,是否覆盖?");
} else {
return this.generateBuTieEmpByMonth(month, true);
}
}
}

@ -64,6 +64,7 @@ public class PayEmployeeInfoServiceImpl implements IPayEmployeeInfoService {
lqw.eq(bo.getTenantId() != null, PayEmployeeInfo::getTenantId, bo.getTenantId());
lqw.eq(bo.getUserId() != null, PayEmployeeInfo::getUserId, bo.getUserId());
lqw.eq(bo.getDeptId() != null, PayEmployeeInfo::getDeptId, bo.getDeptId());
lqw.like(StringUtils.isNotBlank(bo.getDeptName()), PayEmployeeInfo::getDeptName, bo.getDeptName());
lqw.like(StringUtils.isNotBlank(bo.getName()), PayEmployeeInfo::getName, bo.getName());
lqw.eq(StringUtils.isNotBlank(bo.getSex()), PayEmployeeInfo::getSex, bo.getSex());
lqw.eq(bo.getAge() != null, PayEmployeeInfo::getAge, bo.getAge());
@ -130,4 +131,9 @@ public class PayEmployeeInfoServiceImpl implements IPayEmployeeInfoService {
}
return baseMapper.deleteBatchIds(ids) > 0;
}
@Override
public int updateSgrEmployeeHour(String oldHour, String newHour) {
return baseMapper.updateSgrEmployeeHour(oldHour,newHour);
}
}

@ -1,12 +1,15 @@
package com.ruoyi.pay.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.pay.domain.PayAttendance;
import com.ruoyi.pay.mapper.PayAttendanceMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.ruoyi.pay.domain.bo.PayRequireAttendanceReportBo;
@ -15,6 +18,8 @@ import com.ruoyi.pay.domain.PayRequireAttendanceReport;
import com.ruoyi.pay.mapper.PayRequireAttendanceReportMapper;
import com.ruoyi.pay.service.IPayRequireAttendanceReportService;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Collection;
@ -30,7 +35,7 @@ import java.util.Collection;
public class PayRequireAttendanceReportServiceImpl implements IPayRequireAttendanceReportService {
private final PayRequireAttendanceReportMapper baseMapper;
private final PayAttendanceMapper attendanceMapper;
/**
*
*/
@ -119,4 +124,84 @@ public class PayRequireAttendanceReportServiceImpl implements IPayRequireAttenda
}
return baseMapper.deleteBatchIds(ids) > 0;
}
@Override
public String importAttendanceReport(List<PayRequireAttendanceReportVo> attendanceReportList, boolean updateSupport, String date,Long tenantId) {
if (null==attendanceReportList || attendanceReportList.size() == 0)
{
throw new ServiceException("导入数据不能为空!");
}
int successNum = 0;
int failureNum = 0;
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
for (PayRequireAttendanceReportVo attendanceReport : attendanceReportList)
{ //如果导入数据没有姓名则进行下一条
if(attendanceReport.getEmpName()==null||attendanceReport.getEmpName().trim().equals("")){
continue;
}
//应出勤天数实际出勤天数出勤小时数加班小时数为null 则赋值0
if(attendanceReport.getRequireDays()==null){
attendanceReport.setRequireDays(Long.parseLong("0"));
}
if(attendanceReport.getAvtiveDays()==null){
attendanceReport.setAvtiveDays(Long.parseLong("0"));
}
if(attendanceReport.getAttendanceHours()==null){
attendanceReport.setAttendanceHours(new BigDecimal("0"));
}
if(attendanceReport.getOvertimeHours()==null){
attendanceReport.setOvertimeHours(new BigDecimal("0"));
}
try
{
attendanceReport.setYear(date.split("-")[0]);
attendanceReport.setMonth(date.split("-")[1]);
String name = attendanceReport.getEmpName();
//根据员工name查询员工id、部门id、部门名称
PayAttendance info = attendanceMapper.selectEmpInfoByName(name);
if(info==null){
throw new IOException("请先在员工表中添加员工:"+name);
}
attendanceReport.setEmployeeId(info.getEmployeeId());
attendanceReport.setDeptName(info.getDeptName());
attendanceReport.setTenantId(tenantId);
// 验证是否存在这个人的报告
PayRequireAttendanceReportBo bo = BeanUtil.toBean(attendanceReport,PayRequireAttendanceReportBo.class);
List<PayRequireAttendanceReportVo> r = this.queryList(bo);
if (null==r||r.size()==0)
{
this.insertByBo(bo);
successNum++;
if(updateSupport){
successMsg.append("<br/>" + successNum + attendanceReport.getEmpName()+ " 更新成功");
}else{
successMsg.append("<br/>" + successNum + attendanceReport.getEmpName()+ "导入成功");
}
} else {
failureNum++;
failureMsg.append("<br/>" + failureNum + attendanceReport.getEmpName() + " 已存在");
}
}
catch (Exception e)
{
failureNum++;
String msg = "<br/>" + failureNum + attendanceReport.getEmpName() + " 导入失败:";
failureMsg.append(msg + e.getMessage());
System.err.println(msg+ e);
}
}
if (failureNum > 0)
{
failureMsg.insert(0, "导入成功"+successNum+"条,导入失败" + failureNum + " 条,错误如下:");
throw new ServiceException(failureMsg.toString());
}
else
{
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
}

@ -0,0 +1,531 @@
package com.ruoyi.pay.util;
import cn.hutool.core.lang.Dict;
import com.ruoyi.common.core.service.DictService;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.pay.domain.PayAttendance;
import com.ruoyi.pay.domain.bo.PayAttendanceBo;
import com.ruoyi.pay.service.IPayAttendanceService;
import org.springframework.stereotype.Component;
import cn.hutool.core.date.DateTime;
import org.apache.poi.ss.usermodel.Row;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
@Component
public class AttendanceExcelUtil {
private final IPayAttendanceService iPayAttendanceService;
private final DictService dictService;
public AttendanceExcelUtil() {
this.iPayAttendanceService = SpringUtils.getBean(IPayAttendanceService.class);
this.dictService = SpringUtils.getBean(DictService.class);
}
private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
public static final String FORMULA_REGEX_STR = "=|-|\\+|@";
public static final String[] FORMULA_STR = { "=", "-", "+", "@" };
/**
* Excel sheet65536
*/
public static final int sheetSize = 65536;
/**
*
*/
private String sheetName;
/**
* EXPORT:IMPORT
*/
//private Excel.Type type;
/**
*
*/
private Workbook wb;
/**
*
*/
private Sheet sheet;
/**
*
*/
private Map<String, CellStyle> styles;
/**
*
*/
private List<PayAttendance> list;
/**
*
*/
private List<Object[]> fields;
/**
*
*/
private int rownum;
/**
*
*/
private String title;
/**
*
*/
private short maxHeight;
/**
*
*/
private Map<Integer, Double> statistics = new HashMap<Integer, Double>();
/**
*
*/
private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00");
/**
*
*/
public Class<PayAttendance> clazz;
/**
* excellist
*
* @param sheetName
* @param titleNum
* @param is
* @return
*/
public List<PayAttendanceBo> importKaoQinExcel(String sheetName, InputStream is, int titleNum, String date,String kaoqinType,Long tenantId) throws Exception {
List<PayAttendanceBo> attendances = new ArrayList<>();
//this.type = Excel.Type.IMPORT;
this.wb = WorkbookFactory.create(is);
// 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet
Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(2);
if (sheet == null) {
throw new IOException("文件sheet不存在");
}
/* boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook);
Map<String, PictureData> pictures;
if (isXSSFWorkbook) {
pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb);
} else {
pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb);
}*/
// 获取最后一个非空行的行下标比如总行数为n则返回的为n-1
int rows = sheet.getLastRowNum();
//把日期存放到list中
List<String> days = new ArrayList<>();
if (rows > 0) {
// 定义一个map用于存放excel列的序号和field.
Map<String, Integer> cellMap = new HashMap<String, Integer>();
// 获取表头
/* Row heard = sheet.getRow(titleNum);
String[] yearAndMonth =date.split("-");
for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) {
Cell cell = heard.getCell(i);
if (StringUtils.isNotNull(cell)) {
String value = this.getCellValue(heard, i).toString();
if(value!=null&&!value.trim().equals("")){
if(i<9){
value=0+value;
}
days.add(value);
}
}
}*/
int dayNumOfMonth = getDaysOfMonth(date);
for (Integer i = 1; i <= dayNumOfMonth; i++) {
if(i<=9){
days.add("0"+i);
}else {
days.add(i.toString());
}
}
//每2行是一条员工数据,除第titlenum行外一次循环2行
for (int i = titleNum + 1; i <= rows; i += 2) {
// 从第2行开始取数据,默认第一行是表头.
Row row1 = sheet.getRow(i);
Row row2 = sheet.getRow(i + 1);
// 判断当前行是否是空行
if (isRowEmpty(row1)) {
continue;
}
String wid = this.getCellValue(row1, 2).toString();//考勤机工号
String wname = this.getCellValue(row1, 10).toString();
//根据员工name查询员工id、部门id、部门名称
PayAttendance info = iPayAttendanceService.selectEmpInfoByName(wname);
if(info==null){
throw new IOException("请先在员工表中添加员工:"+wname+" 或者考勤机选择错误");
}
for (int j = 0; j < row2.getPhysicalNumberOfCells(); j++) {
if((j+1)>days.size()){
break;
}
PayAttendanceBo attendance = new PayAttendanceBo();
//attendance.setTenantId(LoginHelper.getTenantId());
attendance.setTenantId(tenantId);
attendance.setKaoqinYearMonth(date);
attendance.setEmpName(wname);
attendance.setKaoqinjiNum(kaoqinType);
attendance.setEmployeeId(info.getEmployeeId());
attendance.setDeptId(info.getDeptId());
attendance.setDeptName(info.getDeptName());
//得到年月日
String strday = date+"-"+days.get(j);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date day = sdf.parse(strday);
attendance.setKaoqinDate(day);
Cell cell = row2.getCell(j);
if (!(null==cell)) {
String value = this.getCellValue(row2, j).toString();
// System.out.println("*************************************:" + value);
if (value != null && !value.trim().equals("")) { //判断非空或者非空串单元格
String[] times = value.split("\n");
/* Date standard = new DateTime(strday + " 13:00:00");//以13点为分界线改为去字典配置分界时间去字典中去值*/
Date standard = new DateTime(strday + " " +dictService.getDictValue("time_divid","noon_time"));//以字典值为分界线
List<Date> ams = new ArrayList<>();//上午时间段内
List<Date> pms = new ArrayList<>();//下午时间短内
SimpleDateFormat punchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (String t : times) {
Date time = punchTime.parse(strday + " " + t + ":00");
if (time.before(standard)) {
ams.add(time);
} else {
pms.add(time);
}
}
//判断上下午时间段有几个值,对应存储
switch (ams.size()) {
case 0:
break;
case 1:
if(ams.get(0).before(punchTime.parse(strday+" 10:30:00"))){ //上午只打了一次卡 过了上午10点半算下班卡
attendance.setAmStartTime(ams.get(0));
}else{
attendance.setAmEndTime(ams.get(0));
}
break;
default:
List<Date> amtimes = getDates(ams);
attendance.setAmStartTime(amtimes.get(0));
attendance.setAmEndTime(amtimes.get(1));
break;
}
switch (pms.size()) {
case 0:
break;
case 1:
if(pms.get(0).before(punchTime.parse(strday+" 16:30:00"))){ //下午只打了一次卡 过了下午四点半算下班卡
attendance.setPmStartTime(pms.get(0));
}else{
attendance.setPmEndTime(pms.get(0));
}
break;
default:
List<Date> pmtimes = getDates(pms);
attendance.setPmStartTime(pmtimes.get(0));
attendance.setPmEndTime(pmtimes.get(1));
break;
}
}
}
attendances.add(attendance);
}
}
}
return attendances;
}
/**
*
*
* @param row
* @param column
* @return
*/
public Object getCellValue(Row row, int column)
{
if (row == null)
{
return row;
}
Object val = "";
try
{
Cell cell = row.getCell(column);
if (!(null==cell))
{
if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA)
{
val = cell.getNumericCellValue();
if (DateUtil.isCellDateFormatted(cell))
{
val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换
}
else
{
if ((Double) val % 1 != 0)
{
val = new BigDecimal(val.toString());
}
else
{
val = new DecimalFormat("0").format(val);
}
}
}
else if (cell.getCellType() == CellType.STRING)
{
val = cell.getStringCellValue();
}
else if (cell.getCellType() == CellType.BOOLEAN)
{
val = cell.getBooleanCellValue();
}
else if (cell.getCellType() == CellType.ERROR)
{
val = cell.getErrorCellValue();
}
}
}
catch (Exception e)
{
return val;
}
return val;
}
/**
*
*
* @param row
* @return
*/
private boolean isRowEmpty(Row row)
{
if (row == null)
{
return true;
}
for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++)
{
Cell cell = row.getCell(i);
if (cell != null && cell.getCellType() != CellType.BLANK)
{
return false;
}
}
return true;
}
/**
*
*/
private List<Date> getDates(List<Date> dates){
List<Date> times = new ArrayList<>();
Date max = dates.get(0);
Date min = dates.get(0);
for(Date time:dates){
if(time.before(max)){
min = time;
}else{
max = time;
}
}
times.add(min);
times.add(max);
return times;
}
public List<PayAttendanceBo> importKaoQinExcel2(String empty, InputStream inputStream, int titleNum, String date,String kaoqinType,Long tenantId) throws Exception{
List<PayAttendanceBo> attendances = new ArrayList<>();
// this.type = Excel.Type.IMPORT;
this.wb = WorkbookFactory.create(inputStream);
// 如果指定sheet名,则取指定sheet中的内容 否则默认指向第3个sheet
Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(2);
if (sheet == null) {
throw new IOException("文件sheet不存在");
}
boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook);
/*Map<String, PictureData> pictures;
if (isXSSFWorkbook) {
pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb);
} else {
pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb);
}*/
// 获取最后一个非空行的行下标比如总行数为n则返回的为n-1
int rows = sheet.getLastRowNum();
//把日期存放到list中
List<String> days = new ArrayList<>();
if (rows > 0) {
// 定义一个map用于存放excel列的序号和field.
Map<String, Integer> cellMap = new HashMap<String, Integer>();
// 获取表头
/*Row heard = sheet.getRow(titleNum);
for (int i = 3; i < heard.getPhysicalNumberOfCells(); i++) {
Cell cell = heard.getCell(i);
if (StringUtils.isNotNull(cell)) {
String value = this.getCellValue(heard, i).toString();
if(value!=null&&!value.trim().equals("")){
if(i<9){
value=0+value;
}
days.add(value);
}
}
}*/
int dayNumOfMonth = getDaysOfMonth(date);
for (Integer i = 1; i <= dayNumOfMonth; i++) {
if(i<=9){
days.add("0"+i);
}else {
days.add(i.toString());
}
}
//每1行是一条员工数据,除第titlenum+2行外一次循环1行
for (int i = titleNum + 2; i <= rows; i++) {
// 从第2行开始取数据,默认第一行是表头.
Row row1 = sheet.getRow(i);
// 判断当前行是否是空行
if (isRowEmpty(row1)) {
continue;
}
String wid = this.getCellValue(row1, 0).toString();//考勤机工号
String wname = this.getCellValue(row1, 1).toString();//姓名
//根据员工name查询员工id、部门id、部门名称
PayAttendance info = iPayAttendanceService.selectEmpInfoByName(wname);
if(info==null){
throw new IOException("请先在员工表中添加员工:"+wname+" 或者考勤机选择错误");
}
for (int j = 3; j < row1.getPhysicalNumberOfCells(); j++) {
if((j-2)>days.size()){
break;
}
PayAttendanceBo attendance = new PayAttendanceBo();
//attendance.setTenantId(LoginHelper.getTenantId());
attendance.setTenantId(tenantId);
attendance.setKaoqinYearMonth(date);
attendance.setEmpName(wname);
attendance.setKaoqinjiNum(kaoqinType);
attendance.setEmployeeId(info.getEmployeeId());
attendance.setDeptId(info.getDeptId());
attendance.setDeptName(info.getDeptName());
String strday = date+"-"+days.get(j-3);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date day = sdf.parse(strday);
attendance.setKaoqinDate(day);
Cell cell = row1.getCell(j);
if (!(null==cell)){
String value = this.getCellValue(row1, j).toString();
// System.out.println("*************************************:"+value);
if(value!=null&&!value.trim().equals("")) {//判断非空或者非空串单元格
String[] times = value.split("\n");
/* Date standard = new DateTime(strday + " 13:00:00");//以13点为分界线改为去字典配置分界时间去字典中去值*/
Date standard = new DateTime(strday + " " + dictService.getDictValue("pay_time_divid","noon_time"));//以13点为分界线
List<Date> ams = new ArrayList<>();//上午时间段内
List<Date> pms = new ArrayList<>();//下午时间短内
SimpleDateFormat punchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for(String t:times){
Date time= punchTime.parse(strday+" "+t+":00");
if(time.before(standard)){
ams.add(time);
}else{
pms.add(time);
}
}
//判断上下午时间段有几个值,对应存储
switch (ams.size()){
case 0:
break;
case 1:
if(ams.get(0).before(punchTime.parse(strday+" 10:30:00"))){ //上午只打了一次卡 过了上午10点半算下班卡
attendance.setAmStartTime(ams.get(0));
}else{
attendance.setAmEndTime(ams.get(0));
}
break;
default:
List<Date> amtimes = getDates(ams);
attendance.setAmStartTime(amtimes.get(0));
attendance.setAmEndTime(amtimes.get(1));
break;
}
switch (pms.size()){
case 0:
break;
case 1:
if(pms.get(0).before(punchTime.parse(strday+" 16:30:00"))){ //下午只打了一次卡 过了下午四点半算下班卡
attendance.setPmStartTime(pms.get(0));
}else{
attendance.setPmEndTime(pms.get(0));
}
break;
default:
List<Date> pmtimes = getDates(pms);
attendance.setPmStartTime(pmtimes.get(0));
attendance.setPmEndTime(pmtimes.get(1));
break;
}
}
}
attendances.add(attendance);
}
}
}
return attendances;
}
//获取一个月天数
public static int getDaysOfMonth(String datestr) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
Date date = format.parse(datestr);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
}
}

@ -9,6 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="tenantId" column="tenant_id"/>
<result property="userId" column="user_id"/>
<result property="deptId" column="dept_id"/>
<result property="deptName" column="dept_name"/>
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>

Loading…
Cancel
Save