吉安感知网项目-后端
linwei
2026-01-31 bcc36efe5fd3264625bb884e50c2f353fb052b61
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
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 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;
 
/**
 * 工单任务表 服务实现类
 *
 * @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 "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.<GdPatrolTaskEntity>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;
    }
}