联特cbs对接

This commit is contained in:
Harryxzy 2025-05-12 17:42:15 +08:00
parent cc510db3cc
commit 4c05906f03
37 changed files with 3800 additions and 2 deletions

View File

@ -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
);

View File

@ -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{
}

View File

@ -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<String, String> 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<SalaryAcctRecordPO> salaryAcctRecordPOS = getSalaryAcctRecordService(user).listBySalaryMonth(salaryMonthRange);
List<Long> salaryAcctRecordIds = salaryAcctRecordPOS.stream()
.filter(po -> po.getStatus().equals(SalaryAcctRecordStatusEnum.PUSHED.getValue()))
.map(SalaryAcctRecordPO::getId)
.collect(Collectors.toList());
// 获取cbs推送记录
List<SalaryCbsPO> salaryCbsPOS = getSalaryCbsService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
List<Long> cbsIdList = salaryCbsPOS.stream().map(SalaryCbsPO::getId).collect(Collectors.toList());
// 获取需要变更的人员id
List<Long> 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<String, String> 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;
}
}

View File

@ -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;
}

View File

@ -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> paymentApplyAgentDTO;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<String> opts;
}

View File

@ -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;
}

View File

@ -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<Long> ids;
// cbsId
private List<Long> salaryCbsIds;
private boolean isConfirm;
// 工资卡开户行
private String gzkkhh;
// 姓名
private String username;
}

View File

@ -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<Long> 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<Long> departmentIds;
// 分部id
private List<Long> subCompanyIds;
// 岗位id")
private List<Long> positionIds;
// 状态")
private String userstatus;
// 入职日期")
private List<LocalDate> hiredate;
// 推送状态")
private String pushStatus;
/**
* true= [已推送]
* false= [未推送]
*/
private Boolean isPushed;
/**
* 推送状态
*/
// @JsonIgnore
private Integer pushStatusVal;
/**
* 发送状态
*/
// @JsonIgnore
private List<Integer> 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 "";
}
}

View File

@ -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<Long> ids;
}

View File

@ -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<Long> ids;
}

View File

@ -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<Long> ids;
}

View File

@ -0,0 +1,55 @@
package com.engine.salary.enums.salaryaccounting;
import com.engine.salary.enums.BaseEnum;
import java.util.Objects;
/**
* cbs推送的状态
* <p>Copyright: Copyright (c) 2025</p>
* <p>Company: 泛微软件</p>
*
* @author xzy
* @version 1.0
**/
public enum CbsPushStatusEnum implements BaseEnum<Integer> {
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;
}
}

View File

@ -17,6 +17,7 @@ public enum SalaryAcctRecordStatusEnum implements BaseEnum<Integer> {
NOT_ARCHIVED(1, "未归档", 91870),
ARCHIVED(2, "已归档", 91862),
DECLARED(3, "已申报", 100119),
PUSHED(4, "已推送", 0),
;
private int value;

View File

@ -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<SalaryCbsInfoPO> listAll();
/**
* 条件查询
*
* @return 返回集合没有返回空List
*/
List<SalaryCbsInfoPO> 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<SalaryCbsInfoPO> listByCbsIds(@Param("cbsIds") List<Long> cbdIds);
List<SalaryCBSInfoListDTO> list(@Param("param")SalaryCBSInfoQueryParam queryParam);
List<SalaryCbsInfoPO> listByCbsIdAndIds(@Param("cbsIds")List<Long> salaryCbsIds, @Param("ids")List<Long> part);
void updatePushStatusByCbsIdsAndEmpIds(@Param("cbsIds")List<Long> cbsIdList, @Param("empIds")List<Long> part, @Param("pushStatus")Integer value);
}

View File

@ -0,0 +1,553 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.engine.salary.mapper.cbs.SalaryCbsInfoMapper">
<resultMap id="BaseResultMap" type="com.engine.salary.entity.cbs.po.SalaryCbsInfoPO">
<result column="create_time" property="createTime" />
<result column="creator" property="creator" />
<result column="delete_type" property="deleteType" />
<result column="employee_id" property="employeeId" />
<result column="employee_type" property="employeeType" />
<result column="id" property="id" />
<result column="push_status" property="pushStatus" />
<result column="push_time" property="pushTime" />
<result column="push_value" property="pushValue" />
<result column="reference_num" property="referenceNum" />
<result column="salary_cbs_id" property="salaryCbsId" />
<result column="update_time" property="updateTime" />
</resultMap>
<!-- 表字段 -->
<sql id="baseColumns">
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
</sql>
<!-- 查询全部 -->
<select id="listAll" resultMap="BaseResultMap">
SELECT
<include refid="baseColumns" />
FROM hrsa_salary_cbs_info t
WHERE delete_type = 0
</select>
<!-- 根据主键获取单条记录 -->
<select id="getById" resultMap="BaseResultMap" parameterType="Long">
SELECT
<include refid="baseColumns" />
FROM hrsa_salary_cbs_info t
WHERE id = #{id} AND delete_type = 0
</select>
<!-- 条件查询 -->
<select id="listSome" resultMap="BaseResultMap" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsInfoPO">
SELECT
<include refid="baseColumns" />
FROM hrsa_salary_cbs_info t
WHERE delete_type = 0
<if test="createTime != null">
AND create_time = #{createTime}
</if>
<if test="creator != null">
AND creator = #{creator}
</if>
<if test="deleteType != null">
AND delete_type = #{deleteType}
</if>
<if test="employeeId != null">
AND employee_id = #{employeeId}
</if>
<if test="employeeType != null">
AND employee_type = #{employeeType}
</if>
<if test="id != null">
AND id = #{id}
</if>
<if test="pushStatus != null">
AND push_status = #{pushStatus}
</if>
<if test="pushTime != null">
AND push_time = #{pushTime}
</if>
<if test="pushValue != null">
AND push_value = #{pushValue}
</if>
<if test="referenceNum != null">
AND reference_num = #{referenceNum}
</if>
<if test="salaryCbsId != null">
AND salary_cbs_id = #{salaryCbsId}
</if>
<if test="updateTime != null">
AND update_time = #{updateTime}
</if>
<if test="ids != null and ids.size()>0">
AND id IN
<foreach collection="ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
ORDER BY id DESC
</select>
<select id="listByCbsIds" resultType="com.engine.salary.entity.cbs.po.SalaryCbsInfoPO">
SELECT
<include refid="baseColumns" />
FROM hrsa_salary_cbs_info t
WHERE delete_type = 0
<if test="cbsIds != null and cbsIds.size()>0">
AND salary_cbs_id IN
<foreach collection="cbsIds" open="(" item="cbsId" separator="," close=")">
#{cbsId}
</foreach>
</if>
ORDER BY id DESC
</select>
<sql id="salaryCbsInfoColumn">
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
</sql>
<sql id="paramSql">
<if test="param.ids != null and param.ids.size()>0">
AND t1.id IN
<foreach collection="param.ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
<if test="param.salaryCbsId != null">
AND t1.salary_cbs_id = #{param.salaryCbsId}
</if>
<!-- 关键字 -->
<if test="param.keyword != null and param.keyword != ''">
AND e.lastname like CONCAT('%',#{param.keyword},'%')
</if>
<!-- 姓名 -->
<if test="param.username != null and param.username != ''">
AND e.lastname like CONCAT('%',#{param.username},'%')
</if>
<if test="param.userId != null">
AND e.id = #{param.userId}
</if>
<!-- 部门 -->
<if test="param.departmentIds != null and param.departmentIds.size()>0">
AND d.id IN
<foreach collection="param.departmentIds" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
<!-- 岗位 -->
<if test="param.positionIds != null and param.positionIds.size()>0">
AND e.jobtitle IN
<foreach collection="param.positionIds" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
<!-- 状态 -->
<if test="param.userstatus != null and param.userstatus != ''">
AND e.status = #{param.userstatus}
</if>
<!-- 入职日期 -->
<if test="param.hiredate != null and param.hiredate.size() == 2">
AND (e.hiredate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]})
</if>
</sql>
<sql id="paramSql" databaseId="oracle">
<if test="param.ids != null and param.ids.size()>0">
AND t1.id IN
<foreach collection="param.ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
<if test="param.salaryCbsId != null">
AND t1.salary_cbs_id = #{param.salaryCbsId}
</if>
<if test="param.keyword != null and param.keyword != ''">
AND e.lastname like '%'||#{param.keyword}||'%'
</if>
<if test="param.username != null and param.username != ''">
AND e.lastname like '%'||#{param.username}||'%'
</if>
<if test="param.userId != null">
AND e.id = #{param.userId}
</if>
<if test="param.departmentIds != null and param.departmentIds.size()>0">
AND d.id IN
<foreach collection="param.departmentIds" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
<if test="param.positionIds != null and param.positionIds.size()>0">
AND e.jobtitle IN
<foreach collection="param.positionIds" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
<if test="param.userstatus != null and param.userstatus != ''">
AND e.status = #{param.userstatus}
</if>
<if test="param.hiredate != null and param.hiredate.size() == 2">
AND (e.hiredate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]})
</if>
</sql>
<sql id="paramSql" databaseId="sqlserver">
<if test="param.ids != null and param.ids.size()>0">
AND t1.id IN
<foreach collection="param.ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
<if test="param.salaryCbsId != null">
AND t1.salary_cbs_id = #{param.salaryCbsId}
</if>
<if test="param.keyword != null and param.keyword != ''">
AND e.lastname like '%'+#{param.keyword}+'%'
</if>
<if test="param.username != null and param.username != ''">
AND e.lastname like '%'+#{param.username}+'%'
</if>
<if test="param.userId != null">
AND e.id = #{param.userId}
</if>
<if test="param.departmentIds != null and param.departmentIds.size()>0">
AND d.id IN
<foreach collection="param.departmentIds" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
<if test="param.positionIds != null and param.positionIds.size()>0">
AND e.jobtitle IN
<foreach collection="param.positionIds" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
<if test="param.userstatus != null and param.userstatus != ''">
AND e.status = #{param.userstatus}
</if>
<if test="param.hiredate != null and param.hiredate.size() == 2">
AND (e.hiredate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]})
</if>
</sql>
<select id="list" resultType="com.engine.salary.entity.cbs.dto.SalaryCBSInfoListDTO">
SELECT
<include refid="salaryCbsInfoColumn"/>
FROM
hrsa_salary_cbs_info t1
LEFT JOIN hrmresource e ON e.id = t1.employee_id
LEFT JOIN hrmdepartment d ON d.id = e.DEPARTMENTID
LEFT JOIN hrmsubcompany c ON c.id = e.subcompanyid1
WHERE
t1.delete_type = 0
<!-- 发送状态 -->
<if test="param.pushStatusVal != null">
AND t1.push_status = #{param.pushStatusVal}
</if>
<!-- 分部 -->
<if test="param.subCompanyIds != null and param.subCompanyIds.size()>0">
AND e.subcompanyid1 IN
<foreach collection="param.subCompanyIds" open="(" item="subCompanyId" separator="," close=")">
#{subCompanyId}
</foreach>
</if>
<include refid="paramSql"/>
<!-- 排序 -->
<if test="param.orderRule != null">
ORDER BY ${param.orderRule.orderRule} ${param.orderRule.ascOrDesc}
</if>
</select>
<select id="list" resultType="com.engine.salary.entity.cbs.dto.SalaryCBSInfoListDTO" databaseId="oracle">
SELECT
<include refid="salaryCbsInfoColumn"/>
FROM
hrsa_salary_cbs_info t1
LEFT JOIN hrmresource e ON e.id = t1.employee_id
LEFT JOIN hrmdepartment d ON d.id = e.DEPARTMENTID
LEFT JOIN hrmsubcompany c ON c.id = e.subcompanyid1
WHERE
t1.delete_type = 0
<!-- 发送状态 -->
<if test="param.pushStatusVal != null">
AND t1.push_status = #{param.pushStatusVal}
</if>
<!-- 分部 -->
<if test="param.subCompanyIds != null and param.subCompanyIds.size()>0">
AND e.subcompanyid1 IN
<foreach collection="param.subCompanyIds" open="(" item="subCompanyId" separator="," close=")">
#{subCompanyId}
</foreach>
</if>
<include refid="paramSql"/>
<!-- 排序 -->
<if test="param.orderRule != null">
ORDER BY ${param.orderRule.orderRule} ${param.orderRule.ascOrDesc}
</if>
</select>
<select id="list" resultType="com.engine.salary.entity.cbs.dto.SalaryCBSInfoListDTO" databaseId="sqlserver">
SELECT
<include refid="salaryCbsInfoColumn"/>
FROM
hrsa_salary_cbs_info t1
LEFT JOIN hrmresource e ON e.id = t1.employee_id
LEFT JOIN hrmdepartment d ON d.id = e.DEPARTMENTID
LEFT JOIN hrmsubcompany c ON c.id = e.subcompanyid1
WHERE
t1.delete_type = 0
<!-- 发送状态 -->
<if test="param.pushStatusVal != null">
AND t1.push_status = #{param.pushStatusVal}
</if>
<!-- 分部 -->
<if test="param.subCompanyIds != null and param.subCompanyIds.size()>0">
AND e.subcompanyid1 IN
<foreach collection="param.subCompanyIds" open="(" item="subCompanyId" separator="," close=")">
#{subCompanyId}
</foreach>
</if>
<include refid="paramSql"/>
<!-- 排序 -->
<if test="param.orderRule != null">
ORDER BY ${param.orderRule.orderRule} ${param.orderRule.ascOrDesc}
</if>
</select>
<select id="listByCbsIdAndIds" resultType="com.engine.salary.entity.cbs.po.SalaryCbsInfoPO">
SELECT
<include refid="baseColumns" />
FROM hrsa_salary_cbs_info t
WHERE delete_type = 0
<if test="cbsIds != null and cbsIds.size()>0">
AND salary_cbs_id IN
<foreach collection="cbsIds" open="(" item="cbsId" separator="," close=")">
#{cbsId}
</foreach>
</if>
<if test="ids != null and ids.size()>0">
AND id IN
<foreach collection="ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
ORDER BY id DESC
</select>
<!-- 插入不为NULL的字段 -->
<insert id="insertIgnoreNull" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsInfoPO">
INSERT INTO hrsa_salary_cbs_info
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="createTime != null">
create_time,
</if>
<if test="creator != null">
creator,
</if>
<if test="deleteType != null">
delete_type,
</if>
<if test="employeeId != null">
employee_id,
</if>
<if test="employeeType != null">
employee_type,
</if>
<if test="id != null">
id,
</if>
<if test="pushStatus != null">
push_status,
</if>
<if test="pushTime != null">
push_time,
</if>
<if test="pushValue != null">
push_value,
</if>
<if test="referenceNum != null">
reference_num,
</if>
<if test="salaryCbsId != null">
salary_cbs_id,
</if>
<if test="updateTime != null">
update_time,
</if>
</trim>
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
<if test="createTime != null" >
#{createTime},
</if>
<if test="creator != null" >
#{creator},
</if>
<if test="deleteType != null" >
#{deleteType},
</if>
<if test="employeeId != null" >
#{employeeId},
</if>
<if test="employeeType != null" >
#{employeeType},
</if>
<if test="id != null" >
#{id},
</if>
<if test="pushStatus != null" >
#{pushStatus},
</if>
<if test="pushTime != null" >
#{pushTime},
</if>
<if test="pushValue != null" >
#{pushValue},
</if>
<if test="referenceNum != null" >
#{referenceNum},
</if>
<if test="salaryCbsId != null" >
#{salaryCbsId},
</if>
<if test="updateTime != null" >
#{updateTime},
</if>
</trim>
</insert>
<!-- 更新,更新全部字段 -->
<update id="update" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsInfoPO">
UPDATE hrsa_salary_cbs_info
<set>
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},
</set>
WHERE id = #{id} AND delete_type = 0
</update>
<!-- 更新不为NULL的字段 -->
<update id="updateIgnoreNull" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsInfoPO">
UPDATE hrsa_salary_cbs_info
<set>
<if test="createTime != null" >
create_time=#{createTime},
</if>
<if test="creator != null" >
creator=#{creator},
</if>
<if test="deleteType != null" >
delete_type=#{deleteType},
</if>
<if test="employeeId != null" >
employee_id=#{employeeId},
</if>
<if test="employeeType != null" >
employee_type=#{employeeType},
</if>
<if test="pushStatus != null" >
push_status=#{pushStatus},
</if>
<if test="pushTime != null" >
push_time=#{pushTime},
</if>
<if test="pushValue != null" >
push_value=#{pushValue},
</if>
<if test="referenceNum != null" >
reference_num=#{referenceNum},
</if>
<if test="salaryCbsId != null" >
salary_cbs_id=#{salaryCbsId},
</if>
<if test="updateTime != null" >
update_time=#{updateTime},
</if>
<if test="busNum != null" >
bus_num=#{busNum},
</if>
</set>
WHERE id = #{id} AND delete_type = 0
</update>
<update id="updatePushStatusByCbsIdsAndEmpIds">
UPDATE hrsa_salary_cbs_info
SET push_status=#{pushStatus}
WHERE delete_type=0
<if test="cbsIds != null and cbsIds.size()>0">
AND salary_cbs_id IN
<foreach collection="cbsIds" open="(" item="cbsId" separator="," close=")">
#{cbsId}
</foreach>
</if>
<if test="empIds != null and empIds.size()>0">
AND employee_id IN
<foreach collection="empIds" open="(" item="empId" separator="," close=")">
#{empId}
</foreach>
</if>
</update>
<!-- 根据主键删除记录 -->
<delete id="delete" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsInfoPO">
UPDATE hrsa_salary_cbs_info
SET delete_type=1
WHERE id = #{id} AND delete_type = 0
</delete>
</mapper>

View File

@ -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<SalaryCbsPO> listAll();
/**
* 条件查询
*
* @return 返回集合没有返回空List
*/
List<SalaryCbsPO> 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<SalaryCBSPushListDTO> list(@Param("param") SalarySendQueryParam queryParam);
List<SalaryCbsPO> listBySalaryAcctRecordIds(@Param("salaryAcctRecordIds") List<Long> salaryAcctRecordIds);
}

View File

@ -0,0 +1,257 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.engine.salary.mapper.cbs.SalaryCbsMapper">
<resultMap id="BaseResultMap" type="com.engine.salary.entity.cbs.po.SalaryCbsPO">
<result column="create_time" property="createTime" />
<result column="creator" property="creator" />
<result column="delete_type" property="deleteType" />
<result column="id" property="id" />
<result column="last_push_time" property="lastPushTime" />
<result column="salary_accounting_id" property="salaryAccountingId" />
<result column="salary_month" property="salaryMonth" />
<result column="salary_sob_id" property="salarySobId" />
<result column="update_time" property="updateTime" />
</resultMap>
<!-- 表字段 -->
<sql id="baseColumns">
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
</sql>
<!-- 查询全部 -->
<select id="listAll" resultMap="BaseResultMap">
SELECT
<include refid="baseColumns" />
FROM hrsa_salary_cbs t
WHERE delete_type = 0
</select>
<!-- 根据主键获取单条记录 -->
<select id="getById" resultMap="BaseResultMap" parameterType="Long">
SELECT
<include refid="baseColumns" />
FROM hrsa_salary_cbs t
WHERE id = #{id} AND delete_type = 0
</select>
<!-- 条件查询 -->
<select id="listSome" resultMap="BaseResultMap" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsPO">
SELECT
<include refid="baseColumns" />
FROM hrsa_salary_cbs t
WHERE delete_type = 0
<if test="createTime != null">
AND create_time = #{createTime}
</if>
<if test="creator != null">
AND creator = #{creator}
</if>
<if test="deleteType != null">
AND delete_type = #{deleteType}
</if>
<if test="id != null">
AND id = #{id}
</if>
<if test="lastPushTime != null">
AND last_push_time = #{lastPushTime}
</if>
<if test="salaryAccountingId != null">
AND salary_accounting_id = #{salaryAccountingId}
</if>
<if test="salaryMonth != null">
AND salary_month = #{salaryMonth}
</if>
<if test="salarySobId != null">
AND salary_sob_id = #{salarySobId}
</if>
<if test="updateTime != null">
AND update_time = #{updateTime}
</if>
<if test="ids != null and ids.size()>0">
AND id IN
<foreach collection="ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
ORDER BY id DESC
</select>
<select id="list" resultType="com.engine.salary.entity.cbs.dto.SalaryCBSPushListDTO">
SELECT
t1.id,
t1.salary_accounting_id AS salaryAcctId,
t2.salary_month AS salaryYearMonth,
t3.name AS salarySob,
t3.id AS salarySobId,
t1.last_push_time AS lastPushTime,
t2.acct_times AS acctTimes,
t2.back_calc_status AS salaryAcctRecordType
FROM
hrsa_salary_cbs t1
LEFT JOIN hrsa_salary_acct_record t2 ON t2.id = t1.salary_accounting_id
LEFT JOIN hrsa_salary_sob t3 ON t3.id = t2.salary_sob_id
WHERE
t1.delete_type = 0
AND t2.delete_type = 0
<!-- 薪资所属月 -->
<if test="param.salaryMonthDate != null">
<if test="param.salaryMonthDate.size() == 1">
AND t2.salary_month = #{param.salaryMonthDate[0]}
</if>
<if test="param.salaryMonthDate.size() == 2">
AND (t2.salary_month BETWEEN #{param.salaryMonthDate[0]} AND #{param.salaryMonthDate[1]})
</if>
</if>
<if test="param.salarySobIds != null and param.salarySobIds.size() > 0">
AND t3.id IN
<foreach collection="param.salarySobIds" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
ORDER BY t1.id DESC
</select>
<select id="listBySalaryAcctRecordIds" resultType="com.engine.salary.entity.cbs.po.SalaryCbsPO">
SELECT
<include refid="baseColumns" />
FROM hrsa_salary_cbs t
WHERE delete_type = 0
<if test="salaryAcctRecordIds != null and salaryAcctRecordIds.size() > 0">
AND salary_accounting_id IN
<foreach collection="salaryAcctRecordIds" open="(" item="salaryAcctRecordId" separator="," close=")">
#{salaryAcctRecordId}
</foreach>
</if>
</select>
<!-- 插入不为NULL的字段 -->
<insert id="insertIgnoreNull" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsPO">
INSERT INTO hrsa_salary_cbs
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="createTime != null">
create_time,
</if>
<if test="creator != null">
creator,
</if>
<if test="deleteType != null">
delete_type,
</if>
<if test="id != null">
id,
</if>
<if test="lastPushTime != null">
last_push_time,
</if>
<if test="salaryAccountingId != null">
salary_accounting_id,
</if>
<if test="salaryMonth != null">
salary_month,
</if>
<if test="salarySobId != null">
salary_sob_id,
</if>
<if test="updateTime != null">
update_time,
</if>
</trim>
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
<if test="createTime != null" >
#{createTime},
</if>
<if test="creator != null" >
#{creator},
</if>
<if test="deleteType != null" >
#{deleteType},
</if>
<if test="id != null" >
#{id},
</if>
<if test="lastPushTime != null" >
#{lastPushTime},
</if>
<if test="salaryAccountingId != null" >
#{salaryAccountingId},
</if>
<if test="salaryMonth != null" >
#{salaryMonth},
</if>
<if test="salarySobId != null" >
#{salarySobId},
</if>
<if test="updateTime != null" >
#{updateTime},
</if>
</trim>
</insert>
<!-- 更新,更新全部字段 -->
<update id="update" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsPO">
UPDATE hrsa_salary_cbs
<set>
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},
</set>
WHERE id = #{id} AND delete_type = 0
</update>
<!-- 更新不为NULL的字段 -->
<update id="updateIgnoreNull" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsPO">
UPDATE hrsa_salary_cbs
<set>
<if test="createTime != null" >
create_time=#{createTime},
</if>
<if test="creator != null" >
creator=#{creator},
</if>
<if test="deleteType != null" >
delete_type=#{deleteType},
</if>
<if test="lastPushTime != null" >
last_push_time=#{lastPushTime},
</if>
<if test="salaryAccountingId != null" >
salary_accounting_id=#{salaryAccountingId},
</if>
<if test="salaryMonth != null" >
salary_month=#{salaryMonth},
</if>
<if test="salarySobId != null" >
salary_sob_id=#{salarySobId},
</if>
<if test="updateTime != null" >
update_time=#{updateTime},
</if>
</set>
WHERE id = #{id} AND delete_type = 0
</update>
<!-- 根据主键删除记录 -->
<delete id="delete" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsPO">
UPDATE hrsa_salary_cbs
SET delete_type=1
WHERE id = #{id} AND delete_type = 0
</delete>
</mapper>

View File

@ -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<SalaryCbsPushPO> listAll();
/**
* 条件查询
*
* @return 返回集合没有返回空List
*/
List<SalaryCbsPushPO> 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);
}

View File

@ -0,0 +1,210 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.engine.salary.mapper.cbs.SalaryCbsPushMapper">
<resultMap id="BaseResultMap" type="com.engine.salary.entity.cbs.po.SalaryCbsPushPO">
<result column="id" property="id" />
<result column="salary_cbs_id" property="salaryCbsId" />
<result column="totalEmp" property="totalEmp" />
<result column="totalValue" property="totalValue" />
<result column="reference_num" property="referenceNum" />
<result column="creator" property="creator" />
<result column="return_value" property="returnValue" />
<result column="create_time" property="createTime" />
<result column="delete_type" property="deleteType" />
</resultMap>
<!-- 表字段 -->
<sql id="baseColumns">
t.id
, t.salary_cbs_id
, t.totalEmp
, t.totalValue
, t.reference_num
, t.creator
, t.return_value
, t.create_time
, t.delete_type
</sql>
<!-- 查询全部 -->
<select id="listAll" resultMap="BaseResultMap">
SELECT
<include refid="baseColumns" />
FROM hrsa_salary_cbs_push t
WHERE delete_type = 0
</select>
<!-- 根据主键获取单条记录 -->
<select id="getById" resultMap="BaseResultMap" parameterType="Long">
SELECT
<include refid="baseColumns" />
FROM hrsa_salary_cbs_push t
WHERE id = #{id} AND delete_type = 0
</select>
<!-- 条件查询 -->
<select id="listSome" resultMap="BaseResultMap" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsPushPO">
SELECT
<include refid="baseColumns" />
FROM hrsa_salary_cbs_push t
WHERE delete_type = 0
<if test="id != null">
AND id = #{id}
</if>
<if test="salaryCbsId != null">
AND salary_cbs_id = #{salaryCbsId}
</if>
<if test="totalEmp != null">
AND totalEmp = #{totalEmp}
</if>
<if test="totalValue != null">
AND totalValue = #{totalValue}
</if>
<if test="referenceNum != null">
AND reference_num = #{referenceNum}
</if>
<if test="creator != null">
AND creator = #{creator}
</if>
<if test="returnValue != null">
AND return_value = #{returnValue}
</if>
<if test="createTime != null">
AND create_time = #{createTime}
</if>
<if test="deleteType != null">
AND delete_type = #{deleteType}
</if>
<if test="ids != null and ids.size()>0">
AND id IN
<foreach collection="ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
ORDER BY id DESC
</select>
<!-- 插入不为NULL的字段 -->
<insert id="insertIgnoreNull" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsPushPO">
INSERT INTO hrsa_salary_cbs_push
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="salaryCbsId != null">
salary_cbs_id,
</if>
<if test="totalEmp != null">
totalEmp,
</if>
<if test="totalValue != null">
totalValue,
</if>
<if test="referenceNum != null">
reference_num,
</if>
<if test="creator != null">
creator,
</if>
<if test="returnValue != null">
return_value,
</if>
<if test="createTime != null">
create_time,
</if>
<if test="deleteType != null">
delete_type,
</if>
</trim>
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
<if test="id != null" >
#{id},
</if>
<if test="salaryCbsId != null" >
#{salaryCbsId},
</if>
<if test="totalEmp != null" >
#{totalEmp},
</if>
<if test="totalValue != null" >
#{totalValue},
</if>
<if test="referenceNum != null" >
#{referenceNum},
</if>
<if test="creator != null" >
#{creator},
</if>
<if test="returnValue != null" >
#{returnValue},
</if>
<if test="createTime != null" >
#{createTime},
</if>
<if test="deleteType != null" >
#{deleteType},
</if>
</trim>
</insert>
<!-- 更新,更新全部字段 -->
<update id="update" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsPushPO">
UPDATE hrsa_salary_cbs_push
<set>
salary_cbs_id=#{salaryCbsId},
totalEmp=#{totalEmp},
totalValue=#{totalValue},
reference_num=#{referenceNum},
creator=#{creator},
return_value=#{returnValue},
create_time=#{createTime},
delete_type=#{deleteType},
</set>
WHERE id = #{id} AND delete_type = 0
</update>
<!-- 更新不为NULL的字段 -->
<update id="updateIgnoreNull" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsPushPO">
UPDATE hrsa_salary_cbs_push
<set>
<if test="salaryCbsId != null" >
salary_cbs_id=#{salaryCbsId},
</if>
<if test="totalEmp != null" >
totalEmp=#{totalEmp},
</if>
<if test="totalValue != null" >
totalValue=#{totalValue},
</if>
<if test="referenceNum != null" >
reference_num=#{referenceNum},
</if>
<if test="creator != null" >
creator=#{creator},
</if>
<if test="returnValue != null" >
return_value=#{returnValue},
</if>
<if test="createTime != null" >
create_time=#{createTime},
</if>
<if test="deleteType != null" >
delete_type=#{deleteType},
</if>
</set>
WHERE id = #{id} AND delete_type = 0
</update>
<!-- 根据主键删除记录 -->
<delete id="delete" parameterType="com.engine.salary.entity.cbs.po.SalaryCbsPushPO">
UPDATE hrsa_salary_cbs_push
SET delete_type=1
WHERE id = #{id} AND delete_type = 0
</delete>
</mapper>

View File

@ -227,4 +227,9 @@ public interface SalaryAcctRecordService {
*/
List<SalaryAcctTaxAgentPO> listBySalaryAcctRecordIds(Collection<Long> salaryAcctRecordIds);
/**
* 联特 生成CBS推送记录
* @param ids
*/
void generateCBSPushList(List<Long> ids);
}

View File

@ -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<SalaryCbsInfoPO> 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<SalaryCbsInfoPO> listByCbsIds(List<Long> cbsIdList);
PageInfo<SalaryCBSInfoListDTO> salaryCbsInfoListPage(SalaryCBSInfoQueryParam queryParam);
String pushDataToCBS(CBSPushParam cbsPushParam);
void updatePushStatusByCbsIdsAndEmpIds(List<Long> cbsIdList, List<Long> needChangeEmpIds, Integer value);
}

View File

@ -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<SalaryCbsPushPO> 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);
}

View File

@ -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<SalaryCbsPO> listAll();
List<SalaryCbsPO> 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<SalaryCbsPO> listBySalaryAcctRecordId(Long salaryAcctRecordId);
List<SalaryCbsPO> listBySalaryAcctRecordIds(List<Long> salaryAcctRecordIds);
/**
* 生成cbs推送列表
* @param salaryAcctRecordPO
*/
void generatePushList(SalaryAcctRecordPO salaryAcctRecordPO, Map<Long, Long> sobItemMap);
List<SalaryCBSPushListDTO> list(SalarySendQueryParam queryParam);
SalaryCBSBaseInfoDTO getBaseInfo(Long id);
}

View File

@ -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<Long> ids) {
if (CollectionUtils.isEmpty(ids)) {
return;
}
// 查询薪资核算记录
List<SalaryAcctRecordPO> salaryAcctRecordList = listByIds(ids);
if (CollectionUtils.isEmpty(salaryAcctRecordList)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
}
Optional<SalaryAcctRecordPO> notArchived = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus().equals(SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue())).findFirst();
if (notArchived.isPresent()) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "核算记录尚未归档,请先归档"));
}
// 查询账套对应的薪资项目id
Map<Long, Long> 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<SalarySendPO> 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);
}
}
}

View File

@ -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<Long> salaryCbsIdList = getSalaryCbsService(user).listBySalaryAcctRecordId(salarySend.getSalaryAccountingId()).stream().map(SalaryCbsPO::getId).collect(Collectors.toList());
List<SalaryCbsInfoPO> salaryCbsInfoList = getSalaryCbsInfoService(user).listByCbsIds(salaryCbsIdList);
if (CollectionUtils.isEmpty(salaryCbsInfoList)) {
throw new SalaryRunTimeException("cbs数据暂不存在");
}
List<Long> pushedEmpIds = salaryCbsInfoList.stream()
.filter(salaryCbsInfoPO -> salaryCbsInfoPO.getPushStatus() != null && salaryCbsInfoPO.getPushStatus().equals(NumberUtils.INTEGER_ONE))
.map(SalaryCbsInfoPO::getEmployeeId)
.collect(Collectors.toList());
List<List<Long>> partition = Lists.partition(ids, 500);
List<SalarySendInfoListDTO> sendInfoList = new ArrayList<>();
for (List<Long> idsPart : partition) {
sendInfoList.addAll(getSalarySendInfoMapper().list(SalarySendInfoQueryParam.builder().ids(idsPart).build()));
}
Optional<SalarySendInfoListDTO> 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, "发送中"))

View File

@ -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<SalaryCbsInfoPO> listAll() {
List<SalaryCbsInfoPO> 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<SalaryCbsInfoPO> listByCbsIds(List<Long> cbsIdList) {
if (CollectionUtils.isEmpty(cbsIdList)) {
return Collections.emptyList();
}
List<List<Long>> partition = Lists.partition(cbsIdList, 1000);
List<SalaryCbsInfoPO> resultList = new ArrayList<>();
partition.forEach(part -> {
List<SalaryCbsInfoPO> salaryCbsInfoList = getSalaryCbsInfoMapper().listByCbsIds(part);
encryptUtil.decryptList(salaryCbsInfoList, SalaryCbsInfoPO.class);
resultList.addAll(salaryCbsInfoList);
});
return resultList;
}
@Override
public PageInfo<SalaryCBSInfoListDTO> salaryCbsInfoListPage(SalaryCBSInfoQueryParam queryParam) {
//排序配置
OrderRuleVO orderRule = getSalarySysConfService(user).orderRule();
queryParam.setOrderRule(orderRule);
List<SalaryCBSInfoListDTO> 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<Long> 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<SalaryCBSInfoListDTO> 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<SalaryCBSInfoListDTO> list = pageInfo.getList();
List<DataCollectionEmployee> employeeList = getExtEmpService(user).listEmployee();
Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(employeeList, DataCollectionEmployee::getEmployeeId);
// 获取工资卡开户名工资卡账号工资卡开户行工资卡开户行支行编码 数据
List<Long> empIds = list.stream().map(SalaryCBSInfoListDTO::getEmployeeId).collect(Collectors.toList());
List<SalaryCardInfo> salaryCardInfo = getSalaryCardInfo(empIds);
Map<Long, SalaryCardInfo> 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<SalaryCardInfo> getSalaryCardInfo(List<Long> empIds) {
List<SalaryCardInfo> 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<List<Long>> 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<Long> 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<SalaryCbsInfoPO> 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<Long> 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<Long> empIds = infoList.stream().map(SalaryCbsInfoPO::getEmployeeId).collect(Collectors.toList());
List<SalaryCardInfo> salaryCardInfo = getSalaryCardInfo(empIds);
Map<Long, SalaryCardInfo> salaryCardInfoMap = SalaryEntityUtil.convert2Map(salaryCardInfo, SalaryCardInfo::getEmployeeId);
// 获取建模配置的cbs传参信息
Map<String, String> cbsConfigMap = getAllCbsParamConfigMap();
// 封装明细信息
List<PaymentApplyAgentDTO> 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<Long> 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<String, Object> pushResultMap = JSONObject.parseObject(pushResult, new TypeReference<Map<String, Object>>() {});
Map<String, Object> dataMap = (Map<String, Object>)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<SalaryCbsInfoPO> 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<Long> 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<String, String> getAllCbsParamConfigMap() {
RecordSet rs = new RecordSet();
rs.execute(" select mc,cckey,ccvalue from uf_cbscspz");
Map<String, String> resultMap = new HashMap<>();
while (rs.next()) {
if (StringUtils.isNotBlank(rs.getString("ccvalue"))) {
resultMap.put(rs.getString("cckey"), rs.getString("ccvalue"));
}
}
return resultMap;
}
private List<SalaryCbsInfoPO> listByCbsIdsAndIds(List<Long> salaryCbsIds, List<Long> ids) {
List<SalaryCbsInfoPO> resultList = new ArrayList<>();
if (CollectionUtils.isEmpty(salaryCbsIds) && CollectionUtils.isEmpty(ids)) {
return Collections.emptyList();
}
if (CollectionUtils.isEmpty(ids)) {
List<SalaryCbsInfoPO> salaryCbsInfoPOS = getSalaryCbsInfoMapper().listByCbsIdAndIds(salaryCbsIds, ids);
encryptUtil.decryptList(salaryCbsInfoPOS, SalaryCbsInfoPO.class);
resultList.addAll(salaryCbsInfoPOS);
} else {
List<List<Long>> partition = Lists.partition(ids, 1000);
partition.forEach(part -> {
List<SalaryCbsInfoPO> salaryCbsInfoPOS = getSalaryCbsInfoMapper().listByCbsIdAndIds(salaryCbsIds, part);
encryptUtil.decryptList(salaryCbsInfoPOS, SalaryCbsInfoPO.class);
resultList.addAll(salaryCbsInfoPOS);
});
}
return resultList;
}
@Override
public void updatePushStatusByCbsIdsAndEmpIds(List<Long> cbsIdList, List<Long> needChangeEmpIds, Integer value) {
if (CollectionUtils.isEmpty(cbsIdList) || CollectionUtils.isEmpty(needChangeEmpIds)) {
return;
}
List<List<Long>> partition = Lists.partition(needChangeEmpIds, 500);
partition.forEach(part -> getSalaryCbsInfoMapper().updatePushStatusByCbsIdsAndEmpIds(cbsIdList, part, value));
}
}

View File

@ -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<SalaryCbsPushPO> 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);
}
}

View File

@ -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<SalaryCbsPO> listAll() {
return getSalaryCbsMapper().listAll();
}
@Override
public List<SalaryCbsPO> 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<SalaryCbsPO> listBySalaryAcctRecordId(Long salaryAcctRecordId) {
if (salaryAcctRecordId == null) {
return Collections.emptyList();
}
return listSome(SalaryCbsPO.builder().salaryAccountingId(salaryAcctRecordId).build());
}
@Override
public List<SalaryCbsPO> listBySalaryAcctRecordIds(List<Long> salaryAcctRecordIds) {
if (CollectionUtils.isEmpty(salaryAcctRecordIds)) {
return Collections.emptyList();
}
List<SalaryCbsPO> resultList = new ArrayList<>();
List<List<Long>> partition = Lists.partition(salaryAcctRecordIds, 500);
partition.forEach(part -> {
resultList.addAll(getSalaryCbsMapper().listBySalaryAcctRecordIds(part));
});
return resultList;
}
@Override
public void generatePushList(SalaryAcctRecordPO salaryAcctRecordPO, Map<Long, Long> sobItemMap) {
if (salaryAcctRecordPO == null) {
return;
}
// 查询是否已有生成的cbs推送列表数据
List<SalaryCbsPO> 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<SalaryAcctEmployeePO> salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordPO.getId());
List<Long> salaryAcctEmpIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
// 查询薪资核算结果
Map<Long, String> resultMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(salaryAcctEmpIdList)) {
List<SalaryAcctResultPO> 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<SalaryCBSPushListDTO> list(SalarySendQueryParam queryParam) {
List<SalaryCBSPushListDTO> 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<SalaryCbsInfoPO> 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();
}
}

View File

@ -233,6 +233,66 @@ public class SalaryTokenUtil {
return null;
}
public static String post4lt(String path, String param, Map<String, String> data) {
try {
String str = "";
// if (params != null) {
// StringBuilder stringBuilder = new StringBuilder("?");
// for (Map.Entry<String, String> 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<String, String> entry : data.entrySet()) {
conn.setRequestProperty(entry.getKey(), entry.getValue());
}
}
//设置是否向httpUrlConnection输出设置是否从httpUrlConnection读入此外发送post请求必须设置这两个
//最常用的Http请求无非是get和postget请求可以获取静态页面也可以把参数放在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 请求
*

View File

@ -133,6 +133,15 @@ public class SalaryAcctController {
return new ResponseResult<Long, Long>(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<Long> ids) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<List<Long>, Long>(user).run(getSalaryAcctRecordWrapper(user)::generateCBSPushList, ids);
}
//重新核算
@POST
@Path("/reAccounting")

View File

@ -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<SalarySendQueryParam, Map<String, Object>>(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<Long, SalaryCBSBaseInfoDTO>(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<SalaryCBSInfoQueryParam, PageInfo<SalaryCBSInfoListDTO>>(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<CBSPushParam, String>(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<SalarySendInfoQueryParam, PageInfo<SalarySendInfoListDTO>>(user).run(getSalarySendWrapper(user)::infoList, queryParam);
//
// // WeaTable<SalarySendInfoListDTO> 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<SalarySendInfoQueryParam, PageInfo<SalarySendInfoListDTO>>(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<SalarySendGrantParam, Map<String, Object>>(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<Object, Map<String, Object>>(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<SalarySendDetailQueryParam, Map<String, Object>>(user).run(getSalarySendWrapper(user)::detailList, detailQueryParam);
// }
/******** 工资单发放 end ***********************************************************************************************/
}

View File

@ -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<Long> ids) {
getSalaryAcctRecordService(user).generateCBSPushList(ids);
}
}

View File

@ -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;
/**
* 工资单发放
* <p>Copyright: Copyright (c) 2022</p>
* <p>Company: 泛微软件</p>
*
* @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<String, Object> 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<Long> 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<String, Object> 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<SalaryCBSPushListDTO> list = getSalaryCbsService(user).list(queryParam);
PageInfo<SalaryCBSPushListDTO> pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(),
list, SalaryCBSPushListDTO.class);
List<SalaryCBSPushListDTO> pageList = pageInfo.getList();
// 封装总数和已发
List<Long> cbsIdList = pageList.stream().map(SalaryCBSPushListDTO::getId).collect(Collectors.toList());
List<SalaryCbsInfoPO> pushInfoList = getSalaryCbsInfoService(user).listByCbsIds(cbsIdList);
Map<Long, List<SalaryCbsInfoPO>> pushInfoMapGroupByCbsId = SalaryEntityUtil.group2Map(pushInfoList, SalaryCbsInfoPO::getSalaryCbsId);
pageList.forEach(e -> {
List<SalaryCbsInfoPO> 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<WeaTableColumn> 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<SalaryCBSInfoListDTO> infoList(SalaryCBSInfoQueryParam queryParam) {
SalaryCBSInfoQueryParam.checkParam(queryParam);
// 推送状态
if (StringUtils.isNotBlank(queryParam.getPushStatus())) {
queryParam.setPushStatusVal(Integer.valueOf(queryParam.getPushStatus()));
}
PageInfo<SalaryCBSInfoListDTO> pageInfo = getSalaryCbsInfoService(user).salaryCbsInfoListPage(queryParam);
return pageInfo;
}
public String pushDataToCBS(CBSPushParam cbsPushParam) {
return getSalaryCbsInfoService(user).pushDataToCBS(cbsPushParam);
}
}