Geen omschrijving

scheduling.js 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. /**
  2. * 排班管理
  3. * */
  4. var nowDate = helper.DateFormat.getNowDate();
  5. var selectedDays = []; //选中的日期
  6. // var selectedDays = []; //选中的日期
  7. var myCalendar = null; //日历对象
  8. //日历配置信息
  9. var options = {
  10. width: '100%',
  11. height: '450px',
  12. language: 'CH', //语言
  13. showLunarCalendar: true, //阴历
  14. showHoliday: true, //休假
  15. showFestival: true, //节日
  16. showLunarFestival: true, //农历节日
  17. showSolarTerm: true, //节气
  18. showMark: true, //标记
  19. mark: {
  20. // '2018-12-20': '班',
  21. // '2018-12-22': '班'
  22. },
  23. timeRange: {
  24. startYear: 1900,
  25. endYear: 2049
  26. },
  27. theme: {
  28. changeAble: false,
  29. weeks: {
  30. backgroundColor: '#FBEC9C',
  31. fontColor: '#4A4A4A',
  32. fontSize: '20px',
  33. },
  34. days: {
  35. backgroundColor: '#ffffff',
  36. fontColor: '#565555',
  37. fontSize: '24px'
  38. },
  39. todaycolor: 'orange',
  40. activeSelectColor: 'orange',
  41. },
  42. //获取点击的日期
  43. onSelect: function(day) {
  44. // console.log('onSelect..........................');
  45. var selectDay = helper.DateFormat.timestampToTime(Number(day)).substring(0, 10);
  46. selectedDays.push(selectDay);
  47. selectedDays = helper.methods.unique(selectedDays); //去重
  48. initTable();
  49. },
  50. unSelect: function(day) {
  51. // console.log('unSelect..........................');
  52. var unSelectDay = helper.DateFormat.timestampToTime(Number(day)).substring(0, 10);
  53. if (selectedDays && selectedDays.length > 0) {
  54. for (var i = 0; i < selectedDays.length; i++) {
  55. if (selectedDays[i] === unSelectDay) {
  56. selectedDays.splice(i, 1);
  57. break;
  58. }
  59. }
  60. }
  61. initTable();
  62. },
  63. }
  64. $(function() {
  65. $('.tool_bars').authorizeButton();
  66. myCalendar = new SimpleCalendar('#calendar', options);
  67. //项目下拉
  68. helper.getDropList.getProlistDrop($('#sc_pro')).then(function() {
  69. $('#sc_pro').on('change', function() {
  70. init();
  71. });
  72. });
  73. init();
  74. $('#HY_save').on('click', btn_save);
  75. // //搜索
  76. // $("#sc_btns").click(function() {
  77. // init();
  78. // });
  79. });
  80. function init() {
  81. // console.log(selectedDays)
  82. selectedDays = [nowDate];
  83. getMarks().then(function(){
  84. $('#calendar').find('.sc-today').addClass('sc-selected');
  85. initTable(); //获取人员列表
  86. }); //获取排班
  87. }
  88. //获取排班标记
  89. function getMarks() {
  90. var dtd = $.Deferred(); //在函数内部,新建一个Deferred对象
  91. $.ajax({
  92. type: "get",
  93. url: huayi.config.callcenter_url + "signtokenapi/api/ClassGroupUser/getusergroupmarker",
  94. dataType: 'json',
  95. async: true,
  96. data: {
  97. projectid: $('#sc_pro').val(), // 否 string 项目id
  98. },
  99. success: function(data) {
  100. var res = data.data;
  101. if(res) {
  102. addSchedulingMarks(res.dateList_normal);
  103. addSchedulingMarks(res.dateList_rest);
  104. addSchedulingMarks(res.dateList_eave);
  105. }
  106. dtd.resolve(res); // 改变Deferred对象的执行状态
  107. }
  108. });
  109. return dtd.promise(); // 返回promise对象
  110. };
  111. //添加标记
  112. function addSchedulingMarks(res){
  113. if(res && res.length > 0){
  114. for (var i = 0; i < res.length; i++) {
  115. if(res[i]){
  116. myCalendar.addMark(res[i], '已排班');
  117. }
  118. }
  119. }
  120. }
  121. //初始化人员列表
  122. function initTable() {
  123. var select_listday = selectedDays;
  124. if(select_listday && select_listday.length){
  125. select_listday = select_listday[select_listday.length-1];
  126. }else{
  127. select_listday = '';
  128. }
  129. $.ajax({
  130. url: huayi.config.callcenter_url + 'signtokenapi/api/ClassGroupUser/getusergrouplist',
  131. type: 'get',
  132. data: {
  133. projectid: $('#sc_pro').val(), // 否 string 项目id
  134. // usercode: $('#sc_key').val(), // 否 string 用户账号
  135. // listday: selectedDays ? selectedDays.join(',') : '', //否 string 选中的日期
  136. listday: select_listday, //否 string 选中的日期
  137. },
  138. dataType: "json",
  139. async: true,
  140. success: function(res) {
  141. if (res.state.toLowerCase() === 'success') {
  142. //异步获取数据
  143. var resultData = res.data;
  144. $('#table_all').bootstrapTable('load', resultData);
  145. } else {
  146. layer.confirm(res.message, {
  147. icon: 7,
  148. btn: ['确定'] //按钮
  149. });
  150. }
  151. }
  152. });
  153. $('#table_all').bootstrapTable('destroy').bootstrapTable({
  154. striped: true
  155. });
  156. }
  157. //格式化编号
  158. function setCode(val, row, index) {
  159. return index + 1;
  160. }
  161. //格式化姓名
  162. function formatterName(val, row) {
  163. return '<span id="usercode_' + row.id + '" data-code="' + row.usercode + '">' + val + '(' + row.usercode + ')</span>';
  164. }
  165. //格式化出勤状态
  166. function formatterIsstatusList(val, row) {
  167. var str = '';
  168. var isCheck = '';
  169. var spanClass = '';
  170. if (val) {
  171. str += '<div id="statusList_' + row.id + '">';
  172. for (var i = 0; i < val.length; i++) {
  173. if (val[i].EnumValue === 1) {
  174. spanClass = 'text_normal';
  175. } else if (val[i].EnumValue === 2) {
  176. spanClass = 'text_rest';
  177. } else {
  178. spanClass = 'text_leave';
  179. }
  180. isCheck = row.isstatus_class === val[i].EnumValue ? 'checked' : '';
  181. str += '<div class="radio"><label>' +
  182. '<input onchange="statusChange(' + val[i].EnumValue + ',\'' + row.id + '\')" type="radio" name="statusList_' + row.id +
  183. '" value="' + val[i].EnumValue + '" ' + isCheck + '>' +
  184. '<span class="scheduling_check ' + spanClass + '">' + val[i].EnumName + '</span>' +
  185. '</label></div>';
  186. }
  187. str += '</div>';
  188. }
  189. return str;
  190. }
  191. //出勤状态 切换事件函数
  192. function statusChange(val, rid) {
  193. //1正常 2休息 3请假
  194. if (val === 1) {
  195. $('#classBan_' + rid).show(); //班别
  196. if($('#planList_' + rid).find('input[type="checkbox"]')[0].checked) {
  197. $('#planList_' + rid).show(); //计划
  198. }
  199. } else {
  200. $('#classBan_' + rid).hide(); //班别
  201. $('#classBan_' + rid).find('input[type="checkbox"]').prop('checked', false);
  202. $('#planList_' + rid).hide(); //计划
  203. $('#planList_' + rid).find('input[type="checkbox"]').prop('checked', false);
  204. $('#isJoin_' + rid).prop('checked', false); //是否参与计划
  205. }
  206. }
  207. //格式化班别
  208. function formatterClassBan(val, row) {
  209. var str = '';
  210. var isCheck = '';
  211. var isRadioCheck = '';
  212. var isShow = row.isstatus_class === 1 ? '' : 'isShow';
  213. str += '<ul class="clearfix classBan '+ isShow +'" id="classBan_' + row.id + '">';
  214. if (val) {
  215. $.each(val, function(i, v) {
  216. var cobj = {
  217. "code": v.code, //班次编号
  218. "name": v.name, //班次名称
  219. "roleList": [],
  220. }
  221. if (v.roleList) {
  222. $.each(v.roleList, function(j, n) {
  223. cobj.roleList.push({
  224. "roleid": n.roleid, //角色id
  225. "rolecode": n.rolecode, //角色code
  226. "rolename": n.rolename, //角色名称
  227. "ischeck": n.ischeck // 是否选中
  228. });
  229. });
  230. }
  231. isCheck = v.ischeck ? 'checked' : '';
  232. str += '<li class="col-md-3 text-left">' +
  233. '<label class="checkbox-inline">' +
  234. '<input id="dataBan_'+ i + '_' + row.id +'" data-ban=\'' + JSON.stringify(cobj) + '\' type="checkbox" value="' + v.code + '" ' + isCheck + '>' +
  235. '<span class="scheduling_check">' + v.name + '</span>' +
  236. '</label>';
  237. if (v.roleList) {
  238. str += '<div class="role_lists">';
  239. $.each(v.roleList, function(j, n) {
  240. // debugger
  241. var roleItem = {
  242. "roleid": n.roleid, //角色id
  243. "rolecode": n.rolecode, //角色code
  244. "rolename": n.rolename, //角色名称
  245. "ischeck": n.ischeck //是否选中
  246. };
  247. // str += '<p class="text_normal role_name">' + n.rolename + '</p>';
  248. isRadioCheck = n.ischeck === true ? 'checked' : '';
  249. str += '<div class="radio" id="roleItem_'+ i + '_' + n.roleid + '_' + row.id +'"><label>' +
  250. '<input type="radio" onchange="roleChange('+ i + ',\''+ n.roleid + '\',\''+ row.id +'\')" name="roleItem_'+ v.code + '_' + row.id +'" value=' + JSON.stringify(roleItem) + ' ' + isRadioCheck + '>' +
  251. '<span class="text_normal role_name scheduling_check">' + n.rolename + '</span>' +
  252. '</label></div>';
  253. });
  254. str += '</div>';
  255. }
  256. str += '</li>';
  257. });
  258. str += '</ul>';
  259. }
  260. return str;
  261. }
  262. //班次下角色改变
  263. function roleChange(index, cIndex, rid){
  264. var dataBan = $('#dataBan_' + index + '_' + rid).attr('data-ban');
  265. var radioVal = $('#roleItem_' + index + '_' + cIndex + '_' + rid).find('input[type="radio"]:checked').val();
  266. dataBan = JSON.parse(dataBan);
  267. radioVal = JSON.parse(radioVal);
  268. if(dataBan.roleList && dataBan.roleList.length > 0){
  269. for(var i = 0; i < dataBan.roleList.length; i++){
  270. if(radioVal.roleid === dataBan.roleList[i].roleid){
  271. dataBan.roleList[i].ischeck = true;
  272. }else{
  273. dataBan.roleList[i].ischeck = false;
  274. }
  275. }
  276. // console.log(JSON.stringify(dataBan));
  277. $('#dataBan_' + index + '_' + rid).attr('data-ban', JSON.stringify(dataBan));
  278. }
  279. }
  280. //格式化是否参与计划
  281. function formatterIsJoin(val, row) {
  282. var isCheck = '';
  283. isCheck = val ? 'checked' : '';
  284. return '<label class="checkbox-inline isJoin">' +
  285. '<input id="isJoin_' + row.id + '" onchange="joinChange(\'' + row.id + '\')" type="checkbox" ' + isCheck +
  286. '><span class="scheduling_check"></span>' +
  287. '</label>';
  288. }
  289. //是否参与计划 切换事件函数
  290. function joinChange(rid) {
  291. //选中代表参与
  292. if (event.target.checked) {
  293. $('#planList_' + rid).show(); //计划
  294. } else {
  295. $('#planList_' + rid).hide(); //计划
  296. $('#planList_' + rid).find('input[type="checkbox"]').prop('checked', false);
  297. }
  298. }
  299. //格式化计划名称
  300. function formatterPlan(val, row) {
  301. var str = '';
  302. var isCheck = '';
  303. var isShow = row.isjoin_class ? '' : 'isShow';
  304. if (val) {
  305. str += '<div id="planList_' + row.id + '" class="'+ isShow + '">'
  306. $.each(val, function(i, v) {
  307. isCheck = v.ischeck ? 'checked' : '';
  308. var planData = {
  309. "planid": v.id,
  310. "planname": v.planname
  311. }
  312. str += '<div class="checkbox">' +
  313. '<label>' +
  314. '<input data-plan=\''+ JSON.stringify(planData) +'\' type="checkbox" value="' + v.id + '" ' + isCheck + '>' +
  315. '<span class="scheduling_check">' + v.planname + '</span>' +
  316. '</label>' +
  317. '</div>';
  318. });
  319. str += '</div>';
  320. }
  321. return str;
  322. }
  323. //保存
  324. function btn_save() {
  325. var loadIndex;
  326. if (!$.trim($('#sc_pro').val())) {
  327. layer.confirm('请先选择项目名称!', {
  328. icon: 2,
  329. btn: ['确定'] //按钮
  330. });
  331. return;
  332. }
  333. if (!selectedDays) {
  334. layer.confirm('请选择要设置的日期!', {
  335. icon: 2,
  336. btn: ['确定'] //按钮
  337. });
  338. return;
  339. }
  340. var classUserLists = getRowList();
  341. if(classUserLists.valid){
  342. classUserList = classUserLists.data;
  343. }else{
  344. layer.confirm(classUserLists.text, {
  345. icon: 2,
  346. btn: ['确定'] //按钮
  347. });
  348. return;
  349. }
  350. $.ajax({
  351. type: 'post',
  352. url: huayi.config.callcenter_url + 'signtokenapi/api/ClassGroupUser/saveclassuser',
  353. dataType: 'json',
  354. async: true,
  355. beforeSend: function() { //触发ajax请求开始时执行
  356. $('#HY_save').attr("disabled", true);
  357. $('#HY_save').text('保存中...');
  358. loadIndex = layer.load();
  359. },
  360. data: {
  361. projectid: $('#sc_pro').val(), // 是 string 项目名称id
  362. Listday: selectedDays ? selectedDays.join(',') : '', // 是 list<string> 选中日期列表(可能不是连续的日期)
  363. listuserinfo: classUserList, // 是 list<ClassUserList> 正常值班信息列表 - 每行用户
  364. },
  365. success: function(data) {
  366. layer.close(loadIndex);
  367. if (data.state === "success") {
  368. selectedDays = [];
  369. init();
  370. layer.msg("保存成功");
  371. } else {
  372. $('#HY_save').attr("disabled", false);
  373. $('#HY_save').text('保存');
  374. }
  375. },
  376. error: function(textStatus) {
  377. layer.close(loadIndex);
  378. layer.confirm('网络繁忙,请稍后再试...', {
  379. icon: 7,
  380. closeBtn: 0,
  381. btn: ['确定'] //按钮
  382. });
  383. $('#HY_save').attr("disabled", false);
  384. $('#HY_save').text('保存');
  385. },
  386. complete: function(XMLHttpRequest, textStatus) {
  387. layer.close(loadIndex);
  388. if (textStatus == 'timeout') {
  389. var xmlhttp = window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHttp");
  390. xmlhttp.abort();
  391. layer.confirm('网络超时,请稍后再试...', {
  392. icon: 7,
  393. closeBtn: 0,
  394. btn: ['确定'] //按钮
  395. });
  396. }
  397. $('#HY_save').attr("disabled", false);
  398. $('#HY_save').text('保存');
  399. },
  400. });
  401. }
  402. //选择日历获取人员列表信息
  403. function getRowList() {
  404. var ids = $.map($('#table_all').bootstrapTable('getSelections'),
  405. function(row) {
  406. return row.id;
  407. });
  408. if (ids && ids.length > 0) {
  409. var classUserList = [];
  410. var valid = true;//验证消息
  411. var text = null;//提示信息
  412. for(var i = 0; i < ids.length; i++){
  413. var usercode = $('#usercode_' + ids[i]).attr('data-code'); //用户账号(AA001)
  414. var isstatus = $('#statusList_' + ids[i]).find('input[type="radio"]:checked').val(); //出勤状态(1正常 2休息 3请假)
  415. var classgroupList = []; //班别数据
  416. if(isstatus === '1'){
  417. var classgroupListEl = $('#classBan_' + ids[i]).find('input[type="checkbox"]:checked'); //班别元素
  418. if(classgroupListEl && classgroupListEl.length > 0){
  419. for(var j = 0; j < classgroupListEl.length; j++){
  420. // console.log($(classgroupListEl[j]).parent().parent().find('input[type="radio"]:checked').length)
  421. if($(classgroupListEl[j]).parent().parent().find('input[type="radio"]:checked').length === 0){
  422. valid = false;
  423. text = '请选择用户:'+ $('#usercode_' + ids[i]).text() + ' '+ $(classgroupListEl[j]).parent().find('.scheduling_check').text() +'的岗位';
  424. break;
  425. }
  426. classgroupList.push(JSON.parse($(classgroupListEl[j]).attr('data-ban')));
  427. }
  428. }else{
  429. valid = false;
  430. text = '请选择用户:'+ $('#usercode_' + ids[i]).text() +'的班别';
  431. break;
  432. }
  433. }
  434. var isjoin = $('#isJoin_' + ids[i])[0].checked; //是 bool 是否参与计划
  435. var distri_planList = []; //计划数据
  436. if(isjoin){
  437. var distri_planListEl = $('#planList_' + ids[i]).find('input[type="checkbox"]:checked');// 是 List List<DistriPlanList> 计划名称
  438. if(distri_planListEl && distri_planListEl.length > 0){
  439. $.each(distri_planListEl, function(j, n){
  440. distri_planList.push(JSON.parse($(n).attr('data-plan')));
  441. });
  442. }else{
  443. valid = false;
  444. text = '请选择用户:'+ $('#usercode_' + ids[i]).text() +'要参与的计划';
  445. break;
  446. }
  447. }
  448. classUserList.push({
  449. usercode: usercode, // 是 string 用户账号(AA001)
  450. isstatus: isstatus, // 是 string 出勤状态(1正常 2休息 3请假)
  451. classgroupList: classgroupList, // 是 List List<ClassGroupList> 绑定班别
  452. isjoin: isjoin, // 是 bool 是否参与计划
  453. distri_planList: distri_planList
  454. });
  455. };
  456. return {
  457. valid: valid,
  458. text: text,
  459. data: classUserList
  460. };
  461. }else{
  462. return {
  463. valid: false,
  464. text: '请选择要排班的用户!',
  465. };
  466. }
  467. }
  468. //设置默认地址
  469. function btn_default(aid) {
  470. layer.confirm('您确定要将当前地址设置为默认地址吗?', {
  471. icon: 7,
  472. btn: ['是', '否'] //按钮
  473. }, function() {
  474. $.ajax({
  475. type: "post",
  476. url: huayi.config.callcenter_url + "distributionapi/api/DistriAddress/UpdateDefault",
  477. dataType: 'json',
  478. data: {
  479. id: aid, //是 string id标识
  480. },
  481. async: true,
  482. success: function(data) {
  483. layer.msg("设置成功!");
  484. $('#table_all').bootstrapTable('refresh');
  485. }
  486. });
  487. });
  488. }
  489. //添加
  490. function btn_add() {
  491. layer.open({
  492. type: 2,
  493. content: "template/addOrEditAddress.html", //iframe的url,no代表不显示滚动条
  494. title: '添加地址',
  495. resize: false,
  496. area: ['60%', '90%'], //宽高
  497. });
  498. }
  499. //编辑
  500. function btn_edit(edit_id) {
  501. layer.open({
  502. type: 2,
  503. content: "template/addOrEditAddress.html?edit_id=" + edit_id, //iframe的url,no代表不显示滚动条
  504. title: '编辑地址',
  505. resize: false,
  506. area: ['60%', '90%'], //宽高
  507. });
  508. }
  509. //批量删除
  510. function btn_deletes() {
  511. var ids = $.map($('#table_all').bootstrapTable('getSelections'),
  512. function(row) {
  513. return row.id;
  514. });
  515. /*判断长度*/
  516. if (ids.length <= 0) {
  517. layer.confirm('请选择要删除的选项', {
  518. icon: 7,
  519. btn: ['确定'] //按钮
  520. });
  521. return;
  522. }
  523. btn_delete(ids);
  524. }
  525. //删除
  526. function btn_delete(del_id) {
  527. /*发送请求*/
  528. layer.confirm('您确定要删除当前地址吗?', {
  529. icon: 7,
  530. btn: ['确定', '取消'],
  531. yes: function(index, layero) {
  532. $.post(huayi.config.callcenter_url + "distributionapi/api/DistriAddress/delete", {
  533. ids: del_id,
  534. }, function(result) {
  535. result = JSON.parse(result);
  536. if (result.state.toLowerCase() == "success") {
  537. layer.msg("删除成功");
  538. $('#table_all').bootstrapTable('refresh');
  539. }
  540. })
  541. },
  542. });
  543. }