/* * 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 com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; 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.GdWorkOrderEntity; import org.sxkj.gd.workorder.entity.GdWorkOrderFlowEntity; 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.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; @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 saveWorkOrder(WorkOrderAddParam workOrderParam) { GdWorkOrderEntity entity = Objects.requireNonNull(BeanUtil.copy(workOrderParam, GdWorkOrderEntity.class)); // 验证并格式化几何数据 String geom = entity.getGeom(); String validatedGeom = GeomUtils.validateAndFormatGeom(geom); 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); } entity.setCreateUser(AuthUtil.getUserId()); entity.setCreateDept(Long.valueOf(AuthUtil.getDeptId())); boolean save = save(entity); // 保存成功 if (save){ // 保存流转记录 GdWorkOrderFlowEntity gdWorkOrderFlowEntity = new GdWorkOrderFlowEntity(); gdWorkOrderFlowEntity.setCreateUser(AuthUtil.getUserId()); gdWorkOrderFlowEntity.setWorkOrderId(entity.getId()); gdWorkOrderFlowEntity.setFlowName(WorkOrderStatusEnum.STAGE_WORK_ORDER_RELEASE.getStageDesc()); 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.WORK_ORDER_TASK.getValue()); gdWorkOrderFlowEntity.setAreaCode(entity.getAreaCode()); gdWorkOrderFlowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId())); boolean save1 = gdWorkOrderFlowService.save(gdWorkOrderFlowEntity); return save1; } return false; } /** * 处理工单状态变更(接单或拒接接单) * @param statusParam * @return */ @Override @Transactional(rollbackFor = Exception.class) public boolean handleWorkOrderStatus(WorkOrderStatusParam statusParam) { // 获取工单信息 GdWorkOrderEntity workOrder = getById(statusParam.getWorkOrderId()); if (workOrder == null) { return false; } // 检查工单当前状态是否为发布中_接单中(10) if (!workOrder.getWorkOrderStatus().equals(WorkOrderStatusEnum.PUBLISHING_ACCEPTING.getCode())) { return false; } // 操作类型:1接单,2拒接接单 Integer operationType = statusParam.getOperationType(); Byte newStatus = null; String flowName = null; String flowDesc = null; if (operationType == 1) { // 接单操作:更新状态为响应中_待拆分(20) newStatus = WorkOrderStatusEnum.RESPONDING_TO_BE_SPLIT.getCode(); flowName = WorkOrderStatusEnum.RESPONDING_TO_BE_SPLIT.getStageDesc(); flowDesc = AuthUtil.getUserName() + " " + org.springblade.core.tool.utils.DateUtil.format(new Date(), CommonConstant.YYYY_MM_DD_HH_MM_SS); } else if (operationType == 2) { // 拒接接单操作:更新状态为发布中_拒绝接单(11) newStatus = WorkOrderStatusEnum.PUBLISHING_REJECTING.getCode(); flowName = WorkOrderStatusEnum.PUBLISHING_REJECTING.getStageDesc(); flowDesc = AuthUtil.getUserName() + " " + org.springblade.core.tool.utils.DateUtil.format(new Date(), CommonConstant.YYYY_MM_DD_HH_MM_SS) ; } else { // 无效的操作类型 return false; } // 更新工单状态 workOrder.setWorkOrderStatus(newStatus); workOrder.setUpdateUser(AuthUtil.getUserId()); workOrder.setUpdateTime(new Date()); boolean update = updateById(workOrder); // 更新成功,保存流转记录 if (update) { GdWorkOrderFlowEntity flowEntity = new GdWorkOrderFlowEntity(); flowEntity.setCreateUser(AuthUtil.getUserId()); flowEntity.setWorkOrderId(workOrder.getId()); flowEntity.setFlowName(flowName); flowEntity.setFlowDesc(flowDesc); 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); } return false; } }