陕西万众,审批temp
This commit is contained in:
parent
f03c0d0147
commit
7678fa00ef
|
|
@ -37,6 +37,9 @@ public class SalaryAcctResultQueryParam extends BaseQueryParam {
|
|||
//个税扣缴义务人
|
||||
private Long taxAgentId;
|
||||
|
||||
// 审批流程id
|
||||
private String requestId;
|
||||
|
||||
//分部
|
||||
private Collection<Long> subcompanyIds;
|
||||
|
||||
|
|
|
|||
|
|
@ -94,6 +94,8 @@ public class SalaryAcctEmployeePO {
|
|||
*/
|
||||
private Date updateTime;
|
||||
|
||||
private String requestId;
|
||||
|
||||
//--------条件----------
|
||||
//主键id集合
|
||||
private Collection<Long> ids;
|
||||
|
|
|
|||
|
|
@ -96,6 +96,8 @@ public class SalaryAcctResultPO {
|
|||
*/
|
||||
private Date updateTime;
|
||||
|
||||
private String requestId;
|
||||
|
||||
//条件
|
||||
private Collection<Long> ids;
|
||||
private Collection<Long> salaryAcctRecordIds;
|
||||
|
|
|
|||
|
|
@ -83,4 +83,10 @@ public class SalarySobItemFormDTO {
|
|||
|
||||
// 薪资档案引用。0:薪资档案未引用、1:薪资档案引用
|
||||
private Integer useInEmployeeSalary;
|
||||
|
||||
// 在审批流程中显示
|
||||
private Integer showInWorkflow;
|
||||
|
||||
// 在审批流程中展示合计
|
||||
private Integer sumInWorkflow;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -93,6 +93,16 @@ public class SalarySobItemSaveParam {
|
|||
*/
|
||||
private Integer valueType;
|
||||
|
||||
/**
|
||||
* 在审批流程中显示
|
||||
*/
|
||||
private Integer showInWorkflow;
|
||||
|
||||
/**
|
||||
* 在审批流程中展示合计
|
||||
*/
|
||||
private Integer sumInWorkflow;
|
||||
|
||||
}
|
||||
|
||||
@Data
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
package com.engine.salary.entity.salarysob.param;
|
||||
|
||||
import com.engine.salary.util.valid.DataCheck;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Harryxzy
|
||||
* @ClassName SyncWorkflowSettingParam
|
||||
* @date 2023/12/29 10:04
|
||||
* @description 同步账套薪资项目流程设置 至 其他账套中
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class SyncWorkflowSettingParam {
|
||||
|
||||
// 薪资项目id
|
||||
@DataCheck(require = true, message = "薪资项目id不能为空")
|
||||
private Long salaryItemId;
|
||||
|
||||
// 薪资账套id
|
||||
@DataCheck(require = true, message = "薪资账套不能为空")
|
||||
private List<Long> salarySobIds;
|
||||
|
||||
private Integer showInWorkflow;
|
||||
|
||||
private Integer sumInWorkflow;
|
||||
}
|
||||
|
|
@ -113,6 +113,12 @@ public class SalarySobItemPO {
|
|||
//该分类是否隐藏(0不隐藏,1隐藏)
|
||||
private Long itemHide;
|
||||
|
||||
// 在审批流程中显示
|
||||
private Integer showInWorkflow;
|
||||
|
||||
// 在审批流程中展示合计
|
||||
private Integer sumInWorkflow;
|
||||
|
||||
//in
|
||||
Collection<Long> ids;
|
||||
Collection<Long> salarySobIds;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
package com.engine.salary.mapper.salaryacct;
|
||||
|
||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 薪资核算人员
|
||||
* <p>Copyright: Copyright (c) 2022</p>
|
||||
* <p>Company: 泛微软件</p>
|
||||
*
|
||||
* @author qiantao
|
||||
* @version 1.0
|
||||
**/
|
||||
public interface SalaryAcctEmployeeWZMapper {
|
||||
/**
|
||||
* 根据流程id获取
|
||||
* @param requestId
|
||||
* @return
|
||||
*/
|
||||
List<SalaryAcctEmployeePO> listByRequestId(@Param("requestId")String requestId);
|
||||
|
||||
/**
|
||||
* 批量插入
|
||||
*
|
||||
* @param salaryAccountingEmployees
|
||||
*/
|
||||
void batchInsert(@Param("collection") Collection<SalaryAcctEmployeePO> salaryAccountingEmployees);
|
||||
}
|
||||
|
|
@ -0,0 +1,130 @@
|
|||
<?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.salaryacct.SalaryAcctEmployeeWZMapper">
|
||||
<resultMap id="SalaryAccEmployeeMap"
|
||||
type="com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO">
|
||||
<id column="id" property="id"/>
|
||||
<result column="salary_acct_record_id" property="salaryAcctRecordId"/>
|
||||
<result column="salary_sob_id" property="salarySobId"/>
|
||||
<result column="employee_id" property="employeeId"/>
|
||||
<result column="tax_agent_id" property="taxAgentId"/>
|
||||
<result column="salary_month" property="salaryMonth"/>
|
||||
<result column="create_time" property="createTime"/>
|
||||
<result column="update_time" property="updateTime"/>
|
||||
<result column="creator" property="creator"/>
|
||||
<result column="delete_type" property="deleteType"/>
|
||||
<result column="tenant_key" property="tenantKey"/>
|
||||
<result column="employee_type" property="employeeType"/>
|
||||
</resultMap>
|
||||
|
||||
|
||||
<resultMap id="BaseResultMap" type="com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO">
|
||||
<result column="id" property="id"/>
|
||||
<result column="salary_acct_record_id" property="salaryAcctRecordId"/>
|
||||
<result column="salary_sob_id" property="salarySobId"/>
|
||||
<result column="employee_id" property="employeeId"/>
|
||||
<result column="tax_agent_id" property="taxAgentId"/>
|
||||
<result column="salary_month" property="salaryMonth"/>
|
||||
<result column="creator" property="creator"/>
|
||||
<result column="create_time" property="createTime"/>
|
||||
<result column="update_time" property="updateTime"/>
|
||||
<result column="delete_type" property="deleteType"/>
|
||||
<result column="tenant_key" property="tenantKey"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- 表字段 -->
|
||||
<sql id="baseColumns">
|
||||
t
|
||||
.
|
||||
id
|
||||
, t.salary_acct_record_id
|
||||
, t.salary_sob_id
|
||||
, t.employee_id
|
||||
, t.tax_agent_id
|
||||
, t.salary_month
|
||||
, t.creator
|
||||
, t.create_time
|
||||
, t.update_time
|
||||
, t.delete_type
|
||||
, t.tenant_key
|
||||
, t.employee_type
|
||||
</sql>
|
||||
<insert id="batchInsert">
|
||||
INSERT INTO hrsa_salary_acct_emp_wz(
|
||||
id,salary_acct_record_id, salary_sob_id, employee_id, tax_agent_id, salary_month,
|
||||
creator, create_time, update_time, delete_type, tenant_key,employee_type, request_id)
|
||||
VALUES
|
||||
<foreach collection="collection" item="emp" separator=",">
|
||||
(
|
||||
#{emp.id},
|
||||
#{emp.salaryAcctRecordId},
|
||||
#{emp.salarySobId},
|
||||
#{emp.employeeId},
|
||||
#{emp.taxAgentId},
|
||||
#{emp.salaryMonth},
|
||||
#{emp.creator},
|
||||
#{emp.createTime},
|
||||
#{emp.updateTime},
|
||||
#{emp.deleteType},
|
||||
#{emp.tenantKey},
|
||||
#{emp.employeeType},
|
||||
#{emp.requestId}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
<insert id="batchInsert" databaseId="oracle">
|
||||
INSERT INTO hrsa_salary_acct_emp_wz(
|
||||
id,salary_acct_record_id, salary_sob_id, employee_id, tax_agent_id, salary_month,
|
||||
creator, create_time, update_time, delete_type, tenant_key,employee_type, request_id)
|
||||
|
||||
<foreach collection="collection" item="emp" separator="union all">
|
||||
select
|
||||
#{emp.id,jdbcType=DOUBLE},
|
||||
#{emp.salaryAcctRecordId,jdbcType=DOUBLE},
|
||||
#{emp.salarySobId,jdbcType=DOUBLE},
|
||||
#{emp.employeeId,jdbcType=DOUBLE},
|
||||
#{emp.taxAgentId,jdbcType=DOUBLE},
|
||||
#{emp.salaryMonth,jdbcType=DATE},
|
||||
#{emp.creator,jdbcType=DOUBLE},
|
||||
#{emp.createTime,jdbcType=DATE},
|
||||
#{emp.updateTime,jdbcType=DATE},
|
||||
#{emp.deleteType,jdbcType=INTEGER},
|
||||
#{emp.tenantKey,jdbcType=VARCHAR},
|
||||
#{emp.employeeType,jdbcType=INTEGER},
|
||||
#{emp.requestId,jdbcType=VARCHAR}
|
||||
from dual
|
||||
</foreach>
|
||||
</insert>
|
||||
<insert id="batchInsert" databaseId="sqlserver">
|
||||
<foreach collection="collection" item="emp" separator=";">
|
||||
INSERT INTO hrsa_salary_acct_emp_wz(
|
||||
id,salary_acct_record_id, salary_sob_id, employee_id, tax_agent_id, salary_month,
|
||||
creator, create_time, update_time, delete_type, tenant_key,employee_type, request_id)
|
||||
VALUES
|
||||
(
|
||||
#{emp.id},
|
||||
#{emp.salaryAcctRecordId},
|
||||
#{emp.salarySobId},
|
||||
#{emp.employeeId},
|
||||
#{emp.taxAgentId},
|
||||
#{emp.salaryMonth},
|
||||
#{emp.creator},
|
||||
#{emp.createTime},
|
||||
#{emp.updateTime},
|
||||
#{emp.deleteType},
|
||||
#{emp.tenantKey},
|
||||
#{emp.employeeType},
|
||||
#{emp.requstId}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
|
||||
|
||||
<select id="listByRequestId" resultMap="BaseResultMap"
|
||||
parameterType="com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO">
|
||||
SELECT
|
||||
<include refid="baseColumns"/>
|
||||
FROM hrsa_salary_acct_emp_wz t
|
||||
WHERE delete_type = 0 and request_id = #{requestId}
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
package com.engine.salary.mapper.salaryacct;
|
||||
|
||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
public interface SalaryAcctResultWZMapper {
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 条件查询
|
||||
*
|
||||
* @return 返回集合,没有返回空List
|
||||
*/
|
||||
List<SalaryAcctResultPO> listSome(SalaryAcctResultPO salaryAcctResult);
|
||||
|
||||
/**
|
||||
* 批量新增
|
||||
*
|
||||
* @param salaryAccountingResults
|
||||
*/
|
||||
void batchInsert(@Param("collection") Collection<SalaryAcctResultPO> salaryAccountingResults);
|
||||
}
|
||||
|
|
@ -0,0 +1,203 @@
|
|||
<?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.salaryacct.SalaryAcctResultWZMapper">
|
||||
<resultMap id="BaseResultMap" type="com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO">
|
||||
<result column="id" property="id"/>
|
||||
<result column="salary_sob_id" property="salarySobId"/>
|
||||
<result column="salary_acct_emp_id" property="salaryAcctEmpId"/>
|
||||
<result column="salary_acct_record_id" property="salaryAcctRecordId"/>
|
||||
<result column="employee_id" property="employeeId"/>
|
||||
<result column="tax_agent_id" property="taxAgentId"/>
|
||||
<result column="salary_item_id" property="salaryItemId"/>
|
||||
<result column="result_value" property="resultValue"/>
|
||||
<result column="creator" property="creator"/>
|
||||
<result column="create_time" property="createTime"/>
|
||||
<result column="update_time" property="updateTime"/>
|
||||
<result column="delete_type" property="deleteType"/>
|
||||
<result column="tenant_key" property="tenantKey"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- 表字段 -->
|
||||
<sql id="baseColumns">
|
||||
t
|
||||
.
|
||||
id
|
||||
, t.salary_sob_id
|
||||
, t.salary_acct_emp_id
|
||||
, t.salary_acct_record_id
|
||||
, t.employee_id
|
||||
, t.tax_agent_id
|
||||
, t.salary_item_id
|
||||
, t.result_value
|
||||
, t.origin_result_value
|
||||
, t.creator
|
||||
, t.create_time
|
||||
, t.update_time
|
||||
, t.delete_type
|
||||
, t.tenant_key
|
||||
</sql>
|
||||
|
||||
<!-- 条件查询 -->
|
||||
<select id="listSome" resultMap="BaseResultMap"
|
||||
parameterType="com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO">
|
||||
SELECT
|
||||
<include refid="baseColumns"/>
|
||||
FROM hrsa_salary_acct_result_wz t
|
||||
WHERE delete_type = 0 and request_id = #{requestId}
|
||||
<if test="id != null">
|
||||
AND id = #{id}
|
||||
</if>
|
||||
<if test="salarySobId != null">
|
||||
AND salary_sob_id = #{salarySobId}
|
||||
</if>
|
||||
<if test="salaryAcctEmpId != null">
|
||||
AND salary_acct_emp_id = #{salaryAcctEmpId}
|
||||
</if>
|
||||
<if test="salaryAcctRecordId != null">
|
||||
AND salary_acct_record_id = #{salaryAcctRecordId}
|
||||
</if>
|
||||
<if test="employeeId != null">
|
||||
AND employee_id = #{employeeId}
|
||||
</if>
|
||||
<if test="taxAgentId != null">
|
||||
AND tax_agent_id = #{taxAgentId}
|
||||
</if>
|
||||
<if test="salaryItemId != null">
|
||||
AND salary_item_id = #{salaryItemId}
|
||||
</if>
|
||||
<if test="resultValue != null">
|
||||
AND result_value = #{resultValue}
|
||||
</if>
|
||||
<if test="creator != null">
|
||||
AND creator = #{creator}
|
||||
</if>
|
||||
<if test="createTime != null">
|
||||
AND create_time = #{createTime}
|
||||
</if>
|
||||
<if test="updateTime != null">
|
||||
AND update_time = #{updateTime}
|
||||
</if>
|
||||
<if test="deleteType != null">
|
||||
AND delete_type = #{deleteType}
|
||||
</if>
|
||||
<if test="tenantKey != null">
|
||||
AND tenant_key = #{tenantKey}
|
||||
</if>
|
||||
<if test="ids != null and ids.size()>0">
|
||||
AND id IN
|
||||
<foreach collection="ids" open="(" item="id" separator="," close=")">
|
||||
#{id}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="salaryAcctRecordIds != null and salaryAcctRecordIds.size()>0">
|
||||
AND salary_acct_record_id IN
|
||||
<foreach collection="salaryAcctRecordIds" open="(" item="salaryAcctRecordId" separator="," close=")">
|
||||
#{salaryAcctRecordId}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="salaryAcctEmpIds != null and salaryAcctEmpIds.size()>0">
|
||||
AND salary_acct_emp_id IN
|
||||
<foreach collection="salaryAcctEmpIds" open="(" item="salaryAcctEmpId" separator="," close=")">
|
||||
#{salaryAcctEmpId}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="employeeIds != null and employeeIds.size()>0">
|
||||
AND employee_id IN
|
||||
<foreach collection="employeeIds" open="(" item="employeeId" separator="," close=")">
|
||||
#{employeeId}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="taxAgentIds != null and taxAgentIds.size()>0">
|
||||
AND tax_agent_id IN
|
||||
<foreach collection="taxAgentIds" open="(" item="taxAgentId" separator="," close=")">
|
||||
#{taxAgentId}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="salaryItemIds != null and salaryItemIds.size()>0">
|
||||
AND salary_item_id IN
|
||||
<foreach collection="salaryItemIds" open="(" item="salaryItemId" separator="," close=")">
|
||||
#{salaryItemId}
|
||||
</foreach>
|
||||
</if>
|
||||
ORDER BY id DESC
|
||||
</select>
|
||||
|
||||
|
||||
<insert id="batchInsert">
|
||||
INSERT INTO hrsa_salary_acct_result_wz(id,salary_sob_id, salary_acct_emp_id, salary_acct_record_id, employee_id,
|
||||
tax_agent_id, salary_item_id, result_value, origin_result_value, creator, create_time, update_time, delete_type, tenant_key, request_id)
|
||||
VALUES
|
||||
<foreach collection="collection" item="item" separator=",">
|
||||
(
|
||||
#{item.id},
|
||||
#{item.salarySobId},
|
||||
#{item.salaryAcctEmpId},
|
||||
#{item.salaryAcctRecordId},
|
||||
#{item.employeeId},
|
||||
#{item.taxAgentId},
|
||||
#{item.salaryItemId},
|
||||
#{item.resultValue},
|
||||
#{item.originResultValue},
|
||||
#{item.creator},
|
||||
#{item.createTime},
|
||||
#{item.updateTime},
|
||||
#{item.deleteType},
|
||||
#{item.tenantKey},
|
||||
#{item.requestId}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
<insert id="batchInsert" databaseId="oracle">
|
||||
INSERT INTO hrsa_salary_acct_result_wz( id,salary_sob_id, salary_acct_emp_id, salary_acct_record_id, employee_id,
|
||||
tax_agent_id, salary_item_id, result_value, origin_result_value, creator, create_time, update_time, delete_type, tenant_key, request_id)
|
||||
|
||||
<foreach collection="collection" item="item" separator="union all">
|
||||
select
|
||||
#{item.id,jdbcType=DOUBLE},
|
||||
#{item.salarySobId,jdbcType=DOUBLE},
|
||||
#{item.salaryAcctEmpId,jdbcType=DOUBLE},
|
||||
#{item.salaryAcctRecordId,jdbcType=DOUBLE},
|
||||
#{item.employeeId,jdbcType=DOUBLE},
|
||||
#{item.taxAgentId,jdbcType=DOUBLE},
|
||||
#{item.salaryItemId,jdbcType=DOUBLE},
|
||||
#{item.resultValue,jdbcType=VARCHAR},
|
||||
#{item.originResultValue,jdbcType=VARCHAR},
|
||||
#{item.creator,jdbcType=DOUBLE},
|
||||
#{item.createTime,jdbcType=DATE},
|
||||
#{item.updateTime,jdbcType=DATE},
|
||||
#{item.deleteType,jdbcType=INTEGER},
|
||||
#{item.tenantKey,jdbcType=VARCHAR},
|
||||
#{item.requestId,jdbcType=VARCHAR}
|
||||
from dual
|
||||
</foreach>
|
||||
</insert>
|
||||
<insert id="batchInsert" databaseId="sqlserver">
|
||||
<foreach collection="collection" item="item" separator=";">
|
||||
INSERT INTO hrsa_salary_acct_result_wz(id,salary_sob_id, salary_acct_emp_id, salary_acct_record_id, employee_id,
|
||||
tax_agent_id, salary_item_id, result_value, origin_result_value, creator, create_time, update_time, delete_type, tenant_key, request_id)
|
||||
VALUES
|
||||
(
|
||||
#{item.id},
|
||||
#{item.salarySobId},
|
||||
#{item.salaryAcctEmpId},
|
||||
#{item.salaryAcctRecordId},
|
||||
#{item.employeeId},
|
||||
#{item.taxAgentId},
|
||||
#{item.salaryItemId},
|
||||
#{item.resultValue},
|
||||
#{item.originResultValue},
|
||||
#{item.creator},
|
||||
#{item.createTime},
|
||||
#{item.updateTime},
|
||||
#{item.deleteType},
|
||||
#{item.tenantKey},
|
||||
#{item.requestId}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</mapper>
|
||||
|
|
@ -15,6 +15,8 @@
|
|||
<result column="tenant_key" property="tenantKey"/>
|
||||
<result column="update_time" property="updateTime"/>
|
||||
<result column="can_delete" property="canDelete"/>
|
||||
<result column="show_in_workflow" property="showInWorkflow"/>
|
||||
<result column="sum_in_workflow" property="sumInWorkflow"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- 表字段 -->
|
||||
|
|
@ -37,6 +39,8 @@
|
|||
, t.rounding_mode
|
||||
, t.pattern
|
||||
, t.value_type
|
||||
, t.show_in_workflow
|
||||
, t.sum_in_workflow
|
||||
</sql>
|
||||
|
||||
<!-- 查询全部 -->
|
||||
|
|
@ -336,6 +340,12 @@
|
|||
<if test="valueType != null">
|
||||
value_type=#{valueType},
|
||||
</if>
|
||||
<if test="showInWorkflow != null">
|
||||
show_in_workflow=#{showInWorkflow},
|
||||
</if>
|
||||
<if test="sumInWorkflow != null">
|
||||
sum_in_workflow=#{sumInWorkflow},
|
||||
</if>
|
||||
</set>
|
||||
WHERE id = #{id} AND delete_type = 0
|
||||
</update>
|
||||
|
|
@ -382,7 +392,7 @@
|
|||
|
||||
<insert id="batchInsert">
|
||||
INSERT INTO hrsa_salary_sob_item(salary_sob_id, salary_item_id, salary_sob_item_group_id, formula_id,
|
||||
sorted_index, description, create_time, update_time, creator, delete_type, tenant_key,can_delete,rounding_mode,pattern,value_type)
|
||||
sorted_index, description, create_time, update_time, creator, delete_type, tenant_key,can_delete,rounding_mode,pattern,value_type,show_in_workflow,sum_in_workflow)
|
||||
VALUES
|
||||
<foreach collection="collection" item="item" separator=",">
|
||||
(
|
||||
|
|
@ -400,13 +410,15 @@
|
|||
#{item.canDelete},
|
||||
#{item.roundingMode},
|
||||
#{item.pattern},
|
||||
#{item.valueType}
|
||||
#{item.valueType},
|
||||
#{item.showInWorkflow},
|
||||
#{item.sumInWorkflow}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
<insert id="batchInsert" databaseId="oracle">
|
||||
INSERT INTO hrsa_salary_sob_item( salary_sob_id, salary_item_id, salary_sob_item_group_id, formula_id,
|
||||
sorted_index, description, create_time, update_time, creator, delete_type, tenant_key,can_delete,rounding_mode,pattern,value_type)
|
||||
sorted_index, description, create_time, update_time, creator, delete_type, tenant_key,can_delete,rounding_mode,pattern,value_type,show_in_workflow,sum_in_workflow)
|
||||
|
||||
<foreach collection="collection" item="item" separator="union all">
|
||||
select
|
||||
|
|
@ -424,14 +436,16 @@
|
|||
#{item.canDelete,jdbcType=INTEGER},
|
||||
#{item.roundingMode,jdbcType=INTEGER},
|
||||
#{item.pattern,jdbcType=INTEGER},
|
||||
#{item.valueType,jdbcType=INTEGER}
|
||||
#{item.valueType,jdbcType=INTEGER},
|
||||
#{item.showInWorkflow,jdbcType=INTEGER},
|
||||
#{item.sumInWorkflow,jdbcType=INTEGER}
|
||||
from dual
|
||||
</foreach>
|
||||
</insert>
|
||||
<insert id="batchInsert" databaseId="sqlserver">
|
||||
<foreach collection="collection" item="item" separator=";">
|
||||
INSERT INTO hrsa_salary_sob_item( salary_sob_id, salary_item_id, salary_sob_item_group_id, formula_id,
|
||||
sorted_index, description, create_time, update_time, creator, delete_type, tenant_key,can_delete,rounding_mode,pattern,value_type)
|
||||
sorted_index, description, create_time, update_time, creator, delete_type, tenant_key,can_delete,rounding_mode,pattern,value_type,show_in_workflow,sum_in_workflow)
|
||||
VALUES
|
||||
(
|
||||
#{item.salarySobId},
|
||||
|
|
@ -448,7 +462,9 @@
|
|||
#{item.canDelete},
|
||||
#{item.roundingMode},
|
||||
#{item.pattern},
|
||||
#{item.valueType}
|
||||
#{item.valueType},
|
||||
#{item.showInWorkflow},
|
||||
#{item.sumInWorkflow}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
package com.engine.salary.service;
|
||||
|
||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 薪资核算人员
|
||||
* <p>Copyright: Copyright (c) 2022</p>
|
||||
* <p>Company: 泛微软件</p>
|
||||
*
|
||||
* @author qiantao
|
||||
* @version 1.0
|
||||
**/
|
||||
public interface SalaryAcctEmployeeWZService {
|
||||
|
||||
/**
|
||||
* 根据流程id获取核算人员
|
||||
* @param requestId
|
||||
* @return
|
||||
*/
|
||||
List<SalaryAcctEmployeePO> listByRequestId(String requestId);
|
||||
|
||||
/**
|
||||
* 批量保存
|
||||
*
|
||||
* @param salaryAcctEmployeePOS 薪资核算人员
|
||||
*/
|
||||
void batchSave(Collection<SalaryAcctEmployeePO> salaryAcctEmployeePOS);
|
||||
}
|
||||
|
|
@ -58,6 +58,13 @@ public interface SalaryAcctExcelService {
|
|||
*/
|
||||
List<WeaTableColumnGroup> listWeaTableColumn(SalaryAcctRecordPO salaryAcctRecordPO);
|
||||
|
||||
/**
|
||||
* 表头
|
||||
* @param salaryAcctRecordPO
|
||||
* @return
|
||||
*/
|
||||
List<WeaTableColumnGroup> listWeaTableColumnForWorkflow(SalaryAcctRecordPO salaryAcctRecordPO, SalaryAcctResultQueryParam param);
|
||||
|
||||
/**
|
||||
* 报表表头
|
||||
* @param salaryAcctRecordPO
|
||||
|
|
@ -120,6 +127,7 @@ public interface SalaryAcctExcelService {
|
|||
|
||||
void cacheExportField(List<Long> salaryItems);
|
||||
|
||||
List<Map<String, Object>> getSalaryItemList(Long salaryAcctRecordId);
|
||||
//
|
||||
// /**
|
||||
// * 薪资核算结果校验异常导出
|
||||
|
|
|
|||
|
|
@ -207,4 +207,8 @@ public interface SalaryAcctResultService {
|
|||
* @return
|
||||
*/
|
||||
Boolean checkAuth(Long salaryAcctRecordId);
|
||||
|
||||
PageInfo<Map<String, Object>> listForWorkflow(SalaryAcctResultQueryParam param);
|
||||
|
||||
Map<String, Object> sumRowForWorkflow(SalaryAcctResultQueryParam param);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
package com.engine.salary.service;
|
||||
|
||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 薪资核算结果
|
||||
* <p>Copyright: Copyright (c) 2022</p>
|
||||
* <p>Company: 泛微软件</p>
|
||||
*
|
||||
* @author qiantao
|
||||
* @version 1.0
|
||||
**/
|
||||
public interface SalaryAcctResultWZService {
|
||||
|
||||
/**
|
||||
* @description 根据薪资核算人员id、薪资项目id获取薪资核算结果
|
||||
* @return List<SalaryAesultPO>
|
||||
* @author Harryxzy
|
||||
* @date 2022/12/26 22:24
|
||||
*/
|
||||
List<SalaryAcctResultPO> listByAcctEmployeeIdsAndSalaryItemIdsAndRequestId(List<Long> salaryAcctEmpIds, Collection<Long> salaryItemIds, String requestId);
|
||||
|
||||
/**
|
||||
* 批量保存
|
||||
*
|
||||
* @param salaryAcctResultPOS 薪资核算结果
|
||||
*/
|
||||
void batchSave(List<SalaryAcctResultPO> salaryAcctResultPOS);
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -4,6 +4,7 @@ import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
|
|||
import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO;
|
||||
import com.engine.salary.entity.salarysob.dto.SalarySobItemFormDTO;
|
||||
import com.engine.salary.entity.salarysob.param.SalarySobItemSaveParam;
|
||||
import com.engine.salary.entity.salarysob.param.SyncWorkflowSettingParam;
|
||||
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
|
||||
|
||||
import java.util.Collection;
|
||||
|
|
@ -127,4 +128,10 @@ public interface SalarySobItemService {
|
|||
SalarySobItemFormDTO getSalaryItemForm(SalarySobItemPO param);
|
||||
|
||||
void update(SalarySobItemPO po);
|
||||
|
||||
/**
|
||||
* 将薪资项目的流程设置同步到其他薪资账套中
|
||||
* @param param
|
||||
*/
|
||||
void syncWorkflowSetting(SyncWorkflowSettingParam param);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,43 @@
|
|||
package com.engine.salary.service.impl;
|
||||
|
||||
import com.api.formmode.mybatis.util.SqlProxyHandle;
|
||||
import com.engine.core.impl.Service;
|
||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
|
||||
import com.engine.salary.mapper.salaryacct.SalaryAcctEmployeeWZMapper;
|
||||
import com.engine.salary.service.SalaryAcctEmployeeWZService;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 薪资核算人员
|
||||
* <p>Copyright: Copyright (c) 2022</p>
|
||||
* <p>Company: 泛微软件</p>
|
||||
*
|
||||
* @author qiantao
|
||||
* @version 1.0
|
||||
**/
|
||||
@Slf4j
|
||||
public class SalaryAcctEmployeeWZServiceImpl extends Service implements SalaryAcctEmployeeWZService {
|
||||
|
||||
private SalaryAcctEmployeeWZMapper getSalaryAcctEmployeeWZMapper() {
|
||||
return SqlProxyHandle.getProxy(SalaryAcctEmployeeWZMapper.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SalaryAcctEmployeePO> listByRequestId(String requestId) {
|
||||
return getSalaryAcctEmployeeWZMapper().listByRequestId(requestId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void batchSave(Collection<SalaryAcctEmployeePO> salaryAcctEmployeePOS) {
|
||||
if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
|
||||
return;
|
||||
}
|
||||
List<List<SalaryAcctEmployeePO>> partition = Lists.partition((List) salaryAcctEmployeePOS, 200);
|
||||
partition.forEach(getSalaryAcctEmployeeWZMapper()::batchInsert);
|
||||
}
|
||||
}
|
||||
|
|
@ -43,6 +43,7 @@ import com.engine.salary.util.SalaryI18nUtil;
|
|||
import com.engine.salary.util.excel.ExcelParseHelper;
|
||||
import com.engine.salary.util.excel.ExcelSupport;
|
||||
import com.engine.salary.util.excel.ExcelUtilPlus;
|
||||
import com.engine.salary.util.page.SalaryPageUtil;
|
||||
import com.engine.salary.util.valid.ValidUtil;
|
||||
import com.engine.salary.wrapper.SalarySobItemWrapper;
|
||||
import com.google.common.collect.Lists;
|
||||
|
|
@ -397,6 +398,44 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
|
|||
return columnList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WeaTableColumnGroup> listWeaTableColumnForWorkflow(SalaryAcctRecordPO salaryAcctRecordPO, SalaryAcctResultQueryParam param) {
|
||||
// 是否是回算
|
||||
SalaryAcctRecordPO byId = getSalaryAcctRecordService(user).getById(salaryAcctRecordPO.getId());
|
||||
boolean isBackCalc = Objects.equals(byId.getBackCalcStatus(), 1);
|
||||
// 查询薪资账套下的薪资项目+员工信息字段
|
||||
SalarySobItemAggregateDTO salarySobItemAggregateDTO = getSalarySobItemService(user).getAggregateWithItemHideBySalarySobId(salaryAcctRecordPO.getSalarySobId(),isBackCalc);
|
||||
// 构建薪资核算结果列表表头
|
||||
List<WeaTableColumnGroup> columnList = new ArrayList<>();
|
||||
// 查询薪资项目
|
||||
List<SalaryItemPO> itemPOList = getSalaryItemService(user).listByIds(param.getSalaryItemIds());
|
||||
Map<Long, SalaryItemPO> salaryItemPOMap = SalaryEntityUtil.convert2Map(itemPOList, SalaryItemPO::getId);
|
||||
|
||||
// 员工信息字段
|
||||
for (SalarySobEmpFieldDTO salarySobEmpFieldDTO : salarySobItemAggregateDTO.getEmpFields()) {
|
||||
columnList.add(new WeaTableColumnGroup(SalaryPageUtil.selfAdaption(salarySobEmpFieldDTO.getFieldName()), salarySobEmpFieldDTO.getFieldName(), salarySobEmpFieldDTO.getFieldId()));
|
||||
}
|
||||
param.getSalaryItemIds().forEach(item -> {
|
||||
SalaryItemPO salaryItemPO = salaryItemPOMap.get(item);
|
||||
if (salaryItemPO != null) {
|
||||
columnList.add(new WeaTableColumnGroup(SalaryPageUtil.selfAdaption(salaryItemPO.getName()), salaryItemPO.getName(), salaryItemPO.getId().toString()));
|
||||
}
|
||||
});
|
||||
|
||||
// 获取固定列头数
|
||||
SalarySysConfPO salaryAcctFixedColumns = getSalarySysConfMapper().getOneByCode(SALARY_ACCT_FIXED_COLUMNS);
|
||||
if (ObjectUtils.isNotEmpty(salaryAcctFixedColumns)) {
|
||||
int fixedNum = NumberUtils.isCreatable(salaryAcctFixedColumns.getConfValue()) ? Integer.valueOf(salaryAcctFixedColumns.getConfValue()) : 3;
|
||||
if (fixedNum == 0) {
|
||||
fixedNum = 3;
|
||||
}
|
||||
for (int i = 0; i < fixedNum; i++) {
|
||||
columnList.get(i).setFixed("left");
|
||||
}
|
||||
}
|
||||
return columnList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 报表表头
|
||||
*
|
||||
|
|
@ -1337,6 +1376,27 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
|
|||
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Map<String, Object>> getSalaryItemList(Long salaryAcctRecordId) {
|
||||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId);
|
||||
if (salaryAcctRecordPO == null) {
|
||||
throw new SalaryRunTimeException("薪资核算记录不存在,或已被删除");
|
||||
}
|
||||
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
||||
Map<Long, Integer> sobItemPOMap = SalaryEntityUtil.convert2Map(salarySobItemPOS, SalarySobItemPO::getSalaryItemId, SalarySobItemPO::getShowInWorkflow);
|
||||
List<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId, Collectors.toList());
|
||||
List<SalaryItemPO> itemPOList = getSalaryItemService(user).listByIds(salaryItemIds);
|
||||
List<Map<String, Object>> result = new ArrayList<>();
|
||||
itemPOList.stream().forEach( po -> {
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put("id", po.getId());
|
||||
map.put("name", po.getName());
|
||||
map.put("default",sobItemPOMap.get(po.getId()) == null ? 0 : sobItemPOMap.get(po.getId()));
|
||||
result.add(map);
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
// @Override
|
||||
// public Map<String, Object> exportCheckResult(
|
||||
// SalaryCheckResultExportParam exportParam,
|
||||
|
|
|
|||
|
|
@ -88,6 +88,10 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
|
|||
return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user);
|
||||
}
|
||||
|
||||
private SalaryAcctEmployeeWZService getSalaryAcctEmployeeWZService(User user) {
|
||||
return ServiceUtil.getService(SalaryAcctEmployeeWZServiceImpl.class, user);
|
||||
}
|
||||
|
||||
private SalarySobItemService getSalarySobItemService(User user) {
|
||||
return ServiceUtil.getService(SalarySobItemServiceImpl.class, user);
|
||||
}
|
||||
|
|
@ -183,6 +187,10 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
|
|||
return ServiceUtil.getService(TaxAgentAdminServiceImpl.class, user);
|
||||
}
|
||||
|
||||
private SalaryAcctResultWZService getSalaryAcctResultWZService(User user) {
|
||||
return ServiceUtil.getService(SalaryAcctResultWZServiceImpl.class, user);
|
||||
}
|
||||
|
||||
|
||||
private SalaryCheckResultService salaryCheckResultService;
|
||||
|
||||
|
|
@ -496,6 +504,121 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据薪资核算人员查询薪资核算结果
|
||||
*
|
||||
* @param queryParam 列表查询条件
|
||||
* @return
|
||||
*/
|
||||
public PageInfo<Map<String, Object>> listForWorkflow(SalaryAcctResultQueryParam queryParam) {
|
||||
// 查询薪资核算记录
|
||||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId());
|
||||
if (Objects.isNull(salaryAcctRecordPO)) {
|
||||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
|
||||
}
|
||||
// 查询薪资核算所用的薪资账套的员工信息字段
|
||||
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
||||
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(queryParam.getSalaryItemIds());
|
||||
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS;
|
||||
List<DataCollectionEmployee> simpleEmployees;
|
||||
List<SalaryAcctEmployeePO> salaryAcctEmployeePOList;
|
||||
List<SalaryAcctResultPO> salaryAcctResultPOS;
|
||||
List<TaxAgentPO> taxAgentPOS;
|
||||
if(StringUtils.isBlank(queryParam.getRequestId())) {
|
||||
// 查询核算人员
|
||||
salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(queryParam.getSalaryAcctRecordId());
|
||||
salaryAcctEmployeePOList = SalaryPageUtil.subList(queryParam.getCurrent(), queryParam.getPageSize(), salaryAcctEmployeePOS);
|
||||
List<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOList, SalaryAcctEmployeePO::getId, Collectors.toList());
|
||||
// 查询薪资核算结果
|
||||
salaryAcctResultPOS = listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmployeeIds, queryParam.getSalaryItemIds());
|
||||
// 查询人员信息
|
||||
List<Long> employeeIds = SalaryEntityUtil.properties(salaryAcctResultPOS, SalaryAcctResultPO::getEmployeeId, Collectors.toList());
|
||||
simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIdsAll(employeeIds);
|
||||
simpleEmployees.forEach(e -> {
|
||||
UserStatusEnum userStatusEnum = UserStatusEnum.parseByValue(Integer.parseInt(e.getStatus()));
|
||||
if (userStatusEnum != null) {
|
||||
e.setStatusName(userStatusEnum.getDefaultLabel());
|
||||
}
|
||||
});
|
||||
// 查询个税扣缴义务人
|
||||
Set<Long> taxAgentIds = SalaryEntityUtil.properties(salaryAcctEmployeePOList, SalaryAcctEmployeePO::getTaxAgentId);
|
||||
taxAgentPOS = getTaxAgentService(user).listByIds(taxAgentIds);
|
||||
} else {
|
||||
// 有流程id的话,去另一张核算结果表查
|
||||
// 查询核算人员
|
||||
salaryAcctEmployeePOS = getSalaryAcctEmployeeWZService(user).listByRequestId(queryParam.getRequestId());
|
||||
salaryAcctEmployeePOList = SalaryPageUtil.subList(queryParam.getCurrent(), queryParam.getPageSize(), salaryAcctEmployeePOS);
|
||||
List<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOList, SalaryAcctEmployeePO::getId, Collectors.toList());
|
||||
// 查询薪资核算结果
|
||||
salaryAcctResultPOS = getSalaryAcctResultWZService(user).listByAcctEmployeeIdsAndSalaryItemIdsAndRequestId(salaryAcctEmployeeIds, queryParam.getSalaryItemIds(), queryParam.getRequestId());
|
||||
// 查询人员信息
|
||||
List<Long> employeeIds = SalaryEntityUtil.properties(salaryAcctResultPOS, SalaryAcctResultPO::getEmployeeId, Collectors.toList());
|
||||
simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIdsAll(employeeIds);
|
||||
simpleEmployees.forEach(e -> {
|
||||
UserStatusEnum userStatusEnum = UserStatusEnum.parseByValue(Integer.parseInt(e.getStatus()));
|
||||
if (userStatusEnum != null) {
|
||||
e.setStatusName(userStatusEnum.getDefaultLabel());
|
||||
}
|
||||
});
|
||||
// 查询个税扣缴义务人
|
||||
Set<Long> taxAgentIds = SalaryEntityUtil.properties(salaryAcctEmployeePOList, SalaryAcctEmployeePO::getTaxAgentId);
|
||||
taxAgentPOS = getTaxAgentService(user).listByIds(taxAgentIds);
|
||||
}
|
||||
|
||||
|
||||
// 转换成薪资核算结果列表
|
||||
List<Map<String, Object>> maps = SalaryAcctResultBO.buildTableData(salaryItemPOS, salarySobEmpFieldPOS, simpleEmployees, salaryAcctEmployeePOList, salaryAcctResultPOS, taxAgentPOS, Collections.emptySet(), new HashMap<>(), new HashMap<>(), false);
|
||||
PageInfo<Map<String, Object>> resultPage = new PageInfo<>();
|
||||
resultPage.setList(maps);
|
||||
resultPage.setTotal(salaryAcctEmployeePOS.size());
|
||||
resultPage.setPageNum(queryParam.getCurrent());
|
||||
resultPage.setPageSize(queryParam.getPageSize());
|
||||
return resultPage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> sumRowForWorkflow(SalaryAcctResultQueryParam param) {
|
||||
// 查询薪资核算记录
|
||||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(param.getSalaryAcctRecordId());
|
||||
if (Objects.isNull(salaryAcctRecordPO)) {
|
||||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
|
||||
}
|
||||
// 查询薪资核算所用薪资账套的薪资项目
|
||||
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
||||
salarySobItemPOS = salarySobItemPOS.stream().filter(po -> param.getSalaryItemIds().contains(po.getSalaryItemId())).collect(Collectors.toList());
|
||||
Map<Long, SalarySobItemPO> salaryItemIdKeySalarySobItemPOMap = SalaryEntityUtil.convert2Map(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
|
||||
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
|
||||
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
|
||||
|
||||
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS;
|
||||
List<SalaryAcctResultPO> salaryAcctResultPOS;
|
||||
if (StringUtils.isBlank(param.getRequestId())) {
|
||||
// 查询薪资核算人员
|
||||
salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(param.getSalaryAcctRecordId());
|
||||
if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
|
||||
return null;
|
||||
}
|
||||
// 查询薪资核算结果
|
||||
List<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList());
|
||||
salaryAcctResultPOS = listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmployeeIds, salaryItemIds);
|
||||
} else {
|
||||
salaryAcctEmployeePOS = getSalaryAcctEmployeeWZService(user).listByRequestId(param.getRequestId());
|
||||
if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
|
||||
return null;
|
||||
}
|
||||
// 查询薪资核算结果
|
||||
List<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList());
|
||||
salaryAcctResultPOS = getSalaryAcctResultWZService(user).listByAcctEmployeeIdsAndSalaryItemIdsAndRequestId(salaryAcctEmployeeIds, salaryItemIds, param.getRequestId());
|
||||
}
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
Map<Long, List<SalaryAcctResultPO>> acctResultMap = SalaryEntityUtil.group2Map(salaryAcctResultPOS, SalaryAcctResultPO::getSalaryItemId);
|
||||
salaryItemPOS.stream().filter(item -> SalaryDataTypeEnum.NUMBER.getValue().equals(item.getDataType())).forEach(item -> {
|
||||
BigDecimal sum = Optional.ofNullable(acctResultMap.get(item.getId())).orElse(new ArrayList<>()).stream().map(SalaryAcctResultPO::getResultValue).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
map.put(item.getId().toString(), SalaryAcctFormulaBO.roundResultValue(sum.toString(), item, Collections.emptyList(), Collections.emptyMap(), salaryItemIdKeySalarySobItemPOMap));
|
||||
});
|
||||
return map;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConsolidatedTaxDetailDTO getConsolidatedTaxDetail(Long salaryAcctEmployeeId) {
|
||||
// 查询当前的薪资核算人员
|
||||
|
|
|
|||
|
|
@ -0,0 +1,61 @@
|
|||
package com.engine.salary.service.impl;
|
||||
|
||||
import com.engine.core.impl.Service;
|
||||
import com.engine.salary.encrypt.EncryptUtil;
|
||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
|
||||
import com.engine.salary.mapper.salaryacct.SalaryAcctResultWZMapper;
|
||||
import com.engine.salary.service.SalaryAcctResultWZService;
|
||||
import com.engine.salary.util.db.MapperProxyFactory;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 薪资核算结果
|
||||
* <p>Copyright: Copyright (c) 2022</p>
|
||||
* <p>Company: 泛微软件</p>
|
||||
*
|
||||
* @author qiantao
|
||||
* @version 1.0
|
||||
**/
|
||||
@Slf4j
|
||||
public class SalaryAcctResultWZServiceImpl extends Service implements SalaryAcctResultWZService {
|
||||
private EncryptUtil encryptUtil = new EncryptUtil();
|
||||
|
||||
private SalaryAcctResultWZMapper getSalaryAcctResultWZMapper() {
|
||||
return MapperProxyFactory.getProxy(SalaryAcctResultWZMapper.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SalaryAcctResultPO> listByAcctEmployeeIdsAndSalaryItemIdsAndRequestId(List<Long> salaryAcctEmployeeIds, Collection<Long> salaryItemIds, String requestId) {
|
||||
if (CollectionUtils.isEmpty(salaryAcctEmployeeIds)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<List<Long>> partition = Lists.partition((List<Long>) salaryAcctEmployeeIds, 200);
|
||||
List<SalaryAcctResultPO> result = new ArrayList<>();
|
||||
partition.forEach(empIds -> {
|
||||
SalaryAcctResultPO build = SalaryAcctResultPO.builder().salaryAcctEmpIds(empIds).salaryItemIds(salaryItemIds).requestId(requestId).build();
|
||||
result.addAll(getSalaryAcctResultWZMapper().listSome(build));
|
||||
});
|
||||
|
||||
// 数据解密
|
||||
encryptUtil.decryptList(result, SalaryAcctResultPO.class);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void batchSave(List<SalaryAcctResultPO> salaryAcctResultPOS) {
|
||||
if (CollectionUtils.isNotEmpty(salaryAcctResultPOS)) {
|
||||
// 数据加密
|
||||
encryptUtil.encryptList(salaryAcctResultPOS, SalaryAcctResultPO.class);
|
||||
List<List<SalaryAcctResultPO>> partition = Lists.partition(salaryAcctResultPOS, 100);
|
||||
partition.forEach(getSalaryAcctResultWZMapper()::batchInsert);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -13,6 +13,7 @@ import com.engine.salary.entity.salarysob.bo.SalarySobItemAggregateBO;
|
|||
import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO;
|
||||
import com.engine.salary.entity.salarysob.dto.SalarySobItemFormDTO;
|
||||
import com.engine.salary.entity.salarysob.param.SalarySobItemSaveParam;
|
||||
import com.engine.salary.entity.salarysob.param.SyncWorkflowSettingParam;
|
||||
import com.engine.salary.entity.salarysob.po.*;
|
||||
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
|
||||
import com.engine.salary.enums.SalaryValueTypeEnum;
|
||||
|
|
@ -412,6 +413,8 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
|
|||
.roundingMode(itemParam.getRoundingMode() == null ? salaryItemPO.getRoundingMode() : itemParam.getRoundingMode())
|
||||
.pattern(itemParam.getPattern() == null ? salaryItemPO.getPattern() : itemParam.getPattern())
|
||||
.valueType(itemParam.getValueType() == null ? salaryItemPO.getValueType() : itemParam.getValueType())
|
||||
.showInWorkflow(itemParam.getShowInWorkflow() == null ? 0 : itemParam.getShowInWorkflow())
|
||||
.sumInWorkflow(itemParam.getSumInWorkflow() == null ? 0 : itemParam.getSumInWorkflow())
|
||||
.build();
|
||||
salarySobItems.add(salarySobItemPO);
|
||||
|
||||
|
|
@ -491,6 +494,8 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
|
|||
.roundingMode(itemParam.getRoundingMode() == null ? salaryItemPO.getRoundingMode() : itemParam.getRoundingMode())
|
||||
.pattern(itemParam.getPattern() == null ? salaryItemPO.getPattern() : itemParam.getPattern())
|
||||
.valueType(itemParam.getValueType() == null ? salaryItemPO.getValueType() : itemParam.getValueType())
|
||||
.showInWorkflow(itemParam.getShowInWorkflow() == null ? 0 : itemParam.getShowInWorkflow())
|
||||
.sumInWorkflow(itemParam.getSumInWorkflow() == null ? 0 : itemParam.getSumInWorkflow())
|
||||
.build();
|
||||
salarySobItems.add(salarySobItemPO);
|
||||
|
||||
|
|
@ -525,6 +530,8 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
|
|||
.roundingMode(itemParam.getRoundingMode() == null ? salaryItemPO.getRoundingMode() : itemParam.getRoundingMode())
|
||||
.pattern(itemParam.getPattern() == null ? salaryItemPO.getPattern() : itemParam.getPattern())
|
||||
.valueType(itemParam.getValueType() == null ? salaryItemPO.getValueType() : itemParam.getValueType())
|
||||
.showInWorkflow(itemParam.getShowInWorkflow() == null ? 0 : itemParam.getShowInWorkflow())
|
||||
.sumInWorkflow(itemParam.getSumInWorkflow() == null ? 0 : itemParam.getSumInWorkflow())
|
||||
.build();
|
||||
getSalarySobItemMapper().updateIgnoreNull(salarySobItemPO);
|
||||
// 保存薪资项目是否展示
|
||||
|
|
@ -581,6 +588,8 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
|
|||
.roundingMode(itemParam.getRoundingMode() == null ? salaryItemPO.getRoundingMode() : itemParam.getRoundingMode())
|
||||
.pattern(itemParam.getPattern() == null ? salaryItemPO.getPattern() : itemParam.getPattern())
|
||||
.valueType(itemParam.getValueType() == null ? salaryItemPO.getValueType() : itemParam.getValueType())
|
||||
.showInWorkflow(itemParam.getShowInWorkflow() == null ? 0 : itemParam.getShowInWorkflow())
|
||||
.sumInWorkflow(itemParam.getSumInWorkflow() == null ? 0 : itemParam.getSumInWorkflow())
|
||||
.build();
|
||||
salarySobItems.add(salarySobItemPO);
|
||||
|
||||
|
|
@ -613,6 +622,8 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
|
|||
.roundingMode(itemParam.getRoundingMode() == null ? salaryItemPO.getRoundingMode() : itemParam.getRoundingMode())
|
||||
.pattern(itemParam.getPattern() == null ? salaryItemPO.getPattern() : itemParam.getPattern())
|
||||
.valueType(itemParam.getValueType() == null ? salaryItemPO.getValueType() : itemParam.getValueType())
|
||||
.showInWorkflow(itemParam.getShowInWorkflow() == null ? 0 : itemParam.getShowInWorkflow())
|
||||
.sumInWorkflow(itemParam.getSumInWorkflow() == null ? 0 : itemParam.getSumInWorkflow())
|
||||
.build();
|
||||
getSalarySobItemMapper().updateIgnoreNull(salarySobItemPO);
|
||||
|
||||
|
|
@ -790,9 +801,23 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
|
|||
.setOriginSqlContent(valueType.equals(SalaryValueTypeEnum.SQL.getValue()) ? formulaContent : "")
|
||||
.setUseInEmployeeSalary(salaryItemPO.getUseInEmployeeSalary())
|
||||
.setDescription(salarySobItemPO.getDescription())
|
||||
.setCanEdit((openFormulaForcedEditing || salaryItemPO.getCanEdit().equals(1)) ? 1 : 0);
|
||||
.setCanEdit((openFormulaForcedEditing || salaryItemPO.getCanEdit().equals(1)) ? 1 : 0)
|
||||
.setShowInWorkflow(salarySobItemPO.getShowInWorkflow() == null ? 0 : salarySobItemPO.getShowInWorkflow())
|
||||
.setSumInWorkflow(salarySobItemPO.getSumInWorkflow() == null ? 0 : salarySobItemPO.getSumInWorkflow());
|
||||
}
|
||||
return salarySobItemFormDTO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void syncWorkflowSetting(SyncWorkflowSettingParam param) {
|
||||
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemMapper().listSome(SalarySobItemPO.builder().salarySobIds(param.getSalarySobIds()).salaryItemId(param.getSalaryItemId()).build());
|
||||
if (CollectionUtils.isEmpty(salarySobItemPOS)) {
|
||||
throw new SalaryRunTimeException("薪资账套不存在,或薪资账套中不存在该薪资项目");
|
||||
}
|
||||
salarySobItemPOS.stream().forEach(po -> {
|
||||
po.setShowInWorkflow(param.getShowInWorkflow());
|
||||
po.setSumInWorkflow(param.getSumInWorkflow());
|
||||
getSalarySobItemMapper().update(po);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -528,6 +528,15 @@ public class SalaryAcctController {
|
|||
return new ResponseResult<Long, SalaryAcctImportFieldDTO>(user).run(getSalaryAcctExcelService(user)::getImportField, salaryAcctRecordId);
|
||||
}
|
||||
|
||||
// 获取薪资账套中的薪资项目
|
||||
@GET
|
||||
@Path("/acctresult/getSalaryItemList")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
public String getSalaryItemList(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryAcctRecordId") Long salaryAcctRecordId) {
|
||||
User user = HrmUserVarify.getUser(request, response);
|
||||
return new ResponseResult<Long, List<Map<String, Object>>>(user).run(getSalaryAcctExcelService(user)::getSalaryItemList, salaryAcctRecordId);
|
||||
}
|
||||
|
||||
//导出核算结果前生成可选的薪资项目
|
||||
@GET
|
||||
@Path("/acctresult/exportField")
|
||||
|
|
@ -612,6 +621,32 @@ public class SalaryAcctController {
|
|||
return new ResponseResult<SalaryAcctImportParam, Map<String, Object>>(user).run(getSalaryAcctExcelService(user)::previewImportSalaryAcctResult, param);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("/acctresult/listForWorkflow")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
public String listForWorkflow(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctResultQueryParam param) {
|
||||
User user = HrmUserVarify.getUser(request, response);
|
||||
return new ResponseResult<SalaryAcctResultQueryParam, Map<String, Object>>(user).run(getSalaryAcctResultWrapper(user)::listForWorkflow, param);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("/acctresult/sumForWorkflow")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
public String sumForWorkflow(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctResultQueryParam param) {
|
||||
User user = HrmUserVarify.getUser(request, response);
|
||||
return new ResponseResult<SalaryAcctResultQueryParam, Map<String, Object>>(user).run(getSalaryAcctResultWrapper(user)::sumForWorkflow, param);
|
||||
}
|
||||
|
||||
|
||||
// 万众 提交审批流程
|
||||
@POST
|
||||
@Path("/acctresult/wzSaveWorkflow")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
public String wzSaveWorkflow(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctResultQueryParam param) {
|
||||
User user = HrmUserVarify.getUser(request, response);
|
||||
return new ResponseResult<SalaryAcctResultQueryParam, String>(user).run(getSalaryAcctResultWrapper(user)::wzSaveWorkflow, param);
|
||||
}
|
||||
|
||||
// **********************************薪资核算结果 end*********************************/
|
||||
|
||||
// **********************************检验异常 start*********************************/
|
||||
|
|
|
|||
|
|
@ -381,6 +381,19 @@ public class SalarySobController {
|
|||
|
||||
|
||||
|
||||
/**
|
||||
* 将薪资项目的流程设置同步到其他薪资账套中
|
||||
*/
|
||||
@POST
|
||||
@Path("/item/syncWorkflowSetting")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
public String syncWorkflowSetting(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SyncWorkflowSettingParam saveParam) {
|
||||
User user = HrmUserVarify.getUser(request, response);
|
||||
return new ResponseResult<SyncWorkflowSettingParam, String>(user).run(getSalarySobItemWrapper(user)::syncWorkflowSetting, saveParam);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********************************薪资账套的薪资项目 end*********************************/
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,9 @@ import com.engine.salary.entity.salaryacct.param.SalaryAcctCalculateParam;
|
|||
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultQueryParam;
|
||||
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultSaveParam;
|
||||
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultUpdateLockStatusParam;
|
||||
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.exception.SalaryRunTimeException;
|
||||
import com.engine.salary.service.*;
|
||||
import com.engine.salary.service.impl.*;
|
||||
|
|
@ -46,6 +48,10 @@ public class SalaryAcctResultWrapper extends Service {
|
|||
return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user);
|
||||
}
|
||||
|
||||
private SalaryAcctResultWZService getSalaryAcctResultWZService(User user) {
|
||||
return ServiceUtil.getService(SalaryAcctResultWZServiceImpl.class, user);
|
||||
}
|
||||
|
||||
private SalaryAcctRecordService getSalaryAcctRecordService(User user) {
|
||||
return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user);
|
||||
}
|
||||
|
|
@ -77,6 +83,14 @@ public class SalaryAcctResultWrapper extends Service {
|
|||
return ServiceUtil.getService(SalarySysConfServiceImpl.class, user);
|
||||
}
|
||||
|
||||
private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) {
|
||||
return (SalaryAcctEmployeeService) ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user);
|
||||
}
|
||||
|
||||
private SalaryAcctEmployeeWZService getSalaryAcctEmployeeWZService(User user) {
|
||||
return (SalaryAcctEmployeeWZService) ServiceUtil.getService(SalaryAcctEmployeeWZServiceImpl.class, user);
|
||||
}
|
||||
|
||||
/**
|
||||
* 薪资核算列表
|
||||
*
|
||||
|
|
@ -260,6 +274,55 @@ public class SalaryAcctResultWrapper extends Service {
|
|||
return getSalaryAcctResultService(user).checkAuth(salaryAcctRecordId);
|
||||
}
|
||||
|
||||
public Map<String, Object> listForWorkflow(SalaryAcctResultQueryParam param) {
|
||||
// 查询薪资核算记录
|
||||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(param.getSalaryAcctRecordId());
|
||||
if (Objects.isNull(salaryAcctRecordPO)) {
|
||||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
|
||||
}
|
||||
// 查询薪资核算结果(分页)
|
||||
PageInfo<Map<String, Object>> page = getSalaryAcctResultService(user).listForWorkflow(param);
|
||||
|
||||
// 构建薪资核算结果列表的表头
|
||||
List<WeaTableColumnGroup> columns = getSalaryAcctExcelService(user).listWeaTableColumnForWorkflow(salaryAcctRecordPO, param);
|
||||
|
||||
Map<String, Object> datas = new HashMap<>();
|
||||
datas.put("pageInfo", page);
|
||||
datas.put("columns", columns);
|
||||
|
||||
return datas;
|
||||
}
|
||||
|
||||
public void wzSaveWorkflow(SalaryAcctResultQueryParam param) {
|
||||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(param.getSalaryAcctRecordId());
|
||||
if (salaryAcctRecordPO == null) {
|
||||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
|
||||
}
|
||||
if (StringUtils.isBlank(param.getRequestId())) {
|
||||
throw new SalaryRunTimeException("流程id不能为空");
|
||||
}
|
||||
|
||||
// 查询薪资核算人员
|
||||
List<SalaryAcctEmployeePO> salaryAcctEmployeePOList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(param.getSalaryAcctRecordId());
|
||||
salaryAcctEmployeePOList.stream().forEach(po -> po.setRequestId(param.getRequestId()));
|
||||
// 保存到_wz表中
|
||||
getSalaryAcctEmployeeWZService(user).batchSave(salaryAcctEmployeePOList);
|
||||
// 查询核算结果
|
||||
List<SalaryAcctResultPO> resultPOS = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singletonList(param.getSalaryAcctRecordId()), param.getSalaryItemIds());
|
||||
resultPOS.stream().forEach(po -> po.setRequestId(param.getRequestId()));
|
||||
// 保存到_wz表中
|
||||
getSalaryAcctResultWZService(user).batchSave(resultPOS);
|
||||
}
|
||||
|
||||
public Map<String, Object> sumForWorkflow(SalaryAcctResultQueryParam param) {
|
||||
Map<String, Object> datas = new HashMap<>();
|
||||
|
||||
//合计
|
||||
Map<String, Object> sumRow = getSalaryAcctResultService(user).sumRowForWorkflow(param);
|
||||
datas.put("sumRow", sumRow);
|
||||
return datas;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 薪资核算-校验
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import com.engine.salary.entity.salaryitem.po.SysSalaryItemPO;
|
|||
import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO;
|
||||
import com.engine.salary.entity.salarysob.dto.SalarySobItemFormDTO;
|
||||
import com.engine.salary.entity.salarysob.param.SalarySobItemSaveParam;
|
||||
import com.engine.salary.entity.salarysob.param.SyncWorkflowSettingParam;
|
||||
import com.engine.salary.entity.salarysob.po.SalarySobItemGroupPO;
|
||||
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
|
||||
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
|
||||
|
|
@ -177,4 +178,12 @@ public class SalarySobItemWrapper extends Service {
|
|||
public SalarySobItemFormDTO getSalaryItemForm(SalarySobItemPO param) {
|
||||
return getSalarySobItemService(user).getSalaryItemForm(param);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将薪资项目的流程设置同步到其他薪资账套中
|
||||
* @param param
|
||||
*/
|
||||
public void syncWorkflowSetting(SyncWorkflowSettingParam param) {
|
||||
getSalarySobItemService(user).syncWorkflowSetting(param);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue