From fe5f22b7bb4eee2981cfdb090da7c83a5421aec0 Mon Sep 17 00:00:00 2001 From: litao Date: Tue, 5 Nov 2024 19:03:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(workOrder):=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增数据权限控制,支持不同角色查看相应工单 - 增加工单驳回和关闭功能 -优化附件和材料保存逻辑 - 修复了一些已知问题 --- .../capital/controller/ApplyController.java | 16 ---- .../modules/capital/entity/Apply.java | 7 ++ .../controller/WorkOrderController.java | 90 +++++++++++-------- .../modules/workOrder/dto/WorkOrderDTO.java | 5 ++ .../modules/workOrder/entity/WorkOrder.java | 17 ++++ .../entity/WorkOrderRepairMaterial.java | 27 ++++++ .../workOrder/service/IWorkOrderService.java | 2 + .../impl/KnowledgeBaseServiceImpl.java | 68 ++++++++++---- .../service/impl/WorkOrderServiceImpl.java | 38 +++++++- 9 files changed, 195 insertions(+), 75 deletions(-) diff --git a/src/main/java/org/springblade/modules/capital/controller/ApplyController.java b/src/main/java/org/springblade/modules/capital/controller/ApplyController.java index fa3786b..0cae798 100644 --- a/src/main/java/org/springblade/modules/capital/controller/ApplyController.java +++ b/src/main/java/org/springblade/modules/capital/controller/ApplyController.java @@ -1,19 +1,3 @@ -/* - * 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.springblade.modules.capital.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; diff --git a/src/main/java/org/springblade/modules/capital/entity/Apply.java b/src/main/java/org/springblade/modules/capital/entity/Apply.java index bdb05fc..4a20a0e 100644 --- a/src/main/java/org/springblade/modules/capital/entity/Apply.java +++ b/src/main/java/org/springblade/modules/capital/entity/Apply.java @@ -29,6 +29,13 @@ public class Apply extends BaseEntity { */ @ApiModelProperty(value = "") private String code; + + /** + * 工单id + */ + @ApiModelProperty(value = "") + private Long workId; + /** * 申领人 */ diff --git a/src/main/java/org/springblade/modules/workOrder/controller/WorkOrderController.java b/src/main/java/org/springblade/modules/workOrder/controller/WorkOrderController.java index d597965..87bbab1 100644 --- a/src/main/java/org/springblade/modules/workOrder/controller/WorkOrderController.java +++ b/src/main/java/org/springblade/modules/workOrder/controller/WorkOrderController.java @@ -8,21 +8,19 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import lombok.AllArgsConstructor; + import javax.validation.Valid; +import org.springblade.core.log.annotation.ApiLog; import org.springblade.core.secure.BladeUser; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; -import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.Func; import org.springblade.modules.workOrder.dto.WorkOrderDTO; import org.springblade.modules.workOrder.entity.Device; -import org.springblade.modules.workOrder.entity.WorkOrderAttach; -import org.springblade.modules.workOrder.entity.WorkOrderRepairMaterial; import org.springblade.modules.workOrder.service.IDeviceService; -import org.springblade.modules.workOrder.service.IWorkOrderAttachService; -import org.springblade.modules.workOrder.service.IWorkOrderRepairMaterialService; import org.springframework.web.bind.annotation.*; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -53,9 +51,7 @@ import javax.servlet.http.HttpServletResponse; public class WorkOrderController extends BladeController { private final IWorkOrderService workOrderService; - private final IWorkOrderAttachService attachService; private final IDeviceService deviceService; - private final IWorkOrderRepairMaterialService materialService; /** * 工单表 详情 @@ -67,6 +63,7 @@ public class WorkOrderController extends BladeController { WorkOrderVO detail = workOrderService.detail(workOrder); return R.data(detail); } + /** * 工单表 分页 */ @@ -74,12 +71,19 @@ public class WorkOrderController extends BladeController { @ApiOperationSupport(order = 2) @ApiOperation(value = "分页", notes = "传入workOrder") public R> list(@ApiIgnore WorkOrderDTO workOrderDTO, Query query) { - LambdaQueryWrapper eq = Wrappers.lambdaQuery(WorkOrder.class) -// .eq(StringUtils.isNotBlank(AuthUtil.getDeptId()), WorkOrder::getCreateDept, AuthUtil.getDeptId()) - .eq(StringUtils.isNotBlank(workOrderDTO.getFaultLocation()), WorkOrder::getFaultLocation, workOrderDTO.getFaultLocation()) + LambdaQueryWrapper eq = Wrappers.lambdaQuery(WorkOrder.class); + // 数据权限 + if (StringUtils.isNotBlank(workOrderDTO.getDataType())) { + eq.eq("1".equals(workOrderDTO.getDataType()), WorkOrder::getCreateUser, AuthUtil.getUserId());// 客户 + eq.in("2".equals(workOrderDTO.getDataType()), WorkOrder::getCreateDept, Func.toLongList(AuthUtil.getDeptId()));// 客服 + eq.eq("3".equals(workOrderDTO.getDataType()), WorkOrder::getMaintenanceTeam, AuthUtil.getDeptId());// 维修负责人 + eq.eq("4".equals(workOrderDTO.getDataType()), WorkOrder::getRepairPerson, AuthUtil.getUserId());// 维修人员 + } + eq.eq(StringUtils.isNotBlank(workOrderDTO.getFaultLocation()), WorkOrder::getFaultLocation, workOrderDTO.getFaultLocation()) .eq(StringUtils.isNotBlank(workOrderDTO.getFaultType()), WorkOrder::getFaultType, workOrderDTO.getFaultType()) .between(workOrderDTO.getStartTime() != null && workOrderDTO.getEndTime() != null, WorkOrder::getCreateTime, workOrderDTO.getStartTime(), workOrderDTO.getEndTime()) .orderByDesc(WorkOrder::getCreateTime); + IPage pages = workOrderService.page(Condition.getPage(query), eq); List records = pages.getRecords(); for (WorkOrder record : records) { @@ -102,8 +106,9 @@ public class WorkOrderController extends BladeController { } /** - * 工单表 新增 + * 工单表 提交 */ + @ApiLog(value = "提报管理-工单提交") @PostMapping("/save") @ApiOperationSupport(order = 4) @ApiOperation(value = "新增", notes = "传入workOrder") @@ -118,34 +123,7 @@ public class WorkOrderController extends BladeController { @ApiOperationSupport(order = 5) @ApiOperation(value = "修改", notes = "传入workOrder") public R update(@Valid @RequestBody WorkOrderVO workOrder) { - List picAttaches = workOrder.getPicAttaches(); - // 图片 - if (CollectionUtil.isNotEmpty(picAttaches)) { - attachService.remove(Wrappers.lambdaQuery(WorkOrderAttach.class).eq(WorkOrderAttach::getOrderId, workOrder.getId()).eq(WorkOrderAttach::getAttachType, 1)); - picAttaches.forEach(picAttache -> { - picAttache.setOrderId(workOrder.getId()); - picAttache.setAttachType(1); - } - ); - attachService.saveBatch(picAttaches); - } - // 视频 - List videoAttaches = workOrder.getVideoAttaches(); - if (CollectionUtil.isNotEmpty(videoAttaches)) { - attachService.remove(Wrappers.lambdaQuery(WorkOrderAttach.class).eq(WorkOrderAttach::getOrderId, workOrder.getId()).eq(WorkOrderAttach::getAttachType, 2)); - videoAttaches.forEach(videoAttache -> { - videoAttache.setOrderId(workOrder.getId()); - videoAttache.setAttachType(2); - }); - attachService.saveBatch(videoAttaches); - } - List materials = workOrder.getMaterials(); - // 维修材料 - if (CollectionUtil.isNotEmpty(materials)) { - materials.forEach(material -> material.setOrderId(workOrder.getId())); - materialService.saveBatch(materials); - } - return R.status(workOrderService.updateById(workOrder)); + return R.status(workOrderService.updateAttach(workOrder)); } /** @@ -188,10 +166,44 @@ public class WorkOrderController extends BladeController { /** * 评价签字 */ + @ApiLog(value = "提报管理-评价签字") @PostMapping("/evaluateSign") @ApiOperationSupport(order = 10) @ApiOperation(value = "评价签字", notes = "传入workOrder") public R evaluateSign(@Valid @RequestBody WorkOrderVO workOrder) { return R.status(workOrderService.evaluateSign(workOrder)); } + + /** + * 工单表 维修人员驳回 + */ + @ApiLog(value = "提报管理-维修人员驳回") + @PostMapping("/repairReject") + @ApiOperationSupport(order = 6) + @ApiOperation(value = "新增或修改", notes = "传入workOrder") + public R repairReject(@Valid @RequestBody WorkOrder workOrder) { + return R.status(workOrderService.updateById(workOrder)); + } + + /** + * 工单表 维修负责人驳回 + */ + @ApiLog(value = "提报管理-维修负责人驳回") + @PostMapping("/submitReject") + @ApiOperationSupport(order = 6) + @ApiOperation(value = "新增或修改", notes = "传入workOrder") + public R submitReject(@Valid @RequestBody WorkOrder workOrder) { + return R.status(workOrderService.updateById(workOrder)); + } + + /** + * 工单表 客服关闭 + */ + @ApiLog(value = "提报管理-工单关闭") + @PostMapping("/clone") + @ApiOperationSupport(order = 6) + @ApiOperation(value = "新增或修改", notes = "传入workOrder") + public R clone(@Valid @RequestBody WorkOrder workOrder) { + return R.status(workOrderService.updateById(workOrder)); + } } diff --git a/src/main/java/org/springblade/modules/workOrder/dto/WorkOrderDTO.java b/src/main/java/org/springblade/modules/workOrder/dto/WorkOrderDTO.java index 71736b4..08f8df4 100644 --- a/src/main/java/org/springblade/modules/workOrder/dto/WorkOrderDTO.java +++ b/src/main/java/org/springblade/modules/workOrder/dto/WorkOrderDTO.java @@ -42,4 +42,9 @@ public class WorkOrderDTO extends WorkOrder{ * 故障类型 */ private String faultType; + + /** + * 数据权限标识(1客户 2客服 3维修负责人 4维修人员) + */ + private String dataType; } diff --git a/src/main/java/org/springblade/modules/workOrder/entity/WorkOrder.java b/src/main/java/org/springblade/modules/workOrder/entity/WorkOrder.java index 98d4a1a..b651bad 100644 --- a/src/main/java/org/springblade/modules/workOrder/entity/WorkOrder.java +++ b/src/main/java/org/springblade/modules/workOrder/entity/WorkOrder.java @@ -21,6 +21,8 @@ import java.util.Date; @EqualsAndHashCode(callSuper = true) public class WorkOrder extends BaseEntity { + // 工单状态(0待客服接单 1待班组派单 2待维修人员确认 3待维修 4待领导审批 5待评价 6已完成 7已驳回(维修人员) 8已驳回(维修负责人) 9已关闭(客服)) + /** * 故障位置 */ @@ -171,4 +173,19 @@ public class WorkOrder extends BaseEntity { * 签名时间 */ private Date finishTime; + + /** + * 维修人员驳回原因 + */ + private String repaiRejectReason; + + /** + * 维修负责人驳回原因 + */ + private String repaiTeamRejectReason; + + /** + * 关闭原因 + */ + private String cloneReason; } diff --git a/src/main/java/org/springblade/modules/workOrder/entity/WorkOrderRepairMaterial.java b/src/main/java/org/springblade/modules/workOrder/entity/WorkOrderRepairMaterial.java index c254531..d7d9eb9 100644 --- a/src/main/java/org/springblade/modules/workOrder/entity/WorkOrderRepairMaterial.java +++ b/src/main/java/org/springblade/modules/workOrder/entity/WorkOrderRepairMaterial.java @@ -1,5 +1,6 @@ package org.springblade.modules.workOrder.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import io.swagger.annotations.ApiModel; @@ -37,4 +38,30 @@ public class WorkOrderRepairMaterial extends BaseEntity { * 价格 */ private Double materialPrice; + + /** + * 类型 + */ + private String bigClassId; + + /** + * 类型名称 + */ + @TableField(exist = false) + private String bigClassName; + + /** + * 单位 + */ + private String unit; + + /** + * 规格 + */ + private String rule; + + /** + * 型号 + */ + private String xh; } diff --git a/src/main/java/org/springblade/modules/workOrder/service/IWorkOrderService.java b/src/main/java/org/springblade/modules/workOrder/service/IWorkOrderService.java index 98b7cfd..c7e8d89 100644 --- a/src/main/java/org/springblade/modules/workOrder/service/IWorkOrderService.java +++ b/src/main/java/org/springblade/modules/workOrder/service/IWorkOrderService.java @@ -40,4 +40,6 @@ public interface IWorkOrderService extends BaseService { boolean saveAndAttach(List workOrder); boolean evaluateSign(WorkOrderVO workOrder); + + boolean updateAttach(WorkOrderVO workOrder); } diff --git a/src/main/java/org/springblade/modules/workOrder/service/impl/KnowledgeBaseServiceImpl.java b/src/main/java/org/springblade/modules/workOrder/service/impl/KnowledgeBaseServiceImpl.java index 2a43648..7f9a74c 100644 --- a/src/main/java/org/springblade/modules/workOrder/service/impl/KnowledgeBaseServiceImpl.java +++ b/src/main/java/org/springblade/modules/workOrder/service/impl/KnowledgeBaseServiceImpl.java @@ -113,33 +113,63 @@ public class KnowledgeBaseServiceImpl extends BaseServiceImpl picAttaches = knowledgeBase.getPicAttaches(); // 图片 if (CollectionUtil.isNotEmpty(picAttaches)) { - knowledgeBaseAttachService.remove(Wrappers.lambdaQuery(KnowledgeBaseAttach.class).eq(KnowledgeBaseAttach::getKnowledgeId, knowledgeBase.getId()).eq(KnowledgeBaseAttach::getAttachType, 1)); - picAttaches.forEach(picAttache -> { - picAttache.setKnowledgeId(knowledgeBase.getId()); - picAttache.setAttachType(1); - } - ); - knowledgeBaseAttachService.saveBatch(picAttaches); + // 需要新增的附件 + List newSavePic = picAttaches.stream().filter(picAttache -> picAttache.getId() == null).collect(Collectors.toList()); + // 不删除的附件ids + List ids = picAttaches.stream().filter(picAttache -> picAttache.getId() != null).map(KnowledgeBaseAttach::getId).collect(Collectors.toList()); + knowledgeBaseAttachService.remove(Wrappers.lambdaQuery(KnowledgeBaseAttach.class) + .eq(KnowledgeBaseAttach::getKnowledgeId, knowledgeBase.getId()) + .eq(KnowledgeBaseAttach::getAttachType, 1) + .notIn(CollectionUtils.isNotEmpty(ids), KnowledgeBaseAttach::getId, ids)); + + if (CollectionUtil.isNotEmpty(newSavePic)) { + newSavePic.forEach(picAttache -> { + picAttache.setKnowledgeId(knowledgeBase.getId()); + picAttache.setAttachType(1); + } + ); + knowledgeBaseAttachService.saveBatch(newSavePic); + } } // 视频 List videoAttaches = knowledgeBase.getVideoAttaches(); if (CollectionUtil.isNotEmpty(videoAttaches)) { - knowledgeBaseAttachService.remove(Wrappers.lambdaQuery(KnowledgeBaseAttach.class).eq(KnowledgeBaseAttach::getKnowledgeId, knowledgeBase.getId()).eq(KnowledgeBaseAttach::getAttachType, 2)); - videoAttaches.forEach(videoAttache -> { - videoAttache.setKnowledgeId(knowledgeBase.getId()); - videoAttache.setAttachType(2); - }); - knowledgeBaseAttachService.saveBatch(videoAttaches); + // 需要新增的附件 + List newSaveVideo = videoAttaches.stream().filter(picAttache -> picAttache.getId() == null).collect(Collectors.toList()); + // 不删除的附件ids + List ids = videoAttaches.stream().filter(picAttache -> picAttache.getId() != null).map(KnowledgeBaseAttach::getId).collect(Collectors.toList()); + knowledgeBaseAttachService.remove(Wrappers.lambdaQuery(KnowledgeBaseAttach.class) + .eq(KnowledgeBaseAttach::getKnowledgeId, knowledgeBase.getId()) + .eq(KnowledgeBaseAttach::getAttachType, 2) + .notIn(CollectionUtils.isNotEmpty(ids), KnowledgeBaseAttach::getId, ids)); + + if (CollectionUtil.isNotEmpty(newSaveVideo)) { + newSaveVideo.forEach(videoAttache -> { + videoAttache.setKnowledgeId(knowledgeBase.getId()); + videoAttache.setAttachType(2); + }); + knowledgeBaseAttachService.saveBatch(newSaveVideo); + } } List files = knowledgeBase.getFiles(); // 附件 if (CollectionUtil.isNotEmpty(files)) { - knowledgeBaseAttachService.remove(Wrappers.lambdaQuery(KnowledgeBaseAttach.class).eq(KnowledgeBaseAttach::getKnowledgeId, knowledgeBase.getId()).eq(KnowledgeBaseAttach::getAttachType, 3)); - videoAttaches.forEach(file -> { - file.setKnowledgeId(knowledgeBase.getId()); - file.setAttachType(3); - }); - knowledgeBaseAttachService.saveBatch(files); + // 需要新增的附件 + List newSaveFile = files.stream().filter(picAttache -> picAttache.getId() == null).collect(Collectors.toList()); + // 不删除的附件ids + List ids = files.stream().filter(picAttache -> picAttache.getId() != null).map(KnowledgeBaseAttach::getId).collect(Collectors.toList()); + knowledgeBaseAttachService.remove(Wrappers.lambdaQuery(KnowledgeBaseAttach.class) + .eq(KnowledgeBaseAttach::getKnowledgeId, knowledgeBase.getId()) + .eq(KnowledgeBaseAttach::getAttachType, 3) + .notIn(CollectionUtils.isNotEmpty(ids), KnowledgeBaseAttach::getId, ids)); + + if (CollectionUtils.isNotEmpty(newSaveFile)) { + newSaveFile.forEach(file -> { + file.setKnowledgeId(knowledgeBase.getId()); + file.setAttachType(3); + }); + knowledgeBaseAttachService.saveBatch(newSaveFile); + } } return this.updateById(knowledgeBase); } diff --git a/src/main/java/org/springblade/modules/workOrder/service/impl/WorkOrderServiceImpl.java b/src/main/java/org/springblade/modules/workOrder/service/impl/WorkOrderServiceImpl.java index ee356d6..d5742ba 100644 --- a/src/main/java/org/springblade/modules/workOrder/service/impl/WorkOrderServiceImpl.java +++ b/src/main/java/org/springblade/modules/workOrder/service/impl/WorkOrderServiceImpl.java @@ -2,14 +2,15 @@ package org.springblade.modules.workOrder.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import jodd.util.CollectionUtil; import lombok.AllArgsConstructor; import org.apache.commons.collections.CollectionUtils; +import org.springblade.common.cache.DictBizCache; import org.springblade.common.cache.SysCache; import org.springblade.common.cache.UserCache; import org.springblade.core.mp.support.Condition; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.modules.system.entity.User; import org.springblade.modules.system.service.IUserService; import org.springblade.modules.system.vo.PostVO; @@ -37,6 +38,8 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +import static org.springblade.common.enums.DictBizEnum.GOODS_TYPE; + /** * 工单表 服务实现类 * @@ -79,6 +82,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl workOrderAttach.getAttachType() == 2).collect(Collectors.toList())); // 维修材料 List materials = workOrderRepairMaterialService.list(Wrappers.lambdaQuery(WorkOrderRepairMaterial.class).eq(WorkOrderRepairMaterial::getOrderId, workOrder.getId())); + materials.forEach(material -> material.setBigClassName(DictBizCache.getValue(GOODS_TYPE, material.getBigClassId()))); workOrderVO.setMaterials(materials); User user = UserCache.getUser(workOrderVO.getInformant()); workOrderVO.setInformantName(user != null ? user.getRealName() : ""); @@ -164,4 +168,36 @@ public class WorkOrderServiceImpl extends BaseServiceImpl picAttaches = workOrder.getPicAttaches(); + // 图片 + if (org.springblade.core.tool.utils.CollectionUtil.isNotEmpty(picAttaches)) { + workOrderAttachService.remove(Wrappers.lambdaQuery(WorkOrderAttach.class).eq(WorkOrderAttach::getOrderId, workOrder.getId()).eq(WorkOrderAttach::getAttachType, 1)); + picAttaches.forEach(picAttache -> { + picAttache.setOrderId(workOrder.getId()); + picAttache.setAttachType(1); + } + ); + workOrderAttachService.saveBatch(picAttaches); + } + // 视频 + List videoAttaches = workOrder.getVideoAttaches(); + if (org.springblade.core.tool.utils.CollectionUtil.isNotEmpty(videoAttaches)) { + workOrderAttachService.remove(Wrappers.lambdaQuery(WorkOrderAttach.class).eq(WorkOrderAttach::getOrderId, workOrder.getId()).eq(WorkOrderAttach::getAttachType, 2)); + videoAttaches.forEach(videoAttache -> { + videoAttache.setOrderId(workOrder.getId()); + videoAttache.setAttachType(2); + }); + workOrderAttachService.saveBatch(videoAttaches); + } + List materials = workOrder.getMaterials(); + // 维修材料 + if (CollectionUtil.isNotEmpty(materials)) { + materials.forEach(material -> material.setOrderId(workOrder.getId())); + workOrderRepairMaterialService.saveBatch(materials); + } + return this.updateById(workOrder); + } + }