educode_sales 1.10.58 → 1.10.70

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/educode_sales/indexlogo.png +0 -0
  3. data/app/assets/javascripts/educode_sales/application.js +1 -0
  4. data/app/assets/javascripts/educode_sales/functions.js +24 -0
  5. data/app/controllers/educode_sales/application_controller.rb +11 -3
  6. data/app/controllers/educode_sales/business_courses_controller.rb +19 -8
  7. data/app/controllers/educode_sales/follow_ups_controller.rb +4 -0
  8. data/app/controllers/educode_sales/plans_controller.rb +718 -11
  9. data/app/controllers/educode_sales/shixuns_controller.rb +20 -10
  10. data/app/controllers/educode_sales/subjects_controller.rb +10 -6
  11. data/app/controllers/educode_sales/teacher_follows_controller.rb +4 -0
  12. data/app/controllers/educode_sales/teachers_controller.rb +3 -0
  13. data/app/models/educode_sales/business.rb +5 -5
  14. data/app/models/educode_sales/permission.rb +7 -0
  15. data/app/models/educode_sales/sales_target.rb +10 -0
  16. data/app/models/educode_sales/sales_target_history.rb +11 -0
  17. data/app/models/educode_sales/sales_target_log.rb +11 -0
  18. data/app/views/educode_sales/business_courses/index.html.erb +1 -1
  19. data/app/views/educode_sales/business_courses/new.html.erb +2 -2
  20. data/app/views/educode_sales/businesses/_follows.html.erb +107 -100
  21. data/app/views/educode_sales/businesses/index.html.erb +6 -3
  22. data/app/views/educode_sales/businesses/index.json.jbuilder +2 -2
  23. data/app/views/educode_sales/businesses/show_follow.json.jbuilder +1 -1
  24. data/app/views/educode_sales/contracts/_follows.html.erb +75 -69
  25. data/app/views/educode_sales/contracts/_list.html.erb +283 -249
  26. data/app/views/educode_sales/contracts/index.json.jbuilder +1 -1
  27. data/app/views/educode_sales/follow_ups/index.json.jbuilder +1 -1
  28. data/app/views/educode_sales/plans/_year_execute.html.erb +428 -0
  29. data/app/views/educode_sales/plans/_year_target.html.erb +792 -0
  30. data/app/views/educode_sales/plans/index.html.erb +105 -83
  31. data/app/views/educode_sales/plans/staff_year_business.html.erb +96 -0
  32. data/app/views/educode_sales/plans/staff_year_business.json.jbuilder +22 -0
  33. data/app/views/educode_sales/plans/staff_year_target.json.jbuilder +35 -0
  34. data/app/views/educode_sales/plans/staff_year_target_log.html.erb +62 -0
  35. data/app/views/educode_sales/plans/staff_year_target_log.json.jbuilder +34 -0
  36. data/app/views/educode_sales/plans/year_execute.js.erb +1 -0
  37. data/app/views/educode_sales/plans/year_target.js.erb +1 -0
  38. data/app/views/educode_sales/plans/year_target.json.jbuilder +48 -0
  39. data/app/views/educode_sales/plans/years_all_target.json.jbuilder +54 -0
  40. data/app/views/educode_sales/sales_details/_index.html.erb +6 -3
  41. data/app/views/educode_sales/shixun_dectects/markdown.html.erb +40 -1
  42. data/app/views/educode_sales/shixuns/index.html.erb +106 -97
  43. data/app/views/educode_sales/shixuns/new.html.erb +2 -2
  44. data/app/views/educode_sales/staffs/index.json.jbuilder +1 -1
  45. data/app/views/educode_sales/subjects/index.html.erb +1 -1
  46. data/app/views/educode_sales/subjects/new.html.erb +2 -2
  47. data/app/views/educode_sales/teachers/_follows.html.erb +24 -17
  48. data/app/views/educode_sales/teachers/_index.html.erb +6 -0
  49. data/app/views/layouts/educode_sales/application.html.erb +7 -4
  50. data/config/environments/development.rb +16 -0
  51. data/config/routes.rb +14 -2
  52. data/db/migrate/20230729085359_create_educode_sales_sales_target_histories.rb +45 -0
  53. data/lib/educode_sales/version.rb +1 -1
  54. metadata +24 -8
  55. data/app/views/educode_sales/plans/_target_track.html.erb +0 -178
  56. data/app/views/educode_sales/plans/target_track.js.erb +0 -1
@@ -0,0 +1,792 @@
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>
15
+ <div id="year_target_wraper">
16
+ <div class="layuimini-main min-height-table" id="year_target_table_wraper">
17
+ <form class="layui-form layui-form-pane" lay-filter="target_form">
18
+ <div class="layui-form-item">
19
+ <div class="layui-inline">
20
+ <label class="layui-form-label">人员</label>
21
+ <div class="layui-input-inline large-select">
22
+ <%= select_tag "staff_id", options_for_select(@staffs), { id: 'target_staff_id', include_blank: true} %>
23
+ </div>
24
+ </div>
25
+ <div class="layui-inline">
26
+ <label class="layui-form-label">年度</label>
27
+ <div class="layui-input-inline">
28
+ <input type="text" class="layui-input" autocomplete="off" name="year" value="<%= Time.now.year %>" id="target_year">
29
+ </div>
30
+ </div>
31
+ <div class="layui-inline">
32
+ <label class="layui-form-label">客户类型</label>
33
+ <div class="layui-input-inline">
34
+ <div id="target_property" style="width: 190px;"></div>
35
+ </div>
36
+ </div>
37
+ <div class="layui-inline">
38
+ <label class="layui-form-label">目标类别</label>
39
+ <div class="layui-input-inline">
40
+ <div id="target_clazz" style="width: 190px;"></div>
41
+ </div>
42
+ </div>
43
+ <div class="layui-inline">
44
+ <button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="target_reset_btn">重置
45
+ </button>
46
+ <button type="submit" id="progress_search_btn" class="layui-btn layui-btn-primary" lay-submit lay-filter="progress_search_btn">检索
47
+ </button>
48
+ </div>
49
+ </div>
50
+ </form>
51
+ <table class="layui-tab" id="target_table" lay-filter="target_table_filter"></table>
52
+ </div>
53
+ <hr style="height:30px;background: #ccc; margin: 0px 15px;"/>
54
+ <div class="layuimini-main min-height-table" id="year_target_add_wraper">
55
+ <form class="layui-form layui-form-pane" lay-filter="add_year_target_form">
56
+ <div class="layui-form-item">
57
+ <div class="layui-inline">
58
+ <label class="layui-form-label">人员</label>
59
+ <div class="layui-input-inline large-select" style="width: 120px">
60
+ <%= select_tag "staff_id", options_for_select(@staffs), { id: "add_staff_id", include_blank: true } %>
61
+ </div>
62
+ </div>
63
+ <div class="layui-inline">
64
+ <label class="layui-form-label">年度</label>
65
+ <div class="layui-input-inline" style="width:100px">
66
+ <input type="text" class="layui-input" autocomplete="off" name="year" value="<%= Time.now.year %>" id="add_target_year">
67
+ </div>
68
+ </div>
69
+ <div class="layui-inline">
70
+ <label class="layui-form-label">客户类型</label>
71
+ <div class="layui-input-inline">
72
+ <div id="add_target_property" style="width: 160px;"></div>
73
+ </div>
74
+ </div>
75
+ <div class="layui-inline">
76
+ <label class="layui-form-label">目标类别</label>
77
+ <div class="layui-input-inline">
78
+ <div id="add_target_clazz" style="width: 140px;"></div>
79
+ </div>
80
+ </div>
81
+ <div class="layui-inline">
82
+ <button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_add_target">重置
83
+ </button>
84
+ <button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_target_history">检索
85
+ </button>
86
+ <% if can? :new_create, EducodeSales::SalePlan %>
87
+ <button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="add_btn">添加
88
+ </button>
89
+ <% end %>
90
+ </div>
91
+ </div>
92
+ </form>
93
+ <table class="layui-tab" id="target_history_table" lay-filter="target_history_table"></table>
94
+ </div>
95
+ </div>
96
+ <script type="text/html" id="target_progress_toolbar">
97
+ <div class="layui-btn-container">
98
+ <span class="table-label">&nbsp;</span>
99
+ <button class="layui-btn layui-btn-primary layui-btn-sm pull-right" lay-event="export"> 导出</button>
100
+ <button class="layui-btn layui-btn-primary layui-btn-sm pull-right" lay-event="show_all" id="show_all"> 分类显示</button>
101
+ <button class="layui-btn layui-btn-default layui-btn-sm pull-right" lay-event="show_staff" id="show_staff"> 人员显示</button>
102
+ </div>
103
+ </script>
104
+ <script type="text/html" id="add_target_progress_toolbar">
105
+ <div class="layui-btn-container">
106
+ <span class="table-label">&nbsp</span>
107
+ <button class="layui-btn layui-btn-default layui-btn-sm data-add-btn pull-right" lay-event="add">添加</button>
108
+ </div>
109
+ </script>
110
+ <script type="text/html" id="op">
111
+ {{# if (d.state == "" || d.state == undefined || d.edit) { }}
112
+ <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="save">保存</a>
113
+ <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="cancel">取消</a>
114
+ {{# } else if (d.state == '待审核') { }}
115
+ <% if can? :new_audit, EducodeSales::SalePlan %>
116
+ <a class="layui-btn layui-btn-default layui-btn-xs" lay-event="audit">审核</a>
117
+ <% end %>
118
+ {{# } else if (d.state == '已通过' || d.state == '已驳回') { }}
119
+ <% if can? :new_update, EducodeSales::SalePlan %>
120
+ <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>
121
+ <% end %>
122
+ {{# } }}
123
+ {{# if (d.state == '已驳回') { }}
124
+ <a class="layui-btn layui-btn-purple layui-btn-xs" lay-event="reject">审核意见</a>
125
+ {{# } }}
126
+ <a class="layui-btn layui-btn-purple layui-btn-xs" lay-event="target_log">查看记录</a>
127
+ </script>
128
+
129
+
130
+ <script type="text/html" id="month_1">
131
+ {{# if (d.m_target_1 ) { }}
132
+ <div class="mtarget">{{d.m_target_1}}</div>
133
+ {{# } else { }}
134
+ <div class="target">{{d.target_1}}</div>
135
+ {{# }}}
136
+ </script>
137
+ <script type="text/html" id="month_2">
138
+ {{# if (d.m_target_2 ) { }}
139
+ <div class="mtarget">{{d.m_target_2}}</div>
140
+ {{# } else { }}
141
+ <div class="target">{{d.target_2}}</div>
142
+ {{# }}}
143
+ </script>
144
+ <script type="text/html" id="month_3">
145
+ {{# if (d.m_target_3 ) { }}
146
+ <div class="mtarget">{{d.m_target_3}}</div>
147
+ {{# } else { }}
148
+ <div class="target">{{d.target_3}}</div>
149
+ {{# }}}
150
+ </script>
151
+ <script type="text/html" id="month_4">
152
+ {{# if (d.m_target_4 ) { }}
153
+ <div class="mtarget">{{d.m_target_4}}</div>
154
+ {{# } else { }}
155
+ <div class="target">{{d.target_4}}</div>
156
+ {{# }}}
157
+ </script>
158
+ <script type="text/html" id="month_5">
159
+ {{# if (d.m_target_5 ) { }}
160
+ <div class="mtarget">{{d.m_target_5}}</div>
161
+ {{# } else { }}
162
+ <div class="target">{{d.target_5}}</div>
163
+ {{# }}}
164
+ </script>
165
+ <script type="text/html" id="month_6">
166
+ {{# if (d.m_target_6 ) { }}
167
+ <div class="mtarget">{{d.m_target_6}}</div>
168
+ {{# } else { }}
169
+ <div class="target">{{d.target_6}}</div>
170
+ {{# }}}
171
+ </script>
172
+ <script type="text/html" id="month_7">
173
+ {{# if (d.m_target_7 ) { }}
174
+ <div class="mtarget">{{d.m_target_7}}</div>
175
+ {{# } else { }}
176
+ <div class="target">{{d.target_7}}</div>
177
+ {{# }}}
178
+ </script>
179
+ <script type="text/html" id="month_8">
180
+ {{# if (d.m_target_8 ) { }}
181
+ <div class="mtarget">{{d.m_target_8}}</div>
182
+ {{# } else { }}
183
+ <div class="target">{{d.target_8}}</div>
184
+ {{# }}}
185
+ </script>
186
+ <script type="text/html" id="month_9">
187
+ {{# if (d.m_target_9 ) { }}
188
+ <div class="mtarget">{{d.m_target_9}}</div>
189
+ {{# } else { }}
190
+ <div class="target">{{d.target_9}}</div>
191
+ {{# }}}
192
+ </script>
193
+ <script type="text/html" id="month_10">
194
+ {{# if (d.m_target_10 ) { }}
195
+ <div class="mtarget">{{d.m_target_10}}</div>
196
+ {{# } else { }}
197
+ <div class="target">{{d.target_10}}</div>
198
+ {{# }}}
199
+ </script>
200
+ <script type="text/html" id="month_11">
201
+ {{# if (d.m_target_11 ) { }}
202
+ <div class="mtarget">{{d.m_target_11}}</div>
203
+ {{# } else { }}
204
+ <div class="target">{{d.target_11}}</div>
205
+ {{# }}}
206
+ </script>
207
+ <script type="text/html" id="month_12">
208
+ {{# if (d.m_target_12 ) { }}
209
+ <div class="mtarget">{{d.m_target_12}}</div>
210
+ {{# } else { }}
211
+ <div class="target">{{d.target_12}}</div>
212
+ {{# }}}
213
+ </script>
214
+ <script>
215
+ layui.use(['form', 'table', 'miniPage', 'element', 'rate', 'laydate', 'request', 'xmSelect'], function () {
216
+
217
+ $ = layui.jquery,
218
+ form = layui.form,
219
+ laydate = layui.laydate,
220
+ request = layui.request,
221
+ table = layui.table,
222
+ rate = layui.rate,
223
+ xmSelect = layui.xmSelect,
224
+ miniPage = layui.miniPage,
225
+ dropdown = layui.dropdown;
226
+
227
+
228
+ laydate.render({
229
+ elem: '#target_year',
230
+ type: 'year'
231
+ });
232
+
233
+ var target_property = xmSelect.render({
234
+ el: '#target_property',
235
+ name: 'school_tag_id',
236
+ data: gon_target.school_tags
237
+ })
238
+
239
+ var target_clazz = xmSelect.render({
240
+ el: '#target_clazz',
241
+ name: 'target_clazz',
242
+ data: [{value: '中标', name: '中标'}, {value: '回款', name: '回款'}, {value: '商机', name: '商机'}]
243
+ })
244
+
245
+ form.on('submit(target_reset_btn)', function (data) {
246
+ form.val('target_form', {
247
+ staff_id: 0,
248
+ year: new Date().getFullYear(),
249
+ });
250
+ target_property.setValue([]);
251
+ target_clazz.setValue([]);
252
+ return false;
253
+ })
254
+
255
+ laydate.render({
256
+ elem: '#add_target_year',
257
+ type: 'year'
258
+ });
259
+
260
+ var add_property_list = xmSelect.render({
261
+ el: '#add_target_property',
262
+ radio: true,
263
+ name: 'school_tag_id',
264
+ data: gon_target.school_tags
265
+ })
266
+
267
+ var add_clazz = xmSelect.render({
268
+ el: '#add_target_clazz',
269
+ radio: true,
270
+ name: 'target_clazz',
271
+ data: [{value: '中标', name: '中标'}, {value: '回款', name: '回款'}, {value: '商机', name: '商机'}]
272
+ })
273
+
274
+ var target_table = table.render({
275
+ elem: '#target_table'
276
+ , toolbar: '#target_progress_toolbar'
277
+ , totalRow: true
278
+ , url: '/missions/plans/years_all_target'
279
+ , page: true
280
+ , title: "绩效考核指标完成情况" // 目前发现的作用(导出文件的文件名)
281
+ , defaultToolbar: ['']
282
+ , height: 'full-200'
283
+ , cols: [
284
+ [ //标题栏
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}
306
+ ],
307
+ [
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)}}
311
+
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)}}
315
+
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)}}
319
+
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)}}
323
+
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)}}
327
+
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)}}
331
+
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)}}
335
+
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)}}
339
+
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)}}
343
+
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)}}
347
+
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)}}
351
+
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)}}
355
+ ]],
356
+ done: function (res, curr, count) {
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
+ }
399
+ }
400
+ }
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
+ }
464
+
465
+ table.on('toolbar(target_table_filter)', function (obj) {
466
+ search = form.val('target_form')
467
+ var event = obj.event;
468
+ switch (event) {
469
+ case 'show_staff':
470
+ search.type = 'staff';
471
+ break;
472
+ case 'show_all':
473
+ search.type = 'all';
474
+ search.staff_id = '';
475
+ break;
476
+ case 'export':
477
+ layer.load(0, {});
478
+ $ = layui.$;
479
+ request.authGet("missions/plans/years_all_target?=" + $.param(search), {}, function (res) {
480
+ data = res.data
481
+ table.exportFile(target_table.config.id, data, 'xls');
482
+ layer.closeAll('loading');
483
+ });
484
+ break;
485
+ }
486
+ if (event === 'show_staff' || event === 'show_all') {
487
+ loadFinishTable(search);
488
+ var $ = layui.$;
489
+ var buttonId = `#${event}`;
490
+ // 移除所有按钮的 layui-btn-default 类名,添加 layui-btn-primary 类名
491
+ $(buttonId).siblings('.layui-btn').removeClass('layui-btn-default').addClass('layui-btn-primary');
492
+ $(buttonId).removeClass('layui-btn-primary').addClass('layui-btn-default');
493
+ }
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
+ });
528
+
529
+ function editable(i) {
530
+ return function (d) {
531
+ if (d.id == "" || (d.edit && gon_target.month <= i)) {
532
+ return 'text';
533
+ }
534
+ };
535
+ }
536
+
537
+ staff_year_target_table = table.render({
538
+ elem: '#target_history_table'
539
+ , url: '/missions/plans/staff_year_target'
540
+ , defaultToolbar: []
541
+ , cols: [[
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'}
546
+ , {field: 'year', title: '年份', width: 100}
547
+ , {field: 'year_target', title: '年度目标', width: 100}
548
+ , {field: 'year_finish', title: '年度完成', width: 100}
549
+ , {field: 'year_diff', title: '年度差额', width: 100}
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"}
562
+ , {field: 'state', title: '审核状态', width: 100}
563
+ , {field: 'reviewer', title: '审批人', width: 100}
564
+ , {field: 'updated_at', title: '更新时间', width: 150}
565
+ , {templet: '#op', title: '操作', width: '250', fixed: 'right'}
566
+ ]]
567
+ });
568
+ form.render();
569
+
570
+ table.on('tool(target_history_table)', function (obj) {
571
+ var data = table.cache['target_history_table'];
572
+ id = obj.data.id;
573
+ if (obj.event == 'cancel') {
574
+ if (!id) {
575
+ data.splice(obj.index, 1);
576
+ }
577
+ data[obj.index].edit = false;
578
+ table.renderData('target_history_table');
579
+ } else if (obj.event == 'reject') {
580
+ layer.open({
581
+ type: 1,
582
+ area: ['420px', '240px'],
583
+ title: '审核意见',
584
+ content: '<div style="padding: 16px;">' + obj.data.comment + '</div>'
585
+ });
586
+ } else if (obj.event == 'edit') {
587
+ data[obj.index].edit = true;
588
+ table.renderData('target_history_table');
589
+ change_fields = {}
590
+ } else if (obj.event == 'save') {
591
+ console.log("change_fields", change_fields)
592
+ change_fields.id = obj.data.id;
593
+ change_fields.staff_id = obj.data.staff_id;
594
+ change_fields.year_target = obj.data.year_target;
595
+ change_fields.target_clazz = obj.data.target_clazz;
596
+ change_fields.year = obj.data.year;
597
+ change_fields.school_tag_id = obj.data.school_tag_id;
598
+ change_fields.year_diff = obj.data.year_diff;
599
+ change_fields.year_finish = obj.data.year_finish;
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');
608
+ })
609
+ } else if (obj.event === 'cancel_edit') {
610
+ data[obj.index].edit = false;
611
+ table.renderData('target_history_table');
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') {
629
+ layer.prompt({
630
+ title: '请输入审核', formType: 2, btn: ['同意', '驳回', '取消'],
631
+ yes: function (index, layero, that) {
632
+ var comment = $(that.layero[0]).find("textarea").val();
633
+ request.put('missions/plans/' + obj.data.id + '/audit_staff_year_target', {
634
+ comment: comment,
635
+ state: '已通过'
636
+ }, function (res) {
637
+ // var data = table.cache['target_history_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');
647
+ })
648
+ layer.close(index);
649
+ },
650
+ btn2: function (index, layero, that) {
651
+ var comment = $(that.layero[0]).find("textarea").val();
652
+ if (comment === "") {
653
+ layer.msg('请输入审核意见')
654
+ } else {
655
+ request.put('missions/plans/' + obj.data.id + '/audit_staff_year_target', {
656
+ comment: comment,
657
+ state: '已驳回'
658
+ }, function (res) {
659
+ console.log(res)
660
+ var data = table.cache['target_history_table'];
661
+ data[obj.index].state = res.state;
662
+ data[obj.index].comment = res.comment;
663
+ data[obj.index].updated_at = res.updated_at;
664
+ data[obj.index].reviewer = res.reviewer;
665
+ table.renderData('target_history_table');
666
+ })
667
+ layer.close(index);
668
+ }
669
+ return false // 点击该按钮后不关闭弹层
670
+ },
671
+ btn3: function (index, layero, that) {
672
+ //console.log(7, index, layero, that)
673
+ // 按钮3 的回调
674
+ layer.close(index);
675
+ return false // 点击该按钮后不关闭弹层
676
+ }
677
+ })
678
+ }
679
+ })
680
+
681
+ var change_fields = {};
682
+ table.on('edit(target_history_table)', function (obj) {
683
+ var value = obj.value // 得到修改后的值
684
+ var data = obj.data // 得到所在行所有键值
685
+ var field = obj.field; // 得到字段
686
+ var update = {};
687
+ if (value == '') {
688
+ change_fields[field] = '';
689
+ } else if (isNaN(parseFloat(value))) {
690
+ update[field] = 0;
691
+ change_fields[field] = 0;
692
+ } else {
693
+ update[field] = parseFloat(value);
694
+ change_fields[field] = parseFloat(value);
695
+ }
696
+ var year_target = 0;
697
+ for (var i = 1; i <= 12; i++) {
698
+ year_target += parseFloat(data['target_' + i]) || 0
699
+ }
700
+ update['year_diff'] = year_target - data.year_finish;
701
+ update['year_target'] = year_target;
702
+ obj.update(update);
703
+ });
704
+
705
+ form.on('submit(progress_search_btn)', function (data) {
706
+ var search = data.field;
707
+ loadFinishTable(search);
708
+ return false;
709
+ })
710
+
711
+ form.on('submit(reset_add_target)', function (data) {
712
+ add_property_list.setValue([])
713
+ add_clazz.setValue([]);
714
+ form.val('add_year_target_form', {
715
+ year: '', staff_id: ''
716
+ })
717
+ return false;
718
+ })
719
+
720
+ form.on("submit(add_btn)", function (data) {
721
+ var search = data.field;
722
+ search.school_tag_id = add_property_list.getValue('valueStr');
723
+ console.log(search)
724
+ if (search.staff_id === "") {
725
+ layer.msg('请选择人员')
726
+ } else if (search.year === "") {
727
+ layer.msg('请选择年度')
728
+ } else if (search.school_tag_id === "") {
729
+ layer.msg('请选择客户类型')
730
+ } else if (search.target_clazz === "") {
731
+ layer.msg('请选择目标类别')
732
+ } else {
733
+ request.post('missions/plans/cal_finish_amount', {
734
+ school_tag_id: search.school_tag_id,
735
+ target_clazz: search.target_clazz,
736
+ year: search.year,
737
+ staff_id: search.staff_id
738
+ }, function (res) {
739
+ console.log(res)
740
+ var data = table.cache['target_history_table'];
741
+ var fields = {};
742
+ search.id = "";
743
+ search.year_finish = res.amount;
744
+ search.school_tag = add_property_list.getValue('nameStr');
745
+ search.staff = $("#add_staff_id option:selected").text();
746
+
747
+ data.unshift(search)
748
+ table.renderData('target_history_table');
749
+ })
750
+
751
+ }
752
+ return false;
753
+ })
754
+ form.on("submit(search_target_history)", function (data) {
755
+ var search = data.field;
756
+ search.school_tag_id = add_property_list.getValue('valueStr');
757
+ table.reload('target_history_table', {
758
+ where: search,
759
+ url: '/missions/plans/staff_year_target'
760
+ });
761
+ return false;
762
+ })
763
+ function loadFinishTable(search) {
764
+ table.reload('target_table', {
765
+ where: search,
766
+ url: '/missions/plans/years_all_target'
767
+ });
768
+ }
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
+ }
790
+ })
791
+
792
+ </script>