UserModal.vue 37 KB

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