吉安感知网项目-后端
linwei
2026-01-19 0772aaa85b37435ef04cd537c83fcab4e26991f1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/*
 *      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<GdWorkOrderMapper, GdWorkOrderEntity> implements IGdWorkOrderService {
 
    @Autowired
    private IGdWorkOrderFlowService gdWorkOrderFlowService;
 
    @Override
    public IPage<GdWorkOrderVO> selectGdWorkOrderPage(IPage<GdWorkOrderVO> page, WorkOrderPageParam gdWorkOrder) {
        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 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;
    }
}