feat(workOrder): 优化工单管理功能

- 新增数据权限控制,支持不同角色查看相应工单
- 增加工单驳回和关闭功能
-优化附件和材料保存逻辑
- 修复了一些已知问题
main
litao 1 year ago
parent f20b49f635
commit fe5f22b7bb
  1. 16
      src/main/java/org/springblade/modules/capital/controller/ApplyController.java
  2. 7
      src/main/java/org/springblade/modules/capital/entity/Apply.java
  3. 90
      src/main/java/org/springblade/modules/workOrder/controller/WorkOrderController.java
  4. 5
      src/main/java/org/springblade/modules/workOrder/dto/WorkOrderDTO.java
  5. 17
      src/main/java/org/springblade/modules/workOrder/entity/WorkOrder.java
  6. 27
      src/main/java/org/springblade/modules/workOrder/entity/WorkOrderRepairMaterial.java
  7. 2
      src/main/java/org/springblade/modules/workOrder/service/IWorkOrderService.java
  8. 68
      src/main/java/org/springblade/modules/workOrder/service/impl/KnowledgeBaseServiceImpl.java
  9. 38
      src/main/java/org/springblade/modules/workOrder/service/impl/WorkOrderServiceImpl.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;

@ -29,6 +29,13 @@ public class Apply extends BaseEntity {
*/
@ApiModelProperty(value = "")
private String code;
/**
* 工单id
*/
@ApiModelProperty(value = "")
private Long workId;
/**
* 申领人
*/

@ -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<IPage<WorkOrder>> list(@ApiIgnore WorkOrderDTO workOrderDTO, Query query) {
LambdaQueryWrapper<WorkOrder> eq = Wrappers.lambdaQuery(WorkOrder.class)
// .eq(StringUtils.isNotBlank(AuthUtil.getDeptId()), WorkOrder::getCreateDept, AuthUtil.getDeptId())
.eq(StringUtils.isNotBlank(workOrderDTO.getFaultLocation()), WorkOrder::getFaultLocation, workOrderDTO.getFaultLocation())
LambdaQueryWrapper<WorkOrder> 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<WorkOrder> pages = workOrderService.page(Condition.getPage(query), eq);
List<WorkOrder> 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<WorkOrderAttach> 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<WorkOrderAttach> 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<WorkOrderRepairMaterial> 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));
}
}

@ -42,4 +42,9 @@ public class WorkOrderDTO extends WorkOrder{
* 故障类型
*/
private String faultType;
/**
* 数据权限标识1客户 2客服 3维修负责人 4维修人员
*/
private String dataType;
}

@ -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;
}

@ -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;
}

@ -40,4 +40,6 @@ public interface IWorkOrderService extends BaseService<WorkOrder> {
boolean saveAndAttach(List<WorkOrderVO> workOrder);
boolean evaluateSign(WorkOrderVO workOrder);
boolean updateAttach(WorkOrderVO workOrder);
}

@ -113,33 +113,63 @@ public class KnowledgeBaseServiceImpl extends BaseServiceImpl<KnowledgeBaseMappe
List<KnowledgeBaseAttach> 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<KnowledgeBaseAttach> newSavePic = picAttaches.stream().filter(picAttache -> picAttache.getId() == null).collect(Collectors.toList());
// 不删除的附件ids
List<Long> 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<KnowledgeBaseAttach> 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<KnowledgeBaseAttach> newSaveVideo = videoAttaches.stream().filter(picAttache -> picAttache.getId() == null).collect(Collectors.toList());
// 不删除的附件ids
List<Long> 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<KnowledgeBaseAttach> 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<KnowledgeBaseAttach> newSaveFile = files.stream().filter(picAttache -> picAttache.getId() == null).collect(Collectors.toList());
// 不删除的附件ids
List<Long> 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);
}

@ -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<WorkOrderMapper, WorkO
workOrderVO.setVideoAttaches(attaches.stream().filter(workOrderAttach -> workOrderAttach.getAttachType() == 2).collect(Collectors.toList()));
// 维修材料
List<WorkOrderRepairMaterial> 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<WorkOrderMapper, WorkO
return this.updateById(workOrder);
}
@Override
public boolean updateAttach(WorkOrderVO workOrder) {
List<WorkOrderAttach> 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<WorkOrderAttach> 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<WorkOrderRepairMaterial> materials = workOrder.getMaterials();
// 维修材料
if (CollectionUtil.isNotEmpty(materials)) {
materials.forEach(material -> material.setOrderId(workOrder.getId()));
workOrderRepairMaterialService.saveBatch(materials);
}
return this.updateById(workOrder);
}
}

Loading…
Cancel
Save