guoshilong
2023-07-12 b176ddd3a9acdd1eef2e7eb9c0cef5fa620334b4
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/patrol/service/impl/PatrolTaskServiceImpl.java
@@ -1,15 +1,50 @@
package cn.gistack.sm.patrol.service.impl;
import cn.gistack.flow.core.constant.ProcessConstant;
import cn.gistack.flow.core.entity.BladeFlow;
import cn.gistack.flow.core.feign.IFlowClient;
import cn.gistack.flow.core.utils.FlowUtil;
import cn.gistack.flow.core.utils.TaskUtil;
import cn.gistack.sm.patrol.entity.PatrolRecord;
import cn.gistack.sm.patrol.entity.PatrolReport;
import cn.gistack.sm.patrol.entity.PatrolTask;
import cn.gistack.sm.patrol.mapper.PatrolTaskMapper;
import cn.gistack.sm.patrol.service.IPatrolRecordService;
import cn.gistack.sm.patrol.service.IPatrolReportService;
import cn.gistack.sm.patrol.service.IPatrolTaskService;
import cn.gistack.sm.patrol.util.EnhancementServicesTool;
import cn.gistack.sm.patrol.util.IdWorker;
import cn.gistack.sm.patrol.vo.BladeFlowTask;
import cn.gistack.sm.patrol.vo.PatrolTaskReport;
import cn.gistack.sm.patrol.vo.PatrolTaskVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.AllArgsConstructor;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.net.http.HttpRequest;
import java.util.*;
import java.util.stream.Collectors;
import static org.springblade.core.launch.constant.FlowConstant.TASK_USR_PREFIX;
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class PatrolTaskServiceImpl extends BaseServiceImpl<PatrolTaskMapper, PatrolTask> implements IPatrolTaskService {
   private final IFlowClient flowClient;
   private final IPatrolRecordService patrolRecordService;
   private final IPatrolReportService patrolReportService;
   /**
    * 自定义分页查询
@@ -19,7 +54,8 @@
    */
   @Override
   public IPage<PatrolTaskVO> selectPatrolTask(IPage<PatrolTaskVO> page, PatrolTaskVO patrolTask) {
      return page.setRecords(baseMapper.selectPatrolTask(patrolTask));
      List<PatrolTaskVO> patrolTaskList = baseMapper.selectPatrolTask(page, patrolTask);
      return page.setRecords(patrolTaskList);
   }
   /**
@@ -31,4 +67,243 @@
   public Object getPatrolTaskStatistic(PatrolTaskVO patrolTask) {
      return baseMapper.getPatrolTaskStatistic(patrolTask);
   }
   /**
    * 自定义编辑(空间坐标编辑)
    * @param patrolTask
    * @return
    */
   @Override
   public Boolean updatePatrolTask(PatrolTask patrolTask) {
      // 设置基础信息
      EnhancementServicesTool enhancementServicesTool = new EnhancementServicesTool();
      enhancementServicesTool.resolveEntity(patrolTask);
      Integer update = baseMapper.updatePatrolTask(patrolTask);
      //返回
      return update>0?true:false;
   }
   /**
    * 自定义添加
    * @param patrolTask
    * @return
    */
   @Override
   public Boolean savePatrolTask(PatrolTask patrolTask) {
      // 设置基础信息
      EnhancementServicesTool enhancementServicesTool = new EnhancementServicesTool();
      enhancementServicesTool.resolveEntity(patrolTask);
      patrolTask.setId(IdWorker.getId());
      // 新增
      Integer save = baseMapper.savePatrolTask(patrolTask);
      //返回
      return save>0?true:false;
   }
   /**
    * 自定义通过id查询
    * @param id
    * @return
    */
   @Override
   public PatrolTask getPatrolTaskById(String id) {
      return baseMapper.getPatrolTaskById(id);
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public boolean startProcess(PatrolTask patrolTask) {
      String businessTable = FlowUtil.getBusinessTable(ProcessConstant.PATROL_KEY);
      if (Func.isEmpty(patrolTask.getId())) {
         save(patrolTask);
         // 启动流程
         Kv variables = Kv.create()
            .set(ProcessConstant.TASK_VARIABLE_CREATE_USER, AuthUtil.getUserId())
            .set("taskUser", TaskUtil.getTaskUser(patrolTask.getToUserId()));
         R<BladeFlow> result = flowClient.startProcessInstanceById(patrolTask.getProcessDefinitionId(), FlowUtil.getBusinessKey(businessTable, String.valueOf(patrolTask.getId())), variables);
         if (result.isSuccess()) {
            log.debug("流程已启动,流程ID:" + result.getData().getProcessInstanceId());
            // 返回流程id写入leave
            patrolTask.setProcessInstanceId(result.getData().getProcessInstanceId());
            updateById(patrolTask);
         } else {
            throw new ServiceException("开启流程失败");
         }
      } else {
         updateById(patrolTask);
      }
      return true;
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public boolean patrolCompleteTask(PatrolTaskVO patrolTask,String currentUserId,String taskUser) {
      R<BladeFlow> res = flowClient.getBladeFlow(patrolTask.getId().toString(),currentUserId);
      if (res.isSuccess()){
         BladeFlow flow = res.getData();
         String taskId = flow.getTaskId();
         String processInstanceId = patrolTask.getProcessInstanceId();
//         String comment = Func.toStr(flow.getComment(), ProcessConstant.PASS_COMMENT);
         String comment = "完成";
         // 创建变量
         Map<String, Object> variables = flow.getVariables();
         if (variables == null) {
            variables = Kv.create();
         }
         variables.put(ProcessConstant.REPORT_KEY,patrolTask.getReport());
         variables.put("taskUser",StringUtil.format("{}{}", TASK_USR_PREFIX, taskUser));
         // 完成任务
         flowClient.completeTask(taskId,processInstanceId,comment,variables);
         //保存巡查记录
         patrolRecordService.saveBatch(patrolTask.getPatrolRecordList());
         //保存上报
         //停用
//         saveReport(patrolTask);
         return baseMapper.updateById(patrolTask) >0;
      }else {
         return  false;
      }
   }
   @Override
   public boolean chargeCompletePerson(BladeFlowTask bladeFlowTask) {
      //判断是否上报
//      boolean isReport = false;
//      List<PatrolReport> collect = bladeFlowTask.getPatrolReportList().stream().filter(report -> Func.equals(report.getStatus(), 2)).collect(Collectors.toList());
//      if (collect.size()>0){
//         isReport = true;
//      }
//      //更新report表
//      boolean update = patrolReportService.updateBatchById(bladeFlowTask.getPatrolReportList());
      boolean isReport = false;
      if (StringUtil.isNoneBlank(bladeFlowTask.getTaskUser())){
         isReport = true;
      }
      String taskId = bladeFlowTask.getTaskId();
      String processInstanceId = bladeFlowTask.getProcessInstanceId();
      String comment = "完成";
      // 创建变量
      Map<String, Object> variables = new HashMap<>();
      if (variables == null) {
         variables = Kv.create();
      }
      //指定下一个人
      variables.put("taskUser",StringUtil.format("{}{}", TASK_USR_PREFIX, bladeFlowTask.getTaskUser()));
      //指定是否上报
      variables.put(ProcessConstant.REPORT_KEY,isReport);
      //指定是否上报给部门
      variables.put(ProcessConstant.TODEPT_KEY,bladeFlowTask.getToDept());
      //指定是否转交
      variables.put(ProcessConstant.TOTECH_KEY,bladeFlowTask.getToTech());
      //完成任务
      flowClient.completeTask(taskId, processInstanceId, comment, variables);
      return true;
   }
   @Override
   public PatrolTaskVO customizeGetById(String businessId) {
      return baseMapper.customizeGetById(businessId);
   }
   @Override
   public List<PatrolTask> getAll(PatrolTaskVO patrolTaskVO) {
      return baseMapper.getAll(patrolTaskVO);
   }
   @Override
   public IPage<PatrolTaskReport> getTaskReportPage(IPage<PatrolTaskReport> page,PatrolTaskReport patrolTaskReport) {
      List<PatrolTaskReport> list = new ArrayList();
      switch (patrolTaskReport.getRegionFlag()){
         case "1": //省  获取市级数据
            list = baseMapper.getCityReportPage(page,patrolTaskReport);
            break;
         case "2"://市   获取区县级数据
            list = baseMapper.getCountyReportPage(page,patrolTaskReport);
            break;
         case "3"://区县 获取乡镇级数据
            list = baseMapper.getTownReportPage(page,patrolTaskReport);
            break;
         case "4"://乡镇  获取水库数据
            list = baseMapper.getReservoirReportPage(page,patrolTaskReport);
            break;
         default:
            break;
      }
      return page.setRecords(list);
   }
   @Override
   public List<PatrolTaskReport> getTaskReportList(PatrolTaskReport patrolTaskReport) {
      List<PatrolTaskReport> list = new ArrayList();
      switch (patrolTaskReport.getRegionFlag()){
         case "1": //省  获取市级数据
            list = baseMapper.getCityReportList(patrolTaskReport);
            break;
         case "2"://市   获取区县级数据
            list = baseMapper.getCountyReportList(patrolTaskReport);
            break;
         case "3"://区县 获取乡镇级数据
            list = baseMapper.getTownReportList(patrolTaskReport);
            break;
         case "4"://乡镇  获取水库数据
            list = baseMapper.getReservoirReportList(patrolTaskReport);
            break;
         default:
            break;
      }
      return list;
   }
   @Override
   public IPage<PatrolTaskReport> getTaskReportDetail(IPage<PatrolTaskReport> page, PatrolTaskReport patrolTaskReport) {
      List<PatrolTaskReport> list = new ArrayList();
      if (Func.isNotEmpty(patrolTaskReport.getReservoirId())){
         //获取该水库的巡查
         list = baseMapper.getTaskReportDetailRegion(page,patrolTaskReport);
      }else {
         String code = patrolTaskReport.getAdCode();
         if (code.substring(0,4).indexOf("00") > -1) {
            //前4位包含00 =》省
            patrolTaskReport.setAdCode(code.substring(0,2));
         } else if (code.substring(0,6).indexOf("00") > -1) {
            //前六位包含00 =》市
            patrolTaskReport.setAdCode(code.substring(0,4));
         }
         list = baseMapper.getTaskReportDetailRegion(page,patrolTaskReport);
      }
      return page.setRecords(list);
   }
   @Transactional(rollbackFor = Exception.class)
   public void saveReport(PatrolTask patrolTask){
      //拿到当前任务下的异常巡查记录
      PatrolRecord patrolRecord = new PatrolRecord();
      patrolRecord.setTaskId(patrolTask.getId().toString());
      patrolRecord.setStatus(2);
      patrolRecord.setSolution("2");
      List<PatrolRecord> list = patrolRecordService.list(Condition.getQueryWrapper(patrolRecord));
      //向上报表中添加数据
      list.forEach(record->{
         PatrolReport patrolReport = new PatrolReport();
         patrolReport.setContent(record.getContent());
         patrolReport.setImages(record.getImages());
         patrolReport.setVideos(record.getVideos());
         patrolReport.setItemId(record.getItemId());
         patrolReport.setSolution(record.getSolution());
         patrolReport.setTaskId(record.getTaskId());
         patrolReport.setRecordId(record.getId().toString());
         patrolReport.setStatus(record.getStatus());
         patrolReportService.save(patrolReport);
      });
   }
}