UserModal.vue 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079
  1. <template>
  2. <a-modal
  3. :title="title"
  4. width="85%"
  5. :closable="true"
  6. @cancel="close"
  7. @ok="handleSubmit"
  8. :visible="visible"
  9. >
  10. <template slot="title">
  11. <div style="width: 100%;">
  12. <span>{{ title }}</span>
  13. <span style="display:inline-block;width:calc(100% - 51px);padding-right:10px;text-align: right">
  14. <a-button @click="toggleScreen" icon="appstore" style="height:20px;width:20px;border:0px"></a-button>
  15. </span>
  16. </div>
  17. </template>
  18. <a-spin :spinning="confirmLoading">
  19. <a-form :form="form">
  20. <a-form-item label="工号" :labelCol="labelCol" :wrapperCol="wrapperCol">
  21. <a-input placeholder="请输入工号" v-decorator="['workNo', validatorRules.workNo]" />
  22. </a-form-item>
  23. <a-form-item label="用户姓名" :labelCol="labelCol" :wrapperCol="wrapperCol">
  24. <a-input placeholder="请输入用户姓名" v-decorator="['realname', validatorRules.realname]" />
  25. </a-form-item>
  26. <a-form-item label="英文名" :labelCol="labelCol" :wrapperCol="wrapperCol">
  27. <a-input placeholder="请输入英文名" v-decorator="['nenName',validatorRules.nenName]" />
  28. </a-form-item>
  29. <a-form-item label="性别" :labelCol="labelCol" :wrapperCol="wrapperCol">
  30. <a-select v-decorator="['sex', validatorRules.sex]" placeholder="请选择性别">
  31. <a-select-option :value="1">男</a-select-option>
  32. <a-select-option :value="2">女</a-select-option>
  33. </a-select>
  34. </a-form-item>
  35. <a-form-item label="生日" :labelCol="labelCol" :wrapperCol="wrapperCol">
  36. <a-date-picker
  37. style="width: 100%"
  38. placeholder="请选择生日"
  39. v-decorator="['birthday',{ initialValue: !model.birthday ? null : moment(model.birthday, dateFormat),rules: [{ required: true, message: '请选择生日日期' }] }]"
  40. />
  41. </a-form-item>
  42. <a-form-item label="婚否" :labelCol="labelCol" :wrapperCol="wrapperCol">
  43. <a-select v-decorator="['nmarriage', validatorRules.nmarriage]" placeholder="请选择性别">
  44. <a-select-option value="1">是</a-select-option>
  45. <a-select-option value="0">否</a-select-option>
  46. </a-select>
  47. </a-form-item>
  48. <a-form-item label="户口" :labelCol="labelCol" :wrapperCol="wrapperCol">
  49. <j-dict-select-tag
  50. v-decorator="['nregistered',validatorRules.nregistered]"
  51. placeholder="请选择户口"
  52. :triggerChange="true"
  53. dictCode="registered-residence"
  54. />
  55. </a-form-item>
  56. <a-form-item label="户口所在地" :labelCol="labelCol" :wrapperCol="wrapperCol">
  57. <a-input placeholder="请输入" v-decorator="['nregisteredAddr', validatorRules.nregisteredAddr]" />
  58. <!-- <a-input placeholder="请输入户口所在地" v-decorator="['nregisteredAddr', validatorRules.nregisteredAddr]" /> -->
  59. </a-form-item>
  60. <a-form-item label="政治面貌" :labelCol="labelCol" :wrapperCol="wrapperCol">
  61. <j-dict-select-tag
  62. v-decorator="['noutlook', validatorRules.noutlook]"
  63. placeholder="请选择政治面貌"
  64. :triggerChange="true"
  65. dictCode="political-outlook"
  66. />
  67. </a-form-item>
  68. <a-form-item label="所学专业" :labelCol="labelCol" :wrapperCol="wrapperCol">
  69. <a-input placeholder="请输入所学专业" v-decorator="['nmajor', validatorRules.nmajor]" />
  70. </a-form-item>
  71. <a-form-item label="学历" :labelCol="labelCol" :wrapperCol="wrapperCol">
  72. <j-dict-select-tag
  73. v-decorator="['neducation',validatorRules.neducation]"
  74. placeholder="请选择学历"
  75. :triggerChange="true"
  76. dictCode="education"
  77. />
  78. </a-form-item>
  79. <a-form-item label="毕业时间" :labelCol="labelCol" :wrapperCol="wrapperCol">
  80. <a-date-picker
  81. style="width: 100%"
  82. placeholder="请选择毕业时间"
  83. v-decorator="['nGraduationTime', { initialValue: !model.nGraduationTime ? null : moment(model.nGraduationTime, dateFormat),rules: [{ required: true, message: '请选择毕业时间' }] }]"
  84. />
  85. </a-form-item>
  86. <a-form-item label="职务" :labelCol="labelCol" :wrapperCol="wrapperCol">
  87. <j-select-position placeholder="请选择职务" :multiple="false" v-decorator="['post', validatorRules.post]" />
  88. </a-form-item>
  89. <a-form-item label="入司日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
  90. <a-date-picker
  91. style="width: 100%"
  92. placeholder="请选择入司日期"
  93. v-decorator="['nInductionTime', { initialValue: !model.nInductionTime ? null : moment(model.nInductionTime, dateFormat) ,rules: [{ required: true, message: '请选择入司日期' }] }]"
  94. />
  95. </a-form-item>
  96. <a-form-item label="离职日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
  97. <a-date-picker
  98. style="width: 100%"
  99. placeholder="请选择离职日期"
  100. v-decorator="['syResignationTime', { initialValue: !model.syResignationTime ? null : moment(model.syResignationTime, dateFormat)}]"
  101. />
  102. </a-form-item>
  103. <a-form-item label="家庭电话" :labelCol="labelCol" :wrapperCol="wrapperCol">
  104. <a-input placeholder="请输入家庭电话" v-decorator="['telephone', validatorRules.telephone]" />
  105. </a-form-item>
  106. <a-form-item label="公司座机" :labelCol="labelCol" :wrapperCol="wrapperCol">
  107. <a-input placeholder="请输入公司座机" v-decorator="['ncompanyPhone', {}]" />
  108. </a-form-item>
  109. <a-form-item label="公司内线" :labelCol="labelCol" :wrapperCol="wrapperCol">
  110. <a-input placeholder="请输入公司内线" v-decorator="['ncompanyLine', {}]" />
  111. </a-form-item>
  112. <a-form-item label="邮箱" :labelCol="labelCol" :wrapperCol="wrapperCol">
  113. <a-input placeholder="请输入邮箱" v-decorator="['email', validatorRules.email]" />
  114. </a-form-item>
  115. <a-form-item label="工资卡号" :labelCol="labelCol" :wrapperCol="wrapperCol">
  116. <a-input placeholder="请输入工资卡号" v-decorator="['ncardNo', validatorRules.ncardNo]" />
  117. </a-form-item>
  118. <a-form-item label="虚拟网号" :labelCol="labelCol" :wrapperCol="wrapperCol">
  119. <a-input placeholder="请输入虚拟网号" v-decorator="['nvirtualNo', {}]" />
  120. </a-form-item>
  121. <a-form-item label="转正日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
  122. <a-date-picker
  123. style="width: 100%"
  124. placeholder="请选择转正日期"
  125. disabled='true'
  126. v-decorator="['nBecomeTime', { initialValue: !model.nBecomeTime ? null : moment(model.nBecomeTime, dateFormat)}]"
  127. />
  128. </a-form-item>
  129. <a-form-item label="社保申报日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
  130. <a-date-picker
  131. style="width: 100%"
  132. placeholder="请选择社保申报日期"
  133. v-decorator="['nsocialTime', { initialValue: !model.nsocialTime ? null : moment(model.nsocialTime, dateFormat) }]"
  134. />
  135. </a-form-item>
  136. <a-form-item label="社保断缴日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
  137. <a-date-picker
  138. style="width: 100%"
  139. placeholder="社保断缴日期"
  140. v-decorator="['sySecurityOutTime', { initialValue: !model.sySecurityOutTime ? null : moment(model.sySecurityOutTime, dateFormat) }]"
  141. />
  142. </a-form-item>
  143. <a-form-item label="公积金申报日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
  144. <a-date-picker
  145. style="width: 100%"
  146. placeholder="请选择公积金申报日期"
  147. v-decorator="['nfundTime', { initialValue: !model.nfundTime ? null : moment(model.nfundTime, dateFormat) }]"
  148. />
  149. </a-form-item>
  150. <a-form-item label="公积金断缴日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
  151. <a-date-picker
  152. style="width: 100%"
  153. placeholder="公积金断缴日期"
  154. v-decorator="['syFundOutTime', { initialValue: !model.syFundOutTime ? null : moment(model.syFundOutTime, dateFormat) }]"
  155. />
  156. </a-form-item>
  157. <a-form-item label="公积金基数" :labelCol="labelCol" :wrapperCol="wrapperCol">
  158. <a-input placeholder="请输入公积金基数" v-decorator="['nfundBase', {}]" />
  159. </a-form-item>
  160. <a-form-item label="社保基数" :labelCol="labelCol" :wrapperCol="wrapperCol">
  161. <a-input placeholder="请输入社保基数" v-decorator="['nsocialBase',{}]" />
  162. </a-form-item>
  163. <a-form-item label="年假" :labelCol="labelCol" :wrapperCol="wrapperCol">
  164. <a-input placeholder="请输入年假" v-decorator="['nannualNum', {}]" />
  165. </a-form-item>
  166. <a-form-item label="已请年假" :labelCol="labelCol" :wrapperCol="wrapperCol">
  167. <a-input placeholder="请输入输入已请年假" v-decorator="['nannualOldNum', {}]" />
  168. </a-form-item>
  169. <a-form-item label="剩余年假" :labelCol="labelCol" :wrapperCol="wrapperCol">
  170. <a-input placeholder="请输入剩余年假" v-decorator="['nannualNowNum', {}]" />
  171. </a-form-item>
  172. <a-form-item label="民族" :labelCol="labelCol" :wrapperCol="wrapperCol">
  173. <j-dict-select-tag
  174. v-decorator="['nnation', validatorRules.nnation]"
  175. placeholder="请选择民族"
  176. :triggerChange="true"
  177. dictCode="nation"
  178. />
  179. </a-form-item>
  180. <a-form-item label="籍贯" :labelCol="labelCol" :wrapperCol="wrapperCol">
  181. <a-input placeholder="请输入籍贯" v-decorator="['nnativePlace', validatorRules.nnativePlace]" />
  182. </a-form-item>
  183. <a-form-item label="身份证号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
  184. <a-input placeholder="请输入身份证号码" v-decorator="['nidNo', validatorRules.nidNo]" />
  185. </a-form-item>
  186. <a-form-item label="家庭住址" :labelCol="labelCol" :wrapperCol="wrapperCol">
  187. <a-input placeholder="请输入家庭住址" v-decorator="['nhomeAddress', {}]" />
  188. </a-form-item>
  189. <a-form-item label="手机号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
  190. <a-input
  191. placeholder="请输入手机号码"
  192. :disabled="isDisabledAuth('user:form:phone')"
  193. v-decorator="['phone', validatorRules.phone]"
  194. />
  195. </a-form-item>
  196. <!-- <a-form-item label="对本企业要求" :labelCol="labelCol" :wrapperCol="wrapperCol">
  197. <a-input placeholder="请输入" v-decorator="['nrequirement', {}]" />
  198. </a-form-item> -->
  199. <!-- <a-form-item label="希望待遇" :labelCol="labelCol" :wrapperCol="wrapperCol">
  200. <a-input placeholder="请输入希望待遇" v-decorator="['nhopeFor',{}]" />
  201. </a-form-item>
  202. <a-form-item label="与原单位关系" :labelCol="labelCol" :wrapperCol="wrapperCol">
  203. <a-input placeholder="请输入" v-decorator="['nrelationshipFor', {}]" />
  204. </a-form-item> -->
  205. <a-form-item label="人员类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
  206. <j-dict-select-tag
  207. v-decorator="['npersonnelType',validatorRules.npersonnelType]"
  208. placeholder="请选择人员类型"
  209. :triggerChange="true"
  210. dictCode="personnel-status"
  211. />
  212. </a-form-item>
  213. <a-form-item label="雇佣状态" :labelCol="labelCol" :wrapperCol="wrapperCol">
  214. <j-dict-select-tag
  215. v-decorator="['syHireType',validatorRules.syHireType]"
  216. placeholder="请选择雇佣状态"
  217. :triggerChange="true"
  218. dictCode="employment-status"
  219. />
  220. </a-form-item>
  221. <a-form-item label="所属公司" :labelCol="labelCol" :wrapperCol="wrapperCol">
  222. <j-dict-select-tag
  223. v-decorator="['belongingCompany', validatorRules.belongingCompany]"
  224. placeholder="请选择所属公司"
  225. :triggerChange="true"
  226. dictCode="affiliated-company"
  227. />
  228. </a-form-item>
  229. <a-form-item label="车牌号" :labelCol="labelCol" :wrapperCol="wrapperCol">
  230. <a-input placeholder="请输入" v-decorator="['licenseCar', {}]" />
  231. </a-form-item>
  232. <!-- update--begin--autor:wangshuai-----date:20200108------for:新增身份和负责部门------ -->
  233. <a-form-item label="身份" :labelCol="labelCol" :wrapperCol="wrapperCol">
  234. <a-radio-group v-model="identity" @change="identityChange">
  235. <a-radio value="1">普通用户</a-radio>
  236. <a-radio value="2">上级</a-radio>
  237. </a-radio-group>
  238. </a-form-item>
  239. <a-form-item label="负责部门" :labelCol="labelCol" :wrapperCol="wrapperCol" v-if="departIdShow == true">
  240. <a-select
  241. mode="multiple"
  242. style="width: 100%"
  243. placeholder="请选择负责部门"
  244. v-model="departIds"
  245. optionFilterProp="children"
  246. :getPopupContainer="target => target.parentNode"
  247. :dropdownStyle="{ maxHeight: '200px', overflow: 'auto' }"
  248. >
  249. <a-select-option v-for="item in resultDepartOptions" :key="item.key" :value="item.key">{{
  250. item.title
  251. }}</a-select-option>
  252. </a-select>
  253. </a-form-item>
  254. <a-form-item label="是否OA用户" :labelCol="labelCol" :wrapperCol="wrapperCol">
  255. <a-radio-group v-model="ifOa" @change="changeOa">
  256. <a-radio value="1">是</a-radio>
  257. <a-radio value="0">否</a-radio>
  258. </a-radio-group>
  259. </a-form-item>
  260. <!-- update--end--autor:wangshuai-----date:20200108------for:新增身份和负责部门------ -->
  261. <a-form-item label="工作流引擎" :labelCol="labelCol" :wrapperCol="wrapperCol">
  262. <j-dict-select-tag
  263. v-decorator="['activitiSync', {}]"
  264. placeholder="请选择是否同步工作流引擎"
  265. :type="'radio'"
  266. :triggerChange="true"
  267. dictCode="activiti_sync"
  268. />
  269. </a-form-item>
  270. <a-form-item label="头像" :labelCol="labelCol" :wrapperCol="wrapperCol">
  271. <j-image-upload class="avatar-uploader" text="上传" v-model="fileList"></j-image-upload>
  272. </a-form-item>
  273. <a-form-item label="工作简历" :labelCol="labelCol" :wrapperCol="wrapperCol" class="nresume">
  274. <a-input type="textarea" placeholder="请输入" v-decorator="['nresume', {}]" />
  275. </a-form-item>
  276. <a-form-item label="家庭成员" :labelCol="labelCol" :wrapperCol="wrapperCol" class="nresume">
  277. <a-input type="textarea" placeholder="请输入" v-decorator="['nmemberOfFamily', {}]" />
  278. </a-form-item>
  279. <a-form-item label="备注信息" :labelCol="labelCol" :wrapperCol="wrapperCol" class="nresume">
  280. <a-input type="textarea" placeholder="请输入" v-decorator="['nremarks', {}]" />
  281. </a-form-item>
  282. <a-divider>IT维护</a-divider>
  283. <a-form-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol" :validateOnRuleChange="true">
  284. <a-input
  285. placeholder="请输入用户账号"
  286. v-decorator="['username', validatorRules.username]"
  287. :readOnly="!!model.username"
  288. autocomplete="off"
  289. />
  290. </a-form-item>
  291. <template v-if="!model.id">
  292. <a-form-item label="登陆密码" :labelCol="labelCol" :wrapperCol="wrapperCol">
  293. <a-input type="password" placeholder="请输入登陆密码" v-decorator="['password', validatorRules.password]" autocomplete="new-password" @blur="changePssword"/>
  294. </a-form-item>
  295. <a-form-item label="确认密码" :labelCol="labelCol" :wrapperCol="wrapperCol">
  296. <a-input
  297. type="password"
  298. @blur="handleConfirmBlur"
  299. placeholder="请重新输入登陆密码"
  300. v-decorator="['confirmpassword', validatorRules.confirmpassword]"
  301. />
  302. </a-form-item>
  303. </template>
  304. <!--部门分配-->
  305. <a-form-item label="公司部门分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled">
  306. <a-input-search
  307. placeholder="点击右侧按钮选择公司和部门"
  308. v-model="checkedDepartNameString"
  309. disabled
  310. @search="onSearch"
  311. >
  312. <a-button slot="enterButton" icon="search">选择</a-button>
  313. </a-input-search>
  314. </a-form-item>
  315. <a-form-item label="角色分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!roleDisabled">
  316. <a-select
  317. mode="multiple"
  318. style="width: 100%"
  319. placeholder="请选择用户角色"
  320. optionFilterProp="children"
  321. v-model="selectedRole"
  322. >
  323. <a-select-option v-for="(role, roleindex) in roleList" :key="roleindex.toString()" :value="role.id">
  324. {{ role.roleName }}
  325. </a-select-option>
  326. </a-select>
  327. </a-form-item>
  328. </a-form>
  329. </a-spin>
  330. <depart-window ref="departWindow" @ok="modalFormOk"></depart-window>
  331. <!-- <div class="drawer-bootom-button" v-show="!disableSubmit">
  332. <a-button style="margin-right: .8rem" @click="handleCancel">取消</a-button>
  333. <a-button @click="handleSubmit" type="primary" :loading="confirmLoading">提交</a-button>
  334. </div> -->
  335. </a-modal>
  336. </template>
  337. <script>
  338. import pick from 'lodash.pick'
  339. import moment from 'moment'
  340. import Vue from 'vue'
  341. // 引入搜索部门弹出框的组件
  342. import departWindow from './DepartWindow'
  343. import JSelectPosition from '@/components/jeecgbiz/JSelectPosition'
  344. import { ACCESS_TOKEN } from '@/store/mutation-types'
  345. import { getAction } from '@/api/manage'
  346. import { addUser, editUser, queryUserRole, queryall, duplicateCheck } from '@/api/api'
  347. import { disabledAuthFilter } from '@/utils/authFilter'
  348. import JImageUpload from '../../../components/jeecg/JImageUpload'
  349. export default {
  350. name: 'UserModal',
  351. components: {
  352. JImageUpload,
  353. departWindow,
  354. JSelectPosition
  355. },
  356. data () {
  357. return {
  358. departDisabled: false, // 是否是我的部门调用该页面
  359. roleDisabled: false, // 是否是角色维护调用该页面
  360. modalWidth: 800,
  361. drawerWidth: 700,
  362. modaltoggleFlag: true,
  363. confirmDirty: false,
  364. selectedDepartKeys: [], // 保存用户选择部门id
  365. checkedDepartKeys: [],
  366. checkedDepartNames: [], // 保存部门的名称 =>title
  367. checkedDepartNameString: '', // 保存部门的名称 =>title
  368. resultDepartOptions: [],
  369. userId: '', // 保存用户id
  370. disableSubmit: false,
  371. userDepartModel: { userId: '', departIdList: [] }, // 保存SysUserDepart的用户部门中间表数据需要的对象
  372. dateFormat: 'YYYY-MM-DD',
  373. validatorRules: {
  374. username: {
  375. rules: [
  376. {
  377. required: false,
  378. message: '请输入用户账号!'
  379. },
  380. {
  381. validator: this.validateUsername
  382. }
  383. ]
  384. },
  385. password: {
  386. rules: [
  387. {
  388. required: false,
  389. message: '请输入密码!'
  390. // pattern: /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/,
  391. // message: '密码由8位数字、大小写字母和特殊符号组成!'
  392. },
  393. {
  394. validator: this.validateToNextPassword
  395. }
  396. ],
  397. initialValue:'123456'
  398. },
  399. confirmpassword: {
  400. rules: [
  401. {
  402. required: false,
  403. message: '请重新输入登陆密码!'
  404. },
  405. {
  406. validator: this.compareToFirstPassword
  407. }
  408. ]
  409. },
  410. realname: { rules: [{ required: true, message: '请输入用户名称!' }] },
  411. belongingCompany: { rules: [{ required: true, message: '请选择所属公司!' }] },
  412. phone: { rules: [{ validator: this.validatePhone },{ required: true, message: '请输入手机号码!' }] },
  413. email: {
  414. rules: [
  415. {
  416. // validator: this.validateEmail
  417. }
  418. ]
  419. },
  420. roles: {},
  421. // sex:{initialValue:((!this.model.sex)?"": (this.model.sex+""))}
  422. workNo: {
  423. rules: [{ required: true, message: '请输入工号' }, { validator: this.validateWorkNo }]
  424. },
  425. telephone: {
  426. // rules: [{ required: true, message: '请输入座机' },{ pattern: /^0\d{2,3}-[1-9]\d{6,7}$/, message: '请输入正确的座机号码' }]
  427. rules: [{ required: true, message: '请输入家庭电话' }]
  428. },
  429. nenName:{
  430. rules: [{ required: true, message: '请输入英文名' }]
  431. },
  432. sex:{
  433. rules: [{ required: true, message: '请选择性别' }]
  434. },
  435. nidNo:{
  436. rules: [{ required: true, message: '输入身份证号码' }]
  437. },
  438. nmarriage:{
  439. rules: [{ required: true, message: '请选择婚否' }]
  440. },
  441. nregisteredAddr:{
  442. rules: [{ required: true, message: '请输入户口所在地' }]
  443. },
  444. nmajor:{
  445. rules: [{ required: true, message: '请输入所学专业' }]
  446. },
  447. noutlook:{
  448. rules: [{ required: true, message: '请选择政治面貌' }]
  449. },
  450. neducation:{
  451. rules: [{ required: true, message: '请选择政学历' }]
  452. },
  453. nregistered:{
  454. rules: [{ required: true, message: '请选择户口' }]
  455. },
  456. post:{
  457. rules: [{ required: true, message: '请选择职位' }]
  458. },
  459. ncardNo:{
  460. rules: [{ required: true, message: '请输入工资卡号' }]
  461. },
  462. nnation:{
  463. rules: [{ required: true, message: '请选择民族' }]
  464. },
  465. nnativePlace:{
  466. rules: [{ required: true, message: '请输入籍贯' }]
  467. },
  468. npersonnelType:{
  469. rules: [{ required: true, message: '请选择人员类型' }]
  470. },
  471. checkedDepartNameString:{
  472. rules: [{ required: true, message: '请选择部门!' }]
  473. }
  474. },
  475. departIdShow: false,
  476. departIds: [], // 负责部门id
  477. title: '操作',
  478. visible: false,
  479. model: {},
  480. roleList: [],
  481. selectedRole: [],
  482. labelCol: {
  483. xs: { span: 24 },
  484. sm: { span: 5 }
  485. },
  486. wrapperCol: {
  487. xs: { span: 24 },
  488. sm: { span: 16 }
  489. },
  490. uploadLoading: false,
  491. confirmLoading: false,
  492. headers: {},
  493. form: this.$form.createForm(this),
  494. picUrl: '',
  495. url: {
  496. fileUpload: window._CONFIG['domianURL'] + '/sys/common/upload',
  497. imgerver: window._CONFIG['staticDomainURL'],
  498. userWithDepart: '/sys/user/userDepartList', // 引入为指定用户查看部门信息需要的url
  499. userId: '/sys/user/generateUserId', // 引入生成添加用户情况下的url
  500. syncUserByUserName: '/process/extActProcess/doSyncUserByUserName' // 同步用户到工作流
  501. },
  502. identity: '1',
  503. ifOa:'0',
  504. fileList: [],
  505. orgObject: {
  506. pkOrg: '', // 选中的公司id
  507. pkOrgName: '' // 选中的公司名称
  508. },
  509. userObject: {} // 用户信息
  510. }
  511. },
  512. created () {
  513. const token = Vue.ls.get(ACCESS_TOKEN)
  514. this.headers = { 'X-Access-Token': token }
  515. },
  516. computed: {
  517. uploadAction: function () {
  518. return this.url.fileUpload
  519. }
  520. },
  521. methods: {
  522. isDisabledAuth (code) {
  523. return disabledAuthFilter(code)
  524. },
  525. // 窗口最大化切换
  526. toggleScreen () {
  527. if (this.modaltoggleFlag) {
  528. this.modalWidth = window.innerWidth
  529. } else {
  530. this.modalWidth = 800
  531. }
  532. this.modaltoggleFlag = !this.modaltoggleFlag
  533. },
  534. initialRoleList () {
  535. queryall().then(res => {
  536. if (res.success) {
  537. this.roleList = res.result
  538. } else {
  539. console.log(res.message)
  540. }
  541. })
  542. },
  543. loadUserRoles (userid) {
  544. queryUserRole({ userid: userid }).then(res => {
  545. if (res.success) {
  546. this.selectedRole = res.result
  547. } else {
  548. console.log(res.message)
  549. }
  550. })
  551. },
  552. refresh () {
  553. this.selectedDepartKeys = []
  554. this.checkedDepartKeys = []
  555. this.checkedDepartNames = []
  556. this.checkedDepartNameString = ''
  557. this.userId = ''
  558. this.resultDepartOptions = []
  559. this.departId = []
  560. this.departIdShow = false
  561. },
  562. add () {
  563. this.picUrl = ''
  564. this.refresh()
  565. this.edit({ activitiSync: '1' })
  566. },
  567. edit (record) {
  568. this.resetScreenSize() // 调用此方法,根据屏幕宽度自适应调整抽屉的宽度
  569. let that = this
  570. that.initialRoleList()
  571. that.checkedDepartNameString = ''
  572. that.form.resetFields()
  573. if (record.hasOwnProperty('id')) {
  574. that.loadUserRoles(record.id)
  575. setTimeout(() => {
  576. this.fileList = record.avatar
  577. }, 5)
  578. }
  579. that.userId = record.id
  580. // 修改赋值公司id
  581. this.orgObject.pkOrg = record.pkOrg
  582. this.orgObject.pkOrgName = record.pkOrgName
  583. this.userObject = record
  584. that.visible = true
  585. that.model = Object.assign({}, record)
  586. that.$nextTick(() => {
  587. that.form.setFieldsValue(
  588. pick(
  589. this.model,
  590. 'username',
  591. 'sex',
  592. 'realname',
  593. 'email',
  594. 'phone',
  595. 'activitiSync',
  596. 'workNo',
  597. 'telephone',
  598. 'post',
  599. 'nenName',
  600. 'nmarriage',
  601. 'nregistered',
  602. 'noutlook',
  603. 'nmajor',
  604. 'neducation',
  605. 'ngraduationTime',
  606. 'ninductionTime',
  607. 'ncompanyPhone',
  608. 'ncompanyLine',
  609. 'ncardNo',
  610. 'nvirtualNo',
  611. 'nBecomeTime',
  612. 'nsocialTime',
  613. 'nfundTime',
  614. 'nfundBase',
  615. 'nsocialBase',
  616. 'nannualNum',
  617. 'nannualOldNum',
  618. 'nannualNowNum',
  619. 'nnation',
  620. 'nnativePlace',
  621. 'nidNo',
  622. 'nhomeAddress',
  623. 'nrequirement',
  624. 'nhopeFor',
  625. 'nregisteredAddr',
  626. 'nrelationshipFor',
  627. 'npersonnelType',
  628. 'nregisteredAddr',
  629. 'ifOa','belongingCompany',
  630. 'syHireType',
  631. 'syResignationTime',
  632. 'syFundOutTime',
  633. 'sySecurityOutTime'
  634. )
  635. )
  636. })
  637. // 身份为上级显示负责部门,否则不显示
  638. if (this.model.identity == '2') {
  639. this.identity = '2'
  640. this.departIdShow = true
  641. } else {
  642. this.identity = '1'
  643. this.departIdShow = false
  644. }
  645. // 调用查询用户对应的部门信息的方法
  646. that.checkedDepartKeys = []
  647. that.loadCheckedDeparts()
  648. },
  649. //
  650. loadCheckedDeparts () {
  651. let that = this
  652. if (!that.userId) {
  653. return
  654. }
  655. getAction(that.url.userWithDepart, { userId: that.userId }).then(res => {
  656. that.checkedDepartNames = []
  657. if (res.success) {
  658. var depart = []
  659. var departId = []
  660. for (let i = 0; i < res.result.length; i++) {
  661. that.checkedDepartNames.push(res.result[i].title)
  662. this.checkedDepartNameString = this.checkedDepartNames.join(',')
  663. that.checkedDepartKeys.push(res.result[i].key)
  664. // 新增负责部门选择下拉框
  665. depart.push({
  666. key: res.result[i].key,
  667. title: res.result[i].title
  668. })
  669. departId.push(res.result[i].key)
  670. }
  671. that.resultDepartOptions = depart
  672. // 判断部门id是否存在,不存在择直接默认当前所在部门
  673. if (this.model.departIds) {
  674. this.departIds = this.model.departIds.split(',')
  675. } else {
  676. this.departIds = departId
  677. }
  678. that.userDepartModel.departIdList = that.checkedDepartKeys
  679. } else {
  680. console.log(res.message)
  681. }
  682. })
  683. },
  684. close () {
  685. console.log('?????')
  686. this.$emit('close')
  687. this.visible = false
  688. this.ifOa ='0'
  689. this.disableSubmit = false
  690. this.selectedRole = []
  691. this.userDepartModel = { userId: '', departIdList: [] }
  692. this.checkedDepartNames = []
  693. this.checkedDepartNameString = ''
  694. this.checkedDepartKeys = []
  695. this.selectedDepartKeys = []
  696. this.resultDepartOptions = []
  697. this.departIds = []
  698. this.departIdShow = false
  699. this.identity = '1'
  700. this.fileList = []
  701. this.orgObject = []
  702. this.userObject = {}
  703. this.validatorRules.username.rules[0].required = false
  704. this.validatorRules.confirmpassword.rules[0].required = false
  705. },
  706. moment,
  707. handleSubmit () {
  708. if(!this.orgObject.pkOrg){
  709. this.$message.warning("请选择公司");
  710. return
  711. }
  712. const that = this
  713. // 触发表单验证
  714. this.form.validateFields((err, values) => {
  715. if (!err) {
  716. that.confirmLoading = true
  717. if (!values.birthday) {
  718. values.birthday = ''
  719. } else {
  720. values.birthday = values.birthday.format(this.dateFormat)
  721. }
  722. let formData = Object.assign(this.model, values)
  723. // 获取公司信息
  724. formData.pkOrg = this.orgObject.pkOrg
  725. formData.pkOrgName = this.orgObject.pkOrgName
  726. formData.avatar = that.fileList
  727. formData.selectedroles = this.selectedRole.length > 0 ? this.selectedRole.join(',') : ''
  728. formData.selecteddeparts =
  729. this.userDepartModel.departIdList.length > 0 ? this.userDepartModel.departIdList.join(',') : ''
  730. formData.identity = this.identity
  731. // 如果是上级择传入departIds,否则为空
  732. if (this.identity === '2') {
  733. formData.departIds = this.departIds.join(',')
  734. } else {
  735. formData.departIds = ''
  736. }
  737. // that.addDepartsToUser(that,formData); // 调用根据当前用户添加部门信息的方法
  738. let obj
  739. if (!this.model.id) {
  740. formData.id = this.userId
  741. obj = addUser(formData)
  742. } else {
  743. obj = editUser(formData)
  744. }
  745. obj
  746. .then(res => {
  747. if (res.success) {
  748. that.$message.success(res.message)
  749. that.$emit('ok')
  750. } else {
  751. that.$message.warning(res.message)
  752. }
  753. })
  754. .finally(() => {
  755. that.confirmLoading = false
  756. that.checkedDepartNames = []
  757. that.userDepartModel.departIdList = { userId: '', departIdList: [] }
  758. that.close()
  759. })
  760. }
  761. })
  762. },
  763. handleCancel () {
  764. this.close()
  765. },
  766. validateToNextPassword (rule, value, callback) {
  767. const form = this.form
  768. const confirmpassword = form.getFieldValue('confirmpassword')
  769. if (value && confirmpassword && value !== confirmpassword) {
  770. callback('两次输入的密码不一样!')
  771. }
  772. if (value && this.confirmDirty) {
  773. form.validateFields(['confirm'], { force: true })
  774. }
  775. callback()
  776. },
  777. compareToFirstPassword (rule, value, callback) {
  778. const form = this.form
  779. if (value && value !== form.getFieldValue('password')) {
  780. callback('两次输入的密码不一样!')
  781. } else {
  782. callback()
  783. }
  784. },
  785. validatePhone (rule, value, callback) {
  786. if (!value) {
  787. callback()
  788. } else {
  789. // update-begin--Author:kangxiaolin Date:20190826 for:[05] 手机号不支持199号码段--------------------
  790. if (new RegExp(/^1[3|4|5|7|8|9][0-9]\d{8}$/).test(value)) {
  791. // update-end--Author:kangxiaolin Date:20190826 for:[05] 手机号不支持199号码段--------------------
  792. var params = {
  793. tableName: 'sys_user',
  794. fieldName: 'phone',
  795. fieldVal: value,
  796. dataId: this.userId
  797. }
  798. duplicateCheck(params).then(res => {
  799. if (res.success) {
  800. callback()
  801. } else {
  802. callback('手机号已存在!')
  803. }
  804. })
  805. } else {
  806. callback('请输入正确格式的手机号码!')
  807. }
  808. }
  809. },
  810. validateEmail (rule, value, callback) {
  811. if (!value) {
  812. callback()
  813. } else {
  814. if (
  815. new RegExp(
  816. /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  817. ).test(value)
  818. ) {
  819. var params = {
  820. tableName: 'sys_user',
  821. fieldName: 'email',
  822. fieldVal: value,
  823. dataId: this.userId
  824. }
  825. duplicateCheck(params).then(res => {
  826. console.log(res)
  827. if (res.success) {
  828. callback()
  829. } else {
  830. callback('邮箱已存在!')
  831. }
  832. })
  833. } else {
  834. callback('请输入正确格式的邮箱!')
  835. }
  836. }
  837. },
  838. validateUsername (rule, value, callback) {
  839. var params = {
  840. tableName: 'sys_user',
  841. fieldName: 'username',
  842. fieldVal: value,
  843. dataId: this.userId
  844. }
  845. duplicateCheck(params).then(res => {
  846. if (res.success) {
  847. callback()
  848. } else {
  849. callback('用户名已存在!')
  850. }
  851. })
  852. },
  853. validateWorkNo (rule, value, callback) {
  854. var params = {
  855. tableName: 'sys_user',
  856. fieldName: 'work_no',
  857. fieldVal: value,
  858. dataId: this.userId
  859. }
  860. duplicateCheck(params).then(res => {
  861. if (res.success) {
  862. callback()
  863. } else {
  864. callback('工号已存在!')
  865. }
  866. })
  867. },
  868. handleConfirmBlur (e) {
  869. const value = e.target.value
  870. this.confirmDirty = this.confirmDirty || !!value
  871. },
  872. normFile (e) {
  873. console.log('Upload event:', e)
  874. if (Array.isArray(e)) {
  875. return e
  876. }
  877. return e && e.fileList
  878. },
  879. beforeUpload: function (file) {
  880. var fileType = file.type
  881. if (fileType.indexOf('image') < 0) {
  882. this.$message.warning('请上传图片')
  883. return false
  884. }
  885. // TODO 验证文件大小
  886. },
  887. handleChange (info) {
  888. this.picUrl = ''
  889. if (info.file.status === 'uploading') {
  890. this.uploadLoading = true
  891. return
  892. }
  893. if (info.file.status === 'done') {
  894. var response = info.file.response
  895. this.uploadLoading = false
  896. console.log(response)
  897. if (response.success) {
  898. this.model.avatar = response.message
  899. this.picUrl = 'Has no pic url yet'
  900. } else {
  901. this.$message.warning(response.message)
  902. }
  903. }
  904. },
  905. // 搜索用户对应的部门API
  906. onSearch () {
  907. this.$refs.departWindow.add(this.checkedDepartKeys, this.userId, this.userObject)
  908. },
  909. // 获取用户对应部门弹出框提交给返回的数据
  910. modalFormOk (formData) {
  911. this.orgObject = formData.orgObject // 公司信息
  912. // 没有选择则直接退出
  913. if (!formData.departIdList || formData.departIdList.length == 0) {
  914. return
  915. }
  916. this.checkedDepartNames = []
  917. this.selectedDepartKeys = []
  918. this.checkedDepartNameString = ''
  919. this.userId = formData.userId
  920. this.userDepartModel.userId = formData.userId
  921. this.departIds = []
  922. this.resultDepartOptions = []
  923. var depart = []
  924. for (let i = 0; i < formData.departIdList.length; i++) {
  925. this.selectedDepartKeys.push(formData.departIdList[i].key)
  926. this.checkedDepartNames.push(formData.departIdList[i].title)
  927. this.checkedDepartNameString = this.checkedDepartNames.join(',')
  928. // 新增部门选择,如果上面部门选择后不为空直接付给负责部门
  929. depart.push({
  930. key: formData.departIdList[i].key,
  931. title: formData.departIdList[i].title
  932. })
  933. this.departIds.push(formData.departIdList[i].key)
  934. }
  935. this.resultDepartOptions = depart
  936. this.userDepartModel.departIdList = this.selectedDepartKeys
  937. this.checkedDepartKeys = this.selectedDepartKeys // 更新当前的选择keys
  938. },
  939. // 根据屏幕变化,设置抽屉尺寸
  940. resetScreenSize () {
  941. let screenWidth = document.body.clientWidth
  942. if (screenWidth < 500) {
  943. this.drawerWidth = screenWidth
  944. } else {
  945. this.drawerWidth = 700
  946. }
  947. },
  948. identityChange (e) {
  949. if (e.target.value === '1') {
  950. this.departIdShow = false
  951. } else {
  952. this.departIdShow = true
  953. }
  954. },
  955. changeOa(e){
  956. if(e.target.value === '1'){
  957. this.validatorRules.username.rules[0].required = true
  958. }else{
  959. this.validatorRules.username.rules[0].required = false
  960. }
  961. },
  962. changePssword(){
  963. this.validatorRules.confirmpassword.rules[0].required = true
  964. }
  965. }
  966. }
  967. </script>
  968. <style scoped lang="less">
  969. .avatar-uploader > .ant-upload {
  970. width: 104px;
  971. height: 104px;
  972. }
  973. .ant-upload-select-picture-card i {
  974. font-size: 49px;
  975. color: #999;
  976. }
  977. .ant-upload-select-picture-card .ant-upload-text {
  978. margin-top: 8px;
  979. color: #666;
  980. }
  981. .ant-table-tbody .ant-table-row td {
  982. padding-top: 10px;
  983. padding-bottom: 10px;
  984. }
  985. .drawer-bootom-button {
  986. position: absolute;
  987. bottom: 0;
  988. width: 100%;
  989. border-top: 1px solid #e8e8e8;
  990. padding: 10px 16px;
  991. text-align: right;
  992. left: 0;
  993. background: #fff;
  994. border-radius: 0 0 2px 2px;
  995. }
  996. /deep/.ant-form-item{
  997. width: 31%;
  998. }
  999. /deep/.ant-form{
  1000. display: flex;
  1001. width: 100%;
  1002. flex-wrap: wrap;
  1003. }
  1004. .nresume{
  1005. width: 100% !important;
  1006. }
  1007. /deep/ .nresume .ant-form-item-label{
  1008. width: 8% !important;
  1009. }
  1010. /deep/ .nresume .ant-form-item-control-wrapper{
  1011. width: 84% !important;
  1012. }
  1013. /deep/ .nresume .ant-input{
  1014. height: 100px !important;
  1015. }
  1016. /deep/ .ant-col-sm-5{
  1017. width: 27%;
  1018. }
  1019. </style>