feat(bpm): 新增工单分配规则功能并优化工单相关接口
- 新增工单分配规则相关实体、控制器、服务和映射 - 实现工单分配规则的创建、更新、删除和查询功能 - 优化工单分页查询接口,支持按责任人和部门筛选 - 新增工单跟踪记录分页查询功能
This commit is contained in:
parent
7ab86ea5cc
commit
d882806df6
@ -25,7 +25,8 @@ public enum BpmTaskRuleScriptEnum {
|
|||||||
LEADER_X8(27L, "调薪部门领导"),
|
LEADER_X8(27L, "调薪部门领导"),
|
||||||
LEADER_X9(28L, "调薪人上级领导"),
|
LEADER_X9(28L, "调薪人上级领导"),
|
||||||
LEADER_X10(29L, "所选工厂的领导"),
|
LEADER_X10(29L, "所选工厂的领导"),
|
||||||
LEADER_X11(30L, "审批人的上级领导");
|
LEADER_X11(30L, "审批人的上级领导"),
|
||||||
|
LEADER_X31(31L, "工单负责人");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 脚本编号
|
* 脚本编号
|
||||||
|
@ -0,0 +1,112 @@
|
|||||||
|
package cn.iocoder.yudao.module.bpm.controller.admin.oa;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorderassignrule.BpmOAWorkOrderAssignRulePageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorderassignrule.BpmOAWorkOrderAssignRuleRespVO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorderassignrule.BpmOAWorkOrderAssignRuleSaveReqVO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderAssignRuleDO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAWorkOrderAssignRuleService;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.validation.Valid;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 管理后台 - BPM OA 工单分配规则
|
||||||
|
*
|
||||||
|
* @author 系统
|
||||||
|
*/
|
||||||
|
@Tag(name = "管理后台 - BPM OA 工单分配规则")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/bpm/work-order-assign-rule")
|
||||||
|
@Validated
|
||||||
|
public class BpmOAWorkOrderAssignRuleController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BpmOAWorkOrderAssignRuleService workOrderAssignRuleService;
|
||||||
|
|
||||||
|
@PostMapping("/create")
|
||||||
|
@Operation(summary = "创建工单分配规则")
|
||||||
|
@PreAuthorize("@ss.hasPermission('bpm:work-order-assign-rule:create')")
|
||||||
|
@OperateLog(type = CREATE)
|
||||||
|
public CommonResult<Long> createWorkOrderAssignRule(@Valid @RequestBody BpmOAWorkOrderAssignRuleSaveReqVO createReqVO) {
|
||||||
|
return success(workOrderAssignRuleService.createWorkOrderAssignRule(createReqVO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping("/update")
|
||||||
|
@Operation(summary = "更新工单分配规则")
|
||||||
|
@PreAuthorize("@ss.hasPermission('bpm:work-order-assign-rule:update')")
|
||||||
|
@OperateLog(type = UPDATE)
|
||||||
|
public CommonResult<Boolean> updateWorkOrderAssignRule(@Valid @RequestBody BpmOAWorkOrderAssignRuleSaveReqVO updateReqVO) {
|
||||||
|
workOrderAssignRuleService.updateWorkOrderAssignRule(updateReqVO);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping("/delete")
|
||||||
|
@Operation(summary = "删除工单分配规则")
|
||||||
|
@Parameter(name = "id", description = "编号", required = true)
|
||||||
|
@PreAuthorize("@ss.hasPermission('bpm:work-order-assign-rule:delete')")
|
||||||
|
@OperateLog(type = DELETE)
|
||||||
|
public CommonResult<Boolean> deleteWorkOrderAssignRule(@RequestParam("id") Long id) {
|
||||||
|
workOrderAssignRuleService.deleteWorkOrderAssignRule(id);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/get")
|
||||||
|
@Operation(summary = "获得工单分配规则")
|
||||||
|
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||||
|
@PreAuthorize("@ss.hasPermission('bpm:work-order-assign-rule:query')")
|
||||||
|
public CommonResult<BpmOAWorkOrderAssignRuleDO> getWorkOrderAssignRule(@RequestParam("id") Long id) {
|
||||||
|
BpmOAWorkOrderAssignRuleDO workOrderAssignRule = workOrderAssignRuleService.getWorkOrderAssignRule(id);
|
||||||
|
return success(workOrderAssignRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/page")
|
||||||
|
@Operation(summary = "获得工单分配规则分页")
|
||||||
|
@PreAuthorize("@ss.hasPermission('bpm:work-order-assign-rule:query')")
|
||||||
|
public CommonResult<PageResult<BpmOAWorkOrderAssignRuleRespVO>> getWorkOrderAssignRulePage(@Valid BpmOAWorkOrderAssignRulePageReqVO pageReqVO) {
|
||||||
|
PageResult<BpmOAWorkOrderAssignRuleRespVO> pageResult = workOrderAssignRuleService.getWorkOrderAssignRulePage(pageReqVO);
|
||||||
|
return success(pageResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/list")
|
||||||
|
@Operation(summary = "获得工单分配规则列表")
|
||||||
|
@PreAuthorize("@ss.hasPermission('bpm:work-order-assign-rule:query')")
|
||||||
|
public CommonResult<List<BpmOAWorkOrderAssignRuleRespVO>> getWorkOrderAssignRuleList(@Valid BpmOAWorkOrderAssignRulePageReqVO exportReqVO) {
|
||||||
|
List<BpmOAWorkOrderAssignRuleRespVO> list = workOrderAssignRuleService.getWorkOrderAssignRuleList(exportReqVO);
|
||||||
|
return success(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/list-by-type")
|
||||||
|
@Operation(summary = "根据工单类型获取有效的分配规则")
|
||||||
|
@Parameter(name = "workOrderType", description = "工单类型", required = true)
|
||||||
|
@PreAuthorize("@ss.hasPermission('bpm:work-order-assign-rule:query')")
|
||||||
|
public CommonResult<List<BpmOAWorkOrderAssignRuleDO>> getEnabledRulesByType(@RequestParam("workOrderType") String workOrderType) {
|
||||||
|
List<BpmOAWorkOrderAssignRuleDO> list = workOrderAssignRuleService.getEnabledRulesByType(workOrderType);
|
||||||
|
return success(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping("/update-status")
|
||||||
|
@Operation(summary = "批量更新规则状态")
|
||||||
|
@PreAuthorize("@ss.hasPermission('bpm:work-order-assign-rule:update')")
|
||||||
|
@OperateLog(type = UPDATE)
|
||||||
|
public CommonResult<Boolean> updateRuleStatus(@RequestParam("ids") Collection<Long> ids,
|
||||||
|
@RequestParam("status") Integer status) {
|
||||||
|
workOrderAssignRuleService.updateRuleStatus(ids, status);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -28,7 +28,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
|
|||||||
*/
|
*/
|
||||||
@Tag(name = "管理后台 - BPM OA 工单")
|
@Tag(name = "管理后台 - BPM OA 工单")
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/admin-api/bpm/oa/work-order")
|
@RequestMapping("/bpm/oa/work-order")
|
||||||
@Validated
|
@Validated
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class BpmOAWorkOrderController {
|
public class BpmOAWorkOrderController {
|
||||||
@ -80,6 +80,12 @@ public class BpmOAWorkOrderController {
|
|||||||
return success(true);
|
return success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/track-page")
|
||||||
|
@Operation(summary = "获得工单跟踪记录分页")
|
||||||
|
public CommonResult<PageResult<BpmOAWorkOrderTrackInfo>> getTrackPage(@Valid BpmOAWorkOrderTrackReqDTO dto) {
|
||||||
|
return success(workOrderService.getTrackPage(dto));
|
||||||
|
}
|
||||||
|
|
||||||
@PutMapping("/update")
|
@PutMapping("/update")
|
||||||
@Operation(summary = "修改工单")
|
@Operation(summary = "修改工单")
|
||||||
@PreAuthorize("@ss.hasPermission('bpm:oa-work-order:update')")
|
@PreAuthorize("@ss.hasPermission('bpm:oa-work-order:update')")
|
||||||
@ -95,4 +101,4 @@ public class BpmOAWorkOrderController {
|
|||||||
return success(workOrderService.getMyAssignedWorkOrderCount(getLoginUserId()));
|
return success(workOrderService.getMyAssignedWorkOrderCount(getLoginUserId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -32,8 +32,11 @@ public class BpmOAWorkOrderPageReqVO extends PageParam {
|
|||||||
@Schema(description = "发起人ID", example = "1")
|
@Schema(description = "发起人ID", example = "1")
|
||||||
private Long fromUserId;
|
private Long fromUserId;
|
||||||
|
|
||||||
|
@Schema(description = "当前用户id", example = "1")
|
||||||
|
private Long loginUserId;
|
||||||
|
|
||||||
@Schema(description = "创建时间")
|
@Schema(description = "创建时间")
|
||||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
private LocalDateTime[] createTime;
|
private LocalDateTime[] createTime;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class BpmOAWorkOrderTrackReqDTO extends PageParam {
|
||||||
|
|
||||||
|
@Schema(description = "工单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
|
@NotNull(message = "工单ID不能为空")
|
||||||
|
private Long workOrderId;
|
||||||
|
|
||||||
|
@Schema(description = "操作类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "PROCESS")
|
||||||
|
@NotEmpty(message = "操作类型不能为空")
|
||||||
|
private String operationType;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorderassignrule;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - BPM OA 工单分配规则分页查询 Request VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class BpmOAWorkOrderAssignRulePageReqVO extends PageParam {
|
||||||
|
|
||||||
|
@Schema(description = "工单类型", example = "it_support")
|
||||||
|
private String workOrderType;
|
||||||
|
|
||||||
|
@Schema(description = "责任部门ID", example = "100")
|
||||||
|
private Long deptId;
|
||||||
|
|
||||||
|
@Schema(description = "责任人ID", example = "1")
|
||||||
|
private Long assigneeUserId;
|
||||||
|
|
||||||
|
@Schema(description = "创建时间")
|
||||||
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
|
private LocalDateTime[] createTime;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorderassignrule;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - BPM OA 工单分配规则 Response VO")
|
||||||
|
@Data
|
||||||
|
public class BpmOAWorkOrderAssignRuleRespVO {
|
||||||
|
|
||||||
|
@Schema(description = "规则ID,主键", example = "1")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "工单类型", example = "it_support")
|
||||||
|
private String workOrderType;
|
||||||
|
|
||||||
|
@Schema(description = "工单类型名称", example = "IT支持")
|
||||||
|
private String workOrderTypeName;
|
||||||
|
|
||||||
|
@Schema(description = "责任部门ID", example = "100")
|
||||||
|
private Long deptId;
|
||||||
|
|
||||||
|
@Schema(description = "责任部门名称", example = "运维部")
|
||||||
|
private String deptName;
|
||||||
|
|
||||||
|
@Schema(description = "责任人ID", example = "1")
|
||||||
|
private Long assigneeUserId;
|
||||||
|
|
||||||
|
@Schema(description = "责任人姓名", example = "张三")
|
||||||
|
private String assigneeUserName;
|
||||||
|
|
||||||
|
@Schema(description = "规则描述", example = "IT支持类工单自动分配给运维部门张三处理")
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
@Schema(description = "创建时间", example = "2024-01-01 10:00:00")
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
@Schema(description = "更新时间", example = "2024-01-01 10:00:00")
|
||||||
|
private LocalDateTime updateTime;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorderassignrule;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - BPM OA 工单分配规则新增/修改 Request VO")
|
||||||
|
@Data
|
||||||
|
public class BpmOAWorkOrderAssignRuleSaveReqVO {
|
||||||
|
|
||||||
|
@Schema(description = "规则ID,主键", example = "1")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "工单类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "it_support")
|
||||||
|
@NotEmpty(message = "工单类型不能为空")
|
||||||
|
private String workOrderType;
|
||||||
|
|
||||||
|
@Schema(description = "责任部门ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
|
||||||
|
@NotNull(message = "责任部门ID不能为空")
|
||||||
|
private Long deptId;
|
||||||
|
|
||||||
|
@Schema(description = "责任人ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
|
@NotNull(message = "责任人ID不能为空")
|
||||||
|
private Long assigneeUserId;
|
||||||
|
|
||||||
|
@Schema(description = "规则描述", example = "IT支持类工单自动分配给运维部门张三处理")
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
}
|
@ -41,21 +41,9 @@ public class BpmOAWorkOrderAssignRuleDO extends BaseDO {
|
|||||||
*/
|
*/
|
||||||
private Long assigneeUserId;
|
private Long assigneeUserId;
|
||||||
|
|
||||||
/**
|
|
||||||
* 规则优先级
|
|
||||||
* 数值越小优先级越高
|
|
||||||
*/
|
|
||||||
private Integer priority;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 规则状态
|
|
||||||
* 1-启用,0-禁用
|
|
||||||
*/
|
|
||||||
private Integer status;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规则描述
|
* 规则描述
|
||||||
*/
|
*/
|
||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.bpm.dal.mysql.oa;
|
|||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorderassignrule.BpmOAWorkOrderAssignRulePageReqVO;
|
||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderAssignRuleDO;
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderAssignRuleDO;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
@ -21,9 +22,7 @@ public interface BpmOAWorkOrderAssignRuleMapper extends BaseMapperX<BpmOAWorkOrd
|
|||||||
*/
|
*/
|
||||||
default List<BpmOAWorkOrderAssignRuleDO> selectRulesByType(String workOrderType) {
|
default List<BpmOAWorkOrderAssignRuleDO> selectRulesByType(String workOrderType) {
|
||||||
return selectList(new LambdaQueryWrapperX<BpmOAWorkOrderAssignRuleDO>()
|
return selectList(new LambdaQueryWrapperX<BpmOAWorkOrderAssignRuleDO>()
|
||||||
.eq(BpmOAWorkOrderAssignRuleDO::getWorkOrderType, workOrderType)
|
.eq(BpmOAWorkOrderAssignRuleDO::getWorkOrderType, workOrderType));
|
||||||
.eq(BpmOAWorkOrderAssignRuleDO::getStatus, 1)
|
|
||||||
.orderByAsc(BpmOAWorkOrderAssignRuleDO::getPriority));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -31,9 +30,7 @@ public interface BpmOAWorkOrderAssignRuleMapper extends BaseMapperX<BpmOAWorkOrd
|
|||||||
*/
|
*/
|
||||||
default List<BpmOAWorkOrderAssignRuleDO> selectRulesByDept(Long deptId) {
|
default List<BpmOAWorkOrderAssignRuleDO> selectRulesByDept(Long deptId) {
|
||||||
return selectList(new LambdaQueryWrapperX<BpmOAWorkOrderAssignRuleDO>()
|
return selectList(new LambdaQueryWrapperX<BpmOAWorkOrderAssignRuleDO>()
|
||||||
.eq(BpmOAWorkOrderAssignRuleDO::getDeptId, deptId)
|
.eq(BpmOAWorkOrderAssignRuleDO::getDeptId, deptId));
|
||||||
.eq(BpmOAWorkOrderAssignRuleDO::getStatus, 1)
|
|
||||||
.orderByAsc(BpmOAWorkOrderAssignRuleDO::getPriority));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,9 +38,18 @@ public interface BpmOAWorkOrderAssignRuleMapper extends BaseMapperX<BpmOAWorkOrd
|
|||||||
*/
|
*/
|
||||||
default List<BpmOAWorkOrderAssignRuleDO> selectRulesByAssignee(Long assigneeUserId) {
|
default List<BpmOAWorkOrderAssignRuleDO> selectRulesByAssignee(Long assigneeUserId) {
|
||||||
return selectList(new LambdaQueryWrapperX<BpmOAWorkOrderAssignRuleDO>()
|
return selectList(new LambdaQueryWrapperX<BpmOAWorkOrderAssignRuleDO>()
|
||||||
.eq(BpmOAWorkOrderAssignRuleDO::getAssigneeUserId, assigneeUserId)
|
.eq(BpmOAWorkOrderAssignRuleDO::getAssigneeUserId, assigneeUserId));
|
||||||
.eq(BpmOAWorkOrderAssignRuleDO::getStatus, 1)
|
|
||||||
.orderByAsc(BpmOAWorkOrderAssignRuleDO::getPriority));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
/**
|
||||||
|
* 分页查询工单分配规则
|
||||||
|
*/
|
||||||
|
default PageResult<BpmOAWorkOrderAssignRuleDO> selectPage(BpmOAWorkOrderAssignRulePageReqVO reqVO) {
|
||||||
|
return selectPage(reqVO, new LambdaQueryWrapperX<BpmOAWorkOrderAssignRuleDO>()
|
||||||
|
.likeIfPresent(BpmOAWorkOrderAssignRuleDO::getWorkOrderType, reqVO.getWorkOrderType())
|
||||||
|
.eqIfPresent(BpmOAWorkOrderAssignRuleDO::getDeptId, reqVO.getDeptId())
|
||||||
|
.eqIfPresent(BpmOAWorkOrderAssignRuleDO::getAssigneeUserId, reqVO.getAssigneeUserId())
|
||||||
|
.betweenIfPresent(BpmOAWorkOrderAssignRuleDO::getCreateTime, reqVO.getCreateTime()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -6,6 +6,8 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
|||||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder.BpmOAWorkOrderPageReqVO;
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder.BpmOAWorkOrderPageReqVO;
|
||||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder.BpmOAWorkOrderRespVO;
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder.BpmOAWorkOrderRespVO;
|
||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderDO;
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderDO;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
@ -69,19 +71,20 @@ public interface BpmOAWorkOrderMapper extends BaseMapperX<BpmOAWorkOrderDO> {
|
|||||||
/**
|
/**
|
||||||
* 工单分页查询(带关联信息)- XML实现
|
* 工单分页查询(带关联信息)- XML实现
|
||||||
*/
|
*/
|
||||||
PageResult<BpmOAWorkOrderRespVO> selectWorkOrderPage(@Param("loginUserId") Long loginUserId,
|
IPage<BpmOAWorkOrderRespVO> selectWorkOrderPage(@Param("page") Page page,
|
||||||
@Param("req") BpmOAWorkOrderPageReqVO req);
|
@Param("req") BpmOAWorkOrderPageReqVO req);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 我发起的工单分页查询(带关联信息)- XML实现
|
* 我发起的工单分页查询(带关联信息)- XML实现
|
||||||
*/
|
*/
|
||||||
PageResult<BpmOAWorkOrderRespVO> selectMyWorkOrderPage(@Param("loginUserId") Long loginUserId,
|
PageResult<BpmOAWorkOrderRespVO> selectMyWorkOrderPage(@Param("page") Page page,
|
||||||
@Param("req") BpmOAWorkOrderPageReqVO req);
|
@Param("req") BpmOAWorkOrderPageReqVO req);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分配给我的工单分页查询(带关联信息)- XML实现
|
* 分配给我的工单分页查询(带关联信息)- XML实现
|
||||||
*/
|
*/
|
||||||
PageResult<BpmOAWorkOrderRespVO> selectAssignedWorkOrderPage(@Param("loginUserId") Long loginUserId,
|
IPage<BpmOAWorkOrderRespVO> selectAssignedWorkOrderPage(@Param("page") Page page,
|
||||||
@Param("req") BpmOAWorkOrderPageReqVO req);
|
@Param("req") BpmOAWorkOrderPageReqVO req);
|
||||||
|
|
||||||
}
|
BpmOAWorkOrderDO selectByProcessInstanceId(@Param("processInstanceId") String processInstanceId);
|
||||||
|
}
|
||||||
|
@ -2,8 +2,14 @@ package cn.iocoder.yudao.module.bpm.dal.mysql.oa;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder.BpmOAWorkOrderTrackInfo;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder.BpmOAWorkOrderTrackReqDTO;
|
||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderTrackDO;
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderTrackDO;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -24,4 +30,4 @@ public interface BpmOAWorkOrderTrackMapper extends BaseMapperX<BpmOAWorkOrderTra
|
|||||||
.orderByAsc(BpmOAWorkOrderTrackDO::getCreateTime));
|
.orderByAsc(BpmOAWorkOrderTrackDO::getCreateTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,61 @@
|
|||||||
|
package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAShiftjobsDO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderDO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAShiftjobsMapper;
|
||||||
|
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAWorkOrderMapper;
|
||||||
|
import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum;
|
||||||
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript;
|
||||||
|
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
||||||
|
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
||||||
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
|
import org.flowable.engine.runtime.ProcessInstance;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;
|
||||||
|
import static java.util.Collections.emptySet;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class BpmOaWorkOrderLeaderScript implements BpmTaskAssignScript {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DeptApi deptApi;
|
||||||
|
@Resource
|
||||||
|
private BpmOAWorkOrderMapper bpmOAWorkOrderMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
@Lazy // 解决循环依赖
|
||||||
|
private BpmProcessInstanceService bpmProcessInstanceService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
@Lazy // 解决循环依赖
|
||||||
|
private BpmTaskService bpmTaskService ;
|
||||||
|
@Override
|
||||||
|
public Set<Long> calculateTaskCandidateUsers(DelegateExecution execution) {
|
||||||
|
// 获得发起人
|
||||||
|
ProcessInstance processInstance = bpmProcessInstanceService.getProcessInstance(execution.getProcessInstanceId());
|
||||||
|
List<BpmTaskRespVO> bpmTaskRespVOs = bpmTaskService.getTaskListByProcessInstanceId(processInstance.getProcessInstanceId());
|
||||||
|
if (CollUtil.isEmpty(bpmTaskRespVOs)) {
|
||||||
|
return emptySet();
|
||||||
|
}
|
||||||
|
//根据流程实例ID 取到调岗流程表单
|
||||||
|
BpmOAWorkOrderDO bpmOAWorkOrderDO = bpmOAWorkOrderMapper.selectByProcessInstanceId(processInstance.getProcessInstanceId());
|
||||||
|
//获取调岗部门ID
|
||||||
|
return bpmOAWorkOrderDO.getAssigneeUserId() != null ? asSet(bpmOAWorkOrderDO.getAssigneeUserId()) : emptySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BpmTaskRuleScriptEnum getEnum() {
|
||||||
|
return BpmTaskRuleScriptEnum.LEADER_X31;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
package cn.iocoder.yudao.module.bpm.service.oa;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorderassignrule.BpmOAWorkOrderAssignRulePageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorderassignrule.BpmOAWorkOrderAssignRuleRespVO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorderassignrule.BpmOAWorkOrderAssignRuleSaveReqVO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderAssignRuleDO;
|
||||||
|
|
||||||
|
import javax.validation.Valid;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BPM OA 工单分配规则 Service 接口
|
||||||
|
*
|
||||||
|
* @author 系统
|
||||||
|
*/
|
||||||
|
public interface BpmOAWorkOrderAssignRuleService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建工单分配规则
|
||||||
|
*
|
||||||
|
* @param createReqVO 创建信息
|
||||||
|
* @return 编号
|
||||||
|
*/
|
||||||
|
Long createWorkOrderAssignRule(@Valid BpmOAWorkOrderAssignRuleSaveReqVO createReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新工单分配规则
|
||||||
|
*
|
||||||
|
* @param updateReqVO 更新信息
|
||||||
|
*/
|
||||||
|
void updateWorkOrderAssignRule(@Valid BpmOAWorkOrderAssignRuleSaveReqVO updateReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除工单分配规则
|
||||||
|
*
|
||||||
|
* @param id 编号
|
||||||
|
*/
|
||||||
|
void deleteWorkOrderAssignRule(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得工单分配规则
|
||||||
|
*
|
||||||
|
* @param id 编号
|
||||||
|
* @return 工单分配规则
|
||||||
|
*/
|
||||||
|
BpmOAWorkOrderAssignRuleDO getWorkOrderAssignRule(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得工单分配规则分页
|
||||||
|
*
|
||||||
|
* @param pageReqVO 分页查询
|
||||||
|
* @return 工单分配规则分页
|
||||||
|
*/
|
||||||
|
PageResult<BpmOAWorkOrderAssignRuleRespVO> getWorkOrderAssignRulePage(BpmOAWorkOrderAssignRulePageReqVO pageReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得工单分配规则列表(用于导出)
|
||||||
|
*
|
||||||
|
* @param exportReqVO 查询条件
|
||||||
|
* @return 工单分配规则列表
|
||||||
|
*/
|
||||||
|
List<BpmOAWorkOrderAssignRuleRespVO> getWorkOrderAssignRuleList(BpmOAWorkOrderAssignRulePageReqVO exportReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据工单类型获取有效的分配规则
|
||||||
|
*
|
||||||
|
* @param workOrderType 工单类型
|
||||||
|
* @return 分配规则列表
|
||||||
|
*/
|
||||||
|
List<BpmOAWorkOrderAssignRuleDO> getEnabledRulesByType(String workOrderType);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量更新规则状态
|
||||||
|
*
|
||||||
|
* @param ids 规则ID列表
|
||||||
|
* @param status 状态(1-启用,0-禁用)
|
||||||
|
*/
|
||||||
|
void updateRuleStatus(Collection<Long> ids, Integer status);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,176 @@
|
|||||||
|
package cn.iocoder.yudao.module.bpm.service.oa;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorderassignrule.BpmOAWorkOrderAssignRulePageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorderassignrule.BpmOAWorkOrderAssignRuleRespVO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorderassignrule.BpmOAWorkOrderAssignRuleSaveReqVO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderAssignRuleDO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAWorkOrderAssignRuleMapper;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||||
|
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_WORK_TASK_NOT_EXISTS;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BPM OA 工单分配规则 Service 实现类
|
||||||
|
*
|
||||||
|
* @author 系统
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Validated
|
||||||
|
public class BpmOAWorkOrderAssignRuleServiceImpl implements BpmOAWorkOrderAssignRuleService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BpmOAWorkOrderAssignRuleMapper workOrderAssignRuleMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private AdminUserApi userApi;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DeptApi deptApi;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DictDataApi dictDataApi;
|
||||||
|
|
||||||
|
private static final String WORK_ORDER_TYPE = "work_order_type";
|
||||||
|
private static final String WORK_ORDER_ASSIGN_RULE_STATUS = "work_order_assign_rule_status";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Long createWorkOrderAssignRule(BpmOAWorkOrderAssignRuleSaveReqVO createReqVO) {
|
||||||
|
// 插入
|
||||||
|
BpmOAWorkOrderAssignRuleDO workOrderAssignRule = BeanUtils.toBean(createReqVO, BpmOAWorkOrderAssignRuleDO.class);
|
||||||
|
workOrderAssignRuleMapper.insert(workOrderAssignRule);
|
||||||
|
|
||||||
|
// 返回
|
||||||
|
return workOrderAssignRule.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void updateWorkOrderAssignRule(BpmOAWorkOrderAssignRuleSaveReqVO updateReqVO) {
|
||||||
|
// 校验存在
|
||||||
|
validateWorkOrderAssignRuleExists(updateReqVO.getId());
|
||||||
|
// 更新
|
||||||
|
BpmOAWorkOrderAssignRuleDO updateObj = BeanUtils.toBean(updateReqVO, BpmOAWorkOrderAssignRuleDO.class);
|
||||||
|
workOrderAssignRuleMapper.updateById(updateObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void deleteWorkOrderAssignRule(Long id) {
|
||||||
|
// 校验存在
|
||||||
|
validateWorkOrderAssignRuleExists(id);
|
||||||
|
|
||||||
|
// 删除
|
||||||
|
workOrderAssignRuleMapper.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BpmOAWorkOrderAssignRuleDO validateWorkOrderAssignRuleExists(Long id) {
|
||||||
|
BpmOAWorkOrderAssignRuleDO workOrderAssignRule = workOrderAssignRuleMapper.selectById(id);
|
||||||
|
if (workOrderAssignRule == null) {
|
||||||
|
throw exception(OA_WORK_TASK_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
return workOrderAssignRule;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BpmOAWorkOrderAssignRuleDO getWorkOrderAssignRule(Long id) {
|
||||||
|
return workOrderAssignRuleMapper.selectById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult<BpmOAWorkOrderAssignRuleRespVO> getWorkOrderAssignRulePage(BpmOAWorkOrderAssignRulePageReqVO pageReqVO) {
|
||||||
|
PageResult<BpmOAWorkOrderAssignRuleDO> pageResult = workOrderAssignRuleMapper.selectPage(pageReqVO);
|
||||||
|
return new PageResult<>(convertList(pageResult.getList()), pageResult.getTotal());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BpmOAWorkOrderAssignRuleRespVO> getWorkOrderAssignRuleList(BpmOAWorkOrderAssignRulePageReqVO exportReqVO) {
|
||||||
|
List<BpmOAWorkOrderAssignRuleDO> list = workOrderAssignRuleMapper.selectList(new LambdaQueryWrapperX<BpmOAWorkOrderAssignRuleDO>()
|
||||||
|
.likeIfPresent(BpmOAWorkOrderAssignRuleDO::getWorkOrderType, exportReqVO.getWorkOrderType())
|
||||||
|
.eqIfPresent(BpmOAWorkOrderAssignRuleDO::getDeptId, exportReqVO.getDeptId())
|
||||||
|
.eqIfPresent(BpmOAWorkOrderAssignRuleDO::getAssigneeUserId, exportReqVO.getAssigneeUserId())
|
||||||
|
.betweenIfPresent(BpmOAWorkOrderAssignRuleDO::getCreateTime, exportReqVO.getCreateTime()));
|
||||||
|
return convertList(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BpmOAWorkOrderAssignRuleDO> getEnabledRulesByType(String workOrderType) {
|
||||||
|
return workOrderAssignRuleMapper.selectRulesByType(workOrderType);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void updateRuleStatus(Collection<Long> ids, Integer status) {
|
||||||
|
// 批量更新状态
|
||||||
|
ids.forEach(id -> {
|
||||||
|
BpmOAWorkOrderAssignRuleDO updateObj = new BpmOAWorkOrderAssignRuleDO();
|
||||||
|
updateObj.setId(id);
|
||||||
|
workOrderAssignRuleMapper.updateById(updateObj);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<BpmOAWorkOrderAssignRuleRespVO> convertList(List<BpmOAWorkOrderAssignRuleDO> list) {
|
||||||
|
if (list.isEmpty()) {
|
||||||
|
return java.util.Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取用户信息
|
||||||
|
Map<Long, AdminUserRespDTO> userMap = convertMap(
|
||||||
|
userApi.getUserList(list.stream().map(BpmOAWorkOrderAssignRuleDO::getAssigneeUserId).collect(Collectors.toSet())).getCheckedData(),
|
||||||
|
AdminUserRespDTO::getId);
|
||||||
|
|
||||||
|
// 获取部门信息
|
||||||
|
Map<Long, DeptRespDTO> deptMap = convertMap(
|
||||||
|
deptApi.getDeptList(list.stream().map(BpmOAWorkOrderAssignRuleDO::getDeptId).collect(Collectors.toSet())).getCheckedData(),
|
||||||
|
DeptRespDTO::getId);
|
||||||
|
|
||||||
|
// 获取字典信息
|
||||||
|
Map<String, DictDataRespDTO> workOrderTypeMap = convertMap(
|
||||||
|
dictDataApi.getDictDataList(WORK_ORDER_TYPE).getCheckedData(),
|
||||||
|
DictDataRespDTO::getValue);
|
||||||
|
|
||||||
|
Map<String, DictDataRespDTO> statusMap = convertMap(
|
||||||
|
dictDataApi.getDictDataList(WORK_ORDER_ASSIGN_RULE_STATUS).getCheckedData(),
|
||||||
|
DictDataRespDTO::getValue);
|
||||||
|
|
||||||
|
return list.stream().map(rule -> {
|
||||||
|
BpmOAWorkOrderAssignRuleRespVO respVO = BeanUtils.toBean(rule, BpmOAWorkOrderAssignRuleRespVO.class);
|
||||||
|
|
||||||
|
// 填充用户名称
|
||||||
|
if (userMap.containsKey(rule.getAssigneeUserId())) {
|
||||||
|
respVO.setAssigneeUserName(userMap.get(rule.getAssigneeUserId()).getNickname());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 填充部门名称
|
||||||
|
if (deptMap.containsKey(rule.getDeptId())) {
|
||||||
|
respVO.setDeptName(deptMap.get(rule.getDeptId()).getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 填充工单类型名称
|
||||||
|
if (workOrderTypeMap.containsKey(rule.getWorkOrderType())) {
|
||||||
|
respVO.setWorkOrderTypeName(workOrderTypeMap.get(rule.getWorkOrderType()).getLabel());
|
||||||
|
}
|
||||||
|
return respVO;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -16,7 +16,7 @@ public interface BpmOAWorkOrderService {
|
|||||||
/**
|
/**
|
||||||
* 创建工单
|
* 创建工单
|
||||||
*
|
*
|
||||||
* @param userId 发起人ID
|
* @param userId 发起人ID
|
||||||
* @param createReqVO 创建请求
|
* @param createReqVO 创建请求
|
||||||
* @return 工单ID
|
* @return 工单ID
|
||||||
*/
|
*/
|
||||||
@ -25,7 +25,7 @@ public interface BpmOAWorkOrderService {
|
|||||||
/**
|
/**
|
||||||
* 更新工单状态结果
|
* 更新工单状态结果
|
||||||
*
|
*
|
||||||
* @param id 工单ID
|
* @param id 工单ID
|
||||||
* @param result BPM流程结果
|
* @param result BPM流程结果
|
||||||
*/
|
*/
|
||||||
void updateWorkOrderResult(Long id, Integer result);
|
void updateWorkOrderResult(Long id, Integer result);
|
||||||
@ -33,7 +33,7 @@ public interface BpmOAWorkOrderService {
|
|||||||
/**
|
/**
|
||||||
* 分配工单
|
* 分配工单
|
||||||
*
|
*
|
||||||
* @param id 工单ID
|
* @param id 工单ID
|
||||||
* @param assigneeUserId 责任人ID
|
* @param assigneeUserId 责任人ID
|
||||||
* @param assigneeDeptId 责任部门ID
|
* @param assigneeDeptId 责任部门ID
|
||||||
*/
|
*/
|
||||||
@ -42,7 +42,7 @@ public interface BpmOAWorkOrderService {
|
|||||||
/**
|
/**
|
||||||
* 添加工单跟踪信息
|
* 添加工单跟踪信息
|
||||||
*
|
*
|
||||||
* @param userId 操作人ID
|
* @param userId 操作人ID
|
||||||
* @param trackReqVO 跟踪信息
|
* @param trackReqVO 跟踪信息
|
||||||
*/
|
*/
|
||||||
void addTrackInfo(Long userId, @Valid BpmOAWorkOrderTrackReqVO trackReqVO);
|
void addTrackInfo(Long userId, @Valid BpmOAWorkOrderTrackReqVO trackReqVO);
|
||||||
@ -82,7 +82,7 @@ public interface BpmOAWorkOrderService {
|
|||||||
* 获取工单分页
|
* 获取工单分页
|
||||||
*
|
*
|
||||||
* @param loginUserId 登录用户ID
|
* @param loginUserId 登录用户ID
|
||||||
* @param pageVO 分页请求
|
* @param pageVO 分页请求
|
||||||
* @return 分页结果
|
* @return 分页结果
|
||||||
*/
|
*/
|
||||||
PageResult<BpmOAWorkOrderRespVO> getWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO);
|
PageResult<BpmOAWorkOrderRespVO> getWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO);
|
||||||
@ -91,7 +91,7 @@ public interface BpmOAWorkOrderService {
|
|||||||
* 获取我发起的工单分页
|
* 获取我发起的工单分页
|
||||||
*
|
*
|
||||||
* @param loginUserId 登录用户ID
|
* @param loginUserId 登录用户ID
|
||||||
* @param pageVO 分页请求
|
* @param pageVO 分页请求
|
||||||
* @return 分页结果
|
* @return 分页结果
|
||||||
*/
|
*/
|
||||||
PageResult<BpmOAWorkOrderRespVO> getMyWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO);
|
PageResult<BpmOAWorkOrderRespVO> getMyWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO);
|
||||||
@ -100,7 +100,7 @@ public interface BpmOAWorkOrderService {
|
|||||||
* 获取分配给我的工单分页
|
* 获取分配给我的工单分页
|
||||||
*
|
*
|
||||||
* @param loginUserId 登录用户ID
|
* @param loginUserId 登录用户ID
|
||||||
* @param pageVO 分页请求
|
* @param pageVO 分页请求
|
||||||
* @return 分页结果
|
* @return 分页结果
|
||||||
*/
|
*/
|
||||||
PageResult<BpmOAWorkOrderRespVO> getAssignedWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO);
|
PageResult<BpmOAWorkOrderRespVO> getAssignedWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO);
|
||||||
@ -113,4 +113,11 @@ public interface BpmOAWorkOrderService {
|
|||||||
*/
|
*/
|
||||||
Long getMyAssignedWorkOrderCount(Long userId);
|
Long getMyAssignedWorkOrderCount(Long userId);
|
||||||
|
|
||||||
}
|
/**
|
||||||
|
* 工单操作记录跟踪分页列表
|
||||||
|
*
|
||||||
|
* @param dto
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
PageResult<BpmOAWorkOrderTrackInfo> getTrackPage(@Valid BpmOAWorkOrderTrackReqDTO dto);
|
||||||
|
}
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.service.oa;
|
package cn.iocoder.yudao.module.bpm.service.oa;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
||||||
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
|
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
|
||||||
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
|
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
|
||||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder.*;
|
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder.*;
|
||||||
@ -14,10 +17,12 @@ import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAWorkOrderTrackMapper;
|
|||||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||||
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
|
||||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
|
||||||
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
|
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
|
||||||
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO;
|
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
@ -31,7 +36,6 @@ import java.util.Map;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
|
||||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_WORK_TASK_NOT_EXISTS;
|
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_WORK_TASK_NOT_EXISTS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -69,6 +73,10 @@ public class BpmOAWorkOrderServiceImpl extends BpmOABaseService implements BpmOA
|
|||||||
@Resource
|
@Resource
|
||||||
private DictDataApi dictDataApi;
|
private DictDataApi dictDataApi;
|
||||||
|
|
||||||
|
private static final String WORK_ORDER_TYPE = "work_order_type";
|
||||||
|
private static final String WORK_ORDER_LEVEL = "work_order_level";
|
||||||
|
private static final String WORK_ORDER_STATUS = "work_order_status";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public Long createWorkOrder(Long userId, BpmOAWorkOrderCreateReqVO createReqVO) {
|
public Long createWorkOrder(Long userId, BpmOAWorkOrderCreateReqVO createReqVO) {
|
||||||
@ -87,11 +95,9 @@ public class BpmOAWorkOrderServiceImpl extends BpmOABaseService implements BpmOA
|
|||||||
.status(1) // 默认状态:待分配
|
.status(1) // 默认状态:待分配
|
||||||
.result(BpmProcessInstanceResultEnum.PROCESS.getResult())
|
.result(BpmProcessInstanceResultEnum.PROCESS.getResult())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
workOrderMapper.insert(workOrder);
|
|
||||||
|
|
||||||
// 自动分配责任人(根据规则)
|
// 自动分配责任人(根据规则)
|
||||||
autoAssignWorkOrder(workOrder);
|
autoAssignWorkOrder(workOrder);
|
||||||
|
workOrderMapper.insert(workOrder);
|
||||||
|
|
||||||
// 发起 BPM 流程
|
// 发起 BPM 流程
|
||||||
Map<String, Object> processInstanceVariables = new HashMap<>();
|
Map<String, Object> processInstanceVariables = new HashMap<>();
|
||||||
@ -170,17 +176,17 @@ public class BpmOAWorkOrderServiceImpl extends BpmOABaseService implements BpmOA
|
|||||||
@Override
|
@Override
|
||||||
public BpmOAWorkOrderRespVO getWorkOrderDetail(Long id) {
|
public BpmOAWorkOrderRespVO getWorkOrderDetail(Long id) {
|
||||||
BpmOAWorkOrderDO workOrder = validateWorkOrderExists(id);
|
BpmOAWorkOrderDO workOrder = validateWorkOrderExists(id);
|
||||||
|
|
||||||
// 转换为VO
|
// 转换为VO
|
||||||
BpmOAWorkOrderRespVO respVO = convertToRespVO(workOrder);
|
BpmOAWorkOrderRespVO respVO = convertToRespVO(workOrder);
|
||||||
|
|
||||||
// 获取跟踪记录
|
// 获取跟踪记录
|
||||||
List<BpmOAWorkOrderTrackDO> trackList = trackMapper.selectByWorkOrderId(id);
|
List<BpmOAWorkOrderTrackDO> trackList = trackMapper.selectByWorkOrderId(id);
|
||||||
List<BpmOAWorkOrderTrackInfo> trackInfoList = trackList.stream()
|
List<BpmOAWorkOrderTrackInfo> trackInfoList = trackList.stream()
|
||||||
.map(this::convertToTrackInfo)
|
.map(this::convertToTrackInfo)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
respVO.setTrackInfo(trackInfoList);
|
respVO.setTrackInfo(trackInfoList);
|
||||||
|
|
||||||
return respVO;
|
return respVO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,20 +197,47 @@ public class BpmOAWorkOrderServiceImpl extends BpmOABaseService implements BpmOA
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<BpmOAWorkOrderRespVO> getWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO) {
|
public PageResult<BpmOAWorkOrderRespVO> getWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO) {
|
||||||
|
IPage<BpmOAWorkOrderRespVO> pageResult = workOrderMapper.selectWorkOrderPage(MyBatisUtils.buildPage(pageVO), pageVO.setLoginUserId(loginUserId));
|
||||||
// 使用XML查询,直接返回带关联信息的VO数据
|
// 使用XML查询,直接返回带关联信息的VO数据
|
||||||
return workOrderMapper.selectWorkOrderPage(loginUserId, pageVO);
|
return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<BpmOAWorkOrderRespVO> getMyWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO) {
|
public PageResult<BpmOAWorkOrderRespVO> getMyWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO) {
|
||||||
|
List<DictDataRespDTO> workOrderTypeDictList = dictDataApi.getDictDataList(WORK_ORDER_TYPE).getCheckedData();
|
||||||
|
Map<String, String> workOrderTypeDictMap = workOrderTypeDictList.stream().collect(Collectors.toMap(DictDataRespDTO::getValue, DictDataRespDTO::getLabel));
|
||||||
|
List<DictDataRespDTO> workOrderLevelDictList = dictDataApi.getDictDataList(WORK_ORDER_LEVEL).getCheckedData();
|
||||||
|
Map<String, String> workOrderLevelDictMap = workOrderLevelDictList.stream().collect(Collectors.toMap(DictDataRespDTO::getValue, DictDataRespDTO::getLabel));
|
||||||
|
List<DictDataRespDTO> workOrderStatusDictList = dictDataApi.getDictDataList(WORK_ORDER_STATUS).getCheckedData();
|
||||||
|
Map<String, String> workOrderStatusDictMap = workOrderStatusDictList.stream().collect(Collectors.toMap(DictDataRespDTO::getValue, DictDataRespDTO::getLabel));
|
||||||
|
PageResult<BpmOAWorkOrderRespVO> bpmOAWorkOrderRespVOPageResult = workOrderMapper.selectMyWorkOrderPage(MyBatisUtils.buildPage(pageVO), pageVO.setLoginUserId(loginUserId));
|
||||||
|
for (BpmOAWorkOrderRespVO bpmOAWorkOrderRespVO : bpmOAWorkOrderRespVOPageResult.getList()) {
|
||||||
|
bpmOAWorkOrderRespVO.setTypeName(workOrderTypeDictMap.get(bpmOAWorkOrderRespVO.getType()));
|
||||||
|
bpmOAWorkOrderRespVO.setLevelName(workOrderLevelDictMap.get(String.valueOf(bpmOAWorkOrderRespVO.getLevel())));
|
||||||
|
bpmOAWorkOrderRespVO.setStatusName(workOrderStatusDictMap.get(String.valueOf(bpmOAWorkOrderRespVO.getStatus())));
|
||||||
|
}
|
||||||
// 使用XML查询,直接返回带关联信息的VO数据
|
// 使用XML查询,直接返回带关联信息的VO数据
|
||||||
return workOrderMapper.selectMyWorkOrderPage(loginUserId, pageVO);
|
return bpmOAWorkOrderRespVOPageResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<BpmOAWorkOrderRespVO> getAssignedWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO) {
|
public PageResult<BpmOAWorkOrderRespVO> getAssignedWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO) {
|
||||||
|
List<DictDataRespDTO> workOrderTypeDictList = dictDataApi.getDictDataList(WORK_ORDER_TYPE).getCheckedData();
|
||||||
|
Map<String, String> workOrderTypeDictMap = workOrderTypeDictList.stream().collect(Collectors.toMap(DictDataRespDTO::getValue, DictDataRespDTO::getLabel));
|
||||||
|
List<DictDataRespDTO> workOrderLevelDictList = dictDataApi.getDictDataList(WORK_ORDER_LEVEL).getCheckedData();
|
||||||
|
Map<String, String> workOrderLevelDictMap = workOrderLevelDictList.stream().collect(Collectors.toMap(DictDataRespDTO::getValue, DictDataRespDTO::getLabel));
|
||||||
|
List<DictDataRespDTO> workOrderStatusDictList = dictDataApi.getDictDataList(WORK_ORDER_STATUS).getCheckedData();
|
||||||
|
Map<String, String> workOrderStatusDictMap = workOrderStatusDictList.stream().collect(Collectors.toMap(DictDataRespDTO::getValue, DictDataRespDTO::getLabel));
|
||||||
|
IPage<BpmOAWorkOrderRespVO> pageResult = workOrderMapper.selectAssignedWorkOrderPage(MyBatisUtils.buildPage(pageVO), pageVO.setLoginUserId(loginUserId));
|
||||||
|
PageResult<BpmOAWorkOrderRespVO> bpmOAWorkOrderRespVOPageResult =
|
||||||
|
pageResult != null ? new PageResult<>(pageResult.getRecords(), pageResult.getTotal()) : new PageResult<>();
|
||||||
|
for (BpmOAWorkOrderRespVO bpmOAWorkOrderRespVO : bpmOAWorkOrderRespVOPageResult.getList()) {
|
||||||
|
bpmOAWorkOrderRespVO.setTypeName(workOrderTypeDictMap.get(bpmOAWorkOrderRespVO.getType()));
|
||||||
|
bpmOAWorkOrderRespVO.setLevelName(workOrderLevelDictMap.get(String.valueOf(bpmOAWorkOrderRespVO.getLevel())));
|
||||||
|
bpmOAWorkOrderRespVO.setStatusName(workOrderStatusDictMap.get(String.valueOf(bpmOAWorkOrderRespVO.getStatus())));
|
||||||
|
}
|
||||||
// 使用XML查询,直接返回带关联信息的VO数据
|
// 使用XML查询,直接返回带关联信息的VO数据
|
||||||
return workOrderMapper.selectAssignedWorkOrderPage(loginUserId, pageVO);
|
return bpmOAWorkOrderRespVOPageResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -212,6 +245,15 @@ public class BpmOAWorkOrderServiceImpl extends BpmOABaseService implements BpmOA
|
|||||||
return workOrderMapper.selectMyAssignedCount(userId);
|
return workOrderMapper.selectMyAssignedCount(userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult<BpmOAWorkOrderTrackInfo> getTrackPage(BpmOAWorkOrderTrackReqDTO dto) {
|
||||||
|
PageResult<BpmOAWorkOrderTrackDO> pageResult = trackMapper.selectPage(new PageParam().setPageSize(dto.getPageSize()).setPageNo(dto.getPageNo()),
|
||||||
|
new LambdaQueryWrapper<BpmOAWorkOrderTrackDO>()
|
||||||
|
.eq(dto.getWorkOrderId() != null, BpmOAWorkOrderTrackDO::getWorkOrderId, dto.getWorkOrderId())
|
||||||
|
.eq(StrUtil.isNotEmpty(dto.getOperationType()), BpmOAWorkOrderTrackDO::getOperationType, dto.getOperationType()));
|
||||||
|
return new PageResult<>(pageResult.getList().stream().map(this::convertToTrackInfo).collect(Collectors.toList()), pageResult.getTotal());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建跟踪记录
|
* 创建跟踪记录
|
||||||
*/
|
*/
|
||||||
@ -293,10 +335,10 @@ public class BpmOAWorkOrderServiceImpl extends BpmOABaseService implements BpmOA
|
|||||||
|
|
||||||
// 设置类型名称
|
// 设置类型名称
|
||||||
respVO.setTypeName(getWorkOrderTypeName(workOrder.getType()));
|
respVO.setTypeName(getWorkOrderTypeName(workOrder.getType()));
|
||||||
|
|
||||||
// 设置优先级名称
|
// 设置优先级名称
|
||||||
respVO.setLevelName(getWorkOrderLevelName(workOrder.getLevel()));
|
respVO.setLevelName(getWorkOrderLevelName(workOrder.getLevel()));
|
||||||
|
|
||||||
// 设置状态名称
|
// 设置状态名称
|
||||||
respVO.setStatusName(getWorkOrderStatusName(workOrder.getStatus()));
|
respVO.setStatusName(getWorkOrderStatusName(workOrder.getStatus()));
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
<!-- 工单分页查询SQL(所有工单) -->
|
<!-- 工单分页查询SQL(所有工单) -->
|
||||||
<select id="selectWorkOrderPage" resultMap="WorkOrderPageResultMap">
|
<select id="selectWorkOrderPage" resultMap="WorkOrderPageResultMap">
|
||||||
SELECT
|
SELECT
|
||||||
w.id,
|
w.id,
|
||||||
w.title,
|
w.title,
|
||||||
w.type,
|
w.type,
|
||||||
@ -55,18 +55,12 @@
|
|||||||
fu.nickname AS from_user_name,
|
fu.nickname AS from_user_name,
|
||||||
fd.name AS from_dept_name,
|
fd.name AS from_dept_name,
|
||||||
au.nickname AS assignee_user_name,
|
au.nickname AS assignee_user_name,
|
||||||
ad.name AS assignee_dept_name,
|
ad.name AS assignee_dept_name
|
||||||
wt.label AS type_name,
|
|
||||||
wl.label AS level_name,
|
|
||||||
ws.label AS status_name
|
|
||||||
FROM bpm_oa_work_order w
|
FROM bpm_oa_work_order w
|
||||||
LEFT JOIN system_users fu ON w.from_user_id = fu.id
|
LEFT JOIN system_users fu ON w.from_user_id = fu.id
|
||||||
LEFT JOIN system_dept fd ON w.from_dept_id = fd.id
|
LEFT JOIN system_dept fd ON w.from_dept_id = fd.id
|
||||||
LEFT JOIN system_users au ON w.assignee_user_id = au.id
|
LEFT JOIN system_users au ON w.assignee_user_id = au.id
|
||||||
LEFT JOIN system_dept ad ON w.assignee_dept_id = ad.id
|
LEFT JOIN system_dept ad ON w.assignee_dept_id = ad.id
|
||||||
LEFT JOIN system_dict_data wt ON wt.dict_type = 'work_order_type' AND wt.value = w.type
|
|
||||||
LEFT JOIN system_dict_data wl ON wl.dict_type = 'work_order_level' AND wl.value = CAST(w.level AS CHAR)
|
|
||||||
LEFT JOIN system_dict_data ws ON ws.dict_type = 'work_order_status' AND ws.value = CAST(w.status AS CHAR)
|
|
||||||
<where>
|
<where>
|
||||||
w.deleted = 0
|
w.deleted = 0
|
||||||
<if test="req.title != null and req.title != ''">
|
<if test="req.title != null and req.title != ''">
|
||||||
@ -93,7 +87,7 @@
|
|||||||
|
|
||||||
<!-- 我发起的工单分页查询SQL -->
|
<!-- 我发起的工单分页查询SQL -->
|
||||||
<select id="selectMyWorkOrderPage" resultMap="WorkOrderPageResultMap">
|
<select id="selectMyWorkOrderPage" resultMap="WorkOrderPageResultMap">
|
||||||
SELECT
|
SELECT
|
||||||
w.id,
|
w.id,
|
||||||
w.title,
|
w.title,
|
||||||
w.type,
|
w.type,
|
||||||
@ -114,20 +108,14 @@
|
|||||||
fu.nickname AS from_user_name,
|
fu.nickname AS from_user_name,
|
||||||
fd.name AS from_dept_name,
|
fd.name AS from_dept_name,
|
||||||
au.nickname AS assignee_user_name,
|
au.nickname AS assignee_user_name,
|
||||||
ad.name AS assignee_dept_name,
|
ad.name AS assignee_dept_name
|
||||||
wt.label AS type_name,
|
|
||||||
wl.label AS level_name,
|
|
||||||
ws.label AS status_name
|
|
||||||
FROM bpm_oa_work_order w
|
FROM bpm_oa_work_order w
|
||||||
LEFT JOIN system_users fu ON w.from_user_id = fu.id
|
LEFT JOIN system_users fu ON w.from_user_id = fu.id
|
||||||
LEFT JOIN system_dept fd ON w.from_dept_id = fd.id
|
LEFT JOIN system_dept fd ON w.from_dept_id = fd.id
|
||||||
LEFT JOIN system_users au ON w.assignee_user_id = au.id
|
LEFT JOIN system_users au ON w.assignee_user_id = au.id
|
||||||
LEFT JOIN system_dept ad ON w.assignee_dept_id = ad.id
|
LEFT JOIN system_dept ad ON w.assignee_dept_id = ad.id
|
||||||
LEFT JOIN system_dict_data wt ON wt.dict_type = 'work_order_type' AND wt.value = w.type
|
|
||||||
LEFT JOIN system_dict_data wl ON wl.dict_type = 'work_order_level' AND wl.value = CAST(w.level AS CHAR)
|
|
||||||
LEFT JOIN system_dict_data ws ON ws.dict_type = 'work_order_status' AND ws.value = CAST(w.status AS CHAR)
|
|
||||||
<where>
|
<where>
|
||||||
w.deleted = 0 AND w.from_user_id = #{loginUserId}
|
w.deleted = 0 AND w.from_user_id = #{req.loginUserId}
|
||||||
<if test="req.title != null and req.title != ''">
|
<if test="req.title != null and req.title != ''">
|
||||||
AND w.title LIKE CONCAT('%', #{req.title}, '%')
|
AND w.title LIKE CONCAT('%', #{req.title}, '%')
|
||||||
</if>
|
</if>
|
||||||
@ -146,7 +134,7 @@
|
|||||||
|
|
||||||
<!-- 分配给我的工单分页查询SQL -->
|
<!-- 分配给我的工单分页查询SQL -->
|
||||||
<select id="selectAssignedWorkOrderPage" resultMap="WorkOrderPageResultMap">
|
<select id="selectAssignedWorkOrderPage" resultMap="WorkOrderPageResultMap">
|
||||||
SELECT
|
SELECT
|
||||||
w.id,
|
w.id,
|
||||||
w.title,
|
w.title,
|
||||||
w.type,
|
w.type,
|
||||||
@ -167,20 +155,14 @@
|
|||||||
fu.nickname AS from_user_name,
|
fu.nickname AS from_user_name,
|
||||||
fd.name AS from_dept_name,
|
fd.name AS from_dept_name,
|
||||||
au.nickname AS assignee_user_name,
|
au.nickname AS assignee_user_name,
|
||||||
ad.name AS assignee_dept_name,
|
ad.name AS assignee_dept_name
|
||||||
wt.label AS type_name,
|
|
||||||
wl.label AS level_name,
|
|
||||||
ws.label AS status_name
|
|
||||||
FROM bpm_oa_work_order w
|
FROM bpm_oa_work_order w
|
||||||
LEFT JOIN system_users fu ON w.from_user_id = fu.id
|
LEFT JOIN system_users fu ON w.from_user_id = fu.id
|
||||||
LEFT JOIN system_dept fd ON w.from_dept_id = fd.id
|
LEFT JOIN system_dept fd ON w.from_dept_id = fd.id
|
||||||
LEFT JOIN system_users au ON w.assignee_user_id = au.id
|
LEFT JOIN system_users au ON w.assignee_user_id = au.id
|
||||||
LEFT JOIN system_dept ad ON w.assignee_dept_id = ad.id
|
LEFT JOIN system_dept ad ON w.assignee_dept_id = ad.id
|
||||||
LEFT JOIN system_dict_data wt ON wt.dict_type = 'work_order_type' AND wt.value = w.type
|
|
||||||
LEFT JOIN system_dict_data wl ON wl.dict_type = 'work_order_level' AND wl.value = CAST(w.level AS CHAR)
|
|
||||||
LEFT JOIN system_dict_data ws ON ws.dict_type = 'work_order_status' AND ws.value = CAST(w.status AS CHAR)
|
|
||||||
<where>
|
<where>
|
||||||
w.deleted = 0 AND w.assignee_user_id = #{loginUserId}
|
w.deleted = 0 AND w.assignee_user_id = #{req.loginUserId}
|
||||||
<if test="req.title != null and req.title != ''">
|
<if test="req.title != null and req.title != ''">
|
||||||
AND w.title LIKE CONCAT('%', #{req.title}, '%')
|
AND w.title LIKE CONCAT('%', #{req.title}, '%')
|
||||||
</if>
|
</if>
|
||||||
@ -196,5 +178,12 @@
|
|||||||
</where>
|
</where>
|
||||||
ORDER BY w.id DESC
|
ORDER BY w.id DESC
|
||||||
</select>
|
</select>
|
||||||
|
<select id="selectByProcessInstanceId"
|
||||||
|
resultType="cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderDO">
|
||||||
|
select a.*
|
||||||
|
from bpm_oa_work_order a
|
||||||
|
where a.deleted = 0
|
||||||
|
and a.process_instance_id = #{processInstanceId}
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAWorkOrderTrackMapper">
|
||||||
|
|
||||||
|
<!-- 工单分页查询结果映射 -->
|
||||||
|
|
||||||
|
</mapper>
|
@ -0,0 +1,37 @@
|
|||||||
|
package cn.iocoder.yudao.module.infra.config;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MinIO 配置属性类
|
||||||
|
*
|
||||||
|
* @author AI Assistant
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Configuration
|
||||||
|
@ConfigurationProperties(prefix = "minio")
|
||||||
|
public class MinioConfigProperties {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MinIO 服务地址
|
||||||
|
*/
|
||||||
|
private String endpoint;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 访问密钥
|
||||||
|
*/
|
||||||
|
private String accessKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 密钥
|
||||||
|
*/
|
||||||
|
private String secretKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认存储桶名称
|
||||||
|
*/
|
||||||
|
private String bucketName;
|
||||||
|
|
||||||
|
}
|
@ -3,17 +3,23 @@ package cn.iocoder.yudao.module.infra.controller.app.file;
|
|||||||
import cn.hutool.core.io.IoUtil;
|
import cn.hutool.core.io.IoUtil;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.module.infra.controller.app.file.vo.AppFileUploadReqVO;
|
import cn.iocoder.yudao.module.infra.controller.app.file.vo.AppFileUploadReqVO;
|
||||||
|
import cn.iocoder.yudao.module.infra.controller.app.file.vo.MinioMultiUploadReqVO;
|
||||||
|
import cn.iocoder.yudao.module.infra.controller.app.file.vo.MinioUploadReqVO;
|
||||||
|
import cn.iocoder.yudao.module.infra.controller.app.file.vo.MinioUploadRespVO;
|
||||||
import cn.iocoder.yudao.module.infra.service.file.FileService;
|
import cn.iocoder.yudao.module.infra.service.file.FileService;
|
||||||
|
import cn.iocoder.yudao.module.infra.service.minio.MinioService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
|
||||||
@ -27,6 +33,9 @@ public class AppFileController {
|
|||||||
@Resource
|
@Resource
|
||||||
private FileService fileService;
|
private FileService fileService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private MinioService minioService;
|
||||||
|
|
||||||
@PostMapping("/upload")
|
@PostMapping("/upload")
|
||||||
@Operation(summary = "上传文件")
|
@Operation(summary = "上传文件")
|
||||||
public CommonResult<String> uploadFile(AppFileUploadReqVO uploadReqVO) throws Exception {
|
public CommonResult<String> uploadFile(AppFileUploadReqVO uploadReqVO) throws Exception {
|
||||||
@ -35,4 +44,40 @@ public class AppFileController {
|
|||||||
return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream())));
|
return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/minio/upload")
|
||||||
|
@Operation(summary = "MinIO单文件上传")
|
||||||
|
public CommonResult<MinioUploadRespVO> minioUpload(MinioUploadReqVO uploadReqVO) {
|
||||||
|
try {
|
||||||
|
String fileUrl = minioService.uploadFile(uploadReqVO.getFile(), uploadReqVO.getPath());
|
||||||
|
return success(MinioUploadRespVO.single(fileUrl));
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("MinIO文件上传失败", e);
|
||||||
|
return CommonResult.error(500, "文件上传失败: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/minio/upload/multiple")
|
||||||
|
@Operation(summary = "MinIO多文件上传")
|
||||||
|
public CommonResult<MinioUploadRespVO> minioUploadMultiple(@RequestParam("files") MultipartFile[] files) {
|
||||||
|
try {
|
||||||
|
List<String> fileUrls = minioService.uploadFiles(files);
|
||||||
|
return success(MinioUploadRespVO.multiple(fileUrls));
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("MinIO多文件上传失败", e);
|
||||||
|
return CommonResult.error(500, "文件上传失败: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/minio/upload/batch")
|
||||||
|
@Operation(summary = "MinIO批量文件上传(表单方式)")
|
||||||
|
public CommonResult<MinioUploadRespVO> minioUploadBatch(MinioMultiUploadReqVO uploadReqVO) {
|
||||||
|
try {
|
||||||
|
List<String> fileUrls = minioService.uploadFiles(uploadReqVO.getFiles());
|
||||||
|
return success(MinioUploadRespVO.multiple(fileUrls));
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("MinIO批量文件上传失败", e);
|
||||||
|
return CommonResult.error(500, "文件上传失败: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
package cn.iocoder.yudao.module.infra.controller.app.file.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MinIO 多文件上传请求 VO
|
||||||
|
*
|
||||||
|
* @author AI Assistant
|
||||||
|
*/
|
||||||
|
@Schema(description = "用户 App - MinIO 多文件上传请求")
|
||||||
|
@Data
|
||||||
|
public class MinioMultiUploadReqVO {
|
||||||
|
|
||||||
|
@Schema(description = "文件数组", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
@NotEmpty(message = "文件不能为空")
|
||||||
|
private MultipartFile[] files;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package cn.iocoder.yudao.module.infra.controller.app.file.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MinIO 文件上传请求 VO
|
||||||
|
*
|
||||||
|
* @author AI Assistant
|
||||||
|
*/
|
||||||
|
@Schema(description = "用户 App - MinIO 文件上传请求")
|
||||||
|
@Data
|
||||||
|
public class MinioUploadReqVO {
|
||||||
|
|
||||||
|
@Schema(description = "文件", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
@NotNull(message = "文件不能为空")
|
||||||
|
private MultipartFile file;
|
||||||
|
|
||||||
|
@Schema(description = "文件路径", example = "avatar/user.jpg")
|
||||||
|
private String path;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package cn.iocoder.yudao.module.infra.controller.app.file.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MinIO 文件上传响应 VO
|
||||||
|
*
|
||||||
|
* @author AI Assistant
|
||||||
|
*/
|
||||||
|
@Schema(description = "用户 App - MinIO 文件上传响应")
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class MinioUploadRespVO {
|
||||||
|
|
||||||
|
@Schema(description = "文件访问URL", example = "http://113.105.111.100:9000/yudao-bucket/abc123.jpg")
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
@Schema(description = "文件访问URL列表", example = "[\"http://113.105.111.100:9000/yudao-bucket/abc123.jpg\"]")
|
||||||
|
private List<String> urls;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建单文件上传响应
|
||||||
|
*/
|
||||||
|
public static MinioUploadRespVO single(String url) {
|
||||||
|
return new MinioUploadRespVO(url, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建多文件上传响应
|
||||||
|
*/
|
||||||
|
public static MinioUploadRespVO multiple(List<String> urls) {
|
||||||
|
return new MinioUploadRespVO(null, urls);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,158 @@
|
|||||||
|
package cn.iocoder.yudao.module.infra.service.minio;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.module.infra.config.MinioConfigProperties;
|
||||||
|
import io.minio.BucketExistsArgs;
|
||||||
|
import io.minio.MakeBucketArgs;
|
||||||
|
import io.minio.MinioClient;
|
||||||
|
import io.minio.PutObjectArgs;
|
||||||
|
import io.minio.RemoveObjectArgs;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MinIO 文件服务类
|
||||||
|
*
|
||||||
|
* @author AI Assistant
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class MinioService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private MinioConfigProperties minioConfigProperties;
|
||||||
|
|
||||||
|
private MinioClient minioClient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化 MinIO 客户端
|
||||||
|
*/
|
||||||
|
@PostConstruct
|
||||||
|
public void init() {
|
||||||
|
try {
|
||||||
|
this.minioClient = MinioClient.builder()
|
||||||
|
.endpoint(minioConfigProperties.getEndpoint())
|
||||||
|
.credentials(minioConfigProperties.getAccessKey(), minioConfigProperties.getSecretKey())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// 检查桶是否存在,不存在则创建
|
||||||
|
boolean bucketExists = minioClient.bucketExists(
|
||||||
|
BucketExistsArgs.builder()
|
||||||
|
.bucket(minioConfigProperties.getBucketName())
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!bucketExists) {
|
||||||
|
minioClient.makeBucket(
|
||||||
|
MakeBucketArgs.builder()
|
||||||
|
.bucket(minioConfigProperties.getBucketName())
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
log.info("创建存储桶: {}", minioConfigProperties.getBucketName());
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("MinIO 客户端初始化成功. Endpoint: {}, Bucket: {}",
|
||||||
|
minioConfigProperties.getEndpoint(), minioConfigProperties.getBucketName());
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("MinIO 客户端初始化失败", e);
|
||||||
|
throw new RuntimeException("MinIO 客户端初始化失败", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上传单个文件
|
||||||
|
*
|
||||||
|
* @param file 上传的文件
|
||||||
|
* @param path 文件存储路径,如果为空则自动生成
|
||||||
|
* @return 文件访问URL
|
||||||
|
*/
|
||||||
|
public String uploadFile(MultipartFile file, String path) throws Exception {
|
||||||
|
if (file.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("上传文件不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果路径为空,则生成随机路径
|
||||||
|
if (path == null || path.trim().isEmpty()) {
|
||||||
|
String originalFilename = file.getOriginalFilename();
|
||||||
|
String extension = "";
|
||||||
|
if (originalFilename != null && originalFilename.contains(".")) {
|
||||||
|
extension = originalFilename.substring(originalFilename.lastIndexOf("."));
|
||||||
|
}
|
||||||
|
path = UUID.randomUUID().toString() + extension;
|
||||||
|
}
|
||||||
|
|
||||||
|
try (InputStream inputStream = file.getInputStream()) {
|
||||||
|
// 上传文件到 MinIO
|
||||||
|
minioClient.putObject(
|
||||||
|
PutObjectArgs.builder()
|
||||||
|
.bucket(minioConfigProperties.getBucketName())
|
||||||
|
.object(path)
|
||||||
|
.stream(inputStream, file.getSize(), -1)
|
||||||
|
.contentType(file.getContentType())
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
// 生成文件访问URL
|
||||||
|
String fileUrl = minioConfigProperties.getEndpoint() + "/" +
|
||||||
|
minioConfigProperties.getBucketName() + "/" + path;
|
||||||
|
|
||||||
|
log.info("文件上传成功: {}", fileUrl);
|
||||||
|
return fileUrl;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("文件上传失败: {}", path, e);
|
||||||
|
throw new Exception("文件上传失败: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上传多个文件
|
||||||
|
*
|
||||||
|
* @param files 上传的文件数组
|
||||||
|
* @return 文件访问URL列表
|
||||||
|
*/
|
||||||
|
public List<String> uploadFiles(MultipartFile[] files) throws Exception {
|
||||||
|
if (files == null || files.length == 0) {
|
||||||
|
throw new IllegalArgumentException("上传文件不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> fileUrls = new ArrayList<>();
|
||||||
|
|
||||||
|
for (MultipartFile file : files) {
|
||||||
|
if (!file.isEmpty()) {
|
||||||
|
String fileUrl = uploadFile(file, null);
|
||||||
|
fileUrls.add(fileUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("批量文件上传完成,共上传 {} 个文件", fileUrls.size());
|
||||||
|
return fileUrls;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除文件
|
||||||
|
*
|
||||||
|
* @param path 文件路径
|
||||||
|
*/
|
||||||
|
public void deleteFile(String path) throws Exception {
|
||||||
|
try {
|
||||||
|
minioClient.removeObject(
|
||||||
|
RemoveObjectArgs.builder()
|
||||||
|
.bucket(minioConfigProperties.getBucketName())
|
||||||
|
.object(path)
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
log.info("文件删除成功: {}", path);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("文件删除失败: {}", path, e);
|
||||||
|
throw new Exception("文件删除失败: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,11 @@
|
|||||||
--- #################### 数据库相关配置 ####################
|
--- #################### 数据库相关配置 ####################
|
||||||
spring:
|
spring:
|
||||||
|
# Servlet 配置
|
||||||
|
servlet:
|
||||||
|
# 文件上传相关配置项
|
||||||
|
multipart:
|
||||||
|
max-file-size: 5GB # 单个文件大小
|
||||||
|
max-request-size: 10GB # 设置总上传的文件大小
|
||||||
|
|
||||||
# 数据源配置项
|
# 数据源配置项
|
||||||
autoconfigure:
|
autoconfigure:
|
||||||
@ -122,6 +128,15 @@ logging:
|
|||||||
cn.iocoder.yudao.module.infra.dal.mysql: debug
|
cn.iocoder.yudao.module.infra.dal.mysql: debug
|
||||||
cn.iocoder.yudao.module.infra.dal.mysql.file.FileConfigMapper: INFO # 配置 FileConfigMapper 的日志级别为 info
|
cn.iocoder.yudao.module.infra.dal.mysql.file.FileConfigMapper: INFO # 配置 FileConfigMapper 的日志级别为 info
|
||||||
|
|
||||||
|
--- #################### MinIO 文件服务配置 ####################
|
||||||
|
|
||||||
|
# MinIO 配置项
|
||||||
|
minio:
|
||||||
|
endpoint: http://10.10.2.3:9000 # MinIO 服务地址
|
||||||
|
access-key: fKpfyQYqJn7jSId2WDhn # 访问密钥
|
||||||
|
secret-key: XkTbVLD1pgvxXphFIjgpIYKks166o9zGrDFqTz3t # 密钥
|
||||||
|
bucket-name: test-bucket # 默认存储桶名称
|
||||||
|
|
||||||
--- #################### 芋道相关配置 ####################
|
--- #################### 芋道相关配置 ####################
|
||||||
|
|
||||||
# 芋道配置项,设置当前项目所有自定义的配置
|
# 芋道配置项,设置当前项目所有自定义的配置
|
||||||
|
Loading…
Reference in New Issue
Block a user