|
@@ -3,10 +3,14 @@ package com.qmth.exam.reserve.service.impl;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.qmth.boot.core.collection.PageResult;
|
|
|
import com.qmth.boot.core.exception.StatusException;
|
|
|
+import com.qmth.boot.tools.excel.ExcelReader;
|
|
|
+import com.qmth.boot.tools.excel.enums.ExcelType;
|
|
|
+import com.qmth.boot.tools.excel.model.DataMap;
|
|
|
import com.qmth.exam.reserve.bean.applytask.CurrentApplyTaskVO;
|
|
|
import com.qmth.exam.reserve.bean.category.CategoryCacheBean;
|
|
|
import com.qmth.exam.reserve.bean.category.CategoryInfo;
|
|
@@ -21,6 +25,7 @@ import com.qmth.exam.reserve.cache.impl.CategoryCacheService;
|
|
|
import com.qmth.exam.reserve.dao.CategoryDao;
|
|
|
import com.qmth.exam.reserve.entity.CategoryEntity;
|
|
|
import com.qmth.exam.reserve.enums.CategoryLevel;
|
|
|
+import com.qmth.exam.reserve.enums.ImportStatus;
|
|
|
import com.qmth.exam.reserve.enums.Role;
|
|
|
import com.qmth.exam.reserve.service.CategoryService;
|
|
|
import com.qmth.exam.reserve.util.PageUtil;
|
|
@@ -29,15 +34,17 @@ import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@Service
|
|
|
public class CategoryServiceImpl extends ServiceImpl<CategoryDao, CategoryEntity> implements CategoryService {
|
|
|
|
|
|
+ private static final String[] EXCEL_HEADER = new String[]{"教学点代码", "教学点名称", "教学点所在城市"};
|
|
|
+
|
|
|
@Autowired
|
|
|
private ApplyTaskCacheService applyTaskCacheService;
|
|
|
|
|
@@ -187,7 +194,7 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryDao, CategoryEntity
|
|
|
|
|
|
@Override
|
|
|
public PageResult<TeachingVO> page(TeachingReq req) {
|
|
|
- if(req.getLevel() == null){
|
|
|
+ if (req.getLevel() == null) {
|
|
|
req.setLevel(CategoryLevel.TEACHING.getValue());
|
|
|
}
|
|
|
IPage<TeachingVO> iPage = baseMapper.page(new Page<>(req.getPageNumber(), req.getPageSize()),
|
|
@@ -207,24 +214,159 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryDao, CategoryEntity
|
|
|
saveOrUpdate(category);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void enable(Long id, Boolean enable) {
|
|
|
+ CategoryEntity category = getById(id);
|
|
|
+ category.setEnable(enable);
|
|
|
+ updateById(category);
|
|
|
+ }
|
|
|
+
|
|
|
private void checkTeaching(TeachingSaveReq req) {
|
|
|
- if(StringUtils.isBlank(req.getCode())) {
|
|
|
+ if (StringUtils.isBlank(req.getCode())) {
|
|
|
throw new StatusException("教学点代码不能为空");
|
|
|
}
|
|
|
- if(StringUtils.isBlank(req.getName())) {
|
|
|
+ if (StringUtils.isBlank(req.getName())) {
|
|
|
throw new StatusException("教学点名称不能为空");
|
|
|
}
|
|
|
- if(req.getCityId() == null) {
|
|
|
+ if (req.getCityId() == null) {
|
|
|
throw new StatusException("请选择教学点所在城市");
|
|
|
}
|
|
|
- if(req.getId() == null) {
|
|
|
+ if (req.getId() == null) {
|
|
|
LambdaQueryWrapper<CategoryEntity> wrapper = new LambdaQueryWrapper<>();
|
|
|
wrapper.eq(CategoryEntity::getCode, req.getCode());
|
|
|
List<CategoryEntity> list = baseMapper.selectList(wrapper);
|
|
|
- if(list.size() > 0) {
|
|
|
+ if (list.size() > 0) {
|
|
|
throw new StatusException("教学点代码已经存在");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<CategoryVO> listCity(LoginUser user) {
|
|
|
+ LambdaQueryWrapper<CategoryEntity> wrapper = new LambdaQueryWrapper<>();
|
|
|
+ wrapper.eq(CategoryEntity::getOrgId, user.getOrgId());
|
|
|
+ wrapper.eq(CategoryEntity::getEnable, Boolean.TRUE);
|
|
|
+ wrapper.eq(CategoryEntity::getLevel, CategoryLevel.CITY.getValue());
|
|
|
+ wrapper.orderByAsc(CategoryEntity::getId);
|
|
|
+ List<CategoryEntity> cityList = this.list(wrapper);
|
|
|
+ List<CategoryVO> cityVOList = new ArrayList<>();
|
|
|
+ for (CategoryEntity city : cityList) {
|
|
|
+ CategoryVO cityVO = new CategoryVO();
|
|
|
+ cityVO.setId(city.getId());
|
|
|
+ cityVO.setName(city.getName());
|
|
|
+ cityVOList.add(cityVO);
|
|
|
+ }
|
|
|
+ return cityVOList;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map<String, Object>> importTeaching(LoginUser user, InputStream inputStream) {
|
|
|
+ List<DataMap> lineList = null;
|
|
|
+ ExcelReader reader = ExcelReader.create(ExcelType.XLSX, inputStream, 0);
|
|
|
+ try {
|
|
|
+ lineList = reader.getDataMapList();
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new StatusException("Excel 解析失败");
|
|
|
+ }
|
|
|
+ if (CollectionUtils.isEmpty(lineList)) {
|
|
|
+ throw new StatusException("Excel无内容");
|
|
|
+ }
|
|
|
+ List<Map<String, Object>> failRecords = new ArrayList<Map<String, Object>>();
|
|
|
+ List<CategoryEntity> categoryList = new ArrayList<>();
|
|
|
+ List<CategoryVO> cityList = listCity(user);
|
|
|
+ for (int i = 0; i < lineList.size(); i++) {
|
|
|
+ CategoryEntity category = new CategoryEntity();
|
|
|
+ DataMap line = lineList.get(i);
|
|
|
+ StringBuilder msg = new StringBuilder();
|
|
|
+ String code = trimAndNullIfBlank(line.get(EXCEL_HEADER[0]));
|
|
|
+ if (StringUtils.isBlank(code)) {
|
|
|
+ msg.append(" 教学点代码不能为空");
|
|
|
+ } else {
|
|
|
+ category.setCode(code);
|
|
|
+ }
|
|
|
+ String name = trimAndNullIfBlank(line.get(EXCEL_HEADER[1]));
|
|
|
+ if (StringUtils.isBlank(name)) {
|
|
|
+ msg.append(" 教学点名称不能为空");
|
|
|
+ } else {
|
|
|
+ category.setName(name);
|
|
|
+ }
|
|
|
+ String cityName = trimAndNullIfBlank(line.get(EXCEL_HEADER[2]));
|
|
|
+ Long cityId = null;
|
|
|
+ if (StringUtils.isBlank(cityName)) {
|
|
|
+ msg.append(" 教学点所在城市不能为空");
|
|
|
+ } else {
|
|
|
+ cityId = getIdByName(cityName, cityList);
|
|
|
+ if (cityId == null) {
|
|
|
+ msg.append(" 教学点所在城市不存在");
|
|
|
+ } else {
|
|
|
+ category.setParentId(cityId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (msg.length() > 0) {
|
|
|
+ failRecords.add(newError(i + 1, msg.toString()));
|
|
|
+ } else {
|
|
|
+ category.setEnable(Boolean.TRUE);
|
|
|
+ category.setLevel(CategoryLevel.TEACHING.getValue());
|
|
|
+ category.setOrgId(user.getOrgId());
|
|
|
+ categoryList.add(category);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (CollectionUtils.isNotEmpty(failRecords)) {
|
|
|
+ return failRecords;
|
|
|
+ }
|
|
|
+ for (int i = 0; i < categoryList.size(); i++) {
|
|
|
+ CategoryEntity category = categoryList.get(i);
|
|
|
+ try {
|
|
|
+ saveTeaching(category);
|
|
|
+ } catch (Exception e) {
|
|
|
+ failRecords.add(newError(i + 1, " 系统异常"));
|
|
|
+ log.error("导入异常", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (CollectionUtils.isNotEmpty(failRecords)) {
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ return failRecords;
|
|
|
+ }
|
|
|
+ return failRecords;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void saveTeaching(CategoryEntity category) {
|
|
|
+ LambdaQueryWrapper<CategoryEntity> wrapper = new LambdaQueryWrapper<>();
|
|
|
+ wrapper.eq(CategoryEntity::getCode, category.getCode());
|
|
|
+ wrapper.eq(CategoryEntity::getOrgId, category.getOrgId());
|
|
|
+ CategoryEntity existCategory = baseMapper.selectOne(wrapper);
|
|
|
+ if (existCategory != null) {
|
|
|
+ existCategory.setParentId(category.getParentId());
|
|
|
+ existCategory.setName(category.getName());
|
|
|
+ existCategory.setEnable(Boolean.TRUE);
|
|
|
+ baseMapper.updateById(existCategory);
|
|
|
+ } else {
|
|
|
+ baseMapper.insert(category);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private Long getIdByName(String cityName, List<CategoryVO> cityList) {
|
|
|
+ for (CategoryVO city : cityList) {
|
|
|
+ if (city.getName().equals(cityName)) {
|
|
|
+ return city.getId();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String trimAndNullIfBlank(String s) {
|
|
|
+ if (StringUtils.isBlank(s)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return s.trim();
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Object> newError(int lineNum, String msg) {
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("lineNum", lineNum);
|
|
|
+ map.put("msg", msg);
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
}
|