reportDetail.vue 134 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849
  1. <template>
  2. <div>
  3. <div class="page_main">
  4. <div class="download_box">
  5. <el-button size="small" class="ml20" @click="exportClick()">下载报告</el-button>
  6. </div>
  7. <div class="page_header">
  8. 环境管理周报告
  9. <span>({{this.startDate&&moment(this.startDate).format("MM.DD")}}-{{this.endDate&&moment(this.endDate).format("MM.DD")}})</span>
  10. <span class="pname">{{projectName}}</span>
  11. </div>
  12. <!-- start 环境概况 -->
  13. <section class="env_module title_one_table mb16">
  14. <div class="sj_title title_one">环境概况</div>
  15. <el-table class="sj_table" :data="surveyTable.slice(0,5)" :row-class-name="tableRowClassName" :header-cell-style="{background:'#3399ff !important',color:'#ffffff',padding:'10px 0'}">
  16. <el-table-column align="left" label="" width="30"></el-table-column>
  17. <el-table-column align="left" prop="name" label="环境参数"></el-table-column>
  18. <el-table-column align="left" prop="weeknormalProprotion" label="周达标率">
  19. <template slot-scope='{row}'>
  20. {{row.weeknormalProprotion+'%'}}
  21. </template>
  22. </el-table-column>
  23. <el-table-column align="left" prop="weekAvg" label="周平均">
  24. <template slot-scope='{row}'>
  25. {{row.weekAvg+row.unit}}
  26. </template>
  27. </el-table-column>
  28. <el-table-column align="left" prop="assess" label="评价"></el-table-column>
  29. </el-table>
  30. <div class="title_tips big_tips"><i class="el-icon-warning-outline"></i>数据来源:物联网传感器数据监测备份</div>
  31. <!-- 用户调节 -->
  32. <userAdjust :projectId="projectId" :energyDate="surveyTable[6]" :userAdjust="surveyTable[5]" class="mp40"/>
  33. </section>
  34. <!-- end 环境概况 -->
  35. <!-- 3.0.0添加各种参数类型 -->
  36. <!-- start 本周环境温度概况 -->
  37. <section class="env_module mb16">
  38. <!--可切换参数 -->
  39. <Tabs type="card" :data="envTypelistnow" v-model="envType" class="daytabs"/>
  40. <div class="sj_title">本周环境概况</div>
  41. <envSurvey :surveyTable="surveyTable[currentEnv]" :envType="envType"></envSurvey>
  42. <!-- 根据参数显示内容 -->
  43. <div class="pm_container" v-if="envType=='PM2d5'">
  44. <p>各PM2.5浓度区间累计时长及占比</p>
  45. <div class="pm_table">
  46. <div class="left">
  47. <div class="pm_chart">
  48. <ringChart :chartId="'pm_chart'+exportPdf" :color-arr="pmchartColor" :chart-date="pmDate"/>
  49. </div>
  50. <div class="pm_count">总空间数量:<span>{{chartweekDate.registeredSpaceNum&&chartweekDate.registeredSpaceNum.filter(Boolean)[0]}}</span></div>
  51. <div class="title_tips"><i class="el-icon-warning-outline"></i>各评价标准累计时长一定程度上反映出当前建筑的整体PM2.5浓度所处的水平</div>
  52. </div>
  53. <div class="right">
  54. <el-table size="mini" :data="pmDate" :header-cell-style="{background:'#F8F9FA!important',color:'#646A73',padding:'6px 0'}">
  55. <el-table-column align="left" label="" width="30"></el-table-column>
  56. <!--{assessStandard:"WELL铂金级",range:"0~15"}, -->
  57. <el-table-column align="left" prop="name" label="评价标准"></el-table-column>
  58. <el-table-column align="left" prop="evaluationScope" label="范围(μg/m3)"></el-table-column>
  59. <el-table-column align="left" label="周累计时长(h)" prop="accumulatedTime"></el-table-column>
  60. <el-table-column align="left" label="时长占比(%)" prop="proportion"></el-table-column>
  61. </el-table>
  62. </div>
  63. </div>
  64. </div>
  65. <div class="title_tips" v-if="envType=='Tdb'"><i class="el-icon-warning-outline"></i>评价标准、达标标准、计算方法见数据解释</div>
  66. <div class="content_title mp40"><span>{{contentTitle(envType)}}</span></div>
  67. <div class="content_title_noline mb32">{{seccontentTitle(envType)}}</div>
  68. <chartLegend class="charttext_p" :legend-type="envType" :num-type="false"/>
  69. <!-- 折线图 -->
  70. <lineChart v-if="!isUserorEngry(envType)" :chart-id="chartId" :chart-date="chartweekDate" :env-type="envType" :xType="dayType"/>
  71. <!-- 柱状图 -->
  72. <barChart :numberChart="isUserorEngry(envType)" :chart-id="chartId+'1'" :key="envType" :chart-date="chartweekDate" :env-type="envType" :xType="dayType"/>
  73. <!-- 服务空间数 -->
  74. <div class="room_table" v-if="!isUserorEngry(envType)">
  75. <div class="room_table_number">
  76. <div>服务空间数(总:{{chartweekDate.registeredSpaceNum&&chartweekDate.registeredSpaceNum.filter(Boolean)[0]}})</div>
  77. <div>
  78. <div v-for="(item,index) in chartweekDate.daySpaceNum" :key="index">
  79. {{item}}
  80. </div>
  81. </div>
  82. </div>
  83. </div>
  84. <div class="room_table room_table_user" v-if="envType==='userAdjust'">
  85. <div class="room_table_number">
  86. <div>异常热调节</div>
  87. <div>
  88. <div v-for="(item,index) in chartweekDate.feedbackAbnorHotNum" :key="index">
  89. {{item}}
  90. </div>
  91. </div>
  92. </div>
  93. <div class="room_table_number" :style="{'margin-top':0}">
  94. <div>异常冷调节</div>
  95. <div>
  96. <div v-for="(item,index) in chartweekDate.feedbackAbnorColdNum" :key="index">
  97. {{item}}
  98. </div>
  99. </div>
  100. </div>
  101. <div class="room_table_number" :style="{'margin-top':0}">
  102. <div>吹风调节</div>
  103. <div>
  104. <div v-for="(item,index) in chartweekDate.feedbackNoisyHotNum" :key="index">
  105. {{item}}
  106. </div>
  107. </div>
  108. </div>
  109. </div>
  110. <section v-if="envType=='Tdb'">
  111. <div class="content_title_noline mb40"><span>逐刻平均温度及达标空间数量变化趋势</span></div>
  112. <chartLegend class="charttext_p charttext_mt mb40" :num-type="false"/>
  113. <lineChart :chart-id="chartId+'zhou'" :contant="true" :chart-date="chartweekTemp" :xType="hourType"/>
  114. <barChart :chart-id="chartId+'zhou1'" :chart-date="chartweekTemp" :xType="hourType"/>
  115. <!-- <div class="title_tips"><i class="el-icon-warning-outline"></i>评价标准、达标标准、计算方法见数据解释</div> -->
  116. </section>
  117. <div class="addmark" :key="envType+'11'">
  118. <div class="remarkshow remark_input" title="点击即可编辑" v-if="!quarterRemarkEdit" @click="toRemarkedit('quarterRemark')">{{quarterRemark[envType]}}</div>
  119. <section v-else>
  120. <el-input class="remark_input" type="textarea" :rows="2" v-model="quarterRemark[envType]" placeholder="添加备注"></el-input>
  121. <el-button type="primary" size="small" @click="saveRemark('quarterRemark')">保存</el-button>
  122. <el-button @click="cancelRemark('quarterRemark')" size="small">取消</el-button>
  123. </section>
  124. </div>
  125. <div class="hcho_parame" v-if="envType=='HCHO'">
  126. <div class="content_title mp40"><span>异常空间</span><span>(超标率排序)</span></div>
  127. <el-table size="mini" :data="hchogirdDate" :header-cell-style="{background:'#F8F9FA!important',color:'#646A73',padding:'6px 0'}">
  128. <el-table-column label='序号' prop width='80' type='index' align="left"></el-table-column>
  129. <el-table-column property="spaceName" width='130' label="空间名称" align="left"></el-table-column>
  130. <el-table-column property="abnormalProprotion" width='130' label="超标率(%)" align="left"></el-table-column>
  131. <el-table-column property="hchoAbnormalTime" width='130' label="超标时长(h)" align="left"></el-table-column>
  132. <el-table-column property="hchoMaxSolubility" width='150' label="峰值浓度(mg/m³)" align="left"></el-table-column>
  133. <el-table-column property="assess" width='130' label="峰值浓度评价" align="left">
  134. <template slot-scope='{row}'>
  135. <span :style="{color:row.assess=='较高'?'#C6322B':'#1F2329'}">{{row.assess}}</span>
  136. </template>
  137. </el-table-column>
  138. <el-table-column label="解释" align="center">
  139. <template slot-scope='{row}'>
  140. <el-input v-model="row.hchoRemark" size="small" maxlength="24" @blur="changeInput(row,'hcho')"></el-input>
  141. </template>
  142. </el-table-column>
  143. </el-table>
  144. </div>
  145. <div class="co2_parame" v-if="envType=='CO2'">
  146. <div class="content_title mp40"><span>异常空间</span><span>(超标率排序)</span></div>
  147. <el-table size="mini" :data="co2girdDate" :header-cell-style="{background:'#F8F9FA!important',color:'#646A73',padding:'6px 0'}">
  148. <el-table-column label='序号' prop width='80' type='index' align="left"></el-table-column>
  149. <el-table-column property="spaceName" width='130' label="空间名称" align="left"></el-table-column>
  150. <el-table-column property="abnormalProprotion" width='130' label="超标率(%)" align="left"></el-table-column>
  151. <el-table-column property="co2AbnormalTime" width='130' label="超标时长(h)" align="left"></el-table-column>
  152. <el-table-column property="co2MaxSolubility" width='150' label="峰值浓度(ppm)" align="left"></el-table-column>
  153. <el-table-column property="assess" width='130' label="峰值浓度评价" align="left">
  154. <template slot-scope='{row}'>
  155. <span :style="{color:row.assess=='较高'?'#DCAA04':'#1F2329'}">{{row.assess}}</span>
  156. </template>
  157. </el-table-column>
  158. <el-table-column label="解释" align="center">
  159. <template slot-scope='{row}'>
  160. <el-input v-model="row.co2Remark" size="small" maxlength="24" @blur="changeInput(row,'co2')"></el-input>
  161. </template>
  162. </el-table-column>
  163. </el-table>
  164. <div class="content_title_noline mp40 mb16">参数释义</div>
  165. <ul class="paramlist ft12">
  166. <li>
  167. <p><span><b>CO₂:</b>通常作为建筑空间新风是否充足的量化参数</span></p>
  168. <div>
  169. <el-table class="co2table ft12" :data="co2Date" border :header-cell-style="{background:'#ffffff!important',color:'#606266',padding:'6px 0'}">
  170. <!-- <el-table-column width="30"></el-table-column> -->
  171. <el-table-column label="序号" type="index" width="60" align="left"></el-table-column>
  172. <el-table-column label="CO₂浓度区间" prop="area" align="left" width="150"></el-table-column>
  173. <el-table-column label="评价" prop="assess" align="left" width="200"></el-table-column>
  174. <el-table-column label="环境感受" prop="feel" align="left"></el-table-column>
  175. </el-table>
  176. <div class="title_tips"><i class="el-icon-warning-outline"></i>室外新鲜空气一般在 400~500ppm</div>
  177. </div>
  178. </li>
  179. </ul>
  180. </div>
  181. <div class="rh_parame" v-if="envType=='RH'">
  182. <div class="content_title_noline mp40 mb16">参数解释</div>
  183. <ul class="paramlist ft12">
  184. <li>
  185. <p><i></i><span><b>相对湿度</b></span></p>
  186. <div style="margin-top:8px">评价空气中的水蒸气的相对含量</div>
  187. </li>
  188. <li>
  189. <p><i></i><span><b>舒适范围</b></span></p>
  190. <div>
  191. <div class="hum_list">
  192. <div><span>供暖季</span>30%~60%</div>
  193. <div><span>供冷季</span>40%~60%</div>
  194. <div><span>过渡季</span>30%~60%</div>
  195. </div>
  196. </div>
  197. </li>
  198. <li>
  199. <p><i></i><span><b>参数评价</b></span></p>
  200. <p class="rh_img"><img src="../../../../static/images/hot.png" alt=""/>干燥:低于上述区间 </p>
  201. <p class="rh_img"><img src="../../../../static/images/cold.png" alt=""/>偏湿:高于上述区间 </p>
  202. </li>
  203. <li>
  204. <p><i></i><span><b>相对湿度的影响</b><br></span></p>
  205. <div style="margin-top:8px">
  206. 高湿度可促进微生物病原体(如细菌、尘螨和霉菌)的聚集和生长,同时湿度过高可能会增加建筑材料释放气体:相对湿度增加 35%可使甲醛释放量增加 1.8-2.6 倍。 低湿度会导致气道、皮肤、眼 睛、咽喉和粘膜的干燥和刺激。也与病毒较长的存活率有关(活性失去较慢)
  207. </div>
  208. </li>
  209. </ul>
  210. </div>
  211. <div class="pm_parame" v-if="envType=='PM2d5'">
  212. <div class="content_title_noline mp40 mb16"><span>参数释义</span></div>
  213. <ul class="paramlist ft12">
  214. <li>
  215. <p><i></i><span><b>PM2.5简介</b><br>大气中空气动力学当量直径小于或等于 2.5 微米的颗粒物,也称为可入肺颗粒物;</span></p>
  216. </li>
  217. <li>
  218. <p><i></i><span><b>达标率</b><br>参数良好级别及以上,浓度≤75 μg/m3;超出此数值记为超限。</span></p>
  219. </li>
  220. <li>
  221. <p><i></i><span>WELL标准中,对不同PM2.5浓度所在区间所能申请的标准(铂金级、金级、银级),均有对应的先决条件。如:在 PM2.5 浓度为 20μg/m3,最高只能达到 WELL 金级标准。</span></p>
  222. </li>
  223. </ul>
  224. </div>
  225. <div class="ad_parame" v-if="envType=='userAdjust'">
  226. <div class="content_title_noline mp40 mb16"><span>解释说明</span>:用户异常反馈的几种情况</div>
  227. <ul class="paramlist ft12">
  228. <li>
  229. <p><i></i><span><b>环境温度高,用户反馈“热”</b></span></p>
  230. </li>
  231. <li>
  232. <p><i></i><span><b>用户2次反馈“热”</b></span></p>
  233. </li>
  234. <li>
  235. <p><i></i><span><b>用户1次反馈“吹风”</b></span></p>
  236. </li>
  237. <li>
  238. <p><i></i><span><b>环境温度低,用户反馈“冷”</b></span></p>
  239. </li>
  240. <li>
  241. <p><i></i><span><b>用户2次反馈“冷”</b></span></p>
  242. </li>
  243. <li>
  244. <p><span><b>用户通过app(小程序)调节空调,反馈冷热</b></span></p>
  245. </li>
  246. </ul>
  247. </div>
  248. <!-- start 环境温度分析 -->
  249. <section class="mb16" v-if="envType=='Tdb'">
  250. <div class="content_title"><span>环境温度分析(空间维度)</span></div>
  251. <div class="sj_reminder mb32">
  252. <p>温馨提示:</p>
  253. <p>1.空间划分维度:内外区、朝向、楼层、新风机组各自服务的空间四个维度,分别进行周不达标率分析计算。</p>
  254. <p>2.数据表:每个空间划分维度均有对应的空间数量。</p>
  255. <p>3.朝向维度仅外区空间,其中内区空间无朝向。</p>
  256. </div>
  257. <div class="sj_chartbox">
  258. <div class="pr65">
  259. <div class="day_title mb32">内、外区</div>
  260. <barChart :chart-id="'echart_left_out'" :chart-date="localtionDate.regionsChart" :sjChartType="'regions'" class="daychart"/>
  261. <div class="chart_sj_bottom mb40">
  262. <div>空间数量</div>
  263. <div class="chart_sj_bottom_main">
  264. <div v-for="(item,index) in localtionDate.regionsChart.spaceNum" :key="index">{{item}}</div>
  265. </div>
  266. </div>
  267. </div>
  268. <div>
  269. <div class="day_title mb32">各个朝向<chartLegend :avgTemp="false" class="charttext"/></div>
  270. <barChart :chart-id="'echart_left_orientation'" :chart-date="localtionDate.orientationChart" :sjChartType="'orientation'" class="daychart"/>
  271. <div class="chart_sj_bottom mb40">
  272. <div class="twoline">空间数量</div>
  273. <div class="chart_sj_bottom_main">
  274. <div v-for="(item,index) in localtionDate.orientationChart.spaceNum" :key="index">{{item}}</div>
  275. </div>
  276. </div>
  277. </div>
  278. </div>
  279. <div class="sj_chartbox">
  280. <div class="pr65">
  281. <div class="day_title mb32">各个楼层</div>
  282. <barChart :chart-id="'echart_left_floor'" :chart-date="localtionDate.floorChart" :sjChartType="'localtion'" class="daychart"/>
  283. <div class="chart_sj_bottom">
  284. <div class="twoline">空间数量</div>
  285. <div class="chart_sj_bottom_main">
  286. <div v-for="(item,index) in localtionDate.floorChart.spaceNum" :key="index">{{item}}</div>
  287. </div>
  288. </div>
  289. </div>
  290. <div>
  291. <!-- <div class="day_title mb32">新风机组服务的空间</div>
  292. <barChart :chart-id="'echart_left_unit'" :chart-date="localtionDate.freshAirChart" :sjChartType="'freshAir'" class="daychart"/>
  293. <div class="chart_sj_bottom">
  294. <div class="twoline">空间数量</div>
  295. <div class="chart_sj_bottom_main">
  296. <div v-for="(item,index) in localtionDate.freshAirChart.spaceNum" :key="index">{{item}}</div>
  297. </div>
  298. </div> -->
  299. </div>
  300. </div>
  301. <div class="addmark">
  302. <div class="remarkshow remark_input" title="点击即可编辑" v-if="!typeRemarkEdit" @click="toRemarkedit('typeRemark')">{{typeRemark}}</div>
  303. <section v-else>
  304. <el-input class="remark_input" type="textarea" :rows="2" v-model="typeRemark" placeholder="添加备注"></el-input>
  305. <el-button type="primary" size="small" @click="saveRemark('typeRemark')">保存</el-button>
  306. <el-button @click="cancelRemark('typeRemark')" size="small">取消</el-button>
  307. </section>
  308. </div>
  309. </section>
  310. <!-- end 环境温度分析 -->
  311. <!-- start 各达标区间空间数量分布及异常冷热空间列表 -->
  312. <section class="mb16" v-show="envType=='Tdb'">
  313. <div class="content_title"><span>各达标区间空间数量分布及异常冷热空间列表</span></div>
  314. <div class="content_title_noline mb16">各达标区间空间数量分布</div>
  315. <div class="up_distribution">
  316. <div class="up_distribution_text"><span></span>达标率偏低,亟待解决</div>
  317. <barChart :chart-id="'echart_left_week'" :chart-date="StandardList" :weekNormalChart="true" :y-type="yType" class="daychart"/>
  318. </div>
  319. <div class="title_tips mb52"></div>
  320. <div class="content_body">
  321. <div class="body_title"><span>偏热空间</span><span class="tabletag taghot">偏热</span></div>
  322. <el-table size="mini" :data="hotgirdDate" :height="520" :header-cell-style="{background:'#F8F9FA!important',color:'#646A73',padding:'6px 0'}">
  323. <el-table-column label='序号' prop width='80' type='index' align="left"></el-table-column>
  324. <el-table-column property="spaceName" width='130' label="空间名称" align="left"></el-table-column>
  325. <el-table-column property="avgTemp" width='100' label="周均温度(°C)" align="left"></el-table-column>
  326. <el-table-column property="hotProprotion" width='120' label="周偏热不达标(%)" align="left"></el-table-column>
  327. <el-table-column property="serviceTime" width='110' label="周服务时长(h)" align="left"></el-table-column>
  328. <el-table-column property="validProprotion" width='110' label="周有效数据(%)" align="left"></el-table-column>
  329. <el-table-column property="hotNum" width='120' label="周累计热反馈数" align="left"></el-table-column>
  330. <el-table-column label="解释" align="center">
  331. <template slot-scope='{row}'>
  332. <el-input v-model="row.hotRemark" size="small" maxlength="24" @blur="changeInput(row,'hot')"></el-input>
  333. </template>
  334. </el-table-column>
  335. </el-table>
  336. <div class="body_title body_coldtitle"><span>偏冷空间</span><span class="tabletag tagclod">偏冷</span></div>
  337. <el-table size="mini" :data="coldgirdDate" :height="520" :header-cell-style="{background:'#F8F9FA!important',color:'#646A73',padding:'6px 0'}">
  338. <el-table-column label='序号' prop width='80' type='index' align="left"></el-table-column>
  339. <el-table-column property="spaceName" width='130' label="空间名称" align="left"></el-table-column>
  340. <el-table-column property="avgTemp" width='100' label="周均温度(°C)" align="left"></el-table-column>
  341. <el-table-column property="coldProprotion" width='120' label="周偏冷不达标(%)" align="left"></el-table-column>
  342. <el-table-column property="serviceTime" width='110' label="周服务时长(h)" align="left"></el-table-column>
  343. <el-table-column property="validProprotion" width='110' label="周有效数据(%)" align="left"></el-table-column>
  344. <el-table-column property="coldNum" width='120' label="周累计冷反馈数" align="left"></el-table-column>
  345. <el-table-column label="解释" align="center">
  346. <template slot-scope='{row}'>
  347. <el-input v-model="row.coldRemark" maxlength="24" size="small" @blur="changeInput(row,'cold')"></el-input>
  348. </template>
  349. </el-table-column>
  350. </el-table>
  351. </div>
  352. </section>
  353. <!-- end 各达标区间空间数量分布及异常冷热空间列表 -->
  354. <!-- start 每日环境详情 -->
  355. <section class="mb16" v-show="envType=='Tdb'">
  356. <div class="content_title"><span>每日环境详情</span></div>
  357. <Tabs type="card" :data="dayData" v-model="tableItem" class="daytabs"/>
  358. <div v-if="dataDeal">
  359. <div class="pageitem_box" v-for="(item,index) in daysDateCurrent" :key="index" :id="'list'+item.name">
  360. <!-- <div class="content_title"><span>每日环境详情(周{{item.pname}})</span></div> -->
  361. <div class="content_body">
  362. <div class="day_title oneday_title">逐刻平均温度及达标空间数量变化趋势</div>
  363. <chartLegend class="charttext" :dot-line="true"/>
  364. <lineChart :chart-id="'echart_top'+item.name" :chart-date="item.chartDate" :contant="true" :xType="hourType"/>
  365. <barChart :chart-id="'echart_bottom'+item.name" :chart-date="item.chartDate" :numberChart="true" :x-type="hourType" :y-type="yType"/>
  366. <div class="room_table">
  367. <div class="room_table_number">
  368. <div>室外温度(°C)</div>
  369. <div>
  370. <div v-for="(items,sgin) in item.chartDate.outSideTemp" :key="sgin">
  371. {{items}}
  372. </div>
  373. </div>
  374. </div>
  375. </div>
  376. <div class="twochart_box">
  377. <div>
  378. <div class="day_title">各房间日均温度分布</div>
  379. <barChart :chart-id="'echart_left'+item.name" :temp-color="true" :chart-date="item.chartDateLeft" :normalChart="true" :y-type="yType" class="daychart"/>
  380. </div>
  381. <div>
  382. <div class="day_title">各楼层日均温及偏冷(热)空间数量</div>
  383. <lineChart :x-type="floorType" :chart-id="'echart_righttop'+item.name" :chart-date="item.chartDateRight" :contant="true" class="daylinechart"/>
  384. <barChart :chart-id="'echart_rightbottom'+item.name" :x-type="floorType" :y-type="yType" :numberChart="true" :chart-date="item.chartDateRight" class="daybarchart"/>
  385. </div>
  386. </div>
  387. </div>
  388. </div>
  389. </div>
  390. </section>
  391. <!-- end 每日环境详情 -->
  392. <!-- start 用户及名词解释 -->
  393. <section class="mb16" v-show="envType=='Tdb'">
  394. <div class="content_title"><span>用户活跃度统计(周)</span></div>
  395. <div class="user_total">
  396. <div v-if="projectId!=='Pj1101020002'">
  397. <div>用户总数量</div>
  398. <div><span>{{userDate.userRegistNum}}</span></div>
  399. </div>
  400. <div v-if="projectId!=='Pj1101020002'">
  401. <div>周活跃用户数量</div>
  402. <div><span>{{userDate.userActiveNum}}</span></div>
  403. </div>
  404. <div>
  405. <div>用户与系统互动数量</div>
  406. <div><span>{{userDate.userSysNum}}</span></div>
  407. </div>
  408. <div>
  409. <div>用户问题反馈数量</div>
  410. <div><span>{{userDate.UserFbNum}}</span></div>
  411. </div>
  412. <div>
  413. <div>帮用户解决问题</div>
  414. <div><span>{{userDate.solveFbNum}}</span></div>
  415. </div>
  416. </div>
  417. <div class="content_title"><span>环境管理周报数据解释</span></div>
  418. <section>
  419. <div class="content_title_noline mb16">名词解释</div>
  420. <ul class="paramlist ft12">
  421. <li v-for="(item,index) in expTerms" :key="index">
  422. <p><i></i><span><b>{{item.name}}</b>{{item.content}}</span></p>
  423. </li>
  424. </ul>
  425. </section>
  426. <section>
  427. <div class="content_title_noline mb16">计算说明</div>
  428. <ul class="paramlist paramlist_explain ft12">
  429. <li>
  430. <p><i></i><span><b>温度评价</b></span></p>
  431. <p>“偏冷”、“舒适”、“偏热”。以平均温度的不同区间对应,区间对应如下:</p>
  432. <div>
  433. <div class="hum_list">
  434. <div><img src="../../../../static/images/cold.png" alt="" srcset=""/> &ensp;偏冷 &nbsp;&nbsp;&nbsp; 平均温度&lt;20°C</div>
  435. <div><img src="../../../../static/images/happy.png" alt="" srcset=""/> &ensp;舒适 &nbsp;&nbsp;&nbsp;平均温度 20°C~25°C</div>
  436. <div><img src="../../../../static/images/hot.png" alt="" srcset=""/> &ensp;偏热 &nbsp;&nbsp;&nbsp;平均温度&gt;25°C</div>
  437. </div>
  438. </div>
  439. </li>
  440. <li>
  441. <p><i></i><span><b>周达标率计算</b></span></p>
  442. <div class="ml17">
  443. <p>单个空间当前时刻是否达标的判断方法:min(当前时刻服务定制温度下限,合同约定 温度范围下限)&lt;当前环境温度&lt;max(当前时刻服务定制温度上限,合同约定温度范 围上限),满足上述区间内,视为达标;</p>
  444. <p>低于区间,视为偏冷;</p>
  445. <p>高于区间,视为偏热。</p>
  446. </div>
  447. <p class="ml17">所有空间一周时间达标率的判断方法:所有空间所有存在空调服务的累计时间中,判断为达标的时间占比,即周达标率。</p>
  448. <p class="ml17">偏冷(热)率的计算如上。</p>
  449. </li>
  450. </ul>
  451. </section>
  452. <section>
  453. <div class="content_title_noline mb16">合约与管控时间段</div>
  454. <el-table class="sj_table ft12" :data="custormList" :header-cell-style="{background:'#F8F9FA!important',padding:'6px 0'}">
  455. <el-table-column align="left" width="40" ></el-table-column>
  456. <el-table-column align="left" prop="objectName" label="空间组" ></el-table-column>
  457. <el-table-column align="left" label="合同约定温度达标区间">
  458. <template slot-scope='{row}'>
  459. {{row.minValue}}~{{row.maxValue}}
  460. </template>
  461. </el-table-column>
  462. <el-table-column align="left" label="环境保障时间段(工作日)">
  463. <template slot-scope='{row}'>
  464. {{row.startTime&&(row.startTime.slice(0,2)+':'+row.startTime.slice(2,4))}}~{{row.endTime&&(row.endTime.slice(0,2)+':'+row.endTime.slice(2,4))}}
  465. </template>
  466. </el-table-column>
  467. <el-table-column align="left" prop="dayType" label="环境保障时间段(周末)"></el-table-column>
  468. </el-table>
  469. </section>
  470. </section>
  471. <!-- end 用户及名词解释 -->
  472. </section>
  473. <!-- end 本周环境温度概况 -->
  474. </div>
  475. <!-- 下载的页面 -->
  476. <div class="page_main" id="exportPdf">
  477. <div class="page_header">
  478. 环境管理周报<span>({{this.startDate&&moment(this.startDate).format("MM.DD")}}-{{this.endDate&&moment(this.endDate).format("MM.DD")}})</span>
  479. <span class="pname">{{projectName}}</span>
  480. </div>
  481. <!-- start 环境概况 -->
  482. <section class="env_module title_one_table mb690">
  483. <div class="sj_title title_one">环境概况</div>
  484. <el-table class="sj_table" :data="surveyTable.slice(0,5)" :row-class-name="tableRowClassName" :header-cell-style="{background:'#3399ff !important',color:'#ffffff',padding:'10px 0'}">
  485. <el-table-column align="left" label="" width="30"></el-table-column>
  486. <el-table-column align="left" prop="name" label="环境参数"></el-table-column>
  487. <el-table-column align="left" prop="weeknormalProprotion" label="周达标率">
  488. <template slot-scope='{row}'>
  489. {{row.weeknormalProprotion+'%'}}
  490. </template>
  491. </el-table-column>
  492. <el-table-column align="left" prop="weekAvg" label="周平均">
  493. <template slot-scope='{row}'>
  494. {{row.weekAvg+row.unit}}
  495. </template>
  496. </el-table-column>
  497. <el-table-column align="left" prop="assess" label="评价"></el-table-column>
  498. </el-table>
  499. <div class="title_tips big_tips"><i class="el-icon-warning-outline"></i>数据来源:物联网传感器数据监测备份</div>
  500. <!-- 用户调节 -->
  501. <userAdjust :projectId="projectId" :energyDate="surveyTable[6]" :userAdjust="surveyTable[5]" class="mp40"/>
  502. </section>
  503. <!-- end 环境概况 -->
  504. <!-- start 本周环境温度概况 -->
  505. <!-- 循环生成环境参数 -->
  506. <section class="env_module" :class="'mb'+mbList[index]" v-for="(item,index) in surveyTablenow" :key="index">
  507. <div class="sj_title">{{item.name}}概况</div>
  508. <envSurvey :surveyTable="item" :envType="item.id" :pdf-id="item.id"></envSurvey>
  509. <div class="pm_container" v-if="item.id=='PM2d5'&&pdfPmDateShow">
  510. <p>各PM2.5浓度区间累计时长及占比</p>
  511. <div class="pm_table">
  512. <div class="left">
  513. <div class="pm_chart">
  514. <ringChart :chartId="'pm_chart1'+exportPdf+item.id" :color-arr="pmchartColor" :chart-date="pmDate"/>
  515. </div>
  516. <div class="pm_count">总空间数量:<span>{{chartweekDate.registeredSpaceNum&&chartweekDate.registeredSpaceNum.filter(Boolean)[0]}}</span></div>
  517. <div class="title_tips"><i class="el-icon-warning-outline"></i>各评价标准累计时长一定程度上反映出当前建筑的整体PM2.5浓度所处的水平</div>
  518. </div>
  519. <div class="right">
  520. <el-table size="mini" :data="pmDate" :header-cell-style="{background:'#F8F9FA!important',color:'#646A73',padding:'6px 0'}">
  521. <el-table-column align="left" label="" width="30"></el-table-column>
  522. <!--{assessStandard:"WELL铂金级",range:"0~15"}, -->
  523. <el-table-column align="left" prop="name" label="评价标准"></el-table-column>
  524. <el-table-column align="left" prop="evaluationScope" label="范围(μg/m3)"></el-table-column>
  525. <el-table-column align="left" label="周累计时长(h)" prop="accumulatedTime"></el-table-column>
  526. <el-table-column align="left" label="时长占比(%)" prop="proportion"></el-table-column>
  527. </el-table>
  528. </div>
  529. </div>
  530. </div>
  531. <div class="title_tips" v-if="item.id=='Tdb'"><i class="el-icon-warning-outline"></i>评价标准、达标标准、计算方法见数据解释</div>
  532. <div v-if="item.id!=='Tdb'" style="height:20px"></div>
  533. <div class="content_title mp40"><span>{{contentTitle(item.id)}}</span></div>
  534. <div class="content_title_noline mb32">{{seccontentTitle(item.id)}}</div>
  535. <chartLegend class="charttext_p" :legend-type="item.id" :num-type="false"/>
  536. <!-- 折线图 -->
  537. <lineChart v-if="!isUserorEngry(item.id)" :chart-id="chartId+item.id" :chart-date="chartweekDate" :env-type="item.id" :xType="dayType"/>
  538. <!-- 柱状图 -->
  539. <barChart :numberChart="isUserorEngry(item.id)" :chart-id="chartId+item.id+'1'" :key="item.id" :chart-date="chartweekDate" :env-type="item.id" :xType="dayType"/>
  540. <!-- 服务空间数 -->
  541. <div class="room_table" v-if="!isUserorEngry(item.id)">
  542. <div class="room_table_number">
  543. <div>服务空间数(总:{{chartweekDate.registeredSpaceNum&&chartweekDate.registeredSpaceNum.filter(Boolean)[0]}})</div>
  544. <div>
  545. <div v-for="(item,index) in chartweekDate.daySpaceNum" :key="index">
  546. {{item}}
  547. </div>
  548. </div>
  549. </div>
  550. </div>
  551. <div class="room_table room_table_user" v-if="item.id==='userAdjust'">
  552. <div class="room_table_number">
  553. <div>异常热调节</div>
  554. <div>
  555. <div v-for="(item,index) in chartweekDate.feedbackAbnorHotNum" :key="index">
  556. {{item}}
  557. </div>
  558. </div>
  559. </div>
  560. <div class="room_table_number" :style="{'margin-top':0}">
  561. <div>异常冷调节</div>
  562. <div>
  563. <div v-for="(item,index) in chartweekDate.feedbackAbnorColdNum" :key="index">
  564. {{item}}
  565. </div>
  566. </div>
  567. </div>
  568. <div class="room_table_number" :style="{'margin-top':0}">
  569. <div>吹风调节</div>
  570. <div>
  571. <div v-for="(item,index) in chartweekDate.feedbackNoisyHotNum" :key="index">
  572. {{item}}
  573. </div>
  574. </div>
  575. </div>
  576. </div>
  577. <section v-if="item.id=='Tdb'">
  578. <div class="content_title_noline mb40"><span>逐刻平均温度及达标空间数量变化趋势</span></div>
  579. <chartLegend class="charttext_p charttext_mt mb40" :num-type="false"/>
  580. <lineChart :chart-id="chartId+'zhou'+item.id" :contant="true" :chart-date="chartweekTemp" :xType="hourType"/>
  581. <barChart :chart-id="chartId+'zhou1'+item.id" :chart-date="chartweekTemp" :xType="hourType"/>
  582. <!-- <div class="title_tips"><i class="el-icon-warning-outline"></i>评价标准、达标标准、计算方法见数据解释</div> -->
  583. </section>
  584. <div class="addmark">
  585. <div class="remarkshow remark_input">{{quarterRemark[item.id]}}</div>
  586. </div>
  587. <div class="hcho_parame" v-if="item.id=='HCHO'">
  588. <div class="content_title mp40"><span>异常空间</span><span>(超标率排序)</span></div>
  589. <el-table size="mini" :height="216" :data="hchogirdDate" :header-cell-style="{background:'#F8F9FA!important',color:'#646A73',padding:'6px 0'}">
  590. <el-table-column label='序号' prop width='80' type='index' align="left"></el-table-column>
  591. <el-table-column property="spaceName" width='130' label="空间名称" align="left"></el-table-column>
  592. <el-table-column property="abnormalProprotion" width='130' label="超标率(%)" align="left"></el-table-column>
  593. <el-table-column property="hchoAbnormalTime" width='130' label="超标时长(h)" align="left"></el-table-column>
  594. <el-table-column property="hchoMaxSolubility" width='150' label="峰值浓度(mg/m³)" align="left"></el-table-column>
  595. <el-table-column width='130' label="峰值浓度评价" align="left">
  596. <template slot-scope='{row}'>
  597. <span :style="{color:row.assess=='较高'?'#C6322B':'#1F2329'}">{{row.assess}}</span>
  598. </template>
  599. </el-table-column>
  600. <el-table-column label="解释" align="center">
  601. <template slot-scope='{row}'>
  602. {{row.hchoRemark}}
  603. </template>
  604. </el-table-column>
  605. </el-table>
  606. </div>
  607. <div class="co2_parame" v-if="item.id=='CO2'">
  608. <div class="content_title mp40"><span>异常空间</span><span>(超标率排序)</span></div>
  609. <el-table size="mini" :height="216" :data="co2girdDate" :header-cell-style="{background:'#F8F9FA!important',color:'#646A73',padding:'6px 0'}">
  610. <el-table-column label='序号' prop width='80' type='index' align="left"></el-table-column>
  611. <el-table-column property="spaceName" width='130' label="空间名称" align="left"></el-table-column>
  612. <el-table-column property="abnormalProprotion" width='130' label="超标率(%)" align="left"></el-table-column>
  613. <el-table-column property="co2AbnormalTime" width='130' label="超标时长(h)" align="left"></el-table-column>
  614. <el-table-column property="co2MaxSolubility" width='150' label="峰值浓度(ppm)" align="left"></el-table-column>
  615. <el-table-column property="assess" width='130' label="峰值浓度评价" align="left">
  616. <template slot-scope='{row}'>
  617. <span :style="{color:row.assess=='较高'?'#DCAA04':'#1F2329'}">{{row.assess}}</span>
  618. </template>
  619. </el-table-column>
  620. <el-table-column label="解释" align="center">
  621. <template slot-scope='{row}'>
  622. {{row.co2Remark}}
  623. <!-- <el-input v-model="row.co2Remark" size="small" maxlength="24" @blur="changeInput(row,'co2')"></el-input> -->
  624. </template>
  625. </el-table-column>
  626. </el-table>
  627. <div class="content_title_noline mp40 mb16">参数释义</div>
  628. <ul class="paramlist ft12">
  629. <li>
  630. <p><span><b>CO₂:</b>通常作为建筑空间新风是否充足的量化参数</span></p>
  631. <div>
  632. <el-table class="co2table ft12" :data="co2Date" border :header-cell-style="{background:'#ffffff!important',color:'#606266',padding:'6px 0'}">
  633. <!-- <el-table-column width="30"></el-table-column> -->
  634. <el-table-column label="序号" type="index" width="60" align="left"></el-table-column>
  635. <el-table-column label="CO₂浓度区间" prop="area" align="left" width="150"></el-table-column>
  636. <el-table-column label="评价" prop="assess" align="left" width="200"></el-table-column>
  637. <el-table-column label="环境感受" prop="feel" align="left"></el-table-column>
  638. </el-table>
  639. <div class="title_tips"><i class="el-icon-warning-outline"></i>室外新鲜空气一般在 400~500ppm</div>
  640. </div>
  641. </li>
  642. </ul>
  643. </div>
  644. <div class="rh_parame" v-if="item.id=='RH'">
  645. <div class="content_title_noline mp40 mb16">参数解释</div>
  646. <ul class="paramlist ft12">
  647. <li>
  648. <p><i></i><span><b>相对湿度</b></span></p>
  649. <div style="margin-top:8px">评价空气中的水蒸气的相对含量</div>
  650. </li>
  651. <li>
  652. <p><i></i><span><b>舒适范围</b></span></p>
  653. <div>
  654. <div class="hum_list">
  655. <div><span>供暖季</span>30%~60%</div>
  656. <div><span>供冷季</span>40%~60%</div>
  657. <div><span>过渡季</span>30%~60%</div>
  658. </div>
  659. </div>
  660. </li>
  661. <li>
  662. <p><i></i><span><b>参数评价</b></span></p>
  663. <p class="rh_img"><img src="../../../../static/images/hot.png" alt=""/>干燥:低于上述区间 </p>
  664. <p class="rh_img"><img src="../../../../static/images/cold.png" alt=""/>偏湿:高于上述区间 </p>
  665. </li>
  666. <li>
  667. <p><i></i><span><b>相对湿度的影响</b><br></span></p>
  668. <div style="margin-top:8px">
  669. 高湿度可促进微生物病原体(如细菌、尘螨和霉菌)的聚集和生长,同时湿度过高可能会增加建筑材料释放气体:相对湿度增加 35%可使甲醛释放量增加 1.8-2.6 倍。 低湿度会导致气道、皮肤、眼 睛、咽喉和粘膜的干燥和刺激。也与病毒较长的存活率有关(活性失去较慢)
  670. </div>
  671. </li>
  672. </ul>
  673. </div>
  674. <div class="pm_parame" v-if="item.id=='PM2d5'">
  675. <div class="content_title_noline mp40 mb16"><span>参数释义</span></div>
  676. <ul class="paramlist ft12">
  677. <li>
  678. <p><i></i><span><b>PM2.5简介</b><br>大气中空气动力学当量直径小于或等于 2.5 微米的颗粒物,也称为可入肺颗粒物;</span></p>
  679. </li>
  680. <li>
  681. <p><i></i><span><b>达标率</b><br>参数良好级别及以上,浓度≤75 μg/m3;超出此数值记为超限。</span></p>
  682. </li>
  683. <li>
  684. <p><i></i><span>WELL标准中,对不同PM2.5浓度所在区间所能申请的标准(铂金级、金级、银级),均有对应的先决条件。如:在 PM2.5 浓度为 20μg/m3,最高只能达到 WELL 金级标准。</span></p>
  685. </li>
  686. </ul>
  687. </div>
  688. <!-- start 环境温度分析 -->
  689. <section class="mp400 mb730" v-if="item.id=='Tdb'">
  690. <div class="content_title"><span>环境温度分析(空间维度)</span></div>
  691. <div class="sj_reminder mb16">
  692. <p>温馨提示:</p>
  693. <p>1.空间划分维度:内外区、朝向、楼层、新风机组各自服务的空间四个维度,分别进行周不达标率分析计算。</p>
  694. <p>2.数据表:每个空间划分维度均有对应的空间数量。</p>
  695. <p>3.朝向维度仅外区空间,其中内区空间无朝向。</p>
  696. </div>
  697. <div class="sj_chartbox">
  698. <div class="pr65">
  699. <div class="day_title mb32">内、外区</div>
  700. <barChart :chart-id="'echart_left_out'+exportPdf" :chart-date="localtionDate.regionsChart" :sjChartType="'regions'" class="daychart"/>
  701. <div class="chart_sj_bottom mb10">
  702. <div>空间数量</div>
  703. <div class="chart_sj_bottom_main">
  704. <div v-for="(item,index) in localtionDate.regionsChart.spaceNum" :key="index">{{item}}</div>
  705. </div>
  706. </div>
  707. </div>
  708. <div>
  709. <div class="day_title mb32">各个朝向<chartLegend :avgTemp="false" class="charttext"/></div>
  710. <barChart :chart-id="'echart_left_orientation'+exportPdf" :chart-date="localtionDate.orientationChart" :sjChartType="'orientation'" class="daychart"/>
  711. <div class="chart_sj_bottom mb10">
  712. <div class="twoline">空间数量</div>
  713. <div class="chart_sj_bottom_main">
  714. <div v-for="(item,index) in localtionDate.orientationChart.spaceNum" :key="index">{{item}}</div>
  715. </div>
  716. </div>
  717. </div>
  718. </div>
  719. <div class="sj_chartbox mp40">
  720. <div class="pr65">
  721. <div class="day_title mb32">各个楼层</div>
  722. <barChart :chart-id="'echart_left_floor'+exportPdf" :chart-date="localtionDate.floorChart" :sjChartType="'localtion'" class="daychart"/>
  723. <div class="chart_sj_bottom">
  724. <div class="twoline">空间数量</div>
  725. <div class="chart_sj_bottom_main">
  726. <div v-for="(item,index) in localtionDate.floorChart.spaceNum" :key="index">{{item}}</div>
  727. </div>
  728. </div>
  729. </div>
  730. <div>
  731. <!-- <div class="day_title mb32">新风机组服务的空间</div>
  732. <barChart :chart-id="'echart_left_unit'+exportPdf" :chart-date="localtionDate.freshAirChart" :sjChartType="'freshAir'" class="daychart"/>
  733. <div class="chart_sj_bottom">
  734. <div class="twoline">空间数量</div>
  735. <div class="chart_sj_bottom_main">
  736. <div v-for="(item,index) in localtionDate.freshAirChart.spaceNum" :key="index">{{item}}</div>
  737. </div>
  738. </div> -->
  739. </div>
  740. </div>
  741. <div class="addmark addmarkhg">
  742. <div class="remarkshow remark_input" v-show="typeRemark">{{typeRemark}}</div>
  743. </div>
  744. </section>
  745. <!-- end 环境温度分析 -->
  746. <!-- start 各达标区间空间数量分布及异常冷热空间列表 -->
  747. <section class="mb16" v-if="item.id=='Tdb'">
  748. <div class="content_title"><span>各达标区间空间数量分布及异常冷热空间列表</span></div>
  749. <div class="content_title_noline mb16">各达标区间空间数量分布</div>
  750. <div class="up_distribution">
  751. <div class="up_distribution_text"><span></span>达标率偏低,亟待解决</div>
  752. <barChart :chart-id="'echart_left_week'+exportPdf" :chart-date="StandardList" :weekNormalChart="true" :y-type="yType" class="daychart"/>
  753. </div>
  754. <div class="title_tips mb52"></div>
  755. <div class="content_body mb475">
  756. <div class="body_title"><span>偏热空间</span><span class="tabletag taghot">偏热</span></div>
  757. <el-table size="mini" :data="hotgirdDate" :height="396" :header-cell-style="{background:'#F8F9FA!important',color:'#646A73',padding:'6px 0'}">
  758. <el-table-column label='序号' prop width='80' type='index' align="left"></el-table-column>
  759. <el-table-column property="spaceName" width='130' show-overflow-tooltip label="空间名称" align="left"></el-table-column>
  760. <el-table-column property="avgTemp" width='100' label="周均温度(°C)" align="left"></el-table-column>
  761. <el-table-column property="hotProprotion" width='120' label="周偏热不达标(%)" align="left"></el-table-column>
  762. <el-table-column property="serviceTime" width='110' label="周服务时长(h)" align="left"></el-table-column>
  763. <el-table-column property="validProprotion" width='110' label="周有效数据(%)" align="left"></el-table-column>
  764. <el-table-column property="hotNum" width='120' label="周累计热反馈数" align="left"></el-table-column>
  765. <el-table-column label="解释" align="left">
  766. <template slot-scope='{row}'>
  767. {{row.hotRemark}}
  768. </template>
  769. </el-table-column>
  770. </el-table>
  771. <div class="body_title body_coldtitle"><span>偏冷空间</span><span class="tabletag tagclod">偏冷</span></div>
  772. <el-table size="mini" :data="coldgirdDate" :height="396" :header-cell-style="{background:'#F8F9FA!important',color:'#646A73',padding:'6px 0'}">
  773. <el-table-column label='序号' prop width='80' type='index' align="left"></el-table-column>
  774. <el-table-column property="spaceName" width='130' show-overflow-tooltip label="空间名称" align="left"></el-table-column>
  775. <el-table-column property="avgTemp" width='100' label="周均温度(°C)" align="left"></el-table-column>
  776. <el-table-column property="coldProprotion" width='120' label="周偏冷不达标(%)" align="left"></el-table-column>
  777. <el-table-column property="serviceTime" width='110' label="周服务时长(h)" align="left"></el-table-column>
  778. <el-table-column property="validProprotion" width='110' label="周有效数据(%)" align="left"></el-table-column>
  779. <el-table-column property="coldNum" width='120' label="周累计冷反馈数" align="left"></el-table-column>
  780. <el-table-column label="解释" align="left">
  781. <template slot-scope='{row}'>
  782. {{row.coldRemark}}
  783. </template>
  784. </el-table-column>
  785. </el-table>
  786. </div>
  787. </section>
  788. <!-- end 各达标区间空间数量分布及异常冷热空间列表 -->
  789. <section v-if="dataDeal&&item.id=='Tdb'" class="pageitem_box_list" >
  790. <!-- -->
  791. <div class="pageitem_box" v-for="(item,index) in daysDate" :key="index" >
  792. <div class="content_title"><span>每日环境详情(周{{item.pname}}</span></div>
  793. <div class="content_body" :key="item.pname">
  794. <div class="day_title oneday_title">逐刻平均温度及达标空间数量变化趋势</div>
  795. <!-- :key="index+'dot'" -->
  796. <chartLegend class="charttext" :dot-line="true"/>
  797. <lineChart :chart-id="'echart_top'+item.name+exportPdf" :chart-date="item.chartDate" :contant="true" :xType="hourType"/>
  798. <barChart :chart-id="'echart_bottom'+item.name+exportPdf" :chart-date="item.chartDate" :numberChart="true" :x-type="hourType" :y-type="yType"/>
  799. <div class="room_table">
  800. <div class="room_table_number">
  801. <div>室外温度(°C)</div>
  802. <div>
  803. <div v-for="(items,sgin) in item.chartDate.outSideTemp" :key="sgin">
  804. {{items}}
  805. </div>
  806. </div>
  807. </div>
  808. </div>
  809. <div class="twochart_box">
  810. <div>
  811. <div class="day_title">各房间日均温度分布</div>
  812. <barChart :chart-id="'echart_left'+item.name+exportPdf" :chart-date="item.chartDateLeft" :normalChart="true" :y-type="yType" class="daychart"/>
  813. </div>
  814. <div>
  815. <div class="day_title">各楼层日均温及偏冷(热)空间数量</div>
  816. <!-- <chartLegend class="charttext" :dot-line="true"/> -->
  817. <lineChart :x-type="floorType" :chart-id="'echart_righttop'+item.name+exportPdf" :chart-date="item.chartDateRight" :contant="true" class="daylinechart"/>
  818. <barChart :chart-id="'echart_rightbottom'+item.name+exportPdf" :x-type="floorType" :y-type="yType" :numberChart="true" :chart-date="item.chartDateRight" class="daybarchart"/>
  819. </div>
  820. </div>
  821. </div>
  822. </div>
  823. </section>
  824. <!-- start 用户及名词解释 -->
  825. <div v-if="item.id=='Tdb'" :class="{'mp990':daysDate.length%2?true:false,'mp140':daysDate.length%2?false:true}">
  826. <div class="content_title"><span>用户活跃度统计(周)</span></div>
  827. <div class="user_total">
  828. <div v-if="projectId!=='Pj1101020002'">
  829. <div>用户总数量</div>
  830. <div><span>{{userDate.userRegistNum}}</span></div>
  831. </div>
  832. <div v-if="projectId!=='Pj1101020002'">
  833. <div>周活跃用户数量</div>
  834. <div><span>{{userDate.userActiveNum}}</span></div>
  835. </div>
  836. <div>
  837. <div>用户与系统互动数量</div>
  838. <div><span>{{userDate.userSysNum}}</span></div>
  839. </div>
  840. <div>
  841. <div>用户问题反馈数量</div>
  842. <div><span>{{userDate.UserFbNum}}</span></div>
  843. </div>
  844. <div>
  845. <div>帮用户解决问题</div>
  846. <div><span>{{userDate.solveFbNum}}</span></div>
  847. </div>
  848. </div>
  849. <div class="content_title"><span>环境管理周报数据解释</span></div>
  850. <section>
  851. <div class="content_title_noline mb16">名词解释</div>
  852. <ul class="paramlist ft12">
  853. <li v-for="(item,index) in expTerms" :key="index">
  854. <p><i></i><span><b>{{item.name}}</b>{{item.content}}</span></p>
  855. </li>
  856. </ul>
  857. </section>
  858. <section>
  859. <div class="content_title_noline mb16">计算说明</div>
  860. <ul class="paramlist paramlist_explain ft12">
  861. <li>
  862. <p><i></i><span><b>温度评价</b></span></p>
  863. <p>“偏冷”、“舒适”、“偏热”。以平均温度的不同区间对应,区间对应如下:</p>
  864. <div>
  865. <div class="hum_list">
  866. <div><img src="../../../../static/images/cold.png" alt="偏冷"/> &ensp;偏冷 &nbsp;&nbsp;&nbsp; 平均温度&lt;20°C</div>
  867. <div><img src="../../../../static/images/happy.png" alt="舒适"/> &ensp;舒适 &nbsp;&nbsp;&nbsp;平均温度 20°C~25°C</div>
  868. <div><img src="../../../../static/images/hot.png" alt="偏热"/> &ensp;偏热 &nbsp;&nbsp;&nbsp;平均温度&gt;25°C</div>
  869. </div>
  870. </div>
  871. </li>
  872. <li>
  873. <p><i></i><span><b>周达标率计算</b></span></p>
  874. <div class="ml17">
  875. <p>单个空间当前时刻是否达标的判断方法:min(当前时刻服务定制温度下限,合同约定 温度范围下限)&lt;当前环境温度&lt;max(当前时刻服务定制温度上限,合同约定温度范 围上限),满足上述区间内,视为达标;</p>
  876. <p>低于区间,视为偏冷;</p>
  877. <p>高于区间,视为偏热。</p>
  878. </div>
  879. <p class="ml17">所有空间一周时间达标率的判断方法:所有空间所有存在空调服务的累计时间中,判断为达标的时间占比,即周达标率。</p>
  880. <p class="ml17">偏冷(热)率的计算如上。</p>
  881. </li>
  882. </ul>
  883. </section>
  884. <section>
  885. <div class="content_title_noline mb16">合约与管控时间段</div>
  886. <el-table class="sj_table ft12" :height="620" :data="custormList.slice(0,12)" border :header-cell-style="{background:'#F8F9FA!important',padding:'6px 0'}">
  887. <!-- <el-table-column align="left" width="40" ></el-table-column> -->
  888. <el-table-column align="left" prop="objectName" label="空间组" ></el-table-column>
  889. <el-table-column align="left" label="合同约定温度达标区间">
  890. <template slot-scope='{row}'>
  891. {{row.minValue}}~{{row.maxValue}}
  892. </template>
  893. </el-table-column>
  894. <el-table-column align="left" label="环境保障时间段(工作日)">
  895. <template slot-scope='{row}'>
  896. {{row.startTime&&(row.startTime.slice(0,2)+':'+row.startTime.slice(2,4))}}~{{row.endTime&&(row.endTime.slice(0,2)+':'+row.endTime.slice(2,4))}}
  897. </template>
  898. </el-table-column>
  899. <el-table-column align="left" prop="dayType" label="环境保障时间段(周末)"></el-table-column>
  900. </el-table>
  901. </section>
  902. </div>
  903. <!-- end 用户及名词解释 -->
  904. </section>
  905. <!-- end 本周环境温度概况 -->
  906. </div>
  907. <el-dialog
  908. title="提示"
  909. :visible.sync="emailVisible"
  910. :modal='false'
  911. :close-on-click-modal="false"
  912. width="30%">
  913. <div class="nosend" v-if="!checkSendEmail">
  914. 是否将周报发送给
  915. <span v-for="(items,k) in emailData" :key="k">
  916. {{items.receiver}}:{{items.mailbox}}
  917. </span>
  918. </div>
  919. <div class="sended" v-if="checkSendEmail">
  920. <span>已将周报发送给</span>
  921. <el-checkbox-group v-model="emailCheckList">
  922. <el-checkbox :label="items.id" v-for="(items,k) in sendedUser" :key="k">{{items.receiver}}</el-checkbox>
  923. </el-checkbox-group>
  924. <div v-show="noSendUser&&noSendUser.length">
  925. <span>未将周报发送给</span>
  926. <el-checkbox-group v-model="nosendCheckList">
  927. <el-checkbox :label="items.id" v-for="(items,k) in noSendUser" :key="k">{{items.receiver}}</el-checkbox>
  928. </el-checkbox-group>
  929. </div>
  930. <span>是否继续发送</span>
  931. </div>
  932. <span slot="footer" class="dialog-footer">
  933. <el-button @click="emailVisible = false" size="small">取 消</el-button>
  934. <el-button type="primary" @click="sendEmail" size="small"> 确 定</el-button>
  935. </span>
  936. </el-dialog>
  937. </div>
  938. </template>
  939. <script>
  940. import {mapGetters} from "vuex"
  941. import {Tabs} from 'meri-design'
  942. import lineChart from "./lineChart.vue"
  943. import barChart from "./barChart.vue"
  944. import ringChart from "./ringChart.vue"
  945. import chartLegend from "./chartLegend.vue"
  946. import envSurvey from "./envSurvey.vue"
  947. import userAdjust from "./userAdjust.vue"
  948. import moment from "moment"
  949. import {queryWeekday,querySubstandardList,queryDay,querysectionSpace,saveRemark,passEmail,
  950. querysectionFloor,queryStandardList,queryWeekSpace,queryUserActivity,queryTempRate,explainSave,
  951. querySeason,queryCustormList,queryEmail,queryPm2d5} from "@/api/ReportForm/ReportForm.js";
  952. export default {
  953. props:{
  954. // comstartDate:{
  955. // default:'',
  956. // type:String
  957. // },
  958. // comendDate:{
  959. // default:'',
  960. // type:String
  961. // },
  962. // projectName:String
  963. },
  964. data(){
  965. return {
  966. pdfPmDateShow:false,
  967. mbList:[200,200,600,520,300,900,0],
  968. emailVisible:false,
  969. checkSendEmail:false,
  970. emailCheckList:[],
  971. nosendCheckList:[],
  972. chartweekDate:{},
  973. chartweekTemp:{},
  974. portDate:"",
  975. exportPdf:"exportPdf",
  976. co2Date:[
  977. {
  978. area:"400~800",
  979. assess:"新鲜空气",
  980. feel:"无,与室外接近"
  981. },
  982. {
  983. area:"800~1000",
  984. assess:"达标",
  985. feel:"无,高强度脑力劳动者可能会有轻微头晕感觉"
  986. },
  987. {
  988. area:"1000~1500",
  989. assess:"新风轻微不足",
  990. feel:"感觉轻微头晕,头胀,伴随工作效率下降"
  991. },
  992. {
  993. area:"1500~2000",
  994. assess:"新风明显不足",
  995. feel:"会有轻微头疼的感觉,无法继续工作"
  996. },
  997. {
  998. area:"≥2000",
  999. assess:"新风严重不足",
  1000. feel:"属空气严重污染,通常无新风补给,不建议常驻"
  1001. }
  1002. ],
  1003. chartDate:{
  1004. "date": "20200810", //日期
  1005. "avgTemp": "",//平均温度
  1006. "hotProprotion": 0, //偏热占比
  1007. "coldProprotion": "",//偏冷占比
  1008. "normalProprotion": 0, //正常占比
  1009. "daySpaceNum": 0,//日服务空间数
  1010. "registeredSpaceNum": "",//总注册空间数
  1011. },
  1012. chartId:'linechart',
  1013. dayType:"day",
  1014. hourType:"hour",
  1015. floorType:"floor",
  1016. yType:"number",
  1017. hotgirdDate:[],
  1018. coldgirdDate:[],
  1019. co2girdDate:[],
  1020. hchogirdDate:[],
  1021. daysDate:[],
  1022. dataDeal:false,
  1023. numIndex:0,
  1024. startDate:'',
  1025. endDate:'',
  1026. pickerOptions: {
  1027. disabledDate(time) {
  1028. return time.getTime() > Date.now();
  1029. },
  1030. },
  1031. chartModel:{
  1032. },
  1033. expTerms:[
  1034. {name:'达标率',content:'按照合约范围约定的达标区间'},
  1035. {name:'环比',content:'相对上周的数据进行比较'},
  1036. {name:'时间维度',content:'日期、时刻等角度分析数据'},
  1037. {name:'空间维度',content:'空间自身固有属性的角度分析数据'},
  1038. {name:'内外区',content:'通常没有直接与室外关联的外窗的空间,划为内区,内区没有朝向之说'},
  1039. {name:'朝向',content:'实际交付有 16 个朝向(含东北偏东),最终划到四个朝向(东北偏东属于东)'},
  1040. {name:'新风机组服务的空间',content:'每个空间都有唯一的新风机组为其服务,一台新风机组服务多个空间'},
  1041. {name:'周偏热(冷)不达标率',content:'空调服务时间段内,偏热(冷)时长占比总时长'},
  1042. {name:'周有效数据',content:'反映数据质量好坏,空调服务时间段内,传感器刨除数据丢包的数据量占比'},
  1043. ],
  1044. dayData:[],
  1045. envType:'Tdb',
  1046. envTypelist:[
  1047. {
  1048. name:'温度',
  1049. id:'Tdb'
  1050. },
  1051. {
  1052. name:'CO₂',
  1053. id:"CO2"
  1054. },
  1055. {
  1056. name:'甲醛',
  1057. id:"HCHO"
  1058. },
  1059. {
  1060. name:'相对湿度',
  1061. id:"RH"
  1062. },
  1063. {
  1064. name:'PM2.5',
  1065. id:"PM2d5"
  1066. },
  1067. {
  1068. name:'用户调节',
  1069. id:"userAdjust"
  1070. },
  1071. {
  1072. name:'能源管理',
  1073. id:"energyManage"
  1074. }
  1075. ],
  1076. tableItem:'',
  1077. daysDateCurrent:[],
  1078. surveyTable:[
  1079. {name:"温度", id:'Tdb',weeknormalProprotion:'',weekAvg:'--',img:'happy',init:1,assess:'',weekcoldProprotion:'',weekhotProprotion:'',unit:'°C',assessHotTable:[
  1080. {name:'偏冷',min:-50},{name:"舒适",min:20},{name:"偏热",min:25}
  1081. ],assessColdTable:[
  1082. {name:'偏冷',min:-50},{name:"舒适",min:24},{name:"偏热",min:27}
  1083. ]},
  1084. {name:"CO₂",id:"CO2",weeknormalProprotion:'',weekAvg:'',assess:'',img:'happy',init:0,unit:'ppm',assessTable:[
  1085. {name:"新鲜空气",min:400,type:"happy"},{name:"达标",min:800,type:"happy"},{name:"新风轻微不足",min:1000,type:"happy"},{name:"新风明显不足",min:1500,type:"hot"},{name:"新风严重不足",min:2000,type:"hot"}
  1086. ]},
  1087. {name:"甲醛",id:"HCHO",weeknormalProprotion:'',weekAvg:'',assess:'',img:'happy',init:2,unit:'mg/m3',assessTable:[
  1088. {name:"符合国标",type:"happy"},{name:"超标",min:0.1,type:"hot"}
  1089. ]},
  1090. {name:"相对湿度", id:"RH",weeknormalProprotion:'',weekAvg:'',init:0,img:'happy',assess:'',unit:'%',assessTable:[
  1091. {name:"干燥",type:"hot"},{name:"舒适",min:30,type:"happy"},{name:"湿润",min:70,type:"cold"}
  1092. ]},
  1093. {name:"PM2.5",id:"PM2d5",weeknormalProprotion:'',weekAvg:'',assess:'',img:'happy',init:0,unit:'ug/m3',assessTable:[
  1094. {name:"优",min:0,type:"happy"},{name:"良好",min:50,type:"happy"},{name:"轻度污染",min:100,type:"hot"},{name:"严重污染",min:200,type:"hot"}
  1095. ]},
  1096. {name:"用户调节",id:"userAdjust",},
  1097. {name:"能源管理",id:"energyManage",},
  1098. ],
  1099. imgList:["cold","happy","hot"],
  1100. StandardList:[],
  1101. userDate:{
  1102. "userRegistNum": 0,//注册用户数量
  1103. "userActiveNum": 0,//周活跃用户数量
  1104. "userSysNum": 0, //用户与系统互动数量
  1105. "UserFbNum": 0,//用户问题反馈数量
  1106. "solveFbNum": 0 //用户问题反馈数量
  1107. },
  1108. localtionTable:['regionsChart','orientationChart','floorChart','freshAirChart'], //内外区 1 朝向 2 楼层 3 新风机组
  1109. localtionDate:{
  1110. regionsChart:{},
  1111. orientationChart:{},
  1112. floorChart:{},
  1113. freshAirChart:{}
  1114. },
  1115. seasonType:'',
  1116. hotStandardList:{},
  1117. custormList:[],
  1118. quarterRemark:{},
  1119. typeRemark:"",
  1120. typeRemarkEdit:false,
  1121. quarterRemarkEdit:false,
  1122. remarkId:{},
  1123. reportImg:null,
  1124. emailData:null,
  1125. noSendUser:[],
  1126. sendedUser:[],
  1127. noEmailuser:true,
  1128. isSpecialType:["userAdjust","energyManage"],
  1129. pmDate:[
  1130. {name:"WELL铂金级",range:"0~15"},
  1131. {name:"WELL金级",range:"15~25"},
  1132. {name:"优秀",range:"25~35"},
  1133. {name:"良好",range:"35~75"},
  1134. {name:"轻微污染",range:"75~115"},
  1135. {name:"中度污染",range:"115~150"},
  1136. {name:"重度污染",range:"150~250"},
  1137. {name:"严重污染",range:">250"},
  1138. ],
  1139. pmchartColor:['#2EA121','#8EE085','#B7EDB1','#D9F5D6','#F8E6AB','#FAD355','#DCAA04','#AA8303'],
  1140. }
  1141. },
  1142. components:{lineChart,barChart,chartLegend,Tabs,ringChart,envSurvey,userAdjust},
  1143. beforeMount(){
  1144. // console.log(this.$route,"---------------------------------------")
  1145. // http://192.168.0.24:9906/weekpdf?startDate=20210118&endDate=20210124&projectName=你好&projectId=Pj1101080259
  1146. this.comstartDate= this.$route.query.startDate;
  1147. this.comendDate=this.$route.query.endDate;
  1148. this.projectName=this.$route.query.projectName;
  1149. this.projectId=this.$route.query.projectId;
  1150. this.dataChange([this.comstartDate,this.comendDate])
  1151. },
  1152. async mounted(){
  1153. this.indexMap={
  1154. Tdb:9,
  1155. RH:10,
  1156. CO2:11,
  1157. PM2d5:12,
  1158. HCHO:13,
  1159. userAdjust:16,
  1160. energyManage:17
  1161. }
  1162. this.timeArray=this.generateTime();
  1163. await this.getSeasontype();
  1164. this.getWeekSpace('floor');
  1165. this.getWeekSpace();
  1166. this.getUserActivity();
  1167. this.getTempRate();
  1168. this.getStandardList();
  1169. this.getCustormList();
  1170. // this.getEmailDate();
  1171. this.getPmdate();
  1172. },
  1173. methods:{
  1174. moment,
  1175. contentTitle(value){
  1176. if(value==="Tdb"){
  1177. return '环境温度分析(时间维度)'
  1178. }
  1179. if(this.isUserorEngry) {
  1180. return '趋势'
  1181. }
  1182. return '逐日详情'
  1183. },
  1184. seccontentTitle(value){
  1185. if(value==="Tdb"){
  1186. return '逐14日环境达标率及平均温度变化趋势'
  1187. }
  1188. if(value=="userAdjust") {
  1189. return '逐14日用户调节空间数量变化趋势'
  1190. }
  1191. if(value=="energyManage") {
  1192. return '逐日电耗变化趋势'
  1193. }
  1194. return '逐日达标率及日浓度'
  1195. },
  1196. getPmdate(){
  1197. const getParams={
  1198. "projectId": this.projectId,//项目id
  1199. "startDate":this.startDate,
  1200. "endDate":this.endDate,
  1201. }
  1202. queryPm2d5({getParams}).then(res=>{
  1203. console.log(res);
  1204. if(res.data){
  1205. // 手动排序
  1206. res.data.sort((a,b)=>{
  1207. return a.evaluationStandard - b.evaluationStandard
  1208. })
  1209. res.data.forEach((item,index)=>{
  1210. item.proportion = parseInt(item.proportion*100);
  1211. this.pmDate[index]=Object.assign(this.pmDate[index],item);
  1212. })
  1213. this.pdfPmDateShow=true;
  1214. }
  1215. })
  1216. },
  1217. toRemarkedit(value){
  1218. this[value+'Edit'] =true;
  1219. },
  1220. saveRemark(value){
  1221. let postParams={
  1222. "id": this.remarkId[this.envType],
  1223. "projectId": this.projectId,//项目id
  1224. "startDate":this.startDate,
  1225. "endDate":this.endDate,
  1226. "year":this.startDate.slice(0,4),
  1227. "type":value=="typeRemark"?9:this.indexMap[this.envType],//0 内外区 1 朝向 2 楼层 3 新风机组 4 温度 5 湿度 6 co2 7 pm2.5 8 甲醛 9, 周报备注
  1228. "quarterRemark": this.quarterRemark[this.envType],//时刻备注
  1229. }
  1230. value=="typeRemark"&&(postParams.typeRemark=this.typeRemark);
  1231. saveRemark({postParams}).then(res=>{
  1232. if(res.result=='success'){
  1233. this.$message.success('保存成功');
  1234. this.remarkId[this.envType]=res.id || '';
  1235. this[value+'Edit']=false;
  1236. }
  1237. })
  1238. },
  1239. cancelRemark(value){
  1240. this[value+'Edit'] =false;
  1241. },
  1242. tableRowClassName({row, rowIndex}) {
  1243. const passValue=['舒适','新鲜空气','优','符合国标','达标'];
  1244. if (!passValue.includes(row.assess)) {
  1245. return 'warning-row';
  1246. }
  1247. return '';
  1248. },
  1249. getCustormList(){
  1250. let postParams={
  1251. "criteria":{
  1252. "projectId":this.projectId,
  1253. "startDate":this.startDate
  1254. }
  1255. }
  1256. // console.log(queryCustormList,77777)
  1257. queryCustormList({postParams}).then(res=>{
  1258. this.custormList=res.data||[];
  1259. const weekType={
  1260. WeekDay:"工作日",
  1261. Weekend:"周末",
  1262. Holiday:"假日"
  1263. }
  1264. this.custormList.forEach(item=>{
  1265. item.dayType = (item.endMinValue?(item.endMinValue.slice(0,2)+':'+item.endMinValue.slice(2,4)):'-') +'~'+ (item.endMaxValue?(item.endMaxValue.slice(0,2)+':'+item.endMaxValue.slice(2,4)):'-');
  1266. })
  1267. })
  1268. },
  1269. changeInput(e,type){
  1270. this.tableSave(e,type)
  1271. },
  1272. async getSeasontype(falg=true){
  1273. let getParams= {
  1274. projectId:this.projectId,
  1275. dateTiime:falg?this.startDate:this.endDate
  1276. }
  1277. await querySeason({getParams}).then(res=>{
  1278. this.seasonType=res.content&&res.content[0].seasonType||'Warm';
  1279. })
  1280. },
  1281. tableSave(e,type){
  1282. let getParams={
  1283. projectId:this.projectId,
  1284. spaceId:e.spaceId,
  1285. startDate:this.startDate,
  1286. }
  1287. getParams[type + 'Remark']=e[type + 'Remark'];
  1288. explainSave({getParams}).then(res=>{
  1289. })
  1290. },
  1291. dataChange(value) {
  1292. if(value){
  1293. this.startDate=moment(value[0]).format("YYYYMMDD");
  1294. this.endDate=moment(value[1]).format("YYYYMMDD");
  1295. this.portDate=[moment(value[0]),moment(value[1])];
  1296. this.getweekDate(this.startDate,this.endDate);
  1297. this.getTableList("hotProprotion","hotgirdDate","hotRemark");
  1298. this.getTableList("coldProprotion","coldgirdDate","coldRemark");
  1299. this.getTableList("co2AbnormalTime","co2girdDate","co2Remark",1000);
  1300. this.getTableList("hchoAbnormalTime","hchogirdDate","hchoRemark",0.1);
  1301. this.getDayDate();
  1302. }
  1303. },
  1304. getWeekSpace(value){
  1305. let postParams={
  1306. "criteria":{
  1307. "projectId":this.projectId,
  1308. "startDate":this.startDate,
  1309. "endDate":this.endDate,
  1310. // "type":value,//0 内外区 1 朝向 2 楼层 3 新风机组 4 温度 5 湿度 6 co2 7 pm2.5 8 甲醛
  1311. }
  1312. }
  1313. if(value){
  1314. postParams.criteria.type=2;
  1315. }
  1316. queryWeekSpace({postParams}).then(res=>{
  1317. if(!res.content){
  1318. return
  1319. }
  1320. let obj={};
  1321. if(!value){
  1322. let keyMap={
  1323. 11:"CO2",
  1324. 13:"HCHO",
  1325. 10:"RH",
  1326. 12:"PM2d5",
  1327. 9:"Tdb",
  1328. 16:'userAdjust',
  1329. 17:'energyManage'
  1330. }
  1331. this.localtionTable.forEach(item=>{
  1332. !(item=='floorChart')&&(obj[item]=[]);
  1333. })
  1334. res.content.forEach(item=>{
  1335. if(item.type<4){
  1336. item.type!==2&&obj[this.localtionTable[item.type]].push(item);
  1337. }else if(item.type<=8){
  1338. let ctypeMap={4:0,5:3,6:1,7:4,8:2};
  1339. let ctype= ctypeMap[item.type];
  1340. //4 5 6 7 8
  1341. if(ctype==4){
  1342. this.surveyTable[ctype].weekAvg =(typeof item.avgDate =="number")?(item.avgDate*this.multipleInit).toFixed(this.surveyTable[ctype].init):'--';
  1343. }else{
  1344. this.surveyTable[ctype].weekAvg =(typeof item.avgDate =="number")?item.avgDate.toFixed(this.surveyTable[ctype].init):'--';
  1345. }
  1346. (typeof item.normalProprotion=="number")&&(this.surveyTable[ctype].weeknormalProprotion=(item.normalProprotion*100).toFixed(0));
  1347. (typeof item.coldProprotion=="number")&&(this.surveyTable[ctype].weekcoldProprotion=(item.coldProprotion*100).toFixed(0));
  1348. (typeof item.hotProprotion=="number")&&(this.surveyTable[ctype].weekhotProprotion=(item.hotProprotion*100).toFixed(0));
  1349. (typeof item.chainRatio=="number")&&(this.surveyTable[ctype].chainRatio=(item.chainRatio*100).toFixed(0));
  1350. (typeof item.coldChainRatio=="number")&&(this.surveyTable[ctype].coldChainRatio=(item.coldChainRatio*100).toFixed(0));
  1351. (typeof item.hotChainRatio=="number")&&(this.surveyTable[ctype].hotChainRatio=(item.hotChainRatio*100).toFixed(0));
  1352. (typeof item.overNormalProprotion=="number")&&(this.surveyTable[ctype].overNormalProprotion=(item.overNormalProprotion*100).toFixed(0));
  1353. (typeof item.partialDryRate=="number")&&(this.surveyTable[ctype].partialDryRate=(item.partialDryRate*100).toFixed(0));
  1354. (typeof item.partialHumidityRate=="number")&&(this.surveyTable[ctype].partialHumidityRate=(item.partialHumidityRate*100).toFixed(0));
  1355. }else if(item.type===14||item.type===15){
  1356. let ctypeMap={14:5,15:6};
  1357. let ctype= ctypeMap[item.type];
  1358. let intList={
  1359. totalEnergy:1,
  1360. acTotalEnergy:1,
  1361. acColdHotTotalEnergy:1,
  1362. acTerTotalEnergy:1,
  1363. seTotalEnergy:1,
  1364. othersTotalEnergy:1,
  1365. monthEnergy:1,
  1366. yearEnergy:1,
  1367. }
  1368. for(let key in item){
  1369. intList[key]&&(item[key]=parseInt(item[key]));
  1370. this.$set(this.surveyTable[ctype],key,item[key]);
  1371. }
  1372. }else{
  1373. this.$set(this.quarterRemark,keyMap[item.type],item.quarterRemark||'');
  1374. !this.remarkId[keyMap[item.type]]&&(this.remarkId[keyMap[item.type]]=item.id||'');
  1375. item.type==9&&(this.typeRemark=item.typeRemark||'');
  1376. }
  1377. })
  1378. for(let k in obj){
  1379. if(k=="orientationChart"){
  1380. obj[k] = obj[k].sort((a,b)=>a.typeCategory- b.typeCategory)
  1381. }
  1382. this.localtionDate[k] = this.arreyInit(obj[k])||{};
  1383. }
  1384. this.surveyTable.forEach((item,index)=>{
  1385. if(item.weekAvg||item.weekAvg==0){
  1386. // 判断评价
  1387. item.assess = this.makeAssess(item,index);
  1388. }
  1389. })
  1390. this.surveyTable[0].img&&(this.reportImg = require(`../../../../static/images/${this.surveyTable[0].img}.png`));
  1391. }else{
  1392. obj.floorChart=res.content||[];
  1393. obj.floorChart = obj.floorChart.filter(item=>item.objectName!=='楼顶');
  1394. this.localtionDate.floorChart = this.arreyInit(obj.floorChart)||{};
  1395. }
  1396. })
  1397. },
  1398. makeAssess(value,sgin){
  1399. let assessList=[];
  1400. if(value.weekAvg=='--'){
  1401. return '--'
  1402. }
  1403. assessList.push(Number(value.weekAvg));
  1404. if(value.name=="温度"&&this.seasonType){
  1405. if(this.seasonType=="Warm"){
  1406. value.assessTable = value.assessHotTable ||[];
  1407. }else{
  1408. value.assessTable = value.assessColdTable ||[]
  1409. }
  1410. }
  1411. value.assessTable&&value.assessTable.forEach(item=>{
  1412. item.min&&assessList.push(item.min)
  1413. })
  1414. assessList.sort((a,b)=>a-b);
  1415. let index = assessList.findIndex(item=>item ==Number(value.weekAvg)) || 1;
  1416. if(value.name=="温度"){
  1417. this.surveyTable[sgin].img = this.imgList[index-1];
  1418. }else{
  1419. this.$set(this.surveyTable[sgin],'img',value.assessTable[index-1].type || 'happy');
  1420. // this.surveyTable[sgin].img = value.assessTable[index-1].type || 'happy';
  1421. }
  1422. return (value.assessTable[index-1]&&value.assessTable[index-1].name) ||'--';
  1423. },
  1424. getStandardList(){
  1425. let postParams={
  1426. "criteria":{
  1427. "projectId":this.projectId,
  1428. "startDate":this.startDate
  1429. }
  1430. };
  1431. queryStandardList({postParams}).then(res=>{
  1432. this.StandardList = res.data ||[];
  1433. })
  1434. },
  1435. getUserActivity(){
  1436. let postParams={
  1437. "criteria":{
  1438. "projectId":this.projectId,
  1439. starDate:this.startDate,
  1440. endDate:this.endDate,
  1441. // "createTime":{
  1442. // "$gte":this.startDate.slice(0,4)+'-'+this.startDate.slice(4,6)+'-'+this.startDate.slice(6,8) ,
  1443. // "$lte":this.endDate.slice(0,4)+'-'+this.endDate.slice(4,6)+'-'+this.endDate.slice(6,8)
  1444. // },
  1445. },
  1446. }
  1447. queryUserActivity({postParams}).then(res=>{
  1448. this.userDate = res;
  1449. })
  1450. },
  1451. // 获取周逐刻
  1452. getTempRate(){
  1453. let postParams={
  1454. "criteria":{
  1455. "projectId":this.projectId,
  1456. "date":{
  1457. "$gte":this.startDate,
  1458. "$lte":this.endDate
  1459. },
  1460. }
  1461. }
  1462. postParams.criteria.time={$gte:"060000", $lte:"200000"};
  1463. queryTempRate({postParams}).then(res=>{
  1464. if(res.data){
  1465. this.chartweekTemp = this.arreyInit(res.data);
  1466. this.chartweekTemp.coldSpaceProprotion&&(this.chartweekTemp.coldProprotion=this.chartweekTemp.coldSpaceProprotion);
  1467. this.chartweekTemp.hotSpaceProprotion&&(this.chartweekTemp.hotProprotion=this.chartweekTemp.hotSpaceProprotion);
  1468. this.chartweekTemp.normalSpaceProprotion&&(this.chartweekTemp.normalProprotion=this.chartweekTemp.normalSpaceProprotion);
  1469. }
  1470. })
  1471. },
  1472. toDomposition(id){
  1473. document.querySelector('#' + id).scrollIntoView(true)
  1474. },
  1475. // 14天
  1476. getweekDate(start,end){
  1477. start=moment(start).subtract('days', 7).format("YYYYMMDD");
  1478. let postParams={
  1479. "criteria":{
  1480. "projectId":this.projectId,
  1481. "date":{
  1482. "$gte":start,
  1483. "$lte":end
  1484. }
  1485. },
  1486. orders:[
  1487. {
  1488. column:"date",
  1489. asc:true,
  1490. }
  1491. ]
  1492. }
  1493. queryWeekday({postParams}).then(res=>{
  1494. res.count?(this.chartweekDate = this.arreyInit(res.content,'custom')):(this.chartweekDate={});
  1495. })
  1496. },
  1497. // 7天
  1498. async getDayDate(){
  1499. let postParams={
  1500. "criteria":{
  1501. "projectId":this.projectId,
  1502. "date":{
  1503. "$gte":this.startDate,
  1504. "$lte":this.endDate
  1505. }
  1506. }
  1507. }
  1508. this.daysDate=[];
  1509. this.numIndex=0;
  1510. // 周上
  1511. let custompostParams=JSON.parse(JSON.stringify(postParams));
  1512. custompostParams.criteria.time={$gte:"060000", $lte:"200000"};
  1513. custompostParams.orders=[{"column":"time","asc":"true"}];
  1514. // Promise.all([
  1515. // queryDay({postParams:custompostParams}),
  1516. // querysectionSpace({postParams}),
  1517. // querysectionFloor({postParams})
  1518. // ]).then(data=>{
  1519. // console.log(data,"------------------------")
  1520. // })
  1521. await queryDay({postParams:custompostParams}).then(async res=>{
  1522. if(res.count){
  1523. await this.getDategroup(res.content,"chartDate")
  1524. }else{
  1525. this.getDategroup([],"chartDate")
  1526. }
  1527. })
  1528. // 周左
  1529. querysectionSpace({postParams}).then(async res=>{
  1530. if(res.data){
  1531. await this.getDategroup(res.data,"chartDateLeft");
  1532. }else{
  1533. this.getDategroup([],"chartDateLeft")
  1534. }
  1535. })
  1536. // 周右
  1537. querysectionFloor({postParams}).then(async res=>{
  1538. if(res.data){
  1539. await this.getDategroup(res.data,"chartDateRight")
  1540. }else{
  1541. this.getDategroup([],"chartDateRight")
  1542. }
  1543. })
  1544. },
  1545. getDategroup(value,type){
  1546. if(!Array.isArray(value)){
  1547. return
  1548. }
  1549. this.numIndex=this.numIndex+1;
  1550. let obj={}
  1551. value.map(v => {
  1552. obj[v.date] = 0
  1553. })
  1554. let dataListlen = Object.keys(obj);
  1555. let dataList =dataListlen;
  1556. let result = dataList.map(v => {
  1557. let resObj={name:v,pname:this.getWeek(moment(v).format('E'))};
  1558. resObj[type] = value.filter(_v => v == _v.date)
  1559. return resObj
  1560. })
  1561. if(this.daysDate&&this.daysDate.length){
  1562. this.daysDate.forEach(item=>{
  1563. item = Object.assign(item,result.filter(_v=> _v.name===item.name)[0])
  1564. if(type=="chartDate"&&Array.isArray(item.chartDate)){
  1565. item.chartDate = this.arreyInit(item.chartDate)
  1566. }
  1567. if(type=="chartDateRight"&&Array.isArray(item.chartDateRight)){
  1568. item.chartDateRight = this.arreyInit(item.chartDateRight)
  1569. }
  1570. })
  1571. }else{
  1572. this.daysDate=result;
  1573. this.daysDate.forEach(item=>{
  1574. if(type=="chartDate"&&Array.isArray(item.chartDate)){
  1575. item.chartDate = this.arreyInit(item.chartDate)
  1576. }
  1577. if(type=="chartDateRight"&&Array.isArray(item.chartDateRight)){
  1578. item.chartDateRight = this.arreyInit(item.chartDateRight)
  1579. }
  1580. })
  1581. }
  1582. this.dayData=[];
  1583. let onceFlag=false;
  1584. this.daysDate.forEach((item,index)=>{
  1585. if(!onceFlag){
  1586. this.tableItem = index;
  1587. onceFlag=true;
  1588. }
  1589. let obj={
  1590. name:`周${item.pname}`,
  1591. id:index
  1592. }
  1593. this.dayData.push(obj);
  1594. })
  1595. },
  1596. initTableTime(serviceTime){
  1597. serviceTime = (serviceTime/60)
  1598. let stringnumber = serviceTime.toString();
  1599. serviceTime = stringnumber.indexOf('.')=== -1?serviceTime:serviceTime.toFixed(2);
  1600. return serviceTime
  1601. },
  1602. getTableList(value,date,remark,assessNum){
  1603. let postParams={
  1604. "criteria":{
  1605. "projectId":this.projectId,
  1606. "startDate":this.startDate,
  1607. },
  1608. page:1,
  1609. size:10,
  1610. "orders":[{"column":value,"asc":false}]//hotProprotion 偏热列表 coldProprotion 偏冷列表
  1611. }
  1612. querySubstandardList({postParams}).then(res=>{
  1613. if(res.content){
  1614. res.content.forEach(item=>{
  1615. if(value=="hotProprotion"){
  1616. item.hotProprotion = parseInt(item.hotProprotion*100);
  1617. }else{
  1618. item.coldProprotion = parseInt(item.coldProprotion*100);
  1619. }
  1620. item.abnormalProprotion&&(item.abnormalProprotion = parseInt(item.abnormalProprotion*100));
  1621. item.validProprotion = typeof item.validProprotion == "number"?parseInt(item.validProprotion*100):'--';
  1622. item.avgTemp = typeof item.avgTemp == "number" ? item.avgTemp.toFixed(1) : '--';
  1623. item.serviceTime&&(item.serviceTime=this.initTableTime(item.serviceTime));
  1624. item.co2AbnormalTime&&(item.co2AbnormalTime=this.initTableTime(item.co2AbnormalTime));
  1625. item.hchoAbnormalTime&&(item.hchoAbnormalTime=this.initTableTime(item.hchoAbnormalTime));
  1626. })
  1627. res.content=res.content.filter(item=>{return item.avgTemp!=='--'})
  1628. }
  1629. this[date] = res.content||[];
  1630. this[date].length&&this[date].forEach((item,index)=>{
  1631. this.$set(this[date][index],remark,item[remark]||'');
  1632. })
  1633. if(value==="hotProprotion"||value === "coldProprotion"){
  1634. this[date] = this[date].filter((item,index)=>{
  1635. return item[value]>=10&&item.avgTemp!=='--';
  1636. })
  1637. }
  1638. if(value==="co2AbnormalTime"||value === "hchoAbnormalTime"){
  1639. this[date] = this[date].slice(0,5);
  1640. this[date] = this[date].filter(item=>{
  1641. if(value==="co2AbnormalTime"){
  1642. return item.co2MaxSolubility>assessNum
  1643. }else{
  1644. return item.hchoMaxSolubility>assessNum
  1645. }
  1646. })
  1647. }
  1648. assessNum&&this[date].forEach(item=>{
  1649. if(value==="co2AbnormalTime"){
  1650. item.assess = item.co2MaxSolubility>assessNum?'较高':'正常';
  1651. item.co2MaxSolubility=(typeof(item.co2MaxSolubility)=='number')?item.co2MaxSolubility.toFixed(0):'--';
  1652. }else{
  1653. item.assess = item.hchoMaxSolubility>assessNum?'较高':'正常';
  1654. item.hchoMaxSolubility = item.hchoMaxSolubility.toFixed(2);
  1655. }
  1656. })
  1657. })
  1658. },
  1659. generateDate(startDate,day){
  1660. let start;
  1661. let startList =[];
  1662. for(let i=0;i<day;i++){
  1663. start = moment(startDate);
  1664. startList.push(start.add("days",i).format("YYYYMMDD"))
  1665. }
  1666. return startList
  1667. },
  1668. generateTime(){
  1669. let Timearray=[
  1670. "060000","061500","063000","064500","070000","071500","0,78000","074500","080000", "081500","083000","084500","090000", "091500","093000"
  1671. ,"094500", "100000", "101500","103000","104500","110000", "111500", "113000", "114500","120000", "121500","123000", "124500"
  1672. ,"130000", "131500","133000","134500","140000", "141500", "143000", "144500","150000","151500","153000", "154500", "160000"
  1673. ,"161500", "163000", "164500","170000", "171500","173000","174500", "180000", "181500","183000", "184500", "190000","191500"
  1674. ,"193000", "194500", "200000"
  1675. ]
  1676. return Timearray
  1677. },
  1678. arreyInit(arr,type){
  1679. if(arr&&!arr.length){
  1680. return
  1681. }
  1682. if(type&&type=='custom'){
  1683. let startTime = moment(this.startDate).subtract('days', 7).format("YYYYMMDD")
  1684. let dataList = this.generateDate(startTime,14);
  1685. let copeArr=dataList.map(index=>{
  1686. let items = arr.filter(v=> index ===v.date).length&&arr.filter(v=> index===v.date)[0];
  1687. items.avgPm2d5&&(items.avgPm2d5 =items.avgPm2d5*this.multipleInit);
  1688. let itemsModel={
  1689. avgTemp: -9999,
  1690. coldLastTime:-9999,
  1691. coldProprotion: -9999,
  1692. createTime: -9999,
  1693. date: index,
  1694. daySpaceNum: -9999,
  1695. hotLastTime:-9999,
  1696. hotProprotion: -9999,
  1697. initializeServiceCustomizationTime: -9999,
  1698. normalLastTime: -9999,
  1699. normalProprotion: -9999,
  1700. registeredSpaceNum: -9999,
  1701. }
  1702. return items?items:{...itemsModel,...items}
  1703. })
  1704. arr = copeArr;
  1705. }
  1706. const obj={};
  1707. let keysIndex = this.getKeysIndex(arr)
  1708. let keysArr=arr[keysIndex]&&Object.keys(arr[keysIndex]);
  1709. keysArr.forEach(item=>{
  1710. obj[item]=[];
  1711. })
  1712. arr.forEach(item => {
  1713. for (let keys in keysArr){
  1714. if(!item.hasOwnProperty(keysArr[keys])){
  1715. item[keysArr[keys]]="-9999"
  1716. }
  1717. }
  1718. for (let key in item){
  1719. item[key]=Number(item[key])===-9999?null:item[key];
  1720. obj[key].push(item[key]);
  1721. }
  1722. });
  1723. return obj
  1724. },
  1725. getWeek (week) {
  1726. switch (Number(week)) {
  1727. case 1:
  1728. return '一'
  1729. case 2:
  1730. return '二'
  1731. case 3:
  1732. return '三'
  1733. case 4:
  1734. return '四'
  1735. case 5:
  1736. return '五'
  1737. case 6:
  1738. return '六'
  1739. case 7:
  1740. return '日'
  1741. default:
  1742. return '--'
  1743. }
  1744. },
  1745. getKeysIndex(arr){
  1746. let value = JSON.parse(JSON.stringify(arr));
  1747. let valueArr = value.map(item=>{
  1748. return item&&Object.keys(item).length || 0
  1749. });
  1750. // let valueCope = value.filter(Boolean);
  1751. let valueCope = Math.max.call(null,...valueArr);
  1752. return valueArr.indexOf(valueCope)
  1753. },
  1754. exportClick(){
  1755. this.getPdf('exportPdf', `${this.projectName} - 环境周报 ${moment(this.startDate).format("MM.DD")}~${moment(this.endDate).format("MM.DD")}`,`${this.projectName}`)
  1756. },
  1757. getEmailDate(){
  1758. let postParams={
  1759. "criteria": {
  1760. "projectId": this.projectId,
  1761. },
  1762. "orders": [
  1763. {
  1764. "column": "updateTime",
  1765. "asc": false
  1766. }
  1767. ]
  1768. }
  1769. queryEmail({postParams}).then(res=>{
  1770. if(res.count){
  1771. this.emailData=res.content;
  1772. this.noEmailuser=false;
  1773. }else{
  1774. this.noEmailuser=true
  1775. }
  1776. })
  1777. },
  1778. emailClick(){
  1779. // sagacloud-pdf-pages
  1780. let sendTime = moment().week(moment().week()).startOf('week').valueOf();
  1781. let postParams={
  1782. "criteria": {
  1783. "projectId": this.projectId,
  1784. "sendTime": {
  1785. "$gte": sendTime+'' // 本周的开始时间,用于查询出已经发出过周报的邮箱
  1786. }
  1787. },
  1788. "orders": [
  1789. {
  1790. "column": "updateTime",
  1791. "asc": false
  1792. }
  1793. ]
  1794. }
  1795. queryEmail({postParams}).then(res=>{
  1796. if(res.count){
  1797. // 已发送
  1798. this.checkSendEmail=true;
  1799. this.sendedUser=[];
  1800. this.noSendUser=[];
  1801. res.content.forEach(item=>{
  1802. if(item.emailRecords&&item.emailRecords.length){
  1803. // 已发送的数据
  1804. this.sendedUser.push(item);
  1805. }else{
  1806. // 未发送的数据
  1807. this.noSendUser.push(item);
  1808. }
  1809. })
  1810. }
  1811. if(this.noSendUser.length===res.count){
  1812. // 未发送
  1813. this.checkSendEmail=false
  1814. }
  1815. this.emailVisible=true;
  1816. })
  1817. },
  1818. sendEmail(){
  1819. let postParams={
  1820. ids:[],
  1821. lastWeekMonday:this.startDate,
  1822. lastWeekSunday:this.endDate
  1823. }
  1824. if(!this.checkSendEmail){
  1825. this.emailData.forEach((item)=>{
  1826. postParams.ids.push(item.id)
  1827. })
  1828. }else{
  1829. postParams.ids =this.emailCheckList.concat(this.nosendCheckList)
  1830. }
  1831. passEmail({postParams}).then(res=>{
  1832. if(res.result="success"){
  1833. this.$message.success('发送成功')
  1834. }else{
  1835. this.$message.error;('发送失败')
  1836. }
  1837. this.emailVisible=false;
  1838. })
  1839. }
  1840. },
  1841. watch:{
  1842. comstartDate:{
  1843. handler(newval){
  1844. this.comstartDate=newval;
  1845. if(!this.comstartDate){
  1846. return
  1847. }
  1848. this.dataChange([this.comstartDate,this.comendDate])
  1849. },
  1850. immediate:true
  1851. },
  1852. portDate(newval){
  1853. this.portDate=newval;
  1854. },
  1855. tableItem(){
  1856. this.daysDateCurrent[0] = this.daysDate[this.tableItem];
  1857. },
  1858. chartweekDate:{
  1859. handler(newval){
  1860. this.chartweekDate=newval;
  1861. },
  1862. deep:true
  1863. },
  1864. daysDate:{
  1865. handler(newval){
  1866. this.daysDate=newval;
  1867. },
  1868. deep:true
  1869. },
  1870. numIndex(newval){
  1871. if(this.numIndex==3){
  1872. this.daysDate = this.daysDate.filter(item=>{
  1873. if(!!(item.chartDate||item.chartDateRight||(item.chartDateLeft&&item.chartDateLeft.length))){
  1874. return item
  1875. }
  1876. })
  1877. this.daysDate.forEach(item=>{
  1878. let timeObj=item.chartDate.time;
  1879. (timeObj&&timeObj.length!==57)&&this.timeArray.forEach((items,index)=>{
  1880. if(!timeObj.includes(items)){
  1881. item.chartDate.avgTemp&&item.chartDate.avgTemp.splice(index,0,null)
  1882. item.chartDate.coldSpaceNum&&item.chartDate.coldSpaceNum.splice(index,0,0)
  1883. item.chartDate.coldSpaceProprotion&&item.chartDate.coldSpaceProprotion.splice(index,0,0)
  1884. item.chartDate.hotSpaceNum&&item.chartDate.hotSpaceNum.splice(index,0,0)
  1885. item.chartDate.hotSpaceProprotion&&item.chartDate.hotSpaceProprotion.splice(index,0,0)
  1886. item.chartDate.normalSpaceNum&&item.chartDate.normalSpaceNum.splice(index,0,0);
  1887. item.chartDate.normalSpaceProprotion&&item.chartDate.normalSpaceProprotion.splice(index,0,0);
  1888. !item.chartDate.outSideTemp&&(item.chartDate.outSideTemp=[]);
  1889. (items.slice(1)=='0000')?item.chartDate.outSideTemp.splice(Number(items.slice(0,2))-6,0,'-'):item.chartDate.outSideTemp.splice(index,0,null);
  1890. item.chartDate.spaceNum&&item.chartDate.spaceNum.splice(index,0,0);
  1891. item.chartDate.time.splice(index,0,items);
  1892. }
  1893. })
  1894. })
  1895. this.dataDeal=true;
  1896. }else{
  1897. this.dataDeal=false;
  1898. }
  1899. }
  1900. },
  1901. computed: {
  1902. // ...mapGetters(['projectId']),
  1903. isUserorEngry(){
  1904. return function(value){
  1905. if(value){
  1906. return this.isSpecialType.includes(value)
  1907. }
  1908. return this.isSpecialType.includes(this.envType)
  1909. }
  1910. },
  1911. currentEnv(){
  1912. return this.surveyTable.findIndex(item=>{
  1913. return item.id==this.envType
  1914. })
  1915. },
  1916. multipleInit(){
  1917. if(this.projectId==="Pj1101080259"){
  1918. return 1000;
  1919. }
  1920. return 1
  1921. },
  1922. envTypelistnow(){
  1923. if(this.projectId!=="Pj1101080259"){
  1924. return this.envTypelist.slice(0,6)
  1925. }
  1926. return this.envTypelist
  1927. },
  1928. surveyTablenow(){
  1929. if(this.projectId!=="Pj1101080259"){
  1930. return this.surveyTable.slice(0,6)
  1931. }
  1932. return this.surveyTable
  1933. }
  1934. // slicesurveyTable(){
  1935. // return this.surveyTable.slice(0,5)
  1936. // }
  1937. },
  1938. }
  1939. </script>
  1940. <style lang="less" scoped>
  1941. .sended{
  1942. line-height: 25px;
  1943. }
  1944. .download_box{
  1945. display: flex;
  1946. justify-content: flex-end;
  1947. padding: 20px 20px 0 0;
  1948. // margin-bottom: 20px;
  1949. .ml20{
  1950. margin-left: 20px;
  1951. }
  1952. }
  1953. .mp40{
  1954. margin-top: 40px;
  1955. }
  1956. .mp80{
  1957. margin-top: 170px;
  1958. }
  1959. .mp990{
  1960. margin-top: 1020px;
  1961. }
  1962. .mp140{
  1963. margin-top: 90px;
  1964. }
  1965. .mp400{
  1966. margin-top: 620px;
  1967. }
  1968. .marginList(@Name,@number){
  1969. .mb@{number}{
  1970. margin-@{Name}:@number*1px;
  1971. }
  1972. }
  1973. @bottom: 0,5,10,16,32,40,52,100,180,200,250,300,380,430,350,475,480,330,450,500,520,600,690,730,900;
  1974. .loopMarginList(@i) when (@i < (length(@bottom)+1)) {
  1975. .marginList(bottom, extract(@bottom, @i));
  1976. .loopMarginList(@i+1);
  1977. }
  1978. .loopMarginList(1);
  1979. .pr65{
  1980. padding-right: 65px;
  1981. }
  1982. .addmarkhg{
  1983. height: 200px;
  1984. }
  1985. .addmark{
  1986. user-select: none;
  1987. margin-top: 30px;
  1988. .remark_txt{
  1989. padding-bottom: 12px;
  1990. color: #1F2429;
  1991. font-size: 14px;
  1992. }
  1993. .remarkshow{
  1994. width: 100%;
  1995. height: 80px;
  1996. background: #f7f7f7;
  1997. padding: 10px;
  1998. box-sizing: border-box;
  1999. border-radius: 8px;
  2000. }
  2001. .remark_input{
  2002. margin-bottom: 20px;
  2003. }
  2004. }
  2005. .ml17{
  2006. margin:0 0 20px 31px;
  2007. position: relative;
  2008. &::before{
  2009. content:'';
  2010. display: inline-block;
  2011. position: absolute;
  2012. top: 7px;
  2013. left: -15px;
  2014. width:6px;
  2015. height: 6px;
  2016. border-radius: 50%;
  2017. border: 1px solid #8d9399;
  2018. }
  2019. &>p{
  2020. margin:0 0 8px 0;
  2021. }
  2022. }
  2023. .page_main{
  2024. width: 1300px; //最合适宽度
  2025. margin: auto;
  2026. position: relative;
  2027. background: #f7f9fa;
  2028. .page_header{
  2029. text-align: center;
  2030. // background: #ffffff;
  2031. position: relative;
  2032. padding:40px 0 28px; //60px
  2033. font-size:30px;
  2034. color:rgba(31,36,41,1);
  2035. span{
  2036. font-size: 24px;
  2037. font-family: serif;
  2038. }
  2039. .pname{
  2040. position: absolute;
  2041. font-size: 24px;
  2042. right: 40px;
  2043. top: 49px;
  2044. }
  2045. }
  2046. .title_one_table{
  2047. & >.sj_table{
  2048. font-size: 16px;
  2049. }
  2050. }
  2051. .env_module{
  2052. background: #ffffff;
  2053. // overflow: hidden;
  2054. border-radius: 8px;
  2055. padding: 24px 0 48px 20px;
  2056. & /deep/ .el-table thead>tr{
  2057. background: #F8F9FA;
  2058. }
  2059. & /deep/ .el-table .warning-row{
  2060. background: #fff5e9;
  2061. color: #DE7802;
  2062. }
  2063. .daytabs{
  2064. margin-left: 16px;
  2065. }
  2066. .sj_title{
  2067. text-align: center;
  2068. margin:28px auto 36px;
  2069. font-size: 24px;
  2070. color: #1F2429;
  2071. line-height: 24px;
  2072. }
  2073. .title_one{
  2074. font-size: 26px;
  2075. }
  2076. .pm_container{
  2077. &>p{
  2078. font-size: 16px;
  2079. color: #1F2429;
  2080. padding: 26px 0;
  2081. }
  2082. .pm_table{
  2083. display: flex;
  2084. .left{
  2085. flex:1;
  2086. padding: 0 50px 0 10px;
  2087. .pm_chart{
  2088. height: 250px;
  2089. }
  2090. .pm_count{
  2091. font-size: 14px;
  2092. margin-bottom: 15px;
  2093. span{
  2094. font-size: 20px;
  2095. }
  2096. }
  2097. }
  2098. .right{
  2099. margin-right: 52px;
  2100. width: 679px;
  2101. & /deep/ .el-table--mini td, .el-table--mini th {
  2102. padding: 8px 0;
  2103. }
  2104. }
  2105. }
  2106. }
  2107. .sj_table{
  2108. margin-bottom: 18px;
  2109. }
  2110. .title_tips{
  2111. font-size: 12px;
  2112. font-weight: 400;
  2113. color: #8D9399;
  2114. line-height: 20px;
  2115. &>i{
  2116. margin-right: 5px;
  2117. }
  2118. }
  2119. .big_tips{
  2120. font-size: 14px;
  2121. }
  2122. .charttext_p{
  2123. float: right;
  2124. margin-top: 7px;
  2125. }
  2126. .charttext{
  2127. float: right;
  2128. }
  2129. .content_title{
  2130. font-size: 20px;
  2131. // display: inline-block;
  2132. margin-bottom: 24px;
  2133. &::before {
  2134. content: "";
  2135. display: inline-block;
  2136. width: 4px;
  2137. height: 20px;
  2138. margin: 4px 8px 0 0;
  2139. background-color: rgba(51, 153, 255, 1);
  2140. }
  2141. span{
  2142. vertical-align: top;
  2143. }
  2144. span:nth-child(2){
  2145. font-size: 16px;
  2146. vertical-align: text-top;
  2147. color: #646A73;
  2148. }
  2149. }
  2150. .content_title_gray{
  2151. font-size: 16px;
  2152. line-height: 28px;
  2153. &::before {
  2154. background-color: #8d9399;
  2155. }
  2156. }
  2157. .content_title_noline{
  2158. font-size: 16px;
  2159. color: #1F2429;
  2160. line-height: 22px;
  2161. margin-left: 12px;
  2162. display: inline-block;
  2163. }
  2164. .room_table{
  2165. height: 56px;
  2166. margin: 0px 0 40px -30px;
  2167. &>div{
  2168. display: flex;
  2169. flex-direction: row;
  2170. align-items: center;
  2171. padding: 0 10px;
  2172. &>div:nth-child(1){
  2173. width: 80px;
  2174. margin-right: 5px;
  2175. }
  2176. &>div:not(:first-child){
  2177. text-align: center;
  2178. min-width: 40px;
  2179. }
  2180. &>div{
  2181. // margin-right: 33px;
  2182. // margin-right: 42.5px;
  2183. margin-right: 46.5px;
  2184. }
  2185. }
  2186. .room_table_name{
  2187. background: #f8f9fa;
  2188. height:32px;
  2189. }
  2190. .room_table_number{
  2191. position: relative;
  2192. display: flex;
  2193. font-size: 14px;
  2194. &>div:nth-child(1){
  2195. position: absolute;
  2196. left: 10px;
  2197. width: 71px;
  2198. line-height: 16px;
  2199. }
  2200. &>div:nth-child(2){
  2201. flex:1;
  2202. display: flex;
  2203. padding-left: 65px;
  2204. justify-content: space-around;
  2205. &>div{
  2206. min-width: 9px;
  2207. min-width: 13px;
  2208. }
  2209. }
  2210. margin-top:8px;
  2211. height: 36px;
  2212. line-height: 36px;
  2213. border-bottom: 1px solid #EEEEEE;
  2214. border-top: 1px solid #EEEEEE;
  2215. // line-height: 50px;
  2216. }
  2217. }
  2218. .room_table_user{
  2219. height: auto;
  2220. }
  2221. .paramlist{
  2222. padding: 0 0 0 12px;
  2223. color: #8D9399;
  2224. .rh_img{
  2225. display: flex;
  2226. align-items: center;
  2227. margin: 8px 0 0 9px;
  2228. img{
  2229. width: 16px;
  2230. height: 16px;
  2231. margin-right: 4px;
  2232. }
  2233. }
  2234. &>li{
  2235. margin: 0 0 20px 0;
  2236. &>p i{
  2237. display: inline-block;
  2238. width: 6px;
  2239. height: 6px;
  2240. margin-right: 7px;
  2241. // background: #0091FF;
  2242. background: #8D9399;
  2243. border-radius: 50%;
  2244. }
  2245. .co2table{
  2246. margin:16px 0;
  2247. }
  2248. .hum_list{
  2249. display: flex;
  2250. align-items: center;
  2251. margin: 15px 0 9px 10px;
  2252. color: #2B3036;
  2253. div{
  2254. // width: 182px;
  2255. padding: 0 16px;
  2256. height: 32px;
  2257. display: flex;
  2258. margin-right: 53px;
  2259. justify-content: center;
  2260. align-items: center;
  2261. background: #F8F9FA;
  2262. border-radius: 16px;
  2263. img{
  2264. width: 16px;
  2265. height:16px;
  2266. }
  2267. span{
  2268. margin: 0 10px 0 5px;
  2269. }
  2270. }
  2271. }
  2272. }
  2273. }
  2274. .paramlist_explain{
  2275. &>li>p:nth-child(1){
  2276. margin: 0 0 8px 0;
  2277. }
  2278. }
  2279. .sj_survey{
  2280. display: flex;
  2281. padding: 0 31px;
  2282. margin: 0 0 14px;
  2283. .sj_survey_left{
  2284. display: flex;
  2285. min-width: 160px;
  2286. max-width: 160px;
  2287. flex-direction: column;
  2288. border-right: 1px solid #EFF0F1;
  2289. &>span{
  2290. font-size: 14px;
  2291. color: #646A73;
  2292. line-height: 19px;
  2293. }
  2294. .avgtemp{
  2295. font-size: 42px;
  2296. font-weight: 500;
  2297. color: #1F2329;
  2298. line-height: 59px;
  2299. &>span{
  2300. font-size: 24px;
  2301. }
  2302. }
  2303. .tempstatus{
  2304. width: 96px;
  2305. height: 26px;
  2306. display: flex;
  2307. justify-content: center;
  2308. align-items: center;
  2309. background: #F4F6F9;
  2310. border-radius: 16px;
  2311. color:#8D9399;
  2312. img{
  2313. width: 16px;
  2314. height: 16px;
  2315. margin-right: 6px;
  2316. }
  2317. }
  2318. }
  2319. .sj_survey_right{
  2320. display: flex;
  2321. .survey_chart{
  2322. width: 128px;
  2323. height: 128px;
  2324. margin:0 82px 0 63px;
  2325. }
  2326. .right_ratelist{
  2327. display: flex;
  2328. flex-direction: row;
  2329. .rate_item{
  2330. margin-right: 106px;
  2331. &>div:nth-child(1){
  2332. font-size: 14px;
  2333. color: #646A73;
  2334. line-height: 19px;
  2335. }
  2336. &>div:nth-child(2){
  2337. margin-top: 12px;
  2338. font-size: 14px;
  2339. color: #646A73;
  2340. line-height: 19px;
  2341. div{
  2342. font-size: 28px;
  2343. color: #1F2329;
  2344. line-height: 37px;
  2345. &>span{
  2346. font-size: 12px;
  2347. }
  2348. }
  2349. p{
  2350. font-size: 12px;
  2351. color: #646A73;
  2352. line-height: 17px;
  2353. img{
  2354. width: 9px;
  2355. height: 12px;
  2356. margin-left: 12px;
  2357. }
  2358. }
  2359. }
  2360. }
  2361. }
  2362. }
  2363. }
  2364. .sj_reminder{
  2365. width: 100%;
  2366. padding: 16px 24px 0;
  2367. height: 136px;
  2368. background: #F8F9FA;
  2369. border-radius: 12px;
  2370. &>p{
  2371. font-size: 14px;
  2372. font-weight: 400;
  2373. color: #646C73;
  2374. line-height: 24px;
  2375. }
  2376. &>p:first-child{
  2377. color: #8D9399;
  2378. margin-bottom: 5px;
  2379. }
  2380. }
  2381. .sj_chartbox{
  2382. display: flex;
  2383. padding: 0 15px;
  2384. &>div{
  2385. flex: 1;
  2386. .day_title{
  2387. font-size: 16px;
  2388. color: #1F2429;
  2389. line-height: 22px;
  2390. }
  2391. .chart_sj_bottom{
  2392. display: flex;
  2393. position: relative;
  2394. height: 36px;
  2395. line-height: 36px;
  2396. border-bottom: 1px solid #EEEEEE;
  2397. border-top: 1px solid #EEEEEE;
  2398. &>div:nth-child(1){
  2399. position: absolute;
  2400. }
  2401. .twoline{
  2402. left: -22px;
  2403. width: 37px;
  2404. line-height: 16px;
  2405. }
  2406. .chart_sj_bottom_main{
  2407. flex: 1;
  2408. display: flex;
  2409. justify-content: space-around;
  2410. }
  2411. }
  2412. }
  2413. }
  2414. .up_distribution{
  2415. height: 255px;
  2416. position: relative;
  2417. .up_distribution_text{
  2418. position: absolute;
  2419. top: 0;
  2420. right: 400px;
  2421. span{
  2422. display: inline-block;
  2423. width: 12px;
  2424. height: 12px;
  2425. margin-right: 10px;
  2426. background: #ff0000;
  2427. }
  2428. }
  2429. }
  2430. .content_body{
  2431. padding: 10px;
  2432. .body_title{
  2433. overflow: hidden;
  2434. line-height: 44px;
  2435. height: 44px;
  2436. font-size: 14px;
  2437. margin-bottom: 12px;
  2438. border-radius: 4px;
  2439. background: #F8F9FA;
  2440. width: 100%;
  2441. &::before {
  2442. content: "";
  2443. display: inline-block;
  2444. width: 7px;
  2445. height: 44px;
  2446. margin: 0px 8px 0 0;
  2447. background-color: #F9908B;
  2448. }
  2449. span{
  2450. vertical-align: top;
  2451. }
  2452. .temptable{
  2453. height: 400px!important;
  2454. }
  2455. .tabletag{
  2456. display: inline-block;
  2457. // height: 32px;
  2458. padding: 0 10px;
  2459. line-height: 18px;
  2460. font-size: 12px;
  2461. border-radius: 2px;
  2462. box-sizing: border-box;
  2463. white-space: nowrap;
  2464. margin: 13px 10px;
  2465. width:44px;
  2466. height:18px;
  2467. }
  2468. .taghot{
  2469. background: #FDE3E2;
  2470. color: #AC2F28;
  2471. }
  2472. .tagclod{
  2473. background: #E1F2FF;
  2474. color: #0065B3;
  2475. }
  2476. }
  2477. .day_title{
  2478. display: inline-block;
  2479. height:22px;
  2480. font-size:16px;
  2481. color:rgba(31,36,41,1);
  2482. line-height:22px;
  2483. }
  2484. .oneday_title{
  2485. margin-bottom: 50px;
  2486. }
  2487. .body_coldtitle{
  2488. margin-top: 40px;
  2489. &::before {
  2490. background-color: #0091FF;
  2491. }
  2492. }
  2493. .twochart_box{
  2494. display: flex;
  2495. flex-direction: row;
  2496. &>div{
  2497. flex: 1;
  2498. .daychart{
  2499. min-width: 488px;
  2500. height: 285px;
  2501. }
  2502. .daylinechart{
  2503. margin-top: 25px;
  2504. }
  2505. .daybarchart{
  2506. height: 180px;
  2507. }
  2508. }
  2509. }
  2510. }
  2511. .user_total{
  2512. display: flex;
  2513. flex-wrap: nowrap;
  2514. height: 54px;
  2515. margin-bottom: 48px;
  2516. padding: 0 0 0 10px;
  2517. &>div{
  2518. display: flex;
  2519. flex:1;
  2520. justify-content: center;
  2521. flex-direction: column;
  2522. align-items: center;
  2523. border-left: 1px solid #EFF0F1;
  2524. &>div{
  2525. max-width: 130px;
  2526. min-width: 130px;
  2527. text-align: left;
  2528. }
  2529. &>div:nth-child(1){
  2530. font-size: 14px;
  2531. color: #646A73;
  2532. line-height: 19px;
  2533. }
  2534. &>div:nth-child(2){
  2535. font-size: 12px;
  2536. color: #000000;
  2537. line-height: 27px;
  2538. span{
  2539. font-size: 20px;
  2540. }
  2541. }
  2542. }
  2543. &>div:nth-child(1){
  2544. border-left: 1px solid transparent;
  2545. align-items: flex-start;
  2546. }
  2547. }
  2548. .ft12{
  2549. font-size: 12px;
  2550. }
  2551. }
  2552. .todom_box{
  2553. padding: 0 20px 20px;
  2554. font-size: 14px;
  2555. color: rgb(0, 145, 255);
  2556. &>div{
  2557. margin-top: 15px;
  2558. cursor: pointer;
  2559. }
  2560. }
  2561. .pageitem_box{
  2562. padding: 20px;
  2563. margin-bottom: 16px;
  2564. border-radius: 8px;
  2565. background: #ffffff;
  2566. .charttext_p{
  2567. float: right;
  2568. margin-top: 7px;
  2569. }
  2570. .charttext{
  2571. float: right;
  2572. }
  2573. .content_title{
  2574. font-size: 20px;
  2575. // font-weight: bold;
  2576. display: inline-block;
  2577. margin-bottom: 12px;
  2578. &::before {
  2579. content: "";
  2580. display: inline-block;
  2581. width: 4px;
  2582. height: 20px;
  2583. margin: 4px 8px 0 0;
  2584. background-color: rgba(51, 153, 255, 1);
  2585. }
  2586. span{
  2587. vertical-align: top;
  2588. }
  2589. span:nth-child(2){
  2590. font-size: 16px;
  2591. vertical-align: text-top;
  2592. color: #646A73;
  2593. }
  2594. }
  2595. .room_table{
  2596. height: 56px;
  2597. margin: 0px 0 0 -30px;
  2598. &>div{
  2599. display: flex;
  2600. flex-direction: row;
  2601. align-items: center;
  2602. padding: 0 10px;
  2603. &>div:nth-child(1){
  2604. width: 80px;
  2605. margin-right: 5px;
  2606. }
  2607. &>div:not(:first-child){
  2608. text-align: center;
  2609. min-width: 40px;
  2610. }
  2611. &>div{
  2612. margin-right: 33px;
  2613. }
  2614. }
  2615. .room_table_name{
  2616. background: #f8f9fa;
  2617. height:32px;
  2618. }
  2619. .room_table_number{
  2620. position: relative;
  2621. display: flex;
  2622. &>div:nth-child(1){
  2623. position: absolute;
  2624. left: 10px;
  2625. width: 65px;
  2626. line-height: 16px;
  2627. }
  2628. &>div:nth-child(2){
  2629. flex:1;
  2630. display: flex;
  2631. padding-left: 65px;
  2632. justify-content: space-around;
  2633. &>div{
  2634. min-width: 9px;
  2635. }
  2636. }
  2637. margin-top:8px;
  2638. height: 36px;
  2639. line-height: 36px;
  2640. border-bottom: 1px solid #EEEEEE;
  2641. border-top: 1px solid #EEEEEE;
  2642. }
  2643. }
  2644. .content_body{
  2645. padding: 10px;
  2646. .body_title{
  2647. overflow: hidden;
  2648. line-height: 44px;
  2649. height: 44px;
  2650. font-size: 14px;
  2651. // display: inline-flex;
  2652. margin-bottom: 12px;
  2653. border-radius: 4px;
  2654. background: #F8F9FA;
  2655. width: 100%;
  2656. &::before {
  2657. content: "";
  2658. display: inline-block;
  2659. width: 7px;
  2660. height: 44px;
  2661. margin: 0px 8px 0 0;
  2662. background-color: #F9908B;
  2663. }
  2664. span{
  2665. vertical-align: top;
  2666. }
  2667. .temptable{
  2668. height: 400px!important;
  2669. }
  2670. .tabletag{
  2671. display: inline-block;
  2672. // height: 32px;
  2673. padding: 0 10px;
  2674. line-height: 18px;
  2675. font-size: 12px;
  2676. border-radius: 2px;
  2677. box-sizing: border-box;
  2678. white-space: nowrap;
  2679. margin: 13px 10px;
  2680. width:44px;
  2681. height:18px;
  2682. }
  2683. .taghot{
  2684. background: #FDE3E2;
  2685. color: #AC2F28;
  2686. }
  2687. .tagclod{
  2688. background: #E1F2FF;
  2689. color: #0065B3;
  2690. }
  2691. }
  2692. .day_title{
  2693. display: inline-block;
  2694. height:22px;
  2695. font-size:16px;
  2696. color:rgba(31,36,41,1);
  2697. line-height:22px;
  2698. }
  2699. .oneday_title{
  2700. margin-bottom: 50px;
  2701. }
  2702. .body_coldtitle{
  2703. margin-top: 25px;
  2704. &::before {
  2705. background-color: #0091FF;
  2706. }
  2707. }
  2708. .twochart_box{
  2709. display: flex;
  2710. flex-direction: row;
  2711. &>div{
  2712. flex: 1;
  2713. .daychart{
  2714. min-width: 488px;
  2715. height: 285px;
  2716. }
  2717. .daylinechart{
  2718. margin-top: 25px;
  2719. }
  2720. .daybarchart{
  2721. height: 180px;
  2722. }
  2723. }
  2724. }
  2725. }
  2726. }
  2727. }
  2728. #exportPdf{
  2729. /* display: none; */
  2730. position: absolute;
  2731. background: #ffffff;
  2732. left: -999999px;
  2733. top: 0;
  2734. // width: 1260px;
  2735. width: 1320px;
  2736. .page_header{
  2737. padding: 430px 0 158px;
  2738. .pname{
  2739. right: 70px;
  2740. top: 760px;
  2741. }
  2742. }
  2743. .env_module{
  2744. padding: 24px 0 20px;
  2745. &>div{
  2746. padding:0 100px 0px
  2747. }
  2748. &>section{
  2749. padding:0 100px 0px
  2750. }
  2751. &>.room_table{
  2752. .room_table_number{
  2753. &>div{
  2754. &>div:not(:first-child){
  2755. text-align: center;
  2756. min-width: 41px;
  2757. }
  2758. }
  2759. &>div:nth-child(2){
  2760. &>div{
  2761. min-width: 47px;
  2762. }
  2763. }
  2764. }
  2765. }
  2766. .pageitem_box_list{
  2767. padding:0;
  2768. }
  2769. .pageitem_box{
  2770. // padding: 0 40px 12px;
  2771. padding: 0 70px 12px;
  2772. // margin-bottom: 10px;
  2773. }
  2774. .pageitem_box_coustom{
  2775. // padding: 0 40px;
  2776. padding: 0 70px;
  2777. }
  2778. .pageitem_box_first{
  2779. margin-bottom: 0px;
  2780. }
  2781. .pageitem_box_sec{
  2782. margin-bottom: 74px;
  2783. }
  2784. .pageitem_box_list>.pageitem_box:nth-child(2n+0){
  2785. // margin-bottom: 100px;
  2786. margin-bottom: 200px;
  2787. }
  2788. .pageitem_box:nth-child(1){
  2789. margin-bottom: 0px;
  2790. }
  2791. .pageitem_box:last-child{
  2792. margin-bottom: 0px;
  2793. }
  2794. .pageitem_box_list>.pageitem_box:last-child{
  2795. margin-bottom: 0;
  2796. }
  2797. }
  2798. }
  2799. </style>