diff --git a/resource/WEB-INF/prop/hrmSalary.properties b/resource/WEB-INF/prop/hrmSalary.properties index f3380b545..734b9b270 100644 --- a/resource/WEB-INF/prop/hrmSalary.properties +++ b/resource/WEB-INF/prop/hrmSalary.properties @@ -1,5 +1,5 @@ log=false defaultCloseNonStandard149=true AESEncryptScrect=990EB004A1C862721C1513AE90038C9E -version=3.0.2.2510.01 +version=3.0.3.2510.01 openFormulaForcedEditing=false \ No newline at end of file diff --git a/resource/sqlupgrade/PG/sql202501150103.sql b/resource/sqlupgrade/PG/sql202501150103.sql index d62aea72f..3841048c5 100644 --- a/resource/sqlupgrade/PG/sql202501150103.sql +++ b/resource/sqlupgrade/PG/sql202501150103.sql @@ -1,41 +1,42 @@ -CREATE TABLE hrsa_hrm_snapshot ( - ID bigint(0) NOT NULL, +CREATE TABLE hrsa_hrm_snapshot +( + ID bigint NOT NULL, snapshot_time timestamp, - employee_id bigint(0), + employee_id bigint, loginid varchar(100), LASTNAME varchar(60), SEX char(1), BIRTHDAY char(10) , - NATIONALITY int(0) , + NATIONALITY int , MARITALSTATUS char(1) , TELEPHONE varchar(60), MOBILE varchar(60) , MOBILECALL varchar(60) , EMAIL varchar(60), - LOCATIONID int(0), + LOCATIONID int, WORKROOM varchar(60), HOMEADDRESS varchar(100), RESOURCETYPE char(1) , STARTDATE char(10) , ENDDATE char(10), - JOBTITLE int(0) , + JOBTITLE int , JOBTITLENAME varchar(200) , JOBACTIVITYDESC varchar(200), - JOBLEVEL int(0) , - SECLEVEL int(0) , - DEPARTMENTID int(0) , + JOBLEVEL int , + SECLEVEL int , + DEPARTMENTID int , DEPARTMENTNAME varchar(200) , - SUBCOMPANYID1 int(0) , + SUBCOMPANYID1 int , SUBCOMPANYNAME varchar(200) , - COSTCENTERID int(0) , - MANAGERID int(0) , - ASSISTANTID int(0), - BANKID1 int(0) , + COSTCENTERID int , + MANAGERID int , + ASSISTANTID int, + BANKID1 int , ACCOUNTID1 varchar(100) , LASTLOGINDATE char(10) , CERTIFICATENUM varchar(60) , NATIVEPLACE varchar(100) , - EDUCATIONLEVEL int(0) , + EDUCATIONLEVEL int , BEMEMBERDATE char(10) , BEPARTYDATE char(10) , WORKCODE varchar(60) , @@ -44,8 +45,8 @@ CREATE TABLE hrsa_hrm_snapshot ( RESIDENTPLACE varchar(200) , POLICY varchar(30) , DEGREE varchar(30) , - USEKIND int(0) , - JOBCALL int(0) , + USEKIND int , + JOBCALL int , jobcallname varchar(200) , ACCUMFUNDACCOUNT varchar(30), BIRTHPLACE varchar(60) , @@ -54,14 +55,14 @@ CREATE TABLE hrsa_hrm_snapshot ( RESIDENTPOSTCODE varchar(60) , EXTPHONE varchar(50) , MANAGERSTR varchar(500), - STATUS int(0) , + STATUS int , FAX varchar(60) , ISLABOUUNION char(1), TEMPRESIDENTNUMBER varchar(60), PROBATIONENDDATE char(10), - COUNTRYID int(0) , - ACCOUNTTYPE int(0) , - BELONGTO int(0) , + COUNTRYID int , + ACCOUNTTYPE int , + BELONGTO int , ACCOUNTNAME varchar(200) , companystartdate varchar(10), workstartdate varchar(10) , diff --git a/resource/wiki/删除档案.txt b/resource/wiki/删除档案.txt index a3a0c6dbd..a9aab191b 100644 --- a/resource/wiki/删除档案.txt +++ b/resource/wiki/删除档案.txt @@ -18,7 +18,8 @@ update hrsa_salary_archive set delete_type=3 where tax_agent_id=扣缴义务人 二、删除停薪员工档案 -update hrsa_salary_archive set delete_type=3 where run_status in ('STOP_FROM_PENDING','STOP_FROM_SUSPEND') +update hrsa_salary_archive set delete_type=3 where delete_type=0 and run_status in ('STOP_FROM_PENDING','STOP_FROM_SUSPEND') +update hrsa_salary_archive_item set delete_type=3 where delete_type=0 二、删除停薪员工社保档案 update hrsa_insurance_base_info set delete_type=3 where run_status in ('4','5') @@ -28,10 +29,10 @@ update hrsa_insurance_base_info set delete_type=3 where run_status in ('4','5') --删除社保福利档案 -update hrsa_insurance_base_info set delete_type=3 WHERE employee_id = ? and payment_organization =? -update hrsa_social_archives set delete_type=3 WHERE employee_id = ? and payment_organization =? -update hrsa_fund_archives set delete_type=3 WHERE employee_id = ? and payment_organization =? -update hrsa_other_archives set delete_type=3 WHERE employee_id = ? and payment_organization =? +update hrsa_insurance_base_info set delete_type=3 WHERE delete_type=0 and employee_id = ? and payment_organization =? +update hrsa_social_archives set delete_type=3 WHERE delete_type=0 and employee_id = ? and payment_organization =? +update hrsa_fund_archives set delete_type=3 WHERE delete_type=0 and employee_id = ? and payment_organization =? +update hrsa_other_archives set delete_type=3 WHERE delete_type=0 and employee_id = ? and payment_organization =? -- 删除薪资档案 update hrsa_salary_archive set delete_type=3 where employee_id = ? and tax_agent_id=? @@ -45,4 +46,13 @@ update hrsa_other_archives set delete_type=3; update hrsa_tax_agent_emp set delete_type=3; +-- 删除核算记录 +update hrsa_salary_acct_record set delete_type=3 where delete_type=0 and id= 核算记录id; +update hrsa_salary_acct_emp set delete_type=3 where delete_type=0 and salary_acct_record_id=核算记录id; +update hrsa_salary_acct_result set delete_type=3 where delete_type=0 and salary_acct_record_id = 核算记录id; + +--删除工资单信息 +update hrsa_salary_send set delete_type=3 where delete_type=0 and salary_accounting_id = 核算记录id; +update hrsa_salary_send_info set delete_type=3 where delete_type=0 and salary_acct_record_id = 核算记录id; + diff --git a/resource/wiki/人员生成不了档案.sql b/resource/wiki/常见问题.md similarity index 58% rename from resource/wiki/人员生成不了档案.sql rename to resource/wiki/常见问题.md index 7060a660e..747980c74 100644 --- a/resource/wiki/人员生成不了档案.sql +++ b/resource/wiki/常见问题.md @@ -1,3 +1,5 @@ + +## 薪资档案生成不了 select id from hrsa_tax_agent_emp where tax_agent_id =扣缴义务人id and delete_type = 0 @@ -6,5 +8,14 @@ and employee_id not in where tax_agent_id =扣缴义务人id and delete_type = 0) -update hrsa_tax_agent_emp set delete_type = 3 -where tax_agent_id=扣缴义务人id and delete_type = 0 and employee_id not in (select employee_id from hrsa_salary_archive where tax_agent_id =扣缴义务人id and delete_type = 0) \ No newline at end of file +update hrsa_tax_agent_emp set delete_type = 3 where delete_type = 0 +where tax_agent_id=扣缴义务人id and delete_type = 0 and employee_id not in (select employee_id from hrsa_salary_archive where tax_agent_id =扣缴义务人id and delete_type = 0) + + + +## 考勤引用 +drop sequence HRSA_ATTEND_QUOTE_ID +/ + +drop trigger HRSA_ATTEND_QUOTE_TRI +/ \ No newline at end of file diff --git a/src/com/engine/salary/action/CheckEditSIArchiveAction.java b/src/com/engine/salary/action/CheckEditSIArchiveAction.java index 2a0bbccb7..ed494aebe 100644 --- a/src/com/engine/salary/action/CheckEditSIArchiveAction.java +++ b/src/com/engine/salary/action/CheckEditSIArchiveAction.java @@ -80,6 +80,8 @@ public class CheckEditSIArchiveAction implements Action { } List> importData = new ArrayList<>(); importData.add(SalaryEntityUtil.convert2Map(list, CheckEditSIArchiveAction.SalaryField::getSalaryName, CheckEditSIArchiveAction.SalaryField::getValue)); + log.info("CheckEditSIArchiveAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importData); + //福利执行状态 String runStatus = list.stream().filter(f -> f.salaryName.equals("档案状态")).findFirst().map(CheckEditSIArchiveAction.SalaryField::getValue).orElse("1"); diff --git a/src/com/engine/salary/action/CheckEditSalaryAction.java b/src/com/engine/salary/action/CheckEditSalaryAction.java index f8c2dcb75..8534d665a 100644 --- a/src/com/engine/salary/action/CheckEditSalaryAction.java +++ b/src/com/engine/salary/action/CheckEditSalaryAction.java @@ -78,6 +78,7 @@ public class CheckEditSalaryAction implements Action { List> importData = new ArrayList<>(); importData.add(SalaryEntityUtil.convert2Map(list, SalaryField::getSalaryName, SalaryField::getValue)); + log.info("CheckEditSalaryAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importData); SalaryArchiveImportActionParam build = SalaryArchiveImportActionParam.builder() .importDatas(importData) .build(); diff --git a/src/com/engine/salary/action/CheckInitSalaryAction.java b/src/com/engine/salary/action/CheckInitSalaryAction.java index 157ecab8a..b744167dc 100644 --- a/src/com/engine/salary/action/CheckInitSalaryAction.java +++ b/src/com/engine/salary/action/CheckInitSalaryAction.java @@ -98,7 +98,7 @@ public class CheckInitSalaryAction implements Action { list.add(new SalaryField(processField, salaryName, value)); } Map importDataMap = SalaryEntityUtil.convert2Map(list, SalaryField::getSalaryName, SalaryField::getValue); - + log.info("CheckInitSalaryAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importDataMap); return doSalaryArchiveInit(requestInfo, importDataMap); } catch (Exception e) { log.error("定薪检查异常", e); diff --git a/src/com/engine/salary/action/CheckStayAddToPaySIArchiveAction.java b/src/com/engine/salary/action/CheckStayAddToPaySIArchiveAction.java index 6adfa8299..37ba3b7a0 100644 --- a/src/com/engine/salary/action/CheckStayAddToPaySIArchiveAction.java +++ b/src/com/engine/salary/action/CheckStayAddToPaySIArchiveAction.java @@ -89,6 +89,7 @@ public class CheckStayAddToPaySIArchiveAction implements Action { } // 流程数据 Map importDataMap = SalaryEntityUtil.convert2Map(list, CheckStayAddToPaySIArchiveAction.SalaryField::getSalaryName, CheckStayAddToPaySIArchiveAction.SalaryField::getValue); + log.info("CheckStayAddToPaySIArchiveAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importDataMap); String taxAgentName = importDataMap.getOrDefault("个税扣缴义务人", "").toString(); List taxAgentPOS = getTaxAgentMapper().listByName(taxAgentName); if(CollectionUtils.isEmpty(taxAgentPOS)){ diff --git a/src/com/engine/salary/action/CheckStayDelToStopSIArchiveAction.java b/src/com/engine/salary/action/CheckStayDelToStopSIArchiveAction.java index ef816fbd8..f467c0bbe 100644 --- a/src/com/engine/salary/action/CheckStayDelToStopSIArchiveAction.java +++ b/src/com/engine/salary/action/CheckStayDelToStopSIArchiveAction.java @@ -88,6 +88,7 @@ public class CheckStayDelToStopSIArchiveAction implements Action { } // 流程数据 Map importDataMap = SalaryEntityUtil.convert2Map(list, CheckStayDelToStopSIArchiveAction.SalaryField::getSalaryName, CheckStayDelToStopSIArchiveAction.SalaryField::getValue); + log.info("CheckStayDelToStopSIArchiveAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importDataMap); String taxAgentName = importDataMap.getOrDefault("个税扣缴义务人", "").toString(); List taxAgentPOS = getTaxAgentMapper().listByName(taxAgentName); if(CollectionUtils.isEmpty(taxAgentPOS)){ diff --git a/src/com/engine/salary/action/CheckStopSalaryAction.java b/src/com/engine/salary/action/CheckStopSalaryAction.java index 6243e6ed5..da42be210 100644 --- a/src/com/engine/salary/action/CheckStopSalaryAction.java +++ b/src/com/engine/salary/action/CheckStopSalaryAction.java @@ -92,6 +92,7 @@ public class CheckStopSalaryAction implements Action { } // 流程数据 Map importDataMap = SalaryEntityUtil.convert2Map(list, CheckStopSalaryAction.SalaryField::getSalaryName, CheckStopSalaryAction.SalaryField::getValue); + log.info("CheckStopSalaryAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importDataMap); String taxAgentName = importDataMap.getOrDefault("个税扣缴义务人", "").toString(); List taxAgentPOS = getTaxAgentMapper().listByName(taxAgentName); if(CollectionUtils.isEmpty(taxAgentPOS)){ diff --git a/src/com/engine/salary/action/CopyToPaySIArchiveAction.java b/src/com/engine/salary/action/CopyToPaySIArchiveAction.java index 8f0421c71..3de1dd620 100644 --- a/src/com/engine/salary/action/CopyToPaySIArchiveAction.java +++ b/src/com/engine/salary/action/CopyToPaySIArchiveAction.java @@ -88,6 +88,7 @@ public class CopyToPaySIArchiveAction implements Action { } List> importData = new ArrayList<>(); importData.add(SalaryEntityUtil.convert2Map(list, CopyToPaySIArchiveAction.SalaryField::getSalaryName, CopyToPaySIArchiveAction.SalaryField::getValue)); + log.info("CopyToPaySIArchiveAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importData); //操作人 String uid = list.stream().filter(f -> f.salaryName.equals("操作人")).findFirst().map(CopyToPaySIArchiveAction.SalaryField::getValue).orElse("1"); //增员 diff --git a/src/com/engine/salary/action/EditSIArchiveAction.java b/src/com/engine/salary/action/EditSIArchiveAction.java index 4cb6eb505..d29b4eac3 100644 --- a/src/com/engine/salary/action/EditSIArchiveAction.java +++ b/src/com/engine/salary/action/EditSIArchiveAction.java @@ -79,6 +79,7 @@ public class EditSIArchiveAction implements Action { } List> importData = new ArrayList<>(); importData.add(SalaryEntityUtil.convert2Map(list, EditSIArchiveAction.SalaryField::getSalaryName, EditSIArchiveAction.SalaryField::getValue)); + log.info("EditSIArchiveAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importData); //福利执行状态 String runStatus = list.stream().filter(f -> f.salaryName.equals("档案状态")).findFirst().map(EditSIArchiveAction.SalaryField::getValue).orElse("1"); diff --git a/src/com/engine/salary/action/EditSalaryAction.java b/src/com/engine/salary/action/EditSalaryAction.java index 3c8dd5446..b4be034b7 100644 --- a/src/com/engine/salary/action/EditSalaryAction.java +++ b/src/com/engine/salary/action/EditSalaryAction.java @@ -77,7 +77,7 @@ public class EditSalaryAction implements Action { } List> importData = new ArrayList<>(); importData.add(SalaryEntityUtil.convert2Map(list, SalaryField::getSalaryName, SalaryField::getValue)); - + log.info("EditSalaryAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importData); SalaryArchiveImportActionParam build = SalaryArchiveImportActionParam.builder() .importDatas(importData) .build(); diff --git a/src/com/engine/salary/action/EditToPaySIArchiveAction.java b/src/com/engine/salary/action/EditToPaySIArchiveAction.java index 31259e94a..4a68f0111 100644 --- a/src/com/engine/salary/action/EditToPaySIArchiveAction.java +++ b/src/com/engine/salary/action/EditToPaySIArchiveAction.java @@ -97,6 +97,7 @@ public class EditToPaySIArchiveAction implements Action { } List> importData = new ArrayList<>(); importData.add(SalaryEntityUtil.convert2Map(list, EditToPaySIArchiveAction.SalaryField::getSalaryName, EditToPaySIArchiveAction.SalaryField::getValue)); + log.info("EditToPaySIArchiveAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importData); //福利执行状态 String runStatus = EmployeeStatusEnum.STAY_ADD.getValue(); diff --git a/src/com/engine/salary/action/EditToStopSIArchiveAction.java b/src/com/engine/salary/action/EditToStopSIArchiveAction.java index 1f2a612fd..599548cef 100644 --- a/src/com/engine/salary/action/EditToStopSIArchiveAction.java +++ b/src/com/engine/salary/action/EditToStopSIArchiveAction.java @@ -97,6 +97,7 @@ public class EditToStopSIArchiveAction implements Action { } List> importData = new ArrayList<>(); importData.add(SalaryEntityUtil.convert2Map(list, EditToStopSIArchiveAction.SalaryField::getSalaryName, EditToStopSIArchiveAction.SalaryField::getValue)); + log.info("EditToStopSIArchiveAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importData); //福利执行状态 String runStatus = EmployeeStatusEnum.PAYING.getValue(); diff --git a/src/com/engine/salary/action/InitSalaryAction.java b/src/com/engine/salary/action/InitSalaryAction.java index af3ab875e..3600eb506 100644 --- a/src/com/engine/salary/action/InitSalaryAction.java +++ b/src/com/engine/salary/action/InitSalaryAction.java @@ -100,7 +100,7 @@ public class InitSalaryAction implements Action { } Map importDataMap = SalaryEntityUtil.convert2Map(list, SalaryField::getSalaryName, SalaryField::getValue); - + log.info("InitSalaryAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importDataMap); return doSalaryArchiveInit(requestInfo, importDataMap); } catch (Exception e) { log.error("定薪异常", e); diff --git a/src/com/engine/salary/action/RehireAction.java b/src/com/engine/salary/action/RehireAction.java index f0ac107f3..772d6ae9e 100644 --- a/src/com/engine/salary/action/RehireAction.java +++ b/src/com/engine/salary/action/RehireAction.java @@ -108,6 +108,7 @@ public class RehireAction implements Action { list.add(new SalaryField(processField, salaryName, value)); } Map salaryFieldMap = SalaryEntityUtil.convert2Map(list, SalaryField::getSalaryName, SalaryField::getValue); + log.info("RehireAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), salaryFieldMap); String taxAgentName = salaryFieldMap.getOrDefault("个税扣缴义务人", "").toString(); String empIdStr = salaryFieldMap.getOrDefault("员工id", "").toString(); if (StringUtils.isBlank(taxAgentName) || StringUtils.isBlank(empIdStr)) { diff --git a/src/com/engine/salary/action/StayAddToPaySIArchiveAction.java b/src/com/engine/salary/action/StayAddToPaySIArchiveAction.java index 371bdd8ee..8de687242 100644 --- a/src/com/engine/salary/action/StayAddToPaySIArchiveAction.java +++ b/src/com/engine/salary/action/StayAddToPaySIArchiveAction.java @@ -93,6 +93,7 @@ public class StayAddToPaySIArchiveAction implements Action { } // 流程数据 Map importDataMap = SalaryEntityUtil.convert2Map(list, StayAddToPaySIArchiveAction.SalaryField::getSalaryName, StayAddToPaySIArchiveAction.SalaryField::getValue); + log.info("StayAddToPaySIArchiveAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importDataMap); String taxAgentName = importDataMap.getOrDefault("个税扣缴义务人", "").toString(); List taxAgentPOS = getTaxAgentMapper().listByName(taxAgentName); if(CollectionUtils.isEmpty(taxAgentPOS)){ diff --git a/src/com/engine/salary/action/StayDelToStopSIArchiveAction.java b/src/com/engine/salary/action/StayDelToStopSIArchiveAction.java index b715b9eea..25ce39614 100644 --- a/src/com/engine/salary/action/StayDelToStopSIArchiveAction.java +++ b/src/com/engine/salary/action/StayDelToStopSIArchiveAction.java @@ -94,6 +94,7 @@ public class StayDelToStopSIArchiveAction implements Action { } // 流程数据 Map importDataMap = SalaryEntityUtil.convert2Map(list, StayDelToStopSIArchiveAction.SalaryField::getSalaryName, StayDelToStopSIArchiveAction.SalaryField::getValue); + log.info("StayDelToStopSIArchiveAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importDataMap); String taxAgentName = importDataMap.getOrDefault("个税扣缴义务人", "").toString(); List taxAgentPOS = getTaxAgentMapper().listByName(taxAgentName); if(CollectionUtils.isEmpty(taxAgentPOS)){ diff --git a/src/com/engine/salary/action/StopSalaryAction.java b/src/com/engine/salary/action/StopSalaryAction.java index 10d4d765a..9d564816b 100644 --- a/src/com/engine/salary/action/StopSalaryAction.java +++ b/src/com/engine/salary/action/StopSalaryAction.java @@ -99,6 +99,7 @@ public class StopSalaryAction implements Action { } // 流程数据 Map importDataMap = SalaryEntityUtil.convert2Map(list, StopSalaryAction.SalaryField::getSalaryName, StopSalaryAction.SalaryField::getValue); + log.info("StopSalaryAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importDataMap); //操作人 String uid = importDataMap.getOrDefault("操作人","1").toString(); User user = new User(Integer.parseInt(uid)); diff --git a/src/com/engine/salary/action/UpdateSISchemeDetailAction.java b/src/com/engine/salary/action/UpdateSISchemeDetailAction.java index 91c93c377..57a947a02 100644 --- a/src/com/engine/salary/action/UpdateSISchemeDetailAction.java +++ b/src/com/engine/salary/action/UpdateSISchemeDetailAction.java @@ -117,6 +117,7 @@ public class UpdateSISchemeDetailAction implements Action { rs.beforFirst(); // 流程数据 Map importDataMap = SalaryEntityUtil.convert2Map(list, UpdateSISchemeDetailAction.SalaryField::getSalaryName, UpdateSISchemeDetailAction.SalaryField::getValue); + log.info("UpdateSISchemeDetailAction,tableName :{},workflowid:{},流程参数:{}",tableName, requestInfo.getWorkflowid(), importDataMap); //设置更新对象元素 String schemeId = importDataMap.getOrDefault("福利方案id", "").toString(); String schemeName = importDataMap.getOrDefault("福利方案名称", "").toString(); diff --git a/src/com/engine/salary/entity/siexport/param/InsuranceExportParam.java b/src/com/engine/salary/entity/siexport/param/InsuranceExportParam.java index ae4cfc61a..461cd450c 100644 --- a/src/com/engine/salary/entity/siexport/param/InsuranceExportParam.java +++ b/src/com/engine/salary/entity/siexport/param/InsuranceExportParam.java @@ -45,4 +45,6 @@ public class InsuranceExportParam extends BaseQueryParam { private List taxAgents; private String workcode; + private List departmentIds; + private List subCompanyIds; } diff --git a/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationBO.java b/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationBO.java index 66aec4865..ec556480c 100644 --- a/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationBO.java +++ b/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationBO.java @@ -723,6 +723,7 @@ public class TaxDeclarationBO { private static String findStringValue(String fieldCode, Map> resultMap, Map salaryItemMap) { return resultMap.getOrDefault(salaryItemMap.getOrDefault(fieldCode, 0L), Collections.emptyList()).stream() .map(SalaryAcctResultPO::getResultValue) + .filter(Objects::nonNull) .findFirst().orElse(""); } diff --git a/src/com/engine/salary/mapper/InsuranceExportMapper.xml b/src/com/engine/salary/mapper/InsuranceExportMapper.xml index 3a5397af8..2e12b7755 100644 --- a/src/com/engine/salary/mapper/InsuranceExportMapper.xml +++ b/src/com/engine/salary/mapper/InsuranceExportMapper.xml @@ -23,6 +23,7 @@ LEFT JOIN hrmdepartment d ON d.id = e.departmentid LEFT JOIN hrmsubcompany c ON c.id = e.subcompanyid1 where e.status not in (7) + @@ -51,6 +52,7 @@ LEFT JOIN hrmdepartment d ON d.id = e.departmentid LEFT JOIN hrmsubcompany c ON c.id = e.subcompanyid1 where e.status not in (7) + @@ -79,6 +81,7 @@ LEFT JOIN hrmdepartment d ON d.id = e.departmentid LEFT JOIN hrmsubcompany c ON c.id = e.subcompanyid1 where e.status not in (7) + @@ -96,6 +99,7 @@ LEFT JOIN hrmresource e ON e.ID = a.employee_id LEFT JOIN hrmdepartment d ON d.id = e.departmentid where e.status not in (7) + @@ -147,6 +153,7 @@ LEFT JOIN hrmdepartment d ON d.id = e.departmentid LEFT JOIN hrmsubcompany c ON c.id = e.subcompanyid1 where e.status not in (7) + @@ -176,6 +183,7 @@ LEFT JOIN hrmdepartment d ON d.id = e.departmentid LEFT JOIN hrmsubcompany c ON c.id = e.subcompanyid1 where e.status not in (7) + @@ -205,6 +213,7 @@ LEFT JOIN hrmdepartment d ON d.id = e.departmentid LEFT JOIN hrmsubcompany c ON c.id = e.subcompanyid1 where e.status not in (7) + @@ -233,6 +242,7 @@ LEFT JOIN hrmdepartment d ON d.id = e.department_id LEFT JOIN hrmsubcompany c ON c.id = e.subcompany_id where e.status not in (7) + @@ -293,6 +305,7 @@ LEFT JOIN hrsa_external_employee e ON e.ID = a.employee_id LEFT JOIN hrmdepartment d ON d.id = e.department_id where e.status not in (7) + + + + + AND e.workcode like CONCAT('%',#{param.workcode},'%') + + + AND e.departmentid IN + + #{departmentId} + + + + AND e.subcompanyid1 IN + + #{subCompanyId} + + + + + + AND e.workcode like '%'||#{param.workcode}||'%' + + + AND e.departmentid IN + + #{departmentId} + + + + AND e.subcompanyid1 IN + + #{subCompanyId} + + + + + + + AND e.workcode like '%'+#{param.workcode}+'%' + + + AND e.departmentid IN + + #{departmentId} + + + + AND e.subcompanyid1 IN + + #{subCompanyId} + + + + + + + AND e.workcode like CONCAT('%',#{param.workcode},'%') + + + AND e.department_id IN + + #{departmentId} + + + + AND e.subcompany_id IN + + #{subCompanyId} + + + + + + + AND e.workcode like '%'||#{param.workcode}||'%' + + + AND e.department_id IN + + #{departmentId} + + + + AND e.subcompany_id IN + + #{subCompanyId} + + + + + + + AND e.workcode like '%'+#{param.workcode}+'%' + + + AND e.department_id IN + + #{departmentId} + + + + AND e.subcompany_id IN + + #{subCompanyId} + + + diff --git a/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.xml b/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.xml index 17229b2e9..3e8f2a2fc 100644 --- a/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.xml +++ b/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.xml @@ -620,9 +620,7 @@ - - when id=#{item.id} then #{item.payEndDate} - + when id=#{item.id} then #{item.payEndDate} @@ -650,9 +648,7 @@ pay_start_date=#{item.payStartDate}, - pay_end_date=#{item.payEndDate}, - WHERE id = #{item.id} AND delete_type = 0 diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml index 4870fdfde..6a5b265e1 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml @@ -632,7 +632,7 @@ AND t1.salary_month >= #{param.startSalaryMonth} - ORDER BY t1.id DESC + ORDER BY t1.salary_month DESC diff --git a/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.xml b/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.xml index 6bf5b3da9..7d4859ad4 100644 --- a/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.xml +++ b/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.xml @@ -377,7 +377,7 @@ WHERE 1=1 AND base.delete_type = 0 - AND base.employee_type is null + AND (base.employee_type is null or base.employee_type = 0) ORDER BY ${param.orderRule.orderRule} ${param.orderRule.ascOrDesc} diff --git a/src/com/engine/salary/report/service/impl/SalaryStatisticsEmployeeServiceImpl.java b/src/com/engine/salary/report/service/impl/SalaryStatisticsEmployeeServiceImpl.java index 19d0147ed..24db00d78 100644 --- a/src/com/engine/salary/report/service/impl/SalaryStatisticsEmployeeServiceImpl.java +++ b/src/com/engine/salary/report/service/impl/SalaryStatisticsEmployeeServiceImpl.java @@ -11,7 +11,6 @@ import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.salarysob.po.SalarySobPO; import com.engine.salary.entity.taxagent.param.TaxAgentQueryParam; -import com.engine.salary.entity.setting.param.PageListSettingQueryParam; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.UserStatusEnum; import com.engine.salary.enums.auth.AuthFilterTypeEnum; @@ -31,6 +30,8 @@ import com.engine.salary.service.*; import com.engine.salary.service.auth.AuthService; import com.engine.salary.service.auth.AuthServiceImpl; import com.engine.salary.service.impl.*; +import com.engine.salary.sys.service.SalarySysConfService; +import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.util.SalaryAssert; import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryEntityUtil; @@ -49,6 +50,8 @@ import weaver.hrm.User; import java.util.*; import java.util.stream.Collectors; +import static com.engine.salary.sys.constant.SalarySysConstant.REPORT_ORGANIZATIN_TYPE; + /** * 薪酬统计员工明细 *

Copyright: Copyright (c) 2022

@@ -103,6 +106,11 @@ public class SalaryStatisticsEmployeeServiceImpl extends Service implements Sala return ServiceUtil.getService(SettingServiceImpl.class, user); } + private SalarySysConfService getSalarySysConfService(User user) { + return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); + } + + private final boolean isRealOrg = "1".equals(getSalarySysConfService(user).getValueByCode(REPORT_ORGANIZATIN_TYPE)); @Override public PageInfo listPage(SalaryStatisticsEmployeeQueryParam queryParam) { List list = Collections.emptyList(); @@ -262,14 +270,22 @@ public class SalaryStatisticsEmployeeServiceImpl extends Service implements Sala map.put("salarySob", SalarySobMap.get(se.getSalarySobId())); map.put("acctTimes", salaryAcctRecordMap.get(se.getSalaryAcctRecordId())); map.put("userName", Util.null2String(emp.getUsername())); - map.put("subCompany", Util.null2String(emp.getSubcompanyName())); - map.put("department", Util.null2String(emp.getDepartmentName())); - map.put("jobTitle", Util.null2String(emp.getJobtitleName())); - map.put("status", Util.null2String(NumberUtil.isNumber(emp.getStatus()) ? SalaryEmployeeStatusEnum.parseByValue(Integer.valueOf(emp.getStatus())).getDefaultLabel() : null)); map.put("workCode", Util.null2String(emp.getWorkcode())); map.put("idNo", Util.null2String(emp.getIdNo())); map.put("companystartdate", Util.null2String(emp.getCompanystartdate())); + if(isRealOrg){ + map.put("subCompany", Util.null2String(emp.getSubcompanyName())); + map.put("department", Util.null2String(emp.getDepartmentName())); + map.put("jobTitle", Util.null2String(emp.getJobtitleName())); + map.put("status", Util.null2String(NumberUtil.isNumber(emp.getStatus()) ? SalaryEmployeeStatusEnum.parseByValue(Integer.valueOf(emp.getStatus())).getDefaultLabel() : null)); + }else { + map.put("subCompany", Util.null2String(se.getSubcompanyName())); + map.put("department", Util.null2String(se.getDepartmentName())); + map.put("jobTitle", Util.null2String(se.getJobtitleName())); + map.put("status", Util.null2String(NumberUtil.isNumber(se.getStatus()) ? SalaryEmployeeStatusEnum.parseByValue(Integer.valueOf(se.getStatus())).getDefaultLabel() : null)); + } + // IncomeCategoryEnum incomeCategoryEnum = IncomeCategoryEnum.parseByValue(Integer.parseInt(se.getIncomeCategory())); // map.put("incomeCategory", Objects.isNull(incomeCategoryEnum) ? "" : SalaryI18nUtil.getI18nLabel(incomeCategoryEnum.getLabelId(), incomeCategoryEnum.getDefaultLabel())); list.add(map); diff --git a/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java b/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java index a894213bb..6465e582a 100644 --- a/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java +++ b/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java @@ -525,7 +525,7 @@ public class SalaryStatisticsReportServiceImpl extends Service implements Salary throw new SalaryRunTimeException("该维度值中无数据!"); } // 同一个人放在一起 - listByDimensionValue = listByDimensionValue.stream().sorted(Comparator.comparing(SalaryAcctEmployeePO::getEmployeeId)).collect(Collectors.toList()); + listByDimensionValue = listByDimensionValue.stream().sorted((a,b)-> b.getSalaryMonth().compareTo(a.getSalaryMonth())).collect(Collectors.toList()); List salaryAcctEmployeePOList = SalaryPageUtil.subList(param.getCurrent(), param.getPageSize(), listByDimensionValue); // 获取此分页的核算人员 diff --git a/src/com/engine/salary/service/auth/AuthRoleServiceImpl.java b/src/com/engine/salary/service/auth/AuthRoleServiceImpl.java index e305b6833..cb437aac0 100644 --- a/src/com/engine/salary/service/auth/AuthRoleServiceImpl.java +++ b/src/com/engine/salary/service/auth/AuthRoleServiceImpl.java @@ -1,6 +1,7 @@ package com.engine.salary.service.auth; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.hrmelog.entity.dto.LoggerContext; @@ -63,6 +64,12 @@ public class AuthRoleServiceImpl extends Service implements AuthRoleService { public PageInfo roleList(AuthRoleListQueryParam param) { List authRolePOS = getAuthRoleMapper().list(param); + + String name = param.getName(); + if(StrUtil.isNotBlank(name)){ + authRolePOS = authRolePOS.stream().filter(po -> po.getName().contains(name)).collect(Collectors.toList()); + } + int total = authRolePOS.size(); List list = SalaryPageUtil.subList(param.getCurrent(), param.getPageSize(), authRolePOS) diff --git a/src/com/engine/salary/service/impl/AttendQuoteDataServiceImpl.java b/src/com/engine/salary/service/impl/AttendQuoteDataServiceImpl.java index 5c5e58bbf..50bd37d53 100644 --- a/src/com/engine/salary/service/impl/AttendQuoteDataServiceImpl.java +++ b/src/com/engine/salary/service/impl/AttendQuoteDataServiceImpl.java @@ -519,7 +519,7 @@ public class AttendQuoteDataServiceImpl extends Service implements AttendQuoteDa List> attendQuoteSyncData = new ArrayList<>(); Attend4Salary attend4Salary = new Attend4Salary(); try { - int partSize = 500; + int partSize = 100; List> partition = Lists.partition(employeeIds, partSize); for (List part : partition) { attend4Salary.setBeginDate(attendCycleRange.getFromDate()); diff --git a/src/com/engine/salary/service/impl/AttendQuoteFieldSettingServiceImpl.java b/src/com/engine/salary/service/impl/AttendQuoteFieldSettingServiceImpl.java index dd8eef639..a6b07bbaf 100644 --- a/src/com/engine/salary/service/impl/AttendQuoteFieldSettingServiceImpl.java +++ b/src/com/engine/salary/service/impl/AttendQuoteFieldSettingServiceImpl.java @@ -57,7 +57,7 @@ public class AttendQuoteFieldSettingServiceImpl extends Service implements Atten @Override public List list(AttendQuoteFieldSettingQueryParam queryParam) { //同步字段 - getAttendQuoteFieldService(user).syncAttendFields(); +// getAttendQuoteFieldService(user).syncAttendFields(); // 获取字段设置 List list = biz.getAttendQuoteFieldSetting(queryParam.getSourceType()); diff --git a/src/com/engine/salary/service/impl/RecordsBuildServiceImpl.java b/src/com/engine/salary/service/impl/RecordsBuildServiceImpl.java index 29ee07ccc..c6283dd16 100644 --- a/src/com/engine/salary/service/impl/RecordsBuildServiceImpl.java +++ b/src/com/engine/salary/service/impl/RecordsBuildServiceImpl.java @@ -93,7 +93,7 @@ public class RecordsBuildServiceImpl extends Service implements RecordsBuildServ Map collect = employeeByIds.stream().collect(Collectors.toMap(DataCollectionEmployee::getEmployeeId, Function.identity())); list.forEach(item -> { Map record = new HashMap<>(); - DataCollectionEmployee simpleEmployee = collect.get(item.getEmployeeId()); + DataCollectionEmployee simpleEmployee = collect.get(item.getEmployeeId()) ==null?new DataCollectionEmployee():collect.get(item.getEmployeeId()); record.put("id", item.getId()); record.put("employeeId", item.getEmployeeId()); record.put("billMonth", item.getBillMonth()); diff --git a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java index 8d97dbeaf..126873d58 100644 --- a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java @@ -1666,7 +1666,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { // Long taxAgentId = 0L; List list = new ArrayList<>(); - + String username = (String) map.getOrDefault("姓名", ""); String billMonth = (String) map.getOrDefault("账单月份", ""); String taxAgentName = (String) map.getOrDefault("个税扣缴义务人", ""); String supplementaryMonth = (String) map.getOrDefault("补缴月份", ""); @@ -1770,11 +1770,11 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { //校验补缴人员是否存在福利档案基础信息,并且runStatus处于正在缴纳或者待减员 InsuranceArchivesBaseInfoPO insuranceBaseInfo = getInsuranceBaseInfoMapper().getOneByEmployeeIdAndPayOrg(paymentOrganization, employeeId); if (insuranceBaseInfo == null || !(insuranceBaseInfo.getRunStatus().equals(EmployeeStatusEnum.STAY_DEL.getValue()) || insuranceBaseInfo.getRunStatus().equals(EmployeeStatusEnum.PAYING.getValue())) ) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "补缴人员中存在未设置福利档案人员或相关人员不在福利在缴人员中,不可新建补缴信息!")); + throw new SalaryRunTimeException(username + SalaryI18nUtil.getI18nLabel(0, "补缴未设置福利档案人员或不在福利在缴人员中,不可新建补缴信息!")); } List empIdsInPayMonthRange = listCanPayEmpIds(paymentOrganization, billMonth.substring(0, 7)); if (!empIdsInPayMonthRange.contains(employeeId)) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99920, "无核算人员")); + throw new SalaryRunTimeException(username + SalaryI18nUtil.getI18nLabel(99920, "无核算人员")); } DataCollectionEmployee employee = getSalaryEmployeeService(user).getEmployeeById(employeeId); // 封装InsuranceAccountDetailPO diff --git a/src/com/engine/salary/service/impl/SIRepairServiceImpl.java b/src/com/engine/salary/service/impl/SIRepairServiceImpl.java index 64758d625..79ae11524 100644 --- a/src/com/engine/salary/service/impl/SIRepairServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIRepairServiceImpl.java @@ -387,11 +387,15 @@ public class SIRepairServiceImpl extends Service implements SIRepairService { && (projects.contains(ProjectTypeEnum.MEDICAL_INSURANCE.getValue()))) { if (socialSchemePO != null && (StringUtils.isNotBlank(socialSchemePO.getSocialPaymentBaseString()) || StringUtils.isNotBlank(socialSchemePO.getSocialPaymentComBaseString()))) { Map socialMap = JSON.parseObject(socialSchemePO.getSocialPaymentBaseString(), new HashMap().getClass()); - socialMap = socialMap.entrySet().stream().filter(e -> "9001".equals(e.getKey()) || "9002".equals(e.getKey())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + if(socialMap!=null){ + socialMap = socialMap.entrySet().stream().filter(e -> "9001".equals(e.getKey()) || "9002".equals(e.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } Map socialComMap = JSON.parseObject(socialSchemePO.getSocialPaymentComBaseString(), new HashMap().getClass()); - socialComMap = socialComMap.entrySet().stream().filter(e -> "9001".equals(e.getKey()) || "9002".equals(e.getKey())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + if(socialComMap!=null){ + socialComMap = socialComMap.entrySet().stream().filter(e -> "9001".equals(e.getKey()) || "9002".equals(e.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } List socialIds = new ArrayList<>(); socialIds.addAll(socialMap == null ? Collections.emptyList() : socialMap.keySet()); socialIds.addAll(socialComMap == null ? Collections.emptyList() : socialMap.keySet()); @@ -434,12 +438,16 @@ public class SIRepairServiceImpl extends Service implements SIRepairService { && (!projects.contains(ProjectTypeEnum.MEDICAL_INSURANCE.getValue()))) { if (socialSchemePO != null && (StringUtils.isNotBlank(socialSchemePO.getSocialPaymentBaseString()) || StringUtils.isNotBlank(socialSchemePO.getSocialPaymentComBaseString()))) { Map socialMap = JSON.parseObject(socialSchemePO.getSocialPaymentBaseString(), new HashMap().getClass()); - socialMap = socialMap.entrySet().stream().filter(e -> "9001".equals(e.getKey())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + if (socialMap != null) { + socialMap = socialMap.entrySet().stream().filter(e -> "9001".equals(e.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } Map socialComMap = JSON.parseObject(socialSchemePO.getSocialPaymentComBaseString(), new HashMap().getClass()); - socialComMap = socialComMap.entrySet().stream().filter(e -> "9001".equals(e.getKey())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + if (socialComMap != null) { + socialComMap = socialComMap.entrySet().stream().filter(e -> "9001".equals(e.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } List socialIds = new ArrayList<>(); socialIds.addAll(socialMap == null ? Collections.emptyList() : socialMap.keySet()); socialIds.addAll(socialComMap == null ? Collections.emptyList() :socialComMap.keySet()); @@ -482,11 +490,15 @@ public class SIRepairServiceImpl extends Service implements SIRepairService { && (projects.contains(ProjectTypeEnum.MEDICAL_INSURANCE.getValue()))) { if (socialSchemePO != null && (StringUtils.isNotBlank(socialSchemePO.getSocialPaymentBaseString()) || StringUtils.isNotBlank(socialSchemePO.getSocialPaymentComBaseString()))) { Map socialMap = JSON.parseObject(socialSchemePO.getSocialPaymentBaseString(), new HashMap().getClass()); - socialMap = socialMap.entrySet().stream().filter(e -> "9002".equals(e.getKey())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + if(socialMap!=null){ + socialMap = socialMap.entrySet().stream().filter(e -> "9002".equals(e.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } Map socialComMap = JSON.parseObject(socialSchemePO.getSocialPaymentComBaseString(), new HashMap().getClass()); - socialComMap = socialComMap.entrySet().stream().filter(e -> "9002".equals(e.getKey())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + if(socialComMap !=null){ + socialComMap = socialComMap.entrySet().stream().filter(e -> "9002".equals(e.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } List socialIds = new ArrayList<>(); socialIds.addAll(socialMap == null ? Collections.emptyList() : socialMap.keySet()); socialIds.addAll(socialComMap == null ? Collections.emptyList() : socialComMap.keySet()); diff --git a/src/com/engine/salary/service/impl/SISchemeServiceImpl.java b/src/com/engine/salary/service/impl/SISchemeServiceImpl.java index 0484a1079..35f207e4d 100644 --- a/src/com/engine/salary/service/impl/SISchemeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SISchemeServiceImpl.java @@ -2473,6 +2473,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { * @param employeeId */ public String update(InsuranceSchemeReqParam updateParam, long employeeId) { + log.info("福利方案更新参数:{}", updateParam); //查询是否存在福利方案 InsuranceSchemePO insuranceSchemePO = getById(updateParam.getInsuranceScheme().getId()); if (Objects.isNull(insuranceSchemePO)) { @@ -2506,6 +2507,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { //更新福利方案主表 InsuranceSchemePO insuranceSchemePO1 = InsuranceSchemeBO.buildInsuranceSchemePO(insuranceSchemePO, updateParam.getInsuranceScheme()); getInsuranceSchemeMapper().update(insuranceSchemePO1); + log.info("福利方案更新主表:{}", insuranceSchemePO1); //记录主表操作日志 loggerContext.setNewValues(insuranceSchemePO1); SalaryElogConfig.siSchemeLoggerTemplate.write(loggerContext); @@ -2529,6 +2531,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { //更新福利方案明细表 先删后插 getInsuranceSchemeDetailMapper().batchDeleteByPrimaryIds(Collections.singleton(updateParam.getInsuranceScheme().getId())); //更新明细表 + log.info("福利方案更新明细表:{}", insuranceSchemeDetailPOS); encryptUtil.encryptList(insuranceSchemeDetailPOS, InsuranceSchemeDetailPO.class); insuranceSchemeDetailPOS.forEach(getInsuranceSchemeDetailMapper()::insert); diff --git a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java index f869556b8..14f37ceae 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java @@ -1439,7 +1439,7 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc loggerContext.setOperateType(OperateTypeEnum.EXCEL_IMPORT.getValue()); loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(0, "导入薪资核算数据")); loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(0, "导入薪资核算数据 ") + targetName); - loggerContext.setOldValueList(list4log); + loggerContext.setNewValueList(list4log); SalaryElogConfig.salaryAcctRecordLoggerTemplate.write(loggerContext); // //报表 diff --git a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java index 254208b86..6f16c59b1 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java @@ -638,9 +638,9 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98819, "薪资核算结果还未归档,可直接核算")); } // 税款所在年的日期范围(第一天~最后一天) - LocalDateRange yearRange = SalaryDateUtil.localDate2YearRange(salaryAcctRecordPO.getSalaryMonth()); + LocalDateRange yearRange = SalaryDateUtil.localDate2YearRange(salaryAcctRecordPO.getTaxCycle()); if (Objects.isNull(yearRange)) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "薪资所属月为空")); + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "税款所属期为空")); } // 查询税款所在年的该个税扣缴义务人所有薪资核算记录 // 获取账套所属个税扣缴义务人的核算记录 @@ -657,13 +657,13 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe if (!taxDeclarationFunctionEnum.getValue().equals(TaxDeclarationFunctionEnum.CLOSURE.getValue())) { // 如果已经存在之后月份的薪资核算记录了,就不允许重新核算本月了 SalaryAcctRecordPO afterSalaryAcctRecordPO = selfSalaryAcctRecordPOS.stream() - .filter(po -> po.getSalaryMonth().compareTo(salaryAcctRecordPO.getSalaryMonth()) > 0) + .filter(po -> po.getTaxCycle().compareTo(salaryAcctRecordPO.getTaxCycle()) > 0) .findAny() .orElse(null); if (Objects.nonNull(afterSalaryAcctRecordPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(105826, "已经存在{0}的薪资核算记录了,不能重新核算{1}的薪资了") - .replace("{0}", SalaryDateUtil.localDate2YearMonth(afterSalaryAcctRecordPO.getSalaryMonth()).toString()) - .replace("{1}", SalaryDateUtil.localDate2YearMonth(salaryAcctRecordPO.getSalaryMonth()).toString())); + .replace("{0}", SalaryDateUtil.localDate2YearMonth(afterSalaryAcctRecordPO.getTaxCycle()).toString()) + .replace("{1}", SalaryDateUtil.localDate2YearMonth(salaryAcctRecordPO.getTaxCycle()).toString())); } } diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index 7763eba91..581e64149 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -326,14 +326,25 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe if (CollectionUtils.isNotEmpty(otherConditions)) { List items = SalaryEntityUtil.properties(otherConditions, SalaryAcctResultQueryParam.OtherCondition::getItemId, Collectors.toList()); List list = listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singletonList(queryParam.getSalaryAcctRecordId()), items); - for (int i = 0; i < otherConditions.size(); i++) { - SalaryAcctResultQueryParam.OtherCondition otherCondition = otherConditions.get(i); - Long itemId = otherCondition.getItemId(); - FilterEnum filter = otherCondition.getFilter(); - List params = otherCondition.getParams(); - list = list.stream().filter(a -> Objects.equals(a.getSalaryItemId(), itemId)).filter(a -> filter.filter(params).test(a.getResultValue())).collect(Collectors.toList()); + Map> acctEmpResultsMap = SalaryEntityUtil.group2Map(list, SalaryAcctResultPO::getSalaryAcctEmpId); + Set removeAcctEmpIds = new HashSet<>(); + for (Long acctEmpId : acctEmpResultsMap.keySet()) { + List acctEmpResults = acctEmpResultsMap.get(acctEmpId); + //如果有一个条件不成立就删除 + for (int i = 0; i < otherConditions.size(); i++) { + SalaryAcctResultQueryParam.OtherCondition otherCondition = otherConditions.get(i); + Long itemId = otherCondition.getItemId(); + FilterEnum filter = otherCondition.getFilter(); + List params = otherCondition.getParams(); + for (SalaryAcctResultPO po : acctEmpResults) { + if(Objects.equals(po.getSalaryItemId(), itemId) && !filter.filter(params).test(po.getResultValue())){ + removeAcctEmpIds.add(po.getSalaryAcctEmpId()); + } + } + } } - List salaryAcctEmpId = SalaryEntityUtil.properties(list, SalaryAcctResultPO::getSalaryAcctEmpId, Collectors.toList()); + acctEmpResultsMap.keySet().removeAll(removeAcctEmpIds); + List salaryAcctEmpId = Lists.newArrayList(acctEmpResultsMap.keySet()); if (CollectionUtils.isEmpty(salaryAcctEmpId)) { //条件不满足直接返回空列表 diff --git a/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java b/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java index 349a28d42..101f49c6d 100644 --- a/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java @@ -1,5 +1,6 @@ package com.engine.salary.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.NumberUtil; import com.alibaba.fastjson.JSON; import com.api.formmode.mybatis.util.SqlProxyHandle; @@ -174,7 +175,7 @@ public class SalaryEmployeeServiceImpl extends Service implements SalaryEmployee } //外部人员 - if(hasExtEmp){ + if (hasExtEmp) { List salarySobExtRangePOS = getSalarySobExtRangeService(user).listBySalarySobId(salarySobId); if (CollectionUtils.isNotEmpty(salarySobExtRangePOS)) { List ids = SalaryEntityUtil.properties(salarySobExtRangePOS, SalarySobExtRangePO::getTargetId, Collectors.toList()); @@ -418,20 +419,24 @@ public class SalaryEmployeeServiceImpl extends Service implements SalaryEmployee result.addAll(employBiz.listByVirtualParams(virtualParams)); - List empIds = new ArrayList<>(); - includeQueryParams.stream() - .filter(param -> param.getTargetType().equals(TargetTypeEnum.SQL.name())) - .forEach(param -> { - String sql = param.getTarget(); - RecordSet rs = new RecordSet(); - if (rs.execute(sql)) { - while (rs.next()) { - empIds.add((long) rs.getInt("id")); - } + for (SalarySobRangeEmpQueryParam param:includeQueryParams) { + if(param.getTargetType().equals(TargetTypeEnum.SQL.name())){ + List empIds = new ArrayList<>(); + String sql = param.getTarget(); + RecordSet rs = new RecordSet(); + if (rs.execute(sql)) { + while (rs.next()) { + empIds.add((long) rs.getInt("id")); } - }); - List employees = getSalaryEmployeeService(user).getEmployeeByIdsAll(empIds); - result.addAll(employees); + } + if(CollUtil.isNotEmpty(empIds)){ + Collection employeeStatus = param.getEmployeeStatus(); + List employeeByIdsAll = getSalaryEmployeeService(user).getEmployeeByIdsAll(empIds); + List collect = employeeByIdsAll.stream().filter(e -> employeeStatus.contains(e.getStatus())).collect(Collectors.toList()); + result.addAll(collect); + } + } + } // 从hrmresource和hrmresourcevirtual可能获取到重复人员数据,需要根据人员id去重 result = result.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparingLong(DataCollectionEmployee::getEmployeeId))), ArrayList::new)); diff --git a/src/com/engine/salary/util/SalaryEntityUtil.java b/src/com/engine/salary/util/SalaryEntityUtil.java index 0b2a6d474..03cc7c8df 100644 --- a/src/com/engine/salary/util/SalaryEntityUtil.java +++ b/src/com/engine/salary/util/SalaryEntityUtil.java @@ -135,6 +135,15 @@ public class SalaryEntityUtil { .collect(Collectors.toMap(keyMapper, valueMapper, (a, b) -> a)); } + public static Map convert2LinkedMap(Collection objs, Function keyMapper, Function valueMapper) { + if (CollectionUtils.isEmpty(objs)) { + return Maps.newHashMap(); + } + return objs.stream() + .filter(e -> valueMapper.apply(e) != null && keyMapper.apply(e) != null) + .collect(Collectors.toMap(keyMapper, valueMapper, (a, b) -> a, LinkedHashMap::new)); + } + public static Map> group2Map(Collection objs, Function function) { if (CollectionUtils.isEmpty(objs)) { return Maps.newHashMap(); diff --git a/src/com/engine/salary/util/SalaryTokenUtil.java b/src/com/engine/salary/util/SalaryTokenUtil.java index 653a0a821..57553dd45 100644 --- a/src/com/engine/salary/util/SalaryTokenUtil.java +++ b/src/com/engine/salary/util/SalaryTokenUtil.java @@ -6,6 +6,7 @@ import com.engine.salary.encrypt.AESEncryptUtil; import com.engine.salary.entity.salaryBill.param.SalaryBillGetTokenParam; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.util.db.IdGenerator; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import weaver.conn.RecordSet; import weaver.general.BaseBean; @@ -23,6 +24,7 @@ import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; +@Slf4j public class SalaryTokenUtil { /** @@ -99,15 +101,18 @@ public class SalaryTokenUtil { // 获取appid的id String appidId = baseBean.getPropValue("hrmSalaryBillToken", "appid_id"); if (StringUtils.isBlank(appidId)) { + resultMap.put("msg", "appid_id为空"); return resultMap; } String ip = baseBean.getPropValue("hrmSalaryBillToken", "ip"); - rs.execute("select APPID from ECOLOGY_BIZ_EC where id =" + appidId); + String appidSql = String.format("select APPID from ECOLOGY_BIZ_EC where id ='%s'", appidId); + rs.execute(appidSql); // 获取appid String appid =""; if (rs.next() && StringUtils.isNotEmpty(rs.getString("APPID"))) { appid = rs.getString("APPID"); } else { + resultMap.put("msg", "APPID为空,sql:"+appidSql); return resultMap; } String sql= " SELECT conf_value FROM hrsa_salary_sys_conf t WHERE delete_type = 0 AND conf_key = 'SALARY_TOKEN_SECRET'"; @@ -126,28 +131,37 @@ public class SalaryTokenUtil { heads.put("appid", appid); heads.put("cpk", cpk); // 调用ECOLOGY系统接口进行注册 - String data = post(httpKey + ip + "/api/ec/dev/auth/regist", null, heads); + String url = httpKey + ip + "/api/ec/dev/auth/regist"; + String data = post(url , null, heads); Map datas = JSONObject.parseObject(data, new TypeReference>() {}); + log.info("GetToken regist url {} ,heads {}, data: {}",url ,heads, data); // ECOLOGY返回的系统公钥 String spk = (String) (datas.get("spk")); RSA rsa = new RSA(); // 对秘钥进行加密传输,防止篡改数据 secret = rsa.encrypt(null, (String) (datas.get("secrit")), null, "utf-8", spk, false); // secret存库 - String date = SalaryDateUtil.getFormatLocalDateTime(LocalDateTime.now()); - sql = String.format("insert into hrsa_salary_sys_conf(id, conf_key, conf_value, title, module, order_weight, delete_type, create_time, update_time) values (%s,'%s','%s','%s','%s',%s,%s,'%s','%s')", + String date = "'"+SalaryDateUtil.getFormatLocalDateTime(LocalDateTime.now())+"'"; + if(rs.getDBType().equalsIgnoreCase("oracle")){ + date = String.format("to_date(%s,'yyyy-mm-dd hh24:mi:ss')", date); + } + sql = String.format("insert into hrsa_salary_sys_conf(id, conf_key, conf_value, title, module, order_weight, delete_type, create_time, update_time) values (%s,'%s','%s','%s','%s',%s,%s,%s,%s)", IdGenerator.generate(), "SALARY_TOKEN_SECRET", secret, "token", "basic",0,0,date,date); rs.execute(sql); + log.info("GetToken regist secret , sql: {}", sql); // 保存spk - sql = String.format("insert into hrsa_salary_sys_conf(id, conf_key, conf_value, title, module, order_weight, delete_type, create_time, update_time) values (%s,'%s','%s','%s','%s',%s,%s,'%s','%s')", + sql = String.format("insert into hrsa_salary_sys_conf(id, conf_key, conf_value, title, module, order_weight, delete_type, create_time, update_time) values (%s,'%s','%s','%s','%s',%s,%s,%s,%s)", IdGenerator.generate(), "SALARY_TOKEN_SPK", spk, "spk", "basic",0,0,date,date); rs.execute(sql); + log.info("GetToken regist spk , sql: {}", sql); } //封装参数到请求头 heads.put("appid", appid); heads.put("secret", secret); //调用ECOLOGY系统接口进行注册 - String data2 = post(httpKey + ip + "/api/ec/dev/auth/applytoken", null, heads); + String url = httpKey + ip + "/api/ec/dev/auth/applytoken"; + String data2 = post(url, null, heads); + log.info("GetToken=====applytoken url {} ,heads {}, data: {}",url ,heads, data2); // 通过第一步注册许可时返回spk公钥对userid进行加密生成的密文 sql= " SELECT conf_value FROM hrsa_salary_sys_conf t WHERE delete_type = 0 AND conf_key = 'SALARY_TOKEN_SPK'"; rs.execute(sql); diff --git a/src/com/engine/salary/web/SIExportController.java b/src/com/engine/salary/web/SIExportController.java index f3636c8dd..cb92e0d1f 100644 --- a/src/com/engine/salary/web/SIExportController.java +++ b/src/com/engine/salary/web/SIExportController.java @@ -112,8 +112,14 @@ public class SIExportController { @Path("/common/export") @Produces(MediaType.APPLICATION_OCTET_STREAM) public Response exportAccount(@Context HttpServletRequest request, @Context HttpServletResponse response, - @QueryParam("billMonth") String billMonth,@QueryParam("paymentOrganization") String paymentOrganization) { - InsuranceExportParam param = InsuranceExportParam.builder().billMonth(billMonth).paymentOrganization(paymentOrganization).build(); + @QueryParam("billMonth") String billMonth,@QueryParam("paymentOrganization") String paymentOrganization,@QueryParam("departmentIds") String departmentIds,@QueryParam("subCompanyIds") String subCompanyIds,@QueryParam("workcode") String workcode) { + InsuranceExportParam param = InsuranceExportParam.builder().billMonth(billMonth).paymentOrganization(paymentOrganization).workcode(workcode).build(); + if(StringUtils.isNotBlank(departmentIds)){ + param.setDepartmentIds(Arrays.stream(departmentIds.split(",")).map(Long::parseLong).collect(Collectors.toList())); + } + if(StringUtils.isNotBlank(subCompanyIds)){ + param.setSubCompanyIds(Arrays.stream(subCompanyIds.split(",")).map(Long::parseLong).collect(Collectors.toList())); + } User user = HrmUserVarify.getUser(request, response); XSSFWorkbook workbook = getSIExportWrapper(user).exportAccount(PaymentStatusEnum.COMMON.getValue(),param); String time = LocalDate.now().toString(); diff --git a/src/com/engine/salary/web/SalaryBillController.java b/src/com/engine/salary/web/SalaryBillController.java index ab505d1ce..23e06b6ee 100644 --- a/src/com/engine/salary/web/SalaryBillController.java +++ b/src/com/engine/salary/web/SalaryBillController.java @@ -485,7 +485,7 @@ public class SalaryBillController { @Produces(MediaType.APPLICATION_JSON) public String batGrant(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySendBatParam queryParam) { User user = HrmUserVarify.getUser(request, response); - return new ResponseResult>(user).run(getSalarySendWrapper(user)::batGrant, queryParam); + return new ResponseResult(user).run(getSalarySendWrapper(user)::batGrant, queryParam); } /** @@ -499,7 +499,7 @@ public class SalaryBillController { @Produces(MediaType.APPLICATION_JSON) public String batWithdraw(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySendBatParam queryParam) { User user = HrmUserVarify.getUser(request, response); - return new ResponseResult>(user).run(getSalarySendWrapper(user)::batWithdraw, queryParam); + return new ResponseResult(user).run(getSalarySendWrapper(user)::batWithdraw, queryParam); } diff --git a/src/com/engine/salary/wrapper/SalarySendWrapper.java b/src/com/engine/salary/wrapper/SalarySendWrapper.java index cf263db9d..44c8d16fa 100644 --- a/src/com/engine/salary/wrapper/SalarySendWrapper.java +++ b/src/com/engine/salary/wrapper/SalarySendWrapper.java @@ -117,9 +117,9 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy list.forEach(dto -> { // 回算过,但是查看的是普通工资单(不能查看详情);回算过,但是查看的是回算工资单(可以发);记录没回算过(可以发) - if(Objects.equals(dto.getSalaryAcctRecordType(), NumberUtils.INTEGER_ONE) && Objects.equals(dto.getSalaryAcctType(),NumberUtils.INTEGER_ZERO)){ + if (Objects.equals(dto.getSalaryAcctRecordType(), NumberUtils.INTEGER_ONE) && Objects.equals(dto.getSalaryAcctType(), NumberUtils.INTEGER_ZERO)) { dto.setCanSeeDetail(false); - }else{ + } else { dto.setCanSeeDetail(true); } }); @@ -142,7 +142,7 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy e.setTemplate(NumberUtils.INTEGER_ONE.equals(e.getSalaryAcctType()) ? salaryTemplatePO.getReplenishName() : salaryTemplatePO.getName()); e.setTemplateId(salaryTemplatePO.getId()); if ((salaryTemplatePO.getAckFeedbackStatus() != null && salaryTemplatePO.getAckFeedbackStatus() == 1) || - (salaryTemplatePO.getFeedbackStatus() != null && salaryTemplatePO.getFeedbackStatus() == 1) ) { + (salaryTemplatePO.getFeedbackStatus() != null && salaryTemplatePO.getFeedbackStatus() == 1)) { e.setAckFeedbackStatus(1); } else { e.setAckFeedbackStatus(0); @@ -688,6 +688,7 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy /** * 发送短信验证码 + * * @param param 短信验证码发送参数 */ public void sendMobileCode(SMSCodeSendParam param) { @@ -696,6 +697,7 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy /** * 校验短信验证码 + * * @param param * @return */ @@ -706,7 +708,7 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy public PayrollCheckTypeEnum payrollCheckType() { SalarySysConfPO conf = getSalarySysConfService(user).getOneByCode(SalarySysConstant.SALARY_PAYROLL_CHECK_TYPE); - if(conf == null){ + if (conf == null) { return PayrollCheckTypeEnum.PWD; } @@ -714,14 +716,14 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy } public void confirmSalaryBill(Long salaryInfoId) { - if(ObjectUtil.isNull(salaryInfoId)){ + if (ObjectUtil.isNull(salaryInfoId)) { throw new SalaryRunTimeException("工资单id不能为空!"); } getSalaryBillService(user).confirmSalaryBill(salaryInfoId); } public void feedBackSalaryBill(Long salaryInfoId) { - if(ObjectUtil.isNull(salaryInfoId)){ + if (ObjectUtil.isNull(salaryInfoId)) { throw new SalaryRunTimeException("工资单id不能为空!"); } getSalaryBillService(user).feedBackSalaryBill(salaryInfoId); @@ -740,26 +742,48 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy } - public void batGrant(SalarySendBatParam param) { + public String batGrant(SalarySendBatParam param) { List salarySendIds = param.getSalarySendIds(); + int successCount = 0; + int failCount = 0; + String failMsg = ""; for (int i = 0; i < salarySendIds.size(); i++) { - Long sendId = salarySendIds.get(i); - SalarySendGrantParam grantParam = SalarySendGrantParam.builder() - .salarySendId(sendId) - .build(); - grant(grantParam); + try { + Long sendId = salarySendIds.get(i); + SalarySendGrantParam grantParam = SalarySendGrantParam.builder() + .salarySendId(sendId) + .build(); + grant(grantParam); + successCount++; + } catch (Exception e) { + failCount++; + failMsg = failMsg + "第" + (i + 1) + "个发放失败!失败原因:" + e.getMessage() + "\n"; + } } + + return String.format("成功:" + successCount + "个,失败:" + failCount + "个%s", failCount == 0 ? "" : ",失败原因:" + failMsg); } - public void batWithdraw(SalarySendBatParam param) { + + public String batWithdraw(SalarySendBatParam param) { List salarySendIds = param.getSalarySendIds(); + int successCount = 0; + int failCount = 0; + String failMsg = ""; for (int i = 0; i < salarySendIds.size(); i++) { - Long sendId = salarySendIds.get(i); - SalarySendWithdrawParam grantParam = SalarySendWithdrawParam.builder() - .salarySendId(sendId) - .build(); - withdraw(grantParam); + try { + Long sendId = salarySendIds.get(i); + SalarySendWithdrawParam grantParam = SalarySendWithdrawParam.builder() + .salarySendId(sendId) + .build(); + withdraw(grantParam); + } catch (Exception e) { + failCount++; + failMsg = failMsg + "第" + (i + 1) + "个撤回失败!失败原因:" + e.getMessage() + "\n"; + } + } + return String.format("成功:" + successCount + "个,失败:" + failCount + "个%s", failCount == 0 ? "" : ",失败原因:" + failMsg); } }