feat:添加wps相关代码
This commit is contained in:
@@ -43,7 +43,7 @@ public class Attachment implements Serializable {
|
|||||||
* 附件大小(单位:B)
|
* 附件大小(单位:B)
|
||||||
*/
|
*/
|
||||||
@Schema(description = "附件大小(单位:B)")
|
@Schema(description = "附件大小(单位:B)")
|
||||||
private long size;
|
private Long size;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* objectKey
|
* objectKey
|
||||||
|
|||||||
15
blade-service-api/blade-open-api/pom.xml
Normal file
15
blade-service-api/blade-open-api/pom.xml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springblade</groupId>
|
||||||
|
<artifactId>blade-service-api</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>blade-open-api</artifactId>
|
||||||
|
<name>${project.artifactId}</name>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package org.springblade.openapi.common.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页参数
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2025/4/23
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Data
|
||||||
|
@Schema(description = "分页结果")
|
||||||
|
public class PageVO<T> implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 查询数据列表
|
||||||
|
*/
|
||||||
|
@Schema(description = "查询数据列表")
|
||||||
|
protected List<T> records = Collections.emptyList();
|
||||||
|
/**
|
||||||
|
* 总数
|
||||||
|
*/
|
||||||
|
@Schema(description = "总数")
|
||||||
|
protected long total = 0;
|
||||||
|
/**
|
||||||
|
* 总页数
|
||||||
|
*/
|
||||||
|
@Schema(description = "总页数")
|
||||||
|
protected long pages = 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
package org.springblade.openapi.mk.api;
|
||||||
|
|
||||||
|
import org.springblade.core.tool.api.FR;
|
||||||
|
import org.springblade.openapi.mk.pojo.dto.Api4MKProcessApprovalDTO;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 给mk回调的api
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/9/5
|
||||||
|
*/
|
||||||
|
public interface IApi4MK {
|
||||||
|
String API_PREFIX = "/openApi/mk";
|
||||||
|
String PROCESS_API_PREFIX = API_PREFIX + "/process";
|
||||||
|
String PROCESS_FINISH_CALLBACK = PROCESS_API_PREFIX + "/finishCallback";
|
||||||
|
String PROCESS_APPROVAL_CALLBACK = PROCESS_API_PREFIX + "/approvalCallback";
|
||||||
|
String PROCESS_REJECT_CALLBACK = PROCESS_API_PREFIX + "/rejectCallback";
|
||||||
|
String PROCESS_REVOKE_CALLBACK = PROCESS_API_PREFIX + "/revokeCallback";
|
||||||
|
String PROCESS_COMMON_CALLBACK = PROCESS_API_PREFIX + "/commonCallback";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程通用回调接口
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping(PROCESS_COMMON_CALLBACK)
|
||||||
|
FR<Boolean> processCommonCallback(@RequestBody Api4MKProcessApprovalDTO param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程结束回调接口
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping(PROCESS_FINISH_CALLBACK)
|
||||||
|
FR<Boolean> processFinishCallback(@RequestBody Api4MKProcessApprovalDTO param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程审批同意回调接口
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping(PROCESS_APPROVAL_CALLBACK)
|
||||||
|
FR<Boolean> processApprovalCallback(@RequestBody Api4MKProcessApprovalDTO param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程审批拒绝回调接口
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping(PROCESS_REJECT_CALLBACK)
|
||||||
|
FR<Boolean> processRejectCallback(@RequestBody Api4MKProcessApprovalDTO param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程撤销回调接口
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping(PROCESS_REVOKE_CALLBACK)
|
||||||
|
FR<Boolean> processRevokeCallback(@RequestBody Api4MKProcessApprovalDTO param);
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package org.springblade.openapi.mk.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/9/12
|
||||||
|
*/
|
||||||
|
public class MKConstant {
|
||||||
|
}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
package org.springblade.openapi.mk.pojo.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mk审批回调参数
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/9/5
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class Api4MKProcessApprovalDTO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 流程实例id
|
||||||
|
*/
|
||||||
|
private String processInstanceId;
|
||||||
|
/**
|
||||||
|
* 表单实例id
|
||||||
|
*/
|
||||||
|
private String formInstanceId;
|
||||||
|
/**
|
||||||
|
* 模板id
|
||||||
|
*/
|
||||||
|
private String templateId;
|
||||||
|
/**
|
||||||
|
* 模板编码,template_拼接 ProcessTypeEnum 的值
|
||||||
|
*/
|
||||||
|
private String templateCode;
|
||||||
|
/**
|
||||||
|
* 流程状态
|
||||||
|
*/
|
||||||
|
private String processStatus;
|
||||||
|
/**
|
||||||
|
* 申请人登录名
|
||||||
|
*/
|
||||||
|
private String applicantLoginName;
|
||||||
|
|
||||||
|
//===========================下面5个参数流程结束没有=========================
|
||||||
|
/**
|
||||||
|
* 驳回节点id N2 是起草节点
|
||||||
|
*/
|
||||||
|
private String rejectNodeId;
|
||||||
|
/**
|
||||||
|
* 当前节点id
|
||||||
|
*/
|
||||||
|
private String currentNodeId;
|
||||||
|
/**
|
||||||
|
* 当前节点编号
|
||||||
|
*/
|
||||||
|
private String currentNodeNumber;
|
||||||
|
/**
|
||||||
|
* 执行的操作
|
||||||
|
*/
|
||||||
|
private String operation;
|
||||||
|
/**
|
||||||
|
* 操作名称
|
||||||
|
*/
|
||||||
|
private String operationName;
|
||||||
|
/**
|
||||||
|
* 审批意见
|
||||||
|
*/
|
||||||
|
private String approvalOpinion;
|
||||||
|
/**
|
||||||
|
* 操作人登录名
|
||||||
|
*/
|
||||||
|
private String operatorLoginName;
|
||||||
|
|
||||||
|
//====================非mk回调参数,回调接口设置参数===================
|
||||||
|
/**
|
||||||
|
* 是否流程已完成,非mk回调参数,回调接口设置参数
|
||||||
|
*/
|
||||||
|
private boolean complete;
|
||||||
|
/**
|
||||||
|
* 审批状态,非mk回调参数,回调接口设置参数
|
||||||
|
*/
|
||||||
|
private String approveStatus;
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package org.springblade.openapi.mk.pojo.dto;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mk审批结束回调参数
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/9/5
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class ApiMKProcessFinishDTO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 流程实例id
|
||||||
|
*/
|
||||||
|
private String processInstanceId;
|
||||||
|
/**
|
||||||
|
* 表单实例id
|
||||||
|
*/
|
||||||
|
private String formInstanceId;
|
||||||
|
/**
|
||||||
|
* 模板编码,template_拼接 ProcessTypeEnum 的值
|
||||||
|
*/
|
||||||
|
private String templateCode;
|
||||||
|
/**
|
||||||
|
* 流程状态
|
||||||
|
*/
|
||||||
|
private String processStatus;
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package org.springblade.openapi.mk.pojo.dto;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class ProcessApprovalDTO implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程实例id
|
||||||
|
*/
|
||||||
|
@Schema(description = "流程实例id")
|
||||||
|
protected String flowInstId;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单实例id
|
||||||
|
*/
|
||||||
|
protected String formInstanceId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审批状态
|
||||||
|
*/
|
||||||
|
protected String approveStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下级审批人
|
||||||
|
*/
|
||||||
|
protected String nextApproveUser;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
package org.springblade.openapi.mk.pojo.enums;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程回调类型
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2024/11/23
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Getter
|
||||||
|
public enum ProcessCallbackType {
|
||||||
|
/**
|
||||||
|
* 提交
|
||||||
|
*/
|
||||||
|
SUBMIT(ProcessOperationType.DRAFTER_SUBMIT),
|
||||||
|
/**
|
||||||
|
* 起草人撤回
|
||||||
|
*/
|
||||||
|
RETRACT(ProcessOperationType.DRAFTER_RETRACT),
|
||||||
|
/**
|
||||||
|
* 审批通过
|
||||||
|
*/
|
||||||
|
PASS(ProcessOperationType.HANDLER_PASS),
|
||||||
|
/**
|
||||||
|
* 审批驳回
|
||||||
|
*/
|
||||||
|
REJECT(ProcessOperationType.HANDLER_REJECT),
|
||||||
|
/**
|
||||||
|
* 废弃(起草人废弃、审批人废弃、超管废弃)
|
||||||
|
*/
|
||||||
|
ABANDON(ProcessOperationType.DRAFTER_ABANDON, ProcessOperationType.HANDLER_ABANDON, ProcessOperationType.ADMIN_ABANDON),
|
||||||
|
/**
|
||||||
|
* 修改当前处理人(超管修改当前处理人、审批人转办、审批人撤回、特权人前后跳转)
|
||||||
|
*/
|
||||||
|
CHANGE_CUR_HANDLER(ProcessOperationType.ADMIN_CHANGE_CUR_HANDLER, ProcessOperationType.HANDLER_TRANSFER, ProcessOperationType.HISTORY_HANDLER_RETRACT, ProcessOperationType.ADMIN_JUMP),
|
||||||
|
/**
|
||||||
|
* 流程结束
|
||||||
|
*/
|
||||||
|
FINISH(ProcessOperationType.PROCESS_FINISH),
|
||||||
|
;
|
||||||
|
/**
|
||||||
|
* 编码
|
||||||
|
*/
|
||||||
|
private final List<String> operationTypes;
|
||||||
|
|
||||||
|
ProcessCallbackType(ProcessOperationType... operationTypes) {
|
||||||
|
if (operationTypes.length == 0) {
|
||||||
|
throw new RuntimeException("流程操作类型不能为空");
|
||||||
|
}
|
||||||
|
this.operationTypes = Stream.of(operationTypes)
|
||||||
|
.map(ProcessOperationType::getCode)
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
ProcessCallbackType(String... operationTypes) {
|
||||||
|
if (operationTypes.length == 0) {
|
||||||
|
throw new RuntimeException("流程操作类型不能为空");
|
||||||
|
}
|
||||||
|
this.operationTypes = Lists.newArrayList(operationTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程操作类型对应的事件
|
||||||
|
*/
|
||||||
|
private static final Map<String, ProcessCallbackType> CALLBACK_MAP = initCallbackMap();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化流程操作类型对应的事件
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static Map<String, ProcessCallbackType> initCallbackMap() {
|
||||||
|
return Stream.of(values())
|
||||||
|
.flatMap(callbackType -> callbackType.getOperationTypes().stream()
|
||||||
|
.collect(Collectors.toMap(Function.identity(), type -> callbackType))
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
)
|
||||||
|
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> {
|
||||||
|
throw new RuntimeException("流程操作类型不能重复");
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据流程操作类型,获取对应的回调
|
||||||
|
* @param operationType
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static ProcessCallbackType getCallbackType(String operationType) {
|
||||||
|
return CALLBACK_MAP.get(operationType);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,175 @@
|
|||||||
|
package org.springblade.openapi.mk.pojo.enums;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程操作类型枚举
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2024/11/23
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Getter
|
||||||
|
public enum ProcessOperationType {
|
||||||
|
/**
|
||||||
|
* 起草人协同
|
||||||
|
*/
|
||||||
|
DRAFTER_COOPERATE("drafter_cooperate", "起草人协同"),
|
||||||
|
/**
|
||||||
|
* 起草人取消协同
|
||||||
|
*/
|
||||||
|
DRAFTER_CANCEL_DRAFT_COOPERATE("drafter_cancelDraftCooperate", "起草人取消协同"),
|
||||||
|
/**
|
||||||
|
* 协同接收人-回复协同
|
||||||
|
*/
|
||||||
|
HANDLER_REPLY_DRAFT_COOPERATE("handler_replyDraftCooperate", "协同接收人-回复协同"),
|
||||||
|
/**
|
||||||
|
* 起草人-提交
|
||||||
|
*/
|
||||||
|
DRAFTER_SUBMIT("drafter_submit", "起草人-提交"),
|
||||||
|
/**
|
||||||
|
* 起草人-废弃
|
||||||
|
*/
|
||||||
|
DRAFTER_ABANDON("drafter_abandon", "起草人-废弃"),
|
||||||
|
/**
|
||||||
|
* 起草人-撤回
|
||||||
|
*/
|
||||||
|
DRAFTER_RETRACT("drafter_retract", "起草人-撤回"),
|
||||||
|
/**
|
||||||
|
* 审批人-通过
|
||||||
|
*/
|
||||||
|
HANDLER_PASS("handler_pass", "审批人-通过"),
|
||||||
|
/**
|
||||||
|
* 审批人-驳回
|
||||||
|
*/
|
||||||
|
HANDLER_REJECT("handler_reject", "审批人-驳回"),
|
||||||
|
/**
|
||||||
|
* 审批人-废弃
|
||||||
|
*/
|
||||||
|
HANDLER_ABANDON("handler_abandon", "审批人-废弃"),
|
||||||
|
/**
|
||||||
|
* 审批人-撤回
|
||||||
|
*/
|
||||||
|
HISTORY_HANDLER_RETRACT("historyHandler_retract", "审批人-撤回"),
|
||||||
|
/**
|
||||||
|
* 审批人-签字
|
||||||
|
*/
|
||||||
|
HANDLER_SIGN("handler_sign", "审批人-签字"),
|
||||||
|
/**
|
||||||
|
* 审批人-转办
|
||||||
|
*/
|
||||||
|
HANDLER_TRANSFER("handler_transfer", "审批人-转办"),
|
||||||
|
/**
|
||||||
|
* 审批人-分发
|
||||||
|
*/
|
||||||
|
HANDLER_ASSIGN("handler_assign", "审批人-分发"),
|
||||||
|
/**
|
||||||
|
* 审批人-催办
|
||||||
|
*/
|
||||||
|
HISTORY_HANDLER_URGE("historyHandler_urge", "审批人-催办"),
|
||||||
|
/**
|
||||||
|
* 审批人-沟通
|
||||||
|
*/
|
||||||
|
HANDLER_COMMUNICATE("handler_communicate", "审批人-沟通"),
|
||||||
|
/**
|
||||||
|
* 审批人-回复沟通
|
||||||
|
*/
|
||||||
|
HANDLER_REPLY_COMMUNICATE("handler_replyCommunicate", "审批人-回复沟通"),
|
||||||
|
/**
|
||||||
|
* 审批人-取消沟通
|
||||||
|
*/
|
||||||
|
HANDLER_CANCEL_COMMUNICATE("handler_cancelCommunicate", "审批人-取消沟通"),
|
||||||
|
/**
|
||||||
|
* 审批人-补签
|
||||||
|
*/
|
||||||
|
HANDLER_APPEND_SIGN("handler_appendSign", "审批人-补签"),
|
||||||
|
/**
|
||||||
|
* 审批人-加签
|
||||||
|
*/
|
||||||
|
HANDLER_PREPEND_SIGN("handler_prependSign", "审批人-加签"),
|
||||||
|
/**
|
||||||
|
* 审批人(加签人)-取消加签
|
||||||
|
*/
|
||||||
|
HANDLER_PREPEND_SIGN_CANCEL("handler_prependSignCancel", "审批人(加签人)-取消加签"),
|
||||||
|
/**
|
||||||
|
* 审批人(被加签人)-退回加签
|
||||||
|
*/
|
||||||
|
HANDLER_PREPEND_SIGN_REFUSE("handler_prependSignRefuse", "审批人(被加签人)-退回加签"),
|
||||||
|
/**
|
||||||
|
* 审批人(被加签人)-通过加签
|
||||||
|
*/
|
||||||
|
HANDLER_PREPEND_SIGN_PASS("handler_prependSignPass", "审批人(被加签人)-通过加签"),
|
||||||
|
/**
|
||||||
|
* 审批人(被加签人)-审批人-传阅
|
||||||
|
*/
|
||||||
|
HANDLER_CIRCULATION("handler_circulation", "审批人(被加签人)-审批人-传阅"),
|
||||||
|
/**
|
||||||
|
* 特权人-前后跳转
|
||||||
|
*/
|
||||||
|
ADMIN_JUMP("admin_jump", "特权人-前后跳转"),
|
||||||
|
/**
|
||||||
|
* 特权人-流程暂停
|
||||||
|
*/
|
||||||
|
ADMIN_PROCESS_SUSPEND("admin_processSuspend", "特权人-流程暂停"),
|
||||||
|
/**
|
||||||
|
* 特权人-节点暂停
|
||||||
|
*/
|
||||||
|
ADMIN_NODE_SUSPEND("admin_nodeSuspend", "特权人-节点暂停"),
|
||||||
|
/**
|
||||||
|
* 审批人-节点唤醒
|
||||||
|
*/
|
||||||
|
HANDLER_NODE_RESUME("handler_nodeResume", "审批人-节点唤醒"),
|
||||||
|
/**
|
||||||
|
* 特权人-节点唤醒
|
||||||
|
*/
|
||||||
|
ADMIN_NODE_RESUME("admin_nodeResume", "特权人-节点唤醒"),
|
||||||
|
/**
|
||||||
|
* 特权人-流程唤醒
|
||||||
|
*/
|
||||||
|
ADMIN_PROCESS_RESUME("admin_processResume", "特权人-流程唤醒"),
|
||||||
|
/**
|
||||||
|
* 特权人-修改流程
|
||||||
|
*/
|
||||||
|
ADMIN_MODIFY_PROCESS("admin_modifyProcess", "特权人-修改流程"),
|
||||||
|
/**
|
||||||
|
* 特权人-修改当前处理人
|
||||||
|
*/
|
||||||
|
ADMIN_CHANGE_CUR_HANDLER("admin_changeCurHandler", "特权人-修改当前处理人"),
|
||||||
|
/**
|
||||||
|
* 特权人-终审通过
|
||||||
|
*/
|
||||||
|
ADMIN_END("admin_end", "特权人-终审通过"),
|
||||||
|
/**
|
||||||
|
* 特权人-直接废弃
|
||||||
|
*/
|
||||||
|
ADMIN_ABANDON("admin_abandon", "特权人-直接废弃"),
|
||||||
|
;
|
||||||
|
/**
|
||||||
|
* 编码
|
||||||
|
*/
|
||||||
|
private final String code;
|
||||||
|
/**
|
||||||
|
* 名称
|
||||||
|
*/
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程结束,mk没有这个操作,但是有这个事件,自定义一个操作类型,统一管理
|
||||||
|
*/
|
||||||
|
public static final String PROCESS_FINISH = "erp_process_finish";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据操作编码获取名称
|
||||||
|
* @param code
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getOperationName(String code) {
|
||||||
|
return Stream.of(values())
|
||||||
|
.filter(type -> type.getCode().equals(code))
|
||||||
|
.findFirst()
|
||||||
|
.map(ProcessOperationType::getName)
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package org.springblade.openapi.ocr.api;
|
||||||
|
|
||||||
|
import org.springblade.core.tool.api.FR;
|
||||||
|
import org.springblade.openapi.common.vo.PageVO;
|
||||||
|
import org.springblade.openapi.ocr.pojo.dto.Api4OCRProjectDTO;
|
||||||
|
import org.springblade.openapi.ocr.pojo.dto.Api4OCRResultDTO;
|
||||||
|
import org.springblade.openapi.ocr.pojo.vo.Api4OCRProjectVO;
|
||||||
|
import org.springblade.openapi.ocr.pojo.vo.Api4OCRResultVO;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2025/04/22
|
||||||
|
*/
|
||||||
|
public interface IApi4OCR {
|
||||||
|
String API_PREFIX = "/openApi/ocr";
|
||||||
|
String PROJECT_LIST = API_PREFIX + "/queryProjectList";
|
||||||
|
String OCR_RESULT_LIST = API_PREFIX + "/queryOCRResultList";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询项目列表
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping(PROJECT_LIST)
|
||||||
|
FR<PageVO<Api4OCRProjectVO>> queryProjectList(@RequestBody(required = false) Api4OCRProjectDTO param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询凭证ocr识别结果列表
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping(OCR_RESULT_LIST)
|
||||||
|
FR<PageVO<Api4OCRResultVO>> queryOCRResultList(@RequestBody(required = false) Api4OCRResultDTO param);
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package org.springblade.openapi.ocr.pojo.dto;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2025/4/22
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
@Schema(description = "提供给ocr的项目信息")
|
||||||
|
public class Api4OCRProjectDTO extends PageQuery {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 关键字,项目名称或简称模糊查询
|
||||||
|
*/
|
||||||
|
@Schema(description = "关键字,项目名称或简称模糊查询")
|
||||||
|
private String keyword;
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
package org.springblade.openapi.ocr.pojo.dto;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.springblade.core.tool.utils.DateUtil;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2025/4/22
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
@Schema(description = "凭证ocr结果查询参数")
|
||||||
|
public class Api4OCRResultDTO extends PageQuery {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 项目id
|
||||||
|
*/
|
||||||
|
@Schema(description = "项目id,项目id、凭证批次号、凭证号至少一个不为空")
|
||||||
|
private Long projectId;
|
||||||
|
/**
|
||||||
|
* 凭证批次号
|
||||||
|
*/
|
||||||
|
@Schema(description = "凭证批次号,项目id、凭证批次号、凭证号至少一个不为空")
|
||||||
|
private String batchCode;
|
||||||
|
/**
|
||||||
|
* 凭证号
|
||||||
|
*/
|
||||||
|
@Schema(description = "凭证号,项目id、凭证批次号、凭证号至少一个不为空")
|
||||||
|
private String detailCode;
|
||||||
|
/**
|
||||||
|
* 是否类型错误(1 否 2 是)
|
||||||
|
*/
|
||||||
|
@Schema(description = "是否类型错误(1 否 2 是)")
|
||||||
|
private Integer isTypeError;
|
||||||
|
/**
|
||||||
|
* 是否数据错误(1 否 2 是)
|
||||||
|
*/
|
||||||
|
@Schema(description = "是否数据错误(1 否 2 是)")
|
||||||
|
private Integer isDataError;
|
||||||
|
/**
|
||||||
|
* 创建时间始
|
||||||
|
*/
|
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
|
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME, timezone = "GMT+8")
|
||||||
|
@Schema(description = "创建时间始,格式yyyy-MM-dd HH:mm:ss")
|
||||||
|
private Date createTimeStart;
|
||||||
|
/**
|
||||||
|
* 创建时间至
|
||||||
|
*/
|
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
|
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME, timezone = "GMT+8")
|
||||||
|
@Schema(description = "创建时间至,格式yyyy-MM-dd HH:mm:ss")
|
||||||
|
private Date createTimeEnd;
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package org.springblade.openapi.ocr.pojo.dto;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询参数
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2025/4/22
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Schema(description = "分页查询参数")
|
||||||
|
public class PageQuery implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 每页最大数量 200
|
||||||
|
*/
|
||||||
|
public static final int MAX_SIZE = 200;
|
||||||
|
/**
|
||||||
|
* 当前页
|
||||||
|
*/
|
||||||
|
@Schema(description = "当前页,默认1")
|
||||||
|
protected Integer current = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每页的数量
|
||||||
|
*/
|
||||||
|
@Schema(description = "每页的数量,默认10,超过200会修改为200")
|
||||||
|
protected Integer size = 10;
|
||||||
|
|
||||||
|
public void setSize(Integer size) {
|
||||||
|
if (size != null && size > MAX_SIZE) {
|
||||||
|
size = MAX_SIZE;
|
||||||
|
}
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package org.springblade.openapi.ocr.pojo.vo;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springblade.core.tool.utils.DateUtil;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2025/4/22
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Schema(description = "提供给ocr的项目信息")
|
||||||
|
public class Api4OCRProjectVO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 项目id
|
||||||
|
*/
|
||||||
|
@JsonSerialize(using = ToStringSerializer.class)
|
||||||
|
@Schema(description = "项目id")
|
||||||
|
private Long id;
|
||||||
|
/**
|
||||||
|
* 项目名称
|
||||||
|
*/
|
||||||
|
@Schema(description = "项目名称")
|
||||||
|
private String name;
|
||||||
|
/**
|
||||||
|
* 项目简称
|
||||||
|
*/
|
||||||
|
@Schema(description = "项目简称")
|
||||||
|
private String abbreviation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
|
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME)
|
||||||
|
@Schema(description = "创建时间")
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新时间
|
||||||
|
*/
|
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
|
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME)
|
||||||
|
@Schema(description = "更新时间")
|
||||||
|
private Date updateTime;
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
package org.springblade.openapi.ocr.pojo.vo;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer;
|
||||||
|
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springblade.core.tool.utils.DateUtil;
|
||||||
|
import org.springblade.openapi.ocr.pojo.vo.result.AttachmentType;
|
||||||
|
import org.springblade.openapi.ocr.pojo.vo.result.ErrorAttachmentType;
|
||||||
|
import org.springblade.openapi.ocr.pojo.vo.result.ErrorField;
|
||||||
|
import org.springblade.openapi.ocr.pojo.vo.result.TransportCertificateBatchDetailData;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2025/4/22
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Schema(description = "凭证ocr结果")
|
||||||
|
public class Api4OCRResultVO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
@JsonSerialize(using = ToStringSerializer.class, nullsUsing = NullSerializer.class)
|
||||||
|
@Schema(description = "主键")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 凭证号
|
||||||
|
*/
|
||||||
|
@Schema(description = "凭证号")
|
||||||
|
private String code;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 识别类型(batch 批量识别,mixed 单张识别合并)
|
||||||
|
*/
|
||||||
|
@Schema(description = "识别类型(batch 批量识别,mixed 单张识别合并)")
|
||||||
|
private String identifyType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否类型错误(1 否 2 是)
|
||||||
|
*/
|
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class)
|
||||||
|
@Schema(description = "是否类型错误(1 否 2 是)")
|
||||||
|
private Integer isTypeError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否数据错误(1 否 2 是)
|
||||||
|
*/
|
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class)
|
||||||
|
@Schema(description = "是否数据错误(1 否 2 是)")
|
||||||
|
private Integer isDataError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 附件类型列表
|
||||||
|
*/
|
||||||
|
@Schema(description = "附件类型列表")
|
||||||
|
private List<AttachmentType> attachmentTypeList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据
|
||||||
|
*/
|
||||||
|
@Schema(description = "数据")
|
||||||
|
private TransportCertificateBatchDetailData data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误类型列表
|
||||||
|
*/
|
||||||
|
@Schema(description = "错误类型列表")
|
||||||
|
private List<ErrorAttachmentType> errorTypeList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误字段列表
|
||||||
|
*/
|
||||||
|
@Schema(description = "错误字段列表")
|
||||||
|
private List<ErrorField> errorFieldList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误字段列表
|
||||||
|
*/
|
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
|
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME)
|
||||||
|
@Schema(description = "创建时间")
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新时间
|
||||||
|
*/
|
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
|
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME)
|
||||||
|
@Schema(description = "更新时间")
|
||||||
|
private Date updateTime;
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package org.springblade.openapi.ocr.pojo.vo.result;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 附件类型
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2025/4/18
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Schema(description = "附件类型")
|
||||||
|
public class AttachmentType implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 附件id
|
||||||
|
*/
|
||||||
|
@JsonSerialize(using = ToStringSerializer.class)
|
||||||
|
@Schema(description = "附件id")
|
||||||
|
private Long attachmentId;
|
||||||
|
/**
|
||||||
|
* ocr附件类型
|
||||||
|
*/
|
||||||
|
@Schema(description = "ocr附件类型")
|
||||||
|
private String ocrType;
|
||||||
|
/**
|
||||||
|
* 附件url
|
||||||
|
*/
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||||
|
@Schema(description = "附件url")
|
||||||
|
private String url;
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package org.springblade.openapi.ocr.pojo.vo.result;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误附件类型
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2025/4/21
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
@Schema(description = "错误附件类型")
|
||||||
|
public class ErrorAttachmentType extends AttachmentType {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* erp附件类型
|
||||||
|
*/
|
||||||
|
@Schema(description = "erp附件类型")
|
||||||
|
private String erpType;
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package org.springblade.openapi.ocr.pojo.vo.result;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误字段
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2025/4/21
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Schema(description = "错误字段")
|
||||||
|
public class ErrorField implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 字段名
|
||||||
|
*/
|
||||||
|
@Schema(description = "字段名")
|
||||||
|
private String filed;
|
||||||
|
/**
|
||||||
|
* ocr类型
|
||||||
|
*/
|
||||||
|
@Schema(description = "ocr类型")
|
||||||
|
private String ocrType;
|
||||||
|
/**
|
||||||
|
* ocr字段值
|
||||||
|
*/
|
||||||
|
@Schema(description = "ocr字段值")
|
||||||
|
private String ocrValue;
|
||||||
|
/**
|
||||||
|
* erp字段值
|
||||||
|
*/
|
||||||
|
@Schema(description = "erp字段值")
|
||||||
|
private String erpValue;
|
||||||
|
/**
|
||||||
|
* 附件列表
|
||||||
|
*/
|
||||||
|
@Schema(description = "附件列表")
|
||||||
|
private List<AttachmentType> attachmentList;
|
||||||
|
}
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
package org.springblade.openapi.ocr.pojo.vo.result;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springblade.core.tool.utils.DateUtil;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 车辆运输凭证批次明细表 实体类
|
||||||
|
*
|
||||||
|
* @author BladeX
|
||||||
|
* @since 2024-10-23
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Schema(description = "凭证数据对象")
|
||||||
|
public class TransportCertificateBatchDetailData implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 磅单车牌号
|
||||||
|
*/
|
||||||
|
@Schema(description = "磅单车牌号")
|
||||||
|
private String poundPlateNo;
|
||||||
|
/**
|
||||||
|
* 行驶证上的车牌号
|
||||||
|
*/
|
||||||
|
@Schema(description = "行驶证上的车牌号")
|
||||||
|
private String drivingPlateNo;
|
||||||
|
/**
|
||||||
|
* 车头车牌号
|
||||||
|
*/
|
||||||
|
@Schema(description = "车头车牌号")
|
||||||
|
private String carFrontPlateNo;
|
||||||
|
/**
|
||||||
|
* 到货日期
|
||||||
|
*/
|
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATE, timezone = "GMT+8")
|
||||||
|
@Schema(description = "到货日期")
|
||||||
|
private Date supplyMaterialDate;
|
||||||
|
/**
|
||||||
|
* 货物名称
|
||||||
|
*/
|
||||||
|
@Schema(description = "货物名称")
|
||||||
|
private String productName;
|
||||||
|
/**
|
||||||
|
* 规格料型
|
||||||
|
*/
|
||||||
|
@Schema(description = "规格料型")
|
||||||
|
private String specificationMaterial;
|
||||||
|
/**
|
||||||
|
* 毛重(吨)
|
||||||
|
*/
|
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class)
|
||||||
|
@Schema(description = "毛重(吨)")
|
||||||
|
private BigDecimal grossWeight;
|
||||||
|
/**
|
||||||
|
* 皮重(吨)
|
||||||
|
*/
|
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class)
|
||||||
|
@Schema(description = "皮重(吨)")
|
||||||
|
private BigDecimal skinWeight;
|
||||||
|
/**
|
||||||
|
* 净重(吨)
|
||||||
|
*/
|
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class)
|
||||||
|
@Schema(description = "净重(吨)")
|
||||||
|
private BigDecimal netWeight;
|
||||||
|
/**
|
||||||
|
* 扣杂(吨)
|
||||||
|
*/
|
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class)
|
||||||
|
@Schema(description = "扣杂(吨)")
|
||||||
|
private BigDecimal miscellaneousWeight;
|
||||||
|
/**
|
||||||
|
* 实收(吨)
|
||||||
|
*/
|
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class)
|
||||||
|
@Schema(description = "实收(吨)")
|
||||||
|
private BigDecimal realityWeight;
|
||||||
|
/**
|
||||||
|
* 驾驶证是否有效(1 否 2 是)
|
||||||
|
*/
|
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class)
|
||||||
|
@Schema(description = "驾驶证是否有效(1 否 2 是)")
|
||||||
|
private Integer isDriverLicenseValid;
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package org.springblade.openapi.track.api;
|
||||||
|
|
||||||
|
import org.springblade.openapi.track.pojo.dto.Api4TrackWaybillDTO;
|
||||||
|
import org.springblade.openapi.track.pojo.vo.Api4TrackResultVO;
|
||||||
|
import org.springblade.openapi.track.pojo.vo.Api4TrackWaybillVO;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2024/12/16
|
||||||
|
*/
|
||||||
|
public interface IApi4Track {
|
||||||
|
String API_PREFIX = "/openApi/gj";
|
||||||
|
String WAYBILL_LIST = API_PREFIX + "/mycode/zhcx/getZhcx";
|
||||||
|
String WAYBILL_TRACK_UPDATE = API_PREFIX + "/mycode/zhcx/callback";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 轨迹查询运单信息
|
||||||
|
*
|
||||||
|
* @param param@return
|
||||||
|
*/
|
||||||
|
@PostMapping(WAYBILL_LIST)
|
||||||
|
Api4TrackResultVO<List<Api4TrackWaybillVO>> queryWaybillList(@RequestBody Api4TrackWaybillDTO param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 轨迹更新运单轨迹url和状态
|
||||||
|
* @param waybillId
|
||||||
|
* @param trajectoryId
|
||||||
|
* @param trajectoryStatus
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping(WAYBILL_TRACK_UPDATE)
|
||||||
|
Api4TrackResultVO<Void> updateWaybillTrack(@RequestParam(name = "zhcxId", required = false) String waybillId,
|
||||||
|
@RequestParam(name = "diTuUrl", required = false) String trajectoryId,
|
||||||
|
@RequestParam(name = "guiJiZhuangTai", required = false) String trajectoryStatus);
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package org.springblade.openapi.track.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 轨迹常量
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2024/12/16
|
||||||
|
*/
|
||||||
|
public class TrackConstant {
|
||||||
|
/**
|
||||||
|
* 响应成功状态码
|
||||||
|
*/
|
||||||
|
public static final Integer SUCCESS_CODE = 200;
|
||||||
|
/**
|
||||||
|
* 响应失败状态码
|
||||||
|
*/
|
||||||
|
public static final Integer FAIL_CODE = 500;
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package org.springblade.openapi.track.pojo.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2024/12/16
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class Api4TrackWaybillDTO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 运单id列表
|
||||||
|
*/
|
||||||
|
private List<String> ids;
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package org.springblade.openapi.track.pojo.dto;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2024/12/16
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class Api4TrackWaybillUpdateDTO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 运单id
|
||||||
|
*/
|
||||||
|
@JsonProperty("zhcxId")
|
||||||
|
private String waybillId;
|
||||||
|
/**
|
||||||
|
* 轨迹id
|
||||||
|
*/
|
||||||
|
@JsonProperty("diTuUrl")
|
||||||
|
private String trajectoryId;
|
||||||
|
/**
|
||||||
|
* 轨迹状态
|
||||||
|
*/
|
||||||
|
@JsonProperty("guiJiZhuangTai")
|
||||||
|
private String trajectoryStatus;
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package org.springblade.openapi.track.pojo.vo;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.springblade.openapi.track.constant.TrackConstant;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2024/12/16
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Data
|
||||||
|
public class Api4TrackResultVO<T> implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 响应代码。200为正确
|
||||||
|
*/
|
||||||
|
private Integer state;
|
||||||
|
/**
|
||||||
|
* 对应的提示信息
|
||||||
|
*/
|
||||||
|
private String message;
|
||||||
|
/**
|
||||||
|
* 数据
|
||||||
|
*/
|
||||||
|
private T data;
|
||||||
|
|
||||||
|
public Api4TrackResultVO(Integer state, T data) {
|
||||||
|
this.state = state;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Api4TrackResultVO<T> success() {
|
||||||
|
return Api4TrackResultVO.success(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Api4TrackResultVO<T> fail(String message) {
|
||||||
|
return new Api4TrackResultVO<>(TrackConstant.FAIL_CODE, message, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Api4TrackResultVO<T> success(T data) {
|
||||||
|
return new Api4TrackResultVO<>(TrackConstant.SUCCESS_CODE, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
package org.springblade.openapi.track.pojo.vo;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springblade.core.tool.utils.DateUtil;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2024/12/16
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class Api4TrackWaybillVO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 运单id
|
||||||
|
*/
|
||||||
|
private String id;
|
||||||
|
/**
|
||||||
|
* 收货日期
|
||||||
|
*/
|
||||||
|
@DateTimeFormat(pattern = DateUtil.PATTERN_DATE)
|
||||||
|
@JsonFormat(pattern = DateUtil.PATTERN_DATE)
|
||||||
|
@JsonProperty("shouHuoRiQi")
|
||||||
|
private Date enterDate;
|
||||||
|
/**
|
||||||
|
* 车牌号
|
||||||
|
*/
|
||||||
|
@JsonProperty("chePaiHao")
|
||||||
|
private String plateNo;
|
||||||
|
/**
|
||||||
|
* 钢厂简称
|
||||||
|
*/
|
||||||
|
@JsonProperty("gangChangJianCheng")
|
||||||
|
private String customerAbbreviation;
|
||||||
|
/**
|
||||||
|
* 钢厂合同编号
|
||||||
|
*/
|
||||||
|
@JsonIgnore
|
||||||
|
private String contractGcCode;
|
||||||
|
|
||||||
|
//===========================设置默认值的参数==========================
|
||||||
|
/**
|
||||||
|
* 托运人
|
||||||
|
*/
|
||||||
|
@JsonProperty("tuoYunRen")
|
||||||
|
private String shipper = "托运人";
|
||||||
|
/**
|
||||||
|
* 收货人
|
||||||
|
*/
|
||||||
|
@JsonProperty("shouHuoRen")
|
||||||
|
private String consignee = "收货人";
|
||||||
|
/**
|
||||||
|
* 收货地址
|
||||||
|
*/
|
||||||
|
@JsonProperty("shouHuoDiZhi")
|
||||||
|
private String address = "收货地址";
|
||||||
|
/**
|
||||||
|
* 投送人
|
||||||
|
*/
|
||||||
|
@JsonProperty("touSongRen")
|
||||||
|
private String delivery = "投送人";
|
||||||
|
/**
|
||||||
|
* 货物名称
|
||||||
|
*/
|
||||||
|
@JsonProperty("huoWuMingCheng")
|
||||||
|
private String goodsName = "货物名称";
|
||||||
|
/**
|
||||||
|
* 重量
|
||||||
|
*/
|
||||||
|
@JsonProperty("zhongLiang")
|
||||||
|
private BigDecimal weight = BigDecimal.ZERO;
|
||||||
|
/**
|
||||||
|
* 事业部
|
||||||
|
*/
|
||||||
|
@JsonProperty("shiYeBu")
|
||||||
|
private String division = "事业部";
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package org.springblade.openapi.wps.api;
|
||||||
|
|
||||||
|
import org.springblade.openapi.wps.pojo.dto.Api4WpsFileInfoDTO;
|
||||||
|
import org.springblade.openapi.wps.pojo.vo.Api4WpsFileInfoVO;
|
||||||
|
import org.springframework.cloud.openfeign.SpringQueryMap;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestHeader;
|
||||||
|
import org.springframework.web.bind.annotation.RequestPart;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 给wps回调的api
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/10/30
|
||||||
|
*/
|
||||||
|
public interface IApi4Wps {
|
||||||
|
String API_PREFIX = "/openApi/wps";
|
||||||
|
String VERSION = "/v1";
|
||||||
|
String FILE_INFO = API_PREFIX + VERSION + "/3rd/file/info";
|
||||||
|
String FILE_SAVE = API_PREFIX + VERSION + "/3rd/file/save";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps回调查询文件信息
|
||||||
|
*
|
||||||
|
* @param fileId 文件id,必填
|
||||||
|
* @param token 非必填
|
||||||
|
* @param param 在获取预览链接时按需求传入的所有自定义参数
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@GetMapping(FILE_INFO)
|
||||||
|
Api4WpsFileInfoVO getFileInfo(@RequestHeader("X-Weboffice-File-Id") String fileId,
|
||||||
|
@RequestHeader(value = "X-Wps-Weboffice-Token", required = false) String token,
|
||||||
|
@SpringQueryMap Api4WpsFileInfoDTO param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps回调-上传文件新版本
|
||||||
|
*
|
||||||
|
* @param fileId 文件id,必填
|
||||||
|
* @param token 非必填
|
||||||
|
* @param param 在获取预览链接时按需求传入的所有自定义参数
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping(FILE_SAVE)
|
||||||
|
Api4WpsFileInfoVO getFileSave(@RequestHeader("X-Weboffice-File-Id") String fileId,
|
||||||
|
@RequestHeader(value = "X-Weboffice-Save-Type") String saveType,
|
||||||
|
@RequestHeader(value = "X-Wps-Weboffice-Token", required = false) String token,
|
||||||
|
@RequestPart("file") MultipartFile file,
|
||||||
|
@SpringQueryMap Api4WpsFileInfoDTO param);
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package org.springblade.openapi.wps.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps常量类
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/10/30
|
||||||
|
*/
|
||||||
|
public class WpsConstant {
|
||||||
|
/**
|
||||||
|
* 是
|
||||||
|
*/
|
||||||
|
public static final Integer YES = 1;
|
||||||
|
/**
|
||||||
|
* 否
|
||||||
|
*/
|
||||||
|
public static final Integer NO = 0;
|
||||||
|
/**
|
||||||
|
* 文件信息查询默认缓存时间 120 秒
|
||||||
|
*/
|
||||||
|
public static final String FILE_INFO_DEFAULT_CACHE_TIME = "120";
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package org.springblade.openapi.wps.pojo.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps文件信息查询参数
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/10/30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class Api4WpsFileInfoDTO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package org.springblade.openapi.wps.pojo.enums;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps 回调接口错误枚举
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2024/11/26
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Getter
|
||||||
|
public enum Api4WpsError {
|
||||||
|
/**
|
||||||
|
* 服务处理正常
|
||||||
|
*/
|
||||||
|
OK(0, "OK"),
|
||||||
|
/**
|
||||||
|
* token过期
|
||||||
|
*/
|
||||||
|
SESSION_EXPIRED(40002, "SessionExpired"),
|
||||||
|
/**
|
||||||
|
* 用户无权限访问
|
||||||
|
*/
|
||||||
|
PERMISSION_DENIED(40003, "PermissionDenied"),
|
||||||
|
/**
|
||||||
|
* 资源不存在
|
||||||
|
*/
|
||||||
|
NOT_EXISTS(40004, "NotExists"),
|
||||||
|
/**
|
||||||
|
* 参数错误
|
||||||
|
*/
|
||||||
|
INVALID_ARGUMENT(40005, "InvalidArgument"),
|
||||||
|
/**
|
||||||
|
* 保存空间已满
|
||||||
|
*/
|
||||||
|
SPACE_FULL(40006, "SpaceFull"),
|
||||||
|
/**
|
||||||
|
* 自定义错误提示,前端页面将显示此错误内容,在回调错误响应中的hint字段中自定义错误提示,该错误提示不支持多语言
|
||||||
|
*/
|
||||||
|
CUSTOM_MSG(40007, "CustomMsg"),
|
||||||
|
/**
|
||||||
|
* 文件重命名冲突
|
||||||
|
*/
|
||||||
|
FNAME_CONFLICT(40008, "FnameConflict"),
|
||||||
|
/**
|
||||||
|
* 对接系统错误
|
||||||
|
*/
|
||||||
|
SERVER_ERROR(50001, "ServerError"),
|
||||||
|
;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误码
|
||||||
|
*/
|
||||||
|
private final Integer code;
|
||||||
|
/**
|
||||||
|
* 信息
|
||||||
|
*/
|
||||||
|
private final String message;
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package org.springblade.openapi.wps.pojo.vo;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps附加参数
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/10/30
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Data
|
||||||
|
public class Api4WpsAttrsVO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 单位秒,取值范围为1-300,超过300秒不会缓存回调信息,此字段需服务端全局配置开启缓存,且需要使用token访问预览链接,非必填
|
||||||
|
*/
|
||||||
|
@JsonProperty("cachetime")
|
||||||
|
private String cacheTime;
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package org.springblade.openapi.wps.pojo.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps回调接口错误
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2024/11/26
|
||||||
|
*/
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Data
|
||||||
|
public class Api4WpsErrorVO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 错误码
|
||||||
|
*/
|
||||||
|
private Integer code;
|
||||||
|
/**
|
||||||
|
* 错误提示
|
||||||
|
*/
|
||||||
|
private String message;
|
||||||
|
/**
|
||||||
|
* 错误提示详细信息
|
||||||
|
*/
|
||||||
|
private String details;
|
||||||
|
/**
|
||||||
|
* 自定义错误信息,当code为40007错误码时必填
|
||||||
|
*/
|
||||||
|
private String hint;
|
||||||
|
|
||||||
|
public Api4WpsErrorVO(Integer code, String message, String hint) {
|
||||||
|
this.code = code;
|
||||||
|
this.message = message;
|
||||||
|
this.hint = hint;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package org.springblade.openapi.wps.pojo.vo;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps文件信息查询结果
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/10/30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class Api4WpsFileInfoVO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 文件信息,必填
|
||||||
|
*/
|
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class)
|
||||||
|
private Api4WpsFileVO file;
|
||||||
|
/**
|
||||||
|
* 用户信息,必填
|
||||||
|
*/
|
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class)
|
||||||
|
private Api4WpsUserVO user;
|
||||||
|
/**
|
||||||
|
* 附加参数,v6.0.2209.20220920新增
|
||||||
|
*/
|
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class)
|
||||||
|
private Api4WpsAttrsVO attrs;
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
package org.springblade.openapi.wps.pojo.vo;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
import com.fasterxml.jackson.databind.ser.std.NullSerializer;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps文件结果
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/10/30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class Api4WpsFileVO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 文件id,字符串长度不超过64位,必填
|
||||||
|
*/
|
||||||
|
private String id;
|
||||||
|
/**
|
||||||
|
* 文件名必须带后缀,必填
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
/**
|
||||||
|
* 文档版本号,从1开始累加,位数小于11,必填
|
||||||
|
*/
|
||||||
|
private Integer version = 1;
|
||||||
|
/**
|
||||||
|
* 文档大小,单位为字节;此处需传文件真实大小,否则会出现异常,必填
|
||||||
|
*/
|
||||||
|
private Integer size;
|
||||||
|
/**
|
||||||
|
* readonly默认为false
|
||||||
|
* true开启表格筛选,支持对EXCEL表格文档筛选,但不支持对EXCEL表格文档开启多人同步筛选,该预览特性见常见问题
|
||||||
|
* false关闭表格筛选(20220707新增),非必填
|
||||||
|
*/
|
||||||
|
private Boolean readonly = true;
|
||||||
|
/**
|
||||||
|
* 创建者id,字符串长度不超过32位。与user里的id一致,必填
|
||||||
|
*/
|
||||||
|
private String creator;
|
||||||
|
/**
|
||||||
|
* 创建时间,时间戳,单位为秒,必填
|
||||||
|
*/
|
||||||
|
@JsonProperty("create_time")
|
||||||
|
private Integer createTime;
|
||||||
|
/**
|
||||||
|
* 修改者id,字符串长度不超过32位,必填
|
||||||
|
*/
|
||||||
|
private String modifier;
|
||||||
|
/**
|
||||||
|
* 最近修改时间,时间戳,单位为秒,必填
|
||||||
|
*/
|
||||||
|
@JsonProperty("modify_time")
|
||||||
|
private Integer modifyTime;
|
||||||
|
/**
|
||||||
|
* 文档下载地址,必填
|
||||||
|
*/
|
||||||
|
@JsonProperty("download_url")
|
||||||
|
private String downloadUrl;
|
||||||
|
/**
|
||||||
|
* 普通预览模式下可限制预览页数(不超过5000)
|
||||||
|
* previewPages 默认值为 0,不限制预览页数;
|
||||||
|
* previewPages >= 1 时,限制生效,限制的页数为 previewpages 字段的值,必填
|
||||||
|
*/
|
||||||
|
@JsonProperty("preview_pages")
|
||||||
|
private Integer previewPages = 0;
|
||||||
|
/**
|
||||||
|
* 用户权限,非必填
|
||||||
|
*/
|
||||||
|
@JsonProperty("user_acl")
|
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class)
|
||||||
|
private Api4WpsUserAclVO userAcl;
|
||||||
|
/**
|
||||||
|
* 水印参数,非必填
|
||||||
|
*/
|
||||||
|
@JsonSerialize(nullsUsing = NullSerializer.class)
|
||||||
|
private Api4WpsWatermarkVO watermark;
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package org.springblade.openapi.wps.pojo.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps用户权限
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/10/30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class Api4WpsUserAclVO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 重命名权限,1为打开该权限,0为关闭该权限,默认为0,非必填
|
||||||
|
*/
|
||||||
|
private Integer rename;
|
||||||
|
/**
|
||||||
|
* 历史文件打开权限,1为打开该权限,0为关闭该权限,默认为1,非必填
|
||||||
|
*/
|
||||||
|
private Integer history;
|
||||||
|
/**
|
||||||
|
* 复制权限,1为打开该权限,0为关闭该权限,默认为1,非必填
|
||||||
|
*/
|
||||||
|
private Integer copy;
|
||||||
|
/**
|
||||||
|
* 导出权限,1为打开该权限,0为关闭该权限,默认为1,非必填
|
||||||
|
*/
|
||||||
|
private Integer export;
|
||||||
|
/**
|
||||||
|
* 打印权限,1为打开该权限,0为关闭该权限,默认为1,非必填
|
||||||
|
*/
|
||||||
|
private Integer print;
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package org.springblade.openapi.wps.pojo.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps用户信息
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/10/30
|
||||||
|
*/
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Data
|
||||||
|
public class Api4WpsUserVO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 用户id,长度不超过32位,与creator、modifier一致,必填
|
||||||
|
*/
|
||||||
|
private String id;
|
||||||
|
/**
|
||||||
|
* 用户名称,必填
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
/**
|
||||||
|
* 用户操作权限,预览固定为read,必填
|
||||||
|
*/
|
||||||
|
private String permission = "write";
|
||||||
|
|
||||||
|
public Api4WpsUserVO(String id, String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
package org.springblade.openapi.wps.pojo.vo;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps水印参数
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/10/30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class Api4WpsWatermarkVO implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 水印类型, 0为无水印; 1为文字水印,非必填
|
||||||
|
*/
|
||||||
|
private Integer type;
|
||||||
|
/**
|
||||||
|
* 文字水印的文字,支持通过\r\n换行,支持emoji表情
|
||||||
|
* 当type为1时此字段必选
|
||||||
|
*/
|
||||||
|
private String value;
|
||||||
|
/**
|
||||||
|
* 水印的颜色(含透明度),非必选,有默认值。格式为:rgba( 192, 192, 192, 0.6 )
|
||||||
|
*/
|
||||||
|
@JsonProperty("fillstyle")
|
||||||
|
private String fillStyle;
|
||||||
|
/**
|
||||||
|
* 水印的字体,非必选,有默认值,格式为bold 20px Serif,非必填
|
||||||
|
*/
|
||||||
|
private String font;
|
||||||
|
/**
|
||||||
|
* 水印的旋转度(弧度),非必选,有默认值,默认为-0.7853982,非必填
|
||||||
|
*/
|
||||||
|
private Float rotate;
|
||||||
|
/**
|
||||||
|
* 水印水平间距,非必选,有默认值,默认为50,非必填
|
||||||
|
*/
|
||||||
|
private Integer horizontal;
|
||||||
|
/**
|
||||||
|
* 水印垂直间距,非必选,有默认值,默认为100,非必填
|
||||||
|
*/
|
||||||
|
private Integer vertical;
|
||||||
|
}
|
||||||
@@ -24,6 +24,7 @@
|
|||||||
<module>blade-user-api</module>
|
<module>blade-user-api</module>
|
||||||
<module>blade-record-api</module>
|
<module>blade-record-api</module>
|
||||||
<module>blade-file-api</module>
|
<module>blade-file-api</module>
|
||||||
|
<module>blade-open-api</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|||||||
@@ -0,0 +1,138 @@
|
|||||||
|
/**
|
||||||
|
* BladeX Commercial License Agreement
|
||||||
|
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
|
||||||
|
* <p>
|
||||||
|
* Use of this software is governed by the Commercial License Agreement
|
||||||
|
* obtained after purchasing a license from BladeX.
|
||||||
|
* <p>
|
||||||
|
* 1. This software is for development use only under a valid license
|
||||||
|
* from BladeX.
|
||||||
|
* <p>
|
||||||
|
* 2. Redistribution of this software's source code to any third party
|
||||||
|
* without a commercial license is strictly prohibited.
|
||||||
|
* <p>
|
||||||
|
* 3. Licensees may copyright their own code but cannot use segments
|
||||||
|
* from this software for such purposes. Copyright of this software
|
||||||
|
* remains with BladeX.
|
||||||
|
* <p>
|
||||||
|
* Using this software signifies agreement to this License, and the software
|
||||||
|
* must not be used for illegal purposes.
|
||||||
|
* <p>
|
||||||
|
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
|
||||||
|
* not liable for any claims arising from secondary or illegal development.
|
||||||
|
* <p>
|
||||||
|
* Author: Chill Zhuang (bladejava@qq.com)
|
||||||
|
*/
|
||||||
|
package org.springblade.file.controller;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.springblade.core.boot.ctrl.BladeController;
|
||||||
|
import org.springblade.core.mp.support.Condition;
|
||||||
|
import org.springblade.core.mp.support.Query;
|
||||||
|
import org.springblade.core.secure.annotation.IsAdmin;
|
||||||
|
import org.springblade.core.tenant.annotation.NonDS;
|
||||||
|
import org.springblade.core.tool.api.R;
|
||||||
|
import org.springblade.core.tool.utils.Func;
|
||||||
|
import org.springblade.file.pojo.entity.Attachment;
|
||||||
|
import org.springblade.file.service.IAttachmentService;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 附件表 控制器
|
||||||
|
*
|
||||||
|
* @author Chill
|
||||||
|
*/
|
||||||
|
@NonDS
|
||||||
|
@RestController
|
||||||
|
@AllArgsConstructor
|
||||||
|
//@IsAdmin
|
||||||
|
@RequestMapping("/attachment")
|
||||||
|
@Tag(name = "附件", description = "附件")
|
||||||
|
public class AttachmentController extends BladeController {
|
||||||
|
|
||||||
|
private final IAttachmentService attachmentService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 详情
|
||||||
|
*/
|
||||||
|
@GetMapping("/detail")
|
||||||
|
@ApiOperationSupport(order = 1)
|
||||||
|
@Operation(summary = "详情", description = "传入attach")
|
||||||
|
public R<Attachment> detail(Attachment attach) {
|
||||||
|
Attachment detail = attachmentService.getOne(Condition.getQueryWrapper(attach));
|
||||||
|
return R.data(detail);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页 附件表
|
||||||
|
*/
|
||||||
|
@GetMapping("/list")
|
||||||
|
@ApiOperationSupport(order = 2)
|
||||||
|
@Operation(summary = "分页", description = "传入attach")
|
||||||
|
public R<IPage<Attachment>> list(Attachment attach, Query query) {
|
||||||
|
attach.setSize(null);
|
||||||
|
query.setDescs("create_time");
|
||||||
|
IPage<Attachment> pages = attachmentService.page(Condition.getPage(query), Condition.getQueryWrapper(attach));
|
||||||
|
return R.data(pages);
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * 自定义分页 附件表
|
||||||
|
// */
|
||||||
|
// @GetMapping("/page")
|
||||||
|
// @ApiOperationSupport(order = 3)
|
||||||
|
// @Operation(summary = "分页", description = "传入attach")
|
||||||
|
// public R<IPage<Attachment>> page(Attachment attach, Query query) {
|
||||||
|
// IPage<Attachment> pages = attachmentService.selectAttachPage(Condition.getPage(query), attach);
|
||||||
|
// return R.data(pages);
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增 附件表
|
||||||
|
*/
|
||||||
|
@PostMapping("/save")
|
||||||
|
@ApiOperationSupport(order = 4)
|
||||||
|
@Operation(summary = "新增", description = "传入attach")
|
||||||
|
public R save(@Valid @RequestBody Attachment attach) {
|
||||||
|
return R.status(attachmentService.save(attach));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改 附件表
|
||||||
|
*/
|
||||||
|
@PostMapping("/update")
|
||||||
|
@ApiOperationSupport(order = 5)
|
||||||
|
@Operation(summary = "修改", description = "传入attach")
|
||||||
|
public R update(@Valid @RequestBody Attachment attach) {
|
||||||
|
return R.status(attachmentService.updateById(attach));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增或修改 附件表
|
||||||
|
*/
|
||||||
|
@PostMapping("/submit")
|
||||||
|
@ApiOperationSupport(order = 6)
|
||||||
|
@Operation(summary = "新增或修改", description = "传入attach")
|
||||||
|
public R submit(@Valid @RequestBody Attachment attach) {
|
||||||
|
return R.status(attachmentService.saveOrUpdate(attach));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除 附件表
|
||||||
|
*/
|
||||||
|
@PostMapping("/remove")
|
||||||
|
@ApiOperationSupport(order = 7)
|
||||||
|
@Operation(summary = "逻辑删除", description = "传入ids")
|
||||||
|
public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
|
||||||
|
return R.status(attachmentService.removeByIds(Func.toLongList(ids)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
19
blade-service/blade-openapi/Dockerfile
Normal file
19
blade-service/blade-openapi/Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
FROM bladex/alpine-java:openjdk17_cn_slim
|
||||||
|
ARG ACTIVE
|
||||||
|
|
||||||
|
LABEL maintainer="bladejava@qq.com"
|
||||||
|
|
||||||
|
# 设置时区为上海
|
||||||
|
ENV TZ=Asia/Shanghai
|
||||||
|
# 设置时区信息
|
||||||
|
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||||
|
|
||||||
|
COPY ./target/blade-openapi.jar /opt/app.jar
|
||||||
|
|
||||||
|
WORKDIR /opt
|
||||||
|
|
||||||
|
EXPOSE 8108
|
||||||
|
|
||||||
|
ENTRYPOINT ["java", "--add-opens", "java.base/java.lang=ALL-UNNAMED", "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", "-Djava.security.egd=file:/dev/./urandom", "-XX:+HeapDumpOnOutOfMemoryError", "-XX:HeapDumpPath=/opt/logs", "-XX:ErrorFile=/opt/logs/hs_err_pid%p.log", "-Xlog:gc*:file=/opt/logs/gc.log:time,uptime,level,tags:filecount=5,filesize=50M", "-XX:MaxDirectMemorySize=512m", "-Xms1024m", "-Xmx4096m", "-jar", "app.jar"]
|
||||||
|
|
||||||
|
CMD ["--spring.profiles.active=${ACTIVE}","--logging.path=/opt/logs"]
|
||||||
17
blade-service/blade-openapi/Dockerfile-rt
Normal file
17
blade-service/blade-openapi/Dockerfile-rt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#FROM 10.38.16.129/bladex/alpine-java:openjdk17_cn_slim
|
||||||
|
#FROM registry.cn-hangzhou.aliyuncs.com/vic_person/alpine-java:openjdk17_cn_slim
|
||||||
|
FROM 10.38.16.129:80/bladex/alpine-java:openjdk17_cn_slim
|
||||||
|
ARG ACTIVE
|
||||||
|
|
||||||
|
LABEL maintainer="bladejava@qq.com"
|
||||||
|
|
||||||
|
# 设置时区为上海
|
||||||
|
ENV TZ=Asia/Shanghai
|
||||||
|
# 设置时区信息
|
||||||
|
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||||
|
|
||||||
|
COPY ./target/*.jar /opt/app.jar
|
||||||
|
|
||||||
|
ENTRYPOINT ["java", "--add-opens", "java.base/java.lang=ALL-UNNAMED", "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/opt/app.jar"]
|
||||||
|
|
||||||
|
CMD ["--spring.profiles.active=${ACTIVE}"]
|
||||||
19
blade-service/blade-openapi/Dockerfile-zh-dev
Normal file
19
blade-service/blade-openapi/Dockerfile-zh-dev
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
FROM bladex/alpine-java:openjdk17_cn_slim
|
||||||
|
ARG ACTIVE
|
||||||
|
|
||||||
|
LABEL maintainer="bladejava@qq.com"
|
||||||
|
|
||||||
|
# 设置时区为上海
|
||||||
|
ENV TZ=Asia/Shanghai
|
||||||
|
# 设置时区信息
|
||||||
|
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||||
|
|
||||||
|
COPY ./target/blade-openapi.jar /opt/app.jar
|
||||||
|
|
||||||
|
WORKDIR /opt
|
||||||
|
|
||||||
|
EXPOSE 8108
|
||||||
|
|
||||||
|
ENTRYPOINT ["java", "--add-opens", "java.base/java.lang=ALL-UNNAMED", "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", "-Djava.security.egd=file:/dev/./urandom", "-XX:+HeapDumpOnOutOfMemoryError", "-XX:HeapDumpPath=/opt/logs", "-XX:ErrorFile=/opt/logs/hs_err_pid%p.log", "-Xlog:gc*:file=/opt/logs/gc.log:time,uptime,level,tags:filecount=5,filesize=50M", "-XX:MaxDirectMemorySize=512m", "-Xms1024m", "-Xmx1024m", "-jar", "app.jar"]
|
||||||
|
|
||||||
|
CMD ["--spring.profiles.active=${ACTIVE}","--logging.path=/opt/logs"]
|
||||||
98
blade-service/blade-openapi/pom.xml
Normal file
98
blade-service/blade-openapi/pom.xml
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<artifactId>blade-service</artifactId>
|
||||||
|
<groupId>org.springblade</groupId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>blade-openapi</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<!-- 其他依赖版本 -->
|
||||||
|
<lombok.version>1.18.30</lombok.version>
|
||||||
|
<org.mapstruct.version>1.5.5.Final</org.mapstruct.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springblade</groupId>
|
||||||
|
<artifactId>blade-core-boot</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springblade</groupId>
|
||||||
|
<artifactId>blade-starter-swagger</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springblade</groupId>
|
||||||
|
<artifactId>blade-starter-threadpool</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springblade</groupId>
|
||||||
|
<artifactId>blade-open-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springblade</groupId>
|
||||||
|
<artifactId>blade-file-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springblade</groupId>
|
||||||
|
<artifactId>blade-mk-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mapstruct</groupId>
|
||||||
|
<artifactId>mapstruct</artifactId>
|
||||||
|
<version>${org.mapstruct.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>io.fabric8</groupId>
|
||||||
|
<artifactId>docker-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<skip>${docker.fabric.skip}</skip>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${maven.plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<source>${java.version}</source>
|
||||||
|
<target>${java.version}</target>
|
||||||
|
<encoding>UTF-8</encoding>
|
||||||
|
<compilerArgs>
|
||||||
|
<arg>-parameters</arg>
|
||||||
|
</compilerArgs>
|
||||||
|
<annotationProcessorPaths>
|
||||||
|
<path>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>${lombok.version}</version>
|
||||||
|
</path>
|
||||||
|
<path>
|
||||||
|
<groupId>org.mapstruct</groupId>
|
||||||
|
<artifactId>mapstruct-processor</artifactId>
|
||||||
|
<version>${org.mapstruct.version}</version>
|
||||||
|
</path>
|
||||||
|
<!-- other annotation processors -->
|
||||||
|
</annotationProcessorPaths>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
/**
|
||||||
|
* BladeX Commercial License Agreement
|
||||||
|
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
|
||||||
|
* <p>
|
||||||
|
* Use of this software is governed by the Commercial License Agreement
|
||||||
|
* obtained after purchasing a license from BladeX.
|
||||||
|
* <p>
|
||||||
|
* 1. This software is for development use only under a valid license
|
||||||
|
* from BladeX.
|
||||||
|
* <p>
|
||||||
|
* 2. Redistribution of this software's source code to any third party
|
||||||
|
* without a commercial license is strictly prohibited.
|
||||||
|
* <p>
|
||||||
|
* 3. Licensees may copyright their own code but cannot use segments
|
||||||
|
* from this software for such purposes. Copyright of this software
|
||||||
|
* remains with BladeX.
|
||||||
|
* <p>
|
||||||
|
* Using this software signifies agreement to this License, and the software
|
||||||
|
* must not be used for illegal purposes.
|
||||||
|
* <p>
|
||||||
|
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
|
||||||
|
* not liable for any claims arising from secondary or illegal development.
|
||||||
|
* <p>
|
||||||
|
* Author: Chill Zhuang (bladejava@qq.com)
|
||||||
|
*/
|
||||||
|
package org.springblade.openapi;
|
||||||
|
|
||||||
|
|
||||||
|
import org.dromara.dynamictp.core.spring.EnableDynamicTp;
|
||||||
|
import org.springblade.core.cloud.client.BladeCloudApplication;
|
||||||
|
import org.springblade.core.launch.BladeApplication;
|
||||||
|
import org.springblade.core.launch.constant.AppConstant;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Desk启动器
|
||||||
|
*
|
||||||
|
* @author Chill
|
||||||
|
*/
|
||||||
|
@EnableDynamicTp
|
||||||
|
@BladeCloudApplication
|
||||||
|
@ComponentScan({"org.springblade.openapi", "org.springblade.**.feign"})
|
||||||
|
public class OpenApiApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
BladeApplication.run(AppConstant.APPLICATION_OPENAPI_NAME, OpenApiApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package org.springblade.openapi.resultcode;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.springblade.core.tool.api.IResultCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 业务自定义返回码
|
||||||
|
* 定义规则:
|
||||||
|
* 统一格式:[2位服务码][2位模块码][2位功能码][3位错误码]
|
||||||
|
* <p>
|
||||||
|
* xx xx xx xx
|
||||||
|
* |__服务码 |__模块 |__功能 |___错误码
|
||||||
|
* 业务自定义返回码
|
||||||
|
* * 定义规则:
|
||||||
|
* * 统一格式:[2位服务码][2位模块码][2位功能码][3位错误码]
|
||||||
|
* * <p>
|
||||||
|
* * xx xx xx xx
|
||||||
|
* * |__服务码 |__模块 |__功能 |___错误码
|
||||||
|
* *
|
||||||
|
服务码:
|
||||||
|
|
||||||
|
业务基础服务 10
|
||||||
|
订单服务 20
|
||||||
|
仓储服务 30
|
||||||
|
首页/通告服务 40
|
||||||
|
系统管理服务 50
|
||||||
|
开放接口服务 60
|
||||||
|
* @author vic
|
||||||
|
* @date 2024/9/12 2:09 PM
|
||||||
|
* @description OrderResultCode
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum OpenApiResultCode implements IResultCode {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
/**
|
||||||
|
* code编码
|
||||||
|
*/
|
||||||
|
final int code;
|
||||||
|
/**
|
||||||
|
* 中文信息描述
|
||||||
|
*/
|
||||||
|
final String message;
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
package org.springblade.openapi.wps;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import io.swagger.v3.oas.annotations.Hidden;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springblade.common.utils.ObsUtil;
|
||||||
|
import org.springblade.core.tool.api.R;
|
||||||
|
import org.springblade.core.tool.utils.Func;
|
||||||
|
import org.springblade.file.feign.IFileClient;
|
||||||
|
import org.springblade.file.pojo.vo.AttachmentDetailVO;
|
||||||
|
import org.springblade.openapi.wps.convert.WpsFileConvert;
|
||||||
|
import org.springblade.openapi.wps.api.IApi4Wps;
|
||||||
|
import org.springblade.openapi.wps.constant.WpsConstant;
|
||||||
|
import org.springblade.openapi.wps.exception.Api4WpsException;
|
||||||
|
import org.springblade.openapi.wps.pojo.dto.Api4WpsFileInfoDTO;
|
||||||
|
import org.springblade.openapi.wps.pojo.enums.Api4WpsError;
|
||||||
|
import org.springblade.openapi.wps.util.TokenUtils;
|
||||||
|
import org.springblade.openapi.wps.pojo.vo.*;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/10/30
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Hidden
|
||||||
|
@AllArgsConstructor
|
||||||
|
@RestController
|
||||||
|
public class Api4Wps implements IApi4Wps {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图片扩展名列表
|
||||||
|
*/
|
||||||
|
private static final List<String> IMAGE_EXT = List.of("bmp", "jpeg", "jpg", "png", "gif");
|
||||||
|
|
||||||
|
private final IFileClient fileClient;
|
||||||
|
private final WpsFileConvert convert;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Api4WpsFileInfoVO getFileInfo(String fileId, String token, Api4WpsFileInfoDTO param) {
|
||||||
|
log.info("wps回调查询文件信息 参数 fileId:{} token:{} param:{}", fileId, token, JSON.toJSONString(param));
|
||||||
|
long id = Func.toLong(fileId);
|
||||||
|
if (id <= 0L) {
|
||||||
|
throw new Api4WpsException(Api4WpsError.NOT_EXISTS);
|
||||||
|
}
|
||||||
|
if (token == null) {
|
||||||
|
throw new Api4WpsException(Api4WpsError.PERMISSION_DENIED);
|
||||||
|
}
|
||||||
|
R<AttachmentDetailVO> result = fileClient.getAttachmentDetail(id);
|
||||||
|
if (result == null || !result.isSuccess() || result.getData() == null || result.getData().getId() == null) {
|
||||||
|
log.warn("wps回调查询文件信息 查询附件失败 :{}", JSON.toJSONString(result));
|
||||||
|
throw new Api4WpsException(Api4WpsError.NOT_EXISTS);
|
||||||
|
}
|
||||||
|
// 附件
|
||||||
|
AttachmentDetailVO attachment = result.getData();
|
||||||
|
Api4WpsFileVO fileVO = convert.attachment2file(attachment);
|
||||||
|
// 用户信息
|
||||||
|
Api4WpsUserVO user = TokenUtils.getWpsUser(token);
|
||||||
|
if (user == null) {
|
||||||
|
// 用户信息为空,token过期了
|
||||||
|
throw new Api4WpsException(Api4WpsError.SESSION_EXPIRED);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用户不为空,添加水印
|
||||||
|
boolean isImage = isImage(attachment.getAttachmentName());
|
||||||
|
log.info("附件名:{} 是否图片:{}", attachment.getAttachmentName(), isImage);
|
||||||
|
if (!isImage) {
|
||||||
|
// 不是图片才加水印
|
||||||
|
Api4WpsWatermarkVO watermark = new Api4WpsWatermarkVO();
|
||||||
|
watermark.setType(WpsConstant.YES);
|
||||||
|
watermark.setValue(user.getName());
|
||||||
|
watermark.setHorizontal(100);
|
||||||
|
watermark.setVertical(200);
|
||||||
|
fileVO.setWatermark(watermark);
|
||||||
|
}
|
||||||
|
Api4WpsFileInfoVO fileInfoVO = new Api4WpsFileInfoVO();
|
||||||
|
fileInfoVO.setUser(user);
|
||||||
|
fileInfoVO.setFile(fileVO);
|
||||||
|
// 缓存时间
|
||||||
|
fileInfoVO.setAttrs(new Api4WpsAttrsVO(WpsConstant.FILE_INFO_DEFAULT_CACHE_TIME));
|
||||||
|
log.info("wps回调查询文件信息 返回结果:{}", JSON.toJSONString(fileInfoVO));
|
||||||
|
return fileInfoVO;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Api4WpsFileInfoVO getFileSave(String fileId, String saveType, String token, MultipartFile file, Api4WpsFileInfoDTO param) {
|
||||||
|
try {
|
||||||
|
log.info("wps回调-上传文件新版本 参数 fileId:{} token:{} param:{}", fileId, token, JSON.toJSONString(param));
|
||||||
|
long id = Func.toLong(fileId);
|
||||||
|
if (id == 0L) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
R<AttachmentDetailVO> result = fileClient.getAttachmentDetail(id);
|
||||||
|
if (result == null || !result.isSuccess()) {
|
||||||
|
log.warn("wps回调-上传文件新版本 查询附件失败 :{}", JSON.toJSONString(result));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// 附件
|
||||||
|
AttachmentDetailVO attachment = result.getData();
|
||||||
|
Api4WpsFileVO fileVO = convert.attachment2file(attachment);
|
||||||
|
fileVO.setVersion(2);
|
||||||
|
ObsUtil.putObject(attachment.getObjectKey(), file.getInputStream());
|
||||||
|
|
||||||
|
Api4WpsFileInfoVO fileInfoVO = new Api4WpsFileInfoVO();
|
||||||
|
fileInfoVO.setFile(fileVO);
|
||||||
|
|
||||||
|
return fileInfoVO;
|
||||||
|
}catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否图片类型
|
||||||
|
* @param fileName
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isImage(String fileName) {
|
||||||
|
if (fileName == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int index = fileName.lastIndexOf(".");
|
||||||
|
if (index < 0 || index +1 >= fileName.length() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
String extName = fileName.substring(index + 1).toLowerCase(Locale.getDefault());
|
||||||
|
return IMAGE_EXT.contains(extName);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package org.springblade.openapi.wps.convert;
|
||||||
|
|
||||||
|
import org.mapstruct.*;
|
||||||
|
import org.springblade.openapi.wps.pojo.vo.Api4WpsFileVO;
|
||||||
|
import org.springblade.file.pojo.vo.AttachmentDetailVO;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/10/30
|
||||||
|
*/
|
||||||
|
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
|
||||||
|
public interface WpsFileConvert {
|
||||||
|
|
||||||
|
@Mapping(source = "attachmentName", target = "name")
|
||||||
|
@Mapping(source = "url", target = "downloadUrl")
|
||||||
|
@Mapping(source = "size", target = "size", qualifiedByName = "long2int")
|
||||||
|
@Mapping(source = "createUser", target = "creator")
|
||||||
|
@Mapping(source = "createTime", target = "createTime", qualifiedByName = "date2int")
|
||||||
|
@Mapping(source = "updateUser", target = "modifier")
|
||||||
|
@Mapping(source = "updateTime", target = "modifyTime", qualifiedByName = "date2int")
|
||||||
|
Api4WpsFileVO attachment2file(AttachmentDetailVO attachment);
|
||||||
|
|
||||||
|
@Named("date2int")
|
||||||
|
default Integer date2int(Date date) {
|
||||||
|
if (date == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return Math.toIntExact(date.getTime() / 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Named("long2int")
|
||||||
|
default Integer long2int(long size) {
|
||||||
|
return Math.toIntExact(size);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package org.springblade.openapi.wps.exception;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.springblade.openapi.wps.pojo.enums.Api4WpsError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps回调接口异常
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2024/11/26
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
public class Api4WpsException extends RuntimeException {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误枚举
|
||||||
|
*/
|
||||||
|
private final Api4WpsError error;
|
||||||
|
/**
|
||||||
|
* 消息
|
||||||
|
*/
|
||||||
|
private final String message;
|
||||||
|
|
||||||
|
public Api4WpsException(Api4WpsError error) {
|
||||||
|
super(error.getMessage());
|
||||||
|
this.error = error;
|
||||||
|
this.message = error.getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Api4WpsException(Api4WpsError error, String message) {
|
||||||
|
super(message);
|
||||||
|
this.error = error;
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package org.springblade.openapi.wps.exception;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springblade.openapi.wps.pojo.enums.Api4WpsError;
|
||||||
|
import org.springblade.openapi.wps.pojo.vo.Api4WpsErrorVO;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||||
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps 回调接口异常处理
|
||||||
|
* @author bfhuange
|
||||||
|
* @since 2024/11/26
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@RestControllerAdvice
|
||||||
|
public class Api4WpsExceptionHandler {
|
||||||
|
|
||||||
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
|
@ExceptionHandler(Api4WpsException.class)
|
||||||
|
public Api4WpsErrorVO handleException(Api4WpsException exception) {
|
||||||
|
log.error("wps 回调接口异常:{}", exception.getMessage(), exception);
|
||||||
|
Api4WpsError error = exception.getError();
|
||||||
|
return new Api4WpsErrorVO(error.getCode(), error.getMessage(), exception.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package org.springblade.openapi.wps.util;
|
||||||
|
|
||||||
|
import io.jsonwebtoken.Claims;
|
||||||
|
import org.springblade.core.launch.constant.TokenConstant;
|
||||||
|
import org.springblade.core.secure.utils.AuthUtil;
|
||||||
|
import org.springblade.core.tool.utils.Func;
|
||||||
|
import org.springblade.core.tool.utils.StringUtil;
|
||||||
|
import org.springblade.openapi.wps.pojo.vo.Api4WpsUserVO;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author bfhuange
|
||||||
|
* @date 2024/10/30
|
||||||
|
*/
|
||||||
|
public class TokenUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取wps需要的用户信息
|
||||||
|
* @param token
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Api4WpsUserVO getWpsUser(String token) {
|
||||||
|
if (StringUtil.isBlank(token)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Claims claims = AuthUtil.parseJWT(token);
|
||||||
|
if (claims == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String userId = Func.toStr(claims.get(TokenConstant.USER_ID));
|
||||||
|
String nickName = Func.toStr(claims.get(TokenConstant.NICK_NAME));
|
||||||
|
return new Api4WpsUserVO(userId, nickName);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
#spring:
|
||||||
|
# cloud:
|
||||||
|
# nacos:
|
||||||
|
# username: nacos
|
||||||
|
# password: ${NACOS_PASSWORD:gr30wIs5%Hi7keQj}
|
||||||
|
# server-addr: ${NACOS_ADDR:10.38.16.127:8848}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
#spring:
|
||||||
|
# cloud:
|
||||||
|
# nacos:
|
||||||
|
# username: nacos
|
||||||
|
# password: rWrMrVTWyf%ekjuw
|
||||||
|
# server-addr: ${NACOS_ADDR:192.168.0.242:8848}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#server:
|
||||||
|
# port: 38108
|
||||||
|
#spring:
|
||||||
|
# cloud:
|
||||||
|
# nacos:
|
||||||
|
# username: nacos
|
||||||
|
# password: gr30wIs5%Hi7keQj
|
||||||
|
# server-addr: ${NACOS_ADDR:10.38.16.127:8848}
|
||||||
34
blade-service/blade-openapi/src/main/resources/bootstrap.yml
Normal file
34
blade-service/blade-openapi/src/main/resources/bootstrap.yml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
server:
|
||||||
|
port: 8108
|
||||||
|
|
||||||
|
#数据源配置
|
||||||
|
spring:
|
||||||
|
datasource:
|
||||||
|
url: ${blade.datasource.dev.url}
|
||||||
|
username: ${blade.datasource.dev.username}
|
||||||
|
password: ${blade.datasource.dev.password}
|
||||||
|
|
||||||
|
#spring:
|
||||||
|
# application:
|
||||||
|
# name: blade-openapi
|
||||||
|
# cloud:
|
||||||
|
# nacos:
|
||||||
|
# discovery:
|
||||||
|
# namespace: ${spring.profiles.active}
|
||||||
|
# # 不注册到nacos
|
||||||
|
# #registerEnabled: false
|
||||||
|
# config:
|
||||||
|
# # 文件后缀名
|
||||||
|
# file-extension: yaml
|
||||||
|
# namespace: ${spring.profiles.active}
|
||||||
|
# shared-configs:
|
||||||
|
# - data-id: blade.yaml
|
||||||
|
# refresh: true
|
||||||
|
# - data-id: blade-${spring.profiles.active}.yaml
|
||||||
|
# refresh: true
|
||||||
|
# - data-id: third-party-api.yaml
|
||||||
|
# refresh: true
|
||||||
|
# extension-configs:
|
||||||
|
# - data-id: ${spring.application.name}-dynamictp.yaml
|
||||||
|
# group: DEFAULT_GROUP
|
||||||
|
# refresh: true # 必须配置,负责自动刷新不生效
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
<module>blade-desk</module>
|
<module>blade-desk</module>
|
||||||
<module>blade-system</module>
|
<module>blade-system</module>
|
||||||
<module>blade-file</module>
|
<module>blade-file</module>
|
||||||
|
<module>blade-openapi</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|||||||
Reference in New Issue
Block a user