/* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package org.sxkj.gd.workorder.service.impl; import org.apache.commons.lang3.StringUtils; import org.springblade.core.secure.utils.AuthUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.sxkj.common.constant.WordOrderConstant; import org.sxkj.common.utils.OrderNumUtils; import org.sxkj.gd.workorder.entity.GdPatrolTaskEntity; import org.sxkj.gd.workorder.entity.GdWorkOrderFlowEntity; import org.sxkj.gd.workorder.enums.PatrolTaskStatusEnum; import org.sxkj.gd.workorder.enums.WorkOrderStatusEnum; import org.sxkj.gd.workorder.enums.WorkOrderTypeEnum; import org.sxkj.gd.workorder.service.IGdWorkOrderFlowService; import org.sxkj.gd.workorder.vo.GdPatrolTaskVO; import org.sxkj.gd.workorder.excel.GdPatrolTaskExcel; import org.sxkj.gd.workorder.mapper.GdPatrolTaskMapper; import org.sxkj.gd.workorder.service.IGdPatrolTaskService; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseServiceImpl; import java.util.Date; import java.util.List; /** * 巡查任务表 服务实现类 * * @author lw * @since 2026-01-14 */ @Service public class GdPatrolTaskServiceImpl extends BaseServiceImpl implements IGdPatrolTaskService { @Autowired private IGdWorkOrderFlowService gdWorkOrderFlowService; @Override public IPage selectGdPatrolTaskPage(IPage page, GdPatrolTaskVO gdPatrolTask) { return page.setRecords(baseMapper.selectGdPatrolTaskPage(page, gdPatrolTask)); } @Override public List exportGdPatrolTask(Wrapper queryWrapper) { List gdPatrolTaskList = baseMapper.exportGdPatrolTask(queryWrapper); //gdPatrolTaskList.forEach(gdPatrolTask -> { // gdPatrolTask.setTypeName(DictCache.getValue(DictEnum.YES_NO, GdPatrolTask.getType())); //}); return gdPatrolTaskList; } @Override @Transactional(rollbackFor = Exception.class) public boolean savePatrolTask(List taskEntityList) { // 更新流程节点 for (GdPatrolTaskEntity gdPatrolTaskEntity : taskEntityList) { // 生成巡查任务编号 if (StringUtils.isBlank(gdPatrolTaskEntity.getTaskNo())) { // 使用时间戳生成唯一巡查任务编号 String timestamp = OrderNumUtils.initOrderNum(WordOrderConstant.PATROL_TASK_KEY); gdPatrolTaskEntity.setTaskNo(WordOrderConstant.PATROL_TASK_PREFIX + timestamp); } // 保存巡逻任务 boolean save = save(gdPatrolTaskEntity); if (!save) { // 任务保存失败,抛出异常触发回滚 throw new RuntimeException("保存巡逻任务失败:" + gdPatrolTaskEntity.toString()); } // 保存流转记录 GdWorkOrderFlowEntity gdWorkOrderFlowEntity = new GdWorkOrderFlowEntity(); gdWorkOrderFlowEntity.setCreateUser(AuthUtil.getUserId()); gdWorkOrderFlowEntity.setWorkOrderId(gdPatrolTaskEntity.getId()); gdWorkOrderFlowEntity.setFlowName(PatrolTaskStatusEnum.PENDING_SIGNING.getDesc()); gdWorkOrderFlowEntity.setFlowDesc(AuthUtil.getUserName() + " " + org.springblade.core.tool.utils.DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); gdWorkOrderFlowEntity.setOperator(AuthUtil.getUserName()); gdWorkOrderFlowEntity.setType(WorkOrderTypeEnum.PATROL_TASK.getValue()); gdWorkOrderFlowEntity.setAreaCode(gdPatrolTaskEntity.getAreaCode()); gdWorkOrderFlowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId())); boolean save1 = gdWorkOrderFlowService.save(gdWorkOrderFlowEntity); if (!save1) { // 流转记录保存失败,抛出异常触发回滚 throw new RuntimeException("保存流转记录失败:" + gdWorkOrderFlowEntity.toString()); } } // 所有任务和流转记录都保存成功 return true; } @Override @Transactional(rollbackFor = Exception.class) public boolean auditPatrolTask(Long id, String auditStatus, String rejectReason) { // 1. 获取巡查任务 GdPatrolTaskEntity task = getById(id); if (task == null) { throw new RuntimeException("巡查任务不存在"); } // 2. 检查任务状态是否为待审核 if (!PatrolTaskStatusEnum.PENDING_AUDIT.getValue().equals(task.getTaskStatus().toString())) { throw new RuntimeException("任务当前状态无法审核"); } // 3. 如果审核拒绝,检查拒绝原因是否为空 if (PatrolTaskStatusEnum.REJECTED_SIGNING.getValue().equals(auditStatus) && (rejectReason == null || rejectReason.trim().isEmpty())) { throw new RuntimeException("拒绝签收时必须填写拒绝原因"); } // 4. 检查其他需要拒绝原因的状态 if ((PatrolTaskStatusEnum.AUDIT_REJECTED.getValue().equals(auditStatus) || PatrolTaskStatusEnum.REJECTED_ACCEPTANCE.getValue().equals(auditStatus)) && (rejectReason == null || rejectReason.trim().isEmpty())) { throw new RuntimeException("审核驳回或拒绝验收时必须填写拒绝原因"); } // 4. 更新任务状态 task.setTaskStatus(Byte.valueOf(auditStatus)); boolean updateResult = updateById(task); if (!updateResult) { throw new RuntimeException("更新任务状态失败"); } // 5. 保存流转记录 GdWorkOrderFlowEntity flowEntity = new GdWorkOrderFlowEntity(); flowEntity.setCreateUser(AuthUtil.getUserId()); flowEntity.setWorkOrderId(id); // 设置流转名称和描述 String[] flowInfo = buildFlowInfo(auditStatus, rejectReason); String flowName = flowInfo[0]; String flowDesc = AuthUtil.getUserName() + " " + org.springblade.core.tool.utils.DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss") + flowInfo[1]; flowEntity.setFlowName(flowName); flowEntity.setFlowDesc(flowDesc); flowEntity.setOperator(AuthUtil.getUserName()); flowEntity.setType(WorkOrderTypeEnum.PATROL_TASK.getValue()); flowEntity.setAreaCode(task.getAreaCode()); flowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId())); boolean saveFlowResult = gdWorkOrderFlowService.save(flowEntity); if (!saveFlowResult) { throw new RuntimeException("保存流转记录失败"); } return true; } /** * 构建流转信息 * @param status 状态值 * @param rejectReason 拒绝原因 * @return 包含流转名称和描述的数组 [flowName, flowDescSuffix] */ private String[] buildFlowInfo(String status, String rejectReason) { String flowName; String flowDescSuffix; switch (status) { case "0": flowName = PatrolTaskStatusEnum.PENDING_SIGNING.getDesc(); flowDescSuffix = " 待签收"; break; case "1": flowName = PatrolTaskStatusEnum.REJECTED_SIGNING.getDesc(); flowDescSuffix = " 拒绝签收:" + rejectReason; break; case "2": flowName = PatrolTaskStatusEnum.WITHDRAWN.getDesc(); flowDescSuffix = " 已撤回"; break; case "3": flowName = PatrolTaskStatusEnum.PENDING_AUDIT.getDesc(); flowDescSuffix = " 待审核"; break; case "4": flowName = PatrolTaskStatusEnum.AUDIT_REJECTED.getDesc(); flowDescSuffix = " 审核驳回:" + rejectReason; break; case "5": flowName = PatrolTaskStatusEnum.AUDIT_PASSED.getDesc(); flowDescSuffix = " 审核通过"; break; case "6": flowName = PatrolTaskStatusEnum.PENDING_ACCEPTANCE.getDesc(); flowDescSuffix = " 待验收"; break; case "7": flowName = PatrolTaskStatusEnum.REJECTED_ACCEPTANCE.getDesc(); flowDescSuffix = " 拒绝验收:" + rejectReason; break; case "8": flowName = PatrolTaskStatusEnum.ACCEPTANCE_PASSED.getDesc(); flowDescSuffix = " 验收通过"; break; default: flowName = "未知状态"; flowDescSuffix = " 未知状态"; break; } return new String[]{flowName, flowDescSuffix}; } }