1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668 |
- <?php defined('InShopNC') or exit('Access Invalid!'); ?>
- <style>
- th label {
- display: inline-block;
- width: 60px;
- }
- .page .fixed-bar .item-title h3 {
- margin-top: 18px !important;
- margin-bottom: 10px !important;
- font-weight: 700 !important;
- }
- .tab-base li span {
- font-size: 12px !important;
- }
- input::placeholder {
- color: #333;
- }
- .btn-container {
- margin-top: 10px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- border: 1px solid #ccc;
- padding: 10px;
- }
- .btn-container div:last-child {
- text-align: right;
- }
- .layui-btn-sm {
- height: 28px !important;
- line-height: 28px !important;
- padding: 0 10px !important;
- }
- .ac-item input {
- width: 400px !important;
- height: 32px !important;
- line-height: 32px !important;
- padding: 0 10px !important;
- border: 1px solid #e6e6e6 !important;
- border-radius: 2px !important;
- background-color: #fff !important;
- box-sizing: border-box !important;
- margin-right: 10px;
- }
- .ac-item button {
- height: 32px !important;
- line-height: 32px !important;
- }
- .stats-panel {
- margin-top: 40px;
- margin-left: 30px;
- width: 1664px;
- overflow-x: auto;
- }
- .negative-value {
- color: red;
- }
- .ch-tags {
- display: inline-block;
- padding: 5px 10px;
- margin: 5px;
- background-color: #f2f2f2;
- border: 1px solid #dcdcdc;
- border-radius: 4px;
- position: relative;
- }
- .ch-tags .delete-btn {
- position: absolute;
- top: 0;
- right: 0;
- cursor: pointer;
- color: red;
- }
- .input-group {
- margin-top: 10px;
- display: flex;
- align-items: center;
- }
- .input-group input[type="text"] {
- padding: 6px 10px;
- border: 1px solid #d2d2d2;
- border-radius: 3px;
- font-size: 14px;
- outline: none;
- width: 200px;
- }
- .input-group .layui-btn {
- font-size: 14px;
- padding: 6px 10px;
- border-radius: 3px;
- line-height: normal;
- }
- .mch-items {
- display: inline-block;
- margin-right: 20px;
- min-width: 15%;
- line-height: 32px;
- }
- .sortable-item {
- cursor: move;
- padding: 5px;
- margin: 5px;
- background-color: #f0f0f0;
- border: 1px solid #ccc;
- display: inline-block;
- }
- .checkout-items {
- display: inline-block;
- margin-right: 20px;
- min-width: 15%;
- line-height: 32px;
- }
- .selected-items{
- margin-top: 20px;
- padding: 10px;
- border: 1px solid #ccc;
- min-height: 50px;
- }
- .layui-layer-content {
- padding: 20px;
- }
- .ac-item div:first-child {
- width: 100%;
- }
- .ac-item div:last-child {
- text-align: left !important;
- width: 100%;
- }
- #channel_names_ca, #mch_names_ca {
- display: inline-block;
- max-width: 80%;
- }
- .layui-layer-btn {
- text-align: center;
- border-top: 1px solid #F0F0F0;
- }
- .names-manager-container {
- margin-top: 20px;
- }
- #new_name_input {
- width: 360px;
- }
- .names_ca {
- display: inline-block;
- width: 80%;
- }
- .layui-table td.col-bg {
- background-color: #f2f2f2;
- }
- #processBar {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: rgba(0, 0, 0, 0.5);
- display: flex;
- justify-content: center;
- align-items: center;
- color: #fff;
- z-index: 100;
- }
- .progress-container {
- background-color: #f2f2f2;
- border-radius: 5px;
- overflow: hidden;
- height: 20px;
- width: 100%;
- margin-bottom: 10px;
- }
- .progress-bar {
- background-color: #5FB878;
- height: 100%;
- width: 0;
- line-height: 20px;
- color: #fff;
- text-align: center;
- white-space: nowrap;
- transition: width 0.4s;
- }
- #progressDescription {
- font-size: 16px;
- color:red;
- background-color: white;
- }
- #rechargeManual {
- padding: 20px;
- background-color: #fff;
- display: flex;
- gap: 20px;
- }
- #rechargeConfirmItems {
- flex: 1;
- }
- .layui-form {
- flex: 2;
- }
- #rechargeManual .layui-input,
- #rechargeManual .layui-textarea {
- height: 38px !important;
- line-height: 38px !important;
- }
- #rechargeTips {
- color: red;
- text-align: center;
- font-size: 14px;
- font-weight: 400;
- position: absolute;
- bottom: 0;
- left: 0;
- width: 100%;
- }
- .reset-bar {
- margin-top: 10px;
- width: 1532px;
- overflow-x: auto;
- white-space: nowrap;
- background-color: #fff;
- box-sizing: border-box;
- position: relative;
- height:32px;
- line-height: 32px;
- }
- .reset-bar button {
- height: 28px;
- line-height: 28px;
- display: inline-block;
- vertical-align: middle;
- }
- .reset-bar button:first-child {
- margin-left: 352px;
- width: 110px;
- }
- .reset-bar button:nth-child(2) {
- margin-left: 600px;
- width: 110px;
- }
- .reset-bar button:nth-child(3) {
- margin-left: 120px;
- width: 100px;
- }
- .reset-bar button:nth-child(4) {
- margin-left: 10px;
- width: 100px;
- }
- .paymodel-form .paymodel-label {
- width: 120px;
- text-align: right;
- white-space: nowrap;
- display: inline-block;
- vertical-align: top;
- }
- .paymodel-form .paymodel-red {
- vertical-align: middle;
- }
- .paymodel-form .paymodel-input-inline {
- width: calc(100% - 130px);
- display: inline-block;
- }
- .paymodel-form .paymodel-input, .paymodel-form .paymodel-textarea {
- width: 100%;
- box-sizing: border-box;
- }
- .layui-btn {
- position: relative;
- }
- .btn-badge {
- position: absolute;
- top: 5px;
- right: 5px;
- width: 16px;
- height: 16px;
- background-color: red;
- color: white;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 10px;
- font-weight: bold;
- }
- .layui-btn-light-yellow {
- background-color: #EF949F !important;
- }
- #rechargeManual {
- width: 700px;
- }
- #rechargeManualApprove {
- display:none;
- padding: 20px;
- width: 1210px;
- }
- </style>
- <div class="page" id="app">
- <div class="fixed-bar">
- <div class="item-title">
- <h3>上下游金额统计</h3>
- <ul class="tab-base">
- <li><a href="JavaScript:void(0);" class="current"><span>余额统计</span></a></li>
- <li><a href="index.php?act=refill_amount_stats&op=daily_statement"><span>日对账单</span></a></li>
- <li><a href="index.php?act=refill_amount_stats&op=monthly_statement"><span>月对账单</span></a></li>
- </ul>
- </div>
- </div>
- <div class="fixed-empty"></div>
- <!-- 顶部按钮 -->
- <div class="btn-container">
- <div class="ac-item w50pre">
- <up-name-select title="上游设置" type="channel_names"></up-name-select>
- <down-name-select title="机构设置" type="merchant_names"></down-name-select>
- </div>
- <div>
- <button type="button" class="layui-btn layui-bg-blue" id="btn_refresh_approve">刷新审核</button>
- <button type="button" class="layui-btn layui-bg-blue" id="btn_search">更新数据</button>
- <button type="button" class="layui-btn layui-bg-red" id="btn_copy_data">拷贝数据</button>
- <button type="button" class="layui-btn layui-bg-red" id="btn_import">导入数据</button>
- <button type="button" class="layui-btn layui-bg-red" id="btn_copy_excel">拷贝表格</button>
- </div>
- </div>
- <div class="layui-clear"></div>
- <!-- 普充上游统计区 -->
- <div class="stats-panel layui-font-14">
- <selected-channel-normal title="选择普充通道" type="KEY_CHANNEL_NORMAL" emit="updateNormalTb"></selected-channel-normal>
- <div class="reset-bar">
- <button type="button" class="layui-btn layui-btn-light-yellow reset-col" data-table="upstream_tb_normal" data-col="transfer">一键清0</button>
- <button type="button" class="layui-btn layui-btn-light-yellow reset-col" data-table="upstream_tb_normal" data-col="payment_design">一键清0</button>
- <button type="button" class="layui-btn layui-bg-orange ac-batch-deposit" data-table="upstream_tb_normal">批量加款</button>
- <button type="button" class="layui-btn layui-bg-red ac-approve" data-table="upstream_tb_normal">
- 审批
- <span class="btn-badge" id="approveBadgeNormal">0</span>
- </button>
- </div>
- <table class="layui-hide" id="upstream_tb_normal"></table>
- </div>
- <!-- 快充上游统计区 -->
- <div class="stats-panel layui-font-14">
- <selected-channel-fast title="选择快充通道" type="KEY_CHANNEL_FAST" emit="updateFastTb"></selected-channel-fast>
- <div class="reset-bar">
- <button type="button" class="layui-btn layui-btn-light-yellow reset-col" data-table="upstream_tb_fast" data-col="transfer">一键清0</button>
- <button type="button" class="layui-btn layui-btn-light-yellow reset-col" data-table="upstream_tb_fast" data-col="payment_design">一键清0</button>
- <button type="button" class="layui-btn layui-bg-orange ac-batch-deposit" data-table="upstream_tb_fast">批量加款</button>
- <button type="button" class="layui-btn layui-bg-red ac-approve" data-table="upstream_tb_fast">
- 审批
- <span class="btn-badge" id="approveBadgeFast">0</span>
- </button>
- </div>
- <table class="layui-hide" id="upstream_tb_fast"></table>
- </div>
- <!-- 机构统计区 -->
- <div class="stats-panel layui-font-14">
- <selected-merchant title="选择机构" type="KEY_MERCHANT" emit="mchsetChange"></selected-merchant>
- <table class="layui-hide" id="downstream_tb"></table>
- </div>
- <!-- 导入数据弹层 -->
- <div id="importLayer" style="display: none;">
- <div class="layui-form" style="padding: 20px;">
- <div class="layui-form-item layui-form-text">
- <textarea id="clipboardContent" class="layui-textarea" rows="20"></textarea>
- </div>
- </div>
- </div>
- <!-- 执行加款 -->
- <div id="rechargeManual" style="display:none; padding: 20px;">
- <div class="layui-form-item" id="rechargeConfirmItems">
- <table class="layui-hide" id="upstream_tb_transfer"></table>
- </div>
- <div id="rechargeTips"></div>
- </div>
- <!-- 审核 -->
- <div id="rechargeManualApprove">
- <table class="layui-hide" id="upstream_tb_approve"></table>
- </div>
- <!-- 全屏进度条 -->
- <div class="layui-container" style="display:none;" id="processBar">
- <div class="layui-row">
- <div class="layui-col-xs12">
- <div class="progress-container">
- <div class="progress-bar" id="progress-bar">0%</div>
- </div>
- <div id="progressDescription">初始化...</div>
- </div>
- </div>
- </div>
- </div>
- <script type="text/javascript" src="<?php echo RESOURCE_SITE_URL; ?>/laydate/laydate.js"></script>
- <script type="text/javascript" src="<?php echo RESOURCE_SITE_URL; ?>/js/jquery-ui/jquery.ui.js"></script>
- <script type="text/javascript" src="<?php echo RESOURCE_SITE_URL; ?>/js/jquery-ui/i18n/zh-CN.js" charset="utf-8"></script>
- <script type="text/javascript" src="<?php echo RESOURCE_SITE_URL;?>/refill/layer.js"></script>
- <script type="text/javascript" src="<?php echo ADMIN_TEMPLATES_URL;?>/js/xm-select.js"></script>
- <script type="text/javascript" src="<?php echo ADMIN_TEMPLATES_URL;?>/layui/layui.js"></script>
- <link rel="stylesheet" type="text/css" href="<?php echo ADMIN_TEMPLATES_URL; ?>/layui/css/layui.css"/>
- <link rel="stylesheet" type="text/css" href="<?php echo RESOURCE_SITE_URL; ?>/js/jquery-ui/themes/ui-lightness/jquery.ui.css"/>
- <script type="text/javascript" src="<?php echo ADMIN_TEMPLATES_URL;?>/js/stats-utils.js?t=<?php echo time();?>"></script>
- <script type="text/javascript" src="<?php echo ADMIN_TEMPLATES_URL;?>/js/stats-amount.js?t=<?php echo time();?>"></script>
- <?php session_start(); ?>
- <script type="text/javascript">
- const systemTag = '<?php echo ADMIN_NAME;?>';
- const systemUserName = '<?php echo $output['admin_info']['name'];?>';
- const globalData = {};
- const settingsKeys = [
- CONSTANTS.KEY_CHANNEL_NAMES,
- CONSTANTS.KEY_MERCHANT_NAMES,
- CONSTANTS.KEY_CHANNEL_FAST,
- CONSTANTS.KEY_CHANNEL_NORMAL,
- CONSTANTS.KEY_MERCHANT
- ];
- $(function() {
- const app = new ComponentBase({
- el: '#app',
- componentData: {
- 'up-name-select': [],
- 'down-name-select': [],
- 'selected-channel-normal': [],
- 'selected-channel-fast': [],
- 'selected-merchant': []
- },
- components: {
- 'up-name-select': StreamNameComponent,
- 'down-name-select': StreamNameComponent,
- 'selected-channel-normal': SelectedChannelComponent,
- 'selected-channel-fast': SelectedChannelComponent,
- 'selected-merchant': SelectedMerchantComponent
- }
- });
- app.on('updateNormalTb', () => {
- initPage();
- });
- app.on('updateFastTb', () => {
- initPage();
- });
- app.on('mchsetChange', () => {
- initPage();
- });
- class GlobalData extends GlobalDataBase {
- static FIELD_MAP = {
- ...GlobalDataBase.FIELD_MAP,
- SYS_CHAN_NORMAL: 'sys_chan_normal',
- SYS_MCHS: 'sys_mchs',
- SYS_CHAN_FAST: 'sys_chan_fast',
- DATA_CHAN_NORMAL: 'chan_normal_data',
- DATA_CHAN_FAST: 'chan_fast_data',
- DATA_MERCHANT: 'mch_data',
- COPY_DATA: 'copy_data',
- PAYINFO: 'payinfo',
- };
- setPayinfo(storeId, tag, amount) {
- if (!isNumeric(amount)) {
- return;
- }
- const key = this.constructor.FIELD_MAP.PAYINFO;
- if (!this.data[key]) {
- this.data[key] = [];
- }
- const find = this.data[key].find(item => item.store_id === storeId && item.tag === tag);
- if (!find) {
- this.data[key].push({ store_id: storeId, tag: tag, amount: amount });
- } else {
- find.amount = amount;
- }
- }
- getPayinfo() {
- const key = this.constructor.FIELD_MAP.PAYINFO;
- return this.data[key] || [];
- }
- getPayinfoAmount(storeId, tag) {
- const key = this.constructor.FIELD_MAP.PAYINFO;
- const find = (this.data[key] || []).find(item => item.store_id === storeId && item.tag === tag);
- return find ? find.amount : '0';
- }
- }
- class ChannelTable extends LayuiTableBase{
- constructor(type, batchDeposit) {
- const tableId = type === 'normal' ? 'upstream_tb_normal' : 'upstream_tb_fast';
- super(tableId);
- this.type = type;
- this.batchDeposit = batchDeposit;
- }
- getChannelSettings() {
- if (this.type === 'normal') {
- return globalData.getChannelNormal();
- } else if(this.type === 'fast') {
- return globalData.getChannelFast();
- }
- }
- setChannelSettings(data) {
- if (this.type === 'normal') {
- return globalData.setChannelNormal(data);
- } else if(this.type === 'fast') {
- return globalData.setChannelFast(data);
- }
- }
- getChannelData() {
- if (this.type === 'normal') {
- return globalData.getDataChanNormal();
- } else if(this.type === 'fast') {
- return globalData.getDataChanFast();
- }
- }
- setChannelData(data) {
- if (this.type === 'normal') {
- return globalData.setDataChanNormal(data);
- } else if(this.type === 'fast') {
- return globalData.setDataChanFast(data);
- }
- }
- getCacheKey() {
- if (this.type === 'normal') {
- return CONSTANTS.KEY_CHANNEL_NORMAL;
- } else if(this.type === 'fast') {
- return CONSTANTS.KEY_CHANNEL_FAST;
- }
- }
- getCopyDataChan() {
- const copyData = globalData.getCopyData();
- if (copyData.length === 0) {
- return [];
- }
- if (this.type === 'normal') {
- return copyData.stats_data_normal;
- } else if(this.type === 'fast') {
- return copyData.stats_data_fast;
- }
- }
- getCopySortChan() {
- const copyData = globalData.getCopyData();
- if (copyData.length === 0) {
- return [];
- }
- if (this.type === 'normal') {
- return copyData.stats_channel_normal;
- } else if(this.type === 'fast') {
- return copyData.stats_channel_fast;
- }
- }
- async loadData() {
- const copyData = globalData.getCopyData();
- const chanCust = this.getChannelSettings();
- const storeIds = chanCust
- .filter(item => item.tag === systemTag)
- .map(item => item.store_id)
- .join(',');
- const params = { store_ids: storeIds };
- const channelFetch = await statsApi.getChannelData(params);
- let chanData = [];
- if(channelFetch.state === true) {
- chanData = channelFetch.list;
- }
- if (!isObjectEmpty(copyData)) {
- const copyDataChan = this.getCopyDataChan();
- copyDataChan.forEach(item => {
- const selfItem = chanData.find(dn => {
- return dn.store_id === item.store_id && dn.tag === item.tag;
- });
- if (selfItem !== undefined) {
- item.balance = selfItem.balance;
- item.available_predeposit = selfItem.available_predeposit;
- }
- });
- chanData = mergeData(chanData, copyDataChan, 'store_name', systemTag);
- }
- let tableData = [];
- for (let item of chanData) {
- const setting = chanCust.find(function(chan) {
- return chan.name === item.name && chan.tag === item.tag;
- });
- let tableItem = {}, alarm_amount = '0', payment_design = '0', pay_operation = '';
- if (setting) {
- alarm_amount = setting.alarm_amount ?? '0';
- payment_design = setting.payment_design ?? '0';
- pay_operation = setting.pay_operation ?? '';
- }
- tableItem['transfer'] = globalData.getPayinfoAmount(item.store_id, item.tag);
- tableItem['payment_deviation'] = '0';
- tableItem['tag'] = item.tag;
- tableItem['store_id'] = item.store_id;
- tableItem['store_name'] = item.store_name;
- tableItem['name'] = item.name;
- tableItem['balance'] = formatDecimals(item.balance);
- tableItem['available_predeposit'] = formatDecimals(item.available_predeposit);
- tableItem['alarm_amount'] = formatDecimals(alarm_amount);
- tableItem['payment_design'] = formatDecimals(payment_design);
- tableItem['upstream_group'] = '';
- tableItem['pay_operation'] = pay_operation;
- tableData.push(tableItem);
- }
- const that = this;
- tableData.forEach(item => {
- item.upstream_group = that.getItemGroup(item);
- });
- let sortCust = [];
- if (!isObjectEmpty(copyData)) {
- sortCust = mergeData(chanCust, this.getCopySortChan(), 'store_name', systemTag);
- } else {
- sortCust = chanCust;
- }
- this.setChannelSettings(sortCust);
- let chanDataSort = sortCustData(sortCust, tableData, 'upstream_group', 'store_name');
- chanDataSort = sortByName(chanDataSort, 'store_name');
- //更新统计字段的值:表格合并后是展示第一条数据的值,取值逻辑:当前组第一条不为0的数据
- const groupUpdates = {}, groupAvailablePredeposit = {};
- chanDataSort.forEach(item => {
- if (!groupAvailablePredeposit[item.upstream_group]) {
- groupAvailablePredeposit[item.upstream_group] = 0;
- }
- groupAvailablePredeposit[item.upstream_group] += parseFloat(item.available_predeposit);
- if (!groupUpdates[item.upstream_group]) {
- groupUpdates[item.upstream_group] = {
- alarm_amount: '0',
- payment_design: '0',
- pay_operation: ''
- };
- }
- if (groupUpdates[item.upstream_group].alarm_amount === '0' && item.alarm_amount !== '0') {
- groupUpdates[item.upstream_group].alarm_amount = item.alarm_amount;
- }
- if (groupUpdates[item.upstream_group].payment_design === '0' && item.payment_design !== '0') {
- groupUpdates[item.upstream_group].payment_design = item.payment_design;
- }
- if (groupUpdates[item.upstream_group].pay_operation === '' && item.pay_operation !== '') {
- groupUpdates[item.upstream_group].pay_operation = item.pay_operation;
- }
- });
- chanDataSort.forEach((item) => {
- if (groupUpdates[item.upstream_group] !== undefined) {
- item.alarm_amount = groupUpdates[item.upstream_group].alarm_amount;
- item.payment_design = groupUpdates[item.upstream_group].payment_design;
- item.pay_operation = groupUpdates[item.upstream_group].pay_operation;
- }
- });
- this.setChannelData(chanDataSort);
- }
- syncChannelData() {
- const channelCust = this.getChannelSettings();
- const cacheKey = this.getCacheKey();
- statsApi.setStatsSettings(cacheKey, channelCust)
- .then(function (data) {
- if (data.state !== true) {
- layer.msg('缓存失败', {
- icon: 1,
- time: 2000
- });
- }
- })
- .catch(function (error) {
- layer.msg('缓存失败', {
- icon: 1,
- time: 2000
- });
- });
- }
- getItemGroup(item) {
- const chanNames = globalData.getChannelNames();
- let matched = false;
- let groupName = '';
- chanNames.forEach(name => {
- if (item.store_name.startsWith(name)) {
- groupName = name;
- matched = true;
- }
- });
- if (!matched) {
- groupName = item.store_name;
- }
- return groupName;
- }
- updateChannelCache(itemData, action) {//action=edit/del
- const channelCust = this.getChannelSettings();
- if (action === 'edit') {
- channelCust.forEach(item => {
- const groupName = this.getItemGroup(item);
- if (itemData.upstream_group === groupName) {
- item.alarm_amount = itemData.alarm_amount;
- item.payment_design = itemData.payment_design;
- item.pay_operation = itemData.pay_operation;
- }
- });
- } else if (action ==='del') {
- let chanTmp = [];
- const updateFlag = itemData.name + '-' + itemData.tag;
- channelCust.forEach(item => {
- const itemFlag = item.name + '-' + item.tag;
- if (itemFlag !== updateFlag) {
- chanTmp.push(item);
- }
- });
- this.setChannelSettings(chanTmp);
- }
- }
- async renderTable() {
- await this.loadData();
- const that = this;
- const tableData = this.getChannelData();
- let tableTitle = this.type === 'normal' ? '普充' : '快充';
- layui.table.render({
- elem: '#' + this.tableId,
- data: tableData,
- limit: tableData.length,
- cols: [[
- {field: 'payment_deviation', title: '<span style="font-weight:bold">' + tableTitle + ' 加-打 差额 </span>', width: 150},
- {field: 'store_name', title: '上游名称', width: 200},
- {field: 'transfer', title: '加款金额', width: 110},
- {field: 'available_predeposit', title: '订单成功后余额', width: 150},
- {field: 'balance', title: '接口查询余额', width: 150},
- {field: 'alarm_amount', title: '打款预警金额', width: 150},
- {field: 'plan_payment_amount', title: '预计打款金额', width: 150},
- {field: 'payment_design', title: '打款设计', width: 110},
- {field: 'upstream_group', title: '需打款上游', width: 100},
- {field: 'pay_operation', title: '操作人姓名', width: 120},
- {field: 'delete', title: '删除', width: 100, templet: function(d){return '<button class="layui-btn layui-btn-sm delete-btn" data-index="'+d.LAY_TABLE_INDEX+'">删除</button>';}},
- {field: 'transfer_action', title: '调款', width: 160, templet: function(d){
- return '<button class="layui-btn layui-btn-sm transfer-btn" data-index="'+d.LAY_TABLE_INDEX+'">单个加款</button>' +
- '<button class="layui-btn layui-btn-sm transfer-copy-btn" data-index="'+d.LAY_TABLE_INDEX+'">复制</button>';
- }}
- ]],
- done: function(res, curr, count) {
- const tableItem = $('#' + that.tableId);
- const $trs = tableItem.next('.layui-table-view').find('.layui-table-body tbody tr');
- $trs.each(function(i, tr) {
- const upstreamGroup = tableData[i].upstream_group;
- $(tr).attr('upstream_group', upstreamGroup);
- $(tr).attr('store_id', tableData[i].store_id);
- $(tr).attr('tag', tableData[i].tag);
- });
- that.mergeCells();
- const editNumberColumns = ['transfer', 'alarm_amount', 'payment_design'];
- const editTextColumns = ['pay_operation'];
- $trs.each(function(i, tr) {
- for(let col of editNumberColumns) {
- const $td = $(tr).find('td[data-field="' + col + '"]').not('.layui-hide');
- if ($td.length > 0) {//合并隐藏的不处理
- const $valDiv = $td.find('div');
- $valDiv.attr('contenteditable', true).css('background-color', 'lightblue');
- $valDiv.off('input', handleInputd2)
- .off('keypress')
- .off('blur')
- .on('input', handleInputd2)
- .on('keypress', function(e) {
- if (e.keyCode === 13) {
- e.preventDefault();
- $(this).blur();
- }
- })
- .on('blur', function() {
- let val = $valDiv.text().trim();
- if (!isNumeric(val)) {
- $valDiv.html('0');
- }
- val = normalizeAmount(val);//过滤,比如前导 0
- $valDiv.html(formatDecimals(val));
- if (col === 'payment_design') {
- if (Number(val) < 0) {
- $valDiv.html(Number(val).toFixed(2)*-1);
- }
- that.columnSum('payment_design');
- that.calcGroupDeviation('transfer', 'payment_design', 'payment_deviation', 2);
- }
- if (col === 'alarm_amount') {
- that.calcGroupDeviation('available_predeposit', 'alarm_amount', 'plan_payment_amount', 1);
- }
- if (col === 'transfer') { //调款操作,无需表格更新和缓存处理
- if (Number(val) < 0) {
- val *= -1;
- $valDiv.html(formatDecimals(val));
- }
- const channelItem = tableData[i];
- globalData.setPayinfo(channelItem.store_id, channelItem.tag, val);
- //同步更新到复制源中,避免修改后更新数据被源覆盖
- const copyData = globalData.getCopyData() || {};
- if (copyData.hasOwnProperty('stats_transfer') && copyData.stats_transfer.length > 0) {
- const copyTransfer = copyData.stats_transfer;
- const copyItem = copyTransfer.find(ct => {
- return ct.store_id === channelItem.store_id && ct.tag === channelItem.tag;
- });
- if (copyItem !== undefined) {
- copyItem.amount = val;
- }
- }
- that.calcGroupDeviation('transfer', 'payment_design', 'payment_deviation', 2);
- that.setValueClass(['balance', 'available_predeposit', 'alarm_amount', 'plan_payment_amount', 'payment_design', 'payment_deviation'], ['payment_deviation']);
- return;
- }
- that.upstreamStatus();
- that.setValueClass(['balance', 'available_predeposit', 'alarm_amount', 'plan_payment_amount', 'payment_design', 'payment_deviation'], ['payment_deviation']);
- const index = $(this).parent().parent().data('index');
- that.saveEdit(index);
- that.syncChannelData();
- });
- }
- }
- for(let col of editTextColumns) {
- const $td = $(tr).find('td[data-field="' + col + '"]').not('.layui-hide');
- if ($td.length > 0) {//合并隐藏的不处理
- const $valDiv = $td.find('div');
- let val = $valDiv.text().trim();
- $valDiv.html(val);
- $valDiv.attr('contenteditable', true).css('background-color', 'lightblue');
- $valDiv.off('input')
- .off('keypress')
- .off('blur')
- .on('input')
- .on('keypress', function(e) {
- if (e.keyCode === 13) {
- e.preventDefault();
- $(this).blur();
- }
- })
- .on('blur', function() {
- const index = $(this).parent().parent().data('index');
- that.saveEdit(index);
- that.syncChannelData();
- });
- }
- }
- });
- tableItem.next('.layui-table-view').find('.layui-table-body tbody').append(
- '<tr>' +
- '<td>合计</td>' +
- '<td></td>' +
- '<td></td>' +
- '<td><span id="table_sum_available_predeposit_' + that.type + '">0</span></td>' +
- '<td></td>' +
- '<td></td>' +
- '<td></td>' +
- '<td><span id="table_sum_payment_design_' + that.type + '">0</span></td>' +
- '<td></td>' +
- '<td></td>' +
- '</tr>'
- );
- that.updateTableCalc()
- tableItem.next('.layui-table-view').off('click', '.delete-btn').on('click', '.delete-btn', function (){
- const index = $(this).data('index');
- that.deleteRow(index);
- });
- tableItem.next('.layui-table-view').off('click', '.transfer-btn').on('click', '.transfer-btn', function (){
- const index = $(this).data('index');
- that.transfer(index);
- });
- tableItem.next('.layui-table-view').off('click', '.transfer-copy-btn').on('click', '.transfer-copy-btn', function (){
- const index = $(this).data('index');
- that.transferCopy(index);
- });
- }
- });
- };
- updateTableCalc () {
- this.columnSum('available_predeposit');
- this.columnSum('payment_design');
- this.calcGroupDeviation('available_predeposit', 'alarm_amount', 'plan_payment_amount', 1);
- this.calcGroupDeviation('transfer', 'payment_design', 'payment_deviation', 2);
- this.setValueClass(['balance', 'available_predeposit', 'alarm_amount', 'plan_payment_amount', 'payment_design', 'payment_deviation'], ['payment_deviation']);
- this.upstreamStatus();
- }
- updateToCache (col, val) {
- const channelCust = this.getChannelSettings();
- channelCust.forEach(item => {
- item[col] = val;
- });
- this.setChannelSettings(channelCust);
- this.syncChannelData();
- }
- saveEdit (index) {
- const groupAvailablePredeposit = {}, groupTransfer = {};
- const channelData = this.getChannelData();
- if (index >= channelData.length) {
- return;
- }
- channelData.forEach((item) => {
- if (!groupAvailablePredeposit[item.upstream_group]) {
- groupAvailablePredeposit[item.upstream_group] = 0;
- }
- groupAvailablePredeposit[item.upstream_group] += parseFloat(item.available_predeposit);
- if (!groupTransfer[item.upstream_group]) {
- groupTransfer[item.upstream_group] = 0;
- }
- groupTransfer[item.upstream_group] += parseFloat(item.transfer);
- });
- const that = this;
- const $tr = $('#' + this.tableId).next('.layui-table-view').find('.layui-table-body tbody tr[data-index="' + index + '"]');
- const alarm_amount = $tr.find('td[data-field="alarm_amount"]').find('div').text().trim();
- const payment_design = $tr.find('td[data-field="payment_design"]').find('div').text().trim();
- const transfer = $tr.find('td[data-field="transfer"]').find('div').text().trim();
- const pay_operation = $tr.find('td[data-field="pay_operation"]').find('div').text().trim();
- //由于这几列按组合并了,在更新的时候,要给组内的每一条数据同步相同的值
- const groupName = channelData[index].upstream_group;
- channelData.forEach(function (item) {
- if (item.upstream_group === groupName) {
- item.alarm_amount = alarm_amount || "0";
- item.payment_design = payment_design || "0";
- item.transfer = transfer || "0";
- item.pay_operation = pay_operation || "";
- if (groupAvailablePredeposit[item.upstream_group] !== undefined) {
- const planPaymentAmount = parseFloat(groupAvailablePredeposit[item.upstream_group]) - parseFloat(item.alarm_amount);
- item.plan_payment_amount = planPaymentAmount < 0 ? formatDecimals(planPaymentAmount) : '0';
- }
- if (groupTransfer[item.upstream_group] !== undefined) {
- item.payment_deviation = parseFloat(groupTransfer[item.upstream_group]) - parseFloat(item.alarm_amount);
- }
- that.updateChannelCache(item, 'edit');
- }
- });
- }
- mergeCells() {
- const $tbRoot = $('#' + this.tableId);
- const $trs = $tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
- //合并打款上游
- const upstreamMap = {};
- $trs.each(function(i, tr) {
- const group = $(tr).attr('upstream_group');
- if (group) {
- if (!upstreamMap[group]) {
- upstreamMap[group] = {count: 0, startIndex: i};
- }
- upstreamMap[group].count++;
- }
- });
- for (let group in upstreamMap) {
- const info = upstreamMap[group];
- if (info.count > 1) {
- //合并的列:打款预警金额/预计打款金额/打款设计/打款上游/调款按钮/操作人姓名
- const mergeColumns = ['alarm_amount', 'plan_payment_amount', 'payment_design', 'upstream_group', 'transfer_action', 'payment_deviation', 'pay_operation'];
- for (let col of mergeColumns) {
- $trs.eq(info.startIndex).find('td[data-field="' + col + '"]').attr('rowspan', info.count);
- for (let j = 1; j < info.count; j++) {
- $trs.eq(info.startIndex + j).find('td[data-field="' + col + '"]').addClass('layui-hide');
- }
- }
- }
- }
- };
- deleteRow(index) {
- let that = this;
- const channelData = this.getChannelData();
- const delItem = channelData[index];
- layer.confirm('确定要删除 ' + delItem.store_name + ' 吗?', { icon: 3, title: '删除确认' }, function (confirmIndex) {
- const itemData = channelData.splice(index, 1);
- that.updateChannelCache(itemData[0], 'del');
- that.syncChannelData();
- //删除导入数据中的项
- const copyData = globalData.getCopyData();
- if (!isObjectEmpty(copyData)) {
- copyData.stats_channel_fast = copyData.stats_channel_fast.filter(item => item.tag !== delItem.tag || item.name !== delItem.name );
- copyData.stats_channel_normal = copyData.stats_channel_normal.filter(item => item.tag !== delItem.tag || item.name !== delItem.name );
- copyData.stats_data_fast = copyData.stats_data_fast.filter(item => item.tag !== delItem.tag || item.name !== delItem.name );
- copyData.stats_data_normal = copyData.stats_data_normal.filter(item => item.tag !== delItem.tag || item.name !== delItem.name );
- }
- layui.table.reload(that.tableId, {
- data: channelData
- });
- layer.close(confirmIndex);
- });
- };
- transfer(index) {
- this.batchDeposit.doApplyOne(this.tableId, this.getChannelData(), index);
- };
- transferCopy(index) {
- const $trs = $('#' + this.tableId).next('.layui-table-view').find('.layui-table-body tbody tr');
- const $targetRow = $trs.eq(index);
- const upstreamGroup = $targetRow.attr('upstream_group');
- const $matchingRows = $trs.filter(function() {
- return $(this).attr('upstream_group') === upstreamGroup;
- });
- let copyStr = '';
- const that = this;
- $matchingRows.each(function() {
- const $td = $(this).find('td[data-field="transfer"]');
- const paymentAmount = $td.find('div').text().trim();
- if (!isNumeric(paymentAmount) || formatDecimals(paymentAmount) === '0') {
- return;
- }
- const currIndex = $(this).index();
- const channelData = that.getChannelData();
- const channelItem = channelData[currIndex] || {};
- if (!isObjectEmpty(channelItem)) {
- copyStr += `加款账号:${channelItem.name} (${channelItem.store_name})\n`;
- copyStr += '加款金额:' + formatDecimals(paymentAmount, 4) +'元' + '\n';
- }
- });
- if (copyStr === '') {
- showErr('请设置加款项后再复制');
- return;
- }
- let oInput = document.createElement("textarea");
- oInput.style.border = "0 none";
- oInput.style.color = "transparent";
- oInput.value = copyStr;
- document.body.appendChild(oInput);
- oInput.select();
- document.execCommand("Copy");
- oInput.parentNode.removeChild(oInput)
- showSuccess('拷贝成功');
- };
- columnSum(field) {
- const $table = $('#' + this.tableId).next('.layui-table-view');
- const $tr = $table.find('.layui-table-body tbody tr');
- let sum = 0;
- $tr.each(function (index, element) {
- const $td = $(element).find('td[data-field="' + field + '"]').not('.layui-hide').find('.layui-table-cell');
- if ($td.length > 0) {
- const paymentDesign = $td.text().trim();
- if (isNumeric(paymentDesign)) {
- sum += parseFloat(paymentDesign);
- }
- }
- });
- const $cell = $table.find('#table_sum_' + field + '_' + this.type);
- if (sum < 0) {
- $cell.css('color', 'red');
- } else {
- $cell.css('color', '');
- }
- $cell.html(formatDecimals(sum));
- }
- calcGroupDeviation(firstCloumn, secondCloumn, resultCloumn, special) {
- let groupFirstSum = {};
- let groupSecondSum = {};
- const $trs = $('#' + this.tableId).next('.layui-table-view').find('.layui-table-body tbody tr');
- $trs.each(function (index, element) {
- const firstVal = $(element).find('td[data-field="' + firstCloumn + '"]').find('.layui-table-cell').text().trim();
- const tdGroup = $(element).attr('upstream_group');
- if (!tdGroup) {
- return;
- }
- if (!groupFirstSum[tdGroup]) {
- groupFirstSum[tdGroup] = 0;
- }
- if (isNumeric(firstVal)) {
- groupFirstSum[tdGroup] += parseFloat(firstVal);
- }
- const $td = $(element).find('td[data-field="' + secondCloumn + '"]').not('.layui-hide').find('.layui-table-cell');
- if ($td.length > 0) {
- if (!groupSecondSum[tdGroup]) {
- const secondVal = $td.text().trim();
- if (isNumeric(secondVal)) {
- groupSecondSum[tdGroup] = parseFloat(secondVal);
- }
- }
- }
- });
- $trs.each(function (index, element) {
- const $td = $(element).find('td[data-field="' + resultCloumn + '"]').not('.layui-hide').find('.layui-table-cell');
- const tdGroup = $(element).attr('upstream_group');
- if (!tdGroup) {
- return;
- }
- if ($td.length > 0) {
- const val = groupFirstSum[tdGroup] - groupSecondSum[tdGroup];
- if(isNumeric(val) && special === 1 && val < 0) {
- $td.html(formatDecimals(val));
- } else if(isNumeric(val) && special === 2) {
- $td.html(formatDecimals(val));
- } else {
- $td.html('0');
- }
- }
- });
- }
- upstreamStatus () { //设计打款为0时,不显示分组名称
- const $trs = $('#' + this.tableId).next('.layui-table-view').find('.layui-table-body tbody tr');
- $trs.each(function(i, tr) {
- const paymentDesignDiv = $(tr).find('td[data-field="payment_design"]').not('.layui-hide');
- if (paymentDesignDiv.length > 0) {
- const upstreamGroup = $(tr).attr('upstream_group');
- const paymentDesign = paymentDesignDiv.text().trim();
- if (!isNumeric(paymentDesign) || Number(paymentDesign) === 0) {
- $(tr).find('td[data-field="upstream_group"]').find('div').html('');
- } else {
- $(tr).find('td[data-field="upstream_group"]').find('div').html(upstreamGroup);
- }
- }
- });
- }
- }
- class MchTable extends LayuiTableBase{
- getCopySortMch() {
- const copyData = globalData.getCopyData();
- if (copyData.length === 0) {
- return [];
- }
- return copyData.stats_merchant;
- }
- getCopyDataMch() {
- const copyData = globalData.getCopyData();
- if (copyData.length === 0) {
- return [];
- }
- return copyData.stats_data_mch;
- }
- setMchData(data) {
- globalData.setDataMerchant(data);
- };
- getMchData() {
- return globalData.getDataMerchant();
- };
- async loadData() {
- const copyData = globalData.getCopyData();
- const mchCust = globalData.getMerchant();
- const mchIds = mchCust
- .filter(item => item.tag === systemTag)
- .map(item => item.mch_id)
- .join(',');
- const params = { mch_ids: mchIds };
- const mchFetch = await statsApi.getMchData(params);
- let mchData = [];
- if (mchFetch.state === true) {
- mchData = mchFetch.list;
- }
- mchData.forEach(function(item) {
- item.debt *= -1;
- });
- if (!isObjectEmpty(copyData)) {
- const copyDataMch = this.getCopyDataMch();
- copyDataMch.forEach(item => {
- const selfItem = mchData.find(dn => {
- return dn.mch_id === item.mch_id && dn.tag === item.tag;
- });
- if (selfItem !== undefined) {
- item.available_predeposit = selfItem.available_predeposit;
- item.debt = selfItem.debt;
- }
- });
- mchData = mergeData(mchData, copyDataMch, 'mch_name', systemTag);
- }
- const tableData = [];
- mchData.forEach(item => {
- let remark = '';
- const setting = mchCust.find(function(mch) {
- return mch.name === item.name && mch.tag === item.tag;
- });
- if (setting) {
- remark = setting.remark ?? '';
- }
- let tableItem = {
- tag: item.tag,
- mch_id: item.mch_id,
- mch_name: item.mch_name,
- name: item.name,
- available_predeposit: item.available_predeposit,
- debt: item.debt,
- remark: remark
- };
- tableData.push(tableItem);
- });
- const groupNames = globalData.getMchNames();
- tableData.forEach(item => {
- let matched = false;
- groupNames.forEach(name => {
- if (item.mch_name.startsWith(name)) {
- item.mch_group = name;
- matched = true;
- }
- });
- if (!matched) {
- item.mch_group = item.mch_name;
- }
- });
- let sortMch = [];
- if (!isObjectEmpty(copyData)) {
- sortMch = mergeData(mchCust, copyData.stats_merchant, 'mch_name', systemTag);
- } else {
- sortMch = mchCust;
- }
- globalData.setMerchant(sortMch);
- let mchDataSort = sortCustData(sortMch, tableData, 'mch_group', 'mch_name');
- mchDataSort = sortByName(mchDataSort, 'mch_name');
- mchDataSort.forEach(function (item) {//debt<0,设置为实际欠款,debt>0,设置为实际存款
- if (parseFloat(item.debt) > 0) {
- item.c_deposit = item.debt;
- item.c_debt = 0;
- } else {
- item.c_deposit = 0;
- item.c_debt = item.debt;
- }
- });
- const groupSum = {};
- for (let item of mchDataSort) {
- if (!groupSum[item.mch_group]) {
- groupSum[item.mch_group] = {debt_sum: 0, deposit_sum: 0};
- }
- groupSum[item.mch_group].debt_sum += parseFloat(item.c_debt);
- groupSum[item.mch_group].deposit_sum += parseFloat(item.c_deposit);
- }
- for (let item of mchDataSort) {
- item.c_debt = formatDecimals(item.c_debt);
- item.c_deposit = formatDecimals(item.c_deposit);
- item.c_debt_sum = formatDecimals(groupSum[item.mch_group].debt_sum);
- item.c_deposit_sum = formatDecimals(groupSum[item.mch_group].deposit_sum);
- item.available_predeposit = formatDecimals(item.available_predeposit);
- const total = parseFloat(item.c_debt_sum) + parseFloat(item.c_deposit_sum);
- if (Number(total) < 0) {
- item.c_debt_sum = formatDecimals(total);
- item.c_deposit_sum = '0';
- } else {
- item.c_debt_sum = '0';
- item.c_deposit_sum = formatDecimals(total);
- }
- }
- this.setMchData(mchDataSort);
- }
- async updateMchCache(itemData, action) {//action=edit/del
- const mchCust = globalData.getMerchant();
- const updateFlag = itemData.name + '-' + itemData.tag;
- if (action === 'edit') {
- mchCust.forEach(item => {
- const itemFlag = item.name + '-' + item.tag;
- if (itemFlag === updateFlag) {
- item.remark = itemData.remark;
- }
- });
- } else if (action ==='del') {
- let mchTmp = [];
- mchCust.forEach(item => {
- const itemFlag = item.name + '-' + item.tag;
- if (itemFlag !== updateFlag) {
- mchTmp.push(item);
- }
- });
- globalData.setMerchant(mchTmp);
- }
- await this.syncMchData();
- }
- async syncMchData() {
- const mchCust = globalData.getMerchant();
- await statsApi.setStatsSettings('merchant', mchCust)
- .then(function (data) {
- if (data.state !== true) {
- layer.msg('缓存失败', {
- icon: 1,
- time: 2000
- });
- }
- })
- .catch(function (error) {
- layer.msg('缓存失败', {
- icon: 1,
- time: 2000
- });
- });
- }
- async renderTable() {
- const that = this;
- await this.loadData();
- const tableData = this.getMchData();
- layui.table.render({
- elem: '#' + this.tableId,
- data: tableData,
- limit: tableData.length,
- cols: [[
- {field: 'mch_group', title: '机构', width: 100, rowspan: true},
- {field: 'mch_id', title: '机构ID', width: 100},
- {field: 'mch_name', title: '机构名称', width: 200},
- {field: 'available_predeposit', title: '所剩余额', width: 150},
- {field: 'c_deposit', title: '实际存款', width: 150},
- {field: 'c_deposit_sum', title: '存款合计', width: 150},
- {field: 'c_debt', title: '实际欠款', width: 150},
- {field: 'c_debt_sum', title: '欠款合计', width: 150},
- {field: 'remark', title: '备注', width: 150},
- {
- field: 'edit', title: '编辑', width: 100, templet: function (d) {
- return '<button class="layui-btn layui-btn-sm edit-btn" data-index="' + d.LAY_TABLE_INDEX + '">编辑</button>';
- }
- },
- {
- field: 'delete', title: '删除', width: 100, templet: function (d) {
- return '<button class="layui-btn layui-btn-sm delete-btn" data-index="' + d.LAY_TABLE_INDEX + '">删除</button>';
- }
- }
- ]],
- done: function (res, curr, count) {
- that.mergeCells();
- const tableItem = $('#' + that.tableId);
- const $tr = tableItem.next('.layui-table-view').find('.layui-table-body tbody tr');
- $tr.each((index, element) => {
- $(element).find('td').eq(5).addClass('col-bg');
- $(element).find('td').eq(7).addClass('col-bg');
- });
- tableItem.next('.layui-table-view').off('click', '.edit-btn').on('click', '.edit-btn', function () {
- const index = $(this).data('index');
- that.editRow(index, this);
- });
- tableItem.next('.layui-table-view').off('click', '.delete-btn').on('click', '.delete-btn', function () {
- const index = $(this).data('index');
- that.deleteRow(index);
- });
- tableItem.next('.layui-table-view').find('.layui-table-body tbody').append(
- '<tr><td>合计</td><td></td><td></td><td><span id="mch_table_sum_available_predeposit">0</span></td><td><span id="mch_table_sum_c_deposit">0</span></td><td><span id="mch_table_sum_c_deposit_sum">0</span></td><td><span id="mch_table_sum_c_debt">0</span></td><td><span id="mch_table_sum_c_debt_sum">0</span></td><td></td><td></td><td></td></tr>'
- );
- that.columnSum('available_predeposit');
- that.columnSum('c_deposit');
- that.columnSum('c_debt');
- that.columnSum('c_deposit_sum');
- that.columnSum('c_debt_sum');
- that.setValueClass(['available_predeposit', 'c_deposit', 'c_deposit_sum', 'c_debt', 'c_debt_sum']);
- }
- });
- };
- mergeCells() {
- const $tbRoot = $('#' + this.tableId);
- const $trs = $tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
- const mchGroupMap = {};
- $trs.each(function (i, tr) {
- const $td = $(tr).find('td[data-field="mch_group"]');
- const group = $td.text().trim();
- if (group) {
- if (!mchGroupMap[group]) {
- mchGroupMap[group] = { count: 0, startIndex: i };
- }
- mchGroupMap[group].count++;
- }
- });
- for (let group in mchGroupMap) {
- const info = mchGroupMap[group];
- if (info.count > 1) {
- const fields = ['mch_group', 'c_debt_sum', 'c_deposit_sum'];
- for (let field of fields) {
- $trs.eq(info.startIndex).find('td[data-field="' + field + '"]').attr('rowspan', info.count);
- for (let j = 1; j < info.count; j++) {
- $trs.eq(info.startIndex + j).find('td[data-field="' + field + '"]').addClass('layui-hide');
- }
- }
- }
- }
- };
- async editRow(index, button) {
- const $tr = $('#' + this.tableId).next('.layui-table-view').find('.layui-table-body tbody tr[data-index="' + index + '"]');
- const isEditing = $(button).text() === '保存';
- if (isEditing) {
- $(button).text('编辑');
- const remark = $tr.find('td[data-field="remark"]').find('div').text();
- const mchId = $tr.find('td[data-field="mch_id"]').find('div').text();
- const mchName = $tr.find('td[data-field="mch_name"]').find('div').text();
- const mchData = this.getMchData();
- const currItem = mchData.find(function (item) {
- return item.mch_id === mchId && item.mch_name === mchName;
- });
- currItem.remark = remark;
- await this.updateMchCache(currItem, 'edit');
- await mchTable.renderTable(mchData);
- } else {
- $(button).text('保存');
- const $remarkDiv = $tr.find('td[data-field="remark"]').find('div');
- $remarkDiv.attr('contenteditable', true).css('background-color', 'lightblue').focus();
- }
- };
- deleteRow(index) {
- let that = this;
- const mchData = this.getMchData();
- const $tr = $('#' + this.tableId).next('.layui-table-view').find('.layui-table-body tbody tr[data-index="' + index + '"]');
- const mchId = $tr.find('td[data-field="mch_id"]').find('div').text();
- const mchName = $tr.find('td[data-field="mch_name"]').find('div').text();
- const delItem = mchData.find(function (item) {
- return item.mch_id === mchId && item.mch_name === mchName;
- });
- const mchDataNew = mchData.filter(item => !(item.mch_id === delItem.mch_id && item.mch_name === delItem.mch_name));
- this.setMchData(mchDataNew);
- layer.confirm('确定要删除 ' + delItem.mch_name + ' 吗?', { icon: 3, title: '删除确认' }, async function (confirmIndex) {
- await that.updateMchCache(delItem, 'del');
- //删除导入数据中的项
- const copyData = globalData.getCopyData();
- if (!isObjectEmpty(copyData)) {
- copyData.stats_merchant = copyData.stats_merchant.filter(item => item.tag !== delItem.tag || item.name !== delItem.name );
- copyData.stats_data_mch = copyData.stats_data_mch.filter(item => item.tag !== delItem.tag || item.name !== delItem.name );
- }
- await mchTable.renderTable(that.getMchData());
- layer.close(confirmIndex);
- });
- };
- columnSum(field) {
- let sum = 0;
- const $table = $('#' + this.tableId).next('.layui-table-view');
- const $tr = $table.find('.layui-table-body tbody tr');
- $tr.each(function (index, element) {
- const $td = $(element).find('td[data-field="' + field + '"]').not('.layui-hide').find('.layui-table-cell');
- if ($td.length > 0) {
- const paymentDesign = $td.text().trim();
- if (isNumeric(paymentDesign)) {
- sum += parseFloat(paymentDesign);
- }
- }
- });
- const $cell = $table.find('#mch_table_sum_' + field);
- if (sum < 0) {
- $cell.css('color', 'red');
- } else {
- $cell.css('color', '');
- }
- $cell.html(formatDecimals(sum));
- }
- }
- class BatchWorkflow extends TaskManager {
- constructor(prefix) {
- super();
- this.initializeGlobalTaskList();
- this.prefix = prefix; //normal/fast
- }
- getTaskType() {
- return 'batch_payment_' + this.prefix;
- }
- getPendingTasksByApprover() {
- const tasks = super.getPendingTasks();
- return tasks.filter(task => task.approver === 'admin');
- }
- getPendingTaskDetails() {
- const worklist = this.getPendingTasksByApprover();
- return worklist.reduce((acc, obj) => {
- const formattedTime = formatDateTime(obj.time);
- const itemsWithTime = obj.data.items.map(item => ({
- ...item,
- time: formattedTime
- }));
- return acc.concat(itemsWithTime);
- }, []);
- }
- async invalidateItem(storeId, tag) {
- const tasks = this.getPendingTasksByApprover();
- for (const task of tasks) {
- const updatedItems = task.data.items.filter(item =>
- !(item.store_id === storeId && item.tag === tag)
- );
- if (updatedItems.length !== task.data.items.length) {
- const newData = { ...task.data, items: updatedItems };
- const updateSuccess = await this.updateTask(
- task.id,
- updatedItems.length > 0 ? newData : {}
- );
- if (!updateSuccess) {
- console.error(`Failed to update task ${task.id} after removing item ${storeId}, ${tag}`);
- return false;
- }
- }
- }
- return true;
- }
- }
- class BatchDeposit {
- constructor(type) {
- if (type === 'normal') {
- this.workflow = new BatchWorkflow('normal');
- } else if (type === 'fast') {
- this.workflow = new BatchWorkflow('fast');
- }
- this.type = type;
- this.dv = 1; //数据版本,作用:由于需求变化导致存储的缓存数据格式发生变化,由该字段标记,审核的时候如果数据版本与当前dv版本不一致,需要手动作废审核重新操作。
- }
- doApplyOne(tableId, channelData, index) {
- const $trs = $('#' + tableId).next('.layui-table-view').find('.layui-table-body tbody tr');
- const $targetRow = $trs.eq(index);
- const upstreamGroup = $targetRow.attr('upstream_group');
- const $matchingRows = $trs.filter(function(i, tr) {
- return $(tr).attr('upstream_group') === upstreamGroup;
- });
- this.doApply($matchingRows, channelData);
- }
- doApplyMore(tableId, channelData) {
- const $trs = $('#' + tableId).next('.layui-table-view').find('.layui-table-body tbody tr').slice(0, -1);
- this.doApply($trs, channelData);
- }
- async doApply($matchingRows, channelData) {
- const that = this;
- let payUnit = [];
- let errsNormal = [], errsPlatform = [];
- $matchingRows.each(function (i) {
- const $td = $(this).find('td[data-field="transfer"]');
- const paymentAmount = $td.find('div').text().trim();
- const currIndex = $(this).index();
- const channelItem = channelData[currIndex] || {};
- if (isObjectEmpty(channelItem)) {
- errsNormal.push(`第${currIndex + 1}行 数据异常`);
- return;
- }
- if (!isNumeric(paymentAmount)) {
- errsNormal.push(`${channelItem.store_name} 金额设置错误`);
- return;
- }
- if (paymentAmount === '0') {
- return;
- }
- if (Number(paymentAmount) < 0) {
- errsNormal.push(`${channelItem.store_name} 加款金额不能小于0`);
- return;
- }
- if (channelItem.tag !== systemTag) {
- errsPlatform.push(channelItem.store_name);
- return;
- }
- if (channelItem.tag === systemTag) {
- payUnit.push({
- store_id: channelItem.store_id,
- store_name: channelItem.store_name,
- tag: channelItem.tag,
- amount: paymentAmount,
- upstream_group: channelItem.upstream_group,
- pay_operation: channelItem.pay_operation,
- remark: ''
- });
- }
- });
- if (errsNormal.length === 0 && payUnit.length === 0) {
- let platformName = '';
- if (systemTag === 'YEZI') {
- platformName = '椰子';
- } else if (systemTag === 'YELIN') {
- platformName = '椰林';
- }
- showErr(`这是 ${platformName} 平台,需要设计加款金额,目前是0!`);
- return ;
- }
- await this.workflow.initializeGlobalTaskList();
- const pendingTasks = this.workflow.getPendingTasksByApprover();
- pendingTasks.forEach(taskItem => {
- const currItems = taskItem.data.items || [];
- currItems.forEach(currItem => {
- const isPending = payUnit.find(payItem => {
- return currItem.store_id === payItem.store_id && currItem.tag === payItem.tag;
- });
- if (isPending !== undefined) {
- const err = `${currItem.store_name} 存在处理中的加款申请,审核后才能再次加款`;
- if (!errsNormal.includes(err)) {
- errsNormal.push(err);
- }
- }
- });
- });
- if (errsNormal.length > 0) {
- showErr(errsNormal.join('<br />'));
- return;
- }
- const applyTrnasfer = () => {
- const groupPayUnit = {};
- let paySum = 0;
- const sortedPayUnit = sortByName(payUnit, 'store_name');
- sortedPayUnit.forEach(item => {
- if (!groupPayUnit[item.upstream_group]) {
- groupPayUnit[item.upstream_group] = 0;
- }
- groupPayUnit[item.upstream_group] += parseFloat(item.amount);
- paySum += parseFloat(item.amount);
- });
- sortedPayUnit.forEach(item => {
- item.total = groupPayUnit[item.upstream_group] || 0;
- item.total = formatDecimals(item.total);
- });
- layui.table.render({
- elem: '#upstream_tb_transfer',
- data: sortedPayUnit,
- limit: sortedPayUnit.length,
- cols: [[
- {field: 'store_name', title: '加款项', width: 200},
- {field: 'amount', title: '金额', width: 100},
- {field: 'total', title: '合计', width: 100},
- {field: 'pay_operation', title: '操作人姓名', width: 200},
- {field: 'remark', title: '备注', width: 200},
- ]],
- done: function (res, curr, count) {
- const $tbRoot = $('#upstream_tb_transfer');
- const $trs = $tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
- const setAttr = () => {
- $trs.each(function (i, tr) {
- const upstreamGroup = sortedPayUnit[i].upstream_group;
- $(tr).attr('upstream_group', upstreamGroup);
- });
- };
- const mergeTotal = () => {
- const upstreamMap = {};
- $trs.each(function (i, tr) {
- const group = $(tr).attr('upstream_group');
- if (group) {
- if (!upstreamMap[group]) {
- upstreamMap[group] = {count: 0, startIndex: i};
- }
- upstreamMap[group].count++;
- }
- });
- for (let group in upstreamMap) {
- const info = upstreamMap[group];
- $trs.eq(info.startIndex).find('td[data-field="total"]').
- attr('rowspan', info.count);
- $trs.eq(info.startIndex).find('td[data-field="pay_operation"]').
- attr('rowspan', info.count).
- attr('contenteditable', true).
- css('background-color', 'lightblue');
- $trs.eq(info.startIndex).find('td[data-field="remark"]').
- attr('rowspan', info.count).
- attr('contenteditable', true).
- css('background-color', 'lightblue');
- for (let j = 1; j < info.count; j++) {
- $trs.eq(info.startIndex + j).find('td[data-field="total"]').addClass('layui-hide');
- $trs.eq(info.startIndex + j).find('td[data-field="pay_operation"]').addClass('layui-hide');
- $trs.eq(info.startIndex + j).find('td[data-field="remark"]').addClass('layui-hide');
- }
- }
- };
- setAttr();
- mergeTotal();
- }
- });
- layer.open({
- type: 1,
- title: '加款确认',
- area: ['900px', '500px'],
- content: $('#rechargeManual'),
- btn: ['确定加款', '取消'],
- success: function (layero) {
- let $btns = layero.find('.layui-layer-btn');
- $btns.css({
- 'display': 'flex',
- 'justify-content': 'center',
- 'align-items': 'center'
- });
- $btns.prepend(`<div class="total-label" style="margin-right:auto;">合计:${formatDecimals(paySum)}</div>`);
- $btns.children('a').css({
- 'margin-left': '10px',
- 'margin-right': '10px'
- });
- },
- btn2: function () {
- let groupInput = {};
- const $trs = $('#upstream_tb_transfer').next('.layui-table-view').find('.layui-table-body tbody tr');
- $trs.each(function(i, tr) {
- const td_pay_operation = $(tr).find('td[data-field="pay_operation"]').not('.layui-hide');
- const td_remark = $(tr).find('td[data-field="remark"]').not('.layui-hide');
- if (td_pay_operation.length > 0 && td_remark.length > 0) {
- const currGroup = $(tr).attr('upstream_group');
- if (!groupInput[currGroup]) {
- groupInput[currGroup] = {
- pay_operation: td_pay_operation.text().trim(),
- remark: td_remark.text().trim()
- };
- }
- }
- });
- for (let i = 0; i < payUnit.length; i++) {
- const group = payUnit[i].upstream_group;
- const unit_pay_operation = groupInput[group].pay_operation ?? '';
- if (unit_pay_operation === '') {
- showErr(`${ group } 未设置操作人`);
- return false;
- }
- const unit_remark = groupInput[group].remark ?? '';
- payUnit[i].pay_operation = unit_pay_operation;
- payUnit[i].remark = unit_remark;
- }
- layer.closeAll();
- //由于渲染表格过程中payUnit产生了多余的字段,进行过滤
- const taskData = filterJsonFields(payUnit, ["amount", "pay_operation", "remark", "store_id", "store_name", "tag", "upstream_group"]);
- const applyData = {
- items: taskData,
- dv: that.dv
- };
- that.workflow.addTask(applyData, systemUserName, 'admin')
- .then(succ => {
- if (succ === true) {
- showSuccess('已发起加款申请,等待管理员审核后执行加款');
- } else {
- showErr('处理失败,请重试');
- }
- });
- },
- });
- };
- if (errsPlatform.length > 0) {
- layer.confirm(errsPlatform.join(',') + ' 非本平台通道,忽略加款,请到复制数据后到对应平台执行加款操作', {
- title: '提示',
- btn: ['确定', '取消']
- }, function (index) {
- applyTrnasfer();
- layer.close(index);
- });
- } else {
- applyTrnasfer();
- }
- }
- async doBatchDeposit() {
- const that = this;
- let sortedPayUnit = [], worklist = [], payUnit = [], paySum = 0, isCorrectVersion = true;
- const loadPayUnit = async () => {
- await this.workflow.initializeGlobalTaskList();
- const groupPayUnit = {};
- paySum = 0;
- worklist = this.workflow.getPendingTasksByApprover();
- for (const task of worklist) {
- if (Number(task.data.dv) !== that.dv) {
- isCorrectVersion = false;
- break;
- }
- }
- payUnit = this.workflow.getPendingTaskDetails();
- sortedPayUnit = sortByName(payUnit, 'store_name');
- sortedPayUnit.forEach(item => {
- if (!groupPayUnit[item.upstream_group]) {
- groupPayUnit[item.upstream_group] = 0;
- }
- groupPayUnit[item.upstream_group] += parseFloat(item.amount);
- paySum += parseFloat(item.amount);
- });
- sortedPayUnit.forEach(item => {
- item.total = groupPayUnit[item.upstream_group] || 0;
- item.total = formatDecimals(item.total);
- });
- };
- await loadPayUnit();
- if (isCorrectVersion === false) {
- setTimeout(function() {
- showErr('数据与当前程序版本不匹配,请作废当前数据后重新加款');
- }, 500);
- }
- const approveWork = async (payUnitArr) => {
- await this.workflow.initializeGlobalTaskList();
- worklist = this.workflow.getPendingTasksByApprover();
- if (worklist.length === 0) {
- showErr('没有待审核的加款申请');
- return false;
- }
- if (isCorrectVersion === false) {
- showErr('数据与当前程序版本不匹配,请作废当前数据后重新加款');
- return false;
- }
- layer.closeAll();
- const errItem = payUnitArr.find(item => {
- return item.tag !== systemTag;
- });
- if (errItem !== undefined) {
- showErr(errItem.store_name + '数据存在异常,请作废后重新申请');
- return false;
- }
- const updateProgress = (progress, description) => {
- const progressBar = document.getElementById('progress-bar');
- const progressDescription = document.getElementById('progressDescription');
- progressBar.style.width = progress + '%';
- progressBar.textContent = progress + '%';
- progressDescription.textContent = description;
- }
- updateProgress('0', '正在执行加款,不要刷新或关闭页面');
- $('#processBar').show();
- setTimeout(async function () {
- const storeIds = payUnit.map(item => item.store_id).join(',');
- const providersData = await statsApi.getProvidersByStore({store_ids: storeIds});
- if (providersData.state !== true || providersData.list.length === 0) {
- showErr('获取通道信息异常');
- return;
- }
- const providers = providersData.list;
- let errs = [];
- const processNum = payUnitArr.length;
- let processedCount = 0;
- const payHandler = async (item) => {
- const providerInfo = providers.find(p => item.store_id === p.store_id);
- if (!providerInfo) {
- errs.push(item.store_name + ' 加款 ' + item.amount + ' 执行失败(数据错误)');
- processedCount += 1;
- const progress = (processedCount / processNum) * 100;
- updateProgress(progress.toFixed(2), item.store_name + '处理失败');
- return false;
- }
- const params = {
- form_submit: 'ok',
- operation: item.pay_operation,
- operatetype: 'add',
- pointsnum: item.amount,
- bz: item.remark
- };
- const result = await statsApi.rechargeManual(providerInfo.provider_id, params);
- processedCount += 1;
- const progress = (processedCount / processNum) * 100;
- updateProgress(progress.toFixed(2), item.store_name + '处理完成');
- return result.msg === '操作成功';
- };
- let rmTask = false;
- const retryItems = [];
- for (const payItem of payUnitArr) {
- if (payItem.tag !== systemTag) {
- continue;
- }
- for (let taskItem of worklist) {
- const itemIndex = taskItem.data.items.findIndex(item => item.store_id === payItem.store_id && item.tag === payItem.tag);
- if (itemIndex !== -1) {
- let currTaskData = deepCloneData(taskItem.data);
- currTaskData.items.splice(itemIndex, 1);
- if (currTaskData.items.length === 0) {
- currTaskData = {};
- }
- const tasked = await that.workflow.updateTask(taskItem.id, currTaskData);
- if (tasked === true) {
- const succ = await payHandler(payItem);
- if (succ === false) {
- retryItems.push(payItem);
- }
- }
- rmTask = true;
- }
- }
- }
- if (retryItems.length > 0) {
- const taskData = filterJsonFields(retryItems, ["amount", "pay_operation", "remark", "store_id", "store_name", "tag", "upstream_group"]);
- const applyData = {
- items: taskData,
- dv: that.dv
- };
- const succ = await that.workflow.addTask(applyData, systemUserName, 'admin');
- const resultTips = succ === true ? '已重新加入审批列表' : '重新加入审批列表失败';
- retryItems.forEach(retryItem => {
- errs.push(retryItem.store_name + '执行加款失败,' + resultTips);
- });
- }
- setTimeout(() => {
- $('#processBar').hide();
- if (that.type === 'normal') {
- channelTableNormal.renderTable();
- } else {
- channelTableFast.renderTable();
- }
- loadMsgBadge();
- }, 1000);
- if (errs.length > 0) {
- showErr(errs.join('<br/>'));
- }
- }, 1000);
- };
- layui.table.render({
- elem: '#upstream_tb_approve',
- data: sortedPayUnit,
- limit: sortedPayUnit.length,
- cols: [[
- {field: 'store_name', title: '加款通道', width: 200},
- {field: 'amount', title: '加款金额', width: 150},
- {field: 'time', title: '申请时间', width: 250},
- {field: 'total', title: '合计', width: 150},
- {field: 'pay_operation', title: '操作人姓名', width: 150},
- {field: 'remark', title: '备注', width: 150},
- {field: 'void_task', title: '', width: 150, templet: function(d){
- return '<button class="layui-btn layui-btn-sm layui-bg-blue task-approve-btn" data-index="'+d.LAY_TABLE_INDEX+'">批准</button>' +
- '<button class="layui-btn layui-btn-sm layui-btn-primary task-void-btn" data-index="'+d.LAY_TABLE_INDEX+'">作废</button>';
- }}
- ]],
- done: function (res, curr, count) {
- const $tbRoot = $('#upstream_tb_approve');
- const $trs = $tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
- const setAttr = () => {
- $trs.each(function (i, tr) {
- $(tr).attr('upstream_group', sortedPayUnit[i].upstream_group);
- $(tr).attr('store_id', sortedPayUnit[i].store_id);
- $(tr).attr('tag', sortedPayUnit[i].tag);
- });
- };
- const mergeTotal = () => {
- const upstreamMap = {};
- $trs.each(function (i, tr) {
- const group = $(tr).attr('upstream_group');
- if (group) {
- if (!upstreamMap[group]) {
- upstreamMap[group] = {count: 0, startIndex: i};
- }
- upstreamMap[group].count++;
- }
- });
- for (let group in upstreamMap) {
- const info = upstreamMap[group];
- if (info.count > 1) {
- $trs.eq(info.startIndex).find('td[data-field="total"]').attr('rowspan', info.count);
- for (let j = 1; j < info.count; j++) {
- $trs.eq(info.startIndex + j).find('td[data-field="total"]').addClass('layui-hide');
- }
- }
- }
- };
- const approveOneEvent = () => {
- $tbRoot.next('.layui-table-view').off('click', '.task-approve-btn').on('click', '.task-approve-btn', async function () {
- const index = $(this).data('index');
- const $trs = $('#upstream_tb_approve').next('.layui-table-view').find('.layui-table-body tbody tr');
- const $targetRow = $trs.eq(index);
- const store_id = $targetRow.attr('store_id');
- const tag = $targetRow.attr('tag');
- const loadIndex = layer.load(2, {shade: [0.2, '#000']});
- await that.workflow.initializeGlobalTaskList();
- payUnit = that.workflow.getPendingTaskDetails();
- const payUnitItem = payUnit.find(item => item.store_id === store_id && item.tag === tag);
- if(payUnitItem === undefined) {
- showErr('处理失败');
- return;
- }
- await approveWork([payUnitItem]);
- });
- };
- const voidOneEvent = () => {
- $tbRoot.next('.layui-table-view').off('click', '.task-void-btn').on('click', '.task-void-btn', function () {
- const index = $(this).data('index');
- layer.confirm(`确认作废 ${sortedPayUnit[index].store_name} 的加款申请吗?`, {
- title: '提示',
- btn: ['确定', '取消']
- }, async (confirmIndex) => {
- const $trs = $('#upstream_tb_approve').next('.layui-table-view').find('.layui-table-body tbody tr');
- const $targetRow = $trs.eq(index);
- const storeId = $targetRow.attr('store_id');
- const tag = $targetRow.attr('tag');
- const loadIndex = layer.load(2, {shade: [0.2, '#000']});
- await that.workflow.initializeGlobalTaskList();
- const succ = await that.workflow.invalidateItem(storeId, tag);
- if (succ === true) {
- await loadPayUnit();
- layui.table.reload('upstream_tb_approve', {
- data: sortedPayUnit
- });
- $('#modelPaySum').html('合计:' + formatDecimals(paySum));
- } else {
- showErr('作废失败');
- }
- layer.close(loadIndex);
- layer.close(confirmIndex);
- });
- });
- };
- const textEvent = () => {
- const editTextColumns = ['remark'];
- $trs.each(function(i, tr) {
- for(let col of editTextColumns) {
- const $td = $(tr).find('td[data-field="' + col + '"]').not('.layui-hide').find('div');
- let val = $td.text().trim();
- $td.html(val);
- $td.attr('contenteditable', true).css('background-color', 'lightblue');
- $td.off('input')
- .off('keypress')
- .off('blur')
- .on('input')
- .on('keypress', function(e) {
- if (e.keyCode === 13) {
- e.preventDefault();
- $(this).blur();
- }
- })
- .on('blur', async function () {
- const loadIndex = layer.load(2, {shade: [0.2, '#000']});
- const index = $(this).parent().parent().data('index');
- await saveEdit(index);
- layer.close(loadIndex);
- });
- }
- });
- };
- const saveEdit = async (index) => {
- const $tr = $('#upstream_tb_approve').next('.layui-table-view').find('.layui-table-body tbody tr[data-index="' + index + '"]');
- const remark = $tr.find('td[data-field="remark"]').find('div').text().trim();
- const store_id = $tr.attr('store_id');
- const tag = $tr.attr('tag');
- for (const item of worklist) {
- item.data.items.forEach(payment => {
- if (payment.store_id === store_id && payment.tag === tag) {
- payment.remark = remark;
- }
- });
- await that.workflow.updateTask(item.id, item.data);
- }
- worklist = that.workflow.getPendingTasksByApprover();
- payUnit = that.workflow.getPendingTaskDetails();
- };
- setAttr();
- mergeTotal();
- approveOneEvent();
- voidOneEvent();
- textEvent();
- }
- });
- layer.open({
- type: 1,
- title: '加款审核',
- area: ['1290px', '500px'],
- content: $('#rechargeManualApprove'),
- btn: ['批准', '作废'],
- success: function (layero) {
- let $btns = layero.find('.layui-layer-btn');
- $btns.css({
- 'display': 'flex',
- 'justify-content': 'center',
- 'align-items': 'center'
- });
- $btns.prepend(`<div class="total-label" style="margin-right:auto;" id="modelPaySum">合计:${formatDecimals(paySum)}</div>`);
- $btns.children('a').css({
- 'margin-left': '10px',
- 'margin-right': '10px'
- });
- },
- btn2: async function () {
- layer.load(2, {shade: [0.2, '#000']});
- await that.workflow.initializeGlobalTaskList();
- payUnit = that.workflow.getPendingTaskDetails();
- await approveWork(payUnit);
- },
- btn3: function () {
- if (worklist.length === 0) {
- showErr('没有可作废的加款申请');
- return;
- }
- layer.confirm(`确认批量作废加款申请吗?`, {
- title: '提示',
- btn: ['确定', '取消']
- }, async () => {
- layer.load(2, {shade: [0.2, '#000']});
- for (const task of worklist) {
- await that.workflow.executeTask(task.id, async () => {});
- }
- layer.closeAll();
- showSuccess('加款申请已作废');
- });
- return false;
- }
- });
- }
- }
- const globalData = new GlobalData().proxy;
- globalData.setCopyData({});
- const mchTable = new MchTable('downstream_tb');
- const batchDepositNormal = new BatchDeposit('normal');
- const batchDepositFast = new BatchDeposit('fast');
- const channelTableNormal = new ChannelTable('normal', batchDepositNormal);
- const channelTableFast = new ChannelTable('fast', batchDepositFast);
- function setTableColVal(tableId, col, val) { //对整列设置值
- const setData = [];
- const $trs = $('#' + tableId).next('.layui-table-view').find('.layui-table-body tbody tr');
- $trs.each(function(i, tr) {
- const $td = $(tr).find('td[data-field="' + col + '"]');
- if ($td.length > 0) {
- $td.find('div').html(val);
- }
- const storeId = $(tr).attr('store_id');
- const tag = $(tr).attr('tag');
- setData.push({
- store_id: storeId,
- tag: tag,
- val: val
- });
- });
- return setData;
- }
- async function importData(data) {
- const namesChan1 = globalData.getChannelNames();
- const namesChan2 = data.stats_channel_names;
- const mergeNamesChan = mergeNames(namesChan1, namesChan2);
- globalData.setChannelNames(mergeNamesChan);
- const namesMch1 = globalData.getMchNames();
- const namesMch2 = data.stats_mch_names;
- const mergeNamesMch = mergeNames(namesMch1, namesMch2);
- globalData.setMchNames(mergeNamesMch);
- const statsNormal1 = globalData.getChannelNormal();
- const statsNormal2 = data.stats_channel_normal;
- const mergeStatsNormal = mergeData(statsNormal1, statsNormal2, 'store_name', systemTag);
- globalData.setChannelNormal(mergeStatsNormal);
- const statsFast1 = globalData.getChannelFast();
- const statsFast2 = data.stats_channel_fast;
- const mergeStatsFast = mergeData(statsFast1, statsFast2, 'store_name', systemTag);
- globalData.setChannelFast(mergeStatsFast);
- const statsMch1 = globalData.getMerchant();
- const statsMch2 = data.stats_merchant;
- const mergeStatsMch = mergeData(statsMch1, statsMch2, 'mch_name', systemTag);
- globalData.setMerchant(mergeStatsMch);
- if (data.stats_transfer !== undefined && data.stats_transfer.length > 0) {
- data.stats_transfer.forEach(statsItem => {
- globalData.setPayinfo(statsItem.store_id, statsItem.tag, statsItem.amount);
- });
- }
- //更新到缓存中
- await statsApi.setStatsSettings(CONSTANTS.KEY_CHANNEL_NAMES, globalData.getChannelNames());
- await statsApi.setStatsSettings(CONSTANTS.KEY_MERCHANT_NAMES, globalData.getMchNames());
- await statsApi.setStatsSettings(CONSTANTS.KEY_CHANNEL_FAST, globalData.getChannelFast());
- await statsApi.setStatsSettings(CONSTANTS.KEY_CHANNEL_NORMAL, globalData.getChannelNormal());
- await statsApi.setStatsSettings(CONSTANTS.KEY_MERCHANT, globalData.getMerchant());
- const upSelected = app.getComponent('up-name-select');
- await upSelected.loadData();
- upSelected.updateUI();
- const downSelected = app.getComponent('down-name-select');
- await downSelected.loadData();
- downSelected.updateUI();
- await channelTableNormal.renderTable();
- await channelTableFast.renderTable();
- await mchTable.renderTable();
- }
- async function initPage() {
- //配置项必须顺序同步加载
- const loadIndex = layer.load(2, { shade: [0.2, '#000'] });
- const statsSettings = await statsApi.getStatsSettings(settingsKeys);
- if (statsSettings.state === true) {
- globalData.setChannelNames(statsSettings[CONSTANTS.KEY_CHANNEL_NAMES]);
- globalData.setMchNames(statsSettings[CONSTANTS.KEY_MERCHANT_NAMES]);
- globalData.setChannelFast(statsSettings[CONSTANTS.KEY_CHANNEL_FAST]);
- globalData.setChannelNormal(statsSettings[CONSTANTS.KEY_CHANNEL_NORMAL]);
- globalData.setMerchant(statsSettings[CONSTANTS.KEY_MERCHANT]);
- } else {
- layer.close(loadIndex);
- showErr('配置缓存加载失败');
- return;
- }
- Promise.all([
- new Promise((resolve, reject) => {
- channelTableNormal.renderTable();
- resolve();
- }),
- new Promise((resolve, reject) => {
- channelTableFast.renderTable();
- resolve();
- }),
- new Promise((resolve, reject) => {
- mchTable.renderTable();
- resolve();
- })
- ])
- .catch(error => {
- console.error('数据加载失败:', error);
- });
- layer.close(loadIndex);
- }
- initPage();
- $('#btn_copy_data').on('click', function() {
- let data = {};
- data.stats_data_fast = globalData.getDataChanFast();
- data.stats_data_normal = globalData.getDataChanNormal();
- data.stats_data_mch = globalData.getDataMerchant();
- data.stats_channel_names = globalData.getChannelNames();
- data.stats_mch_names = globalData.getMchNames();
- data.stats_channel_fast = globalData.getChannelFast();
- data.stats_channel_normal = globalData.getChannelNormal();
- data.stats_merchant = globalData.getMerchant();
- data.stats_transfer = globalData.getPayinfo();
- const jsonString = JSON.stringify(data, null, 2);
- const textarea = document.createElement('textarea');
- textarea.value = jsonString;
- document.body.appendChild(textarea);
- textarea.select();
- document.execCommand('copy');
- document.body.removeChild(textarea);
- layer.msg('数据已经复制', {
- icon: 1,
- time: 2000
- });
- });
- $('#btn_import').on('click', function() {
- layer.open({
- type: 1,
- title: '导入数据',
- area: ['500px', '620px'],
- content: $('#importLayer'),
- btn: ['确定', '取消'],
- success: function(layero, index) {
- $('#clipboardContent').focus();
- },
- yes: async function(index, layero) {
- const importedData = $('#clipboardContent').val();
- if (importedData.trim() === '') {
- return;
- }
- const jsonObject = JSON.parse(importedData);
- if (!jsonObject) {
- showErr('数据格式错误');
- return;
- }
- globalData.setCopyData(jsonObject);
- layer.load(2, { shade: [0.2, '#000'] });
- await importData(jsonObject);
- layer.closeAll();
- }
- });
- });
- $('#btn_copy_excel').on('click', function () {
- const $tempDiv = document.createElement('div');
- $tempDiv.style.position = 'absolute';
- $tempDiv.style.left = '-9999px';
- ['upstream_tb_normal', 'upstream_tb_fast', 'downstream_tb'].forEach(function (tableId) {
- const $table = $('#' + tableId);
- const $tableHeaderHtml = $table.next('.layui-table-view').find('.layui-table-header table').prop('outerHTML');
- const $tableBodyHtml = $table.next('.layui-table-view').find('.layui-table-body table').prop('outerHTML');
- const $tempTableDiv = document.createElement('div');
- $tempTableDiv.innerHTML = '<table>' + $tableHeaderHtml + $tableBodyHtml + '</table>';
- $tempTableDiv.querySelectorAll('tr').forEach(function (row, rowIndex) {
- row.setAttribute('data-table-id', tableId);
- });
- $tempDiv.innerHTML += '<br><br>' + $tempTableDiv.innerHTML;
- });
- document.body.appendChild($tempDiv);
- $tempDiv.querySelectorAll('tr').forEach(function (row) {
- const $cells = row.querySelectorAll('td, th');
- const numColsToRemove = 2;
- for (let i = 0; i < numColsToRemove; i++) {
- const cellIndex = $cells.length - 1 - i;
- if (cellIndex >= 0) {
- $cells[cellIndex].parentNode.removeChild($cells[cellIndex]);
- }
- }
- });
- const range = document.createRange();
- range.selectNodeContents($tempDiv);
- const selection = window.getSelection();
- selection.removeAllRanges();
- selection.addRange(range);
- try {
- const successful = document.execCommand('copy');
- const msg = successful ? '表格内容已复制到剪贴板,请粘贴到Excel中' : '无法复制表格内容';
- layer.msg(msg);
- } catch (err) {
- layer.msg('无法复制表格内容:' + err);
- }
- document.body.removeChild($tempDiv);
- });
- function loadMsgBadge () {
- const normalWorkflow = new BatchWorkflow('normal');
- const fastWorkflow = new BatchWorkflow('fast');
- const $normalBadge = $('#approveBadgeNormal');
- $normalBadge.hide();
- const $fastBadge = $('#approveBadgeFast');
- $fastBadge.hide();
- const refreshApprovalMessage = async () => {
- await normalWorkflow.initializeGlobalTaskList();
- const normalMsg = normalWorkflow.getPendingTaskDetails();
- const normalNum = normalMsg.length || 0;
- $normalBadge.html(normalNum);
- if (normalNum === 0) {
- $normalBadge.hide();
- } else {
- $normalBadge.show();
- }
- await fastWorkflow.initializeGlobalTaskList();
- const fastMsg = fastWorkflow.getPendingTaskDetails();
- const fastNum = fastMsg.length || 0;
- console.log('fastNum', fastNum);
- $fastBadge.html(fastNum);
- if (fastNum === 0) {
- $fastBadge.hide();
- } else {
- $fastBadge.show();
- }
- }
- refreshApprovalMessage();
- }
- loadMsgBadge();
- $('#btn_search').on('click', function (){
- initPage();
- });
- $('#btn_refresh_approve').on('click', function() {
- if (systemUserName !== 'admin') {
- showErr('您不是管理员,无审核权限');
- return;
- }
- loadMsgBadge();
- });
- $('.reset-col').on('click', function () {
- const tableId = $(this).data('table');
- const col = $(this).data('col');
- const setData = setTableColVal(tableId, col, '0');
- if (col === 'transfer') {
- setData.forEach(item => {
- globalData.setPayinfo(item.store_id, item.tag, formatDecimals(item.val));
- });
- }
- if (tableId === 'upstream_tb_normal') {
- channelTableNormal.updateToCache(col, '0');
- channelTableNormal.updateTableCalc();
- } else if (tableId === 'upstream_tb_fast') {
- channelTableFast.updateToCache(col, '0');
- channelTableFast.updateTableCalc();
- }
- });
- $('.ac-batch-deposit').on('click', function () {
- const tableId = $(this).data('table');
- let channelData = [];
- if (tableId === 'upstream_tb_normal') {
- channelData = globalData.getDataChanNormal();
- batchDepositNormal.doApplyMore(tableId, channelData);
- } else if(tableId === 'upstream_tb_fast') {
- channelData = globalData.getDataChanFast();
- batchDepositFast.doApplyMore(tableId, channelData);
- }
- });
- $('.ac-approve').on('click', function () {
- if (systemUserName !== 'admin') {
- showErr('您不是管理员,无审核权限');
- return;
- }
- const tableId = $(this).data('table');
- if (tableId === 'upstream_tb_normal') {
- batchDepositNormal.doBatchDeposit();
- } else if(tableId === 'upstream_tb_fast') {
- batchDepositFast.doBatchDeposit();
- }
- });
- });
- </script>
|