package org.sxkj.gd.workorder.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.apache.commons.lang3.StringUtils; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.BeanUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.sxkj.common.constant.CommonConstant; import org.sxkj.common.constant.WordOrderConstant; import org.sxkj.common.utils.GeomUtils; import org.sxkj.common.utils.OrderNumUtils; import org.sxkj.gd.workorder.entity.GdPatrolTaskEntity; import org.sxkj.gd.workorder.entity.GdWorkOrderEntity; 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.excel.GdWorkOrderExcel; import org.sxkj.gd.workorder.mapper.GdWorkOrderMapper; import org.sxkj.gd.workorder.param.WorkOrderAddParam; import org.sxkj.gd.workorder.param.WorkOrderPageParam; import org.sxkj.gd.workorder.param.WorkOrderStatusParam; import org.sxkj.gd.workorder.service.IGdPatrolTaskService; import org.sxkj.gd.workorder.service.IGdWorkOrderFlowService; import org.sxkj.gd.workorder.service.IGdWorkOrderService; import org.sxkj.gd.workorder.vo.GdWorkOrderVO; import java.util.Date; import java.util.List; import java.util.Objects; /** * 工单任务表 服务实现类 * * @author lw * @since 2026-01-14 */ @Service public class GdWorkOrderServiceImpl extends BaseServiceImpl implements IGdWorkOrderService { @Autowired private IGdWorkOrderFlowService gdWorkOrderFlowService; @Autowired private IGdPatrolTaskService gdPatrolTaskService; @Override public GdWorkOrderEntity getWorkOrderDetail(GdWorkOrderEntity gdWorkOrder) { return baseMapper.getWorkOrderDetail(gdWorkOrder); } @Override public IPage selectGdWorkOrderPage(IPage page, WorkOrderPageParam gdWorkOrder) { return page.setRecords(baseMapper.selectGdWorkOrderPage(page, gdWorkOrder)); } @Override public List exportGdWorkOrder(Wrapper queryWrapper) { List gdWorkOrderList = baseMapper.exportGdWorkOrder(queryWrapper); // gdWorkOrderList.forEach(gdWorkOrder -> { // gdWorkOrder.setTypeName(DictCache.getValue(DictEnum.YES_NO, GdWorkOrder.getType())); //}); return gdWorkOrderList; } /** * 保存工单任务表 * * @param workOrderParam * @return */ @Override @Transactional(rollbackFor = Exception.class) public boolean saveOrUpdateWorkOrder(WorkOrderAddParam workOrderParam) { // 参数转换 GdWorkOrderEntity entity = BeanUtil.copy(workOrderParam, GdWorkOrderEntity.class); // 验证并格式化几何数据 String validatedGeom = GeomUtils.validateAndFormatGeom(entity.getGeom()); if (validatedGeom == null) { return false; } entity.setGeom(validatedGeom); // 生成工单编号 if (StringUtils.isBlank(entity.getWorkOrderCode())) { String timestamp = OrderNumUtils.initOrderNum(WordOrderConstant.ORDER_REDIS_KEY); entity.setWorkOrderCode(WordOrderConstant.ORDER_PREFIX + timestamp); } // 保存操作 Integer saveResult; Date now = new Date(); if (entity.getId() != null) { // 更新操作 entity.setUpdateUser(AuthUtil.getUserId()); entity.setUpdateTime(now); // 状态转换:拒绝状态修改后自动转换为待处理状态 switch (entity.getWorkOrderStatus()) { case "11": // 发布中_拒绝接单 → 发布中_接单中 entity.setWorkOrderStatus(WorkOrderStatusEnum.PUBLISHING_ACCEPTING.getCode()); break; case "24": // 响应中_拒绝取消 → 响应中_申请取消 entity.setWorkOrderStatus(WorkOrderStatusEnum.RESPONDING_APPLY_CANCEL.getCode()); break; case "20": // 响应中_待拆分 → 响应中_申请修改 case "25": // 响应中_拒绝修改 → 响应中_申请修改 entity.setWorkOrderStatus(WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY.getCode()); break; } saveResult = baseMapper.updateWorkOrderById(entity); } else { // 新增操作 entity.setCreateUser(AuthUtil.getUserId()); entity.setCreateTime(now); entity.setCreateDept(Long.valueOf(AuthUtil.getDeptId())); entity.setStatus(1); entity.setIsDeleted(0); saveResult = baseMapper.saveWorkOrder(entity); } // 保存成功则保存流转记录 if (saveResult > 0) { // 构建并保存流转记录 GdWorkOrderFlowEntity flowEntity = new GdWorkOrderFlowEntity(); flowEntity.setCreateUser(AuthUtil.getUserId()); flowEntity.setWorkOrderId(entity.getId()); flowEntity.setFlowName(WorkOrderStatusEnum.STAGE_WORK_ORDER_RELEASE.getStageDesc()); flowEntity.setFlowDesc(String.format("%s %s", AuthUtil.getUserName(), org.springblade.core.tool.utils.DateUtil.format(now, "yyyy-MM-dd HH:mm:ss"))); flowEntity.setOperator(AuthUtil.getUserName()); flowEntity.setType(WorkOrderTypeEnum.WORK_ORDER_TASK.getValue()); flowEntity.setAreaCode(entity.getAreaCode()); flowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId())); return gdWorkOrderFlowService.save(flowEntity); } return false; } /** * 处理工单状态变更(接单或拒接接单) * * @param statusParam * @return */ @Override @Transactional(rollbackFor = Exception.class) public boolean handleWorkOrderStatus(WorkOrderStatusParam statusParam) { // 1. 获取工单信息 GdWorkOrderEntity workOrder = getById(statusParam.getWorkOrderId()); if (workOrder == null) { return false; } // 2. 状态权限校验 WorkOrderStatusEnum currentStatus = WorkOrderStatusEnum.getByCode(workOrder.getWorkOrderStatus()); Integer operationType = statusParam.getOperationType(); if (currentStatus == null || !currentStatus.isAllowedOperation(operationType)) { return false; } // 1接单,2拒接接单,3申请取消,4申请修改, 5同意取消 6不同意取消 7.同意修改 8.不同意修改 9.协商修改 10.同意修改 // 3. 确定新状态和流转名称 WorkOrderStatusEnum newStatusEnum; switch (operationType) { case 1: // 接单 case 7: // 同意修改 newStatusEnum = WorkOrderStatusEnum.RESPONDING_TO_BE_SPLIT; workOrder.setServiceParty(AuthUtil.getNickName()); break; case 2: // 拒接接单 newStatusEnum = WorkOrderStatusEnum.PUBLISHING_REJECTING; workOrder.setServiceParty(AuthUtil.getNickName()); break; case 3: // 申请取消 newStatusEnum = WorkOrderStatusEnum.RESPONDING_APPLY_CANCEL; break; case 4: // 申请修改 newStatusEnum = WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY; break; case 5: // 同意取消 newStatusEnum = WorkOrderStatusEnum.RESPONDING_CANCELED; workOrder.setServiceParty(AuthUtil.getNickName()); break; case 6: // 不同意取消 newStatusEnum = WorkOrderStatusEnum.RESPONDING_REJECT_CANCEL; break; case 8: // 不同意修改 newStatusEnum = WorkOrderStatusEnum.RESPONDING_REJECT_MODIFY; workOrder.setServiceParty(AuthUtil.getNickName()); break; case 9: // 协商修改 --> 协商修改 newStatusEnum = WorkOrderStatusEnum.EXECUTING_NEGOTIATE_MODIFY; workOrder.setServiceParty(AuthUtil.getNickName()); break; case 10: // 同意协商修改 --> 待拆分 newStatusEnum = WorkOrderStatusEnum.RESPONDING_TO_BE_SPLIT; break; default: // 无效操作类型 return false; } // 4. 更新工单状态 Date now = new Date(); workOrder.setWorkOrderStatus(newStatusEnum.getCode()); workOrder.setUpdateUser(AuthUtil.getUserId()); workOrder.setGeom(null); workOrder.setUpdateTime(now); workOrder.setRejectReason(statusParam.getRejectReason()); boolean updateResult = updateById(workOrder); // 5. 保存流转记录 if (updateResult) { GdWorkOrderFlowEntity flowEntity = new GdWorkOrderFlowEntity(); flowEntity.setCreateUser(AuthUtil.getUserId()); flowEntity.setWorkOrderId(workOrder.getId()); flowEntity.setFlowName(newStatusEnum.getStageDesc()); flowEntity.setFlowDesc(String.format("%s %s", AuthUtil.getUserName(), org.springblade.core.tool.utils.DateUtil.format(now, CommonConstant.YYYY_MM_DD_HH_MM_SS))); flowEntity.setOperator(AuthUtil.getUserName()); flowEntity.setType(WorkOrderTypeEnum.WORK_ORDER_TASK.getValue()); flowEntity.setAreaCode(workOrder.getAreaCode()); flowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId())); return gdWorkOrderFlowService.save(flowEntity); } // 6. 把待验收的都改为待签收状态 if (operationType == 10) { boolean update = gdPatrolTaskService.update(Wrappers.lambdaUpdate() .set(GdPatrolTaskEntity::getTaskStatus, PatrolTaskStatusEnum.PENDING_SIGNING.getValue()) .eq(GdPatrolTaskEntity::getWorkOrderId, workOrder.getId()) .eq(GdPatrolTaskEntity::getTaskStatus, PatrolTaskStatusEnum.PENDING_ACCEPTANCE.getValue()) ); } return false; } }