Merge branch 'feature/V2-taxDeclarationSwitch-11-10' into release/2.1.3.2211.03

# Conflicts:
#	src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java
This commit is contained in:
Harryxzy 2022-11-10 11:25:01 +08:00
commit 15749ecc10
8 changed files with 167 additions and 24 deletions

View File

@ -1,10 +1,12 @@
package com.engine.salary.mapper.salaryacct;
import com.engine.salary.common.LocalDateRange;
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
import org.apache.ibatis.annotations.Param;
import java.util.Collection;
import java.util.List;
import java.util.Set;
public interface SalaryAcctRecordMapper {
@ -71,4 +73,5 @@ public interface SalaryAcctRecordMapper {
*/
void deleteByIds(@Param("ids") Collection<Long> ids);
List<SalaryAcctRecordPO> listByCreateDate(@Param(value = "createRange") LocalDateRange createRange, @Param(value = "salarySobIds") Set<Long> salarySobIds);
}

View File

@ -117,6 +117,25 @@
</if>
ORDER BY id DESC
</select>
<select id="listByCreateDate" resultType="com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO">
SELECT
<include refid="baseColumns"/>
FROM hrsa_salary_acct_record t
WHERE delete_type = 0
<if test="salarySobIds != null and salarySobIds.size()>0">
AND salary_sob_id IN
<foreach collection="salarySobIds" open="(" item="salarySobId" separator="," close=")">
#{salarySobId}
</foreach>
</if>
<if test="createRange != null and createRange.fromDate != null">
AND create_time <![CDATA[ >= ]]> #{createRange.fromDate}
</if>
<if test="createRange != null and createRange.endDate != null">
AND create_time <![CDATA[ <= ]]> #{createRange.endDate}
</if>
ORDER BY id DESC
</select>
<!-- 插入不为NULL的字段 -->

View File

@ -2,6 +2,7 @@ package com.engine.salary.mapper.sys;
import com.engine.salary.sys.entity.po.SalarySysConfPO;
import java.util.Date;
import java.util.List;
public interface SalarySysConfMapper {
@ -64,4 +65,12 @@ public interface SalarySysConfMapper {
SalarySysConfPO getOneByCode(String confKey);
int countByCode(String confKey);
/**
* @description 获取个税申报功能重启时间
* @return Date
* @author Harryxzy
* @date 2022/11/9 21:09
*/
Date getTaxDeclarationRebootDate();
}

View File

@ -233,5 +233,8 @@
WHERE delete_type = 0
AND conf_key = #{confKey}
</select>
<select id="getTaxDeclarationRebootDate" resultType="java.util.Date">
select update_time from HRSA_SALARY_SYS_CONF WHERE conf_key = 'taxDeclarationFunction'
</select>
</mapper>

View File

@ -16,6 +16,7 @@ import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.salaryacct.SalaryAcctRecordMapper;
import com.engine.salary.service.*;
import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum;
import com.engine.salary.sys.service.SalarySysConfService;
import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl;
import com.engine.salary.util.SalaryDateUtil;
@ -303,9 +304,10 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe
//获取账套下的所有核算结果
List<SalaryAcctRecordPO> salaryAcctRecords = listByTaxCycle(taxCycleYearRange,salarySobIds);
// 是否关闭个税申报功能
Boolean haveClosedTaxDeclaration = getSalarySysConfService(user).haveClosedTaxDeclaration();
if(haveClosedTaxDeclaration){
// 获取个税申报功能状态
TaxDeclarationFunctionEnum taxDeclarationFunctionEnum = getSalarySysConfService(user).getTaxDeclaration();
if(taxDeclarationFunctionEnum.getValue().equals(TaxDeclarationFunctionEnum.CLOSURE.getValue())){
// 关闭了个税申报功能
// 如果某个月薪资所属期还未归档不可以新建之后月份的薪资核算
SalaryAcctRecordPO notArchivedSalaryAcctRecordPO = salaryAcctRecords.stream()
@ -330,7 +332,8 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe
.replace("{1}",salarySobCycleDTO.getSalaryMonth().toString()));
}
}else {
}
if(taxDeclarationFunctionEnum.getValue().equals(TaxDeclarationFunctionEnum.OPEN.getValue())){
// 开启了个税申报功能
// 如果某个月税款所属期已经归档了不可以新建之前月份的薪资核算
SalaryAcctRecordPO hasArchivedSalaryAcctRecordPO = salaryAcctRecords.stream()
@ -366,7 +369,72 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe
.replace("{1}", salarySobCycleDTO.getTaxCycle().toString()));
}
}
if(taxDeclarationFunctionEnum.getValue().equals(TaxDeclarationFunctionEnum.REBOOT.getValue())){
// 重启了个税申报功能不去校验重启之前是否申报数据
// 如果某个月薪资所属期还未归档不可以新建之后月份的薪资核算
SalaryAcctRecordPO notArchivedSalaryAcctRecordPO = salaryAcctRecords.stream()
.filter(e -> Objects.equals(e.getStatus(), SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue())
&& e.getSalaryMonth().before(SalaryDateUtil.localDateToDate(salarySobCycleDTO.getSalaryMonth().atDay(1))))
.findAny()
.orElse(null);
if(Objects.nonNull(notArchivedSalaryAcctRecordPO)){
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98754, "薪资所属期{0}的薪资核算结果还未归档,不能新建薪资所属期{1}的薪资核算")
.replace("{0}",SalaryDateUtil.localDate2YearMonth(notArchivedSalaryAcctRecordPO.getTaxCycle()).toString())
.replace("{1}",salarySobCycleDTO.getTaxCycle().toString()));
}
// 如果某个月税款所属期已经归档了不可以新建之前月份的薪资核算
SalaryAcctRecordPO hasArchivedSalaryAcctRecordPO = salaryAcctRecords.stream()
.filter(e -> Objects.equals(e.getStatus(), SalaryAcctRecordStatusEnum.ARCHIVED.getValue())
&& e.getTaxCycle().after(SalaryDateUtil.localDateToDate(salarySobCycleDTO.getTaxCycle().atDay(1))))
.findAny()
.orElse(null);
if (Objects.nonNull(hasArchivedSalaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98752, "税款所属期{0}的薪资核算结果已经归档,不能新建税款所属期{1}的薪资核算")
.replace("{0}", SalaryDateUtil.localDate2YearMonth(hasArchivedSalaryAcctRecordPO.getTaxCycle()).toString())
.replace("{1}", salarySobCycleDTO.getTaxCycle().toString()));
}
// 如果某个月税款所属期还未申报不可以新建之后月份的薪资核算
//获取账套下从重启月至所在年的最后一天的所有核算结果
Date taxDeclarationRebootDate = getSalarySysConfService(user).getTaxDeclarationRebootDate();
if(taxDeclarationRebootDate == null){
throw new SalaryRunTimeException("个税申报功能异常");
}
LocalDateRange taxCycleRebootYearRange = LocalDateRange.builder()
.fromDate(taxDeclarationRebootDate)
.endDate(SalaryDateUtil.getLastDayOfYear(taxDeclarationRebootDate))
.build();
// List<SalaryAcctRecordPO> salaryAcctRebootRecords = listByTaxCycle(taxCycleRebootYearRange,salarySobIds);
List<SalaryAcctRecordPO> salaryAcctRebootRecords = listByCreateDate(taxCycleRebootYearRange,salarySobIds);
SalaryAcctRecordPO notDeclaredSalaryAcctRecordPO = salaryAcctRebootRecords.stream()
.filter(e -> !Objects.equals(e.getStatus(), SalaryAcctRecordStatusEnum.DECLARED.getValue())
&& e.getTaxCycle().before(SalaryDateUtil.localDateToDate(salarySobCycleDTO.getTaxCycle().atDay(1))))
.findAny()
.orElse(null);
if (Objects.nonNull(notDeclaredSalaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98751, "税款所属期{0}的薪资核算结果还未申报,不能新建税款所属期{1}的薪资核算")
.replace("{0}", SalaryDateUtil.localDate2YearMonth(notDeclaredSalaryAcctRecordPO.getTaxCycle()).toString())
.replace("{1}", salarySobCycleDTO.getTaxCycle().toString()));
}
// 如果某个月税款所属期已经申报了不可以新建本月以及之前月份的薪资核算
SalaryAcctRecordPO hasDeclaredSalaryAcctRecordPO = salaryAcctRecords.stream()
.filter(e -> Objects.equals(e.getStatus(), SalaryAcctRecordStatusEnum.DECLARED.getValue())
&& e.getTaxCycle().compareTo(SalaryDateUtil.localDateToDate(salarySobCycleDTO.getTaxCycle().atDay(1))) >= 0)
.findAny()
.orElse(null);
if (Objects.nonNull(hasDeclaredSalaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98753, "税款所属期{0}的薪资核算结果已经申报,不能新建税款所属期{1}的薪资核算")
.replace("{0}", SalaryDateUtil.localDate2YearMonth(hasDeclaredSalaryAcctRecordPO.getTaxCycle()).toString())
.replace("{1}", salarySobCycleDTO.getTaxCycle().toString()));
}
}
}
private List<SalaryAcctRecordPO> listByCreateDate(LocalDateRange taxCycleRebootYearRange, Set<Long> salarySobIds) {
return getSalaryAcctRecordMapper().listByCreateDate(taxCycleRebootYearRange,salarySobIds);
}
@ -512,12 +580,22 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe
}
//撤回工资单
getSalarySendService(user).revokeSalaryBill(salaryAcctRecordId);
Boolean haveClosedTaxDeclaration = getSalarySysConfService(user).haveClosedTaxDeclaration();
if(!haveClosedTaxDeclaration){
TaxDeclarationFunctionEnum taxDeclaration = getSalarySysConfService(user).getTaxDeclaration();
// if(taxDeclaration.getValue().equals(TaxDeclarationFunctionEnum.OPEN.getValue())){
// 开启了个税申报功能
// 删除个税申报表(个税申报表个税申报表详情往期累计情况)
getTaxDeclarationService(user).delete(salaryAcctRecordPO);
}
// }else if(taxDeclaration.getValue().equals(TaxDeclarationFunctionEnum.REBOOT.getValue())){
// // 重启个税申报功能
// Date taxDeclarationRebootDateTemp = getSalarySysConfService(user).getTaxDeclarationRebootDate();
// Date taxDeclarationRebootDate = SalaryDateUtil.getFirstDayDateOfMonthWithMinutesAndSeconds(taxDeclarationRebootDateTemp);
// if(!taxDeclarationRebootDate.after(salaryAcctRecordPO.getTaxCycle())){
// // 删除个税申报表(个税申报表个税申报表详情往期累计情况)
// getTaxDeclarationService(user).delete(salaryAcctRecordPO);
// }
// }
// 更新薪资核算记录的状态
salaryAcctRecordPO.setStatus(SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue());
salaryAcctRecordPO.setUpdateTime(new Date());

View File

@ -7,6 +7,7 @@ import com.engine.salary.sys.entity.vo.AppSettingVO;
import com.engine.salary.sys.entity.vo.OrderRuleVO;
import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -33,7 +34,7 @@ public interface SalarySysConfService {
* 是否关闭了个税申报功能
* @return BOOLEAN
*/
public Boolean haveClosedTaxDeclaration();
TaxDeclarationFunctionEnum getTaxDeclaration();
SalarySysConfPO getOneByCode(String code);
@ -79,4 +80,12 @@ public interface SalarySysConfService {
* @return
*/
Map<String, Object> getEncryptProgress(String progressId);
/**
* @description 获取个税申报功能重启日期
* @return Date
* @author Harryxzy
* @date 2022/11/9 21:07
*/
Date getTaxDeclarationRebootDate();
}

View File

@ -161,10 +161,10 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe
taxDeclarationFunction.setTitle(flag.getDefaultLabel());
taxDeclarationFunction.setUpdateTime(new Date());
}
//重启
//重启 (从关闭到开启)
if (flag == TaxDeclarationFunctionEnum.OPEN && oldFunctionEnum == TaxDeclarationFunctionEnum.CLOSURE) {
taxDeclarationFunction.setConfValue(flag.getValue());
taxDeclarationFunction.setTitle(flag.getDefaultLabel());
taxDeclarationFunction.setConfValue(TaxDeclarationFunctionEnum.REBOOT.getValue());
taxDeclarationFunction.setTitle(TaxDeclarationFunctionEnum.REBOOT.getDefaultLabel());
taxDeclarationFunction.setUpdateTime(new Date());
}
getSalarySysConfMapper().updateIgnoreNull(taxDeclarationFunction);
@ -173,18 +173,19 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe
}
/**
* @description 是否关闭需要申报功能
* @description 获取申报功能状态
* @return Boolean
* @author Harryxzy
* @date 2022/11/7 17:05
*/
public Boolean haveClosedTaxDeclaration(){
public TaxDeclarationFunctionEnum getTaxDeclaration(){
SalarySysConfPO taxDeclarationFunction = salarySysConfService.getOneByCode(TAX_DECLARATION_FUNCTION);
if(taxDeclarationFunction != null && taxDeclarationFunction.getConfValue().equals(TaxDeclarationFunctionEnum.CLOSURE.getValue())){
// 关闭
return true;
if(taxDeclarationFunction == null){
// 默认开启
return TaxDeclarationFunctionEnum.OPEN;
}
return false;
TaxDeclarationFunctionEnum taxDeclarationFunctionEnum = TaxDeclarationFunctionEnum.parseByValue(taxDeclarationFunction.getConfValue());
return taxDeclarationFunctionEnum;
}
@ -388,6 +389,12 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe
return resultMap;
}
@Override
public Date getTaxDeclarationRebootDate() {
Date date = getSalarySysConfMapper().getTaxDeclarationRebootDate();
return date;
}
/**
* 保存或者修改应用设置
*
@ -434,9 +441,6 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe
case OPEN_APPLICATION_ENCRYPT:
appSettingVO.setIsOpenEncrypt(salarySysConfPO.getConfValue());
break;
case TAX_DECLARATION_FUNCTION:
appSettingVO.setIsOpenTaxDeclaration(salarySysConfPO.getConfValue());
break;
case DISPLAY_EMP_INFO_REPORT:
appSettingVO.setDisplayEmpInfoReport(salarySysConfPO.getConfValue());
break;
@ -445,6 +449,14 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe
}
});
}
List<SalarySysConfPO> taxDeclarationFunction = getSalarySysConfMapper().listSome(SalarySysConfPO.builder().deleteType(0).confKey(TAX_DECLARATION_FUNCTION).build());
if(taxDeclarationFunction == null || taxDeclarationFunction.size() == 0 || (taxDeclarationFunction.get(0).getConfValue().equals(TaxDeclarationFunctionEnum.REBOOT.getValue()))){
// 默认开启报税功能 或者重启状态时前端展示开启
appSettingVO.setIsOpenTaxDeclaration("1");
}else {
appSettingVO.setIsOpenTaxDeclaration(taxDeclarationFunction.get(0).getConfValue());
}
//默认加密开启
if (StringUtils.isEmpty(appSettingVO.getIsOpenEncrypt())) {
appSettingVO.setIsOpenEncrypt(OpenEnum.OPEN.getValue());
@ -456,10 +468,6 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe
if (StringUtils.isEmpty(appSettingVO.getDisplayEmpInfoReport())) {
appSettingVO.setDisplayEmpInfoReport(OpenEnum.OFF.getValue());
}
// 默认开启报税功能
if(StringUtils.isEmpty(appSettingVO.getIsOpenTaxDeclaration())){
appSettingVO.setIsOpenTaxDeclaration("1");
}
return appSettingVO;
}

View File

@ -240,6 +240,17 @@ public class SalaryDateUtil {
cal.set(Calendar.DAY_OF_MONTH, last);
return cal.getTime();
}
public static Date getFirstDayDateOfMonthWithMinutesAndSeconds(final Date date) {
final Calendar cal = Calendar.getInstance();
cal.setTime(date);
final int last = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DAY_OF_MONTH, last);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
public static Date getLastDayOfMonth(final Date date) {
final Calendar cal = Calendar.getInstance();
@ -265,6 +276,9 @@ public class SalaryDateUtil {
return cal.getTime();
}
public static String getMonthBegin(String specifiedDay) {
int year;
int month;