diff --git a/src/com/engine/salary/entity/datacollection/param/OtherDeductionExtendLastParam.java b/src/com/engine/salary/entity/datacollection/param/OtherDeductionExtendLastParam.java new file mode 100644 index 000000000..6277c0f63 --- /dev/null +++ b/src/com/engine/salary/entity/datacollection/param/OtherDeductionExtendLastParam.java @@ -0,0 +1,21 @@ +package com.engine.salary.entity.datacollection.param; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class OtherDeductionExtendLastParam { + + private String declareMonth; + + private LocalDateTime yearMonthTime; + + private Integer taxAgentId; +} diff --git a/src/com/engine/salary/service/OtherDeductionService.java b/src/com/engine/salary/service/OtherDeductionService.java index 9e691d559..e77c70995 100644 --- a/src/com/engine/salary/service/OtherDeductionService.java +++ b/src/com/engine/salary/service/OtherDeductionService.java @@ -2,10 +2,7 @@ package com.engine.salary.service; import com.engine.salary.entity.datacollection.dto.OtherDeductionListDTO; import com.engine.salary.entity.datacollection.dto.OtherDeductionRecordDTO; -import com.engine.salary.entity.datacollection.param.AddUpDeductionRecordDeleteParam; -import com.engine.salary.entity.datacollection.param.OtherDeductionImportParam; -import com.engine.salary.entity.datacollection.param.OtherDeductionParam; -import com.engine.salary.entity.datacollection.param.OtherDeductionQueryParam; +import com.engine.salary.entity.datacollection.param.*; import com.engine.salary.entity.datacollection.po.OtherDeductionPO; import com.engine.salary.util.page.PageInfo; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -113,4 +110,6 @@ public interface OtherDeductionService { * 获取数据 */ OtherDeductionRecordDTO getOtherDeduction(OtherDeductionParam otherDeductionParam); + + String extendToLastMonth(OtherDeductionExtendLastParam param); } diff --git a/src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java b/src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java index 1529e9966..e5ae380b8 100644 --- a/src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java +++ b/src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java @@ -1,10 +1,12 @@ package com.engine.salary.service.impl; +import com.alibaba.fastjson.JSONObject; import com.api.formmode.mybatis.util.SqlProxyHandle; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.biz.EmployBiz; import com.engine.salary.biz.OtherDeductionBiz; +import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.datacollection.OtherDeductionListDTOEncrypt; import com.engine.salary.encrypt.datacollection.OtherDeductionRecordDTOEncrypt; import com.engine.salary.entity.datacollection.DataCollectionEmployee; @@ -49,6 +51,7 @@ import weaver.hrm.User; import java.io.InputStream; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.time.YearMonth; import java.util.*; import java.util.stream.Collectors; @@ -563,12 +566,12 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction // 获取所有个税扣缴义务人 Collection taxAgentList = getTaxAgentService(user).listTaxAgentAndEmployeeTree(currentEmployeeId); OtherDeductionPO byId = OtherDeductionBiz.getById(otherDeductionParam.getId()); - if(byId == null){ + if (byId == null) { throw new SalaryRunTimeException("该数据不存在!"); } Long taxAgentId = byId.getTaxAgentId(); - boolean canEdit = taxAgentList.stream().anyMatch(t -> Objects.equals(t.getTaxAgentId() , taxAgentId)); - if(!canEdit){ + boolean canEdit = taxAgentList.stream().anyMatch(t -> Objects.equals(t.getTaxAgentId(), taxAgentId)); + if (!canEdit) { //没有编辑权限 throw new SalaryRunTimeException("该个税扣缴义务人无权限编辑此数据!"); } @@ -577,8 +580,8 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction // 判断是否有核算过 if (CollectionUtils.isNotEmpty(salaryAcctEmployees)) { Optional optionalAcctEmp = salaryAcctEmployees.stream().filter(f -> f.getEmployeeId().equals(otherDeductionParam.getEmployeeId()) && f.getTaxAgentId().equals(otherDeductionParam.getTaxAgentId())).findFirst(); - if (optionalAcctEmp.isPresent()) { - throw new SalaryRunTimeException("该年月这条数据已经核算过,不可进行编辑!"); + if (optionalAcctEmp.isPresent()) { + throw new SalaryRunTimeException("该年月这条数据已经核算过,不可进行编辑!"); } } ArrayList updateList = new ArrayList<>(); @@ -622,8 +625,8 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction .declareMonth(declareMonth).build(); //筛选导入人员信息可以在人力资源池中匹配到的人员信息 - boolean employeeSameId = employees.stream().anyMatch(e -> Objects.equals(e.getEmployeeId() , otherDeductionParam.getEmployeeId())); - if(!employeeSameId){ + boolean employeeSameId = employees.stream().anyMatch(e -> Objects.equals(e.getEmployeeId(), otherDeductionParam.getEmployeeId())); + if (!employeeSameId) { throw new SalaryRunTimeException("员工信息不存在"); } po.setEmployeeId(otherDeductionParam.getEmployeeId()); @@ -655,7 +658,7 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction String deductionAllowedDonation = otherDeductionParam.getDeductionAllowedDonation(); po.setDeductionAllowedDonation(deductionAllowedDonation); - //fixme 分权判断 + //fixme 分权判断 // if (openDevolution) { // OtherDeductionPO finalPoE = po; // Optional optionalTaxAgentEmp = taxAgentEmployees.stream().filter(f -> f.getEmployeeId().equals(finalPoE.getEmployeeId())).findFirst(); @@ -694,15 +697,15 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction List salaryAcctEmployees = getAddUpDeductionService(user).getAccountedEmployeeData(declareMonthStr); // 判断是否有核算过 List deleteList = new ArrayList<>(); - for(int i=0; i first = taxAgentList.stream().filter(m -> Objects.equals(m.getTaxAgentId() , byId.getTaxAgentId())).findFirst(); - if(!first.isPresent()){ + Optional first = taxAgentList.stream().filter(m -> Objects.equals(m.getTaxAgentId(), byId.getTaxAgentId())).findFirst(); + if (!first.isPresent()) { throw new SalaryRunTimeException("个税扣缴义务人不存在或不在权限范围内"); } // 判断用户是否存在 @@ -726,32 +729,32 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction Collection taxAgentList = getTaxAgentService(user).listTaxAgentAndEmployeeTree(currentEmployeeId); List taxAgentIds = taxAgentList.stream().map(TaxAgentManageRangeEmployeeDTO::getTaxAgentId).collect(Collectors.toList()); OtherDeductionBiz otherDeductionBiz = new OtherDeductionBiz(); - Date declareMonthDate =null; + Date declareMonthDate = null; try { - declareMonthDate = sdf.parse(declareMonthStr+"-01"); - }catch (Exception e){ + declareMonthDate = sdf.parse(declareMonthStr + "-01"); + } catch (Exception e) { throw new SalaryRunTimeException("日期异常"); } OtherDeductionPO queryParam = null; - if(deleteParam.getTaxAgentId() != null && (!deleteParam.getTaxAgentId().equals(""))){ + if (deleteParam.getTaxAgentId() != null && (!deleteParam.getTaxAgentId().equals(""))) { // 设置了个税扣缴义务人 Long taxAgentId = SalaryEntityUtil.string2Long(deleteParam.getTaxAgentId()); - boolean canDelete = taxAgentIds.stream().anyMatch(t -> Objects.equals(t , taxAgentId)); - if(!canDelete){ + boolean canDelete = taxAgentIds.stream().anyMatch(t -> Objects.equals(t, taxAgentId)); + if (!canDelete) { throw new SalaryRunTimeException("个税扣缴义务人不存在或不在权限范围内!"); } ArrayList tai = new ArrayList<>(); tai.add(taxAgentId); - queryParam = OtherDeductionPO.builder().declareMonth(declareMonthDate).taxAgentIds(tai).build(); - }else { + queryParam = OtherDeductionPO.builder().declareMonth(declareMonthDate).taxAgentIds(tai).build(); + } else { queryParam = OtherDeductionPO.builder().declareMonth(declareMonthDate).taxAgentIds(taxAgentIds).build(); } // 获取所有想要删除的数据 List list = otherDeductionBiz.listSome(queryParam); // 获取已经核算的数据 List salaryAcctEmployees = getAddUpDeductionService(user).getAccountedEmployeeData(declareMonthStr); - for(OtherDeductionPO item : list){ + for (OtherDeductionPO item : list) { if (CollectionUtils.isNotEmpty(salaryAcctEmployees)) { Optional optionalAcctEmp = salaryAcctEmployees.stream().filter(f -> f.getEmployeeId().equals(item.getEmployeeId()) && f.getTaxAgentId().equals(item.getTaxAgentId())).findFirst(); if (optionalAcctEmp.isPresent()) { @@ -775,16 +778,72 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction List list = getOtherDeductionMapper().recordList(build); OtherDeductionRecordDTOEncrypt.decryptOtherDeductionRecordDTOList(list); - if(list==null || list.size()==0){ + if (list == null || list.size() == 0) { throw new SalaryRunTimeException("该数据不存在!"); } String taxAgentName = list.get(0).getTaxAgentName(); - if(!taxAgentNames.contains(taxAgentName)){ + if (!taxAgentNames.contains(taxAgentName)) { throw new SalaryRunTimeException("您无权查看该数据!"); } return list.get(0); } + @Override + public String extendToLastMonth(OtherDeductionExtendLastParam param) { + // 查找到所有个税扣缴义务人 + Boolean needAuth = getTaxAgentService(user).isNeedAuth((long) user.getUID()); + Collection taxAgentPOS; + if (needAuth) { + taxAgentPOS = getTaxAgentService(user).listAllTaxAgentsAsAdmin((long) user.getUID()); + } else { + taxAgentPOS = getTaxAgentService(user).listAll(); + } + List taxAgentIds = taxAgentPOS.stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + + //查询上月数据 + LocalDateTime lastMonth = param.getYearMonthTime().minusMonths(1); + OtherDeductionQueryParam queryParam = OtherDeductionQueryParam.builder() + .taxAgentIds(taxAgentIds) + .declareMonthDate(Collections.singletonList( + SalaryDateUtil.toDate(lastMonth)) + ).build(); + List lastMonthInfo = getOtherDeductionMapper().list(queryParam); + + // 查询当前月id + queryParam.setDeclareMonthDate(Collections.singletonList( + SalaryDateUtil.toDate(param.getYearMonthTime()) + )); + Map updateIdMap = getOtherDeductionMapper() + .list(queryParam).stream() + .collect(Collectors.toMap(i -> i.getEmployeeId()+"" + i.getTaxAgentId(), OtherDeductionListDTO::getId)); + + List insertInfo = new ArrayList<>(); + List updatetInfo = new ArrayList<>(); + for (OtherDeductionListDTO dto : lastMonthInfo) { + OtherDeductionPO po + = JSONObject.parseObject(JSONObject.toJSONString(dto), OtherDeductionPO.class); + po.setDeclareMonth(SalaryDateUtil.toDate(param.getYearMonthTime())); + po.setUpdateTime(new Date()); + po.setId(null); + po.setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY); + boolean hasOld = updateIdMap.containsKey(po.getEmployeeId() + "" + po.getTaxAgentId()); + if (hasOld) { + po.setId(updateIdMap.get(po.getEmployeeId() + "" + po.getTaxAgentId())); + updatetInfo.add(po); + } else { + po.setCreator((long) user.getUID()); + po.setCreateTime(new Date()); + insertInfo.add(po); + } + } + List> list = Lists.partition(insertInfo, 1000); + list.forEach(l->getOtherDeductionMapper().insertData(l)); + + List> updateList = Lists.partition(updatetInfo, 1000); + list.forEach(l->getOtherDeductionMapper().updateData(l)); + return ""; + } + @Override public XSSFWorkbook downloadTemplate(OtherDeductionQueryParam param) { // 1.工作簿名称 diff --git a/src/com/engine/salary/util/SalaryDateUtil.java b/src/com/engine/salary/util/SalaryDateUtil.java index c34b18dbc..024780761 100644 --- a/src/com/engine/salary/util/SalaryDateUtil.java +++ b/src/com/engine/salary/util/SalaryDateUtil.java @@ -1,5 +1,6 @@ package com.engine.salary.util; +import cn.hutool.core.util.StrUtil; import com.engine.salary.common.LocalDateRange; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -528,6 +529,30 @@ public class SalaryDateUtil { return inDataRange; } + /** + * 转换时间对象 + * @see SalaryDateUtil#toDate(LocalDateTime, String) + * @param dateTime LocalDateTime + * @return Date + */ + public static Date toDate(LocalDateTime dateTime) { + return toDate(dateTime, null); + } + + + /** + * 转换时间对象 + * @param dateTime LocalDateTime + * @param offset 时区,e.g. +8 + * @return Date + */ + public static Date toDate(LocalDateTime dateTime, String offset) { + if (dateTime == null) { + return null; + } + ZoneId zoneOffset = StrUtil.isNotEmpty(offset) ? ZoneOffset.of(offset) : ZoneOffset.systemDefault(); + return Date.from(dateTime.atZone(zoneOffset).toInstant()); + } } diff --git a/src/com/engine/salary/web/OtherDeductionController.java b/src/com/engine/salary/web/OtherDeductionController.java index 91a7401a7..d930daa5a 100644 --- a/src/com/engine/salary/web/OtherDeductionController.java +++ b/src/com/engine/salary/web/OtherDeductionController.java @@ -3,10 +3,7 @@ package com.engine.salary.web; import com.engine.common.util.ServiceUtil; import com.engine.salary.entity.datacollection.dto.OtherDeductionListDTO; import com.engine.salary.entity.datacollection.dto.OtherDeductionRecordDTO; -import com.engine.salary.entity.datacollection.param.AddUpDeductionRecordDeleteParam; -import com.engine.salary.entity.datacollection.param.OtherDeductionImportParam; -import com.engine.salary.entity.datacollection.param.OtherDeductionParam; -import com.engine.salary.entity.datacollection.param.OtherDeductionQueryParam; +import com.engine.salary.entity.datacollection.param.*; import com.engine.salary.util.ResponseResult; import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.page.PageInfo; @@ -346,5 +343,12 @@ public class OtherDeductionController { return new ResponseResult>(user).run(getOtherDeductionWrapper(user)::deleteAllData, otherDeductionDeleteParam); } - + @POST + @Path("/extendToLastMonth") + @Produces(MediaType.APPLICATION_JSON) + public String extendToLastMonth(@Context HttpServletRequest request, @Context HttpServletResponse response, + @RequestBody OtherDeductionExtendLastParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getOtherDeductionWrapper(user)::extendToLastMonth, param); + } } diff --git a/src/com/engine/salary/wrapper/OtherDeductionWrapper.java b/src/com/engine/salary/wrapper/OtherDeductionWrapper.java index 1430e7702..0c4cf132e 100644 --- a/src/com/engine/salary/wrapper/OtherDeductionWrapper.java +++ b/src/com/engine/salary/wrapper/OtherDeductionWrapper.java @@ -8,10 +8,7 @@ import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.entity.datacollection.dto.OtherDeductionListDTO; import com.engine.salary.entity.datacollection.dto.OtherDeductionRecordDTO; -import com.engine.salary.entity.datacollection.param.AddUpDeductionRecordDeleteParam; -import com.engine.salary.entity.datacollection.param.OtherDeductionImportParam; -import com.engine.salary.entity.datacollection.param.OtherDeductionParam; -import com.engine.salary.entity.datacollection.param.OtherDeductionQueryParam; +import com.engine.salary.entity.datacollection.param.*; import com.engine.salary.entity.datacollection.po.OtherDeductionPO; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.service.OtherDeductionService; @@ -22,9 +19,13 @@ import com.engine.salary.service.impl.SalaryEmployeeServiceImpl; import com.engine.salary.service.impl.TaxAgentServiceImpl; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.page.PageInfo; +import lombok.extern.slf4j.Slf4j; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.hrm.User; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -35,16 +36,20 @@ import java.util.Map; * @Author: wangxiangzhong * @Date: 2022/3/14 16:09 */ +@Slf4j public class OtherDeductionWrapper extends Service { private OtherDeductionService getOtherDeductionService(User user) { return ServiceUtil.getService(OtherDeductionServiceImpl.class, user); } + private TaxAgentService getTaxAgentV2Service(User user) { return ServiceUtil.getService(TaxAgentServiceImpl.class, user); } + private SalaryEmployeeService getSalaryEmployeeService(User user) { return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); } + /** * 数据采集-其他免税扣除列表的高级搜索 * @@ -178,7 +183,7 @@ public class OtherDeductionWrapper extends Service { Long id = queryParam.getOtherTaxExemptDeductionId(); OtherDeductionPO po = getOtherDeductionService(user).getById(id); if (po == null) { - throw new SalaryRunTimeException(String.format(SalaryI18nUtil.getI18nLabel( 100415, "其他免税扣除不存在") + "[id:%s]", id)); + throw new SalaryRunTimeException(String.format(SalaryI18nUtil.getI18nLabel(100415, "其他免税扣除不存在") + "[id:%s]", id)); } return getOtherDeductionService(user).exportDetail(queryParam); } @@ -196,14 +201,14 @@ public class OtherDeductionWrapper extends Service { /** * 预览 */ - public Map preview(OtherDeductionImportParam importParam){ + public Map preview(OtherDeductionImportParam importParam) { return getOtherDeductionService(user).preview(importParam); } /** * 导入数据 */ - public Map importData(OtherDeductionImportParam importParam){ + public Map importData(OtherDeductionImportParam importParam) { return getOtherDeductionService(user).importData(importParam); } @@ -242,4 +247,20 @@ public class OtherDeductionWrapper extends Service { public OtherDeductionRecordDTO getOtherDeduction(OtherDeductionParam otherDeductionParam) { return getOtherDeductionService(user).getOtherDeduction(otherDeductionParam); } + + public String extendToLastMonth(OtherDeductionExtendLastParam param) { + LocalDateTime localDate = null; + try { + localDate = LocalDate.parse(param.getDeclareMonth() + "-01", + DateTimeFormatter.ofPattern("yyyy-MM-dd")).atStartOfDay(); + param.setYearMonthTime(localDate); + } catch (Exception e) { + log.error("", e); + } + if (null == param.getDeclareMonth() || null == param.getYearMonthTime()) { + throw new SalaryRunTimeException("当前年月不合法"); + } + param.setYearMonthTime(localDate); + return getOtherDeductionService(user).extendToLastMonth(param); + } }