petri_flow 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +34 -0
- data/app/assets/config/wf_manifest.js +2 -0
- data/app/assets/javascripts/wf/application.js +4 -0
- data/app/assets/stylesheets/wf/application.scss +2 -0
- data/app/assets/stylesheets/wf/arcs.css +4 -0
- data/app/assets/stylesheets/wf/cases.css +4 -0
- data/app/assets/stylesheets/wf/comments.css +4 -0
- data/app/assets/stylesheets/wf/fields.css +4 -0
- data/app/assets/stylesheets/wf/forms.css +4 -0
- data/app/assets/stylesheets/wf/guards.css +4 -0
- data/app/assets/stylesheets/wf/places.css +4 -0
- data/app/assets/stylesheets/wf/transitions.css +4 -0
- data/app/assets/stylesheets/wf/workflows.css +4 -0
- data/app/assets/stylesheets/wf/workitem_assignments.css +4 -0
- data/app/assets/stylesheets/wf/workitems.css +4 -0
- data/app/controllers/wf/application_controller.rb +14 -0
- data/app/controllers/wf/arcs_controller.rb +61 -0
- data/app/controllers/wf/cases_controller.rb +48 -0
- data/app/controllers/wf/comments_controller.rb +30 -0
- data/app/controllers/wf/fields_controller.rb +54 -0
- data/app/controllers/wf/forms_controller.rb +59 -0
- data/app/controllers/wf/guards_controller.rb +58 -0
- data/app/controllers/wf/places_controller.rb +53 -0
- data/app/controllers/wf/transitions_controller.rb +69 -0
- data/app/controllers/wf/workflows_controller.rb +59 -0
- data/app/controllers/wf/workitem_assignments_controller.rb +30 -0
- data/app/controllers/wf/workitems_controller.rb +79 -0
- data/app/helpers/wf/application_helper.rb +6 -0
- data/app/helpers/wf/arcs_helper.rb +6 -0
- data/app/helpers/wf/cases_helper.rb +6 -0
- data/app/helpers/wf/comments_helper.rb +6 -0
- data/app/helpers/wf/fields_helper.rb +6 -0
- data/app/helpers/wf/forms_helper.rb +6 -0
- data/app/helpers/wf/guards_helper.rb +6 -0
- data/app/helpers/wf/places_helper.rb +6 -0
- data/app/helpers/wf/transitions_helper.rb +6 -0
- data/app/helpers/wf/workflows_helper.rb +6 -0
- data/app/helpers/wf/workitem_assignments_helper.rb +6 -0
- data/app/helpers/wf/workitems_helper.rb +6 -0
- data/app/jobs/wf/application_job.rb +6 -0
- data/app/jobs/wf/fire_timed_workitem_job.rb +15 -0
- data/app/mailers/wf/application_mailer.rb +8 -0
- data/app/models/wf/application_record.rb +7 -0
- data/app/models/wf/arc.rb +42 -0
- data/app/models/wf/callbacks/assignment_default.rb +12 -0
- data/app/models/wf/callbacks/deadline_default.rb +11 -0
- data/app/models/wf/callbacks/enable_default.rb +11 -0
- data/app/models/wf/callbacks/fire_default.rb +11 -0
- data/app/models/wf/callbacks/hold_timeout_default.rb +11 -0
- data/app/models/wf/callbacks/notification_default.rb +11 -0
- data/app/models/wf/callbacks/time_default.rb +11 -0
- data/app/models/wf/callbacks/unassignment_default.rb +11 -0
- data/app/models/wf/case.rb +44 -0
- data/app/models/wf/case_assignment.rb +22 -0
- data/app/models/wf/case_command/add_comment.rb +17 -0
- data/app/models/wf/case_command/add_manual_assignment.rb +17 -0
- data/app/models/wf/case_command/add_token.rb +20 -0
- data/app/models/wf/case_command/add_workitem_assignment.rb +35 -0
- data/app/models/wf/case_command/begin_workitem_action.rb +33 -0
- data/app/models/wf/case_command/cancel.rb +17 -0
- data/app/models/wf/case_command/cancel_workitem.rb +20 -0
- data/app/models/wf/case_command/clear_manual_assignments.rb +16 -0
- data/app/models/wf/case_command/clear_workitem_assignments.rb +20 -0
- data/app/models/wf/case_command/consume_token.rb +23 -0
- data/app/models/wf/case_command/enable_transitions.rb +33 -0
- data/app/models/wf/case_command/end_workitem_action.rb +25 -0
- data/app/models/wf/case_command/finish_workitem.rb +18 -0
- data/app/models/wf/case_command/finished_p.rb +28 -0
- data/app/models/wf/case_command/fire_message_transition.rb +20 -0
- data/app/models/wf/case_command/fire_transition_internal.rb +41 -0
- data/app/models/wf/case_command/lock_token.rb +21 -0
- data/app/models/wf/case_command/new.rb +17 -0
- data/app/models/wf/case_command/release_token.rb +20 -0
- data/app/models/wf/case_command/remove_manual_assignment.rb +17 -0
- data/app/models/wf/case_command/remove_workitem_assignment.rb +24 -0
- data/app/models/wf/case_command/resume.rb +17 -0
- data/app/models/wf/case_command/set_workitem_assignments.rb +32 -0
- data/app/models/wf/case_command/start_case.rb +19 -0
- data/app/models/wf/case_command/start_workitem.rb +26 -0
- data/app/models/wf/case_command/suspend.rb +17 -0
- data/app/models/wf/case_command/sweep_automatic_transitions.rb +31 -0
- data/app/models/wf/case_command/sweep_timed_transitions.rb +16 -0
- data/app/models/wf/case_command/workitem_action.rb +20 -0
- data/app/models/wf/comment.rb +21 -0
- data/app/models/wf/demo_target.rb +18 -0
- data/app/models/wf/entry.rb +33 -0
- data/app/models/wf/field.rb +53 -0
- data/app/models/wf/field_value.rb +30 -0
- data/app/models/wf/form.rb +18 -0
- data/app/models/wf/group.rb +21 -0
- data/app/models/wf/guard.rb +73 -0
- data/app/models/wf/party.rb +22 -0
- data/app/models/wf/place.rb +28 -0
- data/app/models/wf/token.rb +37 -0
- data/app/models/wf/transition.rb +49 -0
- data/app/models/wf/transition_static_assignment.rb +21 -0
- data/app/models/wf/user.rb +26 -0
- data/app/models/wf/workflow.rb +182 -0
- data/app/models/wf/workitem.rb +78 -0
- data/app/models/wf/workitem_assignment.rb +19 -0
- data/app/views/layouts/wf/_alert.html.erb +4 -0
- data/app/views/layouts/wf/_footer.html.erb +13 -0
- data/app/views/layouts/wf/_nav.html.erb +13 -0
- data/app/views/layouts/wf/_notice.html.erb +4 -0
- data/app/views/layouts/wf/application.html.erb +34 -0
- data/app/views/wf/arcs/_form.html.erb +40 -0
- data/app/views/wf/arcs/edit.html.erb +1 -0
- data/app/views/wf/arcs/new.html.erb +1 -0
- data/app/views/wf/arcs/show.html.erb +67 -0
- data/app/views/wf/cases/_form.html.erb +27 -0
- data/app/views/wf/cases/index.html.erb +35 -0
- data/app/views/wf/cases/new.html.erb +1 -0
- data/app/views/wf/cases/show.html.erb +113 -0
- data/app/views/wf/comments/new.html.erb +27 -0
- data/app/views/wf/fields/_form.html.erb +42 -0
- data/app/views/wf/fields/edit.html.erb +1 -0
- data/app/views/wf/fields/new.html.erb +1 -0
- data/app/views/wf/forms/_form.html.erb +32 -0
- data/app/views/wf/forms/edit.html.erb +1 -0
- data/app/views/wf/forms/index.html.erb +32 -0
- data/app/views/wf/forms/new.html.erb +1 -0
- data/app/views/wf/forms/show.html.erb +53 -0
- data/app/views/wf/guards/_form.html.erb +43 -0
- data/app/views/wf/guards/edit.html.erb +1 -0
- data/app/views/wf/guards/new.html.erb +1 -0
- data/app/views/wf/places/_form.html.erb +43 -0
- data/app/views/wf/places/edit.html.erb +1 -0
- data/app/views/wf/places/new.html.erb +1 -0
- data/app/views/wf/transitions/_form.html.erb +92 -0
- data/app/views/wf/transitions/edit.html.erb +1 -0
- data/app/views/wf/transitions/new.html.erb +1 -0
- data/app/views/wf/workflows/_form.html.erb +32 -0
- data/app/views/wf/workflows/edit.html.erb +1 -0
- data/app/views/wf/workflows/index.html.erb +38 -0
- data/app/views/wf/workflows/new.html.erb +1 -0
- data/app/views/wf/workflows/show.html.erb +177 -0
- data/app/views/wf/workitem_assignments/new.html.erb +27 -0
- data/app/views/wf/workitems/index.html.erb +68 -0
- data/app/views/wf/workitems/pre_finish.html.erb +33 -0
- data/app/views/wf/workitems/show.html.erb +211 -0
- data/config/routes.rb +30 -0
- data/db/migrate/20200130201043_init.rb +226 -0
- data/db/migrate/20200130201641_init_some_data.rb +15 -0
- data/db/migrate/20200131200455_create_wf_entries.rb +19 -0
- data/db/migrate/20200201001543_add_target_field_name_for_guard.rb +7 -0
- data/lib/tasks/wf_tasks.rake +5 -0
- data/lib/wf/engine.rb +10 -0
- data/lib/wf/version.rb +5 -0
- data/lib/wf.rb +7 -0
- metadata +312 -0
@@ -0,0 +1,211 @@
|
|
1
|
+
<div class="float-right">
|
2
|
+
<%= link_to 'Back to Case', workflow_case_path(@workitem.workflow, @workitem.case), class: 'btn btn-primary' %>
|
3
|
+
</div>
|
4
|
+
<div>
|
5
|
+
<h2>Transition</h2>
|
6
|
+
<table class="table table-bordered table-info">
|
7
|
+
<thead>
|
8
|
+
<tr>
|
9
|
+
<th scope="col">ID</th>
|
10
|
+
<th scope="col">Name</th>
|
11
|
+
<th scope="col">Description</th>
|
12
|
+
<th scope="col">Trigger Limit</th>
|
13
|
+
<th scope="col">Trigger Type</th>
|
14
|
+
<th scope="col">Sort Order</th>
|
15
|
+
<th scope="col">Custom Form</th>
|
16
|
+
</tr>
|
17
|
+
</thead>
|
18
|
+
<tbody>
|
19
|
+
<tr>
|
20
|
+
<td><%= @workitem.transition.id %></td>
|
21
|
+
<td><%= @workitem.transition.name %></td>
|
22
|
+
<td><%= @workitem.transition.description %></td>
|
23
|
+
<td><%= @workitem.transition.trigger_limit %></td>
|
24
|
+
<td><%= @workitem.transition.trigger_type %></td>
|
25
|
+
<td><%= @workitem.transition.sort_order %></td>
|
26
|
+
|
27
|
+
<td>
|
28
|
+
<% if @workitem.transition.form %>
|
29
|
+
<%= link_to @workitem.transition.form.name, form_path(@workitem.transition.form) %>
|
30
|
+
<% else %>
|
31
|
+
No Form
|
32
|
+
<% end %>
|
33
|
+
</td>
|
34
|
+
</tr>
|
35
|
+
</tbody>
|
36
|
+
</table>
|
37
|
+
</div>
|
38
|
+
|
39
|
+
<div>
|
40
|
+
<h2>Detail</h2>
|
41
|
+
<table class="table table-bordered table-info">
|
42
|
+
<thead>
|
43
|
+
<tr>
|
44
|
+
<th scope="col">ID</th>
|
45
|
+
<th scope="col">Transition</th>
|
46
|
+
<th scope="col">State</th>
|
47
|
+
<th scope="col">Holding User</th>
|
48
|
+
<th scope="col">Started At</th>
|
49
|
+
<th scope="col">Enabled At</th>
|
50
|
+
<th scope="col">Canceled At</th>
|
51
|
+
<th scope="col">Finished At</th>
|
52
|
+
<th scope="col">Overridden At</th>
|
53
|
+
<th scope="col">Deadline</th>
|
54
|
+
</tr>
|
55
|
+
</thead>
|
56
|
+
<tbody>
|
57
|
+
<tr>
|
58
|
+
<td><%= @workitem.id %></td>
|
59
|
+
<td>
|
60
|
+
<%= link_to @workitem.transition.name, workflow_transition_path(@workitem.workflow, @workitem.transition) %> </td>
|
61
|
+
<td><%= @workitem.state %></td>
|
62
|
+
<td><%= @workitem.holding_user_id %></td>
|
63
|
+
<td><%= @workitem.started_at %></td>
|
64
|
+
<td><%= @workitem.enabled_at %></td>
|
65
|
+
<td><%= @workitem.canceled_at %></td>
|
66
|
+
<td><%= @workitem.finished_at %></td>
|
67
|
+
<td><%= @workitem.overridden_at %></td>
|
68
|
+
<td><%= @workitem.deadline %></td>
|
69
|
+
</tr>
|
70
|
+
</tbody>
|
71
|
+
</table>
|
72
|
+
</div>
|
73
|
+
|
74
|
+
<% if @workitem.transition.form %>
|
75
|
+
<div>
|
76
|
+
<h2>Entries</h2>
|
77
|
+
<table class="table table-bordered table-info">
|
78
|
+
<thead>
|
79
|
+
<tr>
|
80
|
+
<th scope="col">ID</th>
|
81
|
+
<th scope="col">User</th>
|
82
|
+
<th scope="col">Payload</th>
|
83
|
+
</tr>
|
84
|
+
</thead>
|
85
|
+
<tbody>
|
86
|
+
<% @workitem.entries.each do |entry| %>
|
87
|
+
<tr>
|
88
|
+
<td><%= entry.id %></td>
|
89
|
+
<td><%= entry.user_id %></td>
|
90
|
+
<td>
|
91
|
+
<pre>
|
92
|
+
<%= JSON.pretty_generate(entry.payload) %>
|
93
|
+
</pre>
|
94
|
+
</td>
|
95
|
+
</tr>
|
96
|
+
<% end %>
|
97
|
+
</tbody>
|
98
|
+
</table>
|
99
|
+
</div>
|
100
|
+
<% end %>
|
101
|
+
|
102
|
+
<div>
|
103
|
+
<h2>Assignments</h2>
|
104
|
+
<table class="table table-bordered table-info">
|
105
|
+
<thead>
|
106
|
+
<tr>
|
107
|
+
<th scope="col">ID</th>
|
108
|
+
<th scope="col">Party ID</th>
|
109
|
+
<th scope="col">Name</th>
|
110
|
+
<th scope="col">Created At</th>
|
111
|
+
<th scope="col">Action</th>
|
112
|
+
</tr>
|
113
|
+
</thead>
|
114
|
+
<tbody>
|
115
|
+
<% @workitem.workitem_assignments.includes(:party).each do |assignment|%>
|
116
|
+
<tr>
|
117
|
+
<td><%= assignment.id %></td>
|
118
|
+
<td><%= assignment.party_id %></td>
|
119
|
+
<td>
|
120
|
+
<%= assignment.party.party_name %> </td>
|
121
|
+
<td><%= assignment.created_at %></td>
|
122
|
+
<td><%= link_to "Remove", workitem_workitem_assignment_path(@workitem, party_id: assignment.party_id), remote: true, method: :delete, data: {confirm: 'confirm?'}, class: 'btn btn-sm btn-info' %></td>
|
123
|
+
</tr>
|
124
|
+
<% end %>
|
125
|
+
<tr>
|
126
|
+
<td colspan="5">
|
127
|
+
<% if @workitem.transition.user? && (@workitem.started? || @workitem.enabled?) %>
|
128
|
+
<% if @workitem.finished_by?(current_user) %>
|
129
|
+
<%= link_to "Pre Finish Workitem", pre_finish_workitem_path(@workitem), class: 'btn btn-sm btn-dark' %>
|
130
|
+
<% elsif @workitem.started_by?(current_user)%>
|
131
|
+
<%= link_to "Start Workitem", start_workitem_path(@workitem), method: :put, class: 'btn btn-sm btn-dark' %>
|
132
|
+
<% else %>
|
133
|
+
You can not start workitem, Please assign to youself.
|
134
|
+
<% end %>
|
135
|
+
<%= link_to "Re Assign", new_workitem_workitem_assignment_path(@workitem), class: 'btn btn-success btn-sm' %>
|
136
|
+
<%= link_to "Assign Yourself", new_workitem_workitem_assignment_path(@workitem, party_id: current_user.party&.id), class: 'btn btn-success btn-sm' %>
|
137
|
+
<%= link_to "Add Comment", new_workitem_comment_path(@workitem), class: 'btn btn-success btn-sm' %>
|
138
|
+
<% end %>
|
139
|
+
</td>
|
140
|
+
</tr>
|
141
|
+
</tbody>
|
142
|
+
</table>
|
143
|
+
</div>
|
144
|
+
|
145
|
+
<div>
|
146
|
+
<h2>Comments</h2>
|
147
|
+
<table class="table table-bordered table-info">
|
148
|
+
<thead>
|
149
|
+
<tr>
|
150
|
+
<th scope="col">ID</th>
|
151
|
+
<th scope="col">Body</th>
|
152
|
+
<th scope="col">User</th>
|
153
|
+
<th scope="col">Created At</th>
|
154
|
+
<th scope="col">Action</th>
|
155
|
+
</tr>
|
156
|
+
</thead>
|
157
|
+
<tbody>
|
158
|
+
<% @workitem.comments.order("id DESC").each do |comment| %>
|
159
|
+
<tr>
|
160
|
+
<td><%= comment.id %></td>
|
161
|
+
<td>
|
162
|
+
<%= comment.body %> </td>
|
163
|
+
<td><%= comment.user_id %></td>
|
164
|
+
<td><%= comment.created_at %></td>
|
165
|
+
<td><%= link_to "Delete", workitem_comment_path(@workitem, comment), remote: true, method: :delete, data: {confirm: 'confirm?', disable_with: 'Waiting...'}, class: 'btn btn-sm btn-info' %></td>
|
166
|
+
</tr>
|
167
|
+
<% end %>
|
168
|
+
</tbody>
|
169
|
+
</table>
|
170
|
+
</div>
|
171
|
+
|
172
|
+
<div>
|
173
|
+
<h2>All Workitems</h2>
|
174
|
+
<table class="table table-bordered table-info">
|
175
|
+
<thead>
|
176
|
+
<tr>
|
177
|
+
<th scope="col">ID</th>
|
178
|
+
<th scope="col">Transition</th>
|
179
|
+
<th scope="col">State</th>
|
180
|
+
<th scope="col">Trigger Type</th>
|
181
|
+
<th scope="col">Holding User</th>
|
182
|
+
<th scope="col">Started At</th>
|
183
|
+
<th scope="col">Enabled At</th>
|
184
|
+
<th scope="col">Canceled At</th>
|
185
|
+
<th scope="col">Finished At</th>
|
186
|
+
<th scope="col">Overridden At</th>
|
187
|
+
<th scope="col">Deadline</th>
|
188
|
+
<th scope="col">Action</th>
|
189
|
+
</tr>
|
190
|
+
</thead>
|
191
|
+
<tbody>
|
192
|
+
<% @workitem.case.workitems.includes(:transition).each do |workitem| %>
|
193
|
+
<tr>
|
194
|
+
<td><%= link_to workitem.id, workitem_path(workitem) %></td>
|
195
|
+
<td>
|
196
|
+
<%= workitem.transition.name %> </td>
|
197
|
+
<td><%= workitem.state %></td>
|
198
|
+
<td><%= workitem.transition.trigger_type %></td>
|
199
|
+
<td><%= workitem.holding_user_id %></td>
|
200
|
+
<td><%= workitem.started_at %></td>
|
201
|
+
<td><%= workitem.enabled_at %></td>
|
202
|
+
<td><%= workitem.canceled_at %></td>
|
203
|
+
<td><%= workitem.finished_at %></td>
|
204
|
+
<td><%= workitem.overridden_at %></td>
|
205
|
+
<td><%= workitem.deadline %></td>
|
206
|
+
<td><%= link_to "Run", workitem_path(workitem), class: 'btn btn-sm btn-success' %></td>
|
207
|
+
</tr>
|
208
|
+
<% end %>
|
209
|
+
</tbody>
|
210
|
+
</table>
|
211
|
+
</div>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Wf::Engine.routes.draw do
|
4
|
+
resources :workflows do
|
5
|
+
resources :transitions
|
6
|
+
resources :places
|
7
|
+
resources :arcs
|
8
|
+
resources :cases
|
9
|
+
end
|
10
|
+
|
11
|
+
resources :arcs do
|
12
|
+
resources :guards
|
13
|
+
end
|
14
|
+
|
15
|
+
resources :forms do
|
16
|
+
resources :fields
|
17
|
+
end
|
18
|
+
|
19
|
+
resources :workitems do
|
20
|
+
resources :workitem_assignments, only: %i[new create destroy]
|
21
|
+
resources :comments, only: %i[new create destroy]
|
22
|
+
member do
|
23
|
+
put :start
|
24
|
+
get :pre_finish
|
25
|
+
put :finish
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
root to: "workitems#index"
|
30
|
+
end
|
@@ -0,0 +1,226 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Init < ActiveRecord::Migration[6.0]
|
4
|
+
def change
|
5
|
+
create_table "wf_arcs", force: :cascade do |t|
|
6
|
+
t.bigint "workflow_id"
|
7
|
+
t.bigint "transition_id"
|
8
|
+
t.bigint "place_id"
|
9
|
+
t.integer "direction", default: 0, comment: "0-in, 1-out"
|
10
|
+
t.datetime "created_at", precision: 6, null: false
|
11
|
+
t.datetime "updated_at", precision: 6, null: false
|
12
|
+
t.integer "guards_count", default: 0
|
13
|
+
end
|
14
|
+
|
15
|
+
create_table "wf_case_assignments", comment: "Manual per-case assignments of transition to parties", force: :cascade do |t|
|
16
|
+
t.bigint "case_id"
|
17
|
+
t.bigint "transition_id"
|
18
|
+
t.bigint "party_id"
|
19
|
+
t.datetime "created_at", precision: 6, null: false
|
20
|
+
t.datetime "updated_at", precision: 6, null: false
|
21
|
+
t.index %w[case_id transition_id party_id], name: "wf_ctp_u", unique: true
|
22
|
+
end
|
23
|
+
|
24
|
+
create_table "wf_cases", force: :cascade do |t|
|
25
|
+
t.bigint "workflow_id"
|
26
|
+
t.string "targetable_type", comment: "point to target type of Application."
|
27
|
+
t.string "targetable_id", comment: "point to target ID of Application."
|
28
|
+
t.integer "state", default: 0, comment: "0-created, 1-active, 2-suspended, 3-canceled, 4-finished"
|
29
|
+
t.datetime "created_at", precision: 6, null: false
|
30
|
+
t.datetime "updated_at", precision: 6, null: false
|
31
|
+
end
|
32
|
+
|
33
|
+
create_table "wf_comments", force: :cascade do |t|
|
34
|
+
t.bigint "workitem_id"
|
35
|
+
t.string "user_id"
|
36
|
+
t.text "body"
|
37
|
+
t.datetime "created_at", precision: 6, null: false
|
38
|
+
t.datetime "updated_at", precision: 6, null: false
|
39
|
+
t.index ["user_id"], name: "index_wf_comments_on_user_id"
|
40
|
+
t.index ["workitem_id"], name: "index_wf_comments_on_workitem_id"
|
41
|
+
end
|
42
|
+
|
43
|
+
create_table "wf_demo_targets", comment: "For demo, useless.", force: :cascade do |t|
|
44
|
+
t.string "name"
|
45
|
+
t.string "description"
|
46
|
+
t.datetime "created_at", precision: 6, null: false
|
47
|
+
t.datetime "updated_at", precision: 6, null: false
|
48
|
+
end
|
49
|
+
|
50
|
+
create_table "wf_field_values", force: :cascade do |t|
|
51
|
+
t.bigint "workflow_id"
|
52
|
+
t.bigint "transition_id"
|
53
|
+
t.bigint "form_id"
|
54
|
+
t.bigint "field_id"
|
55
|
+
t.text "value"
|
56
|
+
t.datetime "created_at", precision: 6, null: false
|
57
|
+
t.datetime "updated_at", precision: 6, null: false
|
58
|
+
t.index ["field_id"], name: "index_wf_field_values_on_field_id"
|
59
|
+
t.index ["form_id"], name: "index_wf_field_values_on_form_id"
|
60
|
+
t.index ["transition_id"], name: "index_wf_field_values_on_transition_id"
|
61
|
+
t.index ["workflow_id"], name: "index_wf_field_values_on_workflow_id"
|
62
|
+
end
|
63
|
+
|
64
|
+
create_table "wf_fields", force: :cascade do |t|
|
65
|
+
t.string "name"
|
66
|
+
t.bigint "form_id"
|
67
|
+
t.integer "position", default: 0
|
68
|
+
t.integer "field_type", default: 0
|
69
|
+
t.string "field_type_name"
|
70
|
+
t.string "default_value"
|
71
|
+
t.datetime "created_at", precision: 6, null: false
|
72
|
+
t.datetime "updated_at", precision: 6, null: false
|
73
|
+
t.index ["form_id"], name: "index_wf_fields_on_form_id"
|
74
|
+
end
|
75
|
+
|
76
|
+
create_table "wf_forms", force: :cascade do |t|
|
77
|
+
t.string "name"
|
78
|
+
t.text "description"
|
79
|
+
t.datetime "created_at", precision: 6, null: false
|
80
|
+
t.datetime "updated_at", precision: 6, null: false
|
81
|
+
end
|
82
|
+
|
83
|
+
create_table "wf_groups", comment: "For demo", force: :cascade do |t|
|
84
|
+
t.string "name"
|
85
|
+
t.datetime "created_at", precision: 6, null: false
|
86
|
+
t.datetime "updated_at", precision: 6, null: false
|
87
|
+
end
|
88
|
+
|
89
|
+
create_table "wf_guards", force: :cascade do |t|
|
90
|
+
t.bigint "arc_id"
|
91
|
+
t.bigint "workflow_id"
|
92
|
+
t.string "fieldable_type"
|
93
|
+
t.string "fieldable_id"
|
94
|
+
t.string "op"
|
95
|
+
t.string "value"
|
96
|
+
t.string "exp"
|
97
|
+
t.datetime "created_at", precision: 6, null: false
|
98
|
+
t.datetime "updated_at", precision: 6, null: false
|
99
|
+
t.index ["arc_id"], name: "index_wf_guards_on_arc_id"
|
100
|
+
t.index ["workflow_id"], name: "index_wf_guards_on_workflow_id"
|
101
|
+
end
|
102
|
+
|
103
|
+
create_table "wf_parties", comment: "for groups or roles or users or positions etc.", force: :cascade do |t|
|
104
|
+
t.string "partable_type"
|
105
|
+
t.string "partable_id"
|
106
|
+
t.string "party_name"
|
107
|
+
t.datetime "created_at", precision: 6, null: false
|
108
|
+
t.datetime "updated_at", precision: 6, null: false
|
109
|
+
t.index %w[partable_type partable_id], name: "index_wf_parties_on_partable_type_and_partable_id", unique: true
|
110
|
+
end
|
111
|
+
|
112
|
+
create_table "wf_places", force: :cascade do |t|
|
113
|
+
t.bigint "workflow_id"
|
114
|
+
t.string "name"
|
115
|
+
t.text "description"
|
116
|
+
t.integer "sort_order", default: 0
|
117
|
+
t.integer "place_type", default: 0, comment: "类型:0-start,1-normal,2-end"
|
118
|
+
t.datetime "created_at", precision: 6, null: false
|
119
|
+
t.datetime "updated_at", precision: 6, null: false
|
120
|
+
end
|
121
|
+
|
122
|
+
create_table "wf_tokens", force: :cascade do |t|
|
123
|
+
t.bigint "workflow_id"
|
124
|
+
t.bigint "case_id"
|
125
|
+
t.string "targetable_type"
|
126
|
+
t.string "targetable_id"
|
127
|
+
t.bigint "place_id"
|
128
|
+
t.integer "state", default: 0, comment: "0-free, 1-locked, 2-canceled, 3-consumed"
|
129
|
+
t.bigint "locked_workitem_id"
|
130
|
+
if /mysql/i.match?(ActiveRecord::Base.connection.adapter_name)
|
131
|
+
t.datetime "produced_at", default: -> { "current_timestamp" }
|
132
|
+
elsif /postgre/i.match?(ActiveRecord::Base.connection.adapter_name)
|
133
|
+
t.datetime "produced_at", default: -> { "timezone('utc'::text, now())" }
|
134
|
+
end
|
135
|
+
t.datetime "locked_at"
|
136
|
+
t.datetime "canceled_at"
|
137
|
+
t.datetime "consumed_at"
|
138
|
+
t.datetime "created_at", precision: 6, null: false
|
139
|
+
t.datetime "updated_at", precision: 6, null: false
|
140
|
+
end
|
141
|
+
|
142
|
+
create_table "wf_transition_static_assignments", comment: "pre assignment for transition", force: :cascade do |t|
|
143
|
+
t.bigint "party_id"
|
144
|
+
t.bigint "transition_id"
|
145
|
+
t.bigint "workflow_id"
|
146
|
+
t.datetime "created_at", precision: 6, null: false
|
147
|
+
t.datetime "updated_at", precision: 6, null: false
|
148
|
+
t.index %w[transition_id party_id], name: "wf_tp_u", unique: true
|
149
|
+
end
|
150
|
+
|
151
|
+
create_table "wf_transitions", force: :cascade do |t|
|
152
|
+
t.string "name"
|
153
|
+
t.text "description"
|
154
|
+
t.bigint "workflow_id"
|
155
|
+
t.integer "sort_order", default: 0
|
156
|
+
t.integer "trigger_limit", comment: "use with timed trigger, after x minitues, trigger exec"
|
157
|
+
t.integer "trigger_type", default: 0, comment: "0-user,1-automatic, 2-message,3-time"
|
158
|
+
t.datetime "created_at", precision: 6, null: false
|
159
|
+
t.datetime "updated_at", precision: 6, null: false
|
160
|
+
t.bigint "form_id"
|
161
|
+
t.string "enable_callback", default: "Wf::Callbacks::EnableDefault"
|
162
|
+
t.string "fire_callback", default: "Wf::Callbacks::FireDefault"
|
163
|
+
t.string "notification_callback", default: "Wf::Callbacks::NotificationDefault"
|
164
|
+
t.string "time_callback", default: "Wf::Callbacks::TimeDefault"
|
165
|
+
t.string "deadline_callback", default: "Wf::Callbacks::DeadlineDefault"
|
166
|
+
t.string "hold_timeout_callback", default: "Wf::Callbacks::HoldTimeoutDefault"
|
167
|
+
t.string "assignment_callback", default: "Wf::Callbacks::AssignmentDefault"
|
168
|
+
t.string "unassignment_callback", default: "Wf::Callbacks::UnassignmentDefault"
|
169
|
+
end
|
170
|
+
|
171
|
+
create_table "wf_users", comment: "For demo", force: :cascade do |t|
|
172
|
+
t.string "name"
|
173
|
+
t.datetime "created_at", precision: 6, null: false
|
174
|
+
t.datetime "updated_at", precision: 6, null: false
|
175
|
+
t.bigint "group_id"
|
176
|
+
end
|
177
|
+
|
178
|
+
create_table "wf_workflows", force: :cascade do |t|
|
179
|
+
t.string "name"
|
180
|
+
t.text "description"
|
181
|
+
t.boolean "is_valid", default: false
|
182
|
+
t.string "creator_id"
|
183
|
+
t.text "error_msg"
|
184
|
+
t.datetime "created_at", precision: 6, null: false
|
185
|
+
t.datetime "updated_at", precision: 6, null: false
|
186
|
+
end
|
187
|
+
|
188
|
+
create_table "wf_workitem_assignments", force: :cascade do |t|
|
189
|
+
t.bigint "party_id"
|
190
|
+
t.bigint "workitem_id"
|
191
|
+
t.datetime "created_at", precision: 6, null: false
|
192
|
+
t.datetime "updated_at", precision: 6, null: false
|
193
|
+
t.index %w[workitem_id party_id], name: "wf_wp_u", unique: true
|
194
|
+
end
|
195
|
+
|
196
|
+
create_table "wf_workitems", force: :cascade do |t|
|
197
|
+
t.bigint "case_id"
|
198
|
+
t.bigint "workflow_id"
|
199
|
+
t.bigint "transition_id"
|
200
|
+
t.string "targetable_type", comment: "point to type of Application target: Task or Issue or PullRequest or Project etc."
|
201
|
+
t.string "targetable_id", comment: "point to id of Application target: task_id or issue_id or pull_request_id or project_id etc."
|
202
|
+
t.integer "state", default: 0, comment: "0-enabled, 1-started, 2-canceled, 3-finished,4-overridden"
|
203
|
+
if /mysql/i.match?(ActiveRecord::Base.connection.adapter_name)
|
204
|
+
t.datetime "enabled_at", default: -> { "current_timestamp" }
|
205
|
+
elsif /postgre/i.match?(ActiveRecord::Base.connection.adapter_name)
|
206
|
+
t.datetime "enabled_at", default: -> { "timezone('utc'::text, now())" }
|
207
|
+
end
|
208
|
+
t.datetime "started_at"
|
209
|
+
t.datetime "canceled_at"
|
210
|
+
t.datetime "finished_at"
|
211
|
+
t.datetime "overridden_at"
|
212
|
+
t.datetime "deadline", comment: ""
|
213
|
+
t.datetime "created_at", precision: 6, null: false
|
214
|
+
t.datetime "updated_at", precision: 6, null: false
|
215
|
+
t.datetime "trigger_time", comment: "set when transition_trigger=TIME & trigger_limit present"
|
216
|
+
t.string "holding_user_id", comment: "id of App user"
|
217
|
+
if /mysql/i.match?(ActiveRecord::Base.connection.adapter_name)
|
218
|
+
t.json "payload", comment: "store user input payload for workitem."
|
219
|
+
elsif /postgre/i.match?(ActiveRecord::Base.connection.adapter_name)
|
220
|
+
t.json "payload", default: {}, comment: "store user input payload for workitem."
|
221
|
+
end
|
222
|
+
|
223
|
+
t.index %w[state trigger_time], name: "index_wf_workitems_on_state_and_trigger_time"
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class InitSomeData < ActiveRecord::Migration[6.0]
|
4
|
+
def change
|
5
|
+
5.times do |i|
|
6
|
+
Wf::Group.create(name: "Group#{i}")
|
7
|
+
end
|
8
|
+
|
9
|
+
10.times do |i|
|
10
|
+
Wf::User.create(name: "User#{i}", group: Wf::Group.all.sample)
|
11
|
+
end
|
12
|
+
|
13
|
+
10.times { |i| Wf::DemoTarget.create(name: "target #{i}") }
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class CreateWfEntries < ActiveRecord::Migration[6.0]
|
4
|
+
def change
|
5
|
+
create_table :wf_entries, comment: "user input data for workitem with form." do |t|
|
6
|
+
t.string :user_id, index: true
|
7
|
+
t.bigint :workitem_id, index: true
|
8
|
+
if /mysql/i.match?(ActiveRecord::Base.connection.adapter_name)
|
9
|
+
t.json "payload"
|
10
|
+
elsif /postgre/i.match?(ActiveRecord::Base.connection.adapter_name)
|
11
|
+
t.json "payload", default: {}
|
12
|
+
end
|
13
|
+
t.timestamps
|
14
|
+
end
|
15
|
+
remove_column :wf_workitems, :payload
|
16
|
+
add_column :wf_field_values, :entry_id, :bigint, index: true
|
17
|
+
add_index :wf_entries, %i[workitem_id user_id], unique: true
|
18
|
+
end
|
19
|
+
end
|
data/lib/wf/engine.rb
ADDED
data/lib/wf/version.rb
ADDED