clue_data.html 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. {extend name="public/layout" /}
  2. {block name="title"}线索统计{/block}
  3. {block name="head"}
  4. {include file="public/head"}
  5. <style>
  6. .layui-table th:last-child {
  7. border-right: none;
  8. }
  9. .layui-table-view .layui-table {
  10. /* width:100% */
  11. }
  12. .layui-table thead tr,
  13. .layui-table-header {
  14. background-color: #D8E6F1 !important;
  15. }
  16. .line-middle {
  17. width: 10px;
  18. height: 100%;
  19. margin: 0px 10px;
  20. }
  21. .line {
  22. width: 10px;
  23. height: 2px;
  24. background-color: #999999;
  25. }
  26. .mb0 {
  27. margin-bottom: 0px;
  28. }
  29. .layui-btn {
  30. background-color: #fff;
  31. color: #555;
  32. border: 1px solid #c9c9c9
  33. }
  34. .layui-btn:hover {
  35. background-color: #fff;
  36. color: #555;
  37. border: 1px solid #249efb;
  38. }
  39. .layui-btn-primary,
  40. .sBtn {
  41. background-color: #249efb;
  42. color: #fff;
  43. border: 1px solid #249efb;
  44. }
  45. .layui-btn-primary:hover {
  46. background-color: #249efb;
  47. color: #fff;
  48. border: 1px solid #249efb;
  49. }
  50. .sBtn:hover {
  51. background-color: #249efb;
  52. color: #fff;
  53. border: 1px solid #249efb;
  54. }
  55. .flex-row,
  56. .row {
  57. display: flex;
  58. }
  59. .align-center {
  60. align-items: center;
  61. }
  62. .ml10 {
  63. margin-left: 10px;
  64. }
  65. .mt10 {
  66. margin-top: 10px;
  67. }
  68. .padding-tlr {
  69. padding: 15px 15px 0px;
  70. }
  71. .layui-input-block {
  72. margin-left: 0px;
  73. }
  74. .justify-between {
  75. justify-content: space-between;
  76. }
  77. table tr td a {
  78. color: #249EFB;
  79. }
  80. .selectDateBox {
  81. position: absolute;
  82. width: 330px;
  83. height: 100px;
  84. box-shadow: 0 2px 4px rgb(0 0 0 / 12%);
  85. background-color: #fff;
  86. z-index: 99999 !important;
  87. top: 45px;
  88. box-sizing: border-box;
  89. padding: 5px 8px;
  90. }
  91. .selecstDateBox {
  92. position: absolute;
  93. width: 330px;
  94. height: 100px;
  95. box-shadow: 0 2px 4px rgb(0 0 0 / 12%);
  96. background-color: #fff;
  97. z-index: 99999 !important;
  98. top: 45px;
  99. right: 0;
  100. box-sizing: border-box;
  101. padding: 5px 8px;
  102. }
  103. .date-flex,.date-flex1 {
  104. display: flex;
  105. align-items: center;
  106. }
  107. .date-box {
  108. padding: 15px 0px 10px;
  109. }
  110. #rangeDepart {
  111. width: 260px;
  112. height: 38px;
  113. }
  114. xm-select > .xm-body {
  115. z-index: 99999 !important;
  116. }
  117. </style>
  118. {/block}
  119. {block name="body"}
  120. <div class="layui-fluid" style="background-color: #fff;">
  121. <div class="layui-card">
  122. <div class="search-form layui-form padding-tlr">
  123. <div class="flex-row align-center justify-between">
  124. <div class="flex-row align-center">
  125. {if $Request.get.type == 2}
  126. <div class="layui-inline" style="float: left;">
  127. <div class="goback">
  128. <a href="{:url('statistics/clue')}" style="color:#269efb;margin-right: 10px;">
  129. <i class="layui-icon layui-icon-return"></i>
  130. <span>返回</span>
  131. </a>
  132. </div>
  133. </div>
  134. {/if}
  135. <!-- <div class="layui-inline row ml10" id="timeBtn">
  136. <input type="button" class="layui-btn" value="今日" />
  137. <input type="button" class="layui-btn" value="3天" />
  138. <input type="button" class="layui-btn" value="7天" />
  139. <input type="button" class="layui-btn" value="1个月" />
  140. </div> -->
  141. <!-- <div class="layui-inline ml10">
  142. <input type="text" class="layui-input" id="sDate" autocomplete="off" name="start_date" placeholder="选择开始日期">
  143. </div>
  144. <div class="line-middle">
  145. <div class="line"></div>
  146. </div>
  147. <div class="layui-inline">
  148. <input type="text" class="layui-input" id="eDate" autocomplete="off" name="end_date" placeholder="选择结束日期">
  149. </div> -->
  150. <div class="layui-input-inline layui-form mdt10" style="display:inline-block">
  151. <!-- <select name="org_id" class="type_id" id="org_id" lay-search>
  152. <option value="">请选择部门</option>
  153. {volist name="org" id="i"}
  154. <option value="{$i.id}">{$i.name}</option>
  155. {/volist}
  156. </select> -->
  157. <div id="rangeDepart"></div>
  158. </div>
  159. <div class="layui-input-inline layui-form ml10" style="display:inline-block;width:200px">
  160. <!-- <label class="layui-form-label" style="width: 60px;">跟进时间</label> -->
  161. <div class="layui-input-inline select-date relative">
  162. <!-- 注意:这一层元素并不是必须的 -->
  163. <input type="text" class="layui-input" id="sDate" name="start_date" placeholder="开始日期 - 结束日期"
  164. autocomplete="off">
  165. <div data-type="" class="selecstDateBox layui-hide">
  166. <div data-type="" class="date-flex1">
  167. <div data-type="today" class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs">今日
  168. </div>
  169. <div data-type="yesterday" class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs">昨日</div>
  170. <div data-type="week" class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs">本周
  171. </div>
  172. <div data-type="lastWeek" class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs">上周</div>
  173. <div data-type="month" class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs">本月
  174. </div>
  175. <div data-type="lastMonth" class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs">上月</div>
  176. <div data-type="all" class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs">
  177. 累计</div>
  178. </div>
  179. <div data-type="" class="date-box">
  180. <input data-type="" type="text" id="select_sDate" placeholder="选择开始时间 - 结束时间" readonly autocomplete="off"
  181. class="layui-input">
  182. </div>
  183. </div>
  184. </div>
  185. </div>
  186. </div>
  187. <div>
  188. <button type="button" class="layui-btn sBtn ml10 submitbtn" lay-submit lay-filter="table-search">筛选</button>
  189. </div>
  190. </div>
  191. </div>
  192. <div class="layui-card-body">
  193. <table lay-filter="datalist" id="list"></table>
  194. </div>
  195. </div>
  196. </div>
  197. {/block}
  198. {block name="js"}
  199. <script src="__STATIC__/layui/layui/lay/modules/xm-select.js" type="text/javascript" charset="utf-8"></script>
  200. <script>
  201. layui.use(['table', 'form', 'laydate', 'element'], function () {
  202. let table = layui.table,
  203. laydate = layui.laydate,
  204. form = layui.form,
  205. element = layui.element,
  206. $ = layui.$;
  207. $('body').attr('layadmin-themealias', 'default');
  208. var bodyH = $('.body-h').height() * 0.82;
  209. var istypes=0;
  210. document.onkeydown=function(event){
  211. var e = event || window.event || arguments.callee.caller.arguments[0];
  212. if(e && e.keyCode==13){
  213. $(".submitbtn").trigger("click");
  214. }
  215. };
  216. //执行一个laydate实例
  217. // laydate.render({
  218. // elem: '#sDate' //指定元素
  219. // });
  220. // laydate.render({
  221. // elem: '#eDate' //指定元素
  222. // });
  223. $('#addWechatTime').click(function () {
  224. $('.selectDateBox').toggleClass('layui-hide');
  225. $('.selecstDateBox').addClass('layui-hide');
  226. })
  227. $('#sDate').click(function () {
  228. $('.selecstDateBox').toggleClass('layui-hide');
  229. $('.selectDateBox').addClass('layui-hide');
  230. })
  231. laydate.render({
  232. elem: '#select_date'
  233. , type: 'date'
  234. , range: true
  235. , format: 'yyyy/MM/dd'
  236. , trigger: 'click',//呼出事件改成click
  237. done: function (value, date, endDate) {
  238. $('.selectDateBox').addClass('layui-hide');
  239. $('#addWechatTime').val(value);
  240. }
  241. });
  242. laydate.render({
  243. elem: '#select_sDate' //指定元素
  244. , type: 'date'
  245. , format: 'yyyy/MM/dd'
  246. , range: true
  247. , trigger: 'click',//呼出事件改成click
  248. done: function (value, date, endDate) {
  249. $('.selecstDateBox').addClass('layui-hide');
  250. $('#sDate').val(value);
  251. }
  252. });
  253. var dateObj = {};
  254. setDate();
  255. function setDate() {
  256. let date = new Date();
  257. let year = date.getFullYear();
  258. let month = date.getMonth() + 1;
  259. let day = date.getDate();
  260. let lastDate = new Date(new Date().getTime() - (1 * 24 * 60 * 60 * 1000));
  261. let lastYear = lastDate.getFullYear();
  262. let lastMonth = lastDate.getMonth() + 1;
  263. let lastDay = lastDate.getDate();
  264. let weekObj = getMondayAndSunday();
  265. let monthObj = getMonthFirstDayAndLastDay();
  266. dateObj = {
  267. today: `${year}/${month}/${day}`,
  268. yesterday: `${lastYear}/${lastMonth}/${lastDay}`,
  269. ...weekObj,
  270. ...monthObj
  271. }
  272. }
  273. var departTree = xmSelect.render({
  274. el: "#rangeDepart",
  275. name: 'org_id',
  276. autoRow: true,
  277. filterable: true,
  278. tips: '请选择',
  279. radio: true,
  280. tree: {
  281. show: true,
  282. showFolderIcon: true,
  283. showLine: true,
  284. indent: 20,
  285. expandedKeys: [ -3 ],
  286. //是否严格遵守父子模式
  287. strict: false,
  288. },
  289. height: "200px",
  290. data: [],
  291. //文本显示模式
  292. //处理方式
  293. });
  294. $.ajax({
  295. url: '{:url("statistics/get_person")}',
  296. type: "post",
  297. data: {},
  298. success: function(res) {
  299. departTree.update({data:res})
  300. }
  301. })
  302. $('.date-flex div').click(function () {
  303. let type = $(this).prop('dataset').type;
  304. if (type == 'today') {
  305. $('#select_date').val(`${dateObj.today} - ${dateObj.today}`);
  306. $('#addWechatTime').val(`${dateObj.today} - ${dateObj.today}`);
  307. } else if (type == 'yesterday') {
  308. $('#select_date').val(`${dateObj.yesterday} - ${dateObj.yesterday}`);
  309. $('#addWechatTime').val(`${dateObj.yesterday} - ${dateObj.yesterday}`);
  310. } else if (type == 'week') {
  311. $('#select_date').val(`${dateObj.thisWeekMonday} - ${dateObj.thisWeekSunday}`);
  312. $('#addWechatTime').val(`${dateObj.thisWeekMonday} - ${dateObj.thisWeekSunday}`);
  313. } else if (type == 'lastWeek') {
  314. $('#select_date').val(`${dateObj.lastWeekMonday} - ${dateObj.lastWeekSunday}`);
  315. $('#addWechatTime').val(`${dateObj.lastWeekMonday} - ${dateObj.lastWeekSunday}`);
  316. } else if (type == 'month') {
  317. $('#select_date').val(`${dateObj.thisMonthFirstDay} - ${dateObj.thisMonthLastDay}`);
  318. $('#addWechatTime').val(`${dateObj.thisMonthFirstDay} - ${dateObj.thisMonthLastDay}`);
  319. } else if (type == 'lastMonth') {
  320. $('#select_date').val(`${dateObj.lastMonthFirstDay} - ${dateObj.lastMonthLastDay}`);
  321. $('#addWechatTime').val(`${dateObj.lastMonthFirstDay} - ${dateObj.lastMonthLastDay}`);
  322. } else {
  323. $('#select_date').val('');
  324. $('#sDate').val('')
  325. $('#addWechatTime').val('');
  326. }
  327. $('.selectDateBox').addClass('layui-hide');
  328. })
  329. $('.date-flex1 div').click(function () {
  330. let type = $(this).prop('dataset').type;
  331. if (type == 'today') {
  332. itmesss = dateToYYYYMMDD(dateObj.today);
  333. itmesss2 = dateToYYYYMMDD(dateObj.today);
  334. $('#select_sDate').val(itmesss+' - '+itmesss2);
  335. $('#sDate').val(itmesss+' - '+itmesss2);
  336. } else if (type == 'yesterday') {
  337. itmesss = dateToYYYYMMDD(dateObj.yesterday);
  338. itmesss2 = dateToYYYYMMDD(dateObj.yesterday);
  339. $('#select_sDate').val(itmesss+' - '+itmesss2);
  340. $('#sDate').val(itmesss+' - '+itmesss2);
  341. } else if (type == 'week') {
  342. $('#select_sDate').val(`${dateObj.thisWeekMonday} - ${dateObj.thisWeekSunday}`);
  343. $('#sDate').val(`${dateObj.thisWeekMonday} - ${dateObj.thisWeekSunday}`);
  344. } else if (type == 'lastWeek') {
  345. $('#select_sDate').val(`${dateObj.lastWeekMonday} - ${dateObj.lastWeekSunday}`);
  346. $('#sDate').val(`${dateObj.lastWeekMonday} - ${dateObj.lastWeekSunday}`);
  347. } else if (type == 'month') {
  348. $('#select_sDate').val(`${dateObj.thisMonthFirstDay} - ${dateObj.thisMonthLastDay}`);
  349. $('#sDate').val(`${dateObj.thisMonthFirstDay} - ${dateObj.thisMonthLastDay}`);
  350. } else if (type == 'lastMonth') {
  351. $('#select_sDate').val(`${dateObj.lastMonthFirstDay} - ${dateObj.lastMonthLastDay}`);
  352. $('#sDate').val(`${dateObj.lastMonthFirstDay} - ${dateObj.lastMonthLastDay}`);
  353. } else {
  354. $('#select_sDate').val('');
  355. $('#sDate').val('');
  356. }
  357. $('.selecstDateBox').addClass('layui-hide');
  358. })
  359. function getMondayAndSunday() {
  360. var today = new Date();
  361. //构建当前日期,格式:2022-08-22 00:00:00
  362. var year = today.getFullYear(); //本年
  363. var month = today.getMonth() + 1; //本月
  364. var day = today.getDate(); //本日
  365. var newDate = new Date(year + "/" + month + "/" + day + " 00:00:00"); //年月日拼接
  366. var nowTime = newDate.getTime(); //当前的时间戳
  367. var weekDay = newDate.getDay(); //当前星期 0.1.2.3.4.5.6 【0 = 周日】
  368. var oneDayTime = 24 * 60 * 60 * 1000; //一天的总ms
  369. // 当前星期减去天数,如今天为周五,则本周一为周五的时间戳减去4天的时间戳。但周日特殊,周一至周六是周几的到的weekDay就是几,但是周日的到的为0,需特殊处理
  370. var thisWeekMondayTime = (1 - weekDay) * oneDayTime + nowTime; //本周一的时间戳
  371. if (weekDay == 0) {
  372. // weekDay = 0 为周日,此时本周一时间为周日减去6天的时间
  373. thisWeekMondayTime = nowTime - 6 * oneDayTime
  374. }
  375. var thisWeekSundayTime = thisWeekMondayTime + 6 * 24 * 60 * 60 * 1000 // 本周日
  376. var lastWeekMondayTime = thisWeekMondayTime - 7 * oneDayTime // 上周一
  377. var lastWeekSundayTime = thisWeekMondayTime - oneDayTime // 上周日
  378. var res = {
  379. thisWeekMonday: dateToYYYYMMDD(thisWeekMondayTime),
  380. thisWeekSunday: dateToYYYYMMDD(thisWeekSundayTime),
  381. lastWeekMonday: dateToYYYYMMDD(lastWeekMondayTime),
  382. lastWeekSunday: dateToYYYYMMDD(lastWeekSundayTime),
  383. }
  384. return res;
  385. }
  386. function getMonthFirstDayAndLastDay() {
  387. var date = new Date()
  388. // 值得注意的是,如果day取值为0,意味着取的是date时间的上一个月的最后一天,简单理解:date当前月的第一天,再减去一天
  389. var thisMonthFirstDay = date.setDate(1) // 本月第一天
  390. var thisMonthLastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0) // 本月最后一天
  391. var lastMonthFirstDay = new Date(date.getFullYear(), date.getMonth() - 1, 1) // 上月第一天
  392. var lastMonthLastDay = date.setDate(0) // 上月最后一天
  393. // var day = new Date(date.getFullYear(), date.getMonth(), 0).getDate()
  394. // var lastMonthLastDay = new Date(date.getFullYear(), date.getMonth() - 1, day) // 上月最后一天
  395. var res = {
  396. thisMonthFirstDay: dateToYYYYMMDD(thisMonthFirstDay),
  397. thisMonthLastDay: dateToYYYYMMDD(thisMonthLastDay),
  398. lastMonthFirstDay: dateToYYYYMMDD(lastMonthFirstDay),
  399. lastMonthLastDay: dateToYYYYMMDD(lastMonthLastDay),
  400. }
  401. return res
  402. }
  403. function dateToYYYYMMDD(date) {
  404. var time = new Date(date);
  405. var y = time.getFullYear();
  406. var m = (time.getMonth() + 1);
  407. m = m > 9 ? m : '0' + m;
  408. var d = time.getDate();
  409. d = d > 9 ? d : '0' + d;
  410. return y + "/" + m + "/" + d;
  411. }
  412. let cols1 = [[
  413. { field: 'org_name', title: '部门名称', align: 'center', width: 150, fixed: 'left' },
  414. { field: 'num', title: '获客量', align: 'center', fixed: 'left' },
  415. { field: 'valid_num', title: '有效线索建档', align: 'center', fixed: 'left' },
  416. { field: 'valid_lv', title: '有效率', align: 'center', fixed: 'left' },
  417. { field: 'invalid_num', title: '无效线索', align: 'center', fixed: 'left' }
  418. ]];
  419. let cols2 = [[
  420. { field: 'name', title: '员工名称', align: 'center', width: 150, 'fixed': 'left' },
  421. { field: 'org_name', title: '部门', align: 'center', fixed: 'left' },
  422. { field: 'num', title: '获客量', align: 'center', fixed: 'left' },
  423. { field: 'valid_num', title: '有效线索建档', align: 'center', fixed: 'left' },
  424. { field: 'valid_lv', title: '有效率', align: 'center', fixed: 'left' },
  425. { field: 'invalid_num', title: '无效线索', align: 'center', fixed: 'left' }
  426. ]];
  427. let cols = cols1;
  428. let url = '{:url("statistics/clue")}';
  429. if (location.search.search('type=2') > 0) {
  430. cols = cols2;
  431. url = '{:url("statistics/clue", ["type"=>2, "org_id"=>$Request.get.org_id])}';
  432. istypes=2;
  433. }
  434. table.render({
  435. elem: '#list'
  436. , url: url
  437. , page: true
  438. , height: bodyH
  439. , cols: cols
  440. , id: 'tablelist'
  441. });
  442. function setYMD(time) {
  443. let dateTime = new Date(time);
  444. let year = dateTime.getFullYear();
  445. let Month = dateTime.getMonth() + 1;
  446. let days = dateTime.getDate();
  447. return `${year}-${Month > 9 ? Month : '0' + Month}-${days > 9 ? days : '0' + days}`;
  448. }
  449. var dateArr = {};
  450. var today = new Date().getTime();
  451. var oneTime = 24 * 60 * 60 * 1000;
  452. var threeDay1 = today - 3 * oneTime;
  453. var sevenDay1 = today - 6 * oneTime;
  454. var oneMonth = today - 30 * oneTime;
  455. dateArr = {
  456. nowS: setYMD(today),
  457. nowE: setYMD(today),
  458. threeDayS: setYMD(threeDay1),
  459. threeDayE: setYMD(today),
  460. sevenDayS: setYMD(sevenDay1),
  461. sevenDayE: setYMD(today),
  462. oneMonthS: setYMD(oneMonth),
  463. oneMonthE: setYMD(today),
  464. }
  465. $('#timeBtn').on('click', function (e) {
  466. if (!!(e.target.localName != 'input')) return;
  467. let o = document.querySelector('#timeBtn').children;
  468. if (e.target.classList.contains('layui-btn-primary') == true) {
  469. for (var i = 0; i < o.length; i++) {
  470. o[i].className = 'layui-btn';
  471. }
  472. $('#sDate').val('');
  473. $('#eDate').val('');
  474. return;
  475. } else {
  476. for (var i = 0; i < o.length; i++) {
  477. o[i].className = 'layui-btn';
  478. }
  479. e.target.className = 'layui-btn layui-btn-primary';
  480. if (!!(e.target.className.indexOf('layui-btn-primary') > 0)) {
  481. if (e.target.value == '今日') {
  482. $('#sDate').val(dateArr.nowS);
  483. $('#eDate').val(dateArr.nowE);
  484. } else if (e.target.value == '3天') {
  485. $('#sDate').val(dateArr.threeDayS);
  486. $('#eDate').val(dateArr.threeDayE);
  487. } else if (e.target.value == '7天') {
  488. $('#sDate').val(dateArr.sevenDayS);
  489. $('#eDate').val(dateArr.sevenDayE);
  490. } else {
  491. $('#sDate').val(dateArr.oneMonthS);
  492. $('#eDate').val(dateArr.oneMonthE);
  493. }
  494. }
  495. }
  496. })
  497. form.on('submit(table-search)', function (data) {
  498. let field = data.field;
  499. let element = $('.layui-btn-primary');
  500. if (element && element[0]) {
  501. let el = element[0].value;
  502. }
  503. let option = {
  504. where: field
  505. , page: {
  506. curr: 1
  507. }
  508. };
  509. if (istypes == 0) {
  510. option.cols = cols1
  511. } else if(istypes==2){
  512. option.cols = cols2
  513. }
  514. //执行重载
  515. table.reload('tablelist', option);
  516. });
  517. })
  518. </script>
  519. {/block}