package com.fdkankan.fusion.service.impl;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fdkankan.fusion.common.PageInfo;
import com.fdkankan.fusion.common.ResultCode;
import com.fdkankan.fusion.common.enums.IdPreEnum;
import com.fdkankan.fusion.common.enums.RoleKeyEnum;
import com.fdkankan.fusion.common.util.IdUtils;
import com.fdkankan.fusion.common.util.PatternEnum;
import com.fdkankan.fusion.common.util.RedisKeyUtil;
import com.fdkankan.fusion.entity.*;
import com.fdkankan.fusion.exception.BusinessException;
import com.fdkankan.fusion.mapper.ITmProjectMapper;
import com.fdkankan.fusion.request.*;
import com.fdkankan.fusion.response.DataGroupVo;
import com.fdkankan.fusion.response.ProjectRandCodeVo;
import com.fdkankan.fusion.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.redis.util.RedisUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.Period;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 火调项目信息表 服务实现类
*
*
* @author
* @since 2023-07-28
*/
@Service
public class TmProjectServiceImpl extends ServiceImpl implements ITmProjectService {
@Autowired
ITmDepartmentService tmDepartmentService;
@Autowired
ITmUserService tmUserService;
@Autowired
ICaseService caseService;
@Autowired
ICaseNumService caseNumService;
@Autowired
ITmAttachmentService tmAttachmentService;
@Autowired
RedisUtil redisUtil;
@Autowired
ITmRoleService tmRoleService;
@Autowired
ITmUserRoleService tmUserRoleService;
@Autowired
ICaseSettingsService caseSettingsService;
@Override
public Object pageList(ProjectRequestDto tmProject) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(TmProject::getIsDelete,tmProject.getIsDelete());
//教学场景
List deptIds;
if(tmProject.getQueryType() != null && tmProject.getQueryType() == 2){
wrapper.eq(TmProject::getIsTeached,1);
deptIds = tmDepartmentService.getByZdDeptIds();
}else {
String share = SaHolder.getRequest().getHeader("share");
if(StringUtils.isNotBlank(share) && "1".equals(share)){ //分享请求头
deptIds = tmDepartmentService.list().stream().map(TmDepartment::getId).collect(Collectors.toList());
wrapper.eq(TmProject::getMapShow,true);
wrapper.isNotNull(TmProject::getLatlng);
}else {
deptIds = tmDepartmentService.getDeptIds();
}
}
if(deptIds.size() <=0){
throw new BusinessException(ResultCode.NOT_DEPT);
}
//承办单位
if(StringUtils.isNotBlank(tmProject.getOrganizerDeptName())){
List list = tmDepartmentService.getLikeName(tmProject.getOrganizerDeptName());
if(list.size() <=0){
return PageInfo.PageInfo(new Page<>(tmProject.getPageNum(),tmProject.getPageSize()));
}
List collect = list.stream().map(TmDepartment::getId).collect(Collectors.toList());
deptIds = deptIds.stream().filter(collect::contains).collect(Collectors.toList());
}
List deptIds2 = tmDepartmentService.getSonByDeptIdAndDeptIds(deptIds, tmProject.getDeptId());
wrapper.in(TmProject::getDeptId,deptIds2);
//起火项目对象
if(StringUtils.isNotBlank(tmProject.getProjectSn())){
wrapper.like(TmProject::getProjectSn , tmProject.getProjectSn());
}
//起火对象
if(StringUtils.isNotBlank(tmProject.getProjectName())){
wrapper.like(TmProject::getProjectName , tmProject.getProjectName());
}
//起火地址
if(StringUtils.isNotBlank(tmProject.getProjectAddress())){
wrapper.like(TmProject::getProjectAddress , tmProject.getProjectAddress());
}
//起火场所
if(StringUtils.isNotBlank(tmProject.getProjectSiteCode())){
if(!StringUtils.equals("0" , tmProject.getProjectSiteCode())){
wrapper.likeRight(TmProject::getProjectSiteCode , tmProject.getProjectSiteCode());
}
}
//起火对象
if(StringUtils.isNotBlank(tmProject.getOrganizerUsers())){
wrapper.like(TmProject::getOrganizerUsers , tmProject.getOrganizerUsers());
}
//事故日期
if(StringUtils.isNotBlank(tmProject.getAccidentDate())){
wrapper.ge(TmProject::getAccidentDate,tmProject.getAccidentDateStart());
wrapper.le(TmProject::getAccidentDate,tmProject.getAccidentDateEnd());
}
//起火原因
if(StringUtils.isNotBlank(tmProject.getFireReason())){
wrapper.like(TmProject::getFireReason , tmProject.getFireReason());
}
//是否是教学项目列表
if(null != tmProject.getIsTeached()){
wrapper.eq(TmProject::getIsTeached , tmProject.getIsTeached());
}
//项目状态
if(StringUtils.isNotBlank(tmProject.getStatus())){
wrapper.eq(TmProject::getStatus , tmProject.getStatus());
}
wrapper.orderByDesc(TmProject::getCreateTime);
Page page = this.page(new Page<>(tmProject.getPageNum(), tmProject.getPageSize()), wrapper);
List ids = page.getRecords().stream().map(TmProject::getId).collect(Collectors.toList());
Set deptDbIds = page.getRecords().stream().map(TmProject::getDeptId).collect(Collectors.toSet());
HashMap mapByDeptIds = tmDepartmentService.getMapByDeptIds(deptDbIds);
HashMap map = this.getCaseMap(ids);
for (TmProject record : page.getRecords()) {
CaseEntity caseEntity = map.get(record.getId());
if(caseEntity != null){
record.setCaseId(caseEntity.getCaseId());
}
TmDepartment tmDepartment = mapByDeptIds.get(record.getDeptId());
if(tmDepartment != null){
record.setOrganizerDeptName(tmDepartment.getName());
}
List caseSettings = caseSettingsService.getByCaseId(record.getCaseId());
if(!caseSettings.isEmpty()){
CaseSettings caseSettings1 = caseSettings.get(0);
if(caseSettings1 != null){
record.setCover(caseSettings1.getCover());
}
}
}
return PageInfo.PageInfo(page);
}
@Override
public Object getDetailWithoutAuth(ProjectRequest param) {
if (ObjectUtil.isNotNull(param.getCaseId()) && StringUtils.isBlank(param.getRandCode())) {
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
String redisKey = String.format(RedisKeyUtil.RAND_CODE_KEY,param.getCaseId());
if(!redisUtil.hasKey(redisKey)){
throw new BusinessException(ResultCode.PROJECT_KEY_NOT_EXITS);
}
if (StringUtils.isBlank(param.getRandCode())) {
throw new BusinessException(ResultCode.PROJECT_PASSWORD_NOT_EXITS);
}
String redisRandCode = redisUtil.get(redisKey);
if(!StringUtils.equals(redisRandCode , param.getRandCode())){
throw new BusinessException(ResultCode.PROJECT_PASSWORD_ERROR);
}
return true;
}
@Override
public Object getRandCode(String caseId) {
if(StringUtils.isBlank(caseId) ){
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
String redisKey = String.format(RedisKeyUtil.RAND_CODE_KEY,caseId);
if(redisUtil.hasKey(redisKey)){
redisUtil.expire(redisKey,RedisKeyUtil.projectRandCodeKeyTime);
return redisUtil.get(redisKey);
}
CaseEntity caseEntity = caseService.getById(caseId);
if(caseEntity ==null){
throw new BusinessException(ResultCode.CASE_NOT_EXITS);
}
String code = RandomUtil.randomString(4);
redisUtil.set(redisKey, code,RedisKeyUtil.projectRandCodeKeyTime);
return code;
}
@Override
public void updateRandomCode(ProjectRandCodeDto projectRandCodeDto) {
if(StringUtils.isBlank(projectRandCodeDto.getCaseId()) || StringUtils.isBlank(projectRandCodeDto.getRandCode())){
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
if(!projectRandCodeDto.getRandCode().matches(PatternEnum.RAND_CODE_PATTERN)){
throw new BusinessException(ResultCode.RAND_ERROR);
}
String redisKey = String.format(RedisKeyUtil.RAND_CODE_KEY,projectRandCodeDto.getCaseId());
if(!redisUtil.hasKey(redisKey)){
throw new BusinessException(ResultCode.RAND_NOT_EXIST);
}
redisUtil.set(redisKey,projectRandCodeDto.getRandCode(),RedisKeyUtil.projectRandCodeKeyTime);
}
@Override
public void addNewProject(TmProject tmProject) {
if(StringUtils.isBlank(tmProject.getProjectSn())){
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
TmProject project = this.getByProjectSn(tmProject.getProjectSn());
if(project != null){
throw new BusinessException(ResultCode.PROJECT_EXITS);
}
TmUser tmUser = tmUserService.getLoginUser();
if(tmUser == null || StringUtils.isBlank(tmUser.getDeptId())){
throw new BusinessException(ResultCode.DEPT_NOT_EXITS);
}
TmDepartment tmDepartment = tmDepartmentService.getById(tmUser.getDeptId());
if(tmDepartment == null){
throw new BusinessException(ResultCode.DEPT_NOT_EXITS);
}
tmProject.setId(IdUtils.genId(IdPreEnum.PROJECT_PRE.getPre()));
tmProject.setDeptId(tmUser.getDeptId());
tmProject.setCreatorId(tmUser.getId());
tmProject.setCreatorName(tmUser.getNickName());
tmProject.setCreatorDeptId(tmUser.getDeptId());
tmProject.setEditorId(tmUser.getId());
tmProject.setEditorName(tmUser.getNickName());
tmProject.setOrganizerDeptName(tmDepartment.getName());
tmProject.setCaseNewName(setCaseNewName(tmProject));
this.save(tmProject);
CaseEntity caseEntity = new CaseEntity();
caseEntity.setCaseTitle(tmProject.getProjectName());
caseEntity.setUserName(tmUser.getUserName());
caseEntity.setType(1);
caseEntity.setTmProjectId(tmProject.getId());
caseEntity.setMapUrl(tmProject.getMapUrl());
caseEntity.setLatAndLong(tmProject.getLatAndLong());
caseService.save(caseEntity);
}
private String setCaseNewName(TmProject tmProject) {
String name = "";
if(StringUtils.isNotBlank(tmProject.getProjectAddress())){
name += tmProject.getProjectAddress();
}
if(tmProject.getAccidentDate() != null){
name += "("+DateUtil.format(tmProject.getAccidentDate(),"yyyy-MM-dd") +")";
}
if(StringUtils.isNotBlank(tmProject.getProjectName())){
name += tmProject.getProjectName();
}
return name;
}
@Override
public void updateProject(TmProject tmProject) {
if(StringUtils.isBlank(tmProject.getId())){
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
if(tmProject.getIsDelete() == 1){
CaseEntity caseEntity = caseService.getByTmProjectId(tmProject.getId());
if(caseEntity == null){
throw new BusinessException(ResultCode.PROJECT_CASE_NOT_EXITS);
}
caseService.delete(caseEntity.getCaseId());
tmAttachmentService.deleteByProjectId(tmProject.getId());
this.removeById(tmProject.getId());
return;
}
TmProject byProjectSn = this.getByProjectSn(tmProject.getProjectSn());
if(byProjectSn != null && !byProjectSn.getId().equals(tmProject.getId())){
throw new BusinessException(ResultCode.PROJECT_EXITS);
}
TmUser tmUser = tmUserService.getLoginUser();
tmProject.setEditorId(tmUser.getId());
tmProject.setEditorName(tmUser.getNickName());
tmProject.setUpdateTime(null);
tmProject.setCaseNewName(setCaseNewName(tmProject));
this.updateById(tmProject);
CaseEntity caseEntity = caseService.getByTmProjectId(tmProject.getId());
caseEntity.setCaseTitle(tmProject.getProjectName());
caseEntity.setMapUrl(tmProject.getMapUrl());
caseEntity.setLatAndLong(tmProject.getLatAndLong());
caseService.updateById(caseEntity);
}
@Override
public void setOrUnTeach(CommonDto commonDto) {
if(null == commonDto || StringUtils.isBlank(commonDto.getIds())){
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
List idList = Arrays.asList(commonDto.getIds().split(","));
if(CollectionUtils.isEmpty(idList)){
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
if(commonDto.getStatus() != 1){ //撤销教学项目
List tmProjects = this.listByIds(idList);
Set projectDeptIds = tmProjects.stream().map(TmProject::getDeptId).collect(Collectors.toSet());
TmUser loginUser = tmUserService.getLoginUser();
TmRole tmRole = tmRoleService.getByUserId(loginUser.getId());
if(tmRole.getRoleKey().equals(RoleKeyEnum.ADMIN_DEPT.getKey())){
List sonByDeptId = tmDepartmentService.getSonByDeptId(loginUser.getDeptId());
List deptIds = sonByDeptId.stream().map(TmDepartment::getId).collect(Collectors.toList());
deptIds.add(loginUser.getDeptId());
for (String projectDeptId : projectDeptIds) {
if(!deptIds.contains(projectDeptId)){
throw new BusinessException(ResultCode.NOT_PER);
}
}
}
if(tmRole.getRoleKey().equals(RoleKeyEnum.ADMIN_ORDINARY.getKey())){
for (String projectDeptId : projectDeptIds) {
if(!projectDeptId.equals(loginUser.getDeptId())){
throw new BusinessException(ResultCode.NOT_PER);
}
}
}
}
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.in(TmProject::getId,idList);
wrapper.set(TmProject::getIsTeached,commonDto.getStatus());
this.update(wrapper);
}
@Override
public TmProject getByProjectSn(String projectSn) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(TmProject::getProjectSn,projectSn);
wrapper.eq(TmProject::getIsDelete,0);
return this.getOne(wrapper);
}
@Override
public HashMap getCaseMap(List ids) {
HashMap map = new HashMap<>();
if(ids.size() >0){
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(CaseEntity::getTmProjectId,ids);
List list = caseService.list(wrapper);
if(list !=null && list.size() >0){
list.forEach(entity -> map.put(entity.getTmProjectId(),entity));
}
}
return map;
}
@Override
public void updateIdenTityStatus(String tmProjectId, Integer status) {
if(StringUtils.isNotBlank(tmProjectId)){
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(TmProject::getId,tmProjectId);
wrapper.set(TmProject::getStatus,status);
this.update(wrapper);
}
}
@Override
public HashMap getMapByIds(Set tmProIds) {
HashMap map = new HashMap<>();
if(tmProIds.size() >0){
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(TmProject::getId,tmProIds);
wrapper.eq(TmProject::getIsDelete,0);
List tmProjects = this.list(wrapper);
for (TmProject tmProject : tmProjects) {
map.put(tmProject.getId(),tmProject);
}
}
return map;
}
@Override
public List groupByDeptId(DataParam param) {
return getBaseMapper().groupByDeptId(param.getStartTime(),param.getEndTime());
}
@Override
public List groupByMonth(DataParam param,List deptIds) {
return getBaseMapper().groupByMonth(param.getStartTime(),param.getEndTime(),deptIds);
}
@Override
public List groupByPlace(DataParam param,List deptIds) {
return getBaseMapper().groupByPlace(param.getStartTime(),param.getEndTime(),deptIds);
}
@Override
public List groupByReason(DataParam param,List deptIds) {
return getBaseMapper().groupByReason(param.getStartTime(),param.getEndTime(),deptIds);
}
}