package org.sxkj.gd.workorder.service.impl;
|
|
import com.alibaba.druid.support.json.JSONUtils;
|
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 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 org.sxkj.system.cache.SysCache;
|
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
|
/**
|
* 工单任务表 服务实现类
|
*
|
* @author lw
|
* @since 2026-01-14
|
*/
|
@Service
|
public class GdWorkOrderServiceImpl extends BaseServiceImpl<GdWorkOrderMapper, GdWorkOrderEntity> implements IGdWorkOrderService {
|
|
@Autowired
|
private IGdWorkOrderFlowService gdWorkOrderFlowService;
|
@Autowired
|
private IGdPatrolTaskService gdPatrolTaskService;
|
|
@Override
|
public GdWorkOrderEntity getWorkOrderDetail(GdWorkOrderEntity gdWorkOrder) {
|
return baseMapper.getWorkOrderDetail(gdWorkOrder);
|
}
|
|
@Override
|
public IPage<GdWorkOrderVO> selectGdWorkOrderPage(IPage<GdWorkOrderVO> page, WorkOrderPageParam gdWorkOrder) {
|
if (gdWorkOrder.getIsQueryAll()) {
|
List<Long> deptList = SysCache.getDeptChildIds(Long.valueOf(AuthUtil.getDeptId()));
|
gdWorkOrder.setDeptList(deptList);
|
}
|
return page.setRecords(baseMapper.selectGdWorkOrderPage(page, gdWorkOrder));
|
}
|
|
|
@Override
|
public List<GdWorkOrderExcel> exportGdWorkOrder(Wrapper<GdWorkOrderEntity> queryWrapper) {
|
List<GdWorkOrderExcel> 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);
|
}
|
|
// 保存操作
|
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 "24": // 响应中_拒绝取消 → 响应中_申请取消
|
// entity.setWorkOrderStatus(WorkOrderStatusEnum.RESPONDING_APPLY_CANCEL.getCode());
|
// newStatusEnum = WorkOrderStatusEnum.RESPONDING_APPLY_CANCEL;
|
// 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;
|
// case "25": // 响应中_拒绝修改 → 响应中_申请修改
|
// entity.setWorkOrderStatus(WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY.getCode());
|
// newStatusEnum = WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY;
|
// 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(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.同意修改 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 (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.<GdPatrolTaskEntity>lambdaUpdate()
|
.set(GdPatrolTaskEntity::getTaskStatus, PatrolTaskStatusEnum.PENDING_SIGNING.getValue())
|
.eq(GdPatrolTaskEntity::getWorkOrderId, workOrder.getId())
|
.eq(GdPatrolTaskEntity::getTaskStatus, PatrolTaskStatusEnum.PENDING_ACCEPTANCE.getValue())
|
);
|
}
|
|
return false;
|
}
|
}
|