From bb229d0324c082a85b14c72ddf7ef1a46622266d Mon Sep 17 00:00:00 2001
From: 杜洪波 <1074825718@qq.com>
Date: 星期五, 17 四月 2026 09:42:28 +0800
Subject: [PATCH] 定时任务-租户扫描
---
src/main/java/com/product/saas/service/TenantApplyService.java | 283 +++++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 237 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..d973791 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;
@@ -29,6 +49,8 @@
@Autowired
FileManagerService fileManagerService;
+
+
/**
* 绉熸埛淇℃伅璇诲彇鍜岄獙璇�
@@ -45,25 +67,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_PHONE_HAS_APPLY.getValue(), SaasCode.TENANT_APPLY_VALID_PHONE_HAS_APPLY.getText());
+ }
+ // 鎯呭喌3锛氬彧瀛樺湪鍗曚綅鍚� -> 鍗曚綅宸茬敵璇�
+ if (fseTenantByPhone == null && fseTenantByName != null) {
+ throw new BaseException(SaasCode.TENANT_APPLY_VALID_UNIT_HAS_APPLY.getValue(), SaasCode.TENANT_APPLY_VALID_UNIT_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 +104,7 @@
/**
* 淇濆瓨绉熸埛鐢宠
+ * approval_sign锛氶�佸鏍囪瘑锛�0锛氫繚瀛橈紱1锛氶�佸鎴栨縺娲伙級
* @param fse
* @return
*/
@@ -92,42 +114,211 @@
// 鑾峰彇閫佸鏍囧織
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("org_level_status", 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()});
+
+ // 鍙戦�佷俊鎭粰绉熸埛绠$悊鍛�
+ FieldSetEntity fse = new FieldSetEntity("temp");
+ fse.setValue("applicant_phone", fseApply.getString("applicant_phone"));
+ loginAuthService.sendMessage(fse, "绉熸埛娉ㄥ唽鎴愬姛", "temp");
+ }
+
+ /**
+ * 澶嶅埗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