Commit 123eada5 by xieshaohua

治理工单初始化

parents
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
\ No newline at end of file
# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/build/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/build/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/common/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/core/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/runtime/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
<option value="$PROJECT_DIR$/build/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
<?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>com.keymobile.governworkorder</groupId>
<artifactId>parent</artifactId>
<version>product-v1-1.0.1-rc1</version>
</parent>
<artifactId>common</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
\ No newline at end of file
package com.keymobile.governworkorder;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
\ No newline at end of file
package com.keymobile.governworkorder.common.bo;
import java.util.Objects;
public class FileDataVO {
private String id;
private String fileName;
public FileDataVO() {
// do nothing
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
FileDataVO obj = (FileDataVO) o;
return Objects.equals(id, obj.id) &&
Objects.equals(fileName, obj.fileName);
}
@Override
public int hashCode() {
return Objects.hash(id, fileName);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
package com.keymobile.governworkorder.common.bo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/12
* @desc 工单关联资产数据
*/
@Data
@Schema(description = "工单关联资产数据")
public class WorkOrderDataVO {
/**
* 资产id
*/
private String id;
/**
* 工单id
*/
private String workOrderId;
/**
* 资产名称
*/
private String name;
/**
* 资产编号
*/
private String code;
/**
* 资产描述
*/
private String desc;
/**
* 处理意见
*/
private String opinion;
/**
* 工单类型 资产属性变更、资产下架、资产新增等 待讨论 资产转移
*/
private String type;
/**
* 资产类型 数据指标、数据资产
*/
private String dataType;
/**
* 处理状态 是、否
*/
private String handleStatus;
/**
* 确认状态 是、否
*/
private String confirmStatus;
}
package com.keymobile.governworkorder.common.bo;
import lombok.Data;
import java.util.List;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/12
* @desc 工单信息
*/
@Data
public class WorkOrderInfoVO {
/**
* id
*/
private String id;
private String name;
/**
* 工单标题
*/
private String title;
/**
* 工单描述
*/
private String desc;
/**
* 工单级别
*/
private String level;
/**
* 工单状态 待处理、处理中
*/
private String status;
/**
* 工单创建时间
*/
private String createTime;
/**
* 创建毫秒
*/
private long createTimeMill;
/**
* 工单类型 资产变更、资产下架、资产新增等 待讨论 资产转移
*/
private String type;
/**
* 资产类型 数据指标、数据资产
*/
private String dataType;
/**
* 处理人
*/
private String handleUserName;
/**
* 处理人展示名
*/
private String handleUserDName;
/**
* 下一步操作人展示名
*/
private String nextUserDName;
/**
* 下一步操作人账号
*/
private String nextUserName;
/**
* 创建人展示名
*/
private String createUserDName;
/**
* 创建人账号
*/
private String createUserName;
private String fileId;
private String endTime;
private String updateTime;
private List<WorkOrderDataVO> data;
private List<WorkOrderProcessVO> process;
}
package com.keymobile.governworkorder.common.bo;
import lombok.Data;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/13
* @desc
*/
@Data
public class WorkOrderMessage {
/**
* 消息类型, create 创建、 update 更新、 finish 工单关闭、delete 删除
*/
private String type;
/**
* 数据类型 数据指标、数据资产、数据标准、元数据
*/
private String dateType;
private WorkOrderInfoVO workOrderInfo;
}
package com.keymobile.governworkorder.common.bo;
import lombok.Data;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/14
* @desc
*/
@Data
public class WorkOrderProcessVO {
private String id;
/**
* 工单id
*/
private String workOrderId;
/**
* 类型 通过、驳回
*/
private String type;
/**
* 处理意见
*/
private String content;
/**
* 处理人账号
*/
private String userName;
/**
* 处理人展示名
*/
private String userDName;
/**
* 下一步处理人
*/
private String nextUserName;
/**
* 下一步处理人展示名
*/
private String nextUserDName;
/**
* 创建时间
*/
private String createTime;
}
package com.keymobile.governworkorder.common.constant;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/12
* @desc
*/
public class MQConstant {
public static final String WORK_ORDER_EXCHANGE = "governWorkOrderExchange";
public MQConstant() {
}
}
package com.keymobile.governworkorder.common.type;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/15
* @desc
*/
public enum OrderApprovalTypeEnum {
APPROVAL_PASS("通过"),
APPROVAL_REJECT("驳回");
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
OrderApprovalTypeEnum() {
}
OrderApprovalTypeEnum(String name) {
this.name = name;
}
}
package com.keymobile.governworkorder.common.type;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum OrderDataTypeEnum {
METADATA("元数据"),
DATA_ASSET("数据资产"),
STANDARD("数据标准"),
INDEX("数据指标");
private String name;
OrderDataTypeEnum() {
}
OrderDataTypeEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.keymobile.governworkorder.common.type;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum OrderMessageTypeEnum {
MSG_CREATE("create", "工单创建"),
MSG_UPDATE("update", "工单更新"),
MSG_DELETE("delete", "工单删除"),
MSG_FINISH("finish", "工单完成");
public static final String[] ARRAYS = Arrays.stream(values()).map(OrderMessageTypeEnum::getType).toArray(String[]::new);
public static final Map<String, String> MAP = Arrays.stream(values())
.collect(Collectors.toMap(OrderMessageTypeEnum::getType, OrderMessageTypeEnum::getName));
private String type;
private String name;
OrderMessageTypeEnum() {
}
OrderMessageTypeEnum(String type, String name) {
this.type = type;
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static String getValueByKey(Integer key) {
String value = MAP.get(key);
return value == null ? "" : value;
}
}
package com.keymobile.governworkorder.common.type;
public enum OrderStatusTypeEnum {
STATUS_TO_BE_START("待发起"),
STATUS_PROCESSING("处理中"),
STATUS_DONE("工单关闭");
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
OrderStatusTypeEnum() {
}
OrderStatusTypeEnum(String name) {
this.name = name;
}
}
package com.keymobile.governworkorder.common.type;
public enum OrderTypeEnum {
DATA_UPDATE("资产变更"),
DATA_ADD("资产新增"),
DATA_OFF("资产下架"),
DATA_TRANSFER("资产下架");
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
OrderTypeEnum() {
}
OrderTypeEnum(String name) {
this.name = name;
}
}
<?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>com.keymobile.governworkorder</groupId>
<artifactId>parent</artifactId>
<version>product-v1-1.0.1-rc1</version>
</parent>
<artifactId>core</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.keymobile.governworkorder</groupId>
<artifactId>common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.keymobile.governworkorder.core.api;
import com.keymobile.governworkorder.common.bo.FileDataVO;
import com.keymobile.governworkorder.core.persistence.model.FileData;
import com.keymobile.governworkorder.core.service.FileService;
import com.keymobile.governworkorder.core.util.BeanUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@RestController
@Tag(name = "文件管理", description = "文件管理")
@RequestMapping("file")
public class FileApi{
@Autowired
private FileService fileService;
@PostMapping("/upload")
@Operation(summary = "上传文件", description = "上传文件")
public FileDataVO upload(@RequestParam("file") MultipartFile multipartFile) {
FileData upload = fileService.upload(multipartFile);
return BeanUtil.map(upload, FileDataVO.class);
}
@GetMapping("/download")
@Operation(summary = "下载文件", description = "下载文件")
public void download(@RequestParam(value = "id") String id, HttpServletResponse response) {
fileService.download(id, response);
}
@DeleteMapping("/del")
@Operation(summary = "删除文件", description = "根据id删除文件")
public void del(@RequestParam(value = "id") String id) {
fileService.del(id);
}
@GetMapping("/find")
@Operation(summary = "查找", description = "查找")
public List<Document> find(@RequestParam(value = "id" ,required = false) String id) {
List<Document> docs = fileService.find(id);
return docs;
}
}
package com.keymobile.governworkorder.core.api;
import com.keymobile.governworkorder.common.bo.WorkOrderDataVO;
import com.keymobile.governworkorder.common.bo.WorkOrderInfoVO;
import com.keymobile.governworkorder.common.bo.WorkOrderProcessVO;
import com.keymobile.governworkorder.core.dto.WorkOrdeQueryDto;
import com.keymobile.governworkorder.core.persistence.model.WorkOrderData;
import com.keymobile.governworkorder.core.service.WorkOrderService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/13
* @desc
*/
@RestController
@Tag(name = "治理工单api")
@RequestMapping("/workorder")
@Slf4j
public class WorkOrderApi {
@Autowired
WorkOrderService workOrderService;
@RequestMapping(value = "/page", method = {RequestMethod.POST})
@Operation(summary = "分页查询", description = "")
public Page<WorkOrderInfoVO> page(@RequestBody WorkOrdeQueryDto param) {
return workOrderService.page(param);
}
@RequestMapping(value = "/add", method = {RequestMethod.POST})
@Operation(summary = "新增工单", description = "")
public WorkOrderInfoVO add(@RequestBody WorkOrderInfoVO workOrderVo) {
WorkOrderInfoVO wordOrder = workOrderService.add(workOrderVo);
return wordOrder;
}
@RequestMapping(value = "/startProcess", method = {RequestMethod.POST})
@Operation(summary = "启动工单", description = "")
public void startProcess(@RequestParam String workOrderId) {
workOrderService.startProcess(workOrderId);
}
@RequestMapping(value = "/approvalProcess", method = {RequestMethod.POST})
@Operation(summary = "审批流程", description = "")
public void approvalProcess(@RequestParam String workOrderId, @RequestBody WorkOrderProcessVO process) {
workOrderService.approvalProcess(workOrderId, process);
}
@RequestMapping(value = "/saveData", method = {RequestMethod.POST})
@Operation(summary = "保存工单关联资产数据", description = "")
public void saveData(@RequestParam String workOrderId, @RequestBody WorkOrderDataVO workOrderDataVO) {
workOrderService.saveData(workOrderId, workOrderDataVO);
}
@RequestMapping(value = "/confirmData", method = {RequestMethod.POST})
@Operation(summary = "确认数据", description = "")
public void confirmData(@RequestParam String workOrderId,
@RequestParam String workOrderDataId,
@RequestParam String confirmStatus) {
workOrderService.confirmData(workOrderId, workOrderDataId, confirmStatus);
}
@RequestMapping(value = "/delete", method = {RequestMethod.POST})
@Operation(summary = "删除数据", description = "")
public void delete(@RequestParam String workOrderId, @RequestParam(required = false, defaultValue = "false") boolean force) {
workOrderService.delete(workOrderId, force);
}
@RequestMapping(value = "/getData", method = {RequestMethod.GET})
@Operation(summary = "根据工单id获取关联数据", description = "")
public List<WorkOrderDataVO> getData(@RequestParam String workOrderId) {
return workOrderService.getData(workOrderId);
}
@RequestMapping(value = "/getProcesses", method = {RequestMethod.GET})
@Operation(summary = "根据工单id获取审批记录", description = "")
public List<WorkOrderProcessVO> getProcesses(@RequestParam String workOrderId) {
return workOrderService.getProcesses(workOrderId);
}
@RequestMapping(value = "/getById", method = {RequestMethod.GET})
@Operation(summary = "根据工单id获取详情信息", description = "")
public WorkOrderInfoVO getById(@RequestParam String workOrderId) {
return workOrderService.getById(workOrderId);
}
}
package com.keymobile.governworkorder.core.dto;
import lombok.Data;
import org.springframework.data.domain.Sort;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/14
* @desc
*/
@Data
public class WorkOrdeQueryDto {
private int page = 1;
private int size = 10;
private String sort = "createTime";
private Sort.Direction direction = Sort.Direction.DESC;
private String level;
private String status;
private String type;
private String keyword;
private String startTime;
private String endTime;
/**
* 待办已办类型: 1待办、2待办
*/
private String doType;
}
package com.keymobile.governworkorder.core.exception;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME, property = "error", visible = true)
class ApiError {
private HttpStatus status;
private final Long timestamp;
private String message;
private String cnMessage;
private ApiError() {
timestamp = System.currentTimeMillis();
}
ApiError(HttpStatus status) {
this();
this.status = status;
}
ApiError(HttpStatus status, Throwable ex) {
this();
this.status = status;
this.message = ex != null ? ex.getMessage() : "";
}
ApiError(HttpStatus status, String message, Throwable ex) {
this();
this.status = status;
String errorMsg = ex != null ? ex.getMessage() : "";
this.message = StringUtils.isBlank(message) ? errorMsg : message;
}
ApiError(HttpStatus status, String message, String cnMessage, Throwable ex) {
this();
this.status = status;
String errorMsg = ex != null ? ex.getMessage() : "";
this.message = StringUtils.isBlank(message) ? errorMsg : message;
this.cnMessage = cnMessage;
}
public HttpStatus getStatus() {
return status;
}
public Long getTimestamp() {
return timestamp;
}
public String getMessage() {
return message;
}
public String getCnMessage() {
return cnMessage;
}
}
package com.keymobile.governworkorder.core.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
/**
* @author mahx
*/
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
@Slf4j
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(Exception.class)
protected ResponseEntity<Object> handlException(Exception ex, WebRequest request){
log.error(ex.getMessage(), ex);
return buildResponseEntity(new ApiError(INTERNAL_SERVER_ERROR, ex.getMessage(), ex.getMessage(), ex));
}
private ResponseEntity<Object> buildResponseEntity(ApiError apiError) {
return new ResponseEntity<>(apiError, apiError.getStatus());
}
}
package com.keymobile.governworkorder.core.messaging;
import com.keymobile.governworkorder.common.bo.WorkOrderInfoVO;
import com.keymobile.governworkorder.common.bo.WorkOrderMessage;
import com.keymobile.governworkorder.common.type.OrderMessageTypeEnum;
import com.keymobile.governworkorder.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.UUID;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/18
* @desc
*/
@Service
@Slf4j
public class WorkOrderMessageService {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private FanoutExchange exchange;
public void create(WorkOrderInfoVO vo) {
CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
String content = toMessage(OrderMessageTypeEnum.MSG_CREATE.getType(), vo);
log.info("sendMessage.exchange:{},content:{}", exchange.getName(), content);
this.rabbitTemplate.convertAndSend(exchange.getName(), null, content, correlationId);
}
public void delete(WorkOrderInfoVO vo) {
CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
String content = toMessage(OrderMessageTypeEnum.MSG_DELETE.getType(), vo);
log.info("sendMessage.exchange:{},content:{}", exchange.getName(), content);
this.rabbitTemplate.convertAndSend(exchange.getName(), null, content, correlationId);
}
public void finsh(WorkOrderInfoVO vo) {
CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
String content = toMessage(OrderMessageTypeEnum.MSG_FINISH.getType(), vo);
log.info("sendMessage.exchange:{},content:{}", exchange.getName(), content);
this.rabbitTemplate.convertAndSend(exchange.getName(), null, content, correlationId);
}
private String toMessage(String type, WorkOrderInfoVO vo) {
WorkOrderMessage message = new WorkOrderMessage();
message.setType(type);
message.setDateType(vo.getDataType());
message.setWorkOrderInfo(vo);
return ObjectUtil.toJson(message);
}
}
package com.keymobile.governworkorder.core.persistence.model;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.Objects;
public class FileData {
@Schema(description = "上传文件后的获取的文件id", required = true)
private String id;
@Schema(description = "上传文件后的获取的文件name", required = true)
private String fileName;
public FileData() {
// do nothing
}
public FileData(String id, String fileName) {
this.id = id;
this.fileName = fileName;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
FileData obj = (FileData) o;
return Objects.equals(id, obj.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
package com.keymobile.governworkorder.core.persistence.model;
import jakarta.persistence.Id;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/12
* @desc 工单关联资产数据
*/
@Data
@Document(collection = "g_work_order_data")
public class WorkOrderData {
@Id
private String id;
/**
* 工单id
*/
private String workOrderId;
/**
* 资产名称
*/
private String name;
/**
* 资产编号
*/
private String code;
/**
* 资产描述
*/
private String desc;
/**
* 处理意见
*/
private String opinion;
/**
* 工单类型 资产属性变更、资产下架、资产新增等 待讨论 资产转移
*/
private String type;
/**
* 资产类型 数据指标、数据资产
*/
private String dataType;
/**
* 处理状态 是、否
*/
private String handleStatus;
/**
* 确认状态 是、否
*/
private String confirmStatus;
}
package com.keymobile.governworkorder.core.persistence.model;
import jakarta.persistence.Id;
import jakarta.persistence.Transient;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.List;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/12
* @desc 工单信息
*/
@Data
@Document(collection = "g_work_order")
public class WorkOrderInfo {
/**
* id
*/
@Id
private String id;
private String name;
/**
* 工单标题
*/
private String title;
/**
* 工单描述
*/
private String desc;
/**
* 工单级别
*/
private String level;
/**
* 工单状态 待处理、处理中
*/
private String status;
/**
* 工单创建时间
*/
private String createTime;
/**
* 创建毫秒
*/
private long createTimeMill;
/**
* 工单类型 资产属性变更、资产下架、资产新增等 待讨论 资产转移
*/
private String type;
/**
* 资产类型 数据指标、数据资产
*/
private String dataType;
/**
* 处理人
*/
private String handleUserName;
/**
* 处理人展示名
*/
private String handleUserDName;
/**
* 下一步操作人展示名
*/
private String nextUserDName;
/**
* 下一步操作人账号
*/
private String nextUserName;
/**
* 创建人展示名
*/
private String createUserDName;
/**
* 创建人账号
*/
private String createUserName;
private String endTime;
private String updateTime;
private String fileId;
@Transient
private List<WorkOrderData> data;
@Transient
private List<WorkOrderProcess> processes;
}
package com.keymobile.governworkorder.core.persistence.model;
import jakarta.persistence.Id;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/14
* @desc
*/
@Data
@Document(collection = "g_work_order_process")
public class WorkOrderProcess {
@Id
private String id;
/**
* 工单id
*/
private String workOrderId;
/**
* 类型 通过、驳回
*/
private String type;
/**
* 处理意见
*/
private String content;
/**
* 处理人账号
*/
private String userName;
/**
* 处理人展示名
*/
private String userDName;
/**
* 下一步处理人
*/
private String nextUserName;
/**
* 下一步处理人展示名
*/
private String nextUserDName;
/**
* 创建时间
*/
private String createTime;
}
package com.keymobile.governworkorder.core.persistence.repository;
import com.keymobile.governworkorder.core.persistence.model.WorkOrderData;
import com.keymobile.governworkorder.core.persistence.model.WorkOrderInfo;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/13
* @desc 收藏 Repository
*/
public interface WorkOrderDataRepository extends MongoRepository<WorkOrderData, String> {
List<WorkOrderInfo> findByWorkOrderId(String workOrderId);
}
package com.keymobile.governworkorder.core.persistence.repository;
import com.keymobile.governworkorder.core.persistence.model.WorkOrderInfo;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/13
* @desc 收藏 Repository
*/
public interface WorkOrderRepository extends MongoRepository<WorkOrderInfo, String> {
List<WorkOrderInfo> findByWorkOrderId(String workOrderId);
}
package com.keymobile.governworkorder.core.service;
import com.keymobile.governworkorder.core.persistence.model.FileData;
import com.mongodb.client.gridfs.model.GridFSFile;
import jakarta.servlet.http.HttpServletResponse;
import org.bson.Document;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@Service
public interface FileService {
public GridFSFile retrieveFile(String fileId);
public FileData upload(MultipartFile file);
public void del(String id);
public void download(String id, HttpServletResponse response);
List<Document> find(String fileId);
}
package com.keymobile.governworkorder.core.service;
import com.keymobile.governworkorder.common.bo.WorkOrderDataVO;
import com.keymobile.governworkorder.common.bo.WorkOrderInfoVO;
import com.keymobile.governworkorder.common.bo.WorkOrderProcessVO;
import com.keymobile.governworkorder.core.dto.WorkOrdeQueryDto;
import com.keymobile.governworkorder.core.persistence.model.WorkOrderProcess;
import org.springframework.data.domain.Page;
import java.util.List;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/13
* @desc
*/
public interface WorkOrderService {
WorkOrderInfoVO add(WorkOrderInfoVO workOrderVo);
Page<WorkOrderInfoVO> page(WorkOrdeQueryDto param);
void startProcess(String workOrderId);
void approvalProcess(String workOrderId, WorkOrderProcessVO process);
WorkOrderDataVO saveData(String workOrderId, WorkOrderDataVO workOrderDataVO);
void confirmData(String workOrderId, String workOrderDataId, String confirmStatus);
void delete(String workOrderId, boolean force);
List<WorkOrderDataVO> getData (String workOrderId);
List<WorkOrderProcessVO> getProcesses(String workOrderId);
WorkOrderInfoVO getById(String workOrderId);
}
package com.keymobile.governworkorder.core.service.impl;
import com.keymobile.governworkorder.core.persistence.model.FileData;
import com.keymobile.governworkorder.core.service.FileService;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.model.GridFSFile;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class FileServiceImpl implements FileService {
private static final Logger logger = LoggerFactory.getLogger(FileService.class);
@Autowired
private GridFsTemplate gridFsTemplate;
@Autowired
private GridFSBucket gridFSBucket;
@Autowired
private MongoTemplate mongoTemplate;
public static final String FILE_CONTENT_TYPE = "fileContentType";
public GridFSFile retrieveFile(String fileId) {
return gridFsTemplate.findOne(new Query(Criteria.where("_id").is(fileId)));
}
public FileData upload(MultipartFile file){
try {
Map<String, String> metadata = new HashMap<>();
metadata.put(FILE_CONTENT_TYPE , file.getContentType());
ObjectId fileId = gridFsTemplate.store(file.getInputStream(), file.getOriginalFilename(), file.getContentType(), metadata);
return new FileData(fileId.toString(), file.getOriginalFilename());
} catch (IOException e) {
logger.error("上传文件异常 - ", e);
throw new RuntimeException(e);
}
}
public void del(String id) {
Query query = new Query(Criteria.where("_id").is(new ObjectId(id)));
gridFsTemplate.delete(query);
}
public void download(String id, HttpServletResponse response) {
try {
// 查询文件
GridFSFile gridFSFile = retrieveFile(id);
if (gridFSFile == null) {
throw new RuntimeException("文件不存在");
}
// 设置响应头
String fileName = gridFSFile.getFilename();
String contentType = gridFSFile.getMetadata().getString("contentType");
String encodedFileName = URLEncoder.encode(fileName, "UTF-8");
response.setContentType(contentType);
response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");
response.setCharacterEncoding("utf-8");
// 获取文件内容并写入响应的输出流
try (InputStream inputStream = gridFSBucket.openDownloadStream(new ObjectId(id));
BufferedInputStream bis = new BufferedInputStream(inputStream);
ServletOutputStream outputStream = response.getOutputStream()) {
byte[] buffer = new byte[2048];
int len;
while ((len = bis.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
}
} catch (Exception e) {
logger.error("FileService-download - ", e);
throw new RuntimeException("文件下载失败");
}
}
public List<Document> find(String fileId){
Query query = new Query();
if(StringUtils.isNotBlank(fileId)){
query.addCriteria(Criteria.where("_id").is(fileId));
}
List<Document> list = mongoTemplate.find(query,Document.class,"g_work_order_file.files");
list.stream().forEach(e->e.put("_id",e.get("_id").toString()));
return list;
}
public byte[] getBytes(String id) {
try {
// 查询文件
GridFSFile gridFSFile = retrieveFile(id);
if (gridFSFile == null) {
throw new RuntimeException("文件不存在");
}
/* // 设置文件名
String fileName = gridFSFile.getFilename();
// 文件名编码用于响应头(如果需要)
String encodedFileName = URLEncoder.encode(fileName, "UTF-8");*/
// 读取文件内容到字节数组
try (InputStream inputStream = gridFSBucket.openDownloadStream(new ObjectId(id));
BufferedInputStream bis = new BufferedInputStream(inputStream);
ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
byte[] buffer = new byte[2048];
int len;
while ((len = bis.read(buffer)) > 0) {
bos.write(buffer, 0, len);
}
return bos.toByteArray();
}
} catch (Exception e) {
logger.error("FileService-download - ", e);
throw new RuntimeException("文件下载失败");
}
}
}
package com.keymobile.governworkorder.core.util;
import org.springframework.beans.BeanUtils;
import java.util.List;
import java.util.stream.Collectors;
public class BeanUtil {
private BeanUtil() {
// 避免实例化
}
/**
* 将源对象的属性映射到目标类型的新实例。
*
* @param source 源对象
* @param destinationType 目标类型的Class对象
* @param <S> 源对象的类型
* @param <D> 目标对象的类型
* @return 目标类型的新实例
*/
public static <S, D> D map(S source, Class<D> destinationType) {
D destination;
try {
destination = destinationType.newInstance();
BeanUtils.copyProperties(source, destination);
return destination;
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException("Failed to copy properties", e);
}
}
/**
* 将源对象的属性映射到目标对象。
*
* @param source 源对象
* @param destination 目标对象
* @param <S> 源对象的类型
* @param <D> 目标对象的类型
* @return 目标对象
*/
public static <S, D> void map(S source, D destination) {
if (source == null || destination == null) {
throw new IllegalArgumentException("Source or destination cannot be null");
}
BeanUtils.copyProperties(source, destination);
}
/**
* 将源对象列表的属性映射到目标类型对象的列表。
*
* @param sourceList 源对象列表
* @param destinationType 目标类型的Class对象
* @param <S> 源对象的类型
* @param <D> 目标对象的类型
* @return 目标类型对象的列表
*/
public static <S, D> List<D> mapList(List<S> sourceList, Class<D> destinationType) {
return sourceList.stream()
.map(source -> map(source, destinationType))
.collect(Collectors.toList());
}
}
package com.keymobile.governworkorder.core.util;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
/**
* @author mahx
* @version 1.0
* @date 2022/4/16 15:35
*/
public class DateUtil {
private DateUtil() {
}
public static List<String> getLastMonth(int n) {
LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
List<String> result = new ArrayList<>();
for (int i = 0; i < n; i++) {
int currentMonth = month - i;
int currentYear = year;
if (currentMonth <= 0) {
currentYear = year - 1;
currentMonth = currentMonth + 12;
}
String date = String.format("%d-%02d", currentYear, currentMonth);
result.add(date);
}
return result.stream().sorted().collect(Collectors.toList());
}
public static String getDateTime() {
return LocalDateTime.now(ZoneId.of("+8")).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
public static String getDate() {
return LocalDate.now(ZoneId.of("+8")).format(DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.CHINA));
}
public static String getDateByFormat(String format) {
return LocalDate.now(ZoneId.of("+8")).format(DateTimeFormatter.ofPattern(format, Locale.CHINA));
}
public static String getYesterday() {
LocalDate localDate = LocalDate.now();
localDate = localDate.plusDays(-1);
return localDate.toString();
}
}
package com.keymobile.governworkorder.core.util;
import java.util.UUID;
/**
* @author mahx
* @version 1.0
* @date 2021/5/7 16:14
*/
public class IdUtil {
public static final String ID_SEPARATOR = "=";
private IdUtil() {
//do nothing
}
public static String generateId() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
}
package com.keymobile.governworkorder.core.util;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 获取IP工具类
*
* @author laigx
* @version 1.0
* @date 2020/3/25 14:51
*/
public class IpUtil {
public static final String UNKNOWN = "unknown";
private IpUtil() {
//do nothing
}
private static final Logger log = LoggerFactory.getLogger(IpUtil.class);
/**
* 获取IP
*
* @param request request
* @return IP
*/
public static String getIpAddr(HttpServletRequest request) {
String ipAddress;
try {
ipAddress = request.getHeader("x-forwarded-for");
if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
if ("127.0.0.1".equals(ipAddress)) {
ipAddress = getIpAddress(ipAddress);
}
}
if (ipAddress != null && ipAddress.length() > 15 && ipAddress.contains(",")) {
ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
}
} catch (Exception e) {
ipAddress = "";
}
return ipAddress;
}
private static String getIpAddress(String ipAddress) {
try {
InetAddress inet = InetAddress.getLocalHost();
ipAddress = inet.getHostAddress();
} catch (UnknownHostException e) {
log.error(e.getMessage(), e);
}
return ipAddress;
}
}
package com.keymobile.governworkorder.core.util;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
* 日志操作工具.
*
* @author linxu
* @version 1.0
* @date 2020/3/25 11:00
*/
public class LogManager {
private LogManager() {
//do nothing
}
/**
* trace.
*
* @param context context
* @param e e
* @param message message
*/
public static void logTrace(String context, Throwable e, String message) {
Logger logger = LoggerFactory.getLogger(context);
if (logger.isTraceEnabled()) {
logger.trace(message, e);
}
}
/**
* trace.
* @param context context
* @param message message
*/
public static void logTrace(String context, String message) {
logTrace(context, null, message);
}
/**
* debug.
* @param context context
* @param message message
*/
public static void logDebug(String context, String message) {
Logger logger = LoggerFactory.getLogger(context);
if (logger.isDebugEnabled()) {
logger.debug(message);
}
}
/**
* log.
* @param context context
* @param message message
*/
public static void logInfo(String context, String message) {
Logger logger = LoggerFactory.getLogger(context);
if (logger.isInfoEnabled()) {
logger.info(message);
}
}
/**
* info.
* @param context context
* @param message message
* @param objects objects
*/
public static void logInfo(String context, String message, Object... objects) {
Logger logger = LoggerFactory.getLogger(context);
String ip = getIp();
message = StringUtils.replace(message, "{}", "%s");
message = String.format(message, objects);
if (logger.isInfoEnabled()) {
logger.info(message, getUser(), getSessionId(), ip);
}
}
/**
* warning.
* @param context context
* @param e e
* @param message message
*/
public static void logWarning(String context, Throwable e, String message) {
Logger logger = LoggerFactory.getLogger(context);
if (logger.isWarnEnabled()) {
logger.warn(message, e);
}
}
/**
* warning.
* @param context context
* @param message message
*/
public static void logWarning(String context, String message) {
logWarning(context, null, message);
}
/**
* error.
* @param context context
* @param e e
* @param message message
*/
public static void logError(String context, Throwable e, String message) {
Logger logger = LoggerFactory.getLogger(context);
if (logger.isErrorEnabled()) {
logger.error(message, e);
}
}
/**
* error.
* @param context context
* @param message message
*/
public static void logError(String context, String message) {
Logger logger = LoggerFactory.getLogger(context);
if (logger.isErrorEnabled()) {
logger.error(message);
}
}
/**
* 获取sessionId.
* @return sessionId
*/
public static String getSessionId() {
RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
if (attrs != null) {
return attrs.getSessionId();
}
return "NO_SESSION";
}
/**
* 获取IP.
* @return ip
*/
public static String getIp() {
RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
if (attrs != null) {
HttpServletRequest request = ((ServletRequestAttributes)attrs).getRequest();
return IpUtil.getIpAddr(request);
}
return "";
}
/**
* 获取用户.
* @return user
*/
public static String getUser() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null) {
return auth.getName();
}
return "NO_USER";
}
public static String getUserName() {
String user = getUser();
if (StringUtils.contains(user, ":")) {
user = StringUtils.substringBefore(user, ":");
}
return user;
}
public static String getDUserName() {
String user = getUser();
if (StringUtils.contains(user, ":")) {
user = StringUtils.substringAfterLast(user, ":");
}
return user;
}
public static String getDUserName(String username) {
if (StringUtils.contains(username, ":")) {
return StringUtils.substringAfterLast(username, ":");
}
return username;
}
public static String getUserName(String username) {
if (StringUtils.contains(username, ":")) {
return StringUtils.substringBefore(username, ":");
}
return username;
}
}
package com.keymobile.governworkorder.core.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.io.Closeable;
import java.io.IOException;
import java.util.*;
/**
* @author mahx
* @version 1.0
* @date 2021/11/24 15:08
*/
@Slf4j
public class ObjectUtil {
private static final ObjectMapper mapper = new ObjectMapper();
private ObjectUtil() {
//do nothing
}
public static ObjectMapper getMapper() {
return mapper;
}
public static String toString(Object object) {
if (object == null) {
return null;
}
return StringUtils.trimToEmpty(object.toString());
}
public static String toEmpty(Object object) {
String result = toString(object);
return result == null ? "" : result;
}
public static String toJson(Object object) {
if (object == null) {
return "";
}
try {
return mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
log.error("生成json报错", e);
return "";
}
}
public static Map<String, Object> getMap(Object value) {
if (value == null) {
return new HashMap<>(0);
}
if (value instanceof Map) {
return (Map<String, Object>) value;
}
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
try {
if (value instanceof String) {
return mapper.readValue((String) value, typeReference);
}
return mapper.readValue(mapper.writeValueAsString(value), typeReference);
} catch (IOException e) {
log.error("解析错误", e);
return new HashMap<>(0);
}
}
public static List<Map<String, Object>> getMapList(Object value) {
if (value == null) {
return new ArrayList<>(0);
}
TypeReference<List<Map<String, Object>>> typeReference = new TypeReference<List<Map<String, Object>>>() {
};
try {
if (value instanceof String) {
return mapper.readValue((String) value, typeReference);
}
return mapper.readValue(mapper.writeValueAsString(value), typeReference);
} catch (IOException e) {
log.error("解析错误", e);
return new ArrayList<>();
}
}
public static <T> T getObject(Object value, TypeReference<T> reference) {
if (value == null) {
return null;
}
try {
if (value instanceof String) {
return mapper.readValue((String) value, reference);
}
return mapper.readValue(mapper.writeValueAsString(value), reference);
} catch (IOException e) {
log.error("解析错误", e);
return null;
}
}
public static boolean getBooleanValue(Object value) {
if (value == null) {
return false;
}
return Boolean.parseBoolean(toString(value));
}
public static Long getLong(Object value) {
if (value == null) {
return null;
}
return Long.valueOf(toString(value));
}
public static long getLongValue(Object value) {
if (value == null) {
return 0L;
}
return Long.parseLong(toString(value));
}
public static int getIntValue(Object value) {
if (value == null) {
return 0;
}
return Integer.parseInt(toString(value));
}
public static Double getDouble(Object value) {
if (value == null) {
return null;
}
return Double.valueOf(toString(value));
}
public static Object toStringForCollectionOrMap(Object value) {
if (value == null) {
return null;
}
if (value instanceof Collection) {
return removeBracket(value.toString());
}
if (value instanceof String) {
return removeBracket(value.toString());
}
if (value instanceof Map) {
return toJson(value);
}
return value;
}
private static String removeBracket(String value) {
if ("[]".equals(value)) {
return "";
} else if (StringUtils.startsWith(value, "[") && StringUtils.endsWith(value, "]")) {
return StringUtils.substring(value, 1, value.length() - 1);
}
return value;
}
public static String addBracket(String value) {
if (!(StringUtils.startsWith(value, "[") && StringUtils.endsWith(value, "]"))) {
value = "[" + value + "]";
}
return value;
}
public static void close(Closeable obj) {
if (obj != null) {
try {
obj.close();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
}
}
<?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>com.keymobile</groupId>
<artifactId>parent</artifactId>
<version>product-v1-1.0.2-rc1</version>
</parent>
<groupId>com.keymobile.governworkorder</groupId>
<artifactId>parent</artifactId>
<version>product-v1-1.0.1-rc1</version>
<packaging>pom</packaging>
<modules>
<module>runtime</module>
<module>common</module>
<module>core</module>
<module>build</module>
</modules>
<!-- <properties>-->
<!-- <maven.compiler.source>17</maven.compiler.source>-->
<!-- <maven.compiler.target>17</maven.compiler.target>-->
<!-- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>-->
<!-- </properties>-->
<properties>
<auth.version>product-v1-1.0.1-rc1</auth.version>
<finder.version>product-v1-1.0.0-rc1</finder.version>
<metadata.version>3.0.2-release</metadata.version>
<datamodeler.version>mcd-1.1.0-release</datamodeler.version>
<config.version>product-v1-1.0.2-rc1</config.version>
<crypto.version>product-v1-1.0.2-rc1</crypto.version>
<notice.version>mcd-1.0.1</notice.version>
<openapi.version>2.6.0</openapi.version>
<akka.version>2.6.0</akka.version>
<poi.version>4.1.1</poi.version>
<easyExcel.version>3.3.4</easyExcel.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>${openapi.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
<?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>com.keymobile.governworkorder</groupId>
<artifactId>parent</artifactId>
<version>product-v1-1.0.1-rc1</version>
</parent>
<artifactId>runtime</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.keymobile.governworkorder</groupId>
<artifactId>core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.keymobile.auth</groupId>
<artifactId>security</artifactId>
<version>${auth.version}</version>
</dependency>
<dependency>
<groupId>com.keymobile</groupId>
<artifactId>config</artifactId>
<version>${config.version}</version>
</dependency>
<dependency>
<groupId>com.keymobile</groupId>
<artifactId>crypto</artifactId>
<version>${crypto.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<finalName>governWorkOrder</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- <plugin>-->
<!-- <artifactId>maven-assembly-plugin</artifactId>-->
<!-- <configuration>-->
<!-- <descriptors>-->
<!-- <descriptor>src/assembly/server-dist.xml</descriptor>-->
<!-- </descriptors>-->
<!-- </configuration>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <id>create-assemblies</id>-->
<!-- <phase>package</phase>-->
<!-- <goals>-->
<!-- <goal>single</goal>-->
<!-- </goals>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>-->
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.4.0.905</version>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package com.keymobile.governworkorder.runtime;
import com.keymobile.config.security.ApplicationHelper;
import com.ulisesbocchio.jasyptspringboot.environment.StandardEncryptableEnvironment;
import org.jasypt.encryption.StringEncryptor;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
@EnableFeignClients(basePackages = {"com.keymobile.governworkorder.core.remote"})
@ComponentScan(basePackages = {"com.keymobile.governworkorder",
"com.keymobile.config.logging",
"com.keymobile.config.feignclient",
"com.keymobile.authservice.component"})
@EntityScan(basePackages = {"com.keymobile.governworkorder.core.persistence.model"})
@EnableMongoRepositories(basePackages = {" com.keymobile.governworkorder.core.persistence.repository"})
public class WorkOrderApplication {
public static void main(String[] args) {
System.setProperty("es.set.netty.runtime.available.processors", "false");
new SpringApplicationBuilder()
.environment(StandardEncryptableEnvironment.builder().encryptor(stringEncryptor()).build())
.sources(WorkOrderApplication.class).run(args);
}
private static StringEncryptor stringEncryptor() {
return new StringEncryptor() {
@Override
public String encrypt(String s) {
try {
return ApplicationHelper.getEncryptor().encrypt(s);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public String decrypt(String s) {
try {
return ApplicationHelper.getEncryptor().decrypt(s);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
}
}
package com.keymobile.governworkorder.runtime.conf;
import feign.auth.BasicAuthRequestInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* FeignClientConfig.
* @author mahx
* @version 1.0
* @date 2019/12/27 16:55
*/
@Configuration
public class FeignClientConfig {
@Value("${security.authUser}")
private String authUser;
@Value("${security.authPwd}")
private String authPwd;
@Bean
public BasicAuthRequestInterceptor getBasicAuthRequestInterceptor() {
return new BasicAuthRequestInterceptor(authUser, authPwd);
}
}
\ No newline at end of file
package com.keymobile.governworkorder.runtime.conf;
import com.mongodb.*;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.*;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.web.util.UriUtils;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Configuration
public class MongoConfig extends AbstractMongoClientConfiguration {
@Value("${mongodb.uri}")
private String host;
@Value("${mongodb.database}")
private String database;
@Value("${mongodb.username}")
private String user;
@Value("${mongodb.password}")
private String pswd;
@Value("${mongodb.maxConnectionIdleTime}")
private final Integer maxConnectionIdleTime = 60000;
@Value("${mongodb.gridfs.bucket:g_work_order_file}")
private String fileCollectionName;
@Override
protected String getDatabaseName() {
return database;
}
@Bean
public GridFSBucket gridFSBucket(MongoTemplate mongoTemplate) {
return GridFSBuckets.create(mongoTemplate.getDb(), fileCollectionName);
}
@Bean
public GridFsTemplate gridFsTemplate(MongoDatabaseFactory dbFactory, MongoConverter converter) {
return new GridFsTemplate(dbFactory, converter, fileCollectionName);
}
@Override
protected void configureClientSettings(MongoClientSettings.Builder builder) {
if (host.split(",").length > 1) {
String[] serverArray = host.split(",");
List<ServerAddress> serverList = new ArrayList<>();
for (String ipPort : serverArray) {
String[] ipAndPort = ipPort.split(":");
serverList.add(new ServerAddress(ipAndPort[0].trim(), Integer.parseInt(ipAndPort[1])));
}
builder.applyToClusterSettings(settings -> {
settings.hosts(serverList);
});
builder.applyToConnectionPoolSettings(settings -> {
settings.maxConnectionIdleTime(maxConnectionIdleTime, TimeUnit.MICROSECONDS);
});
builder.readPreference(ReadPreference.primaryPreferred());
String password = UriUtils.decode(pswd, StandardCharsets.UTF_8);
builder.credential(MongoCredential.createCredential(user, database, password.toCharArray()));
} else {
String uri = String.format("mongodb://%s:%s@%s/%s", user, pswd, host, database);
builder.applyConnectionString(new ConnectionString(uri));
builder.applyToConnectionPoolSettings(settings -> {
settings.maxConnectionIdleTime(maxConnectionIdleTime, TimeUnit.MICROSECONDS);
});
}
}
@Bean
public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory databaseFactory, MongoCustomConversions customConversions, MongoMappingContext mappingContext) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(databaseFactory);
MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mappingContext);
converter.setCustomConversions(customConversions);
converter.setCodecRegistryProvider(databaseFactory);
converter.setTypeMapper(new DefaultMongoTypeMapper(null));
return converter;
}
}
package com.keymobile.governworkorder.runtime.conf;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OpenAPIConfig {
@Bean
public OpenAPI myOpenAPI() {
Info info = new Info()
.title("Tutorial Management API")
.version("1.0")
.description("This API exposes endpoints to manage tutorials.");
return new OpenAPI().info(info);
}
}
\ No newline at end of file
package com.keymobile.governworkorder.runtime.conf;
import com.keymobile.governworkorder.common.constant.MQConstant;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public FanoutExchange exchange(){
return new FanoutExchange(MQConstant.WORK_ORDER_EXCHANGE,true,false);
}
@Bean
public AmqpTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
return rabbitTemplate;
}
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
@Bean
public RabbitListenerContainerFactory<SimpleMessageListenerContainer> jsaFactory(ConnectionFactory connectionFactory, MessageConverter jsonMessageConverter) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(jsonMessageConverter);
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
factory.setPrefetchCount(50);
return factory;
}
}
package com.keymobile.governworkorder.runtime.conf;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
class RedisConfig {
/**
* 实例化 RedisTemplate 对象
*
* @return
*/
@Bean
public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
return redisTemplate;
}
/**
* 设置数据存入 redis 的序列化方式
*
* @param redisTemplate
* @param factory
*/
private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(factory);
}
}
package com.keymobile.governworkorder.runtime.conf;
import com.keymobile.auth.common.security.CustomizedUserDetailService;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.UserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import javax.sql.DataSource;
/**
* SecurityConfig.
* @author mahx
* @version 1.0
* @date 2019/12/27 16:55
*/
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@ComponentScan("com.keymobile.auth.common.security")
public class SecurityConfig {
@Value("${security.permit}")
private boolean permit;
@Bean
public UserDetailsManager users(DataSource dataSource) {
return new CustomizedUserDetailService(dataSource);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new SHA1PasswordEncoder();
}
@Bean
protected SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
if (permit) {
http.httpBasic().and().authorizeHttpRequests().anyRequest().permitAll();
} else {
http.httpBasic().and().authorizeHttpRequests().requestMatchers("/actuator/**", "/rest/openApi/**").permitAll()
.and().authorizeHttpRequests().anyRequest().authenticated();
}
http.csrf().disable();
return http.build();
}
class SHA1PasswordEncoder implements PasswordEncoder {
@Override
public String encode(CharSequence charSequence) {
return DigestUtils.sha1Hex(charSequence.toString());
}
@Override
public boolean matches(CharSequence charSequence, String s) {
return DigestUtils.sha1Hex(charSequence.toString()).equals(s);
}
}
}
mongodb:
database: dgrcb
uri: 10.126.158.214:27017
username: poc
password: Km38497130
maxConnectionIdleTime: 120000
gridfs:
bucket: g_work_order_file
spring:
main:
allow-bean-definition-overriding: true
allow-circular-references: true
data:
jpa:
repositories:
enabled: false
redis:
host: 10.126.158.214
port: 6379
password: azRW5v_Dt7wh
repositories:
enabled: false
servlet:
multipart:
max-file-size: 20MB
max-request-size: 100MB
session:
store-type: redis
redis:
namespace: dgrcb
datasource:
continue-on-error: true
hikari:
maximum-pool-size: 5
initialization-mode: always
url: jdbc:mysql://10.126.158.214:22698/dgrcb?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
username: poc
password: Km@38497130
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
rabbitmq:
username: admin
password: Km@38497130
virtualHost: dgrcb
listener:
simple:
concurrency: 5
acknowledge-mode: manual
max-concurrency: 10
prefetch: 1
host: 10.126.158.214
port: 5672
security:
permit: false
authUser: root
authPwd: pwd
server:
port: 9061
eureka:
client:
user: admin
password: admin
registryFetchIntervalSeconds: 5
region: default
serviceUrl:
defaultZone: http://${eureka.client.user}:${eureka.client.password}@localhost:8081/eureka/
enabled: false
register-with-eureka: false
instance:
preferIpAddress : false
server:
port: 9061
spring:
application:
name: gWorkOrder
cloud:
openfeign:
httpclient:
connection-timeout: 1000
ok-http:
read-timeout: 5000
profiles:
active: default
main:
allow-bean-definition-overriding: true
allow-circular-references: true
management:
metrics:
tags:
application: ${spring.application.name}
endpoints:
health:
show-details: always
web:
exposure:
include: prometheus
logging:
level:
root: info
config: classpath:logback-custom.xml
spring:
application:
name: gWorkOrder
profiles:
active: mcd
cloud:
config:
uri: http://192.168.0.179:8082
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProperty name="redis.host" source="spring.data.redis.host"/>
<springProperty name="redis.port" source="spring.data.redis.port"/>
<springProperty name="redis.password" source="spring.data.redis.password"/>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="UTF-8">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %X{user} %X{session} %-5level %logger{5} - %msg%n</pattern>
</encoder>
</appender>
<appender name="fileout" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/data/logs/iapdgindex/index.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<maxHistory>30</maxHistory>
<fileNamePattern>/data/logs/iapdgindex/index.log.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>5MB</maxFileSize>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %X{user} %X{session} %-5level %logger{5} - %msg%n</pattern>
</encoder>
</appender>
<appender name="logstash" class="com.keymobile.config.logging.RedisAppender">
<host>${redis.host}</host>
<port>${redis.port}</port>
<password>${redis.password}</password>
<key>logstash</key>
<additionalField>
<key>user</key>
<value>@{user}</value>
</additionalField>
<additionalField>
<key>session</key>
<value>@{session}</value>
</additionalField>
</appender>
<logger name="workOrder.API">
<appender-ref ref="logstash"/>
</logger>
<root level="INFO">
<appender-ref ref="stdout"/>
</root>
</configuration>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment