Просмотр исходного кода

Merge branch 'master' of http://git.iamberry.com/hexiugang/iamberry-common-parent

wangxiaoming 6 лет назад
Родитель
Сommit
9b157be300

+ 19 - 6
pom.xml

@@ -510,6 +510,19 @@
 			<artifactId>pagehelper</artifactId>
 			<version>5.0.1</version>
 		</dependency>
+
+		<!-- 工作流 -->
+		<dependency>
+			<groupId>org.activiti</groupId>
+			<artifactId>activiti-engine</artifactId>
+			<version>6.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.activiti</groupId>
+			<artifactId>activiti-spring</artifactId>
+			<version>6.0.0</version>
+		</dependency>
+
 	</dependencies>
 	<build>
 		<plugins>
@@ -529,9 +542,9 @@
 		<module>iamberry-common-interface</module>
 		<module>iamberry-app-api</module>
 		<module>iamberry-app-service</module>
-		<module>iamberry-app-interface</module>-->
+		<module>iamberry-app-interface</module>
 
-		<!--<module>iamberry-common-core</module>
+		<module>iamberry-common-core</module>
 		<module>iamberry-common-tool</module>
 		<module>iamberry-common-web</module>
 		<module>iamberry-wechat-interface</module>
@@ -541,22 +554,22 @@
 		<module>watero-common-core</module>
 		<module>watero-common-tool</module>
 		<module>watero-common-web</module>
-		<module>watero-rent-interface</module>
+		<!--<module>watero-rent-interface</module>
 		<module>watero-rent-service</module>
 		<module>watero-wechat-interface</module>
 		<module>watero-wechat-service</module>
 		<module>watero-wechat-web</module>
-		<module>watero-rent-web</module>
+		<module>watero-rent-web</module>-->
 		<module>watero-rst-web</module>
 		<module>watero-rst-core</module>
 		<module>watero-rst-interface</module>
 		<module>watero-rst-service</module>
-		<module>wateroPF-common-core</module>
+		<!--<module>wateroPF-common-core</module>
 		<module>wateroPF-common-tool</module>
 		<module>wateroPF-common-web</module>
 		<module>wateroPF-wechat-interface</module>
 		<module>wateroPF-wechat-service</module>
-		<module>wateroPF-wechat-web</module>
+		<module>wateroPF-wechat-web</module>-->
 	</modules>
 
 	<!-- 配置 -->

+ 36 - 0
watero-rst-interface/src/main/java/com/iamberry/rst/faces/approval/ApprovalTaskService.java

@@ -0,0 +1,36 @@
+package com.iamberry.rst.faces.approval;
+
+import java.util.Map;
+
+/**
+ * 审批任务
+ * @author 献
+ * @company 深圳爱贝源科技有限公司
+ * @date 2018/9/25 16:02
+ * @tel 18271840547
+ * @website www.iamberry.com
+ */
+public interface ApprovalTaskService {
+
+    /**
+     * 提交审批申请
+     * @param  type   1:生成订单审批;2:提货申请
+     * @return key=pid,表示本次申请的id,需要保存; key=status,表示审批状态(0:没有审批人,1:还有审批人); key=users,数组,为系统用户登录名,如果多个需要为每个人都保存审批任务; key=taskId,审批任务的id
+     */
+    Map<String, Object> salesmanSubmitApply(int type);
+
+    /**
+     * 完成审批
+     * @param pid       提交审批申请时获取到的pid
+     * @param taskId    提交审批申请时获取到的taskId
+     * @return key=status 1:表示没有下一个审批人 0:表示还有下一个审批人,需要增加任务; key=users,数组,为系统用户登录名,如果多个需要为每个人都保存审批任务; key=taskId,审批任务的id
+     */
+    Map<String, Object> completeTask(String pid, String taskId);
+
+    /**
+     * 删除审核任务(当业务员撤销、审核驳回时需要调用此接口)
+     * @param pid       提交生产申请时获取到的pid
+     * @param reason    说明(eg:业务员撤销审核)不允许为空
+     */
+    void revokeTask(String pid, String reason);
+}

+ 119 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/approval/ApprovalTaskServiceImpl.java

@@ -0,0 +1,119 @@
+package com.iamberry.rst.service.approval;
+
+import com.iamberry.rst.faces.approval.ApprovalTaskService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author 献
+ * @company 深圳爱贝源科技有限公司
+ * @date 2018/9/25 16:03
+ * @tel 18271840547
+ * @website www.iamberry.com
+ */
+@Service
+public class ApprovalTaskServiceImpl implements ApprovalTaskService {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ApprovalTaskServiceImpl.class);
+
+    @Autowired
+    private RuntimeService runtimeService;
+
+    @Autowired
+    private TaskService taskService;
+
+    private static final String GENERATION_APPROVAL_KEY = "GenerationApproval";
+
+    private static final String APPLICATION_FOR_DELIVERY_KEY = "ApplicationForDelivery";
+
+    private static final String SPLIT_ASSIGNEE_CHAR = "&";
+
+    @Override
+    public Map<String, Object> salesmanSubmitApply(int type) {
+        // type = 1表示生产订单审批;type = 2表示提货申请审批
+        Map<String, Object> result = new HashMap<>(4);
+        result.put("status", 1);
+        // 使用流程定义的key启动流程实例
+        ProcessInstance pi = runtimeService.startProcessInstanceByKey(type == 1 ? GENERATION_APPROVAL_KEY : APPLICATION_FOR_DELIVERY_KEY);
+        // 寻找第一个审批任务,如果不存在表示审批结束
+        Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
+        if (task == null) {
+            result.put("status", 0);
+            result.put("key", pi.getId());
+            return result;
+        }
+        // 执行第一个审批流程,标记为完成
+        taskService.complete(task.getId());
+        // 寻找下一个审批人(0 - n 个)
+        Map<String, Object> approver = findTaskNextAssignee(pi.getId());
+        if (approver == null) {
+            // 如果没有审批人时,表示审批结束
+            result.put("status", 0);
+            result.put("key", pi.getId());
+            return result;
+        }
+        // 返回数据
+        result.put("key", pi.getId());
+        result.put("users", approver.get("assignee"));
+        result.put("taskId", approver.get("taskId"));
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> completeTask(String pid, String taskId) {
+        Map<String, Object> result = new HashMap<>(3);
+        result.put("status", 0);
+        // 提交任务
+        taskService.complete(taskId);
+        // 寻找下一个审批人(0 - n 个)
+        Map<String, Object> approver = findTaskNextAssignee(pid);
+        if (approver == null) {
+            // 不存在下一个审批人,表示审批结束
+            result.put("status", 1);
+            return result;
+        }
+
+        // 返回数据
+        result.put("users", approver.get("assignee"));
+        result.put("taskId", approver.get("taskId"));
+        return result;
+    }
+
+    @Override
+    public void revokeTask(String pid, String reason) {
+        runtimeService.deleteProcessInstance(pid, reason);
+    }
+
+    /**
+     * 寻找任务的下一个审批人
+     * @param pid 任务实例id
+     * @return 审批人,系统中用户的登录名
+     */
+    private Map<String, Object> findTaskNextAssignee(String pid) {
+        Map<String, Object> result = new HashMap<>(2);
+        // 搜索当前实例的待处理任务
+        Task nextTask = taskService.createTaskQuery().processInstanceId(pid).singleResult();
+        if (nextTask == null) {
+            return null;
+        }
+        // 在BMPN中,通过&分割多个审批人
+        String assignee = nextTask.getAssignee();
+        if (assignee.contains(SPLIT_ASSIGNEE_CHAR)) {
+            result.put("taskId", nextTask.getId());
+            result.put("assignee", assignee.split(SPLIT_ASSIGNEE_CHAR));
+            return  result;
+        }
+        result.put("taskId", nextTask.getId());
+        result.put("assignee", new String[]{assignee});
+        return  result;
+    }
+}

+ 13 - 0
watero-rst-web/pom.xml

@@ -114,6 +114,19 @@
             <artifactId>IKAnalyzer2012</artifactId>
             <version>1.0</version>
         </dependency>
+
+        <!-- 工作流 -->
+        <dependency>
+            <groupId>org.activiti</groupId>
+            <artifactId>activiti-engine</artifactId>
+            <version>6.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.activiti</groupId>
+            <artifactId>activiti-spring</artifactId>
+            <version>6.0.0</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 9 - 0
watero-rst-web/src/main/resources/activiti-jdbc.properties

@@ -0,0 +1,9 @@
+activiti.jdbc.driver=com.mysql.jdbc.Driver
+activiti.jdbc.url=jdbc:mysql://iamberry.mysql.rds.aliyuncs.com:3306/activiti?serverTimezone=Asia%2fShanghai&useTimezone=true&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&useSSL=true&paranoid=true
+activiti.jdbc.username=activiti
+activiti.jdbc.password=Aactiviti123
+#pool settings
+activiti.jdbc.pool.init=1
+activiti.jdbc.pool.minIdle=3
+activiti.jdbc.pool.maxActive=20
+activiti.jdbc.testSql=SELECT 1

+ 74 - 0
watero-rst-web/src/main/resources/activiti.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+       http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+    <bean id="transactionManager_activiti" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
+        <property name="dataSource" ref="dataSource_activiti"/>
+    </bean>
+    <!-- activiti datasource -->
+    <bean id="dataSource_activiti" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
+        <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
+        <property name="driverClassName" value="${activiti.jdbc.driver}" />
+        <!-- 基本属性 url、user、password -->
+        <property name="url" value="${activiti.jdbc.url}" />
+        <property name="username" value="${activiti.jdbc.username}" />
+        <property name="password" value="${activiti.jdbc.password}" />
+        <!-- 配置初始化大小、最小、最大 -->
+        <property name="initialSize" value="${activiti.jdbc.pool.init}" />
+        <property name="minIdle" value="${activiti.jdbc.pool.minIdle}" />
+        <property name="maxActive" value="${activiti.jdbc.pool.maxActive}" />
+        <!-- 配置获取连接等待超时的时间 -->
+        <property name="maxWait" value="60000" />
+        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
+        <property name="timeBetweenEvictionRunsMillis" value="60000" />
+        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
+        <property name="minEvictableIdleTimeMillis" value="300000" />
+        <!-- 用来检测连接是否有效的sql -->
+        <property name="validationQuery" value="${activiti.jdbc.testSql}" />
+        <property name="testWhileIdle" value="true" />
+        <!-- 申请连接时执行validationQuery检测连接是否有效,服务器单方面关闭连接,防止执行SQL的时候报错 -->
+        <property name="testOnBorrow" value="true" />
+        <!-- 归还连接的时候不需要校验 -->
+        <property name="testOnReturn" value="false" />
+        <!-- 物理连接初始化的时候执行的sql : 设置编码,Mysql服务器需要更高版本 -->
+        <property name="connectionInitSqls" value="set names utf8mb4;SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));"/>
+        <property name="filters" value="stat"/>
+        <!-- 配置监控统计拦截的filters -->
+        <property name="proxyFilters">
+            <list>
+                <ref bean="wall-filter"/>
+            </list>
+        </property>
+    </bean>
+    <bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
+        <property name="config" ref="wall-config" />
+    </bean>
+    <bean id="wall-config" class="com.alibaba.druid.wall.WallConfig">
+        <property name="multiStatementAllow" value="true" />
+    </bean>
+
+    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
+        <property name="dataSource" ref="dataSource_activiti"/>
+        <property name="transactionManager" ref="transactionManager_activiti"/>
+        <property name="databaseSchemaUpdate" value="true"/>
+        <property name="asyncExecutorActivate" value="true"/>
+        <property name="deploymentResources" value="classpath*:*.bpmn"/>
+    </bean>
+    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
+        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
+    </bean>
+    <!-- 管理流程定义 -->
+    <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
+    <!-- 执行管理,包括启动、推进、删除流程实例等操作 -->
+    <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>
+    <!-- 任务管理 -->
+    <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
+    <!-- 历史管理(执行完的数据的管理) -->
+    <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>
+    <!--  -->
+    <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/>
+    <!-- 组织机构管理 -->
+    <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>
+</beans>

+ 8 - 2
watero-rst-web/src/main/resources/log4j.properties

@@ -1,5 +1,5 @@
 #levels: debug, info, warn, error, fatal
-log4j.rootLogger=info,stdout,infoLog,errorLog
+log4j.rootLogger=info,stdout,infoLog,errorLog,ACT
 
 #\u63A7\u5236\u53F0
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
@@ -40,4 +40,10 @@ log4j.logger.java.sql.ResultSet=INFO
 log4j.logger.org.apache=INFO
 log4j.logger.java.sql.Connection=INFO
 log4j.logger.java.sql.Statement=INFO
-log4j.logger.java.sql.PreparedStatement=INFO
+log4j.logger.java.sql.PreparedStatement=INFO
+
+# 工作流日志信息
+log4j.logger.org.activiti.engine.impl.persistence.entity=trace
+log4j.appender.ACT=org.apache.log4j.ConsoleAppender
+log4j.appender.ACT.layout=org.apache.log4j.PatternLayout
+log4j.appender.ACT.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n

+ 0 - 3
watero-rst-web/src/main/resources/watero-rst-db.xml

@@ -9,9 +9,6 @@
 					http://www.springframework.org/schema/context/spring-context.xsd
 					http://www.springframework.org/schema/tx
 					http://www.springframework.org/schema/tx/spring-tx.xsd">
-	<!-- 获取jdbc配置文件 -->
-	<context:property-placeholder location="classpath:dev-jdbc.properties"/>
-
     <!--app 前台配置库数据源-->
     <bean id="ratfwDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
         <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->

+ 16 - 2
watero-rst-web/src/main/resources/watero-rst-ioc.xml

@@ -15,7 +15,18 @@
 		http://www.springframework.org/schema/task/spring-task-4.1.xsd
 		http://www.springframework.org/schema/context
 		http://www.springframework.org/schema/context/spring-context-4.1.xsd">
-		
+
+	<!-- 获取jdbc配置文件 -->
+	<bean id="myConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+		<property name="locations">
+			<list>
+				<value>classpath:dev-jdbc.properties</value>
+				<value>classpath:activiti-jdbc.properties</value>
+			</list>
+		</property>
+		<property name="ignoreUnresolvablePlaceholders" value="true" />
+	</bean>
+
 	<!-- 配置自动扫描的包:不扫描控制器和异常处理 -->
 	<context:component-scan base-package="com.iamberry">
 		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
@@ -26,7 +37,7 @@
     <aop:aspectj-autoproxy proxy-target-class="true"/>
 
 	<!-- 开启注解启动定时器 -->
-    <!--<task:annotation-driven/>-->
+    <task:annotation-driven/>
 
 	<!-- DataSource -->
 	<import resource="classpath:watero-rst-db.xml"/>
@@ -34,4 +45,7 @@
 	<!-- Shiro -->
 	<import resource="classpath:watero-web-shiro.xml"/>
 
+	<!-- Activi -->
+	<import resource="classpath:activiti.xml"/>
+
 </beans>

Разница между файлами не показана из-за своего большого размера
+ 1 - 2
watero-rst-web/src/main/webapp/WEB-INF/views/cm/customer/custome_list.ftl