diff --git a/src/main/java/neatlogic/framework/form/dao/mapper/FormMapper.java b/src/main/java/neatlogic/framework/form/dao/mapper/FormMapper.java index e1f58cccee25f5f3b111f3c99d678a42fdc7ad6a..4d0674afc32ac97602bce4705a1ac9cf76b11fd0 100644 --- a/src/main/java/neatlogic/framework/form/dao/mapper/FormMapper.java +++ b/src/main/java/neatlogic/framework/form/dao/mapper/FormMapper.java @@ -18,10 +18,7 @@ package neatlogic.framework.form.dao.mapper; import neatlogic.framework.common.dto.BasePageVo; import neatlogic.framework.common.dto.ValueTextVo; -import neatlogic.framework.form.dto.FormAttributeVo; -import neatlogic.framework.form.dto.FormCustomItemVo; -import neatlogic.framework.form.dto.FormVersionVo; -import neatlogic.framework.form.dto.FormVo; +import neatlogic.framework.form.dto.*; import org.springframework.stereotype.Component; import java.util.List; @@ -79,6 +76,8 @@ public interface FormMapper { List getFormVersionList(); + List getFormAttributeDataListByIdList(List idList); + int insertForm(FormVo formVo); int resetFormVersionIsActiveByFormUuid(String formUuid); @@ -97,6 +96,8 @@ public interface FormMapper { int insertFormAttribute(FormAttributeVo formAttributeVo); + int insertFormAttributeData(AttributeDataVo attributeDataVo); + int deleteFormAttributeByFormUuid(String formUuid); int deleteFormByUuid(String uuid); @@ -106,4 +107,6 @@ public interface FormMapper { int deleteFormVersionByUuid(String uuid); void deleteFormCustomItem(Long id); + + int deleteFormAttributeDataByIdList(List idList); } diff --git a/src/main/java/neatlogic/framework/form/dao/mapper/FormMapper.xml b/src/main/java/neatlogic/framework/form/dao/mapper/FormMapper.xml index 96596d27b7a378bbee9e5616921cb27874da5bab..d3a89067a47c5c41e7eed1870b8caabe46e5504e 100644 --- a/src/main/java/neatlogic/framework/form/dao/mapper/FormMapper.xml +++ b/src/main/java/neatlogic/framework/form/dao/mapper/FormMapper.xml @@ -351,6 +351,21 @@ limitations under the License. ORDER BY a.`form_uuid` + + UPDATE `form_version` @@ -478,6 +493,28 @@ limitations under the License. #{data}) + + INSERT INTO `form_attribute_data` ( + `id`, + `form_uuid`, + `handler`, + `attribute_label`, + `attribute_uuid`, + `data` + ) + VALUES + ( + #{id}, + #{formUuid}, + #{handler}, + #{attributeLabel}, + #{attributeUuid}, + #{data} + ) + ON DUPLICATE KEY + UPDATE `data` = #{data,typeHandler=CompressHandler} + + DELETE FROM `form_attribute` @@ -507,4 +544,12 @@ limitations under the License. FROM `form_customitem` WHERE id = #{value} + + + DELETE FROM `form_attribute_data` + WHERE `id` IN + + #{id} + + diff --git a/src/main/java/neatlogic/framework/form/dto/AttributeDataVo.java b/src/main/java/neatlogic/framework/form/dto/AttributeDataVo.java index 3b08b4a6621c9940f8bbd677b7f85e579c36acf2..58c914ee3006d8c8ea4faea613007080a835fff8 100644 --- a/src/main/java/neatlogic/framework/form/dto/AttributeDataVo.java +++ b/src/main/java/neatlogic/framework/form/dto/AttributeDataVo.java @@ -19,6 +19,7 @@ package neatlogic.framework.form.dto; import com.alibaba.fastjson.annotation.JSONField; import neatlogic.framework.form.attribute.core.FormAttributeHandlerFactory; import neatlogic.framework.form.attribute.core.IFormAttributeHandler; +import neatlogic.framework.util.SnowflakeUtil; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; @@ -26,14 +27,36 @@ import org.apache.commons.lang3.StringUtils; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -public class AttributeDataVo { +public class AttributeDataVo implements Comparable { + private Long id; + private String formUuid; private String attributeUuid; private String attributeLabel; - private String type; + private String handler; @JSONField(serialize = false) private String data; private Object dataObj; - private Integer isMultiple; + + public Long getId() { + if (id == null) { + id = SnowflakeUtil.uniqueLong(); + } + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFormUuid() { + return formUuid; + } + + public void setFormUuid(String formUuid) { + this.formUuid = formUuid; + } + + // private Integer isMultiple; public String getAttributeUuid() { return attributeUuid; } @@ -50,12 +73,12 @@ public class AttributeDataVo { this.attributeLabel = attributeLabel; } - public String getType() { - return type; + public String getHandler() { + return handler; } - public void setType(String type) { - this.type = type; + public void setHandler(String handler) { + this.handler = handler; } public String getData() { @@ -68,26 +91,26 @@ public class AttributeDataVo { public Object getDataObj() { if (dataObj != null) { - if (StringUtils.isBlank(type)) { + if (StringUtils.isBlank(handler)) { return dataObj; } - IFormAttributeHandler handler = FormAttributeHandlerFactory.getHandler(type); + IFormAttributeHandler formAttributeHandler = FormAttributeHandlerFactory.getHandler(handler); if (handler == null) { return dataObj; } - return handler.conversionDataType(dataObj, attributeLabel); + return formAttributeHandler.conversionDataType(dataObj, attributeLabel); } else { if (data == null) { return null; } - if (StringUtils.isBlank(type)) { + if (StringUtils.isBlank(handler)) { return data; } - IFormAttributeHandler handler = FormAttributeHandlerFactory.getHandler(type); - if (handler == null) { + IFormAttributeHandler formAttributeHandler = FormAttributeHandlerFactory.getHandler(handler); + if (formAttributeHandler == null) { return data; } - return handler.conversionDataType(data, attributeLabel); + return formAttributeHandler.conversionDataType(data, attributeLabel); } } @@ -95,13 +118,13 @@ public class AttributeDataVo { this.dataObj = dataObj; } - public Integer getIsMultiple() { - return isMultiple; - } - - public void setIsMultiple(Integer isMultiple) { - this.isMultiple = isMultiple; - } +// public Integer getIsMultiple() { +// return isMultiple; +// } +// +// public void setIsMultiple(Integer isMultiple) { +// this.isMultiple = isMultiple; +// } public boolean dataIsEmpty() { Object dataObj = getDataObj(); @@ -160,4 +183,9 @@ public class AttributeDataVo { return dataObj.equals(otherDataObj); } } + + @Override + public int compareTo(AttributeDataVo attributeData) { + return this.id.compareTo(attributeData.getId()); + } } diff --git a/src/main/java/neatlogic/framework/form/dto/AttributeExtendedDataVo.java b/src/main/java/neatlogic/framework/form/dto/AttributeExtendedDataVo.java index b2aab7a33316030080765b2662ed6cf65fdb4925..cb57ac1cc0ddcd6c5dd070c5f58841c51418d4c4 100644 --- a/src/main/java/neatlogic/framework/form/dto/AttributeExtendedDataVo.java +++ b/src/main/java/neatlogic/framework/form/dto/AttributeExtendedDataVo.java @@ -22,7 +22,7 @@ public class AttributeExtendedDataVo extends AttributeDataVo{ public AttributeExtendedDataVo(AttributeDataVo attributeDataVo, Object extendedData) { this.setAttributeUuid(attributeDataVo.getAttributeUuid()); this.setAttributeLabel(attributeDataVo.getAttributeLabel()); - this.setType(attributeDataVo.getType()); + this.setHandler(attributeDataVo.getHandler()); this.extendedData = extendedData; } diff --git a/src/main/java/neatlogic/framework/notify/widget/FormTable.java b/src/main/java/neatlogic/framework/notify/widget/FormTable.java index 7b1c7d8c3aaf816886468dc708a7d3e490584db3..c51f9190dfcf03fa2f087c310207fcdade6cf8a1 100644 --- a/src/main/java/neatlogic/framework/notify/widget/FormTable.java +++ b/src/main/java/neatlogic/framework/notify/widget/FormTable.java @@ -368,7 +368,7 @@ public class FormTable implements TemplateMethodModelEx { continue; } String attributeLabel = attributeDataVo.getAttributeLabel(); - String type = attributeDataVo.getType(); + String type = attributeDataVo.getHandler(); Object dataObj = attributeDataVo.getExtendedData(); String result = StringUtils.EMPTY; if (dataObj != null) { diff --git a/src/main/java/neatlogic/framework/sqlfile/ScriptRunnerManager.java b/src/main/java/neatlogic/framework/sqlfile/ScriptRunnerManager.java index e5488d34f4c6cdc7f1fcce755912d2b97a885966..18d0eb5736daab9b3021d890534e7e70f34c6a05 100644 --- a/src/main/java/neatlogic/framework/sqlfile/ScriptRunnerManager.java +++ b/src/main/java/neatlogic/framework/sqlfile/ScriptRunnerManager.java @@ -236,14 +236,22 @@ public class ScriptRunnerManager { // Resources.setCharset(Charset.forName("UTF-8")); runner.setLogWriter(logWriter); runner.setErrorLogWriter(errWriter); - runner.setDelimiter(";"); +// runner.setDelimiter(";"); + // 语句结束符号 + String delimiter = ";"; + runner.setDelimiter(delimiter); String line; StringBuilder sqlSb = new StringBuilder(); while ((line = scriptBufferedReader.readLine()) != null) { if (StringUtils.isBlank(line.trim())) { continue; } - if (!line.trim().toLowerCase(Locale.ROOT).endsWith(";")) { + if (line.trim().toLowerCase(Locale.ROOT).startsWith("delimiter")) { + delimiter = line.substring(9).trim(); + runner.setDelimiter(delimiter); + continue; + } else if (!line.trim().toLowerCase(Locale.ROOT).endsWith(delimiter)) { + sqlSb.append("\n"); sqlSb.append(line); continue; } diff --git a/src/main/java/neatlogic/module/framework/form/attribute/handler/UserSelectHandler.java b/src/main/java/neatlogic/module/framework/form/attribute/handler/UserSelectHandler.java index 7bc522e7aa449fb6a7e6c6ca25e4a0dafccbfaeb..781f4ebb64e9c50a965e0c242b241e8c495df523 100644 --- a/src/main/java/neatlogic/module/framework/form/attribute/handler/UserSelectHandler.java +++ b/src/main/java/neatlogic/module/framework/form/attribute/handler/UserSelectHandler.java @@ -413,8 +413,8 @@ public class UserSelectHandler extends FormHandlerBase { List valueList = new ArrayList<>(); List textList = new ArrayList<>(); List valueTextList = new ArrayList<>(); - boolean isMultiple = configObj.getBooleanValue("isMultiple"); - attributeDataVo.setIsMultiple(isMultiple ? 1 : 0); +// boolean isMultiple = configObj.getBooleanValue("isMultiple"); +// attributeDataVo.setIsMultiple(isMultiple ? 1 : 0); if (dataObj instanceof JSONArray) { JSONArray valueArray = (JSONArray) dataObj; if (CollectionUtils.isNotEmpty(valueArray)) { diff --git a/src/main/java/neatlogic/module/framework/form/service/FormServiceImpl.java b/src/main/java/neatlogic/module/framework/form/service/FormServiceImpl.java index 68c325ee2feeab99b4c2868328cac264b8ae1aa5..2aefa48da415e06136052361c428ed86e111e0f2 100644 --- a/src/main/java/neatlogic/module/framework/form/service/FormServiceImpl.java +++ b/src/main/java/neatlogic/module/framework/form/service/FormServiceImpl.java @@ -467,8 +467,8 @@ public class FormServiceImpl implements FormService, IFormCrossoverService { } List valueList = new ArrayList<>(); List textList = new ArrayList<>(); - boolean isMultiple = configObj.getBooleanValue("isMultiple"); - attributeDataVo.setIsMultiple(isMultiple ? 1 : 0); +// boolean isMultiple = configObj.getBooleanValue("isMultiple"); +// attributeDataVo.setIsMultiple(isMultiple ? 1 : 0); String dataSource = configObj.getString("dataSource"); if ("static".equals(dataSource)) { JSONArray dataArray = configObj.getJSONArray("dataList"); diff --git a/src/main/resources/neatlogic/resources/framework/changelog/2024-02-23/neatlogic_tenant.sql b/src/main/resources/neatlogic/resources/framework/changelog/2024-02-23/neatlogic_tenant.sql new file mode 100644 index 0000000000000000000000000000000000000000..a2220bb41416fbed81d6953e98bf8a8b5b02be82 --- /dev/null +++ b/src/main/resources/neatlogic/resources/framework/changelog/2024-02-23/neatlogic_tenant.sql @@ -0,0 +1,148 @@ +CREATE TABLE IF NOT EXISTS `form_attribute_data` ( + `id` bigint NOT NULL COMMENT 'id', + `form_uuid` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单uuid', + `handler` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类型', + `attribute_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '属性名', + `attribute_uuid` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '属性uuid', + `data` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '属性值,json格式', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='表单实例属性当前值'; + +CREATE TABLE IF NOT EXISTS `processtask_formattribute` ( + `processtask_id` bigint NOT NULL COMMENT '工单id', + `form_attribute_data_id` bigint NOT NULL COMMENT '表单属性值id', + PRIMARY KEY (`processtask_id`,`form_attribute_data_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='工单与表单属性值关系表'; + +DROP FUNCTION IF EXISTS `generateSnowflakeId`; + +DELIMITER $$ +CREATE FUNCTION `generateSnowflakeId`() RETURNS BIGINT +BEGIN + DECLARE SCHEDULE_SERVER_ID BIGINT DEFAULT 1; + DECLARE START_TIMESTAMP BIGINT DEFAULT 1577808000; + DECLARE SEQUENCE_BIT BIGINT DEFAULT 13; + DECLARE MACHINE_BIT BIGINT DEFAULT 10; + DECLARE TIMESTAMP_LEFT BIGINT DEFAULT SEQUENCE_BIT + MACHINE_BIT; + DECLARE MAX_SEQUENCE BIGINT DEFAULT ~(-1 << SEQUENCE_BIT); + DECLARE MAX_MACHINE_ID BIGINT DEFAULT ~(-1 << MACHINE_BIT); + DECLARE machineIdPart BIGINT DEFAULT (SCHEDULE_SERVER_ID & MAX_MACHINE_ID) << SEQUENCE_BIT; + + DECLARE currentStamp BIGINT; + SET currentStamp = UNIX_TIMESTAMP(NOW()); + + IF currentStamp < @lastStamp THEN + WHILE currentStamp < @lastStamp DO + SET currentStamp = UNIX_TIMESTAMP(NOW()); + END WHILE; + END IF; + + IF currentStamp = @lastStamp THEN + SET @sequence = (@sequence + 1) & MAX_SEQUENCE; + IF @sequence = 0 THEN + WHILE currentStamp < @lastStamp DO + SET currentStamp = UNIX_TIMESTAMP(NOW()); + END WHILE; + END IF; + ELSE + SET @sequence = 0; + END IF; + + SET @lastStamp = currentStamp; + + RETURN ((currentStamp - START_TIMESTAMP) << TIMESTAMP_LEFT) | machineIdPart | @sequence; +END $$ + +DELIMITER ; + +DROP PROCEDURE IF EXISTS `handleProcessTaskFormAttributeData`; + +DELIMITER $$ +CREATE PROCEDURE handleProcessTaskFormAttributeData() +BEGIN + DECLARE rowNum BIGINT DEFAULT 0; + DECLARE currentPage INT DEFAULT 1; + DECLARE pageSize INT DEFAULT 100; + DECLARE pageCount INT DEFAULT 0; + + SELECT COUNT(1) INTO rowNum FROM `processtask_formattribute_data`; + IF rowNum > 0 THEN + SET @lastStamp = -1; + SET @sequence = 0; + + SET pageCount = CEIL(rowNum / pageSize); + WHILE currentPage <= pageCount DO + BEGIN + DECLARE done INT DEFAULT FALSE; + + DECLARE v_id BIGINT; + DECLARE v_processTaskId BIGINT; + DECLARE v_type VARCHAR(50); + DECLARE v_attributeLabel VARCHAR(50); + DECLARE v_attributeUuid CHAR(32); + DECLARE v_formUuid CHAR(32); + DECLARE v_data MEDIUMTEXT; + + DECLARE startNum INT DEFAULT (currentPage - 1) * pageSize; + + DECLARE cur CURSOR FOR SELECT a.`processtask_id`, a.`type`, a.`attribute_label`, a.`attribute_uuid`, a.`data`, b.`form_uuid` + FROM `processtask_formattribute_data` a + JOIN `processtask_form` b ON b.`processtask_id` = a.`processtask_id` + ORDER BY a.`processtask_id`, a.`sort` + LIMIT startNum, pageSize; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + SET @batchInsertSql_form_attribute_data = NULL; + SET @batchInsertSql_processtask_formattribute = NULL; + + OPEN cur; + read_loop: LOOP + FETCH cur INTO v_processTaskId, v_type, v_attributeLabel, v_attributeUuid, v_data, v_formUuid; + IF done THEN + LEAVE read_loop; + END IF; + IF v_type IS NULL THEN + SET v_type = ''; + END IF; + IF v_attributeLabel IS NULL THEN + SET v_attributeLabel = ''; + END IF; + IF v_data IS NULL THEN + SET v_data = ''; + END IF; + SET v_id = generateSnowflakeId(); + IF @batchInsertSql_form_attribute_data IS NULL THEN + SET @batchInsertSql_form_attribute_data = CONCAT('INSERT INTO `form_attribute_data` (`id`, `form_uuid`, `handler`, `attribute_label`, `attribute_uuid`, `data`) VALUES', ' (', v_id, ', \'', v_formUuid, '\', \'', v_type, '\', \'', v_attributeLabel, '\', \'', v_attributeUuid, '\', \'', v_data, '\')'); + ELSE + SET @batchInsertSql_form_attribute_data = CONCAT(@batchInsertSql_form_attribute_data, ', (', v_id, ', \'', v_formUuid, '\', \'', v_type, '\', \'', v_attributeLabel, '\', \'', v_attributeUuid, '\', \'', v_data, '\')'); + END IF; + IF @batchInsertSql_processtask_formattribute IS NULL THEN + SET @batchInsertSql_processtask_formattribute = CONCAT('INSERT INTO `processtask_formattribute` (`processtask_id`, `form_attribute_data_id`) VALUES', ' (', v_processTaskId, ',', v_id, ')'); + ELSE + SET @batchInsertSql_processtask_formattribute = CONCAT(@batchInsertSql_processtask_formattribute, ', (', v_processTaskId, ',', v_id, ')'); + END IF; + END LOOP; + CLOSE cur; + + PREPARE stmt_1 FROM @batchInsertSql_form_attribute_data; + EXECUTE stmt_1; + DEALLOCATE PREPARE stmt_1; + PREPARE stmt_2 FROM @batchInsertSql_processtask_formattribute; + EXECUTE stmt_2; + DEALLOCATE PREPARE stmt_2; + + SET @batchInsertSql_form_attribute_data = NULL; + SET @batchInsertSql_processtask_formattribute = NULL; + END; + SET currentPage = currentPage + 1; + END WHILE; + END IF; +END $$ +DELIMITER ; + +CALL handleProcessTaskFormAttributeData(); + +DROP PROCEDURE `handleProcessTaskFormAttributeData`; + +DROP FUNCTION `generateSnowflakeId`; diff --git a/src/main/resources/neatlogic/resources/framework/changelog/2024-02-23/version.json b/src/main/resources/neatlogic/resources/framework/changelog/2024-02-23/version.json new file mode 100644 index 0000000000000000000000000000000000000000..945bc29b7ac1117f7ded2cc8e12c82ce88de41bb --- /dev/null +++ b/src/main/resources/neatlogic/resources/framework/changelog/2024-02-23/version.json @@ -0,0 +1,10 @@ +{ + "content":[ + { + "type":"新增功能", + "detail":[ + {"msg":"1.表单实例数据抽离"} + ] + } + ] +} diff --git a/src/main/resources/neatlogic/resources/framework/sqlscript/ddl.sql b/src/main/resources/neatlogic/resources/framework/sqlscript/ddl.sql index 2c656f9fd8c7787f01f3fce7da323a61b8083f3f..c032f5dd77c4ee7404c2c84e2cd3d820c69797dd 100644 --- a/src/main/resources/neatlogic/resources/framework/sqlscript/ddl.sql +++ b/src/main/resources/neatlogic/resources/framework/sqlscript/ddl.sql @@ -238,6 +238,19 @@ CREATE TABLE IF NOT EXISTS `form_attribute` ( PRIMARY KEY (`form_uuid`,`formversion_uuid`,`uuid`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='表单版本属性'; +-- ---------------------------- +-- Table structure for form_attribute_data +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `form_attribute_data` ( + `id` bigint NOT NULL COMMENT 'id', + `form_uuid` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单uuid', + `handler` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类型', + `attribute_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '属性名', + `attribute_uuid` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '属性uuid', + `data` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '属性值,json格式', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='表单实例属性当前值'; + -- ---------------------------- -- Table structure for form_customitem -- ----------------------------