org-user-edit.vue 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252
  1. <!-- 用户编辑弹窗 -->
  2. <template>
  3. <ele-modal
  4. width="60%"
  5. append-to-body
  6. :visible="visible"
  7. :close-on-click-modal="false"
  8. custom-class="ele-dialog-form"
  9. :title="isUpdate ? '基本信息' : '基本信息'"
  10. @update:visible="updateVisible"
  11. :maxable="true"
  12. >
  13. <el-form
  14. ref="form"
  15. :model="form"
  16. class="el-form-box"
  17. :rules="rules"
  18. label-width="110px"
  19. :disabled="disabled"
  20. >
  21. <el-row :gutter="15">
  22. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  23. <el-form-item label="姓名:" prop="name">
  24. <el-input
  25. clearable
  26. :maxlength="20"
  27. v-model="form.name"
  28. placeholder="请输入姓名"
  29. />
  30. </el-form-item>
  31. <el-form-item label="所属工厂:">
  32. <el-select
  33. style="width: 100%"
  34. clearable
  35. v-model="form.factoryId"
  36. filterable
  37. :disabled="!!form.loginName"
  38. placeholder="请选择所属工厂"
  39. >
  40. <el-option
  41. v-for="item in factoryList"
  42. :label="item.name"
  43. :value="item.id"
  44. :key="item.id"
  45. ></el-option>
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item label="主所属部门:" prop="groupId">
  49. <org-select
  50. :data="institutionList"
  51. placeholder="请选择所属机构"
  52. v-model="form.groupId"
  53. :disabled="!!form.loginName"
  54. @checkedKeys="checkedKeys"
  55. />
  56. </el-form-item>
  57. <el-form-item label="隶属部门:">
  58. <el-cascader
  59. class="ele-block"
  60. :options="organization"
  61. placeholder="请选择隶属部门"
  62. :props="defaultProps"
  63. ref="deptRef"
  64. :show-all-levels="true"
  65. @change="handleChange"
  66. :disabled="!!form.loginName"
  67. v-model="form.deptIds"
  68. clearable
  69. ></el-cascader>
  70. </el-form-item>
  71. <el-form-item label="性别:" prop="sex">
  72. <el-select
  73. clearable
  74. class="ele-block"
  75. v-model="form.sex"
  76. placeholder="请选择性别"
  77. >
  78. <el-option label="男" :value="1" />
  79. <el-option label="女" :value="2" />
  80. </el-select>
  81. </el-form-item>
  82. <el-form-item label="员工状态:" prop="status">
  83. <el-select
  84. clearable
  85. class="ele-block"
  86. v-model="form.status"
  87. placeholder="请选择员工状态"
  88. >
  89. <el-option
  90. v-for="item in statusOptions"
  91. :key="item.value"
  92. :label="item.label"
  93. :value="item.value"
  94. >
  95. </el-option>
  96. </el-select>
  97. </el-form-item>
  98. <el-form-item label="岗位:" prop="postId">
  99. <!-- <el-input
  100. clearable
  101. :maxlength="100"
  102. v-model="form.postName"
  103. placeholder="请输入岗位"
  104. /> -->
  105. <DictSelection
  106. dictName="岗位"
  107. clearable
  108. filterable
  109. v-model="form.postId"
  110. multiple
  111. >
  112. </DictSelection>
  113. </el-form-item>
  114. <el-form-item label="身份证号:" prop="idCard">
  115. <el-input
  116. clearable
  117. :maxlength="18"
  118. v-model="form.idCard"
  119. placeholder="请输入身份证号"
  120. @change="idCardChange"
  121. />
  122. </el-form-item>
  123. <!-- <el-form-item label="工种:" prop="workTypeId"> -->
  124. <!-- <DictSelection
  125. dictName="工种类型"
  126. clearable
  127. filterable
  128. v-model="form.workTypeId"
  129. >
  130. </DictSelection> -->
  131. <!-- <el-select style="width: 100%" clearable v-model="form.workTypeId" filterable placeholder="请选择工种类型">
  132. <el-option v-for="item in professionList" :key="item.id" :label="item.name" :value="item.id"></el-option>
  133. </el-select>
  134. </el-form-item> -->
  135. <el-form-item label="籍贯:" prop="city">
  136. <regions-select
  137. style="width: 100%"
  138. v-model="city"
  139. placeholder="请选择省市区"
  140. />
  141. </el-form-item>
  142. <el-form-item label="出生日期:" prop="age">
  143. <el-date-picker
  144. style="width: 100%"
  145. clearable
  146. v-model="form.birthday"
  147. type="date"
  148. value-format="yyyy-MM-dd"
  149. placeholder="请选择日期"
  150. >
  151. </el-date-picker>
  152. </el-form-item>
  153. <el-form-item label="是否启用">
  154. <el-switch
  155. v-model="form.isEnabled"
  156. :active-text="form.isEnabled == 1 ? '启用' : '停用'"
  157. :active-value="1"
  158. :inactive-value="0"
  159. >
  160. </el-switch>
  161. </el-form-item>
  162. <el-form-item
  163. label="审批签名:"
  164. prop="signature"
  165. :rules="{
  166. required: this.isCategory == 1,
  167. message: '请上传审批签名',
  168. trigger: ['blur', 'change']
  169. }"
  170. >
  171. <WithView
  172. :assetName="''"
  173. v-model="form.signature"
  174. style="max-height: 370px"
  175. ></WithView>
  176. </el-form-item>
  177. </el-col>
  178. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  179. <el-form-item label="用户账号:">
  180. <el-input
  181. :disabled="true"
  182. :maxlength="11"
  183. v-model="form.loginName"
  184. />
  185. </el-form-item>
  186. <el-form-item label="工号:" prop="jobNumber">
  187. <el-input
  188. clearable
  189. type="text"
  190. :maxlength="10"
  191. v-model="form.jobNumber"
  192. placeholder="请输入工号"
  193. onkeyup="value=value.replace(/[^\x00-\xff]/g, '')"
  194. />
  195. </el-form-item>
  196. <el-form-item label="手机号:" prop="phone">
  197. <el-input
  198. clearable
  199. :maxlength="11"
  200. v-model="form.phone"
  201. placeholder="请输入手机号"
  202. />
  203. </el-form-item>
  204. <el-form-item label="邮箱:" prop="email">
  205. <el-input
  206. clearable
  207. :maxlength="100"
  208. v-model="form.email"
  209. placeholder="请输入邮箱"
  210. />
  211. </el-form-item>
  212. <el-form-item label="年龄:" prop="age">
  213. <el-input
  214. type="number"
  215. clearable
  216. :maxlength="100"
  217. v-model="form.age"
  218. placeholder="请输入年龄"
  219. onkeyup="value=value.replace(/[^\d.]/g,'')"
  220. />
  221. </el-form-item>
  222. <el-form-item label="入职时间:" prop="joinDate">
  223. <el-date-picker
  224. style="width: 100%"
  225. clearable
  226. v-model="form.joinDate"
  227. type="date"
  228. value-format="yyyy-MM-dd"
  229. placeholder="请选择日期"
  230. >
  231. </el-date-picker>
  232. </el-form-item>
  233. <el-form-item label="毕业院校:" prop="school">
  234. <el-input
  235. clearable
  236. :maxlength="100"
  237. v-model="form.school"
  238. placeholder="请输入毕业院校"
  239. />
  240. </el-form-item>
  241. <el-form-item label="微信号:" prop="wxId">
  242. <el-input
  243. clearable
  244. :maxlength="100"
  245. v-model="form.wxId"
  246. placeholder="请输入微信号"
  247. />
  248. </el-form-item>
  249. <el-form-item label="户籍地址:" prop="censusAddress">
  250. <el-input
  251. clearable
  252. :maxlength="100"
  253. v-model="form.censusAddress"
  254. placeholder="户籍地址"
  255. />
  256. </el-form-item>
  257. <!-- <el-form-item label="关键工序:" prop="censusAddress">
  258. <el-input
  259. clearable
  260. :maxlength="100"
  261. v-model="form.censusAddress"
  262. placeholder="请选择关键工序"
  263. @click.native="chooseOperation"
  264. readonly
  265. />
  266. </el-form-item> -->
  267. <el-form-item label="关键工序:" prop="operations">
  268. <div class="multi-select-input" @click="chooseOperation">
  269. <div class="tag-box">
  270. <el-tag
  271. v-for="(item, index) in form.criticalTaskList"
  272. :key="item.taskId"
  273. closable
  274. @close="removeOperation(index)"
  275. >
  276. {{ item.taskName }}
  277. </el-tag>
  278. <!-- 占位符 -->
  279. <span v-if="!form.criticalTaskList.length" class="placeholder">
  280. 请选择关键工序
  281. </span>
  282. </div>
  283. </div>
  284. </el-form-item>
  285. </el-col>
  286. </el-row>
  287. <el-tabs v-model="activeName">
  288. <el-tab-pane label="证照列表" name="identityPhotos">
  289. <ele-pro-table
  290. ref="table"
  291. :columns="identityPhotosColumns"
  292. :datasource="form.identityPhotos"
  293. max-height="350px"
  294. :toolkit="[]"
  295. class="el-form-box"
  296. :need-page="false"
  297. >
  298. <!-- 表头工具栏 -->
  299. <template v-slot:toolbar>
  300. <el-button type="primary" @click="addIdentityPhotos"
  301. >添加</el-button
  302. >
  303. </template>
  304. <template v-slot:action="{ row, $index }">
  305. <el-link
  306. type="danger"
  307. :underline="false"
  308. icon="el-icon-delete"
  309. @click="handleIdentityPhotosDel(row, $index)"
  310. >删除
  311. </el-link>
  312. </template>
  313. <template v-slot:categoryLevelId="{ row, $index }"> </template>
  314. <template v-slot:type="{ row, $index }">
  315. <el-form-item
  316. label-width="0px"
  317. :prop="'identityPhotos.' + $index + '.type'"
  318. :rules="{
  319. required: true,
  320. message: '请选择证照类型',
  321. trigger: ['blur', 'change']
  322. }"
  323. >
  324. <DictSelection
  325. clearable
  326. v-model="row.type"
  327. dictName="证件类型"
  328. ></DictSelection>
  329. </el-form-item>
  330. </template>
  331. <template v-slot:code="{ row, $index }">
  332. <el-form-item
  333. label-width="0px"
  334. :prop="'identityPhotos.' + $index + '.code'"
  335. :rules="{
  336. required: true,
  337. message: '请填写证照编号',
  338. trigger: ['blur', 'change']
  339. }"
  340. >
  341. <el-input v-model="row.code" clearable></el-input>
  342. </el-form-item>
  343. </template>
  344. <template v-slot:level="{ row, $index }">
  345. <el-form-item
  346. label-width="0px"
  347. :prop="'identityPhotos.' + $index + '.level'"
  348. >
  349. <el-select
  350. style="width: 100%"
  351. v-model="row.level"
  352. clearable
  353. filterable
  354. >
  355. <el-option
  356. :label="item.label"
  357. :value="item.value"
  358. v-for="(item, index) in levelOptions"
  359. :key="index"
  360. >
  361. </el-option>
  362. </el-select>
  363. </el-form-item>
  364. </template>
  365. <template v-slot:validityStartTime="{ row, $index }">
  366. <el-form-item
  367. label-width="0"
  368. :prop="'identityPhotos.' + $index + '.validityStartTime'"
  369. :rules="{
  370. required: true,
  371. message: '请选择有效期开始时间',
  372. trigger: ['blur', 'change']
  373. }"
  374. >
  375. <el-date-picker
  376. style="width: 100%"
  377. v-model="row.validityStartTime"
  378. type="date"
  379. value-format="yyyy-MM-dd"
  380. placeholder="选择日期"
  381. >
  382. </el-date-picker>
  383. </el-form-item>
  384. </template>
  385. <template v-slot:validityEndTime="{ row, $index }">
  386. <el-form-item
  387. label-width="0px"
  388. :prop="'identityPhotos.' + $index + '.validityEndTime'"
  389. :rules="{
  390. required: true,
  391. message: '请选择有效期结束时间',
  392. trigger: ['blur', 'change']
  393. }"
  394. >
  395. <el-date-picker
  396. style="width: 100%"
  397. v-model="row.validityEndTime"
  398. value-format="yyyy-MM-dd"
  399. type="date"
  400. placeholder="选择日期"
  401. >
  402. </el-date-picker>
  403. </el-form-item>
  404. </template>
  405. <template v-slot:enactorTime="{ row, $index }">
  406. <el-form-item
  407. label-width="0px"
  408. :prop="'identityPhotos.' + $index + '.enactorTime'"
  409. >
  410. <el-date-picker
  411. style="width: 100%"
  412. v-model="row.enactorTime"
  413. value-format="yyyy-MM-dd"
  414. type="date"
  415. placeholder="选择日期"
  416. >
  417. </el-date-picker>
  418. </el-form-item>
  419. </template>
  420. <template v-slot:fileObj="{ row, $index }">
  421. <el-form-item
  422. label-width="0"
  423. :prop="'identityPhotos.' + $index + '.fileObj'"
  424. >
  425. <fileUpload
  426. v-model="row.fileObj"
  427. module="main"
  428. :showLib="false"
  429. :limit="5"
  430. />
  431. </el-form-item>
  432. </template>
  433. <template v-slot:status="{ row, $index }">
  434. <el-form-item
  435. label-width="0px"
  436. :prop="'identityPhotos.' + $index + '.status'"
  437. :rules="{
  438. required: true,
  439. message: '请选择状态',
  440. trigger: ['blur', 'change']
  441. }"
  442. >
  443. <DictSelection
  444. clearable
  445. v-model="row.status"
  446. dictName="规则状态"
  447. ></DictSelection>
  448. </el-form-item>
  449. </template>
  450. <template v-slot:remark="{ row, $index }">
  451. <el-form-item label-width="0px">
  452. <el-input v-model="row.remark" type="textarea"></el-input>
  453. </el-form-item>
  454. </template>
  455. <template v-slot:isRequired="{ column }">
  456. <span class="is-required">{{ column.label }}</span>
  457. </template>
  458. </ele-pro-table>
  459. </el-tab-pane>
  460. <el-tab-pane label="技能列表" name="skills">
  461. <ele-pro-table
  462. ref="table"
  463. :columns="skillsColumns"
  464. :datasource="form.skills"
  465. max-height="350px"
  466. :toolkit="[]"
  467. class="el-form-box"
  468. :need-page="false"
  469. >
  470. <!-- 表头工具栏 -->
  471. <template v-slot:toolbar>
  472. <el-button type="primary" @click="addSkills">添加</el-button>
  473. </template>
  474. <template v-slot:action="{ row, $index }">
  475. <el-link
  476. type="danger"
  477. :underline="false"
  478. icon="el-icon-delete"
  479. @click="handleSkillsDel(row, $index)"
  480. >删除
  481. </el-link>
  482. </template>
  483. <template v-slot:categoryLevelId="{ row, $index }"> </template>
  484. <template v-slot:name="{ row, $index }">
  485. <el-form-item
  486. label-width="0px"
  487. :prop="'skills.' + $index + '.name'"
  488. :rules="{
  489. required: true,
  490. message: '请填写技能名称',
  491. trigger: ['blur', 'change']
  492. }"
  493. >
  494. <el-input v-model="row.name" clearable></el-input>
  495. </el-form-item>
  496. </template>
  497. <template v-slot:level="{ row, $index }">
  498. <el-form-item
  499. label-width="0"
  500. :prop="'skills.' + $index + '.level'"
  501. >
  502. <el-select
  503. v-model="row.level"
  504. clearable
  505. filterable
  506. placeholder="请选择"
  507. >
  508. <el-option
  509. v-for="item in []"
  510. :key="item.value"
  511. :label="item.label"
  512. :value="item.value"
  513. >
  514. </el-option>
  515. </el-select>
  516. </el-form-item>
  517. </template>
  518. <template v-slot:years="{ row, $index }">
  519. <el-form-item
  520. label-width="0px"
  521. :prop="'skills.' + $index + '.years'"
  522. >
  523. <el-input v-model="row.years" clearable></el-input>
  524. </el-form-item>
  525. </template>
  526. <template v-slot:fileAttach="{ row, $index }">
  527. <el-form-item
  528. label-width="0"
  529. :prop="'skills.' + $index + '.fileAttach'"
  530. >
  531. <fileUpload
  532. v-model="row.fileAttach"
  533. module="main"
  534. :showLib="false"
  535. :limit="5"
  536. />
  537. </el-form-item>
  538. </template>
  539. <template v-slot:remark="{ row, $index }">
  540. <el-form-item label-width="0px">
  541. <el-input v-model="row.remark" type="textarea"></el-input>
  542. </el-form-item>
  543. </template>
  544. <template v-slot:isRequired="{ column }">
  545. <span class="is-required">{{ column.label }}</span>
  546. </template>
  547. </ele-pro-table>
  548. </el-tab-pane>
  549. <el-tab-pane label="奖惩记录" name="RPRecords">
  550. <ele-pro-table
  551. ref="table"
  552. :columns="RPRecordsColumns"
  553. :datasource="form.rewardsPunishments"
  554. max-height="350px"
  555. :toolkit="[]"
  556. class="el-form-box"
  557. :need-page="false"
  558. >
  559. <!-- 表头工具栏 -->
  560. <template v-slot:toolbar>
  561. <el-button type="primary" @click="addRPRecords">添加</el-button>
  562. </template>
  563. <template v-slot:action="{ row, $index }">
  564. <el-link
  565. type="danger"
  566. :underline="false"
  567. icon="el-icon-delete"
  568. @click="handleRPRecordsDel(row, $index)"
  569. >删除
  570. </el-link>
  571. </template>
  572. <template v-slot:type="{ row, $index }">
  573. <el-form-item
  574. label-width="0"
  575. :prop="'rewardsPunishments.' + $index + '.type'"
  576. :rules="{
  577. required: true,
  578. message: '请选择奖惩类型',
  579. trigger: ['blur', 'change']
  580. }"
  581. >
  582. <el-select
  583. v-model="row.type"
  584. clearable
  585. filterable
  586. placeholder="请选择"
  587. >
  588. <el-option
  589. v-for="item in RPRecordsType"
  590. :key="item.value"
  591. :label="item.label"
  592. :value="item.value"
  593. >
  594. </el-option>
  595. </el-select>
  596. </el-form-item>
  597. </template>
  598. <template v-slot:desce="{ row, $index }">
  599. <el-form-item label-width="0px">
  600. <el-input
  601. v-model="row.desce"
  602. type="textarea"
  603. clearable
  604. ></el-input>
  605. </el-form-item>
  606. </template>
  607. <template v-slot:startTime="{ row, $index }">
  608. <el-form-item
  609. label-width="0"
  610. :prop="'rewardsPunishments.' + $index + '.startTime'"
  611. :rules="{
  612. required: true,
  613. message: '请选择开始时间',
  614. trigger: ['blur', 'change']
  615. }"
  616. >
  617. <el-date-picker
  618. style="width: 100%"
  619. v-model="row.startTime"
  620. type="date"
  621. value-format="yyyy-MM-dd"
  622. placeholder="选择日期"
  623. >
  624. </el-date-picker>
  625. </el-form-item>
  626. </template>
  627. <template v-slot:endTime="{ row, $index }">
  628. <el-form-item
  629. label-width="0"
  630. :prop="'rewardsPunishments.' + $index + '.endTime'"
  631. :rules="{
  632. required: true,
  633. message: '请选择结束时间',
  634. trigger: ['blur', 'change']
  635. }"
  636. >
  637. <el-date-picker
  638. style="width: 100%"
  639. v-model="row.endTime"
  640. type="date"
  641. value-format="yyyy-MM-dd"
  642. placeholder="选择日期"
  643. >
  644. </el-date-picker>
  645. </el-form-item>
  646. </template>
  647. <template v-slot:status="{ row, $index }">
  648. <el-form-item
  649. label-width="0px"
  650. :prop="'rewardsPunishments.' + $index + '.status'"
  651. :rules="{
  652. required: true,
  653. message: '请选择生效状态',
  654. trigger: ['blur', 'change']
  655. }"
  656. >
  657. <el-select
  658. v-model="row.status"
  659. clearable
  660. filterable
  661. placeholder="请选择"
  662. >
  663. <el-option
  664. v-for="item in RPRecordsStatus"
  665. :key="item.value"
  666. :label="item.label"
  667. :value="item.value"
  668. >
  669. </el-option>
  670. </el-select>
  671. </el-form-item>
  672. </template>
  673. <template v-slot:fileAttach="{ row, $index }">
  674. <el-form-item
  675. label-width="0"
  676. :prop="'rewardsPunishments.' + $index + '.fileAttach'"
  677. >
  678. <fileUpload
  679. v-model="row.fileAttach"
  680. module="main"
  681. :showLib="false"
  682. :limit="5"
  683. />
  684. </el-form-item>
  685. </template>
  686. <template v-slot:remark="{ row, $index }">
  687. <el-form-item label-width="0px">
  688. <el-input v-model="row.remark" type="textarea"></el-input>
  689. </el-form-item>
  690. </template>
  691. <template v-slot:isRequired="{ column }">
  692. <span class="is-required">{{ column.label }}</span>
  693. </template>
  694. </ele-pro-table>
  695. </el-tab-pane>
  696. <el-tab-pane label="培训记录" name="training">
  697. <ele-pro-table
  698. ref="table"
  699. :columns="trainingColumns"
  700. :datasource="form.trainRecords"
  701. max-height="350px"
  702. :toolkit="[]"
  703. class="el-form-box"
  704. :need-page="false"
  705. >
  706. <!-- 表头工具栏 -->
  707. <template v-slot:toolbar>
  708. <el-button type="primary" @click="addTraining">添加</el-button>
  709. </template>
  710. <template v-slot:action="{ row, $index }">
  711. <el-link
  712. type="danger"
  713. :underline="false"
  714. icon="el-icon-delete"
  715. @click="handleTrainingDel(row, $index)"
  716. >删除
  717. </el-link>
  718. </template>
  719. <template v-slot:categoryLevelId="{ row, $index }"> </template>
  720. <template v-slot:title="{ row, $index }">
  721. <el-form-item
  722. label-width="0"
  723. :prop="'trainRecords.' + $index + '.title'"
  724. :rules="{
  725. required: true,
  726. message: '请填写培训标题',
  727. trigger: ['blur', 'change']
  728. }"
  729. >
  730. <el-input v-model="row.title" clearable></el-input>
  731. </el-form-item>
  732. </template>
  733. <template v-slot:desce="{ row, $index }">
  734. <el-form-item
  735. label-width="0px"
  736. :prop="'trainRecords.' + $index + '.desce'"
  737. >
  738. <el-input
  739. v-model="row.desce"
  740. type="textarea"
  741. clearable
  742. ></el-input>
  743. </el-form-item>
  744. </template>
  745. <template v-slot:startTime="{ row, $index }">
  746. <el-form-item
  747. label-width="0"
  748. :prop="'trainRecords.' + $index + '.startTime'"
  749. :rules="{
  750. required: true,
  751. message: '请选择开始时间',
  752. trigger: ['blur', 'change']
  753. }"
  754. >
  755. <el-date-picker
  756. style="width: 100%"
  757. v-model="row.startTime"
  758. type="datetime"
  759. value-format="yyyy-MM-dd HH:mm:ss"
  760. placeholder="选择日期"
  761. >
  762. </el-date-picker>
  763. </el-form-item>
  764. </template>
  765. <template v-slot:endTime="{ row, $index }">
  766. <el-form-item
  767. label-width="0"
  768. :prop="'trainRecords.' + $index + '.endTime'"
  769. :rules="{
  770. required: true,
  771. message: '请选择结束时间',
  772. trigger: ['blur', 'change']
  773. }"
  774. >
  775. <el-date-picker
  776. style="width: 100%"
  777. v-model="row.endTime"
  778. type="datetime"
  779. value-format="yyyy-MM-dd HH:mm:ss"
  780. placeholder="选择日期"
  781. >
  782. </el-date-picker>
  783. </el-form-item>
  784. </template>
  785. <template v-slot:status="{ row, $index }">
  786. <el-form-item
  787. label-width="0px"
  788. :prop="'trainRecords.' + $index + '.status'"
  789. :rules="{
  790. required: true,
  791. message: '请选择生效状态',
  792. trigger: ['blur', 'change']
  793. }"
  794. >
  795. <el-select
  796. v-model="row.status"
  797. clearable
  798. filterable
  799. placeholder="请选择"
  800. >
  801. <el-option
  802. v-for="item in trainingStatus"
  803. :key="item.value"
  804. :label="item.label"
  805. :value="item.value"
  806. >
  807. </el-option>
  808. </el-select>
  809. </el-form-item>
  810. </template>
  811. <template v-slot:fileAttach="{ row, $index }">
  812. <el-form-item
  813. label-width="0"
  814. :prop="'trainRecords.' + $index + '.fileAttach'"
  815. >
  816. <fileUpload
  817. v-model="row.fileAttach"
  818. module="main"
  819. :showLib="false"
  820. :limit="5"
  821. />
  822. </el-form-item>
  823. </template>
  824. <template v-slot:remark="{ row, $index }">
  825. <el-form-item label-width="0px">
  826. <el-input v-model="row.remark" type="textarea"></el-input>
  827. </el-form-item>
  828. </template>
  829. <template v-slot:isRequired="{ column }">
  830. <span class="is-required">{{ column.label }}</span>
  831. </template>
  832. </ele-pro-table>
  833. </el-tab-pane>
  834. <el-tab-pane label="考勤记录" name="attendance">
  835. <ele-pro-table
  836. ref="table"
  837. :columns="attendanceColumns"
  838. :datasource="form.attendanceRecords"
  839. max-height="350px"
  840. :toolkit="[]"
  841. class="el-form-box"
  842. :need-page="false"
  843. >
  844. <!-- 表头工具栏 -->
  845. <template v-slot:toolbar>
  846. <el-button type="primary" @click="addAttendance">添加</el-button>
  847. </template>
  848. <template v-slot:action="{ row, $index }">
  849. <el-link
  850. type="danger"
  851. :underline="false"
  852. icon="el-icon-delete"
  853. @click="handleAttendanceDel(row, $index)"
  854. >删除
  855. </el-link>
  856. </template>
  857. <template v-slot:type="{ row, $index }">
  858. <el-form-item
  859. label-width="0"
  860. :prop="'attendanceRecords.' + $index + '.type'"
  861. :rules="{
  862. required: true,
  863. message: '请选择考勤类型',
  864. trigger: ['blur', 'change']
  865. }"
  866. >
  867. <el-select
  868. v-model="row.type"
  869. clearable
  870. filterable
  871. placeholder="请选择"
  872. >
  873. <el-option
  874. v-for="item in attendanceType"
  875. :key="item.value"
  876. :label="item.label"
  877. :value="item.value"
  878. >
  879. </el-option>
  880. </el-select>
  881. </el-form-item>
  882. </template>
  883. <template v-slot:checkTime="{ row, $index }">
  884. <el-form-item
  885. label-width="0"
  886. :prop="'attendanceRecords.' + $index + '.checkTime'"
  887. :rules="{
  888. required: true,
  889. message: '请选择签到时间',
  890. trigger: ['blur', 'change']
  891. }"
  892. >
  893. <el-date-picker
  894. style="width: 100%"
  895. v-model="row.checkTime"
  896. type="datetime"
  897. value-format="yyyy-MM-dd HH:mm:ss"
  898. placeholder="选择日期"
  899. >
  900. </el-date-picker>
  901. </el-form-item>
  902. </template>
  903. <template v-slot:belateTime="{ row, $index }">
  904. <el-form-item
  905. label-width="0"
  906. :prop="'attendanceRecords.' + $index + '.belateTime'"
  907. >
  908. <el-date-picker
  909. style="width: 100%"
  910. v-model="row.belateTime"
  911. type="datetime"
  912. value-format="yyyy-MM-dd HH:mm:ss"
  913. placeholder="选择日期"
  914. >
  915. </el-date-picker>
  916. </el-form-item>
  917. </template>
  918. <template v-slot:leaveEarlyTime="{ row, $index }">
  919. <el-form-item
  920. label-width="0"
  921. :prop="'attendanceRecords.' + $index + '.leaveEarlyTime'"
  922. >
  923. <el-date-picker
  924. style="width: 100%"
  925. v-model="row.leaveEarlyTime"
  926. type="datetime"
  927. value-format="yyyy-MM-dd HH:mm:ss"
  928. placeholder="选择日期"
  929. >
  930. </el-date-picker>
  931. </el-form-item>
  932. </template>
  933. <template v-slot:fileAttach="{ row, $index }">
  934. <el-form-item
  935. label-width="0"
  936. :prop="'attendanceRecords.' + $index + '.fileAttach'"
  937. >
  938. <fileUpload
  939. v-model="row.fileAttach"
  940. module="main"
  941. :showLib="false"
  942. :limit="5"
  943. />
  944. </el-form-item>
  945. </template>
  946. <template v-slot:isRequired="{ column }">
  947. <span class="is-required">{{ column.label }}</span>
  948. </template>
  949. </ele-pro-table>
  950. </el-tab-pane>
  951. <el-tab-pane label="劳动合同" name="contracts">
  952. <ele-pro-table
  953. ref="table"
  954. :columns="contractsColumns"
  955. :datasource="form.contracts"
  956. max-height="350px"
  957. :toolkit="[]"
  958. class="el-form-box"
  959. :need-page="false"
  960. >
  961. <!-- 表头工具栏 -->
  962. <template v-slot:toolbar>
  963. <el-button type="primary" @click="addcontracts">添加</el-button>
  964. </template>
  965. <template v-slot:action="{ row, $index }">
  966. <el-link
  967. type="danger"
  968. :underline="false"
  969. icon="el-icon-delete"
  970. @click="handleContractsDel(row, $index)"
  971. >删除
  972. </el-link>
  973. </template>
  974. <template v-slot:categoryLevelId="{ row, $index }">
  975. <el-form-item
  976. label-width="0"
  977. :prop="'contracts.' + $index + '.categoryLevelId'"
  978. >
  979. </el-form-item>
  980. </template>
  981. <template v-slot:name="{ row, $index }">
  982. <el-form-item
  983. label-width="0px"
  984. :prop="'contracts.' + $index + '.name'"
  985. :rules="{
  986. required: true,
  987. message: '请填写合同名称',
  988. trigger: ['blur', 'change']
  989. }"
  990. >
  991. <el-input v-model="row.name" clearable></el-input>
  992. </el-form-item>
  993. </template>
  994. <template v-slot:signTime="{ row, $index }">
  995. <el-form-item
  996. label-width="0"
  997. :prop="'contracts.' + $index + '.signTime'"
  998. :rules="{
  999. required: true,
  1000. message: '请选择签订时间',
  1001. trigger: ['blur', 'change']
  1002. }"
  1003. >
  1004. <el-date-picker
  1005. style="width: 100%"
  1006. v-model="row.signTime"
  1007. type="date"
  1008. value-format="yyyy-MM-dd"
  1009. placeholder="选择日期"
  1010. >
  1011. </el-date-picker>
  1012. </el-form-item>
  1013. </template>
  1014. <template v-slot:startTime="{ row, $index }">
  1015. <el-form-item
  1016. label-width="0"
  1017. :prop="'contracts.' + $index + '.startTime'"
  1018. :rules="{
  1019. required: true,
  1020. message: '请选择开始时间',
  1021. trigger: ['blur', 'change']
  1022. }"
  1023. >
  1024. <el-date-picker
  1025. style="width: 100%"
  1026. v-model="row.startTime"
  1027. type="date"
  1028. value-format="yyyy-MM-dd"
  1029. placeholder="选择日期"
  1030. >
  1031. </el-date-picker>
  1032. </el-form-item>
  1033. </template>
  1034. <template v-slot:endTime="{ row, $index }">
  1035. <el-form-item
  1036. label-width="0"
  1037. :prop="'contracts.' + $index + '.endTime'"
  1038. :rules="{
  1039. required: true,
  1040. message: '请选择结束时间',
  1041. trigger: ['blur', 'change']
  1042. }"
  1043. >
  1044. <el-date-picker
  1045. style="width: 100%"
  1046. v-model="row.endTime"
  1047. type="date"
  1048. value-format="yyyy-MM-dd"
  1049. placeholder="选择日期"
  1050. >
  1051. </el-date-picker>
  1052. </el-form-item>
  1053. </template>
  1054. <template v-slot:status="{ row, $index }">
  1055. <el-form-item
  1056. label-width="0px"
  1057. :prop="'contracts.' + $index + '.status'"
  1058. :rules="{
  1059. required: true,
  1060. message: '请选择生效状态',
  1061. trigger: ['blur', 'change']
  1062. }"
  1063. >
  1064. <el-select
  1065. v-model="row.status"
  1066. clearable
  1067. filterable
  1068. placeholder="请选择"
  1069. >
  1070. <el-option
  1071. v-for="item in contractsStatus"
  1072. :key="item.value"
  1073. :label="item.label"
  1074. :value="item.value"
  1075. >
  1076. </el-option>
  1077. </el-select>
  1078. </el-form-item>
  1079. </template>
  1080. <template v-slot:fileAttach="{ row, $index }">
  1081. <el-form-item
  1082. label-width="0"
  1083. :prop="'contracts.' + $index + '.fileAttach'"
  1084. >
  1085. <fileUpload
  1086. v-model="row.fileAttach"
  1087. module="main"
  1088. :showLib="false"
  1089. :limit="5"
  1090. />
  1091. </el-form-item>
  1092. </template>
  1093. <template v-slot:remark="{ row, $index }">
  1094. <el-form-item label-width="0px">
  1095. <el-input v-model="row.remark" type="textarea"></el-input>
  1096. </el-form-item>
  1097. </template>
  1098. <template v-slot:isRequired="{ column }">
  1099. <span class="is-required">{{ column.label }}</span>
  1100. </template>
  1101. </ele-pro-table>
  1102. </el-tab-pane>
  1103. <el-tab-pane label="工种" name="jobManagement">
  1104. <ele-pro-table
  1105. ref="table"
  1106. :columns="jobColumns"
  1107. :datasource="form.professions"
  1108. max-height="350px"
  1109. :toolkit="[]"
  1110. class="el-form-box"
  1111. :need-page="false"
  1112. >
  1113. <!-- 表头工具栏 -->
  1114. <template v-slot:toolbar>
  1115. <el-button type="primary" @click="$refs.aptitudeDialogRef.open()"
  1116. >添加</el-button
  1117. >
  1118. </template>
  1119. <template v-slot:action="{ row, $index }">
  1120. <el-link
  1121. type="danger"
  1122. :underline="false"
  1123. icon="el-icon-delete"
  1124. @click="deleteJob($index)"
  1125. >删除
  1126. </el-link>
  1127. </template>
  1128. </ele-pro-table>
  1129. </el-tab-pane>
  1130. </el-tabs>
  1131. </el-form>
  1132. <template v-slot:footer>
  1133. <el-button @click="updateVisible(false)">取消</el-button>
  1134. <el-button
  1135. type="primary"
  1136. :loading="loading"
  1137. @click="save"
  1138. v-if="!disabled"
  1139. >
  1140. 保存
  1141. </el-button>
  1142. </template>
  1143. <aptitudeDialog
  1144. ref="aptitudeDialogRef"
  1145. @success="chooseAptitude"
  1146. :disabledIds="form.professions?.map((item) => item.id)"
  1147. ></aptitudeDialog>
  1148. <critical-process
  1149. ref="criticalProcessRef"
  1150. @chooseProcess="chooseProcess"
  1151. ></critical-process>
  1152. </ele-modal>
  1153. </template>
  1154. <script>
  1155. import { emailReg, phoneReg } from 'ele-admin';
  1156. import OrgSelect from './org-select.vue';
  1157. import RoleSelect from '@/views/system/user/components/role-select.vue';
  1158. import RegionsSelect from '@/components/RegionsSelect/index.vue';
  1159. import { getNotBoundAccount } from '@/api/system/user';
  1160. import {
  1161. getUserDetail,
  1162. saveOrUpdateUser,
  1163. createPersonal,
  1164. checkExistence
  1165. } from '@/api/system/organization';
  1166. import { getFactoryarea, getProfessionPageList } from '@/api/factoryModel';
  1167. import WithView from '@/components/upload/WithView.vue';
  1168. import FileUpload from '@/components/upload/fileUpload.vue';
  1169. import dictMixins from '@/mixins/dictMixins';
  1170. import aptitudeDialog from '@/views/factoryModel/jobManagement/components/aptitudeDialog.vue';
  1171. import criticalProcess from './criticalProcess.vue';
  1172. import { parameterGetByCode } from '@/api/system/dictionary/index.js';
  1173. // D:\中赢\kd-aiot-frontend\src\views\system\user
  1174. export default {
  1175. mixins: [dictMixins],
  1176. components: {
  1177. OrgSelect,
  1178. RoleSelect,
  1179. RegionsSelect,
  1180. WithView,
  1181. FileUpload,
  1182. aptitudeDialog,
  1183. criticalProcess
  1184. },
  1185. props: {
  1186. // 弹窗是否打开
  1187. visible: Boolean,
  1188. // 修改回显的数据
  1189. data: Object,
  1190. // 全部机构
  1191. organizationList: Array,
  1192. //
  1193. institutionList: Array,
  1194. // 机构id
  1195. organizationId: [Number, String]
  1196. },
  1197. data() {
  1198. const defaultForm = {
  1199. id: null,
  1200. identityPhotos: [],
  1201. skills: [],
  1202. rewardsPunishments: [],
  1203. trainRecords: [],
  1204. attendanceRecords: [],
  1205. contracts: [],
  1206. deptIds: [],
  1207. deptName: '',
  1208. isEnabled: 1,
  1209. groupId: null,
  1210. groupName: null,
  1211. name: '',
  1212. sex: null,
  1213. email: '',
  1214. phone: '',
  1215. age: '',
  1216. accountId: '',
  1217. factoryId: '',
  1218. idCard: '',
  1219. workTypeId: '',
  1220. birthday: '',
  1221. signature: {},
  1222. postName: '',
  1223. professions: [],
  1224. censusAddress: '',
  1225. criticalTaskList: []
  1226. };
  1227. return {
  1228. defaultForm,
  1229. isCategory: '0', //是否启用个人电子签。0 不启用,1启用
  1230. // 表单数据
  1231. form: { ...defaultForm },
  1232. disabled: false,
  1233. activeName: 'identityPhotos',
  1234. // 表单验证规则
  1235. rules: {
  1236. groupId: [
  1237. { required: true, message: '请选择所属机构', trigger: 'blur' }
  1238. ],
  1239. name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
  1240. sex: [{ required: true, message: '请选择性别', trigger: 'blur' }],
  1241. email: [
  1242. { pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur' }
  1243. ],
  1244. phone: [
  1245. { required: true, message: '请输入手机号', trigger: 'blur' },
  1246. { pattern: phoneReg, message: '手机号格式不正确', trigger: 'blur' }
  1247. ],
  1248. jobNumber: [
  1249. {
  1250. required: true,
  1251. trigger: 'blur'
  1252. }
  1253. ],
  1254. status: [
  1255. { required: true, message: '请选择员工状态', trigger: 'blur' }
  1256. ],
  1257. joinDate: [
  1258. {
  1259. required: true,
  1260. message: '请选择入职时间',
  1261. trigger: ['blur', 'change']
  1262. }
  1263. ]
  1264. },
  1265. // 提交状态
  1266. loading: false,
  1267. // 是否是修改
  1268. isUpdate: false,
  1269. city: '',
  1270. factoryList: [],
  1271. levelOptions: [
  1272. {
  1273. label: '初级',
  1274. value: '1'
  1275. },
  1276. {
  1277. label: '中级',
  1278. value: '2'
  1279. },
  1280. {
  1281. label: '高级',
  1282. value: '3'
  1283. }
  1284. ],
  1285. RPRecordsStatus: [
  1286. {
  1287. label: '未生效',
  1288. value: 0
  1289. },
  1290. {
  1291. label: '审核中',
  1292. value: 1
  1293. },
  1294. {
  1295. label: '生效中',
  1296. value: 2
  1297. },
  1298. {
  1299. label: '已过期',
  1300. value: 3
  1301. },
  1302. {
  1303. label: '无效',
  1304. value: 4
  1305. }
  1306. ],
  1307. RPRecordsType: [
  1308. {
  1309. label: '未分类',
  1310. value: 0
  1311. },
  1312. {
  1313. label: '奖励',
  1314. value: 1
  1315. },
  1316. {
  1317. label: '惩罚',
  1318. value: 2
  1319. }
  1320. ],
  1321. trainingStatus: [
  1322. {
  1323. label: '未开始',
  1324. value: 0
  1325. },
  1326. {
  1327. label: '进行中',
  1328. value: 1
  1329. },
  1330. {
  1331. label: '已完成',
  1332. value: 2
  1333. },
  1334. {
  1335. label: '取消',
  1336. value: 4
  1337. }
  1338. ],
  1339. contractsStatus: [
  1340. {
  1341. label: '未生效',
  1342. value: 0
  1343. },
  1344. {
  1345. label: '审核中',
  1346. value: 1
  1347. },
  1348. {
  1349. label: '生效中',
  1350. value: 2
  1351. },
  1352. {
  1353. label: '过期',
  1354. value: 3
  1355. },
  1356. {
  1357. label: '转续签',
  1358. value: 4
  1359. }
  1360. ],
  1361. attendanceType: [
  1362. {
  1363. label: '未分类',
  1364. value: 0
  1365. },
  1366. {
  1367. label: '上班打卡',
  1368. value: 1
  1369. },
  1370. {
  1371. label: '下班打卡',
  1372. value: 2
  1373. }
  1374. ],
  1375. statusOptions: [
  1376. { value: 1, label: '全职' },
  1377. { value: 2, label: '兼职' },
  1378. { value: 3, label: '实习' },
  1379. { value: 4, label: '正式' },
  1380. { value: 5, label: '试用' },
  1381. { value: 6, label: '离职' }
  1382. ],
  1383. accountList: [],
  1384. levelOptions: [
  1385. {
  1386. label: '初级',
  1387. value: '1'
  1388. },
  1389. {
  1390. label: '中级',
  1391. value: '2'
  1392. },
  1393. {
  1394. label: '高级',
  1395. value: '3'
  1396. }
  1397. ],
  1398. deptTree: [],
  1399. defaultProps: {
  1400. multiple: true,
  1401. checkStrictly: true,
  1402. emitPath: false,
  1403. children: 'children',
  1404. value: 'id',
  1405. label: 'name'
  1406. },
  1407. professionList: []
  1408. };
  1409. },
  1410. computed: {
  1411. // 是否开启响应式布局
  1412. styleResponsive() {
  1413. return this.$store.state.theme.styleResponsive;
  1414. },
  1415. organization() {
  1416. return this.setList(this.organizationList);
  1417. },
  1418. identityPhotosColumns() {
  1419. return [
  1420. {
  1421. label: '序号',
  1422. type: 'index',
  1423. width: 55,
  1424. align: 'center'
  1425. },
  1426. {
  1427. label: '证照类型',
  1428. prop: 'type',
  1429. slot: 'type',
  1430. headerSlot: 'isRequired',
  1431. minWidth: 120,
  1432. align: 'center'
  1433. },
  1434. {
  1435. label: '证照编号',
  1436. prop: 'code',
  1437. slot: 'code',
  1438. headerSlot: 'isRequired',
  1439. minWidth: 120,
  1440. align: 'center'
  1441. },
  1442. {
  1443. label: '等级',
  1444. prop: 'level',
  1445. slot: 'level',
  1446. minWidth: 120,
  1447. align: 'center'
  1448. },
  1449. {
  1450. label: '有效期开始时间',
  1451. prop: 'validityStartTime',
  1452. slot: 'validityStartTime',
  1453. headerSlot: 'isRequired',
  1454. minWidth: 150,
  1455. align: 'center'
  1456. },
  1457. {
  1458. label: '有效期结束时间',
  1459. prop: 'validityEndTime',
  1460. slot: 'validityEndTime',
  1461. headerSlot: 'isRequired',
  1462. minWidth: 150,
  1463. align: 'center'
  1464. },
  1465. {
  1466. label: '颁布日期',
  1467. prop: 'enactorTime',
  1468. slot: 'enactorTime',
  1469. minWidth: 150,
  1470. align: 'center'
  1471. },
  1472. {
  1473. label: '证照附件',
  1474. prop: 'fileObj',
  1475. slot: 'fileObj',
  1476. minWidth: 200,
  1477. align: 'center'
  1478. },
  1479. {
  1480. label: '状态',
  1481. prop: 'status',
  1482. slot: 'status',
  1483. headerSlot: 'isRequired',
  1484. minWidth: 100,
  1485. align: 'center'
  1486. },
  1487. {
  1488. label: '备注',
  1489. prop: 'remark',
  1490. slot: 'remark',
  1491. minWidth: 120,
  1492. align: 'center'
  1493. },
  1494. {
  1495. action: 'action',
  1496. slot: 'action',
  1497. label: '操作',
  1498. align: 'center'
  1499. }
  1500. ];
  1501. },
  1502. skillsColumns() {
  1503. return [
  1504. {
  1505. label: '序号',
  1506. type: 'index',
  1507. width: 55,
  1508. align: 'center'
  1509. },
  1510. {
  1511. label: '分类',
  1512. prop: 'categoryLevelId',
  1513. slot: 'categoryLevelId',
  1514. minWidth: 120,
  1515. align: 'center'
  1516. },
  1517. {
  1518. label: '技能名称',
  1519. prop: 'name',
  1520. slot: 'name',
  1521. headerSlot: 'isRequired',
  1522. minWidth: 120,
  1523. align: 'center'
  1524. },
  1525. {
  1526. label: '技能等级',
  1527. prop: 'level',
  1528. slot: 'level',
  1529. minWidth: 130,
  1530. align: 'center'
  1531. },
  1532. {
  1533. label: '技能经验(年限)',
  1534. prop: 'years',
  1535. slot: 'years',
  1536. minWidth: 130,
  1537. align: 'center'
  1538. },
  1539. {
  1540. label: '证照附件',
  1541. prop: 'fileAttach',
  1542. slot: 'fileAttach',
  1543. minWidth: 130,
  1544. align: 'center'
  1545. },
  1546. {
  1547. label: '备注',
  1548. prop: 'remark',
  1549. slot: 'remark',
  1550. minWidth: 120,
  1551. align: 'center'
  1552. },
  1553. {
  1554. action: 'action',
  1555. slot: 'action',
  1556. label: '操作',
  1557. align: 'center'
  1558. }
  1559. ];
  1560. },
  1561. RPRecordsColumns() {
  1562. return [
  1563. {
  1564. label: '序号',
  1565. type: 'index',
  1566. width: 55,
  1567. align: 'center'
  1568. },
  1569. {
  1570. label: '奖惩类型',
  1571. prop: 'type',
  1572. slot: 'type',
  1573. headerSlot: 'isRequired',
  1574. minWidth: 120,
  1575. align: 'center'
  1576. },
  1577. {
  1578. label: '奖惩说明',
  1579. prop: 'desce',
  1580. slot: 'desce',
  1581. minWidth: 120,
  1582. align: 'center'
  1583. },
  1584. {
  1585. label: '开始时间',
  1586. prop: 'startTime',
  1587. slot: 'startTime',
  1588. headerSlot: 'isRequired',
  1589. minWidth: 130,
  1590. align: 'center'
  1591. },
  1592. {
  1593. label: '结束时间',
  1594. prop: 'endTime',
  1595. slot: 'endTime',
  1596. headerSlot: 'isRequired',
  1597. minWidth: 130,
  1598. align: 'center'
  1599. },
  1600. {
  1601. label: '证照附件',
  1602. prop: 'fileAttach',
  1603. slot: 'fileAttach',
  1604. minWidth: 130,
  1605. align: 'center'
  1606. },
  1607. {
  1608. label: '生效状态',
  1609. prop: 'status',
  1610. slot: 'status',
  1611. headerSlot: 'isRequired',
  1612. minWidth: 120,
  1613. align: 'center'
  1614. },
  1615. {
  1616. label: '备注',
  1617. prop: 'remark',
  1618. slot: 'remark',
  1619. minWidth: 120,
  1620. align: 'center'
  1621. },
  1622. {
  1623. action: 'action',
  1624. slot: 'action',
  1625. label: '操作',
  1626. align: 'center'
  1627. }
  1628. ];
  1629. },
  1630. trainingColumns() {
  1631. return [
  1632. {
  1633. label: '序号',
  1634. type: 'index',
  1635. width: 55,
  1636. align: 'center'
  1637. },
  1638. {
  1639. label: '分类',
  1640. prop: 'categoryLevelId',
  1641. slot: 'categoryLevelId',
  1642. minWidth: 120,
  1643. align: 'center'
  1644. },
  1645. {
  1646. label: '培训标题',
  1647. prop: 'title',
  1648. slot: 'title',
  1649. headerSlot: 'isRequired',
  1650. minWidth: 120,
  1651. align: 'center'
  1652. },
  1653. {
  1654. label: '培训说明',
  1655. prop: 'desce',
  1656. slot: 'desce',
  1657. minWidth: 120,
  1658. align: 'center'
  1659. },
  1660. {
  1661. label: '开始时间',
  1662. prop: 'startTime',
  1663. slot: 'startTime',
  1664. headerSlot: 'isRequired',
  1665. minWidth: 130,
  1666. align: 'center'
  1667. },
  1668. {
  1669. label: '结束时间',
  1670. prop: 'endTime',
  1671. slot: 'endTime',
  1672. headerSlot: 'isRequired',
  1673. minWidth: 130,
  1674. align: 'center'
  1675. },
  1676. {
  1677. label: '附件',
  1678. prop: 'fileAttach',
  1679. slot: 'fileAttach',
  1680. minWidth: 130,
  1681. align: 'center'
  1682. },
  1683. {
  1684. label: '生效状态',
  1685. prop: 'status',
  1686. slot: 'status',
  1687. headerSlot: 'isRequired',
  1688. minWidth: 120,
  1689. align: 'center'
  1690. },
  1691. {
  1692. label: '备注',
  1693. prop: 'remark',
  1694. slot: 'remark',
  1695. minWidth: 120,
  1696. align: 'center'
  1697. },
  1698. {
  1699. action: 'action',
  1700. slot: 'action',
  1701. label: '操作',
  1702. align: 'center'
  1703. }
  1704. ];
  1705. },
  1706. attendanceColumns() {
  1707. return [
  1708. {
  1709. label: '序号',
  1710. type: 'index',
  1711. width: 55,
  1712. align: 'center'
  1713. },
  1714. {
  1715. label: '考勤类型',
  1716. prop: 'type',
  1717. slot: 'type',
  1718. headerSlot: 'isRequired',
  1719. minWidth: 120,
  1720. align: 'center'
  1721. },
  1722. {
  1723. label: '签到时间',
  1724. prop: 'checkTime',
  1725. slot: 'checkTime',
  1726. headerSlot: 'isRequired',
  1727. minWidth: 120,
  1728. align: 'center'
  1729. },
  1730. // {
  1731. // label: '迟到时间偏差值',
  1732. // prop: 'belateTime',
  1733. // minWidth: 120,
  1734. // align: "center"
  1735. // },
  1736. // {
  1737. // label: '早退时间偏差值',
  1738. // prop: 'leaveEarlyTime',
  1739. // minWidth: 130,
  1740. // align: "center"
  1741. // },
  1742. {
  1743. label: '附件',
  1744. prop: 'fileAttach',
  1745. slot: 'fileAttach',
  1746. minWidth: 130,
  1747. align: 'center'
  1748. },
  1749. {
  1750. action: 'action',
  1751. slot: 'action',
  1752. label: '操作',
  1753. align: 'center'
  1754. }
  1755. ];
  1756. },
  1757. contractsColumns() {
  1758. return [
  1759. {
  1760. label: '序号',
  1761. type: 'index',
  1762. width: 55,
  1763. align: 'center'
  1764. },
  1765. {
  1766. label: '分类',
  1767. prop: 'categoryLevelId',
  1768. slot: 'categoryLevelId',
  1769. minWidth: 120,
  1770. align: 'center'
  1771. },
  1772. {
  1773. label: '合同名称',
  1774. prop: 'name',
  1775. slot: 'name',
  1776. headerSlot: 'isRequired',
  1777. minWidth: 120,
  1778. align: 'center'
  1779. },
  1780. {
  1781. label: '签订时间',
  1782. prop: 'signTime',
  1783. slot: 'startTime',
  1784. headerSlot: 'isRequired',
  1785. minWidth: 130,
  1786. align: 'center'
  1787. },
  1788. {
  1789. label: '开始时间',
  1790. prop: 'startTime',
  1791. slot: 'startTime',
  1792. headerSlot: 'isRequired',
  1793. minWidth: 130,
  1794. align: 'center'
  1795. },
  1796. {
  1797. label: '结束时间',
  1798. prop: 'endTime',
  1799. slot: 'endTime',
  1800. headerSlot: 'isRequired',
  1801. minWidth: 130,
  1802. align: 'center'
  1803. },
  1804. {
  1805. label: '合同附件',
  1806. prop: 'fileAttach',
  1807. slot: 'fileAttach',
  1808. minWidth: 130,
  1809. align: 'center'
  1810. },
  1811. {
  1812. label: '生效状态',
  1813. prop: 'status',
  1814. slot: 'status',
  1815. headerSlot: 'isRequired',
  1816. minWidth: 120,
  1817. align: 'center'
  1818. },
  1819. {
  1820. label: '备注',
  1821. prop: 'remark',
  1822. slot: 'remark',
  1823. minWidth: 120,
  1824. align: 'center'
  1825. },
  1826. {
  1827. action: 'action',
  1828. slot: 'action',
  1829. label: '操作',
  1830. align: 'center'
  1831. }
  1832. ];
  1833. },
  1834. jobColumns() {
  1835. return [
  1836. {
  1837. label: '序号',
  1838. type: 'index',
  1839. width: 55,
  1840. align: 'center'
  1841. },
  1842. {
  1843. slot: 'type',
  1844. label: '类型',
  1845. showOverflowTooltip: true,
  1846. align: 'center',
  1847. minWidth: 110,
  1848. formatter: (_row) => {
  1849. return this.getDictValue('工种类型', _row.type);
  1850. }
  1851. },
  1852. {
  1853. align: 'center',
  1854. prop: 'code',
  1855. label: '编码',
  1856. showOverflowTooltip: true,
  1857. minWidth: 110
  1858. },
  1859. {
  1860. slot: 'name',
  1861. prop: 'name',
  1862. label: '名称',
  1863. showOverflowTooltip: true,
  1864. align: 'center',
  1865. minWidth: 110
  1866. },
  1867. {
  1868. slot: 'level',
  1869. prop: 'level',
  1870. label: '等级',
  1871. showOverflowTooltip: true,
  1872. align: 'center',
  1873. minWidth: 110,
  1874. formatter: (_row) => {
  1875. return this.levelOptions.filter(
  1876. (item) => _row.level == item.value
  1877. )[0].label;
  1878. }
  1879. },
  1880. {
  1881. slot: 'hourCost',
  1882. prop: 'hourCost',
  1883. label: '标准工时费',
  1884. showOverflowTooltip: true,
  1885. align: 'center',
  1886. minWidth: 110
  1887. },
  1888. {
  1889. slot: 'unit',
  1890. prop: 'unit',
  1891. label: '工时费单位',
  1892. showOverflowTooltip: true,
  1893. align: 'center',
  1894. minWidth: 110
  1895. },
  1896. {
  1897. columnKey: 'action',
  1898. label: '操作',
  1899. width: 260,
  1900. align: 'center',
  1901. resizable: false,
  1902. slot: 'action',
  1903. showOverflowTooltip: true
  1904. }
  1905. ];
  1906. }
  1907. },
  1908. created() {
  1909. this.getFactoryList();
  1910. console.log(this.institutionList, '========');
  1911. this.getProfessionList();
  1912. parameterGetByCode({
  1913. code: 'main_is_personal_electronic_signature'
  1914. }).then((res) => {
  1915. this.isCategory = res.value;
  1916. });
  1917. },
  1918. methods: {
  1919. chooseAptitude(data) {
  1920. console.log(data);
  1921. this.form.professions.push(...data);
  1922. },
  1923. deleteJob(index) {
  1924. this.form.professions.splice(index, 1);
  1925. },
  1926. idCardChange() {
  1927. // 检查身份证号是否为18位
  1928. if (this.form.idCard.length === 18) {
  1929. // 提取出生日期部分(YYYYMMDD)并转换为YYYY-MM-DD格式
  1930. const birthDatePart = this.form.idCard.substr(6, 8); // 获取YYYYMMDD部分
  1931. const year = birthDatePart.substr(0, 4); // 年份
  1932. const month = birthDatePart.substr(4, 2); // 月份
  1933. const day = birthDatePart.substr(6, 2); // 日期
  1934. this.form.birthday = `${year}-${month}-${day}`; // 格式化日期并存储到data中
  1935. const birthDate = new Date(year, month - 1, day); // 月份是从0开始的,所以要减1
  1936. const now = new Date();
  1937. this.form.age = now.getFullYear() - birthDate.getFullYear();
  1938. const monthDifference = now.getMonth() - birthDate.getMonth();
  1939. if (
  1940. monthDifference < 0 ||
  1941. (monthDifference === 0 && now.getDate() < birthDate.getDate())
  1942. ) {
  1943. this.form.age--;
  1944. }
  1945. }
  1946. },
  1947. async getProfessionList() {
  1948. const res = await getProfessionPageList({
  1949. pageNum: 1,
  1950. size: 9999
  1951. });
  1952. this.professionList = res.list || [];
  1953. },
  1954. setList(list) {
  1955. return list.map((val) => {
  1956. val['disabled'] = val.id == this.form.groupId;
  1957. if (val.children) {
  1958. val.children = this.setList(val.children);
  1959. }
  1960. return val;
  1961. });
  1962. },
  1963. addIdentityPhotos() {
  1964. this.form.identityPhotos.push({
  1965. holder: this.form.name,
  1966. holderType: '1'
  1967. });
  1968. },
  1969. handleIdentityPhotosDel(row, index) {
  1970. this.form.identityPhotos.splice(index, 1);
  1971. },
  1972. addSkills() {
  1973. this.form.skills.push({});
  1974. },
  1975. handleSkillsDel(row, index) {
  1976. this.form.skills.splice(index, 1);
  1977. },
  1978. addRPRecords() {
  1979. this.form.rewardsPunishments.push({});
  1980. },
  1981. handleRPRecordsDel(row, index) {
  1982. this.form.rewardsPunishments.splice(index, 1);
  1983. },
  1984. addTraining() {
  1985. this.form.trainRecords.push({});
  1986. },
  1987. handleTrainingDel(row, index) {
  1988. this.form.trainRecords.splice(index, 1);
  1989. },
  1990. addAttendance() {
  1991. this.form.attendanceRecords.push({});
  1992. },
  1993. handleAttendanceDel(row, index) {
  1994. this.form.attendanceRecords.splice(index, 1);
  1995. },
  1996. addcontracts() {
  1997. this.form.contracts.push({});
  1998. },
  1999. handleContractsDel(row, index) {
  2000. this.form.contracts.splice(index, 1);
  2001. },
  2002. getAccountList() {
  2003. getNotBoundAccount().then((res) => {
  2004. this.accountList = res;
  2005. });
  2006. },
  2007. setDisabled(disabled) {
  2008. this.disabled = disabled;
  2009. this.getProfessionList();
  2010. },
  2011. async getFactoryList() {
  2012. const { list } = await getFactoryarea({
  2013. pageNum: 1,
  2014. size: 999,
  2015. type: 1
  2016. });
  2017. this.factoryList = list || [];
  2018. },
  2019. // chooseOperation() {
  2020. // this.$refs.criticalProcessRef.open();
  2021. // },
  2022. chooseProcess(listData) {
  2023. this.form.criticalTaskList = listData.map((item) => ({
  2024. taskId: item.id,
  2025. taskName: item.name
  2026. }));
  2027. },
  2028. removeOperation(index) {
  2029. this.form.criticalTaskList.splice(index, 1);
  2030. },
  2031. chooseOperation() {
  2032. const list = this.form.criticalTaskList.map((item) => ({
  2033. id: item.taskId,
  2034. taskId: item.taskId,
  2035. taskName: item.taskName,
  2036. name: item.taskName
  2037. }));
  2038. this.$refs.criticalProcessRef.open(list, 'single');
  2039. },
  2040. /* 表格行校验失败时,在提示文案后面补上行号 */
  2041. getValidateMessage(field, errors) {
  2042. const message = (errors && errors[0] && errors[0].message) || '';
  2043. const fields = String(field || '').split('.');
  2044. if (fields.length > 2 && /^\d+$/.test(fields[1])) {
  2045. return `${message}(第 ${Number(fields[1]) + 1} 行)`;
  2046. }
  2047. return message;
  2048. },
  2049. /* 保存编辑 */
  2050. save() {
  2051. this.$refs.form.validate((valid, obj) => {
  2052. if (obj) {
  2053. const fields = Object.keys(obj);
  2054. if (fields.length > 0) {
  2055. this.$message.warning(
  2056. this.getValidateMessage(fields[0], obj[fields[0]])
  2057. );
  2058. }
  2059. }
  2060. if (!valid) {
  2061. return false;
  2062. }
  2063. this.loading = true;
  2064. this.form.addressId = this.city
  2065. ? this.city[this.city.length - 1]
  2066. : '';
  2067. // if (this.deptTree.length > 0) {
  2068. // this.deptTree.forEach(i => {
  2069. // this.form.deptIds.push(i[i.length - 1])
  2070. // })
  2071. //
  2072. // this.form['deptTree'] = JSON.stringify(this.deptTree)
  2073. // }
  2074. let formData = JSON.parse(JSON.stringify(this.form));
  2075. if (formData.postId) {
  2076. formData.postName = formData.postId
  2077. .map((item) => this.getDictValue('岗位', item))
  2078. .toString();
  2079. formData.postId = formData.postId.toString();
  2080. }
  2081. if (formData.professions?.length) {
  2082. formData.professionId = formData.professions
  2083. .map((item) => item.id)
  2084. .toString();
  2085. }
  2086. const data = {
  2087. ...formData
  2088. };
  2089. if (!this.isUpdate) {
  2090. delete data.id;
  2091. }
  2092. if (!Array.isArray(data.signature)) {
  2093. data.signature = [data.signature].filter(
  2094. (item) => Boolean(item) && Object.keys(item).length !== 0
  2095. );
  2096. }
  2097. saveOrUpdateUser(data)
  2098. .then((msg) => {
  2099. this.loading = false;
  2100. if (this.isUpdate) {
  2101. this.$message.success('人员信息编辑成功');
  2102. } else {
  2103. this.$message.success('人员新增成功');
  2104. //新建人员后创建个人文件夹
  2105. createPersonal(msg);
  2106. }
  2107. this.updateVisible(false);
  2108. this.$emit('done');
  2109. })
  2110. .catch((e) => {
  2111. this.loading = false;
  2112. // this.$message.error(e.message);
  2113. });
  2114. });
  2115. },
  2116. /* 更新visible */
  2117. updateVisible(value) {
  2118. this.$emit('update:visible', value);
  2119. },
  2120. handleChange() {
  2121. let arr = Array.from(this.$refs.deptRef.getCheckedNodes());
  2122. this.form.deptName = arr.map((i) => i.label).join('/') || '';
  2123. this.form.deptIds = this.form.deptIds || [];
  2124. },
  2125. checkedKeys(value) {
  2126. this.getLabelName(this.institutionList, (i) => {
  2127. if (i.id == this.form.groupId) {
  2128. return (this.form.groupName = i.name);
  2129. }
  2130. });
  2131. this.form.deptIds = this.form.deptIds.filter(
  2132. (item) => item != this.form.groupId
  2133. );
  2134. console.log(this.form.groupName);
  2135. },
  2136. getLabelName(data, callback) {
  2137. data.some((i) => {
  2138. callback(i);
  2139. if (i.children) {
  2140. this.getLabelName(i.children, callback);
  2141. }
  2142. });
  2143. }
  2144. },
  2145. watch: {
  2146. visible(visible) {
  2147. if (visible) {
  2148. this.getAccountList();
  2149. if (this.data) {
  2150. getUserDetail(this.data.id).then((res) => {
  2151. if (res.postId) {
  2152. res.postId = res.postId.split(',');
  2153. }
  2154. this.form = { ...res };
  2155. if (Array.isArray(this.form.signature)) {
  2156. this.form.signature = this.form.signature[0];
  2157. }
  2158. // this.deptTree = []
  2159. // this.form.deptIds = []
  2160. // if (this.form.deptTree) {
  2161. // this.deptTree = JSON.parse(this.form.deptTree)
  2162. // }
  2163. // this.form.workTypeId = this.form.workTypeId + '';
  2164. // this.form.postName = this.form.postName + '';
  2165. this.city = res.addressId ? res.addressId.toString() : null;
  2166. this.isUpdate = true;
  2167. });
  2168. // this.$util.assignObject(this.form, {
  2169. // ...this.data,
  2170. // password: ''
  2171. // });
  2172. // this.form = {...this.data}
  2173. // this.form.address = ["130000","130300","130304"]
  2174. // this.form.address = "130304"
  2175. // console.log('this.form',this.form)
  2176. } else {
  2177. this.city = null;
  2178. this.form.groupId = this.organizationId;
  2179. this.isUpdate = false;
  2180. }
  2181. } else {
  2182. this.city = null;
  2183. this.$refs.form.clearValidate();
  2184. this.form = { ...this.defaultForm };
  2185. }
  2186. }
  2187. }
  2188. };
  2189. </script>
  2190. <style scoped lang="scss">
  2191. ::v-deep .el-tabs__header {
  2192. margin-bottom: 10px;
  2193. }
  2194. .multi-select-input {
  2195. border: 1px solid #dcdfe6;
  2196. border-radius: 4px;
  2197. padding: 3px 5px;
  2198. min-height: 36px;
  2199. display: flex;
  2200. align-items: center;
  2201. flex-wrap: wrap;
  2202. cursor: pointer;
  2203. }
  2204. .multi-select-input:hover {
  2205. border-color: #409eff;
  2206. }
  2207. .tag-box {
  2208. display: flex;
  2209. align-items: center;
  2210. flex-wrap: wrap;
  2211. }
  2212. .placeholder {
  2213. color: #c0c4cc;
  2214. padding-left: 5px;
  2215. }
  2216. </style>