educode_sales 1.10.48 → 1.10.58

Sign up to get free protection for your applications and to get access to all the features.
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)