educode_sales 0.7.2 → 0.7.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 745a9b47b47d917186df80e64b85698ecb980c6348773520b8dc03ca0b2cd985
4
- data.tar.gz: c2e13cdd710e59bc828a7af7c28f944a65a11bc4419225c89fbbb20fb830e13a
3
+ metadata.gz: 32e3ce754e3aeac0c5f424b9188254b88b1da494feb591b5eb1e2d100f0362c2
4
+ data.tar.gz: 2be5f9d03ccc4781ff534e59ffe8aee273185a0d635c08ca09e60403a4b4d221
5
5
  SHA512:
6
- metadata.gz: 7b530302422fffd437080d469f59851436f3d3667e52c05da0804c5ccf9ab13038563809918a94d5842622ac478beaf4c4c7e77842ced01e8eb43bcd486eadf3
7
- data.tar.gz: f2476d1ad5479026a211698f4e0f3c49f9e060da98bbf319c99a25181457e158fc8df186ac00b0221e310a67142f2cacf06b9fd55cb1e9ee207590501e50bb43
6
+ metadata.gz: ec4b1594bcc4ac5766e6e3c0fc189f17b8b24b0789328ee1ed75a33022438b6d5f2c2c78f221ae6bf3db2dbb9b4253f7d5f428df24f6c336aa0a3ea5bd081aaf
7
+ data.tar.gz: '082c2c1a08570db3b4ea942c932c73ad08fd2e2bde8b4be2cff38816a4d3eed64bf503fb151ece68a0140e2db841c153923335fcf10d1142370b41f8f6a10a2f'
@@ -198,7 +198,11 @@ module EducodeSales
198
198
  end
199
199
 
200
200
  if params[:sort].present? && params[:sort][:field]
201
- @businesses = @businesses.order("#{params[:sort][:field]} #{params[:sort][:order]}")
201
+ if params[:sort][:field] = "service_end_time"
202
+ @businesses = @businesses.order("service_time_long #{params[:sort][:order]}")
203
+ else
204
+ @businesses = @businesses.order("#{params[:sort][:field]} #{params[:sort][:order]}")
205
+ end
202
206
  else
203
207
  @businesses = @businesses.order("educode_sales_businesses.created_at desc")
204
208
  end
@@ -208,6 +212,9 @@ module EducodeSales
208
212
  @businesses = @businesses.select("
209
213
  educode_sales_businesses.*,
210
214
  last_follow.invitation_at,
215
+ last_follow.service_time_long,
216
+ last_follow.service_end_time,
217
+ last_follow.service_start_time,
211
218
  last_follow.reception_at,
212
219
  last_follow.bidded_date,
213
220
  last_follow.signed_date,
@@ -559,6 +566,9 @@ module EducodeSales
559
566
  educode_sales_businesses.*,
560
567
  last_follow.invitation_at,
561
568
  last_follow.reception_at,
569
+ last_follow.service_time_long,
570
+ last_follow.service_end_time,
571
+ last_follow.service_start_time,
562
572
  last_follow.bidded_date,
563
573
  last_follow.signed_date,
564
574
  last_follow.created_at as latest_time,
@@ -63,11 +63,17 @@ module EducodeSales
63
63
  def create
64
64
  load_business
65
65
  follow_up = @business.follow_ups.build(follow_up_params)
66
+ if params[:service_time].present?
67
+ date = params[:service_time].split(" - ")
68
+ follow_up.service_start_time = date[0]
69
+ follow_up.service_end_time = date[1]
70
+ follow_up.service_time_long = (date[1].to_date - date[0].to_date).to_i
71
+ end
66
72
  follow_up.staff = @current_admin
67
73
  params[:assign_follow_up].each do |d|
68
74
  follow_up.assign_follow_ups.build(staff_id: d)
69
75
  end
70
-
76
+
71
77
  follow_up.profit_amount = follow_up.actual_amount - (follow_up.divide_amount.to_i) if follow_up.actual_amount
72
78
  if follow_up.save
73
79
  if @business.last_follow_up.present?
@@ -106,6 +112,12 @@ module EducodeSales
106
112
  def update
107
113
  follow_up = FollowUp.find(params[:id])
108
114
  follow_up.assign_attributes(follow_up_params)
115
+ if params[:service_time].present?
116
+ date = params[:service_time].split(" - ")
117
+ follow_up.service_start_time = date[0]
118
+ follow_up.service_end_time = date[1]
119
+ follow_up.service_time_long = (date[1].to_date - date[0].to_date).to_i
120
+ end
109
121
  assign_follow_ups = []
110
122
  params[:assign_follow_up].each do |d|
111
123
  assign_follow_ups << follow_up.assign_follow_ups.find_or_initialize_by(staff_id: d)
@@ -0,0 +1,54 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class ResultsController < ApplicationController
5
+
6
+ def index
7
+ respond_to do |format|
8
+ format.html do
9
+ end
10
+ format.json do
11
+ # @commons = Common.group("clazz").page(params[:page]).per(params[:limit])
12
+ end
13
+ end
14
+ end
15
+
16
+ # def create
17
+ # common = Common.new(name: params[:name], clazz: params[:clazz])
18
+ # if common.save
19
+ # render_success
20
+ # else
21
+ # render_failure common
22
+ # end
23
+ # end
24
+ #
25
+ # def edit
26
+ # @common = Common.find(params[:id])
27
+ # render layout: false
28
+ # end
29
+ #
30
+ # def update
31
+ # common = Common.find(params[:id])
32
+ # if common.update(common_params)
33
+ # render_success
34
+ # else
35
+ # render_failure common
36
+ # end
37
+ # end
38
+ #
39
+ # def new
40
+ # render layout: false
41
+ # end
42
+ #
43
+ # def show
44
+ # commons = Common.find(params[:id])
45
+ # @commons = Common.where(clazz: commons.clazz).order('position')
46
+ # end
47
+ #
48
+ # private
49
+ #
50
+ # def common_params
51
+ # params.permit(:name, :position)
52
+ # end
53
+ end
54
+ end
@@ -0,0 +1,4 @@
1
+ module EducodeSales
2
+ class Result < ApplicationRecord
3
+ end
4
+ end
@@ -19,11 +19,11 @@
19
19
  <label class="layui-form-label required">项目类型</label>
20
20
  <%if EducodeSales::FollowUp.where(business_id: @follow_up.business.id,clazz_id: EducodeSales::Common.find_by(name: @o_name).id).count >= 2 %>
21
21
  <div class="layui-input-inline">
22
- <%= select_tag "clazz_id", options_for_select([[@o_name,EducodeSales::Common.find_by(name: @o_name).id]]),:disabled => true, class: 'required' %>
22
+ <%= select_tag "clazz_id", options_for_select([[@o_name, EducodeSales::Common.find_by(name: @o_name).id]]), { 'lay-filter': 'clazz_id', class: 'required', :disabled => true } %>
23
23
  </div>
24
24
  <%else %>
25
25
  <div class="layui-input-inline">
26
- <%= select_tag "clazz_id", options_for_select(@clazz, @follow_up&.clazz_id), class: 'required' %>
26
+ <%= select_tag "clazz_id", options_for_select(@clazz, @follow_up&.clazz_id), { 'lay-filter': 'clazz_id', class: 'required' } %>
27
27
  </div>
28
28
  <%end %>
29
29
  </div>
@@ -60,21 +60,29 @@
60
60
  <label class="layui-form-label">验收时间</label>
61
61
  <div class="layui-input-inline">
62
62
  <input type="text" class="layui-input" value="<%= @follow_up.reception_at %>" name="reception_at"
63
- id="reception_at_edit" placeholder="请选择日期">
63
+ id="reception_at_edit" placeholder="请选择日期">
64
64
  </div>
65
65
  </div>
66
66
  <br>
67
+ <div class="layui-inline service_show layui-hide">
68
+ <label class="layui-form-label required">服务期</label>
69
+ <div class="layui-input-inline">
70
+ <input type="text" class="layui-input required" id="service_time" name="service_time" placeholder=" - " autocomplete="off" value="<%= (@follow_up.service_start_time.present? && @follow_up.service_end_time.present?) ? (@follow_up.service_start_time.to_s + ' - ' + @follow_up.service_end_time.to_s) : '' %>">
71
+ </div>
72
+ </div>
73
+ <br class="service_show layui-hide">
67
74
  <div class="layui-inline">
68
75
  <label class="layui-form-label">总额(万)</label>
69
76
  <div class="layui-input-inline">
70
77
  <input name="total_amount" type="number" class="layui-input" value="<%= @follow_up.total_amount %>">
71
78
  </div>
72
- 客户采购支出的费用。总额的生命历程:1.在最初阶段,是商机的预算总额;2.在挂网阶段,是项目的挂网预算总额;3.在中标阶段,是项目的中标总额。 </div>
79
+ 客户采购支出的费用。总额的生命历程:1.在最初阶段,是商机的预算总额;2.在挂网阶段,是项目的挂网预算总额;3.在中标阶段,是项目的中标总额。
80
+ </div>
73
81
  <br>
74
82
  <div class="layui-inline">
75
83
  <label class="layui-form-label">合同额(万)</label>
76
84
  <div class="layui-input-inline">
77
- <input name="actual_amount" type="number" class="layui-input" placeholder="本单位的签单金额" value="<%= @follow_up.actual_amount %>">
85
+ <input name="actual_amount" type="number" class="layui-input" placeholder="本单位的签单金额" value="<%= @follow_up.actual_amount %>">
78
86
  </div>
79
87
  客户签给头歌的费用。合同额的生命历程:1.在中标之前,合同额都是0;2.在中标之后,实际与头歌签合同的金额。
80
88
  </div>
@@ -146,128 +154,156 @@
146
154
  </div>
147
155
 
148
156
  <script>
149
- layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate', 'xmSelect'], function () {
150
- var form = layui.form,
151
- layer = layui.layer,
152
- table = layui.table,
153
- xmSelect = layui.xmSelect,
154
- laytpl = layui.laytpl,
155
- request = layui.request,
156
- laydate = layui.laydate,
157
- $ = layui.$;
158
-
159
- laydate.render({
160
- elem: '#invitation_at_edit'
161
- })
162
- laydate.render({
163
- elem: '#edit_year',
164
- type: 'year'
165
- })
157
+ layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate', 'xmSelect'], function () {
158
+ var form = layui.form,
159
+ layer = layui.layer,
160
+ table = layui.table,
161
+ xmSelect = layui.xmSelect,
162
+ laytpl = layui.laytpl,
163
+ request = layui.request,
164
+ laydate = layui.laydate,
165
+ $ = layui.$;
166
166
 
167
- laydate.render({
168
- elem: '#reception_at_edit'
169
- });
167
+ flag =
168
+ <%=@follow_up&.clazz_id == EducodeSales::Common.where(extras: EducodeSales::Common::OTYPE).first&.id %>
169
+ if (flag) {
170
+ $(".service_show").removeClass('layui-hide')
171
+ }
170
172
 
171
- var sales_list = xmSelect.render({
172
- el: '#edit_assign_follow',
173
- remoteSearch: true,
174
- clickClose: true,
175
- delay: 1000,
176
- paging: true,
177
- pageRemote: true,
178
- filterable: true,
179
- remoteMethod: function (val, cb, show, pageIndex) {
180
- $.ajax( '/missions/sales_staff', {
181
- method: 'get',
182
- data: {
183
- q: val,
184
- page: pageIndex
185
- },
186
- dataType: 'json',
187
- success: function (res) {
188
- var data = res.data;
189
- if (res.code == 0) {
190
- cb(res.data, res.count);
173
+ form.on('select(clazz_id)', function (data) {
174
+ console.log(data.value)
175
+ const value = data.value;
176
+ if (value == <%= EducodeSales::Common.where(extras: EducodeSales::Common::OTYPE).first&.id %>) {
177
+ $(".service_show").removeClass('layui-hide')
191
178
  } else {
192
- layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
179
+ console.log(data.value)
180
+ $(".service_show").addClass('layui-hide')
193
181
  }
194
- }
195
182
  })
196
- }
197
- })
198
- sales_list.setValue(gon.sales)
199
- var places_list = xmSelect.render({
200
- el: '#edit_place',
201
- remoteSearch: true,
202
- clickClose: true,
203
- model: {
204
- icon: 'hidden',
205
- label: {
206
- type: 'text',
207
- text: {
208
- //左边拼接的字符
209
- left: '',
210
- //右边拼接的字符
211
- right: '',
212
- //中间的分隔符
213
- separator: ', ',
214
- },
183
+
184
+ laydate.render({
185
+ elem: '#invitation_at_edit'
186
+ })
187
+ laydate.render({
188
+ elem: '#service_time',
189
+ range: true
190
+ });
191
+ laydate.render({
192
+ elem: '#edit_year',
193
+ type: 'year'
194
+ })
195
+
196
+ laydate.render({
197
+ elem: '#reception_at_edit'
198
+ });
199
+
200
+ var sales_list = xmSelect.render({
201
+ el: '#edit_assign_follow',
202
+ remoteSearch: true,
203
+ clickClose: true,
204
+ delay: 1000,
205
+ paging: true,
206
+ pageRemote: true,
207
+ filterable: true,
208
+ remoteMethod: function (val, cb, show, pageIndex) {
209
+ $.ajax('/missions/sales_staff', {
210
+ method: 'get',
211
+ data: {
212
+ q: val,
213
+ page: pageIndex
214
+ },
215
+ dataType: 'json',
216
+ success: function (res) {
217
+ var data = res.data;
218
+ if (res.code == 0) {
219
+ cb(res.data, res.count);
220
+ } else {
221
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
222
+ }
223
+ }
224
+ })
215
225
  }
216
- },
217
- delay: 1000,
218
- radio: true,
219
- paging: true,
220
- pageRemote: true,
221
- filterable: true,
222
- remoteMethod: function (val, cb, show, pageIndex) {
223
- $.ajax( '/missions/sales_place', {
224
- method: 'get',
225
- data: {
226
- q: val,
227
- page: pageIndex
228
- },
229
- dataType: 'json',
230
- success: function (res) {
231
- var data = res.data;
232
- if (res.code == 0) {
233
- cb(res.data, res.count);
234
- } else {
235
- layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
226
+ })
227
+ sales_list.setValue(gon.sales)
228
+ var places_list = xmSelect.render({
229
+ el: '#edit_place',
230
+ remoteSearch: true,
231
+ clickClose: true,
232
+ model: {
233
+ icon: 'hidden',
234
+ label: {
235
+ type: 'text',
236
+ text: {
237
+ //左边拼接的字符
238
+ left: '',
239
+ //右边拼接的字符
240
+ right: '',
241
+ //中间的分隔符
242
+ separator: ', ',
243
+ },
244
+ }
245
+ },
246
+ delay: 1000,
247
+ radio: true,
248
+ paging: true,
249
+ pageRemote: true,
250
+ filterable: true,
251
+ remoteMethod: function (val, cb, show, pageIndex) {
252
+ $.ajax('/missions/sales_place', {
253
+ method: 'get',
254
+ data: {
255
+ q: val,
256
+ page: pageIndex
257
+ },
258
+ dataType: 'json',
259
+ success: function (res) {
260
+ var data = res.data;
261
+ if (res.code == 0) {
262
+ cb(res.data, res.count);
263
+ } else {
264
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
265
+ }
266
+ }
267
+ })
236
268
  }
237
- }
238
269
  })
239
- }
240
- })
241
- places_list.setValue(gon.place)
270
+ places_list.setValue(gon.place)
242
271
 
243
- form.render();
244
- form.on('submit(update_follow_up)', function (data) {
245
- var assign_follow = [];
246
- sales_list.getValue().forEach(function(d) {
247
- assign_follow.push(d.value);
248
- })
249
- data.field.assign_follow_up = assign_follow;
250
- data.field.place_id = places_list.getValue()[0].value;
251
- request.authPut("missions/follow_ups/<%= @follow_up.id%>", data.field, function (res) {
252
- if (res.success == false) {
253
- layer.alert(res.msg)
254
- } else {
255
- layer.close(parent.sale_plan_edit_open);
256
- parent.layer.close(parent.layer.getFrameIndex(window.name))
257
- parent.table.reload('sale_plan_follow_table')
258
- parent.table.reload('businesses_table')
259
- parent.table.reload('teachers_table')
260
- }
261
- })
272
+ form.render();
273
+ form.on('submit(update_follow_up)', function (data) {
274
+ if (data.field.clazz_id == <%= EducodeSales::Common.where(extras: EducodeSales::Common::OTYPE).first&.id %>) {
275
+ if (data.field.service_time.length == 0) {
276
+ layer.msg('请选择服务期', {time: 2000, icon: 2, shade: 0.01});
277
+ return false;
278
+ }
279
+ }
280
+ var assign_follow = [];
281
+ sales_list.getValue().forEach(function (d) {
282
+ assign_follow.push(d.value);
283
+ })
284
+ data.field.assign_follow_up = assign_follow;
285
+ data.field.place_id = places_list.getValue()[0].value;
286
+ request.authPut("missions/follow_ups/<%= @follow_up.id%>", data.field, function (res) {
287
+ if (res.success == false) {
288
+ layer.alert(res.msg)
289
+ } else {
290
+ layer.close(parent.sale_plan_edit_open);
291
+ parent.layer.close(parent.layer.getFrameIndex(window.name))
292
+ parent.table.reload('sale_plan_follow_table')
293
+ parent.table.reload('businesses_table')
294
+ parent.table.reload('teachers_table')
295
+ }
296
+ })
262
297
 
263
298
 
264
- return false;
265
- });
299
+ return false;
300
+ });
266
301
 
267
- });
302
+ });
268
303
  </script>
269
304
  <style>
270
- .place_select xm-select > .xm-body{
271
- width: 300px; !important;
305
+ .place_select xm-select > .xm-body {
306
+ width: 300px;
307
+ !important;
272
308
  }
273
309
  </style>
@@ -15,6 +15,7 @@ json.data do
15
15
  json.bidded_date d.last_follow_up&.bidded_date.to_s
16
16
  json.signed_date d.last_follow_up&.signed_date.to_s
17
17
  json.total_amount d.last_follow_up&.total_amount
18
+ json.service_end_time d.last_follow_up&.service_start_time.to_s + "-" + d.last_follow_up&.service_end_time.to_s
18
19
  json.actual_amount d.last_follow_up&.actual_amount
19
20
  json.return_money d.return_money
20
21
  json.wait_return_money d.wait_return_money.to_i.round(2)
@@ -338,26 +338,32 @@
338
338
  },
339
339
  {
340
340
  field: 'signed_date',
341
- width: 105,
342
- title: '签单时间',
341
+ width: 105,
342
+ title: '签单时间',
343
343
  sort: true
344
344
  },
345
- {
346
- field: 'reception_at',
347
- width: 105,
348
- title: '验收时间',
349
- sort: true
350
- },
351
- {
352
- field: 'total_amount',
353
- width: 100,
354
- title: '总额',
355
- totalRow: true,
356
- sort: true
357
- },
358
- {
359
- field: 'actual_amount',
360
- width: 100,
345
+ {
346
+ field: 'reception_at',
347
+ width: 105,
348
+ title: '验收时间',
349
+ sort: true
350
+ },
351
+ {
352
+ field: 'service_end_time',
353
+ width: 200,
354
+ title: '服务期',
355
+ sort: true
356
+ },
357
+ {
358
+ field: 'total_amount',
359
+ width: 100,
360
+ title: '总额',
361
+ totalRow: true,
362
+ sort: true
363
+ },
364
+ {
365
+ field: 'actual_amount',
366
+ width: 100,
361
367
  title: '合同额',
362
368
  totalRow: true,
363
369
  sort: true
@@ -17,6 +17,7 @@ json.data do
17
17
  json.reception_at d.last_follow_up&.reception_at.to_s
18
18
  json.bidded_date d.last_follow_up&.bidded_date.to_s
19
19
  json.signed_date d.last_follow_up&.signed_date.to_s
20
+ json.service_end_time d.last_follow_up&.service_start_time.to_s + "-" + d.last_follow_up&.service_end_time.to_s
20
21
  json.year d.last_follow_up&.year.to_s
21
22
  json.total_amount d.last_follow_up&.total_amount
22
23
  json.actual_amount d.last_follow_up&.actual_amount
@@ -19,11 +19,11 @@
19
19
  <label class="layui-form-label required">项目类型</label>
20
20
  <%if @last_follow_up&.clazz&.name == @o_name %>
21
21
  <div class="layui-input-inline">
22
- <%= select_tag "clazz_id", options_for_select([[@o_name,EducodeSales::Common.find_by(name: @o_name).id]]),:disabled => true, class: 'required' %>
22
+ <%= select_tag "clazz_id", options_for_select([[@o_name, EducodeSales::Common.find_by(name: @o_name).id]]), { 'lay-filter': 'clazz_id', class: 'required', :disabled => true } %>
23
23
  </div>
24
24
  <%else %>
25
25
  <div class="layui-input-inline">
26
- <%= select_tag "clazz_id", options_for_select(@clazz, @last_follow_up&.clazz_id), class: 'required' %>
26
+ <%= select_tag "clazz_id", options_for_select(@clazz, @last_follow_up&.clazz_id), { 'lay-filter': 'clazz_id', class: 'required', } %>
27
27
  </div>
28
28
  <%end %>
29
29
  </div>
@@ -64,23 +64,31 @@
64
64
  <div class="layui-input-inline">
65
65
  <input type="text" class="layui-input" name="reception_at" autocomplete="off" id="reception_at_add"
66
66
  value="<%= @last_follow_up&.reception_at%>"
67
- placeholder="请选择日期">
67
+ placeholder="请选择日期">
68
68
  </div>
69
69
  </div>
70
70
  <br>
71
+ <div class="layui-inline service_show layui-hide">
72
+ <label class="layui-form-label required">服务期</label>
73
+ <div class="layui-input-inline">
74
+ <input type="text" class="layui-input required" id="service_time" name="service_time" placeholder=" - " autocomplete="off">
75
+ </div>
76
+ </div>
77
+ <br class="service_show layui-hide">
71
78
  <div class="layui-inline">
72
79
  <label class="layui-form-label">总额(万)</label>
73
80
  <div class="layui-input-inline">
74
81
  <input name="total_amount" type="number" class="layui-input" autocomplete="off"
75
- value="<%= @last_follow_up&.total_amount%>">
82
+ value="<%= @last_follow_up&.total_amount %>">
76
83
  </div>
77
- 客户采购支出的费用。总额的生命历程:1.在最初阶段,是商机的预算总额;2.在挂网阶段,是项目的挂网预算总额;3.在中标阶段,是项目的中标总额。 </div>
84
+ 客户采购支出的费用。总额的生命历程:1.在最初阶段,是商机的预算总额;2.在挂网阶段,是项目的挂网预算总额;3.在中标阶段,是项目的中标总额。
85
+ </div>
78
86
  <br>
79
87
  <div class="layui-inline">
80
88
  <label class="layui-form-label">合同额(万)</label>
81
89
  <div class="layui-input-inline">
82
90
  <input name="actual_amount" type="number" class="layui-input" autocomplete="off" placeholder="本单位的签单金额"
83
- value="<%= @last_follow_up&.actual_amount%>">
91
+ value="<%= @last_follow_up&.actual_amount %>">
84
92
  </div>
85
93
  客户签给头歌的费用。合同额的生命历程:1.在中标之前,合同额都是0;2.在中标之后,实际与头歌签合同的金额。
86
94
  </div>
@@ -150,132 +158,161 @@
150
158
  </div>
151
159
 
152
160
  <script>
153
- layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate', 'xmSelect'], function () {
154
- var form = layui.form,
155
- layer = layui.layer,
156
- table = layui.table,
157
- laytpl = layui.laytpl,
158
- request = layui.request,
159
- laydate = layui.laydate,
160
- xmSelect = layui.xmSelect,
161
- $ = layui.$;
161
+ layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate', 'xmSelect'], function () {
162
+ var form = layui.form,
163
+ layer = layui.layer,
164
+ table = layui.table,
165
+ laytpl = layui.laytpl,
166
+ request = layui.request,
167
+ laydate = layui.laydate,
168
+ xmSelect = layui.xmSelect,
169
+ $ = layui.$;
162
170
 
163
- laydate.render({
164
- elem: '#year',
165
- type: 'year'
166
- })
167
- laydate.render({
168
- elem: '#invitation_at_add'
169
- })
171
+ flag =
172
+ <%=@last_follow_up&.clazz&.name == @o_name %>
173
+ if (flag) {
174
+ $(".service_show").removeClass('layui-hide')
175
+ }
170
176
 
171
- laydate.render({
172
- elem: '#reception_at_add'
173
- });
174
- var sales_list = xmSelect.render({
175
- el: '#assign_follow',
176
- remoteSearch: true,
177
- clickClose: true,
178
- delay: 1000,
179
- paging: true,
180
- pageRemote: true,
181
- filterable: true,
182
- remoteMethod: function (val, cb, show, pageIndex) {
183
- $.ajax( '/missions/sales_staff', {
184
- method: 'get',
185
- data: {
186
- q: val,
187
- page: pageIndex
188
- },
189
- dataType: 'json',
190
- success: function (res) {
191
- var data = res.data;
192
- if (res.code == 0) {
193
- cb(res.data, res.count);
194
- } else {
195
- layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
196
- }
177
+ form.on('select(clazz_id)', function (data) {
178
+ console.log(data.value)
179
+ const value = data.value;
180
+ if (value == <%= EducodeSales::Common.where(extras: EducodeSales::Common::OTYPE).first&.id %>) {
181
+ $(".service_show").removeClass('layui-hide')
182
+ } else {
183
+ console.log(data.value)
184
+ $(".service_show").addClass('layui-hide')
185
+ }
186
+ })
187
+
188
+ laydate.render({
189
+ elem: '#service_time',
190
+ range: true
191
+ });
192
+
193
+ laydate.render({
194
+ elem: '#year',
195
+ type: 'year'
196
+ })
197
+ laydate.render({
198
+ elem: '#invitation_at_add'
199
+ })
197
200
 
201
+ laydate.render({
202
+ elem: '#reception_at_add'
203
+ });
204
+ var sales_list = xmSelect.render({
205
+ el: '#assign_follow',
206
+ remoteSearch: true,
207
+ clickClose: true,
208
+ delay: 1000,
209
+ paging: true,
210
+ pageRemote: true,
211
+ filterable: true,
212
+ remoteMethod: function (val, cb, show, pageIndex) {
213
+ $.ajax('/missions/sales_staff', {
214
+ method: 'get',
215
+ data: {
216
+ q: val,
217
+ page: pageIndex
218
+ },
219
+ dataType: 'json',
220
+ success: function (res) {
221
+ var data = res.data;
222
+ if (res.code == 0) {
223
+ cb(res.data, res.count);
224
+ } else {
225
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
226
+ }
227
+
228
+ }
229
+ })
198
230
  }
199
- })
200
- }
201
- })
202
- var place_list = xmSelect.render({
203
- el: '#place',
204
- remoteSearch: true,
205
- model: {
206
- icon: 'hidden',
207
- label: {
208
- type: 'text',
209
- text: {
210
- //左边拼接的字符
211
- left: '',
212
- //右边拼接的字符
213
- right: '',
214
- //中间的分隔符
215
- separator: ', ',
216
- },
217
- }
218
- },
219
- clickClose: true,
220
- delay: 1000,
221
- paging: true,
222
- radio: true,
223
- pageRemote: true,
224
- filterable: true,
225
- remoteMethod: function (val, cb, show, pageIndex) {
226
- $.ajax( '/missions/sales_place', {
227
- method: 'get',
228
- data: {
229
- q: val,
230
- page: pageIndex
231
- },
232
- dataType: 'json',
233
- success: function (res) {
234
- var data = res.data;
235
- if (res.code == 0) {
236
- cb(res.data, res.count);
237
- } else {
238
- layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
231
+ })
232
+ var place_list = xmSelect.render({
233
+ el: '#place',
234
+ remoteSearch: true,
235
+ model: {
236
+ icon: 'hidden',
237
+ label: {
238
+ type: 'text',
239
+ text: {
240
+ //左边拼接的字符
241
+ left: '',
242
+ //右边拼接的字符
243
+ right: '',
244
+ //中间的分隔符
245
+ separator: ', ',
246
+ },
239
247
  }
248
+ },
249
+ clickClose: true,
250
+ delay: 1000,
251
+ paging: true,
252
+ radio: true,
253
+ pageRemote: true,
254
+ filterable: true,
255
+ remoteMethod: function (val, cb, show, pageIndex) {
256
+ $.ajax('/missions/sales_place', {
257
+ method: 'get',
258
+ data: {
259
+ q: val,
260
+ page: pageIndex
261
+ },
262
+ dataType: 'json',
263
+ success: function (res) {
264
+ var data = res.data;
265
+ if (res.code == 0) {
266
+ cb(res.data, res.count);
267
+ } else {
268
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
269
+ }
240
270
 
271
+ }
272
+ })
241
273
  }
242
- })
243
- }
244
- })
274
+ })
245
275
 
246
- sales_list.setValue(gon.sales);
247
- place_list.setValue(gon.place);
248
- form.render();
276
+ sales_list.setValue(gon.sales);
277
+ place_list.setValue(gon.place);
278
+ form.render();
249
279
 
250
- form.on('submit(add_follow_up)', function (data) {
251
- $(".submit-btn").addClass("layui-hide");
252
- var assign_follow = [];
253
- sales_list.getValue().forEach(function(d) {
254
- assign_follow.push(d.value);
255
- })
256
- data.field.assign_follow_up = assign_follow;
257
- data.field.business_id = "<%= @business.id %>";
258
- data.field.place_id = place_list.getValue('valueStr');
259
- request.authPost("missions/follow_ups", data.field, function (res) {
260
- if (res.success == false) {
261
- layer.alert(res.msg)
262
- } else {
263
- layer.close(parent.sale_plan_index);
264
- parent.layer.close(parent.layer.getFrameIndex(window.name))
265
- parent.table.reload('sale_plan_follow_table')
266
- parent.table.reload('businesses_table')
267
- parent.table.reload('teachers_table')
268
- }
269
- })
280
+ form.on('submit(add_follow_up)', function (data) {
281
+ if (data.field.clazz_id == <%= EducodeSales::Common.where(extras: EducodeSales::Common::OTYPE).first&.id %>) {
282
+ if (data.field.service_time.length == 0) {
283
+ layer.msg('请选择服务期', {time: 2000, icon: 2, shade: 0.01});
284
+ return false;
285
+ }
286
+ }
287
+ $(".submit-btn").addClass("layui-hide");
288
+ var assign_follow = [];
289
+ sales_list.getValue().forEach(function (d) {
290
+ assign_follow.push(d.value);
291
+ })
292
+ data.field.assign_follow_up = assign_follow;
293
+ data.field.business_id = "<%= @business.id %>";
294
+ data.field.place_id = place_list.getValue('valueStr');
295
+ request.authPost("missions/follow_ups", data.field, function (res) {
296
+ if (res.success == false) {
297
+ layer.alert(res.msg)
298
+ } else {
299
+ layer.close(parent.sale_plan_index);
300
+ parent.layer.close(parent.layer.getFrameIndex(window.name))
301
+ parent.table.reload('sale_plan_follow_table')
302
+ parent.table.reload('businesses_table')
303
+ parent.table.reload('teachers_table')
304
+ }
305
+ })
270
306
 
271
307
 
272
- return false;
273
- });
308
+ return false;
309
+ });
274
310
 
275
- });
311
+ });
276
312
  </script>
277
313
  <style>
278
- .new_place_select xm-select > .xm-body{
279
- width: 300px; !important;
314
+ .new_place_select xm-select > .xm-body {
315
+ width: 300px;
316
+ !important;
280
317
  }
281
318
  </style>
@@ -163,26 +163,31 @@
163
163
  width: 110,
164
164
  title: '中标时间',
165
165
  },
166
- {
167
- field: 'signed_date',
168
- width: 110,
169
- title: '签单时间',
170
- },
171
- {
172
- field: 'reception_at',
173
- width: 110,
174
- title: '验收时间',
175
- },
176
- {
177
- field: 'total_amount',
178
- width: 100,
179
- title: '总额',
180
- },
181
- {
182
- field: 'actual_amount',
183
- width: 100,
184
- title: '合同额',
185
- },
166
+ {
167
+ field: 'signed_date',
168
+ width: 110,
169
+ title: '签单时间',
170
+ },
171
+ {
172
+ field: 'reception_at',
173
+ width: 110,
174
+ title: '验收时间',
175
+ },
176
+ {
177
+ field: 'service_end_time',
178
+ width: 200,
179
+ title: '服务期',
180
+ },
181
+ {
182
+ field: 'total_amount',
183
+ width: 100,
184
+ title: '总额',
185
+ },
186
+ {
187
+ field: 'actual_amount',
188
+ width: 100,
189
+ title: '合同额',
190
+ },
186
191
  {
187
192
  field: 'divide_amount',
188
193
  width: 100,
@@ -9,6 +9,7 @@ json.data do
9
9
  json.reception_at d.reception_at&.to_s(:date)
10
10
  json.bidded_date d.bidded_date&.to_s(:date)
11
11
  json.signed_date d.signed_date&.to_s(:date)
12
+ json.service_end_time (d.service_start_time.present? && d.service_end_time.present?) ? (d.service_start_time&.to_s + "-" + d.service_end_time&.to_s) : ''
12
13
  json.total_amount d.total_amount
13
14
  json.actual_amount d.actual_amount
14
15
  json.divide_amount d.divide_amount ? d.divide_amount : ""
@@ -49,7 +49,14 @@
49
49
  <div class="layui-inline">
50
50
  <label class="layui-form-label">验收时间:</label>
51
51
  <div class="layui-input-inline">
52
- <%= @follow_up.reception_at.to_s %>
52
+ <%= @follow_up.reception_at.to_s %>
53
+ </div>
54
+ </div>
55
+ <br>
56
+ <div class="layui-inline">
57
+ <label class="layui-form-label">服务期:</label>
58
+ <div class="layui-input-inline">
59
+ <%= @follow_up.service_start_time.to_s + "-" + @follow_up.service_end_time.to_s %>
53
60
  </div>
54
61
  </div>
55
62
  <br>
@@ -0,0 +1,111 @@
1
+ <div class="layuimini-main" style="height: 100%;">
2
+
3
+ <div class="layui-form layuimini-form" lay-filter="common_edit">
4
+ <fieldset class="table-search-fieldset">
5
+ <legend>添加字典</legend>
6
+ <div class="layui-form-item">
7
+ <label class="layui-form-label required">字典名称</label>
8
+ <div class="layui-input-block">
9
+ <%= select_tag"clazz" ,
10
+ options_for_select(EducodeSales::Common.clazzs.map{|d| d },
11
+ EducodeSales::Common.clazzs[@common.clazz]), {'lay-filter': 'clazz',
12
+ disabled: true} %>
13
+ </div>
14
+ </div>
15
+ <div class="layui-form-item">
16
+ <label class="layui-form-label required">选项名称</label>
17
+ <div class="layui-input-block">
18
+ <input type="text" name="name" autocomplete="off" lay-verify="required" lay-reqtext="选项名称不能为空" placeholder="请输入选项名称" value="" class="layui-input">
19
+ </div>
20
+ </div>
21
+ <hr>
22
+ <div class="layui-form-item">
23
+ <div class="layui-input-block">
24
+ <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确定添加</button>
25
+ </div>
26
+ </div>
27
+ </fieldset>
28
+ <h4 class="m-t-10">选项列表</h4>
29
+ <table class="layui-hide" id="edit_table" lay-filter="edit_table"></table>
30
+ </div>
31
+ </div>
32
+ <script type="text/html" id="edit_currentTableBar">
33
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">保存</a>
34
+ </script>
35
+ <script>
36
+ layui.use(['form', 'table', 'upload', 'laytpl', 'request'], function() {
37
+ var form = layui.form,
38
+ layer = layui.layer,
39
+ table = layui.table,
40
+ laytpl = layui.laytpl,
41
+ request = layui.request,
42
+ $ = layui.$;
43
+
44
+ form.render();
45
+
46
+ // 当前弹出层,防止ID被覆盖
47
+ var parentIndex = layer.index;
48
+
49
+ //监听提交
50
+ form.on('submit(saveBtn)', function(data) {
51
+
52
+ request.authPost("missions/commons", data.field, function(res) {
53
+ if (res.success == false) {
54
+ layer.alert(res.msg)
55
+ } else {
56
+ layer.alert('添加成功')
57
+ form.val('common_edit', {
58
+ 'name': ''
59
+ })
60
+ parent.layer.close(parent.layer.getFrameIndex(window.name))
61
+ parent.table.reload('table')
62
+ table.reload('edit_table')
63
+ }
64
+ })
65
+ return false;
66
+ });
67
+
68
+ table.render({
69
+ elem: '#edit_table',
70
+ url: '/missions/commons/' + parent.commont_id,
71
+ cols: [
72
+ [{
73
+ field: 'id',
74
+ width: 80,
75
+ title:'序号',type: 'numbers',
76
+ sort: true
77
+ }, {
78
+ field: 'name',
79
+ width: 300,
80
+ title: '选项名称',
81
+ edit: true
82
+ }, {
83
+ field: 'position',
84
+ width: 100,
85
+ title: '位置',
86
+ edit: true
87
+ }, {
88
+ title: '操作',
89
+ minWidth: 150,
90
+ toolbar: '#edit_currentTableBar',
91
+ }]
92
+ ]
93
+ });
94
+
95
+ table.on('tool(edit_table)', function (obj) {
96
+ var data = obj.data;
97
+ if (obj.event === 'edit') {
98
+ request.authPut('missions/commons/' + data.id, data,
99
+ function(res) {
100
+ if (res.success) {
101
+ table.reload('edit_table')
102
+ } else {
103
+ layer.alert(res.msg)
104
+ }
105
+
106
+ })
107
+ }
108
+ });
109
+
110
+ });
111
+ </script>
File without changes
@@ -0,0 +1,13 @@
1
+ json.data do
2
+ i = 0
3
+ json.array! @commons do |d|
4
+ i += 1
5
+ json.i i
6
+ json.id d.id
7
+ json.name EducodeSales::Common.where(clazz: d.clazz).pluck(:name).join("、")
8
+ json.clazz d.clazz
9
+ end
10
+ end
11
+
12
+ json.code 0
13
+ json.count @commons.total_count
@@ -0,0 +1,58 @@
1
+ <div class="layuimini-main" style="height: 100%;">
2
+
3
+ <div class="layui-form layuimini-form">
4
+ <div class="layui-form-item">
5
+ <label class="layui-form-label required">字典名称</label>
6
+ <div class="layui-input-block">
7
+ <%= select_tag "clazz", options_for_select(EducodeSales::Common.clazzs.map{|d| d }), {'lay-filter': 'clazz'} %>
8
+ </div>
9
+ </div>
10
+ <div class="layui-form-item">
11
+ <label class="layui-form-label required">选项名称</label>
12
+ <div class="layui-input-block">
13
+ <input type="text" name="name" autocomplete="off" lay-verify="required" lay-reqtext="选项名称不能为空"
14
+ placeholder="请输入选项名称" value="" class="layui-input">
15
+ </div>
16
+ </div>
17
+ <hr>
18
+ <div class="layui-form-item">
19
+ <div class="layui-input-block">
20
+ <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ </div>
25
+
26
+ <script>
27
+ layui.use(['form', 'table', 'upload', 'laytpl', 'request'], function () {
28
+ var form = layui.form,
29
+ layer = layui.layer,
30
+ table = layui.table,
31
+ laytpl = layui.laytpl,
32
+ request = layui.request,
33
+ $ = layui.$;
34
+
35
+ form.render();
36
+
37
+ // 当前弹出层,防止ID被覆盖
38
+ var parentIndex = layer.index;
39
+
40
+ //监听提交
41
+ form.on('submit(saveBtn)', function (data) {
42
+
43
+ request.authPost("/missions/commons", data.field, function(res) {
44
+ if (res.success == false) {
45
+ alert(res.msg)
46
+ } else {
47
+ layer.close(parent.index);
48
+ parent.layer.close(parent.layer.getFrameIndex(window.name))
49
+ parent.table.reload('table')
50
+ }
51
+ })
52
+
53
+
54
+ return false;
55
+ });
56
+
57
+ });
58
+ </script>
@@ -0,0 +1,9 @@
1
+ json.data do
2
+ json.array! @commons do |d|
3
+ json.id d.id
4
+ json.name d.name
5
+ json.position d.position
6
+ end
7
+ end
8
+
9
+ json.code 0
@@ -84,13 +84,19 @@
84
84
  <% if can? :read, EducodeSales::SalePlan %>
85
85
  <dd><a href="/missions/plans" class="<%= current?('layui-this', plans_path) %>"><i style="padding-right: 35px"></i><%= image_tag "educode_sales/6.销售计划.png",size:"15"%><i style="font-size: 25px; padding-right: 15px"></i>销售计划</a></dd>
86
86
  <% end %>
87
+ <!-- <dd>-->
88
+ <!-- <a href="/missions/results" class="<%#= current?('layui-this', results_path) %>"><i style="padding-right: 35px"></i><%#= image_tag "educode_sales/6.销售计划.png", size: "15" %>-->
89
+ <!-- <i style="font-size: 25px; padding-right: 15px"></i>绩效考核</a></dd>-->
87
90
  <% if @current_admin.is_admin %>
88
- <dd><a href="/missions/recycles" class="<%= current?('layui-this', recycles_path) %>"><i style="padding-right: 35px"></i><%= image_tag "educode_sales/回收站.png",size:"15"%><i style="font-size: 25px; padding-right: 15px"></i>回收站</a></dd>
89
- <%end %>
91
+ <dd>
92
+ <a href="/missions/recycles" class="<%= current?('layui-this', recycles_path) %>"><i style="padding-right: 35px"></i><%= image_tag "educode_sales/回收站.png", size: "15" %>
93
+ <i style="font-size: 25px; padding-right: 15px"></i>回收站</a></dd>
94
+ <% end %>
90
95
  </dl>
91
96
  </li>
92
97
  <li class="layui-nav-item layui-nav-itemed menu-li">
93
- <a class="" href="javascript:;"><b><%= image_tag "educode_sales/7.运营活动.png",size:"15"%><i style="font-size: 25px; padding-right: 25px"></i>运营活动</b></a>
98
+ <a class="" href="javascript:;"><b><%= image_tag "educode_sales/7.运营活动.png", size: "15" %>
99
+ <i style="font-size: 25px; padding-right: 25px"></i>运营活动</b></a>
94
100
  <dl class="layui-nav-child">
95
101
  <% if can? :read, EducodeSales::OperationTrend %>
96
102
  <dd>
data/config/routes.rb CHANGED
@@ -162,7 +162,6 @@ EducodeSales::Engine.routes.draw do
162
162
  end
163
163
  end
164
164
 
165
-
166
165
  resources :import_teachers
167
166
 
168
167
  resources :upload_files do
@@ -173,6 +172,13 @@ EducodeSales::Engine.routes.draw do
173
172
  member do
174
173
  end
175
174
  end
175
+ resources :results do
176
+ collection do
177
+ end
178
+
179
+ member do
180
+ end
181
+ end
176
182
 
177
183
  resources :teachers do
178
184
  collection do
@@ -0,0 +1,6 @@
1
+ class AddServiceStartTimeToFollowUps < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :educode_sales_follow_ups, :service_start_time, :date
4
+ add_column :educode_sales_follow_ups, :service_end_time, :date
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class AddServiceTimeLongToFollowUps < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :educode_sales_follow_ups, :service_time_long, :integer
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '0.7.2'
2
+ VERSION = '0.7.3'
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.7.2
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - anke1460
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-18 00:00:00.000000000 Z
11
+ date: 2022-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -153,6 +153,7 @@ files:
153
153
  - app/controllers/educode_sales/places_controller.rb
154
154
  - app/controllers/educode_sales/plans_controller.rb
155
155
  - app/controllers/educode_sales/recycles_controller.rb
156
+ - app/controllers/educode_sales/results_controller.rb
156
157
  - app/controllers/educode_sales/roles_controller.rb
157
158
  - app/controllers/educode_sales/sale_reports_controller.rb
158
159
  - app/controllers/educode_sales/sale_trends_controller.rb
@@ -196,6 +197,7 @@ files:
196
197
  - app/models/educode_sales/place.rb
197
198
  - app/models/educode_sales/place_area.rb
198
199
  - app/models/educode_sales/recycle.rb
200
+ - app/models/educode_sales/result.rb
199
201
  - app/models/educode_sales/role.rb
200
202
  - app/models/educode_sales/role_area.rb
201
203
  - app/models/educode_sales/role_permission.rb
@@ -329,6 +331,11 @@ files:
329
331
  - app/views/educode_sales/recycles/monthly.json.jbuilder
330
332
  - app/views/educode_sales/recycles/weekPlan.json.jbuilder
331
333
  - app/views/educode_sales/recycles/weekly.json.jbuilder
334
+ - app/views/educode_sales/results/edit.html.erb
335
+ - app/views/educode_sales/results/index.html.erb
336
+ - app/views/educode_sales/results/index.json.jbuilder
337
+ - app/views/educode_sales/results/new.html.erb
338
+ - app/views/educode_sales/results/show.json.jbuilder
332
339
  - app/views/educode_sales/roles/edit.html.erb
333
340
  - app/views/educode_sales/roles/index.html.erb
334
341
  - app/views/educode_sales/roles/index.json.jbuilder
@@ -422,6 +429,8 @@ files:
422
429
  - db/migrate/20220121060006_create_educode_sales_business_export_records.rb
423
430
  - db/migrate/20220125013811_create_educode_sales_staff_schools.rb
424
431
  - db/migrate/20220125033552_create_educode_sales_customer_adds.rb
432
+ - db/migrate/20220314053856_add_service_start_time_to_follow_ups.rb
433
+ - db/migrate/20220314074354_add_service_time_long_to_follow_ups.rb
425
434
  - lib/educode_sales.rb
426
435
  - lib/educode_sales/engine.rb
427
436
  - lib/educode_sales/version.rb