轮休、临时外出
This commit is contained in:
parent
f0725b196f
commit
508be2814d
|
|
@ -199,4 +199,111 @@ public class WeChatController {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* 轮休、临时外出、列表
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/holidaysList")
|
||||
@DecryptAndVerify(decryptedClass = HolidayBean.class)
|
||||
public ServerResponse holidaysList(EncryptedReq<HolidayBean> data) {
|
||||
try{
|
||||
return ServerResponse.createSuccess(service.getHolidaysList(data.getData()));
|
||||
}catch (Exception e){
|
||||
log.error(e.toString(),e);
|
||||
}
|
||||
return ServerResponse.createErroe("操作失败");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据id获取轮休、临时外出详细信息
|
||||
*/
|
||||
@PostMapping("getHolidaysDetail")
|
||||
@DecryptAndVerify(decryptedClass = HolidayBean.class)
|
||||
public ServerResponse getHolidaysDetail(@Validated @RequestBody EncryptedReq<HolidayBean> data) {
|
||||
try{
|
||||
return ServerResponse.createSuccess(service.getHolidaysDetail(data.getData().getUuid()));
|
||||
}catch (Exception e){
|
||||
log.error(e.toString(),e);
|
||||
}
|
||||
return ServerResponse.createErroe("操作失败");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 轮休、临时外出新增
|
||||
*/
|
||||
@PostMapping("insertHoliday")
|
||||
@DecryptAndVerify(decryptedClass = HolidayBean.class)//加解密统一管理
|
||||
public ServerResponse insertHoliday(@Validated @RequestBody EncryptedReq<HolidayBean> data) {
|
||||
try{
|
||||
int res = service.insertHoliday(data.getData());
|
||||
return ServerResponse.createSuccess(res);
|
||||
}catch (Exception e){
|
||||
log.error(e.toString(),e);
|
||||
}
|
||||
return ServerResponse.createErroe("操作失败");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 轮休、临时外出修改
|
||||
*/
|
||||
@PostMapping("/updateHoliday")
|
||||
@DecryptAndVerify(decryptedClass = HolidayBean.class)//加解密统一管理
|
||||
public ServerResponse updateHoliday(@Validated @RequestBody EncryptedReq<HolidayBean> data){
|
||||
try {
|
||||
return ServerResponse.createSuccess(service.updateHoliday(data.getData()));
|
||||
} catch (Exception e) {
|
||||
log.error(e.toString(),e);
|
||||
}
|
||||
return ServerResponse.createErroe("操作失败");
|
||||
}
|
||||
|
||||
/**
|
||||
* 轮休、临时外出 、休假报备、删除
|
||||
*/
|
||||
@PostMapping("/deleteHolidayById")
|
||||
@DecryptAndVerify(decryptedClass = HolidayBean.class)//加解密统一管理
|
||||
public ServerResponse deleteHolidayById(@Validated @RequestBody EncryptedReq<HolidayBean> data){
|
||||
try {
|
||||
return ServerResponse.createSuccess(service.deleteHolidayById(data.getData()));
|
||||
} catch (Exception e) {
|
||||
log.error(e.toString(),e);
|
||||
}
|
||||
return ServerResponse.createErroe("操作失败");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 休假报备修改
|
||||
*/
|
||||
@PostMapping("/editHoliday")
|
||||
@DecryptAndVerify(decryptedClass = LeaveReportingBean.class)//加解密统一管理
|
||||
public ServerResponse editHoliday(@Validated @RequestBody EncryptedReq<LeaveReportingBean> data){
|
||||
try {
|
||||
return ServerResponse.createSuccess(service.editHoliday(data.getData()));
|
||||
} catch (Exception e) {
|
||||
log.error(e.toString(),e);
|
||||
}
|
||||
return ServerResponse.createErroe("操作失败");
|
||||
}
|
||||
|
||||
/**
|
||||
* 出差报备修改
|
||||
*/
|
||||
@PostMapping("/editEvection")
|
||||
@DecryptAndVerify(decryptedClass = EvectionBean.class)//加解密统一管理
|
||||
public ServerResponse editEvection(@Validated @RequestBody EncryptedReq<EvectionBean> data){
|
||||
try {
|
||||
return ServerResponse.createSuccess(service.editEvection(data.getData()));
|
||||
} catch (Exception e) {
|
||||
log.error(e.toString(),e);
|
||||
}
|
||||
return ServerResponse.createErroe("操作失败");
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,7 @@
|
|||
package com.bonus.boot.manager.manager.dao;
|
||||
|
||||
import com.bonus.boot.manager.appManage.entity.SysUserWechat;
|
||||
import com.bonus.boot.manager.manager.entity.EvectionBean;
|
||||
import com.bonus.boot.manager.manager.entity.LeaveReportingBean;
|
||||
import com.bonus.boot.manager.manager.entity.UserDto;
|
||||
import com.bonus.boot.manager.manager.entity.WidthVo;
|
||||
import com.bonus.boot.manager.manager.entity.*;
|
||||
import com.bonus.boot.manager.manager.model.SysUser;
|
||||
import org.apache.ibatis.annotations.Delete;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
|
@ -63,6 +60,13 @@ public interface WeChatDao {
|
|||
*/
|
||||
int insertLeaveReporting(LeaveReportingBean o);
|
||||
|
||||
/**
|
||||
* 轮休、临时外出新增
|
||||
* @param o
|
||||
* @return
|
||||
*/
|
||||
int insertHoliday(HolidayBean o);
|
||||
|
||||
/**
|
||||
* 查询休假报备列表
|
||||
* @param bean
|
||||
|
|
@ -104,4 +108,36 @@ public interface WeChatDao {
|
|||
List<LeaveReportingBean> getFestivalAndHoliday(LeaveReportingBean bean);
|
||||
|
||||
String getAttTypeByUserId(Long userId);
|
||||
|
||||
/**
|
||||
* 查询获取轮休列表
|
||||
* @param bean
|
||||
* @return
|
||||
*/
|
||||
List<HolidayBean> getHolidaysList(HolidayBean bean);
|
||||
|
||||
/**
|
||||
* 查询获取轮休详情
|
||||
* @param uuId
|
||||
* @return
|
||||
*/
|
||||
HolidayBean getHolidaysDetail(String uuId);
|
||||
|
||||
/**
|
||||
* 修改轮休
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
int updateHoliday(HolidayBean data);
|
||||
|
||||
/**
|
||||
* 删除轮休
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
int deleteHolidayById(HolidayBean data);
|
||||
|
||||
int editHoliday(LeaveReportingBean data);
|
||||
|
||||
int editEvection(EvectionBean data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,160 @@
|
|||
package com.bonus.boot.manager.manager.entity;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* packageName com.bonus.boot.manager.manager.entity
|
||||
*
|
||||
* @author lsun
|
||||
* @version 1.0.0
|
||||
* @className HolidayBean (此处以class为例)
|
||||
* @date 2025/2/17
|
||||
*/
|
||||
@Data
|
||||
public class HolidayBean {
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private long id;
|
||||
|
||||
/**
|
||||
* uuid
|
||||
*/
|
||||
private String uuid;
|
||||
|
||||
/**
|
||||
* 所属部门编号
|
||||
*/
|
||||
private Long orgId;
|
||||
/**
|
||||
* 所属部门名称
|
||||
*/
|
||||
private String orgName;
|
||||
|
||||
/**
|
||||
* 请假人用户编号
|
||||
*/
|
||||
private Long userId;
|
||||
|
||||
/** 创建者 */
|
||||
private Long createUserId;
|
||||
|
||||
/**
|
||||
* 用户编号用来判断是否是本人
|
||||
*/
|
||||
private Long userIds;
|
||||
/**
|
||||
* 请假人姓名
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 请假开始日期
|
||||
*/
|
||||
private LocalDate leaveStartDate;
|
||||
/**
|
||||
* 请假开始时段1上午2下午
|
||||
*/
|
||||
private String leaveStartInterval;
|
||||
/**
|
||||
* 请假结束日期
|
||||
*/
|
||||
private LocalDate leaveEndDate;
|
||||
/**
|
||||
* 请假结束时段1上午2下午
|
||||
*/
|
||||
private String leaveEndInterval;
|
||||
/**
|
||||
* 请假时长
|
||||
*/
|
||||
private Double leaveDuration;
|
||||
/**
|
||||
* 请假事由
|
||||
*/
|
||||
private String leaveReason;
|
||||
|
||||
/**
|
||||
* 请假类型
|
||||
*/
|
||||
private String leaveType;
|
||||
|
||||
/**
|
||||
* 请假类型
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 请假日期
|
||||
*/
|
||||
private String leaveDate;
|
||||
|
||||
|
||||
/**
|
||||
* 数据来源1新增2导入
|
||||
*/
|
||||
private String source;
|
||||
|
||||
/**
|
||||
* 审批意见
|
||||
*/
|
||||
private String examineOpinion;
|
||||
/**
|
||||
* 审批状态0审核中1通过2不通过
|
||||
*/
|
||||
private String examineStatus;
|
||||
/**
|
||||
* 审批时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date examineTime;
|
||||
/**
|
||||
* 审批人编号
|
||||
*/
|
||||
private Long examineUserId;
|
||||
|
||||
/**
|
||||
* 导出类型 1 查询 2 审批
|
||||
*/
|
||||
private String exportType;
|
||||
|
||||
/**
|
||||
* 自己项目部所在分公司下的所有项目部id
|
||||
*/
|
||||
private List<String> orgList;
|
||||
|
||||
/**
|
||||
* 代理主持工作人员(多个自动隔开)
|
||||
*/
|
||||
private String hostUserId;
|
||||
|
||||
/**
|
||||
* 地点
|
||||
*/
|
||||
private String location;
|
||||
|
||||
/**
|
||||
* 是否请示领导 1 是 0 否
|
||||
*/
|
||||
private String isAgree;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 角色类型 1:人资专员和管理员;2:考勤员
|
||||
*/
|
||||
private String roleType;
|
||||
private String[] orgListId;
|
||||
|
||||
private Long updateUserId;
|
||||
|
||||
/**一键审批ID*/
|
||||
private List<Long> ids;
|
||||
}
|
||||
|
|
@ -32,6 +32,8 @@ public class LeaveReportingBean {
|
|||
*/
|
||||
private Long userId;
|
||||
|
||||
private Long updateUserId;
|
||||
|
||||
private Long createUserId;
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.bonus.boot.manager.manager.service;
|
||||
|
||||
import com.bonus.boot.manager.manager.entity.EvectionBean;
|
||||
import com.bonus.boot.manager.manager.entity.HolidayBean;
|
||||
import com.bonus.boot.manager.manager.entity.LeaveReportingBean;
|
||||
import com.bonus.boot.manager.manager.entity.UserDto;
|
||||
import com.bonus.boot.manager.manager.model.SysUser;
|
||||
|
|
@ -88,4 +89,33 @@ public interface WeChatService {
|
|||
* @return
|
||||
*/
|
||||
String getDays(LeaveReportingBean bean);
|
||||
|
||||
/**
|
||||
* 获取轮休列表
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
List<HolidayBean> getHolidaysList(HolidayBean data);
|
||||
|
||||
/**
|
||||
* 获取轮休详情
|
||||
* @param uuId
|
||||
* @return
|
||||
*/
|
||||
HolidayBean getHolidaysDetail(String uuId);
|
||||
|
||||
/**
|
||||
* 轮休、临时外出新增
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
int insertHoliday(HolidayBean data);
|
||||
|
||||
int updateHoliday(HolidayBean data);
|
||||
|
||||
int deleteHolidayById(HolidayBean data);
|
||||
|
||||
int editHoliday(LeaveReportingBean data);
|
||||
|
||||
int editEvection(EvectionBean data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.bonus.boot.manager.manager.service.impl;
|
|||
|
||||
import com.bonus.boot.manager.manager.dao.WeChatDao;
|
||||
import com.bonus.boot.manager.manager.entity.EvectionBean;
|
||||
import com.bonus.boot.manager.manager.entity.HolidayBean;
|
||||
import com.bonus.boot.manager.manager.entity.LeaveReportingBean;
|
||||
import com.bonus.boot.manager.manager.entity.UserDto;
|
||||
import com.bonus.boot.manager.manager.model.SysUser;
|
||||
|
|
@ -186,6 +187,81 @@ public class WeChatServiceImpl implements WeChatService {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取轮休列表
|
||||
* @param bean
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<HolidayBean> getHolidaysList(HolidayBean bean) {
|
||||
Long userId = Long.valueOf(UserUtil.getLoginUser().getUserId());
|
||||
bean.setUserId(userId);
|
||||
return dao.getHolidaysList(bean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取轮休详情
|
||||
* @param uuId
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public HolidayBean getHolidaysDetail(String uuId) {
|
||||
return dao.getHolidaysDetail(uuId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 轮休、临时外出新增
|
||||
* @param o
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public int insertHoliday(HolidayBean o) {
|
||||
Long userId = Long.valueOf(UserUtil.getLoginUser().getUserId());
|
||||
String uuId = UUID.randomUUID().toString();
|
||||
o.setUuid(uuId);
|
||||
o.setCreateUserId(userId);
|
||||
o.setSource("3");
|
||||
o.setUserId(userId);
|
||||
o.setLeaveStartInterval("1");
|
||||
o.setLeaveEndInterval("2");
|
||||
int i = dao.insertHoliday(o);
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* 轮休、临时外出修改
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public int updateHoliday(HolidayBean data) {
|
||||
Long userId = Long.valueOf(UserUtil.getLoginUser().getUserId());
|
||||
data.setUpdateUserId(userId);
|
||||
int i = dao.updateHoliday(data);
|
||||
return i;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int deleteHolidayById(HolidayBean data) {
|
||||
return dao.deleteHolidayById(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int editHoliday(LeaveReportingBean data) {
|
||||
Long userId = Long.valueOf(UserUtil.getLoginUser().getUserId());
|
||||
data.setUpdateUserId(userId);
|
||||
int i = dao.editHoliday(data);
|
||||
return i;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int editEvection(EvectionBean data) {
|
||||
Long userId = Long.valueOf(UserUtil.getLoginUser().getUserId());
|
||||
data.setUpdateUserId(userId);
|
||||
int i = dao.editEvection(data);
|
||||
return i;
|
||||
}
|
||||
|
||||
// 辅助方法:将字符串解析为Date对象
|
||||
private Date parseDate(String dateStr) throws ParseException {
|
||||
return DATE_FORMAT.get().parse(dateStr);
|
||||
|
|
|
|||
|
|
@ -34,13 +34,133 @@
|
|||
#{leaveEndDate},
|
||||
#{leaveEndInterval},
|
||||
#{leaveDuration}, #{source}, #{createUserId}, #{isAgree}, #{location}, #{hostUserId}, #{hostUserName},
|
||||
#{remark}, '1')
|
||||
#{remark}, '0')
|
||||
</insert>
|
||||
|
||||
<insert id="insertHoliday">
|
||||
INSERT INTO leave_apply_wechat(uuid, user_id, user_name, org_id, org_name, leave_type, type, leave_reason,
|
||||
leave_start_date,
|
||||
leave_start_interval,
|
||||
leave_end_date,
|
||||
leave_end_interval,
|
||||
leave_duration, source, create_user_id, is_agree, location, host_user_id,
|
||||
host_user_name, remark, examine_status)
|
||||
VALUES (#{uuid}, #{userId}, #{userName}, #{orgId}, #{orgName}, #{leaveType}, #{type}, #{leaveReason},
|
||||
#{leaveStartDate},
|
||||
#{leaveStartInterval},
|
||||
#{leaveEndDate},
|
||||
#{leaveEndInterval},
|
||||
#{leaveDuration}, #{source}, #{createUserId}, #{isAgree}, #{location}, #{hostUserId}, #{hostUserName},
|
||||
#{remark}, '0')
|
||||
</insert>
|
||||
|
||||
<update id="updateUser">
|
||||
update sys_user_wechat
|
||||
set password = #{password}
|
||||
where user_id = #{userId}
|
||||
</update>
|
||||
|
||||
<update id="updateHoliday">
|
||||
UPDATE leave_apply_wechat
|
||||
<set>
|
||||
<if test="userId != null and userId != ''">
|
||||
user_id = #{userId},
|
||||
</if>
|
||||
<if test="userName != null and userName != ''">
|
||||
user_name = #{userName},
|
||||
</if>
|
||||
<if test="orgId != null and orgId != ''">
|
||||
org_id = #{orgId},
|
||||
</if>
|
||||
<if test="orgName != null and orgName != ''">
|
||||
org_name = #{orgName},
|
||||
</if>
|
||||
leave_reason = #{leaveReason},
|
||||
leave_start_date = #{leaveStartDate},
|
||||
leave_start_interval = #{leaveStartInterval},
|
||||
leave_end_date = #{leaveEndDate},
|
||||
leave_end_interval = #{leaveEndInterval},
|
||||
leave_duration = #{leaveDuration},
|
||||
examine_status = #{examineStatus},
|
||||
update_user_id = #{updateUserId},
|
||||
is_agree = #{isAgree},
|
||||
location = #{location},
|
||||
host_user_id = #{hostUserId},
|
||||
remark = #{remark}
|
||||
</set>
|
||||
where uuid = #{uuid}
|
||||
</update>
|
||||
|
||||
<update id="deleteHolidayById">
|
||||
update leave_apply_wechat SET is_active = '0' WHERE uuid = #{uuid}
|
||||
</update>
|
||||
|
||||
<update id="editHoliday">
|
||||
UPDATE leave_apply_wechat
|
||||
<set>
|
||||
<if test="userId != null and userId != ''">
|
||||
user_id = #{userId},
|
||||
</if>
|
||||
<if test="userName != null and userName != ''">
|
||||
user_name = #{userName},
|
||||
</if>
|
||||
<if test="orgId != null and orgId != ''">
|
||||
org_id = #{orgId},
|
||||
</if>
|
||||
<if test="orgName != null and orgName != ''">
|
||||
org_name = #{orgName},
|
||||
</if>
|
||||
leave_type = #{leaveType},
|
||||
type = '请假',
|
||||
leave_reason = #{leaveReason},
|
||||
leave_start_date = #{leaveStartDate},
|
||||
leave_start_interval = #{leaveStartInterval},
|
||||
leave_end_date = #{leaveEndDate},
|
||||
leave_end_interval = #{leaveEndInterval},
|
||||
leave_duration = #{leaveDuration},
|
||||
source = #{source},
|
||||
update_user_id = #{updateUserId},
|
||||
is_agree = #{isAgree},
|
||||
location = #{location},
|
||||
host_user_id = #{hostUserId},
|
||||
host_user_name = #{hostUserName},
|
||||
remark = #{remark}
|
||||
</set>
|
||||
where uuid = #{uuid}
|
||||
</update>
|
||||
|
||||
<update id="editEvection">
|
||||
UPDATE leave_apply_wechat
|
||||
<set>
|
||||
<if test="userId != null and userId != ''">
|
||||
user_id = #{userId},
|
||||
</if>
|
||||
<if test="userName != null and userName != ''">
|
||||
user_name = #{userName},
|
||||
</if>
|
||||
<if test="orgId != null and orgId != ''">
|
||||
org_id = #{orgId},
|
||||
</if>
|
||||
<if test="orgName != null and orgName != ''">
|
||||
org_name = #{orgName},
|
||||
</if>
|
||||
leave_reason = #{leaveReason},
|
||||
leave_start_date = #{leaveStartDate},
|
||||
leave_start_interval = #{leaveStartInterval},
|
||||
leave_end_date = #{leaveEndDate},
|
||||
leave_end_interval = #{leaveEndInterval},
|
||||
leave_duration = #{leaveDuration},
|
||||
source = #{source},
|
||||
update_user_id = #{updateUserId},
|
||||
is_agree = #{isAgree},
|
||||
location = #{location},
|
||||
host_user_id = #{hostUserId},
|
||||
host_user_name = #{hostUserName},
|
||||
remark = #{remark}
|
||||
</set>
|
||||
where uuid = #{uuid}
|
||||
</update>
|
||||
|
||||
<select id="getById" resultType="com.bonus.boot.manager.manager.entity.UserDto">
|
||||
select su.id,
|
||||
su.username as username,
|
||||
|
|
@ -297,4 +417,48 @@
|
|||
WHERE user_id = #{userId}
|
||||
</select>
|
||||
|
||||
<select id="getHolidaysList" resultType="com.bonus.boot.manager.manager.entity.HolidayBean">
|
||||
SELECT DISTINCT la.id,
|
||||
la.uuid,
|
||||
la.user_id,
|
||||
la.user_name,
|
||||
la.org_id,
|
||||
la.org_name,
|
||||
la.create_time,
|
||||
la.leave_type,
|
||||
la.leave_reason,
|
||||
la.leave_start_date,
|
||||
la.leave_start_interval,
|
||||
la.leave_end_date,
|
||||
la.leave_end_interval,
|
||||
la.leave_duration,
|
||||
la.examine_status
|
||||
FROM leave_apply_wechat la
|
||||
WHERE la.is_active = '1'
|
||||
and la.type = #{type}
|
||||
and la.user_id = #{userId}
|
||||
ORDER BY la.update_time DESC
|
||||
</select>
|
||||
|
||||
<select id="getHolidaysDetail" resultType="com.bonus.boot.manager.manager.entity.HolidayBean">
|
||||
SELECT DISTINCT la.id,
|
||||
la.uuid,
|
||||
la.user_id,
|
||||
la.user_name,
|
||||
la.org_id,
|
||||
la.org_name,
|
||||
la.create_time,
|
||||
la.leave_type,
|
||||
la.leave_reason,
|
||||
la.leave_start_date,
|
||||
la.leave_start_interval,
|
||||
la.leave_end_date,
|
||||
la.leave_end_interval,
|
||||
la.leave_duration,
|
||||
la.examine_status
|
||||
FROM leave_apply_wechat la
|
||||
WHERE la.is_active = '1'
|
||||
and la.uuid = #{uuId}
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
|
|
|||
Loading…
Reference in New Issue