educode_sales 1.10.59 → 1.10.70

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/educode_sales/application.js +1 -0
  3. data/app/assets/javascripts/educode_sales/functions.js +24 -0
  4. data/app/controllers/educode_sales/application_controller.rb +11 -3
  5. data/app/controllers/educode_sales/business_courses_controller.rb +19 -8
  6. data/app/controllers/educode_sales/follow_ups_controller.rb +4 -0
  7. data/app/controllers/educode_sales/plans_controller.rb +448 -124
  8. data/app/controllers/educode_sales/shixuns_controller.rb +20 -10
  9. data/app/controllers/educode_sales/subjects_controller.rb +10 -6
  10. data/app/controllers/educode_sales/teacher_follows_controller.rb +4 -0
  11. data/app/controllers/educode_sales/teachers_controller.rb +3 -0
  12. data/app/models/educode_sales/business.rb +5 -5
  13. data/app/models/educode_sales/sales_target.rb +10 -0
  14. data/app/models/educode_sales/sales_target_log.rb +11 -0
  15. data/app/views/educode_sales/business_courses/index.html.erb +1 -1
  16. data/app/views/educode_sales/business_courses/new.html.erb +2 -2
  17. data/app/views/educode_sales/businesses/_follows.html.erb +107 -100
  18. data/app/views/educode_sales/businesses/index.html.erb +6 -3
  19. data/app/views/educode_sales/businesses/index.json.jbuilder +2 -2
  20. data/app/views/educode_sales/businesses/show_follow.json.jbuilder +1 -1
  21. data/app/views/educode_sales/contracts/_follows.html.erb +75 -69
  22. data/app/views/educode_sales/contracts/_list.html.erb +283 -249
  23. data/app/views/educode_sales/contracts/index.json.jbuilder +1 -1
  24. data/app/views/educode_sales/follow_ups/index.json.jbuilder +1 -1
  25. data/app/views/educode_sales/plans/_year_execute.html.erb +294 -159
  26. data/app/views/educode_sales/plans/_year_target.html.erb +330 -215
  27. data/app/views/educode_sales/plans/index.html.erb +3 -4
  28. data/app/views/educode_sales/plans/staff_year_business.html.erb +96 -0
  29. data/app/views/educode_sales/plans/staff_year_business.json.jbuilder +22 -0
  30. data/app/views/educode_sales/plans/staff_year_target.json.jbuilder +35 -0
  31. data/app/views/educode_sales/plans/staff_year_target_log.html.erb +62 -0
  32. data/app/views/educode_sales/plans/staff_year_target_log.json.jbuilder +34 -0
  33. data/app/views/educode_sales/plans/years_all_target.json.jbuilder +5 -4
  34. data/app/views/educode_sales/sales_details/_index.html.erb +6 -3
  35. data/app/views/educode_sales/shixun_dectects/markdown.html.erb +40 -1
  36. data/app/views/educode_sales/shixuns/index.html.erb +106 -97
  37. data/app/views/educode_sales/shixuns/new.html.erb +2 -2
  38. data/app/views/educode_sales/staffs/index.json.jbuilder +1 -1
  39. data/app/views/educode_sales/subjects/index.html.erb +1 -1
  40. data/app/views/educode_sales/subjects/new.html.erb +2 -2
  41. data/app/views/educode_sales/teachers/_follows.html.erb +24 -17
  42. data/app/views/educode_sales/teachers/_index.html.erb +6 -0
  43. data/app/views/layouts/educode_sales/application.html.erb +6 -3
  44. data/config/environments/development.rb +16 -0
  45. data/config/routes.rb +7 -0
  46. data/db/migrate/20230729085359_create_educode_sales_sales_target_histories.rb +1 -1
  47. data/lib/educode_sales/version.rb +1 -1
  48. metadata +11 -2
@@ -1,12 +1,25 @@
1
1
  <%= Gon::Base.render_data(:namespace => 'gon_target') %>
2
+ <style>
3
+ [lay-id="target_table"] .layui-table-cell{
4
+ height: auto!important;
5
+ overflow: visible;
6
+ text-overflow: inherit;
7
+ white-space: normal;
8
+ }
9
+
10
+ /* 添加自定义样式规则来居中对齐表格内容 */
11
+ .layui-table-view {
12
+ text-align: center;
13
+ }
14
+ </style>
2
15
  <div id="year_target_wraper">
3
16
  <div class="layuimini-main min-height-table" id="year_target_table_wraper">
4
- <form class="layui-form layui-form-pane" lay-filter="assessment_progress_form">
17
+ <form class="layui-form layui-form-pane" lay-filter="target_form">
5
18
  <div class="layui-form-item">
6
19
  <div class="layui-inline">
7
20
  <label class="layui-form-label">人员</label>
8
21
  <div class="layui-input-inline large-select">
9
- <%= select_tag "staff_id", options_for_select(@staffs), { id: 'weekly_staff_id', include_blank: true} %>
22
+ <%= select_tag "staff_id", options_for_select(@staffs), { id: 'target_staff_id', include_blank: true} %>
10
23
  </div>
11
24
  </div>
12
25
  <div class="layui-inline">
@@ -35,7 +48,7 @@
35
48
  </div>
36
49
  </div>
37
50
  </form>
38
- <table class="layui-tab" id="target_table" lay-filter="year_all_target_form"></table>
51
+ <table class="layui-tab" id="target_table" lay-filter="target_table_filter"></table>
39
52
  </div>
40
53
  <hr style="height:30px;background: #ccc; margin: 0px 15px;"/>
41
54
  <div class="layuimini-main min-height-table" id="year_target_add_wraper">
@@ -66,7 +79,7 @@
66
79
  </div>
67
80
  </div>
68
81
  <div class="layui-inline">
69
- <button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_add_taregt">重置
82
+ <button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_add_target">重置
70
83
  </button>
71
84
  <button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_target_history">检索
72
85
  </button>
@@ -82,7 +95,7 @@
82
95
  </div>
83
96
  <script type="text/html" id="target_progress_toolbar">
84
97
  <div class="layui-btn-container">
85
- <span class="table-label">年度销售目标执行情况</span>
98
+ <span class="table-label">&nbsp;</span>
86
99
  <button class="layui-btn layui-btn-primary layui-btn-sm pull-right" lay-event="export"> 导出</button>
87
100
  <button class="layui-btn layui-btn-primary layui-btn-sm pull-right" lay-event="show_all" id="show_all"> 分类显示</button>
88
101
  <button class="layui-btn layui-btn-default layui-btn-sm pull-right" lay-event="show_staff" id="show_staff"> 人员显示</button>
@@ -90,35 +103,30 @@
90
103
  </script>
91
104
  <script type="text/html" id="add_target_progress_toolbar">
92
105
  <div class="layui-btn-container">
93
- <span class="table-label">&nbsp;</span>
106
+ <span class="table-label">&nbsp</span>
94
107
  <button class="layui-btn layui-btn-default layui-btn-sm data-add-btn pull-right" lay-event="add">添加</button>
95
108
  </div>
96
109
  </script>
97
110
  <script type="text/html" id="op">
98
- {{# if (d.state == "" || d.state == undefined) { }}
99
- <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="add">保存</a>
111
+ {{# if (d.state == "" || d.state == undefined || d.edit) { }}
112
+ <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="save">保存</a>
100
113
  <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="cancel">取消</a>
101
- {{# } else if (d.state == '待审核') {}}
114
+ {{# } else if (d.state == '待审核') { }}
102
115
  <% if can? :new_audit, EducodeSales::SalePlan %>
103
116
  <a class="layui-btn layui-btn-default layui-btn-xs" lay-event="audit">审核</a>
104
117
  <% end %>
105
- {{# } else if (d.state == '已通过') {}}
106
- {{# if (d.edit) { }}
107
- <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="save_edit">保存</a>
108
- <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="cancel_edit">取消</a>
109
- {{# } else { }}
118
+ {{# } else if (d.state == '已通过' || d.state == '已驳回') { }}
110
119
  <% if can? :new_update, EducodeSales::SalePlan %>
111
- {{# if (d.is_use) { }}
112
120
  <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>
113
- {{# } else { }}
114
- {{# }}}
115
- <% end %>
116
- <!-- <a class="layui-btn layui-btn-default layui-btn-xs" lay-event="audit">审核</a>-->
117
- {{# }}}
118
- {{# } else if (d.state == '已驳回') {}}
121
+ <% end %>
122
+ {{# } }}
123
+ {{# if (d.state == '已驳回') { }}
119
124
  <a class="layui-btn layui-btn-purple layui-btn-xs" lay-event="reject">审核意见</a>
120
- {{# }}}
125
+ {{# } }}
126
+ <a class="layui-btn layui-btn-purple layui-btn-xs" lay-event="target_log">查看记录</a>
121
127
  </script>
128
+
129
+
122
130
  <script type="text/html" id="month_1">
123
131
  {{# if (d.m_target_1 ) { }}
124
132
  <div class="mtarget">{{d.m_target_1}}</div>
@@ -235,6 +243,10 @@
235
243
  })
236
244
 
237
245
  form.on('submit(target_reset_btn)', function (data) {
246
+ form.val('target_form', {
247
+ staff_id: 0,
248
+ year: new Date().getFullYear(),
249
+ });
238
250
  target_property.setValue([]);
239
251
  target_clazz.setValue([]);
240
252
  return false;
@@ -259,7 +271,6 @@
259
271
  data: [{value: '中标', name: '中标'}, {value: '回款', name: '回款'}, {value: '商机', name: '商机'}]
260
272
  })
261
273
 
262
-
263
274
  var target_table = table.render({
264
275
  elem: '#target_table'
265
276
  , toolbar: '#target_progress_toolbar'
@@ -267,94 +278,192 @@
267
278
  , url: '/missions/plans/years_all_target'
268
279
  , page: true
269
280
  , title: "绩效考核指标完成情况" // 目前发现的作用(导出文件的文件名)
270
- , defaultToolbar: ['filter']
281
+ , defaultToolbar: ['']
271
282
  , height: 'full-200'
272
283
  , cols: [
273
284
  [ //标题栏
274
- {field: 'id', group: 'id', align: 'center', title: '序号', width: 80, rowspan: 3}
275
- , {field: 'name', align: 'center', title: '姓名', width: 100, rowspan: 3}
276
- , {field: 'target_clazz', align: 'center', title: '类别', width: 100, rowspan: 3, totalRowText: '合计'}
277
- , {field: 'year_target', align: 'center', title: '年度目标', width: 100, rowspan: 3, totalRow: true}
278
- , {field: 'school_tag_name', align: 'center', title: '客户类型', width: 100, rowspan: 3}
279
- , {field: 'year_clazz_target', align: 'center', title: '分项目标', width: 100, rowspan: 3, totalRow: true}
280
- , {field: 'year_plan', title: '年度计划', width: 100, rowspan: 3, totalRow: true}
281
- , {field: 'year_diff', title: '年度差额', width: 100, rowspan: 3, totalRow: true}
282
-
283
- , {align: 'center', title: '1月', colspan: 3}
284
- , {align: 'center', title: '2月', colspan: 3}
285
- , {align: 'center', title: '3月', colspan: 3}
286
- , {align: 'center', title: '4月', colspan: 3}
287
- , {align: 'center', title: '5月', colspan: 3}
288
- , {align: 'center', title: '6月', colspan: 3}
289
- , {align: 'center', title: '7月', colspan: 3}
290
- , {align: 'center', title: '8月', colspan: 3}
291
- , {align: 'center', title: '9月', colspan: 3}
292
- , {align: 'center', title: '10月', colspan: 3}
293
- , {align: 'center', title: '11月', colspan: 3}
294
- , {align: 'center', title: '12月', colspan: 3}
285
+ {field: 'id', group: 'id', align: 'center', title: '序号', maxWidth: 30, rowspan: 2}
286
+ , {field: 'name', align: 'center', title: '姓名', maxWidth: 30, rowspan: 2}
287
+ , {field: 'target_clazz', align: 'center', title: '类别', maxWidth: 30, rowspan: 2, totalRowText: '合计'}
288
+ , {field: 'year_target', align: 'center', title: '年度目标', maxWidth: 30, rowspan: 2, totalRow: true}
289
+ , {field: 'school_tag_name', align: 'center', title: '客户类型', maxWidth: 30, rowspan: 2}
290
+ , {field: 'year_clazz_target', align: 'center', title: '分项目标', maxWidth: 30, rowspan: 2, totalRow: true}
291
+ , {field: 'year_plan', title: '年度计划', minWidth: 70, rowspan: 2, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('plan', 0, d.year_plan, d.year_diff, d.id)}}
292
+ , {field: 'year_diff', title: '年度差额', minWidth: 70, rowspan: 2, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('diff', 0, d.year_diff, 0, d.id)}}
293
+
294
+ ,{field:"month_1", align: 'center', title: '1月', colspan: 3}
295
+ ,{field:"month_2", align: 'center', title: '2月', colspan: 3}
296
+ ,{field:"month_3", align: 'center', title: '3月', colspan: 3}
297
+ ,{field:"month_4", align: 'center', title: '4月', colspan: 3}
298
+ ,{field:"month_5", align: 'center', title: '5月', colspan: 3}
299
+ ,{field:"month_6", align: 'center', title: '6月', colspan: 3}
300
+ ,{field:"month_7", align: 'center', title: '7月', colspan: 3}
301
+ ,{field:"month_8", align: 'center', title: '8月', colspan: 3}
302
+ ,{field:"month_9", align: 'center', title: '9月', colspan: 3}
303
+ ,{field:"month_10", align: 'center', title: '10月', colspan: 3}
304
+ ,{field:"month_11", align: 'center', title: '11月', colspan: 3}
305
+ ,{field:"month_12", align: 'center', title: '12月', colspan: 3}
295
306
  ],
296
307
  [
297
- {field: 'target_1', title: '目标', width: 100, totalRow: true}
298
- , {field: 'plan_1', title: '计划', width: 100, totalRow: true}
299
- , {field: 'finish_1', title: '完成', width: 100, totalRow: true}
308
+ {field: 'target_1', align: 'center', title: '目标', width: 30, totalRow: true}
309
+ ,{field: 'plan_1', align: 'center', title: '计划', width: 30, totalRow:true, templet: function(d) {return generateExecuteColumnTemplet('plan', 1 , d.plan_1, 0, d.id)}}
310
+ ,{field: 'finish_1', align: 'center', title: '完成', width: 30, totalRow:true, templet: function(d) {return generateExecuteColumnTemplet('finish', 1, d.finish_1, d.target_1, d.id)}}
300
311
 
301
- , {field: 'target_2', title: '目标', width: 100, totalRow: true}
302
- , {field: 'plan_2', title: '计划', width: 100, totalRow: true}
303
- , {field: 'finish_2', title: '完成', width: 100, totalRow: true}
312
+ ,{field: 'target_2', align: 'center', title: '目标', width: 30, totalRow:true}
313
+ ,{field: 'plan_2', align: 'center', title: '计划', width: 30, totalRow:true, templet: function(d) {return generateExecuteColumnTemplet('plan', 2, d.plan_2, 0, d.id)}}
314
+ ,{field: 'finish_2', align: 'center', title: '完成', width: 30, totalRow:true, templet: function(d) {return generateExecuteColumnTemplet('finish', 2, d.finish_2, d.target_2, d.id)}}
304
315
 
305
- , {field: 'target_3', title: '目标', width: 100, totalRow: true}
306
- , {field: 'plan_3', title: '计划', width: 100, totalRow: true}
307
- , {field: 'finish_3', title: '完成', width: 100, totalRow: true}
316
+ ,{field: 'target_3', align: 'center', title: '目标', width: 30, totalRow:true}
317
+ ,{field: 'plan_3', align: 'center', title: '计划', width: 30, totalRow:true, templet: function(d) {return generateExecuteColumnTemplet('plan', 3, d.plan_3, 0, d.id)}}
318
+ ,{field: 'finish_3', align: 'center', title: '完成', width: 30, totalRow:true, templet: function(d) {return generateExecuteColumnTemplet('finish', 3, d.finish_3, d.target_3, d.id)}}
308
319
 
309
- , {field: 'target_4', title: '目标', width: 100, totalRow: true}
310
- , {field: 'plan_4', title: '计划', width: 100, totalRow: true}
311
- , {field: 'finish_4', title: '完成', width: 100, totalRow: true}
320
+ ,{field: 'target_4', align: 'center', title: '目标', width: 30, totalRow:true}
321
+ ,{field: 'plan_4', align: 'center', title: '计划', width: 30, totalRow:true, templet: function(d) {return generateExecuteColumnTemplet('plan', 4, d.plan_4, 0, d.id)}}
322
+ ,{field: 'finish_4', align: 'center', title: '完成', width: 30, totalRow:true, templet: function(d) {return generateExecuteColumnTemplet('finish', 4, d.finish_4, d.target_4, d.id)}}
312
323
 
313
- , {field: 'target_5', title: '目标', width: 100, totalRow: true}
314
- , {field: 'plan_5', title: '计划', width: 100, totalRow: true}
315
- , {field: 'finish_5', title: '完成', width: 100, totalRow: true}
324
+ ,{field: 'target_5', align: 'center', title: '目标', width: 30, totalRow:true}
325
+ ,{field: 'plan_5', align: 'center', title: '计划', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('plan', 5, d.plan_5, 0, d.id)}}
326
+ ,{field: 'finish_5', align: 'center', title: '完成', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('finish', 5, d.finish_5, d.target_5, d.id)}}
316
327
 
317
- , {field: 'target_6', title: '目标', width: 100, totalRow: true}
318
- , {field: 'plan_6', title: '计划', width: 100, totalRow: true}
319
- , {field: 'finish_6', title: '完成', width: 100, totalRow: true}
328
+ ,{field: 'target_6', align: 'center', title: '目标', width: 30, totalRow: true}
329
+ ,{field: 'plan_6', align: 'center', title: '计划', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('plan', 6, d.plan_6, 0, d.id)}}
330
+ ,{field: 'finish_6', align: 'center', title: '完成', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('finish', 6, d.finish_6, d.target_6, d.id)}}
320
331
 
321
- , {field: 'target_7', title: '目标', width: 100, totalRow: true}
322
- , {field: 'plan_7', title: '计划', width: 100, totalRow: true}
323
- , {field: 'finish_7', title: '完成', width: 100, totalRow: true}
332
+ ,{field: 'target_7', align: 'center', title: '目标', width: 30, totalRow: true}
333
+ ,{field: 'plan_7', align: 'center', title: '计划', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('plan', 7, d.plan_7, 0, d.id)}}
334
+ ,{field: 'finish_7', align: 'center', title: '完成', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('finish', 7, d.finish_7, d.target_7, d.id)}}
324
335
 
325
- , {field: 'target_8', title: '目标', width: 100, totalRow: true}
326
- , {field: 'plan_8', title: '计划', width: 100, totalRow: true}
327
- , {field: 'finish_8', title: '完成', width: 100, totalRow: true}
336
+ ,{field: 'target_8', align: 'center', title: '目标', width: 30, totalRow: true}
337
+ ,{field: 'plan_8', align: 'center', title: '计划', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('plan', 8, d.plan_8, 0, d.id)}}
338
+ ,{field: 'finish_8', align: 'center', title: '完成', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('finish', 8, d.finish_8, d.target_8, d.id)}}
328
339
 
329
- , {field: 'target_9', title: '目标', width: 100, totalRow: true}
330
- , {field: 'plan_9', title: '计划', width: 100, totalRow: true}
331
- , {field: 'finish_9', title: '完成', width: 100, totalRow: true}
340
+ ,{field: 'target_9', align: 'center', title: '目标', width: 30, totalRow: true}
341
+ ,{field: 'plan_9', align: 'center', title: '计划', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('plan', 9, d.plan_9, 0, d.id)}}
342
+ ,{field: 'finish_9', align: 'center', title: '完成', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('finish', 9, d.finish_9, d.target_9, d.id)}}
332
343
 
333
- , {field: 'target_10', title: '目标', width: 100, totalRow: true}
334
- , {field: 'plan_10', title: '计划', width: 100, totalRow: true}
335
- , {field: 'finish_10', title: '完成', width: 100, totalRow: true}
344
+ ,{field: 'target_10', align: 'center', title: '目标', width: 30, totalRow: true}
345
+ ,{field: 'plan_10', align: 'center', title: '计划', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('plan', 10, d.plan_10, 0, d.id)}}
346
+ ,{field: 'finish_10', align: 'center', title: '完成', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('finish', 10, d.finish_10, d.target_10, d.id)}}
336
347
 
337
- , {field: 'target_11', title: '目标', width: 100, totalRow: true}
338
- , {field: 'plan_11', title: '计划', width: 100, totalRow: true}
339
- , {field: 'finish_11', title: '完成', width: 100, totalRow: true}
348
+ ,{field: 'target_11', align: 'center', title: '目标', width: 30, totalRow: true}
349
+ ,{field: 'plan_11', align: 'center', title: '计划', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('plan', 11, d.plan_11, 0, d.id)}}
350
+ ,{field: 'finish_11', align: 'center', title: '完成', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('finish', 11, d.finish_11, d.target_11, d.id)}}
340
351
 
341
- , {field: 'target_12', title: '目标', width: 100, totalRow: true}
342
- , {field: 'plan_12', title: '计划', width: 100, totalRow: true}
343
- , {field: 'finish_12', title: '完成', width: 100, totalRow: true}
352
+ ,{field: 'target_12', align: 'center', title: '目标', width: 30, totalRow: true}
353
+ ,{field: 'plan_12', align: 'center', title: '计划', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('plan', 12, d.plan_12, 0, d.id)}}
354
+ ,{field: 'finish_12', align: 'center', title: '完成', width: 30, totalRow: true, templet: function(d) {return generateExecuteColumnTemplet('finish', 12, d.finish_12, d.target_12, d.id)}}
344
355
  ]],
345
356
  done: function (res, curr, count) {
346
- merge(res);
347
- var id = res.data[0]['id'];
348
- if (!id) {
349
- $("[data-field='id']").css('display', 'none');
350
- $("[data-field='name']").css('display', 'none');
357
+ if (res.data.length === 0) return false;
358
+ targetMerge(res);
359
+ var totalYearTarget = 0;
360
+ layui.each(res.data, function(index, item) {
361
+ totalYearTarget += item.year_clazz_target;
362
+ });
363
+ var innerHtml = '<div class="layui-table-cell laytable-cell-1-0-4" align="center">' + totalYearTarget + '</div>';
364
+ layui.$('[lay-id="target_table"] .layui-table-total td[data-field="year_target"]').html(innerHtml);
365
+
366
+ if (!res.data[0]['id']) {
367
+ $("[lay-id='target_table'] [data-field='id']").css('display', 'none');
368
+ $("[lay-id='target_table'] [data-field='name']").css('display', 'none');
369
+ }
370
+
371
+ var currentMonth = new Date().getMonth() + 1;
372
+
373
+ for (let i = 1; i < currentMonth; i++) {
374
+ let planField = 'plan_' + i;
375
+ let targetField = 'target_' + i;
376
+ $(`[lay-id='target_table'] [data-field=${planField}]`).css('display', 'none');
377
+ $(`[lay-id='target_table'] [data-field=${targetField}]`).css('display', 'none');
378
+
379
+ let th_field = 'month_' + i;
380
+ var thElement = document.querySelector(`[lay-id='target_table'] .layui-table-header th[data-field=${th_field}]`);
381
+ if (thElement) {
382
+ var colspan = parseInt(thElement.getAttribute('colspan'));
383
+ if (!isNaN(colspan)) {
384
+ thElement.setAttribute('colspan', colspan - 2);
385
+ }
386
+ }
387
+ }
388
+ for (let i = currentMonth+1; i <= 12; i++) {
389
+ let field = 'finish_' + i;
390
+ $(`[lay-id='target_table'] [data-field=${field}]`).css('display', 'none');
391
+ let th_field = 'month_' + i;
392
+ var thElement = document.querySelector(`[lay-id='target_table'] .layui-table-header th[data-field=${th_field}]`);
393
+ if (thElement) {
394
+ var colspan = parseInt(thElement.getAttribute('colspan'));
395
+ if (!isNaN(colspan)) {
396
+ thElement.setAttribute('colspan', colspan - 1);
397
+ }
398
+ }
351
399
  }
352
- table.render('select');
353
400
  }
354
401
  });
402
+ function targetMerge(res) {
403
+ var data = res.data;
404
+ var mergeIndex = 0;//定位需要添加合并属性的行数
405
+ var mark = 1; //这里涉及到简单的运算,mark是计算每次需要合并的格子数
406
+ var columsName = ['id','name','target_clazz',{name:'year_target',mergeBase:'target_clazz',valueBase:'year_clazz_target'}];//需要合并的列名称
407
+ var columsIndex = [0,1,2,3];//需要合并的列索引值
408
+ for (var k = 0; k < columsName.length; k++) { //这里循环所有要合并的列
409
+ var trArr = $('[lay-id="target_table"] .layui-table-body>.layui-table').find("tr");//所有行
410
+ for (var i = 1; i < res.data.length; i++) { //这里循环表格当前的数据
411
+ var tdCurArr = trArr.eq(i).find("td").eq(columsIndex[k]);//获取当前行的当前列
412
+ var tdPreArr = trArr.eq(mergeIndex).find("td").eq(columsIndex[k]);//获取相同列的第一列
413
+ var opt = columsName[k];
414
+ var name = opt.name;
415
+ var mergeBase = opt.mergeBase;
416
+ var valueBase = opt.valueBase;
417
+
418
+ if(name && mergeBase){
419
+ var tdCurValue = parseFloat(tdPreArr[0].querySelector('.layui-table-cell').textContent) || 0;
420
+ if(valueBase && !tdCurValue){
421
+ tdPreArr[0].querySelector('.layui-table-cell').innerHTML = data[i-1][valueBase];
422
+ }
423
+
424
+ if (data[i]['id'] === data[i-1]['id'] && data[i][mergeBase] === data[i-1][mergeBase]) { //后一行的值与前一行的值做比较,相同就需要合并
425
+ mark += 1;
426
+ tdPreArr.each(function (a,b) {//相同列的第一列增加rowspan属性
427
+ $(this).attr("rowspan", mark);
428
+ var oldV = parseFloat($(this).find('.layui-table-cell').html()) || 0;
429
+ var curentV;
430
+ if(valueBase){
431
+ curentV = parseFloat(data[i][valueBase]) || 0;
432
+ }else{
433
+ curentV = parseFloat(data[i][name]) || 0;
434
+ }
435
+ var newV = oldV + curentV;
436
+ $(this).find('.layui-table-cell').html(newV);
437
+ });
438
+ tdCurArr.each(function () {//当前行隐藏
439
+ $(this).css("display", "none");
440
+ });
441
+ }else {
442
+ mergeIndex = i;
443
+ mark = 1;//一旦前后两行的值不一样了,那么需要合并的格子数mark就需要重新计算
444
+ }
445
+ }else{
446
+ if (data[i]['id'] === data[i-1]['id'] && data[i][columsName[k]] === data[i-1][columsName[k]]) { //后一行的值与前一行的值做比较,相同就需要合并
447
+ mark += 1;
448
+ tdPreArr.each(function () {//相同列的第一列增加rowspan属性
449
+ $(this).attr("rowspan", mark);
450
+ });
451
+ tdCurArr.each(function () {//当前行隐藏
452
+ $(this).css("display", "none");
453
+ });
454
+ }else {
455
+ mergeIndex = i;
456
+ mark = 1;//一旦前后两行的值不一样了,那么需要合并的格子数mark就需要重新计算
457
+ }
458
+ }
459
+ }
460
+ mergeIndex = 0;
461
+ mark = 1;
462
+ }
463
+ }
355
464
 
356
- table.on('toolbar(year_all_target_form)', function (obj) {
357
- search = form.val('assessment_progress_form')
465
+ table.on('toolbar(target_table_filter)', function (obj) {
466
+ search = form.val('target_form')
358
467
  var event = obj.event;
359
468
  switch (event) {
360
469
  case 'show_staff':
@@ -366,7 +475,8 @@
366
475
  break;
367
476
  case 'export':
368
477
  layer.load(0, {});
369
- request.authGet("missions/plans/years_all_target?=" + $.param({q: search}), {}, function (res) {
478
+ $ = layui.$;
479
+ request.authGet("missions/plans/years_all_target?=" + $.param(search), {}, function (res) {
370
480
  data = res.data
371
481
  table.exportFile(target_table.config.id, data, 'xls');
372
482
  layer.closeAll('loading');
@@ -381,7 +491,40 @@
381
491
  $(buttonId).siblings('.layui-btn').removeClass('layui-btn-default').addClass('layui-btn-primary');
382
492
  $(buttonId).removeClass('layui-btn-primary').addClass('layui-btn-default');
383
493
  }
384
- })
494
+ });
495
+
496
+ table.on('tool(target_table_filter)', function (obj) {
497
+ let event = obj.event; // 获取事件名
498
+ let rowData = obj.data; // 获取当前行的数据
499
+ let formVal = form.val('target_form');
500
+ if (event !== '' && event.includes('business')) {
501
+ let params = event.split('_');
502
+ console.log(params);
503
+ _year = formVal.year;
504
+ type = params[1];
505
+ month = params[2];
506
+ staff_id = rowData.staff_id;
507
+ _target_clazz = rowData.target_clazz;
508
+ school_tag_id = rowData.school_tag_id;
509
+ let paramString = 'year=' + _year + '&month=' + month + '&staff_id=' + staff_id + '&school_tag_id=' +
510
+ school_tag_id + '&_target_clazz=' + _target_clazz + '&type=' + type;
511
+
512
+ content = miniPage.getHrefContent('/missions/plans/staff_year_business?' + paramString);
513
+ openWH = miniPage.getOpenWidthHeight();
514
+ index = layer.open({
515
+ type: 1,
516
+ shade: 0.2,
517
+ maxmin: true,
518
+ shadeClose: true,
519
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
520
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
521
+ content: content
522
+ });
523
+ $(window).on("resize", function () {
524
+ layer.full(index);
525
+ });
526
+ }
527
+ });
385
528
 
386
529
  function editable(i) {
387
530
  return function (d) {
@@ -391,53 +534,48 @@
391
534
  };
392
535
  }
393
536
 
394
- add_progress_table = table.render({
537
+ staff_year_target_table = table.render({
395
538
  elem: '#target_history_table'
396
- , url: '/missions/plans/year_target'
539
+ , url: '/missions/plans/staff_year_target'
397
540
  , defaultToolbar: []
398
541
  , cols: [[
399
- {field: 'num', title: '序号', width: 50},
400
- {field: 'staff', title: '姓名', width: 100},
401
- {field: 'school_tag', title: '客户类型', width: 100}
402
- , {field: 'target_clazz', title: '目标类别', width: 100}
542
+ {field: 'id', title: '序号', width: 80, fixed:'left', type: 'numbers'},
543
+ {field: 'staff', title: '姓名', width: 100, fixed:'left'},
544
+ {field: 'school_tag', title: '客户类型', width: 100, fixed:'left'}
545
+ , {field: 'target_clazz', title: '目标类别', width: 100, fixed:'left'}
403
546
  , {field: 'year', title: '年份', width: 100}
404
547
  , {field: 'year_target', title: '年度目标', width: 100}
405
548
  , {field: 'year_finish', title: '年度完成', width: 100}
406
549
  , {field: 'year_diff', title: '年度差额', width: 100}
407
- , {field: 'm_target_1', title: '1月', width: 100, edit: editable(1), templet: "#month_1"}
408
- , {field: 'm_target_2', title: '2月', width: 100, edit: editable(2), templet: "#month_2"}
409
- , {field: 'm_target_3', title: '3月', width: 100, edit: editable(3), templet: "#month_3"}
410
- , {field: 'm_target_4', title: '4月', width: 100, edit: editable(4), templet: "#month_4"}
411
- , {field: 'm_target_5', title: '5月', width: 100, edit: editable(5), templet: "#month_5"}
412
- , {field: 'm_target_6', title: '6月', width: 100, edit: editable(6), templet: "#month_6"}
413
- , {field: 'm_target_7', title: '7月', width: 100, edit: editable(7), templet: "#month_7"}
414
- , {field: 'm_target_8', title: '8月', width: 100, edit: editable(8), templet: "#month_8"}
415
- , {field: 'm_target_9', title: '9月', width: 100, edit: editable(9), templet: "#month_9"}
416
- , {field: 'm_target_10', title: '10月', width: 100, edit: editable(10), templet: "#month_10"}
417
- , {field: 'm_target_11', title: '11月', width: 100, edit: editable(11), templet: "#month_11"}
418
- , {field: 'm_target_12', title: '12月', width: 100, edit: editable(12), templet: "#month_12"}
550
+ , {field: 'target_1', title: '1月', minWidth:80, edit: editable(1), templet: "#month_1"}
551
+ , {field: 'target_2', title: '2月', minWidth:80, edit: editable(2), templet: "#month_2"}
552
+ , {field: 'target_3', title: '3月', minWidth:80, edit: editable(3), templet: "#month_3"}
553
+ , {field: 'target_4', title: '4月', minWidth:80, edit: editable(4), templet: "#month_4"}
554
+ , {field: 'target_5', title: '5月', minWidth:80, edit: editable(5), templet: "#month_5"}
555
+ , {field: 'target_6', title: '6月', minWidth:80, edit: editable(6), templet: "#month_6"}
556
+ , {field: 'target_7', title: '7月', minWidth:80, edit: editable(7), templet: "#month_7"}
557
+ , {field: 'target_8', title: '8月', minWidth:80, edit: editable(8), templet: "#month_8"}
558
+ , {field: 'target_9', title: '9月', minWidth:80, edit: editable(9), templet: "#month_9"}
559
+ , {field: 'target_10', title: '10月', minWidth:80, edit: editable(10), templet: "#month_10"}
560
+ , {field: 'target_11', title: '11月', minWidth:80, edit: editable(11), templet: "#month_11"}
561
+ , {field: 'target_12', title: '12月', minWidth:80, edit: editable(12), templet: "#month_12"}
419
562
  , {field: 'state', title: '审核状态', width: 100}
420
563
  , {field: 'reviewer', title: '审批人', width: 100}
421
564
  , {field: 'updated_at', title: '更新时间', width: 150}
422
- , {templet: '#op', title: '操作', width: 200}
565
+ , {templet: '#op', title: '操作', width: '250', fixed: 'right'}
423
566
  ]]
424
567
  });
425
568
  form.render();
426
569
 
427
570
  table.on('tool(target_history_table)', function (obj) {
428
- console.log('---', obj)
429
571
  var data = table.cache['target_history_table'];
572
+ id = obj.data.id;
430
573
  if (obj.event == 'cancel') {
431
- data.splice(obj.index, 1);
574
+ if (!id) {
575
+ data.splice(obj.index, 1);
576
+ }
577
+ data[obj.index].edit = false;
432
578
  table.renderData('target_history_table');
433
- } else if (obj.event == 'add') {
434
- request.post('missions/plans/add_year_target', obj.data, function (res) {
435
- // data[obj.index].id = res.id;
436
- // data[obj.index].state = res.state;
437
- // data[obj.index].updated_at = res.updated_at;
438
- // table.renderData('target_history_table');
439
- table.reload('target_history_table')
440
- })
441
579
  } else if (obj.event == 'reject') {
442
580
  layer.open({
443
581
  type: 1,
@@ -449,8 +587,9 @@
449
587
  data[obj.index].edit = true;
450
588
  table.renderData('target_history_table');
451
589
  change_fields = {}
452
- } else if (obj.event == 'save_edit') {
590
+ } else if (obj.event == 'save') {
453
591
  console.log("change_fields", change_fields)
592
+ change_fields.id = obj.data.id;
454
593
  change_fields.staff_id = obj.data.staff_id;
455
594
  change_fields.year_target = obj.data.year_target;
456
595
  change_fields.target_clazz = obj.data.target_clazz;
@@ -458,44 +597,71 @@
458
597
  change_fields.school_tag_id = obj.data.school_tag_id;
459
598
  change_fields.year_diff = obj.data.year_diff;
460
599
  change_fields.year_finish = obj.data.year_finish;
461
-
462
- request.post('missions/plans/add_year_target', change_fields, function (res) {
463
- table.reload('target_history_table')
600
+ request.post('missions/plans/save_staff_year_target', change_fields, function (res) {
601
+ data[obj.index].id = res.id;
602
+ data[obj.index].edit = false;
603
+ data[obj.index].state = res.state;
604
+ data[obj.index].updated_at = res.updated_at;
605
+ table.renderData('target_history_table')
606
+ table.reload('execute_table');
607
+ table.reload('target_table');
464
608
  })
465
- } else if (obj.event == 'cancel_edit') {
609
+ } else if (obj.event === 'cancel_edit') {
466
610
  data[obj.index].edit = false;
467
611
  table.renderData('target_history_table');
468
- } else if (obj.event == 'audit') {
612
+ } else if (obj.event === 'target_log') {
613
+ content = miniPage.getHrefContent('/missions/plans/staff_year_target_log?target_id=' + id);
614
+ openWH = miniPage.getOpenWidthHeight();
615
+ index = layer.open({
616
+ title: '审核记录',
617
+ type: 1,
618
+ shade: 0.2,
619
+ maxmin: true,
620
+ shadeClose: true,
621
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
622
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
623
+ content: content
624
+ });
625
+ $(window).on("resize", function () {
626
+ layer.full(index);
627
+ });
628
+ } else if (obj.event === 'audit') {
469
629
  layer.prompt({
470
630
  title: '请输入审核', formType: 2, btn: ['同意', '驳回', '取消'],
471
631
  yes: function (index, layero, that) {
472
632
  var comment = $(that.layero[0]).find("textarea").val();
473
- request.put('missions/plans/' + obj.data.id + '/update_year_target', {
633
+ request.put('missions/plans/' + obj.data.id + '/audit_staff_year_target', {
474
634
  comment: comment,
475
635
  state: '已通过'
476
636
  }, function (res) {
477
637
  // var data = table.cache['target_history_table'];
478
- // data[obj.index].state = res.state;
479
- // data[obj.index].updated_at = res.updated_at;
480
- // table.renderData('target_history_table');
481
- table.reload('target_history_table');
482
- table.reload('target_table')
638
+ data[obj.index].state = res.state;
639
+ data[obj.index].comment = res.comment;
640
+ data[obj.index].reviewer = res.reviewer;
641
+ data[obj.index].updated_at = res.updated_at;
642
+ data[obj.index].edit = false;
643
+ table.renderData('target_history_table');
644
+ //table.reload('target_history_table');
645
+ table.reload('target_table');
646
+ table.reload('execute_table');
483
647
  })
484
648
  layer.close(index);
485
649
  },
486
650
  btn2: function (index, layero, that) {
487
651
  var comment = $(that.layero[0]).find("textarea").val();
488
- if (comment == "") {
652
+ if (comment === "") {
489
653
  layer.msg('请输入审核意见')
490
654
  } else {
491
- request.put('missions/plans/' + obj.data.id + '/update_year_target', {
655
+ request.put('missions/plans/' + obj.data.id + '/audit_staff_year_target', {
492
656
  comment: comment,
493
657
  state: '已驳回'
494
658
  }, function (res) {
495
659
  console.log(res)
496
660
  var data = table.cache['target_history_table'];
497
661
  data[obj.index].state = res.state;
662
+ data[obj.index].comment = res.comment;
498
663
  data[obj.index].updated_at = res.updated_at;
664
+ data[obj.index].reviewer = res.reviewer;
499
665
  table.renderData('target_history_table');
500
666
  })
501
667
  layer.close(index);
@@ -517,9 +683,7 @@
517
683
  var value = obj.value // 得到修改后的值
518
684
  var data = obj.data // 得到所在行所有键值
519
685
  var field = obj.field; // 得到字段
520
- console.log("====0", obj)
521
686
  var update = {};
522
- console.log('--2vvv', value, value == '')
523
687
  if (value == '') {
524
688
  change_fields[field] = '';
525
689
  } else if (isNaN(parseFloat(value))) {
@@ -529,81 +693,14 @@
529
693
  update[field] = parseFloat(value);
530
694
  change_fields[field] = parseFloat(value);
531
695
  }
532
-
533
696
  var year_target = 0;
534
697
  for (var i = 1; i <= 12; i++) {
535
- console.log(parseFloat(data['m_target_' + i]))
536
- year_target += parseFloat(data['m_target_' + i]) || 0
698
+ year_target += parseFloat(data['target_' + i]) || 0
537
699
  }
538
700
  update['year_diff'] = year_target - data.year_finish;
539
701
  update['year_target'] = year_target;
540
702
  obj.update(update);
541
- })
542
-
543
- function merge(res) {
544
- var data = res.data;
545
- var mergeIndex = 0;//定位需要添加合并属性的行数
546
- var mark = 1; //这里涉及到简单的运算,mark是计算每次需要合并的格子数
547
- var columsName = ['id','name','target_clazz',{name:'year_target',mergeBase:'target_clazz',valueBase:'year_clazz_target'}];//需要合并的列名称
548
- var columsIndex = [0,1,2,3];//需要合并的列索引值
549
-
550
- for (var k = 0; k < columsName.length; k++) { //这里循环所有要合并的列
551
- var trArr = $(".layui-table-body>.layui-table").find("tr");//所有行
552
- for (var i = 1; i < res.data.length; i++) { //这里循环表格当前的数据
553
- var tdCurArr = trArr.eq(i).find("td").eq(columsIndex[k]);//获取当前行的当前列
554
- var tdPreArr = trArr.eq(mergeIndex).find("td").eq(columsIndex[k]);//获取相同列的第一列
555
- var opt = columsName[k];
556
- var name = opt.name;
557
- var mergeBase = opt.mergeBase;
558
- var valueBase = opt.valueBase;
559
-
560
- if(name && mergeBase){
561
- tdCurValue = parseFloat(tdPreArr[0].querySelector('.layui-table-cell').textContent) || 0;
562
- if(valueBase && !tdCurValue){
563
- tdPreArr[0].querySelector('.layui-table-cell').innerHTML = data[i-1][valueBase];
564
- }
565
-
566
- if (data[i]['name'] === data[i-1]['name'] && data[i][mergeBase] === data[i-1][mergeBase]) { //后一行的值与前一行的值做比较,相同就需要合并
567
- mark += 1;
568
- tdPreArr.each(function (a,b) {//相同列的第一列增加rowspan属性
569
- $(this).attr("rowspan", mark);
570
-
571
- var oldV = parseFloat($(this).find('.layui-table-cell').html()) || 0;
572
- var curentV;
573
- if(valueBase){
574
- curentV = parseFloat(data[i][valueBase]) || 0;
575
- }else{
576
- curentV = parseFloat(data[i][name]) || 0;
577
- }
578
- var newV = oldV + curentV;
579
- $(this).find('.layui-table-cell').html(newV);
580
- });
581
- tdCurArr.each(function () {//当前行隐藏
582
- $(this).css("display", "none");
583
- });
584
- }else {
585
- mergeIndex = i;
586
- mark = 1;//一旦前后两行的值不一样了,那么需要合并的格子数mark就需要重新计算
587
- }
588
- }else{
589
- if (data[i]['name'] === data[i-1]['name'] && data[i][columsName[k]] === data[i-1][columsName[k]]) { //后一行的值与前一行的值做比较,相同就需要合并
590
- mark += 1;
591
- tdPreArr.each(function () {//相同列的第一列增加rowspan属性
592
- $(this).attr("rowspan", mark);
593
- });
594
- tdCurArr.each(function () {//当前行隐藏
595
- $(this).css("display", "none");
596
- });
597
- }else {
598
- mergeIndex = i;
599
- mark = 1;//一旦前后两行的值不一样了,那么需要合并的格子数mark就需要重新计算
600
- }
601
- }
602
- }
603
- mergeIndex = 0;
604
- mark = 1;
605
- }
606
- }
703
+ });
607
704
 
608
705
  form.on('submit(progress_search_btn)', function (data) {
609
706
  var search = data.field;
@@ -611,7 +708,7 @@
611
708
  return false;
612
709
  })
613
710
 
614
- form.on('submit(reset_add_taregt)', function (data) {
711
+ form.on('submit(reset_add_target)', function (data) {
615
712
  add_property_list.setValue([])
616
713
  add_clazz.setValue([]);
617
714
  form.val('add_year_target_form', {
@@ -624,13 +721,13 @@
624
721
  var search = data.field;
625
722
  search.school_tag_id = add_property_list.getValue('valueStr');
626
723
  console.log(search)
627
- if (search.staff_id == "") {
724
+ if (search.staff_id === "") {
628
725
  layer.msg('请选择人员')
629
- } else if (search.year == "") {
726
+ } else if (search.year === "") {
630
727
  layer.msg('请选择年度')
631
- } else if (search.school_tag_id == "") {
728
+ } else if (search.school_tag_id === "") {
632
729
  layer.msg('请选择客户类型')
633
- } else if (search.target_clazz == "") {
730
+ } else if (search.target_clazz === "") {
634
731
  layer.msg('请选择目标类别')
635
732
  } else {
636
733
  request.post('missions/plans/cal_finish_amount', {
@@ -647,7 +744,7 @@
647
744
  search.school_tag = add_property_list.getValue('nameStr');
648
745
  search.staff = $("#add_staff_id option:selected").text();
649
746
 
650
- data.push(search)
747
+ data.unshift(search)
651
748
  table.renderData('target_history_table');
652
749
  })
653
750
 
@@ -659,19 +756,37 @@
659
756
  search.school_tag_id = add_property_list.getValue('valueStr');
660
757
  table.reload('target_history_table', {
661
758
  where: search,
662
- url: '/missions/plans/year_target'
759
+ url: '/missions/plans/staff_year_target'
663
760
  });
664
761
  return false;
665
762
  })
666
-
667
-
668
763
  function loadFinishTable(search) {
669
764
  table.reload('target_table', {
670
765
  where: search,
671
766
  url: '/missions/plans/years_all_target'
672
767
  });
673
768
  }
674
-
769
+ function generateExecuteColumnTemplet(type, time, num = 0, target = 0, id = 0) {
770
+ if (id === 0) {
771
+ if (type === 'diff' && num > 0) {
772
+ return '<div style="color:red">' + num + '</div>';
773
+ } else {
774
+ return num;
775
+ }
776
+ }
777
+ let event = 'business_' + type + '_' + time;
778
+ if (type === 'plan') {
779
+ if (num === 0) {
780
+ return num;
781
+ } else {
782
+ return '<div><a href="javascript:void(0);" class="layui-table-link" lay-event="' + event + '">' + num + '</a></div>';
783
+ }
784
+ } else if (type === 'diff' && num > 0) {
785
+ return '<div style="color:red">' + num + '</div>';
786
+ } else {
787
+ return num;
788
+ }
789
+ }
675
790
  })
676
791
 
677
792
  </script>