org-user-edit.vue 12 KB

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