From 4c05906f03f245ba7c86d31be92fe3123591e95d Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Mon, 12 May 2025 17:42:15 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=94=E7=89=B9cbs=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Mysql/sql202505120103WHLTKJGFYXGS.sql | 43 ++ .../api/salary/web/SalaryCBSController.java | 9 + .../action/LtChangeCbsPushStatusAction.java | 127 ++++ .../entity/cbs/dto/PaymentApplyAgentDTO.java | 59 ++ .../cbs/dto/PaymentApplyAgentRequest.java | 25 + .../cbs/dto/PaymentApplySubmitReqDTO.java | 100 ++++ .../entity/cbs/dto/SalaryCBSBaseInfoDTO.java | 38 ++ .../entity/cbs/dto/SalaryCBSInfoListDTO.java | 77 +++ .../entity/cbs/dto/SalaryCBSPushListDTO.java | 73 +++ .../salary/entity/cbs/dto/SalaryCardInfo.java | 36 ++ .../salary/entity/cbs/param/CBSPushParam.java | 29 + .../cbs/param/SalaryCBSInfoQueryParam.java | 92 +++ .../salary/entity/cbs/po/SalaryCbsInfoPO.java | 72 +++ .../salary/entity/cbs/po/SalaryCbsPO.java | 59 ++ .../salary/entity/cbs/po/SalaryCbsPushPO.java | 52 ++ .../salaryaccounting/CbsPushStatusEnum.java | 55 ++ .../SalaryAcctRecordStatusEnum.java | 1 + .../mapper/cbs/SalaryCbsInfoMapper.java | 75 +++ .../salary/mapper/cbs/SalaryCbsInfoMapper.xml | 553 ++++++++++++++++++ .../salary/mapper/cbs/SalaryCbsMapper.java | 76 +++ .../salary/mapper/cbs/SalaryCbsMapper.xml | 257 ++++++++ .../mapper/cbs/SalaryCbsPushMapper.java | 68 +++ .../salary/mapper/cbs/SalaryCbsPushMapper.xml | 210 +++++++ .../service/SalaryAcctRecordService.java | 5 + .../salary/service/SalaryCbsInfoService.java | 74 +++ .../salary/service/SalaryCbsPushService.java | 64 ++ .../salary/service/SalaryCbsService.java | 86 +++ .../impl/SalaryAcctRecordServiceImpl.java | 68 ++- .../service/impl/SalaryBillServiceImpl.java | 32 + .../impl/SalaryCbsInfoServiceImpl.java | 518 ++++++++++++++++ .../impl/SalaryCbsPushServiceImpl.java | 61 ++ .../service/impl/SalaryCbsServiceImpl.java | 221 +++++++ .../engine/salary/util/SalaryTokenUtil.java | 60 ++ .../salary/web/SalaryAcctController.java | 9 + .../salary/web/SalaryCBSController.java | 276 +++++++++ .../wrapper/SalaryAcctRecordWrapper.java | 8 + .../salary/wrapper/SalaryCBSWrapper.java | 134 +++++ 37 files changed, 3800 insertions(+), 2 deletions(-) create mode 100644 resource/sqlupgrade/Mysql/sql202505120103WHLTKJGFYXGS.sql create mode 100644 src/com/api/salary/web/SalaryCBSController.java create mode 100644 src/com/engine/salary/action/LtChangeCbsPushStatusAction.java create mode 100644 src/com/engine/salary/entity/cbs/dto/PaymentApplyAgentDTO.java create mode 100644 src/com/engine/salary/entity/cbs/dto/PaymentApplyAgentRequest.java create mode 100644 src/com/engine/salary/entity/cbs/dto/PaymentApplySubmitReqDTO.java create mode 100644 src/com/engine/salary/entity/cbs/dto/SalaryCBSBaseInfoDTO.java create mode 100644 src/com/engine/salary/entity/cbs/dto/SalaryCBSInfoListDTO.java create mode 100644 src/com/engine/salary/entity/cbs/dto/SalaryCBSPushListDTO.java create mode 100644 src/com/engine/salary/entity/cbs/dto/SalaryCardInfo.java create mode 100644 src/com/engine/salary/entity/cbs/param/CBSPushParam.java create mode 100644 src/com/engine/salary/entity/cbs/param/SalaryCBSInfoQueryParam.java create mode 100644 src/com/engine/salary/entity/cbs/po/SalaryCbsInfoPO.java create mode 100644 src/com/engine/salary/entity/cbs/po/SalaryCbsPO.java create mode 100644 src/com/engine/salary/entity/cbs/po/SalaryCbsPushPO.java create mode 100644 src/com/engine/salary/enums/salaryaccounting/CbsPushStatusEnum.java create mode 100644 src/com/engine/salary/mapper/cbs/SalaryCbsInfoMapper.java create mode 100644 src/com/engine/salary/mapper/cbs/SalaryCbsInfoMapper.xml create mode 100644 src/com/engine/salary/mapper/cbs/SalaryCbsMapper.java create mode 100644 src/com/engine/salary/mapper/cbs/SalaryCbsMapper.xml create mode 100644 src/com/engine/salary/mapper/cbs/SalaryCbsPushMapper.java create mode 100644 src/com/engine/salary/mapper/cbs/SalaryCbsPushMapper.xml create mode 100644 src/com/engine/salary/service/SalaryCbsInfoService.java create mode 100644 src/com/engine/salary/service/SalaryCbsPushService.java create mode 100644 src/com/engine/salary/service/SalaryCbsService.java create mode 100644 src/com/engine/salary/service/impl/SalaryCbsInfoServiceImpl.java create mode 100644 src/com/engine/salary/service/impl/SalaryCbsPushServiceImpl.java create mode 100644 src/com/engine/salary/service/impl/SalaryCbsServiceImpl.java create mode 100644 src/com/engine/salary/web/SalaryCBSController.java create mode 100644 src/com/engine/salary/wrapper/SalaryCBSWrapper.java diff --git a/resource/sqlupgrade/Mysql/sql202505120103WHLTKJGFYXGS.sql b/resource/sqlupgrade/Mysql/sql202505120103WHLTKJGFYXGS.sql new file mode 100644 index 000000000..f7e91927a --- /dev/null +++ b/resource/sqlupgrade/Mysql/sql202505120103WHLTKJGFYXGS.sql @@ -0,0 +1,43 @@ +CREATE TABLE hrsa_salary_cbs ( + id bigint NOT NULL, + salary_month date NOT NULL, + salary_accounting_id bigint NOT NULL DEFAULT 0 , + salary_sob_id bigint NOT NULL, + last_push_time datetime NULL, + creator bigint NOT NULL DEFAULT 0, + create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + delete_type int NOT NULL DEFAULT 0, + PRIMARY KEY (id) USING BTREE +); + +CREATE TABLE hrsa_salary_cbs_info ( + id bigint NOT NULL, + salary_cbs_id bigint NOT NULL, + employee_id bigint NOT NULL DEFAULT 0 , + push_status int NOT NULL DEFAULT 0, + push_time datetime NULL DEFAULT NULL, + creator bigint NOT NULL DEFAULT 0, + create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP , + update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + delete_type int NOT NULL DEFAULT 0, + employee_type int NULL DEFAULT NULL, + push_value varchar(255) NULL DEFAULT NULL, + reference_num varchar(1000) NULL DEFAULT NULL, + bus_num varchar(500) NULL DEFAULT NULL, + PRIMARY KEY (id) USING BTREE +); + + +CREATE TABLE hrsa_salary_cbs_push ( + id bigint NOT NULL, + salary_cbs_id varchar(3000) NULL DEFAULT NULL, + totalEmp varchar(255) NULL DEFAULT '0', + totalValue varchar(255) NULL DEFAULT NULL, + reference_num varchar(500) NULL DEFAULT NULL, + creator bigint NOT NULL DEFAULT 0, + return_value varchar(5000) NULL DEFAULT NULL, + create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + delete_type int NOT NULL DEFAULT 0, + PRIMARY KEY (id) USING BTREE +); \ No newline at end of file diff --git a/src/com/api/salary/web/SalaryCBSController.java b/src/com/api/salary/web/SalaryCBSController.java new file mode 100644 index 000000000..b8437da95 --- /dev/null +++ b/src/com/api/salary/web/SalaryCBSController.java @@ -0,0 +1,9 @@ +package com.api.salary.web; + + +import javax.ws.rs.Path; + +@Path("/bs/hrmsalary/cbs") +public class SalaryCBSController extends com.engine.salary.web.SalaryCBSController{ + +} diff --git a/src/com/engine/salary/action/LtChangeCbsPushStatusAction.java b/src/com/engine/salary/action/LtChangeCbsPushStatusAction.java new file mode 100644 index 000000000..f930f6bc4 --- /dev/null +++ b/src/com/engine/salary/action/LtChangeCbsPushStatusAction.java @@ -0,0 +1,127 @@ +package com.engine.salary.action; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.common.LocalDateRange; +import com.engine.salary.entity.cbs.po.SalaryCbsPO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; +import com.engine.salary.enums.salaryaccounting.CbsPushStatusEnum; +import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum; +import com.engine.salary.service.SalaryAcctRecordService; +import com.engine.salary.service.SalaryCbsInfoService; +import com.engine.salary.service.SalaryCbsService; +import com.engine.salary.service.impl.SalaryAcctRecordServiceImpl; +import com.engine.salary.service.impl.SalaryCbsInfoServiceImpl; +import com.engine.salary.service.impl.SalaryCbsServiceImpl; +import com.engine.salary.util.SalaryDateUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.math.NumberUtils; +import weaver.general.Util; +import weaver.hrm.User; +import weaver.interfaces.workflow.action.Action; +import weaver.soa.workflow.request.Cell; +import weaver.soa.workflow.request.Property; +import weaver.soa.workflow.request.RequestInfo; +import weaver.soa.workflow.request.Row; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @ClassName LtChangeCbsPushStatusAction + * @author Harryxzy + * @date 2025/5/12 11:04 + * @description 联特修改cbs推送数据的 + */ +@Slf4j +public class LtChangeCbsPushStatusAction implements Action { + + + + + private SalaryAcctRecordService getSalaryAcctRecordService(User user) { + return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user); + } + private SalaryCbsService getSalaryCbsService(User user) { + return ServiceUtil.getService(SalaryCbsServiceImpl.class, user); + } + + private SalaryCbsInfoService getSalaryCbsInfoService(User user) { + return ServiceUtil.getService(SalaryCbsInfoServiceImpl.class, user); + } + + private String tableName; + + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + + + @Override + public String execute(RequestInfo requestInfo) { + try { + + Property[] properties = requestInfo.getMainTableInfo().getProperty(); + Map fieldMap = Arrays.stream(properties).collect(Collectors.toMap(Property::getName, + property -> Util.null2String(property.getValue()))); + + User user = new User(); + user.setUid(1); + // 获取薪资所属月 + String salaryMonthStr = fieldMap.get("xzszy"); + Date salaryMonth = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonthStr); + if (salaryMonth == null) { + log.error("薪资所属月格式错误 requestId:{} value:{}", requestInfo.getRequestid(), salaryMonthStr); + requestInfo.getRequestManager().setMessage("薪资所属月格式错误,yyyy-MM"); + return FAILURE_AND_CONTINUE; + } + // 获取薪资核算记录 + LocalDateRange salaryMonthRange = new LocalDateRange().setFromDate(salaryMonth).setEndDate(salaryMonth); + List salaryAcctRecordPOS = getSalaryAcctRecordService(user).listBySalaryMonth(salaryMonthRange); + List salaryAcctRecordIds = salaryAcctRecordPOS.stream() + .filter(po -> po.getStatus().equals(SalaryAcctRecordStatusEnum.PUSHED.getValue())) + .map(SalaryAcctRecordPO::getId) + .collect(Collectors.toList()); + // 获取cbs推送记录 + List salaryCbsPOS = getSalaryCbsService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds); + List cbsIdList = salaryCbsPOS.stream().map(SalaryCbsPO::getId).collect(Collectors.toList()); + + // 获取需要变更的人员id + List needChangeEmpIds = new ArrayList<>(); + Row[] rows = requestInfo.getDetailTableInfo().getDetailTable(0).getRow(); + if (rows == null || rows.length == 0) { + log.error("联特工资卡信息变更跳过,明细表为空"); + // 不执行action + return SUCCESS; + } + + for (Row r : rows) { + Cell[] c = r.getCell();// 每行数据再按列存储 + // 指定列 + HashMap rowMap = new HashMap<>(); + for (Cell c1 : c) { + String name = c1.getName();// 明细字段名称 + if (name.equals("ygxm") && NumberUtils.isCreatable(c1.getValue())) { + needChangeEmpIds.add(Long.valueOf(c1.getValue())); + } + } + } + if (CollectionUtils.isNotEmpty(cbsIdList)) { + // 修改状态 + getSalaryCbsInfoService(user).updatePushStatusByCbsIdsAndEmpIds(cbsIdList, needChangeEmpIds, CbsPushStatusEnum.NOT_PUSHED.getValue()); + } + + } catch (Exception e) { + log.error("联特工资卡信息变更出错", e); + requestInfo.getRequestManager().setMessage(e.getMessage()); + return FAILURE_AND_CONTINUE; + } + return SUCCESS; + } +} diff --git a/src/com/engine/salary/entity/cbs/dto/PaymentApplyAgentDTO.java b/src/com/engine/salary/entity/cbs/dto/PaymentApplyAgentDTO.java new file mode 100644 index 000000000..b5e949b45 --- /dev/null +++ b/src/com/engine/salary/entity/cbs/dto/PaymentApplyAgentDTO.java @@ -0,0 +1,59 @@ +package com.engine.salary.entity.cbs.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Harryxzy + * @ClassName PaymentApplyAgentDTO + * @date 2025/05/08 13:28 + * @description 代发明细信息 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PaymentApplyAgentDTO { + + // 每笔明细的金额 Y + private String dtlAmount; + + // 是否跨行 N Y:跨行、N:同行 + private String dtlBankFlag; + + // 联行号 同行时可不传联行号,跨行必传 + private String dtlCnapsCode; + + private String dtlExtend1; + private String dtlExtend2; + private String dtlExtend3; + private String dtlExtend4; + private String dtlExtend5; + private String dtlExtend6; + + // 明细用途 N + private String dtlPurpose; + + // 明细摘要 N + private String dtlRemark; + + // 收款账号 Y + private String dtlRevAccount; + + // 收款账号银行号|地区码 N + private String dtlRevBankArea; + + // 收款开户地 N + private String dtlRevBankCity; + + // 收款开户行 N + private String dtlRevBankName; + + // 收款账户名称 N + private String dtlRevName; + + // 明细序号N + private String dtlSeqNum; +} diff --git a/src/com/engine/salary/entity/cbs/dto/PaymentApplyAgentRequest.java b/src/com/engine/salary/entity/cbs/dto/PaymentApplyAgentRequest.java new file mode 100644 index 000000000..9d23f6034 --- /dev/null +++ b/src/com/engine/salary/entity/cbs/dto/PaymentApplyAgentRequest.java @@ -0,0 +1,25 @@ +package com.engine.salary.entity.cbs.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author Harryxzy + * @ClassName PaymentApplyAgentRequest + * @date 2025/05/08 13:50 + * @description + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PaymentApplyAgentRequest { + + private PaymentApplySubmitReqDTO paymentApplySubmitReqDTO; + + private List paymentApplyAgentDTO; +} diff --git a/src/com/engine/salary/entity/cbs/dto/PaymentApplySubmitReqDTO.java b/src/com/engine/salary/entity/cbs/dto/PaymentApplySubmitReqDTO.java new file mode 100644 index 000000000..9ff90c7aa --- /dev/null +++ b/src/com/engine/salary/entity/cbs/dto/PaymentApplySubmitReqDTO.java @@ -0,0 +1,100 @@ +package com.engine.salary.entity.cbs.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Harryxzy + * @ClassName PaymentApplySubmitReqDTO + * @date 2025/05/08 13:39 + * @description 概要信息 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PaymentApplySubmitReqDTO { + + // 代发总金额 Y + private String amount; + + // 自动匹配预算计划流水号 N + private String autoMatchPlanNumber; + + + private String bankExtend1; + private String bankExtend2; + private String bankExtend3; + private String bankExtend4; + private String bankExtend5; + private String bankExtend6; + private String bankExtend7; + private String bankExtend8; + + // 业务类型 Y + private String busType; + + // 同城标志 N + private String cityFlag; + + // 币种 Y + private String currency; + + // 预算明细项id N + private String detailId; + + // 客户备用字段1 N + private String erpExtend1; + + // 客户备用字段2 N + private String erpExtend2; + + // 客户备用字段3 N + private String erpExtend3; + + // 付款账号 Y + private String payAccount; + + // 结算方式 N + private String payType; + + // 公私标志 N + private String personalFlag; + + // 计划类别 N + private String planCategory; + + // 计划周期 N + private String planCycle; + + // 预算项编号 N + private String planItemCode; + + // 计划流水号 N + private String planNumber; + + // 资金预算所属单位编码 N + private String planUnitCode; + + // 该笔支付用途 Y + private String purpose; + + // 是否实时 N + private String realTimeTag; + + // 业务参考号 Y + private String referenceNum; + + // 预算分列序号 N + private String separateSerial; + + // 该笔支付备注 N + private String summary; + + // 加急标志 N + private String urgentTag; + + private String expectTime; +} diff --git a/src/com/engine/salary/entity/cbs/dto/SalaryCBSBaseInfoDTO.java b/src/com/engine/salary/entity/cbs/dto/SalaryCBSBaseInfoDTO.java new file mode 100644 index 000000000..31d66df71 --- /dev/null +++ b/src/com/engine/salary/entity/cbs/dto/SalaryCBSBaseInfoDTO.java @@ -0,0 +1,38 @@ +package com.engine.salary.entity.cbs.dto; + +import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.YearMonth; + +/** + * @ClassName SalaryCBSBaseInfoDTO + * @author Harryxzy + * @date 2025/5/7 18:01 + * @description cbs基本信息 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SalaryCBSBaseInfoDTO { + +// 已推送") + private Integer pushNum; + +// 总数") + private Integer pushTotal; + + +// 薪资所属月") + @JsonSerialize(using = ToStringSerializer.class) + private YearMonth salaryMonth; + +// 薪资账套的周期") + private SalarySobCycleDTO salarySobCycle; +} diff --git a/src/com/engine/salary/entity/cbs/dto/SalaryCBSInfoListDTO.java b/src/com/engine/salary/entity/cbs/dto/SalaryCBSInfoListDTO.java new file mode 100644 index 000000000..1285c59c3 --- /dev/null +++ b/src/com/engine/salary/entity/cbs/dto/SalaryCBSInfoListDTO.java @@ -0,0 +1,77 @@ +package com.engine.salary.entity.cbs.dto; + +import com.engine.salary.annotation.I18n; +import com.engine.salary.annotation.TableTitle; +import com.engine.salary.enums.datacollection.DataCollectionEmployeeTypeEnum; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SalaryCBSInfoListDTO { + + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + private Long employeeId; + + @TableTitle(title = "姓名", dataIndex = "username", key = "username") + @I18n + private String username; + + + @TableTitle(title = "个税扣缴义务人", dataIndex = "taxAgent", key = "taxAgent") + private String taxAgent; + private Long taxAgentId; + + + @TableTitle(title = "部门", dataIndex = "department", key = "department") + @I18n + private String department; + + + @TableTitle(title = "手机号", dataIndex = "mobile", key = "mobile") + private String mobile; + + + @TableTitle(title = "工号", dataIndex = "jobNum", key = "jobNum") + private String jobNum; + + + private int pushStatus; + + @TableTitle(title = "推送状态", dataIndex = "pushStatusVal", key = "pushStatusVal") + private String pushStatusVal; + + + private Long salaryAcctRecordId; + + @TableTitle(title = "工资卡开户名", dataIndex = "gzkkhm", key = "gzkkhm") + private String gzkkhm; + + @TableTitle(title = "工资卡账号", dataIndex = "gzkzh", key = "gzkzh") + private String gzkzh; + + @TableTitle(title = "工资卡开户行", dataIndex = "gzkkhh", key = "gzkkhh") + private String gzkkhh; + + @TableTitle(title = "工资卡开户行支行编码", dataIndex = "gzkkhzhbm", key = "gzkkhzhbm") + private String gzkkhzhbm; + + + /** + * 人员类型,0或null组织架构,1非系统人员 + * + * @see DataCollectionEmployeeTypeEnum + */ + private Integer employeeType; + + +} diff --git a/src/com/engine/salary/entity/cbs/dto/SalaryCBSPushListDTO.java b/src/com/engine/salary/entity/cbs/dto/SalaryCBSPushListDTO.java new file mode 100644 index 000000000..a8e2d3d25 --- /dev/null +++ b/src/com/engine/salary/entity/cbs/dto/SalaryCBSPushListDTO.java @@ -0,0 +1,73 @@ +package com.engine.salary.entity.cbs.dto; + +import com.engine.salary.annotation.Auth; +import com.engine.salary.enums.auth.AuthCheckTypeEnum; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.Set; + +/** + * @Description: cbs推送列表 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Auth(page = "salaryCBSPushLst", checkType = AuthCheckTypeEnum.EMP) +public class SalaryCBSPushListDTO { + + // 主键id + private Long id; + + + + // 薪资所属月 + @JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8") + private Date salaryYearMonth; + + /** + * 薪资账套id + */ + @JsonIgnore + private Long salarySobId; + + + // 薪资账套 + private String salarySob; + + // 核算次数 + private String acctTimes; + + + /** + * 已推送数量 + */ + private Integer pushNum; + + /** + * 推送总数 + */ + private Integer pushTotal; + + private String pushSituation; + + /** + * 最后推送时间 + * + */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date lastPushTime; + + /** + * 薪资核算ID + */ + private Long salaryAcctId; + + private Set opts; +} diff --git a/src/com/engine/salary/entity/cbs/dto/SalaryCardInfo.java b/src/com/engine/salary/entity/cbs/dto/SalaryCardInfo.java new file mode 100644 index 000000000..0d2390194 --- /dev/null +++ b/src/com/engine/salary/entity/cbs/dto/SalaryCardInfo.java @@ -0,0 +1,36 @@ +package com.engine.salary.entity.cbs.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Harryxzy + * @ClassName SalaryCardInfo + * @date 2025/05/08 10:00 + * @description + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SalaryCardInfo { + + private Long employeeId; + + // 工资卡开户名 + private String gzkkhm; + + // 工资卡账号 + private String gzkzh; + + // 工资卡开户行 + private String gzkkhh; + + // 工资卡开户行支行编码 + private String gzkkhzhbm; + + // 是否是中国银行 0 是, 1否 + private Integer sfszgyh; +} diff --git a/src/com/engine/salary/entity/cbs/param/CBSPushParam.java b/src/com/engine/salary/entity/cbs/param/CBSPushParam.java new file mode 100644 index 000000000..57790480f --- /dev/null +++ b/src/com/engine/salary/entity/cbs/param/CBSPushParam.java @@ -0,0 +1,29 @@ +package com.engine.salary.entity.cbs.param; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CBSPushParam { + + // 主键id + private List ids; + + // cbsId + private List salaryCbsIds; + + private boolean isConfirm; + + // 工资卡开户行 + private String gzkkhh; + + // 姓名 + private String username; +} diff --git a/src/com/engine/salary/entity/cbs/param/SalaryCBSInfoQueryParam.java b/src/com/engine/salary/entity/cbs/param/SalaryCBSInfoQueryParam.java new file mode 100644 index 000000000..3b36f3674 --- /dev/null +++ b/src/com/engine/salary/entity/cbs/param/SalaryCBSInfoQueryParam.java @@ -0,0 +1,92 @@ +package com.engine.salary.entity.cbs.param; + +import com.engine.salary.common.BaseQueryParam; +import com.engine.salary.exception.SalaryRunTimeException; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.util.Collection; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SalaryCBSInfoQueryParam extends BaseQueryParam { + +// 主键id") + private Collection ids; + +// cbsId") + private Long salaryCbsId; + + /** + * 工资核算id + */ +// @JsonIgnore + private Long salaryAccountingId; + +// 关键字(姓名)") + private String keyword; + +// 姓名") + private String username; + private Long userId; + +// 个税扣缴义务人的主键id") + private Long taxAgentId; + +// 部门id") + private List departmentIds; + + // 分部id + private List subCompanyIds; + +// 岗位id") + private List positionIds; + +// 状态") + private String userstatus; + +// 入职日期") + private List hiredate; + +// 推送状态") + private String pushStatus; + + /** + * true= [已推送] + * false= [未推送] + */ + private Boolean isPushed; + + /** + * 推送状态 + */ +// @JsonIgnore + private Integer pushStatusVal; + + /** + * 发送状态 + */ +// @JsonIgnore + private List sendStatuss; + + private String departmentIdStr; + + private String subCompanyIdStr; + + private String gzkkhh; + + + public static String checkParam(SalaryCBSInfoQueryParam saveParam) { + if (saveParam.getSalaryCbsId() == null) { + throw new SalaryRunTimeException("cbs推送Id必传"); + } + + return ""; + } +} diff --git a/src/com/engine/salary/entity/cbs/po/SalaryCbsInfoPO.java b/src/com/engine/salary/entity/cbs/po/SalaryCbsInfoPO.java new file mode 100644 index 000000000..3f63e1079 --- /dev/null +++ b/src/com/engine/salary/entity/cbs/po/SalaryCbsInfoPO.java @@ -0,0 +1,72 @@ +package com.engine.salary.entity.cbs.po; + +import com.engine.salary.annotation.Encrypt; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Collection; +import java.util.Date; + +/** + * @author Harryxzy + * @ClassName SalaryCbsInfoPO + * @date 2025/05/07 14:59 + * @description + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SalaryCbsInfoPO { + /** + * 创建时间 + */ + private Date createTime; + /** + * 创建人 + */ + private Long creator; + /** + * 是否已删除。0:未删除、1:已删除 + */ + private Integer deleteType; + /** + * 人员表的主键id + */ + private Long employeeId; + private Integer employeeType; + /** + * 主键id + */ + private Long id; + /** + * 推送状态。0:未推送、1:已推送 + */ + private Integer pushStatus; + private Date pushTime; + /** + * 实发金额 + */ + @Encrypt + private String pushValue; + /** + * 业务参考号 + */ + private String referenceNum; + /** + * cbs主表id + */ + private Long salaryCbsId; + /** + * 更新时间 + */ + private Date updateTime; + + private String busNum; + + //主键id集合 + private Collection ids; + +} diff --git a/src/com/engine/salary/entity/cbs/po/SalaryCbsPO.java b/src/com/engine/salary/entity/cbs/po/SalaryCbsPO.java new file mode 100644 index 000000000..fce3d72d9 --- /dev/null +++ b/src/com/engine/salary/entity/cbs/po/SalaryCbsPO.java @@ -0,0 +1,59 @@ +package com.engine.salary.entity.cbs.po; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Collection; +import java.util.Date; + +/** + * @author Harryxzy + * @ClassName SalaryCbsPO + * @date 2025/05/07 14:58 + * @description + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SalaryCbsPO { + /** + * 创建时间 + */ + private Date createTime; + /** + * 创建人 + */ + private Long creator; + /** + * 是否已删除。0:未删除、1:已删除 + */ + private Integer deleteType; + /** + * 主键id + */ + private Long id; + /** + * 最后推送时间 + */ + private Date lastPushTime; + /** + * 薪资核算id + */ + private Long salaryAccountingId; + private Date salaryMonth; + /** + * 薪资账套id + */ + private Long salarySobId; + /** + * 更新时间 + */ + private Date updateTime; + + //主键id集合 + private Collection ids; + +} diff --git a/src/com/engine/salary/entity/cbs/po/SalaryCbsPushPO.java b/src/com/engine/salary/entity/cbs/po/SalaryCbsPushPO.java new file mode 100644 index 000000000..d6e7d5c5b --- /dev/null +++ b/src/com/engine/salary/entity/cbs/po/SalaryCbsPushPO.java @@ -0,0 +1,52 @@ +package com.engine.salary.entity.cbs.po; + +import com.engine.salary.annotation.Encrypt; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Collection; +import java.util.Date; + +/** + * @author Harryxzy + * @ClassName SalaryCbsPushPO + * @date 2025/05/09 11:24 + * @description 推送日志 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SalaryCbsPushPO { + /** + * 主键id + */ + private Long id; + private String salaryCbsId; + private String totalEmp; + + @Encrypt + private String totalValue; + private String referenceNum; + /** + * 创建人 + */ + private Long creator; + + + private String returnValue; + /** + * 创建时间 + */ + private Date createTime; + /** + * 是否已删除。0:未删除、1:已删除 + */ + private Integer deleteType; + + //主键id集合 + private Collection ids; +} diff --git a/src/com/engine/salary/enums/salaryaccounting/CbsPushStatusEnum.java b/src/com/engine/salary/enums/salaryaccounting/CbsPushStatusEnum.java new file mode 100644 index 000000000..05ff528ca --- /dev/null +++ b/src/com/engine/salary/enums/salaryaccounting/CbsPushStatusEnum.java @@ -0,0 +1,55 @@ +package com.engine.salary.enums.salaryaccounting; + +import com.engine.salary.enums.BaseEnum; + +import java.util.Objects; + +/** + * cbs推送的状态 + *

Copyright: Copyright (c) 2025

+ *

Company: 泛微软件

+ * + * @author xzy + * @version 1.0 + **/ +public enum CbsPushStatusEnum implements BaseEnum { + + NOT_PUSHED(0, "未推送", 0), + PUSHED(1, "已推送", 0); + + private int value; + + private String defaultLabel; + + private int labelId; + + CbsPushStatusEnum(int value, String defaultLabel, int labelId) { + this.value = value; + this.defaultLabel = defaultLabel; + this.labelId = labelId; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public Integer getLabelId() { + return labelId; + } + + @Override + public String getDefaultLabel() { + return defaultLabel; + } + + public static CbsPushStatusEnum parseByValue(Integer value) { + for (CbsPushStatusEnum salaryAcctRecordStatusEnum : CbsPushStatusEnum.values()) { + if (Objects.equals(salaryAcctRecordStatusEnum.getValue(), value)) { + return salaryAcctRecordStatusEnum; + } + } + return null; + } +} diff --git a/src/com/engine/salary/enums/salaryaccounting/SalaryAcctRecordStatusEnum.java b/src/com/engine/salary/enums/salaryaccounting/SalaryAcctRecordStatusEnum.java index c8e56cb1d..537bcc8c0 100644 --- a/src/com/engine/salary/enums/salaryaccounting/SalaryAcctRecordStatusEnum.java +++ b/src/com/engine/salary/enums/salaryaccounting/SalaryAcctRecordStatusEnum.java @@ -17,6 +17,7 @@ public enum SalaryAcctRecordStatusEnum implements BaseEnum { NOT_ARCHIVED(1, "未归档", 91870), ARCHIVED(2, "已归档", 91862), DECLARED(3, "已申报", 100119), + PUSHED(4, "已推送", 0), ; private int value; diff --git a/src/com/engine/salary/mapper/cbs/SalaryCbsInfoMapper.java b/src/com/engine/salary/mapper/cbs/SalaryCbsInfoMapper.java new file mode 100644 index 000000000..7168d4641 --- /dev/null +++ b/src/com/engine/salary/mapper/cbs/SalaryCbsInfoMapper.java @@ -0,0 +1,75 @@ +package com.engine.salary.mapper.cbs; + +import com.engine.salary.entity.cbs.dto.SalaryCBSInfoListDTO; +import com.engine.salary.entity.cbs.param.SalaryCBSInfoQueryParam; +import com.engine.salary.entity.cbs.po.SalaryCbsInfoPO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface SalaryCbsInfoMapper { + + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + List listAll(); + + /** + * 条件查询 + * + * @return 返回集合,没有返回空List + */ + List listSome(SalaryCbsInfoPO salaryCbsInfo); + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + SalaryCbsInfoPO getById(Long id); + + /** + * 新增,忽略null字段 + * + * @param salaryCbsInfo 新增的记录 + * @return 返回影响行数 + */ + int insertIgnoreNull(SalaryCbsInfoPO salaryCbsInfo); + + /** + * 修改,修改所有字段 + * + * @param salaryCbsInfo 修改的记录 + * @return 返回影响行数 + */ + int update(SalaryCbsInfoPO salaryCbsInfo); + + /** + * 修改,忽略null字段 + * + * @param salaryCbsInfo 修改的记录 + * @return 返回影响行数 + */ + int updateIgnoreNull(SalaryCbsInfoPO salaryCbsInfo); + + /** + * 删除记录 + * + * @param salaryCbsInfo 待删除的记录 + * @return 返回影响行数 + */ + int delete(SalaryCbsInfoPO salaryCbsInfo); + + List listByCbsIds(@Param("cbsIds") List cbdIds); + + List list(@Param("param")SalaryCBSInfoQueryParam queryParam); + + List listByCbsIdAndIds(@Param("cbsIds")List salaryCbsIds, @Param("ids")List part); + + void updatePushStatusByCbsIdsAndEmpIds(@Param("cbsIds")List cbsIdList, @Param("empIds")List part, @Param("pushStatus")Integer value); +} \ No newline at end of file diff --git a/src/com/engine/salary/mapper/cbs/SalaryCbsInfoMapper.xml b/src/com/engine/salary/mapper/cbs/SalaryCbsInfoMapper.xml new file mode 100644 index 000000000..db0b1f9d2 --- /dev/null +++ b/src/com/engine/salary/mapper/cbs/SalaryCbsInfoMapper.xml @@ -0,0 +1,553 @@ + + + + + + + + + + + + + + + + + + + + + t.create_time + , t.creator + , t.delete_type + , t.employee_id + , t.employee_type + , t.id + , t.push_status + , t.push_time + , t.push_value + , t.reference_num + , t.salary_cbs_id + , t.update_time + + + + + + + + + + + + + + + + t1.id, + e.lastname as username, + d.departmentname AS department, + e.mobile, + e.workcode as jobNum, + t1.push_status, + t1.employee_id, + t1.employee_type, + e.email + + + + + AND t1.id IN + + #{id} + + + + AND t1.salary_cbs_id = #{param.salaryCbsId} + + + + AND e.lastname like CONCAT('%',#{param.keyword},'%') + + + + AND e.lastname like CONCAT('%',#{param.username},'%') + + + AND e.id = #{param.userId} + + + + + AND d.id IN + + #{id} + + + + + AND e.jobtitle IN + + #{id} + + + + + AND e.status = #{param.userstatus} + + + + AND (e.hiredate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) + + + + + AND t1.id IN + + #{id} + + + + + AND t1.salary_cbs_id = #{param.salaryCbsId} + + + + AND e.lastname like '%'||#{param.keyword}||'%' + + + + AND e.lastname like '%'||#{param.username}||'%' + + + + AND e.id = #{param.userId} + + + + + AND d.id IN + + #{id} + + + + + AND e.jobtitle IN + + #{id} + + + + + AND e.status = #{param.userstatus} + + + + AND (e.hiredate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) + + + + + AND t1.id IN + + #{id} + + + + + AND t1.salary_cbs_id = #{param.salaryCbsId} + + + + AND e.lastname like '%'+#{param.keyword}+'%' + + + + AND e.lastname like '%'+#{param.username}+'%' + + + + AND e.id = #{param.userId} + + + + + AND d.id IN + + #{id} + + + + + AND e.jobtitle IN + + #{id} + + + + + AND e.status = #{param.userstatus} + + + + + AND (e.hiredate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) + + + + + + + + + + + + + INSERT INTO hrsa_salary_cbs_info + + + + create_time, + + + creator, + + + delete_type, + + + employee_id, + + + employee_type, + + + id, + + + push_status, + + + push_time, + + + push_value, + + + reference_num, + + + salary_cbs_id, + + + update_time, + + + + + #{createTime}, + + + #{creator}, + + + #{deleteType}, + + + #{employeeId}, + + + #{employeeType}, + + + #{id}, + + + #{pushStatus}, + + + #{pushTime}, + + + #{pushValue}, + + + #{referenceNum}, + + + #{salaryCbsId}, + + + #{updateTime}, + + + + + + + + UPDATE hrsa_salary_cbs_info + + create_time=#{createTime}, + creator=#{creator}, + delete_type=#{deleteType}, + employee_id=#{employeeId}, + employee_type=#{employeeType}, + push_status=#{pushStatus}, + push_time=#{pushTime}, + push_value=#{pushValue}, + reference_num=#{referenceNum}, + salary_cbs_id=#{salaryCbsId}, + update_time=#{updateTime}, + + + WHERE id = #{id} AND delete_type = 0 + + + + + + UPDATE hrsa_salary_cbs_info + + + create_time=#{createTime}, + + + creator=#{creator}, + + + delete_type=#{deleteType}, + + + employee_id=#{employeeId}, + + + employee_type=#{employeeType}, + + + push_status=#{pushStatus}, + + + push_time=#{pushTime}, + + + push_value=#{pushValue}, + + + reference_num=#{referenceNum}, + + + salary_cbs_id=#{salaryCbsId}, + + + update_time=#{updateTime}, + + + bus_num=#{busNum}, + + + WHERE id = #{id} AND delete_type = 0 + + + UPDATE hrsa_salary_cbs_info + SET push_status=#{pushStatus} + WHERE delete_type=0 + + AND salary_cbs_id IN + + #{cbsId} + + + + AND employee_id IN + + #{empId} + + + + + + + + UPDATE hrsa_salary_cbs_info + SET delete_type=1 + WHERE id = #{id} AND delete_type = 0 + + + + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/cbs/SalaryCbsMapper.java b/src/com/engine/salary/mapper/cbs/SalaryCbsMapper.java new file mode 100644 index 000000000..f9f0114af --- /dev/null +++ b/src/com/engine/salary/mapper/cbs/SalaryCbsMapper.java @@ -0,0 +1,76 @@ +package com.engine.salary.mapper.cbs; + +import com.engine.salary.entity.cbs.dto.SalaryCBSPushListDTO; +import com.engine.salary.entity.cbs.po.SalaryCbsPO; +import com.engine.salary.entity.salaryBill.param.SalarySendQueryParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author Harryxzy + * @ClassName SalaryCbsMapper + * @date 2025/05/07 15:02 + * @description + */ +public interface SalaryCbsMapper { + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + List listAll(); + + /** + * 条件查询 + * + * @return 返回集合,没有返回空List + */ + List listSome(SalaryCbsPO salaryCbs); + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + SalaryCbsPO getById(Long id); + + /** + * 新增,忽略null字段 + * + * @param salaryCbs 新增的记录 + * @return 返回影响行数 + */ + int insertIgnoreNull(SalaryCbsPO salaryCbs); + + /** + * 修改,修改所有字段 + * + * @param salaryCbs 修改的记录 + * @return 返回影响行数 + */ + int update(SalaryCbsPO salaryCbs); + + /** + * 修改,忽略null字段 + * + * @param salaryCbs 修改的记录 + * @return 返回影响行数 + */ + int updateIgnoreNull(SalaryCbsPO salaryCbs); + + /** + * 删除记录 + * + * @param salaryCbs 待删除的记录 + * @return 返回影响行数 + */ + int delete(SalaryCbsPO salaryCbs); + + List list(@Param("param") SalarySendQueryParam queryParam); + + List listBySalaryAcctRecordIds(@Param("salaryAcctRecordIds") List salaryAcctRecordIds); +} \ No newline at end of file diff --git a/src/com/engine/salary/mapper/cbs/SalaryCbsMapper.xml b/src/com/engine/salary/mapper/cbs/SalaryCbsMapper.xml new file mode 100644 index 000000000..41c314693 --- /dev/null +++ b/src/com/engine/salary/mapper/cbs/SalaryCbsMapper.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + t.create_time + , t.creator + , t.delete_type + , t.id + , t.last_push_time + , t.salary_accounting_id + , t.salary_month + , t.salary_sob_id + , t.update_time + + + + + + + + + + + + + + + + + + INSERT INTO hrsa_salary_cbs + + + + create_time, + + + creator, + + + delete_type, + + + id, + + + last_push_time, + + + salary_accounting_id, + + + salary_month, + + + salary_sob_id, + + + update_time, + + + + + #{createTime}, + + + #{creator}, + + + #{deleteType}, + + + #{id}, + + + #{lastPushTime}, + + + #{salaryAccountingId}, + + + #{salaryMonth}, + + + #{salarySobId}, + + + #{updateTime}, + + + + + + + UPDATE hrsa_salary_cbs + + create_time=#{createTime}, + creator=#{creator}, + delete_type=#{deleteType}, + last_push_time=#{lastPushTime}, + salary_accounting_id=#{salaryAccountingId}, + salary_month=#{salaryMonth}, + salary_sob_id=#{salarySobId}, + update_time=#{updateTime}, + + WHERE id = #{id} AND delete_type = 0 + + + + + + UPDATE hrsa_salary_cbs + + + create_time=#{createTime}, + + + creator=#{creator}, + + + delete_type=#{deleteType}, + + + last_push_time=#{lastPushTime}, + + + salary_accounting_id=#{salaryAccountingId}, + + + salary_month=#{salaryMonth}, + + + salary_sob_id=#{salarySobId}, + + + update_time=#{updateTime}, + + + WHERE id = #{id} AND delete_type = 0 + + + + + + UPDATE hrsa_salary_cbs + SET delete_type=1 + WHERE id = #{id} AND delete_type = 0 + + + + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/cbs/SalaryCbsPushMapper.java b/src/com/engine/salary/mapper/cbs/SalaryCbsPushMapper.java new file mode 100644 index 000000000..593480dfd --- /dev/null +++ b/src/com/engine/salary/mapper/cbs/SalaryCbsPushMapper.java @@ -0,0 +1,68 @@ +package com.engine.salary.mapper.cbs; + +import com.engine.salary.entity.cbs.po.SalaryCbsPushPO; + +import java.util.List; + +/** + * @author Harryxzy + * @ClassName SalaryCbsPushMapper + * @date 2025/05/09 11:28 + * @description + */ +public interface SalaryCbsPushMapper { + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + List listAll(); + + /** + * 条件查询 + * + * @return 返回集合,没有返回空List + */ + List listSome(SalaryCbsPushPO salaryCbsPush); + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + SalaryCbsPushPO getById(Long id); + + /** + * 新增,忽略null字段 + * + * @param salaryCbsPush 新增的记录 + * @return 返回影响行数 + */ + int insertIgnoreNull(SalaryCbsPushPO salaryCbsPush); + + /** + * 修改,修改所有字段 + * + * @param salaryCbsPush 修改的记录 + * @return 返回影响行数 + */ + int update(SalaryCbsPushPO salaryCbsPush); + + /** + * 修改,忽略null字段 + * + * @param salaryCbsPush 修改的记录 + * @return 返回影响行数 + */ + int updateIgnoreNull(SalaryCbsPushPO salaryCbsPush); + + /** + * 删除记录 + * + * @param salaryCbsPush 待删除的记录 + * @return 返回影响行数 + */ + int delete(SalaryCbsPushPO salaryCbsPush); +} diff --git a/src/com/engine/salary/mapper/cbs/SalaryCbsPushMapper.xml b/src/com/engine/salary/mapper/cbs/SalaryCbsPushMapper.xml new file mode 100644 index 000000000..d493f1b0c --- /dev/null +++ b/src/com/engine/salary/mapper/cbs/SalaryCbsPushMapper.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + t.id + , t.salary_cbs_id + , t.totalEmp + , t.totalValue + , t.reference_num + , t.creator + , t.return_value + , t.create_time + , t.delete_type + + + + + + + + + + + + + + + INSERT INTO hrsa_salary_cbs_push + + + + id, + + + salary_cbs_id, + + + totalEmp, + + + totalValue, + + + reference_num, + + + creator, + + + return_value, + + + create_time, + + + delete_type, + + + + + #{id}, + + + #{salaryCbsId}, + + + #{totalEmp}, + + + #{totalValue}, + + + #{referenceNum}, + + + #{creator}, + + + #{returnValue}, + + + #{createTime}, + + + #{deleteType}, + + + + + + + UPDATE hrsa_salary_cbs_push + + salary_cbs_id=#{salaryCbsId}, + totalEmp=#{totalEmp}, + totalValue=#{totalValue}, + reference_num=#{referenceNum}, + creator=#{creator}, + return_value=#{returnValue}, + create_time=#{createTime}, + delete_type=#{deleteType}, + + WHERE id = #{id} AND delete_type = 0 + + + + + + UPDATE hrsa_salary_cbs_push + + + salary_cbs_id=#{salaryCbsId}, + + + totalEmp=#{totalEmp}, + + + totalValue=#{totalValue}, + + + reference_num=#{referenceNum}, + + + creator=#{creator}, + + + return_value=#{returnValue}, + + + create_time=#{createTime}, + + + delete_type=#{deleteType}, + + + WHERE id = #{id} AND delete_type = 0 + + + + + + UPDATE hrsa_salary_cbs_push + SET delete_type=1 + WHERE id = #{id} AND delete_type = 0 + + + + \ No newline at end of file diff --git a/src/com/engine/salary/service/SalaryAcctRecordService.java b/src/com/engine/salary/service/SalaryAcctRecordService.java index 8e203bf30..c75ad1074 100644 --- a/src/com/engine/salary/service/SalaryAcctRecordService.java +++ b/src/com/engine/salary/service/SalaryAcctRecordService.java @@ -227,4 +227,9 @@ public interface SalaryAcctRecordService { */ List listBySalaryAcctRecordIds(Collection salaryAcctRecordIds); + /** + * 联特 生成CBS推送记录 + * @param ids + */ + void generateCBSPushList(List ids); } diff --git a/src/com/engine/salary/service/SalaryCbsInfoService.java b/src/com/engine/salary/service/SalaryCbsInfoService.java new file mode 100644 index 000000000..e537abc3d --- /dev/null +++ b/src/com/engine/salary/service/SalaryCbsInfoService.java @@ -0,0 +1,74 @@ +package com.engine.salary.service; + +import com.engine.salary.entity.cbs.dto.SalaryCBSInfoListDTO; +import com.engine.salary.entity.cbs.param.CBSPushParam; +import com.engine.salary.entity.cbs.param.SalaryCBSInfoQueryParam; +import com.engine.salary.entity.cbs.po.SalaryCbsInfoPO; +import com.engine.salary.util.page.PageInfo; + +import java.util.List; + +/** + * @author Harryxzy + * @ClassName SalaryCbsInfoService + * @date 2025/05/07 15:06 + * @description + */ +public interface SalaryCbsInfoService { + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + List listAll(); + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + SalaryCbsInfoPO getById(Long id); + + + /** + * 新增,忽略null字段 + * + * @param salaryCbsInfo 新增的记录 + * @return 返回影响行数 + */ + int insertIgnoreNull(SalaryCbsInfoPO salaryCbsInfo); + + /** + * 修改,修改所有字段 + * + * @param salaryCbsInfo 修改的记录 + * @return 返回影响行数 + */ + int update(SalaryCbsInfoPO salaryCbsInfo); + + /** + * 修改,忽略null字段 + * + * @param salaryCbsInfo 修改的记录 + * @return 返回影响行数 + */ + int updateIgnoreNull(SalaryCbsInfoPO salaryCbsInfo); + + /** + * 删除记录 + * + * @param salaryCbsInfo 待删除的记录 + * @return 返回影响行数 + */ + int delete(SalaryCbsInfoPO salaryCbsInfo); + + List listByCbsIds(List cbsIdList); + + PageInfo salaryCbsInfoListPage(SalaryCBSInfoQueryParam queryParam); + + String pushDataToCBS(CBSPushParam cbsPushParam); + + void updatePushStatusByCbsIdsAndEmpIds(List cbsIdList, List needChangeEmpIds, Integer value); +} \ No newline at end of file diff --git a/src/com/engine/salary/service/SalaryCbsPushService.java b/src/com/engine/salary/service/SalaryCbsPushService.java new file mode 100644 index 000000000..086aa4135 --- /dev/null +++ b/src/com/engine/salary/service/SalaryCbsPushService.java @@ -0,0 +1,64 @@ +package com.engine.salary.service; + +import com.engine.salary.entity.cbs.po.SalaryCbsPushPO; + +import java.util.List; + +/** + * @author Harryxzy + * @ClassName SalaryCbsPushService + * @date 2025/05/09 11:36 + * @description 推送日志 + */ +public interface SalaryCbsPushService { + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + List listAll(); + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + SalaryCbsPushPO getById(Long id); + + + /** + * 新增,忽略null字段 + * + * @param salaryCbsPush 新增的记录 + * @return 返回影响行数 + */ + int insertIgnoreNull(SalaryCbsPushPO salaryCbsPush); + + /** + * 修改,修改所有字段 + * + * @param salaryCbsPush 修改的记录 + * @return 返回影响行数 + */ + int update(SalaryCbsPushPO salaryCbsPush); + + /** + * 修改,忽略null字段 + * + * @param salaryCbsPush 修改的记录 + * @return 返回影响行数 + */ + int updateIgnoreNull(SalaryCbsPushPO salaryCbsPush); + + /** + * 删除记录 + * + * @param salaryCbsPush 待删除的记录 + * @return 返回影响行数 + */ + int delete(SalaryCbsPushPO salaryCbsPush); + +} diff --git a/src/com/engine/salary/service/SalaryCbsService.java b/src/com/engine/salary/service/SalaryCbsService.java new file mode 100644 index 000000000..d35b4065e --- /dev/null +++ b/src/com/engine/salary/service/SalaryCbsService.java @@ -0,0 +1,86 @@ +package com.engine.salary.service; + +import com.engine.salary.entity.cbs.dto.SalaryCBSBaseInfoDTO; +import com.engine.salary.entity.cbs.dto.SalaryCBSPushListDTO; +import com.engine.salary.entity.cbs.po.SalaryCbsPO; +import com.engine.salary.entity.salaryBill.param.SalarySendQueryParam; +import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; + +import java.util.List; +import java.util.Map; + +/** + * @author Harryxzy + * @ClassName SalaryCbsService + * @date 2025/05/07 15:05 + * @description + */ +public interface SalaryCbsService { + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + List listAll(); + + List listSome(SalaryCbsPO salaryCbs); + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + SalaryCbsPO getById(Long id); + + + /** + * 新增,忽略null字段 + * + * @param salaryCbs 新增的记录 + * @return 返回影响行数 + */ + int insertIgnoreNull(SalaryCbsPO salaryCbs); + + /** + * 修改,修改所有字段 + * + * @param salaryCbs 修改的记录 + * @return 返回影响行数 + */ + int update(SalaryCbsPO salaryCbs); + + /** + * 修改,忽略null字段 + * + * @param salaryCbs 修改的记录 + * @return 返回影响行数 + */ + int updateIgnoreNull(SalaryCbsPO salaryCbs); + + /** + * 删除记录 + * + * @param salaryCbs 待删除的记录 + * @return 返回影响行数 + */ + int delete(SalaryCbsPO salaryCbs); + + List listBySalaryAcctRecordId(Long salaryAcctRecordId); + + List listBySalaryAcctRecordIds(List salaryAcctRecordIds); + + /** + * 生成cbs推送列表 + * @param salaryAcctRecordPO + */ + + void generatePushList(SalaryAcctRecordPO salaryAcctRecordPO, Map sobItemMap); + + List list(SalarySendQueryParam queryParam); + + SalaryCBSBaseInfoDTO getBaseInfo(Long id); + +} diff --git a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java index 5aa25f784..5dab3b6fb 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java @@ -48,6 +48,7 @@ import com.google.common.collect.Sets; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; +import weaver.conn.RecordSet; import weaver.general.BaseBean; import weaver.hrm.User; @@ -145,6 +146,10 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe return ServiceUtil.getService(PushServiceImpl.class, user); } + private SalaryCbsService getSalaryCbsService(User user) { + return ServiceUtil.getService(SalaryCbsServiceImpl.class, user); + } + @Override public SalaryAcctRecordPO getById(Long id) { @@ -731,8 +736,8 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe salaryAcctRecordPO.setUpdateTime(new Date()); getSalaryAcctRecordMapper().updateIgnoreNull(salaryAcctRecordPO); - // 生成工资单 - getSalarySendService(user).generateSalaryBill(salaryAcctRecordId); + // 生成工资单 联特 放在cbd推送中生成 + // getSalarySendService(user).generateSalaryBill(salaryAcctRecordId); //删除报表缓存 getSalaryStatisticsReportService(user).removeReportCache(); @@ -762,6 +767,10 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe if (Objects.isNull(salaryAcctRecordPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除")); } + + if (salaryAcctRecordPO.getStatus().equals(SalaryAcctRecordStatusEnum.PUSHED.getValue())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "薪资核算记录已为已推送状态,不能重新核算")); + } // 重新核算 reCalcOrBackCalc(salaryAcctRecordPO, true); @@ -1012,4 +1021,59 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe public void updateDate(Long id, Date updateTime) { getSalaryAcctRecordMapper().updateDate(id, updateTime); } + + /** + * 联特 生成CBS推送记录 + * @param ids + */ + @Override + public void generateCBSPushList(List ids) { + if (CollectionUtils.isEmpty(ids)) { + return; + } + // 查询薪资核算记录 + List salaryAcctRecordList = listByIds(ids); + if (CollectionUtils.isEmpty(salaryAcctRecordList)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除")); + } + + Optional notArchived = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus().equals(SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue())).findFirst(); + if (notArchived.isPresent()) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "核算记录尚未归档,请先归档")); + } + + // 查询账套对应的薪资项目id + Map sobItemMap = new HashMap<>(); + RecordSet rs = new RecordSet(); + rs.execute("select xzzt,xzxm from uf_cbsztxzxmys"); + while (rs.next()) { + String xzzt = rs.getString("xzzt"); + Long itemId = NumberUtils.isCreatable(rs.getString("xzxm")) ? Long.valueOf(rs.getString("xzxm")) : 0L; + if (StringUtils.isBlank(xzzt) || !NumberUtils.isCreatable(xzzt)) { + sobItemMap.put(0L,itemId); + } else { + sobItemMap.put(Long.valueOf(xzzt), itemId); + } + } + + for (SalaryAcctRecordPO salaryAcctRecordPO : salaryAcctRecordList) { + if (salaryAcctRecordPO.getStatus().equals(SalaryAcctRecordStatusEnum.PUSHED.getValue())) { + continue; + } + // 生成cbs推送数据 + getSalaryCbsService(user).generatePushList(salaryAcctRecordPO, sobItemMap); + + // 获取是否已经生成工资单 + List salarySendPOS = getSalarySendService(user).listSome(SalarySendPO.builder().salaryAccountingId(salaryAcctRecordPO.getId()).build()); + if (CollectionUtils.isEmpty(salarySendPOS)) { + // 生成工资单 + getSalarySendService(user).generateSalaryBill(salaryAcctRecordPO.getId()); + } + + // 更新薪资核算记录的状态 + salaryAcctRecordPO.setStatus(SalaryAcctRecordStatusEnum.PUSHED.getValue()); + salaryAcctRecordPO.setUpdateTime(new Date()); + getSalaryAcctRecordMapper().updateIgnoreNull(salaryAcctRecordPO); + } + } } diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index e51b45513..cc92ff0cf 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -12,6 +12,8 @@ import com.engine.salary.biz.SalarySendInfoBiz; import com.engine.salary.cache.SalaryCacheKey; import com.engine.salary.config.SalaryElogConfig; import com.engine.salary.constant.HrmSalaryPayrollConf; +import com.engine.salary.entity.cbs.po.SalaryCbsInfoPO; +import com.engine.salary.entity.cbs.po.SalaryCbsPO; import com.engine.salary.entity.progress.ProgressDTO; import com.engine.salary.entity.salaryBill.bo.SalaryBillBO; import com.engine.salary.entity.salaryBill.bo.SalaryTemplateBO; @@ -119,6 +121,15 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService return ServiceUtil.getService(SalaryBillBaseSetServiceImpl.class, user); } + private SalaryCbsService getSalaryCbsService(User user) { + return ServiceUtil.getService(SalaryCbsServiceImpl.class, user); + } + + + private SalaryCbsInfoService getSalaryCbsInfoService(User user) { + return ServiceUtil.getService(SalaryCbsInfoServiceImpl.class, user); + } + private SalarySendInfoBiz salarySendInfoMapper = new SalarySendInfoBiz(); private SalarySendBiz mapper = new SalarySendBiz(); @@ -177,6 +188,27 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService throw new SalaryRunTimeException("工资发放范围内没有匹配员工"); } } + + // 校验cbs是否已经推送 + List salaryCbsIdList = getSalaryCbsService(user).listBySalaryAcctRecordId(salarySend.getSalaryAccountingId()).stream().map(SalaryCbsPO::getId).collect(Collectors.toList()); + List salaryCbsInfoList = getSalaryCbsInfoService(user).listByCbsIds(salaryCbsIdList); + if (CollectionUtils.isEmpty(salaryCbsInfoList)) { + throw new SalaryRunTimeException("cbs数据暂不存在"); + } + List pushedEmpIds = salaryCbsInfoList.stream() + .filter(salaryCbsInfoPO -> salaryCbsInfoPO.getPushStatus() != null && salaryCbsInfoPO.getPushStatus().equals(NumberUtils.INTEGER_ONE)) + .map(SalaryCbsInfoPO::getEmployeeId) + .collect(Collectors.toList()); + List> partition = Lists.partition(ids, 500); + List sendInfoList = new ArrayList<>(); + for (List idsPart : partition) { + sendInfoList.addAll(getSalarySendInfoMapper().list(SalarySendInfoQueryParam.builder().ids(idsPart).build())); + } + Optional optional = sendInfoList.stream().filter(info -> !pushedEmpIds.contains(info.getEmployeeId())).findFirst(); + if (optional.isPresent()) { + throw new SalaryRunTimeException("cbs数据暂未推送,请先推送cbs数据"); + } + // 初始化进度 ProgressDTO initProgress = ProgressDTO.builder() .title(SalaryI18nUtil.getI18nLabel(136097, "发送中")) diff --git a/src/com/engine/salary/service/impl/SalaryCbsInfoServiceImpl.java b/src/com/engine/salary/service/impl/SalaryCbsInfoServiceImpl.java new file mode 100644 index 000000000..30fee3cfe --- /dev/null +++ b/src/com/engine/salary/service/impl/SalaryCbsInfoServiceImpl.java @@ -0,0 +1,518 @@ +package com.engine.salary.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.api.formmode.mybatis.util.SqlProxyHandle; +import com.engine.common.service.HrmCommonService; +import com.engine.common.service.impl.HrmCommonServiceImpl; +import com.engine.common.util.ServiceUtil; +import com.engine.core.impl.Service; +import com.engine.salary.encrypt.EncryptUtil; +import com.engine.salary.entity.cbs.dto.*; +import com.engine.salary.entity.cbs.param.CBSPushParam; +import com.engine.salary.entity.cbs.param.SalaryCBSInfoQueryParam; +import com.engine.salary.entity.cbs.po.SalaryCbsInfoPO; +import com.engine.salary.entity.cbs.po.SalaryCbsPO; +import com.engine.salary.entity.cbs.po.SalaryCbsPushPO; +import com.engine.salary.entity.datacollection.DataCollectionEmployee; +import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; +import com.engine.salary.entity.salarysob.po.SalarySobPO; +import com.engine.salary.entity.taxagent.po.TaxAgentPO; +import com.engine.salary.enums.salaryaccounting.CbsPushStatusEnum; +import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.mapper.cbs.SalaryCbsInfoMapper; +import com.engine.salary.mapper.cbs.SalaryCbsMapper; +import com.engine.salary.service.*; +import com.engine.salary.sys.entity.vo.OrderRuleVO; +import com.engine.salary.sys.service.SalarySysConfService; +import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; +import com.engine.salary.util.SalaryEntityUtil; +import com.engine.salary.util.SalaryI18nUtil; +import com.engine.salary.util.SalaryTokenUtil; +import com.engine.salary.util.db.IdGenerator; +import com.engine.salary.util.page.PageInfo; +import com.engine.salary.util.page.SalaryPageUtil; +import com.google.common.collect.Lists; +import com.mzlion.core.lang.CollectionUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; +import weaver.conn.RecordSet; +import weaver.general.BaseBean; +import weaver.hrm.User; +import weaver.wechat.util.Utils; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author Harryxzy + * @ClassName SalaryCbsInfoService + * @date 2025/05/07 15:07 + * @description + */ +@Slf4j +public class SalaryCbsInfoServiceImpl extends Service implements com.engine.salary.service.SalaryCbsInfoService { + + private EncryptUtil encryptUtil = new EncryptUtil(); + + private SalaryCbsInfoMapper getSalaryCbsInfoMapper() { + return SqlProxyHandle.getProxy(SalaryCbsInfoMapper.class); + } + + private SalaryCbsMapper getSalaryCbsMapper() { + return SqlProxyHandle.getProxy(SalaryCbsMapper.class); + } + + private SalarySysConfService getSalarySysConfService(User user) { + return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); + } + + private SalaryCbsService getSalaryCbsService(User user) { + return ServiceUtil.getService(SalaryCbsServiceImpl.class, user); + } + + private ExtEmpService getExtEmpService(User user) { + return ServiceUtil.getService(ExtEmpServiceImpl.class, user); + } + + private SalaryAcctRecordService getSalaryAcctRecordService(User user) { + return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user); + } + + private SalarySobService getSalarySobService(User user) { + return ServiceUtil.getService(SalarySobServiceImpl.class, user); + } + + private TaxAgentService getTaxAgentService(User user) { + return ServiceUtil.getService(TaxAgentServiceImpl.class, user); + } + + private SalaryCbsPushService getSalaryCbsPushService(User user) { + return ServiceUtil.getService(SalaryCbsPushServiceImpl.class, user); + } + + private SalaryEmployeeService getSalaryEmployeeService(User user) { + return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); + } + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + @Override + public List listAll() { + List resultList = getSalaryCbsInfoMapper().listAll(); + // 解密 + encryptUtil.decryptList(resultList, SalaryCbsInfoPO.class); + return resultList; + } + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + @Override + public SalaryCbsInfoPO getById(Long id) { + SalaryCbsInfoPO salaryCbsInfoPO = getSalaryCbsInfoMapper().getById(id); + // 解密 + encryptUtil.decrypt(salaryCbsInfoPO, SalaryCbsInfoPO.class); + return salaryCbsInfoPO; + } + + + /** + * 新增,忽略null字段 + * + * @param salaryCbsInfo 新增的记录 + * @return 返回影响行数 + */ + @Override + public int insertIgnoreNull(SalaryCbsInfoPO salaryCbsInfo) { + // 加密 + encryptUtil.encrypt(salaryCbsInfo, SalaryCbsInfoPO.class); + return getSalaryCbsInfoMapper().insertIgnoreNull(salaryCbsInfo); + } + + /** + * 修改,修改所有字段 + * + * @param salaryCbsInfo 修改的记录 + * @return 返回影响行数 + */ + @Override + public int update(SalaryCbsInfoPO salaryCbsInfo) { + // 加密 + encryptUtil.encrypt(salaryCbsInfo, SalaryCbsInfoPO.class); + return getSalaryCbsInfoMapper().update(salaryCbsInfo); + } + + /** + * 修改,忽略null字段 + * + * @param salaryCbsInfo 修改的记录 + * @return 返回影响行数 + */ + @Override + public int updateIgnoreNull(SalaryCbsInfoPO salaryCbsInfo) { + // 加密 + encryptUtil.encrypt(salaryCbsInfo, SalaryCbsInfoPO.class); + return getSalaryCbsInfoMapper().updateIgnoreNull(salaryCbsInfo); + } + + /** + * 删除记录 + * + * @param salaryCbsInfo 待删除的记录 + * @return 返回影响行数 + */ + @Override + public int delete(SalaryCbsInfoPO salaryCbsInfo) { + return getSalaryCbsInfoMapper().delete(salaryCbsInfo); + } + + @Override + public List listByCbsIds(List cbsIdList) { + if (CollectionUtils.isEmpty(cbsIdList)) { + return Collections.emptyList(); + } + List> partition = Lists.partition(cbsIdList, 1000); + List resultList = new ArrayList<>(); + partition.forEach(part -> { + List salaryCbsInfoList = getSalaryCbsInfoMapper().listByCbsIds(part); + encryptUtil.decryptList(salaryCbsInfoList, SalaryCbsInfoPO.class); + resultList.addAll(salaryCbsInfoList); + }); + return resultList; + } + + @Override + public PageInfo salaryCbsInfoListPage(SalaryCBSInfoQueryParam queryParam) { + //排序配置 + OrderRuleVO orderRule = getSalarySysConfService(user).orderRule(); + queryParam.setOrderRule(orderRule); + + List page = getSalaryCbsInfoMapper().list(queryParam); + if (StringUtils.isNotBlank(queryParam.getGzkkhh())){ + BaseBean baseBean = new BaseBean(); + String gzkkhhField = baseBean.getPropValue("ltSalary", "gzkkhh_field"); + RecordSet rs = new RecordSet(); + rs.execute("select id,"+gzkkhhField+ " from cus_fielddata " + + "where SCOPE='HrmCustomFieldByInfoType' and scopeid=3 and "+gzkkhhField+" = '" +queryParam.getGzkkhh()+ "'"); + List empIdsByGzkkhh = new ArrayList<>(); + while (rs.next()) { + empIdsByGzkkhh.add(Long.valueOf(rs.getInt("id"))); + } + page = page.stream().filter(dto -> empIdsByGzkkhh.contains(dto.getEmployeeId())).collect(Collectors.toList()); + } + SalaryI18nUtil.i18nList(page); + PageInfo pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + page, SalaryCBSInfoListDTO.class); + SalaryCbsPO salaryCbsPO = getSalaryCbsService(user).getById(queryParam.getSalaryCbsId()); + if (salaryCbsPO == null) { + throw new SalaryRunTimeException("cbs推送不存在或已被删除"); + } + SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryCbsPO.getSalaryAccountingId()); + if (salaryAcctRecordPO == null) { + throw new SalaryRunTimeException("核算记录不存在或已被删除"); + } + Long salarySobId = salaryAcctRecordPO.getSalarySobId(); + SalarySobPO salarySobPO = getSalarySobService(user).getById(salarySobId); + TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(salarySobPO.getTaxAgentId()); + + List list = pageInfo.getList(); + + List employeeList = getExtEmpService(user).listEmployee(); + Map employeeMap = SalaryEntityUtil.convert2Map(employeeList, DataCollectionEmployee::getEmployeeId); + + // 获取工资卡开户名,工资卡账号,工资卡开户行,工资卡开户行支行编码 数据 + List empIds = list.stream().map(SalaryCBSInfoListDTO::getEmployeeId).collect(Collectors.toList()); + List salaryCardInfo = getSalaryCardInfo(empIds); + Map salaryCardInfoMap = SalaryEntityUtil.convert2Map(salaryCardInfo, SalaryCardInfo::getEmployeeId); + + list.forEach(dto -> { + if (dto.getEmployeeType() != null && Objects.equals(dto.getEmployeeType(), 1)) { + DataCollectionEmployee employee = employeeMap.get(dto.getEmployeeId()); + if (employee != null) { + dto.setUsername(employee.getUsername()); + dto.setDepartment(employee.getDepartmentName()); + dto.setMobile(employee.getMobile()); + dto.setJobNum(employee.getWorkcode()); + } + } + // 个税扣缴义务人 + dto.setTaxAgentId(taxAgentPO.getId()); + dto.setTaxAgent(taxAgentPO.getName()); + // 工资卡开户名,工资卡账号,工资卡开户行,工资卡开户行支行编码 + SalaryCardInfo cardInfo = salaryCardInfoMap.get(dto.getEmployeeId()); + if (cardInfo != null) { + dto.setGzkkhm(cardInfo.getGzkkhm()); + dto.setGzkzh(cardInfo.getGzkzh()); + dto.setGzkkhh(cardInfo.getGzkkhh()); + dto.setGzkkhzhbm(cardInfo.getGzkkhzhbm()); + } + dto.setPushStatusVal(CbsPushStatusEnum.parseByValue(dto.getPushStatus()).getDefaultLabel()); + }); + pageInfo.setList(list); + return pageInfo; + } + + /** + * 获取联特工资卡信息 + * @param empIds + * @return + */ + private List getSalaryCardInfo(List empIds) { + List resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(empIds)) { + return resultList; + } + BaseBean baseBean = new BaseBean(); + String gzkkhmField = baseBean.getPropValue("ltSalary", "gzkkhm_field"); + String gzkzhField = baseBean.getPropValue("ltSalary", "gzkzh_field"); + String gzkkhhField = baseBean.getPropValue("ltSalary", "gzkkhh_field"); + String gzkkhhzhbmField = baseBean.getPropValue("ltSalary", "gzkkhhzhbm_field"); + String sfszgyhField = baseBean.getPropValue("ltSalary", "sfszgyh_field"); + RecordSet rs = new RecordSet(); + List> partition = Lists.partition(empIds, 500); + partition.forEach(part -> { + String empIdStr = StringUtils.join(part, ","); + rs.execute("select id,"+gzkkhmField+","+gzkzhField+","+gzkkhhField+","+gzkkhhzhbmField+","+ sfszgyhField+ " from cus_fielddata " + + "where SCOPE='HrmCustomFieldByInfoType' and scopeid=3 and id in (" +empIdStr+ ")"); + while (rs.next()) { + SalaryCardInfo build = SalaryCardInfo.builder() + .employeeId(Long.valueOf(rs.getInt("id"))) + .gzkkhm(rs.getString(gzkkhmField)) + .gzkzh(rs.getString(gzkzhField)) + .gzkkhh(rs.getString(gzkkhhField)) + .gzkkhzhbm(rs.getString(gzkkhhzhbmField)) + .build(); + Integer sfszgyh = NumberUtils.isCreatable(rs.getString(sfszgyhField)) ? Integer.valueOf(rs.getString(sfszgyhField)) : new Integer("0"); + build.setSfszgyh(sfszgyh); + resultList.add(build); + } + }); + return resultList; + } + + /** + * 单条推送 + * @param cbsPushParam + * @return + */ + @Override + public String pushDataToCBS(CBSPushParam cbsPushParam) { + HrmCommonService hcs = new HrmCommonServiceImpl(); + BaseBean baseBean = new BaseBean(); + String roleId = baseBean.getPropValue("ltSalary", "cbs_role_ie"); + List userIdList = hcs.getRoleMembers(new Integer(roleId),"0").stream().map(userId -> new Long(userId.toString())).collect(Collectors.toList()); + if (!userIdList.contains(Long.valueOf(user.getUID()))) { + throw new SalaryRunTimeException("无权限"); + } + + if (CollectionUtils.isEmpty(cbsPushParam.getIds()) && CollectionUtils.isEmpty(cbsPushParam.getSalaryCbsIds())) { + throw new SalaryRunTimeException("请选择需要推送至CBS的数据"); + } + List infoList = listByCbsIdsAndIds(cbsPushParam.getSalaryCbsIds(), cbsPushParam.getIds()); + // if (StringUtils.isNotBlank(cbsPushParam.getGzkkhh())){ + // String gzkkhhField = baseBean.getPropValue("ltSalary", "gzkkhh_field"); + // RecordSet rs = new RecordSet(); + // rs.execute("select id,"+gzkkhhField+ " from cus_fielddata " + + // "where SCOPE='HrmCustomFieldByInfoType' and scopeid=3 and "+gzkkhhField+" = '" +cbsPushParam.getGzkkhh()+ "'"); + // List empIdsByGzkkhh = new ArrayList<>(); + // while (rs.next()) { + // empIdsByGzkkhh.add(Long.valueOf(rs.getInt("id"))); + // } + // infoList = infoList.stream().filter(po -> empIdsByGzkkhh.contains(po.getEmployeeId())).collect(Collectors.toList()); + // } + // 过滤未推送的 + infoList = infoList.stream().filter(info -> info.getPushStatus().equals(CbsPushStatusEnum.NOT_PUSHED.getValue())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(infoList)) { + throw new SalaryRunTimeException("无推送数据"); + } + + // 获取这些员工的银行卡信息 + List empIds = infoList.stream().map(SalaryCbsInfoPO::getEmployeeId).collect(Collectors.toList()); + List salaryCardInfo = getSalaryCardInfo(empIds); + Map salaryCardInfoMap = SalaryEntityUtil.convert2Map(salaryCardInfo, SalaryCardInfo::getEmployeeId); + + // 获取建模配置的cbs传参信息 + Map cbsConfigMap = getAllCbsParamConfigMap(); + + // 封装明细信息 + List paymentApplyAgentDTO = new ArrayList<>(); + BigDecimal sumVal = new BigDecimal("0"); + int i =1; + for (SalaryCbsInfoPO infoPO: infoList) { + BigDecimal value = NumberUtils.isCreatable(infoPO.getPushValue()) ? new BigDecimal(infoPO.getPushValue()) : new BigDecimal("0"); + sumVal = sumVal.add(value); + SalaryCardInfo carInfo = salaryCardInfoMap.getOrDefault(infoPO.getEmployeeId(), SalaryCardInfo.builder().build()); + paymentApplyAgentDTO.add(PaymentApplyAgentDTO.builder() + .dtlAmount(infoPO.getPushValue()) + .dtlRevAccount(carInfo.getGzkzh()) + .dtlRevName(carInfo.getGzkkhm()) + .dtlRevBankName(carInfo.getGzkkhh()) + .dtlCnapsCode(carInfo.getGzkkhzhbm()) + .dtlBankFlag(carInfo.getSfszgyh() != null && carInfo.getSfszgyh().equals(NumberUtils.INTEGER_ONE) ? "Y" : "N") + .dtlPurpose(cbsConfigMap.getOrDefault("dtlPurpose", "")) + .dtlRemark(cbsConfigMap.getOrDefault("dtlRemark", "")) + .dtlSeqNum(String.valueOf(i++)) + .build()); + } + + long referenceNum = IdGenerator.generate(); + // 封装概要信息 + PaymentApplySubmitReqDTO paymentApplySubmitReqDTO = PaymentApplySubmitReqDTO.builder() + .referenceNum(String.valueOf(referenceNum)) + .busType(cbsConfigMap.getOrDefault("busType", "")) + .amount(sumVal.toString()) + .currency(cbsConfigMap.getOrDefault("currency", "")) + .payAccount(cbsConfigMap.getOrDefault("payAccount", "")) + .purpose(cbsConfigMap.getOrDefault("purpose", "")) + .bankExtend5(cbsConfigMap.getOrDefault("bankExtend5", "")) + .summary(cbsConfigMap.getOrDefault("summary", "")) + .expectTime(cbsConfigMap.getOrDefault("expectTime", "")) + .personalFlag(cbsConfigMap.getOrDefault("personalFlag", "")) + .urgentTag(cbsConfigMap.getOrDefault("urgentTag", "")) + .realTimeTag(cbsConfigMap.getOrDefault("realTimeTag", "")) + .cityFlag(cbsConfigMap.getOrDefault("cityFlag", "")) + .bankExtend1(cbsConfigMap.getOrDefault("bankExtend1", "")) + .bankExtend2(cbsConfigMap.getOrDefault("bankExtend2", "")) + .bankExtend3(cbsConfigMap.getOrDefault("bankExtend3", "")) + .bankExtend4(cbsConfigMap.getOrDefault("bankExtend4", "")) + .bankExtend6(cbsConfigMap.getOrDefault("bankExtend6", "")) + .bankExtend7(cbsConfigMap.getOrDefault("bankExtend7", "")) + .bankExtend8(cbsConfigMap.getOrDefault("bankExtend8", "")) + .erpExtend1(cbsConfigMap.getOrDefault("erpExtend1", "")) + .erpExtend2(cbsConfigMap.getOrDefault("erpExtend2", "")) + .erpExtend3(cbsConfigMap.getOrDefault("erpExtend3", "")) + .planNumber(cbsConfigMap.getOrDefault("planNumber", "")) + .planItemCode(cbsConfigMap.getOrDefault("planItemCode", "")) + .payType(cbsConfigMap.getOrDefault("payType", "")) + .separateSerial(cbsConfigMap.getOrDefault("separateSerial", "")) + .detailId(cbsConfigMap.getOrDefault("detailId", "")) + .planCycle(cbsConfigMap.getOrDefault("planCycle", "")) + .planCategory(cbsConfigMap.getOrDefault("planCategory", "")) + .planUnitCode(cbsConfigMap.getOrDefault("planUnitCode", "")) + .autoMatchPlanNumber(cbsConfigMap.getOrDefault("autoMatchPlanNumber", "")) + .build(); + PaymentApplyAgentRequest requestParam = PaymentApplyAgentRequest.builder().paymentApplyAgentDTO(paymentApplyAgentDTO).paymentApplySubmitReqDTO(paymentApplySubmitReqDTO).build(); + String requestParamStr = JSON.toJSONString(requestParam); + + if (cbsPushParam.isConfirm()) { + String pushResult =""; + try { + String ip = baseBean.getPropValue("ltSalary", "CBS_IP"); + pushResult = SalaryTokenUtil.post4lt(ip + "/cbs/payment-apply-agent", requestParamStr, null); + // String pushResult = "{\"success\":true,\"msg\":\"成功\",\"code\":200,\"data\":{\"successed\":true,\"busNum\":\"PA00034825050800003\",\"referenceNum\":\"1746686675613\",\"freezeFlowNum\":null,\"errorMsg\":null,\"errorCode\":null,\"recordNum\":1}}"; + List cbsIdList = infoList.stream().map(SalaryCbsInfoPO::getSalaryCbsId).distinct().collect(Collectors.toList()); + getSalaryCbsPushService(user).insertIgnoreNull(SalaryCbsPushPO.builder() + .id(IdGenerator.generate()) + .salaryCbsId(StringUtils.join(cbsIdList, ",")) + .totalEmp(String.valueOf(infoList.size())) + .totalValue(sumVal.toString()) + .referenceNum(String.valueOf(referenceNum)) + .creator(Long.valueOf(user.getUID())) + .returnValue(pushResult) + .createTime(new Date()) + .deleteType(NumberUtils.INTEGER_ZERO) + .build()); + Map pushResultMap = JSONObject.parseObject(pushResult, new TypeReference>() {}); + Map dataMap = (Map)pushResultMap.get("data"); + Boolean successed = (Boolean) dataMap.get("successed"); + if (successed != null && successed.equals(true)) { + String busNum = Utils.null2String(dataMap.get("busNum")); + // 推送成功,更新记录 + updatePushStatus(infoList, busNum, referenceNum, CbsPushStatusEnum.PUSHED.getValue()); + } else { + String errorMsg = Utils.null2String(dataMap.get("errorMsg")); + log.error("cbs推送出错1" + pushResult); + throw new SalaryRunTimeException("cbs推送出错:" + errorMsg); + } + } catch (SalaryRunTimeException e) { + log.error("cbs推送出错2" + pushResult); + throw new RuntimeException("cbs推送出错:" + e); + } + } else { + // 弹出提示框 + return "共计"+infoList.size()+"人,合计"+sumVal.toString()+"元"; + } + + + return null; + } + + /** + * 推送成功,更新数据库状态 + * @param infoList + * @param busNum + * @param referenceNum + */ + private void updatePushStatus(List infoList, String busNum, long referenceNum, Integer pushStatus) { + if (CollectionUtils.isEmpty(infoList)) { + return; + } + for (SalaryCbsInfoPO infoPO : infoList) { + SalaryCbsInfoPO po = SalaryCbsInfoPO.builder().id(infoPO.getId()).referenceNum(String.valueOf(referenceNum)).busNum(busNum).pushStatus(pushStatus).build(); + updateIgnoreNull(po); + } + if (CollectionUtils.isNotEmpty(infoList)) { + List salaryCbsIds = infoList.stream().map(SalaryCbsInfoPO::getSalaryCbsId).distinct().collect(Collectors.toList()); + for (Long salaryCbsId : salaryCbsIds) { + getSalaryCbsMapper().updateIgnoreNull(SalaryCbsPO.builder().id(salaryCbsId).lastPushTime(new Date()).updateTime(new Date()).build()); + } + } + } + + /** + * 获取建模配置的cbs传参信息 + * @return + */ + private Map getAllCbsParamConfigMap() { + RecordSet rs = new RecordSet(); + rs.execute(" select mc,cckey,ccvalue from uf_cbscspz"); + Map resultMap = new HashMap<>(); + while (rs.next()) { + if (StringUtils.isNotBlank(rs.getString("ccvalue"))) { + resultMap.put(rs.getString("cckey"), rs.getString("ccvalue")); + } + } + return resultMap; + } + + private List listByCbsIdsAndIds(List salaryCbsIds, List ids) { + List resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(salaryCbsIds) && CollectionUtils.isEmpty(ids)) { + return Collections.emptyList(); + } + if (CollectionUtils.isEmpty(ids)) { + List salaryCbsInfoPOS = getSalaryCbsInfoMapper().listByCbsIdAndIds(salaryCbsIds, ids); + encryptUtil.decryptList(salaryCbsInfoPOS, SalaryCbsInfoPO.class); + resultList.addAll(salaryCbsInfoPOS); + } else { + List> partition = Lists.partition(ids, 1000); + partition.forEach(part -> { + List salaryCbsInfoPOS = getSalaryCbsInfoMapper().listByCbsIdAndIds(salaryCbsIds, part); + encryptUtil.decryptList(salaryCbsInfoPOS, SalaryCbsInfoPO.class); + resultList.addAll(salaryCbsInfoPOS); + }); + } + + return resultList; + } + + @Override + public void updatePushStatusByCbsIdsAndEmpIds(List cbsIdList, List needChangeEmpIds, Integer value) { + if (CollectionUtils.isEmpty(cbsIdList) || CollectionUtils.isEmpty(needChangeEmpIds)) { + return; + } + List> partition = Lists.partition(needChangeEmpIds, 500); + partition.forEach(part -> getSalaryCbsInfoMapper().updatePushStatusByCbsIdsAndEmpIds(cbsIdList, part, value)); + } +} diff --git a/src/com/engine/salary/service/impl/SalaryCbsPushServiceImpl.java b/src/com/engine/salary/service/impl/SalaryCbsPushServiceImpl.java new file mode 100644 index 000000000..b57889825 --- /dev/null +++ b/src/com/engine/salary/service/impl/SalaryCbsPushServiceImpl.java @@ -0,0 +1,61 @@ +package com.engine.salary.service.impl; + +import com.api.formmode.mybatis.util.SqlProxyHandle; +import com.engine.core.impl.Service; +import com.engine.salary.encrypt.EncryptUtil; +import com.engine.salary.entity.cbs.po.SalaryCbsPushPO; +import com.engine.salary.mapper.cbs.SalaryCbsPushMapper; +import com.engine.salary.service.SalaryCbsPushService; + +import java.util.List; + +/** + * @author Harryxzy + * @ClassName SalaryCbsPushServiceImpl + * @date 2025/05/09 11:38 + * @description + */ +public class SalaryCbsPushServiceImpl extends Service implements SalaryCbsPushService { + + private EncryptUtil encryptUtil = new EncryptUtil(); + + private SalaryCbsPushMapper getSalaryCbsPushMapper() { + return SqlProxyHandle.getProxy(SalaryCbsPushMapper.class); + } + + @Override + public List listAll() { + return getSalaryCbsPushMapper().listAll(); + } + + @Override + public SalaryCbsPushPO getById(Long id) { + if (id == null) { + return null; + } + return getSalaryCbsPushMapper().getById(id); + } + @Override + public int insertIgnoreNull(SalaryCbsPushPO salaryCbsPush) { + encryptUtil.encrypt(salaryCbsPush, SalaryCbsPushPO.class); + return getSalaryCbsPushMapper().insertIgnoreNull(salaryCbsPush); + } + + @Override + public int update(SalaryCbsPushPO salaryCbsPush) { + return getSalaryCbsPushMapper().update(salaryCbsPush); + } + + @Override + public int updateIgnoreNull(SalaryCbsPushPO salaryCbsPush) { + return getSalaryCbsPushMapper().update(salaryCbsPush); + } + + @Override + public int delete(SalaryCbsPushPO salaryCbsPush) { + if (salaryCbsPush == null) { + return 0; + } + return getSalaryCbsPushMapper().delete(salaryCbsPush); + } +} diff --git a/src/com/engine/salary/service/impl/SalaryCbsServiceImpl.java b/src/com/engine/salary/service/impl/SalaryCbsServiceImpl.java new file mode 100644 index 000000000..49d10289d --- /dev/null +++ b/src/com/engine/salary/service/impl/SalaryCbsServiceImpl.java @@ -0,0 +1,221 @@ +package com.engine.salary.service.impl; + +import com.api.formmode.mybatis.util.SqlProxyHandle; +import com.engine.common.util.ServiceUtil; +import com.engine.core.impl.Service; +import com.engine.salary.entity.cbs.dto.SalaryCBSBaseInfoDTO; +import com.engine.salary.entity.cbs.dto.SalaryCBSPushListDTO; +import com.engine.salary.entity.cbs.po.SalaryCbsInfoPO; +import com.engine.salary.entity.cbs.po.SalaryCbsPO; +import com.engine.salary.entity.salaryBill.param.SalarySendQueryParam; +import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; +import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO; +import com.engine.salary.enums.salaryaccounting.CbsPushStatusEnum; +import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.mapper.cbs.SalaryCbsMapper; +import com.engine.salary.service.SalaryAcctEmployeeService; +import com.engine.salary.service.SalaryAcctRecordService; +import com.engine.salary.service.SalaryAcctResultService; +import com.engine.salary.service.SalaryCbsService; +import com.engine.salary.service.auth.AuthService; +import com.engine.salary.service.auth.AuthServiceImpl; +import com.engine.salary.util.SalaryEntityUtil; +import com.engine.salary.util.SalaryI18nUtil; +import com.engine.salary.util.db.IdGenerator; +import com.google.common.collect.Lists; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.math.NumberUtils; +import weaver.hrm.User; +import weaver.wechat.util.Utils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author Harryxzy + * @ClassName SalaryCbsServiceImpl + * @date 2025/05/07 15:19 + * @description + */ +public class SalaryCbsServiceImpl extends Service implements SalaryCbsService { + + private SalaryCbsMapper getSalaryCbsMapper() { + return SqlProxyHandle.getProxy(SalaryCbsMapper.class); + } + + private SalaryAcctResultService getSalaryAcctResultService(User user) { + return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user); + } + + private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) { + return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user); + } + + private SalaryCbsInfoServiceImpl getSalaryCbsInfoService(User user) { + return ServiceUtil.getService(SalaryCbsInfoServiceImpl.class, user); + } + + private SalaryAcctRecordService getSalaryAcctRecordService(User user) { + return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user); + } + + + public AuthService getAuthService(User user) { + return ServiceUtil.getService(AuthServiceImpl.class, user); + } + + @Override + public List listAll() { + return getSalaryCbsMapper().listAll(); + } + + @Override + public List listSome(SalaryCbsPO salaryCbs) { + return getSalaryCbsMapper().listSome(salaryCbs); + } + + @Override + public SalaryCbsPO getById(Long id) { + if (id == null) { + return null; + } + return getSalaryCbsMapper().getById(id); + } + + + @Override + public int insertIgnoreNull(SalaryCbsPO salaryCbs) { + return getSalaryCbsMapper().insertIgnoreNull(salaryCbs); + } + + @Override + public int update(SalaryCbsPO salaryCbs) { + return getSalaryCbsMapper().update(salaryCbs); + } + + @Override + public int updateIgnoreNull(SalaryCbsPO salaryCbs) { + return getSalaryCbsMapper().updateIgnoreNull(salaryCbs); + } + + @Override + public int delete(SalaryCbsPO salaryCbs) { + return getSalaryCbsMapper().delete(salaryCbs); + } + + @Override + public List listBySalaryAcctRecordId(Long salaryAcctRecordId) { + if (salaryAcctRecordId == null) { + return Collections.emptyList(); + } + return listSome(SalaryCbsPO.builder().salaryAccountingId(salaryAcctRecordId).build()); + } + + @Override + public List listBySalaryAcctRecordIds(List salaryAcctRecordIds) { + if (CollectionUtils.isEmpty(salaryAcctRecordIds)) { + return Collections.emptyList(); + } + List resultList = new ArrayList<>(); + List> partition = Lists.partition(salaryAcctRecordIds, 500); + partition.forEach(part -> { + resultList.addAll(getSalaryCbsMapper().listBySalaryAcctRecordIds(part)); + }); + return resultList; + } + + @Override + public void generatePushList(SalaryAcctRecordPO salaryAcctRecordPO, Map sobItemMap) { + if (salaryAcctRecordPO == null) { + return; + } + + // 查询是否已有生成的cbs推送列表数据 + List salaryCbsPOS = listBySalaryAcctRecordId(salaryAcctRecordPO.getId()); + if (CollectionUtils.isNotEmpty(salaryCbsPOS)) { + throw new SalaryRunTimeException("已生成cbs数据,请联系管理员删除"); + } + // 查询账套对应的薪资项目id + Long salarySobId = salaryAcctRecordPO.getSalarySobId(); + Long salaryItemId = null; + if (sobItemMap.containsKey(salarySobId)) { + salaryItemId = sobItemMap.get(salarySobId); + } else { + salaryItemId = sobItemMap.get(0L); + } + + if (salaryItemId == null) { + throw new SalaryRunTimeException("请先设置cbs账套薪资项目映射"); + } + // 查询薪资核算人员 + List salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordPO.getId()); + List salaryAcctEmpIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); + // 查询薪资核算结果 + Map resultMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(salaryAcctEmpIdList)) { + List acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIdList, Collections.singletonList(salaryItemId)); + resultMap = SalaryEntityUtil.convert2Map(acctResultList, SalaryAcctResultPO::getSalaryAcctEmpId, SalaryAcctResultPO::getResultValue); + } + + // 封装推送主表数据 + Date now = new Date(); + Long creator = Long.valueOf(user.getUID()); + long mainId = IdGenerator.generate(); + SalaryCbsPO build = SalaryCbsPO.builder() + .id(mainId) + .salaryMonth(salaryAcctRecordPO.getSalaryMonth()) + .salaryAccountingId(salaryAcctRecordPO.getId()) + .salarySobId(salarySobId) + .creator(creator) + .createTime(now) + .updateTime(now) + .deleteType(NumberUtils.INTEGER_ZERO) + .build(); + insertIgnoreNull(build); + // 封装推送列表数据 + for (SalaryAcctEmployeePO salaryAcctEmployeePO : salaryAcctEmployeeList) { + String value = Utils.null2String(resultMap.get(salaryAcctEmployeePO.getId())); + SalaryCbsInfoPO infoPO = SalaryCbsInfoPO.builder() + .id(IdGenerator.generate()) + .salaryCbsId(mainId) + .employeeId(salaryAcctEmployeePO.getEmployeeId()) + .employeeType(salaryAcctEmployeePO.getEmployeeType()) + .pushStatus(CbsPushStatusEnum.NOT_PUSHED.getValue()) + .creator(creator) + .createTime(now) + .updateTime(now) + .deleteType(NumberUtils.INTEGER_ZERO) + .pushValue(value) + .build(); + getSalaryCbsInfoService(user).insertIgnoreNull(infoPO); + } + + } + + @Override + public List list(SalarySendQueryParam queryParam) { + List list = getSalaryCbsMapper().list(queryParam); + return list; + } + + @Override + public SalaryCBSBaseInfoDTO getBaseInfo(Long id) { + SalaryCbsPO SalaryCbs = getById(id); + if (SalaryCbs == null) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "cbs推送信息不存在")); + } + Long salaryAcctId = SalaryCbs.getSalaryAccountingId(); + SalarySobCycleDTO salarySobCycleDTO = getSalaryAcctRecordService(user).getSalarySobCycleById(salaryAcctId); + List salaryCbsInfoList = getSalaryCbsInfoService(user).listByCbsIds(Collections.singletonList(id)); + int pushNum = salaryCbsInfoList.stream().filter(salaryCbsInfoPO -> salaryCbsInfoPO.getPushStatus().equals(CbsPushStatusEnum.PUSHED.getValue())).collect(Collectors.toList()).size(); + + return SalaryCBSBaseInfoDTO.builder() + .salaryMonth(salarySobCycleDTO.getSalaryMonth()) + .salarySobCycle(salarySobCycleDTO) + .pushTotal(salaryCbsInfoList.size()) + .pushNum(pushNum) + .build(); + } +} diff --git a/src/com/engine/salary/util/SalaryTokenUtil.java b/src/com/engine/salary/util/SalaryTokenUtil.java index 653a0a821..1ad138363 100644 --- a/src/com/engine/salary/util/SalaryTokenUtil.java +++ b/src/com/engine/salary/util/SalaryTokenUtil.java @@ -233,6 +233,66 @@ public class SalaryTokenUtil { return null; } + public static String post4lt(String path, String param, Map data) { + try { + String str = ""; +// if (params != null) { +// StringBuilder stringBuilder = new StringBuilder("?"); +// for (Map.Entry entry : params.entrySet()) { +// stringBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); +// } +// if (stringBuilder.length() > 1) +// path += stringBuilder.substring(0, stringBuilder.length() - 1); +// } + URL url = new URL(path); + //打开和url之间的连接 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); +// PrintWriter out = null; + // 请求参数 编码为 utf-8 + //请求方式 + conn.setRequestMethod("POST"); + //设置通用的请求属性 + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); + conn.setRequestProperty("Content-Type", "application/json"); + if (data != null) { + for (Map.Entry entry : data.entrySet()) { + conn.setRequestProperty(entry.getKey(), entry.getValue()); + } + } + //设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个 + //最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet, + //post与get的 不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。 + conn.setDoOutput(true); + conn.setDoInput(true); + OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "utf-8"); + if (StringUtils.isNotBlank(param)) { + out.write(param); + } + //缓冲数据 + out.flush(); + out.close(); + //获取URLConnection对象对应的输入流 + InputStream is = conn.getInputStream(); + //构造一个字符流缓存 + BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8")); + String result = ""; + while ((str = br.readLine()) != null) { + result = str; + } + //关闭流 + is.close(); + //断开连接,最好写上,disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。 + //固定多线程的话,如果不disconnect,链接会增多,直到收发不出信息。写上disconnect后正常一些。 + conn.disconnect(); + return result; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + /** * 将Map转换成字符串参数,用于POST GET 请求 * diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index 64f5a7bbd..9654bafff 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -133,6 +133,15 @@ public class SalaryAcctController { return new ResponseResult(user).run(getSalaryAcctRecordWrapper(user)::file, id); } + // 联特 生成CBS推送记录 + @POST + @Path("/generateCBSPushList") + @Produces(MediaType.APPLICATION_JSON) + public String generateCBSPushList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody List ids) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult, Long>(user).run(getSalaryAcctRecordWrapper(user)::generateCBSPushList, ids); + } + //重新核算 @POST @Path("/reAccounting") diff --git a/src/com/engine/salary/web/SalaryCBSController.java b/src/com/engine/salary/web/SalaryCBSController.java new file mode 100644 index 000000000..1e5c51716 --- /dev/null +++ b/src/com/engine/salary/web/SalaryCBSController.java @@ -0,0 +1,276 @@ +package com.engine.salary.web; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.cbs.dto.SalaryCBSBaseInfoDTO; +import com.engine.salary.entity.cbs.dto.SalaryCBSInfoListDTO; +import com.engine.salary.entity.cbs.param.CBSPushParam; +import com.engine.salary.entity.cbs.param.SalaryCBSInfoQueryParam; +import com.engine.salary.entity.salaryBill.param.SalarySendQueryParam; +import com.engine.salary.service.HrmSecondaryPwdSetService; +import com.engine.salary.service.impl.HrmSecondaryPwdSetServiceImpl; +import com.engine.salary.util.ResponseResult; +import com.engine.salary.util.page.PageInfo; +import com.engine.salary.wrapper.SalaryBillBaseSetWrapper; +import com.engine.salary.wrapper.SalaryCBSWrapper; +import com.engine.salary.wrapper.SalarySendWrapper; +import com.engine.salary.wrapper.SalaryTemplateWrapper; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import weaver.general.BaseBean; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.*; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + + +@Slf4j +public class SalaryCBSController { + private final Boolean isLog = "true".equals(new BaseBean().getPropValue("hrmSalary", "log")); + + private SalaryTemplateWrapper getSalaryTemplateWrapper(User user) { + return ServiceUtil.getService(SalaryTemplateWrapper.class, user); + } + + private SalarySendWrapper getSalarySendWrapper(User user) { + return ServiceUtil.getService(SalarySendWrapper.class, user); + } + + private SalaryBillBaseSetWrapper getSalaryBillBaseSetWrapper(User user) { + return ServiceUtil.getService(SalaryBillBaseSetWrapper.class, user); + } + + private HrmSecondaryPwdSetService getService(User user) { + return (HrmSecondaryPwdSetService) ServiceUtil.getService(HrmSecondaryPwdSetServiceImpl.class, user); + } + + + + +//------------------------------------------------------------------ + + private SalaryCBSWrapper getSalaryCBSWrapper(User user) { + return ServiceUtil.getService(SalaryCBSWrapper.class, user); + } + /** + * CBS推送列表 + * + * @param queryParam + * @return + */ + @POST + @Path("/push/list") + @Produces(MediaType.APPLICATION_JSON) + public String list(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySendQueryParam queryParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryCBSWrapper(user)::list, queryParam); + } + + /** + * cbs推送基本信息 + * + * @return + */ + @GET + @Path("/push/getBaseInfo") + @Produces(MediaType.APPLICATION_JSON) + public String getBaseInfo(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "id") Long id) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryCBSWrapper(user)::getBaseInfo, id); + } + + /** + * cbs推送信息明细列表 + * + * @param queryParam + * @return + */ + @POST + @Path("/push/infoList") + @Produces(MediaType.APPLICATION_JSON) + public String pushInfoList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryCBSInfoQueryParam queryParam) { + User user = HrmUserVarify.getUser(request, response); + if (StringUtils.isNotBlank(queryParam.getDepartmentIdStr())) { + queryParam.setDepartmentIds(Arrays.stream(StringUtils.split(queryParam.getDepartmentIdStr(), ",")).map(Long::valueOf).collect(Collectors.toList())); + } + if (StringUtils.isNotBlank(queryParam.getSubCompanyIdStr())) { + queryParam.setSubCompanyIds(Arrays.stream(StringUtils.split(queryParam.getSubCompanyIdStr(), ",")).map(Long::valueOf).collect(Collectors.toList())); + } + return new ResponseResult>(user).run(getSalaryCBSWrapper(user)::infoList, queryParam); + } + + /** + * cbs推送数据 + * + * @param queryParam + * @return + */ + @POST + @Path("/push/pushDataToCBS") + @Produces(MediaType.APPLICATION_JSON) + public String pushDataToCBS(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody CBSPushParam queryParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryCBSWrapper(user)::pushDataToCBS, queryParam); + } + + /******** 工资单发放 start ***********************************************************************************************/ + + + + // /** + // * 工资单发放信息列表的高级搜索 + // * + // * @return + // */ + // @GET + // @Path("/send/getInfoSearchCondition") + // @Produces(MediaType.APPLICATION_JSON) + // public String getInfoSearchCondition(@Context HttpServletRequest request, @Context HttpServletResponse response) { + // User user = HrmUserVarify.getUser(request, response); + // return new ResponseResult<>(user).run(getSalarySendWrapper(user)::getInfoSearchCondition); + // } + + + + + // + // /** + // * 导出-工资单发放信息列表 + // * + // * @return + // */ + // @POST + // @Path("/send/exportInfoList") + // @Produces(MediaType.APPLICATION_OCTET_STREAM) + // public Response exportInfoList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySendInfoQueryParam queryParam) { + // User user = HrmUserVarify.getUser(request, response); + // + // XSSFWorkbook workbook = getSalarySendWrapper(user).exportInfoList(queryParam); + // + // String 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(); + // } + + +// /** +// * 工资单批量发放信息列表 +// * +// * @param queryParam +// * @return +// */ +// @POST +// @Path("/send/batchSendInfoList") +// @Produces(MediaType.APPLICATION_JSON) +// public String batchSendInfoList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySendInfoQueryParam queryParam) { +// // 包含未发送、已撤回 +// queryParam.setSendStatuss(Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue())); +// User user = HrmUserVarify.getUser(request, response); +// return new ResponseResult>(user).run(getSalarySendWrapper(user)::infoList, queryParam); +// +// // WeaTable weaTable = salarySendWrapper.infoList(queryParam, UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey()); +// // weaTable.setOperatesPermission(new LinkedList<>()); +// // weaTable.setOperates(new LinkedList<>()); +// // return WeaResult.success(weaTable); +// } +// +// /** +// * 工资单批量撤回信息列表 +// * +// * @param queryParam +// * @return +// */ +// @POST +// @Path("/send/batchWithdrawInfoList") +// @Produces(MediaType.APPLICATION_JSON) +// public String batchWithdrawInfoList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySendInfoQueryParam queryParam) { +// // 包含已发送 +// queryParam.setSendStatuss(Arrays.asList(SalarySendStatusEnum.ALREADYSEND.getValue())); +// User user = HrmUserVarify.getUser(request, response); +// +// return new ResponseResult>(user).run(getSalarySendWrapper(user)::infoList, queryParam); +// } +// +// /** +// * 工资单发放 +// * +// * @param queryParam +// * @return +// */ +// @POST +// @Path("/send/grant") +// @Produces(MediaType.APPLICATION_JSON) +// public String grant(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySendGrantParam queryParam) { +// User user = HrmUserVarify.getUser(request, response); +// return new ResponseResult>(user).run(getSalarySendWrapper(user)::grant, queryParam); +// } +// +// +// /** +// * 工资单发放详情列表的高级搜索 +// * +// * @return +// */ +// @POST +// @Path("/send/getDetailSearchCondition") +// @Produces(MediaType.APPLICATION_JSON) +// public String getDetailSearchCondition(@Context HttpServletRequest request, @Context HttpServletResponse response) { +// User user = HrmUserVarify.getUser(request, response); +// return new ResponseResult>(user).run(getSalarySendWrapper(user)::getDetailSearchCondition); +// } +// +// /** +// * 工资单发放详情列表 +// * +// * @param queryParam +// * @return +// */ +// @POST +// @Path("/send/detailList") +// @Produces(MediaType.APPLICATION_JSON) +// public String detailList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySendDetailListQueryParam queryParam) { +// User user = HrmUserVarify.getUser(request, response); +// // 处理入参复用方法 +// SalarySendDetailQueryParam detailQueryParam = SalarySendDetailQueryParam.builder() +// .userId(queryParam.getUserId()) +// .departmentIds(CollectionUtils.isEmpty(queryParam.getDepartmentIds()) ? null : queryParam.getDepartmentIds()) +// .salarySendId(queryParam.getSalarySendId()) +// .mergeCountTax(queryParam.getMergeCountTax()) +// .positionIds(SalaryEntityUtil.isNullOrEmpty(queryParam.getPosition()) ? null : Collections.singletonList(queryParam.getPosition())) +// .taxAgentId(queryParam.getTaxAgent()) +// .username(queryParam.getUsername()) +// .userstatus(queryParam.getUserstatus()).build(); +// detailQueryParam.setCurrent(queryParam.getCurrent()); +// detailQueryParam.setPageSize(queryParam.getPageSize()); +// +// if (StringUtils.isNotBlank(queryParam.getSubCompanyIdStr())) { +// detailQueryParam.setSubCompanyIds(Arrays.asList(StringUtils.split(queryParam.getSubCompanyIdStr(), ",")).stream().map(Long::new).collect(Collectors.toList())); +// } +// if (StringUtils.isNotBlank(queryParam.getDepartmentIdStr())) { +// detailQueryParam.setDepartmentIds(Arrays.asList(StringUtils.split(queryParam.getDepartmentIdStr(), ",")).stream().map(Long::new).collect(Collectors.toList())); +// } +// return new ResponseResult>(user).run(getSalarySendWrapper(user)::detailList, detailQueryParam); +// } + + + /******** 工资单发放 end ***********************************************************************************************/ + +} diff --git a/src/com/engine/salary/wrapper/SalaryAcctRecordWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctRecordWrapper.java index a9f9e0556..77bab5e7b 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctRecordWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctRecordWrapper.java @@ -380,4 +380,12 @@ public class SalaryAcctRecordWrapper extends Service implements SalaryAcctRecord public void updateSobConfig(Long id) { getSalaryAcctSobConfigService(user).updateBySalaryAcctRecordId(id); } + + /** + * 联特 生成CBS推送记录 + * @param ids + */ + public void generateCBSPushList(List ids) { + getSalaryAcctRecordService(user).generateCBSPushList(ids); + } } diff --git a/src/com/engine/salary/wrapper/SalaryCBSWrapper.java b/src/com/engine/salary/wrapper/SalaryCBSWrapper.java new file mode 100644 index 000000000..76e5b7c74 --- /dev/null +++ b/src/com/engine/salary/wrapper/SalaryCBSWrapper.java @@ -0,0 +1,134 @@ +package com.engine.salary.wrapper; + +import com.cloudstore.eccom.pc.table.WeaTableColumn; +import com.engine.common.service.HrmCommonService; +import com.engine.common.service.impl.HrmCommonServiceImpl; +import com.engine.common.util.ServiceUtil; +import com.engine.core.impl.Service; +import com.engine.salary.entity.cbs.dto.SalaryCBSBaseInfoDTO; +import com.engine.salary.entity.cbs.dto.SalaryCBSInfoListDTO; +import com.engine.salary.entity.cbs.dto.SalaryCBSPushListDTO; +import com.engine.salary.entity.cbs.param.CBSPushParam; +import com.engine.salary.entity.cbs.param.SalaryCBSInfoQueryParam; +import com.engine.salary.entity.cbs.po.SalaryCbsInfoPO; +import com.engine.salary.entity.salaryBill.param.SalarySendQueryParam; +import com.engine.salary.enums.salaryaccounting.CbsPushStatusEnum; +import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.service.SalaryCbsInfoService; +import com.engine.salary.service.SalaryCbsService; +import com.engine.salary.service.SalarySendService; +import com.engine.salary.service.impl.SalaryCbsInfoServiceImpl; +import com.engine.salary.service.impl.SalaryCbsServiceImpl; +import com.engine.salary.service.impl.SalarySendServiceImpl; +import com.engine.salary.util.SalaryDateUtil; +import com.engine.salary.util.SalaryEntityUtil; +import com.engine.salary.util.SalaryI18nUtil; +import com.engine.salary.util.page.PageInfo; +import com.engine.salary.util.page.SalaryPageUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import weaver.general.BaseBean; +import weaver.hrm.User; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 工资单发放 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +public class SalaryCBSWrapper extends Service { + + private SalarySendService getSalarySendService(User user) { + return ServiceUtil.getService(SalarySendServiceImpl.class, user); + } + + private SalaryCbsService getSalaryCbsService(User user) { + return ServiceUtil.getService(SalaryCbsServiceImpl.class, user); + } + + private SalaryCbsInfoService getSalaryCbsInfoService(User user) { + return ServiceUtil.getService(SalaryCbsInfoServiceImpl.class, user); + } + + /** + * cbs推送列表 + * + * @param queryParam + * @return + */ + public Map list(SalarySendQueryParam queryParam) { + + if (CollectionUtils.isEmpty(queryParam.getSalaryYearMonth())) { + throw new SalaryRunTimeException("请选择月份"); + } + + HrmCommonService hcs = new HrmCommonServiceImpl(); + BaseBean baseBean = new BaseBean(); + String roleId = baseBean.getPropValue("ltSalary", "cbs_role_ie"); + List userIdList = hcs.getRoleMembers(new Integer(roleId),"0").stream().map(userId -> new Long(userId.toString())).collect(Collectors.toList()); + if (!userIdList.contains(Long.valueOf(user.getUID()))) { + return new HashMap<>(); + } + Map datas = new HashMap<>(16); + queryParam.setSalaryMonth(queryParam.getSalaryYearMonth().stream().map(e -> e + "-01 00:00:00").collect(Collectors.toList())); + queryParam.setSalaryMonthDate(queryParam.getSalaryYearMonth().stream().map(e -> e + "-01 00:00:00").map(SalaryDateUtil::dateStrToLocalTime).collect(Collectors.toList())); + + List list = getSalaryCbsService(user).list(queryParam); + PageInfo pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + list, SalaryCBSPushListDTO.class); + List pageList = pageInfo.getList(); + + // 封装总数和已发 + List cbsIdList = pageList.stream().map(SalaryCBSPushListDTO::getId).collect(Collectors.toList()); + List pushInfoList = getSalaryCbsInfoService(user).listByCbsIds(cbsIdList); + Map> pushInfoMapGroupByCbsId = SalaryEntityUtil.group2Map(pushInfoList, SalaryCbsInfoPO::getSalaryCbsId); + + + pageList.forEach(e -> { + List salaryCbsInfoList = pushInfoMapGroupByCbsId.get(e.getId()); + int total = CollectionUtils.isEmpty(salaryCbsInfoList) ? 0 : salaryCbsInfoList.size(); + // 推送总数 + e.setPushTotal(total); + int pushNum = total == 0 ? 0 : salaryCbsInfoList.stream().filter(info -> info.getPushStatus().equals(CbsPushStatusEnum.PUSHED.getValue())).collect(Collectors.toList()).size(); + // 已推送数 + e.setPushNum(pushNum); + e.setPushSituation(pushNum + "/" + total); + }); + + List columns = new ArrayList<>(); + columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "薪资所属月"), "salaryYearMonth")); + columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "薪资账套"), "salarySob")); + columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "次数"), "acctTimes")); + columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "已推送"), "pushSituation")); + columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "最后推送时间"), "lastPushTime")); + + datas.put("pageInfo", pageInfo); + datas.put("columns", columns); + return datas; + } + + public SalaryCBSBaseInfoDTO getBaseInfo(Long id) { + return getSalaryCbsService(user).getBaseInfo(id); + } + + public PageInfo infoList(SalaryCBSInfoQueryParam queryParam) { + SalaryCBSInfoQueryParam.checkParam(queryParam); + // 推送状态 + if (StringUtils.isNotBlank(queryParam.getPushStatus())) { + queryParam.setPushStatusVal(Integer.valueOf(queryParam.getPushStatus())); + } + + PageInfo pageInfo = getSalaryCbsInfoService(user).salaryCbsInfoListPage(queryParam); + + return pageInfo; + } + + public String pushDataToCBS(CBSPushParam cbsPushParam) { + return getSalaryCbsInfoService(user).pushDataToCBS(cbsPushParam); + } +}