From 04ca4729342a545c359339aee60cb4a01135fd8c Mon Sep 17 00:00:00 2001 From: wxc <191104855@qq.com> Date: Wed, 30 Oct 2024 19:30:26 +0800 Subject: [PATCH] =?UTF-8?q?fit:=20=E5=AF=BC=E5=85=A5=E8=AD=A6=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/PoliceController.java | 164 ++++++++++++++++-- .../mapper/ModelClueTaskMapper.java | 8 + .../supervision/pojo/dto/PoliceImport.java | 39 +++++ .../supervision/pojo/entity/ModelClue.java | 4 + .../supervision/service/HolidayService.java | 4 +- .../resources/mapper/ModelClueTaskMapper.xml | 29 ++++ .../数字督察警员权限导入模板.xlsx | Bin 0 -> 8918 bytes 7 files changed, 234 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/biutag/supervision/pojo/dto/PoliceImport.java create mode 100644 src/main/resources/mapper/ModelClueTaskMapper.xml create mode 100644 src/main/resources/static/templates/数字督察警员权限导入模板.xlsx diff --git a/src/main/java/com/biutag/supervision/controller/system/PoliceController.java b/src/main/java/com/biutag/supervision/controller/system/PoliceController.java index 6886f37..4d224e9 100644 --- a/src/main/java/com/biutag/supervision/controller/system/PoliceController.java +++ b/src/main/java/com/biutag/supervision/controller/system/PoliceController.java @@ -2,27 +2,35 @@ package com.biutag.supervision.controller.system; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelReader; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.read.listener.ReadListener; +import com.alibaba.excel.read.metadata.ReadSheet; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.biutag.supervision.constants.enums.DepartLevelEnum; +import com.biutag.supervision.constants.enums.InitialPetition; import com.biutag.supervision.pojo.Result; import com.biutag.supervision.pojo.domain.PoliceAuth; -import com.biutag.supervision.pojo.entity.NegDepartAuthority; -import com.biutag.supervision.pojo.entity.NegSourceAuthority; -import com.biutag.supervision.pojo.entity.SupDepart; -import com.biutag.supervision.pojo.entity.SupPolice; +import com.biutag.supervision.pojo.dto.PoliceImport; +import com.biutag.supervision.pojo.entity.*; import com.biutag.supervision.pojo.model.PoliceModel; import com.biutag.supervision.pojo.param.PoliceQueryParam; -import com.biutag.supervision.service.NegDepartAuthorityService; -import com.biutag.supervision.service.NegSourceAuthorityService; -import com.biutag.supervision.service.SupDepartService; -import com.biutag.supervision.service.SupPoliceService; +import com.biutag.supervision.service.*; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validator; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; @RequestMapping("police") @RequiredArgsConstructor @@ -37,6 +45,8 @@ public class PoliceController { private final NegSourceAuthorityService negSourceAuthorityService; + private final Validator validator; + @GetMapping public Result> list(PoliceQueryParam param) { return Result.success(policeService.page(param)); @@ -105,4 +115,136 @@ public class PoliceController { return Result.success(); } + private final BaseUserService userService; + private final BaseAccountService accountService; + private final SupDictProblemSourceService dictProblemSourceService; + + @PostMapping("import") + public Result> importExcel(@RequestPart("file") MultipartFile file) throws IOException { + String fileNameType = FileUtil.extName(file.getOriginalFilename()); + if (!"xls".equals(fileNameType) && !"xlsx".equals(fileNameType)) { + throw new RuntimeException("仅支持 xls/xlsx 格式文件的导入"); + } + List list = new ArrayList<>(); + List problemSources = dictProblemSourceService.list(); + ExcelReader excelReader = EasyExcel.read(file.getInputStream(), PoliceImport.class, new ReadListener() { + @Override + public void invoke(PoliceImport data, AnalysisContext analysisContext) { + Set> validate = validator.validate(data); + if (!validate.isEmpty()) { + String message = validate.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining("\n")); + throw new RuntimeException(String.format("第%s条数据的异常:%s", list.size() + 1, message)); + } + list.add(data); + } + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + } + }).build(); + ReadSheet sheet = EasyExcel.readSheet(0).build(); + excelReader.read(sheet); + excelReader.close(); + for (int i = 0; i < list.size(); i++) { + PoliceImport police = list.get(i); + SupDepart depart; + if (StrUtil.isBlank(police.getThirdDepartName())) { + depart = departService.getOne(new LambdaQueryWrapper().eq(SupDepart::getShortName, police.getSecondDepartName()).eq(SupDepart::getLevel, 2)); + } else { + SupDepart secondDepart = departService.getOne(new LambdaQueryWrapper().eq(SupDepart::getShortName, police.getSecondDepartName()).eq(SupDepart::getLevel, 2)); + depart = departService.getOne(new LambdaQueryWrapper().eq(SupDepart::getPid, secondDepart.getId()) + .eq(SupDepart::getShortName, police.getThirdDepartName()).eq(SupDepart::getLevel, 3)); + } + SupPolice supPolice = policeService.getByIdCode(list.get(i).getIdCode()); + if (supPolice == null) { + supPolice = new SupPolice(); + supPolice.setName(police.getName()); + supPolice.setIdCode(police.getIdCode()); + supPolice.setEmpNo(police.getEmpNo()); + supPolice.setOrgId(depart.getId()); + if (police.getEmpNo().contains("A")) { + supPolice.setPersonType("3"); + } else { + supPolice.setPersonType("1"); + } + policeService.save(supPolice); + + } else { + supPolice.setName(police.getName()); + supPolice.setIdCode(police.getIdCode()); + supPolice.setEmpNo(police.getEmpNo()); + supPolice.setOrgId(depart.getId()); + if (police.getEmpNo().contains("A")) { + supPolice.setPersonType("3"); + } else { + supPolice.setPersonType("1"); + } + policeService.updateById(supPolice); + } + String userId = saveOrUpdateUser(police); + // 角色 + addRoleUser(userId, police.getRole()); + // 权限 + addAuth(police.getIdCode(), supPolice.getOrgId(), problemSources); + + } + return Result.success(list); + } + + public String saveOrUpdateUser(PoliceImport police) { + BaseUser user = userService.getByUserName(police.getIdCode()); + if (user != null) { + return user.getUserId(); + } + BaseUser baseUser = new BaseUser(); + baseUser.setUserName(police.getIdCode()); + baseUser.setNickName(police.getName()); + baseUser.setUserType("admin"); + baseUser.setCreateTime(LocalDateTime.now()); + baseUser.setUpdateTime(LocalDateTime.now()); + userService.save(baseUser); + BaseAccount account = new BaseAccount(); + account.setAccount(police.getIdCode()); + account.setUserId(baseUser.getUserId()); + account.setAccountType("username"); + account.setDomain("@admin.com"); + account.setPassword("$2a$10$q0NbHH1fbkDotxJ1dT7PbOcV4G47R8n15uVxz2.imTiDqdCwAJYBC"); + account.setDomain("@admin.com"); + account.setCreateTime(LocalDateTime.now()); + account.setUpdateTime(LocalDateTime.now()); + accountService.save(account); + return baseUser.getUserId(); + } + + private final BaseRoleUserService roleUserService; + public void addRoleUser(String userId, String role) { + roleUserService.remove(new LambdaQueryWrapper().eq(BaseRoleUser::getUserId, userId)); + BaseRoleUser baseRoleUser = new BaseRoleUser(); + baseRoleUser.setUserId(userId); + if ("三级机构专班".equals(role)) { + baseRoleUser.setRoleId("5"); + } + if ("二级机构专班".equals(role)) { + baseRoleUser.setRoleId("4"); + } + baseRoleUser.setCreateTime(LocalDateTime.now()); + baseRoleUser.setUpdateTime(LocalDateTime.now()); + roleUserService.save(baseRoleUser); + } + + public void addAuth(String idCode, String orgId, List problemSources) { + negDepartAuthorityService.remove(new LambdaQueryWrapper().eq(NegDepartAuthority::getIdCode, idCode)); + NegDepartAuthority authority = new NegDepartAuthority(); + authority.setDepartId(orgId); + authority.setIdCode(idCode); + negDepartAuthorityService.save(authority); + negSourceAuthorityService.remove(new LambdaQueryWrapper().eq(NegSourceAuthority::getIdCode, idCode)); + + List list = problemSources.stream().map(item -> { + NegSourceAuthority sourceAuthority = new NegSourceAuthority(); + sourceAuthority.setIdCode(idCode); + sourceAuthority.setSource(item.getId()); + return sourceAuthority; + }).toList(); + negSourceAuthorityService.saveBatch(list); + } } \ No newline at end of file diff --git a/src/main/java/com/biutag/supervision/mapper/ModelClueTaskMapper.java b/src/main/java/com/biutag/supervision/mapper/ModelClueTaskMapper.java index 3274a9f..5574098 100644 --- a/src/main/java/com/biutag/supervision/mapper/ModelClueTaskMapper.java +++ b/src/main/java/com/biutag/supervision/mapper/ModelClueTaskMapper.java @@ -1,8 +1,16 @@ package com.biutag.supervision.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.biutag.supervision.pojo.entity.ModelClueTask; +import com.biutag.supervision.pojo.model.ModelClueTaskModel; +import com.biutag.supervision.pojo.model.NegativeWorkModel; +import org.apache.ibatis.annotations.Param; public interface ModelClueTaskMapper extends BaseMapper { + Page queryPage(@Param("page") Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); + } \ No newline at end of file diff --git a/src/main/java/com/biutag/supervision/pojo/dto/PoliceImport.java b/src/main/java/com/biutag/supervision/pojo/dto/PoliceImport.java new file mode 100644 index 0000000..f19c0b3 --- /dev/null +++ b/src/main/java/com/biutag/supervision/pojo/dto/PoliceImport.java @@ -0,0 +1,39 @@ +package com.biutag.supervision.pojo.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +/** + * @author wxc + * @date 2024/10/30 + */ +@Setter +@Getter +public class PoliceImport { + + @NotBlank(message = "姓名为空") + @ExcelProperty("姓名") + private String name; + + @NotBlank(message = "警号为空") + @ExcelProperty("警号") + private String empNo; + + @NotBlank(message = "身份证为空") + @ExcelProperty("身份证") + private String idCode; + + @NotBlank(message = "二级单位为空") + @ExcelProperty("二级单位") + private String secondDepartName; + + @ExcelProperty("三级单位") + private String thirdDepartName; + + @NotBlank(message = "角色为空") + @ExcelProperty("角色") + private String role; + +} diff --git a/src/main/java/com/biutag/supervision/pojo/entity/ModelClue.java b/src/main/java/com/biutag/supervision/pojo/entity/ModelClue.java index 946803d..35e6f3a 100644 --- a/src/main/java/com/biutag/supervision/pojo/entity/ModelClue.java +++ b/src/main/java/com/biutag/supervision/pojo/entity/ModelClue.java @@ -68,6 +68,10 @@ public class ModelClue { @TableField("unique_key") private String uniqueKey; + // 任务ID + private Integer taskId; + + // 总警情数 @TableField(exist = false) private Long zjjs; diff --git a/src/main/java/com/biutag/supervision/service/HolidayService.java b/src/main/java/com/biutag/supervision/service/HolidayService.java index 9b9a970..ce9062e 100644 --- a/src/main/java/com/biutag/supervision/service/HolidayService.java +++ b/src/main/java/com/biutag/supervision/service/HolidayService.java @@ -28,16 +28,14 @@ public class HolidayService extends ServiceImpl { long l = System.currentTimeMillis(); Boolean result = (Boolean) redisTemplate.opsForValue().get(String.format("holiday:%s", date)); if (Objects.nonNull(result)) { - System.out.println(String.format("查询节假日耗时:%sms", System.currentTimeMillis() - l)); return result; } Holiday holiday = getOne(new LambdaUpdateWrapper().eq(Holiday::getDate, date)); if (Objects.isNull(holiday)) { - log.error("节假日 {} 数据未找到", date); + // log.error("节假日 {} 数据未找到", date); return false; } redisTemplate.opsForValue().set(String.format("holiday:%s", date), holiday.getFlag()); - System.out.println(String.format("查询节假日耗时(sql):%sms", System.currentTimeMillis() - l)); return holiday.getFlag(); } diff --git a/src/main/resources/mapper/ModelClueTaskMapper.xml b/src/main/resources/mapper/ModelClueTaskMapper.xml new file mode 100644 index 0000000..94100b7 --- /dev/null +++ b/src/main/resources/mapper/ModelClueTaskMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/templates/数字督察警员权限导入模板.xlsx b/src/main/resources/static/templates/数字督察警员权限导入模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fadc15d02f96be130d36fbf3f277e4657c98b5d5 GIT binary patch literal 8918 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 PgulYzwOo?w*Sr4%j{r^R literal 0 HcmV?d00001