From 43ac462d09de49a3e7fb6a8879fb56b8421c0434 Mon Sep 17 00:00:00 2001
From: yuxc <653031404@qq.com>
Date: 星期二, 28 三月 2023 09:54:18 +0800
Subject: [PATCH] 新建omd微服务以及移植字典功能

---
 Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/mapper/DictBizMapper.java                 |   64 ++
 Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/service/impl/DictBizServiceImpl.java      |  142 ++++++
 Source/BladeX/blade-service/blade-omd/src/main/resources/application-prod.yml                                     |   10 
 Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/service/IDictBizService.java              |  109 ++++
 Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/feign/DictBizClient.java                  |   69 +++
 Source/BladeX/blade-service/blade-omd/src/main/resources/application-dev.yml                                      |   11 
 Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/enums/DictBizEnum.java            |   39 +
 Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/wrapper/DictBizWrapper.java               |   61 ++
 Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/OmdApplication.java                       |   34 +
 Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/entity/DictBizM.java              |  108 ++++
 Source/BladeX/blade-service/blade-omd/src/main/resources/application-test.yml                                     |   10 
 Source/BladeX/blade-service/blade-omd/pom.xml                                                                     |   93 ++++
 Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/vo/DictBizMVO.java                |   71 +++
 Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/controller/DictBizOmdController.java      |  189 ++++++++
 Source/BladeX/blade-service-api/blade-omd-api/pom.xml                                                             |   17 
 Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/feign/IDictBizClient.java         |   84 +++
 Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/mapper/DictBizMapper.xml                  |   51 ++
 Source/BladeX/blade-service/pom.xml                                                                               |    1 
 Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/feign/IDictBizClientFallback.java |   51 ++
 Source/BladeX/blade-service-api/pom.xml                                                                           |    1 
 Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/cache/DictBizCache.java           |  133 +++++
 21 files changed, 1,348 insertions(+), 0 deletions(-)

diff --git a/Source/BladeX/blade-service-api/blade-omd-api/pom.xml b/Source/BladeX/blade-service-api/blade-omd-api/pom.xml
new file mode 100644
index 0000000..922d846
--- /dev/null
+++ b/Source/BladeX/blade-service-api/blade-omd-api/pom.xml
@@ -0,0 +1,17 @@
+<?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">
+    <parent>
+        <artifactId>blade-service-api</artifactId>
+        <groupId>org.springblade</groupId>
+        <version>3.0.1.RELEASE</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>blade-omd-api</artifactId>
+    <name>${project.artifactId}</name>
+    <version>${bladex.project.version}</version>
+    <packaging>jar</packaging>
+
+</project>
diff --git a/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/cache/DictBizCache.java b/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/cache/DictBizCache.java
new file mode 100644
index 0000000..3846a05
--- /dev/null
+++ b/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/cache/DictBizCache.java
@@ -0,0 +1,133 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package org.springblade.omd.cache;
+
+import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.core.tool.utils.StringPool;
+import org.springblade.omd.entity.DictBizM;
+import org.springblade.omd.enums.DictBizEnum;
+import org.springblade.omd.feign.IDictBizClient;
+
+import java.util.List;
+
+import static org.springblade.core.cache.constant.CacheConstant.DICT_CACHE;
+
+/**
+ * 涓氬姟瀛楀吀缂撳瓨宸ュ叿绫�
+ *
+ * @author Chill
+ */
+public class DictBizCache {
+
+	private static final String DICT_ID = "dictBiz:id";
+	private static final String DICT_VALUE = "dictBiz:value";
+	private static final String DICT_LIST = "dictBiz:list";
+
+	private static IDictBizClient dictClient;
+
+	private static IDictBizClient getDictClient() {
+		if (dictClient == null) {
+			dictClient = SpringUtil.getBean(IDictBizClient.class);
+		}
+		return dictClient;
+	}
+
+	/**
+	 * 鑾峰彇瀛楀吀瀹炰綋
+	 *
+	 * @param id 涓婚敭
+	 * @return DictBiz
+	 */
+	public static DictBizM getById(Long id) {
+		String keyPrefix = DICT_ID.concat(StringPool.DASH).concat(AuthUtil.getTenantId()).concat(StringPool.COLON);
+		return CacheUtil.get(DICT_CACHE, keyPrefix, id, () -> {
+			R<DictBizM> result = getDictClient().getById(id);
+			return result.getData();
+		});
+	}
+
+	/**
+	 * 鑾峰彇瀛楀吀鍊�
+	 *
+	 * @param code    瀛楀吀缂栧彿鏋氫妇
+	 * @param dictKey Integer鍨嬪瓧鍏搁敭
+	 * @return String
+	 */
+	public static String getValue(DictBizEnum code, Integer dictKey) {
+		return getValue(code.getName(), dictKey);
+	}
+
+
+	/**
+	 * 鑾峰彇瀛楀吀鍊�
+	 *
+	 * @param code    瀛楀吀缂栧彿
+	 * @param dictKey Integer鍨嬪瓧鍏搁敭
+	 * @return String
+	 */
+	public static String getValue(String code, Integer dictKey) {
+		String keyPrefix = DICT_VALUE.concat(StringPool.DASH).concat(AuthUtil.getTenantId()).concat(StringPool.COLON);
+		return CacheUtil.get(DICT_CACHE, keyPrefix + code + StringPool.COLON, String.valueOf(dictKey), () -> {
+			R<String> result = getDictClient().getValue(code, String.valueOf(dictKey));
+			return result.getData();
+		});
+	}
+
+	/**
+	 * 鑾峰彇瀛楀吀鍊�
+	 *
+	 * @param code    瀛楀吀缂栧彿鏋氫妇
+	 * @param dictKey String鍨嬪瓧鍏搁敭
+	 * @return String
+	 */
+	public static String getValue(DictBizEnum code, String dictKey) {
+		return getValue(code.getName(), dictKey);
+	}
+
+	/**
+	 * 鑾峰彇瀛楀吀鍊�
+	 *
+	 * @param code    瀛楀吀缂栧彿
+	 * @param dictKey String鍨嬪瓧鍏搁敭
+	 * @return String
+	 */
+	public static String getValue(String code, String dictKey) {
+		String keyPrefix = DICT_VALUE.concat(StringPool.DASH).concat(AuthUtil.getTenantId()).concat(StringPool.COLON);
+		return CacheUtil.get(DICT_CACHE, keyPrefix + code + StringPool.COLON, dictKey, () -> {
+			R<String> result = getDictClient().getValue(code, dictKey);
+			return result.getData();
+		});
+	}
+
+	/**
+	 * 鑾峰彇瀛楀吀闆嗗悎
+	 *
+	 * @param code 瀛楀吀缂栧彿
+	 * @return List<DictBiz>
+	 */
+	public static List<DictBizM> getList(String code) {
+		String keyPrefix = DICT_LIST.concat(StringPool.DASH).concat(AuthUtil.getTenantId()).concat(StringPool.COLON);
+		return CacheUtil.get(DICT_CACHE, keyPrefix, code, () -> {
+			R<List<DictBizM>> result = getDictClient().getList(code);
+			return result.getData();
+		});
+	}
+
+}
diff --git a/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/entity/DictBizM.java b/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/entity/DictBizM.java
new file mode 100644
index 0000000..f6fec5d
--- /dev/null
+++ b/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/entity/DictBizM.java
@@ -0,0 +1,108 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package org.springblade.omd.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 瀹炰綋绫�
+ *
+ * @author Chill
+ */
+@Data
+@TableName("pl_sys_dict_biz")
+@ApiModel(value = "DictBiz瀵硅薄", description = "DictBiz瀵硅薄")
+public class DictBizM implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 涓婚敭
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "涓婚敭")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/**
+	 * 绉熸埛ID
+	 */
+	@ApiModelProperty(value = "绉熸埛ID")
+	private String tenantId;
+
+	/**
+	 * 鐖朵富閿�
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "鐖朵富閿�")
+	private Long parentId;
+
+	/**
+	 * 瀛楀吀鐮�
+	 */
+	@ApiModelProperty(value = "瀛楀吀鐮�")
+	private String code;
+
+	/**
+	 * 瀛楀吀鍊�
+	 */
+	@ApiModelProperty(value = "瀛楀吀鍊�")
+	private String dictKey;
+
+	/**
+	 * 瀛楀吀鍚嶇О
+	 */
+	@ApiModelProperty(value = "瀛楀吀鍚嶇О")
+	private String dictValue;
+
+	/**
+	 * 鎺掑簭
+	 */
+	@ApiModelProperty(value = "鎺掑簭")
+	private Integer sort;
+
+	/**
+	 * 瀛楀吀澶囨敞
+	 */
+	@ApiModelProperty(value = "瀛楀吀澶囨敞")
+	private String remark;
+
+	/**
+	 * 鏄惁宸插皝瀛�
+	 */
+	@ApiModelProperty(value = "鏄惁宸插皝瀛�")
+	private Integer isSealed;
+
+	/**
+	 * 鏄惁宸插垹闄�
+	 */
+	@TableLogic
+	@ApiModelProperty(value = "鏄惁宸插垹闄�")
+	private Integer isDeleted;
+
+
+}
diff --git a/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/enums/DictBizEnum.java b/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/enums/DictBizEnum.java
new file mode 100644
index 0000000..1bec1e8
--- /dev/null
+++ b/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/enums/DictBizEnum.java
@@ -0,0 +1,39 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package org.springblade.omd.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 涓氬姟瀛楀吀鏋氫妇绫�
+ *
+ * @author Chill
+ */
+@Getter
+@AllArgsConstructor
+public enum DictBizEnum {
+
+	/**
+	 * 娴嬭瘯
+	 */
+	TEST("test"),
+	;
+
+	final String name;
+
+}
diff --git a/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/feign/IDictBizClient.java b/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/feign/IDictBizClient.java
new file mode 100644
index 0000000..4add47b
--- /dev/null
+++ b/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/feign/IDictBizClient.java
@@ -0,0 +1,84 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package org.springblade.omd.feign;
+
+
+import org.springblade.core.tool.api.R;
+import org.springblade.omd.entity.DictBizM;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * Feign鎺ュ彛绫�
+ *
+ * @author Chill
+ */
+@FeignClient(
+	value = "blade-omd",
+	fallback = IDictBizClientFallback.class
+)
+public interface IDictBizClient {
+
+	String API_PREFIX = "/client";
+	String GET_BY_ID = API_PREFIX + "/dict-biz/get-by-id";
+	String GET_VALUE = API_PREFIX + "/dict-biz/get-value";
+	String GET_LIST = API_PREFIX + "/dict-biz/get-list";
+	String CHECK_VALUE = API_PREFIX + "/dict-biz/check-value";
+
+	/**
+	 * 鑾峰彇瀛楀吀瀹炰綋
+	 *
+	 * @param id 涓婚敭
+	 * @return
+	 */
+	@GetMapping(GET_BY_ID)
+	R<DictBizM> getById(@RequestParam("id") Long id);
+
+	/**
+	 * 鑾峰彇瀛楀吀琛ㄥ搴斿��
+	 *
+	 * @param code    瀛楀吀缂栧彿
+	 * @param dictKey 瀛楀吀搴忓彿
+	 * @return
+	 */
+	@GetMapping(GET_VALUE)
+	R<String> getValue(@RequestParam("code") String code, @RequestParam("dictKey") String dictKey);
+
+	/**
+	 * 鑾峰彇瀛楀吀琛�
+	 *
+	 * @param code 瀛楀吀缂栧彿
+	 * @return
+	 */
+	@GetMapping(GET_LIST)
+	R<List<DictBizM>> getList(@RequestParam("code") String code);
+
+	/**
+	 * 妫�鏌ュ瓧鍏告槸鍚﹀瓨鍦紝瀛樺湪鍗宠繑鍥烇紝涓嶅瓨鍦ㄦ柊澧�
+	 *
+	 * @param dict 瀛楀吀鏁版嵁
+	 * @return
+	 */
+	@GetMapping(CHECK_VALUE)
+	R getCheck(@Valid @RequestBody DictBizM dict);
+
+}
diff --git a/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/feign/IDictBizClientFallback.java b/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/feign/IDictBizClientFallback.java
new file mode 100644
index 0000000..59b2e31
--- /dev/null
+++ b/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/feign/IDictBizClientFallback.java
@@ -0,0 +1,51 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package org.springblade.omd.feign;
+
+import org.springblade.core.tool.api.R;
+import org.springblade.omd.entity.DictBizM;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * Feign澶辫触閰嶇疆
+ *
+ * @author Chill
+ */
+@Component
+public class IDictBizClientFallback implements IDictBizClient {
+	@Override
+	public R<DictBizM> getById(Long id) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<String> getValue(String code, String dictKey) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<List<DictBizM>> getList(String code) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R getCheck(DictBizM dict) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+}
diff --git a/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/vo/DictBizMVO.java b/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/vo/DictBizMVO.java
new file mode 100644
index 0000000..aafd6ba
--- /dev/null
+++ b/Source/BladeX/blade-service-api/blade-omd-api/src/main/java/org/springblade/omd/vo/DictBizMVO.java
@@ -0,0 +1,71 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package org.springblade.omd.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tool.node.INode;
+import org.springblade.omd.entity.DictBizM;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 瑙嗗浘瀹炰綋绫�
+ *
+ * @author Chill
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "DictBizVO瀵硅薄", description = "DictBizVO瀵硅薄")
+public class DictBizMVO extends DictBizM implements INode<DictBizM> {
+	private static final long serialVersionUID = 1L;
+	/**
+	 * 涓婚敭ID
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long id;
+
+	/**
+	 * 鐖惰妭鐐笽D
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long parentId;
+
+	/**
+	 * 瀛愬瓩鑺傜偣
+	 */
+	@JsonInclude(JsonInclude.Include.NON_EMPTY)
+	private List<DictBizM> children;
+
+	@Override
+	public List<DictBizM> getChildren() {
+		if (this.children == null) {
+			this.children = new ArrayList<>();
+		}
+		return this.children;
+	}
+
+	/**
+	 * 涓婄骇瀛楀吀
+	 */
+	private String parentName;
+}
diff --git a/Source/BladeX/blade-service-api/pom.xml b/Source/BladeX/blade-service-api/pom.xml
index b4a57f8..effd0cb 100644
--- a/Source/BladeX/blade-service-api/pom.xml
+++ b/Source/BladeX/blade-service-api/pom.xml
@@ -22,6 +22,7 @@
         <module>blade-system-api</module>
         <module>blade-user-api</module>
         <module>blade-code-api</module>
+        <module>blade-omd-api</module>
     </modules>
 
     <dependencies>
diff --git a/Source/BladeX/blade-service/blade-omd/pom.xml b/Source/BladeX/blade-service/blade-omd/pom.xml
new file mode 100644
index 0000000..40d7c15
--- /dev/null
+++ b/Source/BladeX/blade-service/blade-omd/pom.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0"?>
+<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">
+
+    <parent>
+        <groupId>org.springblade</groupId>
+        <artifactId>blade-service</artifactId>
+        <version>3.0.1.RELEASE</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>blade-omd</artifactId>
+    <name>${project.artifactId}</name>
+    <version>${bladex.project.version}</version>
+    <packaging>jar</packaging>
+
+    <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-omd-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-flow-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+
+        <!--Oss-->
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-oss</artifactId>
+        </dependency>
+        <!--MinIO-->
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+        </dependency>
+        <!--QiNiu-->
+        <dependency>
+            <groupId>com.qiniu</groupId>
+            <artifactId>qiniu-java-sdk</artifactId>
+        </dependency>
+        <!--<dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-transaction</artifactId>
+        </dependency>-->
+        <dependency>
+            <groupId>com.oracle.database.jdbc</groupId>
+            <artifactId>ojdbc8</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.easyproject</groupId>
+            <artifactId>orai18n</artifactId>
+            <version>${orai18n.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <username>${docker.username}</username>
+                    <password>${docker.password}</password>
+                    <repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
+                    <tag>${project.version}</tag>
+                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
+                    <buildArgs>
+                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/OmdApplication.java b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/OmdApplication.java
new file mode 100644
index 0000000..e7d2dd2
--- /dev/null
+++ b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/OmdApplication.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package org.springblade.omd;
+
+import org.springblade.core.cloud.client.BladeCloudApplication;
+import org.springblade.core.launch.BladeApplication;
+
+/**
+ * 绯荤粺妯″潡鍚姩鍣�
+ * @author Chill
+ */
+@BladeCloudApplication
+public class OmdApplication {
+
+	public static void main(String[] args) {
+		BladeApplication.run("blade-omd", OmdApplication.class, args);
+	}
+
+}
+
diff --git a/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/controller/DictBizOmdController.java b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/controller/DictBizOmdController.java
new file mode 100644
index 0000000..e3d4b3c
--- /dev/null
+++ b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/controller/DictBizOmdController.java
@@ -0,0 +1,189 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package org.springblade.omd.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.*;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tool.api.R;
+import org.springblade.omd.entity.DictBizM;
+import org.springblade.omd.service.IDictBizService;
+import org.springblade.omd.vo.DictBizMVO;
+import org.springblade.omd.wrapper.DictBizWrapper;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+import static org.springblade.core.cache.constant.CacheConstant.DICT_CACHE;
+
+/**
+ * 鎺у埗鍣�
+ *
+ * @author Chill
+ */
+@NonDS
+@RestController
+@AllArgsConstructor
+@RequestMapping("/dict-biz")
+@Api(value = "涓氬姟瀛楀吀", tags = "涓氬姟瀛楀吀")
+public class DictBizOmdController extends BladeController {
+
+	private final IDictBizService dictService;
+
+	/**
+	 * 璇︽儏
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "璇︽儏", notes = "浼犲叆dict")
+	public R<DictBizMVO> detail(DictBizM dict) {
+		DictBizM detail = dictService.getOne(Condition.getQueryWrapper(dict));
+		return R.data(DictBizWrapper.build().entityVO(detail));
+	}
+
+	/**
+	 * 鍒楄〃
+	 */
+	@GetMapping("/list")
+	@ApiImplicitParams({
+		@ApiImplicitParam(name = "code", value = "瀛楀吀缂栧彿", paramType = "query", dataType = "string"),
+		@ApiImplicitParam(name = "dictValue", value = "瀛楀吀鍚嶇О", paramType = "query", dataType = "string")
+	})
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "鍒楄〃", notes = "浼犲叆dict")
+	public R<List<DictBizMVO>> list(@ApiIgnore @RequestParam Map<String, Object> dict) {
+		List<DictBizM> list = dictService.list(Condition.getQueryWrapper(dict, DictBizM.class).lambda().orderByAsc(DictBizM::getSort));
+		return R.data(DictBizWrapper.build().listNodeVO(list));
+	}
+
+	/**
+	 * 椤剁骇鍒楄〃
+	 */
+	@GetMapping("/parent-list")
+	@ApiImplicitParams({
+		@ApiImplicitParam(name = "code", value = "瀛楀吀缂栧彿", paramType = "query", dataType = "string"),
+		@ApiImplicitParam(name = "dictValue", value = "瀛楀吀鍚嶇О", paramType = "query", dataType = "string")
+	})
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "鍒楄〃", notes = "浼犲叆dict")
+	public R<IPage<DictBizMVO>> parentList(@ApiIgnore @RequestParam Map<String, Object> dict, Query query) {
+		return R.data(dictService.parentList(dict, query));
+	}
+
+	/**
+	 * 瀛愬垪琛�
+	 */
+	@GetMapping("/child-list")
+	@ApiImplicitParams({
+		@ApiImplicitParam(name = "code", value = "瀛楀吀缂栧彿", paramType = "query", dataType = "string"),
+		@ApiImplicitParam(name = "dictValue", value = "瀛楀吀鍚嶇О", paramType = "query", dataType = "string"),
+		@ApiImplicitParam(name = "parentId", value = "瀛楀吀鍚嶇О", paramType = "query", dataType = "string")
+	})
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "鍒楄〃", notes = "浼犲叆dict")
+	public R<List<DictBizMVO>> childList(@ApiIgnore @RequestParam Map<String, Object> dict, @RequestParam(required = false, defaultValue = "-1") Long parentId) {
+		return R.data(dictService.childList(dict, parentId));
+	}
+
+	/**
+	 * 鑾峰彇瀛楀吀鏍戝舰缁撴瀯
+	 */
+	@GetMapping("/tree")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "鏍戝舰缁撴瀯", notes = "鏍戝舰缁撴瀯")
+	public R<List<DictBizMVO>> tree() {
+		List<DictBizMVO> tree = dictService.tree();
+		return R.data(tree);
+	}
+
+	/**
+	 * 鑾峰彇瀛楀吀鏍戝舰缁撴瀯
+	 */
+	@GetMapping("/parent-tree")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "鏍戝舰缁撴瀯", notes = "鏍戝舰缁撴瀯")
+	public R<List<DictBizMVO>> parentTree() {
+		List<DictBizMVO> tree = dictService.parentTree();
+		return R.data(tree);
+	}
+
+	/**
+	 * 鏂板鎴栦慨鏀�
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "鏂板鎴栦慨鏀�", notes = "浼犲叆dict")
+	public R submit(@Valid @RequestBody DictBizM dict) {
+		CacheUtil.clear(DICT_CACHE);
+		return R.status(dictService.submit(dict));
+	}
+
+
+	/**
+	 * 鍒犻櫎
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "鍒犻櫎", notes = "浼犲叆ids")
+	public R remove(@ApiParam(value = "涓婚敭闆嗗悎", required = true) @RequestParam String ids) {
+		CacheUtil.clear(DICT_CACHE);
+		return R.status(dictService.removeDict(ids));
+	}
+
+	/**
+	 * 鑾峰彇瀛楀吀
+	 */
+	@GetMapping("/dictionary")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "鑾峰彇瀛楀吀", notes = "鑾峰彇瀛楀吀")
+	public R<List<DictBizM>> dictionary(String code) {
+		List<DictBizM> tree = dictService.getList(code);
+		return R.data(tree);
+	}
+
+	/**
+	 * 鑾峰彇瀛楀吀鏍�
+	 */
+	@GetMapping("/dictionary-tree")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "鑾峰彇瀛楀吀鏍�", notes = "鑾峰彇瀛楀吀鏍�")
+	public R<List<DictBizMVO>> dictionaryTree(String code) {
+		List<DictBizM> tree = dictService.getList(code);
+		return R.data(DictBizWrapper.build().listNodeVO(tree));
+	}
+
+	/**
+	 * 妫�鏌ュ瓧鍏告槸鍚﹀瓨鍦紝瀛樺湪鍗宠繑鍥烇紝涓嶅瓨鍦ㄦ柊澧�
+	 */
+	@PostMapping("/check")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "鏂板鎴栦慨鏀�", notes = "浼犲叆dict")
+	public R checkOrInsert(@Valid @RequestBody DictBizM dict) {
+		CacheUtil.clear(DICT_CACHE);
+		return dictService.checkOrInsert(dict);
+	}
+
+}
diff --git a/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/feign/DictBizClient.java b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/feign/DictBizClient.java
new file mode 100644
index 0000000..eb3b366
--- /dev/null
+++ b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/feign/DictBizClient.java
@@ -0,0 +1,69 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package org.springblade.omd.feign;
+
+
+import lombok.AllArgsConstructor;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tool.api.R;
+import org.springblade.omd.entity.DictBizM;
+import org.springblade.omd.service.IDictBizService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+import java.util.List;
+
+
+/**
+ * 瀛楀吀鏈嶅姟Feign瀹炵幇绫�
+ *
+ * @author Chill
+ */
+@NonDS
+@ApiIgnore
+@RestController
+@AllArgsConstructor
+public class DictBizClient implements IDictBizClient {
+
+	private final IDictBizService service;
+
+	@Override
+	@GetMapping(GET_BY_ID)
+	public R<DictBizM> getById(Long id) {
+		return R.data(service.getById(id));
+	}
+
+	@Override
+	@GetMapping(GET_VALUE)
+	public R<String> getValue(String code, String dictKey) {
+		return R.data(service.getValue(code, dictKey));
+	}
+
+	@Override
+	@GetMapping(GET_LIST)
+	public R<List<DictBizM>> getList(String code) {
+		return R.data(service.getList(code));
+	}
+
+	@Override
+	@GetMapping(CHECK_VALUE)
+	public R getCheck(DictBizM dict) {
+		return service.checkOrInsert(dict);
+	}
+
+}
diff --git a/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/mapper/DictBizMapper.java b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/mapper/DictBizMapper.java
new file mode 100644
index 0000000..c835d01
--- /dev/null
+++ b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/mapper/DictBizMapper.java
@@ -0,0 +1,64 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package org.springblade.omd.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.omd.entity.DictBizM;
+import org.springblade.omd.vo.DictBizMVO;
+
+import java.util.List;
+
+/**
+ * Mapper 鎺ュ彛
+ *
+ * @author Chill
+ */
+public interface DictBizMapper extends BaseMapper<DictBizM> {
+
+	/**
+	 * 鑾峰彇瀛楀吀琛ㄥ搴斾腑鏂�
+	 *
+	 * @param code    瀛楀吀缂栧彿
+	 * @param dictKey 瀛楀吀搴忓彿
+	 * @return
+	 */
+	String getValue(String code, String dictKey);
+
+	/**
+	 * 鑾峰彇瀛楀吀琛�
+	 *
+	 * @param code 瀛楀吀缂栧彿
+	 * @return
+	 */
+	List<DictBizM> getList(String code);
+
+	/**
+	 * 鑾峰彇鏍戝舰鑺傜偣
+	 *
+	 * @return
+	 */
+	List<DictBizMVO> tree();
+
+	/**
+	 * 鑾峰彇鏍戝舰鑺傜偣
+	 *
+	 * @return
+	 */
+	List<DictBizMVO> parentTree();
+
+}
diff --git a/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/mapper/DictBizMapper.xml b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/mapper/DictBizMapper.xml
new file mode 100644
index 0000000..f75b087
--- /dev/null
+++ b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/mapper/DictBizMapper.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.omd.mapper.DictBizMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="dictResultMap" type="org.springblade.omd.entity.DictBizM">
+        <id column="id" property="id"/>
+        <result column="tenant_id" property="tenantId"/>
+        <result column="parent_id" property="parentId"/>
+        <result column="code" property="code"/>
+        <result column="dict_key" property="dictKey"/>
+        <result column="dict_value" property="dictValue"/>
+        <result column="sort" property="sort"/>
+        <result column="remark" property="remark"/>
+        <result column="is_deleted" property="isDeleted"/>
+    </resultMap>
+
+    <resultMap id="treeNodeResultMap" type="org.springblade.core.tool.node.TreeNode">
+        <id column="id" property="id"/>
+        <result column="parent_id" property="parentId"/>
+        <result column="title" property="title"/>
+        <result column="value" property="value"/>
+        <result column="key" property="key"/>
+    </resultMap>
+
+    <select id="getValue" resultType="java.lang.String">
+        select
+            dict_value
+        from pl_sys_dict_biz where code = #{param1} and dict_key = #{param2} and is_deleted = 0
+    </select>
+
+    <!-- oracle 鐗堟湰 -->
+    <!--<select id="getValue" resultType="java.lang.String">
+        select
+            dict_value
+        from pl_sys_dict_biz where code = #{param1, jdbcType=VARCHAR} and dict_key = #{param2} and dict_key >= 0  rownum 1
+    </select>-->
+
+    <select id="getList" resultMap="dictResultMap">
+        select id, tenant_id, parent_id, code, dict_key, dict_value, sort, remark from pl_sys_dict_biz where code = #{param1} and parent_id > 0 and is_sealed = 0 and is_deleted = 0
+    </select>
+
+    <select id="tree" resultMap="treeNodeResultMap">
+        select id, parent_id, dict_value as title, id as "value", id as "key" from pl_sys_dict_biz where is_deleted = 0
+    </select>
+
+    <select id="parentTree" resultMap="treeNodeResultMap">
+        select id, parent_id, dict_value as title, id as "value", id as "key" from pl_sys_dict_biz where is_deleted = 0 and parent_id = 0
+    </select>
+
+</mapper>
diff --git a/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/service/IDictBizService.java b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/service/IDictBizService.java
new file mode 100644
index 0000000..506c635
--- /dev/null
+++ b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/service/IDictBizService.java
@@ -0,0 +1,109 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package org.springblade.omd.service;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.omd.entity.DictBizM;
+import org.springblade.omd.vo.DictBizMVO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏈嶅姟绫�
+ *
+ * @author Chill
+ */
+public interface IDictBizService extends IService<DictBizM> {
+
+	/**
+	 * 鏍戝舰缁撴瀯
+	 *
+	 * @return
+	 */
+	List<DictBizMVO> tree();
+
+	/**
+	 * 鏍戝舰缁撴瀯
+	 *
+	 * @return
+	 */
+	List<DictBizMVO> parentTree();
+
+	/**
+	 * 鑾峰彇瀛楀吀琛ㄥ搴斾腑鏂�
+	 *
+	 * @param code    瀛楀吀缂栧彿
+	 * @param dictKey 瀛楀吀搴忓彿
+	 * @return
+	 */
+	String getValue(String code, String dictKey);
+
+	/**
+	 * 鑾峰彇瀛楀吀琛�
+	 *
+	 * @param code 瀛楀吀缂栧彿
+	 * @return
+	 */
+	List<DictBizM> getList(String code);
+
+	/**
+	 * 鏂板鎴栦慨鏀�
+	 *
+	 * @param dict
+	 * @return
+	 */
+	boolean submit(DictBizM dict);
+
+	/**
+	 * 鍒犻櫎瀛楀吀
+	 *
+	 * @param ids
+	 * @return
+	 */
+	boolean removeDict(String ids);
+
+	/**
+	 * 椤剁骇鍒楄〃
+	 *
+	 * @param dict
+	 * @param query
+	 * @return
+	 */
+	IPage<DictBizMVO> parentList(Map<String, Object> dict, Query query);
+
+	/**
+	 * 瀛愬垪琛�
+	 *
+	 * @param dict
+	 * @param parentId
+	 * @return
+	 */
+	List<DictBizMVO> childList(Map<String, Object> dict, Long parentId);
+
+	/**
+	 * 鏂板鎴栦慨鏀�
+	 *
+	 * @param dict
+	 * @return
+	 */
+	R checkOrInsert(DictBizM dict);
+}
diff --git a/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/service/impl/DictBizServiceImpl.java b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/service/impl/DictBizServiceImpl.java
new file mode 100644
index 0000000..168ae02
--- /dev/null
+++ b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/service/impl/DictBizServiceImpl.java
@@ -0,0 +1,142 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package org.springblade.omd.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.common.constant.CommonConstant;
+import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.constant.BladeConstant;
+import org.springblade.core.tool.node.ForestNodeMerger;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringPool;
+import org.springblade.omd.cache.DictBizCache;
+import org.springblade.omd.entity.DictBizM;
+import org.springblade.omd.mapper.DictBizMapper;
+import org.springblade.omd.service.IDictBizService;
+import org.springblade.omd.vo.DictBizMVO;
+import org.springblade.omd.wrapper.DictBizWrapper;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import static org.springblade.core.cache.constant.CacheConstant.DICT_CACHE;
+
+/**
+ * 鏈嶅姟瀹炵幇绫�
+ *
+ * @author Chill
+ */
+@Service
+public class DictBizServiceImpl extends ServiceImpl<DictBizMapper, DictBizM> implements IDictBizService {
+
+	@Override
+	public List tree() {
+		return  ForestNodeMerger.merge((List)baseMapper.tree());
+	}
+
+	@Override
+	public List<DictBizMVO> parentTree() {
+		return ForestNodeMerger.merge((List)baseMapper.parentTree());
+	}
+
+	@Override
+	public String getValue(String code, String dictKey) {
+		return Func.toStr(baseMapper.getValue(code, dictKey), StringPool.EMPTY);
+	}
+
+	@Override
+	public List<DictBizM> getList(String code) {
+		return baseMapper.getList(code);
+	}
+
+	@Override
+	public boolean submit(DictBizM dict) {
+		LambdaQueryWrapper<DictBizM> lqw = Wrappers.<DictBizM>query().lambda().eq(DictBizM::getCode, dict.getCode()).eq(DictBizM::getDictKey, dict.getDictKey());
+		Long cnt = baseMapper.selectCount((Func.isEmpty(dict.getId())) ? lqw : lqw.notIn(DictBizM::getId, dict.getId()));
+		if (cnt > 0L) {
+			throw new ServiceException("褰撳墠瀛楀吀閿�煎凡瀛樺湪!");
+		}
+		// 淇敼椤剁骇瀛楀吀鍚庡悓姝ユ洿鏂颁笅灞炲瓧鍏哥殑缂栧彿
+		if (Func.isNotEmpty(dict.getId()) && dict.getParentId().longValue() == BladeConstant.TOP_PARENT_ID) {
+			DictBizM parent = DictBizCache.getById(dict.getId());
+			this.update(Wrappers.<DictBizM>update().lambda().set(DictBizM::getCode, dict.getCode()).eq(DictBizM::getCode, parent.getCode()).ne(DictBizM::getParentId, BladeConstant.TOP_PARENT_ID));
+		}
+		if (Func.isEmpty(dict.getParentId())) {
+			dict.setParentId(BladeConstant.TOP_PARENT_ID);
+		}
+		dict.setIsDeleted(BladeConstant.DB_NOT_DELETED);
+		CacheUtil.clear(DICT_CACHE);
+		return saveOrUpdate(dict);
+	}
+
+	@Override
+	public boolean removeDict(String ids) {
+		Long cnt = baseMapper.selectCount(Wrappers.<DictBizM>query().lambda().in(DictBizM::getParentId, Func.toLongList(ids)));
+		if (cnt > 0L) {
+			throw new ServiceException("璇峰厛鍒犻櫎瀛愯妭鐐�!");
+		}
+		return removeByIds(Func.toLongList(ids));
+	}
+
+	@Override
+	public IPage<DictBizMVO> parentList(Map<String, Object> dict, Query query) {
+		IPage<DictBizM> page = this.page(Condition.getPage(query), Condition.getQueryWrapper(dict, DictBizM.class).lambda().eq(DictBizM::getParentId, CommonConstant.TOP_PARENT_ID).orderByAsc(DictBizM::getSort));
+		return DictBizWrapper.build().pageVO(page);
+	}
+
+	@Override
+	public List<DictBizMVO> childList(Map<String, Object> dict, Long parentId) {
+		if (parentId < 0) {
+			return new ArrayList<>();
+		}
+		dict.remove("parentId");
+		DictBizM parentDict = DictBizCache.getById(parentId);
+		List<DictBizM> list = this.list(Condition.getQueryWrapper(dict, DictBizM.class).lambda().ne(DictBizM::getId, parentId).eq(DictBizM::getCode, parentDict.getCode()).orderByAsc(DictBizM::getSort));
+		return DictBizWrapper.build().listNodeVO(list);
+	}
+
+    @Override
+    public R checkOrInsert(DictBizM dict) {
+
+		LambdaQueryWrapper<DictBizM> lqw = Wrappers.<DictBizM>query().lambda().eq(DictBizM::getCode, dict.getCode()).eq(DictBizM::getDictKey, dict.getDictKey());
+		Long cnt = baseMapper.selectCount((Func.isEmpty(dict.getId())) ? lqw : lqw.notIn(DictBizM::getId, dict.getId()));
+		if (cnt > 0L) {
+			return R.fail("瀛楀吀宸茬粡瀛樺湪锛�");
+		}
+
+		if (Func.isEmpty(dict.getParentId())) {
+			dict.setParentId(BladeConstant.TOP_PARENT_ID);
+		}
+		dict.setIsDeleted(BladeConstant.DB_NOT_DELETED);
+		CacheUtil.clear(DICT_CACHE);
+
+		if(saveOrUpdate(dict) == true){
+			return R.success("鎿嶄綔鎴愬姛!");
+		}
+		return R.fail("鎿嶄綔澶辫触锛�");
+
+    }
+}
diff --git a/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/wrapper/DictBizWrapper.java b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/wrapper/DictBizWrapper.java
new file mode 100644
index 0000000..c1324ab
--- /dev/null
+++ b/Source/BladeX/blade-service/blade-omd/src/main/java/org/springblade/omd/wrapper/DictBizWrapper.java
@@ -0,0 +1,61 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package org.springblade.omd.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.constant.BladeConstant;
+import org.springblade.core.tool.node.ForestNodeMerger;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.omd.cache.DictBizCache;
+import org.springblade.omd.entity.DictBizM;
+import org.springblade.omd.vo.DictBizMVO;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+
+/**
+ * 鍖呰绫�,杩斿洖瑙嗗浘灞傛墍闇�鐨勫瓧娈�
+ *
+ * @author Chill
+ */
+public class DictBizWrapper extends BaseEntityWrapper<DictBizM, DictBizMVO> {
+
+	public static DictBizWrapper build() {
+		return new DictBizWrapper();
+	}
+
+	@Override
+	public DictBizMVO entityVO(DictBizM dict) {
+		DictBizMVO dictVO = Objects.requireNonNull(BeanUtil.copy(dict, DictBizMVO.class));
+		if (Func.equals(dict.getParentId(), BladeConstant.TOP_PARENT_ID)) {
+			dictVO.setParentName(BladeConstant.TOP_PARENT_NAME);
+		} else {
+			DictBizM parent = DictBizCache.getById(dict.getParentId());
+			dictVO.setParentName(parent.getDictValue());
+		}
+		return dictVO;
+	}
+
+	public List<DictBizMVO> listNodeVO(List<DictBizM> list) {
+		List<DictBizMVO> collect = list.stream().map(dict -> BeanUtil.copy(dict, DictBizMVO.class)).collect(Collectors.toList());
+		return ForestNodeMerger.merge((List)collect);
+	}
+
+}
diff --git a/Source/BladeX/blade-service/blade-omd/src/main/resources/application-dev.yml b/Source/BladeX/blade-service/blade-omd/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..5fdf0dc
--- /dev/null
+++ b/Source/BladeX/blade-service/blade-omd/src/main/resources/application-dev.yml
@@ -0,0 +1,11 @@
+#鏈嶅姟鍣ㄧ鍙�
+server:
+  port: 36015
+
+#鏁版嵁婧愰厤缃�
+spring:
+  datasource:
+    url: ${blade.datasource.dev.url}
+    username: ${blade.datasource.dev.username}
+    password: ${blade.datasource.dev.password}
+
diff --git a/Source/BladeX/blade-service/blade-omd/src/main/resources/application-prod.yml b/Source/BladeX/blade-service/blade-omd/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..08082e2
--- /dev/null
+++ b/Source/BladeX/blade-service/blade-omd/src/main/resources/application-prod.yml
@@ -0,0 +1,10 @@
+#鏈嶅姟鍣ㄧ鍙�
+server:
+  port: 8105
+
+#鏁版嵁婧愰厤缃�
+spring:
+  datasource:
+    url: ${blade.datasource.prod.url}
+    username: ${blade.datasource.prod.username}
+    password: ${blade.datasource.prod.password}
diff --git a/Source/BladeX/blade-service/blade-omd/src/main/resources/application-test.yml b/Source/BladeX/blade-service/blade-omd/src/main/resources/application-test.yml
new file mode 100644
index 0000000..a40a289
--- /dev/null
+++ b/Source/BladeX/blade-service/blade-omd/src/main/resources/application-test.yml
@@ -0,0 +1,10 @@
+#鏈嶅姟鍣ㄧ鍙�
+server:
+  port: 8105
+
+#鏁版嵁婧愰厤缃�
+spring:
+  datasource:
+    url: ${blade.datasource.test.url}
+    username: ${blade.datasource.test.username}
+    password: ${blade.datasource.test.password}
diff --git a/Source/BladeX/blade-service/pom.xml b/Source/BladeX/blade-service/pom.xml
index ae9fcd7..6920bb2 100644
--- a/Source/BladeX/blade-service/pom.xml
+++ b/Source/BladeX/blade-service/pom.xml
@@ -22,6 +22,7 @@
         <module>blade-system</module>
         <module>blade-user</module>
         <module>blade-code</module>
+        <module>blade-omd</module>
     </modules>
 
     <dependencies>

--
Gitblit v1.9.3