index.vue 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558
  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. export default {
  644. name: "Trainingrecords",
  645. components: { Treeselect},
  646. data() {
  647. return {
  648. transTitle: [], // transTitle 该标题为转化后的标题, 注意多一列, 因为原来的标题变成了竖着显示了, 所以多一列标题, 第一个为空即可
  649. companylevelList: [],
  650. companylevelListTemp: [],
  651. devicelevelList: [],
  652. devicelevelListTemp: [],
  653. // 遮罩层
  654. loading: true,
  655. // 选中数组
  656. ids: [],
  657. // 非单个禁用
  658. single: true,
  659. // 非多个禁用
  660. multiple: true,
  661. // 显示搜索条件
  662. showSearch: false,
  663. // 总条数
  664. total: 0,
  665. // 培训成绩表格数据
  666. trainingrecordsList: [],
  667. // 人员-公司级培训关系表格数据
  668. participantsList: [],
  669. // 人员-装置级培训关系表格数据
  670. devicceList: [],
  671. //上岗证培训列表
  672. worklicenseList: [],
  673. // 弹出层标题
  674. title: "",
  675. companyTitle: "",
  676. deviceTitle: "",
  677. companyTrainingTitle: "",
  678. trainingTimeTitle: "",
  679. deviceTrainingTitle: "",
  680. worklicenseTitle: "",
  681. // 部门树选项
  682. deptOptions: undefined,
  683. clientHeight:300,
  684. // 是否显示弹出层
  685. open: false,
  686. companyOpen: false,
  687. deviceOpen: false,
  688. companyTrainingOpen: false,
  689. deviceTrainingOpen: false,
  690. worklicenseOpen: false,
  691. companyTrainingLoad: false,
  692. deviceTrainingLoad: false,
  693. tableShow: true,
  694. trainingTimeOpen: false,
  695. // 装置名称字典
  696. plantCodeOptions: [],
  697. // 班值字典
  698. classesOptions: [],
  699. // SUB字典
  700. subOptions: [],
  701. // 裂解字典
  702. crackingOptions: [],
  703. // 热区字典
  704. hotareaOptions: [],
  705. // 冷区字典
  706. coldareaOptions: [],
  707. // AEU/PGU字典
  708. aeupguOptions: [],
  709. // 入职字典
  710. onboardOptions: [],
  711. // TDS字典
  712. tdsOptions: [],
  713. // 上岗证复证字典
  714. postCardOptions: [],
  715. // 工艺培训字典
  716. craftOptions: [],
  717. //公司级培训字典
  718. companyOptions: [],
  719. //装置级培训字典
  720. deviceOptions: [],
  721. // 培训岗位字典
  722. positionOptions: [],
  723. //培训类型字典
  724. trainingTypeOptions: [],
  725. //点击查看的员工号
  726. employeeid: '',
  727. // 用户导入参数
  728. upload: {
  729. downloadAction: process.env.VUE_APP_BASE_API + '/common/template',
  730. //下载模板类型
  731. type: "trainingrecords",
  732. // 是否显示弹出层(用户导入)
  733. open: false,
  734. // 弹出层标题(用户导入)
  735. title: "",
  736. // 是否禁用上传
  737. isUploading: false,
  738. // 是否更新已经存在的用户数据
  739. updateSupport: 0,
  740. // 设置上传的请求头部
  741. headers: { Authorization: "Bearer " + getToken() },
  742. // 上传的地址
  743. url: process.env.VUE_APP_BASE_API + "/training/trainingrecords/importData"
  744. },
  745. // 报告附件参数
  746. doc: {
  747. file: "",
  748. // 是否显示弹出层(报告附件)
  749. open: false,
  750. // 弹出层标题(报告附件)
  751. title: this.$t('附件'),
  752. // 是否禁用上传
  753. isUploading: false,
  754. // 是否更新已经存在的用户数据
  755. updateSupport: 0,
  756. // 报告附件上传位置编号
  757. ids: 0,
  758. // 设置上传的请求头部
  759. headers: { Authorization: "Bearer " + getToken() },
  760. // 上传的地址
  761. url: process.env.VUE_APP_BASE_API + "/common/commonfile/uploadFile",
  762. commonfileList: null,
  763. queryParams: {
  764. pId: null,
  765. pType: 'traning'
  766. },
  767. pType: 'traning',
  768. pId: null,
  769. form: {}
  770. },
  771. // 查询参数
  772. queryParams: {
  773. pageNum: 1,
  774. pageSize: 20,
  775. name: null,
  776. employeeid: null,
  777. classes: null,
  778. sortDate: null,
  779. sortOrder: null,
  780. onboard: null,
  781. tds: null,
  782. postCard: null,
  783. craft: null,
  784. company: null
  785. },
  786. //人员表查询参数
  787. staffmgrQueryParams: {
  788. units: "10,18"
  789. },
  790. queryCompanyParams: {
  791. staffId: null,
  792. companyId: null,
  793. },
  794. queryDeviceParams: {
  795. staffId: null,
  796. regularId: null,
  797. year: this.getNowTime(),
  798. trainingType: null
  799. },
  800. deviceParams: {
  801. staffId: null,
  802. regularId: null,
  803. year: this.getNowTime(),
  804. trainingType: null
  805. },
  806. worklicenseParams: {
  807. employeeid: null,
  808. },
  809. companyQueryParams: {},
  810. // 表单参数
  811. form: {},
  812. pdf : {
  813. title: '',
  814. pdfUrl: '',
  815. numPages: null,
  816. open: false,
  817. pageNum: 1,
  818. pageTotalNum: 1,
  819. loadedRatio: 0,
  820. },
  821. // 表单校验
  822. rules: {
  823. plantCode: [
  824. { required: true, message: this.$t('装置名称') + this.$t('不能为空'), trigger: "change" }
  825. ],
  826. year: [
  827. { required: true, message: this.$t('年份') + this.$t('不能为空'), trigger: "blur" }
  828. ],
  829. deptId: [
  830. { required: true, message: this.$t('部门编号') + this.$t('不能为空'), trigger: "blur" }
  831. ]
  832. },
  833. };
  834. },
  835. watch: {
  836. // 根据名称筛选部门树
  837. deptName(val) {
  838. this.$refs.tree.filter(val);
  839. }
  840. },
  841. created() {
  842. //设置表格高度对应屏幕高度
  843. this.$nextTick(() => {
  844. this.clientHeight = (document.body.clientHeight - 80) * 0.8
  845. })
  846. this.getList();
  847. this.getStaffmar();
  848. this.getTreeselect();
  849. this.getDicts("PLANT_DIVIDE").then(response => {
  850. this.plantCodeOptions = response.data;
  851. });
  852. this.getDicts("TEAM_DIVIDE").then(response => {
  853. this.classesOptions = response.data;
  854. });
  855. this.getDicts("TICK_CROSS").then(response => {
  856. this.subOptions = response.data;
  857. });
  858. this.getDicts("TICK_CROSS").then(response => {
  859. this.crackingOptions = response.data;
  860. });
  861. this.getDicts("TICK_CROSS").then(response => {
  862. this.hotareaOptions = response.data;
  863. });
  864. this.getDicts("TICK_CROSS").then(response => {
  865. this.coldareaOptions = response.data;
  866. });
  867. this.getDicts("TICK_CROSS").then(response => {
  868. this.aeupguOptions = response.data;
  869. });
  870. this.getDicts("TRAINING_QUALIFY").then(response => {
  871. this.onboardOptions = response.data;
  872. });
  873. this.getDicts("TRAINING_QUALIFY").then(response => {
  874. this.tdsOptions = response.data;
  875. });
  876. this.getDicts("TRAINING_QUALIFY").then(response => {
  877. this.postCardOptions = response.data;
  878. });
  879. this.getDicts("TRAINING_QUALIFY").then(response => {
  880. this.craftOptions = response.data;
  881. });
  882. this.getDicts("TRAINING_QUALIFY").then(response => {
  883. this.companyOptions = response.data;
  884. });
  885. this.getDicts("TRAINING_QUALIFY").then(response => {
  886. this.deviceOptions = response.data;
  887. });
  888. this.getDicts("ACTUALPOST").then(response => {
  889. this.positionOptions = response.data;
  890. });
  891. this.getDicts("TRAINING_TYPE").then(response => {
  892. this.trainingTypeOptions = response.data;
  893. });
  894. },
  895. methods: {
  896. colspanMethod({ row, column, rowIndex, columnIndex }) {
  897. if (columnIndex === 0) {
  898. const _row = this.setTable(this.companylevelList).merge[rowIndex];
  899. const _col = _row > 0 ? 1 : 0;
  900. return {
  901. rowspan: _row,
  902. colspan: _col
  903. };
  904. }
  905. if (columnIndex === 1 ) {
  906. const _row = this.setTable(this.companylevelList).merge[rowIndex];
  907. const _col = _row > 0 ? 1 : 0;
  908. return {
  909. rowspan: _row,
  910. colspan: _col
  911. };
  912. }
  913. },
  914. colspanDeviceMethod({ row, column, rowIndex, columnIndex }) {
  915. if (columnIndex === 0) {
  916. const _row = this.setTable(this.devicelevelList).merge[rowIndex];
  917. const _col = _row > 0 ? 1 : 0;
  918. return {
  919. rowspan: _row,
  920. colspan: _col
  921. };
  922. }
  923. if (columnIndex === 1 ) {
  924. const _row = this.setTable(this.devicelevelList).merge[rowIndex];
  925. const _col = _row > 0 ? 1 : 0;
  926. return {
  927. rowspan: _row,
  928. colspan: _col
  929. };
  930. }
  931. },
  932. setTable(tableData) {
  933. let spanArr = [],
  934. concat = 0;
  935. tableData.forEach((item, index) => {
  936. if (index === 0) {
  937. spanArr.push(1);
  938. } else {
  939. if (item[1] === tableData[index - 1][1]) {
  940. //第一列需合并相同内容的判断条件
  941. spanArr[concat] += 1;
  942. spanArr.push(0);
  943. } else {
  944. spanArr.push(1);
  945. concat = index;
  946. }
  947. }
  948. });
  949. return {
  950. merge: spanArr
  951. };
  952. },
  953. //根据是否存在最后培训时间显示颜色提示
  954. tableCellClassName({ row, column, rowIndex, columnIndex }) {
  955. // for (let i = 2; i < this.transTitle.length + 2; i++) {
  956. // if (columnIndex == i){
  957. // return this.changeColor(row[i])
  958. // }
  959. // }
  960. return this.changeColor(row[columnIndex])
  961. },
  962. changeColor (value) {
  963. if (value.trim().startsWith('20')){
  964. return 'companyFinish'
  965. }
  966. if (value === "-"){
  967. return 'companyUrgent'
  968. }
  969. },
  970. /** 查询培训成绩列表 */
  971. getList() {
  972. this.loading = true;
  973. listTrainingrecords(this.queryParams).then(response => {
  974. this.trainingrecordsList = response.rows;
  975. this.total = response.total;
  976. this.loading = false;
  977. });
  978. },
  979. //获取人员表
  980. getStaffmar() {
  981. selectTimeStaffmgr(this.staffmgrQueryParams).then(response => {
  982. const allData = response.rows
  983. const data = [];
  984. for (let i = 0; i < allData.length; i++) {
  985. data.push({
  986. name: allData[i].name,
  987. actualpost: this.selectDictLabel(this.positionOptions, allData[i].actualpost),
  988. trainingTime: allData[i].trainingTime
  989. });
  990. }
  991. this.transTitle = data;
  992. })
  993. },
  994. //获取公司级培训列表
  995. getCompanyTraining() {
  996. companyListParticipants(this.companyQueryParams).then(response => {
  997. this.companylevelListTemp = response;
  998. this.companylevelList = response
  999. this.companyTrainingLoad = false
  1000. this.$nextTick(() => {
  1001. this.$refs.companyTable.doLayout(); // 解决表格错位
  1002. });
  1003. })
  1004. },
  1005. //获取装置级培训列表
  1006. getDeviceTraining() {
  1007. deviceListParticipants(this.deviceParams).then(response => {
  1008. this.devicelevelListTemp = response;
  1009. this.devicelevelList = response
  1010. this.deviceTrainingLoad = false
  1011. this.$nextTick(() => {
  1012. this.$refs.deviceTable.doLayout(); // 解决表格错位
  1013. });
  1014. })
  1015. },
  1016. /** 查询部门下拉树结构 */
  1017. getTreeselect() {
  1018. treeselect().then(response => {
  1019. this.deptOptions = response.data;
  1020. });
  1021. },
  1022. // 装置名称字典翻译
  1023. plantCodeFormat(row, column) {
  1024. return this.selectDictLabel(this.plantCodeOptions, row.plantCode);
  1025. },
  1026. // 班值字典翻译
  1027. classesFormat(row, column) {
  1028. return this.selectDictLabel(this.classesOptions, row.classes);
  1029. },
  1030. // SUB字典翻译
  1031. subFormat(row, column) {
  1032. return this.selectDictLabel(this.subOptions, row.sub);
  1033. },
  1034. // 裂解字典翻译
  1035. crackingFormat(row, column) {
  1036. return this.selectDictLabel(this.crackingOptions, row.cracking);
  1037. },
  1038. // 热区字典翻译
  1039. hotareaFormat(row, column) {
  1040. return this.selectDictLabel(this.hotareaOptions, row.hotarea);
  1041. },
  1042. // 冷区字典翻译
  1043. coldareaFormat(row, column) {
  1044. return this.selectDictLabel(this.coldareaOptions, row.coldarea);
  1045. },
  1046. // AEU/PGU字典翻译
  1047. aeupguFormat(row, column) {
  1048. return this.selectDictLabel(this.aeupguOptions, row.aeupgu);
  1049. },
  1050. // 入职字典翻译
  1051. onboardFormat(row, column) {
  1052. return this.selectDictLabel(this.onboardOptions, row.onboard);
  1053. },
  1054. // TDS字典翻译
  1055. tdsFormat(row, column) {
  1056. return this.selectDictLabel(this.tdsOptions, row.tds);
  1057. },
  1058. // 上岗证复证字典翻译
  1059. postCardFormat(row, column) {
  1060. return this.selectDictLabel(this.postCardOptions, row.postCard);
  1061. },
  1062. // 工艺培训字典翻译
  1063. craftFormat(row, column) {
  1064. return this.selectDictLabel(this.craftOptions, row.craft);
  1065. },
  1066. //公司级培训字典翻译
  1067. companyFormat(row, column) {
  1068. return this.selectDictLabel(this.companyOptions, row.company);
  1069. },
  1070. //装置级培训字典翻译
  1071. deviceFormat(row, column) {
  1072. return this.selectDictLabel(this.deviceOptions, row.device);
  1073. },
  1074. // 培训类型翻译
  1075. trainingTypeFormat(row, column) {
  1076. return this.selectDictLabel(this.trainingTypeOptions, row.trainingType);
  1077. },
  1078. // 取消按钮
  1079. cancel() {
  1080. this.open = false;
  1081. this.reset();
  1082. },
  1083. // 表单重置
  1084. reset() {
  1085. this.form = {
  1086. id: null,
  1087. plantCode: null,
  1088. name: null,
  1089. employeeid: null,
  1090. classes: null,
  1091. companysafe: null,
  1092. plantsafe: null,
  1093. teamsafe: null,
  1094. sub: null,
  1095. cracking: null,
  1096. hotarea: null,
  1097. coldarea: null,
  1098. aeupgu: null,
  1099. upscore: null,
  1100. downscore: null,
  1101. delFlag: null,
  1102. createrCode: null,
  1103. createdate: null,
  1104. updaterCode: null,
  1105. updatedate: null,
  1106. remarks: null,
  1107. deptId: null,
  1108. onboard: null,
  1109. tds: null,
  1110. postCard: null,
  1111. craft: null,
  1112. company: null,
  1113. device: null
  1114. };
  1115. this.resetForm("form");
  1116. },
  1117. /** 搜索按钮操作 */
  1118. handleQuery() {
  1119. this.queryParams.pageNum = 1;
  1120. this.getList();
  1121. },
  1122. //搜索按钮
  1123. handleDeviceQuery() {
  1124. this.deviceTrainingLoad = true;
  1125. this.$nextTick(() => {
  1126. this.getDeviceTraining();
  1127. });
  1128. },
  1129. staffDeviceQuery() {
  1130. this.getDevice(this.employeeid)
  1131. },
  1132. /** 重置按钮操作 */
  1133. resetQuery() {
  1134. this.resetForm("queryForm");
  1135. this.handleQuery();
  1136. },
  1137. // 多选框选中数据
  1138. handleSelectionChange(selection) {
  1139. this.ids = selection.map(item => item.id)
  1140. this.single = selection.length!==1
  1141. this.multiple = !selection.length
  1142. },
  1143. //根据分数显示颜色提示
  1144. tableCellStyle({ row, column, rowIndex, columnIndex }) {
  1145. if (columnIndex === 4 && row.onboard === "2"){
  1146. return "color: rgba(255, 26, 26, 0.98) "
  1147. }else if (columnIndex === 5 && row.tds === "2"){
  1148. return "color: rgba(255, 26, 26, 0.98) "
  1149. }else if (columnIndex === 6 && row.postCard === "2"){
  1150. return "color: rgba(255, 26, 26, 0.98) "
  1151. }else if (columnIndex === 7 && row.craft === "2"){
  1152. return "color: rgba(255, 26, 26, 0.98) "
  1153. }else if (columnIndex === 8 && row.company === "2"){
  1154. return "color: rgba(255, 26, 26, 0.98) "
  1155. }
  1156. },
  1157. //排序
  1158. sortChange(val){
  1159. if (val.prop == 'companysafe'){
  1160. this.queryParams.sortDate = 'companysafe';
  1161. }else if (val.prop == 'plantsafe'){
  1162. this.queryParams.sortDate = 'plantsafe';
  1163. }else if (val.prop == 'teamsafe'){
  1164. this.queryParams.sortDate = 'teamsafe';
  1165. }
  1166. if (val.order === 'descending') {
  1167. this.queryParams.sortOrder = 'desc'
  1168. } else {
  1169. this.queryParams.sortOrder = 'asc'
  1170. }
  1171. this.getList()
  1172. },
  1173. /** 获取当前年份 */
  1174. getNowTime() {
  1175. var now = new Date();
  1176. var year = now.getFullYear(); //得到年份
  1177. var defaultDate = `${year}`;
  1178. defaultDate = `${year}`
  1179. return defaultDate;
  1180. },
  1181. /** 公司级培训矩阵按钮操作 */
  1182. handleCompany() {
  1183. this.companyTrainingLoad =true
  1184. this.companyTrainingTitle = this.$t('参加')+this.$t('公司级')+this.$t('培训人员') +this.$t('名单')
  1185. this.companyTrainingOpen = true
  1186. // loading.close();
  1187. this.tableShow = true
  1188. setTimeout(() => {
  1189. this.getCompanyTraining();
  1190. }, 10);
  1191. },
  1192. /** 装置级培训矩阵按钮操作 */
  1193. handleDevice() {
  1194. this.deviceTrainingLoad =true
  1195. this.resetForm("queryRegularForm");
  1196. this.deviceTrainingTitle =this.$t('参加') + this.$t('装置级') + this.$t('培训人员') + this.$t('名单')
  1197. this.deviceTrainingOpen = true
  1198. this.tableShow = true
  1199. this.deviceParams.year = this.getNowTime();
  1200. setTimeout(() => {
  1201. this.getDeviceTraining();
  1202. }, 10);
  1203. },
  1204. /** 人员培训时长按钮操作 */
  1205. handleTime() {
  1206. this.trainingTimeOpen = true;
  1207. this.trainingTimeTitle = this.$t('人员培训时长');
  1208. },
  1209. /** 新增按钮操作 */
  1210. handleAdd() {
  1211. this.reset();
  1212. this.open = true;
  1213. this.title = this.$t('新增') + " " + this.$t('培训成绩');
  1214. },
  1215. /** 修改按钮操作 */
  1216. handleUpdate(row) {
  1217. this.reset();
  1218. const id = row.id || this.ids
  1219. getTrainingrecords(id).then(response => {
  1220. this.form = response.data;
  1221. if (response.data.sub == 10) { this.form.sub = true }
  1222. if (response.data.cracking == 10) { this.form.cracking = true }
  1223. if (response.data.hotarea == 10) { this.form.hotarea = true }
  1224. if (response.data.coldarea == 10) { this.form.coldarea = true }
  1225. if (response.data.aeupgu == 10) { this.form.aeupgu = true }
  1226. this.open = true;
  1227. this.title = this.$t('修改') + " " + this.$t('培训成绩');
  1228. });
  1229. },
  1230. /** 提交按钮 */
  1231. submitForm() {
  1232. this.$refs["form"].validate(valid => {
  1233. if (valid) {
  1234. if (this.form.id != null) {
  1235. updateTrainingrecords(this.form).then(response => {
  1236. this.msgSuccess(this.$t('修改成功'));
  1237. this.open = false;
  1238. this.getList();
  1239. });
  1240. } else {
  1241. addTrainingrecords(this.form).then(response => {
  1242. this.msgSuccess(this.$t('新增成功'));
  1243. this.open = false;
  1244. this.getList();
  1245. });
  1246. }
  1247. }
  1248. });
  1249. },
  1250. /** 删除按钮操作 */
  1251. handleDelete(row) {
  1252. const ids = row.id || this.ids;
  1253. this.$confirm(this.$t('是否确认删除?'), this.$t('警告'), {
  1254. confirmButtonText: this.$t('确定'),
  1255. cancelButtonText: this.$t('取消'),
  1256. type: "warning"
  1257. }).then(function() {
  1258. return delTrainingrecords(ids);
  1259. }).then(() => {
  1260. this.getList();
  1261. this.msgSuccess(this.$t('删除成功'));
  1262. })
  1263. },
  1264. /** 公司级培训删除按钮操作 */
  1265. participantsHandleDelete(row) {
  1266. const ids = row.id
  1267. this.$confirm(this.$t('是否确认删除?'), this.$t('警告'), {
  1268. confirmButtonText: this.$t('确定'),
  1269. cancelButtonText: this.$t('取消'),
  1270. type: "warning"
  1271. }).then(function() {
  1272. return delParticipants(ids);
  1273. }).then(() => {
  1274. this.getParticipants(row.staffId)
  1275. this.msgSuccess(this.$t('删除成功'));
  1276. })
  1277. },
  1278. /** 导出按钮操作 */
  1279. handleExport() {
  1280. const queryParams = this.queryParams;
  1281. this.$confirm(this.$t('是否确认导出所有培训成绩数据项?'), this.$t('警告'), {
  1282. confirmButtonText: this.$t('确定'),
  1283. cancelButtonText: this.$t('取消'),
  1284. type: "warning"
  1285. }).then(function() {
  1286. return exportTrainingrecords(queryParams);
  1287. }).then(response => {
  1288. this.download(response.msg);
  1289. })
  1290. },
  1291. /** 导出人员培训时长按钮操作 */
  1292. exportTrainingTime() {
  1293. const queryParams = this.transTitle;
  1294. this.$confirm(this.$t('是否确认导出人员培训时长?'), this.$t('警告'), {
  1295. confirmButtonText: this.$t('确定'),
  1296. cancelButtonText: this.$t('取消'),
  1297. type: "warning"
  1298. }).then(function() {
  1299. return exportTrainingTime();
  1300. }).then(response => {
  1301. this.download(response.msg);
  1302. })
  1303. },
  1304. /** 导入按钮操作 */
  1305. handleImport() {
  1306. this.upload.title = this.$t('用户导入');
  1307. this.upload.open = true;
  1308. },
  1309. /** 下载模板操作 */
  1310. importTemplate() {
  1311. this.$refs['downloadFileForm'].submit()
  1312. },
  1313. // 文件上传中处理
  1314. handleFileUploadProgress(event, file, fileList) {
  1315. this.upload.isUploading = true;
  1316. },
  1317. // 文件上传成功处理
  1318. handleFileSuccess(response, file, fileList) {
  1319. this.upload.open = false;
  1320. this.upload.isUploading = false;
  1321. this.$refs.upload.clearFiles();
  1322. if (response.data[0] != null) {
  1323. this.$alert(this.$t('成功导入') + response.msg + this.$t('条数据') + "," + this.$t('第') + response.data + this.$t('行数据出现错误导入失败')+"。", this.$t('导入结果'), { dangerouslyUseHTMLString: true });
  1324. }else {
  1325. this.$alert(this.$t('成功导入') + response.msg + this.$t('条数据'), this.$t('导入结果'), { dangerouslyUseHTMLString: true });
  1326. }
  1327. this.getList();
  1328. },
  1329. // 提交上传文件
  1330. submitFileForm() {
  1331. this.$refs.upload.submit();
  1332. },
  1333. /** 报告附件按钮操作 */
  1334. handleDoc(row , fileType) {
  1335. this.doc.pType = fileType
  1336. this.doc.queryParams.pType = fileType
  1337. this.doc.id = row.id;
  1338. var titleType = '';
  1339. if (fileType === 'trainingrecords-onbord') {
  1340. titleType = row.name + this.$t('的')+this.$t('入职')+this.$t('培训')
  1341. }else if (fileType === 'trainingrecords-tds') {
  1342. titleType = row.name + this.$t('的')+this.$t('TDS培训')
  1343. }else if (fileType === 'trainingrecords-craft') {
  1344. titleType = row.name + this.$t('的')+this.$t('工艺培训')
  1345. }else {
  1346. titleType =this.$t('上岗证')+this.$t('培训')
  1347. }
  1348. this.doc.title = titleType;
  1349. this.doc.open = true;
  1350. this.doc.queryParams.pId = row.id
  1351. this.doc.pId = row.id
  1352. this.getFileList()
  1353. this.$nextTick(() => {
  1354. this.$refs.doc.clearFiles()
  1355. })
  1356. },
  1357. getFileList (){
  1358. allFileList(this.doc.queryParams).then(response => {
  1359. response.forEach(element => {
  1360. element["isEdit"] = false
  1361. });
  1362. response.forEach(element => {
  1363. element["isAdd"] = false
  1364. });
  1365. this.doc.commonfileList = response;
  1366. });
  1367. },
  1368. //附件上传中处理
  1369. handleFileDocProgress(event, file, fileList) {
  1370. this.doc.file = file;
  1371. this.doc.isUploading = true;
  1372. },
  1373. //附件上传成功处理
  1374. handleFileDocSuccess(response, file, fileList) {
  1375. this.doc.isUploading = false;
  1376. this.$alert(response.msg, this.$t('导入结果'), { dangerouslyUseHTMLString: true });
  1377. this.getFileList()
  1378. },
  1379. // 文件下载处理
  1380. handleDownload(row) {
  1381. var name = row.fileName;
  1382. var url = row.fileUrl;
  1383. var suffix = url.substring(url.lastIndexOf("."), url.length);
  1384. const a = document.createElement('a')
  1385. a.setAttribute('download', name)
  1386. a.setAttribute('target', '_blank')
  1387. a.setAttribute('href', process.env.VUE_APP_BASE_API + url)
  1388. a.click()
  1389. },
  1390. //pdf预览
  1391. openPdf(){
  1392. window.open(this.pdf.pdfUrl);//path是文件的全路径地址
  1393. },
  1394. handleSee (row){
  1395. this.pdf.open =true
  1396. this.pdf.pageNum = 1
  1397. this.pdf.loadedRatio = 0
  1398. this.pdf.pdfUrl = process.env.VUE_APP_BASE_API + row.fileUrl
  1399. this.pdf.title = row.fileName
  1400. let loadingTask = null
  1401. loadingTask = pdf.createLoadingTask(this.pdf.pdfUrl)
  1402. loadingTask.promise.then(pdf => {
  1403. this.pdf.numPages = pdf.numPages
  1404. }).catch(err => {
  1405. this.msgError(this.$t('pdf加载失败'))
  1406. })
  1407. },
  1408. // pdf上一页
  1409. prePage() {
  1410. let page = this.pdf.pageNum
  1411. page = page > 1 ? page - 1 : this.pdf.pageTotalNum
  1412. this.pdf.pageNum = page
  1413. },
  1414. // pdf下一页
  1415. nextPage() {
  1416. let page = this.pdf.pageNum
  1417. page = page < this.pdf.pageTotalNum ? page + 1 : 1
  1418. this.pdf.pageNum = page
  1419. },
  1420. /** 打开上岗证复证列表 */
  1421. openWorklicense(row) {
  1422. this.worklicenseOpen = true;
  1423. this.worklicenseTitle = row.name + this.$t('的')+this.$t('上岗证复证')+this.$t('列表');
  1424. this.worklicenseParams.employeeid = row.employeeid
  1425. listTraining(this.worklicenseParams).then(response => {
  1426. this.worklicenseList = response;
  1427. });
  1428. },
  1429. /** 打开公司级培训列表 */
  1430. openCompany(row) {
  1431. this.companyOpen = true;
  1432. this.companyTitle = row.name + this.$t('的')+this.$t('公司级')+this.$t('培训信息');
  1433. this.$nextTick(() => {
  1434. this.getParticipants(row.employeeid)
  1435. })
  1436. },
  1437. /** 打开装置级培训列表 */
  1438. openDevice(row) {
  1439. this.deviceOpen = true;
  1440. this.resetForm("queryRegularForm");
  1441. this.deviceTitle = row.name + this.$t('的')+this.$t('装置级')+this.$t('培训信息');
  1442. this.employeeid = row.employeeid;
  1443. this.queryDeviceParams.year = this.getNowTime();
  1444. this.$nextTick(() => {
  1445. this.getDevice(row.employeeid)
  1446. })
  1447. },
  1448. getParticipants(employeeid) {
  1449. this.queryCompanyParams.staffId = employeeid
  1450. listParticipants(this.queryCompanyParams).then(response => {
  1451. this.participantsList = response.rows;
  1452. });
  1453. },
  1454. getDevice(employeeid) {
  1455. this.queryDeviceParams.staffId = employeeid
  1456. listDevice(this.queryDeviceParams).then(response => {
  1457. this.devicceList = response.rows;
  1458. });
  1459. },
  1460. // 取消
  1461. cancelFile(row, index) {
  1462. // 如果是新增的数据
  1463. if (row.isAdd) {
  1464. this.doc.commonfileList.splice(index, 1)
  1465. } else {
  1466. // 不是新增的数据 还原数据
  1467. for (const i in row.oldRow) {
  1468. row[i] = row.oldRow[i]
  1469. }
  1470. row.isEdit = false
  1471. }
  1472. },
  1473. edit(row) {
  1474. // 备份原始数据
  1475. row['oldRow'] = JSON.parse(JSON.stringify(row));
  1476. this.$nextTick(() => {
  1477. row.isEdit = true;
  1478. })
  1479. },
  1480. save(row) {
  1481. row.isEdit = false;
  1482. var that = this;
  1483. that.loading = true;
  1484. this.form = row;
  1485. if (row.isAdd == true) {
  1486. addCommonfile(this.form).then(response => {
  1487. this.msgSuccess(this.$t('新增成功'));
  1488. this.open = false;
  1489. this.getList();
  1490. });
  1491. }else {
  1492. updateCommonfile(this.form).then(response => {
  1493. this.msgSuccess(this.$t('修改成功'));
  1494. this.open = false;
  1495. this.getList();
  1496. });
  1497. }
  1498. },
  1499. /** 删除按钮操作 */
  1500. handleDeleteDoc(row) {
  1501. const ids = row.id || this.ids;
  1502. this.$confirm(this.$t('是否确认删除?'), this.$t('警告'), {
  1503. confirmButtonText: this.$t('确定'),
  1504. cancelButtonText: this.$t('取消'),
  1505. type: "warning"
  1506. }).then(function() {
  1507. return delCommonfile(ids);
  1508. }).then(() => {
  1509. this.getFileList()
  1510. this.msgSuccess(this.$t('删除成功'));
  1511. })
  1512. },
  1513. /** 公司级培训修改按钮操作 */
  1514. handleCompanyUpdate(row) {
  1515. this.reset();
  1516. const id = row.id || this.ids
  1517. },
  1518. closeDialog(){
  1519. this.companylevelList = []
  1520. this.devicelevelList = []
  1521. this.tableShow =false
  1522. },
  1523. }
  1524. };
  1525. </script>
  1526. <style>
  1527. .companyLevelTable {
  1528. color: black;
  1529. }
  1530. .el-dialog__body {
  1531. padding-top: 0px
  1532. }
  1533. .el-table--scrollable-x .el-table__body-wrapper {
  1534. z-index: 1;
  1535. }
  1536. .rectangleRed {
  1537. width: 60px !important;
  1538. height: 30px !important;
  1539. margin-bottom: -8px;
  1540. }
  1541. .rectangleGreen {
  1542. width: 60px !important;
  1543. height: 30px !important;
  1544. margin-bottom: -8px;
  1545. }
  1546. </style>