org-user-edit.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <!-- 用户编辑弹窗 -->
  2. <template>
  3. <ele-modal width="800px" :visible="visible" :close-on-click-modal="false" custom-class="ele-dialog-form"
  4. :title="isUpdate ? '修改人员' : '添加人员'" @update:visible="updateVisible">
  5. <el-form ref="form" :model="form" :rules="rules" label-width="82px">
  6. <el-row :gutter="15">
  7. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  8. <el-form-item label="所属机构:">
  9. <org-select :data="organizationList" placeholder="请选择所属机构" v-model="form.groupId"
  10. @checkedKeys="checkedKeys" />
  11. </el-form-item>
  12. <el-form-item label="负责部门:">
  13. <el-cascader class="ele-block" :options="organizationList" placeholder="请选择负责部门" :props="defaultProps"
  14. collapse-tags v-model="deptTree" clearable></el-cascader>
  15. </el-form-item>
  16. <el-form-item label="性别:" prop="sex">
  17. <el-select clearable class="ele-block" v-model="form.sex" placeholder="请选择性别">
  18. <el-option label="男" :value="1" />
  19. <el-option label="女" :value="2" />
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item label="员工状态:" prop="status">
  23. <el-select clearable class="ele-block" v-model="form.status" placeholder="请选择员工状态">
  24. <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value">
  25. </el-option>
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item label="岗位:" prop="postName">
  29. <el-input clearable :maxlength="100" v-model="form.postName" placeholder="请输入岗位" />
  30. </el-form-item>
  31. <el-form-item label="工种:" prop="workTypeId">
  32. <DictSelection dictName="工种" clearable filterable v-model="form.workTypeId">
  33. </DictSelection>
  34. </el-form-item>
  35. <el-form-item label="籍贯:" prop="city">
  36. <regions-select style="width: 100%" v-model="city" placeholder="请选择省市区" />
  37. </el-form-item>
  38. <el-form-item label="生日:" prop="age">
  39. <el-date-picker style="width: 100%" clearable v-model="form.birthday" type="date" value-format="yyyy-MM-dd"
  40. placeholder="请选择日期">
  41. </el-date-picker>
  42. </el-form-item>
  43. <el-form-item label="入职时间:" prop="joinDate">
  44. <el-date-picker style="width: 100%" clearable v-model="form.joinDate" type="date" value-format="yyyy-MM-dd"
  45. placeholder="请选择日期">
  46. </el-date-picker>
  47. </el-form-item>
  48. <el-form-item label="毕业院校:" prop="school">
  49. <el-input clearable :maxlength="100" v-model="form.school" placeholder="请输入毕业院校" />
  50. </el-form-item>
  51. <el-form-item label="微信号:" prop="wxId">
  52. <el-input clearable :maxlength="100" v-model="form.wxId" placeholder="请输入微信号" />
  53. </el-form-item>
  54. </el-col>
  55. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  56. <el-form-item label="工号:" prop="jobNumber">
  57. <el-input clearable type="text" :maxlength="10" v-model="form.jobNumber" placeholder="请输入工号"
  58. onkeyup="value=value.replace(/[^\x00-\xff]/g, '')" />
  59. </el-form-item>
  60. <el-form-item label="姓名:" prop="name">
  61. <el-input clearable :maxlength="20" v-model="form.name" placeholder="请输入姓名" />
  62. </el-form-item>
  63. <el-form-item label="用户账号:">
  64. <el-input :disabled="true" :maxlength="11" v-model="form.loginName" v-if="isUpdate && data.accountId" />
  65. <el-select clearable class="ele-block" v-model="form.accountId" filterable placeholder="请选择用户账号" v-else>
  66. <el-option v-for="item in accountList" :key="item.id" :label="item.loginName" :value="item.id">
  67. </el-option>
  68. </el-select>
  69. </el-form-item>
  70. <el-form-item label="手机号:" prop="phone">
  71. <el-input clearable :maxlength="11" v-model="form.phone" placeholder="请输入手机号" />
  72. </el-form-item>
  73. <el-form-item label="邮箱:" prop="email">
  74. <el-input clearable :maxlength="100" v-model="form.email" placeholder="请输入邮箱" />
  75. </el-form-item>
  76. <el-form-item label="年龄:" prop="age">
  77. <el-input type="number" clearable :maxlength="100" v-model="form.age" placeholder="请输入年龄"
  78. onkeyup="value=value.replace(/[^\d.]/g,'')" />
  79. </el-form-item>
  80. </el-col>
  81. </el-row>
  82. </el-form>
  83. <template v-slot:footer>
  84. <el-button @click="updateVisible(false)">取消</el-button>
  85. <el-button type="primary" :loading="loading" @click="save">
  86. 保存
  87. </el-button>
  88. </template>
  89. </ele-modal>
  90. </template>
  91. <script>
  92. import { emailReg, phoneReg } from 'ele-admin';
  93. import OrgSelect from './org-select.vue';
  94. import RoleSelect from '@/views/system/user/components/role-select.vue';
  95. import RegionsSelect from '@/components/RegionsSelect/index.vue';
  96. import { getNotBoundAccount } from '@/api/system/user';
  97. import {
  98. getUserDetail,
  99. saveOrUpdateUser,
  100. checkExistence
  101. } from '@/api/system/organization';
  102. export default {
  103. components: { OrgSelect, RoleSelect, RegionsSelect },
  104. props: {
  105. // 弹窗是否打开
  106. visible: Boolean,
  107. // 修改回显的数据
  108. data: Object,
  109. // 全部机构
  110. organizationList: Array,
  111. // 机构id
  112. organizationId: [Number, String]
  113. },
  114. data() {
  115. const defaultForm = {
  116. id: null,
  117. deptId: [
  118. ],
  119. groupId: null,
  120. name: '',
  121. sex: null,
  122. email: '',
  123. phone: '',
  124. age: '',
  125. accountId: '',
  126. workTypeId: ''
  127. };
  128. return {
  129. defaultForm,
  130. // 表单数据
  131. form: { ...defaultForm },
  132. // 表单验证规则
  133. rules: {
  134. name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
  135. sex: [{ required: true, message: '请选择性别', trigger: 'blur' }],
  136. email: [
  137. { pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur' }
  138. ],
  139. phone: [
  140. { required: true, message: '请输入手机号', trigger: 'blur' },
  141. { pattern: phoneReg, message: '手机号格式不正确', trigger: 'blur' }
  142. ],
  143. jobNumber: [
  144. {
  145. required: true,
  146. trigger: 'blur',
  147. validator: (_rule, value, callback) => {
  148. if (!value) {
  149. return callback(new Error('请输入工号'));
  150. }
  151. checkExistence(this.form.jobNumber)
  152. .then((res) => {
  153. if (res != true && res != this.form.id) {
  154. callback(new Error('工号已经存在'));
  155. } else {
  156. callback();
  157. }
  158. })
  159. .catch(() => {
  160. callback();
  161. });
  162. }
  163. }
  164. ],
  165. status: [{ required: true, message: '请选择员工状态', trigger: 'blur' }]
  166. },
  167. // 提交状态
  168. loading: false,
  169. // 是否是修改
  170. isUpdate: false,
  171. city: '',
  172. statusOptions: [
  173. { value: 1, label: '全职' },
  174. { value: 2, label: '兼职' },
  175. { value: 3, label: '实习' },
  176. { value: 4, label: '正式' },
  177. { value: 5, label: '试用' },
  178. { value: 6, label: '离职' }
  179. ],
  180. accountList: [],
  181. deptTree: [],
  182. defaultProps: {
  183. multiple: true,
  184. checkStrictly: true,
  185. children: 'children',
  186. value: 'id',
  187. label: 'name'
  188. }
  189. };
  190. },
  191. computed: {
  192. // 是否开启响应式布局
  193. styleResponsive() {
  194. return this.$store.state.theme.styleResponsive;
  195. }
  196. },
  197. methods: {
  198. getAccountList() {
  199. getNotBoundAccount().then((res) => {
  200. this.accountList = res;
  201. });
  202. },
  203. /* 保存编辑 */
  204. save() {
  205. this.$refs.form.validate((valid) => {
  206. if (!valid) {
  207. return false;
  208. }
  209. this.loading = true;
  210. this.form.addressId = this.city ? this.city[this.city.length - 1] : '';
  211. if (this.deptTree.length > 0) {
  212. this.deptTree.forEach(i => {
  213. this.form.deptId.push(i[i.length - 1])
  214. })
  215. this.form['deptTree'] = JSON.stringify(this.deptTree)
  216. }
  217. const data = {
  218. ...this.form
  219. };
  220. if (!this.isUpdate) {
  221. delete data.id;
  222. }
  223. saveOrUpdateUser(data)
  224. .then((msg) => {
  225. this.loading = false;
  226. if (this.isUpdate) {
  227. this.$message.success('人员信息编辑成功');
  228. } else {
  229. this.$message.success('人员新增成功');
  230. }
  231. this.updateVisible(false);
  232. this.$emit('done');
  233. })
  234. .catch((e) => {
  235. this.loading = false;
  236. // this.$message.error(e.message);
  237. });
  238. });
  239. },
  240. /* 更新visible */
  241. updateVisible(value) {
  242. this.$emit('update:visible', value);
  243. },
  244. checkedKeys(value) {
  245. this.deptTree = []
  246. this.deptTree.push(value)
  247. },
  248. },
  249. watch: {
  250. visible(visible) {
  251. if (visible) {
  252. this.getAccountList();
  253. if (this.data) {
  254. getUserDetail(this.data.id).then((res) => {
  255. this.form = { ...res };
  256. this.deptTree = []
  257. this.form.deptId = []
  258. if (this.form.deptTree) {
  259. this.deptTree = JSON.parse(this.form.deptTree)
  260. }
  261. this.city = res.addressId ? res.addressId.toString() : null;
  262. this.isUpdate = true;
  263. });
  264. // this.$util.assignObject(this.form, {
  265. // ...this.data,
  266. // password: ''
  267. // });
  268. // this.form = {...this.data}
  269. // this.form.address = ["130000","130300","130304"]
  270. // this.form.address = "130304"
  271. // console.log('this.form',this.form)
  272. } else {
  273. this.city = null;
  274. this.form.groupId = this.organizationId;
  275. this.isUpdate = false;
  276. }
  277. } else {
  278. this.city = null;
  279. this.$refs.form.clearValidate();
  280. this.form = { ...this.defaultForm };
  281. }
  282. }
  283. }
  284. };
  285. </script>