package org.sxkj.gd.workorder.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.extern.slf4j.Slf4j; 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.WordOrderConstant; import org.sxkj.common.utils.GeomUtils; import org.sxkj.common.utils.OrderNumUtils; import org.sxkj.gd.utils.GdGeoAddressUtil; 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 org.sxkj.system.cache.SysCache; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 工单任务表 服务实现类 * * @author lw * @since 2026-01-14 */ @Slf4j @Service public class GdWorkOrderServiceImpl extends BaseServiceImpl implements IGdWorkOrderService { @Autowired private IGdWorkOrderFlowService gdWorkOrderFlowService; @Autowired private IGdPatrolTaskService gdPatrolTaskService; @Override public GdWorkOrderVO getWorkOrderDetail(GdWorkOrderEntity gdWorkOrder) { return baseMapper.getWorkOrderDetail(gdWorkOrder); } @Override public IPage selectGdWorkOrderPage(IPage page, WorkOrderPageParam gdWorkOrder) { if (gdWorkOrder.getIsQueryAll()) { List deptList = new ArrayList<>(); if (!(AuthUtil.isAdministrator() || AuthUtil.isAdmin())) { deptList = SysCache.getDeptChildIds(Long.valueOf(AuthUtil.getDeptId())); } gdWorkOrder.setDeptList(deptList); } 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; } @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); // 从几何数据中提取中心点坐标,用于获取行政区划编码 double[] centerCoords = GeomUtils.extractCenterPoint(validatedGeom); if (centerCoords == null || centerCoords.length < 2) { return false; } String countyCode = GdGeoAddressUtil.getTownCode(centerCoords[0], centerCoords[1]); entity.setAreaCode(countyCode); // 生成工单编号 if (StringUtils.isBlank(entity.getWorkOrderCode())) { String timestamp = OrderNumUtils.initOrderNum(WordOrderConstant.ORDER_REDIS_KEY); entity.setWorkOrderCode(WordOrderConstant.ORDER_PREFIX + timestamp); } // 保存操作 Boolean saveResult; Date now = new Date(); WorkOrderStatusEnum newStatusEnum = WorkOrderStatusEnum.PUBLISHING_ACCEPTING; if (entity.getId() != null) { // 更新操作 entity.setUpdateUser(AuthUtil.getUserId()); entity.setUpdateTime(now); // 状态转换:拒绝状态修改后自动转换为待处理状态 switch (entity.getWorkOrderStatus()) { case "11": // 发布中_拒绝接单 → 发布中_接单中 entity.setWorkOrderStatus(WorkOrderStatusEnum.PUBLISHING_ACCEPTING.getCode()); newStatusEnum = WorkOrderStatusEnum.PUBLISHING_ACCEPTING; break; case "20": // 响应中_待拆分 → 响应中_申请修改 entity.setWorkOrderStatus(WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY.getCode()); newStatusEnum = WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY; // 生成快照 GdWorkOrderEntity orderEntity = baseMapper.getWorkOrderByIdWithoutGeom(entity.getId()); // 直接生成快照,无需处理geom字段 entity.setFullSnapshot(JSON.toJSONString(orderEntity)); break; } saveResult = updateById(entity); } else { // 新增操作 entity.setCreateUser(AuthUtil.getUserId()); entity.setCreateTime(now); entity.setCreateDept(Long.valueOf(AuthUtil.getDeptId())); entity.setStatus(1); entity.setIsDeleted(0); saveResult = save(entity); } // 保存成功则保存流转记录 if (saveResult) { // 构建并保存流转记录 GdWorkOrderFlowEntity flowEntity = new GdWorkOrderFlowEntity(); flowEntity.setCreateUser(AuthUtil.getUserId()); flowEntity.setWorkOrderId(entity.getId()); flowEntity.setFlowName(newStatusEnum.getStageDesc()); flowEntity.setFlowDesc(newStatusEnum.getDesc()); flowEntity.setOperator(AuthUtil.getNickName()); flowEntity.setType(WorkOrderTypeEnum.WORK_ORDER_TASK.getValue()); flowEntity.setFlowStatus(newStatusEnum.getMaxCode()); flowEntity.setWorkStatus(newStatusEnum.getCode()); 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.同意修改 11.结算 // 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_TO_BE_SPLIT; break; case 8: // 不同意修改 newStatusEnum = WorkOrderStatusEnum.RESPONDING_TO_BE_SPLIT; 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; case 11: // 结算 --> 结算完成 newStatusEnum = WorkOrderStatusEnum.SETTLEMENT_COMPLETED; break; default: // 无效操作类型 return false; } // 4. 更新工单状态 Date now = new Date(); if (operationType == 8) { // 不同意修改,需要把快照回滚 GdWorkOrderEntity snapshotEntity = (GdWorkOrderEntity) JSON.parseObject(workOrder.getFullSnapshot(), GdWorkOrderEntity.class); snapshotEntity.setId(workOrder.getId()); // 保持原ID snapshotEntity.setUpdateUser(AuthUtil.getUserId()); snapshotEntity.setUpdateTime(now); workOrder = snapshotEntity; } else { workOrder.setWorkOrderStatus(newStatusEnum.getCode()); workOrder.setUpdateUser(AuthUtil.getUserId()); workOrder.setUpdateTime(now); workOrder.setGeom(null); workOrder.setRejectReason(statusParam.getRejectReason()); } boolean updateResult = updateById(workOrder); // 5. 把待验收的都改为待签收状态 if (operationType == 10) { return gdPatrolTaskService.update(Wrappers.lambdaUpdate() .set(GdPatrolTaskEntity::getTaskStatus, PatrolTaskStatusEnum.PENDING_SIGNING.getValue()) .eq(GdPatrolTaskEntity::getWorkOrderId, workOrder.getId()) .in(GdPatrolTaskEntity::getTaskStatus, PatrolTaskStatusEnum.AUDIT_PASSED.getValue(), PatrolTaskStatusEnum.PENDING_ACCEPTANCE.getValue()) ); } // 6. 保存流转记录 if (updateResult) { GdWorkOrderFlowEntity flowEntity = new GdWorkOrderFlowEntity(); flowEntity.setCreateUser(AuthUtil.getUserId()); flowEntity.setWorkOrderId(workOrder.getId()); flowEntity.setFlowName(newStatusEnum.getStageDesc()); flowEntity.setFlowDesc(newStatusEnum.getDesc()); flowEntity.setOperator(AuthUtil.getNickName()); flowEntity.setType(WorkOrderTypeEnum.WORK_ORDER_TASK.getValue()); flowEntity.setFlowStatus(newStatusEnum.getMaxCode()); flowEntity.setWorkStatus(newStatusEnum.getCode()); flowEntity.setAreaCode(workOrder.getAreaCode()); flowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId())); return gdWorkOrderFlowService.save(flowEntity); } return false; } }