From b111c5e3383761e016d24570f79723844ce4c7ad Mon Sep 17 00:00:00 2001 From: guo Date: Sun, 7 Apr 2024 18:23:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=AF=BC=E5=85=A5=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/ExceptionHandlerAdvice.java | 5 +- .../execption/OpenPromptException.java} | 13 ++-- .../impl/CheckingPointServiceImpl.java | 7 +- .../controller/SafetyHatDevController.java | 37 ++++++++++ .../service/ISafetyHatDevService.java | 4 ++ .../service/impl/SafetyHatDevServiceImpl.java | 66 ++++++++++++++++-- .../resources/excel/人员考勤导入模板.xlsx | Bin 9591 -> 9824 bytes .../resources/excel/安全帽设备导入模板.xlsx | Bin 0 -> 8834 bytes 8 files changed, 114 insertions(+), 18 deletions(-) rename src/main/java/com/zhgd/{exception/PromptException.java => jeecg/common/execption/OpenPromptException.java} (62%) create mode 100644 src/main/resources/excel/安全帽设备导入模板.xlsx diff --git a/src/main/java/com/zhgd/exception/ExceptionHandlerAdvice.java b/src/main/java/com/zhgd/exception/ExceptionHandlerAdvice.java index b065ebcf5..dfd6b5022 100644 --- a/src/main/java/com/zhgd/exception/ExceptionHandlerAdvice.java +++ b/src/main/java/com/zhgd/exception/ExceptionHandlerAdvice.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil; import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.jeecg.common.constant.CommonConstant; import com.zhgd.jeecg.common.execption.OpenAlertException; +import com.zhgd.jeecg.common.execption.OpenPromptException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.validation.BindingResult; @@ -45,8 +46,8 @@ public class ExceptionHandlerAdvice { result.setCode(403); result.setMessage(appException.getMessage()); result.setSuccess(false); - } else if (ex instanceof PromptException) { - PromptException appException = (PromptException) ex; + } else if (ex instanceof OpenPromptException) { + OpenPromptException appException = (OpenPromptException) ex; result.setCode(200); result.setMessage(appException.getMessage()); result.setResult(appException.getResult()); diff --git a/src/main/java/com/zhgd/exception/PromptException.java b/src/main/java/com/zhgd/jeecg/common/execption/OpenPromptException.java similarity index 62% rename from src/main/java/com/zhgd/exception/PromptException.java rename to src/main/java/com/zhgd/jeecg/common/execption/OpenPromptException.java index 310e0ea3a..f6ed47c50 100644 --- a/src/main/java/com/zhgd/exception/PromptException.java +++ b/src/main/java/com/zhgd/jeecg/common/execption/OpenPromptException.java @@ -1,24 +1,21 @@ -package com.zhgd.exception; - -import lombok.Data; -import org.springframework.http.HttpStatus; +package com.zhgd.jeecg.common.execption; /** - * 提示异常 + * 提示code=200异常 */ -public class PromptException extends RuntimeException { +public class OpenPromptException extends RuntimeException { private static final long serialVersionUID = 1L; private final String message; private Object result; - public PromptException(String message) { + public OpenPromptException(String message) { this.message = message; } - public PromptException(String message, Object result) { + public OpenPromptException(String message, Object result) { this.message = message; this.result = result; } diff --git a/src/main/java/com/zhgd/xmgl/modules/checking/service/impl/CheckingPointServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/checking/service/impl/CheckingPointServiceImpl.java index 1c5c8ec46..ae4dde7d1 100644 --- a/src/main/java/com/zhgd/xmgl/modules/checking/service/impl/CheckingPointServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/checking/service/impl/CheckingPointServiceImpl.java @@ -11,7 +11,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gexin.fastjson.JSON; import com.gexin.fastjson.JSONObject; -import com.zhgd.exception.PromptException; +import com.zhgd.jeecg.common.execption.OpenPromptException; import com.zhgd.xmgl.modules.basicdata.service.INoticeService; import com.zhgd.xmgl.modules.checking.entity.CheckingPoint; import com.zhgd.xmgl.modules.checking.entity.CheckingPointInfo; @@ -19,7 +19,6 @@ import com.zhgd.xmgl.modules.checking.entity.qo.ProjectSnQO; import com.zhgd.xmgl.modules.checking.mapper.CheckingPointInfoMapper; import com.zhgd.xmgl.modules.checking.mapper.CheckingPointMapper; import com.zhgd.xmgl.modules.checking.service.CheckingPointService; -import com.zhgd.xmgl.util.DateUtils; import com.zhgd.xmgl.util.RegionUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -60,12 +59,12 @@ public class CheckingPointServiceImpl extends ServiceImpl countSafetyHatDev(@ApiIgnore @RequestBody HashMap paramMap) { return Result.success(safetyHatDevService.countSafetyHatDev(paramMap)); } + + @ApiOperation(value = "模板导入下载", notes = "模板导入下载") + @GetMapping("/downloadExcelTemplate") + public void downloadSafetyHatDevExcelTemplate(HttpServletResponse response) { + try { + OutputStream out = response.getOutputStream(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/vnd.ms-excel;charset=gb2312"); + response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("安全帽设备导入模板.xlsx", "UTF-8")); + InputStream fis = new ClassPathResource("excel/安全帽设备导入模板.xlsx").getInputStream(); + IOUtils.copy(fis, out); + out.flush(); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + @ApiOperation(value = "模板增量导入", notes = "模板增量导入") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "query", required = true, dataType = "String"), + @ApiImplicitParam(name = "file", value = "导入文件", paramType = "query", required = true, dataType = "String"), + }) + @PostMapping(value = "/importExcelTemplate") + public Result importExcelTemplate(MultipartFile file, String projectSn) throws Exception { + safetyHatDevService.importExcelTemplate(file, projectSn); + return Result.ok(); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/safetyhat/service/ISafetyHatDevService.java b/src/main/java/com/zhgd/xmgl/modules/safetyhat/service/ISafetyHatDevService.java index fccbb3cd8..b51d50d6c 100644 --- a/src/main/java/com/zhgd/xmgl/modules/safetyhat/service/ISafetyHatDevService.java +++ b/src/main/java/com/zhgd/xmgl/modules/safetyhat/service/ISafetyHatDevService.java @@ -4,7 +4,9 @@ import com.zhgd.xmgl.modules.safetyhat.entity.SafetyHatDev; import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.core.metadata.IPage; import com.zhgd.xmgl.modules.vehicleposition.entity.vo.CountVehiclePositionDevVo; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.HashMap; import java.util.List; @@ -27,4 +29,6 @@ public interface ISafetyHatDevService extends IService { void delete(String id); CountVehiclePositionDevVo countSafetyHatDev(HashMap paramMap); + + void importExcelTemplate(MultipartFile excelFile, String projectSn) throws Exception; } diff --git a/src/main/java/com/zhgd/xmgl/modules/safetyhat/service/impl/SafetyHatDevServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/safetyhat/service/impl/SafetyHatDevServiceImpl.java index 8f76a125e..c35724e23 100644 --- a/src/main/java/com/zhgd/xmgl/modules/safetyhat/service/impl/SafetyHatDevServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/safetyhat/service/impl/SafetyHatDevServiceImpl.java @@ -1,30 +1,41 @@ package com.zhgd.xmgl.modules.safetyhat.service.impl; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; 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.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zhgd.jeecg.common.execption.OpenAlertException; +import com.zhgd.jeecg.common.execption.OpenPromptException; import com.zhgd.jeecg.common.system.query.QueryGenerator; import com.zhgd.xmgl.modules.safetyhat.entity.SafetyHatAlarm; import com.zhgd.xmgl.modules.safetyhat.entity.SafetyHatData; import com.zhgd.xmgl.modules.safetyhat.entity.SafetyHatDev; -import com.zhgd.xmgl.modules.safetyhat.mapper.*; +import com.zhgd.xmgl.modules.safetyhat.mapper.SafetyHatAlarmMapper; +import com.zhgd.xmgl.modules.safetyhat.mapper.SafetyHatDataMapper; +import com.zhgd.xmgl.modules.safetyhat.mapper.SafetyHatDevMapper; +import com.zhgd.xmgl.modules.safetyhat.mapper.SafetyHatFenceMapper; import com.zhgd.xmgl.modules.safetyhat.service.ISafetyHatDevService; import com.zhgd.xmgl.modules.vehicleposition.entity.vo.CountVehiclePositionDevVo; +import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; +import com.zhgd.xmgl.modules.worker.mapper.WorkerInfoMapper; +import com.zhgd.xmgl.util.ExcelUtils; +import com.zhgd.xmgl.util.MessageUtil; import com.zhgd.xmgl.util.PageUtil; import com.zhgd.xmgl.util.RefUtil; -import org.apache.commons.collections.MapUtils; 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.util.Date; +import java.io.InputStream; import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @Description: 智能安全帽-设备 @@ -43,6 +54,8 @@ public class SafetyHatDevServiceImpl extends ServiceImpl queryPageList(HashMap paramMap) { @@ -111,5 +124,50 @@ public class SafetyHatDevServiceImpl extends ServiceImpl> list = ExcelUtils.jxlExlToList(is, 0); + if (list == null || list.size() == 0) { + throw new OpenAlertException(MessageUtil.get("excelNotDataErr")); + } + StringBuilder sb = new StringBuilder(); + list.forEach(m -> { + String name = m.get("人员名称"); + String devSn = m.get("设备序号"); + List workerInfos = workerInfoMapper.selectList(new LambdaQueryWrapper() + .eq(WorkerInfo::getProjectSn, projectSn) + .eq(WorkerInfo::getInserviceType, 1) + ); + Map nameMap = workerInfos.stream().collect(Collectors.toMap(WorkerInfo::getWorkerName, Function.identity(), (workerInfo, workerInfo2) -> null)); + WorkerInfo workerInfo = nameMap.get(name); + if (workerInfo == null) { + sb.append(devSn + ","); + return; + } + SafetyHatDev oneDev = safetyHatDevMapper.selectOne(new LambdaQueryWrapper() + .eq(SafetyHatDev::getDevSn, devSn)); + if (oneDev != null) { + oneDev.setWorkerInfoId(workerInfo.getId()); + oneDev.setProjectSn(projectSn); + baseMapper.updateById(oneDev); + } else { + SafetyHatDev dev = new SafetyHatDev(); + dev.setWorkerInfoId(workerInfo.getId()); + dev.setDevSn(devSn); + dev.setProjectSn(projectSn); + baseMapper.insert(dev); + } + }); + String str = sb.toString(); + if (StrUtil.isNotBlank(str)) { + throw new OpenPromptException("某些设备导入失败,该人员不存在或在项目中存在多个同名人员,设备序号:" + str.substring(0, str.length() - 1)); + } + } + } diff --git a/src/main/resources/excel/人员考勤导入模板.xlsx b/src/main/resources/excel/人员考勤导入模板.xlsx index a4eba39a772213cf3257b897d2d84073edc4a165..f62f691e93896858199321d9532841fbda14238f 100644 GIT binary patch delta 4920 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 delta 4652 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 literal 0 HcmV?d00001