mobile_api.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2. var Controller = {
  3. index: async function () {
  4. // 初始化表格参数配置
  5. Table.api.init({
  6. extend: {
  7. index_url: 'mobile_api/index' + location.search,
  8. edit_url: 'mobile/edit',
  9. del_url: 'mobile/del',
  10. multi_url: 'mobile/multi',
  11. multi_edit_url: 'mobile/multi_edit',
  12. multi_edit_proxy_url: 'mobile/multi_edit_proxy',
  13. multi_edit_status_url: 'mobile/multi_edit_status',
  14. import_url: 'mobile/import',
  15. export_url: 'mobile/export',
  16. batch: 'mobile/batch',
  17. table: 'mobile',
  18. cancel_discount: 'mobile/cancelsetdiscount',
  19. set_discount: 'mobile/setdiscount',
  20. batch_set_amount: 'mobile/batch_set_amount',
  21. batch_set_kill: 'mobile/set_kill',
  22. batch_activity_cancel: 'mobile/batch_activity_cancel',
  23. }
  24. });
  25. var table = $("#table");
  26. //let status = await $.getJSON('mobile/status')
  27. let mobileStatus={}
  28. mobile_status.forEach((item,idx)=>{
  29. mobileStatus[idx]=item
  30. })
  31. $('.btn-multi-edit').click(function (){
  32. let ids=[]
  33. $('#table').bootstrapTable('getSelections').forEach(item=>{
  34. ids.push(item.id)
  35. })
  36. if(!ids.length){
  37. layer.alert('请选择')
  38. return
  39. }
  40. Fast.api.open(`${$.fn.bootstrapTable.defaults.extend.multi_edit_url}/ids/${ids.join(',')}`,'批量编辑')
  41. })
  42. $('.btn-export').click(function (){
  43. let ids=[]
  44. $('#table').bootstrapTable('getSelections').forEach(item=>{
  45. ids.push(item.id)
  46. })
  47. if(!ids.length){
  48. parent.layer.alert('请选择')
  49. return
  50. }
  51. open(`${$.fn.bootstrapTable.defaults.extend.export_url}/ids/${ids.join(',')}`)
  52. })
  53. $('.btn-multi-edit-proxy').click(function (){
  54. let ids=[]
  55. $('#table').bootstrapTable('getSelections').forEach(item=>{
  56. ids.push(item.id)
  57. })
  58. if(!ids.length){
  59. layer.alert('请选择')
  60. return
  61. }
  62. Fast.api.open(`${$.fn.bootstrapTable.defaults.extend.multi_edit_proxy_url}/ids/${ids.join(',')}`,'编辑供应商')
  63. })
  64. $('.btn-multi-edit-status').click(function (){
  65. let ids=[]
  66. $('#table').bootstrapTable('getSelections').forEach(item=>{
  67. ids.push(item.id)
  68. })
  69. if(!ids.length){
  70. layer.alert('请选择')
  71. return
  72. }
  73. Fast.api.open(`${$.fn.bootstrapTable.defaults.extend.multi_edit_status_url}/ids/${ids.join(',')}`,'编辑上下架')
  74. })
  75. $('.btn-batch_set_amount').click(function (){
  76. let ids=[]
  77. $('#table').bootstrapTable('getSelections').forEach(item=>{
  78. ids.push(item.id)
  79. })
  80. if(!ids.length){
  81. layer.alert('请选择')
  82. return
  83. }
  84. Fast.api.open(`${$.fn.bootstrapTable.defaults.extend.batch_set_amount}/ids/${ids.join(',')}`,'批量改价')
  85. })
  86. $('.btn-batch_set_kill').click(function (){
  87. let ids=[]
  88. $('#table').bootstrapTable('getSelections').forEach(item=>{
  89. ids.push(item.id)
  90. })
  91. if(!ids.length){
  92. layer.alert('请选择')
  93. return
  94. }
  95. Fast.api.open(`${$.fn.bootstrapTable.defaults.extend.batch_set_kill}/ids/${ids.join(',')}`,'秒杀')
  96. })
  97. $('.btn-set_online_clear').click(function (){
  98. Fast.api.open(`${$(this).data('url')}`,$(this).text())
  99. })
  100. let _delete_condition=false,deleteIdx
  101. let make_export
  102. let sub=admin_Info.is_sub
  103. let columns= [
  104. {checkbox: true},
  105. {field: 'id', title: __('Id'),operate: false,},
  106. {field: 'no', title: __('手机号'), operate: "LIKE"},
  107. {field: 'filter_first_last', title: __('筛选位置'),visible: false,operate: '=',searchList: {1:'尾部',2:'中间'},defaultValue:1},
  108. {field: 'province', title: __('Province'),operate: 'LIKE'},
  109. {field: 'city', title: __('归属地'),operate: 'LIKE'},
  110. {field: 'exclude_nums', title: __('排除数字'),visible:false,data:'data-field="title" data-multiple="true" data-source="mobile/exclude_nums" readonly',addclass: 'selectpage'},
  111. {field: 'network', title: __('运营商'), formatter(network){
  112. return `<span style="background: ${networkColor[network]};color: white;border-radius: 5px;padding: 3px 6px;">${network}</span>`
  113. },searchList: mobile_network},
  114. {field: 'proxy.nickname', title: __('供应商'), formatter: Table.api.formatter.label,operate: 'LIKE'},
  115. {field: 'brand', title: __('卡品牌'), formatter: Table.api.formatter.label, operate: "LIKE"},
  116. {
  117. field: 'rules', title: __('规律'), searchList: Object.keys(filters), formatter(a) {
  118. return a.join('<br>')
  119. }
  120. },
  121. {
  122. field: 'info.describe',
  123. title: __('套餐信息'),
  124. operate: "like",
  125. formatter: Table.api.formatter.content,
  126. width: 200
  127. },
  128. {field: 'amount_original', title: __('Amount_original'), operate: false},
  129. {field: 'amount_di', title: __('底价'), operate: 'BETWEEN'},
  130. {field: 'amount_proxy', title: __('代理价'), operate: 'BETWEEN'},
  131. {field: 'amount_base', title: __('Amount'), operate: 'BETWEEN'},
  132. {field: 'amount_kill', title: __('秒杀价'), operate: 'BETWEEN'},
  133. {field: 'amount_charge', title: __('预存话费'), operate: 'BETWEEN'},
  134. {field: 'api_goods_id', title: __('Api商品id')},
  135. {field: 'remark', title: __('备注'), operate: 'like'},
  136. {
  137. //field: sub?'mobile_sub.sub_top_time':'top_time',
  138. field: 'top_time',
  139. title: __('Top_time'),
  140. //operate: 'RANGE',
  141. //addclass: 'datetimerange',
  142. autocomplete: false,
  143. /* formatter(a, b, c) {
  144. return `<a data-toggle="switcher" class="btn-switcher btn-change-top" data-id="${b.id}" data-value="${a ? a : ''}">
  145. <i class="fa fa-toggle-on text-success ${a ? '' : 'fa-flip-horizontal text-gray'} fa-2x"></i>
  146. </a>`
  147. }*/
  148. //formatter: Table.api.formatter.label,
  149. formatter(a){
  150. if(a>0){
  151. return '<span class="label label-success">是</span>'
  152. }
  153. return '<span class="label label-default">否</span>'
  154. },
  155. searchList: {1:'置顶1',2:'置顶2',3:'置顶3',4:'置顶4',5:'置顶5',0:'否'},
  156. },
  157. {
  158. //field: sub?'mobile_sub.sub_rec_time':'rec_time',
  159. field: 'rec_time',
  160. title: __('Rec_time'),
  161. //operate: 'RANGE',
  162. //addclass: 'datetimerange',
  163. autocomplete: false,
  164. /*formatter(a, b, c) {
  165. return `<a data-toggle="switcher" class="btn-switcher btn-change-rec" data-id="${b.id}" data-value="${a ? a : ''}">
  166. <i class="fa fa-toggle-on text-success ${a ? '' : 'fa-flip-horizontal text-gray'} fa-2x"></i>
  167. </a>`
  168. }*/
  169. //formatter: Table.api.formatter.label,
  170. formatter(a){
  171. if(a>0){
  172. return '<span class="label label-success">是</span>'
  173. }
  174. return '<span class="label label-default">否</span>'
  175. },
  176. searchList: {1:'推荐1',2:'推荐2',3:'推荐3',4:'推荐4',5:'推荐5',0:'否'},
  177. },
  178. {
  179. field: 'is_offer',
  180. title: '特价号',
  181. autocomplete: false,
  182. formatter(a){
  183. if(a>0){
  184. return '<span class="label label-success">是</span>'
  185. }
  186. return '<span class="label label-default">否</span>'
  187. },
  188. searchList: {1:'是',0:'否'},
  189. },
  190. {
  191. field: 'buttons',
  192. width: "120px",
  193. title: __('操作'),
  194. table: table,
  195. events: Table.api.events.operate,
  196. operate: false,
  197. formatter: Table.api.formatter.buttons,
  198. buttons: [
  199. {
  200. name: 'detail',
  201. text: __('预占'),
  202. title: __('预占'),
  203. classname: 'btn btn-xs btn-info btn-dialog',
  204. url: 'mobile/takeit',
  205. callback: function (data) {
  206. },
  207. visible: function (row) {
  208. return table.data('operate-mobile_takeit') && row.is_activity===0;
  209. }
  210. },
  211. {
  212. name: 'detail',
  213. text: __('取消预占'),
  214. title: __('取消预占'),
  215. classname: 'btn btn-xs btn-warning btn-ajax',
  216. confirm: '确认取消吗?',
  217. url: 'mobile/activity_cancel?aaa=1',
  218. success: function (data) {
  219. $('.btn-refresh').trigger('click')
  220. },
  221. visible: function (row) {
  222. return table.data('operate-activity_cancel') && row.is_activity===1;
  223. },
  224. disable(row){
  225. return admin_Info.is_sub && row.hold_chan!==admin_Info.id
  226. }
  227. },
  228. {
  229. name: 'detail',
  230. text: __('记录'),
  231. title: __('记录'),
  232. classname: 'btn btn-xs btn-info btn-dialog',
  233. url: 'mobile_price_log/index?a=1',
  234. callback: function (data) {
  235. },
  236. visible: function (row) {
  237. return true;
  238. }
  239. },
  240. ]
  241. },
  242. {field: 'status', title: __('号码状态'), formatter (a,b){
  243. if(b.is_activity){
  244. return `<span style="color: red"><div>●</div>预占</span>`
  245. }else{
  246. return mobileStatus[a]
  247. }
  248. }, searchList: mobileStatus},
  249. {
  250. field: 'update_time',
  251. title: __('Update_time'),
  252. operate: 'RANGE',
  253. addclass: 'datetimerange',
  254. autocomplete: false,
  255. formatter: Table.api.formatter.datetime
  256. },
  257. {
  258. field: 'create_time',
  259. title: __('上架时间'),
  260. operate: 'RANGE',
  261. addclass: 'datetimerange',
  262. autocomplete: false,
  263. formatter: Table.api.formatter.datetime
  264. },
  265. //{field: sub?'mobile_sub.sub_sort':'sort', title: __('Sort'), operate: "BETWEEN"},
  266. {field: 'sort', title: __('Sort'), operate: "BETWEEN"},
  267. {field: 'hold_chan', title: __('预占通道'), operate: "="},
  268. {field: 'hold_user', title: __('预占用户ID'), operate: "="},
  269. {field: 'admin_id', title: __('上传用户'), operate: "="},
  270. {field: 'search_precise', title: __('精准搜索'),visible:false,searchList(){
  271. return Template('preciseInputs',{})
  272. }},
  273. {
  274. field: 'operate',
  275. title: __('Operate'),
  276. table: table,
  277. width: 150,
  278. events: Table.api.events.operate,
  279. formatter: Table.api.formatter.operate,
  280. buttons: [
  281. {
  282. name: 'detail',
  283. text: '上架',
  284. title: '上架',
  285. classname: 'btn btn-ajax btn-info btn-xs',
  286. url: 'mobile_api/up',
  287. visible(row){
  288. return showUp
  289. },
  290. success(){
  291. $('.btn-refresh').trigger('click')
  292. }
  293. },
  294. {
  295. name: 'detail',
  296. text: __('记录'),
  297. title: __('记录'),
  298. classname: 'btn btn-xs btn-info btn-dialog',
  299. url: 'mobile_price_log/index?a=1',
  300. callback: function (data) {
  301. },
  302. visible: function (row) {
  303. return table.data('operate-mobile_price_log');
  304. }
  305. },
  306. {
  307. name: 'detail',
  308. text: '排序',
  309. title: '排序',
  310. classname: 'btn btn-dialog btn-info btn-xs',
  311. url: 'mobile/mobile_sort',
  312. visible(row){
  313. return table.data('operate-mobile_sort')
  314. }
  315. }
  316. ]
  317. },
  318. ]
  319. if(!admin_Info.is_manager){
  320. Table.api.removeColumn('proxy.nickname',columns)
  321. Table.api.removeColumn('amount_proxy',columns)
  322. }
  323. // 初始化表格
  324. table.bootstrapTable({
  325. url: $.fn.bootstrapTable.defaults.extend.index_url,
  326. pk: 'id',
  327. sortName: 'id',
  328. search: false,
  329. searchFormVisible: true,
  330. fixedColumns: true,
  331. fixedRightNumber:1,
  332. columns: [columns],
  333. onLoadSuccess(data){
  334. if(data.delete_condition_msg){
  335. layer.msg(data.delete_condition_msg)
  336. }
  337. layer.close(deleteIdx)
  338. make_export=data.url
  339. },
  340. queryParams(params){
  341. params._delete_condition=_delete_condition
  342. let precise_search={}
  343. for(var i=2;i<=11;i++){
  344. precise_search[i]=$(`.form-commonsearch input[name="precise[${i}]"]`).val()
  345. }
  346. params.precise_search=precise_search
  347. return params
  348. }
  349. });
  350. $('.btn-add,.btn-edit').data('area',["100%","100%"])
  351. let setStatus = function (_this, field) {
  352. let a = layer.load()
  353. $.post('mobile/batch', {
  354. id: _this.attr('data-id'),
  355. status: _this.attr('data-value') ? 0 : 1,
  356. field: field
  357. }, function (res) {
  358. if (res.code) {
  359. _this.attr('data-value', res.data.status)
  360. if (res.data.status) {
  361. _this.find('i').removeClass('fa-flip-horizontal text-gray')
  362. } else {
  363. _this.find('i').addClass('fa-flip-horizontal text-gray')
  364. }
  365. } else {
  366. layer.msg('操作失败')
  367. }
  368. layer.close(a)
  369. })
  370. }
  371. $(document).on('click', '.btn-change-top', function () {
  372. setStatus($(this), 'top_time')
  373. })
  374. $(document).on('click', '.btn-change-rec', function () {
  375. setStatus($(this), 'rec_time')
  376. })
  377. $(document).on('click', '.btn-set-discount', function () {
  378. let set = $(this).data('set')
  379. let select = table.bootstrapTable('getSelections'),
  380. a = []
  381. if (!select.length) {
  382. return
  383. }
  384. select.forEach(item => {
  385. a.push(item.id)
  386. })
  387. if (!set) {
  388. $.post($.fn.bootstrapTable.defaults.extend.cancel_discount, {ids: a}, function () {
  389. layer.msg('操作成功')
  390. $('.btn-refresh').trigger('click')
  391. })
  392. } else {
  393. Fast.api.open($.fn.bootstrapTable.defaults.extend.set_discount + `/ids/${a.join(',')}`, '设置特价', {
  394. close() {
  395. $('.btn-refresh').trigger('click')
  396. }
  397. })
  398. }
  399. })
  400. $(document).on('click','.btn-import-disabled',function (){
  401. let btn=$(this)
  402. let input=document.createElement('input')
  403. input.type='file'
  404. input.accept='.xlsx'
  405. input.onchange=function (){
  406. let file=this.files[0]
  407. let form=new FormData
  408. form.append('file',file)
  409. let idx=layer.load()
  410. $.ajax('/admin.php/ajax/upload',{
  411. error(){
  412. layer.alert('上传出错')
  413. layer.close(idx)
  414. },
  415. type:'post',
  416. contentType:false,
  417. processData:false,
  418. data:form,
  419. success({code,data,msg}){
  420. if(!code){
  421. layer.alert(msg)
  422. }else{
  423. $.ajax(btn.data('href'),{
  424. error(){
  425. layer.alert('导入出错')
  426. },
  427. complete(){
  428. layer.close(idx)
  429. },
  430. type:'post',
  431. data:{file:data.url},
  432. success({code,data,msg}){
  433. if(!code){
  434. layer.alert(msg)
  435. }else{
  436. Toastr.success(msg)
  437. //$('.btn-refresh').trigger('click')
  438. }
  439. }
  440. })
  441. }
  442. }
  443. })
  444. }
  445. input.click()
  446. })
  447. let next=0,prev=0
  448. $('.form-commonsearch .preciseInput').bind('input keyup',function (){
  449. if($(this).val()>9){
  450. $(this).val($(this).val().substr(0,1))
  451. }
  452. if(next===1){
  453. next=0
  454. return
  455. }
  456. if($(this).val()){
  457. if(!$(this).next()[0]){
  458. return
  459. }
  460. let tagName=$(this).next()[0].tagName
  461. if(tagName==='BR'){
  462. $(this).next().next().focus().select()
  463. }else {
  464. $(this).next().focus().select()
  465. }
  466. next=1
  467. }else{
  468. $(this).prev().focus().select()
  469. next=1
  470. }
  471. })
  472. let searchForm=$('.form-commonsearch')
  473. $('.btn-del-condition').click(function (){
  474. parent.layer.confirm('确认删除吗?如果未选择条件则删除全部号码!',function (idx){
  475. parent.layer.close(idx)
  476. _delete_condition=true
  477. deleteIdx=layer.load()
  478. searchForm.find('button[type="submit"]').click()
  479. _delete_condition=false
  480. })
  481. })
  482. $('.btn-del-all').click(function (){
  483. let href=$(this).data('href')
  484. parent.layer.confirm('确认删除全部吗?',function (con){
  485. parent.layer.close(con)
  486. let idx=layer.load()
  487. $.ajax(href,{
  488. type:'post',
  489. success({code,msg,data}){
  490. if(code===1){
  491. let num=data.num||0
  492. layer.alert(`成功删除${num}个号码`)
  493. $('.btn-refresh').click()
  494. }else{
  495. layer.alert(msg)
  496. }
  497. },
  498. error(){
  499. layer.alert('请求出错')
  500. },
  501. complete(){
  502. layer.close(idx)
  503. }
  504. })
  505. })
  506. })
  507. $('.btn-php-export').click(function (){
  508. let idx=parent.layer.load(1)
  509. $.get(make_export,function (res){
  510. parent.layer.alert(res)
  511. parent.layer.close(idx)
  512. })
  513. })
  514. $('.btn-mobile_api_up').click(function (){
  515. let ids=[]
  516. $('#table').bootstrapTable('getSelections').forEach(item=>{
  517. ids.push(item.id)
  518. })
  519. if(!ids.length){
  520. parent.layer.alert('请选择')
  521. return
  522. }
  523. let href=$(this).data('href')
  524. parent.layer.confirm('确认上架吗?',function (con){
  525. parent.layer.close(con)
  526. let idx=layer.load()
  527. $.ajax(href,{
  528. data:{ids:ids.join(',')},
  529. type:'post',
  530. success({code,msg,data}){
  531. if(code===1){
  532. layer.alert(`批量上架成功`)
  533. $('.btn-refresh').click()
  534. }else{
  535. layer.alert(msg)
  536. }
  537. },
  538. error(){
  539. layer.alert('请求出错')
  540. },
  541. complete(){
  542. layer.close(idx)
  543. }
  544. })
  545. })
  546. })
  547. $('.btn-mobile_api_up_all').click(function (){
  548. let href=$(this).data('href')
  549. parent.layer.confirm('确定全部导入靓号吗?',function (con){
  550. parent.layer.close(con)
  551. let idx=layer.load()
  552. $.ajax(href,{
  553. type:'post',
  554. success({code,msg,data}){
  555. if(code===1){
  556. layer.alert(`全部导入靓号成功`)
  557. $('.btn-refresh').click()
  558. }else{
  559. layer.alert(msg)
  560. }
  561. },
  562. error(){
  563. layer.alert('请求出错')
  564. },
  565. complete(){
  566. layer.close(idx)
  567. }
  568. })
  569. })
  570. })
  571. window.refresh=()=>{
  572. $('.btn-refresh').trigger('click')
  573. }
  574. // 为表格绑定事件
  575. Table.api.bindevent(table);
  576. },
  577. price(){
  578. Form.api.bindevent($('#add-form'))
  579. }
  580. };
  581. return Controller;
  582. });