system.refill.balance.php 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. <?php defined('InShopNC') or exit('Access Invalid!'); ?>
  2. <style>
  3. .row_q ul li {
  4. height: 30px;
  5. line-height: 30px;
  6. }
  7. .row_w {
  8. float: left;
  9. margin-right: 40px;
  10. }
  11. #merchant_name_form thead th:last-child,
  12. #merchant_name_form tbody td:last-child {
  13. position: sticky;
  14. right: 0;
  15. z-index: 1;
  16. background: #fff;
  17. box-shadow: -2px 0 2px #cbe9f3;
  18. width: 170px;
  19. display: inline-block;
  20. line-height: 30px;
  21. height: 30px;
  22. text-align: center;
  23. }
  24. #merchant_name_form thead tr th:first-child,
  25. #merchant_name_form tbody tr td:first-child {
  26. position: sticky;
  27. left: 0;
  28. background: #fff;
  29. z-index: 1;
  30. width: 30px;
  31. box-shadow: 2px 0 2px rgba(0, 0, 0, 0.1);
  32. }
  33. #merchant_name_form table {
  34. display: block;
  35. width: 100%;
  36. max-height: calc(100vh - 220px);
  37. table-layout: fixed;
  38. overflow-x: scroll;
  39. }
  40. #merchant_name_form table thead tr:first-child {
  41. position: sticky;
  42. top: -1px;
  43. left: 0;
  44. background: #fff;
  45. box-shadow: 0 2px 5px rgb(0 0 0 / 10%);
  46. z-index: 10;
  47. }
  48. #merchant_name_form table tbody tr:last-child {
  49. border-bottom: 1px dotted #CBE9F3;
  50. }
  51. #createDate,
  52. #createItemStartDate,
  53. #createItemEndDate {
  54. height: 30px;
  55. }
  56. .createTaskDate {
  57. display: flex;
  58. align-items: center;
  59. margin-bottom: 10px;
  60. }
  61. .createTaskDate span {
  62. white-space: nowrap;
  63. margin-right: 10px;
  64. }
  65. .tab-base li span {
  66. font-size: 12px !important;
  67. }
  68. .page .fixed-bar .item-title h3 {
  69. margin-top: 18px !important;
  70. margin-bottom: 10px !important;
  71. font-weight: 700 !important;
  72. }
  73. .mw165 {
  74. min-width: 165px;
  75. }
  76. .layui-form-label {
  77. width: 90px !important;
  78. }
  79. </style>
  80. <div class="page">
  81. <div class="fixed-bar">
  82. <div class="item-title">
  83. <h3>对账管理</h3>
  84. <ul class="tab-base">
  85. <li><a href="index.php?act=OrderStats&op=index&type=system"><span>平台对账记录</span></a></li>
  86. <li><a href="index.php?act=OrderStats&op=index&type=provider"><span>上游对账记录</span></a></li>
  87. <li><a href="index.php?act=OrderStats&op=index&type=merchant"><span>下游对账记录</span></a></li>
  88. <li><a href="JavaScript:void(0);" class="current"><span>平台结余记录</span></a></li>
  89. <li><a href="index.php?act=OrderStats&op=refill_balance&type=provider"><span>上游结余记录</span></a></li>
  90. <li><a href="index.php?act=OrderStats&op=refill_balance&type=merchant"><span>下游结余记录</span></a></li>
  91. </ul>
  92. </div>
  93. </div>
  94. <div class="fixed-empty"></div>
  95. <form method="get" name="formSearch" id="formSearch">
  96. <input type="hidden" value="OrderStats" name="act">
  97. <input type="hidden" value="refill_balance" name="op">
  98. <input type="hidden" value="system" name="type">
  99. <table class="tb-type1 noborder search">
  100. <tbody>
  101. <tr>
  102. <th><label for="query_start_time">结余统计时间</label></th>
  103. <td>
  104. <input class="txt date" type="text" value="<?php echo $_GET['query_start_time']; ?>" id="startTime" name="query_start_time" autocomplete="off" style="width:120px" />
  105. <label for="query_start_time">~</label>
  106. <input class="txt date" type="text" value="<?php echo $_GET['query_end_time']; ?>" id="endTime" name="query_end_time" autocomplete="off" style="width:120px" />
  107. </td>
  108. <td>
  109. <th><label>统计日期类型</label></th>
  110. <td>
  111. <select name="order_time_type" id="order_time_type">
  112. <option value="">请选择...</option>
  113. <option value="notify_time" <?php if ($_GET['order_time_type'] == 'notify_time') {
  114. echo 'selected';
  115. } ?>>回调日期</option>
  116. <option value="order_time" <?php if ($_GET['order_time_type'] == 'order_time') {
  117. echo 'selected';
  118. } ?>>下单日期</option>
  119. </select>
  120. </td>
  121. </td>
  122. <td><a href="javascript:void(0);" id="ncsubmit" class="btn-search " title="<?php echo $lang['nc_query']; ?>">&nbsp;</a>
  123. <?php if ($output['mch_name'] != '') { ?>
  124. <a href="index.php?act=OrderStats&op=index" class="btns " title="<?php echo $lang['nc_cancel_search']; ?>"><span><?php echo $lang['nc_cancel_search']; ?></span></a>
  125. <?php } ?>
  126. </td>
  127. <td>
  128. <a href="javascript:void(0);" id="create" class="btn">
  129. <span>新建全部</span>
  130. </a>
  131. </td>
  132. </tr>
  133. <tr>
  134. <td>
  135. <a href="#" class="btn export" title="所选中记录导出">
  136. <span><i class="icon-export"></i>导出</span>
  137. </a>
  138. </td>
  139. </tr>
  140. </tbody>
  141. </table>
  142. </form>
  143. <div>
  144. <script>
  145. var stats_list_data = <?php echo json_encode($output['stats_list']) ?>
  146. </script>
  147. <form method="post" id="merchant_name_form">
  148. <input type="hidden" name="form_submit" value="ok" />
  149. <table class="table tb-type2" style="white-space: nowrap;">
  150. <thead>
  151. <tr class="thead">
  152. <th class="align-center" id="selectAll"><input type="checkbox" name="chbox" value=""></th>
  153. <th>记录ID</th>
  154. <th>父ID</th>
  155. <th>主体名称</th>
  156. <th class="align-center">统计开始日期</th>
  157. <th class="align-center">统计结束日期</th>
  158. <th class="align-center">成功订单数</th>
  159. <th class="align-center">成功金额</th>
  160. <th class="align-center">下游金额</th>
  161. <th class="align-center">上游金额</th>
  162. <th class="align-center">利润</th>
  163. <th class="align-center">银行转入</th>
  164. <th class="align-center">银行转出</th>
  165. <th class="align-center">返销金额</th>
  166. <th class="align-center">异常金额</th>
  167. <th class="align-center">累计结余</th>
  168. <th class="align-center">本次结余</th>
  169. <th class="align-center">更新日期</th>
  170. <th class="align-center">确认状态</th>
  171. <th class="align-center">统计日期类型</th>
  172. <th class="align-center">备注</th>
  173. <th class="align-center">操作</th>
  174. </tr>
  175. </thead>
  176. <tbody>
  177. <?php if (!empty($output['stats_list']) && is_array($output['stats_list'])) { ?>
  178. <?php foreach ($output['stats_list'] as $k => $v) { ?>
  179. <tr class="trFlex">
  180. <td class="align-center">
  181. <input type="checkbox" id="checkBoxList" name="checkbox" value="<?php echo $v['balance_id']; ?>">
  182. </td>
  183. <td><?php echo $v['balance_id']; ?></td>
  184. <td><?php echo $v['parent_id']; ?></td>
  185. <td><?php echo $v['cname']; ?></td>
  186. <td class="align-center"><?php echo $v['start_stamp'] ? date('Y-m-d H:i', $v['start_stamp']) : '/'; ?></td>
  187. <td class="align-center"><?php echo $v['end_text']; ?></td>
  188. <td class="align-center"><?php echo $v['success_count']; ?></td>
  189. <td class="align-center"><?php echo $v['refill_amount']; ?></td>
  190. <td class="align-center"><?php echo $v['mch_amount']; ?></td>
  191. <td class="align-center"><?php echo $v['channel_amount']; ?></td>
  192. <td class="align-center"><?php echo $v['profit_amount']; ?></td>
  193. <td class="align-center"><?php echo $v['transfer_in']; ?></td>
  194. <td class="align-center"><?php echo $v['transfer_out']; ?></td>
  195. <td class="align-center"><?php echo $v['refund_amount']; ?></td>
  196. <td class="align-center"><?php echo $v['except_amount']; ?></td>
  197. <td class="align-center"><?php echo $v['accumulate_balance']; ?></td>
  198. <td class="align-center"><?php echo $v['balance']; ?></td>
  199. <td class="align-center"><?php echo date("Y-m-d H:i:s", $v['update_time']); ?></td>
  200. <td class="align-center">
  201. <?php if ($v['confirmed'] == 0) { ?>
  202. <span style="color: #fd9d0e">未确认</span>
  203. <?php } else { ?>
  204. <span style="color: #0bb20c">已确认</span>
  205. <?php } ?>
  206. </td>
  207. <td class="align-center"><?php echo $output['order_time_type_text'][$v['time_type']]; ?></td>
  208. <td class="align-center"><?php echo $v['remark']; ?></td>
  209. <td style="color:#069;">
  210. <a style="color:#0D93BF;" href="javascript:void(0)" data-index="<?php echo $k ?>" class="handleBtn">编辑</a>
  211. <span>|</span>
  212. <a style="margin:0 5px;color:#0D93BF;" href="index.php?act=orderstats&op=refill_balance_rebuild&balance_id=<?php echo $v['balance_id']; ?>" data-index="<?php echo $k ?>" class="rebuildBtn">重新生成</a>
  213. <?php if ($v['confirmed'] == 0) { ?>
  214. <span>|</span>
  215. <a style="color:#0D93BF;" href="index.php?act=orderstats&op=refill_balance_confirm&balance_id=<?php echo $v['balance_id']; ?>" data-index="<?php echo $k ?>" class="checkBtn">确认</a>
  216. <?php } ?>
  217. </td>
  218. </tr>
  219. <?php } ?>
  220. <?php } else { ?>
  221. <tr class="no_data">
  222. <td colspan="22"><?php echo $lang['nc_no_record']; ?></td>
  223. </tr>
  224. <?php } ?>
  225. </tbody>
  226. </table>
  227. <div class="pagination"><?php echo $output['show_page']; ?></div>
  228. </form>
  229. </div>
  230. </div>
  231. <script type="text/javascript" src="<?php echo RESOURCE_SITE_URL; ?>/js/jquery.edit.js" charset="utf-8"></script>
  232. <script type="text/javascript" src="<?php echo RESOURCE_SITE_URL; ?>/laydate/laydate.js"></script>
  233. <script type="text/javascript" src="<?php echo ADMIN_TEMPLATES_URL; ?>/layui/layui.js"></script>
  234. <script type="text/javascript" src="<?php echo RESOURCE_SITE_URL; ?>/refill/layer.js"></script>
  235. <link rel="stylesheet" type="text/css" href="<?php echo ADMIN_TEMPLATES_URL; ?>/layui/css/layui.css" />
  236. <script>
  237. $(function() {
  238. $('#create').on('click', function() {
  239. var selectEndDate = '';
  240. layui.use(['layer', 'laydate'], function() {
  241. const selectDateHTML = '<label class="createTaskDate"><span>结束日期:</span><input type="text" class="layui-input" id="createDate"></label>'
  242. layer.confirm(selectDateHTML, {
  243. title: '新建'
  244. }, function(index) {
  245. console.log('确认')
  246. if (!selectEndDate) {
  247. layer.msg('请选择结束日期');
  248. return;
  249. }
  250. var index = layer.load();
  251. $.ajax({
  252. url: `index.php?act=orderstats&op=refill_balance_stat_all`,
  253. data: {
  254. selectEndDate
  255. },
  256. dataType: 'json',
  257. mothod: 'get',
  258. success: function(res) {
  259. layer.close(index);
  260. console.log('success', res);
  261. if (res.code) {
  262. layer.msg(res.msg)
  263. } else {
  264. layer.alert(res.msg)
  265. }
  266. }
  267. })
  268. layer.close(index);
  269. }, function() {
  270. console.log('取消')
  271. });
  272. laydate.render({
  273. elem: '#createDate',
  274. type: 'datetime',
  275. done: function(value) {
  276. console.log('选中的日期...', value)
  277. selectEndDate = value;
  278. }
  279. });
  280. })
  281. //
  282. })
  283. $('.item_create_btn').on('click', function() {
  284. var selectStartDate = '';
  285. var selectEndDate = '';
  286. var balance_id = $(this).attr('data-balance_id');
  287. layui.use(['layer', 'laydate'], function() {
  288. const selectDateHTML = `<label class="createTaskDate"><span>开始日期:</span><input type="text" class="layui-input" id="createItemStartDate"></label>
  289. <label class="createTaskDate"><span>结束日期:</span><input type="text" class="layui-input" id="createItemEndDate"></label>`
  290. layer.confirm(selectDateHTML, {
  291. title: '新建'
  292. }, function(index) {
  293. console.log('确认')
  294. if (!selectStartDate) {
  295. layer.msg('请选择开始日期');
  296. return;
  297. }
  298. if (!selectEndDate) {
  299. layer.msg('请选择结束日期');
  300. return;
  301. }
  302. console.log(balance_id, selectStartDate, selectEndDate)
  303. var index = layer.load();
  304. $.ajax({
  305. url: `index.php?act=orderstats&op=refill_balance_create`,
  306. data: {
  307. balance_id,
  308. selectStartDate,
  309. selectEndDate
  310. },
  311. dataType: 'json',
  312. mothod: 'get',
  313. success: function(res) {
  314. layer.close(index);
  315. console.log('success', res);
  316. if (res.code) {
  317. layer.msg(res.msg)
  318. } else {
  319. layer.alert(res.msg)
  320. }
  321. }
  322. })
  323. layer.close(index);
  324. }, function() {
  325. console.log('取消')
  326. });
  327. laydate.render({
  328. elem: '#createItemStartDate',
  329. type: 'datetime',
  330. done: function(value) {
  331. console.log('选中的开始日期...', value)
  332. selectStartDate = value;
  333. }
  334. });
  335. laydate.render({
  336. elem: '#createItemEndDate',
  337. type: 'datetime',
  338. done: function(value) {
  339. console.log('选中的结束日期...', value)
  340. selectEndDate = value;
  341. }
  342. });
  343. })
  344. })
  345. // <div class="layui-form-item">
  346. // <div class="layui-inline">
  347. // <label class="layui-form-label">统计开始日期:</label>
  348. // <div class="layui-input-inline">
  349. // <input type="text" value="${(data.start_stamp == 0 || !data.start_stamp) ? '' : data.start_stamp}" style="height:38px;" name="start_stamp" required lay-verify="required" placeholder="统计开始日期" autocomplete="off" class="layui-input" id="editItemStartDate">
  350. // </div>
  351. // </div>
  352. // <div class="layui-inline">
  353. // <label class="layui-form-label">统计结束日期:</label>
  354. // <div class="layui-input-inline">
  355. // <input type="text" value="${(data.end_text == 0 || !data.start_stamp) ? '': data.end_text}" style="height:38px;" name="end_text" required lay-verify="required" placeholder="统计结束日期" autocomplete="off" class="layui-input" id="editItemEndDate">
  356. // </div>
  357. // </div>
  358. // </div>
  359. $('.handleBtn').on('click', function() {
  360. var index = $(this).attr('data-index');
  361. var data = stats_list_data[index];
  362. console.log('data', data)
  363. layui.use(['form', 'layer', 'laydate'], function() {
  364. var layer = layui.layer;
  365. var form = layui.form;
  366. const transfer_detail_data = [];
  367. Object.keys(data.transfer_detail_data).map(key => {
  368. transfer_detail_data.push(data.transfer_detail_data[key])
  369. })
  370. console.log('transfer_detail_data', transfer_detail_data)
  371. let transferDetailHTML = '';
  372. for (let i = 0; i < transfer_detail_data.length; i++) {
  373. if (i % 3 == 0) {
  374. transferDetailHTML += `<div class="layui-form-item">`
  375. }
  376. transferDetailHTML += `
  377. <div class="layui-inline">
  378. <label class="layui-form-label">${transfer_detail_data[i].name}</label>
  379. <div class="layui-input-inline">
  380. <input type="text" value="${transfer_detail_data[i].amount}" disabled style="height:38px;" required lay-verify="required" autocomplete="off" class="layui-input">
  381. </div>
  382. </div>
  383. `
  384. if (i % 3 == 2 || i == transfer_detail_data.length - 1) {
  385. transferDetailHTML += `</div> `
  386. }
  387. }
  388. layer.confirm(`
  389. <div>
  390. <form id="editStatDataForm" class="layui-form" method="post" action="index.php?act=Orderstats&op=refill_balance_edit">
  391. <input type="hidden" value="${data.balance_id}" name="balance_id">
  392. <div class="layui-form-item">
  393. <div class="layui-inline">
  394. <label class="layui-form-label">成功订单数:</label>
  395. <div class="layui-input-inline">
  396. <input type="text" value="${data.success_count}" style="height:38px;" name="success_count" required lay-verify="required" placeholder="成功订单数" autocomplete="off" class="layui-input">
  397. </div>
  398. </div>
  399. <div class="layui-inline">
  400. <label class="layui-form-label">成功金额:</label>
  401. <div class="layui-input-inline">
  402. <input type="text" value="${data.refill_amount}" style="height:38px;" name="refill_amount" required lay-verify="required" placeholder="成功金额" autocomplete="off" class="layui-input">
  403. </div>
  404. </div>
  405. <div class="layui-inline">
  406. <label class="layui-form-label">下游金额:</label>
  407. <div class="layui-input-inline">
  408. <input type="text" value="${data.mch_amount}" style="height:38px;" name="mch_amount" required lay-verify="required" placeholder="下游金额" autocomplete="off" class="layui-input">
  409. </div>
  410. </div>
  411. </div>
  412. <div class="layui-form-item">
  413. <div class="layui-inline">
  414. <label class="layui-form-label">上游金额:</label>
  415. <div class="layui-input-inline">
  416. <input type="text" value="${data.channel_amount}" style="height:38px;" name="channel_amount" required lay-verify="required" placeholder="上游金额" autocomplete="off" class="layui-input">
  417. </div>
  418. </div>
  419. <div class="layui-inline">
  420. <label class="layui-form-label">利润:</label>
  421. <div class="layui-input-inline">
  422. <input type="text" value="${data.profit_amount}" style="height:38px;" name="profit_amount" required lay-verify="required" placeholder="利润" autocomplete="off" class="layui-input">
  423. </div>
  424. </div>
  425. <div class="layui-inline">
  426. <label class="layui-form-label">银行转入:</label>
  427. <div class="layui-input-inline">
  428. <input type="text" value="${data.transfer_in}" style="height:38px;" name="transfer_in" required lay-verify="required" placeholder="银行转入" autocomplete="off" class="layui-input">
  429. </div>
  430. </div>
  431. </div>
  432. <div class="layui-form-item">
  433. <div class="layui-inline">
  434. <label class="layui-form-label">银行转出:</label>
  435. <div class="layui-input-inline">
  436. <input type="text" value="${data.transfer_out}" style="height:38px;" name="transfer_out" required lay-verify="required" placeholder="银行转出" autocomplete="off" class="layui-input">
  437. </div>
  438. </div>
  439. <div class="layui-inline">
  440. <label class="layui-form-label">返销金额:</label>
  441. <div class="layui-input-inline">
  442. <input type="text" value="${data.refund_amount}" style="height:38px;" name="refund_amount" required lay-verify="required" placeholder="返销金额" autocomplete="off" class="layui-input">
  443. </div>
  444. </div>
  445. <div class="layui-inline">
  446. <label class="layui-form-label">异常金额:</label>
  447. <div class="layui-input-inline">
  448. <input type="text" value="${data.except_amount}" style="height:38px;" name="except_amount" required lay-verify="required" placeholder="异常金额" autocomplete="off" class="layui-input">
  449. </div>
  450. </div>
  451. </div>
  452. <div class="layui-form-item">
  453. <div class="layui-inline">
  454. <label class="layui-form-label">累计结余:</label>
  455. <div class="layui-input-inline">
  456. <input type="text" value="${data.accumulate_balance}" style="height:38px;" name="accumulate_balance" required lay-verify="required" placeholder="累计结余" autocomplete="off" class="layui-input">
  457. </div>
  458. </div>
  459. <div class="layui-inline">
  460. <label class="layui-form-label">本次结余:</label>
  461. <div class="layui-input-inline">
  462. <input type="text" value="${data.balance}" style="height:38px;" name="balance" required lay-verify="required" placeholder="本次结余" autocomplete="off" class="layui-input">
  463. </div>
  464. </div>
  465. </div>
  466. <div class="layui-form-item">
  467. <div class="layui-block">
  468. <label class="layui-form-label">备注:</label>
  469. <div class="layui-input-inline">
  470. <input type="text" value="${data.remark}" style="width:525px;height:38px;" name="remark" required lay-verify="required" placeholder="备注" autocomplete="off" class="layui-input">
  471. </div>
  472. </div>
  473. </div>
  474. <div style="height:1px;border-top: 1px dotted #CBE9F3;margin-bottom:15px;"></div>
  475. ${transferDetailHTML}
  476. </form>
  477. </div>`, {
  478. area: '1200px',
  479. title: '编辑'
  480. }, function(index) {
  481. $('#editStatDataForm').submit();
  482. })
  483. form.render();
  484. })
  485. })
  486. $('#ncsubmit').click(function() {
  487. $('#formSearch').submit();
  488. });
  489. // 日期选择器
  490. laydate.render({
  491. elem: '#startTime',
  492. type: 'datetime'
  493. });
  494. laydate.render({
  495. elem: '#endTime',
  496. type: 'datetime'
  497. });
  498. // 表格hover时背景
  499. $('.trFlex').each(function() {
  500. $(this).hover(function() {
  501. $(this)[0].style.backgroundColor = '#cbe9f3'
  502. }, function() {
  503. $(this)[0].style.backgroundColor = '#fff'
  504. })
  505. })
  506. $('#selectAll').click(function() {
  507. if ($("input[name='chbox']").is(':checked')) {
  508. $("input[name='checkbox']").each(function() {
  509. this.checked = true;
  510. })
  511. } else {
  512. $("input[name='checkbox']").each(function() {
  513. this.checked = false;
  514. })
  515. }
  516. })
  517. $('.export').click(function() {
  518. layer.confirm('您确定要导出所选记录吗', {
  519. btn: ['确定', '取消'],
  520. title: '记录导出'
  521. }, function() {
  522. let arr = [];
  523. $("input:checkbox:checked").each(function(i) {
  524. arr[i] = $(this).val();
  525. })
  526. let str = arr.join(",");
  527. let strr = str.substring(0, 1);
  528. let number = Number(strr);
  529. if (isNaN(number)) {
  530. let strrr = str.substring(1, str.length);
  531. window.location.href = `index.php?act=orderstats&op=refill_balance_export&balance_ids= ${strrr ? strrr : ''}`
  532. } else if (!isNaN(number) && str !== '') {
  533. window.location.href = `index.php?act=orderstats&op=refill_balance_export&balance_ids= ${str ? str : ''}`
  534. } else {
  535. layer.msg('请还没有任何操作,请先选择');
  536. }
  537. }, function() {
  538. layer.msg('取消成功');
  539. });
  540. })
  541. });
  542. </script>