educode_sales 0.9.91 → 0.9.92

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.
Files changed (25) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/educode_sales/indexlogo.png +0 -0
  3. data/app/controllers/educode_sales/contracts_controller.rb +15 -0
  4. data/app/controllers/educode_sales/sale_trends_controller.rb +21 -4
  5. data/app/helpers/educode_sales/sale_trends_helper.rb +16 -6
  6. data/app/views/educode_sales/businesses/_contract.html.erb +2 -2
  7. data/app/views/educode_sales/businesses/_contract_list.html.erb +1 -1
  8. data/app/views/educode_sales/businesses/contract.html.erb +2 -2
  9. data/app/views/educode_sales/businesses/edit_follow_record.html.erb +14 -14
  10. data/app/views/educode_sales/businesses/index.html.erb +1 -1
  11. data/app/views/educode_sales/businesses/new_follow_record.html.erb +15 -14
  12. data/app/views/educode_sales/businesses/show_follow.html.erb +1 -1
  13. data/app/views/educode_sales/businesses/show_follow_record.html.erb +1 -1
  14. data/app/views/educode_sales/contracts/_list.html.erb +1 -1
  15. data/app/views/educode_sales/contracts/product_list.html.erb +34 -1
  16. data/app/views/educode_sales/contracts/show_follow_record.html.erb +1 -1
  17. data/app/views/educode_sales/customers/index.json.jbuilder +2 -14
  18. data/app/views/educode_sales/customers/list.html.erb +6 -1
  19. data/app/views/educode_sales/customers/list.json.jbuilder +3 -0
  20. data/app/views/educode_sales/sale_trends/_goal_forecast.html.erb +2 -14
  21. data/app/views/educode_sales/sale_trends/_sales_analysis.html.erb +13 -1
  22. data/config/routes.rb +1 -0
  23. data/db/migrate/20210902080918_create_educode_sales_follow_ups.rb +1 -1
  24. data/lib/educode_sales/version.rb +1 -1
  25. metadata +7 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb711cb66d6db0b32c6c7a79c5bc38e1fb277b6b0b1b0dcb82e656d13de8b182
4
- data.tar.gz: c22d6b9965826d1464f59316f9f1f50edb75b86ecb5cbe60636f06293b9a3a6d
3
+ metadata.gz: f1f92a8f48adc6b2fe56f49589a71871a393f2e069e6f604e26eb5724b9633dd
4
+ data.tar.gz: ab873e20d22410705bb24409c4992546383b23cebfc624c8f3af7d22305e65a6
5
5
  SHA512:
6
- metadata.gz: 13102675d29578ec7dfdd1f410744079b543db7a39e0406d936ff27f962f56826d06e7b9c506dfce137e0a3a875351b319a811a227d05012f2fe4725b7510adf
7
- data.tar.gz: 026bc860c82d11b845947de3be099b6dbc248b777a94ef479022da16018d55e763d2c060f54b91f6baa8028ab2564f4af5616134d304339654ab78f79322a204
6
+ metadata.gz: b3b1a7efe2acfebe6d81ec7a43c37ee352fb7482e0e39eedea0712079a7b2cb5f5671760b3ed8aa467ac0cd267f2d1ae4089ce8eebd394b6fdf848619d3bdce1
7
+ data.tar.gz: 7179df8352ade2a5cfb693987063be2332a98fbe8aef723ea140bb3018d7fded90a07c791df0ef3e2e5d875209187f43abb0afbce060f5400b8430a4b58eccef
@@ -491,6 +491,21 @@ module EducodeSales
491
491
  end
492
492
  end
493
493
 
494
+
495
+ def upload_products
496
+ xlsx = Roo::Spreadsheet.open(params[:file])
497
+ ods = xlsx.sheet(0)
498
+ rows = ods.last_row - 1
499
+ i = 0
500
+ rows.times do |r| #行数
501
+ i += 1
502
+ next unless ods.row(r+1)[0]
503
+ EducodeSales::ProductCatalog.create(name: ods.row(r+1)[0].to_s.strip, item_clazz: ods.row(r+1)[1].to_s.strip, brand: ods.row(r+1)[2].to_s.strip, specification: ods.row(r+1)[3].to_s.strip, unit: ods.row(r+1)[4].to_s.strip, param: ods.row(r+1)[5].to_s.strip, source_method: ods.row(r+1)[6].to_s.strip, supplier: ods.row(r+1)[7].to_s.strip)
504
+ end
505
+
506
+ render json: { succcess: true}
507
+ end
508
+
494
509
  private
495
510
  def follow_up_params
496
511
  params.permit(:o_business_deployment, :plan_signed_date, :bidded_days, :signed_date, :signed_department_id, :service_years, :service_start_time, :service_end_time, :funding_source, :signed_clazz)
@@ -173,7 +173,7 @@ module EducodeSales
173
173
  def sales_analysis
174
174
  respond_to do |format|
175
175
  format.html do
176
-
176
+
177
177
  end
178
178
  format.js do
179
179
  x = EducodeSales::Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
@@ -185,6 +185,10 @@ module EducodeSales
185
185
  goal_default_dates = ("#{Time.now.year}-01-01".to_date.."#{Time.now.year}-#{Time.now.month}-01".to_date).map { |d| d.strftime("%Y-%m") }.uniq
186
186
  sale_names = ['已中标', '已签单', '已回款']
187
187
 
188
+ common = Common.find_by(clazz: 'staff_type', name: '销售')
189
+ staffs = Staff.joins(:user).where(job_type: common.id).where.not(role_id: 11)
190
+ @staffs = staffs.map { |d| [d.user.real_name, d.id]}
191
+
188
192
  if params[:goal_count_range].present?
189
193
  case params[:goal_count_range]
190
194
  when "week"
@@ -482,7 +486,20 @@ module EducodeSales
482
486
  begin_at = range[0]
483
487
  end_at = range[1]
484
488
 
485
- data_1 = EducodeSales::Business.joins(:last_follow_up).
489
+ business = EducodeSales::Business.joins(:last_follow_up)
490
+ if params[:sales_staff_id].present?
491
+ # 销售经理
492
+ business = business.joins("LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = educode_sales_businesses.last_follow_up_id").
493
+ where("(educode_sales_assign_follow_ups.id IS NOT NULL AND educode_sales_assign_follow_ups.staff_id = ?) OR (educode_sales_assign_follow_ups.id IS NULL AND educode_sales_businesses.staff_id = ?)", params[:sales_staff_id], params[:sales_staff_id])
494
+
495
+ end
496
+
497
+ if params[:property].present?
498
+ # 客户类型
499
+ business = business.joins(department: [school: :school_tags]).where("school_tags.id = ?", params[:property])
500
+ end
501
+
502
+ data_1 = business.
486
503
  where("educode_sales_follow_ups.clazz_id != ?", x).
487
504
  where("educode_sales_follow_ups.stage_id IN (?)", stage_ids).
488
505
  where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ?", begin_at, end_at).
@@ -507,7 +524,7 @@ module EducodeSales
507
524
  last_month = month.split("-")[0]
508
525
  end
509
526
 
510
- data_2 = EducodeSales::Business.joins(:last_follow_up).
527
+ data_2 = business.
511
528
  where("educode_sales_follow_ups.clazz_id != ?", x).
512
529
  where("educode_sales_follow_ups.stage_id IN (?)", s_stage_ids).
513
530
  where("educode_sales_follow_ups.signed_date >= ? AND educode_sales_follow_ups.signed_date <= ?", begin_at, end_at).
@@ -532,7 +549,7 @@ module EducodeSales
532
549
  last_month = month.split("-")[0]
533
550
  end
534
551
 
535
- data_3 = EducodeSales::Business.joins(last_follow_up: :money_plans).
552
+ data_3 = business.joins(last_follow_up: :money_plans).
536
553
  where("educode_sales_follow_ups.clazz_id != ?", x).
537
554
  where.not("educode_sales_money_plans.clazz!= ?", 1).
538
555
  where("educode_sales_money_plans.date_at >= ? AND educode_sales_money_plans.date_at <= ?", begin_at, end_at).
@@ -273,13 +273,18 @@ module EducodeSales
273
273
  end
274
274
  staff_id = staff_id.present? ? Array(staff_id) : nil
275
275
  data = Business.joins(:last_follow_up)
276
- .where("educode_sales_follow_ups.invitation_at >= ? and educode_sales_follow_ups.invitation_at <= ? #{staff_id.present? ? "AND educode_sales_follow_ups.staff_id in (#{staff_id.join(",")})" : ""}", start_time, end_time)
276
+ .where("educode_sales_follow_ups.invitation_at >= ? and educode_sales_follow_ups.invitation_at <= ?", start_time, end_time)
277
+ if staff_id.present?
278
+ data = data.joins("LEFT JOIN educode_sales_follow_ups AS last_follow_up ON educode_sales_businesses.last_follow_up_id = last_follow_up.id AND last_follow_up.deleted_at IS NULL
279
+ LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = last_follow_up.id").
280
+ where("(educode_sales_assign_follow_ups.id IS NOT NULL AND educode_sales_assign_follow_ups.staff_id = ?) OR (educode_sales_assign_follow_ups.id IS NULL AND educode_sales_businesses.staff_id = ?)", staff_id, staff_id)
281
+ end
277
282
  if property.present?
278
283
  data = data.joins(department: [school: :school_tags]).where("school_tags.id = ?", property)
279
284
  end
280
285
  case type
281
286
  when "week"
282
- data.select("educode_sales_follow_ups.*, yearweek(educode_sales_follow_ups.invitation_at) as week").group("yearweek(educode_sales_follow_ups.invitation_at)").sum(:budget_amount)
287
+ data.select("educode_sales_follow_ups.*, yearweek(educode_sales_follow_ups.invitation_at) as week").group("yearweek(educode_sales_follow_ups.invitation_at)").sum("educode_sales_follow_ups.budget_amount")
283
288
  when "quarter"
284
289
  data = data.select("educode_sales_follow_ups.*, quarter(educode_sales_follow_ups.invitation_at) as quarter, year(educode_sales_follow_ups.invitation_at) as year")
285
290
  data.group_by { |d| [d.year, d.quarter] }
@@ -287,7 +292,7 @@ module EducodeSales
287
292
  data = data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.invitation_at) as year, month(educode_sales_follow_ups.invitation_at) as month")
288
293
  data.group_by { |d| [d.year, d.month] }
289
294
  when "year"
290
- data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.invitation_at) as year").group("year(educode_sales_follow_ups.invitation_at)").sum(:budget_amount)
295
+ data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.invitation_at) as year").group("year(educode_sales_follow_ups.invitation_at)").sum("educode_sales_follow_ups.budget_amount")
291
296
  end
292
297
  end
293
298
 
@@ -315,13 +320,18 @@ module EducodeSales
315
320
  # actual_amount 合同额
316
321
  staff_id = staff_id.present? ? Array(staff_id) : nil
317
322
  data = Business.joins(:last_follow_up)
318
- .where("educode_sales_follow_ups.bidded_date >= ? and educode_sales_follow_ups.bidded_date <= ? #{staff_id.present? ? "AND educode_sales_follow_ups.staff_id in (#{staff_id.join(",")})" : ""}", start_time, end_time)
323
+ .where("educode_sales_follow_ups.bidded_date >= ? and educode_sales_follow_ups.bidded_date <= ? ", start_time, end_time)
324
+ if staff_id.present?
325
+ data = data.joins("LEFT JOIN educode_sales_follow_ups AS last_follow_up ON educode_sales_businesses.last_follow_up_id = last_follow_up.id AND last_follow_up.deleted_at IS NULL
326
+ LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = last_follow_up.id").
327
+ where("(educode_sales_assign_follow_ups.id IS NOT NULL AND educode_sales_assign_follow_ups.staff_id = ?) OR (educode_sales_assign_follow_ups.id IS NULL AND educode_sales_businesses.staff_id = ?)", staff_id, staff_id)
328
+ end
319
329
  if property.present?
320
330
  data = data.joins(department: [school: :school_tags]).where("school_tags.id = ?", property)
321
331
  end
322
332
  case type
323
333
  when "week"
324
- data.select("educode_sales_follow_ups.*, yearweek(educode_sales_follow_ups.bidded_date) as week").group("yearweek(educode_sales_follow_ups.bidded_date)").sum(:actual_amount)
334
+ data.select("educode_sales_follow_ups.*, yearweek(educode_sales_follow_ups.bidded_date) as week").group("yearweek(educode_sales_follow_ups.bidded_date)").sum("educode_sales_follow_ups.actual_amount")
325
335
  when "quarter"
326
336
  data = data.select("educode_sales_follow_ups.*, quarter(educode_sales_follow_ups.bidded_date) as quarter, year(educode_sales_follow_ups.bidded_date) as year")
327
337
  data.group_by { |d| [d.year, d.quarter] }
@@ -329,7 +339,7 @@ module EducodeSales
329
339
  data = data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.bidded_date) as year, month(educode_sales_follow_ups.bidded_date) as month")
330
340
  data.group_by { |d| [d.year, d.month] }
331
341
  when "year"
332
- data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.bidded_date) as year").group("year(educode_sales_follow_ups.bidded_date)").sum(:actual_amount)
342
+ data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.bidded_date) as year").group("year(educode_sales_follow_ups.bidded_date)").sum("educode_sales_follow_ups.actual_amount")
333
343
  end
334
344
  end
335
345
 
@@ -68,7 +68,7 @@
68
68
  </div>
69
69
  </div>
70
70
  <div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
71
- <label class="layui-form-label">招标时间</label>
71
+ <label class="layui-form-label">计划投标时间</label>
72
72
  <div class="layui-input-inline">
73
73
  <input type="text" class="layui-input" id="invitation_at" name="invitation_at" placeholder=" - " autocomplete="off">
74
74
  </div>
@@ -341,7 +341,7 @@
341
341
  {
342
342
  field: 'invitation_at',
343
343
  width: 105,
344
- title: '招标时间',
344
+ title: '计划投标时间',
345
345
  sort: true,
346
346
  hide: gon.filter.invitation_at
347
347
  },
@@ -78,7 +78,7 @@
78
78
  </div>
79
79
  </div>
80
80
  <div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
81
- <label class="layui-form-label">招标时间</label>
81
+ <label class="layui-form-label">计划投标时间</label>
82
82
  <div class="layui-input-inline">
83
83
  <input type="text" class="layui-input" id="invitation_at" name="invitation_at" placeholder=" - " autocomplete="off">
84
84
  </div>
@@ -68,7 +68,7 @@
68
68
  </div>
69
69
  </div>
70
70
  <div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
71
- <label class="layui-form-label">招标时间</label>
71
+ <label class="layui-form-label">计划投标时间</label>
72
72
  <div class="layui-input-inline">
73
73
  <input type="text" class="layui-input" id="invitation_at" name="invitation_at" placeholder=" - " autocomplete="off">
74
74
  </div>
@@ -341,7 +341,7 @@
341
341
  {
342
342
  field: 'invitation_at',
343
343
  width: 105,
344
- title: '招标时间',
344
+ title: '计划投标时间',
345
345
  sort: true,
346
346
  hide: gon.filter.invitation_at
347
347
  },
@@ -30,12 +30,12 @@
30
30
  <div class="layui-inline">
31
31
  <label class="layui-form-label required">项目阶段</label>
32
32
  <div class="layui-input-inline">
33
- <%= select_tag "stage_id", options_for_select(@stages, @follow_up.stage_id), class: 'required' %>
33
+ <%= select_tag "stage_id", options_for_select(@stages, @follow_up.stage_id), { 'lay-filter': 'stage_id', class: 'required' } %>
34
34
  </div>
35
35
  </div>
36
36
  <br>
37
37
  <div class="layui-inline">
38
- <label class="layui-form-label">招标时间</label>
38
+ <label class="layui-form-label">计划投标时间</label>
39
39
  <div class="layui-input-inline">
40
40
  <input type="text" class="layui-input" value="<%= @follow_up.invitation_at %>" name="invitation_at"
41
41
  id="invitation_at_edit" placeholder="请选择日期">
@@ -194,25 +194,25 @@
194
194
  <script>
195
195
  layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate', 'xmSelect'], function () {
196
196
  var form = layui.form,
197
- layer = layui.layer,
198
- table = layui.table,
199
- xmSelect = layui.xmSelect,
200
- laytpl = layui.laytpl,
201
- request = layui.request,
202
- laydate = layui.laydate,
203
- $ = layui.$;
197
+ layer = layui.layer,
198
+ table = layui.table,
199
+ xmSelect = layui.xmSelect,
200
+ laytpl = layui.laytpl,
201
+ request = layui.request,
202
+ laydate = layui.laydate,
203
+ $ = layui.$;
204
204
 
205
205
  flag =
206
- <%=@follow_up&.clazz_id == EducodeSales::Common.where(extras: EducodeSales::Common::OTYPE).first&.id %>
206
+ <%=@follow_up&.stage_id == EducodeSales::Common.where(name:"已签单").first&.id %>
207
207
  if (flag) {
208
208
  $(".service_show").removeClass('layui-hide')
209
209
  $(".deployment_type").removeClass('layui-hide')
210
210
  }
211
211
 
212
- form.on('select(clazz_id)', function (data) {
212
+ form.on('select(stage_id)', function (data) {
213
213
  console.log(data.value)
214
214
  const value = data.value;
215
- if (value == <%= EducodeSales::Common.where(extras: EducodeSales::Common::OTYPE).first&.id %>) {
215
+ if (value == <%= EducodeSales::Common.where(name: "已签单").first&.id %>) {
216
216
  $(".service_show").removeClass('layui-hide')
217
217
  $(".deployment_type").removeClass('layui-hide')
218
218
  } else {
@@ -315,12 +315,12 @@
315
315
 
316
316
  form.render();
317
317
  form.on('submit(update_follow_up)', function (data) {
318
- if (data.field.clazz_id == <%= EducodeSales::Common.where(extras: EducodeSales::Common::OTYPE).first&.id %>) {
318
+ if (data.field.stage_id == <%= EducodeSales::Common.where(name: "已签单").first&.id %>) {
319
319
  if (data.field.service_time.length == 0) {
320
320
  layer.msg('请选择服务期', {time: 2000, icon: 2, shade: 0.01});
321
321
  return false;
322
322
  }
323
- if (data.field.o_business_deployment === ''){
323
+ if (data.field.o_business_deployment === '') {
324
324
  layer.msg('请选择部署类型');
325
325
  return false // 退出添加该条记录
326
326
  }
@@ -80,7 +80,7 @@
80
80
  </div>
81
81
  </div>
82
82
  <div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
83
- <label class="layui-form-label">招标时间</label>
83
+ <label class="layui-form-label">计划投标时间</label>
84
84
  <div class="layui-input-inline">
85
85
  <input type="text" class="layui-input" id="invitation_at" name="invitation_at" placeholder=" - " autocomplete="off">
86
86
  </div>
@@ -34,12 +34,12 @@
34
34
  <div class="layui-inline">
35
35
  <label class="layui-form-label required">项目阶段</label>
36
36
  <div class="layui-input-inline">
37
- <%= select_tag "stage_id", options_for_select(@stages, @last_follow_up&.stage_id), class: 'required' %>
37
+ <%= select_tag "stage_id", options_for_select(@stages, @last_follow_up&.stage_id), { 'lay-filter': 'stage_id', class: 'required', } %>
38
38
  </div>
39
39
  </div>
40
40
  <br>
41
41
  <div class="layui-inline">
42
- <label class="layui-form-label">招标时间</label>
42
+ <label class="layui-form-label">计划投标时间</label>
43
43
  <div class="layui-input-inline">
44
44
  <input type="text" class="layui-input" name="invitation_at" autocomplete="off" id="invitation_at_add"
45
45
  value="<%= @last_follow_up&.invitation_at %>"
@@ -195,25 +195,26 @@
195
195
  <script>
196
196
  layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate', 'xmSelect'], function () {
197
197
  var form = layui.form,
198
- layer = layui.layer,
199
- table = layui.table,
200
- laytpl = layui.laytpl,
201
- request = layui.request,
202
- laydate = layui.laydate,
203
- xmSelect = layui.xmSelect,
204
- $ = layui.$;
198
+ layer = layui.layer,
199
+ table = layui.table,
200
+ laytpl = layui.laytpl,
201
+ request = layui.request,
202
+ laydate = layui.laydate,
203
+ xmSelect = layui.xmSelect,
204
+ $ = layui.$;
205
205
 
206
- flag = <%=@last_follow_up&.clazz&.name == @o_name %>
206
+ flag =
207
+ <%=@last_follow_up&.stage_id == EducodeSales::Common.where(name:"已签单").first&.id %>
207
208
  if (flag) {
208
209
  console.log(flag)
209
210
  $(".service_show").removeClass('layui-hide')
210
211
  $(".deployment_type").removeClass('layui-hide')
211
212
  }
212
213
 
213
- form.on('select(clazz_id)', function (data) {
214
+ form.on('select(stage_id)', function (data) {
214
215
  console.log(data.value)
215
216
  const value = data.value;
216
- if (value == <%= EducodeSales::Common.where(extras: EducodeSales::Common::OTYPE).first&.id %>) {
217
+ if (value == <%= EducodeSales::Common.where(name: "已签单").first&.id %>) {
217
218
  $(".service_show").removeClass('layui-hide')
218
219
  $(".deployment_type").removeClass('layui-hide')
219
220
  } else {
@@ -317,12 +318,12 @@
317
318
  form.render();
318
319
 
319
320
  form.on('submit(add_follow_up)', function (data) {
320
- if (data.field.clazz_id == <%= EducodeSales::Common.where(extras: EducodeSales::Common::OTYPE).first&.id %>) {
321
+ if (data.field.stage_id == <%= EducodeSales::Common.where(name: "已签单").first&.id %>) {
321
322
  if (data.field.service_time.length == 0) {
322
323
  layer.msg('请选择服务期', {time: 2000, icon: 2, shade: 0.01});
323
324
  return false;
324
325
  }
325
- if (data.field.o_business_deployment === ''){
326
+ if (data.field.o_business_deployment === '') {
326
327
  layer.msg('请选择部署类型', {time: 2000, icon: 2, shade: 0.01});
327
328
  return false // 退出添加该条记录
328
329
  }
@@ -157,7 +157,7 @@
157
157
  {
158
158
  field: 'invitation_at',
159
159
  width: 110,
160
- title: '招标时间',
160
+ title: '计划投标时间',
161
161
  },
162
162
  {
163
163
  field: 'bidded_date',
@@ -36,7 +36,7 @@
36
36
  </div>
37
37
  <br>
38
38
  <div class="layui-inline">
39
- <label class="layui-form-label">招标时间:</label>
39
+ <label class="layui-form-label">计划投标时间:</label>
40
40
  <div class="layui-input-inline">
41
41
  <%= @follow_up.invitation_at.to_s %>
42
42
  </div>
@@ -316,7 +316,7 @@
316
316
  {
317
317
  field: 'invitation_at',
318
318
  width: 105,
319
- title: '招标时间',
319
+ title: '计划投标时间',
320
320
  sort: true,
321
321
  },
322
322
  {
@@ -38,13 +38,15 @@
38
38
  </script>
39
39
 
40
40
  <script type="text/html" id="toolbar">
41
+ <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" id="upload_product_btn" style="margin-left: 20px;">批量导入产品目录</button>
41
42
  <% if can? :new_product_catalog, EducodeSales::Business %>
42
43
  <a class="layui-btn layui-btn-primary layui-border-green layui-btn-sm pull-right" lay-event="add_product">添加产品目录</a>
43
44
  <% end %>
45
+
44
46
  </script>
45
47
 
46
48
  <script>
47
- layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate', 'dropdown', 'laytpl', 'xmSelect'],
49
+ layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate', 'dropdown', 'laytpl', 'xmSelect', 'upload'],
48
50
  function() {
49
51
  var $ = layui.jquery,
50
52
  form = layui.form,
@@ -52,6 +54,7 @@
52
54
  miniPage = layui.miniPage,
53
55
  dropdown = layui.dropdown,
54
56
  xmSelect = layui.xmSelect,
57
+ upload = layui.upload,
55
58
  laydate = layui.laydate;
56
59
  var openWH = miniPage.getOpenWidthHeight();
57
60
  var data = form.val("search_form");
@@ -127,7 +130,37 @@
127
130
  limits: [10, 15, 20, 30, 40, 50, 60, 70, 80, 90],
128
131
  page: true,
129
132
  skin: 'line',
133
+ done: function() {
134
+ if ($('#upload_product_btn').length > 0) {
135
+ uploadProduct();
136
+ }
137
+ }
130
138
  });
139
+
140
+ function uploadProduct() {
141
+ upload.render({
142
+ elem: '#upload_product_btn'
143
+ ,url: '/missions/contracts/upload_products'
144
+ ,accept: 'file' //普通文件
145
+ ,acceptMime: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,application/vnd.ms-excel'
146
+ ,headers: {
147
+ 'X-CSRF-Token': $('meta[name=csrf-token]').attr('content')
148
+ }
149
+ ,before: function(obj){
150
+ layer.load();
151
+ }
152
+ ,done: function(res){
153
+ layer.msg('导入成功');
154
+ table.reload('contact_product_table');
155
+ layer.closeAll('loading'); //关闭loading
156
+ }
157
+ ,error: function(index, upload){
158
+ table.reload('file');
159
+ layer.closeAll('loading'); //关闭loading
160
+ layer.alert('导入失败,请检查文件格式')
161
+ }
162
+ });
163
+ }
131
164
  var sort = {},
132
165
  search = data;
133
166
  table.on('sort(contact_product_table)', function(obj) {
@@ -36,7 +36,7 @@
36
36
  </div>
37
37
  <br>
38
38
  <div class="layui-inline">
39
- <label class="layui-form-label" style="width: 160px;">招标时间:</label>
39
+ <label class="layui-form-label" style="width: 160px;">计划投标时间:</label>
40
40
  <div class="layui-input-inline">
41
41
  <%= @follow_up.invitation_at.to_s %>
42
42
  </div>
@@ -1,4 +1,5 @@
1
1
  x = EducodeSales::Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
2
+ o = EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.id
2
3
  json.data do
3
4
  json.array! @customers do |d|
4
5
  business_ids = EducodeSales::Business.where(school_id: d.id).ids
@@ -14,23 +15,10 @@ json.data do
14
15
  json.id d.id
15
16
  json.name d.name
16
17
  json.area d.province
17
- # school_property = d.school_property
18
- # property = []
19
- # if school_property.present?
20
- # # property << '985工程' if school_property.project_985
21
- # # property << '211工程' if school_property.project_211
22
- # property << '本科院校' if school_property.regular_college
23
- # property << '大专院校' if school_property.junior_college
24
- # property << '中专学校' if school_property.secondary_school
25
- # property << '军事院校' if school_property.military_school
26
- # property << '企业' if school_property.enterprise
27
- # property << '小学' if school_property.ele_school
28
- # property << '中学' if school_property.mid_school
29
- # property << '其他' if school_property.other
30
- # end
31
18
  json.property d.school_tags.where(for_missions: true).pluck(:name).join("、")
32
19
  json.department d.departments.size
33
20
  json.business EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_businesses.school_id = ?", d.id).size
21
+ json.o_business EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id = ?", o).where("educode_sales_businesses.school_id = ?", d.id).size
34
22
  json.follow follow_ups.size + customer_follows.size
35
23
  json.staff EducodeSales::CustomerExtension.find_by(school_id: d.id)&.customer_staff&.user&.real_name
36
24
  end
@@ -181,13 +181,18 @@
181
181
  width: 160,
182
182
  title: '性质',
183
183
  },
184
-
184
+
185
185
  {
186
186
  field: 'business',
187
187
  width: 60,
188
188
  title: '商机',
189
189
  templet: "#business"
190
190
  },
191
+ {
192
+ field: 'o_business',
193
+ width: 60,
194
+ title: '签单'
195
+ },
191
196
  {
192
197
  field: 'follow',
193
198
  width: 100,
@@ -1,4 +1,5 @@
1
1
  x = EducodeSales::Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
2
+ o = EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.id
2
3
  json.data do
3
4
  json.array! @customers do |d|
4
5
  if d['department_id']
@@ -23,8 +24,10 @@ json.data do
23
24
  json.property d.school_tags.where(for_missions: true).pluck(:name).join("、")
24
25
  if d['department_id']
25
26
  json.business EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_businesses.department_id = ?", d['department_id']).size
27
+ json.o_business EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id = ?", o).where("educode_sales_businesses.department_id = ?", d['department_id']).size
26
28
  else
27
29
  json.business EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_businesses.school_id = ?", d.id).size
30
+ json.o_business EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id = ?", o).where("educode_sales_businesses.school_id = ?", d.id).size
28
31
  end
29
32
  json.unit "#{d.name}---#{d['department_name']}"
30
33
 
@@ -135,25 +135,13 @@
135
135
  var forecast_myChart2 = new Chart(ctx, {
136
136
  type: 'bar',
137
137
  data: <%=raw @forecast_count_data_0.to_json %>,
138
- options: {
139
- elements: {
140
- line: {
141
- tension: 0
142
- }
143
- }
144
- }
138
+ options: opt
145
139
  });
146
140
  var ctx = document.getElementById('forecast_myChart2_1');
147
141
  var forecast_myChart2_1 = new Chart(ctx, {
148
142
  type: 'bar',
149
143
  data: <%=raw @forecast_count_data_1.to_json %>,
150
- options: {
151
- elements: {
152
- line: {
153
- tension: 0
154
- }
155
- }
156
- }
144
+ options: opt
157
145
  });
158
146
  form.render();
159
147
  form.on("submit(search_sales)", function (data) {
@@ -15,13 +15,25 @@
15
15
  <%= select_tag "goal_count_range", options_for_select([['按月','month'],['按年','year']],params[:goal_count_range]), {'lay-filter': 'goal_count'}%>
16
16
  </div>
17
17
  </div>
18
- <div class="layui-inline">
18
+ <div class="layui-inline m-t-10">
19
19
  <label class="layui-form-label">时间范围</label>
20
20
  <div class="layui-input-inline">
21
21
  <input type="text" class="layui-input goal_month " id="goal_date_month" name="goal_date_month" placeholder=" - " value="<%=params[:goal_date_month].present? ? params[:goal_date_month] : Time.now.year.to_s + "-01" + " - " + Time.now.strftime("%Y-%m") %>" autocomplete="off">
22
22
  <input type="text" class="layui-input goal_year layui-hide" id="goal_date_year" name="goal_date_year" placeholder=" - " value="<%=params[:goal_date_year] %>" autocomplete="off">
23
23
  </div>
24
24
  </div>
25
+ <div class="layui-inline m-t-10">
26
+ <label class="layui-form-label">销售人员</label>
27
+ <div class="layui-input-inline">
28
+ <%= select_tag "sales_staff_id", options_for_select(@staffs, params[:sales_staff_id]), {include_blank: true}%>
29
+ </div>
30
+ </div>
31
+ <div class="layui-inline m-t-10">
32
+ <label class="layui-form-label">客户类型</label>
33
+ <div class="layui-input-inline">
34
+ <%= select_tag "property", options_for_select(SchoolTag.where(for_missions: true).pluck(:name, :id), params[:property]), { include_blank: true } %>
35
+ </div>
36
+ </div>
25
37
  <div class="layui-inline">
26
38
  <button type="button" id="search_bt" class="goal_count_bt layui-btn layui-btn-primary" lay-submit lay-filter="search_sales">确定
27
39
  </button>
data/config/routes.rb CHANGED
@@ -38,6 +38,7 @@ EducodeSales::Engine.routes.draw do
38
38
  get :new_sales_detail
39
39
  get :select_product
40
40
  post :sales_detail
41
+ post :upload_products
41
42
  end
42
43
  member do
43
44
  post :advise
@@ -5,7 +5,7 @@ class CreateEducodeSalesFollowUps < ActiveRecord::Migration[5.2]
5
5
  t.references :staff
6
6
  t.integer :clazz_id, comment: '项目类型'
7
7
  t.integer :stage_id, comment: '项目阶段'
8
- t.date :invitation_at, comment: '招标时间'
8
+ t.date :invitation_at, comment: '计划投标时间'
9
9
  t.date :reception_at, comment: '验收时间'
10
10
  t.float :total_amount, comment: '总额'
11
11
  t.float :actual_amount, comment: '实际金额'
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '0.9.91'
2
+ VERSION = '0.9.92'
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.91
4
+ version: 0.9.92
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-16 00:00:00.000000000 Z
11
+ date: 2023-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -105,6 +105,7 @@ 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
108
109
  - app/assets/images/educode_sales/loading-0.gif
109
110
  - app/assets/images/educode_sales/loading-1.gif
110
111
  - app/assets/images/educode_sales/loading-2.gif
@@ -684,7 +685,7 @@ homepage: https://www.educoder.net
684
685
  licenses:
685
686
  - MIT
686
687
  metadata: {}
687
- post_install_message:
688
+ post_install_message:
688
689
  rdoc_options: []
689
690
  require_paths:
690
691
  - lib
@@ -699,8 +700,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
699
700
  - !ruby/object:Gem::Version
700
701
  version: '0'
701
702
  requirements: []
702
- rubygems_version: 3.0.0
703
- signing_key:
703
+ rubygems_version: 3.0.9
704
+ signing_key:
704
705
  specification_version: 4
705
706
  summary: Summary of EducodeSales.
706
707
  test_files: []