commit
f2c7e246f7
11 changed files with 1019 additions and 16 deletions
@ -0,0 +1,98 @@ |
||||
package org.jeecg.modules.demo.functiontemplate.entity; |
||||
|
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
|
||||
import java.io.Serializable; |
||||
|
||||
/** |
||||
* |
||||
* @TableName function_template_test |
||||
*/ |
||||
@Data |
||||
@AllArgsConstructor |
||||
@NoArgsConstructor |
||||
public class FunctionTemplateTest implements Serializable { |
||||
/** |
||||
* |
||||
*/ |
||||
private Long id; |
||||
|
||||
/** |
||||
* 模块模板类型 |
||||
*/ |
||||
private String modulextypename; |
||||
|
||||
|
||||
/** |
||||
* 中文名称 |
||||
*/ |
||||
private String functiontemplatename; |
||||
|
||||
/** |
||||
* 英文名称 |
||||
*/ |
||||
private String functiontemplateenname; |
||||
|
||||
/** |
||||
* 功能编码 |
||||
*/ |
||||
private String functiontemplatecode; |
||||
|
||||
/** |
||||
* 功能类型 |
||||
*/ |
||||
private String functiontemplatetype; |
||||
|
||||
/** |
||||
* 功能描述 |
||||
*/ |
||||
private String functiontemplatedescribe; |
||||
|
||||
/** |
||||
* 分析图 |
||||
*/ |
||||
private String diagrams; |
||||
|
||||
/** |
||||
* 用户角色 |
||||
*/ |
||||
private String userrole; |
||||
|
||||
/** |
||||
* 责任人 |
||||
*/ |
||||
private String managerusers; |
||||
|
||||
/** |
||||
* 任务等级 |
||||
*/ |
||||
private String worklevel; |
||||
|
||||
/** |
||||
* 任务状态 |
||||
*/ |
||||
private String workstatus; |
||||
|
||||
/** |
||||
* 发布时间 |
||||
*/ |
||||
private String publishtime; |
||||
|
||||
/** |
||||
* 开始时间 |
||||
*/ |
||||
private String starttime; |
||||
|
||||
/** |
||||
* 任务时长 |
||||
*/ |
||||
private String duration; |
||||
|
||||
/** |
||||
* 创建人 |
||||
*/ |
||||
private String createname; |
||||
|
||||
} |
@ -0,0 +1,9 @@ |
||||
package org.jeecg.modules.demo.functiontemplate.mapper; |
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
import org.apache.ibatis.annotations.Mapper; |
||||
import org.jeecg.modules.demo.functiontemplate.entity.FunctionTemplateTest; |
||||
|
||||
@Mapper |
||||
public interface FunctionTemplateTestMapper extends BaseMapper<FunctionTemplateTest> { |
||||
} |
@ -0,0 +1,10 @@ |
||||
package org.jeecg.modules.demo.functiontemplate.service; |
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService; |
||||
import org.jeecg.common.api.vo.Result; |
||||
import org.jeecg.modules.demo.functiontemplate.entity.FunctionTemplateTest; |
||||
import org.springframework.web.multipart.MultipartFile; |
||||
|
||||
public interface FunctionTemplateTestService extends IService<FunctionTemplateTest> { |
||||
Result<?> importExcel(MultipartFile file); |
||||
} |
@ -0,0 +1,323 @@ |
||||
package org.jeecg.modules.demo.functiontemplate.service.impl; |
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils; |
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook; |
||||
import org.apache.poi.ss.usermodel.Cell; |
||||
import org.apache.poi.ss.usermodel.Row; |
||||
import org.apache.poi.ss.usermodel.Sheet; |
||||
import org.apache.poi.ss.usermodel.Workbook; |
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook; |
||||
import org.apache.shiro.SecurityUtils; |
||||
import org.jeecg.common.api.vo.Result; |
||||
import org.jeecg.common.system.vo.LoginUser; |
||||
import org.jeecg.modules.demo.functiontemplate.entity.FunctionTemplate; |
||||
import org.jeecg.modules.demo.functiontemplate.entity.FunctionTemplateTest; |
||||
import org.jeecg.modules.demo.functiontemplate.mapper.FunctionTemplateTestMapper; |
||||
import org.jeecg.modules.demo.functiontemplate.service.FunctionTemplateTestService; |
||||
import org.jeecg.modules.demo.functiontemplate.service.IFunctionTemplateService; |
||||
import org.jeecg.modules.demo.moduletype.entity.ModuleType; |
||||
import org.jeecg.modules.demo.moduletype.service.IModuleTypeService; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.stereotype.Service; |
||||
import org.springframework.transaction.annotation.Transactional; |
||||
import org.springframework.web.multipart.MultipartFile; |
||||
|
||||
import java.io.IOException; |
||||
import java.text.ParseException; |
||||
import java.text.SimpleDateFormat; |
||||
import java.util.*; |
||||
|
||||
@Service |
||||
@Slf4j |
||||
public class FunctionTemplateTestServiceImpl extends ServiceImpl<FunctionTemplateTestMapper, FunctionTemplateTest> implements FunctionTemplateTestService { |
||||
|
||||
@Autowired |
||||
private IFunctionTemplateService functionTemplateService; |
||||
@Autowired |
||||
private IModuleTypeService moduleTypeService; |
||||
|
||||
/** |
||||
* 导入excel |
||||
* |
||||
* @param file 文件 |
||||
* @return {@link Result}<{@link ?}> |
||||
*/ |
||||
@Override |
||||
@Transactional |
||||
public Result<?> importExcel(MultipartFile file) { |
||||
List<FunctionTemplateTest> listVo = new ArrayList<>(); |
||||
// 获取当前操作用户
|
||||
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); |
||||
String username = loginUser.getUsername(); |
||||
|
||||
Map<Integer, List<String>> fileMap = new HashMap<>(); |
||||
//创建输出流对象
|
||||
Workbook wb=null; |
||||
/*判断文件是xlsx结尾还是xls结尾 声明XSSF或HSSF对象*/ |
||||
String[] split = file.getOriginalFilename().split("\\."); |
||||
|
||||
try { |
||||
if(split[1].equals("xlsx")){ |
||||
wb= new XSSFWorkbook(file.getInputStream()); |
||||
}else if(split[1].equals("xls")){ |
||||
wb= new HSSFWorkbook(file.getInputStream()); |
||||
} else { |
||||
return Result.error("文件格式错误,请上传Excel文件"); |
||||
} |
||||
} catch (IOException e) { |
||||
throw new RuntimeException("请上传正确格式文件"); |
||||
} |
||||
|
||||
|
||||
//获取工作表页数据
|
||||
//读取第1页的数据
|
||||
Sheet sheet=wb.getSheetAt(0); |
||||
//获取工作表页中行数据
|
||||
//读取的总的行数
|
||||
int lastRowIndex=sheet.getLastRowNum(); |
||||
if(lastRowIndex < 1) { |
||||
return Result.error("文件无内容或格式错误"); |
||||
} |
||||
|
||||
for (int i=1;i<=lastRowIndex;i++) { |
||||
Row row = sheet.getRow(i); |
||||
if(row!=null){ |
||||
short lastCellNum = row.getLastCellNum(); |
||||
List<String> list = new ArrayList<>(); |
||||
for (int j=0;j<lastCellNum;j++){ |
||||
Cell cell = row.getCell(j); |
||||
String cellValue = cell.getStringCellValue(); |
||||
list.add(cellValue); |
||||
} |
||||
FunctionTemplateTest fun = new FunctionTemplateTest(); |
||||
|
||||
fun.setModulextypename(list.get(0)); |
||||
fun.setFunctiontemplatename(list.get(1)); |
||||
fun.setFunctiontemplateenname(list.get(2)); |
||||
fun.setFunctiontemplatecode(list.get(3)); |
||||
fun.setFunctiontemplatetype(list.get(4)); |
||||
fun.setFunctiontemplatedescribe(list.get(5)); // 功能描述
|
||||
fun.setDiagrams(list.get(6)); // 分析图
|
||||
fun.setUserrole(list.get(7)); // 用户角色
|
||||
fun.setManagerusers(list.get(8)); // 责任人
|
||||
fun.setWorklevel(list.get(9)); // 任务等级
|
||||
fun.setWorkstatus(list.get(10)); //任务状态
|
||||
fun.setPublishtime(list.get(11)); // 发布时间
|
||||
fun.setStarttime(list.get(12)); // 开始时间
|
||||
fun.setDuration(list.get(13)); // 任务时长
|
||||
fun.setCreatename(username); |
||||
|
||||
listVo.add(fun); |
||||
} |
||||
} |
||||
boolean isSuccessSave = this.saveBatch(listVo); |
||||
if (!isSuccessSave){ |
||||
return Result.error("文件读入失败"); |
||||
} |
||||
|
||||
// ------------------------------字段具体校验----------------------------------
|
||||
|
||||
LambdaQueryWrapper<FunctionTemplateTest> queryWrapper = new LambdaQueryWrapper<>(); |
||||
queryWrapper.eq(username!=null,FunctionTemplateTest::getCreatename,username); |
||||
List<FunctionTemplateTest> list = this.list(queryWrapper); |
||||
|
||||
boolean remove = this.remove(queryWrapper); |
||||
if (!remove){ |
||||
log.error("临时表删除错误!"); |
||||
} |
||||
|
||||
List<FunctionTemplate> listInsert = new ArrayList<>(); // 正式插入
|
||||
|
||||
String pattern = "yyyy-MM-dd HH:mm:ss"; |
||||
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); |
||||
|
||||
for (FunctionTemplateTest function :list){ |
||||
FunctionTemplate functionTemplate = new FunctionTemplate(); |
||||
String modulextypename = function.getModulextypename(); // 模块模板类型
|
||||
String functiontemplatename = function.getFunctiontemplatename(); // 中文名称
|
||||
String functiontemplateenname = function.getFunctiontemplateenname(); // 英文名称
|
||||
String functiontemplatecode = function.getFunctiontemplatecode(); // 功能编码
|
||||
String functiontemplatetype = function.getFunctiontemplatetype(); // 功能类型
|
||||
String functiontemplatedescribe = function.getFunctiontemplatedescribe(); // 任务描述
|
||||
String diagrams = function.getDiagrams();// 分析图
|
||||
String userrole = function.getUserrole(); // 用户角色
|
||||
String managerUsers = function.getManagerusers(); // 责任人
|
||||
String worklevel = function.getWorklevel(); // 任务等级
|
||||
String workstatus = function.getWorkstatus(); // 任务状态
|
||||
String publishtime = function.getPublishtime(); // 发布时间
|
||||
String starttime = function.getStarttime(); // 开始时间
|
||||
String duration = function.getDuration(); // 任务时长
|
||||
|
||||
if(StringUtils.isBlank(modulextypename)){ // 空和null
|
||||
return Result.error("模块模板类型不能为空"); |
||||
} else{ |
||||
LambdaQueryWrapper<ModuleType> queryWrapper1 = new LambdaQueryWrapper<>(); |
||||
queryWrapper1.eq(ModuleType::getModulextypeName,modulextypename); |
||||
ModuleType one = moduleTypeService.getOne(queryWrapper1); |
||||
if(one==null) |
||||
return Result.error("请输入正确的模块模板类型"); |
||||
else |
||||
functionTemplate.setModulextypeId(one.getId()); |
||||
} |
||||
if(StringUtils.isBlank(functiontemplatename)){ // 空和null
|
||||
return Result.error("中文名称不能为空"); |
||||
} else{ |
||||
LambdaQueryWrapper<FunctionTemplate> queryWrapperCh = new LambdaQueryWrapper<>(); |
||||
// queryWrapperCh.eq()
|
||||
functionTemplate.setFunctionTemplateName(functiontemplatename); |
||||
} |
||||
if(StringUtils.isBlank(functiontemplateenname)){ |
||||
return Result.error("英文名称不能为空"); |
||||
} else { |
||||
functionTemplate.setFunctionTemplateEnName(functiontemplateenname); |
||||
} |
||||
|
||||
Integer type=100; |
||||
if(StringUtils.isBlank(functiontemplatetype)){ |
||||
// 模块编码+功能缩写;自动填充+手动修改
|
||||
return Result.error("功能类型不能为空"); |
||||
} else { |
||||
// 值:列表0、新增1、删除2、修改3、查看4、导入5、导出6、其它99;默认99
|
||||
switch (functiontemplatetype){ |
||||
case "列表": type=0; break; |
||||
case "新增": type=1; break; |
||||
case "删除": type=2; break; |
||||
case "修改": type=3; break; |
||||
case "查看": type=4; break; |
||||
case "导入": type=5; break; |
||||
case "导出": type=6; break; |
||||
case "其它": type=99; break; |
||||
default: return Result.error("功能类型错误"); |
||||
} |
||||
functionTemplate.setFunctionTemplateType(type); |
||||
} |
||||
if(StringUtils.isBlank(functiontemplatecode)){ |
||||
return Result.error("功能编码不能为空"); |
||||
} else { |
||||
if (type!=100){ |
||||
String str = "后期替换"+functiontemplatetype; |
||||
if(!str.equals(functiontemplatecode)) |
||||
return Result.error("功能编码错误"); |
||||
} |
||||
functionTemplate.setFunctionTemplateCode(functiontemplatecode); |
||||
} |
||||
if(StringUtils.isNotBlank(functiontemplatedescribe)){ |
||||
functionTemplate.setFunctionTemplateDescribe(functiontemplatedescribe); |
||||
} |
||||
if(StringUtils.isNotBlank(diagrams)){ |
||||
functionTemplate.setDiagrams(diagrams); |
||||
} |
||||
if(StringUtils.isNotBlank(userrole)){ |
||||
functionTemplate.setUserRole(userrole); |
||||
} |
||||
if(StringUtils.isNotBlank(managerUsers)){ |
||||
functionTemplate.setManagerUsers(managerUsers); |
||||
} |
||||
if(StringUtils.isBlank(worklevel)){ // 空和null
|
||||
return Result.error("任务等级不能为空"); |
||||
} else{ |
||||
Integer level = Integer.valueOf(worklevel); |
||||
if(level<0 || level>6){ |
||||
return Result.error("任务等级不符范围"); |
||||
} |
||||
functionTemplate.setWorkLevel(level); |
||||
} |
||||
if(StringUtils.isBlank(workstatus)){ |
||||
return Result.error("任务状态不能为空"); |
||||
} else { |
||||
// 预制值:未发布0、已发布1、开发中2、已完成3、已审核4、DEBUG9;默认0
|
||||
type=10; |
||||
switch (workstatus){ |
||||
case "未发布": type=0; break; |
||||
case "已发布": type=1; break; |
||||
case "开发中": type=2; break; |
||||
case "已完成": type=3; break; |
||||
case "已审核": type=4; break; |
||||
case "DEBUG": type=9; break; |
||||
default: return Result.error("任务状态错误"); |
||||
} |
||||
functionTemplate.setWorkStatus(type); |
||||
} |
||||
|
||||
if(StringUtils.isNotBlank(publishtime)){ |
||||
Date date; |
||||
Boolean isTime = checkTime(publishtime); |
||||
if (!isTime){ |
||||
return Result.error("发布日期错误,应为"+pattern+"类型"); |
||||
} |
||||
try { |
||||
date = dateFormat.parse(publishtime); |
||||
} catch (Exception e) { |
||||
return Result.error("发布日期错误,应为"+pattern+"类型"); |
||||
} |
||||
functionTemplate.setPublishTime(date); |
||||
} |
||||
if(StringUtils.isNotBlank(starttime)){ |
||||
Date date; |
||||
Boolean isTime = checkTime(starttime); |
||||
if (!isTime){ |
||||
return Result.error("开始日期错误,应为"+pattern+"类型"); |
||||
} |
||||
try { |
||||
date = dateFormat.parse(starttime); |
||||
} catch (Exception e) { |
||||
return Result.error("开始日期错误,应为"+pattern+"类型"); |
||||
} |
||||
functionTemplate.setPublishTime(date); |
||||
} |
||||
if(StringUtils.isNotBlank(duration)){ |
||||
Double dura = Double.valueOf(duration); |
||||
functionTemplate.setDuration(dura); |
||||
} |
||||
|
||||
functionTemplate.setCreateBy(username); |
||||
functionTemplate.setCreateTime(new Date()); |
||||
|
||||
listInsert.add(functionTemplate); |
||||
} |
||||
|
||||
// -------------------------------校验结束--------------------------------------
|
||||
boolean isSuccess = functionTemplateService.saveBatch(listInsert); |
||||
if(!isSuccess){ |
||||
return Result.OK("插入失败"); |
||||
} |
||||
|
||||
return Result.OK("插入成功"); |
||||
} |
||||
|
||||
/** |
||||
* 检查时间格式,是否有效 |
||||
*/ |
||||
private Boolean checkTime(String date){ |
||||
// 使用日期解析方式校验日期逻辑有效性
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
||||
try { |
||||
Date parsedDate = dateFormat.parse(date); |
||||
// 检查年份是否合法(例如:不能小于1900)
|
||||
Calendar calendar = Calendar.getInstance(); |
||||
calendar.setTime(parsedDate); |
||||
int year = calendar.get(Calendar.YEAR); |
||||
if (year < 1900) { |
||||
return false; |
||||
} |
||||
|
||||
// 检查日期的逻辑有效性(例如:2月30日是无效的)
|
||||
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); |
||||
int month = calendar.get(Calendar.MONTH) + 1; |
||||
|
||||
int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); |
||||
if (dayOfMonth > maxDayOfMonth) { |
||||
return false; |
||||
} |
||||
} catch (Exception e) { |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,127 @@ |
||||
package org.jeecg.modules.demo.functionx.entity; |
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField; |
||||
import com.baomidou.mybatisplus.annotation.TableId; |
||||
import com.baomidou.mybatisplus.annotation.TableName; |
||||
import lombok.Data; |
||||
|
||||
import java.io.Serializable; |
||||
import java.util.Date; |
||||
|
||||
/** |
||||
* |
||||
* @TableName functionx_test |
||||
*/ |
||||
@TableName(value ="functionx_test") |
||||
@Data |
||||
public class FunctionxTest implements Serializable { |
||||
/** |
||||
* |
||||
*/ |
||||
@TableId |
||||
private String id; |
||||
|
||||
|
||||
/** |
||||
* 对应模块 |
||||
*/ |
||||
private String moduleName; |
||||
|
||||
/** |
||||
* 中文名称 |
||||
*/ |
||||
private String functionName; |
||||
|
||||
/** |
||||
* 英文名称 |
||||
*/ |
||||
private String functionEnName; |
||||
|
||||
/** |
||||
* 功能编码 |
||||
*/ |
||||
private String functionCode; |
||||
|
||||
/** |
||||
* 功能类型 |
||||
*/ |
||||
private String functionType; |
||||
|
||||
/** |
||||
* 功能描述 |
||||
*/ |
||||
private String pmDescribe; |
||||
|
||||
/** |
||||
* 分析图 |
||||
*/ |
||||
private String diagrams; |
||||
|
||||
/** |
||||
* 用户角色 |
||||
*/ |
||||
private String userRole; |
||||
|
||||
/** |
||||
* 责任人 |
||||
*/ |
||||
private String managerUsers; |
||||
|
||||
/** |
||||
* 任务等级 |
||||
*/ |
||||
private String workLevel; |
||||
|
||||
/** |
||||
* 任务状态 |
||||
*/ |
||||
private String workStatus; |
||||
|
||||
/** |
||||
* 发布时间 |
||||
*/ |
||||
private String publishTime; |
||||
|
||||
/** |
||||
* 开始时间 |
||||
*/ |
||||
private String startTime; |
||||
|
||||
/** |
||||
* 任务时长 |
||||
*/ |
||||
private String duration; |
||||
|
||||
/** |
||||
* 提交时间 |
||||
*/ |
||||
private String submitTime; |
||||
|
||||
/** |
||||
* 实际时长 |
||||
*/ |
||||
private String realDuration; |
||||
|
||||
/** |
||||
* 功能状态 |
||||
*/ |
||||
private String status; |
||||
|
||||
/** |
||||
* 版本状态 |
||||
*/ |
||||
private String verisonStatus; |
||||
|
||||
/** |
||||
* 版本号 |
||||
*/ |
||||
private String verison; |
||||
|
||||
/** |
||||
* 创建人 |
||||
*/ |
||||
private String creatName; |
||||
|
||||
@TableField(exist = false) |
||||
private static final long serialVersionUID = 1L; |
||||
} |
@ -0,0 +1,8 @@ |
||||
package org.jeecg.modules.demo.functionx.mapper; |
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
import org.apache.ibatis.annotations.Mapper; |
||||
import org.jeecg.modules.demo.functionx.entity.FunctionxTest; |
||||
@Mapper |
||||
public interface FunctionxTestMapper extends BaseMapper<FunctionxTest> { |
||||
} |
@ -0,0 +1,10 @@ |
||||
package org.jeecg.modules.demo.functionx.service; |
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService; |
||||
import org.jeecg.common.api.vo.Result; |
||||
import org.jeecg.modules.demo.functionx.entity.FunctionxTest; |
||||
import org.springframework.web.multipart.MultipartFile; |
||||
|
||||
public interface FunctionXTestService extends IService<FunctionxTest> { |
||||
Result<?> importExcel(MultipartFile file); |
||||
} |
@ -0,0 +1,411 @@ |
||||
package org.jeecg.modules.demo.functionx.service.impl; |
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils; |
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook; |
||||
import org.apache.poi.ss.usermodel.Cell; |
||||
import org.apache.poi.ss.usermodel.Row; |
||||
import org.apache.poi.ss.usermodel.Sheet; |
||||
import org.apache.poi.ss.usermodel.Workbook; |
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook; |
||||
import org.apache.shiro.SecurityUtils; |
||||
import org.jeecg.common.api.vo.Result; |
||||
import org.jeecg.common.system.vo.LoginUser; |
||||
import org.jeecg.modules.demo.functionx.entity.Functionx; |
||||
import org.jeecg.modules.demo.functionx.entity.FunctionxTest; |
||||
import org.jeecg.modules.demo.functionx.mapper.FunctionxTestMapper; |
||||
import org.jeecg.modules.demo.functionx.service.FunctionXTestService; |
||||
import org.jeecg.modules.demo.functionx.service.IFunctionxService; |
||||
import org.jeecg.modules.modulex.entity.Modulex; |
||||
import org.jeecg.modules.modulex.service.IModulexService; |
||||
import org.jeecg.modules.projectUserRole.entity.ProjectUserRole; |
||||
import org.jeecg.modules.projectUserRole.service.IProjectUserRoleService; |
||||
import org.jeecg.modules.system.entity.SysUser; |
||||
import org.jeecg.modules.system.service.ISysUserService; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.stereotype.Service; |
||||
import org.springframework.web.multipart.MultipartFile; |
||||
|
||||
import java.io.IOException; |
||||
import java.text.SimpleDateFormat; |
||||
import java.util.ArrayList; |
||||
import java.util.Calendar; |
||||
import java.util.Date; |
||||
import java.util.List; |
||||
|
||||
@Service |
||||
public class FunctionXTestServiceImpl extends ServiceImpl<FunctionxTestMapper, FunctionxTest> implements FunctionXTestService { |
||||
|
||||
@Autowired |
||||
private IModulexService modulexService; |
||||
@Autowired |
||||
private IFunctionxService functionxService; |
||||
@Autowired |
||||
private IProjectUserRoleService projectUserRoleService; |
||||
@Autowired |
||||
private ISysUserService sysUserService; |
||||
|
||||
@Override |
||||
public Result<?> importExcel(MultipartFile file) { |
||||
|
||||
// 获取当前操作用户
|
||||
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); |
||||
String username = loginUser.getUsername(); |
||||
|
||||
//创建输出流对象
|
||||
Workbook wb; |
||||
/*判断文件是xlsx结尾还是xls结尾 声明XSSF或HSSF对象*/ |
||||
|
||||
String[] split = file.getOriginalFilename().split("\\."); |
||||
|
||||
try { |
||||
if(split[1].equals("xlsx")){ |
||||
wb= new XSSFWorkbook(file.getInputStream()); |
||||
}else if(split[1].equals("xls")){ |
||||
wb= new HSSFWorkbook(file.getInputStream()); |
||||
} else { |
||||
return Result.error("文件格式错误,请上传Excel文件"); |
||||
} |
||||
} catch (IOException e) { |
||||
return Result.error("请上传正确格式文件"); |
||||
} |
||||
|
||||
|
||||
//获取工作表页数据
|
||||
//读取第1页的数据
|
||||
Sheet sheet=wb.getSheetAt(0); |
||||
//获取工作表页中行数据
|
||||
//读取的总的行数
|
||||
int lastRowIndex=sheet.getLastRowNum(); |
||||
if(lastRowIndex < 1) { |
||||
return Result.error("文件无内容或格式错误"); |
||||
} |
||||
|
||||
List<FunctionxTest> listVo = new ArrayList<>(); |
||||
for (int i=1;i<=lastRowIndex;i++) { |
||||
Row row = sheet.getRow(i); // 行
|
||||
if(row!=null){ |
||||
short lastCellNum = row.getLastCellNum(); |
||||
List<String> list = new ArrayList<>(); |
||||
for (int j=0;j<lastCellNum;j++){ |
||||
Cell cell = row.getCell(j); // 单元格
|
||||
String cellValue = cell.getStringCellValue(); |
||||
list.add(cellValue); |
||||
} |
||||
//------------接收-------------
|
||||
FunctionxTest fun = new FunctionxTest(); |
||||
fun.setModuleName(list.get(0)); // 对应模块
|
||||
fun.setFunctionName(list.get(1)); // 中文名称
|
||||
fun.setFunctionEnName(list.get(2)); // 英文名称
|
||||
fun.setFunctionCode(list.get(3)); // 功能编码
|
||||
fun.setFunctionType(list.get(4)); // 功能类型
|
||||
fun.setPmDescribe(list.get(5)); // 功能描述
|
||||
fun.setDiagrams(list.get(6)); // 分析图
|
||||
fun.setUserRole(list.get(7)); // 用户角色
|
||||
fun.setManagerUsers(list.get(8)); // 责任人
|
||||
fun.setWorkLevel(list.get(9)); // 任务等级
|
||||
fun.setWorkStatus(list.get(10)); // 任务状态
|
||||
fun.setPublishTime(list.get(11)); // 发布时间
|
||||
fun.setStartTime(list.get(12)); // 开始时间
|
||||
fun.setDuration(list.get(13)); // 任务时长
|
||||
fun.setSubmitTime(list.get(14)); // 提交时间
|
||||
fun.setRealDuration(list.get(15)); // 实际时长
|
||||
fun.setStatus(list.get(16)); // 功能状态
|
||||
fun.setVerisonStatus(list.get(17)); // 版本状态
|
||||
fun.setVerison(list.get(18)); // 版本号
|
||||
fun.setCreatName(username); |
||||
|
||||
listVo.add(fun); |
||||
} |
||||
} |
||||
boolean isSuccessSave = this.saveBatch(listVo); |
||||
if (!isSuccessSave){ |
||||
return Result.error("文件读入失败"); |
||||
} |
||||
|
||||
//************************具体字段校验******************************
|
||||
LambdaQueryWrapper<FunctionxTest> queryWrapper = new LambdaQueryWrapper<>(); |
||||
queryWrapper.eq(username!=null, FunctionxTest::getCreatName,username); |
||||
List<FunctionxTest> list = this.list(queryWrapper); |
||||
|
||||
|
||||
boolean remove = this.remove(queryWrapper); |
||||
if (!remove){ |
||||
log.error("临时表删除错误!"); |
||||
} |
||||
|
||||
// 对应模块校验
|
||||
List<Modulex> modulexList = modulexService.list(); |
||||
|
||||
List<Functionx> listInsert = new ArrayList<>(); // 正式插入
|
||||
String pattern = "yyyy-MM-dd HH:mm:ss"; |
||||
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); |
||||
|
||||
for(FunctionxTest function : list){ |
||||
Functionx functionx = new Functionx(); |
||||
String moduleId = function.getModuleName(); |
||||
String functionName = function.getFunctionName(); |
||||
String functionEnName = function.getFunctionEnName(); |
||||
String functionCode = function.getFunctionCode(); |
||||
String functionType = function.getFunctionType(); |
||||
String pmDescribe = function.getPmDescribe(); |
||||
String diagrams = function.getDiagrams(); |
||||
String userRole = function.getUserRole(); |
||||
String managerUsers = function.getManagerUsers(); |
||||
String workLevel = function.getWorkLevel(); |
||||
String workStatus = function.getWorkStatus(); |
||||
String publishTime = function.getPublishTime(); |
||||
String startTime = function.getStartTime(); |
||||
String duration = function.getDuration(); |
||||
String submitTime = function.getSubmitTime(); |
||||
String realDuration = function.getRealDuration(); |
||||
String status = function.getStatus(); |
||||
String verisonStatus = function.getVerisonStatus(); |
||||
String verison = function.getVerison(); |
||||
|
||||
|
||||
String moduleName=""; // 模块编码
|
||||
functionx.setCreateBy(username); //创建人
|
||||
functionx.setCreateTime(new Date()); //创建日期
|
||||
if(StringUtils.isBlank(moduleId)){ // 空和null
|
||||
return Result.error("对应模块不能为空"); |
||||
} else{ |
||||
for(Modulex modulex : modulexList){ |
||||
if (modulex.getModuleName().equals(moduleId)){ |
||||
functionx.setModuleId(modulex.getId()); |
||||
moduleId = modulex.getId(); |
||||
moduleName=modulex.getModuleName(); |
||||
break; |
||||
} |
||||
} |
||||
if(functionx.getModuleId() == null){ |
||||
return Result.error("请输入正确的对应模块"); |
||||
} |
||||
} |
||||
|
||||
if(StringUtils.isBlank(functionName)){ // 空和null
|
||||
return Result.error("中文名称不能为空"); |
||||
} else{ |
||||
LambdaQueryWrapper<Functionx> queryWrapper1 = new LambdaQueryWrapper<>(); |
||||
queryWrapper1.eq(moduleId!=null,Functionx::getModuleId,moduleId); |
||||
queryWrapper1.eq(Functionx::getFunctionName,functionName); |
||||
int count = functionxService.count(queryWrapper1); |
||||
if(count>0) |
||||
return Result.error("中文名称在模块下重复"); |
||||
functionx.setFunctionName(functionName); |
||||
} |
||||
if(StringUtils.isBlank(functionEnName)){ // 空和null
|
||||
return Result.error("英文名称不能为空"); |
||||
} else{ |
||||
LambdaQueryWrapper<Functionx> queryWrapper2 = new LambdaQueryWrapper<>(); |
||||
queryWrapper2.eq(moduleId!=null,Functionx::getModuleId,moduleId); |
||||
queryWrapper2.eq(Functionx::getFunctionEnName,functionEnName); |
||||
int count = functionxService.count(queryWrapper2); |
||||
if(count>0) |
||||
return Result.error("英文名称在模块下重复"); |
||||
functionx.setFunctionEnName(functionEnName); |
||||
} |
||||
// 列表0、增加1、删除2、修改3、查看4、导入5、导出6、其它99;默认99
|
||||
int type; |
||||
if(StringUtils.isBlank(functionType)){ // 空和null
|
||||
return Result.error("功能类型不能为空"); |
||||
} else{ |
||||
switch (functionType){ |
||||
case "列表": type=0; break; |
||||
case "新增": type=1; break; |
||||
case "删除": type=2; break; |
||||
case "修改": type=3; break; |
||||
case "查看": type=4; break; |
||||
case "导入": type=5; break; |
||||
case "导出": type=6; break; |
||||
case "其它": type=99; break; |
||||
default: return Result.error("功能类型错误"); |
||||
} |
||||
functionx.setFunctionType(type); |
||||
} |
||||
// 模块编码+功能缩写;自动填充+手动修改
|
||||
if(StringUtils.isBlank(functionCode)){ // 空和null
|
||||
return Result.error("功能编码不能为空"); |
||||
} else{ |
||||
String str = moduleName+functionType; |
||||
if(!str.equals(functionCode)) |
||||
return Result.error("功能编码错误"); |
||||
functionx.setFunctionCode(functionCode); |
||||
} |
||||
|
||||
if(StringUtils.isNotBlank(pmDescribe)){ // 功能描述
|
||||
functionx.setPmDescribe(pmDescribe); |
||||
} |
||||
if(StringUtils.isNotBlank(diagrams)){ // 分析图
|
||||
functionx.setDiagrams(diagrams); |
||||
} |
||||
if(StringUtils.isNotBlank(userRole)){ // 用户角色
|
||||
LambdaQueryWrapper<ProjectUserRole> queryWrapperUser = new LambdaQueryWrapper<>(); |
||||
queryWrapperUser.eq(ProjectUserRole::getUserRole,userRole); // 是否匹配项目id?
|
||||
int count = projectUserRoleService.count(queryWrapperUser); |
||||
if(count>0) |
||||
functionx.setUserRole(userRole); |
||||
else |
||||
return Result.error("请输入正确的用户角色"); |
||||
} |
||||
if(StringUtils.isNotBlank(managerUsers)){ // 责任人
|
||||
LambdaQueryWrapper<SysUser> queryWrapperUserName = new LambdaQueryWrapper<>(); |
||||
queryWrapperUserName.eq(SysUser::getUsername,managerUsers); |
||||
int count = sysUserService.count(queryWrapperUserName); |
||||
if(count>0) |
||||
functionx.setManagerUsers(managerUsers); |
||||
else |
||||
return Result.error("请输入正确的责任人"); |
||||
} |
||||
// 值:1、2、3、4、5,默认2
|
||||
if(StringUtils.isBlank(workLevel)){ // 任务等级
|
||||
return Result.error("任务等级不能为空"); |
||||
} else{ |
||||
int integer = Integer.parseInt(workLevel); |
||||
if (integer<1 || integer>5){ |
||||
return Result.error("任务等级错误"); |
||||
} |
||||
functionx.setWorkLevel(integer); |
||||
} |
||||
|
||||
if(StringUtils.isBlank(workStatus)){ |
||||
return Result.error("任务状态不能为空"); |
||||
} else { |
||||
// 值:未发布0、已发布1、开发中2、已完成3、已撤回4、已取消9;默认0
|
||||
switch (workStatus){ |
||||
case "未发布": type=0; break; |
||||
case "已发布": type=1; break; |
||||
case "开发中": type=2; break; |
||||
case "已完成": type=3; break; |
||||
case "已撤回": type=4; break; |
||||
case "已取消": type=9; break; |
||||
default: return Result.error("任务状态错误"); |
||||
} |
||||
functionx.setWorkStatus(type); |
||||
} |
||||
|
||||
if(StringUtils.isNotBlank(publishTime)){ |
||||
Date date; |
||||
Boolean isTime = checkTime(publishTime); |
||||
if (!isTime){ |
||||
return Result.error("发布时间错误,应为"+pattern+"类型"); |
||||
} |
||||
try { |
||||
date = dateFormat.parse(publishTime); |
||||
} catch (Exception e) { |
||||
return Result.error("发布时间错误,应为"+pattern+"类型"); |
||||
} |
||||
functionx.setPublishTime(date); |
||||
} |
||||
|
||||
if(StringUtils.isNotBlank(startTime)){ |
||||
Date date; |
||||
Boolean isTime = checkTime(startTime); |
||||
if (!isTime){ |
||||
return Result.error("开始时间错误,应为"+pattern+"类型"); |
||||
} |
||||
try { |
||||
date = dateFormat.parse(startTime); |
||||
} catch (Exception e) { |
||||
return Result.error("开始时间错误,应为"+pattern+"类型"); |
||||
} |
||||
functionx.setStartTime(date); |
||||
} |
||||
|
||||
if(StringUtils.isNotBlank(duration)){ |
||||
Double aDouble = Double.valueOf(duration); |
||||
functionx.setDuration(aDouble); |
||||
} |
||||
|
||||
if(StringUtils.isNotBlank(submitTime)){ |
||||
Date date; |
||||
Boolean isTime = checkTime(submitTime); |
||||
if (!isTime){ |
||||
return Result.error("提交时间时间错误,应为"+pattern+"类型"); |
||||
} |
||||
try { |
||||
date = dateFormat.parse(submitTime); |
||||
} catch (Exception e) { |
||||
return Result.error("提交时间时间错误,应为"+pattern+"类型"); |
||||
} |
||||
functionx.setSubmitTime(date); |
||||
} |
||||
if(StringUtils.isNotBlank(realDuration)){ |
||||
Double aDouble = Double.valueOf(realDuration); |
||||
if (aDouble<0.1) |
||||
return Result.error("实际时长错误"); |
||||
functionx.setDuration(aDouble); |
||||
} |
||||
if(StringUtils.isBlank(status)){ // 空和null
|
||||
return Result.error("功能状态不能为空"); |
||||
} else{ |
||||
// 值:正常1、停用0、废弃9;默认1
|
||||
switch (status){ |
||||
case "正常": type=1; break; |
||||
case "停用": type=0; break; |
||||
case "废弃": type=9; break; |
||||
default: return Result.error("任务状态错误"); |
||||
} |
||||
functionx.setStatus(type); |
||||
} |
||||
if(StringUtils.isBlank(verisonStatus)){ // 空和null
|
||||
return Result.error("版本状态不能为空"); |
||||
} else{ |
||||
// 值:当前1、历史0;默认1
|
||||
switch (verisonStatus){ |
||||
case "当前": type=1; break; |
||||
case "历史": type=0; break; |
||||
default: return Result.error("版本状态错误"); |
||||
} |
||||
functionx.setStatus(type); |
||||
} |
||||
if(StringUtils.isBlank(verison)){ // 空和null
|
||||
return Result.error("版本号不能为空"); |
||||
} else{ |
||||
Integer integer = Integer.valueOf(verison); |
||||
functionx.setStatus(integer); |
||||
} |
||||
|
||||
listInsert.add(functionx); |
||||
} |
||||
|
||||
//**************************校验结束******************************
|
||||
boolean isSuccessInsert = functionxService.saveBatch(listInsert); |
||||
if(!isSuccessInsert){ |
||||
return Result.OK("插入失败"); |
||||
} |
||||
|
||||
return Result.OK("插入成功"); |
||||
} |
||||
|
||||
/** |
||||
* 检查时间格式,是否有效 |
||||
*/ |
||||
private Boolean checkTime(String date){ |
||||
// 使用日期解析方式校验日期逻辑有效性
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
||||
try { |
||||
Date parsedDate = dateFormat.parse(date); |
||||
// 检查年份是否合法(例如:不能小于1900)
|
||||
Calendar calendar = Calendar.getInstance(); |
||||
calendar.setTime(parsedDate); |
||||
int year = calendar.get(Calendar.YEAR); |
||||
if (year < 1900) { |
||||
return false; |
||||
} |
||||
|
||||
// 检查日期的逻辑有效性(例如:2月30日是无效的)
|
||||
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); |
||||
|
||||
int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); |
||||
if (dayOfMonth > maxDayOfMonth) { |
||||
return false; |
||||
} |
||||
} catch (Exception e) { |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue