educode_sales 1.10.48 → 1.10.58

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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/educode_sales/modules/easyeditor/easyeditor.css +130 -0
  3. data/app/assets/stylesheets/educode_sales/modules/easyeditor/fangge-style.css +4 -0
  4. data/app/controllers/educode_sales/application_controller.rb +22 -0
  5. data/app/controllers/educode_sales/business_courses_controller.rb +255 -0
  6. data/app/controllers/educode_sales/businesses_controller.rb +43 -7
  7. data/app/controllers/educode_sales/contracts_controller.rb +6 -0
  8. data/app/controllers/educode_sales/home_controller.rb +7 -0
  9. data/app/controllers/educode_sales/money_plan_records_controller.rb +6 -2
  10. data/app/controllers/educode_sales/money_plans_controller.rb +3 -0
  11. data/app/controllers/educode_sales/sale_trends_controller.rb +1 -1
  12. data/app/controllers/educode_sales/shixun_dectects_controller.rb +172 -0
  13. data/app/controllers/educode_sales/shixuns_controller.rb +218 -0
  14. data/app/controllers/educode_sales/subject_trends_controller.rb +144 -0
  15. data/app/controllers/educode_sales/subjects_controller.rb +213 -0
  16. data/app/helpers/educode_sales/application_helper.rb +10 -0
  17. data/app/helpers/educode_sales/business_courses_helper.rb +60 -0
  18. data/app/helpers/educode_sales/sale_trends_helper.rb +52 -52
  19. data/app/helpers/educode_sales/subject_helper.rb +33 -0
  20. data/app/models/educode_sales/business.rb +22 -0
  21. data/app/models/educode_sales/business_deliver_subject.rb +49 -0
  22. data/app/models/educode_sales/business_subject.rb +68 -0
  23. data/app/models/educode_sales/business_subject_shixun.rb +75 -0
  24. data/app/models/educode_sales/business_subject_staff.rb +36 -0
  25. data/app/models/educode_sales/permission.rb +2 -1
  26. data/app/models/educode_sales/shixun_dectect.rb +12 -0
  27. data/app/views/educode_sales/business_courses/edit.html.erb +174 -0
  28. data/app/views/educode_sales/business_courses/index.html.erb +334 -0
  29. data/app/views/educode_sales/business_courses/index.json.jbuilder +16 -0
  30. data/app/views/educode_sales/business_courses/list_shixuns.html.erb +292 -0
  31. data/app/views/educode_sales/business_courses/list_shixuns.json.jbuilder +23 -0
  32. data/app/views/educode_sales/business_courses/list_subjects.html.erb +212 -0
  33. data/app/views/educode_sales/business_courses/list_subjects.json.jbuilder +17 -0
  34. data/app/views/educode_sales/business_courses/new.html.erb +237 -0
  35. data/app/views/educode_sales/businesses/index.html.erb +11 -9
  36. data/app/views/educode_sales/contracts/_list.html.erb +16 -1
  37. data/app/views/educode_sales/contracts/index.html.erb +5 -2
  38. data/app/views/educode_sales/contracts/list.js.erb +4 -1
  39. data/app/views/educode_sales/money_plan_records/_index.html.erb +21 -5
  40. data/app/views/educode_sales/money_plan_records/index.js.erb +4 -1
  41. data/app/views/educode_sales/money_plans/list.html.erb +6 -2
  42. data/app/views/educode_sales/sale_trends/_return_money_forecast.html.erb +1 -1
  43. data/app/views/educode_sales/sale_trends/_user_stat.html.erb +1 -1
  44. data/app/views/educode_sales/sale_trends/_visit_analysis.html.erb +1 -1
  45. data/app/views/educode_sales/sale_trends/return_money_forecast.js.erb +1 -1
  46. data/app/views/educode_sales/sale_trends/trends.html.erb +6 -6
  47. data/app/views/educode_sales/sale_trends/user_stat.js.erb +1 -1
  48. data/app/views/educode_sales/sale_trends/visit_analysis.js.erb +1 -1
  49. data/app/views/educode_sales/shixun_dectects/index.html.erb +516 -0
  50. data/app/views/educode_sales/shixun_dectects/index.json.jbuilder +23 -0
  51. data/app/views/educode_sales/shixun_dectects/markdown.html.erb +60 -0
  52. data/app/views/educode_sales/shixuns/edit.html.erb +208 -0
  53. data/app/views/educode_sales/shixuns/index.html.erb +723 -0
  54. data/app/views/educode_sales/shixuns/index.json.jbuilder +26 -0
  55. data/app/views/educode_sales/shixuns/new.html.erb +261 -0
  56. data/app/views/educode_sales/subject_trends/trends.html.erb +676 -0
  57. data/app/views/educode_sales/subjects/edit.html.erb +86 -0
  58. data/app/views/educode_sales/subjects/index.html.erb +285 -0
  59. data/app/views/educode_sales/subjects/index.json.jbuilder +16 -0
  60. data/app/views/educode_sales/subjects/list_shixuns.html.erb +354 -0
  61. data/app/views/educode_sales/subjects/list_shixuns.json.jbuilder +22 -0
  62. data/app/views/educode_sales/subjects/new.html.erb +254 -0
  63. data/app/views/layouts/educode_sales/application.html.erb +38 -0
  64. data/config/routes.rb +37 -0
  65. data/lib/educode_sales/version.rb +1 -1
  66. metadata +42 -7
  67. data/app/assets/images/educode_sales/indexlogo.png +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: da45d6ae994d92a3ef3274e654b591e9165ba976e765e2c8e09b786f7f0b5c05
4
- data.tar.gz: fe907bc45b55f7dbe5b454eb785693302f460622576a7a14cde80efc9cf3d293
3
+ metadata.gz: 666b9ec9b763cfce87df4b2b6a2304625100ba52d94df0cd806fe36266062b3c
4
+ data.tar.gz: 494c7222e60d7114c95cd6f213fd11bb5070e2b6f40d45bfdaa3fa880c7e4a0f
5
5
  SHA512:
6
- metadata.gz: 8dc1ac6fd68d7a04df6f28d39a74f565701600b25348c60a6586f3b8027f63b796132489e6f0dd37e4a896ee9241f44c5764ec5f4fb2e740b38033060c0ff10f
7
- data.tar.gz: b3b6130b8e98a8b5bdd05281af4f7faf27e690725de86337fec94abf974b8be798f8a451ed4f549affbe8e548bd66bd485b3f177a80b70e57f74f59c49459fe1
6
+ metadata.gz: 9cc7914ec32c5e3cda9fa353bf35ddba314450b75f7401d1063469ab4f10b117437a4a93392783ddd7049e21f6012b1faba947be5b05874fd4b235c327c553c4
7
+ data.tar.gz: c5276a5f2d6ea22604cea8d6f81acb320f8e8ec7975138741e8e5ab6326f7f368f210a9b983fa0ab48688709de0053ad923a1043eab701b3ab19dac08910c1fc
@@ -0,0 +1,130 @@
1
+
2
+ /* 全局 */
3
+ html,body{overflow-x: hidden;font-size: 16px;line-height: 1.6;}
4
+ /* html body{margin-top: 61px;} */
5
+ /*html{background-color: #F2F2F2;} */
6
+
7
+ i{font-style: normal;}
8
+ /* 图标 */
9
+ @font-face {font-family: "layui-icon-fly";
10
+ src: url('../../../../fonts/iconfont.eot?t=1512007250695'); /* IE9*/
11
+ src: url('../../../../fonts/iconfont.eot?t=1512007250695#iefix') format('embedded-opentype'), /* IE6-IE8 */
12
+ url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),
13
+ url('../../../../fonts/iconfont.ttf?t=1512007250695') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
14
+ url('../../../../fonts/iconfont.svg?t=1512007250695#iconfont') format('svg'); /* iOS 4.1- */
15
+ }
16
+
17
+ .iconfont {
18
+ font-family:"layui-icon-fly" !important;
19
+ font-size:16px;
20
+ font-style:normal;
21
+ -webkit-font-smoothing: antialiased;
22
+ -webkit-text-stroke-width: 0.2px;
23
+ -moz-osx-font-smoothing: grayscale;
24
+ }
25
+
26
+
27
+ /* 辅助 */
28
+ a:hover{color: #009688; transition: all .3s;}
29
+ /* pre{padding: 10px 15px; margin: 10px 0; font-size: 12px; border-left: 6px solid #009688; background-color: #f8f8f8; font-family: Courier New; overflow: auto;} */
30
+
31
+ .layui-container{padding: 0;}
32
+ .fly-main{width: 1079px; min-height: 600px; margin: 0 auto 15px;}
33
+ .layui-badge{height: 20px; line-height: 20px; border-radius: 2px;}
34
+
35
+ .fly-link{color: #01AAED;}
36
+ .fly-link:hover{color: #5FB878;}
37
+ .fly-grey{color: #999;}
38
+
39
+ .fly-msg, .fly-error{padding: 10px 15px; line-height: 24px;}
40
+ .fly-msg{background-color:#F8F8F8; color:#666;}
41
+ .fly-msg a{color:#4F99CF}
42
+ .fly-editbox{position: relative;}
43
+
44
+ .fly-marginTop{margin-top: 15px;}
45
+ .fly-mid{display: inline-block; height: 10px; width: 1px; margin: 0 10px; vertical-align: middle; background-color: #e2e2e2;}
46
+ .fly-right{position: absolute; right: 15px; top: 0;}
47
+
48
+ /* 过度 */
49
+ .fly-loading{position: absolute; top: 50%; left: 50%; margin: -12px 0 0 -15px; font-size: 30px; color: #c2c2c2;}
50
+
51
+ /* 简易编辑器 */
52
+ .fly-edit{position:relative; display: block; top: 0; left:0; padding:0 10px; border: 1px solid #e6e6e6; border-radius: 2px 2px 0 0; background-color: #FBFBFB;}
53
+ .fly-edit span{cursor:pointer; padding:0 10px; line-height: 38px;color:#1E9FFF;font-size: 18px;}
54
+ .fly-edit span i{position: relative; padding-right: 6px; font-size: 18px;}
55
+ .fly-edit span:hover{color: #009E94;}
56
+ .layui-textarea{height: 270px;}
57
+ /* markdown样式 */
58
+ .easyeditor-content p{
59
+ padding: 5px 0;
60
+ }
61
+
62
+ .easyeditor-content ul,
63
+ .easyeditor-content ol {
64
+ padding: 10px 15px;
65
+ }
66
+ .easyeditor-content ul:first-child,
67
+ .easyeditor-content ol:first-child {
68
+ margin-top: 0;
69
+ }
70
+ .easyeditor-content ul:last-child,
71
+ .easyeditor-content ol:last-child {
72
+ margin-bottom: 0;
73
+ }
74
+ .easyeditor-content ul li{margin-top: 5px;}
75
+ .easyeditor-content>ol li{list-style: decimal;margin-top: 5px;}
76
+ .easyeditor-content li{list-style: disc;}
77
+
78
+ .layui-table th{text-align: center;}
79
+
80
+ .easyeditor-content hr {
81
+ height: 2px;
82
+ padding: 0;
83
+ margin: 16px 0;
84
+ background-color: #e7e7e7;
85
+ border: 0 none;
86
+ overflow: hidden;
87
+ box-sizing: content-box;
88
+ }
89
+ /* 标题样式 */
90
+ .easyeditor-content > h1,
91
+ .easyeditor-content > h2,
92
+ .easyeditor-content > h3,
93
+ .easyeditor-content > h4,
94
+ .easyeditor-content > h5,
95
+ .easyeditor-content > h6 {
96
+ position: relative;
97
+ margin-top: 1rem;
98
+ margin-bottom: 1rem;
99
+ font-weight: bold;
100
+ line-height: 1.4;
101
+ cursor: text;
102
+ }
103
+
104
+
105
+ /* 单行列表 */
106
+ .fly-list-one .fly-panel-title{margin-bottom: 5px;}
107
+ .fly-list-one dd{margin: 0 15px; line-height: 26px; white-space: nowrap; overflow: hidden; list-style: decimal-leading-zero inside; *list-style-type: decimal inside; color: #009E94;}
108
+ .fly-list-one dd a,
109
+ .fly-list-one dd span{display: inline-block; *display: inline; *zoom: 1; vertical-align: top; font-style: normal}
110
+ .fly-list-one dd a{max-width: 85%; margin-right: 5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px;}
111
+ .fly-list-one dd span{font-size: 12px; color: #ccc;}
112
+ .fly-list-one dd:last-child{padding-bottom: 5px;}
113
+
114
+ /* 面板 */
115
+ .easyeditor-panel{margin-bottom: 15px; margin-top: 15px; background-color: #fff; box-shadow: 0 1px 2px 0 rgba(0,0,0,.05);}
116
+ .easyeditor-panel[pad20]{padding: 20px;}
117
+ .easyeditor-panel-title{position: relative; height: 50px; line-height: 50px; padding: 0 15px; border-bottom: 1px dotted #E9E9E9; color: #333; border-radius: 2px 2px 0 0; font-size: 14px;}
118
+ .easyeditor-panel-main{padding: 10px 15px;}
119
+ .easyeditor-panel-border{border: 1px solid #e6e6e6; box-shadow: none;}
120
+ .easyeditor-panel-border .easyeditor-panel-title{border-bottom: 1px solid #e6e6e6;}
121
+
122
+ /* Detail页 */
123
+ .detail-box{padding: 20px;}
124
+
125
+ body .layui-edit-face{ border:none; background:none;}
126
+ body .layui-edit-face .layui-layer-content{padding:0; background-color:#fff; color:#666; box-shadow:none}
127
+ .layui-edit-face .layui-layer-TipsG{display:none;}
128
+ .layui-edit-face ul{position:relative; width:372px; padding:10px; border:1px solid #D9D9D9; background-color:#fff; box-shadow: 0 0 20px rgba(0,0,0,.2);}
129
+ .layui-edit-face ul li{cursor: pointer; float: left; border: 1px solid #e8e8e8; height: 22px; width: 26px; overflow: hidden; margin: -1px 0 0 -1px; padding: 4px 2px; text-align: center;}
130
+ .layui-edit-face ul li:hover{position: relative; z-index: 2; border: 1px solid #eb7350; background: #fff9ec;}
@@ -0,0 +1,4 @@
1
+ .fly-edit span{cursor:pointer; padding:0 10px; line-height: 38px; height: 38px;width: 30px;color:#1E9FFF;font-size: 18px;border-right: 1px solid #e6e6e6;display: inline-block;text-align: center;}
2
+ .fly-right span:first-child{border-left: 1px solid #e6e6e6;}
3
+ .fly-right span:last-child{border-right: 0}
4
+ .fly-edit span:hover{color: #009E94;background-color: #f2f2f2;}
@@ -1,8 +1,30 @@
1
1
  module EducodeSales
2
2
  class ApplicationController < ActionController::Base
3
+ include ApplicationHelper
3
4
  protect_from_forgery with: :exception
4
5
  before_action :authenticate_request
5
6
 
7
+
8
+ def is_commissioner_above?
9
+ return true if @current_admin.is_admin?
10
+ ["销售总监", "副总", "生态运营总监", "方案总监", "售后总监", "课程组总监"].include? @current_admin.role.name
11
+ end
12
+
13
+ def subject_members
14
+ common = Common.find_by(clazz: 'staff_type', name: '课程')
15
+ @manages = Staff.joins(:user).where(job_type: common.id.to_i).where.not(role_id: 11).map { |d| {name: d.user.real_name, value: d.id}}
16
+ end
17
+
18
+ def subject_staffs
19
+ common = Common.find_by(clazz: 'staff_type', name: '销售')
20
+ @staffs = Staff.joins(:user).where(job_type: common.id).where.not(role_id: 11).map { |d| { value: d.id, name: d.name } }
21
+ end
22
+
23
+ def subject_url
24
+ @url = "https://data.educoder.net"
25
+ @admins_url = "https://data.educoder.net"
26
+ end
27
+
6
28
  def render_success
7
29
  render json: { success: true }
8
30
  end
@@ -0,0 +1,255 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EducodeSales
4
+
5
+ # 商机交付课程
6
+ class BusinessCoursesController < ApplicationController
7
+ include BusinessCoursesHelper
8
+ include? SubjectHelper
9
+ before_action :subject_members, :subject_url
10
+
11
+ def index
12
+ authorize! :business, BusinessDeliverSubject
13
+ respond_to do |format|
14
+ format.html do
15
+ end
16
+ format.json do
17
+ @business_deliver = BusinessDeliverSubject.all
18
+
19
+ unless is_commissioner_above?
20
+ business_ids = @business_deliver.pluck(:business_id)
21
+ last_follow_staff_business = Business.where(id: business_ids).joins(last_follow_up: [assign_follow_ups: [staff: :user]]).where("CONCAT(users.lastname, users.firstname) = '#{@current_admin.user.real_name}' ")
22
+
23
+ last_follow_staff_business_ids = last_follow_staff_business.pluck("educode_sales_businesses.id")
24
+ staff_business = Business.where(id: business_ids - last_follow_staff_business_ids).joins(staff: :user).where("CONCAT(users.lastname, users.firstname) = '#{@current_admin.user.real_name}' ")
25
+ @business_deliver = BusinessDeliverSubject.where(business_id: last_follow_staff_business_ids + staff_business.ids)
26
+ end
27
+
28
+ @business_deliver = @business_deliver.joins(business: [:school, :staff, :last_follow_up])
29
+
30
+ # 查询条件 交付状态 state == 0 代表全部
31
+ if params[:q] && params[:q][:state].present? && params[:q][:state] != '0'
32
+ @business_deliver = @business_deliver.where("educode_sales_business_deliver_subjects.status = :status", status: params[:q][:state])
33
+ end
34
+ # 查询条件 商机id
35
+ if params[:q] && params[:q][:name].present?
36
+ @business_deliver = @business_deliver.where("educode_sales_businesses.name like '%#{params[:q][:name]}%'")
37
+ end
38
+ # 查询条件 时间
39
+ if params[:q] && params[:q][:time].present?
40
+ start_time = params[:q][:time].split(" - ")[0]
41
+ end_time = params[:q][:time].split(" - ")[-1]
42
+ @business_deliver = @business_deliver.where("educode_sales_follow_ups.reception_at BETWEEN '#{start_time}' AND '#{end_time}' ")
43
+ end
44
+ # 分页查询
45
+ @business_deliver = @business_deliver.includes(business: [:school, :staff], business_subjects: :subject) \
46
+ .page(params[:page])
47
+ .per(params[:limit])
48
+ end
49
+ end
50
+ end
51
+
52
+ def edit
53
+ authorize! :business, BusinessDeliverSubject
54
+ if params[:id]
55
+ # 查询商机信息 和交付状态等
56
+ @item = BusinessDeliverSubject.joins(:business)
57
+ .select("educode_sales_businesses.name,
58
+ educode_sales_business_deliver_subjects.status,
59
+ educode_sales_business_deliver_subjects.id")
60
+ .find(params[:id])
61
+ # 查询课程是否已经有实践课程
62
+ @subjects = @item.business_subjects.pluck(:subject_id)
63
+ @subjects = Subject.where(id: @subjects).map { |item| { value: item[:id], name: item[:name] } }
64
+ gon.staffs = @manages
65
+
66
+ @value_list = BusinessSubjectStaff.where(container_type: BusinessSubjectStaff::CONTAINER_TYPES::BUSSINESS,
67
+ container_id: params[:id])
68
+ .select(:staff_id)
69
+ .map { |item| item[:staff_id] }
70
+
71
+ render layout: false
72
+ end
73
+ end
74
+
75
+ def update
76
+ authorize! :business, BusinessDeliverSubject
77
+ # 开启事务
78
+ ActiveRecord::Base.transaction do
79
+ @business = BusinessDeliverSubject.find_by(id: params[:id])
80
+ # 修改状态
81
+ if !@business.blank?
82
+ @business.update(params.require(:business).permit(:status))
83
+
84
+ old_subject_ids = @business.business_subjects.pluck(:subject_id)
85
+ new_subject_ids = params[:business][:subject_ids].split(',').map(&:to_i)
86
+
87
+ del_arr = old_subject_ids - new_subject_ids
88
+ # 需要新增的科目id
89
+ add_arr = new_subject_ids - old_subject_ids
90
+
91
+ @business.business_subjects.where(subject_id: del_arr).update_all(business_id: nil, business_deliver_subject_id: nil)
92
+
93
+ @business.add_subjects(add_arr)
94
+
95
+ @business.manages.destroy_all
96
+
97
+ BusinessSubjectStaff.bulk_insert(:staff_id, :container_id, :container_type, :created_at, :updated_at, :category) do |d|
98
+ params[:business][:manage_id].split(",").each do |m|
99
+ d.add [m.to_i, @business.id, BusinessSubjectStaff::CONTAINER_TYPES::BUSSINESS, Time.now, Time.now, BusinessSubjectStaff::CATEGORY_TYPES::BUSINESS_MANAGE]
100
+ end
101
+ end
102
+
103
+ render_success
104
+ else
105
+ render_failure("操作失败")
106
+ end
107
+ end
108
+ end
109
+
110
+ def new
111
+ authorize! :business, BusinessDeliverSubject
112
+ staffs = Staff.where.not(role_id: 11).includes(:user)
113
+ @businesses = Business
114
+ # 要求只能是已签单的商机
115
+ gon.stage_id = Common.where(clazz: '商机阶段', name: ['已签单']).pluck(:id)[0]
116
+ gon.staffs = @manages
117
+ render layout: false
118
+ end
119
+
120
+ def create
121
+ authorize! :business, BusinessDeliverSubject
122
+ # 开启事务
123
+ ActiveRecord::Base.transaction do
124
+ item = BusinessDeliverSubject.find_by(business_id: params[:business][:business_id])
125
+ # 判断是否存在 不存在进入下一步
126
+
127
+ if item.blank?
128
+ add_item = BusinessDeliverSubject.new(business_params)
129
+
130
+ add_item.add_subjects(params[:business][:subject_ids].split(",")) if add_item.save! && !params[:business][:subject_ids].blank?
131
+
132
+ BusinessSubjectStaff.bulk_insert(:staff_id, :container_id, :container_type, :created_at, :updated_at, :category) do |d|
133
+ params[:business][:manage_id].split(",").each do |m|
134
+ d.add [m.to_i, add_item.id, BusinessSubjectStaff::CONTAINER_TYPES::BUSSINESS, Time.now, Time.now, BusinessSubjectStaff::CATEGORY_TYPES::BUSINESS_MANAGE]
135
+ end
136
+ end
137
+
138
+ render_success
139
+ else
140
+ render_failure("操作失败")
141
+ end
142
+ end
143
+ end
144
+
145
+ def select_business
146
+ respond_to do |format|
147
+ format.json do
148
+ stage_id = Common.where(clazz: '商机阶段', name: ['已签单']).take.id.to_i
149
+ @businesses = Business.joins(:last_follow_up, :school)
150
+ .where("educode_sales_businesses.name LIKE '%#{params[:q]}%' and educode_sales_follow_ups.stage_id = #{stage_id} ")
151
+ .where("educode_sales_businesses.id not in (?) ", BusinessDeliverSubject.pluck(:business_id).map(&:to_i)) # todo 数组中包含nil会导致查询失败,无法找到数据
152
+ .select("educode_sales_businesses.*, schools.name as s_name, schools.id as s_id")
153
+
154
+ @count = @businesses.count("educode_sales_businesses.id")
155
+ @businesses = @businesses.page(params[:page]).per(10)
156
+ render json: {
157
+ data: @businesses,
158
+ code: 0
159
+ }
160
+ end
161
+ end
162
+
163
+ end
164
+
165
+ def list_shixuns
166
+ respond_to do |format|
167
+ format.html do
168
+ render layout: false
169
+ end
170
+ format.json do
171
+ shixuns = BusinessSubjectShixun
172
+ if params[:id].present?
173
+ business_deliver = BusinessDeliverSubject.find_by(id: params[:id])
174
+ shixuns = BusinessSubjectShixun.joins(:shixun, business_subject: [:business_deliver_subject, :subject]).left_joins(:last_dectect).where("educode_sales_business_deliver_subjects.id = #{business_deliver.id }")
175
+ elsif params[:subject_id].present?
176
+ shixuns = BusinessSubjectShixun.joins(:shixun, business_subject: [:business_deliver_subject, :subject]).left_joins(:last_dectect).where("educode_sales_business_subjects.id = #{params[:subject_id] }")
177
+ end
178
+
179
+ if params[:q].present? && params[:q][:shixun_name].present?
180
+ shixuns = shixuns.where("shixuns.name like '%#{params[:q][:shixun_name]}%'")
181
+ end
182
+ if params[:q].present? && params[:q][:subject_name].present?
183
+ shixuns = shixuns.where("subjects.name like '%#{params[:q][:subject_name]}%'")
184
+ end
185
+ shixuns = shixuns.search_category(params[:q][:category]) if params[:q].present?
186
+ shixuns = shixuns.search_status(params[:q][:status]) if params[:q].present?
187
+ shixuns = shixuns.search_level(params[:q][:level]) if params[:q].present?
188
+ @count = shixuns.count
189
+
190
+ @shixuns = shixuns.select("educode_sales_business_subject_shixuns.*, shixuns.name s_name, shixuns.identifier s_identifier,
191
+ subjects.name as subjects_name,subjects.identifier as subjects_identifier,
192
+ educode_sales_shixun_dectects.content dectect_content, educode_sales_shixun_dectects.date dectect_time ")
193
+ .page(params[:page]).per(params[:limit])
194
+ end
195
+ end
196
+ end
197
+
198
+ def list_subjects
199
+ respond_to do |format|
200
+ format.html do
201
+ render layout: false
202
+ end
203
+ format.json do
204
+ # 商机交付课程id
205
+ bussiness_deliver_id = params[:id].to_i
206
+
207
+ # subject.status => :0 编辑中 1 审核中 2 发布
208
+ # public: 2: 公开
209
+ subjects = BusinessSubject.joins("INNER JOIN subjects bs ON bs.id = educode_sales_business_subjects.subject_id
210
+ INNER JOIN educode_sales_business_deliver_subjects e_s_b_d_s ON educode_sales_business_subjects.business_deliver_subject_id = e_s_b_d_s.id and e_s_b_d_s.id = #{bussiness_deliver_id}
211
+ INNER JOIN educode_sales_businesses esb ON esb.id = educode_sales_business_subjects.business_id
212
+ LEFT JOIN educode_sales_follow_ups fu ON fu.id = esb.last_follow_up_id
213
+ ")
214
+
215
+ # 搜索条件
216
+ if params[:q].present? && params[:q][:name].present?
217
+ subjects = subjects.where("bs.name like '%#{params[:q][:name]}%'")
218
+ end
219
+ if params[:q].present? && params[:q][:p_state].present?
220
+ status = params[:q][:p_state].to_i
221
+ if status == 1
222
+ subjects = subjects.where("bs.public = #{status}")
223
+ elsif [0, 2].include? status
224
+ subjects = subjects.where("bs.status = #{status} and public not in (1,2) ")
225
+ else
226
+ subjects = subjects.where("bs.public = 2")
227
+ end
228
+ end
229
+ @subjects = subjects.includes(business_subject_shixuns: :shixun).select("educode_sales_business_subjects.*, bs.identifier, bs.status status, bs.name name, bs.public, IFNULL(fu.reception_at, '--') reception_at").page(params[:page]).per(params[:limit])
230
+
231
+ end
232
+ end
233
+
234
+ end
235
+
236
+ def subjects
237
+ respond_to do |format|
238
+ format.json do
239
+ @subjects = Subject.unhidden.where.not(id: BusinessSubject.joins(:business).pluck(:subject_id)).where("name like '%#{params[:q]}%' ").page(params[:page]).per(10)
240
+ render json: {
241
+ data: @subjects.map { |item| { value: item[:id], name: item[:name] } },
242
+ code: 0,
243
+ count: @subjects.total_count / 10
244
+ }
245
+ end
246
+ end
247
+ end
248
+
249
+ def business_params
250
+ params.require(:business).permit(:status, :business_id)
251
+ end
252
+
253
+ end
254
+
255
+ end
@@ -296,28 +296,28 @@ module EducodeSales
296
296
 
297
297
  if params[:q].present? && params[:q][:date].present?
298
298
  date = params[:q][:date].split(" - ")
299
- @businesses = @businesses.where("educode_sales_businesses.created_at > ? AND educode_sales_businesses.created_at < ?", date[0], date[1] + '23:59:59')
299
+ @businesses = @businesses.where("educode_sales_businesses.created_at >= ? AND educode_sales_businesses.created_at <= ?", date[0] + ' 00:00:00', date[1] + ' 23:59:59')
300
300
  end
301
301
 
302
302
  if params[:q].present? && params[:q][:invitation_at].present?
303
303
  date = params[:q][:invitation_at].split(" - ")
304
304
  @businesses = @businesses.joins("
305
305
  JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
306
- ").where("educode_sales_follow_ups.invitation_at > ? AND educode_sales_follow_ups.invitation_at < ?", date[0] + '00:00:00', date[1] + '23:59:59')
306
+ ").where("educode_sales_follow_ups.invitation_at >= ? AND educode_sales_follow_ups.invitation_at <= ?", date[0] + ' 00:00:00', date[1] + ' 23:59:59')
307
307
  end
308
308
 
309
309
  if params[:q].present? && params[:q][:plan_return_date].present?
310
310
  date = params[:q][:plan_return_date].split(" - ")
311
311
  @businesses = @businesses.joins("
312
312
  JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
313
- ").where("educode_sales_follow_ups.plan_return_date > ? AND educode_sales_follow_ups.plan_return_date < ?", date[0] + '00:00:00', date[1] + '23:59:59')
313
+ ").where("educode_sales_follow_ups.plan_return_date >= ? AND educode_sales_follow_ups.plan_return_date <= ?", date[0] + ' 00:00:00', date[1] + ' 23:59:59')
314
314
  end
315
315
 
316
316
  if params[:q].present? && params[:q][:plan_a_date].present?
317
317
  date = params[:q][:plan_a_date].split(" - ")
318
318
  @businesses = @businesses.joins("
319
319
  JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
320
- ").where("educode_sales_follow_ups.plan_a_date > ? AND educode_sales_follow_ups.plan_a_date < ?", date[0] + '00:00:00', date[1] + '23:59:59')
320
+ ").where("educode_sales_follow_ups.plan_a_date >= ? AND educode_sales_follow_ups.plan_a_date <= ?", date[0] + ' 00:00:00', date[1] + ' 23:59:59')
321
321
  end
322
322
 
323
323
  # 根据编号获取商机
@@ -345,7 +345,7 @@ module EducodeSales
345
345
  elsif params[:q][:source_way] == '渠道代理'
346
346
  sourcable_id = EducodeSales::Place.where("name like ?", "%#{params[:q][:source_name]}%").limit(20).pluck(:id)
347
347
  elsif params[:q][:source_way] == '客户'
348
- sourcable_id = EducodeSales::Department.where("name like ?", "%#{params[:q][:source_name]}%").limit(20).pluck(:id)
348
+ sourcable_id = Department.where("name like ?", "%#{params[:q][:source_name]}%").limit(20).pluck(:id)
349
349
  end
350
350
 
351
351
  if sourcable_id.present?
@@ -484,7 +484,7 @@ module EducodeSales
484
484
  elsif params[:source_way] == '渠道代理'
485
485
  params[:sourcable_type] = 'EducodeSales::Place'
486
486
  elsif params[:source_way] == '客户'
487
- params[:sourcable_type] = 'EducodeSales::Department'
487
+ params[:sourcable_type] = 'Department'
488
488
  else
489
489
  params[:sourcable_id] = ""
490
490
  end
@@ -572,7 +572,7 @@ module EducodeSales
572
572
  elsif params[:source_way] == '渠道代理'
573
573
  params[:sourcable_type] = 'EducodeSales::Place'
574
574
  elsif params[:source_way] == '客户'
575
- params[:sourcable_type] = 'EducodeSales::Department'
575
+ params[:sourcable_type] = 'Department'
576
576
  else
577
577
  params[:sourcable_id] = ""
578
578
  end
@@ -889,6 +889,42 @@ module EducodeSales
889
889
  @businesses = @businesses.where(id: my_ids)
890
890
  end
891
891
 
892
+ if params[:is_area].present?
893
+ # 区域管理商机
894
+ # 排查看区域商机,需要排除掉其它人员手上的监管学校
895
+ other_staff_school_id = EducodeSales::StaffSchool.where.not(staff_id: @current_admin.id).where("school_id IN (SELECT school_id FROM educode_sales_staff_schools WHERE staff_id = #{@current_admin.id}) IS NOT TRUE").distinct.pluck :school_id
896
+
897
+ school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id) + StaffSchool.where(staff_id: @current_admin.id).pluck(:school_id) - other_staff_school_id
898
+ @businesses = Business.joins("JOIN departments AS dp ON educode_sales_businesses.department_id = dp.id").where("dp.school_id in (?)", school_ids)
899
+ end
900
+
901
+ if params[:special].present?
902
+ # 专项商机
903
+ school_tag_ids = @current_admin.staff_school_tags.pluck(:school_tag_id)
904
+ school_ids = SchoolTagMiddle.where(school_tag_id: school_tag_ids).pluck(:school_id)
905
+ @businesses = Business.joins("JOIN departments AS dp ON educode_sales_businesses.department_id = dp.id").where("dp.school_id in (?)", school_ids)
906
+ end
907
+
908
+ if params[:delete_list].present?
909
+ @businesses = Business.unscoped.where(state_id: [1, 3])
910
+ end
911
+
912
+ if params[:plan_year].present?
913
+ if @current_admin.is_admin?
914
+ @businesses = Business
915
+ else
916
+ # 年度计划,按负责区域和专项客户类型查看对应的年度商机
917
+ school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id) + StaffSchool.where(staff_id: @current_admin.id).pluck(:school_id)
918
+ if @current_admin.staff_school_tags.present?
919
+ # 如果设置专项客户类型,则视为专项经理,根据专项客户查看对应商机
920
+ school_ids += School.joins(:school_tags).where("school_tags.id in (?)", @current_admin.staff_school_tags.pluck(:school_tag_id)).pluck(:id)
921
+ end
922
+ @businesses = Business.joins("JOIN departments ON educode_sales_businesses.department_id = departments.id").where("departments.school_id in (?) ", school_ids.uniq)
923
+ end
924
+
925
+ @businesses = @businesses.joins(:last_follow_up).where("educode_sales_follow_ups.plan_a_date > :year OR educode_sales_follow_ups.plan_return_date > :year OR educode_sales_follow_ups.invitation_at > :year", year: Time.now.beginning_of_year)
926
+ end
927
+
892
928
  @businesses = @businesses
893
929
  if params[:name].present? # && params[:name] != "(销售态势-" + @year + "-已中标商机)" && params[:name] != "(销售态势-" + @year + "-已签单商机)" && params[:name] != "(销售态势-" + @year + "-已回款商机)" && params[:name] != "(销售态势-" + @year + "-现有商机)"&& params[:name] != "(销售态势-" + @year + "-应收款商机)"
894
930
  @businesses = @businesses.where("educode_sales_businesses.name like ?", "%#{params[:name]}%")
@@ -32,6 +32,9 @@ module EducodeSales
32
32
  gon.business_step = Common.where(clazz: 'business_step', name: ['已中标', '已签单', '已验收', '回款中', '服务中', '已结束']).order("position").map do |d|
33
33
  {value: d.id, name: d.name, selected: business_step.include?(d.name)}
34
34
  end
35
+ if params[:date_at].present? && params[:date_at] != '全部'
36
+ gon.bidded_date = Time.new(params[:date_at]).beginning_of_year.strftime("%Y-%m-%d") + " - " + Time.new(params[:date_at]).end_of_year.strftime("%Y-%m-%d")
37
+ end
35
38
  end
36
39
  format.json do
37
40
  @businesses = Business
@@ -279,6 +282,9 @@ module EducodeSales
279
282
  @staffs = staffs.map { |d| [d.user.real_name, d.id]}
280
283
  role = Role.find_by(name: '售后工程师')
281
284
  @after_sales_staffs = Staff.joins(:user).where(role_id: role.id).map { |d| [d.user.real_name, d.id]}
285
+ if params[:date_at].present? && params[:date_at] != '全部'
286
+ gon.bidded_date = Time.new(params[:date_at]).beginning_of_year.strftime("%Y-%m-%d") + " - " + Time.new(params[:date_at]).end_of_year.strftime("%Y-%m-%d")
287
+ end
282
288
  end
283
289
 
284
290
  def new_follow_up
@@ -74,6 +74,13 @@ module EducodeSales
74
74
  @schools = Business.all
75
75
  if params[:q].present?
76
76
  @schools = @schools.where("name like :q ", q: "%#{params[:q]}%").page(params[:page]).per(10)
77
+ # 商机搜索为空时 去搜索学校名 如果搜索到学校名 则返回学校id相关的商机
78
+ if @schools.empty?
79
+ @schools = Business.joins(:school)
80
+ .where("schools.name LIKE :q", q: "%#{params[:q]}%")
81
+ .page(params[:page])
82
+ .per(10)
83
+ end
77
84
  end
78
85
  end
79
86
 
@@ -14,6 +14,10 @@ module EducodeSales
14
14
  gon.staff_id = @current_admin.id
15
15
  common = Common.find_by(clazz: 'staff_type', name: '销售')
16
16
  gon.staffs = Staff.joins(:user).where(job_type: common.id).where.not(role_id: 11).map { |d| {name: d.user.real_name, value: d.id } }
17
+
18
+ if params[:date_at].present? && params[:date_at] != '全部'
19
+ gon.date = Time.new(params[:date_at]).beginning_of_year.strftime("%Y-%m-%d") + " - " + Time.new(params[:date_at]).end_of_year.strftime("%Y-%m-%d")
20
+ end
17
21
  end
18
22
  format.json do
19
23
  @money_plan_records = MoneyPlanRecord.left_joins(:money_plan_claims).group("educode_sales_money_plan_records.id").select("educode_sales_money_plan_records.*, COUNT(educode_sales_money_plan_claims.id) AS claim_num")
@@ -45,7 +49,7 @@ module EducodeSales
45
49
 
46
50
  if params[:q].present? && params[:q][:date_at].present?
47
51
  date = params[:q][:date_at].split(" - ")
48
- @money_plan_records = @money_plan_records.where("date_at BETWEEN ? AND ?", date[0], date[1])
52
+ @money_plan_records = @money_plan_records.where("date_at BETWEEN ? AND ?", date[0] + ' 00:00:00', date[1] + ' 23:59:59')
49
53
  end
50
54
  if params[:q].present? && params[:q][:state].present?
51
55
  if params[:q][:state] == '已认领'
@@ -207,7 +211,7 @@ module EducodeSales
207
211
  # money.save
208
212
  # end
209
213
  # 上次的回款计划的跟进也要同步到最新的跟进id,不然回款计划列表会找不到
210
- EducodeSales::MoneyPlan.where(business_id: d.id, id: params[:money_plan_ids]).update_all(follow_up_id: follow_up.id)
214
+ EducodeSales::MoneyPlan.where(business_id: d.id, follow_up_id: last_follow_up.id).update_all(follow_up_id: follow_up.id)
211
215
 
212
216
  # 合同里签到日期全同步到最新跟进
213
217
  last_follow_up.contract_date_lists.update_all(follow_up_id: follow_up.id)