educode_sales 0.1.0

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 (244) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +30 -0
  4. data/Rakefile +32 -0
  5. data/app/assets/config/educode_sales_manifest.js +2 -0
  6. data/app/assets/fonts/iconfont.eot +0 -0
  7. data/app/assets/fonts/iconfont.svg +554 -0
  8. data/app/assets/fonts/iconfont.ttf +0 -0
  9. data/app/assets/fonts/iconfont.woff +0 -0
  10. data/app/assets/fonts/iconfont.woff2 +0 -0
  11. data/app/assets/images/educode_sales/favicon.ico +0 -0
  12. data/app/assets/images/educode_sales/icon-ext.png +0 -0
  13. data/app/assets/images/educode_sales/icon-login.png +0 -0
  14. data/app/assets/images/educode_sales/icon.png +0 -0
  15. data/app/assets/images/educode_sales/loading-0.gif +0 -0
  16. data/app/assets/images/educode_sales/loading-1.gif +0 -0
  17. data/app/assets/images/educode_sales/loading-2.gif +0 -0
  18. data/app/assets/images/educode_sales/loginbg.png +0 -0
  19. data/app/assets/images/educode_sales/logo.png +0 -0
  20. data/app/assets/javascripts/educode_sales/application.js +16 -0
  21. data/app/assets/javascripts/educode_sales/extent/miniPage.js +394 -0
  22. data/app/assets/javascripts/educode_sales/extent/request.js +137 -0
  23. data/app/assets/javascripts/educode_sales/extent/select_input.js +522 -0
  24. data/app/assets/javascripts/educode_sales/layui.js +5 -0
  25. data/app/assets/stylesheets/educode_sales/app.css +256 -0
  26. data/app/assets/stylesheets/educode_sales/application.css +17 -0
  27. data/app/assets/stylesheets/educode_sales/error.css +181 -0
  28. data/app/assets/stylesheets/educode_sales/layui.scss +1525 -0
  29. data/app/assets/stylesheets/educode_sales/layuimini.css +838 -0
  30. data/app/assets/stylesheets/educode_sales/login.scss +38 -0
  31. data/app/assets/stylesheets/educode_sales/modules/code.css +29 -0
  32. data/app/assets/stylesheets/educode_sales/modules/laydate/default/font.scss +16 -0
  33. data/app/assets/stylesheets/educode_sales/modules/laydate/default/laydate.css +152 -0
  34. data/app/assets/stylesheets/educode_sales/modules/layer/default/icon-ext.png +0 -0
  35. data/app/assets/stylesheets/educode_sales/modules/layer/default/icon.png +0 -0
  36. data/app/assets/stylesheets/educode_sales/modules/layer/default/layer.scss +179 -0
  37. data/app/assets/stylesheets/educode_sales/modules/layer/default/loading-0.gif +0 -0
  38. data/app/assets/stylesheets/educode_sales/modules/layer/default/loading-1.gif +0 -0
  39. data/app/assets/stylesheets/educode_sales/modules/layer/default/loading-2.gif +0 -0
  40. data/app/assets/stylesheets/educode_sales/modules/select_input.css +103 -0
  41. data/app/assets/stylesheets/educode_sales/public.css +47 -0
  42. data/app/controllers/educode_sales/activities_controller.rb +58 -0
  43. data/app/controllers/educode_sales/application_controller.rb +35 -0
  44. data/app/controllers/educode_sales/businesses_controller.rb +189 -0
  45. data/app/controllers/educode_sales/commons_controller.rb +54 -0
  46. data/app/controllers/educode_sales/follow_ups_controller.rb +140 -0
  47. data/app/controllers/educode_sales/home_controller.rb +40 -0
  48. data/app/controllers/educode_sales/key_person_controller.rb +29 -0
  49. data/app/controllers/educode_sales/operation_plans_controller.rb +53 -0
  50. data/app/controllers/educode_sales/operation_reports_controller.rb +6 -0
  51. data/app/controllers/educode_sales/operations_controller.rb +38 -0
  52. data/app/controllers/educode_sales/places_controller.rb +69 -0
  53. data/app/controllers/educode_sales/plans_controller.rb +208 -0
  54. data/app/controllers/educode_sales/roles_controller.rb +69 -0
  55. data/app/controllers/educode_sales/sale_reports_controller.rb +133 -0
  56. data/app/controllers/educode_sales/sale_trends_controller.rb +45 -0
  57. data/app/controllers/educode_sales/sales_controller.rb +64 -0
  58. data/app/controllers/educode_sales/sessions_controller.rb +51 -0
  59. data/app/controllers/educode_sales/staffs_controller.rb +81 -0
  60. data/app/controllers/educode_sales/teachers_controller.rb +167 -0
  61. data/app/helpers/educode_sales/activities_helper.rb +4 -0
  62. data/app/helpers/educode_sales/application_helper.rb +44 -0
  63. data/app/helpers/educode_sales/business_helper.rb +4 -0
  64. data/app/helpers/educode_sales/home_helper.rb +4 -0
  65. data/app/helpers/educode_sales/sessions_helper.rb +4 -0
  66. data/app/helpers/educode_sales/teachers_helper.rb +4 -0
  67. data/app/jobs/educode_sales/application_job.rb +4 -0
  68. data/app/mailers/educode_sales/application_mailer.rb +6 -0
  69. data/app/models/ability.rb +54 -0
  70. data/app/models/educode_sales/activity.rb +6 -0
  71. data/app/models/educode_sales/activity_teacher.rb +6 -0
  72. data/app/models/educode_sales/application_record.rb +5 -0
  73. data/app/models/educode_sales/business.rb +11 -0
  74. data/app/models/educode_sales/common.rb +32 -0
  75. data/app/models/educode_sales/course_subject.rb +5 -0
  76. data/app/models/educode_sales/follow_up.rb +14 -0
  77. data/app/models/educode_sales/key_person.rb +11 -0
  78. data/app/models/educode_sales/market_area.rb +6 -0
  79. data/app/models/educode_sales/money_plan.rb +22 -0
  80. data/app/models/educode_sales/operation_plan.rb +6 -0
  81. data/app/models/educode_sales/operation_report.rb +5 -0
  82. data/app/models/educode_sales/operation_trend.rb +5 -0
  83. data/app/models/educode_sales/permission.rb +16 -0
  84. data/app/models/educode_sales/place.rb +7 -0
  85. data/app/models/educode_sales/place_area.rb +6 -0
  86. data/app/models/educode_sales/role.rb +8 -0
  87. data/app/models/educode_sales/role_area.rb +13 -0
  88. data/app/models/educode_sales/role_permission.rb +6 -0
  89. data/app/models/educode_sales/sale_plan.rb +6 -0
  90. data/app/models/educode_sales/sale_report.rb +5 -0
  91. data/app/models/educode_sales/sale_trend.rb +4 -0
  92. data/app/models/educode_sales/staff.rb +41 -0
  93. data/app/models/educode_sales/teacher.rb +12 -0
  94. data/app/models/educode_sales/teacher_follow.rb +6 -0
  95. data/app/views/educode_sales/activities/edit.html.erb +82 -0
  96. data/app/views/educode_sales/activities/index.html.erb +172 -0
  97. data/app/views/educode_sales/activities/index.json.jbuilder +14 -0
  98. data/app/views/educode_sales/activities/new.html.erb +81 -0
  99. data/app/views/educode_sales/activities/show_teachers.html.erb +368 -0
  100. data/app/views/educode_sales/businesses/edit.html.erb +82 -0
  101. data/app/views/educode_sales/businesses/edit_follow_record.html.erb +138 -0
  102. data/app/views/educode_sales/businesses/edit_plan.html.erb +172 -0
  103. data/app/views/educode_sales/businesses/index.html.erb +364 -0
  104. data/app/views/educode_sales/businesses/index.json.jbuilder +20 -0
  105. data/app/views/educode_sales/businesses/new.html.erb +80 -0
  106. data/app/views/educode_sales/businesses/new_follow_record.html.erb +144 -0
  107. data/app/views/educode_sales/businesses/show_follow.html.erb +466 -0
  108. data/app/views/educode_sales/businesses/show_follow.json.jbuilder +21 -0
  109. data/app/views/educode_sales/businesses/show_follow_record.html.erb +81 -0
  110. data/app/views/educode_sales/businesses/show_keys.html.erb +56 -0
  111. data/app/views/educode_sales/businesses/unfinish_plans.json.jbuilder +14 -0
  112. data/app/views/educode_sales/commons/edit.html.erb +112 -0
  113. data/app/views/educode_sales/commons/index.html.erb +132 -0
  114. data/app/views/educode_sales/commons/index.json.jbuilder +13 -0
  115. data/app/views/educode_sales/commons/new.html.erb +58 -0
  116. data/app/views/educode_sales/commons/show.json.jbuilder +9 -0
  117. data/app/views/educode_sales/follow_ups/money_plans.json.jbuilder +11 -0
  118. data/app/views/educode_sales/follow_ups/teachers.json.jbuilder +16 -0
  119. data/app/views/educode_sales/home/index.html.erb +1 -0
  120. data/app/views/educode_sales/home/no_permission.html.erb +27 -0
  121. data/app/views/educode_sales/home/search.json.jbuilder +8 -0
  122. data/app/views/educode_sales/home/search_edu_teacher.json.jbuilder +14 -0
  123. data/app/views/educode_sales/home/search_teacher.json.jbuilder +24 -0
  124. data/app/views/educode_sales/home/search_users.json.jbuilder +8 -0
  125. data/app/views/educode_sales/home/statistics.html.erb +68 -0
  126. data/app/views/educode_sales/operation_plans/_monthPlan.html.erb +288 -0
  127. data/app/views/educode_sales/operation_plans/_monthly.html.erb +284 -0
  128. data/app/views/educode_sales/operation_plans/_weekPlan.html.erb +291 -0
  129. data/app/views/educode_sales/operation_plans/_weekly.html.erb +275 -0
  130. data/app/views/educode_sales/operation_plans/edit_month.html.erb +60 -0
  131. data/app/views/educode_sales/operation_plans/edit_monthly.html.erb +175 -0
  132. data/app/views/educode_sales/operation_plans/edit_week.html.erb +72 -0
  133. data/app/views/educode_sales/operation_plans/edit_weekly.html.erb +173 -0
  134. data/app/views/educode_sales/operation_plans/index.html.erb +22 -0
  135. data/app/views/educode_sales/operation_plans/new_month.html.erb +79 -0
  136. data/app/views/educode_sales/operation_plans/new_monthly.html.erb +176 -0
  137. data/app/views/educode_sales/operation_plans/new_week.html.erb +86 -0
  138. data/app/views/educode_sales/operation_plans/new_weekly.html.erb +174 -0
  139. data/app/views/educode_sales/operation_plans/operation.html.erb +0 -0
  140. data/app/views/educode_sales/operation_plans/show_month.html.erb +36 -0
  141. data/app/views/educode_sales/operation_plans/show_monthly.html.erb +171 -0
  142. data/app/views/educode_sales/operation_plans/show_week.html.erb +43 -0
  143. data/app/views/educode_sales/operation_plans/show_weekly.html.erb +170 -0
  144. data/app/views/educode_sales/operations/trends.html.erb +191 -0
  145. data/app/views/educode_sales/places/edit.html.erb +91 -0
  146. data/app/views/educode_sales/places/index.html.erb +137 -0
  147. data/app/views/educode_sales/places/index.json.jbuilder +13 -0
  148. data/app/views/educode_sales/places/new.html.erb +77 -0
  149. data/app/views/educode_sales/plans/_monthPlan.html.erb +258 -0
  150. data/app/views/educode_sales/plans/_monthly.html.erb +302 -0
  151. data/app/views/educode_sales/plans/_weekPlan.html.erb +265 -0
  152. data/app/views/educode_sales/plans/_weekly.html.erb +296 -0
  153. data/app/views/educode_sales/plans/audit_weekly.html.erb +177 -0
  154. data/app/views/educode_sales/plans/edit_month.html.erb +74 -0
  155. data/app/views/educode_sales/plans/edit_monthly.html.erb +179 -0
  156. data/app/views/educode_sales/plans/edit_week.html.erb +81 -0
  157. data/app/views/educode_sales/plans/edit_weekly.html.erb +238 -0
  158. data/app/views/educode_sales/plans/index.html.erb +54 -0
  159. data/app/views/educode_sales/plans/index.json.jbuilder +19 -0
  160. data/app/views/educode_sales/plans/my_month.json.jbuilder +18 -0
  161. data/app/views/educode_sales/plans/my_week.json.jbuilder +19 -0
  162. data/app/views/educode_sales/plans/new_month.html.erb +89 -0
  163. data/app/views/educode_sales/plans/new_monthly.html.erb +235 -0
  164. data/app/views/educode_sales/plans/new_week.html.erb +95 -0
  165. data/app/views/educode_sales/plans/new_weekly.html.erb +262 -0
  166. data/app/views/educode_sales/plans/operation.html.erb +0 -0
  167. data/app/views/educode_sales/plans/show_month.html.erb +30 -0
  168. data/app/views/educode_sales/plans/show_monthly.html.erb +175 -0
  169. data/app/views/educode_sales/plans/show_week.html.erb +38 -0
  170. data/app/views/educode_sales/plans/show_weekly.html.erb +143 -0
  171. data/app/views/educode_sales/roles/edit.html.erb +127 -0
  172. data/app/views/educode_sales/roles/index.html.erb +105 -0
  173. data/app/views/educode_sales/roles/index.json.jbuilder +10 -0
  174. data/app/views/educode_sales/roles/new.html.erb +51 -0
  175. data/app/views/educode_sales/sale_reports/audit.html.erb +209 -0
  176. data/app/views/educode_sales/sale_reports/edit.html.erb +240 -0
  177. data/app/views/educode_sales/sale_reports/index.json.jbuilder +17 -0
  178. data/app/views/educode_sales/sale_reports/plans.json.jbuilder +19 -0
  179. data/app/views/educode_sales/sale_reports/show.html.erb +172 -0
  180. data/app/views/educode_sales/sale_trends/operations.html.erb +49 -0
  181. data/app/views/educode_sales/sale_trends/trends.html.erb +213 -0
  182. data/app/views/educode_sales/sales/index.html.erb +60 -0
  183. data/app/views/educode_sales/sales/index.json.jbuilder +17 -0
  184. data/app/views/educode_sales/sales/operations.html.erb +108 -0
  185. data/app/views/educode_sales/sales/operations.json.jbuilder +14 -0
  186. data/app/views/educode_sales/sales/school.html.erb +29 -0
  187. data/app/views/educode_sales/sales/trends.html.erb +216 -0
  188. data/app/views/educode_sales/sales/xschool.html.erb +35 -0
  189. data/app/views/educode_sales/sessions/login.html.erb +87 -0
  190. data/app/views/educode_sales/staffs/edit.html.erb +116 -0
  191. data/app/views/educode_sales/staffs/follow_up_departments.json.jbuilder +13 -0
  192. data/app/views/educode_sales/staffs/follow_up_schools.json.jbuilder +12 -0
  193. data/app/views/educode_sales/staffs/index.html.erb +141 -0
  194. data/app/views/educode_sales/staffs/index.json.jbuilder +15 -0
  195. data/app/views/educode_sales/staffs/new.html.erb +73 -0
  196. data/app/views/educode_sales/teachers/activities.json.jbuilder +9 -0
  197. data/app/views/educode_sales/teachers/add_courses.html.erb +53 -0
  198. data/app/views/educode_sales/teachers/add_event.html.erb +49 -0
  199. data/app/views/educode_sales/teachers/add_keys.html.erb +282 -0
  200. data/app/views/educode_sales/teachers/course_list.json.jbuilder +22 -0
  201. data/app/views/educode_sales/teachers/edit.html.erb +109 -0
  202. data/app/views/educode_sales/teachers/edit_follow_record.html.erb +67 -0
  203. data/app/views/educode_sales/teachers/index.html.erb +461 -0
  204. data/app/views/educode_sales/teachers/index.json.jbuilder +23 -0
  205. data/app/views/educode_sales/teachers/new.html.erb +166 -0
  206. data/app/views/educode_sales/teachers/new_follow_record.html.erb +67 -0
  207. data/app/views/educode_sales/teachers/search_new.html.erb +138 -0
  208. data/app/views/educode_sales/teachers/show_class.html.erb +101 -0
  209. data/app/views/educode_sales/teachers/show_follow.html.erb +511 -0
  210. data/app/views/educode_sales/teachers/show_follow_record.html.erb +67 -0
  211. data/app/views/layouts/educode_sales/application.html.erb +104 -0
  212. data/app/views/layouts/educode_sales/login.html.erb +20 -0
  213. data/config/locales/sale.zh-CN.yml +9 -0
  214. data/config/routes.rb +162 -0
  215. data/db/migrate/20210830081842_create_educode_sales_staffs.rb +9 -0
  216. data/db/migrate/20210831022421_create_educode_sales_sale_trends.rb +13 -0
  217. data/db/migrate/20210831085201_create_educode_sales_commons.rb +11 -0
  218. data/db/migrate/20210901025628_create_educode_sales_roles.rb +19 -0
  219. data/db/migrate/20210901031626_create_educode_sales_market_areas.rb +10 -0
  220. data/db/migrate/20210902061835_create_educode_sales_role_areas.rb +11 -0
  221. data/db/migrate/20210902064029_create_educode_sales_permissions.rb +12 -0
  222. data/db/migrate/20210902064109_create_educode_sales_role_permissions.rb +62 -0
  223. data/db/migrate/20210902073832_create_educode_sales_businesses.rb +11 -0
  224. data/db/migrate/20210902080535_create_educode_sales_places.rb +10 -0
  225. data/db/migrate/20210902080918_create_educode_sales_follow_ups.rb +20 -0
  226. data/db/migrate/20210902101022_create_educode_sales_teachers.rb +20 -0
  227. data/db/migrate/20210902103331_create_educode_sales_teacher_follows.rb +15 -0
  228. data/db/migrate/20210903015810_create_educode_sales_sale_plans.rb +14 -0
  229. data/db/migrate/20210903020721_create_educode_sales_sale_reports.rb +21 -0
  230. data/db/migrate/20210903021458_create_educode_sales_operation_plans.rb +14 -0
  231. data/db/migrate/20210903021710_create_educode_sales_operation_reports.rb +19 -0
  232. data/db/migrate/20210903022055_create_educode_sales_operation_trends.rb +13 -0
  233. data/db/migrate/20210903032011_create_educode_sales_activities.rb +16 -0
  234. data/db/migrate/20210906104001_create_educode_sales_money_plans.rb +18 -0
  235. data/db/migrate/20210906105154_create_educode_sales_place_areas.rb +10 -0
  236. data/db/migrate/20210908014953_create_educode_sales_key_people.rb +21 -0
  237. data/db/migrate/20210912061148_add_audit_user_id_to_sales_reports.rb +11 -0
  238. data/db/migrate/20210913070728_create_educode_sales_activity_teachers.rb +11 -0
  239. data/db/migrate/20210913071607_create_educode_sales_course_subjects.rb +14 -0
  240. data/lib/educode_sales/engine.rb +5 -0
  241. data/lib/educode_sales/version.rb +3 -0
  242. data/lib/educode_sales.rb +5 -0
  243. data/lib/tasks/educode_sales_tasks.rake +4 -0
  244. metadata +342 -0
@@ -0,0 +1,47 @@
1
+
2
+ .layuimini-main {
3
+ margin: 10px 10px 10px 10px;
4
+ border: 5px solid #ffffff;
5
+ border-radius: 5px;
6
+ background-color: #ffffff
7
+ }
8
+
9
+ .layui-breadcrumb>* {
10
+ font-size: 13px !important;
11
+ }
12
+
13
+ /**必填红点 */
14
+ .layuimini-form>.layui-form-item .required:after {
15
+ content: '*';
16
+ color: red;
17
+ position: absolute;
18
+ margin-left: 4px;
19
+ font-weight: bold;
20
+ line-height: 1.8em;
21
+ top: 6px;
22
+ right: 5px;
23
+ }
24
+
25
+ .layuimini-form>.layui-form-item>.layui-form-label {
26
+ width: 120px !important;
27
+ }
28
+
29
+ .layuimini-form>.layui-form-item>.layui-input-block {
30
+ margin-left: 150px !important;
31
+ }
32
+
33
+ .layuimini-form>.layui-form-item>.layui-input-block>tip {
34
+ display: inline-block;
35
+ margin-top: 10px;
36
+ line-height: 10px;
37
+ font-size: 10px;
38
+ color: #a29c9c;
39
+ }
40
+
41
+ /**搜索框*/
42
+ .table-search-fieldset {
43
+ margin: 0;
44
+ border: 1px solid #e6e6e6;
45
+ padding: 10px 20px 5px 20px;
46
+ color: #6b6b6b;
47
+ }
@@ -0,0 +1,58 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class ActivitiesController < ApplicationController
5
+ def index
6
+ respond_to do |format|
7
+ format.html do
8
+ end
9
+ format.json do
10
+ @activities = Activity.page(params[:page]).per(params[:per_page])
11
+ end
12
+ end
13
+ end
14
+
15
+ def new
16
+ # gon.area_ids = @place.area_ids
17
+ # gon.areas = Common.where(clazz: 'area').map { |d| { value: d.id, title: d.name } } #.unshift({value: -1, title: '全国'})
18
+ render layout: false
19
+ end
20
+
21
+ def edit
22
+ @activity = Activity.find(params[:id])
23
+ render layout: false
24
+ end
25
+
26
+ def create
27
+ activity = @current_admin.activities.new(name: params[:name], start_at: params[:start_at], days: params[:days])
28
+ if activity.save
29
+ render_success
30
+ else
31
+ render_failure activity
32
+ end
33
+ end
34
+
35
+ def update
36
+ activity = Activity.find(params[:id])
37
+ activity.assign_attributes(name: params[:name], start_at: params[:start_at], days: params[:days])
38
+ if activity.save
39
+ render_success
40
+ else
41
+ render_failure activity
42
+ end
43
+ end
44
+
45
+ def destroy
46
+ activity = Activity.find(params[:id])
47
+ activity.destroy
48
+ render_success
49
+ rescue ActiveRecord::DeleteRestrictionError => e
50
+ render_failure '该活动已有数据产生,暂不能删除'
51
+ end
52
+
53
+ def show_teachers
54
+ render layout: false
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,35 @@
1
+ module EducodeSales
2
+ class ApplicationController < ActionController::Base
3
+ protect_from_forgery with: :exception
4
+ before_action :authenticate_request
5
+
6
+ def render_success
7
+ render json: { success: true }
8
+ end
9
+
10
+ def render_failure(msg)
11
+ render json: { success: false, msg: msg.is_a?(String) ? msg : msg.errors.full_messages.join(",") }, status: 403
12
+ end
13
+
14
+ def current_user
15
+ @current_admin = Staff.first
16
+ @current_admin ||= Staff.find_by_id(session[:admin_id])
17
+ end
18
+
19
+ def authenticate_request
20
+ unless current_user
21
+ redirect_to login_path
22
+ end
23
+ end
24
+
25
+ def authenticate_admin
26
+ unless current_user&.is_admin
27
+ redirect_to no_permission_path
28
+ end
29
+ end
30
+
31
+ rescue_from CanCan::AccessDenied do |exception|
32
+ redirect_to no_permission_path
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,189 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class BusinessesController < ApplicationController
5
+
6
+ def index
7
+ respond_to do |format|
8
+ format.html do
9
+ @staffs = Staff.joins(:user).map { |d| [d.user.real_name, d.id]}
10
+ end
11
+ format.json do
12
+ if @current_admin.is_admin?
13
+ @businesses = Business
14
+ else
15
+ level = @current_admin.role.role_areas.find_by(clazz: '商机管理').level
16
+ case level
17
+ when '自己'
18
+ @businesses = Business.where(staff_id: @current_admin.id)
19
+ when '区域'
20
+ schools = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id)
21
+ @businesses = Business.joins("JOIN departments ON businesses.department_id = departments.id").where("departments.school_id in ?", school_ids)
22
+ else
23
+ @businesses = Business
24
+ end
25
+ end
26
+
27
+ @businesses = @businesses.select("
28
+ educode_sales_businesses.*,
29
+ last_follow.invitation_at,
30
+ last_follow.reception_at,
31
+ last_follow.total_amount").joins("
32
+ LEFT JOIN educode_sales_follow_ups AS last_follow ON educode_sales_businesses.last_follow_up_id = last_follow.id
33
+ ")
34
+ if params[:q].present? && params[:q][:name].present?
35
+ @businesses = @businesses.where("educode_sales_businesses.name like ?", "%#{params[:q][:name]}%")
36
+ end
37
+ if params[:q].present? && params[:q][:department].present?
38
+ departments_ids = Department.joins(:school).where("schools.name like ?", "%#{params[:q][:department]}%").pluck(:id)
39
+ @businesses = @businesses.joins(:department).where("departments.id in (?)", departments_ids)
40
+ end
41
+ if params[:q].present? && params[:q][:staff_id].present?
42
+ @businesses = @businesses.where(staff_id: params[:q][:staff_id])
43
+ end
44
+ if params[:q].present? && params[:q][:business_type].present?
45
+ @businesses = @businesses.joins("
46
+ JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
47
+ ").where("educode_sales_follow_ups.clazz_id = ?", params[:q][:business_type])
48
+ end
49
+ if params[:q].present? && params[:q][:business_step].present?
50
+ @businesses = @businesses.joins("
51
+ JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
52
+ ").where("educode_sales_follow_ups.stage_id = ?", params[:q][:business_step])
53
+ end
54
+ if params[:q].present? && params[:q][:place_id].present?
55
+ @businesses = @businesses.joins("
56
+ JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
57
+ ").where("educode_sales_follow_ups.place_id = ?", params[:q][:place_id])
58
+ end
59
+
60
+ if params[:q].present? && params[:q][:area].present?
61
+ @businesses = @businesses.joins("
62
+ JOIN departments ON educode_sales_businesses.department_id = departments.id
63
+ JOIN schools ON departments.school_id = schools.id
64
+ ").where("province = ?", params[:q][:area])
65
+ end
66
+
67
+ if params[:q].present? && params[:q][:date].present?
68
+ date = params[:q][:date].split(" - ")
69
+ @businesses = @businesses.where("created_at > ? AND created_at < ?", date[0], date[1])
70
+ end
71
+
72
+ if params[:sort].present? && params[:sort][:field]
73
+ @businesses = @businesses.order("#{params[:sort][:field]} #{params[:sort][:order]}")
74
+ else
75
+ @businesses = @businesses.order("created_at desc")
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ def create
82
+ department = Department.find(params[:department_id])
83
+ business = @current_admin.businesses.build(name: params[:name], department_id: department.id)
84
+ if business.save
85
+ render_success
86
+ else
87
+ render_failure business
88
+ end
89
+ end
90
+
91
+ def new
92
+ render layout: false
93
+ end
94
+
95
+ def edit
96
+ @business = Business.find(params[:id])
97
+ gon.department = {value: @business.department_id, name: "#{@business.department.school.name}-#{@business.department.name}"}
98
+ gon.value = @business.department_id
99
+ render layout: false
100
+ end
101
+
102
+ def update
103
+ business = Business.find(params[:id])
104
+ department = Department.find(params[:department_id])
105
+ if business.update(name: params[:name], department_id: department.id)
106
+ render_success
107
+ else
108
+ render_failure business
109
+ end
110
+ end
111
+
112
+ def destroy
113
+ business = Business.find(params[:id])
114
+ business.destroy
115
+ render_success
116
+ rescue ActiveRecord::DeleteRestrictionError => e
117
+ render_failure '该商机已其它关联数据产生,暂不能删除'
118
+ end
119
+
120
+ def show_keys
121
+ render layout: false
122
+ end
123
+
124
+ def add_keys
125
+ render layout: false
126
+ end
127
+
128
+ def show_follow
129
+ load_business
130
+ respond_to do |format|
131
+ format.html do
132
+ render layout: false
133
+ end
134
+ format.json do
135
+ @follow_ups = @business.follow_ups
136
+ if params[:field]
137
+ @follow_ups = @follow_ups.order("#{params[:field]} #{params[:order]}")
138
+ else
139
+ @follow_ups = @follow_ups.order("created_at desc")
140
+ end
141
+ @follow_ups = @follow_ups.page(params[:page]).per(params[:per_page])
142
+ end
143
+ end
144
+ end
145
+
146
+ def new_follow_record
147
+ load_business
148
+ @clazz = Common.where(clazz: 'business_type').order("position").pluck(:name, :id)
149
+ @stages = Common.where(clazz: 'business_step').order("position").pluck(:name, :id)
150
+ @places = Place.order("created_at desc").pluck(:name, :id)
151
+ @last_follow_up = @business.last_follow_up
152
+ render layout: false
153
+ end
154
+
155
+
156
+ def unfinish_plans
157
+ load_business
158
+ @plans = @business.sale_plans.where.not(finish_rate: 100).page(params[:page]).per(params[:per_page])
159
+ end
160
+
161
+ def show_follow_record
162
+ @follow_up = FollowUp.find(params[:follow_up_id])
163
+ render layout: false
164
+ end
165
+
166
+ def edit_follow_record
167
+ @follow_up = FollowUp.find(params[:follow_up_id])
168
+ @clazz = Common.where(clazz: 'business_type').order("position").pluck(:name, :id)
169
+ @stages = Common.where(clazz: 'business_step').order("position").pluck(:name, :id)
170
+ @places = Place.order("created_at desc").pluck(:name, :id)
171
+ render layout: false
172
+ end
173
+
174
+ def edit_plan
175
+ render layout: false
176
+ end
177
+
178
+ private
179
+
180
+ def load_business
181
+ @business = Business.find(params[:id])
182
+ end
183
+
184
+ def follow_up_params
185
+ params.permit(:clazz_id, :stage_id, :invitation_at, :reception_at, :total_amount, :actual_amount, :divide_rate, :description, :advise, :place_id)
186
+ end
187
+
188
+ end
189
+ end
@@ -0,0 +1,54 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class CommonsController < ApplicationController
5
+
6
+ def index
7
+ respond_to do |format|
8
+ format.html do
9
+ end
10
+ format.json do
11
+ @commons = Common.group("clazz")
12
+ end
13
+ end
14
+ end
15
+
16
+ def create
17
+ common = Common.new(name: params[:name], clazz: params[:clazz])
18
+ if common.save
19
+ render_success
20
+ else
21
+ render_failure common
22
+ end
23
+ end
24
+
25
+ def edit
26
+ @common = Common.find(params[:id])
27
+ render layout: false
28
+ end
29
+
30
+ def update
31
+ common = Common.find(params[:id])
32
+ if common.update(common_params)
33
+ render_success
34
+ else
35
+ render_failure common
36
+ end
37
+ end
38
+
39
+ def new
40
+ render layout: false
41
+ end
42
+
43
+ def show
44
+ commons = Common.find(params[:id])
45
+ @commons = Common.where(clazz: commons.clazz).order('position')
46
+ end
47
+
48
+ private
49
+
50
+ def common_params
51
+ params.permit(:name, :position)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,140 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class FollowUpsController < ApplicationController
5
+
6
+ def create
7
+ load_business
8
+ follow_up = @business.follow_ups.build(follow_up_params)
9
+ follow_up.staff = @current_admin
10
+ follow_up.profit_amount = follow_up.actual_amount * (100-follow_up.divide_rate.to_i) * 0.01 if follow_up.actual_amount
11
+ if follow_up.save
12
+ @business.update(last_follow_up_id: follow_up.id)
13
+ render_success
14
+ else
15
+ render_failure follow_up
16
+ end
17
+ end
18
+
19
+ def destroy
20
+ follow_up = @current_admin.follow_ups.find(params[:id])
21
+ if follow_up.destroy
22
+ render_success
23
+ else
24
+ render_failure follow_up
25
+ end
26
+ end
27
+
28
+ def update
29
+ follow_up = @current_admin.follow_ups.find(params[:id])
30
+ follow_up.assign_attributes(follow_up_params)
31
+ follow_up.profit_amount = follow_up.actual_amount * (100-follow_up.divide_rate.to_i) * 0.01 if follow_up.actual_amount
32
+ if follow_up.save
33
+ render_success
34
+ else
35
+ render_failure follow_up
36
+ end
37
+ end
38
+
39
+ def teachers
40
+ follow_up = @current_admin.follow_ups.find_by(id: params[:id])
41
+ if follow_up.present?
42
+ @teachers = follow_up.key_person.includes(:teacher).page(params[:page]).per(params[:per_page])
43
+ else
44
+ @teachers = FollowUp.none
45
+ end
46
+ end
47
+
48
+ def money_plans
49
+ follow_up = @current_admin.follow_ups.find_by(id: params[:id])
50
+ @money_plans = follow_up.money_plans.page(params[:page]).per(params[:per_page])
51
+ end
52
+
53
+ def add_money
54
+ follow_up = @current_admin.follow_ups.find(params[:id])
55
+ money_plan = follow_up.money_plans.build(date_at: params[:date_at], amount: params[:amount], clazz: params[:clazz])
56
+ money_plan.staff = @current_admin
57
+ if money_plan.save
58
+ render_success
59
+ else
60
+ render_failure money_plan
61
+ end
62
+ end
63
+
64
+ def update_money
65
+ follow_up = @current_admin.follow_ups.find_by(id: params[:id])
66
+ money_plan = follow_up.money_plans.find(params[:plan_id])
67
+ if money_plan.update(date_at: params[:date_at], amount: params[:amount], clazz: params[:clazz])
68
+ render_success
69
+ else
70
+ render_failure money_plan
71
+ end
72
+ end
73
+
74
+ def delete_money
75
+ follow_up = @current_admin.follow_ups.find_by(id: params[:id])
76
+ money_plan = follow_up.money_plans.find(params[:plan_id])
77
+ if money_plan.destroy
78
+ render_success
79
+ else
80
+ render_failure money_plan
81
+ end
82
+ end
83
+
84
+ def add_keys
85
+ follow_up = @current_admin.follow_ups.find(params[:id])
86
+ if params[:name].blank?
87
+ return render_failure '请从平台里选择教师'
88
+ end
89
+
90
+ names = params[:name].split("-")
91
+ if names[0] == 't'
92
+ # 从教师列表里选择的用户
93
+ teacher = Teacher.find(names[1])
94
+ key_peprson = KeyPerson.new(teacher_params)
95
+ key_peprson.teacher = teacher
96
+ else
97
+ # 从头歌平台选择的用户
98
+ user = User.find(names[1])
99
+ teacher = Teacher.new(staff: @current_admin,
100
+ professional_title: params[:professional_title],
101
+ job: params[:job],
102
+ user_id: user.id,
103
+ is_key: true,
104
+ department_id: user.department_id,
105
+ name: user.real_name
106
+ )
107
+ teacher.save
108
+ key_peprson = KeyPerson.new(teacher_params)
109
+ key_peprson.teacher = teacher
110
+ end
111
+
112
+ follow_up.key_person << key_peprson
113
+ if follow_up.save!
114
+ render_success
115
+ else
116
+ render_failure follow_up
117
+ end
118
+ rescue ActiveRecord::RecordInvalid => e
119
+ if e.message.include?("Teacher已经被使用") || e.message.include?('Key person是无效的')
120
+ render_failure '该老师已在关键人列表中'
121
+ else
122
+ render_failure e.message
123
+ end
124
+ end
125
+
126
+ private
127
+
128
+ def load_business
129
+ @business = Business.find(params[:business_id])
130
+ end
131
+
132
+ def follow_up_params
133
+ params.permit(:clazz_id, :stage_id, :invitation_at, :reception_at, :total_amount, :actual_amount, :divide_rate, :description, :advise, :place_id)
134
+ end
135
+
136
+ def teacher_params
137
+ params.permit(:professional_title, :job, :attitude_id, :sex, :birth_date, :remark)
138
+ end
139
+ end
140
+ end