From 616ca0caf25685efec6094686f01c0413f869af9 Mon Sep 17 00:00:00 2001
From: 杜洪波 <1074825718@qq.com>
Date: 星期二, 24 三月 2026 18:26:20 +0800
Subject: [PATCH] 系统租户和租户合同提交

---
 src/main/java/com/product/saas/service/SystemContractService.java       |  118 +++++++++++++++++++
 src/main/java/com/product/saas/service/TenantApplyService.java          |    6 
 src/main/java/com/product/saas/controller/SaasClientController.java     |   68 +++++++++++
 src/main/java/com/product/saas/controller/SystemContractController.java |   44 +++++++
 src/main/java/com/product/saas/service/SaasClientService.java           |   76 ++++++++++++
 src/main/java/com/product/saas/config/SaasConst.java                    |    2 
 6 files changed, 312 insertions(+), 2 deletions(-)

diff --git a/src/main/java/com/product/saas/config/SaasConst.java b/src/main/java/com/product/saas/config/SaasConst.java
index 67fe569..6647200 100644
--- a/src/main/java/com/product/saas/config/SaasConst.java
+++ b/src/main/java/com/product/saas/config/SaasConst.java
@@ -9,6 +9,8 @@
 	
 	//琛ㄥ悕甯搁噺
 	public static final String PRODUCT_SYS_TENANT_APPLY =  "product_sys_tenant_apply";
+	public static final String PRODUCT_SYS_CLIENTS =  "product_sys_clients";
+	public static final String PRODUCT_SYS_CONTRACT =  "product_sys_contract";
 	
 	//瀛楁甯搁噺
 }
diff --git a/src/main/java/com/product/saas/controller/SaasClientController.java b/src/main/java/com/product/saas/controller/SaasClientController.java
new file mode 100644
index 0000000..516a00c
--- /dev/null
+++ b/src/main/java/com/product/saas/controller/SaasClientController.java
@@ -0,0 +1,68 @@
+package com.product.saas.controller;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.product.admin.config.SystemCode;
+import com.product.core.controller.support.AbstractBaseController;
+import com.product.core.entity.FieldSetEntity;
+import com.product.module.sys.version.ApiVersion;
+import com.product.saas.config.SaasCode;
+import com.product.saas.config.SaasConst;
+import com.product.saas.service.SaasClientService;
+import com.product.util.BaseUtil;
+
+/**
+ *	SAAS绯荤粺绉熸埛 	
+ *
+ */
+@RequestMapping("/api/saas-client")
+@RestController
+public class SaasClientController extends AbstractBaseController{
+
+	@Autowired
+	SaasClientService saasClientService;
+	
+	/**
+	 * 	绉熸埛鍒楄〃
+	 * @param request
+	 * @return
+	 */
+	@RequestMapping("/list-client/{version}")
+	@ApiVersion(1)
+	public String listClient(HttpServletRequest request) {
+		try {
+			FieldSetEntity fse = BaseUtil.getFieldSetEntity(request, SaasConst.PRODUCT_SYS_CLIENTS);
+			if(BaseUtil.strIsNull(fse.getString(SaasConst.CPAGE)) || BaseUtil.strIsNull(fse.getString(SaasConst.PAGESIZE))) {
+				return error(SystemCode.SYSTEM_CPAGES_NOT_NULL.getValue(), SystemCode.SYSTEM_CPAGES_NOT_NULL.getText());
+			}
+			return OK_List(saasClientService.listClient(fse));
+		} catch (Exception e) {
+			e.printStackTrace();
+			return error(SaasCode.TENANT_INFO_GET_LIST_FAIL.getValue(), SaasCode.TENANT_INFO_GET_LIST_FAIL.getText() + e.getMessage());
+		}
+	}
+	
+	/**
+	 * 	绉熸埛鍒楄〃
+	 * @param request
+	 * @return
+	 */
+	@RequestMapping("/find-client/{version}")
+	@ApiVersion(1)
+	public String findClient(HttpServletRequest request) {
+		try {
+			FieldSetEntity fse = BaseUtil.getFieldSetEntity(request, SaasConst.PRODUCT_SYS_CLIENTS);
+			if(BaseUtil.strIsNull(fse.getUUID())) {
+				return error(SystemCode.SYSTEM_FORM_COUNT.getValue(), SystemCode.SYSTEM_FORM_COUNT.getText());
+			}
+			return OK_List(saasClientService.findClient(fse.getUUID()));
+		} catch (Exception e) {
+			e.printStackTrace();
+			return error(SaasCode.TENANT_INFO_GET_LIST_FAIL.getValue(), SaasCode.TENANT_INFO_GET_LIST_FAIL.getText() + e.getMessage());
+		}
+	}
+}
diff --git a/src/main/java/com/product/saas/controller/SystemContractController.java b/src/main/java/com/product/saas/controller/SystemContractController.java
new file mode 100644
index 0000000..196aefa
--- /dev/null
+++ b/src/main/java/com/product/saas/controller/SystemContractController.java
@@ -0,0 +1,44 @@
+package com.product.saas.controller;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.product.admin.config.SystemCode;
+import com.product.saas.config.SaasConst;
+import com.product.saas.service.SystemContractService;
+import com.product.core.controller.support.AbstractBaseController;
+import com.product.core.entity.FieldSetEntity;
+import com.product.core.exception.BaseException;
+import com.product.module.sys.version.ApiVersion;
+import com.product.util.BaseUtil;
+
+@RequestMapping("/api/system-contract")
+@RestController
+public class SystemContractController extends AbstractBaseController{
+
+	@Autowired
+	SystemContractService systemContractService;
+	
+	/**
+	 * 鑾峰彇绉熸埛鏈�鏂板悎鍚屼俊鎭�
+	 * @param request
+	 * @return
+	 */
+	@RequestMapping("/find-contract/{version}")
+	@ApiVersion(1)
+    public String findContract(HttpServletRequest request){
+        try {
+        	FieldSetEntity fse = BaseUtil.getFieldSetEntity(request, SaasConst.PRODUCT_SYS_CONTRACT);
+            return OK_List(systemContractService.findContract(fse.getString("uuid")));
+        } catch (BaseException e) {
+            e.printStackTrace();
+            return this.error(e);
+        }catch (Exception e){
+            e.printStackTrace();
+            return error(SystemCode.GET_FUNCTION_TREE_FAIL.getValue(),SystemCode.GET_FUNCTION_TREE_FAIL.getText()+e.getMessage());
+        }
+    }
+}
diff --git a/src/main/java/com/product/saas/service/SaasClientService.java b/src/main/java/com/product/saas/service/SaasClientService.java
new file mode 100644
index 0000000..60820d0
--- /dev/null
+++ b/src/main/java/com/product/saas/service/SaasClientService.java
@@ -0,0 +1,76 @@
+package com.product.saas.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.product.core.dao.BaseDao;
+import com.product.core.entity.DataTableEntity;
+import com.product.core.entity.FieldSetEntity;
+import com.product.core.service.support.AbstractBaseService;
+import com.product.core.spring.context.SpringMVCContextHolder;
+import com.product.module.sys.entity.SystemUser;
+import com.product.util.BaseUtil;
+
+/**
+ *	绉熸埛淇℃伅 
+ *
+ */
+@Service
+public class SaasClientService extends AbstractBaseService{
+
+	@Autowired
+	BaseDao baseDao;
+	
+	/**
+	 * 绉熸埛鍒楄〃
+	 * @param fse
+	 * @return
+	 */
+	public DataTableEntity listClient(FieldSetEntity fse) {
+		SystemUser user = SpringMVCContextHolder.getCurrentUser();
+		if (user == null) {
+			return null;
+		}
+		List<Object> param = new ArrayList<>();;
+		StringBuilder sql = new StringBuilder();
+		sql.append("\n SELECT");
+		sql.append("\n   A.uuid,A.client_name,A.client_unit_type,A.platform_admin,A.expiration_date,B.apply_status,");
+		sql.append("\n   E.user_name AS client_admin,E.user_mobile_number AS client_admin_phone,E.user_primary_email AS client_admin_email  ");
+		sql.append("\n FROM product_sys_clients A");
+		sql.append("\n LEFT JOIN product_sys_tenant_apply B ON B.client_uuid = A.uuid ");
+		sql.append("\n LEFT JOIN product_sys_org_levels C ON C.client_uuid = A.uuid AND C.org_level_type = 0 ");
+		sql.append("\n LEFT JOIN product_sys_org_manager D ON D.org_level_uuid = C.uuid ");
+		sql.append("\n LEFT JOIN product_sys_users E ON E.user_id = D.user_id ");
+		sql.append("\n WHERE A.uuid != '00000000-0000-0000-0000-000000000000' ");
+		FieldSetEntity fsePost = user.getJobPost();
+		if(fsePost.getString("job_post_name").contains("骞冲彴绠$悊鍛�")) {
+			param.add(user.getUser_id());
+			sql.append("\n AND A.platform_admin = ?");
+		}
+		DataTableEntity dte = baseDao.listTable(sql.toString(), param.toArray(), fse.getInteger("pagesize"), fse.getInteger("cpage"));
+		if (!BaseUtil.dataTableIsEmpty(dte)) {
+			baseDao.loadPromptData(dte);
+		}
+		return dte;
+	}
+	
+	/**
+	 * 	绉熸埛璇︽儏
+	 * @param uuid
+	 * @return
+	 */
+	public FieldSetEntity findClient(String uuid) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("\n SELECT A.*,B.legal_person,B.credit_code,B.business_license,E.user_name,E.user_mobile_number,E.user_primary_email ");
+		sql.append("\n FROM product_sys_clients A ");
+		sql.append("\n LEFT JOIN product_sys_tenant_apply B ON B.client_uuid = A.uuid ");
+		sql.append("\n LEFT JOIN product_sys_org_levels C ON C.client_uuid = A.uuid AND C.org_level_type = 0 ");
+		sql.append("\n LEFT JOIN product_sys_org_manager D ON D.org_level_uuid = C.uuid ");
+		sql.append("\n LEFT JOIN product_sys_users E ON E.user_id = D.user_id ");
+		sql.append("\n WHERE A.uuid = ? ");
+		return baseDao.getFieldSetEntityBySQL(sql.toString(), new Object[] {uuid}, false);
+	}
+}
diff --git a/src/main/java/com/product/saas/service/SystemContractService.java b/src/main/java/com/product/saas/service/SystemContractService.java
new file mode 100644
index 0000000..a5c20ea
--- /dev/null
+++ b/src/main/java/com/product/saas/service/SystemContractService.java
@@ -0,0 +1,118 @@
+package com.product.saas.service;
+
+import java.io.File;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.product.core.cache.DataPoolCacheImpl;
+import com.product.core.config.Global;
+import com.product.core.dao.BaseDao;
+import com.product.core.entity.DataTableEntity;
+import com.product.core.entity.FieldSetEntity;
+import com.product.core.exception.BaseException;
+import com.product.core.service.support.AbstractBaseService;
+import com.product.saas.config.SaasCode;
+import com.product.saas.config.SaasConst;
+
+import cn.hutool.core.io.FileUtil;
+
+@Component
+public class SystemContractService extends AbstractBaseService{
+
+	@Autowired
+	BaseDao baseDao;
+	
+	/**
+	 * 	鑾峰彇鍚堝悓璇︽儏(娴佺▼璇︽儏璋冪敤)
+	 * @param fse
+	 * @return
+	 * @throws BaseException
+	 */
+	public FieldSetEntity findContract(FieldSetEntity fse) throws BaseException {
+		return findContract(fse.getUUID());
+	}
+	
+	/**
+	 * 	鑾峰彇鍚堝悓淇℃伅
+	 * @param clientUUID
+	 * @return
+	 */
+	public FieldSetEntity findContract(String uuid) {
+		// 鑾峰彇鍚堝悓淇℃伅
+		FieldSetEntity fseContract = baseDao.getFieldSetEntityBySQL("SELECT A.*,B.client_unit_type FROM product_sys_contract A LEFT JOIN  product_sys_clients B ON B.uuid = A.client_uuid WHERE A.uuid = ?",
+				new Object[] {uuid}, false);
+		if(fseContract != null) {
+			DataTableEntity dteClient = DataPoolCacheImpl.getInstance().getCacheData("瀹㈡埛淇℃伅", new String[]{fseContract.getString("client_uuid")});
+			fseContract.setValue("client_unit_type", dteClient.getFieldSetEntity(0).getString("client_unit_type"));
+			fseContract.setValue("expiration_date", dteClient.getFieldSetEntity(0).getString("expiration_date"));
+		}
+		return fseContract;
+	}
+	
+	/**
+	 *  鍚堝悓娴佺▼缁撴潫瑕嗙洊License锛堢粨鏉熻妭鐐瑰鐞嗗櫒璋冪敤锛�
+	 *  
+	 * @param fseContract
+	 */
+	public void contractFinish(FieldSetEntity fseContract) {
+//		String isPayment = fseContract.getString("is_payment");
+		FieldSetEntity fseClient = baseDao.getFieldSetEntity(SaasConst.PRODUCT_SYS_CLIENTS, fseContract.getString(SaasConst.CLIENT_UUID), false);
+		copyLicense(fseContract.getString("license_doc"), fseClient.getString("client_code"));
+		
+	}
+	
+	/**
+	 * 	澶嶅埗license鍒版寚瀹氱洰褰�
+	 * @param fileUUID		闄勪欢UUID
+	 * @param clientCode	瀹㈡埛缂栫爜
+	 */
+	public void copyLicense(String fileUUID, String clientCode) {
+	    
+	    // 鑾峰彇鏂囦欢淇℃伅
+	    FieldSetEntity fse = baseDao.getFieldSetEntity(SaasConst.PRODUCT_SYS_ATTACHMENTS, fileUUID, false);
+	    if (fse == null) {
+	        throw new BaseException(SaasCode.TENANT_APPLY_LICENSE_DATA_NO_EXIST.getValue(), SaasCode.TENANT_APPLY_LICENSE_DATA_NO_EXIST.getText());
+	    }
+	    
+	    // 鏋勫缓婧愭枃浠惰矾寰�
+	    String baseDir = System.getProperty("user.dir");
+	    String localDir = Global.getSystemConfig("local.dir", "");
+	    String attachmentUrl = fse.getString("attachment_url");
+	    String attachmentTitle = fse.getString("attachment_title");
+	    
+	    String filePath = baseDir + File.separator + localDir + File.separator + attachmentUrl + File.separator + attachmentTitle;
+	    
+	    // 妫�鏌ユ簮鏂囦欢鏄惁瀛樺湪
+	    if (!FileUtil.exist(filePath)) {
+	    	throw new BaseException(SaasCode.TENANT_APPLY_LICENSE_FILE_NO_EXIST.getValue(), SaasCode.TENANT_APPLY_LICENSE_FILE_NO_EXIST.getText());
+	    }
+	    
+	    // 鏋勫缓鐩爣鐩綍
+	    String targetDir = baseDir + File.separator + "resources" + File.separator;
+	    FileUtil.mkdir(targetDir);
+	    
+	    // 鏋勫缓鐩爣鏂囦欢鍚嶏細license + clientCode + .dat
+	    // 鏃犺鍘熸枃浠舵槸鍚︽湁鎵╁睍鍚嶏紝閮戒娇鐢�.dat鎵╁睍鍚�
+	    String targetFileName = "license" + clientCode + ".dat";
+	    String targetPath = targetDir + targetFileName;
+	    
+	    // 澶嶅埗鏂囦欢
+	    try {
+	        // 浣跨敤Hutool澶嶅埗锛岀涓変釜鍙傛暟true琛ㄧず瑕嗙洊宸插瓨鍦ㄧ殑鏂囦欢
+	        FileUtil.copy(filePath, targetPath, true);
+	        // 楠岃瘉澶嶅埗缁撴灉
+	        if (FileUtil.exist(targetPath)) {
+	            long sourceSize = FileUtil.size(new File(filePath));
+	            long targetSize = FileUtil.size(new File(targetPath));
+	            if (sourceSize != targetSize) {
+	            	throw new BaseException(SaasCode.TENANT_APPLY_LICENSE_FILE_COPY_FAIL.getValue(),  SaasCode.TENANT_APPLY_LICENSE_FILE_COPY_FAIL.getValue() + "鐩爣鏂囦欢涓嶅畬鏁�");
+	            }
+	        } else {
+	            throw new BaseException(SaasCode.TENANT_APPLY_LICENSE_FILE_COPY_FAIL.getValue(),  SaasCode.TENANT_APPLY_LICENSE_FILE_COPY_FAIL.getValue() + "鐩爣鏂囦欢涓嶅瓨鍦�");
+	        }
+	    } catch (Exception e) {
+	        throw new BaseException(SaasCode.TENANT_APPLY_LICENSE_FILE_COPY_FAIL.getValue(),  SaasCode.TENANT_APPLY_LICENSE_FILE_COPY_FAIL.getValue() + e.getMessage());
+	    }
+	}
+}
diff --git a/src/main/java/com/product/saas/service/TenantApplyService.java b/src/main/java/com/product/saas/service/TenantApplyService.java
index 3fa25e7..4549700 100644
--- a/src/main/java/com/product/saas/service/TenantApplyService.java
+++ b/src/main/java/com/product/saas/service/TenantApplyService.java
@@ -225,8 +225,9 @@
 		FieldSetEntity fseOrgUnit = new FieldSetEntity(CmnConst.PRODUCT_SYS_ORG_LEVELS);
 		fseOrgUnit.setValue("client_uuid", fseClient.getUUID());
 		fseOrgUnit.setValue("org_level_name", fseApply.getString("unit_name"));
-		fseOrgUnit.setValue("org_level_all", fseApply.getString("unit_name"));
-		fseOrgUnit.setValue("org_level_code", codeService.createCode("product_sys_org_levels", "org_level_code", null));
+		fseOrgUnit.setValue("org_level_all", "鎴愰兘XXXX杞欢鏈夐檺鍏徃>" + fseApply.getString("unit_name"));
+		fseOrgUnit.setValue("org_level_code", codeService.createCode("product_sys_org_levels", "org_level_code", "001"));
+		fseOrgUnit.setValue("org_level_code_parent", "001");
 		fseOrgUnit.setValue("org_level_type", 0);
 		fseOrgUnit.setValue("sequence", 1);
 		fseOrgUnit.setValue(CmnConst.CREATED_BY, "1");
@@ -256,6 +257,7 @@
 		fseManager.setValue(CmnConst.CREATED_BY, "1");
 		fseManager.setValue(CmnConst.CREATED_UTC_DATETIME, new Date());
 		baseDao.add(fseManager);
+		baseDao.executeUpdate("UPDATE product_sys_tenant_apply SET client_uuid = ? WHERE uuid = ?", new Object[] {fseClient.getUUID(), fseApply.getUUID()});
 	}
 	
 	/**

--
Gitblit v1.9.2