org-user-edit.vue 66 KB

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