feat: 添加机型相关功能
This commit is contained in:
parent
06e956a054
commit
27d5114e2e
|
|
@ -0,0 +1,88 @@
|
||||||
|
package com.nflg.wms.admin.controller;
|
||||||
|
|
||||||
|
import com.nflg.wms.admin.service.ModelControllerService;
|
||||||
|
import com.nflg.wms.common.pojo.ApiResult;
|
||||||
|
import com.nflg.wms.common.pojo.PageData;
|
||||||
|
import com.nflg.wms.common.pojo.qo.EnableQO;
|
||||||
|
import com.nflg.wms.common.pojo.qo.ModelAddQO;
|
||||||
|
import com.nflg.wms.common.pojo.qo.ModelSearchQO;
|
||||||
|
import com.nflg.wms.common.pojo.qo.ModelUpdateQO;
|
||||||
|
import com.nflg.wms.repository.entity.Model;
|
||||||
|
import com.nflg.wms.starter.BaseController;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机型管理
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/model")
|
||||||
|
public class ModelController extends BaseController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ModelControllerService modelControllerService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增机型
|
||||||
|
*/
|
||||||
|
@PostMapping("add")
|
||||||
|
public ApiResult<Void> add(@Valid @RequestBody ModelAddQO request){
|
||||||
|
modelControllerService.add(request);
|
||||||
|
return ApiResult.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新机型
|
||||||
|
*/
|
||||||
|
@PostMapping("update")
|
||||||
|
public ApiResult<Void> update(@Valid @RequestBody ModelUpdateQO request){
|
||||||
|
modelControllerService.update(request);
|
||||||
|
return ApiResult.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除机型
|
||||||
|
*/
|
||||||
|
@PostMapping("delete")
|
||||||
|
public ApiResult<Void> delete(@Valid @NotNull Long id){
|
||||||
|
modelControllerService.delete(id);
|
||||||
|
return ApiResult.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启用/禁用机型
|
||||||
|
* @param request 请求参数
|
||||||
|
*/
|
||||||
|
@PostMapping("/enable")
|
||||||
|
public ApiResult<Void> enable(@Valid @RequestBody EnableQO request){
|
||||||
|
modelControllerService.enable(request);
|
||||||
|
return ApiResult.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 搜索机型
|
||||||
|
* @param request 搜索参数
|
||||||
|
*/
|
||||||
|
@PostMapping("search")
|
||||||
|
public ApiResult<PageData<Model>> search(@Valid @RequestBody ModelSearchQO request){
|
||||||
|
return ApiResult.success(modelControllerService.search(request));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入机型
|
||||||
|
* @param file 文件
|
||||||
|
*/
|
||||||
|
@Transactional
|
||||||
|
@PostMapping("import")
|
||||||
|
public ApiResult importFromExcel(HttpServletResponse response, @RequestParam(value = "file") MultipartFile file) throws IOException {
|
||||||
|
return modelControllerService.importFromExcel(response,file);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,131 @@
|
||||||
|
package com.nflg.wms.admin.service;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
|
import cn.hutool.core.convert.Convert;
|
||||||
|
import cn.hutool.core.util.IdUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.nflg.wms.common.constant.STATE;
|
||||||
|
import com.nflg.wms.common.pojo.ApiResult;
|
||||||
|
import com.nflg.wms.common.pojo.dto.ModelExcelImportDTO;
|
||||||
|
import com.nflg.wms.common.pojo.qo.EnableQO;
|
||||||
|
import com.nflg.wms.common.pojo.qo.ModelAddQO;
|
||||||
|
import com.nflg.wms.common.pojo.qo.ModelSearchQO;
|
||||||
|
import com.nflg.wms.common.pojo.qo.ModelUpdateQO;
|
||||||
|
import com.nflg.wms.common.util.DateTimeUtil;
|
||||||
|
import com.nflg.wms.common.util.EecExcelUtil;
|
||||||
|
import com.nflg.wms.common.util.UserUtil;
|
||||||
|
import com.nflg.wms.common.util.VUtil;
|
||||||
|
import com.nflg.wms.repository.entity.Model;
|
||||||
|
import com.nflg.wms.repository.service.IModelService;
|
||||||
|
import com.nflg.wms.starter.service.FileUploadService;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
import org.ttzero.excel.entity.ListSheet;
|
||||||
|
import org.ttzero.excel.entity.Workbook;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ModelControllerService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IModelService modelService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private FileUploadService fileUploadService;
|
||||||
|
|
||||||
|
public void add(@Valid ModelAddQO request) {
|
||||||
|
Model model= Convert.convert(Model.class, request);
|
||||||
|
model.setCreateBy(UserUtil.getUserName());
|
||||||
|
model.setCreateTime(LocalDateTime.now());
|
||||||
|
modelService.add(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(@Valid ModelUpdateQO request) {
|
||||||
|
Model model= Convert.convert(Model.class, request);
|
||||||
|
model.setUpdateBy(UserUtil.getUserName());
|
||||||
|
model.setUpdateTime(LocalDateTime.now());
|
||||||
|
modelService.update(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete(@Valid @NotNull Long id) {
|
||||||
|
modelService.delete(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void enable(@Valid EnableQO request) {
|
||||||
|
modelService.enable(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IPage<Model> search(@Valid ModelSearchQO request) {
|
||||||
|
return modelService.search(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApiResult importFromExcel(HttpServletResponse response, MultipartFile file) throws IOException {
|
||||||
|
List<ModelExcelImportDTO> data = EecExcelUtil.getExcelContext(file.getInputStream(), ModelExcelImportDTO.class);
|
||||||
|
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(data)).throwMessage("导入文件内容为空");
|
||||||
|
if (updateCheckAndImport(data)) {
|
||||||
|
return ApiResult.success();
|
||||||
|
} else {
|
||||||
|
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
|
||||||
|
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(getResultName(file.getOriginalFilename()), StandardCharsets.UTF_8));
|
||||||
|
try(ByteArrayOutputStream osOut = new ByteArrayOutputStream()) {
|
||||||
|
new Workbook()
|
||||||
|
.addSheet(new ListSheet<>(data))
|
||||||
|
.writeTo(osOut);
|
||||||
|
try(ByteArrayInputStream isIn = new ByteArrayInputStream(osOut.toByteArray())) {
|
||||||
|
return ApiResult.error(STATE.DataNoCheckPass, "导入文件失败",fileUploadService.upload("temp/" + DateTimeUtil.format(LocalDate.now(),"yyyyMMdd")+"/"+ IdUtil.fastUUID() + ".xlsx", isIn));
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
return ApiResult.error(STATE.BusinessError, "保存文件出错");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getResultName(String name){
|
||||||
|
int index=name.lastIndexOf(".");
|
||||||
|
return name.substring(0,index)+"_结果"+"."+name.substring(index+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public boolean updateCheckAndImport(List<ModelExcelImportDTO> data) {
|
||||||
|
List<Model> models = new ArrayList<>();
|
||||||
|
for (ModelExcelImportDTO dto : data) {
|
||||||
|
Model model = new Model();
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if (Objects.isNull(dto.getNo())) {
|
||||||
|
sb.append("机型编号不能为空;");
|
||||||
|
} else {
|
||||||
|
model = modelService.lambdaQuery().eq(Model::getNo, dto.getNo()).one();
|
||||||
|
if (Objects.isNull( model)){
|
||||||
|
model = new Model()
|
||||||
|
.setNo(dto.getNo());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
model.setRemark(dto.getRemark());
|
||||||
|
dto.setError(sb.toString());
|
||||||
|
models.add(model);
|
||||||
|
}
|
||||||
|
if (data.stream().noneMatch(it -> StrUtil.isNotBlank(it.getError()))) {
|
||||||
|
modelService.saveOrUpdateBatch(models);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.nflg.wms.common.pojo.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
import org.ttzero.excel.annotation.ExcelColumn;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class ModelExcelImportDTO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机型编号
|
||||||
|
*/
|
||||||
|
@ExcelColumn("*机型编号")
|
||||||
|
private String no;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
@ExcelColumn("备注")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误信息
|
||||||
|
*/
|
||||||
|
@ExcelColumn("错误信息")
|
||||||
|
private String error;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
package com.nflg.wms.common.pojo.qo;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ModelAddQO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机型编号
|
||||||
|
*/
|
||||||
|
@NotBlank
|
||||||
|
private String no;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否启用
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
private Boolean enable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
private String remark;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
package com.nflg.wms.common.pojo.qo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ModelSearchQO extends PageQO{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机型编号
|
||||||
|
*/
|
||||||
|
private String no;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
package com.nflg.wms.common.pojo.qo;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ModelUpdateQO extends ModelAddQO{
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private Long id;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
package com.nflg.wms.repository.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.ToString;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2025
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@ToString
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class Model implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机型编号
|
||||||
|
*/
|
||||||
|
private String no;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否启用
|
||||||
|
*/
|
||||||
|
private Boolean enable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建人
|
||||||
|
*/
|
||||||
|
private String createBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最后更新人
|
||||||
|
*/
|
||||||
|
private String updateBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最后更新时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime updateTime;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.nflg.wms.repository.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.nflg.wms.repository.entity.Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Mapper 接口
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2025
|
||||||
|
*/
|
||||||
|
public interface ModelMapper extends BaseMapper<Model> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.nflg.wms.repository.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.nflg.wms.common.pojo.qo.EnableQO;
|
||||||
|
import com.nflg.wms.common.pojo.qo.ModelSearchQO;
|
||||||
|
import com.nflg.wms.repository.entity.Model;
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 服务类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2025
|
||||||
|
*/
|
||||||
|
public interface IModelService extends IService<Model> {
|
||||||
|
|
||||||
|
void add(Model model);
|
||||||
|
|
||||||
|
void update(Model model);
|
||||||
|
|
||||||
|
void delete(@Valid @NotNull Long id);
|
||||||
|
|
||||||
|
void enable(@Valid EnableQO request);
|
||||||
|
|
||||||
|
IPage<Model> search(@Valid ModelSearchQO request);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,82 @@
|
||||||
|
package com.nflg.wms.repository.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.nflg.wms.common.pojo.qo.EnableQO;
|
||||||
|
import com.nflg.wms.common.pojo.qo.ModelSearchQO;
|
||||||
|
import com.nflg.wms.common.util.UserUtil;
|
||||||
|
import com.nflg.wms.common.util.VUtil;
|
||||||
|
import com.nflg.wms.repository.entity.Model;
|
||||||
|
import com.nflg.wms.repository.mapper.ModelMapper;
|
||||||
|
import com.nflg.wms.repository.service.IAuditLogService;
|
||||||
|
import com.nflg.wms.repository.service.IModelService;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 服务实现类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 代码生成器生成
|
||||||
|
* @since 2025
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class ModelServiceImpl extends ServiceImpl<ModelMapper, Model> implements IModelService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IAuditLogService auditLogService;
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@Override
|
||||||
|
public void add(Model model) {
|
||||||
|
VUtil.trueThrowBusinessError(lambdaQuery().eq(Model::getNo, model.getNo()).exists()).throwMessage("机型已存在");
|
||||||
|
save(model);
|
||||||
|
auditLogService.addInsert(Model.class,model,model.getCreateBy());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@Override
|
||||||
|
public void update(Model model) {
|
||||||
|
VUtil.trueThrowBusinessError(lambdaQuery().eq(Model::getNo, model.getNo()).ne(Model::getId, model.getId()).exists())
|
||||||
|
.throwMessage("机型已存在");
|
||||||
|
Model old = getById(model.getId());
|
||||||
|
updateById(model);
|
||||||
|
Model newModel = getById(model.getId());
|
||||||
|
auditLogService.addUpdate(Model.class, old, newModel, model.getUpdateBy());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@Override
|
||||||
|
public void delete(Long id) {
|
||||||
|
Model old = getById(id);
|
||||||
|
removeById(id);
|
||||||
|
auditLogService.addDelete(Model.class, old, UserUtil.getUserName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enable(EnableQO request) {
|
||||||
|
Model old = getById(request.getId());
|
||||||
|
lambdaUpdate()
|
||||||
|
.set(Model::getEnable, request.getEnable())
|
||||||
|
.set(Model::getUpdateBy, UserUtil.getUserName())
|
||||||
|
.set(Model::getUpdateTime, LocalDateTime.now())
|
||||||
|
.eq(Model::getId, request.getId())
|
||||||
|
.update();
|
||||||
|
Model newModel = getById(request.getId());
|
||||||
|
auditLogService.addUpdate(Model.class, old, newModel, UserUtil.getUserName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IPage<Model> search(ModelSearchQO request) {
|
||||||
|
return lambdaQuery()
|
||||||
|
.like(StrUtil.isNotBlank(request.getNo()),Model::getNo, request.getNo())
|
||||||
|
.orderByDesc(Model::getId)
|
||||||
|
.page(new Page<>(request.getPage(), request.getPageSize()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?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.nflg.wms.repository.mapper.ModelMapper">
|
||||||
|
|
||||||
|
</mapper>
|
||||||
|
|
@ -33,7 +33,7 @@ public class CodeGeneratorTest {
|
||||||
)
|
)
|
||||||
.strategyConfig(builder -> {
|
.strategyConfig(builder -> {
|
||||||
builder
|
builder
|
||||||
.addInclude("v_user_supplier") //只生成指定表
|
.addInclude("model") //只生成指定表
|
||||||
.entityBuilder().idType(IdType.ASSIGN_ID)
|
.entityBuilder().idType(IdType.ASSIGN_ID)
|
||||||
.enableLombok()
|
.enableLombok()
|
||||||
.enableChainModel()
|
.enableChainModel()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue