educode_sales 0.9.84 → 0.9.89

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,401 @@
1
+ <div class="min-height-table" id="contract_list">
2
+ <div style="margin: 10px 10px 10px 10px">
3
+ <form class="layui-form layui-form-pane" lay-filter="search_form">
4
+ <div class="layui-form-item">
5
+ <div class="layui-inline">
6
+ <label class="layui-form-label">合同名称</label>
7
+ <div class="layui-input-inline">
8
+ <input type="text" name="name" class="layui-input" value="">
9
+ </div>
10
+ </div>
11
+ <div class="layui-inline">
12
+ <label class="layui-form-label">用户单位</label>
13
+ <div class="layui-input-inline">
14
+ <input type="text" name="department" class="layui-input">
15
+ </div>
16
+ </div>
17
+ <div class="layui-inline">
18
+ <label class="layui-form-label">签约单位</label>
19
+ <div class="layui-input-inline">
20
+ <input type="text" name="signed_department" class="layui-input">
21
+ </div>
22
+ </div>
23
+ <div class="layui-inline">
24
+ <label class="layui-form-label">销售经理</label>
25
+ <div class="layui-input-inline">
26
+ <%= select_tag "sales_staff_id", options_for_select(@staffs, params[:staff_id]), { 'lay-filter': 'staff_id', include_blank: true , "lay-search": "" } %>
27
+ </div>
28
+ </div>
29
+
30
+ <div class="layui-inline show_item_contract">
31
+ <label class="layui-form-label">项目阶段</label>
32
+ <div class="layui-input-inline">
33
+ <div id="contract_business_step" style="width: 190px;"></div>
34
+ </div>
35
+ </div>
36
+ <div class="layui-inline show_item_contract">
37
+ <label class="layui-form-label">区域</label>
38
+ <div class="layui-input-inline">
39
+ <%= select_tag "area", options_for_select(EducodeSales::Common.where(clazz: 'area').pluck(:name, :id)), { include_blank: true } %>
40
+ </div>
41
+ </div>
42
+ <div class="layui-inline show_item_contract">
43
+ <label class="layui-form-label">中标时间</label>
44
+ <div class="layui-input-inline">
45
+ <input type="text" class="layui-input" id="bidded_date" name="bidded_date" placeholder=" - " autocomplete="off">
46
+ </div>
47
+ </div>
48
+ <div class="layui-inline show_item_contract">
49
+ <label class="layui-form-label">签单时间</label>
50
+ <div class="layui-input-inline">
51
+ <input type="text" class="layui-input" id="signed_date" name="signed_date" placeholder=" - " autocomplete="off">
52
+ </div>
53
+ </div>
54
+ <div class="layui-inline">
55
+ <button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_business_search">重置
56
+ </button>
57
+ <button type="submit" id="search_bt" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_bussiness_contract">搜索
58
+ </button>
59
+ </div>
60
+ </div>
61
+ </form>
62
+ </div>
63
+ <div id="sales_details_table_wraper">
64
+ <table class="layui-hide" id="sales_details_table" lay-filter="sales_details_table"></table>
65
+ </div>
66
+ </div>
67
+
68
+ <script type="text/html" id="currentTableBar">
69
+ <% if can? :add_follow, EducodeSales::Business %>
70
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add">添加跟进</a>
71
+ <% end %>
72
+ <% if can? :edit_sales_detail, EducodeSales::Business %>
73
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
74
+ <% end %>
75
+ <% if can? :delete_sales_detail, EducodeSales::Business %>
76
+ <a class="layui-btn layui-btn-danger layui-btn-xs data-count-delete" lay-event="delete">删除</a>
77
+ <% end %>
78
+ <% if can?(:create, EducodeSales::SalePlan) %>
79
+ <a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="add_month_plan">添加月计划</a>
80
+ <% end %>
81
+ <% if can?(:show_file, EducodeSales::Business) %>
82
+ <a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="file">附件</a>
83
+ <% end %>
84
+
85
+ </script>
86
+
87
+ <script type="text/html" id="toolbar_contract">
88
+ <div class="layui-btn-container">
89
+ <span class="table-label">销售明细</span>
90
+ </div>
91
+ </script>
92
+ <script>
93
+ layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate', 'dropdown', 'laytpl', 'xmSelect'], function() {
94
+ var $ = layui.jquery,
95
+ form = layui.form,
96
+ request = layui.request,
97
+ miniPage = layui.miniPage,
98
+ dropdown = layui.dropdown,
99
+ xmSelect = layui.xmSelect,
100
+ laydate = layui.laydate;
101
+ var openWH = miniPage.getOpenWidthHeight();
102
+ laydate.render({
103
+ elem: '#date',
104
+ range: true
105
+ });
106
+
107
+
108
+ laydate.render({
109
+ elem: '#bidded_date',
110
+ range: true,
111
+ value: gon.bidded_date
112
+ });
113
+ laydate.render({
114
+ elem: '#signed_date',
115
+ range: true,
116
+ value: gon.signed_date
117
+ });
118
+
119
+
120
+ var business_step_list = xmSelect.render({
121
+ el: '#contract_business_step',
122
+ data: gon.business_step
123
+ })
124
+
125
+ var data = form.val("search_form");
126
+ table = layui.table;
127
+ var cols_table = [
128
+ [{
129
+ field: 'id',
130
+ width: 60,
131
+ title: '序号',
132
+ type: 'numbers',
133
+ fixed: "left"
134
+ }, {
135
+ field: 'number',
136
+ width: 120,
137
+ title: '合同编号',
138
+ fixed: 'left',
139
+ }, {
140
+ field: 'name',
141
+ width: 120,
142
+ title: '商机名称',
143
+ }, {
144
+ field: 'school',
145
+ width: 180,
146
+ title: '用户单位',
147
+ }, {
148
+ field: 'department',
149
+ width: 180,
150
+ title: '部门',
151
+ }, {
152
+ field: 'majors',
153
+ width: 150,
154
+ title: '专业',
155
+ }, {
156
+ field: 'signed_department',
157
+ title: '签约单位',
158
+ width: 280,
159
+ }, {
160
+ field: 'actual_amount',
161
+ width: 120,
162
+ title: '合同金额',
163
+ }, {
164
+ field: 'item_clazz',
165
+ width: 100,
166
+ title: '销售品目',
167
+ }, {
168
+ field: 'brand',
169
+ width: 150,
170
+ title: '品牌',
171
+ }, {
172
+ field: 'specification',
173
+ width: 150,
174
+ title: '规格型号',
175
+ }, {
176
+ field: 'unit',
177
+ width: 90,
178
+ title: '单位',
179
+ }, {
180
+ field: 'amount',
181
+ width: 100,
182
+ title: '数量',
183
+ }, {
184
+ field: 'total_price',
185
+ width: 100,
186
+ title: '金额',
187
+ }, {
188
+ field: 'source_method',
189
+ width: 100,
190
+ title: '来源方式',
191
+ }, {
192
+ field: 'custom_clazz',
193
+ width: 100,
194
+ title: '定制类型',
195
+ }, {
196
+ field: 'supplier',
197
+ width: 120,
198
+ title: '供货商',
199
+ sort: true,
200
+ }, {
201
+ field: 'delivery_date',
202
+ width: 120,
203
+ title: '交货时间',
204
+ sort: true,
205
+ }, {
206
+ title: '操作',
207
+ minWidth: 350,
208
+ toolbar: '#currentTableBar',
209
+ align: "center",
210
+ fixed: 'right'
211
+ }]
212
+ ]
213
+
214
+
215
+ var sales_details_table = table.render({
216
+ elem: '#sales_details_table',
217
+ url: '/missions/sales_details',
218
+ autoSort: false,
219
+ where: {
220
+ q: data
221
+ },
222
+ defaultToolbar: ['filter'],
223
+ title: '销售明细数据表',
224
+ totalRow: true, //开启合并行
225
+ cols: cols_table,
226
+ toolbar: '#toolbar_contract',
227
+ limit: 20,
228
+ limits: [10, 15, 20, 30, 40, 50, 60, 70, 80, 90],
229
+ page: true,
230
+ skin: 'line',
231
+ });
232
+
233
+
234
+ var sort = {},
235
+ search = data;
236
+
237
+ table.on('sort(sales_details_table)', function(obj) {
238
+ var data = form.val("search_form");
239
+ sort.field = obj.field;
240
+ sort.order = obj.type;
241
+ table.reload('sales_details_table', {
242
+ url: '/missions/sales_details',
243
+ initSort: obj,
244
+ where: {
245
+ sort: sort,
246
+ q: search
247
+ }
248
+ });
249
+ })
250
+
251
+ // 监听搜索操作
252
+ form.on('submit(search_bussiness_contract)', function(data) {
253
+ if (search['clazz']) {
254
+ data.field['clazz'] = search['clazz']
255
+ }
256
+ var business_step = [];
257
+ business_step_list.getValue().forEach(function(d) {
258
+ business_step.push(d.value);
259
+ })
260
+ data.field.business_step = business_step.toString();
261
+ search = data.field
262
+ table.reload('sales_details_table', {
263
+ url: '/missions/sales_details',
264
+ page: {
265
+ curr: 1
266
+ },
267
+ where: {
268
+ q: search,
269
+ sort: sort
270
+ }
271
+ }, 'data');
272
+
273
+ return false;
274
+ });
275
+
276
+ form.on('submit(reset_business_search)', function(data) {
277
+ var field = data.field;
278
+ form.val('search_form', {
279
+ name: '',
280
+ area: '',
281
+ department: '',
282
+ business_type: '',
283
+ business_step: '',
284
+ place_id: '',
285
+ bidded_date: '',
286
+ signed_department: '',
287
+ signed_date: '',
288
+ sales_staff_id: '',
289
+ })
290
+ business_step_list.setValue([])
291
+ .setValue([])
292
+ return false;
293
+ });
294
+
295
+ table.on('tool(sales_details_table)', function(obj) {
296
+ var data = obj.data;
297
+ id = data.id
298
+ if (obj.event === 'add') { // 监听添加操作
299
+ business_id = data.business_id
300
+ var content = miniPage.getHrefContent('/missions/businesses/new_follow_record?id=' + data.business_id);
301
+ var openWH = miniPage.getOpenWidthHeight();
302
+ sale_plan_index = layer.open({
303
+ title: '添加商机跟进记录',
304
+ type: 1,
305
+ shade: 0.2,
306
+ maxmin: true,
307
+ shadeClose: true,
308
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
309
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
310
+ content: content,
311
+ success: function (layero, index) {
312
+ form.render('select');
313
+ }
314
+ });
315
+ $(window).on("resize", function () {
316
+ layer.full(sale_plan_index);
317
+ });
318
+ } else if (obj.event === 'edit') {
319
+ var content = miniPage.getHrefContent('/missions/sales_details/' + id + '/edit');
320
+ var openWH = miniPage.getOpenWidthHeight();
321
+ name = data.name;
322
+ sindex = layer.open({
323
+ title: '编辑',
324
+ type: 1,
325
+ shade: 0.2,
326
+ maxmin: true,
327
+ shadeClose: true,
328
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
329
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
330
+ content: content,
331
+ success: function (layero, index) {
332
+ form.render('select');
333
+ }
334
+ });
335
+ $(window).on("resize", function() {
336
+ layer.full(sindex);
337
+ });
338
+ return false;
339
+ } else if (obj.event === 'add_month_plan') {
340
+ id = obj.data.business_id;
341
+ var content = miniPage.getHrefContent('/missions/plans/new_month?business_id=' + obj.data.business_id);
342
+ var openWH = miniPage.getOpenWidthHeight();
343
+ sindex = layer.open({
344
+ title: '添加月计划',
345
+ type: 1,
346
+ shade: 0.2,
347
+ maxmin: true,
348
+ shadeClose: true,
349
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
350
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
351
+ content: content
352
+ });
353
+ $(window).on("resize", function () {
354
+ layer.full(sindex);
355
+ });
356
+ } else if (obj.event == 'file') {
357
+ name = obj.data.name;
358
+ id = obj.data.business_id;
359
+ var content = miniPage.getHrefContent('/missions/businesses/file?business_id=' + obj.data.business_id);
360
+ var openWH = miniPage.getOpenWidthHeight();
361
+ sindex = layer.open({
362
+ title: '商机列表/'+name+'的附件信息',
363
+ type: 1,
364
+ shade: 0.2,
365
+ // maxmin: true,
366
+ shadeClose: true,
367
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
368
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
369
+ content: content
370
+ });
371
+ $(window).on("resize", function () {
372
+ // layer.full(sindex);
373
+ });
374
+ } else if (obj.event == 'delete') {
375
+ name = obj.data.name;
376
+ layer.confirm('确定删除' + data.name, function (index) {
377
+ request.delete('missions/sales_details/' + data.id, {}, function (res) {
378
+ layer.close(index);
379
+ table.reload("sales_details_table")
380
+ })
381
+ });
382
+ }
383
+ });
384
+
385
+
386
+ });
387
+ </script>
388
+ <style>
389
+ .layui-table-tool-temp {
390
+ padding-right: 30px;
391
+ !important;
392
+ }
393
+
394
+ .layui-table-fixed .layui-table-body {
395
+ height: auto!important;
396
+ }
397
+
398
+ .layui-table-fixed.layui-hide {
399
+ display: block!important;
400
+ }
401
+ </style>
@@ -0,0 +1 @@
1
+ $("#sales_list_wraper").html("<%= j render 'index' %>");
@@ -0,0 +1,34 @@
1
+ json.data do
2
+ json.array! @sales_details do |d|
3
+ json.id d.id
4
+ json.business_id d.business_id
5
+ json.number d.business.number
6
+ json.name d.business.name
7
+ json.department d.business.department&.name
8
+ json.school d.business.department&.school&.name
9
+ json.school_id d.business.department&.school_id
10
+
11
+ json.actual_amount d.business.last_follow_up&.actual_amount.to_f.round(2)
12
+ json.created_at d.created_at.to_s
13
+ json.staff_manages d.business.last_follow_up&.assign_follow_ups.present? ? (d.business.last_follow_up.assign_follow_ups.map{ |d| d.staff.user.real_name}.join("、")) : d.business.staff&.user&.real_name
14
+ json.area d.business.department&.school&.province
15
+
16
+ json.majors d.business.department&.department_majors&.pluck(:name).present? ? d.business.department&.department_majors&.pluck(:name).join(",") : ""
17
+ json.signed_department d.business.last_follow_up&.signed_department&.school&.name || ''
18
+ json.item_clazz d.product_catalog.item_clazz
19
+ json.brand d.product_catalog.brand
20
+ json.specification d.product_catalog.specification
21
+ json.unit d.product_catalog.unit
22
+ json.amount d.amount
23
+ json.total_price d.total_price
24
+ json.source_method d.product_catalog.source_method
25
+ json.custom_clazz d.custom_clazz
26
+ json.supplier d.product_catalog.supplier
27
+ json.delivery_date d.delivery_date
28
+ end
29
+ end
30
+
31
+
32
+ json.code 0
33
+ json.count @sales_details.total_count
34
+ json.msg 'succcess'
@@ -71,8 +71,6 @@
71
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
72
  </dd>
73
73
  <% end %>
74
- <dd><a href="/missions/sales_details" class="<%= current?('layui-this', sales_details_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>
75
- </dd>
76
74
  <% if can? :read, EducodeSales::MoneyPlan %>
77
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>
78
76
  </dd>
data/config/routes.rb CHANGED
@@ -35,6 +35,9 @@ EducodeSales::Engine.routes.draw do
35
35
  get :new_product
36
36
  post :product_catalog
37
37
  get :show_follow_record
38
+ get :new_sales_detail
39
+ get :select_product
40
+ post :sales_detail
38
41
  end
39
42
  member do
40
43
  post :advise
@@ -12,5 +12,9 @@ class CreateEducodeSalesSalesDetails < ActiveRecord::Migration[5.2]
12
12
 
13
13
  t.timestamps
14
14
  end
15
+
16
+ EducodeSales::Permission.find_or_create_by(name: '查看销售明细', subject: 'Business', action: 'read_sales_detail', clazz: 'contract')
17
+ EducodeSales::Permission.find_or_create_by(name: '编辑销售明细', subject: 'Business', action: 'edit_sales_detail', clazz: 'contract')
18
+ EducodeSales::Permission.find_or_create_by(name: '删除销售明细', subject: 'Business', action: 'delete_sales_detail', clazz: 'contract')
15
19
  end
16
20
  end
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '0.9.84'
2
+ VERSION = '0.9.89'
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.84
4
+ version: 0.9.89
5
5
  platform: ruby
6
6
  authors:
7
7
  - anke1460
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-11 00:00:00.000000000 Z
11
+ date: 2023-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -105,7 +105,6 @@ files:
105
105
  - app/assets/images/educode_sales/icon-login.png
106
106
  - app/assets/images/educode_sales/icon.png
107
107
  - app/assets/images/educode_sales/indexLogo.png
108
- - app/assets/images/educode_sales/indexlogo.png
109
108
  - app/assets/images/educode_sales/loading-0.gif
110
109
  - app/assets/images/educode_sales/loading-1.gif
111
110
  - app/assets/images/educode_sales/loading-2.gif
@@ -321,8 +320,10 @@ files:
321
320
  - app/views/educode_sales/contracts/list.js.erb
322
321
  - app/views/educode_sales/contracts/new_follow_up.html.erb
323
322
  - app/views/educode_sales/contracts/new_product.html.erb
323
+ - app/views/educode_sales/contracts/new_sales_detail.html.erb
324
324
  - app/views/educode_sales/contracts/product_list.html.erb
325
325
  - app/views/educode_sales/contracts/product_list.json.jbuilder
326
+ - app/views/educode_sales/contracts/select_product.html.erb
326
327
  - app/views/educode_sales/contracts/show_follow_record.html.erb
327
328
  - app/views/educode_sales/customers/edit.html.erb
328
329
  - app/views/educode_sales/customers/edit_department.html.erb
@@ -538,7 +539,11 @@ files:
538
539
  - app/views/educode_sales/sales/school.html.erb
539
540
  - app/views/educode_sales/sales/trends.html.erb
540
541
  - app/views/educode_sales/sales/xschool.html.erb
542
+ - app/views/educode_sales/sales_details/_index.html.erb
543
+ - app/views/educode_sales/sales_details/edit.html.erb
541
544
  - app/views/educode_sales/sales_details/index.html.erb
545
+ - app/views/educode_sales/sales_details/index.js.erb
546
+ - app/views/educode_sales/sales_details/index.json.jbuilder
542
547
  - app/views/educode_sales/sessions/login.html.erb
543
548
  - app/views/educode_sales/staffs/edit.html.erb
544
549
  - app/views/educode_sales/staffs/follow_up_departments.json.jbuilder
@@ -679,7 +684,7 @@ homepage: https://www.educoder.net
679
684
  licenses:
680
685
  - MIT
681
686
  metadata: {}
682
- post_install_message:
687
+ post_install_message:
683
688
  rdoc_options: []
684
689
  require_paths:
685
690
  - lib
@@ -695,7 +700,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
695
700
  version: '0'
696
701
  requirements: []
697
702
  rubygems_version: 3.0.9
698
- signing_key:
703
+ signing_key:
699
704
  specification_version: 4
700
705
  summary: Summary of EducodeSales.
701
706
  test_files: []