educode_sales 0.9.76 → 0.9.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,232 @@
1
+ <%= Gon::Base.render_data %>
2
+ <div class="min-height-table" id="product_list">
3
+ <div style="margin: 10px 10px 10px 10px">
4
+ <form class="layui-form layui-form-pane" lay-filter="search_form">
5
+ <div class="layui-form-item">
6
+ <div class="layui-inline">
7
+ <label class="layui-form-label">产品名称</label>
8
+ <div class="layui-input-inline">
9
+ <input type="text" name="name" class="layui-input" value="">
10
+ </div>
11
+ </div>
12
+ <div class="layui-inline">
13
+ <label class="layui-form-label">销售品目</label>
14
+ <div class="layui-input-inline">
15
+ <%= select_tag "item_clazz", options_for_select(EducodeSales::ProductCatalog.item_clazzs.keys), { 'lay-filter': 'item_clazz', include_blank: true , "lay-search": "" } %>
16
+ </div>
17
+ </div>
18
+ <div class="layui-inline">
19
+ <button type="reset" class="layui-btn layui-btn-primary" lay-submit
20
+ lay-filter="reset_prodct_form">重置
21
+ </button>
22
+ <button type="submit" id="search_bt" class="layui-btn layui-btn-primary" lay-submit
23
+ lay-filter="search_product_form">搜索
24
+ </button>
25
+ </div>
26
+ </div>
27
+ </form>
28
+ </div>
29
+ <div id="contact_table_wraper">
30
+ <table class="layui-hide" id="contact_product_table" lay-filter="contact_product_table"></table>
31
+ </div>
32
+ </div>
33
+
34
+ <script type="text/html" id="currentTableBarProduct">
35
+ <% if can? :update_product_catalog, EducodeSales::Business %>
36
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit_product">编辑</a>
37
+ <% end %>
38
+ </script>
39
+
40
+ <script type="text/html" id="toolbar">
41
+ <% if can? :new_product_catalog, EducodeSales::Business %>
42
+ <a class="layui-btn layui-btn-primary layui-border-green layui-btn-sm pull-right" lay-event="add_product">添加产品目录</a>
43
+ <% end %>
44
+ </script>
45
+
46
+ <script>
47
+ layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate', 'dropdown', 'laytpl', 'xmSelect'],
48
+ function() {
49
+ var $ = layui.jquery,
50
+ form = layui.form,
51
+ request = layui.request,
52
+ miniPage = layui.miniPage,
53
+ dropdown = layui.dropdown,
54
+ xmSelect = layui.xmSelect,
55
+ laydate = layui.laydate;
56
+ var openWH = miniPage.getOpenWidthHeight();
57
+ var data = form.val("search_form");
58
+ table = layui.table;
59
+ var cols_table = [
60
+ [{
61
+ field: 'id',
62
+ width: 60,
63
+ title: '序号',
64
+ fixed: "left"
65
+ },
66
+ {
67
+ field: 'name',
68
+ width: 120,
69
+ title: '产品名称',
70
+ },
71
+ {
72
+ field: 'item_clazz',
73
+ width: 150,
74
+ title: '销售品目',
75
+ },
76
+ {
77
+ field: 'brand',
78
+ width: 150,
79
+ title: '品牌',
80
+ },
81
+ {
82
+ field: 'specification',
83
+ width: 150,
84
+ title: '规格型号',
85
+ },
86
+ {
87
+ field: 'unit',
88
+ width: 150,
89
+ title: '单位',
90
+ },
91
+ {
92
+ field: 'param',
93
+ width: 150,
94
+ title: '参数',
95
+ },
96
+ {
97
+ field: 'source_method',
98
+ width: 150,
99
+ title: '来源方式',
100
+ },
101
+ {
102
+ field: 'supplier',
103
+ width: 150,
104
+ title: '供货商',
105
+ },
106
+ {
107
+ title: '操作',
108
+ minWidth: 100,
109
+ toolbar: '#currentTableBarProduct',
110
+ align: "center",
111
+ fixed: 'right'
112
+ }
113
+ ]
114
+ ]
115
+ var business_table = table.render({
116
+ elem: '#contact_product_table',
117
+ url: '/missions/contracts/product_list',
118
+ autoSort: false,
119
+ toolbar: '#toolbar',
120
+ where: {
121
+ q: data
122
+ },
123
+ defaultToolbar: [],
124
+ title: '产品目录表',
125
+ cols: cols_table,
126
+ limit: 20,
127
+ limits: [10, 15, 20, 30, 40, 50, 60, 70, 80, 90],
128
+ page: true,
129
+ skin: 'line',
130
+ });
131
+ var sort = {},
132
+ search = data;
133
+ table.on('sort(contact_product_table)', function(obj) {
134
+ var data = form.val("search_form");
135
+ sort.field = obj.field;
136
+ sort.order = obj.type;
137
+ table.reload('contact_product_table', {
138
+ url: '/missions/contracts/product_list',
139
+ initSort: obj,
140
+ where: {
141
+ sort: sort,
142
+ q: search
143
+ }
144
+ });
145
+ })
146
+ // 监听搜索操作
147
+ form.on('submit(search_product_form)', function(data) {
148
+ if (search['clazz']) {
149
+ data.field['clazz'] = search['clazz']
150
+ }
151
+ search = data.field
152
+ table.reload('contact_product_table', {
153
+ url: '/missions/contracts/product_list',
154
+ page: {
155
+ curr: 1
156
+ },
157
+ where: {
158
+ q: search,
159
+ sort: sort
160
+ }
161
+ }, 'data');
162
+ return false;
163
+ });
164
+ form.on('submit(reset_prodct_form)', function(data) {
165
+ var field = data.field;
166
+ form.val('search_form', {
167
+ name: '',
168
+ item_clazz: ''
169
+ })
170
+ return false;
171
+ });
172
+ table.on('toolbar(contact_product_table)', function(obj) {
173
+ var openWH = miniPage.getOpenWidthHeight();
174
+ var content = miniPage.getHrefContent('/missions/contracts/new_product');
175
+ if (obj.event == 'add_product') {
176
+ add_product_index = layer.open({
177
+ title: '添加产品目录',
178
+ type: 1,
179
+ shade: 0.2,
180
+ maxmin: true,
181
+ shadeClose: true,
182
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
183
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
184
+ content: content,
185
+ success: function(layero, index) {
186
+ form.render('select');
187
+ }
188
+ });
189
+ $(window).on("resize", function() {
190
+ layer.full(add_product_index);
191
+ });
192
+ }
193
+ })
194
+ table.on('tool(contact_product_table)', function(obj) {
195
+ id = obj.data.id;
196
+ if (obj.event === 'edit_product') { // 监听添加操作
197
+ var content = miniPage.getHrefContent('/missions/contracts/' + id +'/edit_product');
198
+ var openWH = miniPage.getOpenWidthHeight();
199
+ edit_production_index = layer.open({
200
+ title: '编辑产品目录',
201
+ type: 1,
202
+ shade: 0.2,
203
+ maxmin: true,
204
+ shadeClose: true,
205
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
206
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
207
+ content: content,
208
+ success: function(layero, index) {
209
+ form.render('select');
210
+ }
211
+ });
212
+ $(window).on("resize", function() {
213
+ layer.full(edit_production_index);
214
+ });
215
+ }
216
+ });
217
+ });
218
+ </script>
219
+ <style>
220
+ .layui-table-tool-temp {
221
+ padding-right: 30px;
222
+ !important;
223
+ }
224
+
225
+ .layui-table-fixed .layui-table-body {
226
+ height: auto !important;
227
+ }
228
+
229
+ .layui-table-fixed.layui-hide {
230
+ display: block !important;
231
+ }
232
+ </style>
@@ -0,0 +1,16 @@
1
+ json.data do
2
+ json.array! @product_catalogs do |d|
3
+ json.id d.id
4
+ json.name d.name
5
+ json.item_clazz d.item_clazz
6
+ json.brand d.brand
7
+ json.specification d.specification
8
+ json.unit d.unit
9
+ json.param d.param
10
+ json.source_method d.source_method
11
+ json.supplier d.supplier
12
+ end
13
+ end
14
+
15
+ json.code 0
16
+ json.count @product_catalogs.total_count
@@ -0,0 +1,169 @@
1
+ <h1 class="text-center m-t-20"><%= @follow_up.business.name %></h1>
2
+ <form class="layui-form form-value">
3
+ <div class="layui-form-item" style="padding: 10px 25px 0;">
4
+ <div class="layui-inline">
5
+ <label class="layui-form-label" style="width: 160px;">单位:</label>
6
+ <div class="layui-input-inline">
7
+ <%= @follow_up.business.department&.school&.name %>
8
+ </div>
9
+ </div>
10
+ <%if @follow_up.business.number.present?%>
11
+ <div class="layui-inline">
12
+ <label class="layui-form-label" style="width: 160px;">编号:</label>
13
+ <div class="layui-input-inline">
14
+ <%= @follow_up.business.number %>
15
+ </div>
16
+ </div>
17
+ <%end %>
18
+ <div class="layui-inline">
19
+ <label class="layui-form-label" style="width: 160px;">部门:</label>
20
+ <div class="layui-input-inline">
21
+ <%= @follow_up.business.department&.name %>
22
+ </div>
23
+ </div>
24
+ <br>
25
+ <div class="layui-inline">
26
+ <label class="layui-form-label" style="width: 160px;">项目类型:</label>
27
+ <div class="layui-input-inline">
28
+ <%= @follow_up.clazz.name %>
29
+ </div>
30
+ </div>
31
+ <div class="layui-inline">
32
+ <label class="layui-form-label" style="width: 160px;">项目阶段:</label>
33
+ <div class="layui-input-inline">
34
+ <%= @follow_up.stage.name %>
35
+ </div>
36
+ </div>
37
+ <br>
38
+ <div class="layui-inline">
39
+ <label class="layui-form-label" style="width: 160px;">招标时间:</label>
40
+ <div class="layui-input-inline">
41
+ <%= @follow_up.invitation_at.to_s %>
42
+ </div>
43
+ </div>
44
+ <div class="layui-inline">
45
+ <label class="layui-form-label" style="width: 160px;">中标时间:</label>
46
+ <div class="layui-input-inline">
47
+ <%= @follow_up.bidded_date.to_s %>
48
+ </div>
49
+ </div>
50
+ <br>
51
+ <div class="layui-inline">
52
+ <label class="layui-form-label" style="width: 160px;">签单时间:</label>
53
+ <div class="layui-input-inline">
54
+ <%= @follow_up.signed_date.to_s %>
55
+ </div>
56
+ </div>
57
+ <div class="layui-inline">
58
+ <label class="layui-form-label" style="width: 160px;">验收时间:</label>
59
+ <div class="layui-input-inline">
60
+ <%= @follow_up.reception_at.to_s %>
61
+ </div>
62
+ </div>
63
+
64
+ <br>
65
+ <%if @follow_up.clazz_id == EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.id %>
66
+ <div class="layui-inline">
67
+ <label class="layui-form-label" style="width: 160px;">服务期:</label>
68
+ <div class="layui-input-inline">
69
+ <%= @follow_up.service_start_time.to_s + "-" + @follow_up.service_end_time.to_s %>
70
+ </div>
71
+ </div>
72
+ <%end %>
73
+ <%if @follow_up.clazz_id == EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.id %>
74
+ <div class="layui-inline">
75
+ <label class="layui-form-label" style="width: 160px;">部署类型:</label>
76
+ <div class="layui-input-inline">
77
+ <%=@show_follow_recored_deployment%>
78
+ </div>
79
+ </div>
80
+ <% end %>
81
+ <br>
82
+
83
+ <div class="layui-inline">
84
+ <label class="layui-form-label" style="width: 160px;">中标额:</label>
85
+ <div class="layui-input-inline">
86
+ <%= @follow_up.total_amount.to_f.round(6) %>万
87
+ </div>
88
+ </div>
89
+ <div class="layui-inline">
90
+ <label class="layui-form-label" style="width: 160px;">合同额:</label>
91
+ <div class="layui-input-inline">
92
+ <%= @follow_up.actual_amount.to_f.round(6) %>万
93
+ </div>
94
+ </div>
95
+ <br>
96
+ <div class="layui-inline">
97
+ <label class="layui-form-label" style="width: 160px;">渠道:</label>
98
+ <div class="layui-input-inline">
99
+ <%= @follow_up.place&.name %>
100
+ </div>
101
+ </div>
102
+ <div class="layui-inline">
103
+ <label class="layui-form-label" style="width: 160px;">渠道分成:</label>
104
+ <div class="layui-input-inline">
105
+ <%= @follow_up.divide_amount.to_f.round(6) %>万
106
+ </div>
107
+ </div>
108
+ <br/>
109
+ <div class="layui-inline">
110
+ <label class="layui-form-label" style="width: 160px;">预算金额:</label>
111
+ <div class="layui-input-inline">
112
+ <%= @follow_up.budget_amount.to_f.round(6) %>万
113
+ </div>
114
+ </div>
115
+ <div class="layui-inline">
116
+ <label class="layui-form-label" style="width: 160px;">分成比例:</label>
117
+ <div class="layui-input-inline">
118
+ <%= @follow_up.divide_rate.to_f.round(2) %>%
119
+ </div>
120
+ </div>
121
+ <div class="layui-form-item">
122
+ <div class="layui-inline">
123
+ <label class="layui-form-label" style="width: 160px;">所属年度:</label>
124
+ <div class="layui-input-inline">
125
+ <%= @follow_up&.year %>年
126
+ </div>
127
+ </div>
128
+ </div>
129
+ <div class="layui-form-item">
130
+ <div class="layui-inline">
131
+ <label class="layui-form-label" style="width: 160px;">项目资金来源:</label>
132
+ <div class="layui-input-inline">
133
+ <%= @follow_up&.funding_source %>
134
+ </div>
135
+ </div>
136
+ <div class="layui-inline">
137
+ <label class="layui-form-label" style="width: 160px;">签约单位:</label>
138
+ <div class="layui-input-inline" style="width: 300px">
139
+ <%= @follow_up.signed_department&.school&.name || '' %>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ <div class="layui-form-item">
144
+ <label class="layui-form-label" style="width: 150px;">售后工程师:</label>
145
+ <div class="layui-input-inline" style="width: 350px;">
146
+ <%= @business.assign_staffs.map{|d| d.staff.user.full_name}.join("、") %>
147
+ </div>
148
+ </div>
149
+ <div class="layui-form-item layui-form-text">
150
+ <label class="layui-form-label" style="width: 160px;"><%= @trend.clazz %>:</label>
151
+ <div class="layui-input-block" style="padding-right: 20px;">
152
+ <pre><%= @trend.content %></pre>
153
+ </div>
154
+ </div>
155
+ <div class="layui-form-item layui-form-text">
156
+ <label class="layui-form-label" style="width: 160px;">时间:</label>
157
+ <div class="layui-input-block" style="padding-right: 20px;">
158
+ <pre><%= @follow_up.created_at.to_s %></pre>
159
+ </div>
160
+ </div>
161
+ <div class="layui-form-item layui-form-text">
162
+ <label class="layui-form-label" style="width: 160px;">跟进人:</label>
163
+ <div class="layui-input-block" style="padding-right: 20px;">
164
+ <pre><%= @follow_up.staff.user.real_name %></pre>
165
+ </div>
166
+ </div>
167
+ </div>
168
+ </form>
169
+
@@ -5,7 +5,7 @@ json.data do
5
5
  json.stage d.stage.name
6
6
  json.staff d.staff.user.real_name
7
7
  json.description d.description
8
- json.advise d.advise
8
+ json.advise d.advise || ''
9
9
  json.school d.business.department&.school&.name
10
10
  json.school_id d.business.department&.school&.id
11
11
  json.created_at d.created_at.to_s
@@ -67,6 +67,10 @@
67
67
  <dd><a href="/missions/contracts" class="<%= current?('layui-this', contracts_path) %>"><i style="padding-right: 35px"></i><%= image_tag "educode_sales/4.商机管理.png",size:"15"%><i style="font-size: 25px; padding-right: 15px"></i>合同管理</a>
68
68
  </dd>
69
69
  <% end %>
70
+ <% if can? :read_product_catalog, EducodeSales::Business %>
71
+ <dd><a href="/missions/contracts/product_list" class="<%= current?('layui-this', product_list_contracts_path) %>"><i style="padding-right: 35px"></i><%= image_tag "educode_sales/4.商机管理.png",size:"15"%><i style="font-size: 25px; padding-right: 15px"></i>产品目录</a>
72
+ </dd>
73
+ <% end %>
70
74
  <% if can? :read, EducodeSales::MoneyPlan %>
71
75
  <dd><a href="/missions/money_plans" class="<%= current?('layui-this', money_plans_path) %>"><i style="padding-right: 35px"></i><%= image_tag "educode_sales/money_plans.png",size:"15"%><i style="font-size: 25px; padding-right: 15px"></i>回款计划</a>
72
76
  </dd>
data/config/routes.rb CHANGED
@@ -29,11 +29,16 @@ EducodeSales::Engine.routes.draw do
29
29
  get :new_follow_up
30
30
  post :add_follow_ups
31
31
  get :product_list
32
+ get :new_product
33
+ post :product_catalog
34
+ get :show_follow_record
32
35
  end
33
36
  member do
34
37
  post :advise
35
38
  get :assign
36
39
  post :assign_staff
40
+ get :edit_product
41
+ put :update_product_catalog
37
42
  end
38
43
  end
39
44
 
@@ -0,0 +1,20 @@
1
+ class CreateEducodeSalesProductCatalogs < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :educode_sales_product_catalogs do |t|
4
+ t.string :name
5
+ t.integer :item_clazz
6
+ t.string :brand
7
+ t.string :specification
8
+ t.string :unit
9
+ t.text :param
10
+ t.integer :source_method
11
+ t.string :supplier
12
+
13
+ t.timestamps
14
+ end
15
+
16
+ EducodeSales::Permission.find_or_create_by(name: '查看产品目录', subject: 'Business', action: 'read_product_catalog', clazz: 'contract')
17
+ EducodeSales::Permission.find_or_create_by(name: '添加产品目录', subject: 'Business', action: 'new_product_catalog', clazz: 'contract')
18
+ EducodeSales::Permission.find_or_create_by(name: '编辑产品目录', subject: 'Business', action: 'update_product_catalog', clazz: 'contract')
19
+ end
20
+ end
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '0.9.76'
2
+ VERSION = '0.9.78'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: educode_sales
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.76
4
+ version: 0.9.78
5
5
  platform: ruby
6
6
  authors:
7
7
  - anke1460
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-02 00:00:00.000000000 Z
11
+ date: 2023-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -231,6 +231,7 @@ files:
231
231
  - app/models/educode_sales/permission.rb
232
232
  - app/models/educode_sales/place.rb
233
233
  - app/models/educode_sales/place_area.rb
234
+ - app/models/educode_sales/product_catalog.rb
234
235
  - app/models/educode_sales/project.rb
235
236
  - app/models/educode_sales/recycle.rb
236
237
  - app/models/educode_sales/result.rb
@@ -307,14 +308,17 @@ files:
307
308
  - app/views/educode_sales/commons/show.json.jbuilder
308
309
  - app/views/educode_sales/contracts/_follows.html.erb
309
310
  - app/views/educode_sales/contracts/_list.html.erb
310
- - app/views/educode_sales/contracts/_product_list.html.erb
311
311
  - app/views/educode_sales/contracts/assign.html.erb
312
+ - app/views/educode_sales/contracts/edit_product.html.erb
312
313
  - app/views/educode_sales/contracts/follow_ups.json.jbuilder
313
314
  - app/views/educode_sales/contracts/index.html.erb
314
315
  - app/views/educode_sales/contracts/index.json.jbuilder
315
316
  - app/views/educode_sales/contracts/list.js.erb
316
317
  - app/views/educode_sales/contracts/new_follow_up.html.erb
317
- - app/views/educode_sales/contracts/product_list.js.erb
318
+ - app/views/educode_sales/contracts/new_product.html.erb
319
+ - app/views/educode_sales/contracts/product_list.html.erb
320
+ - app/views/educode_sales/contracts/product_list.json.jbuilder
321
+ - app/views/educode_sales/contracts/show_follow_record.html.erb
318
322
  - app/views/educode_sales/customers/edit.html.erb
319
323
  - app/views/educode_sales/customers/edit_department.html.erb
320
324
  - app/views/educode_sales/customers/edit_follow_record.html.erb
@@ -657,6 +661,7 @@ files:
657
661
  - db/migrate/20230430121335_add_permissions_for_ideas.rb
658
662
  - db/migrate/20230430134710_create_educode_sales_assign_staffs.rb
659
663
  - db/migrate/20230501034307_create_educode_sales_follow_up_trends.rb
664
+ - db/migrate/20230502142912_create_educode_sales_product_catalogs.rb
660
665
  - lib/educode_sales.rb
661
666
  - lib/educode_sales/engine.rb
662
667
  - lib/educode_sales/version.rb
@@ -680,7 +685,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
680
685
  - !ruby/object:Gem::Version
681
686
  version: '0'
682
687
  requirements: []
683
- rubygems_version: 3.0.9
688
+ rubygems_version: 3.0.0
684
689
  signing_key:
685
690
  specification_version: 4
686
691
  summary: Summary of EducodeSales.