caixiaofeng 6 місяців тому
батько
коміт
32cc8b58a1

+ 1 - 1
flow-app/src/main/resources/mapper/workflow/FlowInstanceDao.xml

@@ -61,7 +61,7 @@
             <include refid="instanceWheres"></include>
         </where>
         ORDER BY
-        HP.ID_ DESC
+        RE.id DESC
     </select>
     <select id="copy" resultMap="BaseResultMap">
         <include refid="instanceColumns"></include>

+ 1 - 1
flow-common/flow-common-redis-starter/src/main/java/com/flow/common/redis/service/RedisService.java

@@ -12,7 +12,7 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 public class RedisService<T> {
-    private final Logger log = LoggerFactory.getLogger(this.getClass());
+    private final Logger log = LoggerFactory.getLogger(RedisService.class);
 
     @Autowired
     private RedisTemplate<String, T> redisTemplate;

+ 28 - 3
flow-workflow/flow-workflow-biz/src/main/java/com/flow/service/impl/FlowDefineServiceImpl.java

@@ -1,6 +1,8 @@
 package com.flow.service.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.flow.common.core.exception.BaseException;
 import com.flow.common.core.model.OauthUserDetails;
 import com.flow.common.core.util.SecurityContextUtil;
@@ -9,6 +11,9 @@ import com.flow.common.mybatis.service.impl.BaseServiceImpl;
 import com.flow.common.redis.service.RedisService;
 import com.flow.dao.FlowDefineDao;
 import com.flow.entity.FlowDefine;
+import com.flow.entity.FormModel;
+import com.flow.entity.form.Field;
+import com.flow.entity.form.serial.SerialRule;
 import com.flow.entity.node.*;
 import com.flow.entity.settings.Settings;
 import com.flow.entity.settings.TitleConfig;
@@ -33,10 +38,10 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
-import java.util.Calendar;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 @Service
 public class FlowDefineServiceImpl extends BaseServiceImpl<FlowDefineDao, FlowDefine> implements FlowDefineService {
@@ -50,6 +55,8 @@ public class FlowDefineServiceImpl extends BaseServiceImpl<FlowDefineDao, FlowDe
     private FlowDefineService _this;
     @Autowired
     private RedisService<Long> redisService;
+    @Autowired
+    private ObjectMapper objectMapper;
 
     @Transactional(rollbackFor = Exception.class)
     @Override
@@ -95,15 +102,24 @@ public class FlowDefineServiceImpl extends BaseServiceImpl<FlowDefineDao, FlowDe
                 );
             }
         }
+        // 生成流水号
+        FormModel formModel = flowDefine.getForm();
+        List<Field> fields = formModel.findByName("SerialNumber");
+        for (Field field : fields) {
+            String value = this.generateSerialNumber(field, flowDefine.getModelId());
+            if (StringUtils.isNotBlank(value)) {
+                values.put(field.getId(), value);
+            }
+        }
         // 生成流程实例ID
-        String currentDate = DateTimeFormatter.ISO_DATE.format(LocalDate.now());
+        String currentDate = DateTimeFormatter.ofPattern("yyyyMMdd").format(LocalDate.now());
         String serialKey = String.format("flow:serial:%s", currentDate);
         Long increment = redisService.incr(serialKey, 1L);
         if (increment == 1L) {
             redisService.expire(serialKey, 60 * 60 * 24L);
         }
         String serial = String.format("%3s", increment).replace(" ", "0");
-        String instanceId = String.format("LF%s%s", currentDate, serial);
+        String instanceId = String.format("fw%s%s", currentDate, serial);
         String instanceName = startProcess.getInstanceName();
         Settings settings = flowDefine.getSettings();
         TitleConfig titleConfig = settings.getTitle();
@@ -132,6 +148,15 @@ public class FlowDefineServiceImpl extends BaseServiceImpl<FlowDefineDao, FlowDe
         }
     }
 
+    private String generateSerialNumber(Field field, Long modelId) {
+        Map<String, Object> props = field.getProps();
+        Object rules = props.get("rules");
+        List<SerialRule> serialRules = objectMapper.convertValue(rules, new TypeReference<List<SerialRule>>() {
+        });
+        String key = String.format("%s:%s", modelId, field.getId());
+        return serialRules.stream().map(e->e.generate(key)).collect(Collectors.joining());
+    }
+
     @Override
     public List<FlowDefine> list(FlowDefine flowDefine) {
         return flowDefineDao.getList(flowDefine);

+ 8 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/FormModel.java

@@ -8,6 +8,7 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Data
 public class FormModel implements Serializable {
@@ -45,6 +46,13 @@ public class FormModel implements Serializable {
         }
     }
 
+    public List<Field> findByName(String name) {
+        List<Field> allFields = this.listAllFields();
+        return allFields.stream()
+                .filter(field -> name.equals(field.getName()))
+                .collect(Collectors.toList());
+    }
+
     public Map<String, Field> allFieldsAsMap() {
         Map<String, Field> result = new HashMap<>();
         List<Field> allFields = listAllFields();

+ 18 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/form/serial/CreateTime.java

@@ -0,0 +1,18 @@
+package com.flow.entity.form.serial;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class CreateTime extends SerialRule {
+    private String format;
+
+    @Override
+    public String generate(String key) {
+        return DateTimeFormatter.ofPattern(this.format).format(LocalDateTime.now());
+    }
+}

+ 15 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/form/serial/FixedChars.java

@@ -0,0 +1,15 @@
+package com.flow.entity.form.serial;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class FixedChars extends SerialRule {
+    private String chars;
+
+    @Override
+    public String generate(String key) {
+        return this.chars;
+    }
+}

+ 47 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/form/serial/IncNumber.java

@@ -0,0 +1,47 @@
+package com.flow.entity.form.serial;
+
+import com.flow.common.core.util.ApplicationContextUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.redisson.api.RAtomicLong;
+import org.redisson.api.RedissonClient;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.concurrent.TimeUnit;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class IncNumber extends SerialRule {
+    private Integer digitsNum;
+    private ResetEnum resetDuration;
+    private Integer startValue;
+    private Boolean fixedLength;
+    private String chars;
+
+    @Override
+    public String generate(String key) {
+        StringBuilder serialKey = new StringBuilder(key);
+        long timeToLive = 0;
+        if (resetDuration == ResetEnum.DAY) {
+            serialKey.append(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
+            timeToLive = 1;
+        } else if (resetDuration == ResetEnum.WEEK) {
+            serialKey.append(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyww")));
+            timeToLive = 7;
+        } else if (resetDuration == ResetEnum.MONTH) {
+            serialKey.append(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMM")));
+            timeToLive = 31;
+        } else if (resetDuration == ResetEnum.YEAR) {
+            serialKey.append(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy")));
+            timeToLive = 365;
+        }
+        RedissonClient redissonClient = ApplicationContextUtil.getBean(RedissonClient.class);
+        RAtomicLong atomicLong = redissonClient.getAtomicLong(serialKey.toString());
+        if (!atomicLong.isExists()) {
+            atomicLong.set(startValue);
+            atomicLong.expire(timeToLive, TimeUnit.DAYS);
+        }
+        return String.format("%" + digitsNum + "s", atomicLong.incrementAndGet()).replace(" ", "0");
+    }
+}

+ 18 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/form/serial/ResetEnum.java

@@ -0,0 +1,18 @@
+package com.flow.entity.form.serial;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum ResetEnum {
+    NONE("none"),
+    DAY("day"),
+    WEEK("week"),
+    MONTH("month"),
+    YEAR("year");
+
+    @JsonValue
+    private final String reset;
+}

+ 18 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/form/serial/SerialRule.java

@@ -0,0 +1,18 @@
+package com.flow.entity.form.serial;
+
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import lombok.Data;
+
+@Data
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = SerialRule.class, visible = true)
+@JsonSubTypes({
+        @JsonSubTypes.Type(value = FixedChars.class, name = "fixedChars"),
+        @JsonSubTypes.Type(value = CreateTime.class, name = "createTime"),
+        @JsonSubTypes.Type(value = IncNumber.class, name = "incNumber")
+})
+public abstract class SerialRule {
+    private String type;
+
+    public abstract String generate(String key);
+}