From 7298d5354963a88643a543b51b90192dc9fc934c Mon Sep 17 00:00:00 2001 From: doum <doum> Date: 星期四, 11 九月 2025 18:43:14 +0800 Subject: [PATCH] 最新版本541200007 --- screen/src/views/LogisticsCenter.vue | 2239 +++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 1,415 insertions(+), 824 deletions(-) diff --git a/screen/src/views/LogisticsCenter.vue b/screen/src/views/LogisticsCenter.vue index cd1d5e6..54ad031 100644 --- a/screen/src/views/LogisticsCenter.vue +++ b/screen/src/views/LogisticsCenter.vue @@ -3,8 +3,8 @@ <div class="main_app"> <img src="@/assets/images/LogisticsCenter/bg@2x.png" class="main_bg" alt="" /> <div class="main_header"> - <!-- <img src="@/assets/images/maintitle.gif" class="main_header_bg" alt="" /> --> - <div class="title">鍏ㄧ渷鐗╂祦鍦ㄩ��</div> + <img src="@/assets/images/maintitle.gif" class="main_header_bg" alt="" /> + <div class="title">瀹夊窘涓儫鏁版櫤鎴愬搧绠℃帶</div> <div class="time_wrap"> <span class="date">{{ date }}</span> <span class="week">{{ week }}</span> @@ -21,35 +21,65 @@ <img src="@/assets/images/title@2x.png" class="bg" alt="" /> </div> <div class="left_box_one"> + <Loading v-if="loading1" /> <div class="second_title"> <div class="title"> <img src="@/assets/images/LogisticsCenter/ic_title@2x.png" class="icon" alt="" /> - <div>鏈勾绱鍑哄簱閲�</div> + <div>绱鍑哄簱閲�(绠�)</div> + <div class="question"> + <img src="@/assets/images/ic_question@2x.png" style="margin-left: 6px;" class="icon" alt=""> + <div class="hover_wrap"> + <div class="triangle"></div> + <div class="title">绱鍑哄簱閲忕粺璁¤鏄庯細</div> + <div>绱鍑哄簱閲忥細鎵�鏈夌墿娴佸嚭搴撲綔涓氭暟鎹紙鍖呭惈鑱旇惀鍔犲伐锛堝洖杩愩�佽惤鍦伴攢鍞級銆佸墠缃簱绉诲簱(鎴愰兘/涓存矀)绛夋墍鏈夊嚭搴撲綔涓氭暟鎹級</div> + </div> + </div> </div> <div class="tabs"> - <div class="tab" :class="{ active: activeTab1 == 0 }" @click="tab1Click(0)">鏈懆</div> + <div class="tab" :class="{ active: activeTab1 == 1 }" @click="tab1Click(1)">鏈懆</div> <div class="separate"></div> - <div class="tab" :class="{ active: activeTab1 == 1 }" @click="tab1Click(1)">鏈湀</div> + <div class="tab" :class="{ active: activeTab1 == 0 }" @click="tab1Click(0)">鏈湀</div> <div class="separate"></div> <div class="tab" :class="{ active: activeTab1 == 2 }" @click="tab1Click(2)">鏈勾</div> </div> </div> <div class="content_wrap"> <div class="num_wrap"> - <div class="num_list" v-if="cneterData.yearOutTotal"> - <div class="num" v-for="i in cneterData.yearOutTotal + ''"> - {{ i }} - <img class="bg" src="@/assets/images/LogisticsCenter/bg_number@2x.png" alt=""> + <div class="question1"> + <div class="hover_con"> + <div class="num_list" v-if="StockOutData.currentNum || StockOutData.currentNum == 0"> + <div class="num" v-for="i in StockOutData.currentNum + ''"> + {{ i }} + <img class="bg" src="@/assets/images/LogisticsCenter/bg_number@2x.png" alt=""> + </div> + </div> + <div class="hover_wrap"> + <div class="triangle"></div> + <div class="title" v-if="StockOutData.currentProvinceNum || StockOutData.currentProvinceNum == 0"> + 璋冩嫧鍑哄簱閲忥細{{ StockOutData.currentProvinceNum.toFixed(0) }}绠�</div> + <div class="title" v-if="StockOutData.currentOtherNum || StockOutData.currentOtherNum == 0"> + 鍏朵粬鍑哄簱閲忥細{{ StockOutData.currentOtherNum.toFixed(0) }}绠�</div> + </div> </div> + </div> - <div class="content"> + <div class="content" v-if="false"> <div class="unit_wrap"> <span class="la">鍚屾瘮</span> - <img src="@/assets/images/ic_up.png" class="icon" alt=""> - <span v-if="cneterData.yearOutTotalOnYear || cneterData.yearOutTotalOnYear == 0">{{ - cneterData.yearOutTotalOnYear }} %</span> - <span class="la" style="margin-left: 30px;margin-right: 10px;">绱鍑哄簱杞︽</span> - <span>{{ cneterData.yearOutTimes || '' }}</span> + <template v-if="StockOutData.sameOutNum"> + <img v-if="StockOutData.currentOutNum >= StockOutData.sameOutNum" src="@/assets/images/ic_up.png" + class="icon" alt=""> + <img v-else src="@/assets/images/ic_down.webp" class="icon" alt=""> + </template> + <span v-if="StockOutData.sameOutNum">{{ Math.abs((((StockOutData.currentOutNum + - + StockOutData.sameOutNum) / + StockOutData.sameOutNum) + * 100).toFixed(2)) }}%</span> + <span v-else style="margin-left: 6px;">-</span> + <span v-if="StockOutData.totalCarNum" class="la" + style="margin-left: 30px;margin-right: 10px;">绱鍑哄簱杞︽</span> + <span>{{ StockOutData.totalCarNum || '' }}</span> </div> </div> @@ -57,10 +87,10 @@ <div class="echart_wrap"> <div class="echart1" id="echart1"></div> <div class="list"> - <div class="item" v-for="item, i in StockOutData" :key="i"> + <div class="item" v-for="item, i in StockOutData.arr" :key="i"> <div :style="{ background: colors[i] }" class="icon"></div> <div class="text">{{ item.name }}</div> - <div class="num">{{ item.value }}</div> + <div class="num">{{ item.rate }}</div> </div> </div> </div> @@ -81,7 +111,7 @@ <div class="second_title"> <div class="title"> <img src="@/assets/images/LogisticsCenter/ic_title@2x.png" class="icon" alt="" /> - <div>褰撳墠杩愯緭浠诲姟</div> + <div>褰撳墠璁㈠崟浠诲姟</div> </div> <div class="search_wrap"> <img src="@/assets/images/LogisticsCenter/ic_search@2x.png" alt=""> @@ -92,23 +122,29 @@ </div> <div class="list_wrap"> <div class="header line"> - <span class="item">杩愯緭杞﹁締</span> - <span class="item">鐘舵��</span> - <span class="item">浣嶇疆</span> + <span class="item">鍚堝悓鍙�</span> + <span class="item status">璁㈠崟鐘舵��</span> + <span class="item">鐩殑鍦�</span> <span class="item">浠诲姟涓嬭揪鏃堕棿</span> </div> <div class="one-swiper list"> <div class="swiper-wrapper"> - <div class="line one-swiper-slide swiper-slide item" @click="taskClick(item)" + <div :class="{ avtive: modalInfo.contractNumber == item.contractNumber }" + class="line one-swiper-slide swiper-slide item" @click="taskClick(item)" v-for="(item, i) in transportTask" :key="i"> - <span class="item">{{ item.carNo }}</span> - <span class="item">{{ item.statusStr }}</span> - <span class="item">{{ item.address }}</span> - <span class="item">{{ item.taskDate }}</span> + <span class="item">{{ item.contractNumber }}</span> + <span class="item status">{{ item.statusDesc }}</span> + <span class="item">{{ item.receiveEnterprise }}</span> + <span class="item">{{ item.createDate || '-' }}</span> </div> </div> </div> - + <template v-if="isLoadingTask || transportTask.length == 0"> + <Loading v-if="isLoadingTask" /> + <div class="empty" v-else> + <img src="@/assets/images/default_nodata.png" alt=""> + </div> + </template> </div> </div> </div> @@ -118,6 +154,17 @@ <div class="left"> <img src="@/assets/images/ic_title@2x.png" class="icon" alt="" /> <span>鍑哄簱鑳藉姏</span> + <div class="question"> + <img src="@/assets/images/ic_question@2x.png" style="margin-left: 4px;" class="icon" alt=""> + <div class="hover_wrap"> + <div class="triangle"></div> + <div class="title">鍑哄簱鑳藉姏缁熻璇存槑锛�</div> + <div>1銆佸綋鍓嶈鍗曢噺锛氭埅鑷崇洰鍓嶆湭閰嶈浇鐨勮鍗曢噺</div> + <div>2銆佸綋鍓嶄换鍔¢噺锛氭墍鏈夊凡涓嬭揪杩愯緭涓旀湭鍑哄簱鐨勪换鍔¢噺锛氭埅姝㈢洰鍓嶅凡閰嶈浇鏈嚭搴�+鏃犻渶閰嶈浇鐨勪换鍔�(鍚屽煄浠诲姟閲�)</div> + <div>3銆佷粖鏃ュ嚭搴撻噺锛氫粖鏃ュ疄闄呭嚭搴撻噺锛氫互鐢靛瓙閿佷笂閿佷负鍑�</div> + <div>4銆佸墿浣欎换鍔¢噺锛氭暟鎹悓褰撳墠浠诲姟閲忥紙寮圭獥鍒嗗埆灞曠ず鍚屽簱鍜岃繍杈撲换鍔¢噺</div> + </div> + </div> </div> <div class="right"> <img @click="showPro = !showPro" src="@/assets/images/LogisticsCenter/position.png" class="posi" alt=""> @@ -132,69 +179,149 @@ <div class="item"> <img src="@/assets/images/LogisticsCenter/ic_jinrijihua@2x.png" alt=""> <div class="content"> - <div class="name">褰撴棩璁㈠崟閲�</div> - <div class="num"><span class="blue">{{ cneterData.outPlanTotal }}</span>涓囨敮</div> + <div class="name">褰撳墠璁㈠崟閲�</div> + <div class="num"><span class="blue" + v-if="cneterData.currentOrderNum || cneterData.currentOrderNum == 0">{{ + cneterData.currentOrderNum }}</span>绠�</div> </div> </div> <div class="item"> <img src="@/assets/images/LogisticsCenter/ic_jinrijihua@2.png" alt=""> <div class="content"> - <div class="name">褰撴棩璁″垝閲�</div> - <div class="num"><span>{{ cneterData.outPlanTotal }}</span>涓囨敮</div> - <div class="unit">杞︽锛歿{ cneterData.outPlanTimes }}</div> + <div class="name">褰撳墠浠诲姟閲�</div> + <div class="num"><span v-if="cneterData.currentPlanNum || cneterData.currentPlanNum == 0">{{ + cneterData.currentPlanNum }}</span>绠�</div> + <div class="unit">杞︽锛歿{ cneterData.currentPlanCarNum }}</div> </div> </div> <div class="item"> <img src="@/assets/images/LogisticsCenter/ic_jinrichuku@2x.png" alt=""> <div class="content"> <div class="name">浠婃棩鍑哄簱閲�</div> - <div class="num" v-if="cneterData.outPlanTotal && cneterData.outTotal"><span class="finish">{{ - cneterData.outPlanTotal - cneterData.outTotal }}</span>涓囨敮</div> - <div class="unit" v-if="cneterData.outPlanTotal && cneterData.outTotal">杞︽锛歿{ cneterData.outPlanTimes - - - cneterData.outTimes }}</div> + <div class="num"><span v-if="cneterData.crrentOutNum || cneterData.crrentOutNum == 0" + class="finish">{{ + cneterData.crrentOutNum }}</span>绠�</div> + <div class="unit">杞︽锛歿{ cneterData.crrentOutCarNum }}</div> </div> </div> - <div class="item"> - <img src="@/assets/images/LogisticsCenter/ic_jinriweichu@2x.png" alt=""> - <div class="content"> - <div class="name">鍓╀綑浠诲姟閲�</div> - <div class="num" v-if="cneterData.outPlanTotal && cneterData.outTotal"><span class="today">{{ - cneterData.outPlanTotal - cneterData.outTotal }}</span>涓囨敮</div> - <div class="unit" v-if="cneterData.outPlanTotal && cneterData.outTotal">杞︽锛歿{ cneterData.outPlanTimes - - - cneterData.outTimes }}</div> + <div class="tooltip_wrap"> + <div class="item"> + <img src="@/assets/images/LogisticsCenter/ic_jinriweichu@2x.png" alt=""> + <div class="content"> + <div class="name">鍓╀綑浠诲姟閲�</div> + <div class="num"><span v-if="cneterData.crrentRestNum || cneterData.crrentRestNum == 0" + class="today">{{ + cneterData.crrentRestNum }}</span>绠�</div> + <div class="unit">杞︽锛歿{ cneterData.crrentRestCarNum }}</div> + </div> + </div> + <div class="tooltip"> + <div class="triangle"></div> + <div>杩愯緭浠诲姟閲忥細{{ cneterData.needTransportOrderNum }}绠�</div> + <div>鍚屽煄鍏卞簱浠诲姟閲忥細{{ cneterData.noNeedTransportOrderNum }}绠�</div> </div> </div> </div> <div class="footer"> <div class="wrap"> - <div class="content"> + <div class="content" :style='{ width: cneterData.level1 }'> <div class="scale">0</div> - <div class="box"> - <div class="tag"> - <div class="icon"></div> - <span>浠婃棩鍑哄簱</span> + <!-- <div class="node"> + <div>8h</div> + <div class="node_icon"> + <div class="icon icon1"></div> + <div class="icon icon2"></div> + </div> + </div> --> + <div :style="{ width: cneterData.level3 }" + :class="{ box23: cneterData.crrentOutNum >= cneterData.hoursAbility }" class="box"> + <div class="tooltip_wrap"> + <div v-if="cneterData.crrentOutNum < cneterData.hoursAbility" class="tag"> + <div class="icon"></div> + <span>浠婃棩鍑哄簱</span> + </div> + <div class="tooltip"> + <div class="triangle"></div>浠婃棩鍑哄簱閲忥細{{ cneterData.crrentOutNum }}绠� + </div> </div> </div> - <div class="box box1"> - <div class="tag tag1"> - <div class="icon"></div> - <span>褰撴棩璁″垝</span> + <div :style="{ width: cneterData.level2 }" class="box box1"> + <div class="tooltip_wrap"> + <div v-if="cneterData.hoursAbility >= cneterData.currentPlanNum" class="tag tag1"> + <div class="icon"></div> + <span>褰撳墠浠诲姟</span> + </div> + <div class="tooltip"> + <div class="triangle"></div>褰撳墠浠诲姟閲忥細{{ cneterData.currentPlanNum }}绠� + </div> </div> </div> </div> <div class="side"> - <div class="box"></div> - <div class="scale" style="left: -12px;">8h</div> - <div class="scale scale1">鏈�澶�</div> + <div v-if="cneterData.crrentOutNum >= cneterData.hoursAbility" :style="{ width: cneterData.level33 }" + class="box box22"> + <div class="tooltip_wrap"> + <div class="tag"> + <div class="icon"></div> + <span>浠婃棩鍑哄簱</span> + </div> + <div class="tooltip"> + <div class="triangle"></div>浠婃棩鍑哄簱閲忥細{{ cneterData.crrentOutNum }}绠� + </div> + </div> + </div> + <div v-if="cneterData.hoursAbility <= cneterData.currentPlanNum" + :style="{ width: cneterData.level22 }" class="box box1 box11"> + <div class="tooltip_wrap"> + <div class="tag tag1"> + <div class="icon"></div> + <span>褰撳墠浠诲姟</span> + </div> + <div class="tooltip"> + <div class="triangle"></div>褰撳墠浠诲姟閲忥細{{ cneterData.currentPlanNum }}绠� + </div> + </div> + </div> + <!-- <div class="box"></div> --> + <div class="scale" style="left: -12px;"> + <div class="tooltip_wrap"> + <span>8h</span> + <div class="tooltip"> + <div class="triangle"></div>8灏忔椂鍑哄簱鑳藉姏锛歿{ cneterData.hoursAbility }}绠� + </div> + </div> + </div> + <div class="scale scale1"> + <div class="tooltip_wrap"> + <span>鏈�澶�</span> + <div class="tooltip"> + <div class="triangle"></div>鏈�澶у嚭搴撹兘鍔涳細{{ cneterData.maxAbility }}绠� + </div> + </div> + </div> </div> </div> </div> </div> <div class="center_box_two"> <div class="echart_map" ref="mapEchart" id="echart_map"></div> - <div class="list"> + <div v-if="showModal1" class="modal1"> + <div class="content"> + <div class="head line"> + <div class="item">杞︾墝鍙�</div> + <div class="item">鍚堝悓鍙�</div> + <div class="item addr">鐩殑鍦�</div> + </div> + <div class="list"> + <div class="line" v-for="item in active1List"> + <div class="item">{{ item.platNumber }}</div> + <div class="item">{{ item.contractNumber }}</div> + <div class="item addr">{{ item.repertotyName }}</div> + </div> + </div> + </div> + </div> + <!-- <div class="list"> <div class="item"> <div class="icon"></div> <div class="text">鍑哄簱閲�10w浠ヤ笂</div> @@ -211,7 +338,7 @@ <div class="icon icon4"></div> <div class="text">鍑哄簱閲�2w浠ヤ笅</div> </div> - </div> + </div> --> </div> </div> <div class="right_box"> @@ -226,9 +353,14 @@ <div class="second_title"> <div class="title"> <img src="@/assets/images/LogisticsCenter/ic_title@2x.png" class="icon" alt="" /> - <div>搴撳瓨鍒╃敤鐜�</div> + <div>浠撳簱璧勬簮鍒╃敤鐜�</div> </div> - <div class="side">鍏ㄧ渷锛�<span>100<span class="unit">涓囨敮 |</span> 40.6%</span></div> + <div class="side"> + 鍏ㄧ渷锛� + <span>{{ data5.currentNum }}</span> + <span class="unit">绠� | </span> + <span v-if="data5.totalNum">{{ ((data5.currentNum / data5.totalNum) * 100).toFixed(1) }}%</span> + </div> </div> <div class="echart5_wrap"> <div class="echart5" id="echart5"></div> @@ -240,7 +372,12 @@ <img src="@/assets/images/LogisticsCenter/ic_title@2x.png" class="icon" alt="" /> <div>鍑哄簱鑳藉姏鍒╃敤鐜�</div> </div> - <div class="side">鍏ㄧ渷锛�<span>100<span class="unit">涓囨敮 |</span> 40.6%</span></div> + <div class="side"> + 鍏ㄧ渷锛� + <span>{{ data6.currentNum }}</span> + <span class="unit">绠� | </span> + <span v-if="data6.totalNum">{{ ((data6.currentNum / data6.totalNum) * 100).toFixed(1) }}%</span> + </div> </div> <div class="echart5_wrap"> <div class="echart5" id="echart6"></div> @@ -250,9 +387,14 @@ <div class="second_title"> <div class="title"> <img src="@/assets/images/LogisticsCenter/ic_title@2x.png" class="icon" alt="" /> - <div>杩愮敤璧勬簮鍒╃敤鐜�</div> + <div>杩愬姏璧勬簮鍒╃敤鐜�</div> </div> - <div class="side">鍏ㄧ渷锛�<span>100<span class="unit">涓囨敮 |</span> 40.6%</span></div> + <div class="side"> + 鍏ㄧ渷锛� + <span>{{ data7.currentNum }}</span> + <span class="unit">杈� | </span> + <span v-if="data7.totalNum">{{ (data7.useRate * 100).toFixed(1) }}%</span> + </div> </div> <div class="echart5_wrap"> <div class="echart5" id="echart7"></div> @@ -263,72 +405,103 @@ <!-- --> <div class="modal_wrap" v-if="showModal"> <div class="title_head"> - <img src="@/assets/images/energy_ef/chuku_ic_car@2x.png" alt=""> - <span>鐨朼222</span> + <div class="left"> + <img src="@/assets/images/LogisticsCenter/ic_hetong.png" alt=""> + <span>鍚堝悓鍙凤細{{ modalInfo.contractNumber }}</span> + </div> + <div class="tit_status">{{ modalInfo.orderStatusDesc }}</div> + </div> + <div v-if="modalInfo.overStock && modalInfo.overStock == 1" class="stock"> + <img src="@/assets/images/LogisticsCenter/ic_tips@2x.png" alt=""> + <span>鍥犲簱瀛樹笉瓒筹紝璁㈠崟鏆傛椂鏃犳硶閰嶈浇</span> </div> <div class="info"> <div class="item"> <div class="dian"></div> - <div class="la">杩愯緭鍗曞彿锛�</div> - <div class="val">471342</div> - </div> - <div class="item"> - <div class="dian"></div> <div class="la">鍙告満淇℃伅锛�</div> - <div class="val">瀛欐枃姝� 17493932936</div> + <div class="val">{{ modalInfo.driverName }} {{ modalInfo.driverTel }}</div> </div> <div class="item"> <div class="dian"></div> - <div class="la">鎬昏繍杈撻噺锛�</div> - <div class="val">22涓囨敮</div> + <div class="la">杞︾墝鍙凤細</div> + <div class="val">{{ modalInfo.plateName }}</div> </div> <div class="item"> <div class="dian"></div> - <div class="la">褰撳墠浣嶇疆锛�</div> - <div class="val">瀹夊窘鐪佸悎鑲ュ競鍖呮渤鍖虹箒鍗庡ぇ閬�123绫冲</div> - </div> - </div> - <div class="tabs"> - <div :class="{ active: modalTab == 0 }" @click="modalTabClick(0)" class="tab">鍚堝悓1:1231231</div> - <div :class="{ active: modalTab == 1 }" @click="modalTabClick(1)" class="tab">鍚堝悓2:1231231</div> - </div> - <div class="ht_info"> - <div class="item"> - <div class="la">鍙戣揣浠撳簱锛�</div> - <div class="val">鑺滄箹鎴愬搧</div> + <div class="la">鍙戣揣鍦扮偣锛�</div> + <div class="val">{{ modalInfo.deliveryEnterprise }}</div> </div> <div class="item"> - <div class="la">棰勮鍒拌揪锛�</div> - <div class="val">2024-12-04 14:00</div> - </div> - <div class="item"> + <div class="dian"></div> <div class="la">鍒拌揣鍦扮偣锛�</div> - <div class="val">姹熼棬鐑熻崏鐗╂祦閰嶉�佷腑蹇�</div> + <div class="val">{{ modalInfo.receiveEnterprise }}</div> </div> <div class="item"> - <div class="la">杩愯緭閲忥細</div> - <div class="val">300涓囨敮</div> + <div class="dian"></div> + <div class="la">杞﹁締浣嶇疆锛�</div> + <div class="val">{{ modalInfo.position || '-' }}</div> + </div> + <div class="item"> + <div class="dian"></div> + <div class="la">棰勮鍒拌揪锛�</div> + <div class="val" v-if="modalInfo.plannedArrivedDate">{{ modalInfo.plannedArrivedDate.slice(0, 11) }}</div> </div> </div> - <div class="tab1"> - <div class="title"> + <div class="logistics_wrap"> + <div class="m_title"> <img src="@/assets/images/LogisticsCenter/ic_title@2x.png" alt=""> <span>鐗╂祦淇℃伅</span> </div> - <div class="item" v-for="item, i in 3"> - <div class="icon_wrap"> - <img v-if="i !== 0" class="dian" src="@/assets/images/ic_dangqian@2x.png" alt=""> - <img v-else src="@/assets/images/ic_jindu@2x.png" class="dian_ac" alt=""> - <div class="line"></div> - </div> - <div class="content"> - <div class="status">杞﹁締鍚繍-鐢靛瓙閿佹皵杩�</div> - <div class="time">2024-04-02 12:00</div> + <div id="map-container" ref="mapContainer"></div> + <div class="fu_list"> + <div class="fu_item" v-for="item, k in modalInfo.cicleStatusList"> + <view v-if="k != modalInfo.cicleStatusList.length - 1" class="separate"></view> + <div class="item_title"> + <div class="icon"> + <img v-if="item.key == 0 && k != 0" src="@/assets/images/LogisticsCenter/ic_dingdan@2x.png" + class="icon"></img> + <img v-if="item.key == 0 && k == 0" src="@/assets/images/LogisticsCenter/ic_dingdan_sel@2x.png" + class="icon"></img> + <img v-if="item.key == 1 && k != 0" src="@/assets/images/LogisticsCenter/ic_peizai@2x.png" + class="icon"></img> + <img v-if="item.key == 1 && k == 0" src="@/assets/images/LogisticsCenter/ic_peizai_sel@2x.png" + class="icon"></img> + <img v-if="item.key == 2 && k != 0" src="@/assets/images/LogisticsCenter/ic_cangku@2x.png" + class="icon"></img> + <img v-if="item.key == 2 && k == 0" src="@/assets/images/LogisticsCenter/ic_cangku_sel@2x.png" + class="icon"></img> + <img v-if="item.key == 3 && k != 0" src="@/assets/images/LogisticsCenter/ic_yunshu@2x.png" + class="icon"></img> + <img v-if="item.key == 3 && k == 0" src="@/assets/images/LogisticsCenter/ic_yunshu_sel@2x.png" + class="icon"></img> + <img v-if="item.key == 4 && k != 0" src="@/assets/images/LogisticsCenter/ic_daohuo@2x.png" + class="icon"></img> + <img v-if="item.key == 4 && k == 0" src="@/assets/images/LogisticsCenter/ic_daohuo_sel@2x.png" + class="icon"></img> + <img v-if="item.key == 5" src="@/assets/images/LogisticsCenter/ic_dangqian@2x.png" class="icon"></img> + </div> + <div>{{ item.name }}</div> + </div> + <div class="item" v-for="ite, i in item.secondList"> + <div class="h2" v-if="ite.orderStatusDes"> + <div class="icon_wrap" v-if="i != 0"> + <image src="@/static/driver/ic_mostarted.png" class="icon"></image> + </div> + <div v-else class="icon_wrap"></div> + <div class="text" :class="{ placeholder3: k == 0 && i == 0 }"> + {{ ite.orderStatusDes }} + <text v-if="ite.tel">,鍙戣揣浠撳簱鐢佃瘽锛�</text> + <text v-if="ite.tel" class="primaryColor">{{ ite.tel }}</text> + </div> + </div> + <div class="time">{{ ite.recordDate }}</div> + </div> </div> </div> </div> + <Loading v-if="modalLoading" /> </div> - <div class="modal_mask" v-if="showModal" @click="showModal = false"></div> + <div class="modal_mask" v-if="showModal || showModal1" @click="closeModal"></div> </div> </v-scale-screen> </template> @@ -338,17 +511,34 @@ import VScaleScreen from 'v-scale-screen' import Percent from '@/components/percent.vue' import dayjs from 'dayjs' +import axios from "axios" import * as echarts from 'echarts' import 'swiper/css/swiper.min.css' import Swiper from 'swiper' +import Map from '@/components/Map.vue' import chinaJSON from '@/assets/china.json' +import fahuoImg from '@/assets/images/LogisticsCenter/ic_fahuodi@2x.png' +import shouImg from '@/assets/images/LogisticsCenter/ic_huowu@2x.png' +// import Loading from 'vue-loading-overlay' +// import 'vue-loading-overlay/dist/css/index.css' +import Loading from '@/components/Loading.vue' + import { getStoreOperationList, - getStorearriveGoodsList, getStorecenterData, + getStorecenterDataNew, getStoreenergyDataList, getStorelastMonthOil, getStoreTaskList, + + kztotalOutQtyNum, + kzorderInfo, + mapYearAndMonthOutList, + kzinventoryUseRate, + outAbilityUseRate, + tranportAbilityUseRate, + kzfactoryList, + arriveGoodsList } from '@/api' const weekMap = ['鏄熸湡鏃�', '鏄熸湡涓�', '鏄熸湡浜�', '鏄熸湡涓�', '鏄熸湡鍥�', '鏄熸湡浜�', '鏄熸湡鍏�',] @@ -361,214 +551,182 @@ time.value = dayjs().format('HH:mm:ss') }, 1000) - -const initEchart2 = () => { - const myChart = echarts.init(document.getElementById('echart1')) - const option = { - series: [ - { - type: 'pie', - radius: ['86%', '100%'], - label: { - show: false, - position: 'center' - }, - padAngle: 5, - itemStyle: { - borderRadius: 10 - }, - color: colors, - labelLine: { - show: false - }, - data: [ - { value: 1048, name: 'Search Engine' }, - { value: 735, name: 'Direct' }, - { value: 580, name: 'Email' } - ] - } - ] - } - myChart.setOption(option) - window.addEventListener('resize', function () { // 鎵ц - myChart.resize() - }) -} -const initEchart3 = () => { - const myChart = echarts.init(document.getElementById('echart3')) - const option = { - tooltip: { - trigger: 'item' - }, - series: [ - { - type: 'pie', - radius: ['80%', '96%'], - label: { - show: false, - position: 'center' - }, - color: ['#72ecc5', '#19373a'], - labelLine: { - show: false - }, - data: [3, 7] - } - ] - } - myChart.setOption(option) - window.addEventListener('resize', function () { // 鎵ц - myChart.resize() - }) -} - +// +const mapList = ref([]) const mapEchart = ref() const initMap = () => { var myChart = echarts.init(mapEchart.value) echarts.registerMap('china', chinaJSON) var points = [ // 鐐瑰潗鏍� - { value: [117.1582, 36.8701], itemStyle: { color: '#6ae5e0' }, name: '灞变笢', total: 2, bj: 0, yj: 0, yx: 0, tj: 0, dw: 0 }, - { value: [117.29, 32.0581], itemStyle: { color: '#6ae5e0' }, name: '瀹夊窘', total: 2, bj: 0, yj: 0, yx: 0, tj: 0, dw: 0 }, - { value: [114.3896, 30.6628], itemStyle: { color: '#6ae5e0' }, name: '婀栧寳', total: 5, bj: 0, yj: 0, yx: 5, tj: 0, dw: 0 }, - { value: [119.5313, 29.8773], itemStyle: { color: '#6ae5e0' }, name: '娴欐睙', total: 10, bj: 0, yj: 0, yx: 10, tj: 0, dw: 0 }, - { value: [113.12244, 23.009505], itemStyle: { color: '#6ae5e0' }, name: '骞夸笢', total: 8, bj: 0, yj: 0, yx: 8, tj: 0, dw: 0 }, - { value: [103.9526, 30.7617], itemStyle: { color: '#6ae5e0' }, name: '鍥涘窛', total: 18, bj: 0, yj: 0, yx: 18, tj: 0, dw: 0 } + { value: [117.1582, 36.8701, 100], itemStyle: { color: '#6ae5e0' }, name: '灞变笢', total: 2, bj: 0, yj: 0, yx: 0, tj: 0, dw: 0 }, + { value: [117.29, 32.0581, 90], itemStyle: { color: '#6ae5e0' }, name: '瀹夊窘', total: 2, bj: 0, yj: 0, yx: 0, tj: 0, dw: 0 }, + { value: [114.3896, 30.6628, 1999], itemStyle: { color: '#6ae5e0' }, name: '婀栧寳', total: 5, bj: 0, yj: 0, yx: 5, tj: 0, dw: 0 }, + { value: [119.5313, 29.8773, 2], itemStyle: { color: '#6ae5e0' }, name: '娴欐睙', total: 10, bj: 0, yj: 0, yx: 10, tj: 0, dw: 0 }, + { value: [113.12244, 23.009505, 12], itemStyle: { color: '#6ae5e0' }, name: '骞夸笢', total: 8, bj: 0, yj: 0, yx: 8, tj: 0, dw: 0 }, + { value: [103.9526, 30.7617, 1901], itemStyle: { color: '#fff' }, name: '鍥涘窛', total: 18, bj: 0, yj: 0, yx: 18, tj: 0, dw: 0 } ] - var lineToLf = [ - { name: '11', coords: [[110.81, 33.40], [116.55, 40.01]], lineStyle: { color: '#c1bb1f' } }, - { name: '22', coords: [[113.11, 28.40], [116.55, 40.01]], lineStyle: { color: '#6ae5e0' } }, - { name: '33', coords: [[106.44, 29.50], [116.55, 40.01]], lineStyle: { color: '#6ae5e0' } }, - { name: '44', coords: [[112.85, 38.95], [116.55, 40.01]], lineStyle: { color: '#6ae5e0' } }, - { name: '55', coords: [[82.78, 43.27], [116.55, 40.01]], lineStyle: { color: '#6ae5e0' } } + const mapData = [ + { name: '鍖椾含甯�', code: '110000', value: 0 }, + { name: '澶╂触甯�', code: '120000', value: 0 }, + { name: '涓婃捣甯�', code: '310000', value: 0 }, + { name: '閲嶅簡甯�', code: '500000', value: 0 }, + { name: '娌冲寳鐪�', code: '130000', value: 0 }, + { name: '娌冲崡鐪�', code: '410000', value: 0 }, + { name: '浜戝崡鐪�', code: '530000', value: 0 }, + { name: '杈藉畞鐪�', code: '210000', value: 0 }, + { name: '榛戦緳姹熺渷', code: '230000', value: 0 }, + { name: '婀栧崡鐪�', code: '430000', value: 0 }, + { name: '瀹夊窘鐪�', code: '340000', value: 0 }, + { name: '灞变笢鐪�', code: '370000', value: 0 }, + { name: '鏂扮枂缁村惥灏旇嚜娌诲尯', code: '650000', value: 0 }, + { name: '姹熻嫃鐪�', code: '320000', value: 0 }, + { name: '娴欐睙鐪�', code: '330000', value: 0 }, + { name: '姹熻タ鐪�', code: '360000', value: 0 }, + { name: '婀栧寳鐪�', code: '420000', value: 0 }, + { name: '骞胯タ澹棌鑷不鍖�', code: '450000', value: 0 }, + { name: '鐢樿們鐪�', code: '620000', value: 0 }, + { name: '灞辫タ鐪�', code: '140000', value: 0 }, + { name: '鍐呰挋鍙よ嚜娌诲尯', code: '150000', value: 0 }, + { name: '闄曡タ鐪�', code: '610000', value: 0 }, + { name: '鍚夋灄鐪�', code: '220000', value: 0 }, + { name: '绂忓缓鐪�', code: '350000', value: 0 }, + { name: '璐靛窞鐪�', code: '520000', value: 0 }, + { name: '骞夸笢鐪�', code: '440000', value: 0 }, + { name: '闈掓捣鐪�', code: '630000', value: 0 }, + { name: '瑗胯棌鑷不鍖�', code: '540000', value: 0 }, + { name: '瀹佸鍥炴棌鑷不鍖�', code: '640000', value: 0 }, + { name: '鍥涘窛鐪�', code: '510000', value: 0 }, + { name: '瀹佸鐪�', code: '640000', value: 0 }, + { name: '娴峰崡鐪�', code: '460000', value: 0 }, + { name: '鍙版咕鐪�', code: '710000', value: 0 }, + { name: '棣欐腐鐗瑰埆琛屾斂鍖�', code: '810000', value: 0 }, + { name: '婢抽棬鐗瑰埆琛屾斂鍖�', code: '820003', value: 0 }, + { name: '鍗楁捣璇稿矝', code: '', value: 0 }, ] + let totalNum = 0 + mapList.value.forEach(i => { + totalNum += i.yearNum + }) + mapData.forEach(item => { + item.monthNum = 0 + item.yearNum = 0 + mapList.value.forEach(ite => { + if (item.code == ite.code) { + item.value = 0 + item.monthNum = ite.monthNum + item.yearNum = ite.yearNum + if (totalNum > 0) { + item.rate = ((ite.yearNum / totalNum) * 100).toFixed(2) + item.value = (ite.yearNum / totalNum).toFixed(4) + + } + } + }) + }) + const option = { - backgroundColor: 'transparent', // 璁剧疆鑳屾櫙鑹查�忔槑 - // 蹇呴』璁剧疆 - tooltip: { - show: false + //鏁版嵁鍒嗘 + visualMap: { + type: 'piecewise', + pieces: [ + { min: 0.05, max: 99999999999, label: '璋冩嫧閲忓崰姣�5%浠ヤ笂', color: '#be6f2b' }, + { min: 0.02, max: 0.05, label: '璋冩嫧閲忓崰姣�2%~5%', color: '#c39332' }, + { min: 0.01, max: 0.02, label: '璋冩嫧閲忓崰姣�1%~2%', color: '#5ecbaf' }, + { min: -1, max: 0.01, label: '璋冩嫧閲忓崰姣�1%浠ヤ笅', color: '#3561a4' }, + // { min: 100000, max: 99999999999, label: '鍑哄簱閲�10w浠ヤ笂', color: '#be6f2b' }, + // { min: 50000, max: 100000, label: '鍑哄簱閲�5-10w', color: '#c39332' }, + // { min: 20000, max: 50000, label: '鍑哄簱閲�2-5w', color: '#5ecbaf' }, + // { min: -1, max: 20000, label: '鍑哄簱閲�2w浠ヤ笅', color: '#3561a4' }, + ], + itemWidth: 22, + itemHeight: 22, + textStyle: { + color: '#fff', // 鏂囨湰棰滆壊 + fontSize: 14, // 瀛椾綋澶у皬 + }, }, - // 鍦板浘闃村奖閰嶇疆 + // 鎮诞绐� + tooltip: { + trigger: 'item', + backgroundColor: 'rgba(0,0,0,0.8)', //璁剧疆鑳屾櫙鍥剧墖 rgba鏍煎紡 + color: '#fff', + borderWidth: '1', //杈规瀹藉害璁剧疆1 + borderColor: 'gray', //璁剧疆杈规棰滆壊 + textStyle: { + color: '#fff', //璁剧疆鏂囧瓧棰滆壊 + }, + extraCssText: 'width:120px;height:40px', // 璁剧疆鎻愮ず妗嗗楂樼瓑css鏍峰紡 + formatter: function (params) { + return `${params.name}: <br /> ${params.value || 0}杈哷 + }, + }, geo: { - map: 'china', - // 杩欓噷蹇呴』瀹氫箟锛屼笉鐒跺悗闈eries閲岄潰涓嶇敓鏁� - tooltip: { - show: false - }, + // 杩欎釜鏄噸鐐� 鈥斺�� 杩欓噷璁剧疆涓哄湴鍥剧殑闃村奖 + map: 'china', // 琛ㄧず涓浗鍦板浘 + roam: false, // 绂佹鎷栨嫿 label: { - show: false + // 鏍囧織淇℃伅 + show: false, // 鏄惁鏄剧ず瀵瑰簲鍦板悕 }, - zoom: 1.6, - silent: true, // 涓嶅搷搴旈紶鏍囨椂闂� - show: true, - roam: false, // 鍦板浘缂╂斁鍜屽钩绉� - aspectScale: 0.75, // scale 鍦板浘鐨勯暱瀹芥瘮 + silent: true, // 绂佹hover鏁堟灉 + zoom: 1.4, // 鍦板浘姣斾緥 + aspectScale: 0.9, // 姣斾緥 + center: [105.194115019531, 36.582111640625], // 鍦板浘涓績浣嶇疆锛� 姝ゅ鐨勭含搴︿笌涓嬮潰鐨刢enter鐩稿樊1搴︽槸褰㈡垚闃村奖鐨勮窛绂伙紝鍙嚜宸遍殢鎰忚皟鏁� itemStyle: { - borderColor: '#2d5f9c', - borderWidth: 1, - areaColor: '#2d5f9c', - shadowColor: 'rgba(1,34,73,0.48)', - shadowBlur: 10, - shadowOffsetX: -10, // - shadowOffsetY: 10 - }, - select: { - disabled: true + areaColor: '#152e4a', //鍦板浘闃村奖鐨勯鑹� + borderColor: '#779dc8', // 鐪佷唤杈规棰滆壊 + borderWidth: 0.5, // 鐪佷唤杈规瀹藉害 + // shadowBlur: 5, // 鐪佷唤杈规鑱氱劍 }, emphasis: { - disabled: true, - areaColor: '#00F1FF' + show: false, }, - // 鍦板浘鍖哄煙鐨勫杈瑰舰 鍥惧舰鏍峰紡 闃村奖鏁堟灉 - // z鍊煎皬鐨勫浘褰細琚珃鍊煎ぇ鐨勫浘褰㈣鐩� - top: '30.2%', - left: 'center', - // 鍘婚櫎鍗楁捣璇稿矝闃村奖 series map閲岄潰娌℃湁姝ゅ睘鎬� - regions: [{ - name: '鍗楁捣璇稿矝', - selected: false, - emphasis: { - disabled: true + //鍦板浘鐨勯槾褰变笉鏄剧ず鍗楁矙璇稿矝 + regions: [ + { + name: '鍗楁捣璇稿矝', + itemStyle: { + // 闅愯棌鍦板浘 + normal: { + opacity: 0, // 涓� 0 鏃朵笉缁樺埗璇ュ浘褰� + }, + emphasis: { + opacity: 0, + }, + }, + label: { + show: false, // 闅愯棌鏂囧瓧 + }, }, - itemStyle: { - areaColor: '#00000000', - borderColor: '#00000000' - } - }], - z: 1 + ], }, + //閰嶇疆灞炴�� series: [ - // 鍦板浘閰嶇疆 { type: 'map', map: 'china', - zoom: 1.6, - tooltip: { - show: false - }, - label: { - show: true, // 鏄剧ず鐪佷唤鍚嶇О - color: '#fff', - fontSize: 13, - shadowColor: '#fff', - shadowBlur: 10, - shadowOffsetX: 2, - shadowOffsetY: 2, - textBorderColor: '#fff', - // rotate: 90, - align: 'center' - }, - top: '28%', - left: 'center', - aspectScale: 0.75, - roam: false, // 鍦板浘缂╂斁鍜屽钩绉� - itemStyle: { - borderColor: '#4278a3', // 鐪佸垎鐣岀嚎棰滆壊 闃村奖鏁堟灉鐨� - borderWidth: 1, - areaColor: '#1d3f71', - opacity: 1 - }, - // 鍘婚櫎閫変腑鐘舵�� - select: { - disabled: true - }, - emphasis: { // 鑱氱劍鍚庨鑹� - disabled: false, // 寮�鍚珮浜� + zoom: 1.4, + aspectScale: 0.9, // 姣斾緥 + zlevel: 1, // 璁剧疆鍦板浘鐨勫眰绾э紝灏嗚鍦板浘涓婄Щ锛堢被浼紌-index锛� + emphasis: { + // 榧犳爣hover鏄惁鏄剧ず鍐呭锛屽彲鑷繁璋冭妭 label: { - align: 'center', - color: '#04CFF5' + show: true, + color: '#fff', }, itemStyle: { - color: '#ffffff', - areaColor: '#3c87b2'// 闃村奖鏁堟灉 榧犳爣绉诲姩涓婂幓鐨勯鑹� - } + show: true, + color: '#fff', // 楂樹寒鏂囧瓧棰滆壊 + borderColor: '#a4d0ec', // 楂樹寒杈规棰滆壊 + areaColor: '#0056FF', //楂樹寒鍖哄煙棰滆壊 + }, }, - z: 2 - }, - // 鐐� - { - name: 'companyPoint', - type: 'effectScatter', - coordinateSystem: 'geo', - showEffectOn: 'render', - // zlevel: 2, // zlevel鐢ㄤ簬 Canvas 鍒嗗眰 鐩稿悓鐨勭粯鍒跺湪鍚屼竴涓猚anvas涓� - rippleEffect: { - number: 3, // 娉㈢汗鏁伴噺 - period: 10, // 鍔ㄧ敾鍛ㄦ湡 鏁板�艰秺澶э紝娉㈠姩瓒婃參 - scale: 3.5, // 鍔ㄧ敾涓尝绾圭殑鏈�澶х缉鏀炬瘮渚� - brushType: 'stroke' // 娉㈢汗鐨勭粯鍒舵柟寮� stroke fill - }, + selectedMode: false, label: { + // 鍦板浘鏍囨敞 show: false, - triggerOn: 'click', - position: 'right', - formatter: '{b}', - color: '#97e9e1', - fontSize: 14 }, - symbol: 'circle', - symbolSize: 8, - data: points, tooltip: { show: true, triggerOn: 'click', @@ -580,56 +738,63 @@ return `<div class="map-tip-box"> <div class="item-state-con title"> <div class="icon"></div> - <span>${params.data.name}</span> + <span>${params.data.name}</span> </div> <div class="item-state-con"> <span class="dot bj"></span> <span class="item-state-num"> - <span class="text">鏈湀鍑哄簱閲忥細</span> - <span class="num">${params.data.total}涓囨敮</span> + <span class="text">鏈湀璋冩嫧閲忥細</span> + <span class="num">${params.data.monthNum}绠�</span> </span> </div> - <div class="item-state-con"> + <div class="item-state-con"> <span class="dot yj"></span> <span class="item-state-num"> - <span class="text">鏈勾鍑哄簱閲�</span> - <span class="num">${params.data.yx}涓囨敮</span> + <span class="text">鏈勾璋冩嫧閲忥細</span> + <span class="num">${params.data.yearNum}绠�</span> + </span> + </div> + <div class="item-state-con"> + <span class="dot yj"></span> + <span class="item-state-num"> + <span class="text">璋冩嫧閲忓崰姣旓細</span> + <span class="num">${params.data.rate || 0}%</span> </span> </div> </div>` } }, - z: 4 + itemStyle: { + borderColor: '#a4d0ec', // 鐪佷唤杈规棰滆壊 + borderWidth: 1, // 鐪佷唤杈规瀹藉害 + // shadowBlur: 5, // 鐪佷唤杈规鑱氱劍 + areaColor: '#3c5997', + }, + center: [105.194115019531, 35.582111640625], // 璁剧疆鍦板浘涓績 + data: mapData, }, - // 鍦板浘绾跨殑鍔ㄧ敾鏁堟灉 - // { - // name: 'arrowline', - // type: 'lines', - // // zlevel: 1, - // effect: { - // show: true, - // period: 3, // 绠ご鎸囧悜閫熷害锛屽�艰秺灏忛�熷害瓒婂揩 - // trailLength: 0.1, // 鐗规晥灏捐抗闀垮害[0,1]鍊艰秺澶э紝灏捐抗瓒婇暱閲� - // symbol: 'arrow', // 绠ご鍥炬爣 - // symbolSize: 6 // 鍥炬爣澶у皬 - // }, - // lineStyle: { - // color: '#1DE9B6', - // width: 2, // 绾挎潯瀹藉害 - // opacity: 0.1, // 灏捐抗绾挎潯閫忔槑搴� - // curveness: 0.2 // 灏捐抗绾挎潯鏇茬洿搴� - // }, - // data: lineToLf, - // z: 3 - // } - ] + ], } myChart.setOption(option) window.addEventListener('resize', function () {//鎵ц myChart.resize() }) } -const initEnergy = (list) => { +const getMap = () => { + mapYearAndMonthOutList({ + factoryCode: activeCity.value.code + }).then(res => { + const temp = res.data || [] + mapList.value = temp.map(item => { + item.value = item.monthNum + item.name = item.provinceName + item.code = item.provinceCode + return item + }) + initMap() + }) +} +const initEnergy = () => { var myChart = echarts.init(document.querySelector('.energyRef')) // 缁樺埗鍥捐〃 myChart.setOption({ @@ -652,6 +817,39 @@ borderColor: '#fff' }, }, + dataZoom: [ + { + type: 'slider', // 婊戝姩鏉$被鍨� + orient: 'vertical', + left: 'left', + start: 0, // 璧峰浣嶇疆锛堢櫨鍒嗘瘮锛� + end: 40, // 缁撴潫浣嶇疆锛堢櫨鍒嗘瘮锛夛紝鎺у埗鍒濆鏄剧ず鑼冨洿 + width: 1, + backgroundColor: '#04141d', // 婊戝姩鏉¤儗鏅壊 + // dataBackground: 'none', + dataBackground: { + areaStyle: { opacity: 0 }, // 璁剧疆鑳屾櫙閫忔槑 + lineStyle: { opacity: 0 } // 璁剧疆鑳屾櫙閫忔槑 + }, + borderColor: '#04141e', // 杈规棰滆壊 + moveOnMouseWheel: true, + // showDetail: false, // 闅愯棌閫変腑鑼冨洿鐨勬枃瀛� + }, + { + type: 'inside', // 鐢ㄤ簬鐩戝惉婊氳疆浜嬩欢 + orient: 'vertical', + start: 0, + end: 40, + minSpan: 40, + dataBackground: { + areaStyle: { opacity: 0 } // 璁剧疆鑳屾櫙閫忔槑 + }, + maxSpan: 40, + zoomLock: true, // 閿佸畾缂╂斁锛堜粎鍏佽骞崇Щ锛� + moveOnMouseWheel: true, // 鍚敤婊氳疆骞崇Щ + // zoomOnMouseWheel: false // 绂佺敤婊氳疆缂╂斁 + } + ], grid: { left: '3%', right: '4%', @@ -661,6 +859,9 @@ }, xAxis: { type: 'value', + axisLabel: { + color: '#D2E0FF' + }, splitLine: { show: true, lineStyle: { @@ -674,11 +875,14 @@ axisTick: { show: false, }, + axisLabel: { + color: '#D2E0FF' + }, type: 'category', axisLine: { show: false }, - data: list.map(i => i.dateStr) + data: dataList1.value.map(i => i.dateStr) }, series: [ { @@ -690,13 +894,13 @@ show: true, textStyle: { color: '#000000', - fontSize: 10 + fontSize: 12 } }, emphasis: { focus: 'series' }, - data: list.map(i => i.inTransitNum), + data: dataList1.value.map(i => i.waitNum), itemStyle: { normal: { color: { @@ -726,7 +930,11 @@ stack: 'total', barWidth: 14, label: { - show: true + show: true, + textStyle: { + color: '#000000', + fontSize: 12 + } }, emphasis: { focus: 'series' @@ -735,7 +943,7 @@ color: '#000000', fontSize: 10 }, - data: list.map(i => i.inTransitNum), + data: dataList1.value.map(i => i.ingNum), itemStyle: { normal: { color: { @@ -761,7 +969,11 @@ barWidth: 14, stack: 'total', label: { - show: true + show: true, + textStyle: { + color: '#000000', + fontSize: 12 + } }, textStyle: { color: '#000000', @@ -777,80 +989,214 @@ y2: 0, colorStops: [{ offset: 0, - color: '#71f3ce' + color: '#73f7d1' }, { offset: 1, - color: '#4da999' + color: '#58beaa' }] } - } + }, }, emphasis: { focus: 'series' }, - data: list.map(i => i.arriveNum) + data: dataList1.value.map(i => i.doneNum) } ] }) myChart.on('click', function (params) { - console.log(params.name) + // console.log(params.seriesName) + // console.log(params.name) + const item = dataList1.value.find(i => i.dateStr == params.name) + // console.log(params); + active1List.value = params.seriesName == '鍦ㄩ��' ? item.ingList : params.seriesName == '鍒拌揣' ? item.doneList : item.waitList + showModal1.value = true }) window.addEventListener('resize', function () {//鎵ц myChart.resize() }) } +const showModal1 = ref(false) +const active1List = ref([]) + +const dataList1 = ref([]) const getData1 = () => { - getStorearriveGoodsList().then(res => { - initEnergy(res.data || []) + arriveGoodsList({ + factoryCode: activeCity.value.code + }).then(res => { + dataList1.value = res.data || [] + initEnergy() }) } const transportTask = ref([]) const taskCode = ref('') const showModal = ref(false) +const modalLoading = ref(false) const modalInfo = ref({}) const modalTab = ref(0) -const modalTabClick = (val) => { - modalTab.value = val -} +const pager = ref({ + page: 0, + rows: 50 +}) const taskClick = (item) => { - modalInfo.value = item + modalLoading.value = true showModal.value = true + kzorderInfo({ contractNumber: item.contractNumber }).then(res => { + modalInfo.value = res.data + // const apiKey = 'd9a554b1808ce10a12a932ed9b0db1d0' + const apiKey = '3916a7b434e7f13ae1a0af64e88ec0a3' + if (modalInfo.value.gisList && modalInfo.value.gisList.length > 0) { + const gisInfo = modalInfo.value.gisList[0] + if (gisInfo && gisInfo.gisList && gisInfo.gisList.length > 0) { + const adsInfo = gisInfo.gisList[gisInfo.gisList.length - 1] + const location = adsInfo.lon1 + ',' + adsInfo.lat1 + axios.get(`https://restapi.amap.com/v3/geocode/regeo?key=${apiKey}&location=${location}`).then(res => { + console.log('res', res.data) + if (res.data.status == 1) { + modalInfo.value.position = res.data.regeocode.formatted_address + } + }) + } + } + + modalLoading.value = false + nextTick(() => { + initGdMap() + }) + }, () => { + modalLoading.value = false + }) } +const closeModal = () => { + showModal.value = false + showModal1.value = false + modalInfo.value = {} +} + + +const mapContainer = ref(null) +function distance(obj) { + const lat1 = obj.deliveryLat + const lng1 = obj.deliveryLon + const lat2 = obj.receiveLat + const lng2 = obj.receiveLon + const radLat1 = rad(lat1) + const radLat2 = rad(lat2) + const a = radLat1 - radLat2 + const b = rad(lng1) - rad(lng2) + const Haversin = Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), + 2) + const radius = 6378137 // 鍦扮悆鍗婂緞 + return 2 * radius * Math.asin(Math.sqrt(Haversin)) +} +function rad(d) { + return d * Math.PI / 180.0 +} +const initGdMap = () => { + const obj = modalInfo.value + let scale = 5 + console.log((obj.deliveryLon + obj.receiveLon)) + const distancet = distance(obj) + if (distancet > 1200000) { + scale = 3 + } else if (distancet < 1200000 && distancet > 500000) { + scale = 4 + } else if (distancet < 500000) { + scale = 5 + } else { + scale = 5 + } + console.log('distancet', distancet) + + const map = new AMap.Map(mapContainer.value, { + zoom: scale, // 鍒濆缂╂斁绾у埆 + center: [(Number(obj.deliveryLon) + Number(obj.receiveLon)) / 2, (Number(obj.deliveryLat) + Number(obj.receiveLat)) / 2], // 鍒濆涓績鐐癸紙鍖椾含鍧愭爣锛� + }) + AMap.plugin(['AMap.ToolBar'], () => { + const toolbar = new AMap.ToolBar() + map.addControl(toolbar) + }) + const marker1 = new AMap.Marker({ + position: [obj.deliveryLon, obj.deliveryLat], // 鏍囪鐐�1鍧愭爣 + icon: new AMap.Icon({ + size: new AMap.Size(28, 32), // 鍥炬爣澶у皬 + image: fahuoImg, // 鍥炬爣鍥剧墖URL + imageSize: new AMap.Size(28, 32), // 鍥炬爣瀹為檯澶у皬 + }), + title: obj.deliveryEnterprise, // 榧犳爣鎮仠鏃舵樉绀虹殑鏍囬 + }) + map.add(marker1) + const marker2 = new AMap.Marker({ + position: [obj.receiveLon, obj.receiveLat], // 鏍囪鐐�1鍧愭爣 + icon: new AMap.Icon({ + size: new AMap.Size(28, 32), // 鍥炬爣澶у皬 + image: shouImg, // 鍥炬爣鍥剧墖URL + imageSize: new AMap.Size(28, 32), // 鍥炬爣瀹為檯澶у皬 + }), + title: obj.receiveEnterprise, // 榧犳爣鎮仠鏃舵樉绀虹殑鏍囬 + }) + map.add(marker2) + // 缁樺埗杞ㄨ抗 + const polylineList = obj.gisList[0].gisList || [] + + const polyline = new AMap.Polyline({ + path: [ + polylineList.map(i => { + return [i.lon, i.lat] + }) + ], + strokeColor: 'red', // 绾跨殑棰滆壊 + strokeWeight: 3, // 绾跨殑瀹藉害 + strokeOpacity: 0.8, // 绾跨殑閫忔槑搴� + strokeStyle: 'solid', // 绾跨殑鏍峰紡 + lineJoin: 'round', // 鎶樼嚎鎷愮偣鐨勬牱寮� + }) + map.add(polyline) +} +const isLoadingTask = ref(false) const getData2 = () => { - getStoreTaskList({ code: taskCode.value }).then(res => { - let temp = res.data || [] - // temp = temp.splice(0, 5) + isLoadingTask.value = true + getStoreTaskList({ + pager: pager.value, + parameters: { + contractNumber: taskCode.value, + facrotyCodeList: activeCity.value.code ? [activeCity.value.code] : [] + } + }).then(res => { + isLoadingTask.value = false + let temp = res.data.rows || [] transportTask.value = temp.map(item => { - item.taskDate = item.taskDate.slice(5, 16) + if (item.createDate) { + item.createDate = item.createDate.slice(5, 16) + } return item }) + console.log('isLoadingTask', isLoadingTask.value) + + }, () => { + isLoadingTask.value = false }) } const cneterData = ref({}) const showPro = ref(false) -const cityList = ref([ - { name: '鍏ㄧ渷', id: 0 }, - { name: '鍚堣偉浠�', id: 1 }, - { name: '鑺滄箹浠�', id: 2 }, - { name: '婊佸窞浠�', id: 3 }, - { name: '铓屽煚浠�', id: 4 }, -]) -const activeCity = ref({ name: '鍏ㄧ渷', id: 0 }) -const activeTab1 = ref(0) +const cityList = ref() +const getCity = () => { + kzfactoryList().then(res => { + cityList.value = [{ name: '鍏ㄧ渷', code: '' }, ...res.data] + }) +} +const activeCity = ref({ name: '鍏ㄧ渷', code: '' }) const colors = ['#0193FE', '#FFB642'] -const StockOutData = ref([]) const cityClick = (item) => { activeCity.value = item showPro.value = false - cneterData.value = {} - setTimeout(() => { - getData3() - }, 400) + changeCity() } const initEchart1 = () => { const myChart = echarts.init(document.getElementById('echart1')) + const option = { tooltip: { trigger: 'item' @@ -863,11 +1209,20 @@ show: false, position: 'center' }, + emphasis: { + // 璁剧疆鎮诞鏃舵牱寮忎负绌� + scale: false, // 鍏抽棴鏀惧ぇ鏁堟灉 + itemStyle: { + shadowBlur: 0, // 闃村奖妯$硦搴︿负 0 + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0)', + }, + }, color: colors, labelLine: { show: false }, - data: StockOutData.value + data: StockOutData.value.arr } ] } @@ -876,274 +1231,82 @@ myChart.resize() }) } + +const activeTab1 = ref(0) +const loading1 = ref(false) +const StockOutData = ref({}) const getStockOut = () => { - let arr = [] - arr.push({ name: '鐪佸唴', value: (cneterData.value.yearProvinceRata * 100).toFixed(0) + '%' }) - arr.push({ name: '鐪佸', value: ((1 - cneterData.value.yearProvinceRata) * 100).toFixed(0) + '%' }) - arr.sort((a, b) => b.value - a.value) - StockOutData.value = arr - initEchart1() + loading1.value = true + kztotalOutQtyNum({ type: activeTab1.value, factoryCode: activeCity.value.code }).then(res => { + loading1.value = false + if (res.code == 200) { + let obj = res.data + obj.currentNum = (obj.currentOutNum + obj.currentInNum).toFixed(0) * 1 + obj.lastNum = (obj.lastOutNum + obj.lastInNum).toFixed(0) * 1 + // obj.sameNum = (obj.sameOutNum + obj.sameInNum).toFixed(0) + let arr = [] + arr.push({ name: '鐪佸唴', value: obj.currentInNum, rate: obj.currentInNum == 0 && obj.currentOutNum == 0 ? 0 : (obj.currentInNum / (obj.currentInNum + obj.currentOutNum) * 100).toFixed(0) + '%' }) + arr.push({ name: '鐪佸', value: obj.currentOutNum, rate: obj.currentInNum == 0 && obj.currentOutNum == 0 ? 0 : (obj.currentOutNum / (obj.currentInNum + obj.currentOutNum) * 100).toFixed(0) + '%' }) + obj.arr = arr + + StockOutData.value = obj + initEchart1() + } + + }, () => { + loading1.value = false + }) } -const tab1Click = () => { +const tab1Click = (val) => { activeTab1.value = val - + getStockOut() } +// footer const getData3 = () => { - getStorecenterData().then(res => { - cneterData.value = res.data || {} - getStockOut() + getStorecenterDataNew({ + factoryCode: activeCity.value.code + }).then(res => { + const obj = res.data || {} + console.log('obj', obj) + + // 8灏忔椂 璁″垝 浠婃棩 + // obj.hoursAbility = 6000 + // obj.maxAbility = 8000 + // obj.currentPlanNum = 22000 + // obj.crrentOutNum = 7000 + + obj.level1 = ((obj.hoursAbility / obj.maxAbility) * 100).toFixed(2) + '%' + if (obj.currentPlanNum >= obj.hoursAbility) { + obj.level2 = '100%' + obj.level22 = (((obj.currentPlanNum - obj.hoursAbility) / (obj.maxAbility - obj.hoursAbility)) * 100).toFixed(2) + obj.level22 = obj.level22 > 100 ? '100%' : obj.level22 + '%' + } else { + obj.level2 = ((obj.currentPlanNum / obj.hoursAbility) * 100).toFixed(2) + '%' + obj.level22 = 0 + } + if (obj.crrentOutNum >= obj.hoursAbility) { + obj.level3 = '100%' + obj.level33 = (((obj.crrentOutNum - obj.hoursAbility) / (obj.maxAbility - obj.hoursAbility)) * 100).toFixed(2) + obj.level33 = obj.level33 > 100 ? '100%' : obj.level33 + '%' + } else { + obj.level3 = ((obj.crrentOutNum / obj.hoursAbility) * 100).toFixed(2) + '%' + obj.level33 = 0 + } + + // console.log('obj1', obj.level1); + // console.log('obj2', obj.level2); + // console.log('obj22', obj.level22); + // console.log('obj3', obj.level3); + // console.log('obj33', obj.level33); + + cneterData.value = obj + }) } -const activeTabs = ref(0) -const dataList4 = ref([]) -const initEchart4 = () => { - // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥 - const myChart = echarts.init(document.getElementById('echart4')) - // 缁樺埗鍥捐〃 - myChart.setOption({ - tooltip: { - trigger: 'axis', - backgroundColor: '#091123', - axisPointer: { - type: 'line' - }, - // formatter: function (params) { - // setTimeout(() => { - // }) - // return ` - // <div style="background-color: #091123;margin: -12px;padding: 14px;border: 2px solid rgba(1,217,254,0.5);color: #fff;"> - // <div>${params[0].name}鎬婚攢鍞(涓囧厓)</div> - // <div style="display: flex;align-items: center;"> - // <div style="width: 10px;height: 10px;border-radius: 50%;background-color: #ebbf40;"></div> - // <div style="margin: 0 4px 0 6px;">鎬婚攢鍞�</div> - // <span style="color: #ebbf40;">${params[0].value}</span> - // </div> - // </div> - // ` - // } - }, - xAxis: { - type: 'category', - boundaryGap: false, - data: dataList4.value.map(i => i.dateStr) - }, - yAxis: { - type: 'value', - name: '涓囨敮', - nameTextStyle: { - padding: [0, 0, 0, -16] // 鍥涗釜鏁板瓧鍒嗗埆涓轰笂鍙充笅宸︿笌鍘熶綅缃窛绂� - }, - splitLine: { - show: true, - lineStyle: { - //杩欓噷杈撳叆绾挎潯鐨勬牱寮� - color: 'rgba(255,255,255,0.14)', - type: 'dashed', - }, - splitNumber: 4 - } - }, - legend: { - itemGap: 24, - icon: 'rect', - right: '12px', - top: '0', - itemWidth: 16, - itemHeight: 2, - textStyle: { - color: '#fff', - borderColor: '#fff' - }, - data: ['鎬诲叆搴撻噺', '鎬诲嚭搴撻噺', '搴撳瓨閲�'] - }, - grid: { - top: '18%', - left: '0%', - right: '2%', - bottom: '2%', - containLabel: true - }, - series: [ - { - name: '鎬诲叆搴撻噺', - data: dataList4.value.map(item => { - return { - name: item.dateStr, - value: item.totalInNum, - } - }), - type: 'line', - areaStyle: { - normal: { - color: { - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [ - { - offset: 0, - color: "#4191f6" // 0% 澶勭殑棰滆壊 - }, - { - offset: .4, - color: "#203d79" // 0% 澶勭殑棰滆壊 - }, - { - offset: 1, - color: "#1b1b12" // 100% 澶勭殑棰滆壊 - }], - globalCoord: false // 缂虹渷涓� false - } - } - }, - lineStyle: { // 绾挎潯鏍峰紡 - color: { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: '#4191f6' // 0% 澶勭殑棰滆壊 - }, { - offset: 1, color: '#4191f6' // 100% 澶勭殑棰滆壊 - }], - }, - width: 1.5, // 绾挎潯绮楃粏 - }, - symbol: 'circle', - symbolSize: 4, - itemStyle: { - color: "#4190f4", - borderColor: "rgba(255,255,255,.3)", - borderWidth: 4, - }, - smooth: true - }, - { - name: '鎬诲嚭搴撻噺', - data: dataList4.value.map(item => { - return { - name: item.dateStr, - value: item.totalOutNum, - } - }), - type: 'line', - areaStyle: { - normal: { - color: { - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, - color: "rgba(192, 156, 53,.7)" // 0% 澶勭殑棰滆壊 - }, { - offset: 1, - color: "#1b1b12" // 100% 澶勭殑棰滆壊 - }], - globalCoord: false // 缂虹渷涓� false - } - } - }, - lineStyle: { // 绾挎潯鏍峰紡 - color: { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: '#F3BD00' // 0% 澶勭殑棰滆壊 - }, { - offset: 1, color: '#F3BD00' // 100% 澶勭殑棰滆壊 - }], - }, - width: 2, // 绾挎潯绮楃粏 - }, - symbol: 'circle', - symbolSize: 4, - itemStyle: { - color: "#F3BD00", - borderColor: "rgba(255,255,255,.3)", - borderWidth: 4, - }, - smooth: true - }, - { - name: '搴撳瓨閲�', - data: dataList4.value.map(item => { - return { - name: item.dateStr, - value: item.stockNum, - } - }), - type: 'line', - areaStyle: { - normal: { - color: { - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, - color: "rgba(218, 233, 250)" // 0% 澶勭殑棰滆壊 - }, { - offset: 1, - color: "#1b1b12" // 100% 澶勭殑棰滆壊 - }], - globalCoord: false // 缂虹渷涓� false - } - } - }, - lineStyle: { // 绾挎潯鏍峰紡 - color: { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: '#fff' // 0% 澶勭殑棰滆壊 - }, { - offset: 1, color: '#fff' // 100% 澶勭殑棰滆壊 - }], - }, - width: 2, // 绾挎潯绮楃粏 - }, - symbol: 'circle', - symbolSize: 4, - itemStyle: { - color: "#fff", - borderColor: "rgba(255,255,255,.3)", - borderWidth: 4, - }, - smooth: true - }, - ] - }) - - window.addEventListener('resize', function () {//鎵ц - myChart.resize() - }) -} -const tabsClick4 = (tab) => { - activeTabs.value = tab - getData4() -} -const getData4 = () => { // 杩涢攢瀛樿繍钀� - getStoreOperationList({ queryType: activeTabs.value }).then(res => { - console.log('res', res) - dataList4.value = res.data || [] - // initEchart4() - }) -} - -const dataList5 = ref([]) +const data5 = ref({}) +const data6 = ref({}) +const data7 = ref({}) const initEchart5 = () => { // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥 const myChart = echarts.init(document.getElementById('echart5')) @@ -1152,9 +1315,9 @@ legend: { itemGap: 12, // icon: 'circle', - right: '16%', - top: '1%', - data: ['鎬诲簱瀛�', '褰撳墠搴撳瓨', '搴撳瓨鍒╃敤鐜�'], + right: '12%', + top: '0%', + data: ['鎬诲簱瀹�', '褰撳墠搴撳瓨', '搴撳瓨鍒╃敤鐜�'], itemWidth: 20, itemHeight: 10, textStyle: { @@ -1170,7 +1333,33 @@ containLabel: true }, tooltip: { - trigger: 'axis' + trigger: 'axis', + formatter: function (params) { + // 閬嶅巻鎮诞鏃剁殑鎵�鏈夌偣锛屽畾鍒跺寲鏄剧ず鍐呭 + let result = `<div style="width: 160px">${params[0].name}</div>` + params.forEach((item) => { + if (item.seriesName === '鎬诲簱瀹�') { + result += ` + <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;"> + <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #5e9bca;margin-right: 4px;"></div><div>${item.seriesName}</div></div> + <div><strong>${item.value}</strong></div> + </div>` + } else if (item.seriesName === '褰撳墠搴撳瓨') { + result += ` + <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;"> + <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #e2a44f;margin-right: 4px;"></div><div>${item.seriesName}</div></div> + <div><strong>${item.value}</strong></div> + </div>` + } else if (item.seriesName === '搴撳瓨鍒╃敤鐜�') { + result += ` + <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;"> + <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #b2bcd1;margin-right: 4px;"></div><div>${item.seriesName}</div></div> + <div><strong>${item.value}%</strong></div> + </div>` + } + }) + return result + } }, xAxis: [{ nameGap: 5, @@ -1183,23 +1372,21 @@ }, axisLabel: { color: '#869CC9' - // fontSize: 24, }, axisTick: { show: false, }, - data: dataList5.value.map(i => i.placeName), + data: data5.value.detailList.map(i => i.factoryName), }], yAxis: [ { nameTextStyle: { color: '#869CC9', }, - name: '涓囨敮', - nameGap: 24, + name: '绠�', + nameGap: 16, type: 'value', axisLabel: { - show: true, color: "#869CC9", }, axisLine: { @@ -1217,19 +1404,22 @@ { type: 'value', name: '%', - nameGap: 24, + nameGap: 16, min: 0, - max: 100, - interval: 25, + // max: 100, axisLabel: { - formatter: '{value}' + color: "#869CC9", + }, + nameTextStyle: { + color: '#869CC9', + padding: [0, 0, 0, 12] }, splitLine: false } ], series: [ { - name: '鎬诲簱瀛�', + name: '鎬诲簱瀹�', type: 'bar', barWidth: 10, barGap: '60%', @@ -1256,7 +1446,7 @@ }, barBorderRadius: [30, 30, 0, 0], }, - data: dataList5.value.map(i => i.totalStockNum) + data: data5.value.detailList.map(i => i.totalNum) }, { name: '褰撳墠搴撳瓨', @@ -1289,7 +1479,7 @@ }, barBorderRadius: [30, 30, 0, 0], }, - data: dataList5.value.map(i => i.nowStockNum) + data: data5.value.detailList.map(i => i.currentNum) }, { name: '搴撳瓨鍒╃敤鐜�', @@ -1301,13 +1491,16 @@ color: "#9eabc2" }, yAxisIndex: 1, + tooltip: { + show: true, + formatter: '{c}' + '%', + }, label: { show: false, position: 'top', color: '#fff', - // formatter: '{c}' + '%', }, - data: dataList5.value.map(i => i.stockRataNum) + data: data5.value.detailList.map(i => i.useRate) } ] }) @@ -1324,9 +1517,9 @@ legend: { itemGap: 12, // icon: 'circle', - right: '16%', - top: '1%', - data: ['鍑哄簱鑳藉姏', '褰撴棩鍑哄簱閲�', '搴撳瓨鍒╃敤鐜�'], + right: '10%', + top: '0', + data: ['鍑哄簱鑳藉姏', '褰撴棩鍑哄簱閲�', '鍑哄簱鍒╃敤鐜�'], itemWidth: 20, itemHeight: 10, textStyle: { @@ -1334,15 +1527,41 @@ borderColor: '#fff' }, }, + tooltip: { + trigger: 'axis', + formatter: function (params) { + // 閬嶅巻鎮诞鏃剁殑鎵�鏈夌偣锛屽畾鍒跺寲鏄剧ず鍐呭 + let result = `<div style="width: 160px">${params[0].name}</div>` + params.forEach((item) => { + if (item.seriesName === '鍑哄簱鑳藉姏') { + result += ` + <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;"> + <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #487af3;margin-right: 4px;"></div><div>${item.seriesName}</div></div> + <div><strong>${item.value}</strong></div> + </div>` + } else if (item.seriesName === '褰撴棩鍑哄簱閲�') { + result += ` + <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;"> + <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #e2a44f;margin-right: 4px;"></div><div>${item.seriesName}</div></div> + <div><strong>${item.value}</strong></div> + </div>` + } else if (item.seriesName === '鍑哄簱鍒╃敤鐜�') { + result += ` + <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;"> + <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #b0bcd3;margin-right: 4px;"></div><div>${item.seriesName}</div></div> + <div><strong>${item.value}%</strong></div> + </div>` + } + }) + return result + } + }, grid: { left: '3%', right: '0%', bottom: '3%', top: '18%', containLabel: true - }, - tooltip: { - trigger: 'axis' }, xAxis: [{ nameGap: 5, @@ -1354,25 +1573,27 @@ }, }, axisLabel: { - color: '#869CC9' - // fontSize: 24, + color: "#869CC9", + }, + nameTextStyle: { + color: '#869CC9', }, axisTick: { show: false, }, - data: dataList5.value.map(i => i.placeName), + data: data6.value.detailList.map(i => i.factoryName), }], yAxis: [ { - nameTextStyle: { - color: '#869CC9', - }, - name: '涓囨敮', - nameGap: 24, + name: '绠�', + nameGap: 16, type: 'value', axisLabel: { - show: true, color: "#869CC9", + }, + nameTextStyle: { + color: '#869CC9', + padding: [0, 0, 0, 12] }, axisLine: { show: true, @@ -1389,12 +1610,14 @@ { type: 'value', name: '%', - nameGap: 24, + nameGap: 16, min: 0, - max: 100, - interval: 25, axisLabel: { - formatter: '{value}' + color: "#869CC9", + }, + nameTextStyle: { + color: '#869CC9', + padding: [0, 0, 0, 12] }, splitLine: false } @@ -1403,7 +1626,7 @@ { name: '鍑哄簱鑳藉姏', type: 'bar', - barWidth: 10, + barWidth: 14, barGap: '60%', label: { show: false, @@ -1428,14 +1651,14 @@ }, barBorderRadius: [30, 30, 0, 0], }, - data: dataList5.value.map(i => i.totalStockNum), + data: data6.value.detailList.map(i => i.totalNum), barGap: '-100%' // 璁剧疆鏌卞瓙瀹屽叏閲嶅彔 }, { name: '褰撴棩鍑哄簱閲�', type: 'bar', - barWidth: 10, + barWidth: 14, label: { show: false, position: 'top', @@ -1463,11 +1686,11 @@ }, barBorderRadius: [30, 30, 0, 0], }, - data: dataList5.value.map(i => i.nowStockNum), + data: data6.value.detailList.map(i => i.currentNum), barGap: '-100%' // 璁剧疆鏌卞瓙瀹屽叏閲嶅彔 }, { - name: '搴撳瓨鍒╃敤鐜�', + name: '鍑哄簱鍒╃敤鐜�', type: 'line', smooth: false, showAllSymbol: true, @@ -1480,9 +1703,8 @@ show: false, position: 'top', color: '#fff', - // formatter: '{c}' + '%', }, - data: dataList5.value.map(i => i.stockRataNum) + data: data6.value.detailList.map(i => i.useRate) } ] }) @@ -1499,9 +1721,9 @@ legend: { itemGap: 12, // icon: 'circle', - right: '16%', - top: '1%', - data: ['鎬诲簱瀛�', '褰撳墠搴撳瓨', '搴撳瓨鍒╃敤鐜�'], + right: '10%', + top: '0%', + data: ['褰撴棩鍙敤杩愬姏', '褰撴棩鎻愭姤杩愬姏', '杞﹁締鍒╃敤鐜�'], itemWidth: 20, itemHeight: 10, textStyle: { @@ -1509,15 +1731,41 @@ borderColor: '#fff' }, }, + tooltip: { + trigger: 'axis', + formatter: function (params) { + // 閬嶅巻鎮诞鏃剁殑鎵�鏈夌偣锛屽畾鍒跺寲鏄剧ず鍐呭 + let result = `<div style="width: 160px">${params[0].name}</div>` + params.forEach((item) => { + if (item.seriesName === '褰撴棩鍙敤杩愬姏') { + result += ` + <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;"> + <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #88d9cc;margin-right: 4px;"></div><div>${item.seriesName}</div></div> + <div><strong>${item.value}</strong></div> + </div>` + } else if (item.seriesName === '褰撴棩鎻愭姤杩愬姏') { + result += ` + <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;"> + <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #e2a44f;margin-right: 4px;"></div><div>${item.seriesName}</div></div> + <div><strong>${item.value}</strong></div> + </div>` + } else if (item.seriesName === '杞﹁締鍒╃敤鐜�') { + result += ` + <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;"> + <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #b0bcd3;margin-right: 4px;"></div><div>${item.seriesName}</div></div> + <div><strong>${item.value}%</strong></div> + </div>` + } + }) + return result + } + }, grid: { left: '3%', right: '0%', bottom: '3%', top: '18%', containLabel: true - }, - tooltip: { - trigger: 'axis' }, xAxis: [{ nameGap: 5, @@ -1529,21 +1777,24 @@ }, }, axisLabel: { - color: '#869CC9' - // fontSize: 24, + color: "#869CC9", + }, + nameTextStyle: { + color: '#869CC9', + padding: [0, 0, 0, 12] }, axisTick: { show: false, }, - data: dataList5.value.map(i => i.placeName), + data: data7.value.detailList.map(i => i.factoryName), }], yAxis: [ { nameTextStyle: { color: '#869CC9', }, - name: '涓囨敮', - nameGap: 24, + name: '杈�', + nameGap: 16, type: 'value', axisLabel: { show: true, @@ -1564,19 +1815,21 @@ { type: 'value', name: '%', - nameGap: 24, + nameGap: 16, min: 0, - max: 100, - interval: 25, axisLabel: { - formatter: '{value}' + color: "#869CC9", + }, + nameTextStyle: { + color: '#869CC9', + padding: [0, 0, 0, 12] }, splitLine: false } ], series: [ { - name: '鎬诲簱瀛�', + name: '褰撴棩鍙敤杩愬姏', type: 'bar', barWidth: 10, barGap: '60%', @@ -1590,11 +1843,11 @@ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ { offset: 0, - color: '#2e6bf3' + color: '#73f0c6' }, { offset: 1, - color: '#5fcbab' + color: '#3f8ca6' } ], false), lineStyle: { @@ -1603,10 +1856,10 @@ }, barBorderRadius: [30, 30, 0, 0], }, - data: dataList5.value.map(i => i.totalStockNum) + data: data7.value.detailList.map(i => (i.totalNum - i.zaituNum)) }, { - name: '褰撳墠搴撳瓨', + name: '褰撴棩鎻愭姤杩愬姏', type: 'bar', barWidth: 10, label: { @@ -1619,15 +1872,15 @@ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ { offset: 0, - color: '#eda13a' + color: '#ed7e32' }, { offset: 0.6, - color: '#dfb44e' + color: '#e99b5c' }, { offset: 1, - color: '#ccc16c' + color: '#e7a774' } ], false), lineStyle: { @@ -1636,10 +1889,10 @@ }, barBorderRadius: [30, 30, 0, 0], }, - data: dataList5.value.map(i => i.nowStockNum) + data: data7.value.detailList.map(i => i.currentNum) }, { - name: '搴撳瓨鍒╃敤鐜�', + name: '杞﹁締鍒╃敤鐜�', type: 'line', smooth: false, showAllSymbol: true, @@ -1652,9 +1905,8 @@ show: false, position: 'top', color: '#fff', - // formatter: '{c}' + '%', }, - data: dataList5.value.map(i => i.stockRataNum) + data: data7.value.detailList.map(i => i.useRate) } ] }) @@ -1664,14 +1916,41 @@ }) } const getData5 = () => { - getStoreenergyDataList({ queryType: activeTabs.value }).then(res => { - console.log('res', res) - dataList5.value = res.data || [] + kzinventoryUseRate().then(res => { + data5.value = res.data + data5.value.detailList.forEach(item => { + if (item.useRate) { + item.useRate = (item.useRate * 100).toFixed(1) + } + + }) initEchart5() + }) + outAbilityUseRate().then(res => { + data6.value = res.data + data6.value.detailList.forEach(item => { + if (item.useRate) { + item.useRate = (item.useRate * 100).toFixed(1) + } + }) initEchart6() + }) + tranportAbilityUseRate().then(res => { + data7.value = res.data + data7.value.detailList.forEach(item => { + // item.useRate = item.useRate * 100 + if (item.useRate) { + item.useRate = (item.useRate * 100).toFixed(1) + } + }) initEchart7() }) + + // initEchart6() + // initEchart7() + } + const autoplayFlag = (list = [], leng = 4, time = 2000) => { if (list.length > leng) { @@ -1685,27 +1964,28 @@ initialSlide: 0, direction: 'vertical', //绔栫洿鏂瑰悜 slidesPerView: 5, - autoplay: autoplayFlag(transportTask.value, 5, 4000), + autoplay: autoplayFlag(transportTask.value, 5, 6000), observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper }) } -const initData = () => { +const changeCity = () => { getData1() + getStockOut() + getMap() getData2() getData3() - getData4() - getData5() } onMounted(() => { - initData() - - initMap() - // initEchart2() - // initEchart3() - // initEchart4() - // initEchart5() + getCity() + changeCity() + getData5() + setInterval(() => { + getCity() + changeCity() + getData5() + }, 1000 * 60 * 10) setTimeout(() => { loopFn1() }, 12000) @@ -1766,6 +2046,8 @@ .left_box_one { margin-top: 20px; padding: 0px 10px 30px 20px; + position: relative; + height: 160px; .content_wrap { display: flex; @@ -1878,12 +2160,29 @@ .second_title { margin-bottom: 10px; + + input { + font-size: 12px; + } } .list_wrap { + position: relative; + .list { height: 200px; overflow: hidden; + } + + .empty { + display: flex; + justify-content: center; + align-items: center; + height: 200px; + + img { + width: 144px; + } } .line { @@ -1905,6 +2204,15 @@ text-overflow: ellipsis; } + .status { + flex: 3.2; + } + } + + .avtive { + background: rgba(1, 171, 254, 0.2); + color: #01D9FE; + font-weight: 600; } .header { @@ -1947,6 +2255,9 @@ .left { display: flex; align-items: center; + position: relative; + + img { width: 16px; @@ -1995,8 +2306,37 @@ .static_wrap { display: flex; justify-content: space-between; - align-items: center; margin: 30px 0 14px; + + .tooltip_wrap { + position: relative; + + &:hover { + .tooltip { + display: block; + } + } + + .tooltip { + display: none; + background: rgba(0, 30, 63, 0.6); + border: 1px solid #003F82; + backdrop-filter: blur(3px); + padding: 10px; + font-size: 15px; + color: #fff; + line-height: 19px; + font-weight: 400; + border-radius: 6px; + width: 230px; + position: absolute; + line-height: 24px; + left: 100%; + top: 50%; + transform: translate(20px, -42%); + z-index: 999999999999999; + } + } .item { display: flex; @@ -2065,27 +2405,29 @@ height: 76px; .content { - flex: 5; + width: 80%; height: 16px; background: rgba(255, 255, 255, 0.13); border-radius: 8px; - margin-right: 4px; + margin-right: 6px; display: flex; position: relative; + } .box { - width: 40%; + width: 80%; height: 16px; background: linear-gradient(270deg, #FF9F02 0%, #FFEA70 100%); border-radius: 8px; position: absolute; top: 0; left: 0; - z-index: 99; + z-index: 9999; .tag { position: absolute; + z-index: 99999; bottom: -30px; right: 0; transform: translate(50%, 0); @@ -2096,6 +2438,9 @@ border-radius: 12px; display: flex; align-items: center; + justify-content: center; + min-width: 76px; + border: 1px solid #FECE01; .icon { position: absolute; @@ -2110,8 +2455,17 @@ } } + .tooltip_wrap { + .tooltip { + z-index: 9999999999; + top: 34px; + transform: translate(70px, -42%); + } + } + .tag1 { background-color: #28F0CC; + border: 1px solid #28F0CC; .icon { background-color: #28F0CC; @@ -2120,9 +2474,50 @@ } .box1 { - width: 70%; + width: 10%; z-index: 9; - background: linear-gradient(270deg, #15FDC8 0%, #006BFF 100%); + background: linear-gradient(270deg, #68dfd3 0%, #006BFF 100%); + } + + .box11 { + background: linear-gradient(270deg, #75f8cc 0%, #68dfd3 100%); + } + + .box22 { + background: linear-gradient(270deg, #f2a43b 0%, #ecbb61 100%); + } + + .box23 { + background: linear-gradient(270deg, #f4b34a 0%, #FFEA70 100%); + } + + .tooltip_wrap { + /* position: relative; */ + + &:hover { + .tooltip { + display: block; + } + } + + .tooltip { + display: none; + background: #071b32; + border: 1px solid #003F82; + /* backdrop-filter: blur(3px); */ + padding: 10px; + font-size: 15px; + color: #fff; + line-height: 19px; + font-weight: 400; + border-radius: 6px; + width: 200px; + position: absolute; + z-index: 99999999; + left: 100%; + top: 50%; + transform: translate(30px, -42%); + } } .scale { @@ -2131,14 +2526,22 @@ left: 0; font-size: 16px; color: #D2E0FF; + + .tooltip_wrap { + .tooltip { + width: 240px; + transform: translate(20px, -50%); + } + } } .scale1 { - left: 84%; + left: 92%; + min-width: 36px; } .side { - flex: 2; + flex: 1; height: 16px; background: rgba(255, 255, 255, 0.13); border-radius: 8px; @@ -2159,34 +2562,54 @@ /* transform: scale(.2); */ } - .list { + .modal1 { + width: 500px; + height: 192px; + background: rgba(0, 86, 255, 0.1); + backdrop-filter: blur(5px); + padding: 12px 30px; position: absolute; - left: 24px; - bottom: 10px; + top: 36px; + left: 12px; + border: 1px solid #4ba7f7; + z-index: 999999; - .item { - display: flex; - align-items: center; - font-size: 15px; - color: #D2E0FF; - margin-top: 20px; - .icon { - width: 22px; - height: 22px; - background: rgba(255, 125, 9, 0.8); - margin-right: 12px; - } - .icon2{ - background: rgba(254,175,1,0.8); - } - .icon3{ - background: rgba(9,250,205,0.8); - } - .icon4{ - background: #225BA1; + .content { + .list { + height: 128px; + overflow: auto; } + .line { + display: flex; + align-items: center; + height: 32px; + color: #fff; + font-size: 12px; + + &:nth-of-type(2n) { + background: rgba(134, 156, 201, 0.05); + } + + .item { + flex: 3; + } + + .addr { + flex: 5; + display: flex; + flex-wrap: nowrap; + overflow: hidden; + } + } + + .head { + font-weight: 500; + font-size: 13px; + color: #01D9FE; + } } + } } } @@ -2208,6 +2631,118 @@ } } } + + .question { + display: flex; + align-items: center; + + &:hover { + .hover_wrap { + display: block; + } + } + + .hover_wrap { + display: none; + position: absolute; + left: 130px; + z-index: 999; + top: -5px; + width: 420px; + height: 148px; + background: rgba(0, 30, 63, 0.6); + border: 1px solid #003F82; + backdrop-filter: blur(3px); + padding: 10px; + font-size: 13px; + color: #ebf1fb; + line-height: 19px; + font-weight: 400; + border-radius: 6px; + + div { + margin-bottom: 3px; + } + + .triangle { + width: 12px; + height: 12px; + position: absolute; + top: 10px; + left: -6px; + transform: rotate(45deg); + border-left: 1px solid #003F82; + border-bottom: 1px solid #003F82; + background: rgba(0, 30, 63, 0.6); + backdrop-filter: blur(3px); + } + + .title { + font-weight: bold; + font-size: 14px; + color: #e2ebfd; + } + } + } +} + +.question1 { + display: flex; + align-items: center; + + .hover_con { + position: relative; + + &:hover { + .hover_wrap { + display: block; + } + } + } + + + .hover_wrap { + display: none; + + position: absolute; + left: 108%; + z-index: 999; + top: -5px; + width: 212px; + height: 62px; + background: rgba(0, 30, 63, 0.6); + border: 1px solid #003F82; + backdrop-filter: blur(3px); + padding: 10px; + font-size: 15px; + color: #e9f0ff; + line-height: 19px; + font-weight: 400; + border-radius: 6px; + + div { + margin-bottom: 3px; + } + + + .title { + color: #e2ebfd; + } + } +} + +.triangle { + width: 12px; + height: 12px; + position: absolute; + top: 36%; + transform: translate(-50%, -50%); + left: -6px; + transform: rotate(45deg); + border-left: 1px solid #003F82; + border-bottom: 1px solid #003F82; + background: rgba(0, 30, 63, 0.6); + /* backdrop-filter: blur(3px); */ } .main_header { @@ -2317,21 +2852,58 @@ width: 600px; height: 556px; background: rgba(0, 30, 63, 0.5); - border: 1px solid #c6eef7; + /* border: 1px solid #c6eef7; */ backdrop-filter: blur(5px); position: fixed; top: 20%; left: 50%; transform: translate(-50%, 0); - z-index: 999; + z-index: 99999; padding: 24px; + + #map-container { + width: 260px; + height: 320px; + position: absolute; + top: 190px; + right: 20px; + z-index: 999999; + border-radius: 2px; + + :deep(.amap-markers) { + left: -12px !important; + top: -32px !important; + } + } + + .stock { + display: flex; + align-items: center; + color: #dd5d2a; + margin-bottom: 8px; + + img { + margin-right: 6px; + width: 14px; + } + } .title_head { display: flex; align-items: center; - font-weight: bold; - font-size: 17px; - margin-bottom: 20px; + justify-content: space-between; + margin-bottom: 8px; + + .left { + display: flex; + align-items: center; + font-weight: bold; + font-size: 17px; + } + + .tit_status { + color: #af8832; + } img { width: 20px; @@ -2342,10 +2914,14 @@ .info { display: flex; flex-wrap: wrap; + background-color: #0d2845; + border-radius: 4px; + padding: 10px 20px 0px; + margin-bottom: 16px; .item { display: flex; - align-items: center; + /* align-items: center; */ font-size: 13px; width: 55%; margin-bottom: 8px; @@ -2360,67 +2936,22 @@ background-color: #fff; border-radius: 50%; margin-right: 4px; + margin-top: 7px; } .la { color: #01D9FE; + width: 70px; + } + + .val { + flex: 1; } } } - .tabs { - display: flex; - border-bottom: 1px solid rgba(255, 255, 255, 0.16); - margin: 0 -24px; - margin-bottom: 20px; - padding-left: 12px; - - .tab { - color: #869CC9; - font-size: 14px; - margin-left: 12px; - height: 42px; - display: flex; - align-items: center; - justify-content: center; - border-bottom: 2px solid #06182e; - cursor: pointer; - } - - .active { - font-weight: 500; - font-size: 15px; - color: #00F2F3; - border-bottom: 2px solid #00F2F3; - } - } - - .ht_info { - display: flex; - flex-wrap: wrap; - padding: 10px 10px 0; - background-color: #0d2845; - margin-bottom: 20px; - - .item { - display: flex; - align-items: center; - font-size: 13px; - width: 55%; - margin-bottom: 8px; - - &:nth-of-type(2n+1) { - width: 45%; - } - - .la { - color: #01D9FE; - } - } - } - - .tab1 { - .title { + .logistics_wrap { + .m_title { display: flex; align-items: center; font-style: 16px; @@ -2433,64 +2964,118 @@ } } - .item { - display: flex; - margin-left: 6px; + .fu_list { + height: 310px; + width: 290px; + margin-top: 20px; + overflow: auto; - &:nth-last-child(1) { - .content { - .time { - padding-bottom: 0; + .fu_item { + position: relative; + + .item_title { + margin-bottom: 6px; + + .icon { + width: 36px; + display: flex; + + img { + width: 20px; + height: 20px; + } } } } + .separate { + height: calc(100% - 8px); + /* width: 1px; */ + border: 1px dashed #576783; + /* border: 1px dashed red; */ + position: absolute; + left: 10px; + top: 20px; + z-index: -1; + } + + .title { + font-weight: 500; + font-size: 16px; + color: #222222; + margin-bottom: 10px; + } + + .line { + display: flex; + margin-bottom: 12px; + + .label { + color: #becbe9; + margin-right: 20px; + } + + .val {} + } + + .item_title { + font-weight: 600; + font-size: 16px; + display: flex; + align-items: center; + display: flex; + + .icon {} + } + .icon_wrap { width: 24px; - margin-right: 10px; + margin-right: 15px; display: flex; - flex-direction: column; align-items: center; + justify-content: center; - .dian { - width: 12px; - height: 12px; - } - - .dian_ac { + .icon { width: 24px; height: 24px; - } - - .line { - width: 1px; - height: 100%; - border: 1px dashed #8a9bc5; + position: relative; + z-index: 2; } } - .content { - font-size: 13px; - color: #D2E0FF; - - .status { - font-weight: 500; - font-size: 14px; - margin-bottom: 5px; - color: #fff; - } + .item { + position: relative; + color: #b1bfdc; + margin-bottom: 15px; .text { - margin-bottom: 4px; + color: #b1bfdc; + margin-bottom: 6px; + width: 100%; } + .icon { + width: 10px; + height: 10px; + position: relative; + z-index: 2; + } + + .h2 { + display: flex; + align-items: center; + } + + .h1 {} + .time { + padding-left: 39px; font-size: 12px; - padding-bottom: 12px; } } } } + } @@ -2500,8 +3085,8 @@ height: 100%; top: 0; left: 0; - z-index: 99; - background-color: rgba(0, 0, 0, 0.1); + z-index: 9999; + /* background-color: rgba(0, 0, 0, 0.0); */ /* background-color: red; */ } @@ -2520,6 +3105,12 @@ font-weight: 500; font-size: 16px; color: #FFFFFF; + position: relative; + + .hover_wrap { + left: 175px; + height: 80px; + } .icon { width: 16px; @@ -2548,7 +3139,7 @@ align-items: center; font-size: 14px; color: #869CC9; - width: 96px; + width: 110px; height: 28px; border-radius: 14px; border: 1px solid #869CC9; @@ -2642,4 +3233,4 @@ object-fit: cover; z-index: -1; } -</style> \ No newline at end of file +</style> -- Gitblit v1.9.3