diff --git a/hs_err_pid30284.log b/hs_err_pid30284.log new file mode 100644 index 000000000..f1e7b3564 --- /dev/null +++ b/hs_err_pid30284.log @@ -0,0 +1,227 @@ +# +# There is insufficient memory for the Java Runtime Environment to continue. +# Native memory allocation (mmap) failed to map 266338304 bytes for G1 virtual space +# Possible reasons: +# The system is out of physical RAM or swap space +# The process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap +# Possible solutions: +# Reduce memory load on the system +# Increase physical memory or swap space +# Check if swap backing store is full +# Decrease Java heap size (-Xmx/-Xms) +# Decrease number of Java threads +# Decrease Java thread stack sizes (-Xss) +# Set larger code cache with -XX:ReservedCodeCacheSize= +# JVM is running with Zero Based Compressed Oops mode in which the Java heap is +# placed in the first 32GB address space. The Java Heap base address is the +# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress +# to set the Java Heap base and to place the Java Heap above 32GB virtual address. +# This output file may be truncated or incomplete. +# +# Out of Memory Error (os_windows.cpp:3760), pid=30284, tid=21544 +# +# JRE version: (17.0.5+1) (build ) +# Java VM: OpenJDK 64-Bit Server VM (17.0.5+1-b653.25, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64) +# No core dump will be written. Minidumps are not enabled by default on client versions of Windows +# + +--------------- S U M M A R Y ------------ + +Command Line: git4idea.http.GitAskPassApp Username for 'http://221.226.25.34:3000': + +Host: 11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz, 8 cores, 15G, Windows 11 , 64 bit Build 22621 (10.0.22621.4830) +Time: Mon Feb 24 15:33:51 2025 Windows 11 , 64 bit Build 22621 (10.0.22621.4830) elapsed time: 0.020249 seconds (0d 0h 0m 0s) + +--------------- T H R E A D --------------- + +Current thread (0x000001b6ee9a34a0): JavaThread "Unknown thread" [_thread_in_vm, id=21544, stack(0x0000009c6f900000,0x0000009c6fa00000)] + +Stack: [0x0000009c6f900000,0x0000009c6fa00000] +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +V [jvm.dll+0x6830ca] +V [jvm.dll+0x83f4c4] +V [jvm.dll+0x840c6e] +V [jvm.dll+0x8412d3] +V [jvm.dll+0x2490b5] +V [jvm.dll+0x67ff99] +V [jvm.dll+0x6744aa] +V [jvm.dll+0x308f2b] +V [jvm.dll+0x3103e6] +V [jvm.dll+0x36013e] +V [jvm.dll+0x36036f] +V [jvm.dll+0x2df018] +V [jvm.dll+0x2dff84] +V [jvm.dll+0x810d91] +V [jvm.dll+0x36df31] +V [jvm.dll+0x7f028c] +V [jvm.dll+0x3f0cbf] +V [jvm.dll+0x3f2801] +C [jli.dll+0x526b] +C [ucrtbase.dll+0x29333] +C [KERNEL32.DLL+0x1259d] +C [ntdll.dll+0x5af38] + + +--------------- P R O C E S S --------------- + +Threads class SMR info: +_java_thread_list=0x00007fffe27c8f98, length=0, elements={ +} + +Java Threads: ( => current thread ) + +Other Threads: + 0x000001b6eea0e1c0 GCTaskThread "GC Thread#0" [stack: 0x0000009c6fa00000,0x0000009c6fb00000] [id=18760] + 0x000001b6eea1ee90 ConcurrentGCThread "G1 Main Marker" [stack: 0x0000009c6fb00000,0x0000009c6fc00000] [id=25016] + 0x000001b6eea1f8a0 ConcurrentGCThread "G1 Conc#0" [stack: 0x0000009c6fc00000,0x0000009c6fd00000] [id=21972] + +[error occurred during error reporting (printing all threads), id 0xc0000005, EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007fffe1f7fbd7] + +VM state: not at safepoint (not fully initialized) + +VM Mutex/Monitor currently owned by a thread: ([mutex/lock_event]) +[0x000001b6ee99fba0] Heap_lock - owner thread: 0x000001b6ee9a34a0 + +Heap address: 0x0000000702600000, size: 4058 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 + +CDS archive(s) mapped at: [0x0000000000000000-0x0000000000000000-0x0000000000000000), size 0, SharedBaseAddress: 0x0000000800000000, ArchiveRelocationMode: 0. +Narrow klass base: 0x0000000000000000, Narrow klass shift: 0, Narrow klass range: 0x0 + +GC Precious Log: + + +Heap: + garbage-first heap total 0K, used 0K [0x0000000702600000, 0x0000000800000000) + region size 2048K, 0 young (0K), 0 survivors (0K) + +[error occurred during error reporting (printing heap information), id 0xc0000005, EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007fffe236cd59] + +GC Heap History (0 events): +No events + +Dll operation events (1 events): +Event: 0.013 Loaded shared library C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.4\jbr\bin\java.dll + +Deoptimization events (0 events): +No events + +Classes unloaded (0 events): +No events + +Classes redefined (0 events): +No events + +Internal exceptions (0 events): +No events + +VM Operations (0 events): +No events + +Events (0 events): +No events + + +Dynamic libraries: +0x00007ff6c4cb0000 - 0x00007ff6c4cba000 C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.4\jbr\bin\java.exe +0x00007ff860150000 - 0x00007ff860367000 C:\WINDOWS\SYSTEM32\ntdll.dll +0x00007ff85df50000 - 0x00007ff85e014000 C:\WINDOWS\System32\KERNEL32.DLL +0x00007ff85d600000 - 0x00007ff85d9d0000 C:\WINDOWS\System32\KERNELBASE.dll +0x00007ff85d9d0000 - 0x00007ff85dae1000 C:\WINDOWS\System32\ucrtbase.dll +0x00007ff800850000 - 0x00007ff800867000 C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.4\jbr\bin\jli.dll +0x00007ff819b90000 - 0x00007ff819bab000 C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.4\jbr\bin\VCRUNTIME140.dll +0x00007ff85f590000 - 0x00007ff85f73e000 C:\WINDOWS\System32\USER32.dll +0x00007ff850110000 - 0x00007ff8503a2000 C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.22621.4830_none_270fe7d773858e80\COMCTL32.dll +0x00007ff85d530000 - 0x00007ff85d556000 C:\WINDOWS\System32\win32u.dll +0x00007ff85fbb0000 - 0x00007ff85fbd9000 C:\WINDOWS\System32\GDI32.dll +0x00007ff85dd20000 - 0x00007ff85de3b000 C:\WINDOWS\System32\gdi32full.dll +0x00007ff85dea0000 - 0x00007ff85df47000 C:\WINDOWS\System32\msvcrt.dll +0x00007ff85d560000 - 0x00007ff85d5fa000 C:\WINDOWS\System32\msvcp_win.dll +0x00007ff85de50000 - 0x00007ff85de81000 C:\WINDOWS\System32\IMM32.DLL +0x00007ff819b80000 - 0x00007ff819b8c000 C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.4\jbr\bin\vcruntime140_1.dll +0x00007fffddac0000 - 0x00007fffddb4d000 C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.4\jbr\bin\msvcp140.dll +0x00007fffe1c90000 - 0x00007fffe28fb000 C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.4\jbr\bin\server\jvm.dll +0x00007ff85e140000 - 0x00007ff85e1f1000 C:\WINDOWS\System32\ADVAPI32.dll +0x00007ff85feb0000 - 0x00007ff85ff57000 C:\WINDOWS\System32\sechost.dll +0x00007ff85d480000 - 0x00007ff85d4a8000 C:\WINDOWS\System32\bcrypt.dll +0x00007ff85e2e0000 - 0x00007ff85e3f4000 C:\WINDOWS\System32\RPCRT4.dll +0x00007ff84b2e0000 - 0x00007ff84b2e9000 C:\WINDOWS\SYSTEM32\WSOCK32.dll +0x00007ff853d40000 - 0x00007ff853d4a000 C:\WINDOWS\SYSTEM32\VERSION.dll +0x00007ff856ae0000 - 0x00007ff856b14000 C:\WINDOWS\SYSTEM32\WINMM.dll +0x00007ff85f740000 - 0x00007ff85f7b1000 C:\WINDOWS\System32\WS2_32.dll +0x00007ff85c400000 - 0x00007ff85c418000 C:\WINDOWS\SYSTEM32\kernel.appcore.dll +0x00007fffe8470000 - 0x00007fffe847a000 C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.4\jbr\bin\jimage.dll +0x00007ff85aa50000 - 0x00007ff85ac82000 C:\WINDOWS\SYSTEM32\DBGHELP.DLL +0x00007ff85f820000 - 0x00007ff85fbb0000 C:\WINDOWS\System32\combase.dll +0x00007ff85e200000 - 0x00007ff85e2d7000 C:\WINDOWS\System32\OLEAUT32.dll +0x00007ff8523d0000 - 0x00007ff852402000 C:\WINDOWS\SYSTEM32\dbgcore.DLL +0x00007ff85d400000 - 0x00007ff85d47b000 C:\WINDOWS\System32\bcryptPrimitives.dll +0x00007fffe1c60000 - 0x00007fffe1c85000 C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.4\jbr\bin\java.dll + +dbghelp: loaded successfully - version: 4.0.5 - missing functions: none +symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.4\jbr\bin;C:\WINDOWS\SYSTEM32;C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.22621.4830_none_270fe7d773858e80;C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.4\jbr\bin\server + +VM Arguments: +java_command: git4idea.http.GitAskPassApp Username for 'http://221.226.25.34:3000': +java_class_path (initial): C:/Program Files/JetBrains/IntelliJ IDEA 2022.1.4/plugins/vcs-git/lib/git4idea-rt.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2022.1.4/lib/externalProcess-rt.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2022.1.4/lib/app.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2022.1.4/lib/3rd-party-rt.jar +Launcher Type: SUN_STANDARD + +[Global flags] + intx CICompilerCount = 4 {product} {ergonomic} + uint ConcGCThreads = 2 {product} {ergonomic} + uint G1ConcRefinementThreads = 8 {product} {ergonomic} + size_t G1HeapRegionSize = 2097152 {product} {ergonomic} + uintx GCDrainStackTargetSize = 64 {product} {ergonomic} + size_t InitialHeapSize = 266338304 {product} {ergonomic} + size_t MarkStackSize = 4194304 {product} {ergonomic} + size_t MaxHeapSize = 4255121408 {product} {ergonomic} + size_t MinHeapDeltaBytes = 2097152 {product} {ergonomic} + size_t MinHeapSize = 8388608 {product} {ergonomic} + uintx NonNMethodCodeHeapSize = 5839372 {pd product} {ergonomic} + uintx NonProfiledCodeHeapSize = 122909434 {pd product} {ergonomic} + uintx ProfiledCodeHeapSize = 122909434 {pd product} {ergonomic} + uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic} + bool SegmentedCodeCache = true {product} {ergonomic} + size_t SoftMaxHeapSize = 4255121408 {manageable} {ergonomic} + bool UseCompressedClassPointers = true {product lp64_product} {ergonomic} + bool UseCompressedOops = true {product lp64_product} {ergonomic} + bool UseG1GC = true {product} {ergonomic} + bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic} + +Logging: +Log output configuration: + #0: stdout all=warning uptime,level,tags + #1: stderr all=off uptime,level,tags + +Environment Variables: +JAVA_HOME=C:\Program Files\Java\jdk1.8.0_341 +CLASSPATH=D:\WEAVER\Resin\lib\resin.jar +PATH=D:\Develop\Git\mingw64\libexec\git-core;D:\Develop\Git\mingw64\libexec\git-core;D:\Develop\Git\mingw64\bin;D:\Develop\Git\usr\bin;C:\Users\Harryxzy\bin;C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Binn;C:\Program Files\Java\jre1.8.0_341\bin;C:\Program Files\Java\jdk1.8.0_341\bin;D:\Develop\apache-maven-3.8.1\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\VMware\VMware Workstation\bin;D:\oracle\product\11.2.0\dbhome_1\bin;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn;C:\Program Files\Microsoft SQL Server\100\Tools\Binn;C:\Program Files\Microsoft SQL Server\100\DTS\Binn;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE;C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies;D:\Develop\Git\cmd;C:\Program Files (x86)\NetSarang\Xshell 7;C:\Program Files (x86)\NetSarang\Xftp 7;C:\Program Files\nodejs;C:\Program Files\Docker\Docker\resources\bin;C:\Users\Public\Desktop;D:\MySQL8.0.21\bin;E:\Python\Python313\Scripts;E:\Python\Python313;C:\Program Files\MySQL\MySQL Shell 8.0\bin;C:\Users\Harryxzy\AppData\Local\Microsoft\WindowsApps;D:\Develop\Microsoft VS Code\bin;C:\Users\Harryxzy\AppData\Roaming\npm;C:\Users\Harryxzy\AppData\Local\Programs\Fiddler +USERNAME=Harryxzy +DISPLAY=:0.0 +LC_ALL=en_US.UTF-8 +TERM=xterm-256color +TMPDIR=C:\Users\Harryxzy\AppData\Local\Temp +OS=Windows_NT +PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 140 Stepping 1, GenuineIntel +TMP=C:\Users\Harryxzy\AppData\Local\Temp +TEMP=C:\Users\Harryxzy\AppData\Local\Temp + + + +--------------- S Y S T E M --------------- + +OS: + Windows 11 , 64 bit Build 22621 (10.0.22621.4830) +OS uptime: 0 days 6:23 hours +Hyper-V role detected + +CPU: total 8 (initial active 8) (4 cores per cpu, 2 threads per core) family 6 model 140 stepping 1 microcode 0xba, cx8, cmov, fxsr, ht, mmx, 3dnowpref, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, lzcnt, tsc, tscinvbit, avx, avx2, aes, erms, clmul, bmi1, bmi2, adx, avx512f, avx512dq, avx512cd, avx512bw, avx512vl, sha, fma, vzeroupper, avx512_vpopcntdq, avx512_vpclmulqdq, avx512_vaes, avx512_vnni, clflush, clflushopt, clwb, avx512_vbmi2, avx512_vbmi, hv + +Memory: 4k page, system-wide physical 16226M (407M free) +TotalPageFile size 51523M (AvailPageFile size 207M) +current process WorkingSet (physical memory assigned to process): 11M, peak: 11M +current process commit charge ("private bytes"): 60M, peak: 314M + +vm_info: OpenJDK 64-Bit Server VM (17.0.5+1-b653.25) for windows-amd64 JRE (17.0.5+1-b653.25), built on 2023-01-04 by "builduser" with MS VC++ 16.10 / 16.11 (VS2019) + +END. diff --git a/resource/sqlupgrade/SQLServer/sql2025031701039TEST.sql b/resource/sqlupgrade/SQLServer/sql2025031701039TEST.sql new file mode 100644 index 000000000..f756df050 --- /dev/null +++ b/resource/sqlupgrade/SQLServer/sql2025031701039TEST.sql @@ -0,0 +1,6 @@ +ALTER TABLE hrsa_salary_acct_emp ADD az_approval_status varchar(255) NULL +GO + + +ALTER TABLE hrsa_salary_acct_emp ADD az_submitted_status varchar(255) NULL +GO \ No newline at end of file diff --git a/src/com/engine/salary/biz/EmployBiz.java b/src/com/engine/salary/biz/EmployBiz.java index bc471743e..7434007a5 100644 --- a/src/com/engine/salary/biz/EmployBiz.java +++ b/src/com/engine/salary/biz/EmployBiz.java @@ -8,7 +8,6 @@ import com.engine.salary.entity.salarysob.param.SalarySobRangeEmpQueryParam; import com.engine.salary.mapper.datacollection.EmployMapper; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; -import org.apache.ibatis.annotations.Param; import org.apache.ibatis.session.SqlSession; import weaver.conn.mybatis.MyBatisFactory; import weaver.general.BaseBean; @@ -245,6 +244,16 @@ public class EmployBiz extends BaseBean { } } + public List listDepIdByEmpIdAndOpe(Long employeeId, Integer operateId) { + SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); + try { + EmployMapper mapper = sqlSession.getMapper(EmployMapper.class); + return mapper.listDepIdByEmpIdAndOpe(employeeId, operateId); + } finally { + sqlSession.close(); + } + } + public List listEmpIdByDepId(List departmentIds) { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { diff --git a/src/com/engine/salary/biz/SalaryArchiveItemBiz.java b/src/com/engine/salary/biz/SalaryArchiveItemBiz.java index 527b6b3b2..f4dc20398 100644 --- a/src/com/engine/salary/biz/SalaryArchiveItemBiz.java +++ b/src/com/engine/salary/biz/SalaryArchiveItemBiz.java @@ -196,6 +196,29 @@ public class SalaryArchiveItemBiz { } } + + public List salaryItemAdjustRecordTime(SalaryItemAdjustRecordQueryParam queryParam, List salaryItemIds) { + SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); + try { + SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); + List salaryArchiveIds = queryParam.getSalaryArchiveIds(); + if (CollectionUtils.isEmpty(salaryArchiveIds)) { + List salaryItemAdjustRecordListDTOS = mapper.salaryItemAdjustRecordList(queryParam, salaryItemIds); + return salaryItemAdjustRecordListDTOS; + } else { + List salaryItemAdjustRecordListDTOS = new ArrayList<>(); + List> salaryArchiveIdsPartition = Lists.partition(salaryArchiveIds, 500); + salaryArchiveIdsPartition.forEach(l -> { + queryParam.setSalaryArchiveIds(l); + salaryItemAdjustRecordListDTOS.addAll(mapper.salaryItemAdjustRecordList(queryParam, salaryItemIds)); + }); + return salaryItemAdjustRecordListDTOS; + } + + } finally { + sqlSession.close(); + } + } public void deleteBySalaryArchiveId(List salaryArchiveIds) { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java index ad98f4ad7..c5ae2e4b9 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java @@ -50,7 +50,8 @@ public class SalaryAcctRecordBO { List taxAgentPOS, List needApprovalSalarySobIds, boolean approvalCanFile, - boolean approvalCanReCalc) { + boolean approvalCanReCalc, + boolean canManage) { if (CollectionUtils.isEmpty(salaryAcctRecordPOS)) { return Collections.emptyList(); } @@ -89,6 +90,9 @@ public class SalaryAcctRecordBO { btnList.add(new WeaTableOperate("重新核算", null, "4")); } } + if (!canManage) { + btnList = btnList.stream().filter(btn -> btn.getIndex().equals("3") || btn.getIndex().equals("0")).collect(Collectors.toList()); + } return SalaryAcctRecordListDTO.builder() .id(salaryAcctRecordPO.getId()) .salarySobName(Optional.ofNullable(salarySobPO).map(SalarySobPO::getName).orElse(StringUtils.EMPTY)) diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java index c80d67dfe..ba72fbb7c 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java @@ -23,6 +23,7 @@ import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.AccountTypeEnum; import com.engine.salary.enums.SalaryValueTypeEnum; import com.engine.salary.enums.UserStatusEnum; +import com.engine.salary.enums.salaryaccounting.AZSalaryAcctEmployeeStatusEnum; import com.engine.salary.enums.salaryaccounting.LockStatusEnum; import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; import com.engine.salary.util.SalaryEntityUtil; @@ -334,6 +335,9 @@ public class SalaryAcctResultBO { map.put("consolidatedTaxation", StringUtils.isNotEmpty(taxAgentName) && consolidatedTaxSalaryAcctEmpIds.contains(e.getId())); // 个税扣缴义务人的字段类型 map.put("taxAgentName" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue()); + // 审核状态 + map.put("submittedStatus", StringUtils.isBlank(e.getAzSubmittedStatus()) ? AZSalaryAcctEmployeeStatusEnum.NOT_SUBMITTED.getDefaultLabel() : AZSalaryAcctEmployeeStatusEnum.getDefaultLabelByValue(e.getAzSubmittedStatus())); + map.put("approvalStatus", StringUtils.isBlank(e.getAzApprovalStatus()) ? AZSalaryAcctEmployeeStatusEnum.NOT_APPROVED.getDefaultLabel() : AZSalaryAcctEmployeeStatusEnum.getDefaultLabelByValue(e.getAzApprovalStatus())); // 公式详情 customParameters.putAll(customBackCalcParameters); map.put("customParameters", customParameters); diff --git a/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmpAzApprovalStatusParam.java b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmpAzApprovalStatusParam.java new file mode 100644 index 000000000..7ac8ee0a6 --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmpAzApprovalStatusParam.java @@ -0,0 +1,29 @@ +package com.engine.salary.entity.salaryacct.param; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Set; + +/** + * 艾志 审批状态修改 + *

Copyright: Copyright (c) 2042

+ *

Company: 泛微软件

+ * + * @author xzy + * @version 1.0 + **/ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SalaryAcctEmpAzApprovalStatusParam { + + //薪资核算记录的id + private Long salaryAcctRecordId; + + // 薪资核算人员的id + private Set acctEmpIds; +} diff --git a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctEmployeePO.java b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctEmployeePO.java index 7d508583c..3f4879f57 100644 --- a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctEmployeePO.java +++ b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctEmployeePO.java @@ -173,6 +173,12 @@ public class SalaryAcctEmployeePO { */ private Integer accountType; + // 艾志提交状态 + private String azSubmittedStatus; + + // 艾志审批状态 + private String azApprovalStatus; + //--------条件---------- diff --git a/src/com/engine/salary/entity/salaryarchive/param/SalaryItemAdjustRecordQueryParam.java b/src/com/engine/salary/entity/salaryarchive/param/SalaryItemAdjustRecordQueryParam.java index 6e2fc8415..a19e18083 100644 --- a/src/com/engine/salary/entity/salaryarchive/param/SalaryItemAdjustRecordQueryParam.java +++ b/src/com/engine/salary/entity/salaryarchive/param/SalaryItemAdjustRecordQueryParam.java @@ -41,6 +41,8 @@ public class SalaryItemAdjustRecordQueryParam extends BaseQueryParam { //员工id private Long employeeId; + private List employeeIds; + //部门id private List departmentIds; @@ -67,4 +69,6 @@ public class SalaryItemAdjustRecordQueryParam extends BaseQueryParam { //备注 private String description; + + private boolean export; } diff --git a/src/com/engine/salary/enums/salaryaccounting/AZSalaryAcctEmployeeStatusEnum.java b/src/com/engine/salary/enums/salaryaccounting/AZSalaryAcctEmployeeStatusEnum.java new file mode 100644 index 000000000..9d2616e2b --- /dev/null +++ b/src/com/engine/salary/enums/salaryaccounting/AZSalaryAcctEmployeeStatusEnum.java @@ -0,0 +1,63 @@ +package com.engine.salary.enums.salaryaccounting; + +import com.engine.salary.enums.BaseEnum; + +import java.util.Arrays; +import java.util.Objects; +import java.util.Optional; + +/** + * @ClassName AZSalaryAcctEmployeeStatusEnum + * @author Harryxzy + * @date 2025/3/12 16:53 + * @description 艾志人员审批状态 + */ +public enum AZSalaryAcctEmployeeStatusEnum implements BaseEnum { + + NOT_SUBMITTED("NOT_SUBMITTED", "未提交", 0), + SUBMITTED("SUBMITTED", "已提交", 0), + NOT_APPROVED("NOT_APPROVED", "未审核", 0), + APPROVED("APPROVED", "已审核", 0), + ; + + private String value; + + private String defaultLabel; + + private int labelId; + + AZSalaryAcctEmployeeStatusEnum(String value, String defaultLabel, int labelId) { + this.value = value; + this.defaultLabel = defaultLabel; + this.labelId = labelId; + } + + @Override + public String getValue() { + return value; + } + + @Override + public Integer getLabelId() { + return labelId; + } + + @Override + public String getDefaultLabel() { + return defaultLabel; + } + + public static AZSalaryAcctEmployeeStatusEnum parseByValue(String value) { + for (AZSalaryAcctEmployeeStatusEnum salaryAcctRecordStatusEnum : AZSalaryAcctEmployeeStatusEnum.values()) { + if (Objects.equals(salaryAcctRecordStatusEnum.getValue(), value)) { + return salaryAcctRecordStatusEnum; + } + } + return null; + } + + public static String getDefaultLabelByValue(String value) { + Optional optional = Arrays.stream(AZSalaryAcctEmployeeStatusEnum.values()).filter(r -> r.getValue().equals(value)).findFirst(); + return optional.isPresent() ? optional.get().defaultLabel : ""; + } +} diff --git a/src/com/engine/salary/enums/salaryarchive/SalaryArchiveItemAdjustReasonEnum.java b/src/com/engine/salary/enums/salaryarchive/SalaryArchiveItemAdjustReasonEnum.java index 626635040..ca6b15678 100644 --- a/src/com/engine/salary/enums/salaryarchive/SalaryArchiveItemAdjustReasonEnum.java +++ b/src/com/engine/salary/enums/salaryarchive/SalaryArchiveItemAdjustReasonEnum.java @@ -25,7 +25,12 @@ public enum SalaryArchiveItemAdjustReasonEnum implements BaseEnum { POSITION_OR_SALARY_ADJUSTMENT("POSITION_OR_SALARY_ADJUSTMENT", "调岗调薪", 85986), DIMISSION("DIMISSION", "离职", 85902), OTHER("OTHER", "其他", 84500), - INIT("INIT", "初始化", 85903); + INIT("INIT", "初始化", 85903), + JTEDBG("JTEDBG", "交通额度变更", 0), + TXEDBG("TXEDBG", "通讯额度变更", 0), + GWEDBG("GWEDBG", "高温额度变更", 0), + CBEDBG("CBEDBG", "餐补额度变更", 0) + ; private String value; diff --git a/src/com/engine/salary/mapper/archive/SalaryArchiveItemMapper.xml b/src/com/engine/salary/mapper/archive/SalaryArchiveItemMapper.xml index d0830bad3..585a5d315 100644 --- a/src/com/engine/salary/mapper/archive/SalaryArchiveItemMapper.xml +++ b/src/com/engine/salary/mapper/archive/SalaryArchiveItemMapper.xml @@ -743,6 +743,7 @@ ORDER BY t1.effective_time DESC,t1.id DESC + t1.id, t1.employee_id, diff --git a/src/com/engine/salary/mapper/datacollection/EmployMapper.java b/src/com/engine/salary/mapper/datacollection/EmployMapper.java index d271e4572..18bd83f0a 100644 --- a/src/com/engine/salary/mapper/datacollection/EmployMapper.java +++ b/src/com/engine/salary/mapper/datacollection/EmployMapper.java @@ -30,6 +30,8 @@ public interface EmployMapper { */ List listEmployee(); + List listByJobtitle(@Param("jobtitleIds") List jobtitleIds); + /** * 单表查询 * @param ids @@ -158,6 +160,8 @@ public interface EmployMapper { */ List listDepIdByEmpId(Long employeeId); + List listDepIdByEmpIdAndOpe(@Param("employeeId") Long employeeId,@Param("operateId") Integer operateId); + /** * 艾志二开,查询部门id下的人员id */ diff --git a/src/com/engine/salary/mapper/datacollection/EmployMapper.xml b/src/com/engine/salary/mapper/datacollection/EmployMapper.xml index 9fcd32855..75ae33d93 100644 --- a/src/com/engine/salary/mapper/datacollection/EmployMapper.xml +++ b/src/com/engine/salary/mapper/datacollection/EmployMapper.xml @@ -628,6 +628,14 @@ where d.ry = #{employeeId} + + + + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salaryacct/SalaryAcctEmployeeMapper.java b/src/com/engine/salary/mapper/salaryacct/SalaryAcctEmployeeMapper.java index b8c12c273..424b1762d 100644 --- a/src/com/engine/salary/mapper/salaryacct/SalaryAcctEmployeeMapper.java +++ b/src/com/engine/salary/mapper/salaryacct/SalaryAcctEmployeeMapper.java @@ -8,6 +8,7 @@ import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; import org.apache.ibatis.annotations.Param; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Set; @@ -132,4 +133,11 @@ public interface SalaryAcctEmployeeMapper { void updateIgnoreNull(@Param("salaryAcctEmployeePO")SalaryAcctEmployeePO salaryAcctEmployeePO); void lock(SalaryAcctEmployeePO salaryAcctEmployeePO); + + Integer updateAzApprovalStatusByIds(@Param("status") String status, @Param("ids")List salaryAcctEmpIds, @Param("now") Date date); + + Integer updateAzSubmitStatusByIds(@Param("status") String status, @Param("ids")List salaryAcctEmpIds, @Param("now") Date date); + + + List listSalaryAcctRecordIdsContainsDepIds(@Param("depIds") List depIds, @Param("salaryAcctRecordIds") List salaryAcctRecordIds); } diff --git a/src/com/engine/salary/mapper/salaryacct/SalaryAcctEmployeeMapper.xml b/src/com/engine/salary/mapper/salaryacct/SalaryAcctEmployeeMapper.xml index 17377b967..ff35506d0 100644 --- a/src/com/engine/salary/mapper/salaryacct/SalaryAcctEmployeeMapper.xml +++ b/src/com/engine/salary/mapper/salaryacct/SalaryAcctEmployeeMapper.xml @@ -62,7 +62,9 @@ t.jobcall_id, t.status, t.lock_items, - t.account_type + t.account_type, + t.az_approval_status, + t.az_submitted_status @@ -70,7 +72,7 @@ . id , emp1.salary_acct_record_id, emp1.salary_sob_id, emp1.employee_id, emp1.tax_agent_id, emp1.salary_month, - emp1.creator, emp1.create_time, emp1.update_time, emp1.delete_type, emp1.tenant_key,emp1.employee_type + emp1.creator, emp1.create_time, emp1.update_time, emp1.delete_type, emp1.tenant_key,emp1.employee_type,emp1.az_approval_status @@ -1034,6 +1036,8 @@ + + @@ -1064,6 +1068,8 @@ , t.status , t.lock_items , t.account_type + , t.az_approval_status + , t.az_submitted_status @@ -1218,6 +1224,19 @@ AND hed.declare_status IN (4) ) + UPDATE hrsa_salary_acct_emp @@ -1294,5 +1313,29 @@ WHERE id = #{id} AND delete_type = 0 + + UPDATE hrsa_salary_acct_emp + + az_approval_status = #{status}, + update_time = #{now} + + WHERE id IN + + #{id} + + AND delete_type = 0 + + + UPDATE hrsa_salary_acct_emp + + az_submitted_status = #{status}, + update_time = #{now} + + WHERE id IN + + #{id} + + AND delete_type = 0 + diff --git a/src/com/engine/salary/service/SISchemeService.java b/src/com/engine/salary/service/SISchemeService.java index 86eb024ee..0d6aa3284 100644 --- a/src/com/engine/salary/service/SISchemeService.java +++ b/src/com/engine/salary/service/SISchemeService.java @@ -83,4 +83,6 @@ public interface SISchemeService { List updateSchemeDetail(List schemeDetailList); List listAll(); + + XSSFWorkbook exportAll(InsuranceSchemeParam insuranceSchemeParam); } diff --git a/src/com/engine/salary/service/SalaryAcctEmployeeService.java b/src/com/engine/salary/service/SalaryAcctEmployeeService.java index f004aec8b..27c3dbfe8 100644 --- a/src/com/engine/salary/service/SalaryAcctEmployeeService.java +++ b/src/com/engine/salary/service/SalaryAcctEmployeeService.java @@ -282,4 +282,14 @@ public interface SalaryAcctEmployeeService { void updateIgnoreNull(SalaryAcctEmployeePO salaryAcctEmployeePO); void lock(SalaryAcctEmployeePO salaryAcctEmployeePO); + + void azSubmit(SalaryAcctEmpAzApprovalStatusParam param); + + void azReturn(SalaryAcctEmpAzApprovalStatusParam param); + + void azApprove(SalaryAcctEmpAzApprovalStatusParam param); + + void azReApprove(SalaryAcctEmpAzApprovalStatusParam param); + + List listSalaryAcctRecordIdsContainsDepIds(List depWithChildList, List salaryAcctRecordIds); } diff --git a/src/com/engine/salary/service/SalaryArchiveItemService.java b/src/com/engine/salary/service/SalaryArchiveItemService.java index 6e22d49ba..dec337f92 100644 --- a/src/com/engine/salary/service/SalaryArchiveItemService.java +++ b/src/com/engine/salary/service/SalaryArchiveItemService.java @@ -104,6 +104,8 @@ public interface SalaryArchiveItemService { */ List salaryItemAdjustRecordList(SalaryItemAdjustRecordQueryParam queryParam, List salaryItemIds); + List salaryItemAdjustRecordTime(SalaryItemAdjustRecordQueryParam queryParam, List salaryItemIds); + /** * 导出薪资项目的调整记录列表 * @@ -173,4 +175,8 @@ public interface SalaryArchiveItemService { * @return */ List listByArchiveIdAndEffectiveTime(List salaryArchiveIds, LocalDateRange dateRange); + + Map azAdjustList(SalaryItemAdjustRecordQueryParam queryParam); + + XSSFWorkbook exportAzAdjustList(SalaryItemAdjustRecordQueryParam queryParam); } diff --git a/src/com/engine/salary/service/SalaryEmployeeService.java b/src/com/engine/salary/service/SalaryEmployeeService.java index 6287d79c5..9f9567f2b 100644 --- a/src/com/engine/salary/service/SalaryEmployeeService.java +++ b/src/com/engine/salary/service/SalaryEmployeeService.java @@ -32,6 +32,8 @@ public interface SalaryEmployeeService { */ List listAll(UseEmployeeTypeEnum empType); + List listByJobtitle(List jobtitleIds); + /** * 获取报表人员字段 * @@ -191,6 +193,8 @@ public interface SalaryEmployeeService { */ List listDepIdByEmpId(Long employeeId); + List listDepIdByEmpIdAndOpe(Long currentEmployeeId, Integer operateId); + /** * 艾志二开,查询部门id下的人员id */ diff --git a/src/com/engine/salary/service/impl/SIArchivesServiceImpl.java b/src/com/engine/salary/service/impl/SIArchivesServiceImpl.java index 2eb675db2..b55b49c10 100644 --- a/src/com/engine/salary/service/impl/SIArchivesServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIArchivesServiceImpl.java @@ -19,7 +19,6 @@ import com.engine.core.impl.Service; import com.engine.hrmelog.entity.dto.LoggerContext; import com.engine.salary.biz.SIArchivesBiz; import com.engine.salary.biz.SISchemeBiz; -import com.engine.hrmelog.entity.dto.LoggerContext; import com.engine.salary.cmd.siarchives.SIArchivesTipsCmd; import com.engine.salary.common.SalaryContext; import com.engine.salary.config.SalaryElogConfig; @@ -73,7 +72,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.SqlSession; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.BeanUtils; -import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StopWatch; import weaver.conn.mybatis.MyBatisFactory; import weaver.general.BaseBean; diff --git a/src/com/engine/salary/service/impl/SISchemeServiceImpl.java b/src/com/engine/salary/service/impl/SISchemeServiceImpl.java index 10a7f36ea..1d0326520 100644 --- a/src/com/engine/salary/service/impl/SISchemeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SISchemeServiceImpl.java @@ -63,6 +63,7 @@ import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.excel.ExcelParseHelper; import com.engine.salary.util.excel.ExcelSupport; import com.engine.salary.util.excel.ExcelUtilPlus; +import com.engine.salary.util.page.Column; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.engine.salary.util.valid.ValidUtil; @@ -80,6 +81,7 @@ import weaver.file.ImageFileManager; import weaver.general.Util; import weaver.hrm.User; import weaver.hrm.company.DepartmentComInfo; +import weaver.wechat.util.Utils; import java.io.InputStream; import java.math.BigDecimal; @@ -182,6 +184,10 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { return MapperProxyFactory.getProxy(EmployMapper.class); } + public SICategoryService getSICategoryService(User user) { + return ServiceUtil.getService(SICategoryServiceImpl.class, user); + } + @Override public Map getForm(Map params) { Map apidatas = new HashMap<>(16); @@ -3064,4 +3070,120 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { } /*****以上代码为SISchemeBiz中方法逻辑迁移,旨在减少Biz类的使用*****/ + @Override + public XSSFWorkbook exportAll(InsuranceSchemeParam queryParam) { + // 获取所有的方案列表 + SalaryAssert.notNull(queryParam.getWelfareTypeEnum(), SalaryI18nUtil.getI18nLabel(84026, "参数错误")); + queryParam.setWelfareType(queryParam.getWelfareTypeEnum().getValue()); + Long currentEmployeeId = (long) user.getUID(); + List insuranceSchemePOS; + Boolean needAuth = getTaxAgentService().isNeedAuth(currentEmployeeId); + if (needAuth) { + insuranceSchemePOS = getInsuranceSchemeMapper().list(queryParam); + Boolean isAdminEnable = getTaxAgentService().isAdminEnable((long) user.getUID()); + if (isAdminEnable) { + //管理员 + Collection taxAgentPOS = getTaxAgentService().listAllTaxAgents(currentEmployeeId); + List authTaxAgentIds = SalaryEntityUtil.properties(taxAgentPOS, TaxAgentPO::getId, Collectors.toList()); + insuranceSchemePOS = insuranceSchemePOS.stream().filter(po -> { + String taxAgentIdsStr = po.getTaxAgentIds(); + List taxAgentIds = new ArrayList<>(); + if (StringUtils.isNotBlank(taxAgentIdsStr)) { + taxAgentIds = Arrays.stream(taxAgentIdsStr.split(",")).map(Long::valueOf).collect(Collectors.toList()); + } + return StringUtils.isBlank(po.getSharedType()) || SharedTypeEnum.PUBLIC.getValue().equals(po.getSharedType()) || (SharedTypeEnum.PRIVATE.getValue().equals(po.getSharedType()) && SalaryEntityUtil.judgeIntersection(authTaxAgentIds, taxAgentIds)); + }).collect(Collectors.toList()); + } else { + //普通用户 + insuranceSchemePOS = new ArrayList<>(); + } + } else { + insuranceSchemePOS = getInsuranceSchemeMapper().list(queryParam); + } + // 获取方案对应险种信息 + LinkedHashSet detailProKeySet = new LinkedHashSet<>(); + LinkedHashSet detailFixedKeySet = new LinkedHashSet<>(); + List> dataList = new ArrayList<>(); + insuranceSchemePOS.forEach(scheme -> { + List schemeDetailList = listByPrimaryId(scheme.getId()); + // 公司 + Map companyResultMap = new HashMap<>(); + List companyDetails = schemeDetailList.stream().filter(po -> po.getPaymentScope().equals(PaymentScopeEnum.SCOPE_COMPANY.getValue()) && po.getIsPayment().equals(IsPaymentEnum.YES.getValue())).collect(Collectors.toList()); + // 比例 + final BigDecimal[] companyTotalProp = {new BigDecimal("0")}; + List companyProportionDetails = companyDetails.stream().filter(detail -> StringUtils.isNotBlank(detail.getPaymentProportion())).collect(Collectors.toList()); + detailProKeySet.addAll(companyProportionDetails.stream().map(po -> po.getInsuranceId().toString()).collect(Collectors.toSet())); + companyProportionDetails.stream().forEach(detail -> { + companyResultMap.put(detail.getInsuranceId()+"_prop", detail.getPaymentProportion() + "%"); + companyTotalProp[0] = companyTotalProp[0].add(NumberUtils.isCreatable(detail.getPaymentProportion()) ? new BigDecimal(detail.getPaymentProportion()) : BigDecimal.ZERO); + }); + // 固定值 + List companyFixedDetails = companyDetails.stream() + .filter(detail -> NumberUtils.isCreatable(detail.getFixedCost()) && new BigDecimal(detail.getFixedCost()).compareTo(new BigDecimal("0")) != 0 ) + .collect(Collectors.toList()); + detailFixedKeySet.addAll(companyFixedDetails.stream().map(po -> po.getInsuranceId().toString()).collect(Collectors.toSet())); + companyFixedDetails.stream().forEach(detail -> { + companyResultMap.put(detail.getInsuranceId()+"_fixed", detail.getFixedCost()); + }); + companyResultMap.put("paymentScope", PaymentScopeEnum.SCOPE_COMPANY.getDefaultLabel()); + companyResultMap.put("schemeName", scheme.getSchemeName()); + companyResultMap.put("totalProportion", companyTotalProp[0].toPlainString()); + dataList.add(companyResultMap); + + // 个人 + final BigDecimal[] personTotalProp = {new BigDecimal("0")}; + Map personResultMap = new HashMap<>(); + List personDetails = schemeDetailList.stream().filter(po -> po.getPaymentScope().equals(PaymentScopeEnum.SCOPE_PERSON.getValue()) && po.getIsPayment().equals(IsPaymentEnum.YES.getValue())).collect(Collectors.toList()); + // 比例 + List personProportionDetails = personDetails.stream().filter(detail -> StringUtils.isNotBlank(detail.getPaymentProportion())).collect(Collectors.toList()); + detailProKeySet.addAll(personProportionDetails.stream().map(po -> po.getInsuranceId().toString()).collect(Collectors.toSet())); + personProportionDetails.stream().forEach(detail -> { + personResultMap.put(detail.getInsuranceId()+"_prop", detail.getPaymentProportion() + "%"); + personTotalProp[0] = personTotalProp[0].add(NumberUtils.isCreatable(detail.getPaymentProportion()) ? new BigDecimal(detail.getPaymentProportion()) : BigDecimal.ZERO); + }); + // 固定值 + List personFixedDetails = personDetails.stream() + .filter(detail -> NumberUtils.isCreatable(detail.getFixedCost()) && new BigDecimal(detail.getFixedCost()).compareTo(new BigDecimal("0")) != 0 ) + .collect(Collectors.toList()); + detailFixedKeySet.addAll(personFixedDetails.stream().map(po -> po.getInsuranceId().toString()).collect(Collectors.toSet())); + personFixedDetails.stream().forEach(detail -> { + personResultMap.put(detail.getInsuranceId()+"_fixed", detail.getFixedCost()); + }); + personResultMap.put("paymentScope", PaymentScopeEnum.SCOPE_PERSON.getDefaultLabel()); + personResultMap.put("schemeName", scheme.getSchemeName()); + personResultMap.put("totalProportion", personTotalProp[0].toPlainString()); + dataList.add(personResultMap); + }); + // 处理表头 + List columnList = new ArrayList<>(); + columnList.add(new Column("方案名称", "schemeName", "schemeName")); + columnList.add(new Column("缴纳对象", "paymentScope", "paymentScope")); + // 获取所有福利小项信息 + Map categoryIdNameMap = getSICategoryService(user).categoryIdNameMap(); + List detailProKeyList = detailProKeySet.stream().sorted((k1, k2) -> { + return Long.valueOf(k1).compareTo(Long.valueOf(k2)); + }).collect(Collectors.toList()); + detailProKeyList.stream().forEach(insuranceId -> { + String categoryName = categoryIdNameMap.get(insuranceId.toString()); + columnList.add(new Column(Utils.null2String(categoryName)+"缴纳比例", insuranceId+"_prop", insuranceId+"_prop")); + }); + columnList.add(new Column("合计比例", "totalProportion", "totalProportion")); + detailFixedKeySet.stream().forEach(insuranceId -> { + String categoryName = categoryIdNameMap.get(insuranceId.toString()); + columnList.add(new Column(Utils.null2String(categoryName)+"/元", insuranceId+"_fixed", insuranceId+"_fixed")); + }); + + List> excelSheetData = new ArrayList<>(); + excelSheetData.add(columnList.stream().map(column -> column.getTitle()).collect(Collectors.toList())); + for (Map dataMap : dataList) { + List singleList = new ArrayList<>(); + for(Column column : columnList) { + singleList.add(Utils.null2String(dataMap.get(column.getKey()))); + } + excelSheetData.add(singleList); + } + + + return ExcelUtilPlus.genWorkbookV2ForAzSocial(excelSheetData, "社保福利方案"); + } } diff --git a/src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java index 54822e860..45cec9ae5 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java @@ -21,6 +21,7 @@ import com.engine.salary.entity.salarysob.po.SalarySobItemPO; import com.engine.salary.entity.salarysob.po.SalarySobPO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.OperateTypeEnum; +import com.engine.salary.enums.salaryaccounting.AZSalaryAcctEmployeeStatusEnum; import com.engine.salary.enums.salaryaccounting.LockStatusEnum; import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum; import com.engine.salary.exception.SalaryRunTimeException; @@ -46,6 +47,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import weaver.hrm.User; +import weaver.hrm.company.DepartmentComInfo; import java.util.*; import java.util.stream.Collectors; @@ -221,6 +223,33 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct // 分页参数 // 查询薪资核算人员 List salaryAcctEmployeePOS = getSalaryAcctEmployeeMapper().listPage(queryParam); + + //艾志二开,增加当前登录人拥有的的部门查看权限包含的人员档案列表 + List taxAgentIds = getTaxAgentService(user).listAllTaxAgents(Long.valueOf(user.getUID())).stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + List needAuthPage = salaryAcctEmployeePOS.stream().filter(dto -> taxAgentIds.contains(dto.getTaxAgentId())).collect(Collectors.toList()); + //查询登录人拥有查看权限的部门 + List depList = getSalaryEmployeeService(user).listDepIdByEmpId((long) user.getUID()); + if (depList.size() > 0) { + List depWithChildList = new ArrayList<>(); + for (Long depId : depList) { + try { + String depStr = DepartmentComInfo.getAllChildDepartId(depId.toString(), depId.toString()); + depWithChildList.addAll(Arrays.stream(depStr.split(",")).collect(Collectors.toList())); + } catch (Exception e) { + e.printStackTrace(); + } + } + + List depAuthPage = salaryAcctEmployeePOS.stream().filter(f -> + depWithChildList.contains(f.getDepartmentId().toString()) + ).collect(Collectors.toList()); + if (depAuthPage.size() > 0) { + needAuthPage.addAll(depAuthPage); + needAuthPage = needAuthPage.stream().distinct().collect(Collectors.toList()); + } + } + salaryAcctEmployeePOS = needAuthPage; + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), salaryAcctEmployeePOS, SalaryAcctEmployeePO.class); } @@ -267,6 +296,33 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct } else { salaryAcctEmployeePOS = listByParam(salaryAcctEmployeeQueryParam); } + + //艾志二开,增加当前登录人拥有的的部门查看权限包含的人员档案列表 + List taxAgentIds = getTaxAgentService(user).listAllTaxAgents(Long.valueOf(user.getUID())).stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + List needAuthPage = salaryAcctEmployeePOS.stream().filter(dto -> taxAgentIds.contains(dto.getTaxAgentId())).collect(Collectors.toList()); + //查询登录人拥有查看权限的部门 + List depList = getSalaryEmployeeService(user).listDepIdByEmpId((long) user.getUID()); + if (depList.size() > 0) { + List depWithChildList = new ArrayList<>(); + for (Long depId : depList) { + try { + String depStr = DepartmentComInfo.getAllChildDepartId(depId.toString(), depId.toString()); + depWithChildList.addAll(Arrays.stream(depStr.split(",")).collect(Collectors.toList())); + } catch (Exception e) { + e.printStackTrace(); + } + } + + List depAuthPage = salaryAcctEmployeePOS.stream().filter(f -> + depWithChildList.contains(f.getDepartmentId().toString()) + ).collect(Collectors.toList()); + if (depAuthPage.size() > 0) { + needAuthPage.addAll(depAuthPage); + needAuthPage = needAuthPage.stream().distinct().collect(Collectors.toList()); + } + } + salaryAcctEmployeePOS = needAuthPage; + return salaryAcctEmployeePOS; } @@ -320,7 +376,33 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct } }); } - return resultList; + + //艾志二开,增加当前登录人拥有的的部门查看权限包含的人员档案列表 + List taxAgentIds = getTaxAgentService(user).listAllTaxAgents(Long.valueOf(user.getUID())).stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + List needAuthPage = resultList.stream().filter(dto -> taxAgentIds.contains(dto.getTaxAgentId())).collect(Collectors.toList()); + //查询登录人拥有查看权限的部门 + List depList = getSalaryEmployeeService(user).listDepIdByEmpId((long) user.getUID()); + if (depList.size() > 0) { + List depWithChildList = new ArrayList<>(); + for (Long depId : depList) { + try { + String depStr = DepartmentComInfo.getAllChildDepartId(depId.toString(), depId.toString()); + depWithChildList.addAll(Arrays.stream(depStr.split(",")).collect(Collectors.toList())); + } catch (Exception e) { + e.printStackTrace(); + } + } + + List depAuthPage = resultList.stream().filter(f -> + depWithChildList.contains(f.getDepartmentId().toString()) + ).collect(Collectors.toList()); + if (depAuthPage.size() > 0) { + needAuthPage.addAll(depAuthPage); + needAuthPage = needAuthPage.stream().distinct().collect(Collectors.toList()); + } + } + + return needAuthPage; } @Override @@ -344,7 +426,32 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct resultList.add(v); } }); - return resultList; + + //艾志二开,增加当前登录人拥有的的部门查看权限包含的人员档案列表 + List taxAgentIds = getTaxAgentService(user).listAllTaxAgents(Long.valueOf(user.getUID())).stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + List needAuthPage = resultList.stream().filter(dto -> taxAgentIds.contains(dto.getTaxAgentId())).collect(Collectors.toList()); + //查询登录人拥有查看权限的部门 + List depList = getSalaryEmployeeService(user).listDepIdByEmpId((long) user.getUID()); + if (depList.size() > 0) { + List depWithChildList = new ArrayList<>(); + for (Long depId : depList) { + try { + String depStr = DepartmentComInfo.getAllChildDepartId(depId.toString(), depId.toString()); + depWithChildList.addAll(Arrays.stream(depStr.split(",")).collect(Collectors.toList())); + } catch (Exception e) { + e.printStackTrace(); + } + } + + List depAuthPage = resultList.stream().filter(f -> + depWithChildList.contains(f.getDepartmentId().toString()) + ).collect(Collectors.toList()); + if (depAuthPage.size() > 0) { + needAuthPage.addAll(depAuthPage); + needAuthPage = needAuthPage.stream().distinct().collect(Collectors.toList()); + } + } + return needAuthPage; } @@ -373,6 +480,33 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct } else { salaryAcctEmployeePOS = getSalaryAcctEmployeeMapper().listPage4ConsolidatedTax(otherSalaryAcctRecordIds, queryParam); } + + //艾志二开,增加当前登录人拥有的的部门查看权限包含的人员档案列表 + List taxAgentIds = getTaxAgentService(user).listAllTaxAgents(Long.valueOf(user.getUID())).stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + List needAuthPage = salaryAcctEmployeePOS.stream().filter(dto -> taxAgentIds.contains(dto.getTaxAgentId())).collect(Collectors.toList()); + //查询登录人拥有查看权限的部门 + List depList = getSalaryEmployeeService(user).listDepIdByEmpId((long) user.getUID()); + if (depList.size() > 0) { + List depWithChildList = new ArrayList<>(); + for (Long depId : depList) { + try { + String depStr = DepartmentComInfo.getAllChildDepartId(depId.toString(), depId.toString()); + depWithChildList.addAll(Arrays.stream(depStr.split(",")).collect(Collectors.toList())); + } catch (Exception e) { + e.printStackTrace(); + } + } + + List depAuthPage = salaryAcctEmployeePOS.stream().filter(f -> + depWithChildList.contains(f.getDepartmentId().toString()) + ).collect(Collectors.toList()); + if (depAuthPage.size() > 0) { + needAuthPage.addAll(depAuthPage); + needAuthPage = needAuthPage.stream().distinct().collect(Collectors.toList()); + } + } + salaryAcctEmployeePOS = needAuthPage; + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), salaryAcctEmployeePOS, SalaryAcctEmployeePO.class); } @@ -884,4 +1018,138 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct public void lock(SalaryAcctEmployeePO salaryAcctEmployeePO) { getSalaryAcctEmployeeMapper().lock(salaryAcctEmployeePO); } + + @Override + public void azSubmit(SalaryAcctEmpAzApprovalStatusParam param) { + if (CollectionUtils.isEmpty(param.getAcctEmpIds())) { + return; + } + List salaryAcctEmployeePOList = listByIds(param.getAcctEmpIds()); + if (CollectionUtils.isEmpty(salaryAcctEmployeePOList) || param.getAcctEmpIds().size() != salaryAcctEmployeePOList.size()) { + throw new SalaryRunTimeException("提交失败,核算人员信息不存在或已被删除,请刷新后重试"); + } + + List needSubmitAcctEmpIds = salaryAcctEmployeePOList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(needSubmitAcctEmpIds)) { + // 修改提交状态未已提交 + updateAzSubmitStatusByIds(AZSalaryAcctEmployeeStatusEnum.SUBMITTED.getValue(), needSubmitAcctEmpIds); + } + } + + @Override + public void azReturn(SalaryAcctEmpAzApprovalStatusParam param) { + if (CollectionUtils.isEmpty(param.getAcctEmpIds())) { + return; + } + List salaryAcctEmployeePOList = listByIds(param.getAcctEmpIds()); + if (CollectionUtils.isEmpty(salaryAcctEmployeePOList) || param.getAcctEmpIds().size() != salaryAcctEmployeePOList.size()) { + throw new SalaryRunTimeException("退回失败,核算人员信息不存在或已被删除,请刷新后重试"); + } + List canNotReturnEmployeeIds = salaryAcctEmployeePOList.stream() + .filter(po -> po.getAzSubmittedStatus() == null || !po.getAzSubmittedStatus().equals(AZSalaryAcctEmployeeStatusEnum.SUBMITTED.getValue())) + .map(SalaryAcctEmployeePO::getEmployeeId) + .collect(Collectors.toList()); + + List approvedEmployeeIds = salaryAcctEmployeePOList.stream() + .filter(po -> po.getAzApprovalStatus() != null && po.getAzApprovalStatus().equals(AZSalaryAcctEmployeeStatusEnum.APPROVED.getValue()) ) + .map(SalaryAcctEmployeePO::getEmployeeId) + .collect(Collectors.toList()); + + + List needReturnAcctEmpIds = salaryAcctEmployeePOList.stream().filter(po -> !canNotReturnEmployeeIds.contains(po.getEmployeeId()) && !approvedEmployeeIds.contains(po.getEmployeeId())).map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(needReturnAcctEmpIds)) { + // 修改状态未未提交 + updateAzSubmitStatusByIds(AZSalaryAcctEmployeeStatusEnum.NOT_SUBMITTED.getValue(), needReturnAcctEmpIds); + } + if (CollectionUtils.isNotEmpty(canNotReturnEmployeeIds)) { + String canNotSubmitEmployeeNames = getSalaryEmployeeService(user).listByIds(canNotReturnEmployeeIds).stream().map(DataCollectionEmployee::getUsername).collect(Collectors.joining(",")); + throw new SalaryRunTimeException(canNotSubmitEmployeeNames + "退回失败,提交状态不是已提交"); + } + + if (CollectionUtils.isNotEmpty(approvedEmployeeIds)) { + String canNotSubmitEmployeeNames = getSalaryEmployeeService(user).listByIds(approvedEmployeeIds).stream().map(DataCollectionEmployee::getUsername).collect(Collectors.joining(",")); + throw new SalaryRunTimeException(canNotSubmitEmployeeNames + "退回失败,审批交状态不是未审核"); + } + + + } + + @Override + public void azApprove(SalaryAcctEmpAzApprovalStatusParam param) { + if (CollectionUtils.isEmpty(param.getAcctEmpIds())) { + return; + } + List salaryAcctEmployeePOList = listByIds(param.getAcctEmpIds()); + if (CollectionUtils.isEmpty(salaryAcctEmployeePOList) || param.getAcctEmpIds().size() != salaryAcctEmployeePOList.size()) { + throw new SalaryRunTimeException("审核失败,核算人员信息不存在或已被删除,请刷新后重试"); + } + List canNotApproveEmployeeIds = salaryAcctEmployeePOList.stream() + .filter(po -> po.getAzSubmittedStatus() == null || !po.getAzSubmittedStatus().equals(AZSalaryAcctEmployeeStatusEnum.SUBMITTED.getValue())) + .map(SalaryAcctEmployeePO::getEmployeeId) + .collect(Collectors.toList()); + + + List needApprovedAcctEmpIds = salaryAcctEmployeePOList.stream().filter(po -> !canNotApproveEmployeeIds.contains(po.getEmployeeId())).map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(needApprovedAcctEmpIds)) { + // 修改状态未审批 + updateAzApprovalStatusByIds(AZSalaryAcctEmployeeStatusEnum.APPROVED.getValue(), needApprovedAcctEmpIds); + } + if (CollectionUtils.isNotEmpty(canNotApproveEmployeeIds)) { + String canNotApprovedEmployeeNames = getSalaryEmployeeService(user).listByIds(canNotApproveEmployeeIds).stream().map(DataCollectionEmployee::getUsername).collect(Collectors.joining(",")); + throw new SalaryRunTimeException(canNotApprovedEmployeeNames + "审核失败,提交状态不是已提交"); + } + } + + @Override + public void azReApprove(SalaryAcctEmpAzApprovalStatusParam param) { + if (CollectionUtils.isEmpty(param.getAcctEmpIds())) { + return; + } + List salaryAcctEmployeePOList = listByIds(param.getAcctEmpIds()); + if (CollectionUtils.isEmpty(salaryAcctEmployeePOList) || param.getAcctEmpIds().size() != salaryAcctEmployeePOList.size()) { + throw new SalaryRunTimeException("弃审失败,核算人员信息不存在或已被删除,请刷新后重试"); + } + List canNotReApproveEmployeeIds = salaryAcctEmployeePOList.stream() + .filter(po -> po.getAzApprovalStatus() == null || !po.getAzApprovalStatus().equals(AZSalaryAcctEmployeeStatusEnum.APPROVED.getValue()) ) + .map(SalaryAcctEmployeePO::getEmployeeId) + .collect(Collectors.toList()); + + + List needReApprovedAcctEmpIds = salaryAcctEmployeePOList.stream().filter(po -> !canNotReApproveEmployeeIds.contains(po.getEmployeeId())).map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(needReApprovedAcctEmpIds)) { + // 修改状态未审批 + updateAzApprovalStatusByIds(AZSalaryAcctEmployeeStatusEnum.NOT_APPROVED.getValue(), needReApprovedAcctEmpIds); + } + if (CollectionUtils.isNotEmpty(canNotReApproveEmployeeIds)) { + String canNotApprovedEmployeeNames = getSalaryEmployeeService(user).listByIds(canNotReApproveEmployeeIds).stream().map(DataCollectionEmployee::getUsername).collect(Collectors.joining(",")); + throw new SalaryRunTimeException(canNotApprovedEmployeeNames + "弃审失败,审核状态不是已审核"); + } + } + + private Integer updateAzApprovalStatusByIds(String status, List salaryAcctEmpIds) { + if (CollectionUtils.isNotEmpty(salaryAcctEmpIds)) { + return getSalaryAcctEmployeeMapper().updateAzApprovalStatusByIds(status, salaryAcctEmpIds, new Date()); + } + return 0; + } + + private Integer updateAzSubmitStatusByIds(String status, List salaryAcctEmpIds) { + if (CollectionUtils.isNotEmpty(salaryAcctEmpIds)) { + return getSalaryAcctEmployeeMapper().updateAzSubmitStatusByIds(status, salaryAcctEmpIds, new Date()); + } + return 0; + } + + @Override + public List listSalaryAcctRecordIdsContainsDepIds(List depIds, List salaryAcctRecordIds) { + if (CollectionUtils.isEmpty(depIds) || CollectionUtils.isEmpty(salaryAcctRecordIds)) { + return Collections.emptyList(); + } + List> partition = Lists.partition(salaryAcctRecordIds, 300); + List resultList = new ArrayList<>(); + partition.forEach(part -> { + resultList.addAll(getSalaryAcctEmployeeMapper().listSalaryAcctRecordIdsContainsDepIds(depIds, part)); + }); + return resultList; + } } diff --git a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java index 67aff3ecd..78d7ff918 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java @@ -72,6 +72,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.util.StopWatch; import weaver.file.ImageFileManager; import weaver.hrm.User; +import weaver.hrm.company.DepartmentComInfo; import java.io.InputStream; import java.math.BigDecimal; @@ -195,6 +196,32 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc // 查询薪资核算人员 List salaryAcctEmployees = getSalaryAcctEmployeeService(user).listByParam(queryParam); + //艾志二开,增加当前登录人拥有的的部门查看权限包含的人员档案列表 + List taxAgentIds = getTaxAgentService(user).listAllTaxAgents(Long.valueOf(user.getUID())).stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + List needAuthPage = salaryAcctEmployees.stream().filter(dto -> taxAgentIds.contains(dto.getTaxAgentId())).collect(Collectors.toList()); + //查询登录人拥有查看权限的部门 + List depList = getSalaryEmployeeService(user).listDepIdByEmpId((long) user.getUID()); + if (depList.size() > 0) { + List depWithChildList = new ArrayList<>(); + for (Long depId : depList) { + try { + String depStr = DepartmentComInfo.getAllChildDepartId(depId.toString(), depId.toString()); + depWithChildList.addAll(Arrays.stream(depStr.split(",")).collect(Collectors.toList())); + } catch (Exception e) { + e.printStackTrace(); + } + } + + List depAuthPage = salaryAcctEmployees.stream().filter(f -> + depWithChildList.contains(f.getDepartmentId().toString()) + ).collect(Collectors.toList()); + if (depAuthPage.size() > 0) { + needAuthPage.addAll(depAuthPage); + needAuthPage = needAuthPage.stream().distinct().collect(Collectors.toList()); + } + } + salaryAcctEmployees = needAuthPage; + // 组装数据 List> rows = new ArrayList<>(); rows.add(headerList); @@ -244,6 +271,33 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc // 查询薪资核算人员(环比上月减少) List salaryAcctEmployees = getSalaryAcctEmployeeService(user).listByParam4Reduce(queryParam); + //艾志二开,增加当前登录人拥有的的部门查看权限包含的人员档案列表 + List taxAgentIds = getTaxAgentService(user).listAllTaxAgents(Long.valueOf(user.getUID())).stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + List needAuthPage = salaryAcctEmployees.stream().filter(dto -> taxAgentIds.contains(dto.getTaxAgentId())).collect(Collectors.toList()); + //查询登录人拥有查看权限的部门 + List depList = getSalaryEmployeeService(user).listDepIdByEmpId((long) user.getUID()); + if (depList.size() > 0) { + List depWithChildList = new ArrayList<>(); + for (Long depId : depList) { + try { + String depStr = DepartmentComInfo.getAllChildDepartId(depId.toString(), depId.toString()); + depWithChildList.addAll(Arrays.stream(depStr.split(",")).collect(Collectors.toList())); + } catch (Exception e) { + e.printStackTrace(); + } + } + + List depAuthPage = salaryAcctEmployees.stream().filter(f -> + depWithChildList.contains(f.getDepartmentId().toString()) + ).collect(Collectors.toList()); + if (depAuthPage.size() > 0) { + needAuthPage.addAll(depAuthPage); + needAuthPage = needAuthPage.stream().distinct().collect(Collectors.toList()); + } + } + salaryAcctEmployees = needAuthPage; + + // 组装数据 List> rows = new ArrayList<>(); rows.add(headerList); @@ -288,6 +342,32 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc // 查询薪资核算人员(环比上月增加) List salaryAcctEmployees = getSalaryAcctEmployeeService(user).listByParam4Add(queryParam); + //艾志二开,增加当前登录人拥有的的部门查看权限包含的人员档案列表 + List taxAgentIds = getTaxAgentService(user).listAllTaxAgents(Long.valueOf(user.getUID())).stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + List needAuthPage = salaryAcctEmployees.stream().filter(dto -> taxAgentIds.contains(dto.getTaxAgentId())).collect(Collectors.toList()); + //查询登录人拥有查看权限的部门 + List depList = getSalaryEmployeeService(user).listDepIdByEmpId((long) user.getUID()); + if (depList.size() > 0) { + List depWithChildList = new ArrayList<>(); + for (Long depId : depList) { + try { + String depStr = DepartmentComInfo.getAllChildDepartId(depId.toString(), depId.toString()); + depWithChildList.addAll(Arrays.stream(depStr.split(",")).collect(Collectors.toList())); + } catch (Exception e) { + e.printStackTrace(); + } + } + + List depAuthPage = salaryAcctEmployees.stream().filter(f -> + depWithChildList.contains(f.getDepartmentId().toString()) + ).collect(Collectors.toList()); + if (depAuthPage.size() > 0) { + needAuthPage.addAll(depAuthPage); + needAuthPage = needAuthPage.stream().distinct().collect(Collectors.toList()); + } + } + salaryAcctEmployees = needAuthPage; + // 组装数据 List> rows = new ArrayList<>(); rows.add(headerList); diff --git a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java index 38a199032..8ca265c6b 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java @@ -45,6 +45,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import weaver.hrm.User; +import weaver.hrm.company.DepartmentComInfo; import java.util.*; import java.util.stream.Collectors; @@ -208,23 +209,58 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe // 判断是否开启了分权 - Boolean needAuth = getTaxAgentService(user).isNeedAuth(currentEmployeeId); - if (needAuth) { - List salarySobPOS = getSalarySobService(user).listByAdmin(); - List salarySobIds = SalaryEntityUtil.properties(salarySobPOS, SalarySobPO::getId, Collectors.toList()); - - if (CollectionUtils.isEmpty(salarySobIds)) { - return new PageInfo<>(); - } - Collection sobIds = po.getSalarySobIds(); - if (CollectionUtils.isNotEmpty(sobIds)) { - salarySobIds = (List) SalaryEntityUtil.intersectionForList(salarySobIds, sobIds); - } - po.setSalarySobIds(salarySobIds); - } + // Boolean needAuth = getTaxAgentService(user).isNeedAuth(currentEmployeeId); + List salarySobPOS = getSalarySobService(user).listByAdmin(); + // if (needAuth) { + // List salarySobIds = SalaryEntityUtil.properties(salarySobPOS, SalarySobPO::getId, Collectors.toList()); + // + // if (CollectionUtils.isEmpty(salarySobIds)) { + // return new PageInfo<>(); + // } + // Collection sobIds = po.getSalarySobIds(); + // if (CollectionUtils.isNotEmpty(sobIds)) { + // salarySobIds = (List) SalaryEntityUtil.intersectionForList(salarySobIds, sobIds); + // } + // po.setSalarySobIds(salarySobIds); + // } // 查询薪资核算记录 List salaryAcctRecordPOS = getSalaryAcctRecordMapper().listSome(po); + + if (CollectionUtils.isNotEmpty(salaryAcctRecordPOS)) { + List salaryAcctRecordIds = salaryAcctRecordPOS.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); + //艾志二开,增加当前登录人拥有的的部门查看权限包含的人员档案列表 + List needAuthPage = salaryAcctRecordPOS.stream().filter(record -> salarySobPOS.contains(record.getSalarySobId())).collect(Collectors.toList()); + //查询登录人拥有查看权限的部门 + List depList = getSalaryEmployeeService(user).listDepIdByEmpId((long) user.getUID()); + if (depList.size() > 0) { + List depWithChildList = new ArrayList<>(); + for (Long depId : depList) { + try { + String depStr = DepartmentComInfo.getAllChildDepartId(depId.toString(), depId.toString()); + depWithChildList.addAll(Arrays.stream(depStr.split(",")).collect(Collectors.toList())); + } catch (Exception e) { + e.printStackTrace(); + } + } + // 查询核算人员中是否有这些部门下的核算人员 + List canManageSalaryAcctRecordId = getSalaryAcctEmployeeService(user).listSalaryAcctRecordIdsContainsDepIds(depWithChildList, salaryAcctRecordIds); + + List depAuthPage = salaryAcctRecordPOS.stream().filter(f -> + canManageSalaryAcctRecordId.contains(f.getId()) + ).collect(Collectors.toList()); + if (depAuthPage.size() > 0) { + needAuthPage.addAll(depAuthPage); + needAuthPage = needAuthPage.stream().distinct().collect(Collectors.toList()); + } + salaryAcctRecordPOS = needAuthPage; + } + } + + + + + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), salaryAcctRecordPOS, SalaryAcctRecordPO.class); } diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index cd3cac891..ff4026efb 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -74,6 +74,8 @@ import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.util.StopWatch; import weaver.general.BaseBean; import weaver.hrm.User; +import weaver.hrm.company.DepartmentComInfo; +import weaver.wechat.util.Utils; import java.math.BigDecimal; import java.util.*; @@ -1385,6 +1387,26 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe List adminTaxAgentList = getTaxAgentAdminService(user).listByEmployeeId(Long.valueOf(user.getUID())); Optional canOperate = adminTaxAgentList.stream().filter(po -> NumberUtils.compare(taxAgentId, po.getTaxAgentId()) == 0).findFirst(); if (!canOperate.isPresent()) { + // 艾志二开,查询登录人拥有查看权限的部门 + List depList = getSalaryEmployeeService(user).listDepIdByEmpId((long) user.getUID()); + if (depList.size() > 0) { + List depWithChildList = new ArrayList<>(); + for (Long depId : depList) { + try { + String depStr = DepartmentComInfo.getAllChildDepartId(depId.toString(), depId.toString()); + depWithChildList.addAll(Arrays.stream(depStr.split(",")).collect(Collectors.toList())); + } catch (Exception e) { + e.printStackTrace(); + } + } + if (CollectionUtils.isNotEmpty(depWithChildList)) { + List salaryAcctEmployeePOList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordId); + Optional existOptional = salaryAcctEmployeePOList.stream().filter(acctEmp -> depWithChildList.contains(Utils.null2String(acctEmp.getDepartmentId()))).findFirst(); + if (existOptional.isPresent()) { + return true; + } + } + } return false; } return true; diff --git a/src/com/engine/salary/service/impl/SalaryArchiveItemServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveItemServiceImpl.java index 9e353083e..ca925b6b3 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveItemServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveItemServiceImpl.java @@ -2,6 +2,7 @@ package com.engine.salary.service.impl; import cn.hutool.core.util.StrUtil; import com.api.formmode.mybatis.util.SqlProxyHandle; +import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.biz.SalaryArchiveBiz; @@ -10,6 +11,7 @@ import com.engine.salary.biz.SalaryItemBiz; import com.engine.salary.common.LocalDateRange; import com.engine.salary.config.SalaryElogConfig; import com.engine.salary.constant.SalaryDefaultTenantConstant; +import com.engine.salary.constant.SalaryItemConstant; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.salaryarchive.config.ArchiveFieldConfig; import com.engine.salary.entity.salaryarchive.dto.SalaryItemAdjustRecordListDTO; @@ -37,6 +39,7 @@ import com.engine.salary.util.db.IdGenerator; import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.excel.ExcelUtil; import com.engine.salary.util.page.PageInfo; +import com.engine.salary.util.page.SalaryPageUtil; import com.engine.salary.util.valid.ValidUtil; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; @@ -45,6 +48,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.hrm.User; +import weaver.wechat.util.Utils; import java.text.SimpleDateFormat; import java.util.*; @@ -652,6 +656,19 @@ public class SalaryArchiveItemServiceImpl extends Service implements SalaryArchi return salaryArchiveItemMapper.salaryItemAdjustRecordList(queryParam, salaryItemIds); } + @Override + public List salaryItemAdjustRecordTime(SalaryItemAdjustRecordQueryParam queryParam, List salaryItemIds) { + List salaryItemAdjustRecordListDTOS = salaryArchiveItemMapper.salaryItemAdjustRecordTime(queryParam, salaryItemIds); + if (CollectionUtils.isNotEmpty(queryParam.getEmployeeIds())) { + salaryItemAdjustRecordListDTOS = salaryItemAdjustRecordListDTOS.stream().filter(dto -> queryParam.getEmployeeIds().contains(dto.getEmployeeId())).collect(Collectors.toList()); + } + if (CollectionUtils.isNotEmpty(queryParam.getPositionIds())) { + Set employeeIds = SalaryEntityUtil.properties(getSalaryEmployeeService(user).listByJobtitle(queryParam.getPositionIds()), DataCollectionEmployee::getEmployeeId); + salaryItemAdjustRecordListDTOS = salaryItemAdjustRecordListDTOS.stream().filter(dto -> employeeIds.contains(dto.getEmployeeId())).collect(Collectors.toList()); + } + return salaryItemAdjustRecordListDTOS; + } + @Override public XSSFWorkbook exportAdjustRecordList(SalaryItemAdjustRecordQueryParam queryParam) { // 1.工作簿名称 @@ -822,4 +839,170 @@ public class SalaryArchiveItemServiceImpl extends Service implements SalaryArchi }); return resultList; } + + @Override + public Map azAdjustList(SalaryItemAdjustRecordQueryParam queryParam) { + Map resultMap = new HashMap<>(); + // 获取所有可被引用的薪资项目 + List salaryItemList = getSalaryArchiveItemService(user).getCanAdjustSalaryItems(); + Set userTaxAgentIds = getTaxAgentService(user).listAllTaxAgents((long) user.getUID()) + .stream().map(TaxAgentPO::getId).collect(Collectors.toSet()); + salaryItemList = salaryItemList.stream() + .filter(po -> getSalaryItemService(user).filterInRange(userTaxAgentIds, po)) + .collect(Collectors.toList()); + List salaryItemIds = salaryItemList.stream().map(SalaryItemPO::getId).collect(Collectors.toList()); + + List employeeList = getSalaryEmployeeService(user).listAll(UseEmployeeTypeEnum.ALL); + Map employeeNameMap = SalaryEntityUtil.convert2Map(employeeList, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername); + Map taxAgentNameMap = SalaryEntityUtil.convert2Map(getTaxAgentService(user).listAll(), TaxAgentPO::getId, TaxAgentPO::getName); + long currentEmployeeId = user.getUID(); + //是否开启分权 + Boolean needAuth = getTaxAgentService(user).isNeedAuth(currentEmployeeId); + if (needAuth) { + Collection taxAgentPOS = getTaxAgentService(user).listAllTaxAgentsAsAdmin(currentEmployeeId); + List taxAgentIds = SalaryEntityUtil.properties(taxAgentPOS, TaxAgentPO::getId, Collectors.toList()); + + if (CollectionUtils.isEmpty(taxAgentIds)) { + return resultMap; + } + + List salaryArchives = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().taxAgentIds(taxAgentIds).build()); + List salaryArchiveIds = SalaryEntityUtil.properties(salaryArchives, SalaryArchivePO::getId, Collectors.toList()); + queryParam.setSalaryArchiveIds(salaryArchiveIds); + } + + List listResult = getSalaryArchiveItemService(user).salaryItemAdjustRecordTime(queryParam, salaryItemIds); + // 根据薪资档案id 生效日期分组 + Map> adjustResultMap = SalaryEntityUtil.group2Map(listResult, list -> list.getSalaryArchiveId() + "_" + SalaryDateUtil.getFormatDate(list.getEffectiveTime())); + // 根据生效日期,人员id排序 + LinkedHashMap> sortedAdjustResultMap = adjustResultMap.entrySet().stream() + .sorted((entry1, entry2) -> { + String[] splitKey1 = entry1.getKey().split("_"); + String effectiveDate1 = splitKey1.length > 1 ? splitKey1[1] : ""; + String employeeId1 = Utils.null2String(CollectionUtils.isEmpty(entry1.getValue()) ? "" : entry1.getValue().get(0).getEmployeeId()); + + String[] splitKey2 = entry2.getKey().split("_"); + String effectiveDate2 = splitKey2.length > 1 ? splitKey2[1] : ""; + String employeeId2 = Utils.null2String(CollectionUtils.isEmpty(entry2.getValue()) ? "" :entry2.getValue().get(0).getEmployeeId()); + if (effectiveDate1.equals(effectiveDate2)) { + Long empId1 = NumberUtils.isCreatable(employeeId1) ? Long.valueOf(employeeId1) : 0L; + Long empId2 = NumberUtils.isCreatable(employeeId2) ? Long.valueOf(employeeId2) : 0L; + return empId1.compareTo(empId2); + } else { + return effectiveDate2.compareTo(effectiveDate1); + } + }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, + LinkedHashMap::new)); + + + List allAdjustRecordKeyList = sortedAdjustResultMap.keySet().stream().collect(Collectors.toList()); + // 分页 + PageInfo adjustRecordPageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), allAdjustRecordKeyList); + if (queryParam.isExport()) { + adjustRecordPageInfo.setList(allAdjustRecordKeyList); + } + List adjustRecordKeyList = adjustRecordPageInfo.getList(); + + LinkedHashMap> archiveIdsGroupByEffectiveDate = new LinkedHashMap<>(); + adjustRecordKeyList.stream().forEach( key -> { + String[] split = key.split("_"); + Long salaryArchiveId = split.length > 0 && NumberUtils.isCreatable(split[0])? Long.valueOf(split[0]) : 0L; + String effectiveDate = split.length > 1 ? split[1] : ""; + List archiveIdList = archiveIdsGroupByEffectiveDate.computeIfAbsent(effectiveDate, k -> new ArrayList()); + archiveIdList.add(salaryArchiveId); + }); + // 根据生效日期获取生效薪资数据 + List> dataList = new ArrayList<>(); + for (Map.Entry> entry : archiveIdsGroupByEffectiveDate.entrySet()) { + String effectiveDateStr = entry.getKey(); + Date effectiveDate = SalaryDateUtil.stringToDate(effectiveDateStr); + List salaryArchiveIds = entry.getValue(); + List salaryArchiveItemList = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(salaryArchiveIds) && CollectionUtils.isNotEmpty(salaryItemIds)) { + salaryArchiveItemList.addAll(getEffectiveItemListByDate(salaryArchiveIds, salaryItemIds, effectiveDate)); + } + + for (Long salaryArchiveId : salaryArchiveIds) { + List salaryItemAdjustRecordListDTOS = adjustResultMap.get(salaryArchiveId + "_" + effectiveDateStr); + String userName = ""; + String adjustReason = ""; + String operator = ""; + if (CollectionUtils.isNotEmpty(salaryItemAdjustRecordListDTOS)) { + SalaryItemAdjustRecordListDTO salaryItemAdjustRecordListDTO = salaryItemAdjustRecordListDTOS.get(0); + userName = employeeNameMap.getOrDefault(salaryItemAdjustRecordListDTO.getEmployeeId(), ""); + adjustReason = salaryItemAdjustRecordListDTO.getAdjustReason(); + operator = salaryItemAdjustRecordListDTO.getOperator(); + } + SalaryArchivePO salaryArchivePO = getSalaryArchiveService(user).getById(salaryArchiveId); + HashMap dataMap = new HashMap<>(); + dataMap.put("username", userName); + dataMap.put("adjustReason", SalaryArchiveItemAdjustReasonEnum.getDefaultLabelByValue(adjustReason)); + dataMap.put("operator", operator); + dataMap.put("effectiveTime", effectiveDateStr); + dataMap.put("taxAgentName", taxAgentNameMap.getOrDefault(salaryArchivePO.getTaxAgentId(), "")); + List salaryArchiveItemValuelList = salaryArchiveItemList.stream().filter(i -> i.getSalaryArchiveId().equals(salaryArchiveId)).collect(Collectors.toList()); + salaryArchiveItemValuelList.forEach(i -> { + dataMap.put(i.getSalaryItemId() + SalaryItemConstant.DYNAMIC_SUFFIX, i.getItemValue()); + }); + dataList.add(dataMap); + } + } + + + // 表头 + List columns = new ArrayList<>(); + columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(85429, "姓名"), "username")); + columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), "taxAgentName")); + columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "生效日期"), "effectiveTime")); + for (SalaryItemPO salaryItem : salaryItemList) { + columns.add(new WeaTableColumn("100px", salaryItem.getName(), salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX)); + } + columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86184, "调整原因"), "adjustReason")); + columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "操作人"), "operator")); + + + PageInfo> pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize()); + pageInfo.setTotal(adjustRecordPageInfo.getTotal()); + pageInfo.setList(dataList); + + resultMap.put("columns", columns); + resultMap.put("pageInfo", pageInfo); + return resultMap; + } + + + + public List getEffectiveItemListByDate(Collection salaryArchivesIds, Collection salaryItemIds, Date effectiveTime) { + if (CollectionUtils.isEmpty(salaryItemIds) || effectiveTime == null) { + return Collections.EMPTY_LIST; + } + List salaryArchiveItems = salaryArchiveItemMapper.getCurrentEffectiveItemList(SalaryArchiveItemQueryParam.builder().salaryArchivesIds(salaryArchivesIds).salaryItemIds(salaryItemIds).effectiveTime(effectiveTime).build()); + return salaryArchiveItems.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getSalaryArchiveId() + "-" + f.getSalaryItemId()))), ArrayList::new)); + } + + @Override + public XSSFWorkbook exportAzAdjustList(SalaryItemAdjustRecordQueryParam queryParam) { + queryParam.setExport(true); + Map map = azAdjustList(queryParam); + List columns = (List)map.get("columns"); + PageInfo> pageInfo = (PageInfo>)map.get("pageInfo"); + List> list = pageInfo.getList(); + + //获取操作按钮资源 + List> rowList = new ArrayList<>(); + List columnRow = columns.stream().map(WeaTableColumn::getText).collect(Collectors.toList()); + rowList.add(columnRow); + for (Map dataMap : list) { + List singleRow = new ArrayList<>(); + for (WeaTableColumn column : columns) { + singleRow.add(Utils.null2String(dataMap.get(column.getColumn()))); + } + rowList.add(singleRow); + } + + //获取excel + return ExcelUtil.genWorkbookV2(rowList, "累计情况明细", false); + + + } } diff --git a/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java b/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java index d2b558d71..4cd250e2f 100644 --- a/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java @@ -129,6 +129,19 @@ public class SalaryEmployeeServiceImpl extends Service implements SalaryEmployee return result; } + public List listByJobtitle(List jobtitleIds) { + List result = new ArrayList<>(); + if (CollectionUtils.isEmpty(jobtitleIds)) { + return result; + } + List> partition = Lists.partition(jobtitleIds, 500); + partition.forEach(part -> { + result.addAll(getEmployMapper().listByJobtitle(part)); + }); + SalaryI18nUtil.i18nList(result); + return result; + } + @Override public List listAllForReport() { List result = employBiz.listAllForReport(); @@ -633,6 +646,10 @@ public class SalaryEmployeeServiceImpl extends Service implements SalaryEmployee return employBiz.listDepIdByEmpId(employeeId); } + public List listDepIdByEmpIdAndOpe(Long employeeId, Integer operateId) { + return employBiz.listDepIdByEmpIdAndOpe(employeeId, operateId); + } + @Override public List listEmpIdByDepId(List departmentIds) { return employBiz.listEmpIdByDepId(departmentIds); diff --git a/src/com/engine/salary/util/excel/ExcelUtilPlus.java b/src/com/engine/salary/util/excel/ExcelUtilPlus.java index 07de26c60..f10834532 100644 --- a/src/com/engine/salary/util/excel/ExcelUtilPlus.java +++ b/src/com/engine/salary/util/excel/ExcelUtilPlus.java @@ -14,10 +14,6 @@ import java.awt.Color; import java.math.BigDecimal; import java.util.List; import java.util.*; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -309,6 +305,96 @@ public class ExcelUtilPlus { return workbook; } + public static XSSFWorkbook genWorkbookV2ForAzSocial(List> rowList, String sheetName) { + XSSFWorkbook workbook = new XSSFWorkbook(); + + // 设置title样式 + XSSFCellStyle titleCellStyle = workbook.createCellStyle(); + XSSFFont titleFont = workbook.createFont(); + titleFont.setBold(true); + titleFont.setFontName("仿宋"); + titleFont.setFontHeightInPoints((short) 15); + titleCellStyle.setFont(titleFont); + titleCellStyle.setAlignment(HorizontalAlignment.CENTER); + titleCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//背景色 + titleCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + titleCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + titleCellStyle.setBorderLeft(BorderStyle.THIN); + titleCellStyle.setBorderRight(BorderStyle.THIN); + titleCellStyle.setBorderTop(BorderStyle.THIN); + titleCellStyle.setBorderBottom(BorderStyle.THIN); + + + // 设置主体样式 + XSSFCellStyle cellStyle = workbook.createCellStyle(); + XSSFFont font = workbook.createFont(); + font.setFontName("宋体"); + font.setFontHeightInPoints((short) 10);// 设置字体大小 + cellStyle.setFont(font);// 选择需要用到的字体格式 + cellStyle.setWrapText(true); + cellStyle.setBorderLeft(BorderStyle.THIN); + cellStyle.setBorderRight(BorderStyle.THIN); + cellStyle.setBorderTop(BorderStyle.THIN); + cellStyle.setBorderBottom(BorderStyle.THIN); + + XSSFSheet sheet = workbook.createSheet(sheetName); + //自适应宽度 + sheet.autoSizeColumn(0, true); + //默认列宽 + sheet.setDefaultColumnWidth(20); + //默认行高 + sheet.setDefaultRowHeightInPoints(18); + //遍历设置列宽 + List header = rowList.get(0); + for (int i = 0; i < header.size(); i++) { + sheet.setColumnWidth(i, Math.min(255, Math.max(12, header.get(i).toString().length() * 4)) * 256); + } + + for (int rowIndex = 0; rowIndex < rowList.size(); rowIndex++) { + List infoList = rowList.get(rowIndex); + XSSFRow row = sheet.createRow(rowIndex); + float height = 18; + float finalHeight = 18; + + for (int cellIndex = 0; cellIndex < infoList.size(); cellIndex++) { + XSSFCell cell = row.createCell(cellIndex); + if (rowIndex == 0) { + cell.setCellStyle(titleCellStyle); + } else { + cell.setCellStyle(cellStyle); + } + Object o = infoList.get(cellIndex); + if (o instanceof String) { + cell.setCellType(CellType.STRING); + cell.setCellValue(String.valueOf(o)); + } else if (o instanceof BigDecimal) { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(o == null ? 0 : ((BigDecimal) o).doubleValue()); + } else if (o instanceof Boolean) { + cell.setCellType(CellType.BOOLEAN); + cell.setCellValue(String.valueOf(o)); + } else if (o instanceof Date) { + cell.setCellType(CellType.STRING); + cell.setCellValue(SalaryDateUtil.getFormatLocalDate((Date) o)); + } else { + cell.setCellType(CellType.STRING); + cell.setCellValue(o == null ? "" : o.toString()); + } + + //判断是否要调整高度 + int width = sheet.getColumnWidth(cellIndex) / 256; + finalHeight = getFinalHeight(o, width, finalHeight, height); + } + row.setHeightInPoints(finalHeight); + + if (rowIndex > 0 && rowIndex%2 == 0) { + sheet.addMergedRegion(new CellRangeAddress(rowIndex-1, rowIndex, 0, 0)); + + } + } + return workbook; + } + public static XSSFWorkbook genWorkbookV2(List> rowList, String sheetName, List comments) { XSSFWorkbook workbook = new XSSFWorkbook(); diff --git a/src/com/engine/salary/web/SISchemeController.java b/src/com/engine/salary/web/SISchemeController.java index 89772a896..c13f6fb5e 100644 --- a/src/com/engine/salary/web/SISchemeController.java +++ b/src/com/engine/salary/web/SISchemeController.java @@ -101,6 +101,47 @@ public class SISchemeController { } + /** + * 导出所有社保福利方案列表 + * + * @param request + * @param response + * @return + */ + @POST + @Path("/exportAll") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response exportAll(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody InsuranceSchemeParam insuranceSchemeParam) { + try { + User user = HrmUserVarify.getUser(request, response); + XSSFWorkbook workbook = getSISchemeWrapper(user).exportAll(insuranceSchemeParam); + String fileName; + //表头 + fileName = SalaryI18nUtil.getI18nLabel(0, "社保福利方案"); + + fileName = fileName + LocalDate.now(); + try { + fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + StreamingOutput output = outputStream -> { + workbook.write(outputStream); + outputStream.flush(); + }; + response.setContentType("application/octet-stream"); + return Response.ok(output) + .header("Content-disposition", "attachment;filename=" + fileName) + .header("Cache-Control", "no-cache").build(); + } catch (Exception e) { + log.error("社保福利方案导出异常", e); + throw e; + } + } + + + /** * 新增 * diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index 64f5a7bbd..e3af0dd59 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -501,6 +501,45 @@ public class SalaryAcctController { return new ResponseResult(user).run(getSalaryAcctEmployeeWrapper(user)::lockEmp, param); } + + // 艾志 提交 + @POST + @Path("/acctresult/azSubmit") + @Produces(MediaType.APPLICATION_JSON) + public String azSubmit(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctEmpAzApprovalStatusParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctEmployeeWrapper(user)::azSubmit, param); + } + + // 艾志 退回 + @POST + @Path("/acctresult/azReturn") + @Produces(MediaType.APPLICATION_JSON) + public String azReturn(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctEmpAzApprovalStatusParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctEmployeeWrapper(user)::azReturn, param); + } + + + // 艾志 审核 + @POST + @Path("/acctresult/azApprove") + @Produces(MediaType.APPLICATION_JSON) + public String azApprove(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctEmpAzApprovalStatusParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctEmployeeWrapper(user)::azApprove, param); + } + + // 艾志 弃审 + @POST + @Path("/acctresult/azReApprove") + @Produces(MediaType.APPLICATION_JSON) + public String azReApprove(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctEmpAzApprovalStatusParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctEmployeeWrapper(user)::azReApprove, param); + } + + //批量更新 @POST @Path("/acctresult/batchUpdate") diff --git a/src/com/engine/salary/web/SalaryArchiveController.java b/src/com/engine/salary/web/SalaryArchiveController.java index ad775cc58..d9225f28e 100644 --- a/src/com/engine/salary/web/SalaryArchiveController.java +++ b/src/com/engine/salary/web/SalaryArchiveController.java @@ -788,6 +788,45 @@ public class SalaryArchiveController { return new ResponseResult>(user).run(getSalaryArchiveItemWrapper(user)::adjustRecordList, queryParam); } + /** + * 艾志 调薪列表 + * + * @return + */ + @POST + @Path("/azAdjustList") + @Produces(MediaType.APPLICATION_JSON) + public String azAdjustList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryItemAdjustRecordQueryParam queryParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryArchiveItemWrapper(user)::azAdjustList, queryParam); + } + + /** + * 艾志 导出调薪列表 + * + * @return + */ + @POST + @Path("/exportAzAdjustList") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response exportAzAdjustList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryItemAdjustRecordQueryParam queryParam) {; + User user = HrmUserVarify.getUser(request, response); + XSSFWorkbook workbook = getSalaryArchiveItemWrapper(user).exportAzAdjustList(queryParam); + String time = LocalDate.now().toString(); + String fileName = "福利档案报表" + time; + try { + fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + StreamingOutput output = outputStream -> { + workbook.write(outputStream); + outputStream.flush(); + }; + response.setContentType("application/octet-stream"); + return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build(); + } + /** * 单个档案的薪资项目调整记录列表 * diff --git a/src/com/engine/salary/wrapper/SISchemeWrapper.java b/src/com/engine/salary/wrapper/SISchemeWrapper.java index ecd60fea2..bc7c44261 100644 --- a/src/com/engine/salary/wrapper/SISchemeWrapper.java +++ b/src/com/engine/salary/wrapper/SISchemeWrapper.java @@ -7,6 +7,7 @@ import com.engine.salary.entity.sischeme.param.InsuranceSchemeParam; import com.engine.salary.service.SISchemeService; import com.engine.salary.service.impl.SISchemeServiceImpl; import com.engine.salary.util.page.PageInfo; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.hrm.User; /** @@ -25,4 +26,8 @@ public class SISchemeWrapper extends Service { public PageInfo listPage(InsuranceSchemeParam param) { return getSISchemeService(user).list(param); } + + public XSSFWorkbook exportAll(InsuranceSchemeParam insuranceSchemeParam) { + return getSISchemeService(user).exportAll(insuranceSchemeParam); + } } diff --git a/src/com/engine/salary/wrapper/SalaryAcctEmployeeWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctEmployeeWrapper.java index 9aa36bec9..edd5099c9 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctEmployeeWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctEmployeeWrapper.java @@ -206,4 +206,20 @@ public class SalaryAcctEmployeeWrapper extends Service { public PageInfo listPage4NotDeclareByParam(AbnormalEmployeeListQueryParam param) { return getSalaryAcctEmployeeService(user).listPage4NotDeclareByParam(param); } + + public void azSubmit(SalaryAcctEmpAzApprovalStatusParam param) { + getSalaryAcctEmployeeService(user).azSubmit(param); + } + + public void azReturn(SalaryAcctEmpAzApprovalStatusParam param) { + getSalaryAcctEmployeeService(user).azReturn(param); + } + + public void azApprove(SalaryAcctEmpAzApprovalStatusParam param) { + getSalaryAcctEmployeeService(user).azApprove(param); + } + + public void azReApprove(SalaryAcctEmpAzApprovalStatusParam param) { + getSalaryAcctEmployeeService(user).azReApprove(param); + } } diff --git a/src/com/engine/salary/wrapper/SalaryAcctRecordWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctRecordWrapper.java index 7e352ce91..e9fdfe61c 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctRecordWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctRecordWrapper.java @@ -146,7 +146,9 @@ public class SalaryAcctRecordWrapper extends Service implements SalaryAcctRecord Set taxAgentIds = SalaryEntityUtil.properties(salarySobPOS, SalarySobPO::getTaxAgentId); List taxAgentPOS = getTaxAgentService(user).listByIds(taxAgentIds); // 转换成列表dto - List salaryAcctRecordListDTOS = SalaryAcctRecordBO.convert2ListDTO(list, salarySobPOS, employeeComInfos, salaryAcctEmployeeCountDTOS, salarySendCheckResult, taxAgentPOS, needApprovalSalarySobIds, approvalCanFile, approvalCanReCalc); + // 获取当前登录人员是否有操作权限 + Collection canManageTaxAgents = getTaxAgentService(user).listAllTaxAgents(Long.valueOf(user.getUID())); + List salaryAcctRecordListDTOS = SalaryAcctRecordBO.convert2ListDTO(list, salarySobPOS, employeeComInfos, salaryAcctEmployeeCountDTOS, salarySendCheckResult, taxAgentPOS, needApprovalSalarySobIds, approvalCanFile, approvalCanReCalc, CollectionUtils.isNotEmpty(canManageTaxAgents)); dtoPage.setList(salaryAcctRecordListDTOS); // 规则设置中是否开启审批功能,默认关闭 if (CollectionUtils.isEmpty(needApprovalSalarySobIds)) { diff --git a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java index 39e39c263..7f9e6ab56 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java @@ -12,6 +12,7 @@ import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO; import com.engine.salary.entity.salaryacct.dto.SalaryCalcTaxInfoDTO; import com.engine.salary.entity.salaryacct.param.*; import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; +import com.engine.salary.enums.salaryaccounting.LockStatusEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.service.*; import com.engine.salary.service.impl.*; @@ -19,6 +20,7 @@ import com.engine.salary.sys.service.SalarySysConfService; import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.page.PageInfo; +import com.engine.salary.util.page.SalaryPageUtil; import com.engine.salary.util.valid.ValidUtil; import com.engine.salary.wrapper.proxy.SalaryAcctResultWrapperProxy; import lombok.extern.slf4j.Slf4j; @@ -102,6 +104,12 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult // 构建薪资核算结果列表的表头 List columns = getSalaryAcctExcelService(user).listWeaTableColumn(salaryAcctRecordPO); + WeaTableColumnGroup tjColumn = new WeaTableColumnGroup(SalaryPageUtil.selfAdaption("提交状态", 65), "提交状态", "submittedStatus", LockStatusEnum.UNLOCK.getDefaultLabel()); + tjColumn.setFixed("right"); + columns.add(tjColumn); + WeaTableColumnGroup spColumn = new WeaTableColumnGroup(SalaryPageUtil.selfAdaption("审批状态", 65), "审批状态", "approvalStatus", LockStatusEnum.UNLOCK.getDefaultLabel()); + spColumn.setFixed("right"); + columns.add(spColumn); Map datas = new HashMap<>(); datas.put("pageInfo", page); diff --git a/src/com/engine/salary/wrapper/SalaryArchiveItemWrapper.java b/src/com/engine/salary/wrapper/SalaryArchiveItemWrapper.java index 50b6d10a5..f0909bb9e 100644 --- a/src/com/engine/salary/wrapper/SalaryArchiveItemWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryArchiveItemWrapper.java @@ -2,8 +2,8 @@ package com.engine.salary.wrapper; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; -import com.engine.salary.config.SalaryElogConfig; import com.engine.hrmelog.entity.dto.LoggerContext; +import com.engine.salary.config.SalaryElogConfig; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.salaryarchive.dto.SalaryArchiveItemFormDTO; import com.engine.salary.entity.salaryarchive.dto.SalaryItemAdjustRecordListDTO; @@ -499,4 +499,12 @@ public class SalaryArchiveItemWrapper extends Service implements SalaryArchiveIt } return null; } + + public Map azAdjustList(SalaryItemAdjustRecordQueryParam queryParam) { + return getSalaryArchiveItemService(user).azAdjustList(queryParam); + } + + public XSSFWorkbook exportAzAdjustList(SalaryItemAdjustRecordQueryParam queryParam) { + return getSalaryArchiveItemService(user).exportAzAdjustList(queryParam); + } } diff --git a/src/com/engine/salary/wrapper/TaxAgentWrapper.java b/src/com/engine/salary/wrapper/TaxAgentWrapper.java index 7c5b6bf5a..9c094747d 100644 --- a/src/com/engine/salary/wrapper/TaxAgentWrapper.java +++ b/src/com/engine/salary/wrapper/TaxAgentWrapper.java @@ -119,6 +119,13 @@ public class TaxAgentWrapper extends Service { Collection taxAgentPOS = getTaxAgentService(user).listAllTaxAgentsAsTaxDeclareAdmin(Long.valueOf(user.getUID())); resultMap.put("isTaxDeclareAdmin", CollectionUtils.isNotEmpty(taxAgentPOS)); + // 艾志 - 提交操作权限 + List submitAuthList = getSalaryEmployeeService(user).listDepIdByEmpIdAndOpe(currentEmployeeId, 0); + resultMap.put("submitAuth", !CollectionUtils.isEmpty(submitAuthList)); + + // 艾志 - 确认操作权限 + List confirmAuthList = getSalaryEmployeeService(user).listDepIdByEmpIdAndOpe(currentEmployeeId, 1); + resultMap.put("confirmAuth", !CollectionUtils.isEmpty(confirmAuthList)); return resultMap; }