chenc před 3 roky
rodič
revize
357988a245
35 změnil soubory, kde provedl 1610 přidání a 42 odebrání
  1. 2 1
      jeecg-boot/jeecg-boot-base-common/src/main/java/org/jeecg/common/system/controller/CommonController.java
  2. 4 0
      jeecg-boot/jeecg-boot-base-common/src/main/java/org/jeecg/common/system/vo/LoginUser.java
  3. 39 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/cmd/SaveModelReCmd.java
  4. 168 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/entity/Impl/ModelReEntity.java
  5. 44 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/entity/ModelRe.java
  6. 11 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/manager/CommandRe.java
  7. 36 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/manager/CommandReContext.java
  8. 46 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/manager/ModelReEntityManager.java
  9. 38 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/service/Impl/RepositoryReServiceImpl.java
  10. 16 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/service/RepositoryReService.java
  11. 3 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/ActBusiness.java
  12. 136 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/ActReModel.java
  13. 2 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/ActZprocess.java
  14. 27 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/mapper/ActReModelMapper.java
  15. 102 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/mapper/xml/ActReModelMapper.xml
  16. 23 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/service/IActReModelService.java
  17. 18 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/service/Impl/ActBusinessServiceImpl.java
  18. 41 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/service/Impl/ActReModelServiceImpl.java
  19. 8 1
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActBusinessController.java
  20. 167 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActReModelController.java
  21. 10 3
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActTaskController.java
  22. 42 8
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActivitiModelController.java
  23. 3 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActivitiProcessController.java
  24. 1 1
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/TbTableInfoController.java
  25. 13 1
      jeecg-boot/jeecg-boot-module-system/pom.xml
  26. 1 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
  27. 81 6
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/LoginController.java
  28. 2 1
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDictController.java
  29. 15 2
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserController.java
  30. 12 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysUser.java
  31. 461 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/util/HttpHelper.java
  32. 6 1
      jeecg-boot/jeecg-boot-module-system/src/main/resources/application-dev.yml
  33. 29 14
      jeecg-boot/jeecg-boot-module-system/src/main/resources/application-prod.yml
  34. 3 3
      jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/jeecg_database.properties
  35. binární
      jeecg-boot/jeecg-boot-module-system/src/main/resources/lib/taobao-sdk-java-auto.jar

+ 2 - 1
jeecg-boot/jeecg-boot-base-common/src/main/java/org/jeecg/common/system/controller/CommonController.java

@@ -470,8 +470,9 @@ public class CommonController {
 			map.put("success",true);
 			map.put("code",0);
 			Map<String,Object> map1=new HashMap<>();
-//			map1.put("url","http://localhost:3000/jeecg-boot/sys/common/downloadFile/"+dbpath);
+//			map1.put("url","http://10.0.0.112:3000/jeecg-boot/sys/common/downloadFile/"+dbpath);
 			map1.put("url","http://oa.cuidiansoft.com/jeecg-boot/sys/common/downloadFile/"+dbpath);
+//			map1.put("url","http://106.15.206.14:8090/jeecg-boot/sys/common/downloadFile/"+dbpath);
 			map.put("data",map1);
 			result.setData(map1);
 		} catch (IOException e) {

+ 4 - 0
jeecg-boot/jeecg-boot-base-common/src/main/java/org/jeecg/common/system/vo/LoginUser.java

@@ -100,4 +100,8 @@ public class LoginUser {
 	 */
 	private String departIds;
 
+	private String pkOrg;
+
+	private String pkOrgName;
+
 }

+ 39 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/cmd/SaveModelReCmd.java

@@ -0,0 +1,39 @@
+package org.jeecg.activitiRewrite.cmd;
+
+import org.activiti.engine.ActivitiIllegalArgumentException;
+import org.activiti.engine.impl.interceptor.Command;
+import org.activiti.engine.impl.interceptor.CommandContext;
+import org.jeecg.activitiRewrite.entity.Impl.ModelReEntity;
+import org.jeecg.activitiRewrite.entity.ModelRe;
+import org.jeecg.activitiRewrite.manager.CommandRe;
+import org.jeecg.activitiRewrite.manager.CommandReContext;
+
+import java.io.Serializable;
+
+/**
+ * 功能描述:
+ *
+ * @Author: chenchuang
+ * @Date: 2021/9/29 17:49
+ */
+public class SaveModelReCmd implements Serializable, Command<Void> {
+    private static final long serialVersionUID = 1L;
+    protected ModelReEntity model;
+
+    public SaveModelReCmd(ModelReEntity model) {
+        this.model = model;
+    }
+    @Override
+    public Void execute(CommandContext commandContext) {
+        CommandReContext c=new CommandReContext();
+        if(model == null) {
+            throw new ActivitiIllegalArgumentException("model is null");
+        }
+        if (model.getId() == null) {
+            c.getModelEntityManager().insertModel(model);
+        } else {
+            c.getModelEntityManager().updateModel(model);
+        }
+        return null;
+    }
+}

+ 168 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/entity/Impl/ModelReEntity.java

@@ -0,0 +1,168 @@
+package org.jeecg.activitiRewrite.entity.Impl;
+
+import org.activiti.engine.ProcessEngineConfiguration;
+import org.activiti.engine.impl.db.HasRevision;
+import org.activiti.engine.impl.db.PersistentObject;
+import org.jeecg.activitiRewrite.entity.ModelRe;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 功能描述:
+ *
+ * @Author: chenchuang
+ * @Date: 2021/9/29 17:47
+ */
+public class ModelReEntity implements ModelRe, HasRevision, PersistentObject, Serializable {
+    private static final long serialVersionUID = 1L;
+
+    protected String id;
+    protected int revision = 1;
+    protected String name;
+    protected String key;
+    protected String category;
+    protected Date createTime;
+    protected Date lastUpdateTime;
+    protected Integer version = 1;
+    protected String metaInfo;
+    protected String deploymentId;
+    protected String editorSourceValueId;
+    protected String editorSourceExtraValueId;
+    protected String tenantId = ProcessEngineConfiguration.NO_TENANT_ID;
+
+    public Object getPersistentState() {
+        Map<String, Object> persistentState = new HashMap<String, Object>();
+        persistentState.put("name", this.name);
+        persistentState.put("key", key);
+        persistentState.put("category", this.category);
+        persistentState.put("createTime", this.createTime);
+        persistentState.put("lastUpdateTime", lastUpdateTime);
+        persistentState.put("version", this.version);
+        persistentState.put("metaInfo", this.metaInfo);
+        persistentState.put("deploymentId", deploymentId);
+        persistentState.put("editorSourceValueId", this.editorSourceValueId);
+        persistentState.put("editorSourceExtraValueId", this.editorSourceExtraValueId);
+        return persistentState;
+    }
+
+    // getters and setters //////////////////////////////////////////////////////
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public void setCategory(String category) {
+        this.category = category;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getLastUpdateTime() {
+        return lastUpdateTime;
+    }
+
+    public void setLastUpdateTime(Date lastUpdateTime) {
+        this.lastUpdateTime = lastUpdateTime;
+    }
+
+    public Integer getVersion() {
+        return version;
+    }
+
+    public void setVersion(Integer version) {
+        this.version = version;
+    }
+
+    public String getMetaInfo() {
+        return metaInfo;
+    }
+
+    public void setMetaInfo(String metaInfo) {
+        this.metaInfo = metaInfo;
+    }
+
+    public String getDeploymentId() {
+        return deploymentId;
+    }
+
+    public void setDeploymentId(String deploymentId) {
+        this.deploymentId = deploymentId;
+    }
+
+    public String getEditorSourceValueId() {
+        return editorSourceValueId;
+    }
+
+    public void setEditorSourceValueId(String editorSourceValueId) {
+        this.editorSourceValueId = editorSourceValueId;
+    }
+
+    public String getEditorSourceExtraValueId() {
+        return editorSourceExtraValueId;
+    }
+
+    public void setEditorSourceExtraValueId(String editorSourceExtraValueId) {
+        this.editorSourceExtraValueId = editorSourceExtraValueId;
+    }
+
+    public int getRevision() {
+        return revision;
+    }
+
+    public int getRevisionNext() {
+        return revision + 1;
+    }
+
+    public void setRevision(int revision) {
+        this.revision = revision;
+    }
+
+    public String getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(String tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public boolean hasEditorSource() {
+        return this.editorSourceValueId != null;
+    }
+
+    public boolean hasEditorSourceExtra() {
+        return this.editorSourceExtraValueId != null;
+    }
+}

+ 44 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/entity/ModelRe.java

@@ -0,0 +1,44 @@
+package org.jeecg.activitiRewrite.entity;
+
+import java.util.Date;
+
+/**
+ * 功能描述:
+ *
+ * @Author: chenchuang
+ * @Date: 2021/9/29 17:46
+ */
+public interface ModelRe {
+    String getId();
+
+    String getName();
+    void setName(String name);
+
+    String getKey();
+    void setKey(String key);
+
+    String getCategory();
+    void setCategory(String category);
+
+    Date getCreateTime();
+
+    Date getLastUpdateTime();
+
+    Integer getVersion();
+    void setVersion(Integer version);
+
+    String getMetaInfo();
+    void setMetaInfo(String metaInfo);
+
+    String getDeploymentId();
+    void setDeploymentId(String deploymentId);
+
+    void setTenantId(String tenantId);
+    String getTenantId();
+
+    /** whether this model has editor source */
+    boolean hasEditorSource();
+
+    /** whether this model has editor source extra */
+    boolean hasEditorSourceExtra();
+}

+ 11 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/manager/CommandRe.java

@@ -0,0 +1,11 @@
+package org.jeecg.activitiRewrite.manager;
+
+/**
+ * 功能描述:
+ *
+ * @Author: chenchuang
+ * @Date: 2021/9/30 14:28
+ */
+public interface CommandRe <T> {
+    T execute(CommandReContext commandContext);
+}

+ 36 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/manager/CommandReContext.java

@@ -0,0 +1,36 @@
+package org.jeecg.activitiRewrite.manager;
+
+import org.activiti.engine.ActivitiException;
+import org.activiti.engine.impl.interceptor.Session;
+import org.activiti.engine.impl.interceptor.SessionFactory;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 功能描述:
+ *
+ * @Author: chenchuang
+ * @Date: 2021/9/30 14:16
+ */
+public class CommandReContext {
+    protected Map<Class< ? >, Session> sessions = new HashMap<Class< ? >, Session>();
+    protected Map<Class< ? >, SessionFactory> sessionFactories;
+    public ModelReEntityManager getModelEntityManager() {
+        return getSession(ModelReEntityManager.class);
+    }
+    @SuppressWarnings({"unchecked"})
+    public <T> T getSession(Class<T> sessionClass) {
+        Session session = sessions.get(sessionClass);
+        if (session == null) {
+            SessionFactory sessionFactory = sessionFactories.get(sessionClass);
+            if (sessionFactory==null) {
+                throw new ActivitiException("no session factory configured for "+sessionClass.getName());
+            }
+            session = sessionFactory.openSession();
+            sessions.put(sessionClass, session);
+        }
+
+        return (T) session;
+    }
+}

+ 46 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/manager/ModelReEntityManager.java

@@ -0,0 +1,46 @@
+package org.jeecg.activitiRewrite.manager;
+
+import org.activiti.engine.delegate.event.ActivitiEventType;
+import org.activiti.engine.delegate.event.impl.ActivitiEventBuilder;
+import org.activiti.engine.impl.context.Context;
+import org.activiti.engine.impl.db.DbSqlSession;
+import org.activiti.engine.impl.db.PersistentObject;
+import org.activiti.engine.impl.interceptor.CommandContext;
+import org.activiti.engine.impl.persistence.AbstractManager;
+import org.activiti.engine.impl.persistence.entity.ModelEntity;
+import org.activiti.engine.repository.Model;
+import org.jeecg.activitiRewrite.entity.Impl.ModelReEntity;
+import org.jeecg.activitiRewrite.entity.ModelRe;
+
+/**
+ * 功能描述:
+ *
+ * @Author: chenchuang
+ * @Date: 2021/9/29 17:59
+ */
+public class ModelReEntityManager extends AbstractManager {
+    public void insertModel(ModelRe model) {
+        ((ModelReEntity) model).setCreateTime(Context.getProcessEngineConfiguration().getClock().getCurrentTime());
+        ((ModelReEntity) model).setLastUpdateTime(Context.getProcessEngineConfiguration().getClock().getCurrentTime());
+        getDbSqlSession().insert((PersistentObject) model);
+
+        if(Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
+            Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
+                    ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_CREATED, model));
+            Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
+                    ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_INITIALIZED, model));
+        }
+    }
+
+    public void updateModel(ModelReEntity updatedModel) {
+        CommandContext commandContext = Context.getCommandContext();
+        updatedModel.setLastUpdateTime(Context.getProcessEngineConfiguration().getClock().getCurrentTime());
+        DbSqlSession dbSqlSession = commandContext.getDbSqlSession();
+        dbSqlSession.update(updatedModel);
+
+        if(Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
+            Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
+                    ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_UPDATED, updatedModel));
+        }
+    }
+}

+ 38 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/service/Impl/RepositoryReServiceImpl.java

@@ -0,0 +1,38 @@
+package org.jeecg.activitiRewrite.service.Impl;
+
+import org.activiti.engine.ActivitiIllegalArgumentException;
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.impl.ServiceImpl;
+import org.activiti.engine.repository.Model;
+import org.jeecg.activitiRewrite.cmd.SaveModelReCmd;
+import org.jeecg.activitiRewrite.entity.Impl.ModelReEntity;
+import org.jeecg.activitiRewrite.entity.ModelRe;
+import org.jeecg.activitiRewrite.manager.CommandReContext;
+import org.jeecg.activitiRewrite.service.RepositoryReService;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * 功能描述:
+ *
+ * @Author: chenchuang
+ * @Date: 2021/9/29 17:33
+ */
+@Service
+public class RepositoryReServiceImpl extends ServiceImpl implements RepositoryReService {
+
+
+    @Override
+    public void saveModel(ModelRe model) {
+        CommandReContext c=new CommandReContext();
+        if(model == null) {
+            throw new ActivitiIllegalArgumentException("model is null");
+        }
+        if (model.getId() == null) {
+            c.getModelEntityManager().insertModel(model);
+        } else {
+            c.getModelEntityManager().updateModel((ModelReEntity)model);
+        }
+//        commandExecutor.execute(new SaveModelReCmd((ModelReEntity) model));
+    }
+}

+ 16 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/activitiRewrite/service/RepositoryReService.java

@@ -0,0 +1,16 @@
+package org.jeecg.activitiRewrite.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.activiti.engine.repository.Model;
+import org.jeecg.activitiRewrite.entity.Impl.ModelReEntity;
+import org.jeecg.activitiRewrite.entity.ModelRe;
+
+/**
+ * 功能描述:
+ *
+ * @Author: chenchuang
+ * @Date: 2021/9/29 17:32
+ */
+public interface RepositoryReService {
+    void saveModel(ModelRe model);
+}

+ 3 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/ActBusiness.java

@@ -137,4 +137,7 @@ public class ActBusiness {
 
 	@TableField(exist = false)
 	private String isAgree;
+
+	/**公司id*/
+	private String pkOrg;
 }

+ 136 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/ActReModel.java

@@ -0,0 +1,136 @@
+package org.jeecg.modules.activiti.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * @Description: 流程模型
+ * @Author: jeecg-boot
+ * @Date:   2021-10-08
+ * @Version: V1.0
+ */
+@Data
+@TableName("act_re_model")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="act_re_model对象", description="流程模型")
+public class ActReModel {
+    
+	/**id*/
+	@TableId(type = IdType.ID_WORKER_STR)
+    @ApiModelProperty(value = "id_")
+	private String id_;
+	/**rev*/
+	@Excel(name = "rev", width = 15)
+    @ApiModelProperty(value = "rev_")
+	private Integer rev_;
+	/**name*/
+	@Excel(name = "name", width = 15)
+    @ApiModelProperty(value = "name_")
+	private String name_;
+	/**key*/
+	@Excel(name = "key", width = 15)
+    @ApiModelProperty(value = "key_")
+	private String key_;
+	/**category*/
+	@Excel(name = "category", width = 15)
+    @ApiModelProperty(value = "category_")
+	private String category_;
+	/**createTime*/
+    @ApiModelProperty(value = "createTime_")
+	private Date createTime_;
+	/**lastUpdateTime*/
+    @ApiModelProperty(value = "lastUpdateTime_")
+	private Date lastUpdateTime_;
+	/**version*/
+	@Excel(name = "version", width = 15)
+    @ApiModelProperty(value = "version_")
+	private Integer version_;
+	/**metaInfo*/
+	@Excel(name = "metaInfo", width = 15)
+    @ApiModelProperty(value = "metaInfo_")
+	private String metaInfo_;
+	/**deploymentId*/
+	@Excel(name = "deploymentId", width = 15)
+    @ApiModelProperty(value = "deploymentId_")
+	private String deploymentId_;
+	/**editorSourceValueId*/
+	@Excel(name = "editorSourceValueId", width = 15)
+    @ApiModelProperty(value = "editorSourceValueId_")
+	private String editorSourceValueId_;
+	/**editorSourceExtraValueId*/
+	@Excel(name = "editorSourceExtraValueId", width = 15)
+    @ApiModelProperty(value = "editorSourceExtraValueId_")
+	private String editorSourceExtraValueId_;
+	/**tenantId*/
+	@Excel(name = "tenantId", width = 15)
+    @ApiModelProperty(value = "tenantId_")
+	private String tenantId_;
+
+
+	/**id*/
+	@TableId(type = IdType.ID_WORKER_STR)
+	@ApiModelProperty(value = "id")
+	private String id;
+	/**rev*/
+	@Excel(name = "rev", width = 15)
+	@ApiModelProperty(value = "rev")
+	private Integer rev;
+	/**name*/
+	@Excel(name = "name", width = 15)
+	@ApiModelProperty(value = "name")
+	private String name;
+	/**key*/
+	@Excel(name = "key", width = 15)
+	@ApiModelProperty(value = "key")
+	private String key;
+	/**category*/
+	@Excel(name = "category", width = 15)
+	@ApiModelProperty(value = "category")
+	private String category;
+	/**createTime*/
+	@ApiModelProperty(value = "createTime")
+	private Date createTime;
+	/**lastUpdateTime*/
+	@ApiModelProperty(value = "lastUpdateTime")
+	private Date lastUpdateTime;
+	/**version*/
+	@Excel(name = "version", width = 15)
+	@ApiModelProperty(value = "version")
+	private Integer version;
+	/**metaInfo*/
+	@Excel(name = "metaInfo", width = 15)
+	@ApiModelProperty(value = "metaInfo")
+	private String metaInfo;
+	/**deploymentId*/
+	@Excel(name = "deploymentId", width = 15)
+	@ApiModelProperty(value = "deploymentId")
+	private String deploymentId;
+	/**editorSourceValueId*/
+	@Excel(name = "editorSourceValueId", width = 15)
+	@ApiModelProperty(value = "editorSourceValueId")
+	private String editorSourceValueId;
+	/**editorSourceExtraValueId*/
+	@Excel(name = "editorSourceExtraValueId", width = 15)
+	@ApiModelProperty(value = "editorSourceExtraValueId")
+	private String editorSourceExtraValueId;
+	/**tenantId*/
+	@Excel(name = "tenantId", width = 15)
+	@ApiModelProperty(value = "tenantId")
+	private String tenantId;
+
+	//所属公司id
+	private String pkOrg;
+}

+ 2 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/ActZprocess.java

@@ -105,4 +105,6 @@ public class ActZprocess {
 	private String roles;
 	//图标地址
 	private String iconAddress;
+	//公司id
+	private String pkOrg;
 }

+ 27 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/mapper/ActReModelMapper.java

@@ -0,0 +1,27 @@
+package org.jeecg.modules.activiti.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import org.activiti.engine.task.Task;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.activiti.entity.ActReModel;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 流程模型
+ * @Author: jeecg-boot
+ * @Date:   2021-10-08
+ * @Version: V1.0
+ */
+public interface ActReModelMapper extends BaseMapper<ActReModel> {
+
+    //查询全部
+    List<ActReModel> getList(@Param("actReModel")ActReModel actReModel);
+
+    //根据id修改公司id
+    int updateOrgById(@Param("actReModel")ActReModel actReModel);
+
+    //我的待办查询
+    List<Task> getListTask(@Param("map")Map<String,Object> map);
+}

+ 102 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/mapper/xml/ActReModelMapper.xml

@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.activiti.mapper.ActReModelMapper">
+
+    <select id="getList" resultType="org.jeecg.modules.activiti.entity.ActReModel" parameterType="org.jeecg.modules.activiti.entity.ActReModel">
+        SELECT
+            id_ as id,
+            rev_ as rev,
+            name_ as name,
+            key_ as `key`,
+            category_ as category,
+            create_time_ AS createTime,
+            last_update_time_ AS lastUpdateTime,
+            version_ as version,
+            meta_info_ AS metaInfo,
+            deployment_id_ AS deploymentId,
+            editor_source_value_id_ AS editorSourceValueId,
+            editor_source_extra_value_id_ AS editorSourceExtraValueId,
+            tenant_id_ AS tenantId,
+            pk_org
+        FROM
+            act_re_model
+        WHERE
+            1=1
+            <if test="actReModel.name !=null and actReModel.name!=''">
+               AND name_ LIKE #{actReModel.name}
+            </if>
+            <if test="actReModel.pkOrg !=null and actReModel.pkOrg!=''">
+                AND pk_org = #{actReModel.pkOrg}
+            </if>
+        ORDER BY
+            create_time_ DESC
+
+    </select>
+
+    <update id="updateOrgById" parameterType="org.jeecg.modules.activiti.entity.ActReModel">
+        UPDATE act_re_model SET pk_org=#{actReModel.pkOrg} WHERE id_ = #{actReModel.id}
+    </update>
+
+    <select id="getListTask" resultType="org.activiti.engine.impl.persistence.entity.TaskEntity" parameterType="java.util.Map">
+        SELECT
+	A.ID_ AS id,
+	A.NAME_ AS name,
+	A.TASK_DEF_KEY_ AS taskDefinitionKey,
+	A.DESCRIPTION_ AS description,
+	A.EXECUTION_ID_ AS executionId,
+	A.ASSIGNEE_ as assignee,
+	A.OWNER_ AS owner,
+	A.PROC_DEF_ID_ as processDefinitionId,
+	A.PROC_INST_ID_ as processInstanceId,
+	A.PRIORITY_ as priority,
+	A.SUSPENSION_STATE_ as isSuspended,
+	A.SUSPENSION_STATE_ as suspended,
+	A.CATEGORY_ as category,
+	A.CREATE_TIME_ AS createTime,
+	A.PROC_INST_ID_ PROC_INST_ID,
+	A.TASK_DEF_KEY_ AS ACT_ID,
+	A.DELEGATION_ AS DELEGATION_ID,
+	A.DUE_DATE_ AS DUE_DATE,
+	I.USER_ID AS CANDIDATE
+FROM
+	ACT_RU_TASK A
+	LEFT JOIN (
+	SELECT DISTINCT
+		*
+	FROM
+		(
+		SELECT
+			I.TASK_ID_,
+			I.USER_ID_ AS USER_ID
+		FROM
+			ACT_RU_IDENTITYLINK I,
+			ACT_RU_TASK T
+		WHERE
+			TASK_ID_ IS NOT NULL
+			AND USER_ID_ IS NOT NULL
+			AND I.TASK_ID_ = T.ID_
+			AND T.ASSIGNEE_ IS NULL
+			AND TYPE_ = 'candidate' UNION
+		SELECT
+			TASK_ID_,
+			R.USER_ID_ AS USER_ID
+		FROM
+			ACT_RU_IDENTITYLINK I,
+			act_id_membership R,
+			ACT_RU_TASK T
+		WHERE
+			I.TASK_ID_ IS NOT NULL
+			AND I.GROUP_ID_ IS NOT NULL
+			AND I.TASK_ID_ = T.ID_
+			AND T.ASSIGNEE_ IS NULL
+			AND I.TYPE_ = 'candidate'
+			AND I.GROUP_ID_ = R.GROUP_ID_
+		) U
+	) I -- 候选组和业务上的角色用户表关联
+	ON A.ID_ = I.TASK_ID_
+	where
+	1=1
+	AND ((A.ASSIGNEE_=#{map.username} or I.USER_ID=#{map.username}) or (A.ASSIGNEE_=#{map.userId} or I.USER_ID=#{map.userId}))
+	ORDER BY A.PRIORITY_ desc,A.CREATE_TIME_ desc
+    </select>
+</mapper>

+ 23 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/service/IActReModelService.java

@@ -0,0 +1,23 @@
+package org.jeecg.modules.activiti.service;
+
+import org.activiti.engine.task.Task;
+import org.jeecg.modules.activiti.entity.ActReModel;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 流程模型
+ * @Author: jeecg-boot
+ * @Date:   2021-10-08
+ * @Version: V1.0
+ */
+public interface IActReModelService extends IService<ActReModel> {
+    //查询全部
+    List<ActReModel> getList(ActReModel actReModel);
+    //根据id修改公司id
+    int updateOrgById(ActReModel actReModel);
+    //我的待办查询
+    List<Task> getListTask(Map<String,Object> map);
+}

+ 18 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/service/Impl/ActBusinessServiceImpl.java

@@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import org.activiti.engine.delegate.DelegateExecution;
 import org.apache.commons.lang.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.activiti.entity.ActBusiness;
 import org.jeecg.modules.activiti.mapper.ActBusinessMapper;
 import org.jeecg.modules.activiti.service.IActBusinessService;
@@ -38,6 +40,7 @@ public class ActBusinessServiceImpl extends ServiceImpl<ActBusinessMapper, ActBu
      * @param tableId 业务表中的数据id
      * */
     public void saveApplyForm(String tableId, HttpServletRequest request) throws IOException {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
 //           String json = getRequestPostStr(request);
 //           JSONObject jsonObject = JSONObject.parseObject(json);
 
@@ -74,6 +77,9 @@ public class ActBusinessServiceImpl extends ServiceImpl<ActBusinessMapper, ActBu
                 //创建时间
                 filedsB.append(",create_time");
                 filedsVB.append(",'"+ new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date) +"'");
+                //创建人
+                filedsB.append(",create_by");
+                filedsVB.append(",'"+ user.getUsername() +"'");
             this.baseMapper.insertBusiData(String.format("INSERT INTO %s (%s) VALUES (%s)",tableName,filedsB.toString(),filedsVB.toString()));
 
             //子表是否存在
@@ -102,6 +108,9 @@ public class ActBusinessServiceImpl extends ServiceImpl<ActBusinessMapper, ActBu
                     //创建时间
                     filedIdB.append(",create_time");
                     filedIdVB.append(",'" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date)  + "'");
+                    //创建人
+                    filedsB.append(",create_by");
+                    filedsVB.append(",'"+ user.getUsername() +"'");
                     //新增子表
                     this.baseMapper.insertBusiData(String.format("INSERT INTO %s (%s) VALUES (%s)", tableNameB, filedIdB.toString(), filedIdVB.toString()));
                 }
@@ -137,6 +146,9 @@ public class ActBusinessServiceImpl extends ServiceImpl<ActBusinessMapper, ActBu
                     //创建时间
                     filedIdB.append(",create_time");
                     filedIdVB.append(",'" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date)  + "'");
+                    //创建人
+                    filedsB.append(",create_by");
+                    filedsVB.append(",'"+ user.getUsername() +"'");
                     //新增子表
                     String childTableName = tableNameChildrenList.get(j - 1);
                     this.baseMapper.insertBusiData(String.format("INSERT INTO %s (%s) VALUES (%s)", childTableName, filedIdB.toString(), filedIdVB.toString()));
@@ -184,6 +196,9 @@ public class ActBusinessServiceImpl extends ServiceImpl<ActBusinessMapper, ActBu
                     //创建时间
                     filedIdB.append(",create_time");
                     filedIdVB.append(",'" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date)  + "'");
+                    //创建人
+                    filedIdB.append(",create_by");
+                    filedIdVB.append(",'"+ user.getUsername() +"'");
                     this.baseMapper.insertBusiData(String.format("INSERT INTO %s (%s) VALUES (%s)", tableNameB, filedIdB.toString(), filedIdVB.toString()));
                 }
             }
@@ -223,6 +238,9 @@ public class ActBusinessServiceImpl extends ServiceImpl<ActBusinessMapper, ActBu
                             //创建时间
                             filedIdB.append(",create_time");
                             filedIdVB.append(",'" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date)  + "'");
+                            //创建人
+                            filedIdB.append(",create_by");
+                            filedIdVB.append(",'"+ user.getUsername() +"'");
                             this.baseMapper.insertBusiData(String.format("INSERT INTO %s (%s) VALUES (%s)", childTableName, filedIdB.toString(), filedIdVB.toString()));
                         }
                     }

+ 41 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/service/Impl/ActReModelServiceImpl.java

@@ -0,0 +1,41 @@
+package org.jeecg.modules.activiti.service.Impl;
+
+import org.activiti.engine.task.Task;
+import org.jeecg.modules.activiti.entity.ActReModel;
+import org.jeecg.modules.activiti.mapper.ActReModelMapper;
+import org.jeecg.modules.activiti.service.IActReModelService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 流程模型
+ * @Author: jeecg-boot
+ * @Date:   2021-10-08
+ * @Version: V1.0
+ */
+@Service
+public class ActReModelServiceImpl extends ServiceImpl<ActReModelMapper, ActReModel> implements IActReModelService {
+
+    @Autowired
+    private ActReModelMapper actReModelMapper;
+
+    @Override
+    public List<ActReModel> getList(ActReModel actReModel) {
+        return actReModelMapper.getList(actReModel);
+    }
+
+    @Override
+    public int updateOrgById(ActReModel actReModel) {
+        return actReModelMapper.updateOrgById(actReModel);
+    }
+
+    @Override
+    public List<Task> getListTask(Map<String, Object> map) {
+        return actReModelMapper.getListTask(map);
+    }
+}

+ 8 - 1
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActBusinessController.java

@@ -68,7 +68,10 @@ public class ActBusinessController {
             String procDefId = request.getParameter("procDefId");
             String procDeTitle = request.getParameter("procDeTitle");
             String tableName = request.getParameter("tableName");
-            String josonContent = JSON.toJSONString(jsonContent.getJsonContent());
+            String josonContent="";
+            if(jsonContent.getJsonContent() != null){
+                josonContent = JSON.toJSONString(jsonContent.getJsonContent());
+            }
             /*保存业务表单数据到数据库表*/
             String tableId = IdUtil.simpleUUID();
             List<TbTableInfo> tableInfoList = tbTableInfoService.list(new LambdaQueryWrapper<TbTableInfo>().eq(TbTableInfo::getBusinessTable, tableName));
@@ -100,6 +103,7 @@ public class ActBusinessController {
                 actBusiness.setTitle(procDeTitle);
             }
             actBusiness.setTableName(tableName);
+            actBusiness.setPkOrg(sysUser.getOrgCode());//公司id
             actBusinessService.save(actBusiness);
             submit(actBusiness,node);
             result.success("操作成功");
@@ -299,6 +303,9 @@ public class ActBusinessController {
 
         LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         queryWrapper.lambda().eq(ActBusiness::getUserId,loginUser.getUsername());
+        //公司id 过滤数据
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+//        queryWrapper.lambda().eq(ActBusiness::getPkOrg,sysUser.getOrgCode());
              List<ActBusiness> actBusinessList = actBusinessService.list(queryWrapper);
 
         actBusinessList.forEach(e -> {

+ 167 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActReModelController.java

@@ -0,0 +1,167 @@
+package org.jeecg.modules.activiti.web;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.activiti.entity.ActReModel;
+import org.jeecg.modules.activiti.service.IActReModelService;
+import java.util.Date;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+ /**
+ * @Description: 流程模型
+ * @Author: jeecg-boot
+ * @Date:   2021-10-08
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags="流程模型")
+@RestController
+@RequestMapping("/activiti/actReModel")
+public class ActReModelController extends JeecgController<ActReModel, IActReModelService> {
+	@Autowired
+	private IActReModelService actReModelService;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param actReModel
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	@AutoLog(value = "流程模型-分页列表查询")
+	@ApiOperation(value="流程模型-分页列表查询", notes="流程模型-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<?> queryPageList(ActReModel actReModel,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		QueryWrapper<ActReModel> queryWrapper = QueryGenerator.initQueryWrapper(actReModel, req.getParameterMap());
+		Page<ActReModel> page = new Page<ActReModel>(pageNo, pageSize);
+		IPage<ActReModel> pageList = actReModelService.page(page, queryWrapper);
+		return Result.ok(pageList);
+	}
+	
+	/**
+	 * 添加
+	 *
+	 * @param actReModel
+	 * @return
+	 */
+	@AutoLog(value = "流程模型-添加")
+	@ApiOperation(value="流程模型-添加", notes="流程模型-添加")
+	@PostMapping(value = "/add")
+	public Result<?> add(@RequestBody ActReModel actReModel) {
+		actReModelService.save(actReModel);
+		return Result.ok("添加成功!");
+	}
+	
+	/**
+	 * 编辑
+	 *
+	 * @param actReModel
+	 * @return
+	 */
+	@AutoLog(value = "流程模型-编辑")
+	@ApiOperation(value="流程模型-编辑", notes="流程模型-编辑")
+	@PutMapping(value = "/edit")
+	public Result<?> edit(@RequestBody ActReModel actReModel) {
+		actReModelService.updateById(actReModel);
+		return Result.ok("编辑成功!");
+	}
+	
+	/**
+	 * 通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "流程模型-通过id删除")
+	@ApiOperation(value="流程模型-通过id删除", notes="流程模型-通过id删除")
+	@DeleteMapping(value = "/delete")
+	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
+		actReModelService.removeById(id);
+		return Result.ok("删除成功!");
+	}
+	
+	/**
+	 * 批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "流程模型-批量删除")
+	@ApiOperation(value="流程模型-批量删除", notes="流程模型-批量删除")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<?> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.actReModelService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.ok("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "流程模型-通过id查询")
+	@ApiOperation(value="流程模型-通过id查询", notes="流程模型-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<?> queryById(@RequestParam(name="id",required=true) String id) {
+		ActReModel actReModel = actReModelService.getById(id);
+		return Result.ok(actReModel);
+	}
+
+  /**
+   * 导出excel
+   *
+   * @param request
+   * @param actReModel
+   */
+  @RequestMapping(value = "/exportXls")
+  public ModelAndView exportXls(HttpServletRequest request, ActReModel actReModel) {
+      return super.exportXls(request, actReModel, ActReModel.class, "流程模型");
+  }
+
+  /**
+   * 通过excel导入数据
+   *
+   * @param request
+   * @param response
+   * @return
+   */
+  @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+  public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+      return super.importExcel(request, response, ActReModel.class);
+  }
+
+}

+ 10 - 3
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActTaskController.java

@@ -28,6 +28,7 @@ import org.jeecg.common.system.api.ISysBaseAPI;
 import org.jeecg.common.system.vo.ComboModel;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.activiti.entity.*;
+import org.jeecg.modules.activiti.service.IActReModelService;
 import org.jeecg.modules.activiti.service.Impl.ActBusinessServiceImpl;
 import org.jeecg.modules.activiti.service.Impl.ActZprocessServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -68,6 +69,8 @@ public class ActTaskController {
     @Autowired
     private ActBusinessServiceImpl actBusinessService;
     @Autowired
+    private IActReModelService iActReModelService;
+    @Autowired
     ISysBaseAPI sysBaseAPI;
 
     public void show(String userId,String name,String categoryId, Integer priority, HttpServletRequest request,List<Task> taskList){
@@ -103,9 +106,13 @@ public class ActTaskController {
         String userId = sysUser.getUsername();
 
         List<Task> taskList = new ArrayList<>();
-        show(sysUser.getUsername(),name,categoryId,priority,request,taskList);
-        show(sysUser.getId(),name,categoryId,priority,request,taskList);
-        ListSort(taskList);
+//        show(sysUser.getUsername(),name,categoryId,priority,request,taskList);
+//        show(sysUser.getId(),name,categoryId,priority,request,taskList);
+//        ListSort(taskList);
+        Map<String,Object> map=new HashMap<>();
+        map.put("username",sysUser.getUsername());
+        map.put("userId",sysUser.getId());
+        taskList=iActReModelService.getListTask(map);
         // 转换vo
         taskList.forEach(e -> {
             TaskVo tv = new TaskVo(e);

+ 42 - 8
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActivitiModelController.java

@@ -21,12 +21,19 @@ import org.activiti.engine.repository.ProcessDefinition;
 import org.activiti.engine.runtime.ProcessInstance;
 import org.activiti.engine.task.Task;
 import org.activiti.image.ProcessDiagramGenerator;
+import org.apache.shiro.SecurityUtils;
 import org.checkerframework.checker.units.qual.A;
+import org.jeecg.activitiRewrite.entity.Impl.ModelReEntity;
+import org.jeecg.activitiRewrite.entity.ModelRe;
+import org.jeecg.activitiRewrite.service.RepositoryReService;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.activiti.entity.ActNode;
+import org.jeecg.modules.activiti.entity.ActReModel;
 import org.jeecg.modules.activiti.entity.ActZprocess;
 import org.jeecg.modules.activiti.service.IActNodeService;
+import org.jeecg.modules.activiti.service.IActReModelService;
 import org.jeecg.modules.activiti.service.Impl.ActZprocessServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -62,6 +69,10 @@ public class ActivitiModelController {
     private ActZprocessServiceImpl actZprocessService;
     @Autowired
     private IActNodeService actNodeService;
+    @Autowired
+    private RepositoryReService repositoryReService;
+    @Autowired
+    private IActReModelService actReModelService;
 
     @RequestMapping("/modelListData")
     @ResponseBody
@@ -69,12 +80,17 @@ public class ActivitiModelController {
         log.info("-------------模型列表-------------");
         ModelQuery modelQuery = repositoryService.createModelQuery();
         String keyWord = request.getParameter("keyWord");//搜索关键字
-        if (StrUtil.isNotBlank(keyWord)){
-            modelQuery.modelNameLike("%"+keyWord+"%");
-        }
-        List<Model> models = modelQuery.orderByCreateTime().desc().list();
+        String orgCode = request.getParameter("orgCode");//公司id
+//        if (StrUtil.isNotBlank(keyWord)){
+//            modelQuery.modelNameLike("%"+keyWord+"%");
+//        }
+//        List<Model> models = modelQuery.orderByCreateTime().desc().list();
+        ActReModel actReModel=new ActReModel();
+        actReModel.setName(keyWord);
+//        actReModel.setPkOrg(orgCode);
 
-        return Result.ok(models);
+        List<ActReModel> list=actReModelService.getList(actReModel);
+        return Result.ok(list);
     }
 
     @RequestMapping("/create")
@@ -87,6 +103,7 @@ public class ActivitiModelController {
            String name = request.getParameter("name");
            String description = request.getParameter("description");
            String key = request.getParameter("key");
+           String orgCode=request.getParameter("orgCode");
            if (StrUtil.isBlank(name)){
                name = "new-process";
            }
@@ -106,8 +123,24 @@ public class ActivitiModelController {
            model.setName(name);
            model.setKey(key);
            model.setMetaInfo(modelNode.toString());
-
            repositoryService.saveModel(model);
+           //处理数据所属公司
+           //修改数据
+           ActReModel actReModel=new ActReModel();
+           actReModel.setId(model.getId());
+           actReModel.setPkOrg(orgCode);//当前公司id
+           //修改
+           actReModelService.updateOrgById(actReModel);
+//           ModelRe m=new ModelReEntity();
+//           m.setKey(model.getKey());
+//           m.setName(model.getName());
+//           m.setCategory(model.getCategory());
+//           m.setDeploymentId(model.getDeploymentId());
+//           m.setMetaInfo(model.getMetaInfo());
+//           m.setTenantId(model.getTenantId());
+//           m.setVersion(model.getVersion());
+
+//           repositoryReService.saveModel(m);
            String id = model.getId();
 
            //完善ModelEditorSource
@@ -134,8 +167,8 @@ public class ActivitiModelController {
     }
 
 
-    @RequestMapping("/deployment/{id}")
-    public @ResponseBody Result deploy(@PathVariable("id")String id) {
+    @RequestMapping("/deployment/{id}/{orgCode}")
+    public @ResponseBody Result deploy(@PathVariable("id")String id,@PathVariable("orgCode")String orgCode) {
 
         // 获取模型
         Model modelData = repositoryService.getModel(id);
@@ -191,6 +224,7 @@ public class ActivitiModelController {
                 actZprocess.setDiagramName(pd.getDiagramResourceName());
                 actZprocessService.setAllOldByProcessKey(modelData.getKey());
                 actZprocess.setLatest(true);
+                actZprocess.setPkOrg(orgCode);//公司id
                 actZprocessService.save(actZprocess);
             }
         }catch (Exception e){

+ 3 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActivitiProcessController.java

@@ -83,6 +83,9 @@ public class ActivitiProcessController {
         if (StrUtil.isNotBlank(status)){
             wrapper.eq(ActZprocess::getStatus, status);
         }
+        //获取当前登录公司id 过滤
+        LoginUser sysUser1 = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+//        wrapper.eq(ActZprocess::getPkOrg,sysUser1.getOrgCode());
         List<ActZprocess> list = actZprocessService.list(wrapper);
         if (StrUtil.isNotBlank(request.getParameter("roles"))){ //过滤角色
             LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();

+ 1 - 1
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/TbTableInfoController.java

@@ -118,7 +118,7 @@ public class TbTableInfoController {
             queryWrapper.eq("task_node_id",taskNodeId);
             isSave=true;//分流程节点填写不同内容的表单 强制给到前台解除保存按钮禁用状态
         }else{//没有关联表则不把流程节点id当作查询条件
-            queryWrapper.and(qw->qw.eq("is_initial","1").or().isNull("is_initial"));
+            queryWrapper.and(qw->qw.eq("is_initial","1").or().isNull("is_initial").or().eq("is_initial",""));
         }
         TbTableInfo tableInfo = tbTableInfoService.getOne(queryWrapper);
         if(tableInfo==null) {

+ 13 - 1
jeecg-boot/jeecg-boot-module-system/pom.xml

@@ -40,14 +40,26 @@
 			<artifactId>jeecg-boot-module-activiti</artifactId>
 			<version>2.1.4</version>
 		</dependency>
-
+		<!--钉钉对接jar包-->
+		<dependency>
+			<groupId>com.dingtalk.api</groupId>
+			<artifactId>taobao-sdk</artifactId>
+			<version>0.0.1-SNAPSHOT</version>
+			<scope>system</scope>
+			<systemPath>${project.basedir}/src/main/resources/lib/taobao-sdk-java-auto.jar</systemPath>
+		</dependency>
 	</dependencies>
+
 	
 	<build>
 		<plugins>
 			<plugin>
 				<groupId>org.springframework.boot</groupId>
 				<artifactId>spring-boot-maven-plugin</artifactId>
+				<configuration>
+					<fork>false</fork>
+					<includeSystemScope>true</includeSystemScope>
+				</configuration>
 			</plugin>
 		</plugins>
 	</build>

+ 1 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java

@@ -75,6 +75,7 @@ public class ShiroConfig {
 		filterChainDefinitionMap.put("/sys/login", "anon"); //登录接口排除
 		filterChainDefinitionMap.put("/sys/mLogin", "anon"); //登录接口排除
 		filterChainDefinitionMap.put("/sys/logout", "anon"); //登出接口排除
+		filterChainDefinitionMap.put("/sys/getDingLogin", "anon"); //钉钉登录接口排除
 		filterChainDefinitionMap.put("/sys/getEncryptedString", "anon"); //获取加密串
 		filterChainDefinitionMap.put("/sys/sms", "anon");//短信验证码
 		filterChainDefinitionMap.put("/sys/phoneLogin", "anon");//手机登录		

+ 81 - 6
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/LoginController.java

@@ -3,9 +3,11 @@ package org.jeecg.modules.system.controller;
 import cn.hutool.core.util.RandomUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.aliyuncs.exceptions.ClientException;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CacheConstant;
@@ -22,8 +24,10 @@ import org.jeecg.modules.system.model.SysLoginModel;
 import org.jeecg.modules.system.service.ISysDepartService;
 import org.jeecg.modules.system.service.ISysLogService;
 import org.jeecg.modules.system.service.ISysUserService;
+import org.jeecg.modules.system.util.HttpHelper;
 import org.jeecg.modules.system.util.RandImageUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -49,6 +53,10 @@ public class LoginController {
     private RedisUtil redisUtil;
 	@Autowired
     private ISysDepartService sysDepartService;
+	@Value(value = "${dingtalk.appKey}")
+	private String appKey;
+	@Value(value = "${dingtalk.appSecret}")
+	private String appSecret;
 	
 	private static final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890";
 
@@ -351,14 +359,38 @@ public class LoginController {
 		JSONObject obj = new JSONObject();
 		List<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId());
 		obj.put("departs", departs);
-		if (departs == null || departs.size() == 0) {
+//		if (departs == null || departs.size() == 0) {
+//			obj.put("multi_depart", 0);
+//		} else if (departs.size() == 1) {
+//			sysUserService.updateUserDepart(username, departs.get(0).getOrgCode());
+//			obj.put("multi_depart", 1);
+//		} else {
+//			obj.put("multi_depart", 2);
+//		}
+		//获取关联公司情况
+		if(!StringUtils.isNotBlank(sysUser.getPkOrg())){
 			obj.put("multi_depart", 0);
-		} else if (departs.size() == 1) {
-			sysUserService.updateUserDepart(username, departs.get(0).getOrgCode());
-			obj.put("multi_depart", 1);
-		} else {
-			obj.put("multi_depart", 2);
+		}else{
+			String[] orgIdList=sysUser.getPkOrg().split(",");
+			if(orgIdList.length==1){
+				obj.put("multi_depart", 1);
+				sysUserService.updateUserDepart(username, orgIdList[0]);
+				sysUser.setOrgCode(orgIdList[0]);
+			}else{
+				obj.put("multi_depart", 2);
+			}
+			//获取公司集合
+			String[] orgNameList=sysUser.getPkOrgName().split(",");
+			List<SysDepart> orgList=new ArrayList<>();
+			for(int i=0;i<orgIdList.length;i++){
+				SysDepart sysDepart=new SysDepart();
+				sysDepart.setId(orgIdList[i]);
+				sysDepart.setDepartName(orgNameList[i]);
+				orgList.add(sysDepart);
+			}
+			obj.put("orgList", orgList);
 		}
+
 		obj.put("token", token);
 		obj.put("userInfo", sysUser);
 		result.setResult(obj);
@@ -487,4 +519,47 @@ public class LoginController {
 		return result;
 	}
 
+	/**
+	* @Author chenchuang
+	* @Description //TODO 钉钉免登录
+	* @Date 2021/9/18 14:02
+	* @Param [map]
+	* @return org.jeecg.common.api.vo.Result
+	*/
+	@PostMapping(value = "/getDingLogin")
+	public Result getDingLogin(@RequestBody Map<String,Object> map){
+		String code =map.get("code").toString();
+		System.out.println(code);
+		Result result=new Result();
+		//System.out.println("---------------------------- in getuserinfo ");
+		String accessToken = HttpHelper.getAccessTokenByDD(appKey, appSecret);
+		//System.out.println("---------------------------- accessToken: "+accessToken);
+		if (accessToken.equals(""))
+			return result;
+		JSONObject userInfo = HttpHelper.getUserInfoByDD(code, accessToken);
+		System.out.println(userInfo);
+		//System.out.println("---------------------------- user info :"+JSONObject.toJSONString(userInfo));
+		// 获取用户完整信息
+		JSONObject user = HttpHelper.getUserCompleteInfo(accessToken,userInfo.getString("userid"));
+		System.out.println(user);
+		//获取项目用户信息
+		QueryWrapper<SysUser> sysUserQueryWrapper = new QueryWrapper<>();
+		System.out.println(user.getString("name"));
+		//根据工号匹配
+		sysUserQueryWrapper.eq("realname", user.getString("name")).eq("del_flag",0);
+		//System.out.println("---------------------------- user complete info :"+JSONObject.toJSONString(user));
+		//根据姓名匹配
+		//sysUserQueryWrapper.eq("realname",userInfo.get("name"));
+		SysUser one = sysUserService.getOne(sysUserQueryWrapper);
+		if(one==null){
+			result.error500("用户不存在");
+			return result;
+		}else{
+			//用户登录信息
+			userInfo(one, result);
+			sysBaseAPI.addLog("用户名: " + one.getUsername() + ",登录成功!", CommonConstant.LOG_TYPE_1, null);
+		}
+		return result;
+	}
+
 }

+ 2 - 1
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDictController.java

@@ -540,7 +540,8 @@ public class SysDictController {
 			 }
 			 List<SysDict> sysDictList = sysDictService.list(new LambdaQueryWrapper<SysDict>().in(SysDict::getDictCode, dictCode));
 			if(CollectionUtils.isEmpty(sysDictList)){
-				result.error500("没查到相关数据");
+//				result.error500("没查到相关数据");
+				result.setResult(new DictModelDTO(Maps.newHashMap()));
 				return result;
 			}
 			List<String> ids = sysDictList.stream().map(t -> t.getId()).collect(Collectors.toList());

+ 15 - 2
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserController.java

@@ -762,9 +762,22 @@ public class SysUserController {
         Result<Map<String,Object>> result = new Result<Map<String,Object>>();
         try {
         	LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();
-            List<SysDepart> list = this.sysDepartService.queryUserDeparts(sysUser.getId());
+//            List<SysDepart> list = this.sysDepartService.queryUserDeparts(sysUser.getId());
+            List<SysDepart> orgList=new ArrayList<>();
+            if(StringUtils.isNotBlank(sysUser.getPkOrg())){
+                //获取公司集合
+                String[] orgIdList=sysUser.getPkOrg().split(",");
+                String[] orgNameList=sysUser.getPkOrgName().split(",");
+                for(int i=0;i<orgIdList.length;i++){
+                    SysDepart sysDepart=new SysDepart();
+                    sysDepart.setId(orgIdList[i]);
+                    sysDepart.setDepartName(orgNameList[i]);
+                    orgList.add(sysDepart);
+                }
+            }
             Map<String,Object> map = new HashMap<String,Object>();
-            map.put("list", list);
+//            map.put("list", list);
+            map.put("list", orgList);
             map.put("orgCode", sysUser.getOrgCode());
             result.setSuccess(true);
             result.setResult(map);

+ 12 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysUser.java

@@ -170,4 +170,16 @@ public class SysUser implements Serializable {
     @Excel(name="负责部门",width = 15,dictTable ="sys_depart",dicText = "depart_name",dicCode = "id")
     @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id")
     private String departIds;
+
+    /**
+     * 所属公司id
+     */
+    @Excel(name="所属公司id",width = 15)
+    private String pkOrg;
+
+    /**
+     * 所属公司名称
+     */
+    @Excel(name="所属公司名称",width = 15)
+    private String pkOrgName;
 }

+ 461 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/util/HttpHelper.java

@@ -0,0 +1,461 @@
+package org.jeecg.modules.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.*;
+import com.dingtalk.api.response.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.utils.URLEncodedUtils;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.system.entity.SysUser;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.jeecg.modules.system.service.impl.SysUserServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Formatter;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+public class HttpHelper {
+
+    @Autowired
+    private ISysUserService sysUserService;
+
+    public static Long agentId;
+
+    private static String appKey;
+
+    private static String appSecret;
+
+    private static String frontpageUrl;
+
+//    private static String corpId;
+//
+//    private static String appId;
+
+    @Autowired
+    private Environment env;
+
+    private static HttpHelper httpHelper;
+
+    @PostConstruct
+    public void readConfig() {
+//        agentId = Long.valueOf(env.getProperty("dingtalk.agentId")).longValue();
+        appKey = env.getProperty("dingtalk.appKey");
+        appSecret = env.getProperty("dingtalk.appSecret");
+        frontpageUrl = env.getProperty("frontpage.url");
+//        corpId = env.getProperty("dingtalk.corpId");
+//        appId = env.getProperty("dingtalk.appId");
+        httpHelper = this;
+        httpHelper.sysUserService = this.sysUserService;
+    }
+
+    /*
+     * params:
+     * 		url:需要Get请求的网址
+     *
+     * return:
+     * 		返回请求时网页相应的数据,用json存储
+     */
+    public static JSONObject httpGet(String url) {
+        //创建httpClient
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        HttpGet httpGet = new HttpGet(url);                             //生成一个请求
+        RequestConfig requestConfig = RequestConfig.custom().         //配置请求的一些属性
+                setSocketTimeout(5000).setConnectTimeout(5000).setConnectionRequestTimeout(1000).build();
+        httpGet.setConfig(requestConfig);                             //为请求设置属性
+        CloseableHttpResponse response = null;
+        try {
+            response = httpClient.execute(httpGet);
+            //如果返回结果的code不等于200,说明出错了
+            if (response.getStatusLine().getStatusCode() != 200) {
+                System.out.println("request url failed, http code=" + response.getStatusLine().getStatusCode() + ", url=" + url);
+                return null;
+            }
+            HttpEntity entity = response.getEntity();                 //reponse返回的数据在entity中
+            if (entity != null) {
+                String resultStr = EntityUtils.toString(entity, "utf-8");//将数据转化为string格式
+                JSONObject result = JSONObject.parseObject(resultStr);  //将结果转化为json格式
+                if (result.getInteger("errcode") == 0) {                  //如果返回值得errcode值为0,则成功
+                    //移除一些没用的元素
+                    result.remove("errcode");
+                    result.remove("errmsg");
+                    return result;                                    //返回有用的信息
+                } else {                                                 //返回结果出错了,则打印出来
+                    System.out.println("request url=" + url + ",return value=");
+                    System.out.println(resultStr);
+                    int errCode = result.getInteger("errcode");
+                    String errMsg = result.getString("errmsg");
+                    throw new Exception("ErrorCode:" + errCode + "ErrorMsg" + errMsg);
+                }
+            }
+        } catch (ClientProtocolException e) {
+            // TODO Auto-generated catch block
+            System.out.println("request url=" + url + ", exception, msg=" + e.getMessage());
+            e.printStackTrace();
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            System.out.println("request url=" + url + ", exception, msg=" + e.getMessage());
+            e.printStackTrace();
+        } finally {
+            if (response != null) try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return null;
+    }
+
+
+
+    /**然后是调用httpGet方法获得access_token的代码实现:*/
+    public static String getAccessToken(String corpid,String corpsecret){
+        String url="https://oapi.dingtalk.com/gettoken?"+"corpid="+corpid+"&corpsecret="+corpsecret;
+        JSONObject res=HttpHelper.httpGet(url); //将httpGet方法封装在HttpHelper类中
+        String access_token="";
+        if(res!=null){
+            access_token=res.getString("access_token");
+        }
+        else{
+            //throw new Exception("Cannot resolve field access_token from oapi resonpse");
+        }
+        return access_token;
+    }
+
+    /***
+     * 使用钉钉客户端函数,获取access_token
+     * @param appKey
+     * @param appSecret
+     * @return
+     */
+    public static String getAccessTokenByDD(String appKey,String appSecret){
+        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
+        OapiGettokenRequest request = new OapiGettokenRequest();
+        request.setAppkey(appKey);
+        request.setAppsecret(appSecret);
+        request.setHttpMethod("GET");
+        String access_token = "";
+        try {
+            OapiGettokenResponse response = client.execute(request);
+            access_token = response.getAccessToken();
+        }catch (Exception ex){
+            log.error("---------------------------- get token exception:"+ex.getMessage());
+        }
+        return access_token;
+    }
+
+    /**
+     * 获取当前用户钉钉信息
+     * @param code
+     * @param access_token
+     * @return
+     */
+    public static JSONObject getUserInfoByDD(String code , String access_token){
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");
+        OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest();
+        request.setCode(code);
+        request.setHttpMethod("GET");
+        JSONObject userInfo = new JSONObject();
+        try {
+            // 获取当前用户,userid
+            OapiUserGetuserinfoResponse response = client.execute(request, access_token);
+            JSONObject responseJson = JSON.parseObject(JSONObject.toJSONString(response));
+            if (responseJson.getInteger("errcode") == 0){
+                userInfo = responseJson.getJSONObject("body");
+                /*
+                JSONObject absInfo = responseJson.getJSONObject("body");
+                // 获取用户详细信息
+                DingTalkClient clientDetail = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/get");
+                OapiUserGetRequest reqDetail = new OapiUserGetRequest();
+                reqDetail.setUserid(absInfo.getString("userid"));
+                reqDetail.setHttpMethod("GET");
+                OapiUserGetResponse respDetail = clientDetail.execute(reqDetail, access_token);
+
+                responseJson = JSON.parseObject(JSONObject.toJSONString(respDetail));
+                if (responseJson.getInteger("errcode") == 0)
+                    userInfo = responseJson.getJSONObject("body");
+                else
+                    log.error("---------------------------- get userinfo detail error:"+responseJson.getString("errmsg"));
+                */
+            }else{
+                log.error("---------------------------- get userinfo error:"+responseJson.getString("errmsg"));
+            }
+        }catch (Exception ex){
+            log.error("---------------------------- get userinfo exception:"+ex.getMessage());
+        }
+        return userInfo;
+    }
+
+    /**
+     * 获取用户信息详情
+     * @param access_token
+     * @param userid
+     * @return
+     */
+    public static JSONObject getUserCompleteInfoByDD(String access_token,String userid){
+        DingTalkClient clientDetail = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/get");
+        OapiUserGetRequest reqDetail = new OapiUserGetRequest();
+        reqDetail.setUserid(userid);
+        reqDetail.setHttpMethod("GET");
+        JSONObject userInfo = new JSONObject();
+        try {
+            OapiUserGetResponse respDetail = clientDetail.execute(reqDetail, access_token);
+
+            JSONObject responseJson = JSON.parseObject(JSONObject.toJSONString(respDetail));
+            if (responseJson.getInteger("errcode") == 0)
+                userInfo = responseJson.getJSONObject("body");
+            else
+                log.error("---------------------------- get userinfo detail error:" + responseJson.getString("errmsg"));
+
+        } catch (Exception ex) {
+            log.error("---------------------------- get userinfo detail exception:" + ex.getMessage());
+        }
+        return userInfo;
+    }
+    /**
+     * 向网页请求ticket值,用Get方式请求网页
+     * param:
+     * 	access_token:上面得到的access_token值
+     *
+     * return:
+     * 	返回值是ticket
+     */
+    public static String getTicket(String access_token){
+        String url="https://oapi.dingtalk.com/get_jsapi_ticket?"+ "access_token="+access_token;
+
+        JSONObject res=HttpHelper.httpGet(url);//步骤3中有httpGet的定义,只是封装在HttpHelper类中
+        String ticket="";
+        if(res!=null){
+            ticket=res.getString("ticket");
+        }
+        else{
+            // new Exception("Cannot resolve field ticket from oapi resonpse");
+        }
+        return ticket;
+    }
+
+    public static JSONObject getUserInfo(String code , String access_token){
+        String url="https://oapi.dingtalk.com/user/getuserinfo?"+ "code="+code + "&access_token="+access_token;
+        JSONObject res=HttpHelper.httpGet(url);//步骤3中有httpGet的定义,只是封装在HttpHelper类中
+        return res;
+    }
+    public static JSONObject getUserCompleteInfo(String access_token,String userid) {
+        String url="https://oapi.dingtalk.com/user/get?" + "access_token="+access_token + "&userid="+userid;
+        JSONObject res=HttpHelper.httpGet(url);//步骤3中有httpGet的定义,只是封装在HttpHelper类中
+        System.out.println(res);
+        return res;
+    }
+
+    /*
+     * 生成签名的函数
+     * params:
+     * 	ticket:签名数据
+     * 	nonceStr:签名用的随机字符串,从properties文件中读取
+     * 	timeStamp:生成签名用的时间戳
+     * 	url:当前请求的URL地址
+     */
+    public static String getSign(String ticket, String nonceStr, long timeStamp, String url) throws Exception {
+        String plain = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "×tamp=" + String.valueOf(timeStamp)
+                + "&url=" + url;
+        try {
+            MessageDigest sha1 = MessageDigest.getInstance("SHA-1");    //安全hash算法
+            sha1.reset();
+            sha1.update(plain.getBytes("UTF-8"));         //根据参数产生hash值
+            return bytesToHex(sha1.digest());
+        } catch (NoSuchAlgorithmException e) {
+            throw new Exception(e.getMessage());
+        } catch (UnsupportedEncodingException e) {
+            throw new Exception(e.getMessage());
+        }
+    }
+
+    //将bytes类型的数据转化为16进制类型
+    private static String bytesToHex(byte[] hash) {//将字符串转化为16进制的数据
+        Formatter formatter = new Formatter();
+        for (byte b : hash) {
+            formatter.format("%02x", b);
+        }
+        String result = formatter.toString();
+        formatter.close();
+        return result;
+    }
+
+    /**
+     * 获取调用钉钉接口的凭证
+     * @return
+     * @throws Exception
+     */
+    public static OapiGettokenResponse getAccessToken() throws Exception{
+        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
+        OapiGettokenRequest request = new OapiGettokenRequest();
+        request.setAppkey(appKey);
+        request.setAppsecret(appSecret);
+        request.setHttpMethod("GET");
+        OapiGettokenResponse response = client.execute(request);
+        return response;
+    }
+
+    /**
+     * 获取钉钉所有用户的信息
+     * @return
+     * @throws Exception
+     */
+    public static List<OapiUserListbypageResponse.Userlist> getUserInfoList() throws Exception{
+        OapiGettokenResponse accessTokenObj = getAccessToken();
+        String accessToken = accessTokenObj.getAccessToken();
+        List<OapiUserListbypageResponse.Userlist> ret = new LinkedList<>();
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/listbypage");
+        OapiUserListbypageRequest request = new OapiUserListbypageRequest();
+        long size = 100L;
+        List<OapiDepartmentListResponse.Department> depList = getDepartmentList(accessToken);
+        for (OapiDepartmentListResponse.Department dep : depList) {
+            request.setDepartmentId(dep.getId());//代表跟部门
+            request.setSize(size);
+            request.setHttpMethod("GET");
+            long index = 0;
+            while (true){
+                request.setOffset(index*size);//分页起始位
+                OapiUserListbypageResponse execute = client.execute(request,accessToken);
+                List<OapiUserListbypageResponse.Userlist> curResult = execute.getUserlist();
+
+                if(curResult.size() > 0) {
+                    ret.addAll(curResult);
+                }
+                if (!execute.getHasMore() || curResult.size() == 0 )
+                    break;
+                index++;
+            }
+        }
+        return ret;
+    }
+    /**
+     * 根据工号获取用户id
+     * @param accessToken
+     * @param jobNumber 工号
+     * @return
+     * @throws Exception
+     */
+    private static OapiUserListbypageResponse.Userlist getUserByJobnumber(String accessToken,String jobNumber) throws Exception{
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/listbypage");
+        OapiUserListbypageRequest request = new OapiUserListbypageRequest();
+        long size = 100;
+        List<OapiDepartmentListResponse.Department> depList = getDepartmentList(accessToken);
+        OapiUserListbypageResponse.Userlist ret = null;
+        for (OapiDepartmentListResponse.Department dep : depList) {
+            request.setDepartmentId(dep.getId());//代表跟部门
+            request.setSize(size);
+            request.setHttpMethod("GET");
+            long index = 0;
+            while (true){
+                request.setOffset(index*size);//分页起始位
+                OapiUserListbypageResponse execute = client.execute(request,accessToken);
+                List<OapiUserListbypageResponse.Userlist> curResult = execute.getUserlist();
+                List<OapiUserListbypageResponse.Userlist> users = curResult.stream().filter(item -> jobNumber.equals(item.getJobnumber())).collect(Collectors.toList());
+                if (users.size()>0)
+                    ret = users.get(0);
+
+                if (!execute.getHasMore() || curResult.size() == 0 || ret != null)
+                    break;
+                index++;
+            }
+            if (ret != null)
+                break;
+        }
+        return ret;
+    }
+    /**
+     * 获取部门列表
+     * @param accessToken
+     * @throws Exception
+     */
+    public static List<OapiDepartmentListResponse.Department> getDepartmentList(String accessToken) throws Exception{
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/list");
+        OapiDepartmentListRequest request = new OapiDepartmentListRequest();
+        request.setHttpMethod("GET");
+        OapiDepartmentListResponse response = client.execute(request, accessToken);
+        List<OapiDepartmentListResponse.Department> ret = new LinkedList<>();
+        if (response.isSuccess()){
+            ret = response.getDepartment();
+        }else {
+            log.error("---------------------------- get department list error:" + response.getErrmsg());
+        }
+        return ret;
+    }
+
+    /**
+     * 发送钉钉消息
+     * @param username 人员的name,根据name去钉钉中匹配,找到对应的钉钉userid
+     * @param title 消息标题
+     * @param content 消息内容
+     * @param url 变长参数,可不填,为消息跳转地址
+     * @return
+     * @throws Exception
+     */
+//    public static OapiMessageCorpconversationAsyncsendV2Response sendDingTalkMsg(String username,String title,String content,String url) throws Exception{
+//
+//        OapiGettokenResponse accessToken = getAccessToken();
+//        /*
+//        List<OapiUserListbypageResponse.Userlist> userlist = getUserInfoList(accessToken.getAccessToken(), 100L);
+//        List<OapiUserListbypageResponse.Userlist> users = userlist.stream().filter(item -> username.equals(item.getJobnumber())).collect(Collectors.toList());
+//        if(users==null || users.isEmpty()){
+//            throw new RuntimeException("钉钉消息发送失败");
+//        }*/
+//
+//        //实时查询所有的钉钉用户
+//        //OapiUserListbypageResponse.Userlist user = getUserByJobnumber(accessToken.getAccessToken(), username);
+//        //根据本地同步的用户查询userid
+//        SysUser user = httpHelper.sysUserService.getUserByName(username);
+//        if (user == null){
+//            throw new RuntimeException("钉钉消息发送失败:获取钉钉用户信息失败");
+//        }
+//        //实时查询所有的钉钉用户
+//        //String dingdingUid = user.getUserid();
+//        String dingdingUid = user.getDingdingUid();
+//        if(oConvertUtils.isEmpty(dingdingUid)){
+//            throw new RuntimeException("钉钉消息发送失败:"+username+"没有同步钉钉上的用户id");
+//        }
+//        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
+//        OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
+//        request.setUseridList(dingdingUid);
+//        request.setAgentId(agentId);
+//        request.setToAllUser(false);
+//        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+//        //发送action_card消息
+//        msg.setActionCard(new OapiMessageCorpconversationAsyncsendV2Request.ActionCard());
+//        msg.getActionCard().setTitle(title);
+//        msg.getActionCard().setMarkdown(content);
+//        msg.getActionCard().setSingleTitle("查看详情");
+//        //dingtalk://dingtalkclient/action/openapp?corpid=免登企业corpId&container_type=work_platform&app_id=应用id&redirect_type=jump&redirect_url=跳转url
+//        String jumpUrl = frontpageUrl + "/#/"+url;
+////        String url = "dingtalk://dingtalkclient/action/openapp?corpid="+corpId+"&container_type=work_platform&app_id="+appId+"&redirect_type=jump&redirect_url="+ URLEncoder.encode(jumpUrl,"utf-8");
+//        msg.getActionCard().setSingleUrl(jumpUrl);
+//        msg.setMsgtype("action_card");
+//        request.setMsg(msg);
+//        OapiMessageCorpconversationAsyncsendV2Response response = client.execute(request,accessToken.getAccessToken());
+//        return response;
+//    }
+}

+ 6 - 1
jeecg-boot/jeecg-boot-module-system/src/main/resources/application-dev.yml

@@ -96,7 +96,7 @@ spring:
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
       datasource:
         master:
-          url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&useSSL=false
+          url: jdbc:mysql://127.0.0.1:3306/cd_work_flow_dev?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&useSSL=false
           username: root
           password: root
           driver-class-name: com.mysql.jdbc.Driver
@@ -183,6 +183,11 @@ jeecg :
     minio_name: ??
     minio_pass: ??
     bucketName: ??
+
+#钉钉配置
+dingtalk:
+  appKey: dingqowvovktgfpuvhbn
+  appSecret: mzMwJgzRD0kDo3vPYmMCZcrgkymRGabHYmTceVqOQ9jQJWCPKX5rkIJO9vcaklyF
 #Mybatis输出sql日志
 logging:
   level:

+ 29 - 14
jeecg-boot/jeecg-boot-module-system/src/main/resources/application-prod.yml

@@ -1,5 +1,5 @@
 server:
-  port: 8080
+  port: 8087
   tomcat:
     max-swallow-size: -1
   servlet:
@@ -21,8 +21,8 @@ spring:
         max-file-size: 10MB
         max-request-size: 10MB
   mail:
-    host: smtp.163.com
-    username: jeecgos@163.com
+    host: smtp.qq.com
+    username: 350012167@qq.com
     password: ??
     properties:
       mail:
@@ -76,7 +76,7 @@ spring:
         # 初始化大小,最小,最大
         initial-size: 5
         min-idle: 5
-        maxActive: 1000
+        maxActive: 20
         # 配置获取连接等待超时的时间
         maxWait: 60000
         # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
@@ -96,9 +96,9 @@ spring:
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
       datasource:
         master:
-          url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false
+          url: jdbc:mysql://127.0.0.1:3306/cd_work_flow_dev?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&useSSL=false
           username: root
-          password: root
+          password: CuiDian1234
           driver-class-name: com.mysql.jdbc.Driver
           # 多数据源配置
           #multi-datasource1:
@@ -108,7 +108,7 @@ spring:
           #driver-class-name: com.mysql.jdbc.Driver
   #redis 配置
   redis:
-    database: 0
+    database: 11
     host: 127.0.0.1
     lettuce:
       pool:
@@ -119,6 +119,16 @@ spring:
       shutdown-timeout: 100ms
     password: ''
     port: 6379
+  main:
+    allow-bean-definition-overriding: true
+  #Activiti property configuration
+  activiti:
+    database-schema-update: true
+    job-executor-activate: true # asyncExecutorEnabled属性设置设置true后将代替那些老的Job executor
+    history-level: full
+    db-history-used: true
+    #async-executor-activate: true
+    check-process-definitions: false # 自动部署验证设置:true-开启(默认)、false-关闭
 #mybatis plus 设置
 mybatis-plus:
   mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml
@@ -141,12 +151,12 @@ jeecg :
   uploadType: local
   path :
     #文件上传根目录 设置
-    upload: /opt/jeecg-boot/upload
+    upload: D://opt//upFiles
     #webapp文件路径
-    webapp: /opt/jeecg-boot/webapp
+    webapp: D://opt//webapp
   #短信秘钥
   sms:
-     accessKeyId: LTAIpW4gUG7xYDNI
+     accessKeyId: ??
      accessKeySecret: ??
   shiro:
      excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**
@@ -159,7 +169,7 @@ jeecg :
     staticDomain: ??
   # ElasticSearch 设置
   elasticsearch:
-    cluster-name: jeecg-ES
+    cluster-name: docker-cluster
     cluster-nodes: 127.0.0.1:9200
   # 表单设计器配置
   desform:
@@ -173,9 +183,14 @@ jeecg :
     minio_name: ??
     minio_pass: ??
     bucketName: ??
+#钉钉配置
+dingtalk:
+  appKey: dingqeznhgqwyxgsapxa
+  appSecret: 1UqABvmcsguOuuHMQppkbIuSQQZw-H0vWC6bDeXg-CcBjTQ31pcKIHsiDZCEex6m
+#Mybatis输出sql日志
+logging:
+  level:
+    org.jeecg.modules : debug
 #cas单点登录
 cas:
   prefixUrl: http://cas.example.org:8443/cas
-logging:
-  level:
-    org.jeecg.modules.system.mapper : debug

+ 3 - 3
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/jeecg_database.properties

@@ -1,9 +1,9 @@
 #mysql
 diver_name=com.mysql.jdbc.Driver
-url=jdbc:mysql://localhost:3306/jeecg-boot?useUnicode=true&characterEncoding=UTF-8
+url=jdbc:mysql://localhost:3306/cd_work_flow_dev?useUnicode=true&characterEncoding=UTF-8
 username=root
-password=123456
-database_name=jeecg-boot
+password=root
+database_name=cd_work_flow_dev
 
 #oracle11g
 #diver_name=oracle.jdbc.driver.OracleDriver

binární
jeecg-boot/jeecg-boot-module-system/src/main/resources/lib/taobao-sdk-java-auto.jar