index.vue 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484
  1. <template>
  2. <div class="app-container subject">
  3. <div class="page-container subject-page" v-if="pageType == 1">
  4. <div class="left-subject-list">
  5. <div class="page-form-title-box">
  6. <el-form :model="queryParams" ref="queryForm" :inline="true">
  7. <el-form-item label="" prop="searchValue">
  8. <el-input
  9. v-model="queryParams.searchValue"
  10. placeholder="实验室/房间号"
  11. clearable
  12. maxlength="10"
  13. style="width:150px;"
  14. />
  15. </el-form-item>
  16. <el-form-item label="" prop="deptId">
  17. <el-select v-model="queryParams.deptId" filterable placeholder="二级单位" style="width:140px;">
  18. <el-option
  19. v-for="dict in deptOptions"
  20. :key="dict.deptId"
  21. :label="dict.deptName"
  22. :value="dict.deptId"
  23. ></el-option>
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item label="" prop="buildId">
  27. <el-select v-model="queryParams.buildId" filterable placeholder="楼栋" style="width:140px;">
  28. <el-option
  29. v-for="dict in buildOptions"
  30. :key="dict.id"
  31. :label="dict.name"
  32. :value="dict.id"
  33. ></el-option>
  34. </el-select>
  35. </el-form-item>
  36. <el-form-item label="" prop="typeId">
  37. <el-select v-model="queryParams.typeId" placeholder="安全分类" style="width:140px;">
  38. <el-option
  39. v-for="dict in typeList"
  40. :key="dict.typeId"
  41. :label="dict.subType"
  42. :value="dict.typeId"
  43. ></el-option>
  44. </el-select>
  45. </el-form-item>
  46. <el-form-item label="" prop="levelId">
  47. <el-select v-model="queryParams.levelId" placeholder="安全分级" style="width:140px;">
  48. <el-option
  49. v-for="dict in levelList"
  50. :key="dict.levelId"
  51. :label="dict.titleName"
  52. :value="dict.levelId"
  53. ></el-option>
  54. </el-select>
  55. </el-form-item>
  56. <p class="page-inquire-common-style-button" @click="handleQuery">查询</p>
  57. <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
  58. <el-dropdown @command="commandButton" style="float: right;">
  59. <p class="page-submit-common-style-button" style="width:105px;"
  60. >操作<span class="el-icon-arrow-down" style="margin-left:10px;"></span></p>
  61. <el-dropdown-menu slot="dropdown">
  62. <el-dropdown-item :command="{command:1}" v-hasPermiRouter="['system:subject:add']">新增</el-dropdown-item>
  63. <!--<el-dropdown-item :command="{command:2}">关联配置</el-dropdown-item>-->
  64. <!--<el-dropdown-item :command="{command:3}">准入配置</el-dropdown-item>-->
  65. <el-dropdown-item :command="{command:4}">下载二维码</el-dropdown-item>
  66. </el-dropdown-menu>
  67. </el-dropdown>
  68. <el-form-item v-hasPermiRouter="['system:subject:import']" style="float: right;">
  69. <import-component :importConfig="importConfig"></import-component>
  70. </el-form-item>
  71. </el-form>
  72. </div>
  73. <div class="page-content-box">
  74. <el-table class="table-box" ref="table-box" border :data="dataList" highlight-current-row
  75. @select-all="handleSelectionChange" @select="handleSelectionChange" :row-key="getRowKeys"
  76. @current-change="handleCurrentChange">
  77. <el-table-column type="selection" width="50" :reserve-selection="true" align="center"/>
  78. <el-table-column label="排序" align="left" prop="orderNum" width="75">
  79. <template slot-scope="scope">
  80. <el-input maxlength="4" type="text" oninput="value=value.replace(/[^0-9.]/g,'')"
  81. v-model="scope.row.orderNum" @focus="liveSort(scope.row)"
  82. @blur="editSort(scope.row)">
  83. </el-input>
  84. </template>
  85. </el-table-column>
  86. <el-table-column label="实验室名称" align="left" prop="subName" show-overflow-tooltip/>
  87. <el-table-column label="房间号" align="left" prop="roomName" width="100" show-overflow-tooltip>
  88. <template slot-scope="scope">
  89. <span>{{scope.row.roomName?scope.row.roomName:'未绑定'}}</span>
  90. </template>
  91. </el-table-column>
  92. <el-table-column label="学院" align="left" prop="deptName" width="130" show-overflow-tooltip/>
  93. <el-table-column label="楼栋/楼层" align="left" prop="buildName" width="130" show-overflow-tooltip>
  94. <template slot-scope="scope">
  95. <span>{{scope.row.buildName}}/{{scope.row.floorName}}</span>
  96. </template>
  97. </el-table-column>
  98. <el-table-column label="分类/分级" align="left" prop="levelName" width="150" show-overflow-tooltip>
  99. <template slot-scope="scope">
  100. <span>{{scope.row.typeName}}/</span>
  101. <span :style="'color:'+scope.row.levelColor+';'">{{scope.row.levelName}}</span>
  102. </template>
  103. </el-table-column>
  104. <el-table-column label="实验室负责人" align="left" prop="adminName" width="120" show-overflow-tooltip/>
  105. <el-table-column label="安全员" align="left" prop="safeUserNames" width="120" show-overflow-tooltip/>
  106. <el-table-column label="操作" align="left" width="140">
  107. <template slot-scope="scope">
  108. <div class="table-button-box">
  109. <p class="table-button-null"></p>
  110. <p class="table-button-p" v-hasPermiRouter="['system:subject:detail']"
  111. @click.stop="clickPage(7,scope.row)">详情</p>
  112. <el-dropdown trigger="click" size="mini" @command="(command) => handleCommand(command, scope.row)"
  113. v-hasPermiRouter="['system:subject:edit']">
  114. <p class="table-button-p">更多>></p>
  115. <el-dropdown-menu slot="dropdown" style="margin:0!important;">
  116. <el-dropdown-item style="height:36px;line-height:36px;width:90px;text-align: center" command="1"
  117. v-hasPermiRouter="['system:subject:edit']">关联配置
  118. </el-dropdown-item>
  119. <el-dropdown-item style="height:36px;line-height:36px;width:90px;text-align: center" command="2"
  120. v-hasPermiRouter="['system:subject:edit']">准入配置
  121. </el-dropdown-item>
  122. <el-dropdown-item style="height:36px;line-height:36px;width:90px;text-align: center" command="3"
  123. v-hasPermiRouter="['system:subject:edit']">编辑
  124. </el-dropdown-item>
  125. <el-dropdown-item style="height:36px;line-height:36px;width:90px;text-align: center" command="4"
  126. v-hasPermiRouter="['system:subject:edit']">
  127. {{scope.row.accessControl?'关闭准入':'开启准入'}}
  128. </el-dropdown-item>
  129. <el-dropdown-item style="height:36px;line-height:36px;width:90px;text-align: center" command="5"
  130. v-hasPermiRouter="['system:subject:edit']">信息牌下载
  131. </el-dropdown-item>
  132. <el-dropdown-item style="height:36px;line-height:36px;width:90px;text-align: center" command="6"
  133. >实验室设备
  134. </el-dropdown-item>
  135. </el-dropdown-menu>
  136. </el-dropdown>
  137. <p class="table-button-null"></p>
  138. </div>
  139. </template>
  140. </el-table-column>
  141. </el-table>
  142. <pagination
  143. v-show="total>0"
  144. :total="total"
  145. :page.sync="queryParams.page"
  146. :limit.sync="queryParams.pageSize"
  147. @pagination="getList"
  148. />
  149. </div>
  150. </div>
  151. <index-right-page ref="indexRightPage"></index-right-page>
  152. </div>
  153. <!--电子信息牌导出-->
  154. <el-dialog class="subject-dialog" title='' width="1267px" append-to-body
  155. :visible.sync="dialogType" v-if="dialogType" @close="dialogOff()"
  156. :close-on-click-modal="false" :close-on-press-escape="false">
  157. <div class="subject-dialog-button-box">
  158. <p @click="dialogOff">取消</p>
  159. <p @click="downloadImg">下载</p>
  160. </div>
  161. <div id="subject-dialog-print-box" ref="canvasImg">
  162. <div class="subject-dialog-top-max-big-box">
  163. <div class="subject-dialog-top-level-box" :style="'background-color:'+dialogData.filedColor+';'">
  164. <p>{{dialogData.levelName}}</p>
  165. <p>{{dialogData.typeName}}</p>
  166. </div>
  167. <div class="subject-dialog-top-text1-box">
  168. <div class="subject-dialog-top-text-box">
  169. <div style="padding-right: 0;">
  170. <p>单</p>
  171. <p>位</p>
  172. <p>名</p>
  173. <p>称</p>
  174. </div>
  175. <p class="subject-dialog-top-text-p">{{dialogData.deptName}}</p>
  176. </div>
  177. <div class="subject-dialog-top-text-box">
  178. <div style="padding-right: 9px;">
  179. <p>实</p>
  180. <p>验</p>
  181. <p>室</p>
  182. <p>名</p>
  183. <p>称</p>
  184. </div>
  185. <p class="subject-dialog-top-text-p">{{dialogData.subjectName}}</p>
  186. </div>
  187. <div class="subject-dialog-top-text-box">
  188. <div>
  189. <p>实</p>
  190. <p>验</p>
  191. <p>室</p>
  192. <p>负</p>
  193. <p>责</p>
  194. <p>人</p>
  195. </div>
  196. <p class="subject-dialog-top-text-p">{{dialogData.adminName}}</p>
  197. </div>
  198. </div>
  199. <div class="subject-dialog-top-text2-box">
  200. <div class="subject-dialog-top-text-box">
  201. <div>
  202. <p>楼</p>
  203. <p style="text-align: right">宇</p>
  204. </div>
  205. <p class="subject-dialog-top-text-p">{{dialogData.buildName}}</p>
  206. </div>
  207. <div class="subject-dialog-top-text-box">
  208. <div>
  209. <p style="text-align: left">房</p>
  210. <p style="text-align: center">间</p>
  211. <p style="text-align: right">号</p>
  212. </div>
  213. <p class="subject-dialog-top-text-p">{{dialogData.room}}</p>
  214. </div>
  215. <div class="subject-dialog-top-text-box">
  216. <div>
  217. <p>负</p>
  218. <p>责</p>
  219. <p>人</p>
  220. <p>电</p>
  221. <p>话</p>
  222. </div>
  223. <p class="subject-dialog-top-text-p">{{dialogData.adminPhone}}</p>
  224. </div>
  225. </div>
  226. <div class="subject-dialog-top-code-box">
  227. <vue-qr style="display: block;height:164px;width:164px;margin:24px 18px;"
  228. :text="identification+'?'+dialogData.qrCodeUrl" :size="300">
  229. </vue-qr>
  230. </div>
  231. </div>
  232. <div class="subject-dialog-bottom-max-big-box">
  233. <!--左侧图片部分-->
  234. <div class="subject-dialog-bottom-left-max-big-box">
  235. <div v-for="(item,index) in dialogData.imgList" class="for-max-box">
  236. <p class="for-title-p" :style="'background-color:'+item.showColour+';'">{{item.classifyName}}</p>
  237. <div>
  238. <img v-for="(minItem) in item.classifyList" :src="minItem">
  239. </div>
  240. </div>
  241. </div>
  242. <!--右侧文字部分-->
  243. <div class="subject-dialog-bottom-right-max-big-box">
  244. <div v-for="(item,index) in dialogData.textList" class="for-max-box">
  245. <p class="for-title-p" :style="'background-color:'+item.showColour+';'">{{item.classifyName}}</p>
  246. <div>
  247. <p v-for="(minItem) in item.classifyList">{{minItem}}</p>
  248. </div>
  249. </div>
  250. </div>
  251. </div>
  252. </div>
  253. <!--<div id="subject-dialog-print-box" ref="canvasImg">-->
  254. <!--<div class="subject-dialog-print-big-box">-->
  255. <!--&lt;!&ndash;信息栏&ndash;&gt;-->
  256. <!--<div class="subject-dialog-print-top-box">-->
  257. <!--<div class="subject-dialog-print-top-left-box">-->
  258. <!--<div class="subject-dialog-print-top-left-top-box">-->
  259. <!--&lt;!&ndash;实验室名称&ndash;&gt;-->
  260. <!--<div class="subject-dialog-name-box">-->
  261. <!--<div class="title-box-1">-->
  262. <!--<div class="title-box-2" :style="'background-color:'+dialogData.filedColor+';'">-->
  263. <!--<div class="title-box-3">-->
  264. <!--<p :style="'background-color:'+dialogData.filedColor+';'">-->
  265. <!--{{dialogData.levelName}}丨{{dialogData.typeName}}</p>-->
  266. <!--</div>-->
  267. <!--</div>-->
  268. <!--</div>-->
  269. <!--<p class="title-p">实验室安全信息牌</p>-->
  270. <!--</div>-->
  271. <!--&lt;!&ndash;实验室信息&ndash;&gt;-->
  272. <!--<div class="subject-dialog-info-box">-->
  273. <!--<div class="subject-dialog-info-left-box">-->
  274. <!--<div class="subject-dialog-info-left-min-box">-->
  275. <!--<div>-->
  276. <!--<p class="text-p-left" style="margin-right:10px;">责</p>-->
  277. <!--<p class="text-p-center">任</p>-->
  278. <!--<p class="text-p-center">单</p>-->
  279. <!--<p class="text-p-right" style="margin-left:10px;">位</p>-->
  280. <!--</div>-->
  281. <!--<p class="subject-dialog-info-left-p">: {{dialogData.deptName}}</p>-->
  282. <!--</div>-->
  283. <!--<div class="subject-dialog-info-left-min-box">-->
  284. <!--<div>-->
  285. <!--<p class="text-p-left" style="margin-right:6px;">实</p>-->
  286. <!--<p class="text-p-center">验</p>-->
  287. <!--<p class="text-p-center">室</p>-->
  288. <!--<p class="text-p-center">名</p>-->
  289. <!--<p class="text-p-right" style="margin-left:6px;">称</p>-->
  290. <!--</div>-->
  291. <!--<p class="subject-dialog-info-left-p">: {{dialogData.subjectName}} - {{dialogData.room}}</p>-->
  292. <!--</div>-->
  293. <!--<div class="subject-dialog-info-left-min-box">-->
  294. <!--<div>-->
  295. <!--<p class="text-p-left" style="margin-right:2px;">实</p>-->
  296. <!--<p class="text-p-center">验</p>-->
  297. <!--<p class="text-p-center">室</p>-->
  298. <!--<p class="text-p-center">负</p>-->
  299. <!--<p class="text-p-center">责</p>-->
  300. <!--<p class="text-p-right" style="margin-left:2px;">人</p>-->
  301. <!--</div>-->
  302. <!--<p class="subject-dialog-info-left-p">: {{dialogData.adminName}}|{{dialogData.adminPhone}}</p>-->
  303. <!--</div>-->
  304. <!--</div>-->
  305. <!--<div class="subject-dialog-info-right-box">-->
  306. <!--<vue-qr style="display: block;height:110px;width:110px;"-->
  307. <!--:text="identification+'?'+dialogData.qrCodeUrl" :size="300">-->
  308. <!--</vue-qr>-->
  309. <!--</div>-->
  310. <!--</div>-->
  311. <!--</div>-->
  312. <!--<div class="subject-dialog-print-top-left-bottom-box">-->
  313. <!--&lt;!&ndash;1号右侧信息栏&ndash;&gt;-->
  314. <!--<div class="subject-dialog-print-top-left-bottom-left-box" v-if="dialogData.dataOne">-->
  315. <!--<p class="data-title" :style="'background-color:'+dialogData.dataOne.showColour+';'">-->
  316. <!--{{dialogData.dataOne.classifyName}}</p>-->
  317. <!--<div class="data-for-text" v-if="dialogData.dataOne.classifyType == 1">-->
  318. <!--<p v-for="(item,index) in dialogData.dataOne.classifyList" :key="index">{{index+1}}、{{item}}</p>-->
  319. <!--</div>-->
  320. <!--<div class="data-for-img" v-if="dialogData.dataOne.classifyType == 2">-->
  321. <!--<img v-for="(item,index) in dialogData.dataOne.classifyList" :key="index" :src="item">-->
  322. <!--</div>-->
  323. <!--</div>-->
  324. <!--&lt;!&ndash;2号右侧信息栏&ndash;&gt;-->
  325. <!--<div class="subject-dialog-print-top-left-bottom-right-box" v-if="dialogData.dataTwo">-->
  326. <!--<p class="data-title" :style="'background-color:'+dialogData.dataTwo.showColour+';'">-->
  327. <!--{{dialogData.dataTwo.classifyName}}</p>-->
  328. <!--<div class="data-for-text" v-if="dialogData.dataTwo.classifyType == 1">-->
  329. <!--<p v-for="(item,index) in dialogData.dataTwo.classifyList" :key="index">{{index+1}}、{{item}}</p>-->
  330. <!--</div>-->
  331. <!--<div class="data-for-img" v-if="dialogData.dataTwo.classifyType == 2">-->
  332. <!--<img v-for="(item,index) in dialogData.dataTwo.classifyList" :key="index" :src="item">-->
  333. <!--</div>-->
  334. <!--</div>-->
  335. <!--</div>-->
  336. <!--</div>-->
  337. <!--&lt;!&ndash;3号右侧信息栏&ndash;&gt;-->
  338. <!--<div class="subject-dialog-print-top-right-box" v-if="dialogData.dataThree">-->
  339. <!--<p class="data-title" :style="'background-color:'+dialogData.dataThree.showColour+';'">-->
  340. <!--{{dialogData.dataThree.classifyName}}</p>-->
  341. <!--<div class="data-for-text" v-if="dialogData.dataThree.classifyType == 1">-->
  342. <!--<p v-for="(item,index) in dialogData.dataThree.classifyList" :key="index">{{index+1}}、{{item}}</p>-->
  343. <!--</div>-->
  344. <!--<div class="data-for-img" v-if="dialogData.dataThree.classifyType == 2">-->
  345. <!--<img v-for="(item,index) in dialogData.dataThree.classifyList" :key="index" :src="item">-->
  346. <!--</div>-->
  347. <!--</div>-->
  348. <!--</div>-->
  349. <!--&lt;!&ndash;特殊类目&ndash;&gt;-->
  350. <!--<div class="subject-dialog-print-button-box" v-if="dialogData.specialBrandInfo"-->
  351. <!--:style="'background:'+dialogData.specialBrandInfo.showColour+';'">-->
  352. <!--<span v-for="(item,index) in dialogData.specialBrandInfo.classifyList" :key="index">{{item}}</span>-->
  353. <!--</div>-->
  354. <!--</div>-->
  355. <!--</div>-->
  356. <div class="subject-dialog-shade" v-if="dialogShadeType"></div>
  357. </el-dialog>
  358. <!--新增/编辑-->
  359. <add-subject v-if="pageType == 2" :subjectData="subjectData"></add-subject>
  360. <!--准入配置-->
  361. <admission-configuration v-if="pageType == 4" :subjectData="subjectData"></admission-configuration>
  362. <!--关联配置-->
  363. <association-configuration v-if="pageType == 5" :subjectData="subjectData"></association-configuration>
  364. <!--详情-->
  365. <info-page v-if="pageType == 6" :subjectData="subjectData"></info-page>
  366. <!--批量二维码-->
  367. <batchQrCodeDialog ref="batchQrCodeDialog" :batchQrCodeDialogData="batchQrCodeDialogData"></batchQrCodeDialog>
  368. </div>
  369. </template>
  370. <script>
  371. /********************** V3 **********************/
  372. import vueQr from 'vue-qr'
  373. import html2canvas from 'html2canvas'
  374. import importComponent from '@/components/importComponent/importComponent.vue'
  375. import batchQrCodeDialog from '@/components/batchQrCodeDialog/batchQrCodeDialog.vue'
  376. import {
  377. getDeptDropList,
  378. systemBuildingGetTreeList,
  379. laboratoryClassTypeGetList,
  380. laboratoryClassLevelGetList
  381. } from '@/api/commonality/permission'
  382. import {
  383. laboratorySubRelInfoList,
  384. laboratorySubRelInfoGetDetailInfo,
  385. laboratorySubRelInfoGetHazardSubRelInfo,
  386. laboratorySubRelInfoUpdateBySort,
  387. laboratorySubRelInfoUpdateByControl,
  388. laboratoryBoardExportBoardInfo,
  389. laboratoryAppBoardMiddleInfo,
  390. laboratoryLevelConfigGetLevelTitleList, laboratoryTypeConfigGetList
  391. } from '@/api/integratedManagement/index'
  392. import indexRightPage from './indexRightPage/indexRightPage.vue'
  393. import addSubject from './addSubject.vue'
  394. import admissionConfiguration from './admissionConfiguration.vue'
  395. import associationConfiguration from './associationConfiguration.vue'
  396. import infoPage from './infoPage.vue'
  397. import { menuLinkPost } from "@/api/commonality/permission";
  398. export default {
  399. name: 'subject',
  400. components: {
  401. vueQr,
  402. importComponent,
  403. addSubject,
  404. admissionConfiguration,
  405. associationConfiguration,
  406. infoPage,
  407. indexRightPage,
  408. batchQrCodeDialog
  409. },
  410. data() {
  411. return {
  412. //二维码规则 服务器域名,需与微信后台开发配置内一致.
  413. identification: localStorage.getItem('codeOnlineAdd'),
  414. //批量二维码
  415. batchQrCodeDialogData: {},
  416. //电子信息牌
  417. dialogType: false,
  418. dialogData: {},
  419. dialogShadeType: false,
  420. //导入数据
  421. importConfig: {
  422. upLoadApi: '/laboratory/subRelInfo/importSubData', //上传接口地址
  423. downloadApi: '/laboratory/subRelInfo/exportSubTemplate', //下载模板接口地址
  424. loseApi: '/laboratory/subRelInfo/exportProblemData', //失败报表接口地址
  425. fileName: '实验室导入模板' //下载模板命名
  426. },
  427. //页面状态
  428. pageType: 1,
  429. // 查询参数
  430. queryParams: {
  431. page: 1,
  432. pageSize: 20,
  433. searchValue: '',
  434. deptId: '',
  435. typeId: '',
  436. levelId: ''
  437. },
  438. // 实验室表格数据
  439. dataList: [],
  440. // 楼栋
  441. buildOptions: [],
  442. // 总条数
  443. total: 0,
  444. //学院列表
  445. deptOptions: [],
  446. //实验室数据
  447. subjectData: {},
  448. // 临时保存排序
  449. orderNum: '',
  450. //分类数据
  451. typeList: [],
  452. //分级数据
  453. levelList: [],
  454. //二维码勾选数据
  455. codeList: ''
  456. }
  457. },
  458. created() {
  459. },
  460. mounted() {
  461. //获取院系列表
  462. this.getDeptDropList()
  463. //获取楼栋列表
  464. this.systemBuildingGetTreeList()
  465. //获取分类列表
  466. this.laboratoryClassTypeGetList()
  467. //获取分级列表
  468. this.laboratoryClassLevelGetList()
  469. //获取列表数据
  470. this.getList()
  471. },
  472. methods: {
  473. //操作按钮
  474. commandButton(item) {
  475. if (item.command == 1) {
  476. this.clickPage(2)
  477. } else if (item.command == 2) {
  478. } else if (item.command == 3) {
  479. } else if (item.command == 4) {
  480. if (this.codeList.length > 0) {
  481. let list = []
  482. this.codeList.forEach((item) => {
  483. list.push({
  484. code: item.infoId + '&subId=' + item.subId,
  485. name: item.subName,
  486. roomName: item.roomName
  487. })
  488. })
  489. this.$set(this, 'batchQrCodeDialogData', {
  490. title: '实验室二维码批量下载', //弹窗名称(非必传)
  491. type: '5', //二维码类型 用于区分二维码功能类型
  492. codeList: list
  493. })
  494. this.$nextTick(function() {
  495. this.$refs['batchQrCodeDialog'].initialize()
  496. })
  497. } else {
  498. this.msgError('请勾选实验室')
  499. }
  500. }
  501. },
  502. // 页面切换
  503. clickPage(type, row) {
  504. if (this.pageType != type) {
  505. if (type == 1) {
  506. //列表页面
  507. this.pageType = type
  508. this.getList()
  509. this.$set(this, 'subjectData', {})
  510. } else if (type == 2) {
  511. //新增页面
  512. this.pageType = type
  513. } else if (type == 7) {
  514. //实验室详情
  515. this.getSubInfo(row, 1)
  516. }
  517. }
  518. },
  519. //更多按钮
  520. handleCommand(command, row) {
  521. let self = this
  522. switch (command) {
  523. case '1':
  524. //关联配置
  525. laboratorySubRelInfoGetHazardSubRelInfo({ infoId: row.infoId }).then(response => {
  526. this.$set(this, 'subjectData', response.data)
  527. this.$set(this, 'pageType', 5)
  528. })
  529. break
  530. case '2':
  531. //准入配置
  532. this.pageType = 4
  533. this.$set(this, 'subjectData', row)
  534. break
  535. case '3':
  536. //编辑页面
  537. this.getSubInfo(row, 2)
  538. break
  539. case '4':
  540. let text = row.accessControl ? '关闭' : '开启'
  541. //开启/关闭门禁权限
  542. self.$confirm('是否确认' + text + '实验室准入?', '', {
  543. confirmButtonText: '确定',
  544. cancelButtonText: '取消',
  545. type: 'warning'
  546. }).then(function() {
  547. laboratorySubRelInfoUpdateByControl({
  548. infoId: row.infoId,
  549. accessControl: !row.accessControl
  550. }).then(response => {
  551. self.msgSuccess(response.message)
  552. self.getList()
  553. })
  554. }).then(() => {
  555. }).catch(() => {
  556. })
  557. break
  558. case '5':
  559. laboratoryAppBoardMiddleInfo({
  560. labId: row.subId
  561. }).then(response => {
  562. response.data.imgList = [];
  563. response.data.textList = [];
  564. response.data.brandInfoSubjectVos.forEach((item,index)=>{
  565. if(item.classifyType == 1){
  566. //文字
  567. if(!response.data.textList[1]){
  568. response.data.textList.push(item)
  569. }
  570. }else if(item.classifyType == 2){
  571. //图片
  572. if(!response.data.imgList[2]){
  573. response.data.imgList.push(item)
  574. }
  575. }
  576. })
  577. this.$set(this, 'dialogData', response.data)
  578. this.$set(this, 'dialogType', true)
  579. this.$set(this, 'dialogShadeType', false)
  580. /****** 旧版本信息牌-开始 ******
  581. let textLength = 0
  582. let textIndex = null
  583. for (let i = 0; i < response.data.nonspecialBrandList.length; i++) {
  584. if (response.data.nonspecialBrandList[i].classifyType == 1) {
  585. response.data.nonspecialBrandList[i].length = 0
  586. for (let o = 0; o < response.data.nonspecialBrandList[i].classifyList.length; o++) {
  587. response.data.nonspecialBrandList[i].length = response.data.nonspecialBrandList[i].length + response.data.nonspecialBrandList[i].classifyList[o].length
  588. }
  589. if (response.data.nonspecialBrandList[i].length > textLength) {
  590. textLength = response.data.nonspecialBrandList[i].length
  591. textIndex = i
  592. }
  593. }
  594. }
  595. if (textIndex != null) {
  596. for (let i = 0; i < response.data.nonspecialBrandList.length; i++) {
  597. if (textIndex == i) {
  598. response.data.dataThree = response.data.nonspecialBrandList[i]
  599. } else {
  600. if (!response.data.dataOne) {
  601. response.data.dataOne = response.data.nonspecialBrandList[i]
  602. } else if (!response.data.dataTwo) {
  603. response.data.dataTwo = response.data.nonspecialBrandList[i]
  604. }
  605. }
  606. }
  607. } else {
  608. console.log('2')
  609. if (response.data.nonspecialBrandList[0]) {
  610. response.data.dataOne = response.data.nonspecialBrandList[0]
  611. }
  612. if (response.data.nonspecialBrandList[1]) {
  613. response.data.dataTwo = response.data.nonspecialBrandList[1]
  614. }
  615. if (response.data.nonspecialBrandList[2]) {
  616. response.data.dataThree = response.data.nonspecialBrandList[2]
  617. }
  618. }
  619. this.$nextTick(() => {
  620. this.$set(this, 'dialogData', response.data)
  621. this.$set(this, 'dialogType', true)
  622. this.$set(this, 'dialogShadeType', false)
  623. })
  624. ****** 旧版本信息牌-结束 ******/
  625. })
  626. break
  627. case '6':
  628. //跳转实验室设备第三方页面
  629. let obj = {
  630. //访问地址
  631. linkUrl: "http://labcontrol.nwafu.edu.cn/ysms/admin/#/generator-fac/Fac",
  632. // linkUrl: "https://lab.xf100.net/ysms-web/#/generator-fac/Fac",
  633. //请求地址
  634. reqApi: "labcontrol.nwafu.edu.cn/ysms/auth/ticket",
  635. // reqApi: "lab.xf100.net/ysms/auth/ticket",
  636. };
  637. this.isAuthCarryLink(obj);
  638. break
  639. default:
  640. break
  641. }
  642. },
  643. isAuthCarryLink(item) {
  644. let urlText = window.location.href.split('://')[0]+'://';
  645. let obj = {
  646. appId:'550e8400-e29b-41d4-a716-446655440000',
  647. appSecret:'Y3RpdGhpZXMpcmlzY2hlZGFwc2VjcmV0MGI3MzA1Mjc3Y2I0OTFlNGRhM2Q5ZTN6',
  648. timeStamp:Date.parse(new Date()),
  649. userId:localStorage.getItem('userId')
  650. };
  651. menuLinkPost(urlText+item.reqApi,obj).then(response => {
  652. this.carryLink(item.linkUrl,response.data)
  653. })
  654. },
  655. carryLink(linkUrl,data){
  656. let argument = '?ticket='+data.ticket;
  657. window.open(linkUrl+argument,'_blank','noreferrer')
  658. },
  659. //电子信息牌导出关闭按钮
  660. dialogOff() {
  661. this.$set(this, 'dialogType', false)
  662. this.$set(this, 'dialogData', {})
  663. },
  664. downloadImg() {
  665. if (!this.dialogShadeType) {
  666. this.$set(this, 'dialogShadeType', true)
  667. this.$nextTick(() => {
  668. this.createImage()
  669. })
  670. }
  671. },
  672. //下载电子信息牌
  673. async createImage() {
  674. try {
  675. const config = {
  676. useCORS: true
  677. }
  678. const canvas = await html2canvas(this.$refs.canvasImg, config) // 在这里,将需要转换成图片的部分作为参数传入html2canvas
  679. const image = canvas.toDataURL() // 将生成的canvas转换为DataURL格式
  680. this.$nextTick(() => {
  681. this.downloadQrCode(image)
  682. })
  683. } catch (e) {
  684. throw new Error(e)
  685. }
  686. },
  687. //下载BASE64图片
  688. downloadQrCode(image) {
  689. const blob = this.base64ToBlob(image, 'image/png')
  690. const url = URL.createObjectURL(blob)
  691. const link = document.createElement('a')
  692. link.href = url
  693. link.download = this.dialogData.subjectName + ' - ' + this.dialogData.room
  694. document.body.appendChild(link)
  695. link.click()
  696. // 清理
  697. document.body.removeChild(link)
  698. URL.revokeObjectURL(url)
  699. this.$nextTick(() => {
  700. this.msgSuccess('下载成功')
  701. this.$set(this, 'dialogType', false)
  702. this.$set(this, 'dialogData', {})
  703. })
  704. },
  705. base64ToBlob(base64Str, contentType, sliceSize) {
  706. contentType = contentType || ''
  707. sliceSize = sliceSize || 512
  708. const byteCharacters = atob(base64Str.split(',')[1])
  709. const byteArrays = []
  710. for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
  711. const slice = byteCharacters.slice(offset, offset + sliceSize)
  712. const byteNumbers = new Array(slice.length)
  713. for (let i = 0; i < slice.length; i++) {
  714. byteNumbers[i] = slice.charCodeAt(i)
  715. }
  716. const byteArray = new Uint8Array(byteNumbers)
  717. byteArrays.push(byteArray)
  718. }
  719. const blob = new Blob(byteArrays, { type: contentType })
  720. return blob
  721. },
  722. getBase64Image(img) {
  723. let canvas = document.createElement('canvas')
  724. canvas.width = img.width
  725. canvas.height = img.height
  726. let ctx = canvas.getContext('2d')
  727. ctx.drawImage(img, 0, 0, img.width, img.height)
  728. let dataURL = canvas.toDataURL('image/png')
  729. return dataURL
  730. // return dataURL.replace("data:image/png;base64,", "");
  731. },
  732. //获取实验室详情 type:1.详情 2.编辑
  733. getSubInfo(row, type) {
  734. laboratorySubRelInfoGetDetailInfo({ infoId: row.infoId }).then(response => {
  735. let classifyList = []
  736. for (let i = 0; i < response.data.labInfoBrandModels.length; i++) {
  737. if (response.data.labInfoBrandModels[i].privateList.length > 0 && (response.data.labInfoBrandModels[i].brandType == 1 || response.data.labInfoBrandModels[i].brandType == 2)) {
  738. classifyList.push(response.data.labInfoBrandModels[i])
  739. }
  740. }
  741. response.data.classifyList = classifyList
  742. if (response.data.safeUserList[0]) {
  743. response.data.safeUserId = []
  744. response.data.safeUserList.forEach((item) => {
  745. response.data.safeUserId.push(item.safeUserId)
  746. })
  747. }
  748. this.$set(this, 'subjectData', response.data)
  749. if (type == 1) {
  750. //详情
  751. this.$set(this, 'pageType', 6)
  752. } else if (type == 2) {
  753. //编辑
  754. this.$set(this, 'pageType', 2)
  755. }
  756. })
  757. },
  758. //保存当前排序
  759. liveSort(row) {
  760. let obj = {
  761. orderNum: row.orderNum
  762. }
  763. this.orderNum = JSON.parse(JSON.stringify(obj))
  764. },
  765. //编辑排序
  766. editSort(row) {
  767. let self = this
  768. if (row.orderNum != this.orderNum.orderNum) {
  769. self.$confirm('是否确认修改排序?', '', {
  770. confirmButtonText: '确定',
  771. cancelButtonText: '取消',
  772. type: 'warning'
  773. }).then(function() {
  774. let obj = {
  775. infoId: row.infoId,
  776. orderNum: row.orderNum
  777. }
  778. laboratorySubRelInfoUpdateBySort(obj).then(response => {
  779. self.msgSuccess('修改成功')
  780. self.getList()
  781. })
  782. }).then(() => {
  783. }).catch(() => {
  784. let obj = JSON.parse(JSON.stringify(self.orderNum))
  785. row.orderNum = obj.orderNum
  786. })
  787. }
  788. },
  789. /** 搜索按钮操作 */
  790. handleQuery() {
  791. this.$set(this.queryParams, 'page', 1)
  792. this.$set(this, 'codeList', '')
  793. this.$refs['table-box'].clearSelection()
  794. this.getList()
  795. },
  796. /** 重置按钮操作 */
  797. resetQuery() {
  798. this.$set(this, 'queryParams', {
  799. page: 1,
  800. pageSize: 20,
  801. searchValue: '',
  802. deptId: '',
  803. buildId: '',
  804. typeId: '',
  805. levelId: ''
  806. })
  807. this.$set(this, 'codeList', '')
  808. this.$refs['table-box'].clearSelection()
  809. this.getList()
  810. },
  811. //选中实验室
  812. handleCurrentChange(val) {
  813. this.$refs.indexRightPage.initialize(val)
  814. },
  815. /** 查询实验室列表 */
  816. getList() {
  817. laboratorySubRelInfoList(this.queryParams).then(response => {
  818. this.$set(this, 'dataList', response.data.records)
  819. this.$set(this, 'total', response.data.total)
  820. if (response.data.records[0]) {
  821. this.$refs['table-box'].setCurrentRow(response.data.records[0])
  822. }
  823. })
  824. },
  825. /** 查询学院列表 */
  826. getDeptDropList() {
  827. getDeptDropList({ deptName: '', level: 2, deptType: 1 }).then(response => {
  828. this.$set(this, 'deptOptions', response.data)
  829. })
  830. },
  831. //查询楼栋楼层
  832. systemBuildingGetTreeList() {
  833. systemBuildingGetTreeList({}).then(response => {
  834. let newList = []
  835. if (response.data[0]) {
  836. let list = this.forBuildFloor(response.data)
  837. for (let i = 0; i < list.length; i++) {
  838. if (list[i].buildFloorVoList) {
  839. for (let o = 0; o < list[i].buildFloorVoList.length; o++) {
  840. if (list[i].buildFloorVoList[o].buildFloorVoList) {
  841. newList.push(list[i].buildFloorVoList[o])
  842. }
  843. }
  844. }
  845. }
  846. }
  847. this.$set(this, 'buildOptions', newList)
  848. })
  849. },
  850. //处理楼栋楼层数据
  851. forBuildFloor(list) {
  852. let self = this
  853. for (let i = 0; i < list.length; i++) {
  854. if (list[i].buildFloorVoList) {
  855. if (list[i].buildFloorVoList[0]) {
  856. list[i].buildFloorVoList = self.forBuildFloor(list[i].buildFloorVoList)
  857. } else {
  858. delete list[i].buildFloorVoList
  859. }
  860. } else {
  861. delete list[i].buildFloorVoList
  862. }
  863. }
  864. return list
  865. },
  866. //查询安全分级
  867. laboratoryClassLevelGetList() {
  868. laboratoryLevelConfigGetLevelTitleList({}).then(response => {
  869. this.$set(this, 'levelList', response.data)
  870. })
  871. },
  872. //查询安全分类
  873. laboratoryClassTypeGetList() {
  874. laboratoryTypeConfigGetList({}).then(response => {
  875. this.$set(this, 'typeList', response.data)
  876. })
  877. },
  878. //****************************************导入功能**************************************
  879. // 多选框选中数据
  880. handleSelectionChange(selection) {
  881. let self = this
  882. if (selection[40]) {
  883. this.$refs['table-box'].clearSelection()
  884. this.$nextTick(() => {
  885. let ids = []
  886. for (let i = 0; i < selection.length; i++) {
  887. if (i < 40) {
  888. ids.push(selection[i])
  889. self.$refs['table-box'].toggleRowSelection(selection[i], true)
  890. }
  891. }
  892. self.$set(self, 'codeList', ids)
  893. })
  894. this.msgError('最多勾选40条')
  895. } else {
  896. this.$set(this, 'codeList', selection.map(item => item))
  897. }
  898. },
  899. /*===记录勾选数据===
  900. 需要再el-table 添加 :row-key="getRowKeys"
  901. 需要在selection 添加 :reserve-selection="true"
  902. */
  903. getRowKeys(row) {
  904. return row.subId
  905. }
  906. }
  907. }
  908. </script>
  909. <style scoped lang="scss">
  910. .subject {
  911. flex: 1;
  912. display: flex !important;
  913. flex-direction: column;
  914. overflow: hidden;
  915. box-shadow: none;
  916. margin: 0;
  917. .subject-page {
  918. flex: 1;
  919. display: flex;
  920. flex-direction: row;
  921. overflow: hidden;
  922. .left-subject-list {
  923. flex: 1;
  924. width: 1143px;
  925. display: flex;
  926. flex-direction: column;
  927. overflow: hidden;
  928. box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2);
  929. border-radius: 10px 10px 10px 10px;
  930. margin: 5px 7px 20px 10px;
  931. .page-content-box {
  932. .table-box {
  933. ::v-deep .el-input--medium .el-input__inner {
  934. height: 26px;
  935. line-height: 26px;
  936. width: 55px;
  937. text-align: center;
  938. padding: 0 10px;
  939. }
  940. }
  941. }
  942. }
  943. }
  944. ::v-deep .el-table__row {
  945. td:nth-child(1) {
  946. padding: 0;
  947. }
  948. }
  949. ::v-deep .el-table__row {
  950. cursor: pointer;
  951. }
  952. }
  953. </style>
  954. <style lang="scss">
  955. .subject-dialog {
  956. .el-dialog__wrapper .el-dialog {
  957. margin-top: 0% !important;
  958. }
  959. .el-dialog__header {
  960. display: none;
  961. }
  962. .el-dialog__body {
  963. height: 890px;
  964. position: relative;
  965. padding: 0;
  966. margin: 0;
  967. overflow: hidden;
  968. .subject-dialog-button-box {
  969. position: absolute;
  970. right: 40px;
  971. top: 20px;
  972. display: flex;
  973. p {
  974. cursor: pointer;
  975. width: 70px;
  976. height: 30px;
  977. font-size: 14px;
  978. text-align: center;
  979. line-height: 30px;
  980. }
  981. p:nth-child(1) {
  982. border-radius: 6px 6px 6px 6px;
  983. border: 1px solid #E0E0E0;
  984. margin-right: 9px;
  985. }
  986. p:nth-child(2) {
  987. background: #0045AF;
  988. color: #fff;
  989. border-radius: 6px 6px 6px 6px;
  990. }
  991. }
  992. }
  993. #subject-dialog-print-box {
  994. width: 1187px;
  995. height: 839px;
  996. /*background-color: red;*/
  997. margin: 50px 40px 0;
  998. overflow: hidden;
  999. .subject-dialog-print-big-box {
  1000. z-index: 5;
  1001. width: 1147px;
  1002. height: 799px;
  1003. margin: 20px;
  1004. /*background-color: blue;*/
  1005. display: flex;
  1006. flex-direction: column;
  1007. overflow: hidden;
  1008. .subject-dialog-print-top-box {
  1009. flex: 1;
  1010. display: flex;
  1011. overflow: hidden;
  1012. .subject-dialog-print-top-left-box {
  1013. flex: 1;
  1014. display: flex;
  1015. flex-direction: column;
  1016. overflow: hidden;
  1017. .subject-dialog-print-top-left-top-box {
  1018. .subject-dialog-name-box {
  1019. height: 60px;
  1020. display: flex;
  1021. overflow: hidden;
  1022. background-color: #0045AF;
  1023. border-top-right-radius: 10px;
  1024. border-bottom-right-radius: 10px;
  1025. position: relative;
  1026. .title-box-1 {
  1027. position: absolute;
  1028. left: 0;
  1029. top: -10px;
  1030. width: 174px;
  1031. height: 80px;
  1032. background-color: #fff;
  1033. border-top-right-radius: 100px;
  1034. border-bottom-right-radius: 100px;
  1035. overflow: hidden;
  1036. .title-box-2 {
  1037. margin-top: 10px;
  1038. width: 170px;
  1039. height: 60px;
  1040. border-radius: 100px;
  1041. overflow: hidden;
  1042. .title-box-3 {
  1043. margin: 3px;
  1044. width: 164px;
  1045. height: 54px;
  1046. background-color: #fff;
  1047. border-radius: 100px;
  1048. overflow: hidden;
  1049. p {
  1050. margin: 3px;
  1051. width: 158px;
  1052. height: 48px;
  1053. line-height: 48px;
  1054. text-align: center;
  1055. border-radius: 100px;
  1056. overflow: hidden;
  1057. font-size: 20px;
  1058. color: #fff;
  1059. }
  1060. }
  1061. }
  1062. }
  1063. .title-p {
  1064. margin-left: 204px;
  1065. line-height: 60px;
  1066. font-size: 30px;
  1067. color: #fff;
  1068. }
  1069. }
  1070. .subject-dialog-info-box {
  1071. margin-top: 12px;
  1072. height: 180px;
  1073. background: #F5F5F5;
  1074. border-radius: 10px 10px 10px 10px;
  1075. display: flex;
  1076. overflow: hidden;
  1077. .subject-dialog-info-left-box {
  1078. flex: 1;
  1079. padding-top: 9px;
  1080. .subject-dialog-info-left-min-box {
  1081. display: flex;
  1082. height: 29px;
  1083. margin: 7px 0 11px 15px;
  1084. div {
  1085. width: 140px;
  1086. margin-right: 10px;
  1087. display: flex;
  1088. p {
  1089. color: #000;
  1090. height: 29px;
  1091. line-height: 29px;
  1092. font-size: 22px;
  1093. overflow: hidden;
  1094. }
  1095. .text-p-left {
  1096. }
  1097. .text-p-center {
  1098. flex: 1;
  1099. text-align: center;
  1100. }
  1101. .text-p-right {
  1102. }
  1103. }
  1104. .subject-dialog-info-left-p {
  1105. color: #000;
  1106. height: 29px;
  1107. line-height: 29px;
  1108. font-size: 22px;
  1109. overflow: hidden;
  1110. }
  1111. }
  1112. }
  1113. .subject-dialog-info-right-box {
  1114. height: 110px;
  1115. width: 110px;
  1116. margin: 35px 23px 0 0;
  1117. img {
  1118. display: block;
  1119. height: 110px;
  1120. width: 110px;
  1121. }
  1122. }
  1123. }
  1124. }
  1125. .subject-dialog-print-top-left-bottom-box {
  1126. flex: 1;
  1127. display: flex;
  1128. overflow: hidden;
  1129. .subject-dialog-print-top-left-bottom-left-box {
  1130. margin-top: 17px;
  1131. flex: 1;
  1132. display: flex;
  1133. flex-direction: column;
  1134. overflow: hidden;
  1135. .data-title {
  1136. height: 60px;
  1137. line-height: 60px;
  1138. color: #fff;
  1139. text-align: center;
  1140. font-size: 24px;
  1141. border-top-left-radius: 10px;
  1142. border-top-right-radius: 10px;
  1143. }
  1144. .data-for-text {
  1145. flex: 1;
  1146. border: 2px solid #999;
  1147. border-top: none;
  1148. overflow: hidden;
  1149. border-bottom-left-radius: 10px;
  1150. border-bottom-right-radius: 10px;
  1151. padding: 5px 14px;
  1152. p {
  1153. font-size: 20px;
  1154. color: #000;
  1155. line-height: 24px;
  1156. }
  1157. }
  1158. .data-for-img {
  1159. flex: 1;
  1160. border: 2px solid #999;
  1161. border-top: none;
  1162. overflow: hidden;
  1163. border-bottom-left-radius: 10px;
  1164. border-bottom-right-radius: 10px;
  1165. line-height: 0;
  1166. img {
  1167. display: inline-block;
  1168. height: 121px;
  1169. width: 90px;
  1170. margin: 9px 0 0 31px;
  1171. }
  1172. }
  1173. }
  1174. .subject-dialog-print-top-left-bottom-right-box {
  1175. margin-left: 20px;
  1176. margin-top: 17px;
  1177. flex: 1;
  1178. display: flex;
  1179. flex-direction: column;
  1180. overflow: hidden;
  1181. .data-title {
  1182. height: 60px;
  1183. line-height: 60px;
  1184. color: #fff;
  1185. text-align: center;
  1186. font-size: 24px;
  1187. border-top-left-radius: 10px;
  1188. border-top-right-radius: 10px;
  1189. }
  1190. .data-for-text {
  1191. flex: 1;
  1192. border: 2px solid #999;
  1193. border-top: none;
  1194. overflow: hidden;
  1195. border-bottom-left-radius: 10px;
  1196. border-bottom-right-radius: 10px;
  1197. padding: 5px 14px;
  1198. p {
  1199. font-size: 20px;
  1200. color: #000;
  1201. line-height: 24px;
  1202. }
  1203. }
  1204. .data-for-img {
  1205. flex: 1;
  1206. border: 2px solid #999;
  1207. border-top: none;
  1208. overflow: hidden;
  1209. border-bottom-left-radius: 10px;
  1210. border-bottom-right-radius: 10px;
  1211. line-height: 0;
  1212. img {
  1213. display: inline-block;
  1214. height: 121px;
  1215. width: 90px;
  1216. margin: 9px 0 0 31px;
  1217. }
  1218. }
  1219. }
  1220. }
  1221. }
  1222. .subject-dialog-print-top-right-box {
  1223. margin-left: 20px;
  1224. width: 308px;
  1225. display: flex;
  1226. flex-direction: column;
  1227. overflow: hidden;
  1228. .data-title {
  1229. height: 60px;
  1230. line-height: 60px;
  1231. color: #fff;
  1232. text-align: center;
  1233. font-size: 24px;
  1234. border-top-left-radius: 10px;
  1235. border-top-right-radius: 10px;
  1236. }
  1237. .data-for-text {
  1238. flex: 1;
  1239. border: 2px solid #999;
  1240. border-top: none;
  1241. overflow: hidden;
  1242. border-bottom-left-radius: 10px;
  1243. border-bottom-right-radius: 10px;
  1244. padding: 9px 14px;
  1245. p {
  1246. font-size: 20px;
  1247. color: #000;
  1248. line-height: 24px;
  1249. }
  1250. }
  1251. .data-for-img {
  1252. flex: 1;
  1253. border: 2px solid #999;
  1254. border-top: none;
  1255. overflow: hidden;
  1256. border-bottom-left-radius: 10px;
  1257. border-bottom-right-radius: 10px;
  1258. line-height: 0;
  1259. img {
  1260. display: inline-block;
  1261. height: 121px;
  1262. width: 90px;
  1263. margin: 11px 0 0 42px;
  1264. }
  1265. }
  1266. }
  1267. }
  1268. .subject-dialog-print-button-box {
  1269. margin-top: 20px;
  1270. width: 1147px;
  1271. height: 50px;
  1272. border-radius: 10px 10px 10px 10px;
  1273. padding: 0 28px;
  1274. overflow: hidden;
  1275. span {
  1276. font-size: 18px;
  1277. line-height: 50px;
  1278. margin-right: 10px;
  1279. color: #fff;
  1280. }
  1281. }
  1282. }
  1283. .subject-dialog-top-max-big-box{
  1284. width:1107px;
  1285. height:210px;
  1286. margin:46px 40px 0;
  1287. display: flex;
  1288. .subject-dialog-top-level-box{
  1289. width:120px;
  1290. height:210px;
  1291. border-top-left-radius:20px;
  1292. border-bottom-left-radius: 20px;
  1293. color:#fff;
  1294. p{
  1295. text-align: center;
  1296. }
  1297. p:nth-child(1){
  1298. margin-top:48px;
  1299. font-size:30px;
  1300. height:43px;
  1301. line-height: 43px;
  1302. overflow: hidden;
  1303. }
  1304. p:nth-child(2){
  1305. margin-top:15px;
  1306. font-size:24px;
  1307. height:35px;
  1308. line-height: 35px;
  1309. overflow: hidden;
  1310. }
  1311. }
  1312. .subject-dialog-top-text1-box{
  1313. flex:1;
  1314. border:2px solid #e0e0e0;
  1315. .subject-dialog-top-text-box:nth-child(1){
  1316. border:none;
  1317. }
  1318. .subject-dialog-top-text-box{
  1319. height:69px;
  1320. display: flex;
  1321. border-top:2px solid #e0e0e0;
  1322. div{
  1323. border-right:2px solid #e0e0e0;
  1324. display: flex;
  1325. padding:0 14px 0 10px;
  1326. width:158px;
  1327. line-height: 69px;
  1328. p{
  1329. flex:1;
  1330. font-size:22px;
  1331. color:#333;
  1332. /*text-align:justify;*/
  1333. /*text-align-last: justify;*/
  1334. }
  1335. }
  1336. .subject-dialog-top-text-p{
  1337. padding:0 10px;
  1338. flex:1;
  1339. display: flex;
  1340. align-items: center;
  1341. font-size:20px;
  1342. color:#333;
  1343. overflow: hidden;
  1344. }
  1345. }
  1346. }
  1347. .subject-dialog-top-text2-box{
  1348. width:363px;
  1349. border-top:2px solid #e0e0e0;
  1350. border-bottom:2px solid #e0e0e0;
  1351. .subject-dialog-top-text-box:nth-child(1){
  1352. border:none;
  1353. }
  1354. .subject-dialog-top-text-box{
  1355. height:69px;
  1356. border-top:2px solid #e0e0e0;
  1357. display: flex;
  1358. div{
  1359. border-right:2px solid #e0e0e0;
  1360. display: flex;
  1361. padding:0 28px 0 18px;
  1362. width:158px;
  1363. line-height: 69px;
  1364. p{
  1365. flex:1;
  1366. font-size:22px;
  1367. color:#333;
  1368. /*text-align:justify;*/
  1369. /*text-align-last: justify;*/
  1370. }
  1371. }
  1372. .subject-dialog-top-text-p{
  1373. padding:0 10px;
  1374. flex:1;
  1375. display: flex;
  1376. align-items: center;
  1377. font-size:20px;
  1378. color:#333;
  1379. overflow: hidden;
  1380. }
  1381. }
  1382. }
  1383. .subject-dialog-top-code-box{
  1384. width:199px;
  1385. height:210px;
  1386. border:2px solid #e0e0e0;
  1387. }
  1388. }
  1389. .subject-dialog-bottom-max-big-box{
  1390. display: flex;
  1391. width:1107px;
  1392. height:479px;
  1393. margin:20px 40px 0;
  1394. .subject-dialog-bottom-left-max-big-box{
  1395. flex:1;
  1396. .for-max-box:nth-child(1){
  1397. p{
  1398. border-top-left-radius: 20px;
  1399. }
  1400. }
  1401. .for-max-box:nth-child(3){
  1402. p{
  1403. border-bottom-left-radius: 20px;
  1404. }
  1405. div{
  1406. border-bottom:2px solid #e0e0e0;
  1407. }
  1408. }
  1409. .for-max-box{
  1410. display: flex;
  1411. p{
  1412. overflow: hidden;
  1413. color:#fff;
  1414. font-size:22px;
  1415. width:50px;
  1416. height:160px;
  1417. display: flex;
  1418. justify-content: center; /* 水平居中 */
  1419. align-items: center; /* 垂直居中 */
  1420. writing-mode: vertical-rl; /* 垂直排列文本 */
  1421. letter-spacing: 10px;
  1422. padding-top:10px;
  1423. }
  1424. div{
  1425. flex:1;
  1426. border-top:2px solid #e0e0e0;
  1427. padding:0 18px;
  1428. height:159px;
  1429. overflow: hidden;
  1430. img{
  1431. display: inline-block;
  1432. width:96px;
  1433. height:121px;
  1434. margin:20px 0 0 26px;
  1435. }
  1436. }
  1437. }
  1438. }
  1439. .subject-dialog-bottom-right-max-big-box{
  1440. width:260px;
  1441. height:479px;
  1442. border:2px solid #e0e0e0;
  1443. overflow: hidden;
  1444. .for-max-box{
  1445. display: flex;
  1446. flex-direction: column;
  1447. .for-title-p{
  1448. padding-left:17px;
  1449. color:#fff;
  1450. font-size:22px;
  1451. height:50px;
  1452. line-height:50px;
  1453. overflow: hidden;
  1454. }
  1455. div{
  1456. overflow: hidden;
  1457. padding:10px 12px;
  1458. p{
  1459. font-size:18px;
  1460. min-height:30px;
  1461. line-height:30px;
  1462. color:#333;
  1463. }
  1464. }
  1465. }
  1466. }
  1467. }
  1468. }
  1469. }
  1470. </style>