EmployeeTableshow.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. <template>
  2. <div style="padding:0 20px 0 20px">
  3. <el-form
  4. ref="detailForm"
  5. :status-icon="!editMode"
  6. :model="detailData"
  7. :rules="rules"
  8. @submit.native.prevent
  9. >
  10. <el-tabs v-model="activeName">
  11. <el-tab-pane label="员工信息" name="first">
  12. <div style="height: 30px;"></div>
  13. <el-row>
  14. <el-col :span="12">
  15. <div class="grid-content bg-purple">
  16. <el-form-item label="工号" prop="company_id" :label-width="formLabelWidth">
  17. <el-input
  18. v-model="detailData.company_id"
  19. ref="inputCompanyId"
  20. auto-complete="off"
  21. ></el-input>
  22. </el-form-item>
  23. </div>
  24. </el-col>
  25. <el-col :span="12">
  26. <div class="grid-content bg-purple-light">
  27. <el-form-item label="姓名" prop="name" :label-width="formLabelWidth">
  28. <el-input v-model="detailData.name" ref="inputName" auto-complete="off"></el-input>
  29. </el-form-item>
  30. </div>
  31. </el-col>
  32. <el-col :span="12">
  33. <el-form-item label="手机号码" prop="tel" :label-width="formLabelWidth">
  34. <el-input v-model="detailData.tel" ref="inputTel" auto-complete="off"></el-input>
  35. </el-form-item>
  36. </el-col>
  37. <el-col :span="12">
  38. <el-form-item label="密码" prop="password" :label-width="formLabelWidth">
  39. <el-input type="password" v-model="detailData.password" auto-complete="off"></el-input>
  40. </el-form-item>
  41. </el-col>
  42. <el-col :span="12">
  43. <el-form-item label="确认密码" prop="password_check" :label-width="formLabelWidth">
  44. <el-input type="password" v-model="detailData.password_check" auto-complete="off"></el-input>
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="12">
  48. <el-form-item label="邮箱" prop="mail_address" :label-width="formLabelWidth">
  49. <el-input
  50. v-model="detailData.mail_address"
  51. ref="inputMailAddress"
  52. auto-complete="off"
  53. ></el-input>
  54. </el-form-item>
  55. </el-col>
  56. <el-col :span="12">
  57. <el-form-item label="所属部门" prop="dept_id" :label-width="formLabelWidth">
  58. <el-cascader
  59. v-model="detailData.dept_id"
  60. style="width:100%;"
  61. clearable
  62. :options="deptTree"
  63. change-on-select
  64. ></el-cascader>
  65. </el-form-item>
  66. </el-col>
  67. <el-col :span="12">
  68. <el-form-item label="入职日期" prop="accedence_time" :label-width="formLabelWidth">
  69. <el-date-picker
  70. style="width:100%;"
  71. v-model="detailData.accedence_time"
  72. type="date"
  73. value-format="timestamp"
  74. placeholder="选择日期"
  75. :picker-options="assistantOptions"
  76. ></el-date-picker>
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="8">
  80. <el-form-item label="上级" prop="superior_id" :label-width="formLabelWidth">
  81. <el-select placeholder="请选择,可搜索" clearable filterable v-model="detailData.superior_id">
  82. <el-option
  83. v-for="item in employeeList"
  84. :key="item.id"
  85. :label="item.name"
  86. :value="item.id"
  87. ></el-option>
  88. </el-select>
  89. </el-form-item>
  90. </el-col>
  91. <el-col :span="8">
  92. <!-- <div style="height: 30px;"></div> -->
  93. <el-form-item
  94. label="用户状态"
  95. prop="status"
  96. :label-width="formLabelWidth"
  97. style="width:255px;"
  98. >
  99. <el-select v-model="detailData.status">
  100. <el-option
  101. v-for="item in employeeStatus"
  102. :key="item.value"
  103. :label="item.label"
  104. :value="item.value"
  105. ></el-option>
  106. </el-select>
  107. </el-form-item>
  108. </el-col>
  109. <el-col :span="8">
  110. <el-form-item
  111. label="性别"
  112. prop="sex"
  113. :label-width="formLabelWidth"
  114. style="width:250px;"
  115. >
  116. <el-select v-model="detailData.sex">
  117. <el-option
  118. v-for="item in sexOptions"
  119. :key="item.value"
  120. :label="item.label"
  121. :value="item.value"
  122. ></el-option>
  123. </el-select>
  124. </el-form-item>
  125. </el-col>
  126. </el-row>
  127. </el-tab-pane>
  128. <el-tab-pane label="固定积分" name="sec">
  129. <div style="height: 30px;"></div>
  130. <el-form-item v-for="(val,index) in fixed_rule" :key="index" :label="val.name" label-width="100px">
  131. <el-checkbox-group v-model="val.checked">
  132. <el-checkbox v-for="i in val.item" :label="i.id" :key="i.id">{{i.content}}</el-checkbox>
  133. </el-checkbox-group>
  134. </el-form-item>
  135. </el-tab-pane>
  136. </el-tabs>
  137. <div style=" text-align: center;">
  138. <el-button type="primary" :loading="loading" plain @click="submitForm('detailForm')">保存</el-button>
  139. <el-button plain @click="discardBack">取消</el-button>
  140. </div>
  141. </el-form>
  142. </div>
  143. </template>
  144. <script>
  145. import qs from "qs";
  146. export default {
  147. data() {
  148. const validateCompanyId = (rule, value, callback) => {
  149. let validValue = value
  150. ? value.replace(/\s/g, "").replace(/&nbsp;/gi, "")
  151. : value;
  152. if (!validValue) {
  153. return callback(new Error("请填写工号"));
  154. }
  155. let illegalChar = /[\uFF00-\uFFFF]/;
  156. if (illegalChar.test(value)) {
  157. return callback(new Error("有效工号中不能使用全角字符,请重新填写"));
  158. } else {
  159. callback();
  160. }
  161. };
  162. const validateName = (rule, value, callback) => {
  163. let validValue = value
  164. ? value.replace(/\s/g, "").replace(/&nbsp;/gi, "")
  165. : value;
  166. if (!validValue) {
  167. return callback(new Error("请填写姓名"));
  168. } else {
  169. callback();
  170. }
  171. };
  172. const validateTel = (rule, value, callback) => {
  173. let validValue = value
  174. ? value.replace(/\s/g, "").replace(/&nbsp;/gi, "")
  175. : value;
  176. if (!validValue) {
  177. return callback(new Error("请填写手机号码"));
  178. }
  179. let pattern = /^1\d{10}$/;
  180. if (pattern.test(value)) {
  181. callback();
  182. } else {
  183. return callback(new Error("无效的手机号,请重新输入"));
  184. }
  185. };
  186. const validatePassword = (rule, value, callback) => {
  187. if (!this.editMode) {
  188. if (!value) {
  189. return callback(new Error("请填写密码"));
  190. }
  191. if (value.length < 5) {
  192. return callback(new Error("密码长度应至少在5位或以上"));
  193. }
  194. } else {
  195. if (value && value.length < 5) {
  196. return callback(new Error("密码长度应至少在5位或以上"));
  197. }
  198. }
  199. callback();
  200. };
  201. const validatePasswordCheck = (rule, value, callback) => {
  202. if (!this.editMode || this.detailData.password) {
  203. if (!value) {
  204. console.log(value);
  205. return callback(new Error("请再次填写密码确认"));
  206. }
  207. if (value.length < 5) {
  208. return callback(new Error("密码长度应至少在5位或以上"));
  209. }
  210. if (value != this.detailData.password) {
  211. return callback(new Error("两次输入的密码不一致,请核对后再输入"));
  212. }
  213. }
  214. callback();
  215. };
  216. const validateMailAddress = (rule, value, callback) => {
  217. if (!value) {
  218. return callback();
  219. }
  220. let pattern = /^(([^<>()\[\]\\.,;:\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,}))$/;
  221. if (!pattern.test(String(value).toLowerCase())) {
  222. return callback(new Error("不是合法的邮箱地址,请重新输入"));
  223. }
  224. callback();
  225. };
  226. let isEditMode = this.$route.params.targetId > 0 ? true : false;
  227. return {
  228. loading:false,
  229. activeName: "first",
  230. editMode: false,
  231. profile: this.$store.getters.user_info,
  232. dialogTableVisible: false,
  233. dialogCreateCategoryVisible: false,
  234. formLabelWidth: "105px",
  235. fixed_rule: [],
  236. detailData: {
  237. id: "",
  238. company_id: "",
  239. name: "",
  240. tel: "",
  241. status: 1,
  242. sex: 0,
  243. mail_address: "",
  244. accedence_time: "",
  245. superior_id: "",
  246. dept_id: []
  247. },
  248. employeeStatus: [
  249. {
  250. value: 1,
  251. label: "正常"
  252. },
  253. {
  254. value: 2,
  255. label: "请假"
  256. },
  257. {
  258. value: 0,
  259. label: "离职"
  260. },
  261. {
  262. value: -1,
  263. label: "禁用"
  264. }
  265. ],
  266. sexOptions: [
  267. {
  268. value: 0,
  269. label: "男"
  270. },
  271. {
  272. value: 1,
  273. label: "女"
  274. }
  275. ],
  276. deptTree: [],
  277. employeeList: [],
  278. assistantOptions: {
  279. disabledDate(time) {
  280. let date = new Date();
  281. var lastDayOfThisMonth = new Date(
  282. date.getFullYear(),
  283. date.getMonth() + 1,
  284. 0
  285. );
  286. return time.getTime() > lastDayOfThisMonth;
  287. },
  288. shortcuts: [
  289. {
  290. text: "今天",
  291. onClick(picker) {
  292. picker.$emit("pick", new Date());
  293. }
  294. },
  295. {
  296. text: "昨天",
  297. onClick(picker) {
  298. const date = new Date();
  299. date.setTime(date.getTime() - 3600 * 1000 * 24);
  300. picker.$emit("pick", date);
  301. }
  302. },
  303. {
  304. text: "本周一",
  305. onClick(picker) {
  306. const date = new Date();
  307. date.setTime(
  308. date.getTime() + 3600 * 1000 * 24 * (1 - date.getDay())
  309. );
  310. picker.$emit("pick", date);
  311. }
  312. }
  313. ]
  314. },
  315. rules: {
  316. company_id: [{ validator: validateCompanyId, trigger: "blur" }],
  317. name: [{ validator: validateName, trigger: "blur" }],
  318. tel: [{ validator: validateTel, trigger: "blur" }],
  319. password: [{ validator: validatePassword, trigger: "blur" }],
  320. password_check: [{ validator: validatePasswordCheck, trigger: "blur" }],
  321. mail_address: [{validator: validateMailAddress, trigger: "blur" }]
  322. }
  323. };
  324. },
  325. methods: {
  326. //获取基本数据
  327. loadBaseData: function() {
  328. let params = {
  329. site_id: this.profile.site_id,
  330. get_employee_list: 1
  331. };
  332. var self = this;
  333. this.$http('get',"/integral.php/ajax_request_common/get_org_base",params)
  334. .then(function(response) {
  335. if (response.status == 200) {
  336. let jsonData = response.data;
  337. try {
  338. self.deptTree = jsonData.tree;
  339. self.employeeList = jsonData.employee_list;
  340. self.$emit(
  341. "update-page-title",
  342. " - " + (self.detailData.name ? self.detailData.name : "新建")
  343. );
  344. } catch (err) {
  345. console.log(err);
  346. }
  347. }
  348. })
  349. .catch(function(error) {
  350. console.log(error);
  351. });
  352. },
  353. get_fixed_rule(employeeId) {
  354. let params = {
  355. employee_id: employeeId
  356. };
  357. var self = this;
  358. this.$http('get',"/integral.php/ajax_request_common/get_fixed_rule",params)
  359. .then(function(response) {
  360. if (response.status == 200) {
  361. let jsonData = response.data;
  362. try {
  363. for (let i in jsonData.data) {
  364. jsonData.data[i]["value"] = [];
  365. for (let j in jsonData.data[i].item) {
  366. if (jsonData.data[i].item[j].checked == 1) {
  367. jsonData.data[i]["value"].push(jsonData.data[i].item[j].id);
  368. }
  369. }
  370. }
  371. self.fixed_rule = jsonData.data;
  372. } catch (err) {
  373. console.log(err);
  374. }
  375. }
  376. })
  377. .catch(function(error) {
  378. console.log(error);
  379. });
  380. },
  381. //获取用户数据
  382. loadEmployeeDetail: function(employeeId) {
  383. this.get_fixed_rule(employeeId);
  384. let params = {
  385. id: employeeId
  386. };
  387. var self = this;
  388. this.$http('get',"/integral.php/ajax_request_common/get_employee_info",params)
  389. .then(function(response) {
  390. if (response.status == 200) {
  391. let jsonData = response.data;
  392. try {
  393. self.detailData = self.processDetailData(jsonData);
  394. } catch (err) {
  395. console.log(err);
  396. }
  397. }
  398. })
  399. .catch(function(error) {
  400. console.log(error);
  401. });
  402. },
  403. discardBack: function() {
  404. this.$parent.$parent.dialogTableVisible = false;
  405. },
  406. formrset: function() {
  407. this.$refs["detailForm"].resetFields();
  408. },
  409. submitForm: function(formName) {
  410. var form = this.$refs[formName];
  411. var self = this;
  412. form.validate(valid => {
  413. if (valid) {
  414. if (form) {
  415. self.sendSaveRequest();
  416. }
  417. } else {
  418. //console.log('验证未通过');
  419. return false;
  420. }
  421. });
  422. },
  423. sendSaveRequest: function() {
  424. this.loading = true
  425. var formData = {};
  426. var dataObj = this.detailData;
  427. for (let item in dataObj) {
  428. if (item == "password_check") {
  429. continue;
  430. } else if (item == "accedence_time") {
  431. if (!dataObj[item]) {
  432. continue;
  433. }
  434. formData[item] = parseInt(dataObj[item] / 1000);
  435. } else if (item == "dept_id") {
  436. var length = dataObj[item].length;
  437. formData[item] = length == 0 ? 0 : dataObj[item][length - 1];
  438. } else {
  439. if (!dataObj[item]) {
  440. if(item == 'sex' || item == 'status'){
  441. formData[item] = dataObj[item];
  442. }
  443. continue;
  444. }
  445. formData[item] = dataObj[item];
  446. }
  447. }
  448. formData["site_id"] = this.profile.site_id;
  449. for (let i in this.fixed_rule) {
  450. for (let j in this.fixed_rule[i].item) {
  451. if (
  452. this.fixed_rule[i].checked.indexOf(this.fixed_rule[i].item[j].id) >=
  453. 0
  454. ) {
  455. this.fixed_rule[i].item[j]["checked"] = 1;
  456. } else {
  457. this.fixed_rule[i].item[j]["checked"] = 0;
  458. }
  459. }
  460. }
  461. formData["fixed_rule"] = this.fixed_rule;
  462. if(!formData.superior_id){
  463. formData["superior_id"] = 0
  464. }
  465. let url = "/integral.php/ajax_request_common/";
  466. url += this.editMode ? "update_employee" : "add_employee";
  467. var self = this;
  468. this.$http("post",url,qs.stringify(formData),
  469. // headers: {
  470. // "Content-Type": "application/x-www-form-urlencoded"
  471. // }
  472. )
  473. .then(function(response) {
  474. self.loading = false
  475. var message = "";
  476. var status = 0;
  477. if (response.status == 200) {
  478. var data = response.data;
  479. status = isNaN(data.status) ? 0 : parseInt(data.status);
  480. let actionName = self.editMode ? "修改员工信息" : "新增员工";
  481. switch (status) {
  482. case 1:
  483. message = actionName + "成功";
  484. break;
  485. case -1:
  486. message = "表单参数错误";
  487. break;
  488. case -2:
  489. message = data.info ? data.info : actionName + "失败";
  490. self.$refs[data.target_field].focus();
  491. self.$refs[data.target_field].$parent.clearValidate();
  492. break;
  493. default:
  494. message = data.info ? data.info : actionName + "失败";
  495. }
  496. } else {
  497. message = "服务器出现问题";
  498. }
  499. self.$message({
  500. message: message,
  501. type: status == 1 ? "success" : "error"
  502. });
  503. if (status == 1) {
  504. self.$refs["detailForm"].resetFields();
  505. self.$parent.$parent.dialogTableVisible = false;
  506. self.$parent.$parent.loadEmployeeList();
  507. }
  508. })
  509. .catch(function(error) {
  510. console.log(error);
  511. });
  512. },
  513. clearForm() {
  514. this.detailData = {
  515. company_id: "",
  516. name: "",
  517. tel: "",
  518. status: 1,
  519. sex: 0,
  520. password: "",
  521. password_check: "",
  522. mail_address: "",
  523. accedence_time: "",
  524. superior_id: "",
  525. dept_id: []
  526. };
  527. this.$refs["detailForm"].clearValidate();
  528. },
  529. processDetailData: function(object) {
  530. //所属部门转换成插件需要的数组格式
  531. let pathStr = object.dept_id.toString();
  532. object.dept_id = pathStr.split(",").map(Number);
  533. //时间戳转换
  534. object.accedence_time *= 1000;
  535. object.superior_id =
  536. !isNaN(object.superior_id) && object.superior_id > 0
  537. ? parseInt(object.superior_id)
  538. : "";
  539. return object;
  540. }
  541. },
  542. created() {
  543. this.loadBaseData();
  544. if (this.$route.params.targetId > 0) {
  545. this.loadEmployeeDetail(this.$route.params.targetId);
  546. }
  547. }
  548. };
  549. </script>
  550. <style>
  551. .bmxx .el-dialog__body {
  552. padding: 30px 100px 20px 10px !important;
  553. }
  554. </style>