org-user-edit.vue 12 KB

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