index.vue 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
  4. <el-form-item :label="$t('姓名')" prop="name">
  5. <el-input
  6. v-model="queryParams.name"
  7. :placeholder="$t('请输入') + $t('姓名')"
  8. clearable
  9. size="small"
  10. @keyup.enter.native="handleQuery"
  11. />
  12. </el-form-item>
  13. <el-form-item :label="$t('员工号')" prop="employeeid" label-width="50">
  14. <el-input
  15. v-model="queryParams.employeeid"
  16. :placeholder="$t('请输入') + $t('员工号')"
  17. clearable
  18. size="small"
  19. @keyup.enter.native="handleQuery"
  20. />
  21. </el-form-item>
  22. <el-form-item :label="$t('班值')" prop="classes">
  23. <el-select v-model="queryParams.classes" :placeholder="$t('请选择') + $t('班值')" clearable size="small">
  24. <el-option
  25. v-for="dict in classesOptions"
  26. :key="dict.dictValue"
  27. :label="dict.dictLabel"
  28. :value="dict.dictValue"
  29. />
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item :label="$t('入职')" prop="onboard">
  33. <el-select v-model="queryParams.onboard" :placeholder="$t('请选择') + $t('入职')" clearable size="small">
  34. <el-option
  35. v-for="dict in onboardOptions"
  36. :key="dict.dictValue"
  37. :label="dict.dictLabel"
  38. :value="dict.dictValue"
  39. />
  40. </el-select>
  41. </el-form-item>
  42. <el-form-item label="TDS" prop="tds">
  43. <el-select v-model="queryParams.tds" :placeholder="$t('请选择')+'TDS'" clearable size="small">
  44. <el-option
  45. v-for="dict in tdsOptions"
  46. :key="dict.dictValue"
  47. :label="dict.dictLabel"
  48. :value="dict.dictValue"
  49. />
  50. </el-select>
  51. </el-form-item>
  52. <el-form-item :label="$t('上岗证复证')" prop="postCard">
  53. <el-select v-model="queryParams.postCard" :placeholder="$t('请选择') + $t('上岗证复证')" clearable size="small">
  54. <el-option
  55. v-for="dict in postCardOptions"
  56. :key="dict.dictValue"
  57. :label="dict.dictLabel"
  58. :value="dict.dictValue"
  59. />
  60. </el-select>
  61. </el-form-item>
  62. <el-form-item :label="$t('工艺培训')" prop="craft">
  63. <el-select v-model="queryParams.craft" :placeholder="$t('请选择') + $t('工艺培训')" clearable size="small">
  64. <el-option
  65. v-for="dict in craftOptions"
  66. :key="dict.dictValue"
  67. :label="dict.dictLabel"
  68. :value="dict.dictValue"
  69. />
  70. </el-select>
  71. </el-form-item>
  72. <el-form-item :label="$t('公司级培训')" prop="company">
  73. <el-select v-model="queryParams.company" :placeholder="$t('请选择') + $t('公司级培训')" clearable size="small">
  74. <el-option
  75. v-for="dict in companyOptions"
  76. :key="dict.dictValue"
  77. :label="dict.dictLabel"
  78. :value="dict.dictValue"
  79. />
  80. </el-select>
  81. </el-form-item>
  82. <el-form-item :label="$t('装置级培训')" prop="device">
  83. <el-select v-model="queryParams.device" :placeholder="$t('请选择') + $t('装置级培训')" clearable size="small">
  84. <el-option
  85. v-for="dict in deviceOptions"
  86. :key="dict.dictValue"
  87. :label="dict.dictLabel"
  88. :value="dict.dictValue"
  89. />
  90. </el-select>
  91. </el-form-item>
  92. <el-form-item>
  93. <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">{{ $t('搜索') }}</el-button>
  94. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">{{ $t('重置') }}</el-button>
  95. </el-form-item>
  96. </el-form>
  97. <el-row :gutter="10" class="mb8">
  98. <el-col :span="1.5">
  99. <el-button
  100. type="primary"
  101. icon="el-icon-time"
  102. size="mini"
  103. @click="handleTime"
  104. >{{ $t('人员培训时长') }}</el-button>
  105. </el-col>
  106. <el-col :span="1.5">
  107. <el-button
  108. type="success"
  109. icon="el-icon-tickets"
  110. size="mini"
  111. @click="handleCompany"
  112. >{{ $t('公司级培训记录') }}</el-button>
  113. </el-col>
  114. <el-col :span="1.5">
  115. <el-button
  116. type="info"
  117. icon="el-icon-document"
  118. size="mini"
  119. @click="handleDevice"
  120. >{{ $t('装置级培训记录') }}</el-button>
  121. </el-col>
  122. <!--<el-col :span="1.5">
  123. <el-button
  124. type="danger"
  125. icon="el-icon-delete"
  126. size="mini"
  127. :disabled="multiple"
  128. @click="handleDelete"
  129. v-hasPermi="['training:trainingrecords:remove']"
  130. >{{ $t('删除') }}</el-button>
  131. </el-col>-->
  132. <!-- <el-col :span="1.5">
  133. <el-button
  134. type="info"
  135. icon="el-icon-upload2"
  136. size="mini"
  137. @click="handleImport"
  138. v-hasPermi="['training:trainingrecords:edit']"
  139. >{{ $t('导入') }}</el-button>
  140. </el-col>--><!-- <el-col :span="1.5">
  141. <el-button
  142. type="info"
  143. icon="el-icon-upload2"
  144. size="mini"
  145. @click="handleImport"
  146. v-hasPermi="['training:trainingrecords:edit']"
  147. >{{ $t('导入') }}</el-button>
  148. </el-col>-->
  149. <el-col :span="1.5">
  150. <el-button
  151. type="warning"
  152. icon="el-icon-download"
  153. size="mini"
  154. @click="handleExport"
  155. v-hasPermi="['training:trainingrecords:export']"
  156. >{{ $t('导出') }}</el-button>
  157. </el-col>
  158. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  159. </el-row>
  160. <el-table v-loading="loading" :data="trainingrecordsList" @selection-change="handleSelectionChange" :cell-style="tableCellStyle" @sort-change="sortChange" :height="clientHeight" border>
  161. <el-table-column type="selection" width="55" align="center" />
  162. <el-table-column :label="$t('姓名')" align="center" prop="name" :show-overflow-tooltip="true"/>
  163. <el-table-column :label="$t('员工号')" align="center" prop="employeeid" :show-overflow-tooltip="true"/>
  164. <el-table-column :label="$t('班值')" align="center" prop="classes" :formatter="classesFormat" />
  165. <el-table-column :label="$t('入职')" align="center" prop="onboard" :formatter="onboardFormat" >
  166. <template slot-scope="scope">
  167. <span> {{onboardFormat(scope.row)}}</span>
  168. <el-button icon="el-icon-folder" style="color:#6e96fa;" @click="handleDoc(scope.row , 'trainingrecords-onbord')" circle></el-button>
  169. </template>
  170. </el-table-column>
  171. <el-table-column label="TDS" align="center" prop="tds" :formatter="tdsFormat">
  172. <template slot-scope="scope">
  173. <span> {{tdsFormat(scope.row)}}</span>
  174. <el-button icon="el-icon-folder" style="color:#6e96fa;" @click="handleDoc(scope.row , 'trainingrecords-tds')" circle></el-button>
  175. </template>
  176. </el-table-column>
  177. <el-table-column :label="$t('上岗证复证')" align="center" prop="postCard" :formatter="postCardFormat">
  178. <template slot-scope="scope">
  179. <span> {{postCardFormat(scope.row)}}</span>
  180. <el-button icon="el-icon-folder" style="color:#6e96fa;" v-if="scope.row.postCard !== '3'" @click="openWorklicense(scope.row)" circle></el-button>
  181. <!--<el-button icon="el-icon-folder" v-if="scope.row.postCard !== '3'" @click="handleDoc(scope.row , 'trainingrecords-postCard')" circle></el-button>-->
  182. </template>
  183. </el-table-column>
  184. <el-table-column :label="$t('工艺培训')" align="center" prop="craft" :formatter="craftFormat">
  185. <template slot-scope="scope">
  186. <span> {{craftFormat(scope.row)}}</span>
  187. <el-button icon="el-icon-folder" style="color:#6e96fa;" v-if="scope.row.craft !== '3'" @click="handleDoc(scope.row , 'trainingrecords-craft')" circle></el-button>
  188. </template>
  189. </el-table-column>
  190. <el-table-column :label="$t('公司级培训')" align="center" prop="company" :formatter="companyFormat">
  191. <template slot-scope="scope">
  192. <span> {{companyFormat(scope.row)}}</span>
  193. <el-button icon="el-icon-folder" style="color:#6e96fa;" @click="openCompany(scope.row)" circle></el-button>
  194. </template>
  195. </el-table-column>
  196. <el-table-column :label="$t('装置级培训')" align="center" prop="device" :formatter="deviceFormat">
  197. <template slot-scope="scope">
  198. <span> {{deviceFormat(scope.row)}}</span>
  199. <el-button icon="el-icon-folder" style="color:#6e96fa;" @click="openDevice(scope.row)" circle></el-button>
  200. </template>
  201. </el-table-column>
  202. <el-table-column :label="$t('备注')" align="center" prop="remarks" :show-overflow-tooltip="true"/>
  203. <el-table-column :label="$t('操作')" align="center" width="120" class-name="small-padding fixed-width">
  204. <template slot-scope="scope">
  205. <el-button
  206. size="mini"
  207. type="text"
  208. icon="el-icon-edit"
  209. @click="handleUpdate(scope.row)"
  210. v-hasPermi="['training:trainingrecords:edit']"
  211. >{{ $t('修改') }}</el-button>
  212. <!--<el-button
  213. size="mini"
  214. type="text"
  215. icon="el-icon-delete"
  216. @click="handleDelete(scope.row)"
  217. v-hasPermi="['training:trainingrecords:remove']"
  218. >{{ $t('删除') }}</el-button>-->
  219. </template>
  220. </el-table-column>
  221. </el-table>
  222. <pagination
  223. v-show="total>0"
  224. :total="total"
  225. :page.sync="queryParams.pageNum"
  226. :limit.sync="queryParams.pageSize"
  227. @pagination="getList"
  228. />
  229. <!-- 添加或修改培训成绩对话框 -->
  230. <el-dialog v-dialogDrag :title="title" :visible.sync="open" width="500px" append-to-body>
  231. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  232. <el-form-item :label="$t('装置名称')" prop="plantCode">
  233. <el-select v-model="form.plantCode" :placeholder="$t('请选择') + $t('装置名称')">
  234. <el-option
  235. v-for="dict in plantCodeOptions"
  236. :key="dict.dictValue"
  237. :label="dict.dictLabel"
  238. :value="dict.dictValue"
  239. ></el-option>
  240. </el-select>
  241. </el-form-item>
  242. <el-form-item :label="$t('姓名')" prop="name">
  243. <el-input v-model="form.name" :placeholder="$t('请输入') + $t('姓名')" />
  244. </el-form-item>
  245. <el-form-item :label="$t('员工号')" prop="employeeid">
  246. <el-input v-model="form.employeeid" :placeholder="$t('请输入') + $t('员工号')" />
  247. </el-form-item>
  248. <el-form-item :label="$t('班值')" prop="classes">
  249. <el-select v-model="form.classes" :placeholder="$t('请选择') + $t('班值')">
  250. <el-option
  251. v-for="dict in classesOptions"
  252. :key="dict.dictValue"
  253. :label="dict.dictLabel"
  254. :value="dict.dictValue"
  255. ></el-option>
  256. </el-select>
  257. </el-form-item>
  258. <el-form-item :label="$t('入职')" prop="onboard">
  259. <el-select v-model="form.onboard" :placeholder="$t('请选择') + $t('入职')">
  260. <el-option
  261. v-for="dict in onboardOptions"
  262. :key="dict.dictValue"
  263. :label="dict.dictLabel"
  264. :value="dict.dictValue"
  265. ></el-option>
  266. </el-select>
  267. </el-form-item>
  268. <el-form-item label="TDS" prop="tds">
  269. <el-select v-model="form.tds" :placeholder="$t('请选择') + 'TDS'">
  270. <el-option
  271. v-for="dict in tdsOptions"
  272. :key="dict.dictValue"
  273. :label="dict.dictLabel"
  274. :value="dict.dictValue"
  275. ></el-option>
  276. </el-select>
  277. </el-form-item>
  278. <el-form-item :label="$t('上岗证复证')" prop="postCard">
  279. <el-select v-model="form.postCard" :placeholder="$t('请选择') + $t('上岗证复证')">
  280. <el-option
  281. v-for="dict in postCardOptions"
  282. :key="dict.dictValue"
  283. :label="dict.dictLabel"
  284. :value="dict.dictValue"
  285. ></el-option>
  286. </el-select>
  287. </el-form-item>
  288. <el-form-item :label="$t('工艺培训')" prop="craft">
  289. <el-select v-model="form.craft" :placeholder="$t('请选择') + $t('工艺培训')">
  290. <el-option
  291. v-for="dict in craftOptions"
  292. :key="dict.dictValue"
  293. :label="dict.dictLabel"
  294. :value="dict.dictValue"
  295. ></el-option>
  296. </el-select>
  297. </el-form-item>
  298. <el-form-item :label="$t('公司级培训')" prop="company">
  299. <el-select v-model="form.company" :placeholder="$t('请选择') + $t('公司级培训')">
  300. <el-option
  301. v-for="dict in companyOptions"
  302. :key="dict.dictValue"
  303. :label="dict.dictLabel"
  304. :value="dict.dictValue"
  305. ></el-option>
  306. </el-select>
  307. </el-form-item>
  308. <el-form-item :label="$t('装置级培训')" prop="device">
  309. <el-select v-model="form.device" :placeholder="$t('请选择') + $t('装置级培训')">
  310. <el-option
  311. v-for="dict in deviceOptions"
  312. :key="dict.dictValue"
  313. :label="dict.dictLabel"
  314. :value="dict.dictValue"
  315. ></el-option>
  316. </el-select>
  317. </el-form-item>
  318. <el-form-item :label="$t('备注')" prop="remarks">
  319. <el-input v-model="form.remarks" :placeholder="$t('请输入') + $t('备注')" />
  320. </el-form-item>
  321. <el-form-item :label="$t('归属部门')" prop="deptId">
  322. <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" :placeholder="$t('请选择') + $t('归属部门')" />
  323. </el-form-item>
  324. </el-form>
  325. <div slot="footer" class="dialog-footer">
  326. <el-button type="primary" @click="submitForm">{{ $t('确 定') }}</el-button>
  327. <el-button @click="cancel">{{ $t('取 消') }}</el-button>
  328. </div>
  329. </el-dialog>
  330. <!-- 用户导入对话框 -->
  331. <el-dialog v-dialogDrag :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
  332. <el-upload
  333. ref="upload"
  334. :limit="1"
  335. accept=".xlsx, .xls"
  336. :headers="upload.headers"
  337. :action="upload.url"
  338. :disabled="upload.isUploading"
  339. :on-progress="handleFileUploadProgress"
  340. :on-success="handleFileSuccess"
  341. :auto-upload="false"
  342. drag
  343. >
  344. <i class="el-icon-upload"></i>
  345. <div class="el-upload__text">
  346. {{ $t('将文件拖到此处,或') }}
  347. <em>{{ $t('点击上传') }}</em>
  348. </div>
  349. <div class="el-upload__tip" slot="tip">
  350. <!--<el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据-->
  351. <el-link type="info" style="font-size:12px" @click="importTemplate">{{ $t('下载模板') }}</el-link>
  352. </div>
  353. <form ref="downloadFileForm" :action="upload.downloadAction" target="FORMSUBMIT">
  354. <input name="type" :value="upload.type" hidden />
  355. </form>
  356. <div class="el-upload__tip" style="color:red" slot="tip">{{ $t('提示:仅允许导入“xls”或“xlsx”格式文件!') }}</div>
  357. </el-upload>
  358. <div slot="footer" class="dialog-footer">
  359. <el-button type="primary" @click="submitFileForm">{{ $t('确 定') }}</el-button>
  360. <el-button @click="upload.open = false">{{ $t('取 消') }}</el-button>
  361. </div>
  362. </el-dialog>
  363. <!-- 公司级培训跟踪矩阵对话框 -->
  364. <el-dialog v-dialogDrag :title="companyTrainingTitle" :visible.sync="companyTrainingOpen" width="1500px" append-to-body @close="closeDialog()">
  365. <div>
  366. <svg-icon icon-class="rectangleGreen" class="rectangleGreen"></svg-icon>
  367. <span>{{ $t('需参加培训,已经完成培训人员') }}</span>
  368. <svg-icon icon-class="rectanglered" class="rectangleRed"></svg-icon>
  369. <span style="line-height: 40px">{{ $t('需参加培训,尚未进行培训人员') }}</span>
  370. </div>
  371. <el-table v-if="tableShow" border :data="companylevelList"
  372. v-loading="companyTrainingLoad"
  373. class="companyLevelTable" height="600px" border
  374. :span-method="colspanMethod"
  375. :cell-class-name="tableCellClassName"
  376. :row-style="{height:'40px'}"
  377. ref="companyTable"
  378. >
  379. <el-table-column :label="$t('课程代码')" align="center" width="120" fixed>
  380. <template slot-scope="scope">
  381. {{scope.row[0]}}
  382. </template>
  383. </el-table-column>
  384. <el-table-column :label="$t('公司级') + $t('培训课程') + $t('名称')" align="center" width="350" fixed>
  385. <template slot-scope="scope">
  386. {{scope.row[1]}}
  387. </template>
  388. </el-table-column>
  389. <el-table-column v-for="(item, index) in transTitle" width="150" :label="item.actualpost" :key="index" align="center">
  390. <el-table-column width="150" :label="item.name" :key="index" align="center">
  391. <template slot-scope="scope">
  392. {{scope.row[index + 2]}}
  393. </template>
  394. </el-table-column>
  395. </el-table-column>
  396. </el-table>
  397. </el-dialog>
  398. <!-- 装置级培训跟踪矩阵对话框 -->
  399. <el-dialog v-dialogDrag :title="deviceTrainingTitle" :visible.sync="deviceTrainingOpen" width="1500px" append-to-body @close="closeDialog()">
  400. <el-form :model="deviceParams" ref="queryRegularForm" label-width="68px" :inline="true">
  401. <el-form-item :label="$t('年份')" prop="year">
  402. <el-date-picker clearable size="small" style="width: 200px"
  403. v-model="deviceParams.year"
  404. type="year"
  405. value-format="yyyy"
  406. :placeholder="$t('请选择年份')">
  407. </el-date-picker>
  408. </el-form-item>
  409. <el-form-item :label="$t('培训类型')" prop="trainingType">
  410. <el-select v-model="deviceParams.trainingType" :placeholder="$t('请选择') + $t('培训类型')" clearable size="small">
  411. <el-option
  412. v-for="dict in trainingTypeOptions"
  413. :key="dict.dictValue"
  414. :label="dict.dictLabel"
  415. :value="dict.dictValue"
  416. />
  417. </el-select>
  418. </el-form-item>
  419. <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleDeviceQuery" style="margin-left: 20px;">搜索</el-button>
  420. <el-row style="text-align: right">
  421. <svg-icon icon-class="rectangleGreen" class="rectangleGreen"></svg-icon>
  422. <span>{{ $t('需参加培训,已经完成培训人员') }}</span>
  423. <svg-icon icon-class="rectanglered" class="rectangleRed"></svg-icon>
  424. <span style="line-height: 40px">{{ $t('需参加培训,尚未进行培训人员') }}</span>
  425. </el-row>
  426. </el-form>
  427. <el-table v-if="tableShow" border :data="devicelevelList"
  428. v-loading="deviceTrainingLoad"
  429. class="companyLevelTable" height="600px" border
  430. :span-method="colspanDeviceMethod"
  431. :cell-class-name="tableCellClassName"
  432. :row-style="{height:'40px'}"
  433. ref="deviceTable"
  434. >
  435. <el-table-column :label="$t('课程代码')" align="center" width="120" fixed>
  436. <template slot-scope="scope">
  437. {{scope.row[0]}}
  438. </template>
  439. </el-table-column>
  440. <el-table-column :label="$t('装置级') + $t('培训课程') + $t('名称')" align="center" width="350" fixed>
  441. <template slot-scope="scope">
  442. {{scope.row[1]}}
  443. </template>
  444. </el-table-column>
  445. <el-table-column v-for="(item, index) in transTitle" width="150" :label="item.actualpost" :key="index" align="center">
  446. <el-table-column width="150" :label="item.name" :key="index" align="center">
  447. <template slot-scope="scope">
  448. {{scope.row[index + 2]}}
  449. </template>
  450. </el-table-column>
  451. </el-table-column>
  452. </el-table>
  453. </el-dialog>
  454. <!-- 人员培训时长对话框 -->
  455. <el-dialog v-dialogDrag class="trainingTime" :title="trainingTimeTitle" :visible.sync="trainingTimeOpen" width="700px" append-to-body>
  456. <el-button type="primary" style="margin-bottom: 10px" @click="exportTrainingTime">{{ $t('导出') }}<i class="el-icon-download el-icon--right"></i></el-button>
  457. <el-table v-loading="loading" :data="transTitle" height="600px" border>
  458. <el-table-column :label="$t('员工姓名')" align="center" prop="name" width="300" :show-overflow-tooltip="true"/>
  459. <el-table-column :label="$t('培训时长')" align="center" prop="trainingTime" :show-overflow-tooltip="true"/>
  460. </el-table>
  461. </el-dialog>
  462. <!-- 上岗证培训列表对话框 -->
  463. <el-dialog v-dialogDrag :title="worklicenseTitle" :visible.sync="worklicenseOpen" width="800px" append-to-body>
  464. <el-table v-loading="loading" :data="worklicenseList" border>
  465. <el-table-column :label="$t('上岗证类型')" align="center" prop="worklicenseType" :show-overflow-tooltip="true"/>
  466. <el-table-column :label="$t('上岗证证件号')" align="center" prop="worklicenseIdnum" :show-overflow-tooltip="true"/>
  467. <el-table-column :label="$t('操作')" align="center" width="120" class-name="small-padding fixed-width">
  468. <template slot-scope="scope">
  469. <el-button
  470. size="mini"
  471. type="text"
  472. icon="el-icon-edit"
  473. @click="handleDoc(scope.row , 'trainingrecords-worklicense' + scope.row.worklicenseType)"
  474. >{{ $t('附件') }}</el-button>
  475. </template>
  476. </el-table-column>
  477. </el-table>
  478. </el-dialog>
  479. <!-- 公司级培训对话框 -->
  480. <el-dialog v-dialogDrag :title="companyTitle" :visible.sync="companyOpen" width="1500px" append-to-body>
  481. <el-table v-loading="loading" :data="participantsList" border>
  482. <el-table-column :label="$t('课程代码')" align="center" prop="courseCode" width="150" :show-overflow-tooltip="true"/>
  483. <el-table-column :label="$t('公司级') + $t('培训课程') + $t('名称')" align="center" prop="companyItem" width="400" :show-overflow-tooltip="true"/>
  484. <el-table-column :label="$t('开始日期')" align="center" prop="startDate" width="250">
  485. <template slot-scope="scope">
  486. <span>{{ parseTime(scope.row.startDate, '{y}-{m}-{d}') }}</span>
  487. </template>
  488. </el-table-column>
  489. <el-table-column :label="$t('结束日期')" align="center" prop="endDate" width="250">
  490. <template slot-scope="scope">
  491. <span>{{ parseTime(scope.row.endDate, '{y}-{m}-{d}') }}</span>
  492. </template>
  493. </el-table-column>
  494. <el-table-column :label="$t('培训时长')" align="center" prop="trainingDuration" :show-overflow-tooltip="true"/>
  495. <el-table-column :label="$t('备注')" align="center" prop="remarks" :show-overflow-tooltip="true"/>
  496. <el-table-column :label="$t('操作')" align="center" width="120" class-name="small-padding fixed-width">
  497. <template slot-scope="scope">
  498. <el-button
  499. size="mini"
  500. type="text"
  501. icon="el-icon-delete"
  502. @click="participantsHandleDelete(scope.row)"
  503. v-hasPermi="['training:trainingrecords:remove']"
  504. >{{ $t('删除') }}</el-button>
  505. </template>
  506. </el-table-column>
  507. </el-table>
  508. </el-dialog>
  509. <!-- 装置级培训对话框 -->
  510. <el-dialog v-dialogDrag :title="deviceTitle" :visible.sync="deviceOpen" width="1500px" append-to-body>
  511. <el-form :model="queryDeviceParams" ref="queryRegularForm" label-width="68px" :inline="true">
  512. <el-form-item :label="$t('年份')" prop="year">
  513. <el-date-picker clearable size="small" style="width: 200px"
  514. v-model="queryDeviceParams.year"
  515. type="year"
  516. value-format="yyyy"
  517. :placeholder="$t('请选择') + $t('年份')">
  518. </el-date-picker>
  519. </el-form-item>
  520. <el-form-item :label="$t('培训类型')" prop="trainingType">
  521. <el-select v-model="queryDeviceParams.trainingType" :placeholder="$t('请选择') + $t('培训类型')" clearable size="small">
  522. <el-option
  523. v-for="dict in trainingTypeOptions"
  524. :key="dict.dictValue"
  525. :label="dict.dictLabel"
  526. :value="dict.dictValue"
  527. />
  528. </el-select>
  529. </el-form-item>
  530. <el-button type="cyan" icon="el-icon-search" size="mini" @click="staffDeviceQuery" style="margin-left: 20px;">
  531. {{ $t('搜索') }}</el-button>
  532. </el-form>
  533. <el-table v-loading="loading" :data="devicceList" border>
  534. <el-table-column :label="$t('课程代码')" align="center" prop="courseCode" width="200" :show-overflow-tooltip="true"/>
  535. <el-table-column :label="$t('课程名称')" align="center" prop="item" width="350" :show-overflow-tooltip="true"/>
  536. <el-table-column :label="$t('授课人')" align="center" prop="lecturerName" width="150" :show-overflow-tooltip="true" />
  537. <el-table-column :label="$t('课时')" align="center" prop="hour" :show-overflow-tooltip="true"/>
  538. <el-table-column :label="$t('开始日期')" align="center" prop="startDate" width="100">
  539. <template slot-scope="scope">
  540. <span v-if="scope.row.supplementary === '0' && scope.row.trainingType === '10'">{{ parseTime(scope.row.startDate, '{y}-{m}') }}</span>
  541. <span v-else>{{ parseTime(scope.row.startDate, '{y}-{m}-{d}') }}</span>
  542. </template>
  543. </el-table-column>
  544. <el-table-column :label="$t('备注')" align="center" prop="remarks" :show-overflow-tooltip="true"/>
  545. </el-table>
  546. </el-dialog>
  547. <!-- 报告附件对话框 -->
  548. <el-dialog v-dialogDrag :title="doc.title" :visible.sync="doc.open" width="1000px" append-to-body >
  549. <el-upload v-hasPermi="['training:trainingrecords:file']"
  550. ref="doc"
  551. :limit="50"
  552. :headers="doc.headers"
  553. :action="doc.url + '?pType=' + doc.pType + '&pId=' + doc.pId"
  554. :disabled="doc.isUploading"
  555. :on-progress="handleFileDocProgress"
  556. :on-success="handleFileDocSuccess"
  557. :auto-upload="true"
  558. drag
  559. >
  560. <i class="el-icon-upload"></i>
  561. <div class="el-upload__text">
  562. {{ $t('将文件拖到此处,或') }}
  563. <em>{{ $t('点击上传') }}</em>
  564. </div>
  565. </el-upload>
  566. <el-table :data="doc.commonfileList" border>
  567. <el-table-column :label="$t('文件名')" align="center" prop="fileName" :show-overflow-tooltip="true">
  568. <template slot-scope="scope">
  569. <a class="link-type" @click="handleDownload(scope.row)">
  570. <span>{{ scope.row.fileName }}</span>
  571. </a>
  572. </template>
  573. </el-table-column>
  574. <el-table-column :label="$t('大小(Kb)')" align="center" prop="fileSize" :show-overflow-tooltip="true" width="80" />
  575. <el-table-column :label="$t('上传人')" align="center" prop="creator" :show-overflow-tooltip="true" width="120"/>
  576. <el-table-column :label="$t('培训日期')" align="center" prop="pDate" width="150">
  577. <template slot-scope="scope">
  578. <el-date-picker
  579. v-if="scope.row.isEdit"
  580. v-model="scope.row.pDate"
  581. type="date"
  582. value-format="yyyy-MM-dd"
  583. :placeholder="$t('日期')">
  584. </el-date-picker>
  585. <span v-else>{{ parseTime(scope.row.pDate, '{y}-{m}-{d}') }}</span>
  586. </template>
  587. </el-table-column>
  588. <el-table-column :label="$t('操作')" align="center" width="220" class-name="small-padding fixed-width">
  589. <template slot-scope="scope">
  590. <el-button
  591. v-if="scope.row.fileName.endsWith('pdf')"
  592. size="mini"
  593. type="text"
  594. icon="el-icon-view"
  595. @click="handleSee(scope.row)"
  596. >{{ $t('预览') }}</el-button>
  597. <el-button v-hasPermi="['training:trainingrecords:file']" type="text" size="small" v-if="scope.row.isEdit" @click="save(scope.row)">{{ $t('保存') }}</el-button>
  598. <el-button type="text" size="small" v-if="scope.row.isEdit" @click="cancelFile(scope.row, scope.$index)">{{ $t('取消') }}</el-button>
  599. <el-button v-hasPermi="['training:trainingrecords:file']" v-if="!scope.row.isEdit" @click="edit(scope.row)" icon="el-icon-edit" type="text" size="mini">{{ $t('编辑') }}</el-button>
  600. <el-button
  601. size="mini"
  602. type="text"
  603. icon="el-icon-download"
  604. @click="handleDownload(scope.row)"
  605. >{{ $t('下载') }}</el-button>
  606. <el-button
  607. size="mini"
  608. type="text"
  609. icon="el-icon-delete"
  610. @click="handleDeleteDoc(scope.row)"
  611. v-hasPermi="['training:trainingrecords:file']"
  612. >{{ $t('删除') }}</el-button>
  613. </template>
  614. </el-table-column>
  615. </el-table>
  616. <el-dialog v-dialogDrag :title="pdf.title" :visible.sync="pdf.open" width="1700px" append-to-body>
  617. <div style="margin-top: -60px;float: right;margin-right: 40px;">
  618. <el-button size="mini" type="text" @click="openPdf">{{$t('新页面打开PDF')}}</el-button></div>
  619. <div style="margin-top: -30px">
  620. <iframe :src="pdf.pdfUrl" frameborder="0" width="100%" height="700px"></iframe>
  621. </div>
  622. </el-dialog>
  623. <div slot="footer" class="dialog-footer">
  624. <!-- <el-button type="primary" @click="submitFileForm">{{ $t('确 定') }}</el-button>-->
  625. <el-button @click="doc.open = false">{{ $t('返 回') }}</el-button>
  626. </div>
  627. </el-dialog>
  628. </div>
  629. </template>
  630. <script>
  631. import { listTrainingrecords, getTrainingrecords, delTrainingrecords, addTrainingrecords, updateTrainingrecords, exportTrainingrecords, exportTrainingTime } from "@/api/training/trainingrecords";
  632. import { listCompanylevel } from "@/api/training/companylevel";
  633. import { listTraining } from "@/api/training/worklicense";
  634. import { listParticipants, companyListParticipants, delParticipants } from "@/api/training/participants";
  635. import { listDevice, deviceListParticipants} from "@/api/training/device";
  636. import { treeselect } from "@/api/system/dept";
  637. import { selectTimeStaffmgr } from "@/api/plant/staffmgr";
  638. import { getToken } from "@/utils/auth";
  639. import Treeselect from "@riophae/vue-treeselect";
  640. import "@riophae/vue-treeselect/dist/vue-treeselect.css";
  641. import {allFileList, delCommonfile ,updateCommonfile ,addCommonfile} from "@/api/common/commonfile";
  642. import {addTrainingNon, updateTrainingNon} from "@/api/training/trainingNon";
  643. import pdf from 'vue-pdf'
  644. export default {
  645. name: "Trainingrecords",
  646. components: { Treeselect ,pdf},
  647. data() {
  648. return {
  649. transTitle: [], // transTitle 该标题为转化后的标题, 注意多一列, 因为原来的标题变成了竖着显示了, 所以多一列标题, 第一个为空即可
  650. companylevelList: [],
  651. companylevelListTemp: [],
  652. devicelevelList: [],
  653. devicelevelListTemp: [],
  654. // 遮罩层
  655. loading: true,
  656. // 选中数组
  657. ids: [],
  658. // 非单个禁用
  659. single: true,
  660. // 非多个禁用
  661. multiple: true,
  662. // 显示搜索条件
  663. showSearch: false,
  664. // 总条数
  665. total: 0,
  666. // 培训成绩表格数据
  667. trainingrecordsList: [],
  668. // 人员-公司级培训关系表格数据
  669. participantsList: [],
  670. // 人员-装置级培训关系表格数据
  671. devicceList: [],
  672. //上岗证培训列表
  673. worklicenseList: [],
  674. // 弹出层标题
  675. title: "",
  676. companyTitle: "",
  677. deviceTitle: "",
  678. companyTrainingTitle: "",
  679. trainingTimeTitle: "",
  680. deviceTrainingTitle: "",
  681. worklicenseTitle: "",
  682. // 部门树选项
  683. deptOptions: undefined,
  684. clientHeight:300,
  685. // 是否显示弹出层
  686. open: false,
  687. companyOpen: false,
  688. deviceOpen: false,
  689. companyTrainingOpen: false,
  690. deviceTrainingOpen: false,
  691. worklicenseOpen: false,
  692. companyTrainingLoad: false,
  693. deviceTrainingLoad: false,
  694. tableShow: true,
  695. trainingTimeOpen: false,
  696. // 装置名称字典
  697. plantCodeOptions: [],
  698. // 班值字典
  699. classesOptions: [],
  700. // SUB字典
  701. subOptions: [],
  702. // 裂解字典
  703. crackingOptions: [],
  704. // 热区字典
  705. hotareaOptions: [],
  706. // 冷区字典
  707. coldareaOptions: [],
  708. // AEU/PGU字典
  709. aeupguOptions: [],
  710. // 入职字典
  711. onboardOptions: [],
  712. // TDS字典
  713. tdsOptions: [],
  714. // 上岗证复证字典
  715. postCardOptions: [],
  716. // 工艺培训字典
  717. craftOptions: [],
  718. //公司级培训字典
  719. companyOptions: [],
  720. //装置级培训字典
  721. deviceOptions: [],
  722. // 培训岗位字典
  723. positionOptions: [],
  724. //培训类型字典
  725. trainingTypeOptions: [],
  726. //点击查看的员工号
  727. employeeid: '',
  728. // 用户导入参数
  729. upload: {
  730. downloadAction: process.env.VUE_APP_BASE_API + '/common/template',
  731. //下载模板类型
  732. type: "trainingrecords",
  733. // 是否显示弹出层(用户导入)
  734. open: false,
  735. // 弹出层标题(用户导入)
  736. title: "",
  737. // 是否禁用上传
  738. isUploading: false,
  739. // 是否更新已经存在的用户数据
  740. updateSupport: 0,
  741. // 设置上传的请求头部
  742. headers: { Authorization: "Bearer " + getToken() },
  743. // 上传的地址
  744. url: process.env.VUE_APP_BASE_API + "/training/trainingrecords/importData"
  745. },
  746. // 报告附件参数
  747. doc: {
  748. file: "",
  749. // 是否显示弹出层(报告附件)
  750. open: false,
  751. // 弹出层标题(报告附件)
  752. title: this.$t('附件'),
  753. // 是否禁用上传
  754. isUploading: false,
  755. // 是否更新已经存在的用户数据
  756. updateSupport: 0,
  757. // 报告附件上传位置编号
  758. ids: 0,
  759. // 设置上传的请求头部
  760. headers: { Authorization: "Bearer " + getToken() },
  761. // 上传的地址
  762. url: process.env.VUE_APP_BASE_API + "/common/commonfile/uploadFile",
  763. commonfileList: null,
  764. queryParams: {
  765. pId: null,
  766. pType: 'traning'
  767. },
  768. pType: 'traning',
  769. pId: null,
  770. form: {}
  771. },
  772. // 查询参数
  773. queryParams: {
  774. pageNum: 1,
  775. pageSize: 20,
  776. name: null,
  777. employeeid: null,
  778. classes: null,
  779. sortDate: null,
  780. sortOrder: null,
  781. onboard: null,
  782. tds: null,
  783. postCard: null,
  784. craft: null,
  785. company: null
  786. },
  787. //人员表查询参数
  788. staffmgrQueryParams: {
  789. units: "10,18"
  790. },
  791. queryCompanyParams: {
  792. staffId: null,
  793. companyId: null,
  794. },
  795. queryDeviceParams: {
  796. staffId: null,
  797. regularId: null,
  798. year: this.getNowTime(),
  799. trainingType: null
  800. },
  801. deviceParams: {
  802. staffId: null,
  803. regularId: null,
  804. year: this.getNowTime(),
  805. trainingType: null
  806. },
  807. worklicenseParams: {
  808. employeeid: null,
  809. },
  810. companyQueryParams: {},
  811. // 表单参数
  812. form: {},
  813. pdf : {
  814. title: '',
  815. pdfUrl: '',
  816. numPages: null,
  817. open: false,
  818. pageNum: 1,
  819. pageTotalNum: 1,
  820. loadedRatio: 0,
  821. },
  822. // 表单校验
  823. rules: {
  824. plantCode: [
  825. { required: true, message: this.$t('装置名称') + this.$t('不能为空'), trigger: "change" }
  826. ],
  827. year: [
  828. { required: true, message: this.$t('年份') + this.$t('不能为空'), trigger: "blur" }
  829. ],
  830. deptId: [
  831. { required: true, message: this.$t('部门编号') + this.$t('不能为空'), trigger: "blur" }
  832. ]
  833. },
  834. };
  835. },
  836. watch: {
  837. // 根据名称筛选部门树
  838. deptName(val) {
  839. this.$refs.tree.filter(val);
  840. }
  841. },
  842. created() {
  843. //设置表格高度对应屏幕高度
  844. this.$nextTick(() => {
  845. this.clientHeight = (document.body.clientHeight - 80) * 0.8
  846. })
  847. this.getList();
  848. this.getStaffmar();
  849. this.getTreeselect();
  850. this.getDicts("PLANT_DIVIDE").then(response => {
  851. this.plantCodeOptions = response.data;
  852. });
  853. this.getDicts("TEAM_DIVIDE").then(response => {
  854. this.classesOptions = response.data;
  855. });
  856. this.getDicts("TICK_CROSS").then(response => {
  857. this.subOptions = response.data;
  858. });
  859. this.getDicts("TICK_CROSS").then(response => {
  860. this.crackingOptions = response.data;
  861. });
  862. this.getDicts("TICK_CROSS").then(response => {
  863. this.hotareaOptions = response.data;
  864. });
  865. this.getDicts("TICK_CROSS").then(response => {
  866. this.coldareaOptions = response.data;
  867. });
  868. this.getDicts("TICK_CROSS").then(response => {
  869. this.aeupguOptions = response.data;
  870. });
  871. this.getDicts("TRAINING_QUALIFY").then(response => {
  872. this.onboardOptions = response.data;
  873. });
  874. this.getDicts("TRAINING_QUALIFY").then(response => {
  875. this.tdsOptions = response.data;
  876. });
  877. this.getDicts("TRAINING_QUALIFY").then(response => {
  878. this.postCardOptions = response.data;
  879. });
  880. this.getDicts("TRAINING_QUALIFY").then(response => {
  881. this.craftOptions = response.data;
  882. });
  883. this.getDicts("TRAINING_QUALIFY").then(response => {
  884. this.companyOptions = response.data;
  885. });
  886. this.getDicts("TRAINING_QUALIFY").then(response => {
  887. this.deviceOptions = response.data;
  888. });
  889. this.getDicts("ACTUALPOST").then(response => {
  890. this.positionOptions = response.data;
  891. });
  892. this.getDicts("TRAINING_TYPE").then(response => {
  893. this.trainingTypeOptions = response.data;
  894. });
  895. },
  896. methods: {
  897. colspanMethod({ row, column, rowIndex, columnIndex }) {
  898. if (columnIndex === 0) {
  899. const _row = this.setTable(this.companylevelList).merge[rowIndex];
  900. const _col = _row > 0 ? 1 : 0;
  901. return {
  902. rowspan: _row,
  903. colspan: _col
  904. };
  905. }
  906. if (columnIndex === 1 ) {
  907. const _row = this.setTable(this.companylevelList).merge[rowIndex];
  908. const _col = _row > 0 ? 1 : 0;
  909. return {
  910. rowspan: _row,
  911. colspan: _col
  912. };
  913. }
  914. },
  915. colspanDeviceMethod({ row, column, rowIndex, columnIndex }) {
  916. if (columnIndex === 0) {
  917. const _row = this.setTable(this.devicelevelList).merge[rowIndex];
  918. const _col = _row > 0 ? 1 : 0;
  919. return {
  920. rowspan: _row,
  921. colspan: _col
  922. };
  923. }
  924. if (columnIndex === 1 ) {
  925. const _row = this.setTable(this.devicelevelList).merge[rowIndex];
  926. const _col = _row > 0 ? 1 : 0;
  927. return {
  928. rowspan: _row,
  929. colspan: _col
  930. };
  931. }
  932. },
  933. setTable(tableData) {
  934. let spanArr = [],
  935. concat = 0;
  936. tableData.forEach((item, index) => {
  937. if (index === 0) {
  938. spanArr.push(1);
  939. } else {
  940. if (item[1] === tableData[index - 1][1]) {
  941. //第一列需合并相同内容的判断条件
  942. spanArr[concat] += 1;
  943. spanArr.push(0);
  944. } else {
  945. spanArr.push(1);
  946. concat = index;
  947. }
  948. }
  949. });
  950. return {
  951. merge: spanArr
  952. };
  953. },
  954. //根据是否存在最后培训时间显示颜色提示
  955. tableCellClassName({ row, column, rowIndex, columnIndex }) {
  956. // for (let i = 2; i < this.transTitle.length + 2; i++) {
  957. // if (columnIndex == i){
  958. // return this.changeColor(row[i])
  959. // }
  960. // }
  961. return this.changeColor(row[columnIndex])
  962. },
  963. changeColor (value) {
  964. if (value.trim().startsWith('20')){
  965. return 'companyFinish'
  966. }
  967. if (value === "-"){
  968. return 'companyUrgent'
  969. }
  970. },
  971. /** 查询培训成绩列表 */
  972. getList() {
  973. this.loading = true;
  974. listTrainingrecords(this.queryParams).then(response => {
  975. this.trainingrecordsList = response.rows;
  976. this.total = response.total;
  977. this.loading = false;
  978. });
  979. },
  980. //获取人员表
  981. getStaffmar() {
  982. selectTimeStaffmgr(this.staffmgrQueryParams).then(response => {
  983. const allData = response.rows
  984. const data = [];
  985. for (let i = 0; i < allData.length; i++) {
  986. data.push({
  987. name: allData[i].name,
  988. actualpost: this.selectDictLabel(this.positionOptions, allData[i].actualpost),
  989. trainingTime: allData[i].trainingTime
  990. });
  991. }
  992. this.transTitle = data;
  993. })
  994. },
  995. //获取公司级培训列表
  996. getCompanyTraining() {
  997. companyListParticipants(this.companyQueryParams).then(response => {
  998. this.companylevelListTemp = response;
  999. this.companylevelList = response
  1000. this.companyTrainingLoad = false
  1001. this.$nextTick(() => {
  1002. this.$refs.companyTable.doLayout(); // 解决表格错位
  1003. });
  1004. })
  1005. },
  1006. //获取装置级培训列表
  1007. getDeviceTraining() {
  1008. deviceListParticipants(this.deviceParams).then(response => {
  1009. this.devicelevelListTemp = response;
  1010. this.devicelevelList = response
  1011. this.deviceTrainingLoad = false
  1012. this.$nextTick(() => {
  1013. this.$refs.deviceTable.doLayout(); // 解决表格错位
  1014. });
  1015. })
  1016. },
  1017. /** 查询部门下拉树结构 */
  1018. getTreeselect() {
  1019. treeselect().then(response => {
  1020. this.deptOptions = response.data;
  1021. });
  1022. },
  1023. // 装置名称字典翻译
  1024. plantCodeFormat(row, column) {
  1025. return this.selectDictLabel(this.plantCodeOptions, row.plantCode);
  1026. },
  1027. // 班值字典翻译
  1028. classesFormat(row, column) {
  1029. return this.selectDictLabel(this.classesOptions, row.classes);
  1030. },
  1031. // SUB字典翻译
  1032. subFormat(row, column) {
  1033. return this.selectDictLabel(this.subOptions, row.sub);
  1034. },
  1035. // 裂解字典翻译
  1036. crackingFormat(row, column) {
  1037. return this.selectDictLabel(this.crackingOptions, row.cracking);
  1038. },
  1039. // 热区字典翻译
  1040. hotareaFormat(row, column) {
  1041. return this.selectDictLabel(this.hotareaOptions, row.hotarea);
  1042. },
  1043. // 冷区字典翻译
  1044. coldareaFormat(row, column) {
  1045. return this.selectDictLabel(this.coldareaOptions, row.coldarea);
  1046. },
  1047. // AEU/PGU字典翻译
  1048. aeupguFormat(row, column) {
  1049. return this.selectDictLabel(this.aeupguOptions, row.aeupgu);
  1050. },
  1051. // 入职字典翻译
  1052. onboardFormat(row, column) {
  1053. return this.selectDictLabel(this.onboardOptions, row.onboard);
  1054. },
  1055. // TDS字典翻译
  1056. tdsFormat(row, column) {
  1057. return this.selectDictLabel(this.tdsOptions, row.tds);
  1058. },
  1059. // 上岗证复证字典翻译
  1060. postCardFormat(row, column) {
  1061. return this.selectDictLabel(this.postCardOptions, row.postCard);
  1062. },
  1063. // 工艺培训字典翻译
  1064. craftFormat(row, column) {
  1065. return this.selectDictLabel(this.craftOptions, row.craft);
  1066. },
  1067. //公司级培训字典翻译
  1068. companyFormat(row, column) {
  1069. return this.selectDictLabel(this.companyOptions, row.company);
  1070. },
  1071. //装置级培训字典翻译
  1072. deviceFormat(row, column) {
  1073. return this.selectDictLabel(this.deviceOptions, row.device);
  1074. },
  1075. // 培训类型翻译
  1076. trainingTypeFormat(row, column) {
  1077. return this.selectDictLabel(this.trainingTypeOptions, row.trainingType);
  1078. },
  1079. // 取消按钮
  1080. cancel() {
  1081. this.open = false;
  1082. this.reset();
  1083. },
  1084. // 表单重置
  1085. reset() {
  1086. this.form = {
  1087. id: null,
  1088. plantCode: null,
  1089. name: null,
  1090. employeeid: null,
  1091. classes: null,
  1092. companysafe: null,
  1093. plantsafe: null,
  1094. teamsafe: null,
  1095. sub: null,
  1096. cracking: null,
  1097. hotarea: null,
  1098. coldarea: null,
  1099. aeupgu: null,
  1100. upscore: null,
  1101. downscore: null,
  1102. delFlag: null,
  1103. createrCode: null,
  1104. createdate: null,
  1105. updaterCode: null,
  1106. updatedate: null,
  1107. remarks: null,
  1108. deptId: null,
  1109. onboard: null,
  1110. tds: null,
  1111. postCard: null,
  1112. craft: null,
  1113. company: null,
  1114. device: null
  1115. };
  1116. this.resetForm("form");
  1117. },
  1118. /** 搜索按钮操作 */
  1119. handleQuery() {
  1120. this.queryParams.pageNum = 1;
  1121. this.getList();
  1122. },
  1123. //搜索按钮
  1124. handleDeviceQuery() {
  1125. this.deviceTrainingLoad = true;
  1126. this.$nextTick(() => {
  1127. this.getDeviceTraining();
  1128. });
  1129. },
  1130. staffDeviceQuery() {
  1131. this.getDevice(this.employeeid)
  1132. },
  1133. /** 重置按钮操作 */
  1134. resetQuery() {
  1135. this.resetForm("queryForm");
  1136. this.handleQuery();
  1137. },
  1138. // 多选框选中数据
  1139. handleSelectionChange(selection) {
  1140. this.ids = selection.map(item => item.id)
  1141. this.single = selection.length!==1
  1142. this.multiple = !selection.length
  1143. },
  1144. //根据分数显示颜色提示
  1145. tableCellStyle({ row, column, rowIndex, columnIndex }) {
  1146. if (columnIndex === 4 && row.onboard === "2"){
  1147. return "color: rgba(255, 26, 26, 0.98) "
  1148. }else if (columnIndex === 5 && row.tds === "2"){
  1149. return "color: rgba(255, 26, 26, 0.98) "
  1150. }else if (columnIndex === 6 && row.postCard === "2"){
  1151. return "color: rgba(255, 26, 26, 0.98) "
  1152. }else if (columnIndex === 7 && row.craft === "2"){
  1153. return "color: rgba(255, 26, 26, 0.98) "
  1154. }else if (columnIndex === 8 && row.company === "2"){
  1155. return "color: rgba(255, 26, 26, 0.98) "
  1156. }
  1157. },
  1158. //排序
  1159. sortChange(val){
  1160. if (val.prop == 'companysafe'){
  1161. this.queryParams.sortDate = 'companysafe';
  1162. }else if (val.prop == 'plantsafe'){
  1163. this.queryParams.sortDate = 'plantsafe';
  1164. }else if (val.prop == 'teamsafe'){
  1165. this.queryParams.sortDate = 'teamsafe';
  1166. }
  1167. if (val.order === 'descending') {
  1168. this.queryParams.sortOrder = 'desc'
  1169. } else {
  1170. this.queryParams.sortOrder = 'asc'
  1171. }
  1172. this.getList()
  1173. },
  1174. /** 获取当前年份 */
  1175. getNowTime() {
  1176. var now = new Date();
  1177. var year = now.getFullYear(); //得到年份
  1178. var defaultDate = `${year}`;
  1179. defaultDate = `${year}`
  1180. return defaultDate;
  1181. },
  1182. /** 公司级培训矩阵按钮操作 */
  1183. handleCompany() {
  1184. this.companyTrainingLoad =true
  1185. this.companyTrainingTitle = this.$t('参加')+this.$t('公司级')+this.$t('培训人员') +this.$t('名单')
  1186. this.companyTrainingOpen = true
  1187. // loading.close();
  1188. this.tableShow = true
  1189. setTimeout(() => {
  1190. this.getCompanyTraining();
  1191. }, 10);
  1192. },
  1193. /** 装置级培训矩阵按钮操作 */
  1194. handleDevice() {
  1195. this.deviceTrainingLoad =true
  1196. this.resetForm("queryRegularForm");
  1197. this.deviceTrainingTitle =this.$t('参加') + this.$t('装置级') + this.$t('培训人员') + this.$t('名单')
  1198. this.deviceTrainingOpen = true
  1199. this.tableShow = true
  1200. this.deviceParams.year = this.getNowTime();
  1201. setTimeout(() => {
  1202. this.getDeviceTraining();
  1203. }, 10);
  1204. },
  1205. /** 人员培训时长按钮操作 */
  1206. handleTime() {
  1207. this.trainingTimeOpen = true;
  1208. this.trainingTimeTitle = this.$t('人员培训时长');
  1209. },
  1210. /** 新增按钮操作 */
  1211. handleAdd() {
  1212. this.reset();
  1213. this.open = true;
  1214. this.title = this.$t('新增') + " " + this.$t('培训成绩');
  1215. },
  1216. /** 修改按钮操作 */
  1217. handleUpdate(row) {
  1218. this.reset();
  1219. const id = row.id || this.ids
  1220. getTrainingrecords(id).then(response => {
  1221. this.form = response.data;
  1222. if (response.data.sub == 10) { this.form.sub = true }
  1223. if (response.data.cracking == 10) { this.form.cracking = true }
  1224. if (response.data.hotarea == 10) { this.form.hotarea = true }
  1225. if (response.data.coldarea == 10) { this.form.coldarea = true }
  1226. if (response.data.aeupgu == 10) { this.form.aeupgu = true }
  1227. this.open = true;
  1228. this.title = this.$t('修改') + " " + this.$t('培训成绩');
  1229. });
  1230. },
  1231. /** 提交按钮 */
  1232. submitForm() {
  1233. this.$refs["form"].validate(valid => {
  1234. if (valid) {
  1235. if (this.form.id != null) {
  1236. updateTrainingrecords(this.form).then(response => {
  1237. this.msgSuccess(this.$t('修改成功'));
  1238. this.open = false;
  1239. this.getList();
  1240. });
  1241. } else {
  1242. addTrainingrecords(this.form).then(response => {
  1243. this.msgSuccess(this.$t('新增成功'));
  1244. this.open = false;
  1245. this.getList();
  1246. });
  1247. }
  1248. }
  1249. });
  1250. },
  1251. /** 删除按钮操作 */
  1252. handleDelete(row) {
  1253. const ids = row.id || this.ids;
  1254. this.$confirm(this.$t('是否确认删除?'), this.$t('警告'), {
  1255. confirmButtonText: this.$t('确定'),
  1256. cancelButtonText: this.$t('取消'),
  1257. type: "warning"
  1258. }).then(function() {
  1259. return delTrainingrecords(ids);
  1260. }).then(() => {
  1261. this.getList();
  1262. this.msgSuccess(this.$t('删除成功'));
  1263. })
  1264. },
  1265. /** 公司级培训删除按钮操作 */
  1266. participantsHandleDelete(row) {
  1267. const ids = row.id
  1268. this.$confirm(this.$t('是否确认删除?'), this.$t('警告'), {
  1269. confirmButtonText: this.$t('确定'),
  1270. cancelButtonText: this.$t('取消'),
  1271. type: "warning"
  1272. }).then(function() {
  1273. return delParticipants(ids);
  1274. }).then(() => {
  1275. this.getParticipants(row.staffId)
  1276. this.msgSuccess(this.$t('删除成功'));
  1277. })
  1278. },
  1279. /** 导出按钮操作 */
  1280. handleExport() {
  1281. const queryParams = this.queryParams;
  1282. this.$confirm(this.$t('是否确认导出所有培训成绩数据项?'), this.$t('警告'), {
  1283. confirmButtonText: this.$t('确定'),
  1284. cancelButtonText: this.$t('取消'),
  1285. type: "warning"
  1286. }).then(function() {
  1287. return exportTrainingrecords(queryParams);
  1288. }).then(response => {
  1289. this.download(response.msg);
  1290. })
  1291. },
  1292. /** 导出人员培训时长按钮操作 */
  1293. exportTrainingTime() {
  1294. const queryParams = this.transTitle;
  1295. this.$confirm(this.$t('是否确认导出人员培训时长?'), this.$t('警告'), {
  1296. confirmButtonText: this.$t('确定'),
  1297. cancelButtonText: this.$t('取消'),
  1298. type: "warning"
  1299. }).then(function() {
  1300. return exportTrainingTime();
  1301. }).then(response => {
  1302. this.download(response.msg);
  1303. })
  1304. },
  1305. /** 导入按钮操作 */
  1306. handleImport() {
  1307. this.upload.title = this.$t('用户导入');
  1308. this.upload.open = true;
  1309. },
  1310. /** 下载模板操作 */
  1311. importTemplate() {
  1312. this.$refs['downloadFileForm'].submit()
  1313. },
  1314. // 文件上传中处理
  1315. handleFileUploadProgress(event, file, fileList) {
  1316. this.upload.isUploading = true;
  1317. },
  1318. // 文件上传成功处理
  1319. handleFileSuccess(response, file, fileList) {
  1320. this.upload.open = false;
  1321. this.upload.isUploading = false;
  1322. this.$refs.upload.clearFiles();
  1323. if (response.data[0] != null) {
  1324. this.$alert(this.$t('成功导入') + response.msg + this.$t('条数据') + "," + this.$t('第') + response.data + this.$t('行数据出现错误导入失败')+"。", this.$t('导入结果'), { dangerouslyUseHTMLString: true });
  1325. }else {
  1326. this.$alert(this.$t('成功导入') + response.msg + this.$t('条数据'), this.$t('导入结果'), { dangerouslyUseHTMLString: true });
  1327. }
  1328. this.getList();
  1329. },
  1330. // 提交上传文件
  1331. submitFileForm() {
  1332. this.$refs.upload.submit();
  1333. },
  1334. /** 报告附件按钮操作 */
  1335. handleDoc(row , fileType) {
  1336. this.doc.pType = fileType
  1337. this.doc.queryParams.pType = fileType
  1338. this.doc.id = row.id;
  1339. var titleType = '';
  1340. if (fileType === 'trainingrecords-onbord') {
  1341. titleType = row.name + this.$t('的')+this.$t('入职')+this.$t('培训')
  1342. }else if (fileType === 'trainingrecords-tds') {
  1343. titleType = row.name + this.$t('的')+this.$t('TDS培训')
  1344. }else if (fileType === 'trainingrecords-craft') {
  1345. titleType = row.name + this.$t('的')+this.$t('工艺培训')
  1346. }else {
  1347. titleType =this.$t('上岗证')+this.$t('培训')
  1348. }
  1349. this.doc.title = titleType;
  1350. this.doc.open = true;
  1351. this.doc.queryParams.pId = row.id
  1352. this.doc.pId = row.id
  1353. this.getFileList()
  1354. this.$nextTick(() => {
  1355. this.$refs.doc.clearFiles()
  1356. })
  1357. },
  1358. getFileList (){
  1359. allFileList(this.doc.queryParams).then(response => {
  1360. response.forEach(element => {
  1361. element["isEdit"] = false
  1362. });
  1363. response.forEach(element => {
  1364. element["isAdd"] = false
  1365. });
  1366. this.doc.commonfileList = response;
  1367. });
  1368. },
  1369. //附件上传中处理
  1370. handleFileDocProgress(event, file, fileList) {
  1371. this.doc.file = file;
  1372. this.doc.isUploading = true;
  1373. },
  1374. //附件上传成功处理
  1375. handleFileDocSuccess(response, file, fileList) {
  1376. this.doc.isUploading = false;
  1377. this.$alert(response.msg, this.$t('导入结果'), { dangerouslyUseHTMLString: true });
  1378. this.getFileList()
  1379. },
  1380. // 文件下载处理
  1381. handleDownload(row) {
  1382. var name = row.fileName;
  1383. var url = row.fileUrl;
  1384. var suffix = url.substring(url.lastIndexOf("."), url.length);
  1385. const a = document.createElement('a')
  1386. a.setAttribute('download', name)
  1387. a.setAttribute('target', '_blank')
  1388. a.setAttribute('href', process.env.VUE_APP_BASE_API + url)
  1389. a.click()
  1390. },
  1391. //pdf预览
  1392. openPdf(){
  1393. window.open(this.pdf.pdfUrl);//path是文件的全路径地址
  1394. },
  1395. handleSee (row){
  1396. this.pdf.open =true
  1397. this.pdf.pageNum = 1
  1398. this.pdf.loadedRatio = 0
  1399. this.pdf.pdfUrl = process.env.VUE_APP_BASE_API + row.fileUrl
  1400. this.pdf.title = row.fileName
  1401. let loadingTask = null
  1402. loadingTask = pdf.createLoadingTask(this.pdf.pdfUrl)
  1403. loadingTask.promise.then(pdf => {
  1404. this.pdf.numPages = pdf.numPages
  1405. }).catch(err => {
  1406. this.msgError(this.$t('pdf加载失败'))
  1407. })
  1408. },
  1409. // pdf上一页
  1410. prePage() {
  1411. let page = this.pdf.pageNum
  1412. page = page > 1 ? page - 1 : this.pdf.pageTotalNum
  1413. this.pdf.pageNum = page
  1414. },
  1415. // pdf下一页
  1416. nextPage() {
  1417. let page = this.pdf.pageNum
  1418. page = page < this.pdf.pageTotalNum ? page + 1 : 1
  1419. this.pdf.pageNum = page
  1420. },
  1421. /** 打开上岗证复证列表 */
  1422. openWorklicense(row) {
  1423. this.worklicenseOpen = true;
  1424. this.worklicenseTitle = row.name + this.$t('的')+this.$t('上岗证复证')+this.$t('列表');
  1425. this.worklicenseParams.employeeid = row.employeeid
  1426. listTraining(this.worklicenseParams).then(response => {
  1427. this.worklicenseList = response;
  1428. });
  1429. },
  1430. /** 打开公司级培训列表 */
  1431. openCompany(row) {
  1432. this.companyOpen = true;
  1433. this.companyTitle = row.name + this.$t('的')+this.$t('公司级')+this.$t('培训信息');
  1434. this.$nextTick(() => {
  1435. this.getParticipants(row.employeeid)
  1436. })
  1437. },
  1438. /** 打开装置级培训列表 */
  1439. openDevice(row) {
  1440. this.deviceOpen = true;
  1441. this.resetForm("queryRegularForm");
  1442. this.deviceTitle = row.name + this.$t('的')+this.$t('装置级')+this.$t('培训信息');
  1443. this.employeeid = row.employeeid;
  1444. this.queryDeviceParams.year = this.getNowTime();
  1445. this.$nextTick(() => {
  1446. this.getDevice(row.employeeid)
  1447. })
  1448. },
  1449. getParticipants(employeeid) {
  1450. this.queryCompanyParams.staffId = employeeid
  1451. listParticipants(this.queryCompanyParams).then(response => {
  1452. this.participantsList = response.rows;
  1453. });
  1454. },
  1455. getDevice(employeeid) {
  1456. this.queryDeviceParams.staffId = employeeid
  1457. listDevice(this.queryDeviceParams).then(response => {
  1458. this.devicceList = response.rows;
  1459. });
  1460. },
  1461. // 取消
  1462. cancelFile(row, index) {
  1463. // 如果是新增的数据
  1464. if (row.isAdd) {
  1465. this.doc.commonfileList.splice(index, 1)
  1466. } else {
  1467. // 不是新增的数据 还原数据
  1468. for (const i in row.oldRow) {
  1469. row[i] = row.oldRow[i]
  1470. }
  1471. row.isEdit = false
  1472. }
  1473. },
  1474. edit(row) {
  1475. // 备份原始数据
  1476. row['oldRow'] = JSON.parse(JSON.stringify(row));
  1477. this.$nextTick(() => {
  1478. row.isEdit = true;
  1479. })
  1480. },
  1481. save(row) {
  1482. row.isEdit = false;
  1483. var that = this;
  1484. that.loading = true;
  1485. this.form = row;
  1486. if (row.isAdd == true) {
  1487. addCommonfile(this.form).then(response => {
  1488. this.msgSuccess(this.$t('新增成功'));
  1489. this.open = false;
  1490. this.getList();
  1491. });
  1492. }else {
  1493. updateCommonfile(this.form).then(response => {
  1494. this.msgSuccess(this.$t('修改成功'));
  1495. this.open = false;
  1496. this.getList();
  1497. });
  1498. }
  1499. },
  1500. /** 删除按钮操作 */
  1501. handleDeleteDoc(row) {
  1502. const ids = row.id || this.ids;
  1503. this.$confirm(this.$t('是否确认删除?'), this.$t('警告'), {
  1504. confirmButtonText: this.$t('确定'),
  1505. cancelButtonText: this.$t('取消'),
  1506. type: "warning"
  1507. }).then(function() {
  1508. return delCommonfile(ids);
  1509. }).then(() => {
  1510. this.getFileList()
  1511. this.msgSuccess(this.$t('删除成功'));
  1512. })
  1513. },
  1514. /** 公司级培训修改按钮操作 */
  1515. handleCompanyUpdate(row) {
  1516. this.reset();
  1517. const id = row.id || this.ids
  1518. },
  1519. closeDialog(){
  1520. this.companylevelList = []
  1521. this.devicelevelList = []
  1522. this.tableShow =false
  1523. },
  1524. }
  1525. };
  1526. </script>
  1527. <style>
  1528. .companyLevelTable {
  1529. color: black;
  1530. }
  1531. .el-dialog__body {
  1532. padding-top: 0px
  1533. }
  1534. .el-table--scrollable-x .el-table__body-wrapper {
  1535. z-index: 1;
  1536. }
  1537. .rectangleRed {
  1538. width: 60px !important;
  1539. height: 30px !important;
  1540. margin-bottom: -8px;
  1541. }
  1542. .rectangleGreen {
  1543. width: 60px !important;
  1544. height: 30px !important;
  1545. margin-bottom: -8px;
  1546. }
  1547. </style>