学员学籍异动申请新增报错

This commit is contained in:
2026-09-20 14:45:19 +08:00
parent a566a26fec
commit 5e3bee9c5f
5 changed files with 280 additions and 201 deletions
@@ -2,6 +2,8 @@ package com.roomroot.web.controller.jwgl;
import com.roomroot.common.exception.ServiceException; import com.roomroot.common.exception.ServiceException;
import com.roomroot.common.utils.file.FileUtils; import com.roomroot.common.utils.file.FileUtils;
import com.roomroot.jwgl.service.TeachingMaterialService;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;
@@ -23,6 +25,9 @@ public class DownloadController {
private static final String TEMPLATE_DIR = "file/"; private static final String TEMPLATE_DIR = "file/";
@Resource
private TeachingMaterialService teachingMaterialService;
/** /**
* 人才培养方案课程数据文件模板 * 人才培养方案课程数据文件模板
*/ */
@@ -56,11 +61,11 @@ public class DownloadController {
} }
/** /**
* 教材管理模板 * 教材管理模板(动态生成,与 /teachingMaterial/template 一致)
*/ */
@GetMapping("/teaching-material") @GetMapping("/teaching-material")
public void downloadTeachingMaterial(HttpServletResponse response) throws IOException { public void downloadTeachingMaterial(HttpServletResponse response) {
downloadTemplate(response, "教材管理.xls"); teachingMaterialService.downloadTemplate(response);
} }
/** /**
@@ -2,6 +2,8 @@ package com.roomroot.jwgl.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.roomroot.common.exception.ServiceException;
import com.roomroot.common.utils.file.FileUtils;
import com.roomroot.jwgl.entity.JCXX; import com.roomroot.jwgl.entity.JCXX;
import com.roomroot.jwgl.mapper.TeachingMaterialMapper; import com.roomroot.jwgl.mapper.TeachingMaterialMapper;
import com.roomroot.jwgl.service.TeachingMaterialService; import com.roomroot.jwgl.service.TeachingMaterialService;
@@ -11,19 +13,24 @@ import com.roomroot.jwgl.utils.DateUtils;
import com.roomroot.jwgl.utils.UuidUtil; import com.roomroot.jwgl.utils.UuidUtil;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
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.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.net.URLEncoder;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List; import java.util.List;
/** /**
@@ -43,7 +50,7 @@ public class TeachingMaterialServiceImpl implements TeachingMaterialService {
jcxx.setCjsj(LocalDateTime.now()); jcxx.setCjsj(LocalDateTime.now());
jcxx.setXgsj(LocalDateTime.now()); jcxx.setXgsj(LocalDateTime.now());
String nextNum = getNextNumber(); String nextNum = getNextNumber();
nextNum = getNextZeroFillCode(nextNum,4); nextNum = getNextZeroFillCode(nextNum, 4);
jcxx.setBh(nextNum); jcxx.setBh(nextNum);
teachingMaterialMapper.insert(jcxx); teachingMaterialMapper.insert(jcxx);
} }
@@ -104,234 +111,205 @@ public class TeachingMaterialServiceImpl implements TeachingMaterialService {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public int importExcel(MultipartFile file) { public int importExcel(MultipartFile file) {
if (file == null || file.isEmpty()) {
throw new ServiceException("导入文件不能为空");
}
String filename = file.getOriginalFilename() == null ? "" : file.getOriginalFilename().toLowerCase();
try (InputStream is = file.getInputStream(); try (InputStream is = file.getInputStream();
Workbook workbook = file.getOriginalFilename().endsWith(".xlsx") Workbook workbook = filename.endsWith(".xlsx") ? new XSSFWorkbook(is) : new HSSFWorkbook(is)) {
? new XSSFWorkbook(is) : new HSSFWorkbook(is)) {
// 获取教材信息sheet
Sheet sheet = workbook.getSheet("教材信息"); Sheet sheet = workbook.getSheet("教材信息");
if (sheet == null) { if (sheet == null) {
sheet = workbook.getSheetAt(0); sheet = workbook.getSheetAt(0);
} }
int count = 0; int count = 0;
// 在循环外获取起始编号
String nextNum = getNextNumber(); String nextNum = getNextNumber();
// 从第二行开始读取数据(跳过表头)
for (int i = 1; i <= sheet.getLastRowNum(); i++) { for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i); Row row = sheet.getRow(i);
if (row == null) continue; if (row == null) {
continue;
//获取编号 }
// 跳过空行 String mc = nvl(getCellValue(row, 3));
String bh = getCellValue(row, 0); if (mc.isEmpty()) {
continue;
JCXX jcxx = getByBh(bh); }
String flag = "0"; String bh = nvl(getCellValue(row, 0));
if(jcxx == null){ JCXX jcxx = bh.isEmpty() ? null : getByBh(bh);
boolean insert = jcxx == null;
if (insert) {
jcxx = new JCXX(); jcxx = new JCXX();
jcxx.setId(UuidUtil.getUUID()); jcxx.setId(UuidUtil.getUUID());
jcxx.setDelFlag(0); jcxx.setDelFlag(0);
jcxx.setCjsj(LocalDateTime.now()); jcxx.setCjsj(LocalDateTime.now());
// 生成编号(数字字符串) if (bh.isEmpty()) {
jcxx.setBh(bh == null?String.valueOf(nextNum):bh); jcxx.setBh(getNextZeroFillCode(nextNum, 4));
nextNum = getNextZeroFillCode(nextNum,4); nextNum = jcxx.getBh();
flag = "1"; } else {
jcxx.setBh(bh);
}
jcxx.setSdsl(0);
jcxx.setJcsl(0);
jcxx.setKcsj(0);
} }
jcxx.setXgsj(LocalDateTime.now()); jcxx.setXgsj(LocalDateTime.now());
jcxx.setJysdh(blankToNull(getCellValue(row, 1)));
// 教研室 jcxx.setJcdm(blankToNull(getCellValue(row, 2)));
jcxx.setJysdh(getCellValue(row, 1));
// 教材代码
jcxx.setJcdm(getCellValue(row, 2));
// 跳过空行
String mc = getCellValue(row, 3);
if (mc == null || mc.isEmpty()) continue;
// 名称
jcxx.setMc(mc); jcxx.setMc(mc);
jcxx.setIsbn(blankToNull(getCellValue(row, 4)));
// ISBN jcxx.setCbs(blankToNull(getCellValue(row, 5)));
jcxx.setIsbn(getCellValue(row, 4)); jcxx.setBc(blankToNull(getCellValue(row, 6)));
jcxx.setKb(blankToNull(getCellValue(row, 7)));
// 出版社 jcxx.setZz(joinAuthors(getCellValue(row, 8), getCellValue(row, 9), getCellValue(row, 10)));
jcxx.setCbs(getCellValue(row, 5)); jcxx.setDj(parseDecimal(getCellValue(row, 11)));
jcxx.setJcfl(blankToNull(getCellValue(row, 12)));
// 版次 jcxx.setJclx(blankToNull(getCellValue(row, 13)));
jcxx.setBc(getCellValue(row, 6)); String jcbxlx = nvl(getCellValue(row, 14));
if (jcbxlx.isEmpty()) {
// 开本 jcbxlx = nvl(getCellValue(row, 15));
jcxx.setKb(getCellValue(row, 7));
// 作者
//主编
String zb = getCellValue(row, 8) == null ? "" : getCellValue(row, 8);
//副主编
String fzb = getCellValue(row, 9) == null ? "" : getCellValue(row, 9);
//编者
String bz = getCellValue(row, 10)==null?"":getCellValue(row, 10);
jcxx.setZz(zb+" "+fzb+" "+bz);
// 定价
String djStr = getCellValue(row, 11);
if (djStr != null && !djStr.isEmpty()) {
try {
jcxx.setDj(new BigDecimal(djStr));
} catch (NumberFormatException e) {
jcxx.setDj(BigDecimal.ZERO);
}
} }
jcxx.setJcbxlx(blankToNull(jcbxlx));
jcxx.setJcmj(blankToNull(getCellValue(row, 16)));
jcxx.setBxdw(blankToNull(getCellValue(row, 17)));
String teacher = nvl(getCellValue(row, 18));
if (teacher.isEmpty()) {
teacher = nvl(getCellValue(row, 28));
}
jcxx.setZrjyjlxff(blankToNull(teacher));
jcxx.setJczdlx(blankToNull(getCellValue(row, 19)));
jcxx.setJccc(blankToNull(getCellValue(row, 20)));
jcxx.setJcly(blankToNull(getCellValue(row, 21)));
jcxx.setCbfs(blankToNull(getCellValue(row, 22)));
jcxx.setJldw(blankToNull(getCellValue(row, 23)));
jcxx.setCbrq(DateUtils.parseAnyDate(nvl(getCellValue(row, 24))));
jcxx.setZblxrq(DateUtils.parseAnyDate(nvl(getCellValue(row, 25))));
jcxx.setXqk(blankToNull(getCellValue(row, 26)));
jcxx.setBfsddw(blankToNull(getCellValue(row, 27)));
jcxx.setXcy(parseBool(getCellValue(row, 29), false));
jcxx.setBz(blankToNull(getCellValue(row, 31)));
jcxx.setTy(parseBool(getCellValue(row, 32), false));
fillRequiredDefaults(jcxx);
// 教材分类 if (insert) {
jcxx.setJcfl(getCellValue(row, 12));
// 教材类型
jcxx.setJclx(getCellValue(row, 13));
// 教材编写类型
jcxx.setJcbxlx(getCellValue(row, 14));
//教材编写类型
jcxx.setJcbxlx(getCellValue(row, 15)==null?"":getCellValue(row, 15));
//教材密级
jcxx.setJcmj(getCellValue(row, 16)==null?"":getCellValue(row, 16));
//编写单位
jcxx.setBxdw(getCellValue(row, 17)==null?"":getCellValue(row, 17));
//责任教研室
jcxx.setZrjyjlxff(getCellValue(row, 18)==null?"":getCellValue(row, 18));
//教材重点类型
jcxx.setJczdlx(getCellValue(row, 19)==null?"":getCellValue(row, 19));
//教材层次
jcxx.setJccc(getCellValue(row, 20)==null?"":getCellValue(row, 20));
//教材来源
jcxx.setJcly(getCellValue(row, 21)==null?"":getCellValue(row, 21));
//出版方式
jcxx.setCbfs(getCellValue(row, 22)==null?"":getCellValue(row, 22));
//计量单位
jcxx.setJldw(getCellValue(row, 23)==null?"":getCellValue(row, 23));
//出版日期
String dateStr = getCellValue(row, 24)==null?"":getCellValue(row, 24);
LocalDateTime cbrq = DateUtils.parseAnyDate(dateStr);
jcxx.setCbrq(cbrq);
//自编教材立项日期
jcxx.setJcmj(getCellValue(row, 25)==null?"":getCellValue(row, 25));
//评选情况
jcxx.setJcmj(getCellValue(row, 26)==null?"":getCellValue(row, 26));
//颁发审定单位
jcxx.setJcmj(getCellValue(row, 27)==null?"":getCellValue(row, 27));
//责任教员及联系方式
jcxx.setJcmj(getCellValue(row, 28)==null?"":getCellValue(row, 28));
//需彩印
jcxx.setJcmj(getCellValue(row, 29)==null?"":getCellValue(row, 29));
//外协排版
jcxx.setJcmj(getCellValue(row, 30)==null?"":getCellValue(row, 30));
//备注
jcxx.setJcmj(getCellValue(row, 31)==null?"":getCellValue(row, 31));
//停用
jcxx.setTy(false);
jcxx.setXcy(false);
if("1".equals(flag)){
teachingMaterialMapper.insert(jcxx); teachingMaterialMapper.insert(jcxx);
}else if("0".equals(flag)){ } else {
teachingMaterialMapper.updateById(jcxx); teachingMaterialMapper.updateById(jcxx);
} }
count++; count++;
} }
return count; return count;
} catch (ServiceException e) {
throw e;
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("Excel解析失败: " + e.getMessage(), e); throw new ServiceException("Excel解析失败: " + e.getMessage());
} }
} }
@Override @Override
public void downloadTemplate(HttpServletResponse response) { public void downloadTemplate(HttpServletResponse response) {
try { try (Workbook workbook = new XSSFWorkbook()) {
// 从resources/template目录读取模板文件 CellStyle headerStyle = workbook.createCellStyle();
ClassPathResource resource = new ClassPathResource("file/教材管理.xls"); Font headerFont = workbook.createFont();
InputStream is = resource.getInputStream(); headerFont.setBold(true);
headerStyle.setFont(headerFont);
CellStyle requiredStyle = workbook.createCellStyle();
Font requiredFont = workbook.createFont();
requiredFont.setBold(true);
requiredFont.setColor(IndexedColors.RED.getIndex());
requiredStyle.setFont(requiredFont);
// 设置响应头 String[] headers = {
response.setContentType("application/vnd.ms-excel"); "编号", "教研室代号", "教材代码", "名称*", "ISBN", "出版社", "版次", "开本",
response.setHeader("Content-Disposition", "attachment;filename=" + "主编", "副主编", "编者", "定价", "教材分类", "教材类型", "教材编写类型",
URLEncoder.encode("教材管理导入模板.xls", "UTF-8")); "教材编写类型(备用)", "教材密级", "编写单位", "责任教员及联系方式", "教材重点类型",
"教材层次", "教材来源", "出版方式", "计量单位", "出版日期", "自编立项日期",
// 输出文件 "评选情况", "颁发审定单位", "责任教员及联系方式(备用)", "需彩印", "外协排版(忽略)",
OutputStream os = response.getOutputStream(); "备注", "停用"
byte[] buffer = new byte[1024]; };
int len; Sheet sheet = workbook.createSheet("教材信息");
while ((len = is.read(buffer)) != -1) { Row headerRow = sheet.createRow(0);
os.write(buffer, 0, len); for (int i = 0; i < headers.length; i++) {
Cell cell = headerRow.createCell(i);
cell.setCellValue(headers[i]);
cell.setCellStyle(headers[i].contains("*") ? requiredStyle : headerStyle);
sheet.setColumnWidth(i, 16 * 256);
} }
os.flush(); String[][] samples = {
is.close(); {
os.close(); "", "", "JC-DEMO-001", "高等数学(测试)", "978-7-111-00001-1", "高等教育出版社",
"第3版", "16开", "张三", "李四", "王五", "45.5", "基本教材", "院校自编", "自编",
"", "公开", "数学教研室", "张三 13800000001", "一般教材", "本科", "自购",
"公开出版", "", "2024/08/01", "2023/12/01", "院级优秀", "教务处", "",
"", "", "导入测试样例1", ""
},
{
"", "", "JC-DEMO-002", "大学物理实验(测试)", "978-7-111-00002-8", "科学出版社",
"第2版", "16开", "赵六", "", "", "32", "辅助教材", "国家规划", "选用",
"", "内部", "物理教研室", "赵六 13800000002", "规划教材", "本科", "教研保障中心外购",
"内部出版", "", "2023/03/15", "", "", "", "",
"", "", "导入测试样例2", ""
},
{
"", "", "JC-DEMO-003", "研究生英语阅读(测试)", "978-7-111-00003-5", "外语教学与研究出版社",
"第1版", "32开", "钱七", "孙八", "", "28.8", "参考资料", "军队规划", "选用",
"", "公开", "外语教研室", "钱七 13800000003", "重点教材", "研究生", "上级配发",
"公开出版", "", "2025/01/10", "2024/06/01", "", "训练部", "",
"", "", "导入测试样例3", ""
}
};
for (int r = 0; r < samples.length; r++) {
Row dataRow = sheet.createRow(r + 1);
for (int c = 0; c < samples[r].length; c++) {
dataRow.createCell(c).setCellValue(samples[r][c]);
}
}
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
FileUtils.setAttachmentResponseHeader(response, "教材管理导入模板.xlsx");
workbook.write(response.getOutputStream());
response.getOutputStream().flush();
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("下载模板失败: " + e.getMessage(), e); throw new ServiceException("下载模板失败: " + e.getMessage());
} }
} }
/**
* 获取下一个编号(四位补零)
*/
private String getNextNumber() { private String getNextNumber() {
String maxBh = teachingMaterialMapper.selectMaxBh(); String maxBh = teachingMaterialMapper.selectMaxBh();
String nextNum = "0001";
if (maxBh != null && !maxBh.isEmpty()) { if (maxBh != null && !maxBh.isEmpty()) {
try { return maxBh;
// 去掉前导零后解析
nextNum = maxBh;
} catch (NumberFormatException e) {
nextNum = "0001";
}
} }
return nextNum; return "0000";
} }
/**
* 根据数据库最大补零编号,生成下一个编号
* @param maxZeroCode 数据库查出的最大补零编号,为空则从00001开始
* @param length 固定补零长度,例:5=00001
* @return 下一个补零字符串编号
*/
public static String getNextZeroFillCode(String maxZeroCode, int length) { public static String getNextZeroFillCode(String maxZeroCode, int length) {
int num = 1; int num = 1;
// 数据库有编号则解析+1
if (maxZeroCode != null && maxZeroCode.trim().length() > 0) { if (maxZeroCode != null && maxZeroCode.trim().length() > 0) {
num = Integer.parseInt(maxZeroCode.trim()) + 1; String digits = maxZeroCode.trim().replaceAll("\\D", "");
if (!digits.isEmpty()) {
try {
num = Integer.parseInt(digits) + 1;
} catch (NumberFormatException ignored) {
num = 1;
}
}
} }
// 格式化补零
String format = "%0" + length + "d"; String format = "%0" + length + "d";
return String.format(format, num); return String.format(format, num);
} }
/**
* 获取单元格字符串值
*/
private String getCellValue(Row row, int index) { private String getCellValue(Row row, int index) {
Cell cell = row.getCell(index, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); Cell cell = row.getCell(index, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
if (cell == null) { if (cell == null) {
return null; return null;
} }
CellType type = cell.getCellType(); CellType type = cell.getCellType();
// 处理公式单元格
if (type == CellType.FORMULA) { if (type == CellType.FORMULA) {
type = cell.getCachedFormulaResultType(); type = cell.getCachedFormulaResultType();
} }
switch (type) { switch (type) {
case NUMERIC: case NUMERIC:
// 判断是否是日期格式
if (DateUtil.isCellDateFormatted(cell)) { if (DateUtil.isCellDateFormatted(cell)) {
java.util.Date date = cell.getDateCellValue(); java.util.Date date = cell.getDateCellValue();
if (date != null) { if (date != null) {
@@ -341,12 +319,10 @@ public class TeachingMaterialServiceImpl implements TeachingMaterialService {
return null; return null;
} }
double num = cell.getNumericCellValue(); double num = cell.getNumericCellValue();
// 整数就去掉小数点后多余的 .0
if (num == Math.floor(num)) { if (num == Math.floor(num)) {
return String.valueOf((long) num); return String.valueOf((long) num);
} else {
return String.valueOf(num);
} }
return String.valueOf(num);
case STRING: case STRING:
return cell.getStringCellValue().trim(); return cell.getStringCellValue().trim();
case BOOLEAN: case BOOLEAN:
@@ -356,25 +332,119 @@ public class TeachingMaterialServiceImpl implements TeachingMaterialService {
} }
} }
/** private String nvl(String value) {
* 解析日期时间字符串 return value == null ? "" : value.trim();
*/ }
private LocalDateTime parseDateTime(String dateStr) {
// 尝试多种日期格式 private String blankToNull(String value) {
String[] patterns = { String trimmed = nvl(value);
"yyyy-MM-dd HH:mm:ss", return trimmed.isEmpty() ? null : trimmed;
"yyyy-MM-dd", }
"yyyy/MM/dd",
"yyyy年MM月dd日" private String joinAuthors(String zb, String fzb, String bz) {
}; StringBuilder builder = new StringBuilder();
for (String pattern : patterns) { appendAuthor(builder, zb);
try { appendAuthor(builder, fzb);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); appendAuthor(builder, bz);
return LocalDateTime.parse(dateStr, formatter); return builder.length() == 0 ? null : builder.toString();
} catch (Exception e) { }
// 继续尝试下一个格式
} private void appendAuthor(StringBuilder builder, String part) {
String value = nvl(part);
if (value.isEmpty()) {
return;
} }
return null; if (builder.length() > 0) {
builder.append(' ');
}
builder.append(value);
}
private BigDecimal parseDecimal(String text) {
String value = nvl(text);
if (value.isEmpty()) {
return null;
}
try {
return new BigDecimal(value);
} catch (NumberFormatException e) {
return BigDecimal.ZERO;
}
}
private Boolean parseBool(String text, boolean defaultValue) {
String value = nvl(text);
if (value.isEmpty()) {
return defaultValue;
}
return "1".equals(value) || "".equals(value) || "true".equalsIgnoreCase(value)
|| "Y".equalsIgnoreCase(value);
}
/**
* 教材信息表多列为非空且达梦空串当 NULL。导入缺列时用页面选项的第一项兜底。
*/
private void fillRequiredDefaults(JCXX jcxx) {
if (isBlank(jcxx.getJcbxlx())) {
jcxx.setJcbxlx("自编");
}
if (isBlank(jcxx.getZz())) {
jcxx.setZz("-");
}
if (jcxx.getCbrq() == null) {
jcxx.setCbrq(LocalDateTime.now());
}
if (isBlank(jcxx.getJcfl())) {
jcxx.setJcfl("基本教材");
}
if (isBlank(jcxx.getJclx())) {
jcxx.setJclx("院校自编");
}
if (isBlank(jcxx.getJczdlx())) {
jcxx.setJczdlx("一般教材");
}
if (isBlank(jcxx.getJcly())) {
jcxx.setJcly("自购");
}
if (isBlank(jcxx.getJccc())) {
jcxx.setJccc("");
}
if (isBlank(jcxx.getCbfs())) {
jcxx.setCbfs("内部出版");
}
if (isBlank(jcxx.getKb())) {
jcxx.setKb("-");
}
if (jcxx.getDj() == null) {
jcxx.setDj(BigDecimal.ZERO);
}
if (isBlank(jcxx.getJldw())) {
jcxx.setJldw("");
}
if (isBlank(jcxx.getJcmj())) {
jcxx.setJcmj("公开");
}
if (jcxx.getTy() == null) {
jcxx.setTy(false);
}
if (jcxx.getXcy() == null) {
jcxx.setXcy(false);
}
if (jcxx.getSdsl() == null) {
jcxx.setSdsl(0);
}
if (jcxx.getJcsl() == null) {
jcxx.setJcsl(0);
}
if (jcxx.getKcsj() == null) {
jcxx.setKcsj(0);
}
if (jcxx.getDelFlag() == null) {
jcxx.setDelFlag(0);
}
}
private boolean isBlank(String value) {
return value == null || value.trim().isEmpty();
} }
} }
@@ -61,10 +61,10 @@ export function deleteTeachingMaterial(id) {
}) })
} }
/** 教材导入模板下载 GET /download/teaching-material */ /** 教材导入模板下载 GET /teachingMaterial/template */
export function downloadTeachingMaterialTemplate() { export function downloadTeachingMaterialTemplate() {
return request({ return request({
url: '/download/teaching-material', url: '/teachingMaterial/template',
method: 'get', method: 'get',
responseType: 'blob' responseType: 'blob'
}) })
@@ -590,7 +590,7 @@ export default {
const pad = n => String(n).padStart(2, '0') const pad = n => String(n).padStart(2, '0')
const date = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}` const date = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`
const time = `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}` const time = `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`
return `${date} ${time}` return `${date}T${time}`
}, },
handleSubmit(row) { handleSubmit(row) {
+5 -1
View File
@@ -1125,7 +1125,11 @@ export default {
// ==================== 模板下载 / 导入 ==================== // ==================== 模板下载 / 导入 ====================
handleDownloadTemplate() { handleDownloadTemplate() {
downloadTeachingMaterialTemplate().then(blob => { downloadTeachingMaterialTemplate().then(blob => {
saveAs(blob, '教材管理导入模板.xls') if (blob && blob.type && blob.type.indexOf('json') !== -1) {
this.$message.error('模板下载失败')
return
}
saveAs(blob, '教材管理导入模板.xlsx')
this.$message.success('模板下载成功') this.$message.success('模板下载成功')
}).catch(() => {}) }).catch(() => {})
}, },