oaPicker.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. layui.define(['tool'], function (exports) {
  2. const layer = layui.layer, tool = layui.tool,form=layui.form, table=layui.table,tree = layui.tree;
  3. const dataPicker ={
  4. 'department':{
  5. title:'选择部门',
  6. url:'/api/index/get_department',
  7. area: ['400px', '524px'],
  8. searchbar:'',
  9. page:false,
  10. cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'部门名称'}]
  11. },
  12. 'position':{
  13. title:'选择岗位',
  14. url:'/api/index/get_position',
  15. area: ['400px', '524px'],
  16. searchbar:'',
  17. page:false,
  18. cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'岗位名称'}]
  19. },
  20. 'services':{
  21. title:'选择服务类型',
  22. url:'/api/index/get_services',
  23. area: ['400px', '524px'],
  24. searchbar:'',
  25. page:false,
  26. cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'服务名称'},{field:'price',title:'服务单价'}]
  27. },
  28. 'template':{
  29. title:'选择消息模板',
  30. url:'/api/index/get_template',
  31. area: ['600px', '568px'],
  32. cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'消息模板名称'}]
  33. },
  34. 'workcate':{
  35. title:'选择工作类型',
  36. url:'/api/index/get_work_cate',
  37. area: ['400px', '524px'],
  38. searchbar:'',
  39. page:false,
  40. cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'工作类型名称'}]
  41. },
  42. 'property':{
  43. title:'选择固定资产',
  44. url:'/adm/api/get_property',
  45. cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'资产名称'}]
  46. },
  47. 'car':{
  48. title:'选择车辆信息',
  49. url:'/adm/api/get_car',
  50. cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'车辆名称'},{field:'name',width:100,title:'车牌号码',align:'center'}]
  51. },
  52. 'room':{
  53. title:'选择会议室',
  54. url:'/adm/api/get_meeting_room',
  55. cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'会议室名称'},{field:'num',width:100,title:'可容纳人数',align:'center'}]
  56. },
  57. 'customer':{
  58. title:'选择客户',
  59. url:'/customer/api/get_customer',
  60. add:'/customer/customer/add',
  61. cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'name',title:'客户名称'}]
  62. },
  63. 'supplier':{
  64. title:'选择供应商',
  65. url:'/contract/api/get_supplier',
  66. add:'/contract/supplier/add',
  67. cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'供应商名称'}]
  68. },
  69. 'contract':{
  70. title:'选择销售合同',
  71. url:'/contract/api/get_contract',
  72. area: ['800px', '568px'],
  73. cols:[{ field: 'code',width:160,title:'合同编号',align:'center'},{field:'name',title:'合同名称'},{ field:'customer',title:'关联客户',width: 240}]
  74. },
  75. 'product':{
  76. title:'选择产品',
  77. url:'/contract/api/get_product',
  78. cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'产品名称'},{field:'sale_price',title:'销售单价',width: 120,align:'center'}]
  79. },
  80. 'purchase':{
  81. title:'选择采购合同',
  82. url:'/contract/api/get_purchase',
  83. area: ['800px', '568px'],
  84. cols:[{ field: 'code',width:160,title:'合同编号',align:'center'},{field:'name',title:'合同名称'},{ field:'supplier',title:'关联供应商',width: 240}]
  85. },
  86. 'purchased':{
  87. title:'选择采购物品',
  88. url:'/contract/api/get_purchased',
  89. cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'采购物品名称'},{field:'purchase_price',title:'采购单价',width: 120,align:'center'}]
  90. },
  91. 'project':{
  92. title:'选择项目',
  93. url:'/project/api/get_project',
  94. cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'项目名称'}]
  95. },
  96. 'task':{
  97. title:'选择任务',
  98. url:'/project/api/get_task',
  99. area: ['800px', '568px'],
  100. cols:[{field:'id',width:90,title:'序号',align:'center'},{ field:'title',title:'任务主题'},{field:'project',width:240,title:'关联项目'}]
  101. },
  102. 'loan':{
  103. title:'选择借支冲抵',
  104. url:'/finance/api/get_loan',
  105. area: ['800px', '568px'],
  106. cols:[{field: 'id',width: 80,title:'序号',align:'center'},{field:'cost',title:'借款金额(元)',width: 100},{field:'un_balance_cost',title:'未冲账金额(元)',width: 110},{field:'balance_cost',title:'已冲账金额(元)',width: 110},{field:'title',title:'借支主题',minWidth:200}]
  107. }
  108. }
  109. let select_ids=[];select_names=[];select_array=[];
  110. const obj = {
  111. employeeRender:function(){
  112. var me=this,letterTem='';
  113. for(var i=0;i<26;i++){
  114. letterTem+='<span class="layui-letter-span" data-code="'+String.fromCharCode(97+i)+'">'+String.fromCharCode(65+i)+'</span>';
  115. }
  116. var tpl='<div style="width:210px; height:388px; border-right:1px solid #eee; overflow-x: hidden; overflow-y: auto; float:left;">\
  117. <div id="employeeDepament" style="padding:6px 0;"></div>\
  118. </div>\
  119. <div style="width:588px; height:388px; user-select:none; overflow-x: hidden; overflow-y: auto; float:left;">\
  120. <div style="padding:12px 10px 0;"><div style="color:#999; text-align:center;">⇐ 点击左边部门筛选员工,或者点击下面字母筛选</div><div id="letterBar" style="color:#999; text-align:center;">'+letterTem+'</div></div>\
  121. <div id="employee" style="padding:6px 12px"></div>\
  122. <div style="padding:10px 15px; border-top:1px solid #eee;;"><strong>已选择</strong><span class="layui-tags-all">全选</span></div>\
  123. <div id="selectTags" style="padding:10px 15px;">'+me.employeeSelect(0)+'</div>\
  124. </div>';
  125. return tpl;
  126. },
  127. employeeSelect:function(t){
  128. var me=this,select_tags='';
  129. if(me.settings.type == 0){
  130. select_tags+='<span style="color:#1E9FFF">'+me.settings.names+'</span>';
  131. }
  132. else{
  133. select_ids=[];
  134. select_names=[];
  135. for(var a=0;a<select_array.length;a++){
  136. if(me.settings.fixedid==select_array[a].id && me.settings.fixedid!=0){
  137. select_tags+='<span class="layui-tags-span">'+select_array[a].name+'</span>';
  138. }
  139. else{
  140. select_tags+='<span class="layui-tags-span">'+select_array[a].name+'<i data-id="'+select_array[a].id+'" class="layui-icon layui-tags-close">ဆ</i></span>';
  141. }
  142. if(t==1){
  143. $('#employee').find('[data-id="'+select_array[a].id+'"]').addClass('on');
  144. }
  145. select_ids.push(parseInt(select_array[a].id));
  146. select_names.push(select_array[a].name);
  147. }
  148. }
  149. //console.log(select_array);
  150. return select_tags;
  151. },
  152. employeeInit: function (options) {
  153. const opts={
  154. "title":"选择员工",
  155. "department_url": "/api/index/get_department_tree",
  156. "employee_url": "/api/index/get_employee",
  157. "type":1,//1单人,2多人
  158. "fixedid":0,
  159. "ids":"",
  160. "names":"",
  161. "ajax_data":[],
  162. "callback": function(){}
  163. };
  164. this.settings = $.extend({}, opts, options);
  165. var me=this;
  166. select_ids=[];
  167. select_names=[];
  168. select_array=[];
  169. if(me.settings.ids!='' && me.settings.names!=''){
  170. select_ids=me.settings.ids.split(',');
  171. select_names=me.settings.names.split(',');
  172. //select_ids.sort((a, b) => a - b);
  173. for(var m=0;m<select_ids.length;m++){
  174. select_array.push({id:select_ids[m],name:select_names[m]});
  175. }
  176. }
  177. $(parent.$('.express-close')).addClass('parent-colse');
  178. layer.open({
  179. type:1,
  180. title:me.settings.title,
  181. area:['800px','500px'],
  182. resize:false,
  183. content:me.employeeRender(),
  184. end: function(){
  185. $(parent.$('.express-close')).removeClass('parent-colse');
  186. },
  187. success:function(obj,idx){
  188. var dataList=[],letterBar=$('#letterBar'),employee = $('#employee'),selectTags = $('#selectTags');
  189. $.ajax({
  190. url:me.settings.department_url,
  191. type:'get',
  192. success:function(res){
  193. //仅节点左侧图标控制收缩
  194. tree.render({
  195. elem: '#employeeDepament',
  196. data: res.trees,
  197. onlyIconControl: true, //是否仅允许节点左侧图标控制展开收缩
  198. click: function(obj){
  199. var tagsItem='<div style="color:#999; text-align:center;">暂无员工</div>';
  200. $("#employeeDepament").find('.layui-tree-main').removeClass('on');
  201. $(obj.elem).find('.layui-tree-main').eq(0).addClass('on');
  202. letterBar.find('span').removeClass('on');
  203. $.ajax({
  204. url:me.settings.employee_url,
  205. type:'get',
  206. data:{did:obj.data.id},
  207. success:function(res){
  208. me.ajax_data = res.data;
  209. dataList=me.ajax_data;
  210. if(dataList.length>1 && me.settings.type == 2){
  211. $('.layui-tags-all').show();
  212. }
  213. else{
  214. $('.layui-tags-all').hide();
  215. }
  216. if(dataList.length>0){
  217. tagsItem='';
  218. for(var i=0; i<dataList.length; i++){
  219. if(select_ids.indexOf(dataList[i].id) == -1){
  220. tagsItem+='<span class="layui-tags-span" data-idx="'+i+'" data-id="'+dataList[i].id+'">'+dataList[i].name+'</span>';
  221. }
  222. else{
  223. tagsItem+='<span class="layui-tags-span on" data-idx="'+i+'" data-id="'+dataList[i].id+'">'+dataList[i].name+'</span>';
  224. }
  225. }
  226. }
  227. employee.html(tagsItem);
  228. }
  229. })
  230. }
  231. });
  232. letterBar.on("click" ,'span',function(){
  233. var code=$(this).data('code');
  234. $(this).addClass('on').siblings().removeClass('on');
  235. $.ajax({
  236. url:me.settings.employee_url,
  237. type:'get',
  238. data:{id:1},
  239. success:function(res){
  240. me.ajax_data = res.data;
  241. var letterData=[],tagsItem='<div style="color:#999; text-align:center;">暂无员工</div>';;
  242. if(me.ajax_data.length>0){
  243. var tagsItemCode='';
  244. for(var i=0; i<me.ajax_data.length; i++){
  245. if(me.ajax_data[i].username.slice(0,1)==code){
  246. if(select_ids.indexOf(me.ajax_data[i].id) == -1){
  247. tagsItemCode+='<span class="layui-tags-span" data-idx="'+i+'" data-id="'+me.ajax_data[i].id+'">'+me.ajax_data[i].name+'</span>';
  248. }
  249. else{
  250. tagsItemCode+='<span class="layui-tags-span on" data-idx="'+i+'" data-id="'+me.ajax_data[i].id+'">'+me.ajax_data[i].name+'</span>';
  251. }
  252. letterData.push(me.ajax_data[i]);
  253. }
  254. }
  255. dataList=letterData;
  256. if(dataList.length>2 && me.settings.type == 2){
  257. $('.layui-tags-all').show();
  258. }
  259. else{
  260. $('.layui-tags-all').hide();
  261. }
  262. if(tagsItemCode!=''){
  263. tagsItem = tagsItemCode;
  264. }
  265. }
  266. employee.html(tagsItem);
  267. }
  268. })
  269. });
  270. }
  271. })
  272. if(me.settings.type == 2){
  273. $('.layui-tags-all').on('click',function(){
  274. for(var a=0; a<dataList.length;a++){
  275. if(select_ids.indexOf(dataList[a]['id']) == -1){
  276. select_array.push(dataList[a]);
  277. }
  278. }
  279. selectTags.html(me.employeeSelect(1));
  280. });
  281. }
  282. employee.on('click','.layui-tags-span',function(){
  283. let item_idx=$(this).data('idx');
  284. let select_item = me.ajax_data[item_idx];
  285. if(me.settings.type == 1){
  286. me.settings.callback([select_item]);
  287. layer.close(idx);
  288. }
  289. else{
  290. if(select_ids.indexOf(select_item['id']) == -1){
  291. select_array.push(select_item);
  292. selectTags.html(me.employeeSelect(1));
  293. }
  294. }
  295. });
  296. selectTags.on('click','.layui-tags-close',function(){
  297. let id=$(this).data('id');
  298. let new_slected=[];
  299. $('#employee').find('[data-id="'+id+'"]').removeClass('on');
  300. for(var i=0;i<select_array.length;i++){
  301. if(select_array[i].id!=id){
  302. new_slected.push(select_array[i]);
  303. }
  304. }
  305. select_array=new_slected;
  306. selectTags.html(me.employeeSelect(1));
  307. });
  308. if(me.settings.type == 1){
  309. $('#layui-layer'+idx).find('.layui-layer-btn0').hide();
  310. }
  311. },
  312. btn: ['确定添加', '清空已选'],
  313. btnAlign:'c',
  314. btn1: function(idx){
  315. me.settings.callback(select_array);
  316. layer.close(idx);
  317. },
  318. btn2: function(idx){
  319. let canceldata= {department:"",did:0,id:0,mobile:0,name:"",nickname:"",position_id:0,sex:0,status:0,thumb:"",username:""};
  320. me.settings.callback([canceldata]);
  321. layer.close(idx);
  322. }
  323. })
  324. },
  325. picker:function(types,type,callback,map){
  326. let pickerIndex = new Date().getTime();
  327. let pickerTable,options;
  328. const opts={
  329. "title":"选择",
  330. "url": "",
  331. "ids":"",
  332. "titles":"",
  333. "where":map,
  334. "area": ['600px', '568px'],
  335. "cols":[{field: 'id',width: 80,title:'序号',align:'center'},{field:'title',title:'名称'}],
  336. "searchbar":'<form class="layui-form pb-2"><div class="layui-input-inline" style="width:420px; margin-right:5px;"><input type="text" name="keywords" placeholder="请输入关键字" class="layui-input" autocomplete="off" /></div><button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="picker">提交搜索</button><button type="reset" class="layui-btn layui-btn-reset" lay-filter="picker-reset">清空</button></form>',
  337. "page":true,
  338. "type":type,//1单选择,2多选
  339. "btnno":true,
  340. "add": "",//新增url
  341. "callback": callback
  342. };
  343. if(Object.prototype.toString.call(types) === '[object Object]'){
  344. options = types;
  345. }
  346. else{
  347. options = dataPicker[types];
  348. }
  349. let settings = $.extend({},opts,options);
  350. //console.log(settings);
  351. let btn = ['确定选择'];
  352. if(settings.btnno==true){
  353. btn = ['确定选择','清空已选'];
  354. }
  355. if(settings.add!=''){
  356. btn = ['确定选择','清空已选','新增'];
  357. }
  358. $(parent.$('.express-close')).addClass('parent-colse');
  359. layer.open({
  360. title: settings.title,
  361. area: settings.area,
  362. type: 1,
  363. skin: 'gougu-picker',
  364. content: '<div class="picker-table" id="pickerBox'+pickerIndex+'">'+settings.searchbar+'<div id="pickerTable'+pickerIndex+'"></div></div>',
  365. end: function(){
  366. $(parent.$('.express-close')).removeClass('parent-colse');
  367. },
  368. success: function () {
  369. let cols=[];
  370. if(settings.type==1){
  371. cols = [{type: 'radio', title: '选择'}, ...settings.cols];
  372. }
  373. if(settings.type==2){
  374. cols = [{type: 'checkbox', title: '选择'}, ...settings.cols];
  375. }
  376. pickerTable = table.render({
  377. elem: '#pickerTable'+pickerIndex,
  378. url: settings.url,
  379. where:settings.where,
  380. page: settings.page, //开启分页
  381. limit: 10,
  382. height: '407',
  383. cols: [cols]
  384. });
  385. //请求分类
  386. if(settings.cate_url){
  387. tool.get(settings.cate_url,{},function(res){
  388. let cate='';
  389. for(let b=0; b<res.data.length;b++){
  390. cate+='<option value="'+res.data[b].id+'">'+res.data[b].title+'</option>';
  391. }
  392. $('#pickerBox'+pickerIndex).find('.table_cate_id').append(cate);
  393. form.render('select');
  394. })
  395. }
  396. form.render();
  397. //搜索提交
  398. form.on('submit(picker)', function (data) {
  399. let maps = $.extend({}, settings.where, data.field);
  400. pickerTable.reload({where:maps,page:{curr: 1}});
  401. return false;
  402. });
  403. //重置搜索提交
  404. $('#pickerBox'+pickerIndex).on('click', '[lay-filter="picker-reset"]', function () {
  405. let prev = $(this).prev();
  406. if (typeof(prev) != "undefined" ) {
  407. setTimeout(function () {
  408. prev.click();
  409. }, 10)
  410. }
  411. });
  412. },
  413. btn: btn,
  414. btnAlign: 'c',
  415. btn1: function (idx) {
  416. var checkStatus = table.checkStatus(pickerTable.config.id);
  417. var data = checkStatus.data;
  418. if (data.length > 0) {
  419. callback(data);
  420. layer.close(idx);
  421. }
  422. else {
  423. layer.msg('请先选择内容');
  424. return false;
  425. }
  426. },
  427. btn2: function (idx) {
  428. callback([{'id':0,'title':'','name':''}]);
  429. layer.close(idx);
  430. },
  431. btn3: function (idx) {
  432. tool.side(settings.add);
  433. layer.close(idx);
  434. }
  435. })
  436. }
  437. }
  438. //选择员工弹窗
  439. $('body').on('click','.picker-admin',function () {
  440. let that = $(this);
  441. let type = that.data('type');
  442. if (typeof(type) == "undefined" || type == '') {
  443. type = 1;
  444. }
  445. let ids=that.next().val()+'',names = that.val()+'';
  446. obj.employeeInit({
  447. ids:ids,
  448. names:names,
  449. type:type,
  450. callback:function(data){
  451. let select_id=[],select_name=[],select_did=[];
  452. for(var a=0; a<data.length;a++){
  453. select_id.push(data[a].id);
  454. select_name.push(data[a].name);
  455. select_did.push(data[a].did);
  456. }
  457. console.log(select_name);
  458. that.val(select_name.join(','));
  459. that.next().val(select_id.join(','));
  460. that.next().next().val(select_did.join(','));
  461. }
  462. });
  463. });
  464. //选择下属员工弹窗
  465. $('body').on('click','.picker-sub',function () {
  466. let that = $(this);
  467. let type = that.data('type');
  468. if (typeof(type) == "undefined" || type == '') {
  469. type = 1;
  470. }
  471. let ids=that.next().val()+'',names = that.val()+'';
  472. obj.employeeInit({
  473. title:"选择下属",
  474. department_url: "/api/index/get_department_tree_sub",
  475. employee_url: "/api/index/get_employee_sub",
  476. ids:ids,
  477. names:names,
  478. type:type,
  479. callback:function(data){
  480. let select_id=[],select_name=[],select_did=[];
  481. for(var a=0; a<data.length;a++){
  482. select_id.push(data[a].id);
  483. select_name.push(data[a].name);
  484. select_did.push(data[a].did);
  485. }
  486. console.log(select_name);
  487. that.val(select_name.join(','));
  488. that.next().val(select_id.join(','));
  489. that.next().next().val(select_did.join(','));
  490. }
  491. });
  492. });
  493. //选择OA数据弹层
  494. $('body').on('click','.picker-oa',function () {
  495. let that = $(this),ids = [],titles=[],map = {};
  496. let types = that.data('types');
  497. let type = that.data('type');
  498. let where = that.data('where');
  499. if (typeof(types) == "undefined" || types == '') {
  500. layer.msg('请设置【picker】的类型');
  501. return false;
  502. }
  503. if (typeof(type) == "undefined" || type == '') {
  504. type = 1;
  505. }
  506. if (typeof(where) == "undefined" || where == '') {
  507. map = {};
  508. }
  509. else{
  510. const jsonStr = where.replace(/(\w+):/g, '"$1":').replace(/'/g, '"');
  511. map = JSON.parse(jsonStr);
  512. }
  513. let callback = function(data){
  514. for ( var i = 0; i <data.length; i++){
  515. ids.push(data[i].id);
  516. if(!data[i].title){
  517. titles.push(data[i].name);
  518. }else{
  519. titles.push(data[i].title);
  520. }
  521. }
  522. that.val(titles.join(','));
  523. that.next().val(ids.join(','));
  524. }
  525. obj.picker(types,type,callback,map);
  526. });
  527. //输出接口
  528. exports('oaPicker', obj);
  529. });