12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588 |
- <?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;
- padding: 10px;
- }
- .btn-container div:last-child {
- display: flex;
- align-items: center;
- gap: 10px;
- }
- .btn-container .layui-input,
- .btn-container .layui-btn {
- height: 40px;
- line-height: 40px;
- padding: 0 10px;
- margin: 0;
- box-sizing: border-box;
- }
- .btn-container .layui-btn {
- background-color: #1E9FFF;
- color: white;
- border: none;
- cursor: pointer;
- display: flex;
- align-items: center;
- justify-content: center;
- }
- .layui-btn-sm {
- height: 28px !important;
- line-height: 28px !important;
- padding: 0 10px !important;
- }
- .stats-panel {
- margin-top: 40px;
- margin-left: 30px;
- width: 2240px;
- overflow-x: hidden;
- }
- .ch-tags {
- display: block;
- padding: 6px 12px;
- margin: 5px 0;
- background-color: #f0f0f0;
- border: 1px solid #dcdcdc;
- border-radius: 4px;
- font-size: 14px;
- line-height: 20px;
- color: #333;
- position: relative;
- transition: background-color 0.3s, border-color 0.3s;
- }
- .ch-tags:hover {
- background-color: #e9e9e9;
- border-color: #bbb;
- }
- .ch-tags .delete-btn {
- position: absolute;
- top: 0;
- right: 5px;
- cursor: pointer;
- color: #ff4d4f;
- font-size: 16px;
- transition: color 0.3s;
- }
- .ch-tags .delete-btn:hover {
- color: #d93f3a;
- }
- .layui-btn {
- position: relative;
- }
- .company-model,
- .merchant-model,
- .channel-model,
- .summary-model{
- display: flex;
- padding: 20px;
- }
- .leftmenu-manager-container {
- flex: 1;
- margin-right: 20px;
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
- padding: 10px;
- }
- .model-form {
- flex: 2;
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
- padding: 10px;
- }
- .form-group {
- margin-bottom: 20px;
- }
- .form-group label {
- display: inline-block;
- width: 100px;
- font-weight: bold;
- line-height: 32px;
- color: #333;
- }
- .form-group input,
- .form-group textarea,
- .form-group select {
- width: calc(100% - 110px);
- padding: 8px 12px;
- border: 1px solid #ccc;
- border-radius: 4px;
- background-color: #fff;
- font-size: 14px;
- line-height: 1.5;
- box-sizing: border-box;
- height: 36px;
- }
- .form-group input:focus,
- .form-group textarea:focus,
- .form-group select:focus {
- border-color: #5cdb95;
- box-shadow: 0 0 5px rgba(92, 219, 149, 0.5);
- outline: none;
- }
- .form-group textarea {
- resize: vertical;
- min-height: 100px;
- }
- .form-group select {
- cursor: pointer;
- height: 36px;
- }
- .layui-btn {
- margin-top: 10px;
- }
- .model-form {
- display: flex;
- flex-direction: column;
- gap: 15px;
- }
- .model-form .form-group {
- display: flex;
- align-items: center;
- }
- .model-form .form-group label {
- width: 150px;
- }
- .model-form .form-group select,
- .model-form .form-group input,
- .model-form .form-group textarea {
- flex: 1;
- }
- .model-form button {
- align-self: flex-end;
- width: auto;
- }
- .quota-tablebar {
- display: flex;
- align-items: center;
- justify-content: flex-start;
- padding: 10px 20px;
- background-color: #f5f5f5;
- border-radius: 5px;
- position: relative;
- }
- .quota-tablebar span {
- font-size: 16px;
- color: #333;
- position: absolute;
- left: 120px;
- /*transform: translateX(-50%);*/
- }
- .quota-tablebar button {
- padding: 8px 16px;
- font-size: 14px;
- line-height: 1.5;
- border: none;
- border-radius: 4px;
- cursor: pointer;
- background-color: #28a745;
- color: white;
- transition: background-color 0.3s;
- }
- .req-flag {
- color: red;
- display: inline-block;
- margin-right: 5px;
- }
- .layui-form-select input {
- width: 100% !important;
- }
- #rechargeManual {
- width: 1110px;
- }
- #rechargeManualApprove {
- display:none;
- padding: 20px;
- width: 1210px;
- }
- .reset-bar, .reset-bar-c {
- margin: 0 10px;
- width: 2230px;
- /*overflow-x: auto;*/
- white-space: nowrap;
- background-color: #fff;
- box-sizing: border-box;
- position: relative;
- }
- .reset-bar button, .reset-bar-c button {
- height: 28px;
- line-height: 28px;
- display: inline-block;
- vertical-align: middle;
- width: 150px;
- }
- .reset-bar-c button:first-child {
- margin-left: 600px;
- }
- .reset-bar-c button:nth-child(2) {
- margin-left: 150px;
- }
- .reset-bar-c button:nth-child(3) {
- margin-left: 0;
- }
- .company-checkbox {
- display: inline-flex;
- align-items: center;
- margin: 5px 10px 0 0;
- padding: 4px 8px;
- font-size: 13px;
- border: 1px solid #dcdcdc;
- border-radius: 4px;
- background-color: #fff;
- cursor: pointer;
- transition: background-color 0.2s, border-color 0.2s;
- }
- .company-checkbox:hover {
- background-color: #f9f9f9;
- border-color: #c9c9c9;
- }
- .company-checkbox input {
- margin-right: 6px;
- width: 14px;
- height: 14px;
- }
- .company-checkbox span {
- color: #333;
- line-height: 1.5;
- }
- .negative-value {
- color: red;
- }
- .chinese-money {
- font-size: 12px;
- color: red;
- display: block;
- margin-top: 5px;
- }
- .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;
- }
- .summary-tables-subject {
- width: 135px;
- line-height: 30px;
- font-size: 18px;
- background-color: #1E9FFF;
- padding-left: 15px;
- font-weight: 800;
- }
- </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>
- </ul>
- </div>
- </div>
- <div class="fixed-empty"></div>
- <!-- 顶部按钮 -->
- <div class="btn-container">
- <div>
- </div>
- <div>
- <input class="layui-input query-input" type="text" readonly value="" name="query_month" id="query_month" autocomplete="off" />
- <button type="button" class="layui-btn layui-bg-blue" id="btn-update-all">更新数据</button>
- <button type="button" class="layui-btn layui-bg-blue" id="btn_refresh_approve">刷新审核</button>
- </div>
- </div>
- <div class="layui-clear"></div>
- <!-- 主体 -->
- <div class="stats-panel layui-font-14">
- <company-set type="KEY_QUOTA_COMPANY" emit="updateCompany"></company-set>
- <div class="reset-bar-c">
- <button type="button" class="layui-btn layui-btn-light-yellow reset-col" data-table="tb-company" data-col="corrected_used_quota">一键清零</button>
- <button type="button" class="layui-btn layui-bg-orange ac-batch-invoice" data-table="tb-company">批量提交</button>
- <button type="button" class="layui-btn layui-bg-red ac-approve" data-table="tb-company">
- 审批
- <span class="btn-badge" id="badge-approve-company">0</span>
- </button>
- </div>
- <table class="layui-hide" id="tb-company"></table>
- </div>
- <!-- 下游(机构) -->
- <div class="stats-panel layui-font-14">
- <merchant-set type="KEY_QUOTA_MERCHANT" emit="updateMerchant"></merchant-set>
- <div class="reset-bar">
- <button type="button" class="layui-btn layui-btn-light-yellow reset-col" data-table="tb-merchant" data-col="total_invoiced">一键清零</button>
- <button type="button" class="layui-btn layui-btn-light-yellow reset-col" data-table="tb-merchant" data-col="month_opened">一键清零</button>
- <button type="button" class="layui-btn layui-btn-light-yellow reset-col" data-table="tb-merchant" data-col="actual_invoice_amount">一键清零</button>
- <button type="button" class="layui-btn layui-bg-orange ac-batch-invoice" data-table="tb-merchant">批量提交</button>
- <button type="button" class="layui-btn layui-bg-red ac-approve" data-table="tb-merchant">
- 审批
- <span class="btn-badge" id="badge-approve-mch">0</span>
- </button>
- </div>
- <table class="layui-hide" id="tb-merchant"></table>
- </div>
- <!-- 上游 -->
- <div class="stats-panel layui-font-14">
- <channel-set type="KEY_QUOTA_CHANNEL" emit="updateChannel"></channel-set>
- <div class="reset-bar">
- <button type="button" class="layui-btn layui-btn-light-yellow reset-col" data-table="tb-channel" data-col="total_invoiced">一键清零</button>
- <button type="button" class="layui-btn layui-btn-light-yellow reset-col" data-table="tb-channel" data-col="month_opened">一键清零</button>
- <button type="button" class="layui-btn layui-btn-light-yellow reset-col" data-table="tb-channel" data-col="actual_invoice_amount">一键清零</button>
- <button type="button" class="layui-btn layui-bg-orange ac-batch-invoice" data-table="tb-channel">批量提交</button>
- <button type="button" class="layui-btn layui-bg-red ac-approve" data-table="tb-channel">
- 审批
- <span class="btn-badge" id="badge-approve-chan">0</span>
- </button>
- </div>
- <table class="layui-hide" id="tb-channel"></table>
- </div>
- <!-- 综合统计 -->
- <div class="stats-panel layui-font-14">
- <summary-set type="KEY_QUOTA_SUMMARY" emit="updateSummary"></summary-set>
- <div id="summary-tables">
- </div>
- </div>
- <!-- 申请确认 -->
- <div id="rechargeManual" style="display:none; padding: 20px;">
- <div class="layui-form-item">
- <table class="layui-hide" id="tb_apply"></table>
- </div>
- </div>
- <div id="rechargeManualApprove">
- <table class="layui-hide" id="tb_approve"></table>
- </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-quota.js?t=<?php echo time();?>"></script>
- <?php session_start(); ?>
- <script type="text/javascript">
- const systemUserName = '<?php echo $output['admin_info']['name'];?>';
- const isAdmin = systemUserName === 'admin';//区分管理员和出纳的权限
- $(function () {
- const app = new ComponentBase({
- el: '#app',
- componentData: {
- 'company-set': [],
- 'merchant-set': [],
- 'channel-set': [],
- 'summary-set': []
- },
- components: {
- 'company-set': CompanyComponent,
- 'merchant-set': MerchantComponent,
- 'channel-set': ChannelComponent,
- 'summary-set': SummaryComponent
- }
- });
- class CompanyTable extends LayuiTableBase {
- constructor() {
- super('tb-company');
- }
- renderTable() {
- const that = this;
- const tableData = dataHelper.getCompanyList();
- tableData.forEach(function (item) {
- item.total_quota = formatDecimals(item.total_quota);
- item.used_quota = formatDecimals(item.used_quota);
- item.left_quota = formatDecimals(item.total_quota - item.used_quota);
- item.corrected_used_quota = '0';
- item.operator = '';
- });
- layui.table.render({
- elem: '#' + this.tableId,
- data: tableData,
- limit: tableData.length,
- cols: [[
- {field: 'name', title: '主体名称', width: 150},
- {field: 'total_quota', title: '总额度', width: 200},
- {field: 'used_quota', title: '已用额度', width: 110},
- {field: 'left_quota', title: '剩余额度', width: 150},
- {field: 'corrected_used_quota', title: '已用额度矫正', width: 150},
- {field: 'operator', title: '操作人', width: 150},
- {field: 'remark', title: '备注', width: 150},
- {field: 'action', title: '操作', width: 150, templet: function(d){return '<button class="layui-btn layui-btn-sm invoice-apply-signle" style="margin: 0" 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 editNumberColumns = ['corrected_used_quota'];
- if (isAdmin === true) {
- editNumberColumns.push('total_quota', 'used_quota');
- }
- for(let col of editNumberColumns) {
- const td = $(tr).find('td[data-field="' + col + '"]').not('.layui-hide');
- 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', async function () {
- let val = valDiv.text().trim();
- if (!isNumeric(val)) {
- valDiv.html('0');
- }
- val = normalizeAmount(val);//过滤,比如前导 0
- valDiv.html(formatDecimals(val));
- const index = $(this).parent().parent().data('index');
- await that.saveEdit(index);
- that.deltaValue('total_quota', 'used_quota', 'left_quota');
- that.setValueClass(['left_quota']);
- });
- }
- const editTextColumns = ['remark', 'operator'];
- for(let col of editTextColumns) {
- const td = $(tr).find('td[data-field="' + col + '"]').not('.layui-hide');
- 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', async function () {
- const index = $(this).parent().parent().data('index');
- await that.saveEdit(index);
- that.deltaValue('total_quota', 'used_quota', 'left_quota');
- that.setValueClass(['left_quota']);
- });
- }
- });
- that.setValueClass(['left_quota']);
- tableItem.next('.layui-table-view').off('click', '.invoice-apply-signle').on('click', '.invoice-apply-signle', function (){
- const index = $(this).data('index');
- that.applyOne(index);
- });
- }
- });
- }
- deltaValue(firstCloumn, secondCloumn, resultCloumn) {
- 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 secondVal = $(element).find('td[data-field="' + secondCloumn + '"]').find('.layui-table-cell').text().trim();
- const resultTd = $(element).find('td[data-field="' + resultCloumn + '"]').find('.layui-table-cell');
- const deltaVal = formatDecimals(parseFloat(firstVal) - parseFloat(secondVal), 2);
- resultTd.html(deltaVal);
- });
- }
- async saveEdit(index) {
- const companyData = dataHelper.getCompanyList();
- if (index >= companyData.length) {
- console.error('主体数据错误:编辑索引大于主体总数');
- return;
- }
- const tr = $('#' + this.tableId).next('.layui-table-view').find('.layui-table-body tbody tr[data-index="' + index + '"]');
- const total_quota = tr.find('td[data-field="total_quota"]').find('div').text().trim();
- const used_quota = tr.find('td[data-field="used_quota"]').find('div').text().trim();
- const remark = tr.find('td[data-field="remark"]').find('div').text().trim();
- let item = companyData[index];
- item.total_quota = total_quota || "0";
- item.used_quota = used_quota || "0";
- item.remark = remark || "";
- await dataHelper.addOrUpdateData(CONSTANTS.KEY_QUOTA_COMPANY, item, 1);
- renderSummaryTables();
- }
- applyOne(index) {
- batchCorrected.doApplyOne(this.tableId, index);
- }
- }
- class MerchantTable extends LayuiTableBase {
- constructor() {
- super('tb-merchant');
- }
- async renderTable() {
- const that = this;
- const merchantList = dataHelper.getMerchantList();
- merchantList.forEach(mItem => {
- setEmptyFieldsToZero(mItem, ['total_invoiced', 'month_opened']);
- });
- const mchIds = merchantList.map(item => item.mch_id).join(',')
- const currMonth = getCurrMonthCondition();
- const sysData = await statsApi.getSysMchAmounts(mchIds, currMonth);
- let sysMchData = [];
- if (sysData.state === true) {
- sysMchData = sysData.list;
- }
- let tableData = deepCloneData(merchantList);
- tableData.forEach(item => {
- const amountsItem = sysMchData.find(aItem => aItem.mch_id === item.mch_id);
- if (amountsItem !== undefined) {
- item.mch_name = amountsItem.mch_name;
- item.total_amounts = formatDecimals(amountsItem.total_amounts, 2);
- item.month_amounts = formatDecimals(amountsItem.month_amounts, 2);
- } else {
- item.mch_name = '';
- item.total_amounts = '0';
- item.month_amounts = '0';
- }
- item.total_invoiced = formatDecimals(item.total_invoiced);
- Object.assign(item, {
- estimated_invoice_amount:0,
- available_invoice_amount: 0,
- actual_invoice_amount: 0,
- invoice_date: '',
- operator: ''
- });
- });
- tableData = sortBySubjectContinuity(tableData);
- layui.table.render({
- elem: '#' + this.tableId,
- data: tableData,
- limit: tableData.length,
- cols: [[
- {field: 'subject', title: '对应主体', width: 150},
- {field: 'mch_id', title: '机构id', width: 100},
- {field: 'mch_name', title: '机构名称', width: 200},
- {field: 'total_amounts', title: '充值总计金额', width: 150},
- {field: 'month_amounts', title: '本月打款总计', width: 150},
- {field: 'total_invoiced', title: '已开票总金额', width: 150},
- {field: 'last_invoice_date', title: '上次开票日期', width: 150, templet: function(d){
- return '<input type="text" class="layui-input date-input" data-index="' + d.LAY_TABLE_INDEX + '" data-field="last_invoice_date" value="' + d.last_invoice_date + '">';
- }},
- {field: 'month_opened', title: '本月已开票', width: 150},
- {field: 'available_invoice_amount', title: '本月可开票总计', width: 150},
- {field: 'estimated_invoice_amount', title: '预计本月开票金额', width: 150},
- {field: 'actual_invoice_amount', title: '实际本次开票', width: 150},
- {field: 'invoice_date', title: '开票日期', width: 150, templet: function(d){
- return '<input type="text" class="layui-input date-input" data-index="' + d.LAY_TABLE_INDEX + '" data-field="invoice_date" value="' + d.invoice_date + '">';
- }},
- {field: 'operator', title: '操作人', width: 150},
- {field: 'remark', title: '备注', width: 150},
- {field: 'action', title: '操作', width: 100, templet: function(d){return '<button class="layui-btn layui-btn-sm invoice-apply-signle" style="margin: 0" 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 subject = tableData[i].subject;
- $(tr).attr('subject', subject);
- });
- that.mergeCells();
- const updateTable = () => {
- that.deltaValue('total_amounts', 'total_invoiced', 'estimated_invoice_amount');
- that.updateAvailableInvoiceAmount();
- that.setValueClass(['total_invoiced', 'available_invoice_amount', 'estimated_invoice_amount', 'actual_invoice_amount', 'month_opened', 'total_amounts', 'month_amounts']);
- that.updateColumnCnMoney(['total_invoiced']);
- };
- updateTable();
- trs.each(function (i, tr) {
- const editNumberColumns = ['total_invoiced', 'actual_invoice_amount'];
- if (isAdmin === true) {
- editNumberColumns.push('month_opened');
- }
- for (let col of editNumberColumns) {
- const td = $(tr).find('td[data-field="' + col + '"]').not('.layui-hide');
- 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', async function () {
- let val = valDiv.text().trim();
- if (!isNumeric(val)) {
- valDiv.html('0');
- }
- val = normalizeAmount(val);//过滤,比如前导 0
- valDiv.html(formatDecimals(val));
- const index = $(this).parent().parent().data('index');
- await that.saveEdit(index);
- if (col === 'month_opened') {
- const subject = $(tr).find('td[data-field="subject"]').find('div').text();
- await that.updateCompanyUsedQuota(subject);
- setTimeout(function () {
- companyTable.renderTable();
- renderSummaryTables()
- }, 0);
- }
- if (col === 'total_invoiced') {
- setTimeout(function () {
- renderSummaryTables();
- }, 0);
- }
- updateTable();
- });
- }
- const editTextColumns = ['operator', 'remark'];
- for (let col of editTextColumns) {
- const td = $(tr).find('td[data-field="' + col + '"]').not('.layui-hide');
- 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', async function () {
- const index = $(this).parent().parent().data('index');
- await that.saveEdit(index);
- updateTable();
- });
- }
- });
- //日期组件
- setTimeout(function(){
- $('.date-input').each(function(){
- const rowIndex = $(this).attr('data-index');
- layui.laydate.render({
- elem: this,
- type: 'date',
- done: async function (value, date, endDate) {
- await that.saveEdit(rowIndex);
- }
- });
- });
- }, 0);
- tableItem.next('.layui-table-view').off('click', '.invoice-apply-signle').on('click', '.invoice-apply-signle', function (){
- const index = $(this).data('index');
- that.applyOne(index);
- });
- that.setRole();
- }
- });
- }
- setRole() {
- if (isAdmin === true) {
- return;
- }
- const tbRoot = $('#' + this.tableId);
- const bodyTrs = tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
- const headerTrs = tbRoot.next('.layui-table-view').find('.layui-table-header thead tr');
- const hideColumns = ['total_amounts', 'month_amounts', 'month_opened', 'total_invoiced', 'last_invoice_date'];
- for (let col of hideColumns) {
- bodyTrs.each(function (i, tr) {
- $(tr).find('td[data-field="' + col + '"]').addClass('layui-hide');
- });
- headerTrs.each(function (i, tr) {
- $(tr).find('th[data-field="' + col + '"]').addClass('layui-hide');
- });
- }
- }
- updateColumnCnMoney(columns) {
- const tableItem = $('#' + this.tableId);
- const trs = tableItem.next('.layui-table-view').find('.layui-table-body tbody tr');
- trs.each(function(i, tr) {
- columns.forEach(column => {
- const cell = $(tr).find('td[data-field="' + column + '"]');
- let value = cell.find('div').text().trim();
- value = parseFloat(value.replace(/[^\d.-]/g, ''));
- if (!isNaN(value)) {
- const chineseMoney = cnMoneyFormat(value);
- cell.find('.chinese-money').remove();
- const content = chineseMoney !== '' ? `(${chineseMoney})` : '';
- cell.append('<span class="chinese-money">' + content + '</span>');
- }
- });
- });
- }
- mergeCells() {
- const tbRoot = $('#' + this.tableId);
- const trs = tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
- const groups = {};
- trs.each(function(i, tr) {
- const group = $(tr).attr('subject');
- if (group) {
- if (!groups[group]) {
- groups[group] = {count: 0, startIndex: i};
- }
- groups[group].count++;
- }
- });
- for (let group in groups) {
- const info = groups[group];
- if (info.count > 1) {
- const mergeColumns = ['available_invoice_amount'];
- 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');
- }
- }
- }
- }
- }
- deltaValue(firstCloumn, secondCloumn, resultCloumn) {
- 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 secondVal = $(element).find('td[data-field="' + secondCloumn + '"]').find('.layui-table-cell').text().trim();
- const resultTd = $(element).find('td[data-field="' + resultCloumn + '"]').find('.layui-table-cell');
- const deltaVal = formatDecimals(parseFloat(firstVal) - parseFloat(secondVal), 2);
- resultTd.html(deltaVal);
- });
- }
- updateAvailableInvoiceAmount () {
- let groupSum = {};
- const trs = $('#' + this.tableId).next('.layui-table-view').find('.layui-table-body tbody tr');
- trs.each(function (index, element) {
- const amount = $(element).find('td[data-field="estimated_invoice_amount"]').not('.layui-hide').find('.layui-table-cell').text().trim();
- const tdGroup = $(element).attr('subject');
- if (!tdGroup) {
- return;
- }
- if (!groupSum[tdGroup]) {
- groupSum[tdGroup] = 0;
- }
- if (isNumeric(amount) && amount > 0) { //负数不计入求和
- groupSum[tdGroup] += parseFloat(amount);
- }
- });
- trs.each(function (index, element) {
- const td = $(element).find('td[data-field="available_invoice_amount"]').not('.layui-hide').find('.layui-table-cell');
- const tdGroup = $(element).attr('subject');
- if (!tdGroup) {
- return;
- }
- if (td.length > 0) {
- const val = groupSum[tdGroup];
- td.html(formatDecimals(val));
- }
- });
- }
- async saveEdit(index) {
- const merchantData = dataHelper.getMerchantList();
- if (index >= merchantData.length) {
- console.error('主体数据错误:编辑索引大于主体总数');
- return;
- }
- const tr = $('#' + this.tableId).next('.layui-table-view').find('.layui-table-body tbody tr[data-index="' + index + '"]');
- const total_invoiced = tr.find('td[data-field="total_invoiced"]').find('div').text().trim();
- const month_opened = tr.find('td[data-field="month_opened"]').find('div').text().trim();
- const last_invoice_date = tr.find('td[data-field="last_invoice_date"]').find('div').find('input').val().trim();
- const remark = tr.find('td[data-field="remark"]').find('div').text().trim();
- let item = merchantData[index];
- item.total_invoiced = total_invoiced || "0";
- item.last_invoice_date = last_invoice_date || "";
- item.month_opened = month_opened || "0";
- item.remark = remark;
- await dataHelper.addOrUpdateData(CONSTANTS.KEY_QUOTA_MERCHANT, item, 2);
- }
- async updateCompanyUsedQuota(subject) {
- const companyList = dataHelper.getCompanyList();
- const activeCompany = companyList.find(cItem => cItem.name === subject);
- if (activeCompany !== undefined) {//更新当前编辑的主体已用额度
- const merchantDataNew = dataHelper.getMerchantList();
- const total = merchantDataNew
- .filter(mItem => mItem.subject === subject)
- .reduce((sum, item) => sum + parseFloat(item.month_opened), 0);
- activeCompany.used_quota = total.toString();
- }
- await dataHelper.updateAllData(CONSTANTS.KEY_QUOTA_COMPANY, companyList);
- }
- applyOne(index) {
- batchMchInvoice.doApplyOne(this.tableId, index);
- }
- }
- class ChannelTable extends LayuiTableBase {
- constructor() {
- super('tb-channel');
- }
- async renderTable() {
- const that = this;
- const channelList = dataHelper.getChannelList();
- channelList.forEach(cItem => {
- setEmptyFieldsToZero(cItem, ['total_invoiced', 'month_opened']);
- });
- const storeIds = channelList.map(item => item.store_id).join(',')
- const currMonth = getCurrMonthCondition();
- const sysData = await statsApi.getSysChanAmounts(storeIds, currMonth);
- let sysChanData = [];
- if (sysData.state === true) {
- sysChanData = sysData.list;
- }
- let tableData = deepCloneData(channelList);
- tableData.forEach(item => {
- const amountsItem = sysChanData.find(aItem => aItem.store_id === item.store_id);
- if (amountsItem !== undefined) {
- item.store_name = amountsItem.store_name;
- item.month_amounts = formatDecimals(amountsItem.month_amounts, 2);
- item.total_amounts = formatDecimals(amountsItem.total_amounts, 2);
- } else {
- item.store_name = '';
- item.month_amounts = '0';
- item.total_amounts = '0';
- }
- item.total_invoiced = formatDecimals(item.total_invoiced);
- Object.assign(item, {
- estimated_invoice_amount:0,
- available_invoice_amount: 0,
- actual_invoice_amount: 0,
- invoice_date: '',
- operator: ''
- });
- });
- tableData = sortBySubjectContinuity(tableData);
- layui.table.render({
- elem: '#' + this.tableId,
- data: tableData,
- limit: tableData.length,
- cols: [[
- {field: 'subject', title: '对应主体', width: 150},
- {field: 'store_id', title: '通道id', width: 100},
- {field: 'store_name', title: '通道名称', width: 200},
- {field: 'total_amounts', title: '通道总计金额', width: 150},
- {field: 'month_amounts', title: '本月打款总计', width: 150},
- {field: 'total_invoiced', title: '已开票总金额', width: 150},
- {field: 'last_invoice_date', title: '上次开票日期', width: 150, templet: function(d){
- return '<input type="text" class="layui-input date-input" data-index="' + d.LAY_TABLE_INDEX + '" data-field="last_invoice_date" value="' + d.last_invoice_date + '">';
- }},
- {field: 'month_opened', title: '本月已开票', width: 150},
- {field: 'available_invoice_amount', title: '本月可开票总计', width: 150},
- {field: 'estimated_invoice_amount', title: '预计本月开票金额', width: 150},
- {field: 'actual_invoice_amount', title: '实际本次开票', width: 150},
- {field: 'invoice_date', title: '开票日期', width: 150, templet: function(d){
- return '<input type="text" class="layui-input date-input" data-index="' + d.LAY_TABLE_INDEX + '" data-field="invoice_date" value="' + d.invoice_date + '">';
- }},
- {field: 'operator', title: '操作人', width: 150},
- {field: 'remark', title: '备注', width: 150},
- {field: 'action', title: '操作', width: 100, templet: function(d){return '<button class="layui-btn layui-btn-sm invoice-apply-signle" style="margin: 0" 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 subject = tableData[i].subject;
- $(tr).attr('subject', subject);
- });
- that.mergeCells();
- const updateTable = () => {
- that.deltaValue('total_amounts', 'total_invoiced', 'estimated_invoice_amount');
- that.updateAvailableInvoiceAmount();
- that.setValueClass(['total_invoiced', 'available_invoice_amount', 'estimated_invoice_amount', 'actual_invoice_amount', 'month_opened', 'total_amounts']);
- that.updateColumnCnMoney(['total_invoiced']);
- };
- updateTable();
- trs.each(function (i, tr) {
- const editNumberColumns = ['total_invoiced', 'actual_invoice_amount'];
- if (isAdmin === true) {
- editNumberColumns.push('month_opened');
- }
- for (let col of editNumberColumns) {
- const td = $(tr).find('td[data-field="' + col + '"]').not('.layui-hide');
- 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', async function () {
- let val = valDiv.text().trim();
- if (!isNumeric(val)) {
- valDiv.html('0');
- }
- val = normalizeAmount(val);//过滤,比如前导 0
- valDiv.html(formatDecimals(val));
- const index = $(this).parent().parent().data('index');
- await that.saveEdit(index);
- updateTable();
- });
- }
- const editTextColumns = ['operator', 'remark'];
- for (let col of editTextColumns) {
- const td = $(tr).find('td[data-field="' + col + '"]').not('.layui-hide');
- 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', async function () {
- const index = $(this).parent().parent().data('index');
- await that.saveEdit(index);
- updateTable();
- });
- }
- });
- //日期组件
- setTimeout(function(){
- $('.date-input').each(function(){
- const rowIndex = $(this).attr('data-index');
- layui.laydate.render({
- elem: this,
- type: 'date',
- done: async function (value, date, endDate) {
- await that.saveEdit(rowIndex);
- }
- });
- });
- }, 0);
- tableItem.next('.layui-table-view').off('click', '.invoice-apply-signle').on('click', '.invoice-apply-signle', function (){
- const index = $(this).data('index');
- that.applyOne(index);
- });
- that.setRole();
- }
- });
- }
- setRole() {
- if (isAdmin === true) {
- return;
- }
- const tbRoot = $('#' + this.tableId);
- const bodyTrs = tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
- const headerTrs = tbRoot.next('.layui-table-view').find('.layui-table-header thead tr');
- const hideColumns = ['total_amounts', 'month_amounts', 'month_opened', 'total_invoiced', 'last_invoice_date'];
- for (let col of hideColumns) {
- bodyTrs.each(function (i, tr) {
- $(tr).find('td[data-field="' + col + '"]').addClass('layui-hide');
- });
- headerTrs.each(function (i, tr) {
- $(tr).find('th[data-field="' + col + '"]').addClass('layui-hide');
- });
- }
- }
- updateColumnCnMoney(columns) {
- const tableItem = $('#' + this.tableId);
- const trs = tableItem.next('.layui-table-view').find('.layui-table-body tbody tr');
- trs.each(function(i, tr) {
- columns.forEach(column => {
- const cell = $(tr).find('td[data-field="' + column + '"]');
- let value = cell.find('div').text().trim();
- value = parseFloat(value.replace(/[^\d.-]/g, ''));
- if (!isNaN(value)) {
- const chineseMoney = cnMoneyFormat(value);
- cell.find('.chinese-money').remove();
- const content = chineseMoney !== '' ? `(${chineseMoney})` : '';
- cell.append('<span class="chinese-money">' + content + '</span>');
- }
- });
- });
- }
- mergeCells() {
- const tbRoot = $('#' + this.tableId);
- const trs = tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
- const groups = {};
- trs.each(function(i, tr) {
- const group = $(tr).attr('subject');
- if (group) {
- if (!groups[group]) {
- groups[group] = {count: 0, startIndex: i};
- }
- groups[group].count++;
- }
- });
- for (let group in groups) {
- const info = groups[group];
- if (info.count > 1) {
- const mergeColumns = ['available_invoice_amount'];
- 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');
- }
- }
- }
- }
- }
- deltaValue(firstCloumn, secondCloumn, resultCloumn) {
- 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 secondVal = $(element).find('td[data-field="' + secondCloumn + '"]').find('.layui-table-cell').text().trim();
- const resultTd = $(element).find('td[data-field="' + resultCloumn + '"]').find('.layui-table-cell');
- const deltaVal = formatDecimals(parseFloat(firstVal) - parseFloat(secondVal), 2);
- resultTd.html(deltaVal);
- });
- }
- updateAvailableInvoiceAmount () {
- let groupSum = {};
- const trs = $('#' + this.tableId).next('.layui-table-view').find('.layui-table-body tbody tr');
- trs.each(function (index, element) {
- const amount = $(element).find('td[data-field="estimated_invoice_amount"]').not('.layui-hide').find('.layui-table-cell').text().trim();
- const tdGroup = $(element).attr('subject');
- if (!tdGroup) {
- return;
- }
- if (!groupSum[tdGroup]) {
- groupSum[tdGroup] = 0;
- }
- if (isNumeric(amount) && amount > 0) { //负数不计入求和
- groupSum[tdGroup] += parseFloat(amount);
- }
- });
- trs.each(function (index, element) {
- const td = $(element).find('td[data-field="available_invoice_amount"]').not('.layui-hide').find('.layui-table-cell');
- const tdGroup = $(element).attr('subject');
- if (!tdGroup) {
- return;
- }
- if (td.length > 0) {
- const val = groupSum[tdGroup];
- td.html(formatDecimals(val));
- }
- });
- }
- async saveEdit(index) {
- const channelData = dataHelper.getChannelList();
- if (index >= channelData.length) {
- console.error('主体数据错误:编辑索引大于主体总数');
- return;
- }
- const tr = $('#' + this.tableId).next('.layui-table-view').find('.layui-table-body tbody tr[data-index="' + index + '"]');
- const total_invoiced = tr.find('td[data-field="total_invoiced"]').find('div').text().trim();
- const month_opened = tr.find('td[data-field="month_opened"]').find('div').text().trim();
- const last_invoice_date = tr.find('td[data-field="last_invoice_date"]').find('div').find('input').val().trim();
- const remark = tr.find('td[data-field="remark"]').find('div').text().trim();
- let item = channelData[index];
- item.total_invoiced = total_invoiced || "0";
- item.month_opened = month_opened || "0";
- item.last_invoice_date = last_invoice_date || "";
- item.remark = remark;
- await dataHelper.addOrUpdateData(CONSTANTS.KEY_QUOTA_CHANNEL, item, 2);
- setTimeout(function () {
- renderSummaryTables();
- }, 0);
- }
- applyOne(index) {
- batchChanInvoice.doApplyOne(this.tableId, index);
- }
- }
- class SummaryTable extends LayuiTableBase {
- constructor(tableId, subject) {
- super(tableId);
- this.subject = subject;
- this.lines = 0;
- }
- renderTable() {
- const that = this;
- const channelData = this.channelTableData().filter(item => {
- return item.subject === that.subject;
- });
- this.lines = channelData.length;
- const merchantData = this.merchantTableData().filter(item => {
- return item.subject === that.subject;
- });
- const summaryData = dataHelper.getSummaryList().find(item => item.subject === that.subject);
- const invoice_remaining_amount = summaryData === undefined || summaryData.invoice_remaining_amount === '' ? '0' : summaryData.invoice_remaining_amount;
- const remaining_tickets = summaryData === undefined || summaryData.remaining_tickets === '' ? '0' : summaryData.remaining_tickets;
- const invoice_needed_amount = summaryData === undefined || summaryData.invoice_needed_amount === '' ? '0' : summaryData.invoice_needed_amount;
- const ticket_difference = summaryData === undefined || summaryData.ticket_difference === '' ? '0' : summaryData.ticket_difference;
- const adjustment_value = summaryData === undefined || summaryData.adjustment_value === '' ? '0' : summaryData.adjustment_value;
- const receivable_ticket = channelData.reduce((total, item) => {
- return total + parseFloat(item.total_amounts);
- }, 0);
- const total_received_tickets = channelData.reduce((total, item) => {
- return total + parseFloat(item.total_invoiced);
- }, 0);
- const issuable_ticket = merchantData.reduce((total, item) => {
- return total + parseFloat(item.total_amounts);
- }, 0);
- const total_issued_tickets = merchantData.reduce((total, item) => {
- return total + parseFloat(item.total_invoiced);
- }, 0);
- const pending_tickets = merchantData.reduce((total, item) => {
- const estimated_invoice_amount = parseFloat(item.estimated_invoice_amount);
- if (estimated_invoice_amount > 0) {
- return total + estimated_invoice_amount;
- }
- return total;
- }, 0);
- for (const chan of channelData) { //合并的单元格属性,合并项的数值保持一致
- chan.invoice_remaining_amount = formatDecimals(invoice_remaining_amount);
- chan.invoice_needed_amount = formatDecimals(invoice_needed_amount);
- chan.receivable_ticket = formatDecimals(receivable_ticket);
- chan.total_received_tickets = formatDecimals(total_received_tickets);
- chan.issuable_ticket = formatDecimals(issuable_ticket);
- chan.total_issued_tickets = formatDecimals(total_issued_tickets);
- chan.remaining_tickets = formatDecimals(remaining_tickets);
- chan.pending_tickets = formatDecimals(pending_tickets);
- chan.ticket_difference = formatDecimals(ticket_difference);
- chan.adjustment_value = formatDecimals(adjustment_value);
- }
- layui.table.render({
- elem: '#' + this.tableId,
- data: channelData,
- limit: channelData.length,
- cols: [[
- {field: 'store_name', title: '上游', width: 150},
- {field: 'total_amounts', title: '总计', width: 200},
- {field: 'receivable_ticket', title: '应该收票', width: 200},
- {field: 'total_invoiced', title: '已开', width: 150},
- {field: 'total_received_tickets', title: '总计收票', width: 150},
- {field: 'adjustment_value', title: '矫正值(含跨年)', width: 150},
- {field: 'issuable_ticket', title: '应出票', width: 150},
- {field: 'total_issued_tickets', title: '总计出票', width: 150},
- {field: 'remaining_tickets', title: '剩余票', width: 150},
- {field: 'pending_tickets', title: '待开票', width: 150},
- {field: 'ticket_difference', title: '差额', width: 150},
- {field: 'invoice_remaining_amount', title: '现有多少票', width: 150},
- {field: 'invoice_needed_amount', title: '需进票', width: 150},
- ]],
- done: function (res, curr, count) {
- that.mergeCells();
- that.setRole();
- that.setEditCell();
- that.updateTable();
- }
- });
- }
- calcTicketDifference() {
- const tbRoot = $('#' + this.tableId);
- const trs = tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
- trs.each(function(i, tr) {
- const pending_tickets = $(tr).find('td[data-field="pending_tickets"]').not('.layui-hide').find('.layui-table-cell').text().trim();
- const remaining_tickets = $(tr).find('td[data-field="remaining_tickets"]').not('.layui-hide').find('.layui-table-cell').text().trim();
- const $ticketDifferenceEl = $(tr).find('td[data-field="ticket_difference"]').not('.layui-hide').find('.layui-table-cell');
- if ($ticketDifferenceEl.length > 0) {
- const ticket_difference = parseFloat(remaining_tickets) - parseFloat(pending_tickets);
- $ticketDifferenceEl.html(formatDecimals(ticket_difference));
- }
- });
- }
- calcInvoiceNeededAmount() {
- const tbRoot = $('#' + this.tableId);
- const trs = tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
- trs.each(function(i, tr) {
- const pending_tickets = $(tr).find('td[data-field="pending_tickets"]').not('.layui-hide').find('.layui-table-cell').text().trim();
- const invoice_remaining_amount = $(tr).find('td[data-field="invoice_remaining_amount"]').not('.layui-hide').find('.layui-table-cell').text().trim();
- const $invoiceNeededAmountEl = $(tr).find('td[data-field="invoice_needed_amount"]').not('.layui-hide').find('.layui-table-cell');
- if ($invoiceNeededAmountEl.length > 0) {
- const invoice_needed_amount = parseFloat(invoice_remaining_amount) - parseFloat(pending_tickets);
- $invoiceNeededAmountEl.html(formatDecimals(invoice_needed_amount));
- }
- });
- }
- updateTable() {
- this.setValueClass(['total_amounts', 'receivable_ticket', 'total_invoiced', 'total_received_tickets', 'issuable_ticket', 'total_issued_tickets', 'remaining_tickets', 'pending_tickets', 'ticket_difference', 'invoice_needed_amount']);
- }
- mergeCells() {
- const tbRoot = $('#' + this.tableId);
- const trs = tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
- const mergeColumns = ['receivable_ticket', 'total_received_tickets', 'issuable_ticket', 'total_issued_tickets', 'remaining_tickets', 'pending_tickets', 'ticket_difference', 'invoice_remaining_amount', 'adjustment_value', 'invoice_needed_amount'];
- for (let col of mergeColumns) {
- trs.eq(0).find('td[data-field="' + col + '"]').attr('rowspan', this.lines);
- for (let j = 1; j < this.lines; j++) {
- trs.eq(j).find('td[data-field="' + col + '"]').addClass('layui-hide');
- }
- }
- }
- setEditCell() {
- const that = this;
- const tbRoot = $('#' + this.tableId);
- const trs = tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
- trs.each(function (i, tr) {
- const editNumberColumns = ['remaining_tickets', 'ticket_difference', 'invoice_remaining_amount', 'adjustment_value', 'invoice_needed_amount'];
- for (let col of editNumberColumns) {
- const td = $(tr).find('td[data-field="' + col + '"]').not('.layui-hide');
- 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', async function () {
- let val = valDiv.text().trim();
- if (!isNumeric(val)) {
- valDiv.html('0');
- }
- val = normalizeAmount(val);//过滤,比如前导 0
- valDiv.html(formatDecimals(val));
-
- if (col === 'invoice_remaining_amount' || col === 'adjustment_value') {
- that.calcInvoiceNeededAmount();
- }
- if (col === 'remaining_tickets') {
- that.calcTicketDifference();
- }
- const index = $(this).parent().parent().data('index');
- await that.saveEdit(index);
- that.updateTable();
- });
- }
- });
- }
- async saveEdit(index) {
- const summaryData = dataHelper.getSummaryList();
- if (index >= summaryData.length) {
- console.error('主体数据错误:编辑索引大于主体总数');
- return;
- }
- const tr = $('#' + this.tableId).next('.layui-table-view').find('.layui-table-body tbody tr[data-index="' + index + '"]');
- const invoice_remaining_amount = tr.find('td[data-field="invoice_remaining_amount"]').find('div').not('.layui-hide').text().trim();
- const remaining_tickets = tr.find('td[data-field="remaining_tickets"]').find('div').not('.layui-hide').text().trim();
- const invoice_needed_amount = tr.find('td[data-field="invoice_needed_amount"]').find('div').not('.layui-hide').text().trim();
- const ticket_difference = tr.find('td[data-field="ticket_difference"]').find('div').not('.layui-hide').text().trim();
- const adjustment_value = tr.find('td[data-field="adjustment_value"]').find('div').not('.layui-hide').text().trim();
- let item = dataHelper.getSummaryList().find(item => item.subject === this.subject);
- if (item === undefined) {
- item = {
- sort: 0,
- subject: this.subject,
- invoice_remaining_amount: invoice_remaining_amount,
- remaining_tickets: remaining_tickets,
- invoice_needed_amount: invoice_needed_amount,
- ticket_difference: ticket_difference,
- adjustment_value: adjustment_value
- };
- } else {
- item.invoice_remaining_amount = invoice_remaining_amount;
- item.remaining_tickets = remaining_tickets;
- item.invoice_needed_amount = invoice_needed_amount;
- item.ticket_difference = ticket_difference;
- item.adjustment_value = adjustment_value;
- }
- await dataHelper.addOrUpdateData(CONSTANTS.KEY_QUOTA_SUMMARY, item, 1);
- const that = this;
- setTimeout(function () {
- that.renderTable();
- }, 0);
- }
- channelTableData() {
- const data = [];
- const channelTb = $('#' + channelTable.tableId);
- const channelTrs = channelTb.next('.layui-table-view').find('.layui-table-body tbody tr');
- channelTrs.each(function (i, tr) {
- const subject = $(tr).find('td[data-field="subject"]').find('div').text();
- const store_name = $(tr).find('td[data-field="store_name"]').find('div').text();
- const total_amounts = $(tr).find('td[data-field="total_amounts"]').find('div').text();
- const total_invoiced = $(tr).find('td[data-field="total_invoiced"]').find('div').text();
- const estimated_invoice_amount = $(tr).find('td[data-field="estimated_invoice_amount"]').find('div').text();
- data.push({
- subject,
- store_name,
- total_amounts,
- total_invoiced,
- estimated_invoice_amount
- });
- });
- return data;
- }
- merchantTableData() {
- const data = [];
- const merchantTb = $('#' + merchantTable.tableId);
- const merchantTrs = merchantTb.next('.layui-table-view').find('.layui-table-body tbody tr');
- merchantTrs.each(function (i, tr) {
- const subject = $(tr).find('td[data-field="subject"]').find('div').text();
- const total_amounts = $(tr).find('td[data-field="total_amounts"]').find('div').text();
- const month_amounts = $(tr).find('td[data-field="month_amounts"]').find('div').text();
- const total_invoiced = $(tr).find('td[data-field="total_invoiced"]').find('div').text();
- const month_opened = $(tr).find('td[data-field="month_opened"]').find('div').text();
- const estimated_invoice_amount = $(tr).find('td[data-field="estimated_invoice_amount"]').find('div').text();
- data.push({
- subject,
- total_amounts,
- month_amounts,
- total_invoiced,
- month_opened,
- estimated_invoice_amount
- });
- });
- return data;
- }
- setRole() {
- if (isAdmin === true) {
- return;
- }
- const tbRoot = $('#' + this.tableId);
- const bodyTrs = tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
- const headerTrs = tbRoot.next('.layui-table-view').find('.layui-table-header thead tr');
- const hideColumns = ['channel_amounts', 'channel_total_invoiced'];
- for (let col of hideColumns) {
- bodyTrs.each(function (i, tr) {
- $(tr).find('td[data-field="' + col + '"]').addClass('layui-hide');
- });
- headerTrs.each(function (i, tr) {
- $(tr).find('th[data-field="' + col + '"]').addClass('layui-hide');
- });
- }
- }
- }
- class BatchWorkflow extends TaskManager {
- constructor(prefix) {
- super();
- this.initializeGlobalTaskList();
- this.prefix = prefix; //mch/chan
- }
- getTaskType() {
- return 'batch_quota_' + 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(type, type_id) {
- const tasks = this.getPendingTasksByApprover();
- for (const task of tasks) {
- const updatedItems = task.data.items.filter(item =>
- !(item.type === type && item.type_id === type_id)
- );
- 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 ${type_id}`);
- return false;
- }
- }
- }
- return true;
- }
- }
- class BatchInvoice {
- constructor(type) {
- this.type = type;
- this.workflow = new BatchWorkflow(type);
- this.dv = 1; //数据版本,作用:由于需求变化导致存储的缓存数据格式发生变化,由该字段标记,审核的时候如果数据版本与当前dv版本不一致,需要手动作废审核重新操作。
- }
- lineData(targetRow) {
- let typeId = '', typeName = '';
- const type = this.type;
- if (type === 'mch') {
- typeId = 'mch_id';
- typeName = 'mch_name';
- } else {
- typeId = 'store_id';
- typeName = 'store_name';
- }
- const subject = targetRow.find('td[data-field="subject"]').find('div').text().trim();
- const type_id = targetRow.find(`td[data-field="${typeId}"]`).find('div').text().trim();
- const type_name = targetRow.find(`td[data-field="${typeName}"]`).find('div').text().trim();
- const amounts = targetRow.find('td[data-field="amounts"]').find('div').text().trim();
- const total_invoiced = targetRow.find('td[data-field="total_invoiced"]').find('div').text().trim();
- const invoice_date = targetRow.find('td[data-field="invoice_date"]').find('div').find('input').val().trim();
- const available_invoice_amount = targetRow.find('td[data-field="available_invoice_amount"]').find('div').text().trim();
- const actual_invoice_amount = targetRow.find('td[data-field="actual_invoice_amount"]').find('div').text().trim();
- const operator = targetRow.find('td[data-field="operator"]').find('div').text().trim();
- const remark = targetRow.find('td[data-field="remark"]').find('div').text().trim();
- return {
- type,
- subject,
- type_id,
- type_name,
- amounts,
- total_invoiced,
- invoice_date,
- available_invoice_amount,
- actual_invoice_amount,
- operator,
- remark
- };
- }
- doApplyOne(tableId, index) {
- const trs = $('#' + tableId).next('.layui-table-view').find('.layui-table-body tbody tr');
- const targetRow = trs.eq(index);
- const taskData = this.lineData(targetRow);
- if (!isNumeric(taskData.actual_invoice_amount)
- || taskData.actual_invoice_amount === '0') {
- showErr(`${taskData.type_name} 金额设置无效`);
- return;
- }
- if (!isValidDate(taskData.invoice_date)) {
- showErr(`${taskData.type_name} 开票日期 设置无效`);
- return;
- }
- if (taskData.operator === '') {
- showErr(`${taskData.type_name} 操作人 设置无效`);
- return;
- }
- this.doApply([taskData]);
- }
- doApplyMore(tableId) {
- const that = this;
- const trs = $('#' + tableId).next('.layui-table-view').find('.layui-table-body tbody tr');
- const taskDatas = [], errs = [];
- trs.each(function(i, targetRow) {
- const taskData = that.lineData($(targetRow));
- if (!isNumeric(taskData.actual_invoice_amount)
- || taskData.actual_invoice_amount === '0') {
- return;
- }
- if (!isValidDate(taskData.invoice_date)) {
- const err = `${taskData.type_name} 开票日期 设置错误`;
- if (!err.includes(err)) {
- err.push(err);
- }
- return;
- }
- if (taskData.operator === '') {
- const err = `${taskData.type_name} 操作人 设置错误`;
- if (!err.includes(err)) {
- err.push(err);
- }
- return;
- }
- taskDatas.push(taskData);
- });
- if (errs.length > 0) {
- showErr(errs.join('<br />'));
- return;
- }
- if (taskDatas.length === 0) {
- showErr('没有设置申请信息');
- return;
- }
- this.doApply(taskDatas);
- }
- async doApply(invoiceUnit) {
- const that = this;
- let errsNormal = [];
- await this.workflow.initializeGlobalTaskList();
- const pendingTasks = this.workflow.getPendingTasksByApprover();
- pendingTasks.forEach(taskItem => {
- const currItems = taskItem.data.items || [];
- currItems.forEach(currItem => {
- const isPending = invoiceUnit.find(invoiceItem => {
- return currItem.type === invoiceItem.type && currItem.type_id === invoiceItem.type_id;
- });
- if (isPending !== undefined) {
- const err = `${currItem.type_name} 存在处理中的开票申请,审核后才能再次申请`;
- if (!errsNormal.includes(err)) {
- errsNormal.push(err);
- }
- }
- });
- });
- if (errsNormal.length > 0) {
- showErr(errsNormal.join('<br />'));
- return;
- }
- const applyTrnasfer = () => {
- const sortedInvoiceUnit = sortByName(invoiceUnit, 'type_name');
- const title = that.type === 'mch' ? '机构名称' : '通道名称';
- layui.table.render({
- elem: '#tb_apply',
- data: sortedInvoiceUnit,
- limit: sortedInvoiceUnit.length,
- cols: [[
- {field: 'subject', title: '对应主体', width: 200},
- {field: 'type_name', title: title, width: 200},
- {field: 'actual_invoice_amount', title: '本次开票金额', width: 200},
- {field: 'invoice_date', title: '开票日期', width: 200},
- {field: 'operator', title: '操作人', width: 100},
- {field: 'remark', title: '备注', width: 200},
- ]],
- done: function (res, curr, count) {
- }
- });
- layer.open({
- type: 1,
- title: '开票确认',
- area: ['1150px', '500px'],
- content: $('#rechargeManual'),
- btn: ['确定', '取消'],
- success: function (layero) {
- },
- btn1: function () {
- layer.closeAll();
- const taskData = filterJsonFields(invoiceUnit, ["type", "subject", "type_id", "type_name", "amounts", "total_invoiced", "invoice_date", "available_invoice_amount", "actual_invoice_amount", "operator", "remark"]);
- const applyData = {
- items: taskData,
- dv: that.dv
- };
- that.workflow.addTask(applyData, systemUserName, 'admin')
- .then(succ => {
- if (succ === true) {
- showSuccess('已发起开票申请');
- } else {
- showErr('处理失败,请重试');
- }
- });
- },
- });
- };
- applyTrnasfer();
- }
- async doBatchInvoice() {
- const that = this;
- let sortedInvoiceUnit = [], worklist = [], invoiceUnit = [], paySum = 0, isCorrectVersion = true;
- const loadinvoiceUnit = async () => {
- await this.workflow.initializeGlobalTaskList();
- worklist = this.workflow.getPendingTasksByApprover();
- for (const task of worklist) {
- if (Number(task.data.dv) !== that.dv) {
- isCorrectVersion = false;
- break;
- }
- }
- invoiceUnit = this.workflow.getPendingTaskDetails();
- sortedInvoiceUnit = sortByName(invoiceUnit, 'type_name');
- };
- const loadIndex = layer.load(2, {shade: [0.2, '#000']});
- await loadinvoiceUnit();
- if (isCorrectVersion === false) {
- setTimeout(function() {
- showErr('数据与当前程序版本不匹配,请作废当前数据后重新加款');
- }, 500);
- }
- const title = that.type === 'mch' ? '机构名称' : '通道名称';
- layui.table.render({
- elem: '#tb_approve',
- data: sortedInvoiceUnit,
- limit: sortedInvoiceUnit.length,
- cols: [[
- {field: 'subject', title: '对应主体', width: 200},
- {field: 'type_name', title: title, width: 200},
- {field: 'actual_invoice_amount', title: '本次开票金额', width: 200},
- {field: 'invoice_date', title: '开票日期', width: 200},
- {field: 'operator', title: '操作人', width: 100},
- {field: 'remark', title: '备注', width: 200},
- {field: 'void_task', title: '', width: 100, templet: function(d){return '<button class="layui-btn layui-btn-sm layui-btn-primary task-void-btn" style="margin: 0" data-index="'+d.LAY_TABLE_INDEX+'">作废</button>';}}
- ]],
- done: function (res, curr, count) {
- const tbRoot = $('#tb_approve');
- 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(`确认作废 ${sortedInvoiceUnit[index].type_name} 的开票申请吗?`, {
- title: '提示',
- btn: ['确定', '取消']
- }, async (confirmIndex) => {
- const loadIndex = layer.load(2, {shade: [0.2, '#000']});
- await that.workflow.initializeGlobalTaskList();
- const succ = await that.workflow.invalidateItem(that.type, sortedInvoiceUnit[index].type_id);
- if (succ === true) {
- await loadinvoiceUnit();
- layui.table.reload('tb_approve', {
- data: sortedInvoiceUnit
- });
- } else {
- showErr('作废失败');
- }
- layer.close(loadIndex);
- layer.close(confirmIndex);
- });
- });
- };
- voidOneEvent();
- layer.close(loadIndex);
- }
- });
- layer.open({
- type: 1,
- title: '开票审核',
- area: ['1280px', '500px'],
- content: $('#rechargeManualApprove'),
- btn: ['批准', '作废'],
- success: function (layero) {
- },
- btn1: async function () {
- if (worklist.length === 0) {
- showErr('没有待审核的开票申请');
- return false;
- }
- if (isCorrectVersion === false) {
- showErr('数据与当前程序版本不匹配,请作废当前数据后重新加款');
- return false;
- }
- layer.load(2, {shade: [0.2, '#000']});
- let typeData = [], typeField = '';
- if (that.type === 'mch') {
- await dataHelper.loadMerchant();
- typeData = dataHelper.getMerchantList();
- typeData.forEach(tItem => {
- setEmptyFieldsToZero(tItem, ['total_invoiced', 'month_opened']);
- });
- typeField = 'mch_id';
- } else {
- await dataHelper.loadChannel();
- typeData = dataHelper.getChannelList();
- typeData.forEach(tItem => {
- setEmptyFieldsToZero(tItem, ['total_invoiced', 'month_opened']);
- });
- typeField = 'store_id';
- }
- const companyData = dataHelper.getCompanyList();
- for (const task of worklist) {
- await that.workflow.executeTask(task.id, async () => {
- const applyItems = task.data.items;
- applyItems.forEach(aItem => {
- if (aItem.type !== that.type) {
- console.error('数据错误', that.type, aItem);
- return;
- }
- const typeItem = typeData.find(tItem => tItem[typeField] === aItem.type_id);
- const total_invoiced = parseFloat(typeItem.total_invoiced) + parseFloat(aItem.actual_invoice_amount);
- const month_opened = parseFloat(typeItem.month_opened) + parseFloat(aItem.actual_invoice_amount);
- typeItem.total_invoiced = total_invoiced.toString();
- typeItem.last_invoice_date = aItem.invoice_date;
- typeItem.month_opened = month_opened.toString();
- const activeCompany = companyData.find(cItem => cItem.name === aItem.subject);
- if (activeCompany !== undefined) {
- const used_quota = parseFloat(activeCompany.used_quota) + parseFloat(aItem.actual_invoice_amount);
- activeCompany.used_quota = used_quota.toString();
- }
- });
- });
- }
- if (that.type === 'mch') {
- await dataHelper.updateAllData(CONSTANTS.KEY_QUOTA_MERCHANT, typeData);
- await merchantTable.renderTable();
- await dataHelper.updateAllData(CONSTANTS.KEY_QUOTA_COMPANY, companyData);
- companyTable.renderTable();
- renderSummaryTables();
- } else if (that.type === 'chan') {
- await dataHelper.updateAllData(CONSTANTS.KEY_QUOTA_CHANNEL, typeData);
- await channelTable.renderTable();
- renderSummaryTables();
- }
- layer.closeAll();
- },
- btn2: 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;
- }
- });
- }
- }
- class BatchCorrected {
- constructor() {
- this.workflow = new BatchWorkflow('company');
- this.dv = 1; //数据版本,作用:由于需求变化导致存储的缓存数据格式发生变化,由该字段标记,审核的时候如果数据版本与当前dv版本不一致,需要手动作废审核重新操作。
- }
- lineData(targetRow) {
- const name = targetRow.find('td[data-field="name"]').find('div').text().trim();
- const corrected_used_quota = targetRow.find('td[data-field="corrected_used_quota"]').find('div').text().trim();
- const operator = targetRow.find('td[data-field="operator"]').find('div').text().trim();
- const remark = targetRow.find('td[data-field="remark"]').find('div').text().trim();
- return {
- name,
- corrected_used_quota,
- operator,
- remark
- };
- }
- doApplyOne(tableId, index) {
- const trs = $('#' + tableId).next('.layui-table-view').find('.layui-table-body tbody tr');
- const targetRow = trs.eq(index);
- const taskData = this.lineData(targetRow);
- if (!isNumeric(taskData.corrected_used_quota)
- || taskData.corrected_used_quota === '0') {
- showErr(`${taskData.name} 矫正金额设置无效`);
- return;
- }
- if (taskData.operator === '') {
- showErr(`${taskData.name} 操作人 设置无效`);
- return;
- }
- this.doApply([taskData]);
- }
- doApplyMore(tableId) {
- const that = this;
- const trs = $('#' + tableId).next('.layui-table-view').find('.layui-table-body tbody tr');
- const taskDatas = [], errs = [];
- trs.each(function(i, targetRow) {
- const taskData = that.lineData($(targetRow));
- if (!isNumeric(taskData.corrected_used_quota)
- || taskData.corrected_used_quota === '0'
- || Number(taskData.corrected_used_quota) < 0) {
- return;
- }
- if (taskData.operator === '') {
- const err = `${taskData.type_name} 操作人 设置错误`;
- if (!err.includes(err)) {
- err.push(err);
- }
- return;
- }
- taskDatas.push(taskData);
- });
- if (errs.length > 0) {
- showErr(errs.join('<br />'));
- return;
- }
- if (taskDatas.length === 0) {
- showErr('没有设置矫正项');
- return;
- }
- this.doApply(taskDatas);
- }
- async doApply(companyUnit) {
- const that = this;
- let errsNormal = [];
- await this.workflow.initializeGlobalTaskList();
- const pendingTasks = this.workflow.getPendingTasksByApprover();
- pendingTasks.forEach(taskItem => {
- const currItems = taskItem.data.items || [];
- currItems.forEach(currItem => {
- const isPending = companyUnit.find(cItem => {
- return currItem.name === cItem.name;
- });
- if (isPending !== undefined) {
- const err = `${currItem.type_name} 存在处理中的矫正申请,审核后才能再次申请`;
- if (!errsNormal.includes(err)) {
- errsNormal.push(err);
- }
- }
- });
- });
- if (errsNormal.length > 0) {
- showErr(errsNormal.join('<br />'));
- return;
- }
- const applyTrnasfer = () => {
- const sortedCompanyUnit = sortByName(companyUnit, 'name');
- layui.table.render({
- elem: '#tb_apply',
- data: sortedCompanyUnit,
- limit: sortedCompanyUnit.length,
- cols: [[
- {field: 'name', title: '对应主体', width: 200},
- {field: 'corrected_used_quota', title: '矫正金额', width: 200},
- {field: 'operator', title: '操作人', width: 100},
- {field: 'remark', title: '备注', width: 200},
- ]],
- done: function (res, curr, count) {
- }
- });
- layer.open({
- type: 1,
- title: '已用额度矫正',
- area: ['1150px', '500px'],
- content: $('#rechargeManual'),
- btn: ['确定', '取消'],
- success: function (layero) {
- },
- btn1: function () {
- layer.closeAll();
- const taskData = filterJsonFields(companyUnit, ["name", "corrected_used_quota", "operator", "remark"]);
- const applyData = {
- items: taskData,
- dv: that.dv
- };
- that.workflow.addTask(applyData, systemUserName, 'admin')
- .then(succ => {
- if (succ === true) {
- showSuccess('已发起已用额度矫正申请');
- } else {
- showErr('处理失败,请重试');
- }
- });
- },
- });
- };
- applyTrnasfer();
- }
- async doBatchCorrected() {
- const that = this;
- let sortedCompanyUnit = [], worklist = [], companyUnit = [], isCorrectVersion = true;
- const loadCompanyUnit = async () => {
- await this.workflow.initializeGlobalTaskList();
- worklist = this.workflow.getPendingTasksByApprover();
- for (const task of worklist) {
- if (Number(task.data.dv) !== that.dv) {
- isCorrectVersion = false;
- break;
- }
- }
- companyUnit = this.workflow.getPendingTaskDetails();
- sortedCompanyUnit = sortByName(companyUnit, 'name');
- };
- const loadIndex = layer.load(2, {shade: [0.2, '#000']});
- await loadCompanyUnit();
- if (isCorrectVersion === false) {
- setTimeout(function() {
- showErr('数据与当前程序版本不匹配,请作废当前数据后重新加款');
- }, 500);
- }
- layui.table.render({
- elem: '#tb_approve',
- data: sortedCompanyUnit,
- limit: sortedCompanyUnit.length,
- cols: [[
- {field: 'name', title: '对应主体', width: 200},
- {field: 'corrected_used_quota', title: '矫正金额', width: 200},
- {field: 'operator', title: '操作人', width: 100},
- {field: 'remark', title: '备注', width: 200},
- {field: 'void_task', title: '', width: 100, templet: function(d){return '<button class="layui-btn layui-btn-sm layui-btn-primary task-void-btn" style="margin: 0" data-index="'+d.LAY_TABLE_INDEX+'">作废</button>';}}
- ]],
- done: function (res, curr, count) {
- const tbRoot = $('#tb_approve');
- 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(`确认作废 ${sortedCompanyUnit[index].name} 的矫正申请吗?`, {
- title: '提示',
- btn: ['确定', '取消']
- }, async (confirmIndex) => {
- const loadIndex = layer.load(2, {shade: [0.2, '#000']});
- await that.workflow.initializeGlobalTaskList();
- const succ = await that.workflow.invalidateItem(sortedCompanyUnit[index].name);
- if (succ === true) {
- await loadCompanyUnit();
- layui.table.reload('tb_approve', {
- data: sortedCompanyUnit
- });
- } else {
- showErr('作废失败');
- }
- layer.close(loadIndex);
- layer.close(confirmIndex);
- });
- });
- };
- voidOneEvent();
- layer.close(loadIndex);
- }
- });
- layer.open({
- type: 1,
- title: '已用额度矫正审核',
- area: ['1280px', '500px'],
- content: $('#rechargeManualApprove'),
- btn: ['批准', '作废'],
- success: function (layero) {
- },
- btn1: async function () {
- if (worklist.length === 0) {
- showErr('没有待审核的矫正申请');
- return false;
- }
- if (isCorrectVersion === false) {
- showErr('数据与当前程序版本不匹配,请作废当前数据后重新加款');
- return false;
- }
- layer.load(2, {shade: [0.2, '#000']});
- await dataHelper.loadComapny();
- const companyData = dataHelper.getCompanyList();
- for (const task of worklist) {
- await that.workflow.executeTask(task.id, async () => {
- const applyItems = task.data.items;
- applyItems.forEach(aItem => {
- const activeCompany = companyData.find(cItem => cItem.name === aItem.name);
- const used_quota = parseFloat(activeCompany.used_quota) + parseFloat(aItem.corrected_used_quota);
- activeCompany.used_quota = used_quota.toString();
- });
- });
- }
- await dataHelper.updateAllData(CONSTANTS.KEY_QUOTA_COMPANY, companyData);
- companyTable.renderTable();
- renderSummaryTables();
- layer.closeAll();
- },
- btn2: 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;
- }
- });
- }
- }
- function loadMsgBadge () {
- const companyWorkflow = new BatchWorkflow('company');
- const mchWorkflow = new BatchWorkflow('mch');
- const chanWorkflow = new BatchWorkflow('chan');
- const companyBadge = $('#badge-approve-company');
- companyBadge.hide();
- const mchBadge = $('#badge-approve-mch');
- mchBadge.hide();
- const chanBadge = $('#badge-approve-chan');
- chanBadge.hide();
- const refreshApprovalMessage = async () => {
- await companyWorkflow.initializeGlobalTaskList();
- const comMsg = companyWorkflow.getPendingTaskDetails();
- const comNum = comMsg.length || 0;
- companyBadge.html(comNum);
- if (comNum === 0) {
- companyBadge.hide();
- } else {
- companyBadge.show();
- }
- await mchWorkflow.initializeGlobalTaskList();
- const mchMsg = mchWorkflow.getPendingTaskDetails();
- const mchNum = mchMsg.length || 0;
- mchBadge.html(mchNum);
- if (mchNum === 0) {
- mchBadge.hide();
- } else {
- mchBadge.show();
- }
- await chanWorkflow.initializeGlobalTaskList();
- const chanMsg = chanWorkflow.getPendingTaskDetails();
- const chanNum = chanMsg.length || 0;
- chanBadge.html(chanNum);
- if (chanNum === 0) {
- chanBadge.hide();
- } else {
- chanBadge.show();
- }
- }
- refreshApprovalMessage();
- }
- loadMsgBadge();
- $('#btn_refresh_approve').on('click', function() {
- if (systemUserName !== 'admin') {
- showErr('您不是管理员,无审核权限');
- return;
- }
- loadMsgBadge();
- });
- function setTableColVal(tableId, col, val) { //对整列设置值
- 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);
- }
- });
- }
- async function conditionSet() {
- const conditionList = dataHelper.getConditionList();
- if (conditionList.length === 0) {
- const month = getCurrentMonth();
- const condition = {
- month
- };
- await dataHelper.addOrUpdateData(CONSTANTS.KEY_QUOTA_CONDITION, condition, 0);
- }
- }
- function getCurrMonthCondition() {
- const conditionList = dataHelper.getConditionList();
- const condition = conditionList[0];
- return condition.month;
- }
- function renderSummaryTables() {
- let $tables = $('#summary-tables');
- $tables.html('');
- const summarys = dataHelper.getSummaryList();
- summarys.forEach(function(item, index) {
- const subject = filterSubjectPrefix(item.subject);
- $tables.append(`<div class="summary-tables-subject">${subject}</div>`);
- const tableId = `tb-summary${item.subject}`;
- $tables.append(`<table class="layui-hide" id="${tableId}"></table>`);
- const summaryTable = new SummaryTable(tableId, item.subject);
- summaryTable.renderTable();
- });
- }
- async function initPage() {
- const loadIndex = layer.load(2, {shade: [0.2, '#000']});
- await dataHelper.loadComapny();
- await dataHelper.loadMerchant();
- await dataHelper.loadChannel();
- await dataHelper.loadSummary();
- await dataHelper.loadCondition();
- await conditionSet();
- const currMonth = getCurrMonthCondition();
- $('#query_month').val(currMonth);
- companyTable.renderTable();
- await merchantTable.renderTable();
- await channelTable.renderTable();
- renderSummaryTables();
- //UI回调事件
- app.on('updateCompany', () => {
- companyTable.renderTable();
- renderSummaryTables();
- });
- app.on('updateMerchant', async () => {
- await merchantTable.renderTable();
- renderSummaryTables();
- });
- app.on('updateChannel', async () => {
- await channelTable.renderTable();
- renderSummaryTables();
- });
- app.on('updateSummary', async () => {
- renderSummaryTables();
- });
- loadMsgBadge();
- renderSummaryTables();
- layer.close(loadIndex);
- }
- const batchMchInvoice = new BatchInvoice('mch');
- const batchChanInvoice = new BatchInvoice('chan');
- const batchCorrected = new BatchCorrected();
- const companyTable = new CompanyTable();
- const merchantTable = new MerchantTable();
- const channelTable = new ChannelTable();
- $('.ac-approve').on('click', function () {
- if (systemUserName !== 'admin') {
- showErr('您不是管理员,无审核权限');
- return;
- }
- const tableId = $(this).data('table');
- if (tableId === 'tb-merchant') {
- batchMchInvoice.doBatchInvoice();
- } else if (tableId === 'tb-channel') {
- batchChanInvoice.doBatchInvoice();
- } else if (tableId === 'tb-company') {
- batchCorrected.doBatchCorrected();
- }
- });
- $('.ac-batch-invoice').on('click', function () {
- const tableId = $(this).data('table');
- if (tableId === 'tb-merchant') {
- batchMchInvoice.doApplyMore(tableId);
- } else if (tableId === 'tb-channel') {
- batchChanInvoice.doApplyMore(tableId);
- } else if (tableId === 'tb-company') {
- batchCorrected.doApplyMore(tableId);
- }
- });
- $('.reset-col').on('click', async function () {
- const loadIndex = layer.load(2, {shade: [0.2, '#000']});
- const tableId = $(this).data('table');
- const col = $(this).data('col');
- setTableColVal(tableId, col, '0');
- const activeData = () => {
- const data = [];
- const trs = $('#' + tableId).next('.layui-table-view').find('.layui-table-body tbody tr');
- trs.each(function (i, tr) {
- let typeIdField = '';
- if (tableId === 'tb-merchant') {
- typeIdField = 'mch_id';
- } else if (tableId === 'tb-channel') {
- typeIdField = 'store_id';
- }
- const type_id = $(tr).find('td[data-field="' + typeIdField + '"]').find('div').text();
- data.push({
- type_id
- });
- });
- return data;
- };
- const updateMerchant = async (field) => {
- const activeList = activeData();
- const companyReduce = {};
- const merchantList = dataHelper.getMerchantList();
- merchantList.forEach(item => {
- const ac = activeList.find(aItem => aItem.type_id === item.mch_id);
- if (ac !== undefined) {
- if (!companyReduce[item.subject]) {
- companyReduce[item.subject] = 0;
- }
- companyReduce[item.subject] += parseFloat(item.month_opened);
- item[field] = '0';
- }
- })
- await dataHelper.updateAllData(CONSTANTS.KEY_QUOTA_MERCHANT, merchantList);
- if (field === 'month_opened') {
- const companyList = dataHelper.getCompanyList();
- companyList.forEach(item => {
- if (companyReduce[item.name] !== undefined) {
- const used_quota_up = parseFloat(item.used_quota) - companyReduce[item.name];
- item.used_quota = used_quota_up.toString();
- }
- });
- await dataHelper.updateAllData(CONSTANTS.KEY_QUOTA_COMPANY, companyList);
- }
- await merchantTable.renderTable();
- companyTable.renderTable();
- renderSummaryTables();
- };
- const updateChannel = async (field) => {
- const activeList = activeData();
- const channelList = dataHelper.getChannelList();
- channelList.forEach(item => {
- const ac = activeList.find(aItem => aItem.type_id === item.store_id);
- if (ac !== undefined) {
- item[field] = '0';
- }
- })
- await dataHelper.updateAllData(CONSTANTS.KEY_QUOTA_CHANNEL, channelList);
- await channelTable.renderTable();
- renderSummaryTables();
- };
- if (col === 'actual_invoice_amount') {
- layer.close(loadIndex);
- return;
- }
- if (tableId === 'tb-merchant') {
- await updateMerchant(col);
- } else if (tableId === 'tb-channel') {
- await updateChannel(col);
- }
- layer.close(loadIndex);
- });
- $('#btn-update-all').on('click', function (){
- initPage();
- });
- if (isAdmin === false) {
- $('.reset-bar button:first-child').hide();
- $('.reset-bar button:nth-child(2)').hide();
- $('.reset-bar button:nth-child(3)').css('margin-left', '750px');
- $('.reset-bar button:nth-child(4)').css('margin-left', '150px');
- $('.ac-approve').css('display', 'none');
- } else {
- $('.reset-bar button:first-child').css('margin-left', '745px');
- $('.reset-bar button:nth-child(2)').css('margin-left', '150px');
- $('.reset-bar button:nth-child(3)').css('margin-left', '300px');
- $('.reset-bar button:nth-child(4)').css({
- 'margin-left': '75px',
- 'display': 'inline-block'
- });
- }
- const tMonth = getCurrentMonth();
- laydate.render({
- elem: '#query_month',
- type: 'month',
- trigger: 'click',
- max: tMonth,
- done: async function (value, date, endDate) {
- const condition = {
- month: value
- };
- await dataHelper.updateAllData(CONSTANTS.KEY_QUOTA_CONDITION, [condition]);
- await initPage();
- }
- });
- initPage();
- });
- </script>
|