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/TenantApplyService.java |  275 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 229 insertions(+), 46 deletions(-)

diff --git a/src/main/java/com/product/saas/service/TenantApplyService.java b/src/main/java/com/product/saas/service/TenantApplyService.java
index 00a424e..4549700 100644
--- a/src/main/java/com/product/saas/service/TenantApplyService.java
+++ b/src/main/java/com/product/saas/service/TenantApplyService.java
@@ -1,25 +1,45 @@
 package com.product.saas.service;
 
+import java.io.File;
+import java.util.Date;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import com.product.admin.config.CmnConst;
+import com.product.admin.service.CodeService;
 import com.product.admin.service.LoginAuthService;
+import com.product.core.config.Global;
 import com.product.core.dao.BaseDao;
 import com.product.core.entity.FieldSetEntity;
 import com.product.core.exception.BaseException;
 import com.product.core.service.support.AbstractBaseService;
 import com.product.core.transfer.Transactional;
 import com.product.file.service.FileManagerService;
+import com.product.module.sys.service.UserService;
+import com.product.saas.config.SaasCode;
 import com.product.saas.config.SaasConst;
 import com.product.saas.service.idel.ITenantApplyService;
 import com.product.tool.flow.service.FlowService;
 import com.product.util.BaseUtil;
 
+import cn.hutool.core.io.FileUtil;
+
+/**
+ *	绉熸埛鐢宠 
+ *
+ */
 @Component
 public class TenantApplyService extends AbstractBaseService implements ITenantApplyService{
 
 	@Autowired
 	BaseDao baseDao;
+	
+	@Autowired
+	CodeService codeService;
+	
+	@Autowired
+	UserService userService;
 	
 	@Autowired
 	FlowService flowService;
@@ -45,25 +65,24 @@
 		// 楠岃瘉淇℃伅鏄惁鍖归厤
 		FieldSetEntity fseTenantByPhone = baseDao.getFieldSetEntityByFilter(SaasConst.PRODUCT_SYS_TENANT_APPLY, "applicant_phone = ?", new Object[] {phone}, false);
 		FieldSetEntity fseTenantByName = baseDao.getFieldSetEntityByFilter(SaasConst.PRODUCT_SYS_TENANT_APPLY, "unit_name = ?", new Object[] {unitName}, false);
-		if (fseTenantByPhone == null) {
-			if(fseTenantByName == null) {
-				// 閮戒笉瀛樺湪锛岄獙璇侀�氳繃
-				return true;
-			} else {
-				throw new BaseException("鍗曚綅宸茬粡琚娇鐢�", "鍗曚綅宸茬粡琚娇鐢�");
-			}
-		} else {
-			if(fseTenantByName == null) {
-				throw new BaseException("鎵嬫満鍙峰凡缁忚浣跨敤", "鎵嬫満鍙峰凡缁忚浣跨敤");
-			} else {
-				if (fseTenantByName.getUUID().equals(fseTenantByPhone.getUUID())) {
-					// 閮藉瓨鍦ㄤ簬鍚屼竴鏉℃暟鎹紝楠岃瘉閫氳繃
-					return true;
-				} else {
-					throw new BaseException("鎵嬫満鍙峰拰鍗曚綅宸茬粡琚娇鐢�", "鎵嬫満鍙峰拰鍗曚綅宸茬粡琚娇鐢�");
-				}
-			}
-		}
+		// 鎯呭喌1锛氭墜鏈哄彿鍜屽崟浣嶅悕閮戒笉瀛樺湪 -> 閫氳繃
+	    if (fseTenantByPhone == null && fseTenantByName == null) {
+	        return true;
+	    }
+	    // 鎯呭喌2锛氬彧瀛樺湪鎵嬫満鍙� -> 鎵嬫満鍙峰凡鐢宠
+	    if (fseTenantByPhone != null && fseTenantByName == null) {
+	        throw new BaseException(SaasCode.TENANT_APPLY_VALID_UNIT_HAS_APPLY.getValue(), SaasCode.TENANT_APPLY_VALID_UNIT_HAS_APPLY.getText());
+	    }
+	    // 鎯呭喌3锛氬彧瀛樺湪鍗曚綅鍚� -> 鍗曚綅宸茬敵璇�
+	    if (fseTenantByPhone == null && fseTenantByName != null) {
+	        throw new BaseException(SaasCode.TENANT_APPLY_VALID_PHONE_HAS_APPLY.getValue(), SaasCode.TENANT_APPLY_VALID_PHONE_HAS_APPLY.getText());
+	    }
+	    // 鎯呭喌4锛氶兘瀛樺湪 -> 妫�鏌ユ槸鍚︽槸鍚屼竴鏉¤褰�
+	    if (fseTenantByPhone.getUUID().equals(fseTenantByName.getUUID())) {
+	        return true;
+	    }
+	    // 鎯呭喌5锛氶兘瀛樺湪浣嗕笉鏄悓涓�鏉¤褰� -> 鎵嬫満鍙峰拰鍗曚綅鍚嶉兘宸茬敵璇�
+	    throw new BaseException(SaasCode.TENANT_APPLY_VALID_UNIT_AND_PHONE_HAS_APPLY.getValue(), SaasCode.TENANT_APPLY_VALID_UNIT_AND_PHONE_HAS_APPLY.getText());
 	}
 	
 	/**
@@ -83,6 +102,7 @@
 	
 	/**
 	 * 	淇濆瓨绉熸埛鐢宠
+	 * 	approval_sign锛氶�佸鏍囪瘑锛�0锛氫繚瀛橈紱1锛氶�佸鎴栨縺娲伙級
 	 * @param fse
 	 * @return
 	 */
@@ -92,42 +112,205 @@
 		// 鑾峰彇閫佸鏍囧織
 		String flowSign = fse.getString("approval_sign");
 		if (!BaseUtil.strIsNull(flowSign) || "1".equals(flowSign)) {
+			// 淇濆瓨绉熸埛淇℃伅
 			fse.setValue("apply_status", 2);
+			fse.setValue("is_passed", 0);
 			baseDao.saveFieldSetEntity(fse);
-			// 鑾峰彇閫佸寮�濮嬬殑鍚庝竴涓妭鐐逛俊鎭�
-			StringBuilder sql = new StringBuilder();
-			sql.append("SELECT * FROM product_sys_flow_node \n");
-			sql.append("WHERE uuid IN ( \n");
-			sql.append("	SELECT target_uuid FROM product_sys_flow_link \n");
-			sql.append("	WHERE source_uuid IN ( \n");
-			sql.append("		SELECT uuid FROM product_sys_flow_node \n");
-			sql.append("		WHERE module_type = 1 AND flow_uuid IN ( \n");
-			sql.append("			SELECT uuid FROM product_sys_flow_model \n");
-			sql.append("			WHERE type_code = ? \n");
-			sql.append("		) \n");
-			sql.append("	) \n");
-			sql.append(") \n");
-			FieldSetEntity fseFlowNode = baseDao.getFieldSetEntityBySQL(sql.toString(), new Object[] {SaasConst.FLOW_TENANT_APPLY}, false);
-			if (fseFlowNode == null || BaseUtil.strIsNull(fseFlowNode.getString("default_users"))) {
-				throw new BaseException("绉熸埛鐢宠娴佺▼鏈夎", "绉熸埛鐢宠娴佺▼鏈夎");
+			
+			// 鏌ヨ閫佸璁板綍
+			FieldSetEntity fseTask = baseDao.getFieldSetEntityByFilter("product_sys_flow_task", "table_name = 'product_sys_tenant_apply' AND record_uuid = ?", new Object[] {fse.getUUID()}, false);
+			if (fseTask == null) {
+				// 鑾峰彇閫佸寮�濮嬬殑鍚庝竴涓妭鐐逛俊鎭�
+				StringBuilder sql = new StringBuilder();
+				sql.append("SELECT * FROM product_sys_flow_node \n");
+				sql.append("WHERE uuid IN ( \n");
+				sql.append("	SELECT target_uuid FROM product_sys_flow_link \n");
+				sql.append("	WHERE source_uuid IN ( \n");
+				sql.append("		SELECT uuid FROM product_sys_flow_node \n");
+				sql.append("		WHERE module_type = 1 AND flow_uuid IN ( \n");
+				sql.append("			SELECT uuid FROM product_sys_flow_model \n");
+				sql.append("			WHERE type_code = ? \n");
+				sql.append("		) \n");
+				sql.append("	) \n");
+				sql.append(") \n");
+				FieldSetEntity fseFlowNode = baseDao.getFieldSetEntityBySQL(sql.toString(), new Object[] {SaasConst.FLOW_TENANT_APPLY}, false);
+				if (fseFlowNode == null || BaseUtil.strIsNull(fseFlowNode.getString("default_users"))) {
+					throw new BaseException("绉熸埛鐢宠娴佺▼鏈夎", "绉熸埛鐢宠娴佺▼鏈夎");
+				}
+				// 灏佽閫佸鍙傛暟
+				FieldSetEntity fseFlowTask = new FieldSetEntity(SaasConst.PRODUCT_SYS_TENANT_APPLY);
+				fseFlowTask.setValue("uuid", fse.getUUID());
+				fseFlowTask.setValue("type_code", SaasConst.FLOW_TENANT_APPLY);
+				fseFlowTask.setValue("accepters", fseFlowNode.getString("default_users"));
+				fseFlowTask.setValue("flow_title", "绉熸埛鐢宠-" + fse.getString("unit_name"));
+				// 鎵ц閫佸
+				flowService.autoSendFlow(fseFlowTask);
+			} else {
+				// 婵�娲婚�佸浠诲姟
+				FieldSetEntity fseTaskDetail = new FieldSetEntity("product_sys_flow_detail");
+				fseTaskDetail.setValue("task_uuid", fseTask.getUUID());
+				fseTaskDetail.setValue("is_sub_flow", "0");
+				fseTaskDetail.setValue("opinion", "绉熸埛鎾ゅ洖鍚庨噸鏂版彁浜�");
+				flowService.activate(fseTaskDetail);
 			}
-			// 灏佽閫佸鍙傛暟
-			FieldSetEntity fseFlowTask = new FieldSetEntity(SaasConst.PRODUCT_SYS_TENANT_APPLY);
-			fseFlowTask.setValue("uuid", fse.getUUID());
-			fseFlowTask.setValue("type_code", SaasConst.FLOW_TENANT_APPLY);
-			fseFlowTask.setValue("accepters", fseFlowNode.getString("default_users"));
-			fseFlowTask.setValue("flow_title", "绉熸埛鐢宠-" + fse.getString("unit_name"));
-			// 鎵ц閫佸
-			flowService.autoSendFlow(fseFlowTask);
 			return true;
 		} else {
 			fse.setValue("apply_status", 1);
-			// 淇濆瓨璁板綍
+			fse.setValue("is_passed", 0);
+			// 淇濆瓨绉熸埛淇℃伅
 			return baseDao.saveFieldSetEntity(fse);
 		}
 	}
-	
+
+	/**
+	 * 	鎾ら攢绉熸埛鐢宠
+	 * @param fse
+	 * @return
+	 */
+	@Override
+	@Transactional
 	public boolean cancelTenantApply(FieldSetEntity fse){
-		return true;
+		// 鑾峰彇瀵瑰簲娴佺▼浠诲姟
+		FieldSetEntity fseTask = baseDao.getFieldSetEntityByFilter("product_sys_flow_task", "table_name = 'product_sys_tenant_apply' AND record_uuid = ?", new Object[] {fse.getUUID()}, false);
+		if (fseTask == null) {
+			throw new BaseException(SaasCode.TENANT_AAPLY_INFO_FLOW_TASK_ERROR.getValue(), SaasCode.TENANT_AAPLY_INFO_FLOW_TASK_ERROR.getText());
+		}
+		// 缁堟娴佺▼
+		flowService.stop(fseTask);
+		// 鏍囪鐢宠鏁版嵁涓烘湭閫佸
+		return baseDao.executeUpdate("UPDATE product_sys_tenant_apply SET apply_status = 1 WHERE applicant_phone = ? AND unit_name = ? ",
+				new Object[] {fse.getString("applicant_phone"), fse.getString("unit_name")});
+	}
+	
+	/**
+	 * 	鍒锋柊鐢宠鍗曠姸鎬�(娴佺▼澶勭悊鍣ㄨ皟鐢�)
+	 * @param fseApply
+	 */
+	public void refreshApplyStatus(FieldSetEntity fseApply) {
+		if ("1".equals(fseApply.getString("is_passed"))) {
+			// 瀹℃牳閫氳繃
+			baseDao.executeUpdate("UPDATE product_sys_tenant_apply SET apply_status = 3 WHERE uuid = ?", new Object[] {fseApply.getUUID()});
+		} else {
+			// 瀹℃牳澶辫触
+			baseDao.executeUpdate("UPDATE product_sys_tenant_apply SET apply_status = 4 WHERE uuid = ?", new Object[] {fseApply.getUUID()});
+		}
+	}
+	
+	/**
+	 * 鐢宠瀹屾垚
+	 * @param fseApply
+	 */
+	@Transactional
+	public void applyFinish(FieldSetEntity fseApply) {
+		// 鍒涘缓瀹㈡埛淇℃伅
+		FieldSetEntity fseClient = new FieldSetEntity(SaasConst.PRODUCT_SYS_CLIENTS);
+		fseClient.setValue("client_name", fseApply.getString("unit_name"));
+		fseClient.setValue("client_tel", fseApply.getString("applicant_phone"));
+		fseClient.setValue("client_code", codeService.createCode(SaasConst.PRODUCT_SYS_CLIENTS, "client_code", ""));
+		fseClient.setValue("attachment_capacity", "2130000000");
+		fseClient.setValue("platform_admin", fseApply.getString("platform_admin"));
+		fseClient.setValue("expiration_date", fseApply.getString("expiration_date"));
+		fseClient.setValue("client_unit_type", fseApply.getString("unit_type"));
+		fseClient.setValue("client_address_province_id", fseApply.getString("area_province"));
+		fseClient.setValue("client_address_city_id", fseApply.getString("area_city"));
+		fseClient.setValue("client_address_county_id", fseApply.getString("area_county"));
+		fseClient.setValue("client_address_line_one", fseApply.getString("address"));
+		fseClient.setValue(CmnConst.CREATED_BY, "1");
+		fseClient.setValue(CmnConst.CREATED_UTC_DATETIME, new Date());
+		baseDao.add(fseClient);
+		// 澶嶅埗license鍒皐eb妯″潡
+		copyLicense(fseApply.getString("license"), fseClient.getString("client_code"));
+		
+		// 鍒涘缓缁勭粐鏈烘瀯鍗曚綅
+		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", "鎴愰兘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");
+		fseOrgUnit.setValue(CmnConst.CREATED_UTC_DATETIME, new Date());
+		baseDao.add(fseOrgUnit);
+		// 鍒涘缓绉熸埛绠$悊鍛樼敤鎴蜂俊鎭�
+		FieldSetEntity fseUser = new FieldSetEntity(CmnConst.PRODUCT_SYS_USERS);
+		fseUser.setValue(CmnConst.USER_NAME, fseApply.getString("applicant_name"));
+		fseUser.setValue(CmnConst.USER_ACCOUNT, fseApply.getString("applicant_phone"));
+		fseUser.setValue(CmnConst.USER_PRIMARY_EMAIL, fseApply.getString("applicant_email"));
+		fseUser.setValue(CmnConst.USER_MOBILE_NUMBER, fseApply.getString("applicant_phone"));
+		fseUser.setValue(CmnConst.USER_PWD, userService.createPassWord(fseApply.getString("applicant_phone"), fseApply.getString("applicant_pwd")));
+		fseUser.setValue(CmnConst.IS_MANAGER, 1);
+		fseUser.setValue(CmnConst.STATUS, 1);
+		fseUser.setValue(CmnConst.CREATED_BY, "1");
+		fseUser.setValue(CmnConst.CREATED_UTC_DATETIME, new Date());
+		baseDao.add(fseUser);
+		FieldSetEntity fseUserInfo = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_USERS, fseUser.getUUID(), false);
+		// 鍒涘缓绉熸埛绠$悊鍛樹俊鎭�
+		FieldSetEntity fseManager = new FieldSetEntity(CmnConst.PRODUCT_SYS_ORG_MANAGER);
+		fseManager.setValue(CmnConst.USER_ID, fseUserInfo.getString(CmnConst.USER_ID));
+		fseManager.setValue(CmnConst.ORG_LEVEL_UUID, fseOrgUnit.getUUID());
+		fseManager.setValue(CmnConst.MANAGER_TYPE, 2);
+		fseManager.setValue(CmnConst.ROLE_UUIDS, "eabb00f3-2118-4165-967b-a7d88f472f67-notchange");
+		fseManager.setValue(CmnConst.IS_USED, 1);
+		fseManager.setValue(CmnConst.CLIENT_UUID, fseClient.getUUID());
+		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()});
+	}
+	
+	/**
+	 * 	澶嶅埗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());
+	    }
 	}
 }

--
Gitblit v1.9.2