org-user-edit.vue 65 KB

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