Compare commits
No commits in common. "dev" and "dev-erp" have entirely different histories.
Binary file not shown.
162
script/docker/docker-compose.yml
Normal file
162
script/docker/docker-compose.yml
Normal file
@ -0,0 +1,162 @@
|
||||
version: '3'
|
||||
services:
|
||||
yudao-gateway:
|
||||
image: yudao-gateway
|
||||
container_name: yudao-gateway
|
||||
environment:
|
||||
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||
- SW_AGENT_NAME=yudao-gateway
|
||||
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
volumes:
|
||||
- /docker/yudao-cloud/logs:/root/logs/
|
||||
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||
restart: always
|
||||
network_mode: host # 以主机网络环境运行
|
||||
yudao-system:
|
||||
image: yudao-module-system-biz
|
||||
container_name: yudao-system
|
||||
environment:
|
||||
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||
- SW_AGENT_NAME=yudao-gateway
|
||||
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
volumes:
|
||||
- /docker/yudao-cloud/logs:/root/logs/
|
||||
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||
healthcheck:
|
||||
test: [ "CMD","curl","-f","http://localhost:48081" ]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
start_period: 60s
|
||||
restart: always
|
||||
network_mode: host
|
||||
yudao-infra:
|
||||
image: yudao-module-infra-biz
|
||||
container_name: yudao-infra
|
||||
environment:
|
||||
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||
- SW_AGENT_NAME=yudao-gateway
|
||||
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
volumes:
|
||||
- /docker/yudao-cloud/logs:/root/logs/
|
||||
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||
restart: always
|
||||
network_mode: host
|
||||
healthcheck:
|
||||
test: [ "CMD","curl","-f","http://localhost:48082" ]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
start_period: 60s
|
||||
depends_on:
|
||||
yudao-system:
|
||||
condition: service_healthy
|
||||
yudao-report:
|
||||
image: yudao-module-report-biz
|
||||
container_name: yudao-report
|
||||
environment:
|
||||
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||
- SW_AGENT_NAME=yudao-gateway
|
||||
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
volumes:
|
||||
- /docker/yudao-cloud/logs:/root/logs/
|
||||
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||
restart: always
|
||||
network_mode: host
|
||||
depends_on:
|
||||
yudao-infra:
|
||||
condition: service_healthy
|
||||
yudao-bpm:
|
||||
image: yudao-module-bpm-biz
|
||||
container_name: yudao-bpm
|
||||
environment:
|
||||
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||
- SW_AGENT_NAME=yudao-gateway
|
||||
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
volumes:
|
||||
- /docker/yudao-cloud/logs:/root/logs/
|
||||
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||
restart: always
|
||||
network_mode: host
|
||||
depends_on:
|
||||
yudao-infra:
|
||||
condition: service_healthy
|
||||
yudao-pay:
|
||||
image: yudao-module-pay-biz
|
||||
container_name: yudao-pay
|
||||
environment:
|
||||
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||
- SW_AGENT_NAME=yudao-gateway
|
||||
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
volumes:
|
||||
- /docker/yudao-cloud/logs:/root/logs/
|
||||
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||
restart: always
|
||||
network_mode: host
|
||||
depends_on:
|
||||
yudao-infra:
|
||||
condition: service_healthy
|
||||
yudao-mp:
|
||||
image: yudao-module-mp-biz
|
||||
container_name: yudao-mp
|
||||
environment:
|
||||
- TZ=Asia/Shanghai # 配置程序默认时区为上海(中国标准时间)
|
||||
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar # 配置skywalking
|
||||
- SW_AGENT_NAME=yudao-gateway
|
||||
- SW_AGENT_TRACE_IGNORE_PATH=Redisson/PING,/actuator/**,/admin/**
|
||||
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=[YOUR_SKYWALKING_ADDR] # 请替换 your.skywalking.addr 为你的 skywalking 地址
|
||||
- SPRING_PROFILES_ACTIVE=test # 指定程序运行环境
|
||||
- SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=[YOUR_NACOS_ADDR] # 配置中心地址
|
||||
- SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
- SPRING_CLOUD_NACOS_SERVER_ADDR=[YOUR_NACOS_ADDR] # 注册中心地址
|
||||
- SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=[YOUR_NAMESPACE] # 命名空间
|
||||
volumes:
|
||||
- /docker/yudao-cloud/logs:/root/logs/
|
||||
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
|
||||
restart: always
|
||||
network_mode: host
|
||||
depends_on:
|
||||
yudao-infra:
|
||||
condition: service_healthy
|
28
script/idea/http-client.env.json
Normal file
28
script/idea/http-client.env.json
Normal file
@ -0,0 +1,28 @@
|
||||
{
|
||||
"local": {
|
||||
"baseUrl": "http://127.0.0.1:48080/admin-api",
|
||||
"systemBaseUrl": "http://127.0.0.1:48081/admin-api",
|
||||
"infaBaseUrl": "http://127.0.0.1:48082/admin-api",
|
||||
|
||||
"token": "test1",
|
||||
"adminTenentId": "1",
|
||||
"tag": "${HOSTNAME}",
|
||||
|
||||
"appApi": "http://127.0.0.1:48080/app-api",
|
||||
"appToken": "test1",
|
||||
"appTenentId": "1"
|
||||
},
|
||||
"gateway": {
|
||||
"baseUrl": "http://127.0.0.1:48080/admin-api",
|
||||
"systemBaseUrl": "http://127.0.0.1:48080/admin-api",
|
||||
"infaBaseUrl": "http://127.0.0.1:48080/admin-api",
|
||||
|
||||
"token": "test1",
|
||||
"adminTenentId": "1",
|
||||
"tag": "${HOSTNAME}",
|
||||
|
||||
"appApi": "http://127.0.0.1:8888/app-api",
|
||||
"appToken": "test1",
|
||||
"appTenentId": "1"
|
||||
}
|
||||
}
|
BIN
sql/.DS_Store
vendored
Normal file
BIN
sql/.DS_Store
vendored
Normal file
Binary file not shown.
@ -73,7 +73,7 @@
|
||||
<!-- 三方云服务相关 -->
|
||||
<okio.version>3.5.0</okio.version>
|
||||
<okhttp3.version>4.11.0</okhttp3.version>
|
||||
<commons-io.version>2.16.1</commons-io.version>
|
||||
<commons-io.version>2.11.0</commons-io.version>
|
||||
<minio.version>8.5.6</minio.version>
|
||||
<aliyun-java-sdk-core.version>4.6.4</aliyun-java-sdk-core.version>
|
||||
<aliyun-java-sdk-dysmsapi.version>2.2.1</aliyun-java-sdk-dysmsapi.version>
|
||||
|
BIN
yudao-framework/.DS_Store
vendored
Normal file
BIN
yudao-framework/.DS_Store
vendored
Normal file
Binary file not shown.
@ -1,82 +0,0 @@
|
||||
package cn.iocoder.yudao.framework.common.util.address;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
public class AddressUtil {
|
||||
|
||||
// 替换成您在天地图官网申请的密钥
|
||||
private static final String API_KEY = "e11694af0e347f991a0b18f10f2491d3";
|
||||
|
||||
public static void main(String[] args) {
|
||||
// 示例经纬度(深圳腾讯大厦)
|
||||
double longitude = 115.43835;
|
||||
double latitude = 28.200279;
|
||||
// 35.88052,114.8731
|
||||
try {
|
||||
String result = reverseGeocode(longitude, latitude);
|
||||
System.out.println("逆地理编码结果:");
|
||||
System.out.println(result);
|
||||
} catch (Exception e) {
|
||||
System.err.println("逆地理编码失败:");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static String reverseGeocode(double longitude, double latitude) throws Exception {
|
||||
// 1. 构建请求参数(注意使用双引号)
|
||||
String postStr = String.format("{\"lon\":%f,\"lat\":%f,\"ver\":2}", longitude, latitude);
|
||||
|
||||
// 2. URL编码参数
|
||||
String encodedPostStr = URLEncoder.encode(postStr, StandardCharsets.UTF_8.name());
|
||||
|
||||
// 3. 构建完整URL
|
||||
String urlStr = "http://api.tianditu.gov.cn/geocoder?postStr=" + encodedPostStr
|
||||
+ "&type=geocode&tk=" + API_KEY;
|
||||
|
||||
// 4. 创建HTTP连接
|
||||
URL url = new URL(urlStr);
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setRequestMethod("GET");
|
||||
|
||||
// 5. 设置请求头(模拟浏览器访问)
|
||||
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
|
||||
conn.setRequestProperty("Accept", "application/json");
|
||||
|
||||
// 6. 获取响应
|
||||
int responseCode = conn.getResponseCode();
|
||||
|
||||
if (responseCode == HttpURLConnection.HTTP_OK) {
|
||||
// 读取成功响应
|
||||
try (BufferedReader reader = new BufferedReader(
|
||||
new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
|
||||
|
||||
StringBuilder response = new StringBuilder();
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
response.append(line);
|
||||
}
|
||||
return response.toString();
|
||||
}
|
||||
} else {
|
||||
// 读取错误信息
|
||||
try (BufferedReader errorReader = new BufferedReader(
|
||||
new InputStreamReader(conn.getErrorStream(), StandardCharsets.UTF_8))) {
|
||||
|
||||
StringBuilder errorResponse = new StringBuilder();
|
||||
String line;
|
||||
while ((line = errorReader.readLine()) != null) {
|
||||
errorResponse.append(line);
|
||||
}
|
||||
|
||||
throw new RuntimeException("API请求失败: HTTP " + responseCode
|
||||
+ "\n错误详情: " + errorResponse.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
Binary file not shown.
@ -124,9 +124,5 @@ public interface ErrorCodeConstants {
|
||||
= new ErrorCode(1_009_012_002, "流程审批中或已通过当月不可重复申请");
|
||||
|
||||
|
||||
ErrorCode THE_WORK_ORDER_RULE_TYPE_ALREADY_EXISTS_PLEASE_DO_NOT_ADD_IT_REPEATEDLY
|
||||
= new ErrorCode(1_009_013_001, "工单规则类型已存在,请勿重复添加");
|
||||
|
||||
|
||||
ErrorCode BPM_SYSTEM_BUG = new ErrorCode(1_009_012_001, "系统问题,请联系管理员");
|
||||
}
|
||||
|
@ -25,8 +25,7 @@ public enum BpmTaskRuleScriptEnum {
|
||||
LEADER_X8(27L, "调薪部门领导"),
|
||||
LEADER_X9(28L, "调薪人上级领导"),
|
||||
LEADER_X10(29L, "所选工厂的领导"),
|
||||
LEADER_X11(30L, "审批人的上级领导"),
|
||||
LEADER_X31(31L, "工单负责人");
|
||||
LEADER_X11(30L, "审批人的上级领导");
|
||||
|
||||
/**
|
||||
* 脚本编号
|
||||
|
@ -140,16 +140,6 @@
|
||||
<version>2.0.0-jdk8-snapshot</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.alibaba</groupId>-->
|
||||
<!-- <artifactId>easyexcel-core</artifactId>-->
|
||||
<!-- <version>4.0.3</version>-->
|
||||
<!-- <scope>compile</scope>-->
|
||||
<!-- </dependency>-->
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-excel</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
<build>
|
||||
|
@ -8,7 +8,9 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDate;
|
||||
import java.util.*;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
@ -32,25 +34,8 @@ public class BpmOAEvectionApiImpl implements BpmOAEvectionApi {
|
||||
List<BpmOAEvectionDO> evectionOff = evectionService.getEvectionListByEndTime(now.minusDays(1));
|
||||
|
||||
Map<String, List<Long>> result = new HashMap<>();
|
||||
result.put("on", evectionOn.stream().flatMap(item -> {
|
||||
Set<Long> togetherUserIds = item.getTogetherUserIds();
|
||||
List<Long> ids = new ArrayList<>();
|
||||
ids.add(item.getUserId());
|
||||
if (togetherUserIds != null) {
|
||||
ids.addAll(togetherUserIds); // 将 Set 转换为 List 并添加进去
|
||||
}
|
||||
return ids.stream();
|
||||
}).distinct().collect(Collectors.toList()));
|
||||
result.put("off", evectionOff.stream().flatMap(item -> {
|
||||
Set<Long> togetherUserIds = item.getTogetherUserIds();
|
||||
List<Long> ids = new ArrayList<>();
|
||||
ids.add(item.getUserId());
|
||||
if (togetherUserIds != null) {
|
||||
ids.addAll(togetherUserIds); // 将 Set 转换为 List 并添加进去
|
||||
}
|
||||
return ids.stream();
|
||||
}).distinct().collect(Collectors.toList()));
|
||||
|
||||
result.put("on", evectionOn.stream().map(BpmOAEvectionDO::getUserId).distinct().collect(Collectors.toList()));
|
||||
result.put("off", evectionOff.stream().map(BpmOAEvectionDO::getUserId).distinct().collect(Collectors.toList()));
|
||||
return success(result);
|
||||
}
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ public class BpmProcessDefinitionController {
|
||||
BpmProcessDefinitionListReqVO listReqVO) {
|
||||
|
||||
List<BpmProcessDefinitionRespVO> respVOS = bpmDefinitionService.getProcessDefinitionList(listReqVO);
|
||||
respVOS = respVOS.stream().filter(data -> !(data.getId().contains("work_task") || data.getId().contains("work_order"))).collect(Collectors.toList());
|
||||
respVOS = respVOS.stream().filter(data -> !data.getId().contains("work_task")).collect(Collectors.toList());
|
||||
return success(respVOS);
|
||||
}
|
||||
|
||||
|
@ -2,11 +2,9 @@ package cn.iocoder.yudao.module.bpm.controller.admin.financialpayment;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.FinancialPaymentPageReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.FinancialPaymentRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.FinancialPaymentSaveReqVO;
|
||||
@ -19,19 +17,15 @@ import cn.iocoder.yudao.module.bpm.service.financialpaymentitem.FinancialPayment
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
||||
|
||||
@Tag(name = "管理后台 - 财务支付管理")
|
||||
@RestController
|
||||
@ -108,11 +102,6 @@ public class FinancialPaymentController {
|
||||
@Operation(summary = "获得财务支付管理分页")
|
||||
public CommonResult<PageResult<FinancialPaymentRespVO>> getFinancialPaymentPage(@Valid FinancialPaymentPageReqVO pageReqVO) {
|
||||
PageResult<FinancialPaymentDO> pageResult = financialPaymentService.getFinancialPaymentPage(pageReqVO);
|
||||
pageResult.getList().forEach(item -> {
|
||||
if (StringUtils.isNotEmpty(item.getRecipientName())) {
|
||||
item.setRecipientName(item.getRecipientName().split(",")[0]);
|
||||
}
|
||||
});
|
||||
return success(BeanUtils.toBean(pageResult, FinancialPaymentRespVO.class));
|
||||
}
|
||||
|
||||
@ -122,14 +111,4 @@ public class FinancialPaymentController {
|
||||
FinancialPaymentDO paymentDO = financialPaymentService.getPaymentTotal(pageReqVO);
|
||||
return success(BeanUtils.toBean(paymentDO, FinancialPaymentRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@Operation(summary = "导出支付信息 Excel")
|
||||
@OperateLog(type = EXPORT)
|
||||
public void exportFactoryInfoExcel(@Valid FinancialPaymentPageReqVO pageReqVO,
|
||||
HttpServletResponse response) throws IOException {
|
||||
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||
|
||||
financialPaymentService.exportList(response, pageReqVO);
|
||||
}
|
||||
}
|
||||
|
@ -1,42 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 用户 Excel 导入 VO
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
|
||||
public class FinancialExportExcelVO {
|
||||
|
||||
@ExcelProperty("姓名")
|
||||
private String nickName;
|
||||
|
||||
@ExcelProperty("报销部门")
|
||||
private String deptName;
|
||||
|
||||
@ExcelProperty("事项")
|
||||
private String detail;
|
||||
|
||||
@ExcelProperty("金额")
|
||||
private BigDecimal amount;
|
||||
|
||||
@ExcelProperty("卡号")
|
||||
private String bankNo;
|
||||
|
||||
@ExcelProperty("公账/私账")
|
||||
private String type;
|
||||
|
||||
@ExcelProperty("备注")
|
||||
private String note;
|
||||
}
|
@ -75,8 +75,8 @@ public class BpmOAContractController {
|
||||
Map<Long, AdminUserRespDTO> userMap = userApi.getUserMap(userIds);
|
||||
if (CollectionUtil.isNotEmpty(userMap)) {
|
||||
// 设置创建人、签约人名称
|
||||
respVO.setSignatoryName(userMap.get(contract.getSignatoryId()) != null ? userMap.get(contract.getSignatoryId()).getNickname() : null);
|
||||
respVO.setCreateName(userMap.get(contract.getUserId()) != null ? userMap.get(contract.getUserId()).getNickname() : null);
|
||||
respVO.setSignatoryName(userMap.get(contract.getSignatoryId()).getNickname());
|
||||
respVO.setCreateName(userMap.get(contract.getUserId()).getNickname());
|
||||
}
|
||||
|
||||
// 获取公司信息
|
||||
|
@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.bpm.controller.admin.oa;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.evection.BpmOAEvectionCreateReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.evection.BpmOAEvectionRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAEvectionConvert;
|
||||
@ -66,15 +65,6 @@ public class BpmOAEvectionController {
|
||||
return success(respVO);
|
||||
}
|
||||
|
||||
@GetMapping("/get-list")
|
||||
@Operation(summary = "获得我的出差申请")
|
||||
public CommonResult<List<BpmOAEvectionRespVO>> getEvectionList() {
|
||||
|
||||
List<BpmOAEvectionDO> evections = evectionService.getEvectionList();
|
||||
|
||||
return success(BeanUtils.toBean(evections, BpmOAEvectionRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/getByProcessInstanceId")
|
||||
@Operation(summary = "获得出差申请")
|
||||
@Parameter(name = "processInstanceId", description = "流程实例编号", required = true, example = "1024")
|
||||
|
@ -2,7 +2,6 @@ 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.datapermission.core.annotation.DataPermission;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.expenses.*;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAExpensesDO;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAExpensesService;
|
||||
@ -63,7 +62,6 @@ public class BpmOAExpensesController {
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得生产开支申请分页")
|
||||
@DataPermission(enable = false)
|
||||
public CommonResult<PageResult<BpmOAExpensesPageRespVO>> getExpensesPage(BpmOAExpensesPageReqVO pageReqVO) {
|
||||
|
||||
PageResult<BpmOAExpensesPageRespVO> respVO = expensesService.getExpensesPage(pageReqVO);
|
||||
@ -72,7 +70,6 @@ public class BpmOAExpensesController {
|
||||
|
||||
@GetMapping("/total")
|
||||
@Operation(summary = "获得开支金额统计")
|
||||
@DataPermission(enable = false)
|
||||
public CommonResult<BpmOAExpensesTotal> getExpensesTotal(BpmOAExpensesPageReqVO pageReqVO) {
|
||||
|
||||
return success(expensesService.getExpensesTotal(pageReqVO));
|
||||
@ -101,7 +98,6 @@ public class BpmOAExpensesController {
|
||||
@GetMapping("/oneClickPayment")
|
||||
@Operation(summary = "一键支付")
|
||||
@Parameter(name = "month", description = "月份", required = true, example = "2025-04")
|
||||
@DataPermission(enable = false)
|
||||
public CommonResult<Boolean> oneClickPayment(String month) {
|
||||
|
||||
expensesService.oneClickPayment(month);
|
||||
|
@ -5,7 +5,6 @@ import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.reimbursement.BpmOARei
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.reimbursement.BpmOAReimbursementRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAReimbursementDO;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAReimbursementService;
|
||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||
import cn.iocoder.yudao.module.system.api.project.ProjectApi;
|
||||
import cn.iocoder.yudao.module.system.api.project.dto.ProjectDTO;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
@ -38,9 +37,6 @@ public class BpmOAReimbursementController {
|
||||
@Resource
|
||||
private ProjectApi projectApi;
|
||||
|
||||
@Resource
|
||||
private DeptApi deptApi;
|
||||
|
||||
@PostMapping("/create")
|
||||
// @PreAuthorize("@ss.hasPermission('bpm:oa-reimbursement:create')")
|
||||
@Operation(summary = "创建请求申请")
|
||||
@ -56,16 +52,10 @@ public class BpmOAReimbursementController {
|
||||
|
||||
BpmOAReimbursementDO reimbursement = service.getReimbursement(id);
|
||||
BpmOAReimbursementRespVO respVO = service.convert(reimbursement);
|
||||
if (respVO != null) {
|
||||
if (StringUtil.isNotEmpty(respVO.getProjectNo())) {
|
||||
// 设置项目名称
|
||||
ProjectDTO projectDTO = projectApi.getProject(respVO.getProjectNo()).getCheckedData();
|
||||
respVO.setProjectName(projectDTO.getName());
|
||||
}
|
||||
if (respVO.getPaymentCompany() != null) {
|
||||
// 设置付款公司名称
|
||||
respVO.setPaymentCompanyName(deptApi.getDept(respVO.getPaymentCompany()).getCheckedData().getName());
|
||||
}
|
||||
if (respVO != null && StringUtil.isNotEmpty(respVO.getProjectNo())) {
|
||||
// 设置项目名称
|
||||
ProjectDTO projectDTO = projectApi.getProject(respVO.getProjectNo()).getCheckedData();
|
||||
respVO.setProjectName(projectDTO.getName());
|
||||
}
|
||||
return success(respVO);
|
||||
}
|
||||
@ -92,16 +82,10 @@ public class BpmOAReimbursementController {
|
||||
|
||||
BpmOAReimbursementDO reimbursement = service.getByProcessInstanceId(processInstanceId);
|
||||
BpmOAReimbursementRespVO respVO = service.convert(reimbursement);
|
||||
if (respVO != null) {
|
||||
if (StringUtil.isNotEmpty(respVO.getProjectNo())) {
|
||||
// 设置项目名称
|
||||
ProjectDTO projectDTO = projectApi.getProject(respVO.getProjectNo()).getCheckedData();
|
||||
respVO.setProjectName(projectDTO.getName());
|
||||
}
|
||||
if (respVO.getPaymentCompany() != null) {
|
||||
// 设置付款公司名称
|
||||
respVO.setPaymentCompanyName(deptApi.getDept(respVO.getPaymentCompany()).getCheckedData().getName());
|
||||
}
|
||||
if (respVO != null && StringUtil.isNotEmpty(respVO.getProjectNo())) {
|
||||
// 设置项目名称
|
||||
ProjectDTO projectDTO = projectApi.getProject(respVO.getProjectNo()).getCheckedData();
|
||||
respVO.setProjectName(projectDTO.getName());
|
||||
}
|
||||
return success(respVO);
|
||||
}
|
||||
|
@ -1,13 +1,11 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.salary.BpmOASalaryCreateReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.salary.BpmOASalaryRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOASalaryConvert;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOASalaryDO;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOASalaryService;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.FactoryInfoApi;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.dto.FactoryInfoDTO;
|
||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
@ -18,10 +16,6 @@ import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
@ -44,9 +38,6 @@ public class BpmOASalaryController {
|
||||
@Resource
|
||||
private DeptApi deptApi;
|
||||
|
||||
@Resource
|
||||
private FactoryInfoApi factoryInfoApi;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建请求申请")
|
||||
public CommonResult<Long> createSalary(@Valid @RequestBody BpmOASalaryCreateReqVO createReqVO) {
|
||||
@ -68,24 +59,12 @@ public class BpmOASalaryController {
|
||||
return success(new BpmOASalaryRespVO());
|
||||
}
|
||||
|
||||
BpmOASalaryRespVO respVO = BeanUtils.toBean(salary, BpmOASalaryRespVO.class);
|
||||
if (salary.getCompanyDeptId() != null) {
|
||||
// 获取部门详情
|
||||
DeptRespDTO dto = getDept(salary.getCompanyDeptId());
|
||||
// 获取部门详情
|
||||
DeptRespDTO dto = getDept(salary.getCompanyDeptId());
|
||||
|
||||
respVO.setCompanyName(dto.getName());
|
||||
}else {
|
||||
// 获取工厂信息
|
||||
Set<Long> factoryIds = salary.getFactoryDeptId();
|
||||
List<FactoryInfoDTO> factoryInfoDTOS = factoryInfoApi.getFactoryInfoList(factoryIds).getCheckedData();
|
||||
|
||||
String factoryNames = factoryInfoDTOS.stream()
|
||||
.map(FactoryInfoDTO::getShortName)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.joining(","));
|
||||
|
||||
respVO.setCompanyName(factoryNames);
|
||||
}
|
||||
BpmOASalaryRespVO respVO = BpmOASalaryConvert.INSTANCE.convert(salary)
|
||||
.setCompanyName(dto.getName())
|
||||
.setFactoryId(dto.getFactoryId());
|
||||
|
||||
return success(respVO);
|
||||
}
|
||||
@ -97,28 +76,12 @@ public class BpmOASalaryController {
|
||||
|
||||
BpmOASalaryDO salary = salaryService.getByProcessInstanceId(processInstanceId);
|
||||
|
||||
if (salary == null) {
|
||||
return success(new BpmOASalaryRespVO());
|
||||
}
|
||||
// 获取部门详情
|
||||
DeptRespDTO dto = getDept(salary.getCompanyDeptId());
|
||||
|
||||
BpmOASalaryRespVO respVO = BeanUtils.toBean(salary, BpmOASalaryRespVO.class);
|
||||
if (salary.getCompanyDeptId() != null) {
|
||||
// 获取部门详情
|
||||
DeptRespDTO dto = getDept(salary.getCompanyDeptId());
|
||||
|
||||
respVO.setCompanyName(dto.getName());
|
||||
}else {
|
||||
// 获取工厂信息
|
||||
Set<Long> factoryIds = salary.getFactoryDeptId();
|
||||
List<FactoryInfoDTO> factoryInfoDTOS = factoryInfoApi.getFactoryInfoList(factoryIds).getCheckedData();
|
||||
|
||||
String factoryNames = factoryInfoDTOS.stream()
|
||||
.map(FactoryInfoDTO::getShortName)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.joining(","));
|
||||
|
||||
respVO.setCompanyName(factoryNames);
|
||||
}
|
||||
BpmOASalaryRespVO respVO = BpmOASalaryConvert.INSTANCE.convert(salary)
|
||||
.setCompanyName(dto.getName())
|
||||
.setFactoryId(dto.getFactoryId());
|
||||
|
||||
return success(respVO);
|
||||
}
|
||||
|
@ -1,112 +0,0 @@
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
@ -1,104 +0,0 @@
|
||||
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.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder.*;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderDO;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAWorkOrderService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
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.annotation.security.PermitAll;
|
||||
import javax.validation.Valid;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
|
||||
/**
|
||||
* 管理后台 - BPM OA 工单
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@Tag(name = "管理后台 - BPM OA 工单")
|
||||
@RestController
|
||||
@RequestMapping("/bpm/oa/work-order")
|
||||
@Validated
|
||||
@Slf4j
|
||||
public class BpmOAWorkOrderController {
|
||||
|
||||
@Resource
|
||||
private BpmOAWorkOrderService workOrderService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建工单")
|
||||
@PreAuthorize("@ss.hasPermission('bpm:oa-work-order:create')")
|
||||
public CommonResult<Long> createWorkOrder(@Valid @RequestBody BpmOAWorkOrderCreateReqVO createReqVO) {
|
||||
return success(workOrderService.createWorkOrder(getLoginUserId(), createReqVO));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得工单分页")
|
||||
@PreAuthorize("@ss.hasPermission('bpm:oa-work-order:query')")
|
||||
public CommonResult<PageResult<BpmOAWorkOrderRespVO>> getWorkOrderPage(@Valid BpmOAWorkOrderPageReqVO pageReqVO) {
|
||||
return success(workOrderService.getWorkOrderPage(getLoginUserId(), pageReqVO));
|
||||
}
|
||||
|
||||
@GetMapping("/my-page")
|
||||
@Operation(summary = "获得我发起的工单分页")
|
||||
@PreAuthorize("@ss.hasPermission('bpm:oa-work-order:query')")
|
||||
public CommonResult<PageResult<BpmOAWorkOrderRespVO>> getMyWorkOrderPage(@Valid BpmOAWorkOrderPageReqVO pageReqVO) {
|
||||
return success(workOrderService.getMyWorkOrderPage(getLoginUserId(), pageReqVO));
|
||||
}
|
||||
|
||||
@GetMapping("/assigned-page")
|
||||
@Operation(summary = "获得分配给我的工单分页")
|
||||
@PreAuthorize("@ss.hasPermission('bpm:oa-work-order:query')")
|
||||
public CommonResult<PageResult<BpmOAWorkOrderRespVO>> getAssignedWorkOrderPage(@Valid BpmOAWorkOrderPageReqVO pageReqVO) {
|
||||
return success(workOrderService.getAssignedWorkOrderPage(getLoginUserId(), pageReqVO));
|
||||
}
|
||||
|
||||
@GetMapping("/get/{id}")
|
||||
@Operation(summary = "获得工单详情")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('bpm:oa-work-order:query')")
|
||||
public CommonResult<BpmOAWorkOrderRespVO> getWorkOrder(@PathVariable("id") Long id) {
|
||||
return success(workOrderService.getWorkOrderDetail(id));
|
||||
}
|
||||
|
||||
@PostMapping("/track")
|
||||
@Operation(summary = "添加工单跟踪记录")
|
||||
@PreAuthorize("@ss.hasPermission('bpm:oa-work-order:update')")
|
||||
public CommonResult<Boolean> addTrackInfo(@Valid @RequestBody BpmOAWorkOrderTrackReqVO trackReqVO) {
|
||||
workOrderService.addTrackInfo(getLoginUserId(), trackReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/track-page")
|
||||
@Operation(summary = "获得工单跟踪记录分页")
|
||||
public CommonResult<PageResult<BpmOAWorkOrderTrackInfo>> getTrackPage(@Valid BpmOAWorkOrderTrackReqDTO dto) {
|
||||
return success(workOrderService.getTrackPage(dto));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改工单")
|
||||
@PreAuthorize("@ss.hasPermission('bpm:oa-work-order:update')")
|
||||
public CommonResult<Boolean> updateWorkOrder(@Valid @RequestBody BpmOAWorkOrderUpdateReqVO updateReqVO) {
|
||||
workOrderService.updateWorkOrder(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/my-assigned-count")
|
||||
@Operation(summary = "获得我的待处理工单数量")
|
||||
@PermitAll
|
||||
public CommonResult<Long> getMyAssignedWorkOrderCount() {
|
||||
return success(workOrderService.getMyAssignedWorkOrderCount(getLoginUserId()));
|
||||
}
|
||||
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.attachment;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 功能描述 补充附件请求类
|
||||
*
|
||||
* @author: yj
|
||||
* @date: 2025年06月26日 14:41
|
||||
*/
|
||||
@Schema(description = "管理后台 - 补充附件 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode()
|
||||
@ToString(callSuper = true)
|
||||
public class BpmOAAttachmentReqVO {
|
||||
|
||||
@Schema(description = "流程业务ID", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "流程业务ID")
|
||||
private Long processBusinessId ;
|
||||
|
||||
@Schema(description = "流程类型", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String processType;
|
||||
|
||||
@Schema(description = "上传文件(包括历史的附件)", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private List<UploadUserFile> fileItems;
|
||||
|
||||
}
|
||||
|
@ -26,7 +26,4 @@ public class BpmOAPaymentPageReqVO extends PageParam {
|
||||
@Schema(description = "创建时间")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private String[] createTime;
|
||||
|
||||
@Schema(description = "申请人用户编号")
|
||||
private Long userId;
|
||||
}
|
||||
|
@ -4,7 +4,6 @@ import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOABaseRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.cash.BpmOACashRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.payment.BpmOAPaymentRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.reimbursement.BpmOAReimbursementRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.salary.BpmOASalaryRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@ -28,9 +27,6 @@ public class BpmOAPrintDataRespVO extends BpmOABaseRespVO {
|
||||
@Schema(description = "付款业务数据")
|
||||
private BpmOAPaymentRespVO bpmOAPaymentRespVO;
|
||||
|
||||
@Schema(description = "薪资业务数据")
|
||||
private BpmOASalaryRespVO bpmOASalaryRespVO;
|
||||
|
||||
@Schema(description = "流程审批节点信息【包含人员签名地址】")
|
||||
List<BpmTaskRespVO> processTasks ;
|
||||
|
||||
|
@ -24,9 +24,6 @@ public class BpmOAReimbursementCreateReqVO {
|
||||
@Schema(description = "开户行信息")
|
||||
private String bankName;
|
||||
|
||||
@Schema(description = "付款公司")
|
||||
private Long paymentCompany;
|
||||
|
||||
@Schema(description = "报销项目明细", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "报销项目不能为空")
|
||||
private List<Reimbursement> reimbursements;
|
||||
@ -52,9 +49,6 @@ public class BpmOAReimbursementCreateReqVO {
|
||||
@Schema(description = "备用金差额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
|
||||
private BigDecimal difference ;
|
||||
|
||||
@Schema(description = "业务表编号")
|
||||
private Long objectId;
|
||||
|
||||
@Schema(description = "报销发票总数", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "报销发票总数不能为空")
|
||||
private Integer totalQuantity ;
|
||||
|
@ -27,12 +27,6 @@ public class BpmOAReimbursementRespVO extends BpmOABaseRespVO {
|
||||
@Schema(description = "收款人卡号")
|
||||
private String bankNo;
|
||||
|
||||
@Schema(description = "付款公司")
|
||||
private Long paymentCompany;
|
||||
|
||||
@Schema(description = "付款公司名称")
|
||||
private String paymentCompanyName;
|
||||
|
||||
@Schema(description = "报销项目明细", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "报销项目不能为空")
|
||||
private List<ReimbursementDTO> reimbursements;
|
||||
|
@ -38,7 +38,4 @@ public class Reimbursement {
|
||||
|
||||
@Schema(description = "采购计划编号", example = "1")
|
||||
private Long procureId;
|
||||
|
||||
@Schema(description = "业务表编号")
|
||||
private Long objectId;
|
||||
}
|
||||
|
@ -36,7 +36,4 @@ public class ReimbursementDTO {
|
||||
|
||||
@Schema(description = "采购计划编号", example = "1")
|
||||
private Long procureId;
|
||||
|
||||
@Schema(description = "业务表编号")
|
||||
private Long objectId;
|
||||
}
|
||||
|
@ -64,7 +64,4 @@ public class BpmOASalaryCreateReqVO {
|
||||
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "附件不能为空")
|
||||
private List<UploadUserFile> fileItems;
|
||||
|
||||
@Schema(description = "员工薪资id集合")
|
||||
private Set<Long> staffSalaryIds;
|
||||
}
|
||||
|
@ -66,7 +66,4 @@ public class BpmOASalaryRespVO extends BpmOABaseRespVO {
|
||||
|
||||
@Schema(description = "上传文件")
|
||||
private List<UploadUserFile> fileItems;
|
||||
|
||||
@Schema(description = "员工薪资id集合")
|
||||
private Set<Long> staffSalaryIds;
|
||||
}
|
||||
|
@ -1,44 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
@Schema(description = "管理后台 - BPM OA 工单创建 Request VO")
|
||||
@Data
|
||||
public class BpmOAWorkOrderCreateReqVO {
|
||||
|
||||
@Schema(description = "工单标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "系统登录问题")
|
||||
@NotEmpty(message = "工单标题不能为空")
|
||||
private String title;
|
||||
|
||||
@Schema(description = "工单类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "it_support")
|
||||
@NotEmpty(message = "工单类型不能为空")
|
||||
private String type;
|
||||
|
||||
@Schema(description = "优先级别", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
|
||||
@NotNull(message = "优先级别不能为空")
|
||||
private Integer level;
|
||||
|
||||
@Schema(description = "工单内容描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "用户无法登录系统,提示密码错误")
|
||||
@NotEmpty(message = "工单内容不能为空")
|
||||
private String content;
|
||||
|
||||
@Schema(description = "期望完成时间", example = "2024-12-20 18:00:00")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime expectedTime;
|
||||
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private List<UploadUserFile> fileItems;
|
||||
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
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 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 BpmOAWorkOrderPageReqVO extends PageParam {
|
||||
|
||||
@Schema(description = "工单标题", example = "系统登录问题")
|
||||
private String title;
|
||||
|
||||
@Schema(description = "工单类型", example = "it_support")
|
||||
private String type;
|
||||
|
||||
@Schema(description = "工单状态", example = "1")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "工单级别", example = "1")
|
||||
private Integer level;
|
||||
|
||||
@Schema(description = "责任人ID", example = "1")
|
||||
private Long assigneeUserId;
|
||||
|
||||
@Schema(description = "发起人ID", example = "1")
|
||||
private Long fromUserId;
|
||||
|
||||
@Schema(description = "当前用户id", example = "1")
|
||||
private Long loginUserId;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] createTime;
|
||||
|
||||
}
|
@ -1,92 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Schema(description = "管理后台 - BPM OA 工单 Response VO")
|
||||
@Data
|
||||
public class BpmOAWorkOrderRespVO {
|
||||
|
||||
@Schema(description = "工单ID", example = "1")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "工单标题", example = "系统登录问题")
|
||||
private String title;
|
||||
|
||||
@Schema(description = "工单类型", example = "it_support")
|
||||
private String type;
|
||||
|
||||
@Schema(description = "工单类型名称", example = "IT支持")
|
||||
private String typeName;
|
||||
|
||||
@Schema(description = "优先级别", example = "2")
|
||||
private Integer level;
|
||||
|
||||
@Schema(description = "优先级名称", example = "中")
|
||||
private String levelName;
|
||||
|
||||
@Schema(description = "工单内容描述", example = "用户无法登录系统,提示密码错误")
|
||||
private String content;
|
||||
|
||||
@Schema(description = "发起人ID", example = "1")
|
||||
private Long fromUserId;
|
||||
|
||||
@Schema(description = "发起人姓名", example = "张三")
|
||||
private String fromUserName;
|
||||
|
||||
@Schema(description = "发起部门ID", example = "100")
|
||||
private Long fromDeptId;
|
||||
|
||||
@Schema(description = "发起部门名称", example = "技术部")
|
||||
private String fromDeptName;
|
||||
|
||||
@Schema(description = "责任人ID", example = "2")
|
||||
private Long assigneeUserId;
|
||||
|
||||
@Schema(description = "责任人姓名", example = "李四")
|
||||
private String assigneeUserName;
|
||||
|
||||
@Schema(description = "责任部门ID", example = "101")
|
||||
private Long assigneeDeptId;
|
||||
|
||||
@Schema(description = "责任部门名称", example = "运维部")
|
||||
private String assigneeDeptName;
|
||||
|
||||
@Schema(description = "工单状态", example = "2")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "工单状态名称", example = "处理中")
|
||||
private String statusName;
|
||||
|
||||
@Schema(description = "期望完成时间", example = "2024-12-20 18:00:00")
|
||||
private LocalDateTime expectedTime;
|
||||
|
||||
@Schema(description = "实际完成时间", example = "2024-12-20 16:30:00")
|
||||
private LocalDateTime completedTime;
|
||||
|
||||
@Schema(description = "工单处理结果说明", example = "已成功修复系统登录问题")
|
||||
private String resultDescription;
|
||||
|
||||
@Schema(description = "BPM流程结果", example = "2")
|
||||
private Integer result;
|
||||
|
||||
@Schema(description = "BPM流程实例ID", example = "proc_inst_123456")
|
||||
private String processInstanceId;
|
||||
|
||||
@Schema(description = "附件文件列表")
|
||||
private List<UploadUserFile> fileItems;
|
||||
|
||||
@Schema(description = "工单跟踪记录")
|
||||
private List<BpmOAWorkOrderTrackInfo> trackInfo;
|
||||
|
||||
@Schema(description = "创建时间", example = "2024-12-19 10:00:00")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "更新时间", example = "2024-12-19 15:30:00")
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* BPM OA 工单跟踪信息
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@Schema(description = "BPM OA 工单跟踪信息")
|
||||
@Data
|
||||
public class BpmOAWorkOrderTrackInfo {
|
||||
|
||||
@Schema(description = "跟踪ID")
|
||||
private String trackId;
|
||||
|
||||
@Schema(description = "操作人ID")
|
||||
private Long operatorId;
|
||||
|
||||
@Schema(description = "操作人姓名")
|
||||
private String operatorName;
|
||||
|
||||
@Schema(description = "操作内容")
|
||||
private String content;
|
||||
|
||||
@Schema(description = "操作时间")
|
||||
private String trackTime;
|
||||
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
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.NotNull;
|
||||
|
||||
@Data
|
||||
public class BpmOAWorkOrderTrackReqDTO extends PageParam {
|
||||
|
||||
@Schema(description = "工单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
@NotNull(message = "工单ID不能为空")
|
||||
private Long workOrderId;
|
||||
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder;
|
||||
|
||||
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 BpmOAWorkOrderTrackReqVO {
|
||||
|
||||
@Schema(description = "工单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
@NotNull(message = "工单ID不能为空")
|
||||
private Long workOrderId;
|
||||
|
||||
@Schema(description = "操作内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "已开始处理该工单,预计今天下午完成")
|
||||
@NotEmpty(message = "操作内容不能为空")
|
||||
private String content;
|
||||
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder;
|
||||
|
||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
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
|
||||
public class BpmOAWorkOrderUpdateReqVO {
|
||||
|
||||
@Schema(description = "工单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
@NotNull(message = "工单ID不能为空")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "工单状态", example = "3")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "BPM流程结果", example = "3")
|
||||
private Integer result;
|
||||
|
||||
@Schema(description = "期望完成时间", example = "2024-12-20 18:00:00")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime expectedTime;
|
||||
|
||||
@Schema(description = "实际完成时间", example = "2024-12-20 16:30:00")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime completedTime;
|
||||
|
||||
@Schema(description = "工单处理结果说明", example = "已成功修复系统登录问题,用户可以正常登录")
|
||||
private String resultDescription;
|
||||
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
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;
|
||||
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
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;
|
||||
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
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;
|
||||
|
||||
}
|
@ -1,30 +1,18 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.task;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.BpmOALeaveController;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.attachment.BpmOAAttachmentReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.print.BpmProcessInstancePrintDataReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.print.BpmProcessInstancePrintDataRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.financialpayment.FinancialPaymentDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAPetitionDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAReimbursementDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOASealDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOALeaveMapper;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAPetitionMapper;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAReimbursementMapper;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOASealMapper;
|
||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
|
||||
import cn.iocoder.yudao.module.bpm.service.financialpayment.FinancialPaymentService;
|
||||
import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAAttachmentService;
|
||||
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.user.AdminUserApi;
|
||||
@ -34,19 +22,14 @@ import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.flowable.engine.runtime.ProcessInstance;
|
||||
import org.flowable.task.api.Task;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.Valid;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
@ -206,34 +189,4 @@ public class BpmProcessInstanceController {
|
||||
return success(processInstanceService.getOAReportPrintData(reqVO));
|
||||
}
|
||||
|
||||
private final Map<String, List> entityTypeMap = new ConcurrentHashMap<>();
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
// 注册支持的实体类型
|
||||
entityTypeMap.put("leave", new ArrayList<Class<?>>(Arrays.asList(BpmOALeaveDO.class, BpmOALeaveMapper.class)));
|
||||
entityTypeMap.put("petition", new ArrayList<Class<?>>(Arrays.asList(BpmOAPetitionDO.class, BpmOAPetitionMapper.class)));
|
||||
entityTypeMap.put("reimbursement", new ArrayList<Class<?>>(Arrays.asList(BpmOAReimbursementDO.class, BpmOAReimbursementMapper.class)));
|
||||
entityTypeMap.put("seal", new ArrayList<Class<?>>(Arrays.asList(BpmOASealDO.class, BpmOASealMapper.class)));
|
||||
|
||||
}
|
||||
|
||||
@Resource
|
||||
private BpmOAAttachmentService bpmOAAttachmentService;
|
||||
@PostMapping("/uploadAttachment")
|
||||
public CommonResult<?> uploadAttachment(@Valid @RequestBody BpmOAAttachmentReqVO reqVO) {
|
||||
// 解析实体类型
|
||||
List<Class<?>> entityClazzs = resolveEntityType(reqVO.getProcessType());
|
||||
// 调用通用服务
|
||||
bpmOAAttachmentService.updateAttachment(entityClazzs, reqVO.getProcessBusinessId(), reqVO.getFileItems());
|
||||
return success("附件更新成功");
|
||||
}
|
||||
|
||||
private List<Class<?>> resolveEntityType(String typeName) {
|
||||
List<Class<?>> entityClazzs = entityTypeMap.get(typeName);
|
||||
if (entityClazzs == null) {
|
||||
throw new ServiceException(500, "不支持的流程类型");
|
||||
}
|
||||
return entityClazzs;
|
||||
}
|
||||
}
|
||||
|
@ -39,6 +39,4 @@ public class BpmTaskDonePageReqVO extends PageParam {
|
||||
@Schema(description = "部门编号")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "任务状态")
|
||||
private Integer result ;
|
||||
}
|
||||
|
@ -1,7 +1,8 @@
|
||||
package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.reimbursement.Reimbursement;
|
||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
@ -63,11 +64,6 @@ public class BpmOAReimbursementDO extends BaseDO {
|
||||
*/
|
||||
private String bankName;
|
||||
|
||||
/**
|
||||
* 付款公司编号
|
||||
*/
|
||||
private Long paymentCompany;
|
||||
|
||||
// /**
|
||||
// * 报销明细数据JSON
|
||||
// */
|
||||
|
@ -68,9 +68,4 @@ public class BpmOAReimbursementItemDO extends BaseDO {
|
||||
* 采购申请编号
|
||||
*/
|
||||
private Long procureId;
|
||||
|
||||
/**
|
||||
* 业务表编号
|
||||
*/
|
||||
private Long objectId;
|
||||
}
|
||||
|
@ -68,12 +68,6 @@ public class BpmOASalaryDO extends BaseDO {
|
||||
@TableField(typeHandler = JsonLongSetTypeHandler.class)
|
||||
private Set<Long> factoryDeptId;
|
||||
|
||||
/**
|
||||
* 员工薪资id集合
|
||||
*/
|
||||
@TableField(typeHandler = JsonLongSetTypeHandler.class)
|
||||
private Set<Long> staffSalaryIds;
|
||||
|
||||
/**
|
||||
* 付款总额
|
||||
*/
|
||||
|
@ -1,49 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* BPM OA 工单分配规则 DO
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@TableName("bpm_oa_work_order_assign_rule")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class BpmOAWorkOrderAssignRuleDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 规则ID,主键
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 工单类型
|
||||
* 字典值:work_order_type
|
||||
*/
|
||||
private String workOrderType;
|
||||
|
||||
/**
|
||||
* 责任部门ID
|
||||
*/
|
||||
private Long deptId;
|
||||
|
||||
/**
|
||||
* 责任人ID
|
||||
*/
|
||||
private Long assigneeUserId;
|
||||
|
||||
/**
|
||||
* 规则描述
|
||||
*/
|
||||
private String description;
|
||||
|
||||
}
|
@ -1,125 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder.BpmOAWorkOrderTrackInfo;
|
||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
|
||||
import lombok.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* BPM OA 工单 DO
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@TableName(value = "bpm_oa_work_order", autoResultMap = true)
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class BpmOAWorkOrderDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 工单ID,主键
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 工单标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 工单类型
|
||||
* 字典值:work_order_type
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 优先级别
|
||||
* 1-低,2-中,3-高,4-紧急
|
||||
*/
|
||||
private Integer level;
|
||||
|
||||
/**
|
||||
* 工单内容描述
|
||||
*/
|
||||
private String content;
|
||||
|
||||
/**
|
||||
* 发起人ID
|
||||
*/
|
||||
private Long fromUserId;
|
||||
|
||||
/**
|
||||
* 发起人部门ID
|
||||
*/
|
||||
private Long fromDeptId;
|
||||
|
||||
/**
|
||||
* 责任人ID(分配给谁处理)
|
||||
*/
|
||||
private Long assigneeUserId;
|
||||
|
||||
/**
|
||||
* 责任部门ID
|
||||
*/
|
||||
private Long assigneeDeptId;
|
||||
|
||||
/**
|
||||
* 工单状态
|
||||
* 1-待分配,2-处理中,3-已完成,4-已取消,5-已关闭
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
/**
|
||||
* 期望完成时间
|
||||
*/
|
||||
private LocalDateTime expectedTime;
|
||||
|
||||
/**
|
||||
* 实际完成时间
|
||||
*/
|
||||
private LocalDateTime completedTime;
|
||||
|
||||
/**
|
||||
* 工单处理结果说明
|
||||
*/
|
||||
private String resultDescription;
|
||||
|
||||
/**
|
||||
* BPM流程结果
|
||||
*
|
||||
* 枚举 {@link BpmProcessInstanceResultEnum}
|
||||
*/
|
||||
private Integer result;
|
||||
|
||||
/**
|
||||
* 对应的BPM流程实例ID
|
||||
*
|
||||
* 关联 ProcessInstance 的 id 属性
|
||||
*/
|
||||
private String processInstanceId;
|
||||
|
||||
/**
|
||||
* 附件信息
|
||||
*/
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private List<UploadUserFile> fileItems;
|
||||
|
||||
/**
|
||||
* 工单跟踪记录信息
|
||||
*/
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private List<BpmOAWorkOrderTrackInfo> trackInfo;
|
||||
|
||||
}
|
@ -1,58 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler;
|
||||
import com.baomidou.mybatisplus.annotation.KeySequence;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* BPM OA 工单跟踪记录 DO
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@TableName(value = "bpm_oa_work_order_track", autoResultMap = true)
|
||||
@KeySequence("bpm_oa_work_order_track_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class BpmOAWorkOrderTrackDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 跟踪记录ID
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 工单ID
|
||||
*/
|
||||
private Long workOrderId;
|
||||
|
||||
/**
|
||||
* 操作人ID
|
||||
*/
|
||||
private Long operatorId;
|
||||
|
||||
/**
|
||||
* 操作人姓名
|
||||
*/
|
||||
private String operatorName;
|
||||
|
||||
/**
|
||||
* 操作内容/备注
|
||||
*/
|
||||
private String content;
|
||||
|
||||
/**
|
||||
* 附件文件列表,JSON格式
|
||||
*/
|
||||
@TableField(typeHandler = JsonLongSetTypeHandler.class)
|
||||
private String attachments;
|
||||
|
||||
}
|
@ -6,10 +6,8 @@ import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.evection.BpmOAEvection
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAEvectionDO;
|
||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 出差申请 Mapper
|
||||
@ -28,6 +26,4 @@ public interface BpmOAEvectionMapper extends BaseMapperX<BpmOAEvectionDO> {
|
||||
.geIfPresent(BpmOAEvectionDO::getEndTime, createReqVO.getStartTime())
|
||||
.in(BpmOAEvectionDO::getResult, Arrays.asList(BpmProcessInstanceResultEnum.PROCESS.getResult(), BpmProcessInstanceResultEnum.APPROVE.getResult())));
|
||||
}
|
||||
|
||||
List<BpmOAEvectionDO> selectEvectionList(@Param("userId") Long userId);
|
||||
}
|
||||
|
@ -26,7 +26,6 @@ public interface BpmOAPaymentMapper extends BaseMapperX<BpmOAPaymentDO> {
|
||||
.eq(BpmOAPaymentDO::getIsTickets, 1)
|
||||
.eqIfPresent(BpmOAPaymentDO::getStatus, pageReqVO.getStatus())
|
||||
.betweenIfPresent(BpmOAPaymentDO::getCreateTime, pageReqVO.getCreateTime())
|
||||
.eqIfPresent(BpmOAPaymentDO::getUserId, pageReqVO.getUserId())
|
||||
.eq(pageReqVO.getIsMy(), BpmOAPaymentDO::getUserId, userId)
|
||||
.orderByAsc(BpmOAPaymentDO::getStatus)
|
||||
.orderByDesc(BpmOAPaymentDO::getId));
|
||||
|
@ -1,55 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.dal.mysql.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
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 org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* BPM OA 工单分配规则 Mapper
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@Mapper
|
||||
public interface BpmOAWorkOrderAssignRuleMapper extends BaseMapperX<BpmOAWorkOrderAssignRuleDO> {
|
||||
|
||||
/**
|
||||
* 根据工单类型查询启用的分配规则
|
||||
*/
|
||||
default List<BpmOAWorkOrderAssignRuleDO> selectRulesByType(String workOrderType) {
|
||||
return selectList(new LambdaQueryWrapperX<BpmOAWorkOrderAssignRuleDO>()
|
||||
.eq(BpmOAWorkOrderAssignRuleDO::getWorkOrderType, workOrderType));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据部门ID查询分配规则
|
||||
*/
|
||||
default List<BpmOAWorkOrderAssignRuleDO> selectRulesByDept(Long deptId) {
|
||||
return selectList(new LambdaQueryWrapperX<BpmOAWorkOrderAssignRuleDO>()
|
||||
.eq(BpmOAWorkOrderAssignRuleDO::getDeptId, deptId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据责任人ID查询分配规则
|
||||
*/
|
||||
default List<BpmOAWorkOrderAssignRuleDO> selectRulesByAssignee(Long assigneeUserId) {
|
||||
return selectList(new LambdaQueryWrapperX<BpmOAWorkOrderAssignRuleDO>()
|
||||
.eq(BpmOAWorkOrderAssignRuleDO::getAssigneeUserId, assigneeUserId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询工单分配规则
|
||||
*/
|
||||
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()));
|
||||
}
|
||||
|
||||
}
|
@ -1,90 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.dal.mysql.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
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.BpmOAWorkOrderRespVO;
|
||||
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.Param;
|
||||
|
||||
/**
|
||||
* BPM OA 工单 Mapper
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@Mapper
|
||||
public interface BpmOAWorkOrderMapper extends BaseMapperX<BpmOAWorkOrderDO> {
|
||||
|
||||
/**
|
||||
* 工单分页查询
|
||||
*/
|
||||
default PageResult<BpmOAWorkOrderDO> selectPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO) {
|
||||
return selectPage(pageVO, new LambdaQueryWrapperX<BpmOAWorkOrderDO>()
|
||||
.likeIfPresent(BpmOAWorkOrderDO::getTitle, pageVO.getTitle())
|
||||
.eqIfPresent(BpmOAWorkOrderDO::getType, pageVO.getType())
|
||||
.eqIfPresent(BpmOAWorkOrderDO::getStatus, pageVO.getStatus())
|
||||
.eqIfPresent(BpmOAWorkOrderDO::getAssigneeUserId, pageVO.getAssigneeUserId())
|
||||
.eqIfPresent(BpmOAWorkOrderDO::getFromUserId, pageVO.getFromUserId())
|
||||
.betweenIfPresent(BpmOAWorkOrderDO::getCreateTime, pageVO.getCreateTime())
|
||||
.orderByDesc(BpmOAWorkOrderDO::getId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询我的工单分页(我发起的)
|
||||
*/
|
||||
default PageResult<BpmOAWorkOrderDO> selectMyPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO) {
|
||||
return selectPage(pageVO, new LambdaQueryWrapperX<BpmOAWorkOrderDO>()
|
||||
.eq(BpmOAWorkOrderDO::getFromUserId, loginUserId)
|
||||
.likeIfPresent(BpmOAWorkOrderDO::getTitle, pageVO.getTitle())
|
||||
.eqIfPresent(BpmOAWorkOrderDO::getType, pageVO.getType())
|
||||
.eqIfPresent(BpmOAWorkOrderDO::getStatus, pageVO.getStatus())
|
||||
.betweenIfPresent(BpmOAWorkOrderDO::getCreateTime, pageVO.getCreateTime())
|
||||
.orderByDesc(BpmOAWorkOrderDO::getId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询我负责的工单分页(分配给我的)
|
||||
*/
|
||||
default PageResult<BpmOAWorkOrderDO> selectAssignedPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO) {
|
||||
return selectPage(pageVO, new LambdaQueryWrapperX<BpmOAWorkOrderDO>()
|
||||
.eq(BpmOAWorkOrderDO::getAssigneeUserId, loginUserId)
|
||||
.likeIfPresent(BpmOAWorkOrderDO::getTitle, pageVO.getTitle())
|
||||
.eqIfPresent(BpmOAWorkOrderDO::getType, pageVO.getType())
|
||||
.eqIfPresent(BpmOAWorkOrderDO::getStatus, pageVO.getStatus())
|
||||
.betweenIfPresent(BpmOAWorkOrderDO::getCreateTime, pageVO.getCreateTime())
|
||||
.orderByDesc(BpmOAWorkOrderDO::getId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询我负责工单的数量
|
||||
*/
|
||||
default Long selectMyAssignedCount(Long userId) {
|
||||
return selectCount(new LambdaQueryWrapperX<BpmOAWorkOrderDO>()
|
||||
.eq(BpmOAWorkOrderDO::getAssigneeUserId, userId)
|
||||
.in(BpmOAWorkOrderDO::getStatus, 1, 2)); // 待分配和处理中
|
||||
}
|
||||
|
||||
/**
|
||||
* 工单分页查询(带关联信息)- XML实现
|
||||
*/
|
||||
IPage<BpmOAWorkOrderRespVO> selectWorkOrderPage(@Param("page") Page page,
|
||||
@Param("req") BpmOAWorkOrderPageReqVO req);
|
||||
|
||||
/**
|
||||
* 我发起的工单分页查询(带关联信息)- XML实现
|
||||
*/
|
||||
PageResult<BpmOAWorkOrderRespVO> selectMyWorkOrderPage(@Param("page") Page page,
|
||||
@Param("req") BpmOAWorkOrderPageReqVO req);
|
||||
|
||||
/**
|
||||
* 分配给我的工单分页查询(带关联信息)- XML实现
|
||||
*/
|
||||
IPage<BpmOAWorkOrderRespVO> selectAssignedWorkOrderPage(@Param("page") Page page,
|
||||
@Param("req") BpmOAWorkOrderPageReqVO req);
|
||||
|
||||
BpmOAWorkOrderDO selectByProcessInstanceId(@Param("processInstanceId") String processInstanceId);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
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.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 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.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* BPM OA 工单跟踪记录 Mapper
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@Mapper
|
||||
public interface BpmOAWorkOrderTrackMapper extends BaseMapperX<BpmOAWorkOrderTrackDO> {
|
||||
|
||||
/**
|
||||
* 根据工单ID查询跟踪记录列表
|
||||
*/
|
||||
default List<BpmOAWorkOrderTrackDO> selectByWorkOrderId(Long workOrderId) {
|
||||
return selectList(new LambdaQueryWrapperX<BpmOAWorkOrderTrackDO>()
|
||||
.eq(BpmOAWorkOrderTrackDO::getWorkOrderId, workOrderId)
|
||||
.orderByAsc(BpmOAWorkOrderTrackDO::getCreateTime));
|
||||
}
|
||||
|
||||
}
|
@ -93,7 +93,7 @@ public interface BpmTaskExtMapper extends BaseMapperX<BpmTaskExtDO> {
|
||||
queryWrapperX.selectAs(BpmProcessInstanceExtDO::getStartUserId, BpmTaskDonePageRespVO::getStartUserId);
|
||||
queryWrapperX.selectAs(BpmProcessInstanceExtDO::getProcessDefinitionId, BpmTaskDonePageRespVO::getProcessDefinitionId);
|
||||
queryWrapperX.selectAs(BpmProcessInstanceExtDO::getCcids, BpmTaskDonePageRespVO::getCcUserIds);
|
||||
queryWrapperX.selectAs(BpmProcessInstanceExtDO::getStatus, BpmTaskDonePageRespVO::getStatus ) ;
|
||||
queryWrapperX.selectAs(BpmProcessInstanceExtDO::getResult, BpmTaskDonePageRespVO::getStatus ) ;
|
||||
|
||||
queryWrapperX.innerJoin(BpmProcessInstanceExtDO.class, on -> on
|
||||
.eq(BpmTaskExtDO::getProcessInstanceId, BpmProcessInstanceExtDO::getProcessInstanceId)
|
||||
@ -102,10 +102,7 @@ public interface BpmTaskExtMapper extends BaseMapperX<BpmTaskExtDO> {
|
||||
queryWrapperX.likeRight(BpmProcessInstanceExtDO::getProcessDefinitionId, "oa_");
|
||||
queryWrapperX.eq(BpmTaskExtDO::getAssigneeUserId, userId);
|
||||
queryWrapperX.ne(BpmTaskExtDO::getReason, BpmConstants.AUTO_APPRAVAL);
|
||||
// queryWrapperX.ne(BpmTaskExtDO::getResult,4); //还未开始审批,发起人主动撤销的流程,不显示
|
||||
if (pageVO.getResult() != null) {
|
||||
queryWrapperX.eq(BpmTaskExtDO::getResult,pageVO.getResult());
|
||||
}
|
||||
queryWrapperX.ne(BpmTaskExtDO::getResult,4); //还未开始审批,发起人主动撤销的流程,不显示
|
||||
queryWrapperX.betweenIfPresent(BpmTaskExtDO::getCreateTime, pageVO.getCreateTime());
|
||||
queryWrapperX.orderByDesc(BpmTaskExtDO::getEndTime);
|
||||
|
||||
|
@ -1,56 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.enums.oa;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 工单优先级枚举
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum WorkOrderLevelEnum {
|
||||
|
||||
LOW(1, "低"),
|
||||
MEDIUM(2, "中"),
|
||||
HIGH(3, "高"),
|
||||
URGENT(4, "紧急");
|
||||
|
||||
/**
|
||||
* 级别值
|
||||
*/
|
||||
private final Integer level;
|
||||
|
||||
/**
|
||||
* 级别名称
|
||||
*/
|
||||
private final String name;
|
||||
|
||||
/**
|
||||
* 根据级别值获取枚举
|
||||
*/
|
||||
public static WorkOrderLevelEnum getByLevel(Integer level) {
|
||||
for (WorkOrderLevelEnum levelEnum : values()) {
|
||||
if (levelEnum.getLevel().equals(level)) {
|
||||
return levelEnum;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为紧急级别
|
||||
*/
|
||||
public static boolean isUrgent(Integer level) {
|
||||
return URGENT.getLevel().equals(level);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为高优先级(高或紧急)
|
||||
*/
|
||||
public static boolean isHighPriority(Integer level) {
|
||||
return HIGH.getLevel().equals(level) || URGENT.getLevel().equals(level);
|
||||
}
|
||||
|
||||
}
|
@ -1,64 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.enums.oa;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 工单状态枚举
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum WorkOrderStatusEnum {
|
||||
|
||||
PENDING_ASSIGN(1, "待分配"),
|
||||
PROCESSING(2, "处理中"),
|
||||
COMPLETED(3, "已完成"),
|
||||
CANCELLED(4, "已取消"),
|
||||
CLOSED(5, "已关闭");
|
||||
|
||||
/**
|
||||
* 状态值
|
||||
*/
|
||||
private final Integer status;
|
||||
|
||||
/**
|
||||
* 状态名称
|
||||
*/
|
||||
private final String name;
|
||||
|
||||
/**
|
||||
* 根据状态值获取枚举
|
||||
*/
|
||||
public static WorkOrderStatusEnum valueOf(Integer status) {
|
||||
for (WorkOrderStatusEnum statusEnum : values()) {
|
||||
if (statusEnum.getStatus().equals(status)) {
|
||||
return statusEnum;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为处理中状态
|
||||
*/
|
||||
public static boolean isProcessing(Integer status) {
|
||||
return PROCESSING.getStatus().equals(status);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为已完成状态
|
||||
*/
|
||||
public static boolean isCompleted(Integer status) {
|
||||
return COMPLETED.getStatus().equals(status);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为待分配状态
|
||||
*/
|
||||
public static boolean isPendingAssign(Integer status) {
|
||||
return PENDING_ASSIGN.getStatus().equals(status);
|
||||
}
|
||||
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.enums.oa;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 工单跟踪记录操作类型枚举
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum WorkOrderTrackTypeEnum {
|
||||
|
||||
CREATE("CREATE", "创建工单"),
|
||||
ASSIGN("ASSIGN", "分配工单"),
|
||||
PROCESS("PROCESS", "处理中"),
|
||||
COMPLETE("COMPLETE", "完成工单"),
|
||||
CANCEL("CANCEL", "取消工单"),
|
||||
COMMENT("COMMENT", "添加备注"),
|
||||
TRANSFER("TRANSFER", "转派工单"),
|
||||
REOPEN("REOPEN", "重新打开"),
|
||||
CLOSE("CLOSE", "关闭工单");
|
||||
|
||||
/**
|
||||
* 操作类型
|
||||
*/
|
||||
private final String type;
|
||||
|
||||
/**
|
||||
* 操作描述
|
||||
*/
|
||||
private final String description;
|
||||
|
||||
/**
|
||||
* 根据类型获取枚举
|
||||
*/
|
||||
public static WorkOrderTrackTypeEnum getByType(String type) {
|
||||
for (WorkOrderTrackTypeEnum trackType : values()) {
|
||||
if (trackType.getType().equals(type)) {
|
||||
return trackType;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.enums.oa;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 工单类型枚举
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum WorkOrderTypeEnum {
|
||||
|
||||
IT_SUPPORT("it_support", "IT支持"),
|
||||
EQUIPMENT_REPAIR("equipment_repair", "设备维修"),
|
||||
SYSTEM_ISSUE("system_issue", "系统问题"),
|
||||
PERMISSION_REQUEST("permission_request", "权限申请"),
|
||||
OTHER("other", "其他");
|
||||
|
||||
/**
|
||||
* 类型值
|
||||
*/
|
||||
private final String type;
|
||||
|
||||
/**
|
||||
* 类型名称
|
||||
*/
|
||||
private final String name;
|
||||
|
||||
/**
|
||||
* 根据类型值获取枚举
|
||||
*/
|
||||
public static WorkOrderTypeEnum getByType(String type) {
|
||||
for (WorkOrderTypeEnum typeEnum : values()) {
|
||||
if (typeEnum.getType().equals(type)) {
|
||||
return typeEnum;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
@ -1,61 +0,0 @@
|
||||
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;
|
||||
}
|
||||
}
|
@ -19,7 +19,6 @@ import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@ -94,14 +93,9 @@ public class BpmTaskFactoryLeaderScript extends BpmTaskAssignLeaderAbstractScrip
|
||||
if (salaryDO != null) {
|
||||
|
||||
// 获取申请部门信息
|
||||
DeptRespDTO deptRespDTO = null;
|
||||
if (salaryDO.getCompanyDeptId() != null) {
|
||||
deptRespDTO = deptApi.getDept(salaryDO.getCompanyDeptId()).getCheckedData();
|
||||
}else if (CollUtil.isNotEmpty(salaryDO.getFactoryDeptId())) {
|
||||
deptRespDTO = deptApi.getDeptByFactoryId(new ArrayList<>(salaryDO.getFactoryDeptId()).get(0)).getCheckedData();
|
||||
}
|
||||
DeptRespDTO deptRespDTO = deptApi.getDept(salaryDO.getCompanyDeptId()).getCheckedData();
|
||||
// 判断是否是属于工厂部门
|
||||
if (deptRespDTO != null) {
|
||||
if (deptRespDTO != null && deptRespDTO.getFactoryId() != null) {
|
||||
dept = deptApi.getDept(deptRespDTO.getParentId()).getCheckedData();
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,6 @@ import cn.iocoder.yudao.module.product.api.storeproduct.StoreProductApi;
|
||||
import cn.iocoder.yudao.module.product.api.storeproductattrvalue.StoreProductAttrValueApi;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.FactoryInfoApi;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.staff.StaffApi;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.staffSalary.StaffSalaryApi;
|
||||
import cn.iocoder.yudao.module.system.api.assetreceive.AssetReceiveApi;
|
||||
import cn.iocoder.yudao.module.system.api.assets.AssetsApi;
|
||||
import cn.iocoder.yudao.module.system.api.assets.AssetsTypeApi;
|
||||
@ -46,8 +45,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
SubscribeMessageSendApi.class, SocialClientApi.class, UsersExtApi.class, AttendanceApi.class, BankApi.class, ConfigApi.class, PositionApi.class, SupplierApi.class, AssetsApi.class,
|
||||
AssetsTypeApi.class, AssetReceiveApi.class, AttendanceApi.class, AttendanceGroupApi.class, WorkOvertimeApi.class, HolidayApi.class,
|
||||
RentalOrderApi.class, RentalDepositRecordApi.class, ProjectApi.class, RentalItemsRecordApi.class,AdminOauthUserOtherInfoApi.class, StoreProductAttrValueApi.class, StoreProductApi.class,
|
||||
ContractApi.class, BusinessApi.class, CrmCustomerApi.class, StaffApi.class, LoanApi.class, FactoryInfoApi.class, UserLiveTreeApi.class, SalesPerformanceSettlementApi.class,
|
||||
StaffSalaryApi.class
|
||||
ContractApi.class, BusinessApi.class, CrmCustomerApi.class, StaffApi.class, LoanApi.class, FactoryInfoApi.class, UserLiveTreeApi.class, SalesPerformanceSettlementApi.class
|
||||
})
|
||||
public class RpcConfiguration {
|
||||
}
|
||||
|
@ -1,77 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.financialpayment;
|
||||
|
||||
import com.alibaba.excel.metadata.Head;
|
||||
import com.alibaba.excel.metadata.data.WriteCellData;
|
||||
import com.alibaba.excel.write.handler.CellWriteHandler;
|
||||
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
|
||||
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
|
||||
import org.apache.poi.ss.usermodel.*;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class CustomCellStyleHandler implements CellWriteHandler {
|
||||
|
||||
private final Map<String, CellStyle> styleCache = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public void afterCellDispose(
|
||||
WriteSheetHolder writeSheetHolder,
|
||||
WriteTableHolder writeTableHolder,
|
||||
List<WriteCellData<?>> cellDataList,
|
||||
Cell cell,
|
||||
Head head,
|
||||
Integer relativeRowIndex,
|
||||
Boolean isHead) {
|
||||
|
||||
Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
|
||||
writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), 7120);
|
||||
|
||||
// 获取或创建样式
|
||||
CellStyle cellStyle = getOrCreateCellStyle(workbook, isHead, relativeRowIndex, cellDataList);
|
||||
|
||||
cell.setCellStyle(cellStyle);
|
||||
}
|
||||
|
||||
private CellStyle getOrCreateCellStyle(Workbook workbook, Boolean isHead, Integer relativeRowIndex, List<WriteCellData<?>> cellDataList) {
|
||||
String key = generateStyleKey(isHead, relativeRowIndex);
|
||||
if (styleCache.containsKey(key)) {
|
||||
return styleCache.get(key);
|
||||
}
|
||||
|
||||
CellStyle cellStyle = workbook.createCellStyle();
|
||||
cellStyle.setAlignment(HorizontalAlignment.CENTER);
|
||||
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
||||
|
||||
// if (isHead != null && isHead) {
|
||||
// setHeaderStyle(workbook, cellStyle, relativeRowIndex, cellDataList);
|
||||
// }
|
||||
|
||||
styleCache.put(key, cellStyle);
|
||||
return cellStyle;
|
||||
}
|
||||
|
||||
private void setHeaderStyle(Workbook workbook, CellStyle cellStyle, Integer relativeRowIndex, List<WriteCellData<?>> cellDataList) {
|
||||
if (relativeRowIndex == 0 || relativeRowIndex == 1) {
|
||||
applyStyle(workbook, cellStyle, IndexedColors.TURQUOISE.getIndex(), (short) 20, cellDataList);
|
||||
} else if (relativeRowIndex == 2 || relativeRowIndex == 3) {
|
||||
applyStyle(workbook, cellStyle, IndexedColors.LIGHT_YELLOW.getIndex(), (short) 20, cellDataList);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void applyStyle(Workbook workbook, CellStyle cellStyle, short backgroundColor, short fontSize, List<WriteCellData<?>> cellDataList) {
|
||||
cellStyle.setFillForegroundColor(backgroundColor);
|
||||
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
||||
|
||||
Font font = workbook.createFont();
|
||||
font.setFontHeightInPoints(fontSize);
|
||||
cellStyle.setFont(font);
|
||||
cellDataList.get(0).setWriteCellStyle(null);
|
||||
}
|
||||
|
||||
private String generateStyleKey(Boolean isHead, Integer relativeRowIndex) {
|
||||
return "isHead:" + isHead + ",rowIndex:" + relativeRowIndex;
|
||||
}
|
||||
}
|
@ -6,7 +6,6 @@ import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.Financia
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.FinancialPaymentSaveVO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.financialpayment.FinancialPaymentDO;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
@ -103,11 +102,4 @@ public interface FinancialPaymentService {
|
||||
* @return 统计信息
|
||||
*/
|
||||
FinancialPaymentDO getPaymentTotal(FinancialPaymentPageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 导出支付信息
|
||||
* @param response 响应
|
||||
* @param pageReqVO 查询条件
|
||||
*/
|
||||
void exportList(HttpServletResponse response, FinancialPaymentPageReqVO pageReqVO);
|
||||
}
|
||||
|
@ -25,6 +25,7 @@ import cn.iocoder.yudao.module.bpm.dal.mysql.oa.*;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper;
|
||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAExpensesService;
|
||||
import cn.iocoder.yudao.module.system.api.auth.AdminOauthUserOtherInfoApi;
|
||||
import cn.iocoder.yudao.module.system.api.auth.dto.AdminOauthUserOtherInfoApiDTO;
|
||||
import cn.iocoder.yudao.module.system.api.auth.vo.AdminOauthUserOtherInfoApiVO;
|
||||
@ -32,8 +33,6 @@ import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||
import cn.iocoder.yudao.module.system.api.loan.LoanApi;
|
||||
import cn.iocoder.yudao.module.system.api.loan.dto.LoanDTO;
|
||||
import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi;
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.alibaba.excel.support.ExcelTypeEnum;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -41,13 +40,10 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.math.BigDecimal;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
|
||||
|
||||
@ -290,121 +286,4 @@ public class FinancialPaymentServiceImpl implements FinancialPaymentService {
|
||||
pageReqVO.setReceiveUserId(getLoginUserId());
|
||||
return financialPaymentMapper.selectPaymentTotal(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void exportList(HttpServletResponse response, FinancialPaymentPageReqVO pageReqVO) {
|
||||
|
||||
try {
|
||||
if (pageReqVO.getStatus() == null) {
|
||||
pageReqVO.setStatus(0);
|
||||
}
|
||||
|
||||
// 获取支付信息数据
|
||||
List<FinancialPaymentDO> list = this.getFinancialPaymentPage(pageReqVO).getList();
|
||||
list.removeIf(item -> item.getCompanyId() == null);
|
||||
|
||||
// 根据付款公司进行分组
|
||||
Map<Long, List<FinancialPaymentDO>> companyIdMap = list.stream().collect(Collectors.groupingBy(FinancialPaymentDO::getCompanyId));
|
||||
|
||||
List<List<String>> data = new ArrayList<>();
|
||||
for (Map.Entry<Long, List<FinancialPaymentDO>> entry : companyIdMap.entrySet()) {
|
||||
|
||||
// 设置表头
|
||||
data.add(Arrays.asList(entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(),
|
||||
entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName()));
|
||||
data.add(this.setTitle());
|
||||
|
||||
// 提取所有公账 支付信息
|
||||
List<FinancialPaymentDO> publicAccount = entry.getValue().stream()
|
||||
.filter(item -> item.getType() != 9)
|
||||
.collect(Collectors.toList());
|
||||
// 提取所有私账 支付信息
|
||||
List<FinancialPaymentDO> privateAccount = entry.getValue().stream()
|
||||
.filter(item -> item.getType() == 9)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 遍历公账信息
|
||||
for (FinancialPaymentDO financialPaymentDO : publicAccount) {
|
||||
List<String> row = new ArrayList<>();
|
||||
// 设置姓名
|
||||
row.add(financialPaymentDO.getNickname());
|
||||
// 设置报销部门
|
||||
row.add(financialPaymentDO.getDeptName());
|
||||
// 添加事项
|
||||
row.add(financialPaymentDO.getReason());
|
||||
// 添加金额
|
||||
row.add(financialPaymentDO.getAmountPayable().toString());
|
||||
// 添加卡号
|
||||
row.add(financialPaymentDO.getRecipientName());
|
||||
// 添加公账/私账
|
||||
row.add("公账");
|
||||
// 添加备注
|
||||
row.add(financialPaymentDO.getNickname() + "报销");
|
||||
|
||||
data.add(row);
|
||||
}
|
||||
|
||||
if (CollUtil.isNotEmpty(publicAccount)) {
|
||||
// 添加公账合计数据
|
||||
BigDecimal publicAccountTotal = publicAccount.stream().map(FinancialPaymentDO::getAmountPayable).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
data.add(Arrays.asList("公账总计", "公账总计", "公账总计", publicAccountTotal.toString(), "", "公账"));
|
||||
}
|
||||
|
||||
// 遍历私账信息
|
||||
for (FinancialPaymentDO financialPaymentDO : privateAccount) {
|
||||
List<String> row = new ArrayList<>();
|
||||
// 设置姓名
|
||||
row.add(financialPaymentDO.getNickname());
|
||||
// 设置报销部门
|
||||
row.add(financialPaymentDO.getDeptName());
|
||||
// 添加事项
|
||||
row.add(financialPaymentDO.getReason());
|
||||
// 添加金额
|
||||
row.add(financialPaymentDO.getAmountPayable().toString());
|
||||
// 添加卡号
|
||||
row.add(financialPaymentDO.getRecipientName());
|
||||
// 添加公账/私账
|
||||
row.add("私账");
|
||||
// 添加备注
|
||||
row.add(financialPaymentDO.getNickname() + "报销");
|
||||
|
||||
data.add(row);
|
||||
}
|
||||
|
||||
if (CollUtil.isNotEmpty(privateAccount)) {
|
||||
// 添加私账合计数据
|
||||
BigDecimal privateAccountTotal = privateAccount.stream().map(FinancialPaymentDO::getAmountPayable).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
data.add(Arrays.asList("私账总计", "私账总计", "私账总计", privateAccountTotal.toString(), "", "私账"));
|
||||
}
|
||||
}
|
||||
|
||||
EasyExcel.write(response.getOutputStream())
|
||||
.autoCloseStream(false)
|
||||
.excelType(ExcelTypeEnum.XLSX)
|
||||
.sheet("账目明细")
|
||||
.registerWriteHandler(new CustomCellStyleHandler())
|
||||
.registerWriteHandler(new MergeSameRowCellsHandler())
|
||||
.doWrite(data);
|
||||
|
||||
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("账目", StandardCharsets.UTF_8.name()));
|
||||
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
|
||||
|
||||
} catch (IOException e) {
|
||||
log.error("[exportList][导出失败]", e);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private List<String> setTitle() {
|
||||
List<String> titleRow = new ArrayList<>();
|
||||
titleRow.add("姓名");
|
||||
titleRow.add("报销部门");
|
||||
titleRow.add("事项");
|
||||
titleRow.add("金额");
|
||||
titleRow.add("卡号");
|
||||
titleRow.add("公账/私账");
|
||||
titleRow.add("备注");
|
||||
|
||||
return titleRow;
|
||||
}
|
||||
}
|
||||
|
@ -1,130 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.financialpayment;
|
||||
|
||||
import com.alibaba.excel.metadata.Head;
|
||||
import com.alibaba.excel.write.handler.SheetWriteHandler;
|
||||
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
|
||||
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
|
||||
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.util.CellRangeAddress;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class MergeSameRowCellsHandler extends AbstractMergeStrategy implements SheetWriteHandler {
|
||||
|
||||
// 记录每行需要合并的区域:<行索引, [起始列, 结束列]列表>
|
||||
private final Map<Integer, List<int[]>> mergeMap = new HashMap<>();
|
||||
|
||||
@Override
|
||||
protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
|
||||
// 当前单元格坐标
|
||||
int rowIdx = cell.getRowIndex();
|
||||
int colIdx = cell.getColumnIndex();
|
||||
|
||||
// 获取当前单元格值(按需处理空值)
|
||||
Object cellValue = getCellValue(cell);
|
||||
// 跳过空值单元格
|
||||
if (cellValue == null || "".equals(cellValue)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 初始化该行的合并区域记录
|
||||
mergeMap.computeIfAbsent(rowIdx, k -> new ArrayList<>());
|
||||
|
||||
List<int[]> ranges = mergeMap.get(rowIdx);
|
||||
if (ranges.isEmpty()) {
|
||||
// 第一个单元格直接作为合并起点
|
||||
ranges.add(new int[]{colIdx, colIdx});
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取最后一个合并区域
|
||||
int[] lastRange = ranges.get(ranges.size() - 1);
|
||||
int lastColEnd = lastRange[1];
|
||||
|
||||
// 如果当前单元格与前一列值相同且连续,则扩展合并区域
|
||||
if (colIdx == lastColEnd + 1 && isSameValue(cell, sheet, rowIdx, lastColEnd)) {
|
||||
lastRange[1] = colIdx; // 扩展区域右边界
|
||||
} else {
|
||||
// 创建新合并区域
|
||||
ranges.add(new int[]{colIdx, colIdx});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
|
||||
// 调用父类的 merge 方法
|
||||
this.merge(writeSheetHolder.getSheet(), cell, head, relativeRowIndex);
|
||||
|
||||
Sheet sheet = writeSheetHolder.getSheet();
|
||||
|
||||
// 应用所有合并区域
|
||||
for (Map.Entry<Integer, List<int[]>> entry : mergeMap.entrySet()) {
|
||||
int rowIdx = entry.getKey();
|
||||
for (int[] range : entry.getValue()) {
|
||||
if (range[0] < range[1]) { // 需要合并的列数>1
|
||||
|
||||
CellRangeAddress newRegion = new CellRangeAddress(rowIdx, rowIdx, range[0], range[1]);
|
||||
|
||||
// 获取当前 sheet 所有已存在的合并区域
|
||||
List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
|
||||
|
||||
// 查找所有与新区域重叠的旧区域并记录其索引
|
||||
List<Integer> toRemoveIndices = new ArrayList<>();
|
||||
for (int i = 0; i < mergedRegions.size(); i++) {
|
||||
CellRangeAddress existingRegion = mergedRegions.get(i);
|
||||
if (isOverlapping(existingRegion, newRegion)) {
|
||||
toRemoveIndices.add(i);
|
||||
}
|
||||
}
|
||||
|
||||
// 先移除冲突的旧合并区域(注意:索引是动态变化的,应倒序删除)
|
||||
for (int i = toRemoveIndices.size() - 1; i >= 0; i--) {
|
||||
int indexToRemove = toRemoveIndices.get(i);
|
||||
sheet.removeMergedRegion(indexToRemove);
|
||||
}
|
||||
|
||||
// 添加新的合并区域
|
||||
sheet.addMergedRegion(newRegion);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 判断两个合并区域是否有重叠
|
||||
private boolean isOverlapping(CellRangeAddress region1, CellRangeAddress region2) {
|
||||
return region1.getFirstRow() <= region2.getLastRow() &&
|
||||
region1.getLastRow() >= region2.getFirstRow() &&
|
||||
region1.getFirstColumn() <= region2.getLastColumn() &&
|
||||
region1.getLastColumn() >= region2.getFirstColumn();
|
||||
}
|
||||
|
||||
// 比较两个单元格的值是否相同(处理空值)
|
||||
private boolean isSameValue(Cell currentCell, Sheet sheet, int row, int col) {
|
||||
Cell prevCell = sheet.getRow(row).getCell(col);
|
||||
Object val1 = getCellValue(currentCell);
|
||||
Object val2 = getCellValue(prevCell);
|
||||
|
||||
if (val1 == null) {
|
||||
return val2 == null;
|
||||
}
|
||||
return val1.equals(val2);
|
||||
}
|
||||
|
||||
// 安全获取单元格值
|
||||
private Object getCellValue(Cell cell) {
|
||||
if (cell == null) {
|
||||
return null;
|
||||
}
|
||||
switch (cell.getCellType()) {
|
||||
case STRING: return cell.getStringCellValue();
|
||||
case NUMERIC: return cell.getNumericCellValue();
|
||||
case BOOLEAN: return cell.getBooleanCellValue();
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface BpmOAAttachmentService {
|
||||
|
||||
/**
|
||||
* 更新业务实体的附件信息
|
||||
* @param entityClazzs 业务实体
|
||||
* @param entityId 业务ID
|
||||
* @param fileItems 附件数据
|
||||
*/
|
||||
void updateAttachment(List<Class<?>> entityClazzs, Long entityId, List<UploadUserFile> fileItems);
|
||||
|
||||
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.oa;
|
||||
|
||||
import cn.hutool.extra.spring.SpringUtil;
|
||||
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import liquibase.pro.packaged.T;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.common.engine.impl.persistence.entity.EntityManager;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
@Validated
|
||||
@Slf4j
|
||||
public class BpmOAAttachmentServiceImpl implements BpmOAAttachmentService {
|
||||
|
||||
/**
|
||||
* 更新业务实体的附件信息
|
||||
* @param entityClazzs 业务实体
|
||||
* @param entityId 业务ID
|
||||
* @param fileItems 附件数据
|
||||
*/
|
||||
public void updateAttachment(List<Class<?>> entityClazzs, Long entityId, List<UploadUserFile> fileItems) {
|
||||
try {
|
||||
// 1. 获取实体, 赋值实体类
|
||||
Class doClass = entityClazzs.get(0) ;
|
||||
Object entity = doClass.getDeclaredConstructor().newInstance();
|
||||
Method setIdMethod = doClass.getMethod("setId", Long.class) ;
|
||||
setIdMethod.invoke(entity, entityId);
|
||||
Method setFileItems = doClass.getMethod("setFileItems", List.class) ;
|
||||
setFileItems.invoke(entity, fileItems);
|
||||
//获取MyBatist的操作类实体
|
||||
Class mapperClass = entityClazzs.get(1) ;
|
||||
BaseMapper mapper = (BaseMapper) SpringUtil.getBean(mapperClass);
|
||||
mapper.updateById(entity);
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage());
|
||||
throw new ServiceException(500, "系统异常,请联系管理员");
|
||||
}
|
||||
}
|
||||
}
|
@ -252,7 +252,7 @@ public class BpmOACashServiceImpl extends BpmOABaseService implements BpmOACashS
|
||||
.setAmountPayable(isImprest == 1 ? amount.abs() : cash.getTotalMoney())
|
||||
.setBeginTime(processInstance.getCreateTime())
|
||||
.setEndTime(processInstance.getEndTime())
|
||||
.setRecipientName(bankRespDTO != null ? bankRespDTO.getNickname() + "," + bankRespDTO.getBankNo() + "," + bankRespDTO.getBankName() : "")
|
||||
.setRecipientName(bankRespDTO.getNickname())
|
||||
.setCompanyId(deptRespDTO != null ? deptRespDTO.getId() : null)
|
||||
);
|
||||
}
|
||||
|
@ -54,10 +54,4 @@ public interface BpmOAEvectionService {
|
||||
* @return 出差申请列表
|
||||
*/
|
||||
List<BpmOAEvectionDO> getEvectionListByEndTime(LocalDate date);
|
||||
|
||||
/**
|
||||
* 获得我的出差申请列表
|
||||
* @return 出差申请列表
|
||||
*/
|
||||
List<BpmOAEvectionDO> getEvectionList();
|
||||
}
|
||||
|
@ -20,7 +20,6 @@ import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_EVECTION_IS_EXISTS;
|
||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_EVECTION_NOT_EXISTS;
|
||||
|
||||
@ -151,10 +150,4 @@ public class BpmOAEvectionServiceImpl extends BpmOABaseService implements BpmOAE
|
||||
.eq(BpmOAEvectionDO::getResult, BpmProcessInstanceResultEnum.APPROVE.getResult())
|
||||
.likeIfPresent(BpmOAEvectionDO::getEndTime, date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmOAEvectionDO> getEvectionList() {
|
||||
|
||||
return evectionMapper.selectEvectionList(getLoginUserId());
|
||||
}
|
||||
}
|
||||
|
@ -30,6 +30,7 @@ import cn.iocoder.yudao.module.system.api.loan.dto.LoanDTO;
|
||||
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.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.flowable.engine.runtime.ProcessInstance;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
@ -288,7 +289,7 @@ public class BpmOAExpensesServiceImpl extends BpmOABaseService implements BpmOAE
|
||||
.setProcessInstanceName(processInstance.getName())
|
||||
.setBeginTime(processInstance.getCreateTime())
|
||||
.setEndTime(processInstance.getEndTime())
|
||||
.setRecipientName(bankRespDTO != null ? bankRespDTO.getNickname() + "," + bankRespDTO.getBankNo() + "," + bankRespDTO.getBankName() : "")
|
||||
.setRecipientName(bankRespDTO != null ? bankRespDTO.getNickname() : "")
|
||||
.setCompanyFactoryId(dto.getId())
|
||||
);
|
||||
}
|
||||
|
@ -143,7 +143,7 @@ public class BpmOAImprestServiceImpl extends BpmOABaseService implements BpmOAIm
|
||||
.setProcessInstanceName(processInstance.getName())
|
||||
.setBeginTime(processInstance.getCreateTime())
|
||||
.setEndTime(processInstance.getEndTime())
|
||||
.setRecipientName(bankRespDTO != null ? bankRespDTO.getNickname() + "," + bankRespDTO.getBankNo() + "," + bankRespDTO.getBankName() : "")
|
||||
.setRecipientName(bankRespDTO.getNickname())
|
||||
.setCompanyId(deptRespDTO != null ? deptRespDTO.getId() : null)
|
||||
);
|
||||
}
|
||||
|
@ -20,8 +20,6 @@ import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import cn.iocoder.yudao.module.bpm.service.financialpayment.FinancialPaymentService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmHistoryProcessInstanceService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.FactoryInfoApi;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.dto.FactoryInfoDTO;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.staff.StaffApi;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.staff.dto.StaffDTO;
|
||||
import cn.iocoder.yudao.module.system.api.bank.BankApi;
|
||||
@ -79,9 +77,6 @@ public class BpmOALoanServiceImpl extends BpmOABaseService implements BpmOALoanS
|
||||
@Resource
|
||||
private BankApi bankApi;
|
||||
|
||||
@Resource
|
||||
private FactoryInfoApi factoryInfoApi;
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@ -102,19 +97,8 @@ public class BpmOALoanServiceImpl extends BpmOABaseService implements BpmOALoanS
|
||||
.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
|
||||
loanMapper.insert(loan);
|
||||
|
||||
|
||||
|
||||
// 发起 BPM 流程
|
||||
Map<String, Object> processInstanceVariables = new HashMap<>();
|
||||
// 提交是费用借支时
|
||||
if (vo.getLoanType() == 2) {
|
||||
|
||||
// 获取借支人所属厂区信息
|
||||
FactoryInfoDTO factoryInfoDTO = factoryInfoApi.getFactoryInfo(loan.getFactoryId()).getCheckedData();
|
||||
processInstanceVariables.put("factoryType", factoryInfoDTO.getType());
|
||||
}
|
||||
|
||||
processInstanceVariables.put("loanType", loan.getLoanType());
|
||||
String processInstanceId = processInstanceService.createProcessInstance(userId,
|
||||
new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
|
||||
.setVariables(processInstanceVariables).setBusinessKey(String.valueOf(loan.getId())));
|
||||
@ -174,7 +158,7 @@ public class BpmOALoanServiceImpl extends BpmOABaseService implements BpmOALoanS
|
||||
.setProcessInstanceName(processInstance.getName())
|
||||
.setBeginTime(processInstance.getCreateTime())
|
||||
.setEndTime(processInstance.getEndTime())
|
||||
.setRecipientName(bankRespDTO != null ? bankRespDTO.getNickname() + "," + bankRespDTO.getBankNo() + "," + bankRespDTO.getBankName() : "")
|
||||
.setRecipientName(bankRespDTO.getNickname())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -147,7 +147,7 @@ public class BpmOAPaymentServiceImpl extends BpmOABaseService implements BpmOAPa
|
||||
.setProcessInstanceName(processInstance.getName())
|
||||
.setBeginTime(processInstance.getCreateTime())
|
||||
.setEndTime(processInstance.getEndTime())
|
||||
.setRecipientName(bankRespDTO != null ? bankRespDTO.getNickname() + "," + bankRespDTO.getBankNo() + "," + bankRespDTO.getBankName() : "")
|
||||
.setRecipientName(bankRespDTO.getNickname())
|
||||
.setCompanyId(deptRespDTO != null ? deptRespDTO.getId() : null)
|
||||
);
|
||||
}
|
||||
@ -276,9 +276,9 @@ public class BpmOAPaymentServiceImpl extends BpmOABaseService implements BpmOAPa
|
||||
// 获取银行卡信息
|
||||
BankRespDTO bankResp = bankApi.getBank(payment.getBankId()).getCheckedData();
|
||||
// 设置银行卡信息
|
||||
respVO.setBankName(bankResp != null ? bankResp.getBankName() : null);
|
||||
respVO.setBankNo(bankResp != null ? bankResp.getBankNo() : null);
|
||||
respVO.setNickname(bankResp != null ? bankResp.getNickname() : null);
|
||||
respVO.setBankName(bankResp.getBankName());
|
||||
respVO.setBankNo(bankResp.getBankNo());
|
||||
respVO.setNickname(bankResp.getNickname());
|
||||
}
|
||||
}
|
||||
return respVO;
|
||||
|
@ -25,6 +25,7 @@ import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import cn.iocoder.yudao.module.bpm.service.financialpayment.FinancialPaymentService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmHistoryProcessInstanceService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
||||
import cn.iocoder.yudao.module.system.api.bank.dto.BankRespDTO;
|
||||
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.user.AdminUserApi;
|
||||
@ -100,7 +101,6 @@ public class BpmOAReimbursementServiceImpl extends BpmOABaseService implements B
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Long createReimbursement(Long userId, BpmOAReimbursementCreateReqVO createReqVO) {
|
||||
BpmOAReimbursementDO reimbursement = BpmOAReimbursementConvert.INSTANCE.convert(createReqVO).setUserId(userId)
|
||||
.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
|
||||
@ -120,8 +120,6 @@ public class BpmOAReimbursementServiceImpl extends BpmOABaseService implements B
|
||||
createDO.forEach(item -> item.setReimbursementId(reimbursement.getId()));
|
||||
reimbursementItemMapper.insertBatch(createDO);
|
||||
|
||||
// 同步更新
|
||||
|
||||
// 发起 BPM 流程
|
||||
Map<String, Object> processInstanceVariables = new HashMap<>();
|
||||
String processInstanceId = processInstanceApi.createProcessInstance(userId,
|
||||
@ -251,7 +249,7 @@ public class BpmOAReimbursementServiceImpl extends BpmOABaseService implements B
|
||||
.setProcessInstanceName(processInstance.getName())
|
||||
.setBeginTime(processInstance.getCreateTime())
|
||||
.setEndTime(processInstance.getEndTime())
|
||||
.setRecipientName(bpmOAReimbursementDO.getNickname() + "," + bpmOAReimbursementDO.getBankNo() + "," + bpmOAReimbursementDO.getBankName())
|
||||
.setRecipientName(bpmOAReimbursementDO.getNickname())
|
||||
.setCompanyId(deptRespDTO != null ? deptRespDTO.getId() : null)
|
||||
);
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
||||
import cn.iocoder.yudao.module.bpm.service.financialpayment.FinancialPaymentService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmHistoryProcessInstanceService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.staffSalary.StaffSalaryApi;
|
||||
import cn.iocoder.yudao.module.system.api.bank.dto.BankRespDTO;
|
||||
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.user.AdminUserApi;
|
||||
@ -62,9 +62,6 @@ public class BpmOASalaryServiceImpl extends BpmOABaseService implements BpmOASal
|
||||
@Resource
|
||||
private FinancialPaymentService financialPaymentService;
|
||||
|
||||
@Resource
|
||||
private StaffSalaryApi staffSalaryApi;
|
||||
|
||||
@Override
|
||||
public Long createSalary(Long userId, BpmOASalaryCreateReqVO createReqVO) {
|
||||
|
||||
@ -100,18 +97,12 @@ public class BpmOASalaryServiceImpl extends BpmOABaseService implements BpmOASal
|
||||
if (fileItems != null && !fileItems.isEmpty()) {
|
||||
uploadBpmFileProcessInstanceId(processInstanceId,fileItems) ;
|
||||
}
|
||||
|
||||
// 同步更新 员工薪资表已发放工资状态
|
||||
staffSalaryApi.updateIsGrant(salary.getStaffSalaryIds(), 1);
|
||||
|
||||
return salary.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSalaryResult(String processInstanceId, Long id, Integer result) {
|
||||
BpmOASalaryDO salaryDO = validateLeaveExists(id);
|
||||
salaryMapper.updateById(new BpmOASalaryDO().setId(id).setResult(result));
|
||||
|
||||
//审核通过 (最后节点)
|
||||
if (BpmProcessInstanceResultEnum.APPROVE.getResult().equals(result)) {
|
||||
|
||||
@ -139,17 +130,7 @@ public class BpmOASalaryServiceImpl extends BpmOABaseService implements BpmOASal
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// -- 自己取消
|
||||
// -- 审核拒绝
|
||||
//所有关联的采购申请改为 未支付状态
|
||||
if (BpmProcessInstanceResultEnum.REJECT.getResult().equals(result)
|
||||
|| BpmProcessInstanceResultEnum.CANCEL.getResult().equals(result)
|
||||
|| BpmProcessInstanceResultEnum.BACK.getResult().equals(result)) {
|
||||
|
||||
// 还原员工薪资表已发放工资状态
|
||||
staffSalaryApi.updateIsGrant(salaryDO.getStaffSalaryIds(), 0);
|
||||
}
|
||||
salaryMapper.updateById(new BpmOASalaryDO().setId(id).setResult(result));
|
||||
}
|
||||
|
||||
private BpmOASalaryDO validateLeaveExists(Long id) {
|
||||
|
@ -1,82 +0,0 @@
|
||||
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);
|
||||
|
||||
}
|
@ -1,183 +0,0 @@
|
||||
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;
|
||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.THE_WORK_ORDER_RULE_TYPE_ALREADY_EXISTS_PLEASE_DO_NOT_ADD_IT_REPEATEDLY;
|
||||
|
||||
/**
|
||||
* 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);
|
||||
// -- 判断系统中是否已经存在该规则 - 如果存在提示已存在 - 请勿重复添加
|
||||
BpmOAWorkOrderAssignRuleDO bpmOAWorkOrderAssignRuleDO = workOrderAssignRuleMapper.selectOne(new LambdaQueryWrapperX<BpmOAWorkOrderAssignRuleDO>()
|
||||
.eq(BpmOAWorkOrderAssignRuleDO::getWorkOrderType, workOrderAssignRule.getWorkOrderType()));
|
||||
if (bpmOAWorkOrderAssignRuleDO != null) {
|
||||
throw exception(THE_WORK_ORDER_RULE_TYPE_ALREADY_EXISTS_PLEASE_DO_NOT_ADD_IT_REPEATEDLY);
|
||||
}
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
@ -1,123 +0,0 @@
|
||||
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.workorder.*;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderDO;
|
||||
|
||||
import javax.validation.Valid;
|
||||
|
||||
/**
|
||||
* BPM OA 工单 Service 接口
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
public interface BpmOAWorkOrderService {
|
||||
|
||||
/**
|
||||
* 创建工单
|
||||
*
|
||||
* @param userId 发起人ID
|
||||
* @param createReqVO 创建请求
|
||||
* @return 工单ID
|
||||
*/
|
||||
Long createWorkOrder(Long userId, @Valid BpmOAWorkOrderCreateReqVO createReqVO);
|
||||
|
||||
/**
|
||||
* 更新工单状态结果
|
||||
*
|
||||
* @param id 工单ID
|
||||
* @param result BPM流程结果
|
||||
*/
|
||||
void updateWorkOrderResult(Long id, Integer result);
|
||||
|
||||
/**
|
||||
* 分配工单
|
||||
*
|
||||
* @param id 工单ID
|
||||
* @param assigneeUserId 责任人ID
|
||||
* @param assigneeDeptId 责任部门ID
|
||||
*/
|
||||
void assignWorkOrder(Long id, Long assigneeUserId, Long assigneeDeptId);
|
||||
|
||||
/**
|
||||
* 添加工单跟踪信息
|
||||
*
|
||||
* @param userId 操作人ID
|
||||
* @param trackReqVO 跟踪信息
|
||||
*/
|
||||
void addTrackInfo(Long userId, @Valid BpmOAWorkOrderTrackReqVO trackReqVO);
|
||||
|
||||
/**
|
||||
* 更新工单
|
||||
*
|
||||
* @param updateReqVO 更新请求
|
||||
*/
|
||||
void updateWorkOrder(@Valid BpmOAWorkOrderUpdateReqVO updateReqVO);
|
||||
|
||||
/**
|
||||
* 获取工单详情
|
||||
*
|
||||
* @param id 工单ID
|
||||
* @return 工单DO
|
||||
*/
|
||||
BpmOAWorkOrderDO getWorkOrder(Long id);
|
||||
|
||||
/**
|
||||
* 获取工单详情(带扩展信息)
|
||||
*
|
||||
* @param id 工单ID
|
||||
* @return 工单详情VO
|
||||
*/
|
||||
BpmOAWorkOrderRespVO getWorkOrderDetail(Long id);
|
||||
|
||||
/**
|
||||
* 根据流程实例ID获取工单
|
||||
*
|
||||
* @param processInstanceId 流程实例ID
|
||||
* @return 工单DO
|
||||
*/
|
||||
BpmOAWorkOrderDO getWorkOrderByProcessInstanceId(String processInstanceId);
|
||||
|
||||
/**
|
||||
* 获取工单分页
|
||||
*
|
||||
* @param loginUserId 登录用户ID
|
||||
* @param pageVO 分页请求
|
||||
* @return 分页结果
|
||||
*/
|
||||
PageResult<BpmOAWorkOrderRespVO> getWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO);
|
||||
|
||||
/**
|
||||
* 获取我发起的工单分页
|
||||
*
|
||||
* @param loginUserId 登录用户ID
|
||||
* @param pageVO 分页请求
|
||||
* @return 分页结果
|
||||
*/
|
||||
PageResult<BpmOAWorkOrderRespVO> getMyWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO);
|
||||
|
||||
/**
|
||||
* 获取分配给我的工单分页
|
||||
*
|
||||
* @param loginUserId 登录用户ID
|
||||
* @param pageVO 分页请求
|
||||
* @return 分页结果
|
||||
*/
|
||||
PageResult<BpmOAWorkOrderRespVO> getAssignedWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO);
|
||||
|
||||
/**
|
||||
* 获取我负责工单的数量
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @return 工单数量
|
||||
*/
|
||||
Long getMyAssignedWorkOrderCount(Long userId);
|
||||
|
||||
/**
|
||||
* 工单操作记录跟踪分页列表
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
PageResult<BpmOAWorkOrderTrackInfo> getTrackPage(@Valid BpmOAWorkOrderTrackReqDTO dto);
|
||||
}
|
@ -1,451 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
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.dto.BpmProcessInstanceCreateReqDTO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder.*;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderAssignRuleDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderTrackDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAWorkOrderAssignRuleMapper;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAWorkOrderMapper;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAWorkOrderTrackMapper;
|
||||
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.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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
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.module.bpm.enums.ErrorCodeConstants.OA_WORK_TASK_NOT_EXISTS;
|
||||
|
||||
/**
|
||||
* BPM OA 工单 Service 实现类
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@Service
|
||||
@Validated
|
||||
public class BpmOAWorkOrderServiceImpl extends BpmOABaseService implements BpmOAWorkOrderService {
|
||||
|
||||
/**
|
||||
* 工单对应的流程定义 KEY
|
||||
*/
|
||||
public static final String PROCESS_KEY = "work_order";
|
||||
|
||||
@Resource
|
||||
private BpmOAWorkOrderMapper workOrderMapper;
|
||||
|
||||
@Resource
|
||||
private BpmOAWorkOrderAssignRuleMapper assignRuleMapper;
|
||||
|
||||
@Resource
|
||||
private BpmOAWorkOrderTrackMapper trackMapper;
|
||||
|
||||
@Resource
|
||||
private BpmProcessInstanceApi processInstanceApi;
|
||||
|
||||
@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_LEVEL = "work_order_level";
|
||||
private static final String WORK_ORDER_STATUS = "work_order_status";
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Long createWorkOrder(Long userId, BpmOAWorkOrderCreateReqVO createReqVO) {
|
||||
// 获取当前登录用户信息
|
||||
AdminUserRespDTO userRespDTO = userApi.getUser(userId).getCheckedData();
|
||||
|
||||
List<UploadUserFile> list = createReqVO.getFileItems();
|
||||
// 创建工单DO
|
||||
BpmOAWorkOrderDO workOrder = BpmOAWorkOrderDO.builder()
|
||||
.title(createReqVO.getTitle())
|
||||
.type(createReqVO.getType())
|
||||
.level(createReqVO.getLevel())
|
||||
.content(createReqVO.getContent())
|
||||
.expectedTime(createReqVO.getExpectedTime())
|
||||
.fileItems(new ArrayList<>(list))
|
||||
.fromUserId(userId)
|
||||
.fromDeptId(userRespDTO.getDeptId())
|
||||
.status(2) // 默认状态:处理中
|
||||
.result(BpmProcessInstanceResultEnum.PROCESS.getResult())
|
||||
.build();
|
||||
// 自动分配责任人(根据规则)
|
||||
autoAssignWorkOrder(workOrder);
|
||||
workOrderMapper.insert(workOrder);
|
||||
|
||||
// 发起 BPM 流程
|
||||
Map<String, Object> processInstanceVariables = new HashMap<>();
|
||||
String processInstanceId = processInstanceApi.createProcessInstance(userId,
|
||||
new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
|
||||
.setVariables(processInstanceVariables).setBusinessKey(String.valueOf(workOrder.getId()))).getCheckedData();
|
||||
|
||||
// 更新工单的流程实例ID
|
||||
workOrderMapper.updateById(new BpmOAWorkOrderDO().setId(workOrder.getId()).setProcessInstanceId(processInstanceId));
|
||||
|
||||
// 创建初始跟踪记录
|
||||
createTrackRecord(workOrder.getId(), userId, userRespDTO.getNickname(), "创建工单", null);
|
||||
|
||||
List<UploadUserFile> fileItems = createReqVO.getFileItems();
|
||||
//这里的逻辑,如果fileItems不为空,且有数据,那么说明是上传了附件的,则需要更工作流文件表对应的实例Id
|
||||
if (fileItems != null && !fileItems.isEmpty()) {
|
||||
uploadBpmFileProcessInstanceId(processInstanceId, fileItems);
|
||||
}
|
||||
|
||||
return workOrder.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateWorkOrderResult(Long id, Integer result) {
|
||||
validateWorkOrderExists(id);
|
||||
// BPM流程完成时,将工单状态设置为已完成
|
||||
int status = result.equals(BpmProcessInstanceResultEnum.APPROVE.getResult()) ? 3 : 4; // 3-已完成,4-已取消
|
||||
LocalDateTime completedTime = result.equals(BpmProcessInstanceResultEnum.APPROVE.getResult()) ? LocalDateTime.now() : null;
|
||||
|
||||
workOrderMapper.updateById(new BpmOAWorkOrderDO()
|
||||
.setId(id)
|
||||
.setResult(result)
|
||||
.setStatus(status)
|
||||
.setCompletedTime(completedTime));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void assignWorkOrder(Long id, Long assigneeUserId, Long assigneeDeptId) {
|
||||
validateWorkOrderExists(id);
|
||||
workOrderMapper.updateById(new BpmOAWorkOrderDO()
|
||||
.setId(id)
|
||||
.setAssigneeUserId(assigneeUserId)
|
||||
.setAssigneeDeptId(assigneeDeptId)
|
||||
.setStatus(2)); // 2-处理中
|
||||
|
||||
// 创建分配跟踪记录
|
||||
AdminUserRespDTO assigneeUser = userApi.getUser(assigneeUserId).getCheckedData();
|
||||
createTrackRecord(id, assigneeUserId, assigneeUser.getNickname(), "工单已分配给:" + assigneeUser.getNickname(), null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addTrackInfo(Long userId, BpmOAWorkOrderTrackReqVO trackReqVO) {
|
||||
AdminUserRespDTO userRespDTO = userApi.getUser(userId).getCheckedData();
|
||||
createTrackRecord(trackReqVO.getWorkOrderId(), userId, userRespDTO.getNickname()
|
||||
, trackReqVO.getContent(), null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateWorkOrder(BpmOAWorkOrderUpdateReqVO updateReqVO) {
|
||||
validateWorkOrderExists(updateReqVO.getId());
|
||||
BpmOAWorkOrderDO updateData = BpmOAWorkOrderDO.builder()
|
||||
.id(updateReqVO.getId())
|
||||
.status(updateReqVO.getStatus())
|
||||
.result(updateReqVO.getResult())
|
||||
.expectedTime(updateReqVO.getExpectedTime())
|
||||
.completedTime(updateReqVO.getCompletedTime())
|
||||
.resultDescription(updateReqVO.getResultDescription())
|
||||
.build();
|
||||
workOrderMapper.updateById(updateData);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BpmOAWorkOrderDO getWorkOrder(Long id) {
|
||||
return workOrderMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BpmOAWorkOrderRespVO getWorkOrderDetail(Long id) {
|
||||
BpmOAWorkOrderDO workOrder = validateWorkOrderExists(id);
|
||||
|
||||
// 转换为VO
|
||||
BpmOAWorkOrderRespVO respVO = convertToRespVO(workOrder);
|
||||
|
||||
// 获取跟踪记录
|
||||
List<BpmOAWorkOrderTrackDO> trackList = trackMapper.selectByWorkOrderId(id);
|
||||
List<BpmOAWorkOrderTrackInfo> trackInfoList = trackList.stream()
|
||||
.map(this::convertToTrackInfo)
|
||||
.collect(Collectors.toList());
|
||||
respVO.setTrackInfo(trackInfoList);
|
||||
|
||||
return respVO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BpmOAWorkOrderDO getWorkOrderByProcessInstanceId(String processInstanceId) {
|
||||
return workOrderMapper.selectOne(BpmOAWorkOrderDO::getProcessInstanceId, processInstanceId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<BpmOAWorkOrderRespVO> getWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO) {
|
||||
IPage<BpmOAWorkOrderRespVO> pageResult = workOrderMapper.selectWorkOrderPage(MyBatisUtils.buildPage(pageVO), pageVO.setLoginUserId(loginUserId));
|
||||
// 使用XML查询,直接返回带关联信息的VO数据
|
||||
return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());
|
||||
}
|
||||
|
||||
@Override
|
||||
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数据
|
||||
return bpmOAWorkOrderRespVOPageResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
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数据
|
||||
return bpmOAWorkOrderRespVOPageResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getMyAssignedWorkOrderCount(Long 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()));
|
||||
return new PageResult<>(pageResult.getList().stream().map(this::convertToTrackInfo).collect(Collectors.toList()), pageResult.getTotal());
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建跟踪记录
|
||||
*/
|
||||
private void createTrackRecord(Long workOrderId, Long operatorId, String operatorName, String content, String attachments) {
|
||||
BpmOAWorkOrderTrackDO track = BpmOAWorkOrderTrackDO.builder()
|
||||
.workOrderId(workOrderId)
|
||||
.operatorId(operatorId)
|
||||
.operatorName(operatorName)
|
||||
.content(content)
|
||||
.attachments(attachments)
|
||||
.build();
|
||||
trackMapper.insert(track);
|
||||
}
|
||||
|
||||
/**
|
||||
* 自动分配工单责任人
|
||||
*/
|
||||
private void autoAssignWorkOrder(BpmOAWorkOrderDO workOrder) {
|
||||
// 根据工单类型查询分配规则
|
||||
List<BpmOAWorkOrderAssignRuleDO> rules = assignRuleMapper.selectRulesByType(workOrder.getType());
|
||||
|
||||
if (!rules.isEmpty()) {
|
||||
// 选择第一个匹配的规则(按优先级排序)
|
||||
BpmOAWorkOrderAssignRuleDO rule = rules.get(0);
|
||||
workOrder.setAssigneeUserId(rule.getAssigneeUserId());
|
||||
workOrder.setAssigneeDeptId(rule.getDeptId());
|
||||
workOrder.setStatus(2); // 2-处理中
|
||||
}
|
||||
// 如果没有匹配的规则,保持待分配状态
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验工单是否存在
|
||||
*/
|
||||
private BpmOAWorkOrderDO validateWorkOrderExists(Long id) {
|
||||
BpmOAWorkOrderDO workOrder = workOrderMapper.selectById(id);
|
||||
if (workOrder == null) {
|
||||
throw exception(OA_WORK_TASK_NOT_EXISTS); // 暂时复用现有错误码
|
||||
}
|
||||
return workOrder;
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传BPM文件流程实例ID
|
||||
* 重写父类方法,使用父类的实现
|
||||
*/
|
||||
@Override
|
||||
public void uploadBpmFileProcessInstanceId(String processInstanceId, List<UploadUserFile> fileItems) {
|
||||
super.uploadBpmFileProcessInstanceId(processInstanceId, fileItems);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换DO为RespVO
|
||||
*/
|
||||
private BpmOAWorkOrderRespVO convertToRespVO(BpmOAWorkOrderDO workOrder) {
|
||||
if (workOrder == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
BpmOAWorkOrderRespVO respVO = new BpmOAWorkOrderRespVO();
|
||||
respVO.setId(workOrder.getId());
|
||||
respVO.setTitle(workOrder.getTitle());
|
||||
respVO.setType(workOrder.getType());
|
||||
respVO.setLevel(workOrder.getLevel());
|
||||
respVO.setContent(workOrder.getContent());
|
||||
respVO.setFromUserId(workOrder.getFromUserId());
|
||||
respVO.setFromDeptId(workOrder.getFromDeptId());
|
||||
respVO.setAssigneeUserId(workOrder.getAssigneeUserId());
|
||||
respVO.setAssigneeDeptId(workOrder.getAssigneeDeptId());
|
||||
respVO.setStatus(workOrder.getStatus());
|
||||
respVO.setExpectedTime(workOrder.getExpectedTime());
|
||||
respVO.setCompletedTime(workOrder.getCompletedTime());
|
||||
respVO.setResultDescription(workOrder.getResultDescription());
|
||||
respVO.setResult(workOrder.getResult());
|
||||
respVO.setProcessInstanceId(workOrder.getProcessInstanceId());
|
||||
respVO.setCreateTime(workOrder.getCreateTime());
|
||||
respVO.setUpdateTime(workOrder.getUpdateTime());
|
||||
respVO.setFileItems(workOrder.getFileItems());
|
||||
// 设置类型名称
|
||||
respVO.setTypeName(getWorkOrderTypeName(workOrder.getType()));
|
||||
|
||||
// 设置优先级名称
|
||||
respVO.setLevelName(getWorkOrderLevelName(workOrder.getLevel()));
|
||||
|
||||
// 设置状态名称
|
||||
respVO.setStatusName(getWorkOrderStatusName(workOrder.getStatus()));
|
||||
|
||||
// 获取用户和部门名称
|
||||
if (workOrder.getFromUserId() != null) {
|
||||
AdminUserRespDTO fromUser = userApi.getUser(workOrder.getFromUserId()).getCheckedData();
|
||||
respVO.setFromUserName(fromUser.getNickname());
|
||||
}
|
||||
|
||||
if (workOrder.getAssigneeUserId() != null) {
|
||||
AdminUserRespDTO assigneeUser = userApi.getUser(workOrder.getAssigneeUserId()).getCheckedData();
|
||||
respVO.setAssigneeUserName(assigneeUser.getNickname());
|
||||
}
|
||||
|
||||
if (workOrder.getFromDeptId() != null) {
|
||||
DeptRespDTO fromDept = deptApi.getDept(workOrder.getFromDeptId()).getCheckedData();
|
||||
respVO.setFromDeptName(fromDept.getName());
|
||||
}
|
||||
|
||||
if (workOrder.getAssigneeDeptId() != null) {
|
||||
DeptRespDTO assigneeDept = deptApi.getDept(workOrder.getAssigneeDeptId()).getCheckedData();
|
||||
respVO.setAssigneeDeptName(assigneeDept.getName());
|
||||
}
|
||||
|
||||
return respVO;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换跟踪记录DO为TrackInfo
|
||||
*/
|
||||
private BpmOAWorkOrderTrackInfo convertToTrackInfo(BpmOAWorkOrderTrackDO trackDO) {
|
||||
if (trackDO == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
BpmOAWorkOrderTrackInfo trackInfo = new BpmOAWorkOrderTrackInfo();
|
||||
trackInfo.setTrackId(String.valueOf(trackDO.getId()));
|
||||
trackInfo.setOperatorId(trackDO.getOperatorId());
|
||||
trackInfo.setOperatorName(trackDO.getOperatorName());
|
||||
trackInfo.setContent(trackDO.getContent());
|
||||
trackInfo.setTrackTime(trackDO.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
||||
|
||||
return trackInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换分页结果
|
||||
*/
|
||||
private PageResult<BpmOAWorkOrderRespVO> convertToPageResult(PageResult<BpmOAWorkOrderDO> pageResult) {
|
||||
if (pageResult == null || pageResult.getList() == null) {
|
||||
return new PageResult<>();
|
||||
}
|
||||
|
||||
List<BpmOAWorkOrderRespVO> respList = pageResult.getList().stream()
|
||||
.map(this::convertToRespVO)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return new PageResult<>(respList, pageResult.getTotal());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取工单类型名称
|
||||
*/
|
||||
private String getWorkOrderTypeName(String type) {
|
||||
if (type == null) {
|
||||
return "";
|
||||
}
|
||||
try {
|
||||
DictDataRespDTO dictData = dictDataApi.getDictData("work_order_type", type).getCheckedData();
|
||||
return dictData != null ? dictData.getLabel() : type;
|
||||
} catch (Exception e) {
|
||||
// 如果字典查询失败,返回原值
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取工单优先级名称
|
||||
*/
|
||||
private String getWorkOrderLevelName(Integer level) {
|
||||
if (level == null) {
|
||||
return "";
|
||||
}
|
||||
try {
|
||||
DictDataRespDTO dictData = dictDataApi.getDictData("work_order_level", String.valueOf(level)).getCheckedData();
|
||||
return dictData != null ? dictData.getLabel() : String.valueOf(level);
|
||||
} catch (Exception e) {
|
||||
// 如果字典查询失败,返回原值
|
||||
return String.valueOf(level);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取工单状态名称
|
||||
*/
|
||||
private String getWorkOrderStatusName(Integer status) {
|
||||
if (status == null) {
|
||||
return "";
|
||||
}
|
||||
try {
|
||||
DictDataRespDTO dictData = dictDataApi.getDictData("work_order_status", String.valueOf(status)).getCheckedData();
|
||||
return dictData != null ? dictData.getLabel() : String.valueOf(status);
|
||||
} catch (Exception e) {
|
||||
// 如果字典查询失败,返回原值
|
||||
return String.valueOf(status);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.oa.listener;
|
||||
|
||||
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent;
|
||||
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventListener;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAWorkOrderService;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAWorkOrderServiceImpl;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* OA 工单的结果的监听器实现类
|
||||
*
|
||||
* @author 系统
|
||||
*/
|
||||
@Component
|
||||
public class BpmOAWorkOrderResultListener extends BpmProcessInstanceResultEventListener {
|
||||
|
||||
@Resource
|
||||
private BpmOAWorkOrderService workOrderService;
|
||||
|
||||
@Override
|
||||
protected String getProcessDefinitionKey() {
|
||||
return BpmOAWorkOrderServiceImpl.PROCESS_KEY;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onEvent(BpmProcessInstanceResultEvent event) {
|
||||
workOrderService.updateWorkOrderResult(Long.parseLong(event.getBusinessKey()), event.getResult());
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
@ -28,8 +28,6 @@ import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionServic
|
||||
import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOASalaryService;
|
||||
import cn.iocoder.yudao.module.bpm.service.task.dto.ProcessInstanceVariablesDTO;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.FactoryInfoApi;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.dto.FactoryInfoDTO;
|
||||
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.user.AdminUserApi;
|
||||
@ -101,9 +99,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
||||
@Resource
|
||||
private DeptApi deptApi;
|
||||
|
||||
@Resource
|
||||
private FactoryInfoApi factoryInfoApi;
|
||||
|
||||
@Resource
|
||||
private BpmTaskExtMapper taskExtMapper;
|
||||
|
||||
@ -217,45 +212,16 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
||||
|
||||
// 获取薪资付款列表
|
||||
List<BpmOASalaryDO> salaryDOS = salaryService.getListByProcessInstanceIds(processInstanceIds);
|
||||
// 获取公司编号map
|
||||
Map<String, Long> salaryDeptMap = salaryDOS.stream()
|
||||
.filter(item -> item.getCompanyDeptId() != null)
|
||||
.collect(Collectors.toMap(BpmOASalaryDO::getProcessInstanceId, BpmOASalaryDO::getCompanyDeptId));
|
||||
// 获取工厂编号Map
|
||||
Map<String, Set<Long>> factoryDeptMap = salaryDOS.stream()
|
||||
.filter(item -> CollUtil.isNotEmpty(item.getFactoryDeptId()))
|
||||
.collect(Collectors.toMap(BpmOASalaryDO::getProcessInstanceId, BpmOASalaryDO::getFactoryDeptId));
|
||||
// 获取付款部门信息
|
||||
Map<Long, DeptRespDTO> dtoMap = deptApi.getDeptMap(convertSet(salaryDOS, BpmOASalaryDO::getCompanyDeptId));
|
||||
// 获取付款工厂信息
|
||||
Map<Long, FactoryInfoDTO> factoryInfoDTOMap = factoryInfoApi.getFactoryMap(factoryDeptMap.values()
|
||||
.stream()
|
||||
.flatMap(Set::stream)
|
||||
.collect(Collectors.toSet()));
|
||||
// 组合数据
|
||||
Map<String, List<FactoryInfoDTO>> groupedMap = factoryDeptMap.entrySet()
|
||||
.stream()
|
||||
.collect(Collectors.toMap(
|
||||
Map.Entry::getKey,
|
||||
entry -> entry.getValue().stream()
|
||||
.map(factoryInfoDTOMap::get)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList())
|
||||
));
|
||||
|
||||
pageResp.getRecords().forEach(item -> {
|
||||
if (salaryDeptMap.containsKey(item.getProcessInstanceId())) {
|
||||
item.setStartUserNickname(item.getStartUserNickname() +
|
||||
"(" +
|
||||
dtoMap.get(salaryDeptMap.get(item.getProcessInstanceId())).getName() +
|
||||
")");
|
||||
}else if (factoryDeptMap.containsKey(item.getProcessInstanceId())) {
|
||||
item.setStartUserNickname(item.getStartUserNickname() +
|
||||
"(" +
|
||||
groupedMap.get(item.getProcessInstanceId()).stream()
|
||||
.map(FactoryInfoDTO::getShortName)
|
||||
.collect(Collectors.joining(",")) +
|
||||
")");
|
||||
}
|
||||
});
|
||||
|
||||
@ -297,31 +263,10 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
||||
// 获取薪资付款列表
|
||||
List<BpmOASalaryDO> salaryDOS = salaryService.getListByProcessInstanceIds(processInstanceIds);
|
||||
Map<String, Long> salaryDeptMap = salaryDOS.stream()
|
||||
.filter(item -> item.getCompanyDeptId() != null)
|
||||
.collect(Collectors.toMap(BpmOASalaryDO::getProcessInstanceId, BpmOASalaryDO::getCompanyDeptId));
|
||||
// 获取付款部门信息
|
||||
Map<Long, DeptRespDTO> dtoMap = deptApi.getDeptMap(convertSet(salaryDOS, BpmOASalaryDO::getCompanyDeptId));
|
||||
|
||||
// 获取工厂编号Map
|
||||
Map<String, Set<Long>> factoryDeptMap = salaryDOS.stream()
|
||||
.filter(item -> CollUtil.isNotEmpty(item.getFactoryDeptId()))
|
||||
.collect(Collectors.toMap(BpmOASalaryDO::getProcessInstanceId, BpmOASalaryDO::getFactoryDeptId));
|
||||
// 获取付款工厂信息
|
||||
Map<Long, FactoryInfoDTO> factoryInfoDTOMap = factoryInfoApi.getFactoryMap(factoryDeptMap.values()
|
||||
.stream()
|
||||
.flatMap(Set::stream)
|
||||
.collect(Collectors.toSet()));
|
||||
// 组合数据
|
||||
Map<String, List<FactoryInfoDTO>> groupedMap = factoryDeptMap.entrySet()
|
||||
.stream()
|
||||
.collect(Collectors.toMap(
|
||||
Map.Entry::getKey,
|
||||
entry -> entry.getValue().stream()
|
||||
.map(factoryInfoDTOMap::get)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList())
|
||||
));
|
||||
|
||||
pageResult.getList().forEach(item -> {
|
||||
item.setStartUserNickname(userMap.get(item.getStartUserId()).getNickname());
|
||||
if (salaryDeptMap.containsKey(item.getProcessInstanceId())) {
|
||||
@ -329,13 +274,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
||||
"(" +
|
||||
dtoMap.get(salaryDeptMap.get(item.getProcessInstanceId())).getName() +
|
||||
")");
|
||||
}else if (factoryDeptMap.containsKey(item.getProcessInstanceId())) {
|
||||
item.setStartUserNickname(item.getStartUserNickname() +
|
||||
"(" +
|
||||
groupedMap.get(item.getProcessInstanceId()).stream()
|
||||
.map(FactoryInfoDTO::getShortName)
|
||||
.collect(Collectors.joining(",")) +
|
||||
")");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1,37 +0,0 @@
|
||||
<?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.BpmOAEvectionMapper">
|
||||
|
||||
<!--
|
||||
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
|
||||
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
|
||||
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
|
||||
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
|
||||
-->
|
||||
|
||||
<select id="selectEvectionList" resultType="cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAEvectionDO">
|
||||
SELECT
|
||||
a.*
|
||||
FROM
|
||||
bpm_oa_evection a
|
||||
WHERE
|
||||
a.id NOT IN (
|
||||
SELECT
|
||||
c.object_id
|
||||
FROM
|
||||
bpm_oa_reimbursement b,
|
||||
bpm_oa_reimbursement_item c
|
||||
WHERE
|
||||
b.user_id = #{userId}
|
||||
AND b.deleted = 0
|
||||
AND b.id = c.reimbursement_id
|
||||
AND b.result IN ( 1, 2 )
|
||||
AND c.type = 1
|
||||
AND c.object_id IS NOT NULL
|
||||
)
|
||||
AND a.user_id = #{userId}
|
||||
AND a.deleted = 0
|
||||
ORDER BY
|
||||
a.create_time DESC
|
||||
</select>
|
||||
</mapper>
|
@ -14,7 +14,7 @@
|
||||
a.type as type,
|
||||
a.cost_section AS costSection,
|
||||
a.dept_id AS deptId,
|
||||
d.short_name AS deptName,
|
||||
d.name AS deptName,
|
||||
a.total_money AS amount,
|
||||
a.detail AS detail,
|
||||
b.user_id AS userId,
|
||||
@ -30,7 +30,7 @@
|
||||
FROM bpm_oa_expenses b
|
||||
JOIN bpm_oa_expenses_item a ON a.expenses_id = b.id
|
||||
JOIN bpm_process_instance_ext c ON c.process_instance_id = b.process_instance_id
|
||||
LEFT JOIN sf_factory_info d ON d.id = a.dept_id
|
||||
LEFT JOIN system_dept d ON d.factory_id = a.dept_id
|
||||
LEFT JOIN system_users u ON u.id = b.user_id
|
||||
LEFT JOIN system_bank ub ON ub.id = b.bank_id
|
||||
WHERE
|
||||
@ -70,31 +70,25 @@
|
||||
SUM(a.total_money) - SUM(a.amount_paid) AS remainingPayable
|
||||
FROM
|
||||
bpm_oa_expenses a
|
||||
LEFT JOIN bpm_oa_expenses_item b ON b.expenses_id = a.id
|
||||
LEFT JOIN bpm_process_instance_ext c ON c.process_instance_id = a.process_instance_id
|
||||
LEFT JOIN system_bank ub ON ub.id = a.bank_id
|
||||
WHERE
|
||||
a.deleted = 0
|
||||
AND b.deleted = 0
|
||||
AND a.result = 2
|
||||
<if test="pageReqVO.userId != null">
|
||||
AND a.user_id = #{pageReqVO.userId}
|
||||
</if>
|
||||
AND EXISTS (
|
||||
SELECT
|
||||
1
|
||||
FROM
|
||||
bpm_oa_expenses_item b
|
||||
WHERE
|
||||
b.expenses_id = a.id
|
||||
<if test="pageReqVO.factoryId != null">
|
||||
AND b.dept_id = #{pageReqVO.factoryId}
|
||||
</if>
|
||||
<if test="pageReqVO.type != null">
|
||||
AND b.type = #{pageReqVO.type}
|
||||
</if>
|
||||
<if test="pageReqVO.costSection != null">
|
||||
AND b.cost_section = #{pageReqVO.costSection}
|
||||
</if>
|
||||
)
|
||||
<if test="pageReqVO.factoryId != null">
|
||||
AND b.dept_id = #{pageReqVO.factoryId}
|
||||
</if>
|
||||
<if test="pageReqVO.type != null">
|
||||
AND b.type = #{pageReqVO.type}
|
||||
</if>
|
||||
<if test="pageReqVO.costSection != null">
|
||||
AND b.cost_section = #{pageReqVO.costSection}
|
||||
</if>
|
||||
<if test="pageReqVO.payeeName != null">
|
||||
AND ub.nickname LIKE CONCAT('%', #{pageReqVO.payeeName}, '%')
|
||||
</if>
|
||||
|
@ -31,7 +31,7 @@
|
||||
<if test="pageReqVO.loanType == 1">
|
||||
SELECT
|
||||
s.staff_id AS staffId,
|
||||
st.nick_name AS staffName,
|
||||
CONVERT(st.nick_name USING utf8mb4) COLLATE utf8mb4_unicode_ci AS staffName,
|
||||
s.factory_id AS factoryId,
|
||||
sf.short_name AS factoryName,
|
||||
s.month AS month,
|
||||
|
@ -1,207 +0,0 @@
|
||||
<?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.BpmOAWorkOrderMapper">
|
||||
|
||||
<!-- 工单分页查询结果映射 -->
|
||||
<resultMap id="WorkOrderPageResultMap" type="cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder.BpmOAWorkOrderRespVO">
|
||||
<id column="id" property="id"/>
|
||||
<result column="title" property="title"/>
|
||||
<result column="type" property="type"/>
|
||||
<result column="level" property="level"/>
|
||||
<result column="content" property="content"/>
|
||||
<result column="from_user_id" property="fromUserId"/>
|
||||
<result column="from_dept_id" property="fromDeptId"/>
|
||||
<result column="assignee_user_id" property="assigneeUserId"/>
|
||||
<result column="assignee_dept_id" property="assigneeDeptId"/>
|
||||
<result column="status" property="status"/>
|
||||
<result column="expected_time" property="expectedTime"/>
|
||||
<result column="completed_time" property="completedTime"/>
|
||||
<result column="result_description" property="resultDescription"/>
|
||||
<result column="result" property="result"/>
|
||||
<result column="process_instance_id" property="processInstanceId"/>
|
||||
<result column="create_time" property="createTime"/>
|
||||
<result column="update_time" property="updateTime"/>
|
||||
<!-- 关联用户和部门名称 -->
|
||||
<result column="from_user_name" property="fromUserName"/>
|
||||
<result column="from_dept_name" property="fromDeptName"/>
|
||||
<result column="assignee_user_name" property="assigneeUserName"/>
|
||||
<result column="assignee_dept_name" property="assigneeDeptName"/>
|
||||
<!-- 字典名称 -->
|
||||
<result column="type_name" property="typeName"/>
|
||||
<result column="level_name" property="levelName"/>
|
||||
<result column="status_name" property="statusName"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- 工单分页查询SQL(所有工单) -->
|
||||
<select id="selectWorkOrderPage" resultMap="WorkOrderPageResultMap">
|
||||
SELECT
|
||||
w.id,
|
||||
w.title,
|
||||
w.type,
|
||||
w.level,
|
||||
w.content,
|
||||
w.from_user_id,
|
||||
w.from_dept_id,
|
||||
w.assignee_user_id,
|
||||
w.assignee_dept_id,
|
||||
w.status,
|
||||
w.expected_time,
|
||||
w.completed_time,
|
||||
w.result_description,
|
||||
w.result,
|
||||
w.process_instance_id,
|
||||
w.create_time,
|
||||
w.update_time,
|
||||
fu.nickname AS from_user_name,
|
||||
fd.name AS from_dept_name,
|
||||
au.nickname AS assignee_user_name,
|
||||
ad.name AS assignee_dept_name
|
||||
FROM bpm_oa_work_order w
|
||||
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_users au ON w.assignee_user_id = au.id
|
||||
LEFT JOIN system_dept ad ON w.assignee_dept_id = ad.id
|
||||
<where>
|
||||
w.deleted = 0
|
||||
<if test="req.title != null and req.title != ''">
|
||||
AND w.title LIKE CONCAT('%', #{req.title}, '%')
|
||||
</if>
|
||||
<if test="req.type != null and req.type != ''">
|
||||
AND w.type = #{req.type}
|
||||
</if>
|
||||
<if test="req.status != null">
|
||||
AND w.status = #{req.status}
|
||||
</if>
|
||||
<if test="req.assigneeUserId != null">
|
||||
AND w.assignee_user_id = #{req.assigneeUserId}
|
||||
</if>
|
||||
<if test="req.fromUserId != null">
|
||||
AND w.from_user_id = #{req.fromUserId}
|
||||
</if>
|
||||
<if test="req.level != null">
|
||||
AND w.level = #{req.level}
|
||||
</if>
|
||||
<if test="req.createTime != null and req.createTime.length > 0">
|
||||
<if test="req.createTime[0] != null">
|
||||
AND w.create_time >= #{req.createTime[0]}
|
||||
</if>
|
||||
<if test="req.createTime[1] != null">
|
||||
AND w.create_time <= #{req.createTime[1]}
|
||||
</if>
|
||||
</if>
|
||||
</where>
|
||||
ORDER BY w.id DESC
|
||||
</select>
|
||||
|
||||
<!-- 我发起的工单分页查询SQL -->
|
||||
<select id="selectMyWorkOrderPage" resultMap="WorkOrderPageResultMap">
|
||||
SELECT
|
||||
w.id,
|
||||
w.title,
|
||||
w.type,
|
||||
w.level,
|
||||
w.content,
|
||||
w.from_user_id,
|
||||
w.from_dept_id,
|
||||
w.assignee_user_id,
|
||||
w.assignee_dept_id,
|
||||
w.status,
|
||||
w.expected_time,
|
||||
w.completed_time,
|
||||
w.result_description,
|
||||
w.result,
|
||||
w.process_instance_id,
|
||||
w.create_time,
|
||||
w.update_time,
|
||||
fu.nickname AS from_user_name,
|
||||
fd.name AS from_dept_name,
|
||||
au.nickname AS assignee_user_name,
|
||||
ad.name AS assignee_dept_name
|
||||
FROM bpm_oa_work_order w
|
||||
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_users au ON w.assignee_user_id = au.id
|
||||
LEFT JOIN system_dept ad ON w.assignee_dept_id = ad.id
|
||||
<where>
|
||||
w.deleted = 0 AND w.from_user_id = #{req.loginUserId}
|
||||
<if test="req.title != null and req.title != ''">
|
||||
AND w.title LIKE CONCAT('%', #{req.title}, '%')
|
||||
</if>
|
||||
<if test="req.type != null and req.type != ''">
|
||||
AND w.type = #{req.type}
|
||||
</if>
|
||||
<if test="req.status != null">
|
||||
AND w.status = #{req.status}
|
||||
</if>
|
||||
<if test="req.createTime != null and req.createTime.length > 0">
|
||||
<if test="req.createTime[0] != null">
|
||||
AND w.create_time >= #{req.createTime[0]}
|
||||
</if>
|
||||
<if test="req.createTime[1] != null">
|
||||
AND w.create_time <= #{req.createTime[1]}
|
||||
</if>
|
||||
</if>
|
||||
</where>
|
||||
ORDER BY w.id DESC
|
||||
</select>
|
||||
|
||||
<!-- 分配给我的工单分页查询SQL -->
|
||||
<select id="selectAssignedWorkOrderPage" resultMap="WorkOrderPageResultMap">
|
||||
SELECT
|
||||
w.id,
|
||||
w.title,
|
||||
w.type,
|
||||
w.level,
|
||||
w.content,
|
||||
w.from_user_id,
|
||||
w.from_dept_id,
|
||||
w.assignee_user_id,
|
||||
w.assignee_dept_id,
|
||||
w.status,
|
||||
w.expected_time,
|
||||
w.completed_time,
|
||||
w.result_description,
|
||||
w.result,
|
||||
w.process_instance_id,
|
||||
w.create_time,
|
||||
w.update_time,
|
||||
fu.nickname AS from_user_name,
|
||||
fd.name AS from_dept_name,
|
||||
au.nickname AS assignee_user_name,
|
||||
ad.name AS assignee_dept_name
|
||||
FROM bpm_oa_work_order w
|
||||
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_users au ON w.assignee_user_id = au.id
|
||||
LEFT JOIN system_dept ad ON w.assignee_dept_id = ad.id
|
||||
<where>
|
||||
w.deleted = 0 AND w.assignee_user_id = #{req.loginUserId}
|
||||
<if test="req.title != null and req.title != ''">
|
||||
AND w.title LIKE CONCAT('%', #{req.title}, '%')
|
||||
</if>
|
||||
<if test="req.type != null and req.type != ''">
|
||||
AND w.type = #{req.type}
|
||||
</if>
|
||||
<if test="req.status != null">
|
||||
AND w.status = #{req.status}
|
||||
</if>
|
||||
<if test="req.createTime != null and req.createTime.length > 0">
|
||||
<if test="req.createTime[0] != null">
|
||||
AND w.create_time >= #{req.createTime[0]}
|
||||
</if>
|
||||
<if test="req.createTime[1] != null">
|
||||
AND w.create_time <= #{req.createTime[1]}
|
||||
</if>
|
||||
</if>
|
||||
</where>
|
||||
ORDER BY w.id DESC
|
||||
</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>
|
@ -1,7 +0,0 @@
|
||||
<?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>
|
22
yudao-module-crm/.flattened-pom.xml
Normal file
22
yudao-module-crm/.flattened-pom.xml
Normal file
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao</artifactId>
|
||||
<version>2.0.0-jdk8-snapshot</version>
|
||||
</parent>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-module-crm</artifactId>
|
||||
<version>2.0.0-jdk8-snapshot</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>${project.artifactId}</name>
|
||||
<description>infra 模块,主要提供两块能力:
|
||||
1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等
|
||||
2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等</description>
|
||||
<modules>
|
||||
<module>yudao-module-crm-api</module>
|
||||
<module>yudao-module-crm-biz</module>
|
||||
</modules>
|
||||
</project>
|
36
yudao-module-crm/yudao-module-crm-api/.flattened-pom.xml
Normal file
36
yudao-module-crm/yudao-module-crm-api/.flattened-pom.xml
Normal file
@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-module-crm</artifactId>
|
||||
<version>2.0.0-jdk8-snapshot</version>
|
||||
</parent>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-module-crm-api</artifactId>
|
||||
<version>2.0.0-jdk8-snapshot</version>
|
||||
<name>${project.artifactId}</name>
|
||||
<description>infra 模块 API,暴露给其它模块调用</description>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-common</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springdoc</groupId>
|
||||
<artifactId>springdoc-openapi-ui</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-validation</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-openfeign</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
153
yudao-module-crm/yudao-module-crm-biz/.flattened-pom.xml
Normal file
153
yudao-module-crm/yudao-module-crm-biz/.flattened-pom.xml
Normal file
@ -0,0 +1,153 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-module-crm</artifactId>
|
||||
<version>2.0.0-jdk8-snapshot</version>
|
||||
</parent>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-module-crm-biz</artifactId>
|
||||
<version>2.0.0-jdk8-snapshot</version>
|
||||
<name>${project.artifactId}</name>
|
||||
<description>infra 模块,主要提供两块能力:
|
||||
1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等
|
||||
2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等</description>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-bootstrap</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-module-crm-api</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-module-product-api</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-module-system-api</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-banner</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-biz-error-code</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-websocket</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-mybatis</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-generator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-redis</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-rpc</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-job</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-mq</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-excel</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.velocity</groupId>
|
||||
<artifactId>velocity-engine-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.smallbun.screw</groupId>
|
||||
<artifactId>screw-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-monitor</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>de.codecentric</groupId>
|
||||
<artifactId>spring-boot-admin-starter-server</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-file</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-module-bpm-api</artifactId>
|
||||
<version>2.0.0-jdk8-snapshot</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<finalName>${project.artifactId}</finalName>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<version>${spring.boot.version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>8</source>
|
||||
<target>8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
BIN
yudao-module-infra/.DS_Store
vendored
Normal file
BIN
yudao-module-infra/.DS_Store
vendored
Normal file
Binary file not shown.
@ -1,37 +0,0 @@
|
||||
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;
|
||||
|
||||
}
|
@ -13,7 +13,6 @@ import cn.iocoder.yudao.framework.security.config.SecurityProperties;
|
||||
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.*;
|
||||
import cn.iocoder.yudao.module.infra.dal.dataobject.file.*;
|
||||
import cn.iocoder.yudao.module.infra.service.file.FileService;
|
||||
import cn.iocoder.yudao.module.infra.service.minio.MinioService;
|
||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||
import cn.iocoder.yudao.module.system.api.dept.PostApi;
|
||||
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
||||
@ -40,7 +39,6 @@ import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDate;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
@ -68,15 +66,12 @@ public class FileController {
|
||||
@Resource
|
||||
private SecurityProperties securityProperties;
|
||||
|
||||
@Resource
|
||||
private MinioService minioService;
|
||||
|
||||
@PostMapping("/uploadBpmFileProcessInstanceId")
|
||||
@Operation(summary = "更新文件的流程实例ID")
|
||||
@OperateLog(logArgs = false) // 上传文件,没有记录操作日志的必要
|
||||
public String uploadBpmFileProcessInstanceId(@Valid @RequestBody BpmFileUploadReqVO reqVO) throws Exception {
|
||||
fileService.uploadBpmFileProcessInstanceId(reqVO);
|
||||
return "success";
|
||||
fileService.uploadBpmFileProcessInstanceId(reqVO);
|
||||
return "success" ;
|
||||
}
|
||||
|
||||
@PostMapping("/bpmUpload")
|
||||
@ -107,7 +102,7 @@ public class FileController {
|
||||
@GetMapping("/{configId}/get/**")
|
||||
@PermitAll
|
||||
@Operation(summary = "下载文件")
|
||||
@Parameter(name = "configId", description = "配置编号", required = true)
|
||||
@Parameter(name = "configId", description = "配置编号", required = true)
|
||||
public void getFileContent(HttpServletRequest request,
|
||||
HttpServletResponse response,
|
||||
@PathVariable("configId") Long configId) throws Exception {
|
||||
@ -151,8 +146,8 @@ public class FileController {
|
||||
@Operation(summary = "上传业务类型附件【如:工作日/周报附件】")
|
||||
@OperateLog(logArgs = false) // 上传文件,没有记录操作日志的必要
|
||||
@PermitAll
|
||||
public CommonResult<BusinessFileDO> businessUpload(@RequestParam("uploadFiles") MultipartFile file, @RequestParam("businessType") Long businessType) throws Exception {
|
||||
return success(fileService.createBusinessReturnFile(file, businessType));
|
||||
public CommonResult<BusinessFileDO> businessUpload(@RequestParam("uploadFiles") MultipartFile file,@RequestParam("businessType")Long businessType) throws Exception {
|
||||
return success(fileService.createBusinessReturnFile(file,businessType));
|
||||
}
|
||||
|
||||
@DeleteMapping("/deleteBusinessFile")
|
||||
@ -169,7 +164,7 @@ public class FileController {
|
||||
@OperateLog(logArgs = false) // 上传文件,没有记录操作日志的必要
|
||||
public String uploadBusinessFileProcessInstanceId(@Valid @RequestBody BusinessFileUploadReqVO reqVO) throws Exception {
|
||||
fileService.uploadBusinessFileProcessInstanceId(reqVO);
|
||||
return "success";
|
||||
return "success" ;
|
||||
}
|
||||
//add by yj 2024 04-11 End
|
||||
|
||||
@ -199,6 +194,7 @@ public class FileController {
|
||||
@RequestParam(value = "postId", required = false) Long postId) {
|
||||
|
||||
|
||||
|
||||
// 查询当前部门编号下 是否存在小程序码
|
||||
QRCodeDO qrCodeDO = fileService.getQRCode(deptId, null);
|
||||
|
||||
@ -217,7 +213,7 @@ public class FileController {
|
||||
|
||||
return error(OA_QRCODE_ERROR);
|
||||
}
|
||||
} else { // 存在的时候, 判断是否已存在相同参数的小程序码
|
||||
}else { // 存在的时候, 判断是否已存在相同参数的小程序码
|
||||
|
||||
// 查询是否存在 参数一致的小程序码
|
||||
qrCodeDO = fileService.getQRCode(deptId, scene.toString());
|
||||
@ -230,7 +226,7 @@ public class FileController {
|
||||
|
||||
return error(OA_QRCODE_ERROR);
|
||||
}
|
||||
} else {
|
||||
}else {
|
||||
fileService.updateQRCodeFile(qrCodeDO.getId());
|
||||
}
|
||||
}
|
||||
@ -300,49 +296,4 @@ public class FileController {
|
||||
// 上传小程序码 获得url
|
||||
return fileService.updateQRCodeFile(id, deptId, QRCode.getName(), content);
|
||||
}
|
||||
|
||||
@GetMapping("/presigned-url")
|
||||
@Operation(summary = "生成预签名上传凭证")
|
||||
public CommonResult<Map<String, Object>> generatePresignedUrl(
|
||||
@RequestParam String fileName,
|
||||
@RequestParam String fileType) {
|
||||
try {
|
||||
Map<String, Object> credentials = minioService.generatePresignedUploadCredentials(fileName, fileType);
|
||||
return success(credentials);
|
||||
} catch (Exception e) {
|
||||
log.error("生成预签名上传凭证失败", e);
|
||||
return CommonResult.error(500, "生成预签名上传凭证失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@GetMapping("/presigned-download-url")
|
||||
@Operation(summary = "获取MinIO预签名下载URL")
|
||||
@PermitAll
|
||||
public CommonResult<Map<String, Object>> generatePresignedDownloadUrl(
|
||||
@RequestParam("objectName") String objectName) {
|
||||
try {
|
||||
// 参数验证
|
||||
if (objectName == null || objectName.trim().isEmpty()) {
|
||||
return CommonResult.error(400, "参数错误:objectName不能为空");
|
||||
}
|
||||
|
||||
// 调用MinioService生成预签名下载URL
|
||||
Map<String, Object> result = minioService.generatePresignedDownloadUrl(objectName);
|
||||
return success(result);
|
||||
|
||||
} catch (RuntimeException e) {
|
||||
String errorMessage = e.getMessage();
|
||||
if (errorMessage != null && errorMessage.contains("文件不存在")) {
|
||||
log.warn("文件不存在: {}", objectName);
|
||||
return CommonResult.error(404, "文件不存在");
|
||||
} else {
|
||||
log.error("生成预签名下载URL失败", e);
|
||||
return CommonResult.error(500, "生成预签名下载URL失败: " + errorMessage);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("生成预签名下载URL失败", e);
|
||||
return CommonResult.error(500, "生成预签名下载URL失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -3,23 +3,17 @@ package cn.iocoder.yudao.module.infra.controller.app.file;
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
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.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.minio.MinioService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
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.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
|
||||
@ -33,9 +27,6 @@ public class AppFileController {
|
||||
@Resource
|
||||
private FileService fileService;
|
||||
|
||||
@Resource
|
||||
private MinioService minioService;
|
||||
|
||||
@PostMapping("/upload")
|
||||
@Operation(summary = "上传文件")
|
||||
public CommonResult<String> uploadFile(AppFileUploadReqVO uploadReqVO) throws Exception {
|
||||
@ -44,40 +35,4 @@ public class AppFileController {
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,22 +0,0 @@
|
||||
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;
|
||||
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
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;
|
||||
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user