DrawerFrom.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. <script setup lang="ts">
  2. import md5 from 'js-md5'
  3. import { ElMessage } from 'element-plus'
  4. import { reuls_validator } from './relus'
  5. import { GlobalStore } from '@/stores/index'
  6. import Drawer from '@/components/Drawer/index.vue'
  7. import { User_Power_List } from '@/api/role/index'
  8. import { ref, reactive, onMounted, nextTick } from 'vue'
  9. import type { FormInstance, FormRules } from 'element-plus'
  10. import {User_Post_List, User_Add, User_Edit, ColdVerify_User_List} from '@/api/user/index'
  11. const validate_checkPass = (rule: any, value: any, callback: any) => {
  12. if (checkPass.value === '') {
  13. callback(new Error('请再输入一次密码'))
  14. } else if (checkPass.value !== form.value.T_pass) {
  15. callback(new Error('两次密码校验不一致'))
  16. } else {
  17. callback()
  18. }
  19. }
  20. const checkPass = ref('')
  21. const formRef = ref()
  22. const _PASS = '******'
  23. let userPowerList: any = []
  24. let coldVerifyUserList: any = []
  25. let userPostList = ref<any[]>([])
  26. const globalStore = GlobalStore()
  27. const formLabelWidth = ref('105px')
  28. const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
  29. const rules = reactive<FormRules>({
  30. ...reuls_validator,
  31. checkPass: [{ required: true, validator: validate_checkPass, trigger: 'blur' }]
  32. })
  33. let form = ref({
  34. T_power: '',
  35. T_name: '',
  36. T_user: '',
  37. T_pass: '',
  38. T_dept: '',
  39. T_post: '',
  40. T_sex: '',
  41. T_id_card: '',
  42. T_nation: '',
  43. T_school: '',
  44. T_major: '',
  45. T_education: '',
  46. T_marry: '',
  47. T_phone: '',
  48. T_entry_time: '',
  49. T_spouse_name: '',
  50. T_entry_type: '',
  51. T_contract_start_time: '',
  52. T_contract_end_time: '',
  53. T_remark: '',
  54. T_positive_time: '',
  55. T_spouse_phone: '',
  56. T_expire: '',
  57. T_dept_leader: '',
  58. T_verify_cold_uuid: ''
  59. })
  60. const getUserPowerList = async () => {
  61. const params = {
  62. User_tokey: globalStore.GET_User_tokey,
  63. page: 1,
  64. page_z: 9999
  65. }
  66. const res: any = await User_Power_List(params)
  67. userPowerList = res.Data.Data
  68. }
  69. const getColdVerifyUserList = async () => {
  70. const res: any = await ColdVerify_User_List({})
  71. coldVerifyUserList = res.Data.List
  72. }
  73. const changeDept = async (val: number) => {
  74. const res: any = await User_Post_List({ T_dept: val })
  75. userPostList.value = res.Data
  76. }
  77. const resetForm = (formEl: FormInstance | undefined) => {
  78. if (!formEl) return
  79. formEl.resetFields()
  80. checkPass.value = ''
  81. }
  82. const callbackDrawer = (done: () => void) => {
  83. done()
  84. nextTick(() => {
  85. resetForm(formRef.value)
  86. })
  87. }
  88. const openDrawer = () => {
  89. drawerRef.value?.openDrawer()
  90. }
  91. const AddUser = (formEl: FormInstance | undefined) => {
  92. if (!formEl) return
  93. formEl.validate(async valid => {
  94. if (valid) {
  95. let res: any = {}
  96. if (props.action) {
  97. form.value.T_pass = md5(form.value.T_pass)
  98. res = await User_Add(form.value)
  99. } else {
  100. if (form.value.T_pass === _PASS) form.value.T_pass = ''
  101. else form.value.T_pass = md5(form.value.T_pass)
  102. res = await User_Edit(form.value)
  103. }
  104. if (res.Code === 200) {
  105. ElMessage.success(`${props.action ? '添加' : '编辑'}成功!`)
  106. nextTick(() => {
  107. drawerRef.value?.closeDrawer()
  108. emit('onTableList')
  109. resetForm(formRef.value)
  110. emit('onaction', true)
  111. })
  112. }
  113. } else {
  114. return
  115. }
  116. })
  117. }
  118. const DataEcho = async (row: any) => {
  119. row.T_entry_type = +row.T_entry_type
  120. row.T_pass = _PASS
  121. checkPass.value = _PASS
  122. const res: any = await User_Post_List({ T_dept: row.T_dept })
  123. userPostList.value = res.Data
  124. nextTick(() => {
  125. form.value = { ...row }
  126. })
  127. }
  128. onMounted(() => {
  129. if (userPowerList.length <= 0) {
  130. getUserPowerList()
  131. }
  132. if (coldVerifyUserList.length <= 0) {
  133. getColdVerifyUserList()
  134. }
  135. })
  136. const emit = defineEmits<{ (event: 'onTableList'): void; (event: 'onaction', val: boolean): void }>()
  137. const props = defineProps<{ action: boolean }>()
  138. defineExpose({
  139. openDrawer,
  140. callbackDrawer,
  141. DataEcho
  142. })
  143. </script>
  144. <template>
  145. <Drawer ref="drawerRef" :handleClose="callbackDrawer">
  146. <template #header="{ params }">
  147. <h4 :id="params.titleId" :class="params.titleClass">{{ action ? '添加' : '编辑' }} - 账户管理</h4>
  148. </template>
  149. <el-form :model="form" ref="formRef" :rules="rules">
  150. <el-form-item label="角色权限:" :label-width="formLabelWidth" prop="T_power">
  151. <el-select v-model="form.T_power" placeholder="请选择角色">
  152. <el-option v-for="item in userPowerList" :key="item.T_id" :label="item.T_name" :value="item.T_id" />
  153. </el-select>
  154. </el-form-item>
  155. <el-form-item label="名称:" :label-width="formLabelWidth" prop="T_name">
  156. <el-input v-model="form.T_name" autocomplete="off" placeholder="名称" />
  157. </el-form-item>
  158. <el-form-item label="负责人:" :label-width="formLabelWidth" prop="T_dept_leader">
  159. <el-radio-group v-model="form.T_dept_leader">
  160. <el-radio :label="0">否</el-radio>
  161. <el-radio :label="1">是</el-radio>
  162. </el-radio-group>
  163. </el-form-item>
  164. <el-form-item label="账号:" :label-width="formLabelWidth" prop="T_user">
  165. <el-input v-model="form.T_user" autocomplete="off" placeholder="账号" />
  166. </el-form-item>
  167. <el-form-item label="密码:" :label-width="formLabelWidth" prop="T_pass">
  168. <el-input v-model="form.T_pass" type="password" autocomplete="off" placeholder="密码" />
  169. </el-form-item>
  170. <el-form-item label="确认密码:" :label-width="formLabelWidth" prop="checkPass">
  171. <el-input v-model="checkPass" type="password" autocomplete="off" placeholder="确认密码" />
  172. </el-form-item>
  173. <el-form-item label="部门:" :label-width="formLabelWidth" prop="T_dept">
  174. <el-select v-model="form.T_dept" placeholder="请选择部门" @change="changeDept">
  175. <el-option v-for="item in globalStore.GET_Dept_List" :key="item.Id" :label="item.T_name" :value="item.Id" />
  176. </el-select>
  177. </el-form-item>
  178. <el-form-item label="岗位:" :label-width="formLabelWidth" prop="T_post">
  179. <el-select v-model="form.T_post" placeholder="请选择岗位">
  180. <el-option v-for="item in userPostList" :key="item.Id" :label="item.T_name" :value="item.Id" />
  181. </el-select>
  182. </el-form-item>
  183. <el-form-item label="性别:" :label-width="formLabelWidth" prop="T_sex">
  184. <el-radio-group v-model="form.T_sex" class="ml-4">
  185. <el-radio :label="1">男</el-radio>
  186. <el-radio :label="2">女</el-radio>
  187. </el-radio-group>
  188. </el-form-item>
  189. <el-form-item label="身份证号:" :label-width="formLabelWidth" prop="T_id_card">
  190. <el-input v-model="form.T_id_card" autocomplete="off" placeholder="身份证号" />
  191. </el-form-item>
  192. <el-form-item label="民族:" :label-width="formLabelWidth" prop="T_nation">
  193. <el-input v-model="form.T_nation" autocomplete="off" placeholder="民族" />
  194. </el-form-item>
  195. <el-form-item label="毕业院校:" :label-width="formLabelWidth" prop="T_school">
  196. <el-input v-model="form.T_school" autocomplete="off" placeholder="毕业院校" />
  197. </el-form-item>
  198. <el-form-item label="专业:" :label-width="formLabelWidth" prop="T_major">
  199. <el-input v-model="form.T_major" autocomplete="off" placeholder="专业" />
  200. </el-form-item>
  201. <el-form-item label="学历:" :label-width="formLabelWidth" prop="T_education">
  202. <el-input v-model="form.T_education" autocomplete="off" placeholder="学历" />
  203. </el-form-item>
  204. <el-form-item label="联系电话:" :label-width="formLabelWidth" prop="T_phone">
  205. <el-input v-model="form.T_phone" autocomplete="off" placeholder="联系电话" />
  206. </el-form-item>
  207. <el-form-item label="婚否:" :label-width="formLabelWidth" prop="T_marry">
  208. <el-radio-group v-model="form.T_marry" class="ml-4">
  209. <el-radio :label="0">未婚</el-radio>
  210. <el-radio :label="1">已婚</el-radio>
  211. </el-radio-group>
  212. </el-form-item>
  213. <el-form-item label="入职时间:" :label-width="formLabelWidth" prop="T_entry_time">
  214. <el-date-picker
  215. style="width: 100%"
  216. class="my-date-picker"
  217. v-model="form.T_entry_time"
  218. type="date"
  219. placeholder="入职时间"
  220. format="YYYY-MM-DD"
  221. value-format="YYYY-MM-DD"
  222. />
  223. </el-form-item>
  224. <el-form-item label="转正时间:" :label-width="formLabelWidth" prop="T_positive_time">
  225. <el-date-picker
  226. style="width: 100%"
  227. class="my-date-picker"
  228. v-model="form.T_positive_time"
  229. type="date"
  230. placeholder="转正时间"
  231. format="YYYY-MM-DD"
  232. value-format="YYYY-MM-DD"
  233. />
  234. </el-form-item>
  235. <el-form-item label="配偶姓名:" label-width="120px">
  236. <el-input v-model="form.T_spouse_name" autocomplete="off" placeholder="配偶姓名" />
  237. </el-form-item>
  238. <el-form-item label="配偶联系电话:" label-width="120px">
  239. <el-input v-model="form.T_spouse_phone" autocomplete="off" placeholder="配偶联系电话" />
  240. </el-form-item>
  241. <el-form-item label="入职类型:" :label-width="formLabelWidth" prop="T_entry_type">
  242. <el-radio-group v-model="form.T_entry_type" class="ml-4">
  243. <el-radio :label="1">全职</el-radio>
  244. <el-radio :label="2">兼职</el-radio>
  245. <el-radio :label="3">实习生</el-radio>
  246. </el-radio-group>
  247. </el-form-item>
  248. <el-form-item label="劳动合同开始时间:" label-width="160px" prop="T_contract_start_time">
  249. <el-date-picker
  250. style="width: 100%"
  251. class="my-date-picker"
  252. v-model="form.T_contract_start_time"
  253. type="date"
  254. placeholder="劳动合同开始时间"
  255. format="YYYY-MM-DD"
  256. value-format="YYYY-MM-DD"
  257. />
  258. </el-form-item>
  259. <el-form-item label="劳动合同结束时间:" label-width="160px" prop="T_contract_end_time">
  260. <el-date-picker
  261. style="width: 100%"
  262. class="my-date-picker"
  263. v-model="form.T_contract_end_time"
  264. type="date"
  265. placeholder="劳动合同结束时间"
  266. format="YYYY-MM-DD"
  267. value-format="YYYY-MM-DD"
  268. />
  269. </el-form-item>
  270. <el-form-item label="是否到期:" :label-width="formLabelWidth" prop="T_expire">
  271. <el-radio-group v-model="form.T_expire" class="ml-4">
  272. <el-radio :label="0">否</el-radio>
  273. <el-radio :label="1">是</el-radio>
  274. </el-radio-group>
  275. </el-form-item>
  276. <el-form-item label="关联冷链验证平台:" label-width="160px" prop="T_verify_cold_uuid">
  277. <el-select v-model="form.T_verify_cold_uuid" filterable placeholder="请选择">
  278. <el-option v-for="item in coldVerifyUserList" :key="item.T_uuid" :label="item.T_name" :value="item.T_uuid" />
  279. </el-select>
  280. </el-form-item>
  281. <el-form-item label="备注:" :label-width="formLabelWidth">
  282. <el-input v-model="form.T_remark" type="textarea" autocomplete="off" placeholder="备注" />
  283. </el-form-item>
  284. <el-form-item :label-width="formLabelWidth">
  285. <el-button v-if="action" color="#626aef" @click="AddUser(formRef)">添加</el-button>
  286. <el-button v-else color="#626aef" @click="AddUser(formRef)">修改</el-button>
  287. </el-form-item>
  288. </el-form>
  289. </Drawer>
  290. </template>
  291. <style scoped lang="scss"></style>