CpdmLeave.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. <script lang="ts" setup>
  2. import { ref, reactive, defineExpose } from 'vue'
  3. import { ElMessage, formatter, type ComponentSize, type FormInstance, type FormRules } from 'element-plus'
  4. import { leaveRecordApi, subLeaveApi } from '@/api/login';
  5. //格式化时间格式
  6. import { format } from 'date-fns/format';
  7. import CpdmLeaveEdit from './CpdmLeaveEdit.vue';
  8. const editFlag = ref<any>()
  9. const leave_visible = ref<boolean>(false)
  10. const open = () => {
  11. leave_visible.value = true;
  12. }
  13. const type = ref<string>('1')
  14. //************表单数据******************/
  15. //设置表单大小
  16. const formSize = ref<ComponentSize>('default')
  17. const ruleFormRef = ref<any>()
  18. interface RuleForm {
  19. leaveType: string
  20. userPhone: string
  21. monitorName: string
  22. dormitory: string
  23. destination: string
  24. reason: string
  25. isKnow: string
  26. companionsPhone: string
  27. motherPhone: string
  28. fatherPhone: string
  29. travelMode: string
  30. startTime: string
  31. endTime: string
  32. }
  33. const ruleForm = reactive<RuleForm>({
  34. //是否离郑
  35. leaveType: '0',
  36. //本人手机号
  37. userPhone: '',
  38. //班长姓名
  39. monitorName: '',
  40. //宿舍:
  41. dormitory: '',
  42. //出行方式
  43. destination: '',
  44. //请假原因
  45. reason: '',
  46. //父母是否知情
  47. isKnow: '1',
  48. //同行人电话
  49. companionsPhone: '',
  50. //母亲电话
  51. motherPhone: '',
  52. //父亲电话
  53. fatherPhone: '',
  54. //出行方式
  55. travelMode: '',
  56. //请假时间
  57. startTime: '',
  58. //返校时间
  59. endTime: ''
  60. })
  61. const rules = reactive<FormRules<RuleForm>>({
  62. leaveType: [
  63. { required: true, message: '请填写是否离郑', trigger: 'blur' },
  64. ],
  65. userPhone: [
  66. { required: true, message: '请填写手机号', trigger: 'blur' },
  67. { pattern: /^1[3456789]\d{9}$/, message: '手机号码格式不正确', trigger: 'blur' }
  68. ],
  69. monitorName: [
  70. { required: false, message: '请填写班长姓名', trigger: 'blur' },
  71. ],
  72. dormitory: [
  73. { required: true, message: '请填写宿舍信息', trigger: 'blur' },
  74. ],
  75. destination: [
  76. { required: true, message: '请填写出行目的', trigger: 'blur' },
  77. ],
  78. reason: [
  79. { required: true, message: '请填写请假原因', trigger: 'blur' },
  80. ],
  81. isKnow: [
  82. { required: true, message: '请填写父母是否知情', trigger: 'blur' },
  83. ],
  84. companionsPhone: [
  85. { required: false, message: '请填写同行人电话', trigger: 'blur' },
  86. { pattern: /^1[3456789]\d{9}$/, message: '手机号码格式不正确', trigger: 'blur' }
  87. ],
  88. motherPhone: [
  89. { required: true, message: '请填写母亲电话', trigger: 'blur' },
  90. { pattern: /^1[3456789]\d{9}$/, message: '手机号码格式不正确', trigger: 'blur' }
  91. ],
  92. fatherPhone: [
  93. { required: true, message: '请填写父亲电话', trigger: 'blur' },
  94. { pattern: /^1[3456789]\d{9}$/, message: '手机号码格式不正确', trigger: 'blur' }
  95. ],
  96. travelMode: [
  97. { required: true, message: '请填写出行方式', trigger: 'blur' },
  98. ],
  99. startTime: [
  100. { required: true, message: '请填写请假时间', trigger: 'change' },
  101. {
  102. validator: function (rule, value, callback) {
  103. if (value !== '' && ruleForm.endTime !== '') {
  104. let startTime = new Date(value).getTime();
  105. let endTime = new Date(ruleForm.endTime).getTime()
  106. //先判断都不为空
  107. if (startTime >= endTime) {
  108. callback(new Error('请假时间应小于返校时间'))
  109. } else {
  110. callback()
  111. }
  112. } else {
  113. callback()
  114. }
  115. }, trigger: 'change'
  116. },
  117. ],
  118. endTime: [
  119. { required: true, message: '请填写返校时间', trigger: 'change' },
  120. {
  121. validator: function (rule, value, callback) {
  122. if (value !== '' && ruleForm.startTime !== '') {
  123. let startTime = new Date(ruleForm.startTime).getTime();
  124. let endTime = new Date(value).getTime()
  125. if (endTime <= startTime) {
  126. callback(new Error('返校时间应大于请假时间'))
  127. } else {
  128. callback()
  129. }
  130. } else {
  131. callback()
  132. }
  133. //
  134. }, trigger: 'change'
  135. },
  136. ],
  137. })
  138. //提交表单
  139. //按钮状态改变
  140. const buttonStatus = ref<boolean>(false)
  141. const submitForm = async (formEl: FormInstance | undefined) => {
  142. buttonStatus.value = true
  143. //设置单独校验的字段
  144. if (!formEl) {
  145. buttonStatus.value = false
  146. return
  147. }
  148. await formEl.validate(async (valid, fields) => {
  149. if (valid) {
  150. console.log('submit!')
  151. //调用用户提交信息的代码
  152. //判断返校时间是否大于请假时间
  153. let leaveTime = new Date()
  154. subLeaveInfo()
  155. } else {
  156. buttonStatus.value = false
  157. console.log('error submit!', fields)
  158. }
  159. })
  160. }
  161. //时间格式化
  162. //提交表单信息
  163. const subLeaveInfo = async () => {
  164. //提交表单信息
  165. //组装该用户需要提交的信息
  166. let params = {}
  167. //判断当前的状态是否离郑
  168. //1是不离郑
  169. if (ruleForm.leaveType == '0') {
  170. params = {
  171. userPhone: ruleForm.userPhone, //本人手机号
  172. destination: ruleForm.destination,//出行目的地
  173. dormitory: ruleForm.dormitory,//宿舍
  174. endTime: format(ruleForm.endTime, 'yyyy-MM-dd HH:mm:ss'),//返校时间
  175. fatherPhone: ruleForm.fatherPhone,//父亲手机号
  176. isKnow: ruleForm.isKnow,//父母是否知情
  177. leaveType: ruleForm.leaveType,//请假类型--离郑不离郑
  178. // monitorName: ruleForm.monitorName,//班长名字
  179. motherPhone: ruleForm.motherPhone,//母亲电话
  180. reason: ruleForm.reason,//请假原因
  181. startTime: format(ruleForm.startTime, 'yyyy-MM-dd HH:mm:ss'),//请假开始时间
  182. travelMode: ruleForm.travelMode,//出行方式
  183. // companionsPhone: ruleForm.companionsPhone, //同行人电话
  184. }
  185. } else {
  186. params = {
  187. userPhone: ruleForm.userPhone, //本人手机号
  188. destination: ruleForm.destination,//出行目的地
  189. dormitory: ruleForm.dormitory,//宿舍
  190. endTime: format(ruleForm.endTime, 'yyyy-MM-dd HH:mm:ss'),//返校时间
  191. fatherPhone: ruleForm.fatherPhone,//父亲手机号
  192. isKnow: ruleForm.isKnow,//父母是否知情
  193. leaveType: ruleForm.leaveType,//请假类型--离郑不离郑
  194. monitorName: ruleForm.monitorName,//班长名字
  195. motherPhone: ruleForm.motherPhone,//母亲电话
  196. reason: ruleForm.reason,//请假原因
  197. startTime: format(ruleForm.startTime, 'yyyy-MM-dd HH:mm:ss'),//请假开始时间
  198. travelMode: ruleForm.travelMode,//出行方式
  199. companionsPhone: ruleForm.companionsPhone, //同行人电话
  200. }
  201. }
  202. let res: any = await subLeaveApi(params)
  203. console.log(res)
  204. //跳转测试记录
  205. if (res.code == 200) {
  206. //结束了
  207. buttonStatus.value = false
  208. ElMessage({
  209. type: 'success',
  210. message: '提交成功'
  211. })
  212. //跳转到请假记录
  213. type.value = '2'
  214. leaveRecord()
  215. //开始查询请假记录的字段
  216. //
  217. } else {
  218. buttonStatus.value = false
  219. }
  220. }
  221. //清除表单的校验
  222. const resetData = (formEl: FormInstance | undefined) => {
  223. if (!formEl) return
  224. formEl.resetFields()
  225. }
  226. //是否离郑状态改变
  227. const leaveStatus = (val: string) => {
  228. // resetData(ruleFormRef)
  229. if (val == '1') {
  230. rules.monitorName = [
  231. { required: true, message: '请填写班长姓名', trigger: 'blur' },
  232. ]
  233. rules.companionsPhone = [
  234. { required: true, message: '请填写同行人电话', trigger: 'blur' },
  235. { pattern: /^1[3456789]\d{9}$/, message: '手机号码格式不正确', trigger: 'blur' }
  236. ]
  237. //这样回触发校验
  238. // rules!.monitorName[0].required = true;
  239. // rules!.companionsPhone[0].required = true
  240. }
  241. ruleFormRef.value.clearValidate()
  242. }
  243. //类型方法
  244. const typeFun = (val: string) => {
  245. if (val == '1') {
  246. //清空表单
  247. ruleFormRef.value.clearValidate()
  248. ruleFormRef.value.resetFields()
  249. } else {
  250. //查询记录列表
  251. leaveRecord()
  252. }
  253. }
  254. //请假记录列表
  255. let tableData = ref<any>([])
  256. //第几页
  257. const pageNum = ref<number>(1)
  258. //每页多少条
  259. const pageSize = ref<number>(10)
  260. //总条数
  261. const total = ref<number>(0)
  262. const leaveRecord = async () => {
  263. //leaveRecordApi
  264. let params = {
  265. pageNum: pageNum.value,
  266. pageSize: pageSize.value
  267. }
  268. let res: any = await leaveRecordApi(params)
  269. tableData.value = res.data.content
  270. total.value = res.data.totalElements
  271. }
  272. //格式化是否离郑
  273. const leaveTypeFormatter = (val: any) => {
  274. if (val.leaveType == '0') {
  275. return '不离郑'
  276. } else {
  277. return '离郑'
  278. }
  279. }
  280. //格式化父母是否知情
  281. const isKnowFormatter = (val: any) => {
  282. if (val.isKnow == '1') {
  283. return '知情'
  284. } else {
  285. return '不知情'
  286. }
  287. }
  288. //格式审核状态状态
  289. const auditStatusFormatter = (val: any) => {
  290. if (val.auditStatus == '0') {
  291. return '待审批'
  292. } else {
  293. return '已审批'
  294. }
  295. }
  296. //审核结果
  297. const auditResultFormatter = (val: any) => {
  298. if (val.auditResult == null) {
  299. return ''
  300. } else {
  301. if (val.auditResult == '0') {
  302. return '驳回'
  303. } else {
  304. return '通过'
  305. }
  306. }
  307. }
  308. //分页显示
  309. const handleCurrentChange = (val: number) => {
  310. pageNum.value = val
  311. leaveRecord()
  312. }
  313. //需要重新编辑操作
  314. const editFun = (val: any) => {
  315. editFlag.value.open(val)
  316. }
  317. const listFun = () => {
  318. //刷新列表
  319. leaveRecord()
  320. }
  321. defineExpose({ open })
  322. </script>
  323. <template>
  324. <el-dialog v-model="leave_visible" :show-close="true" width="80%" top="5vh" style="border-radius: 40px; ">
  325. <template #header="{ close, titleId, titleClass }">
  326. <div class="leave_title">请假</div>
  327. <el-radio-group v-model="type" size="large" @change="typeFun">
  328. <el-radio-button label="我要请假" value="1" />
  329. <el-radio-button label="请假记录" value="2" />
  330. </el-radio-group>
  331. <div v-show="type == '1'" class="leave">
  332. <el-form ref="ruleFormRef" style="display: flex;flex-wrap: wrap;" :model="ruleForm" :rules="rules"
  333. :validate-on-rule-change=false label-width="auto" class="demo-ruleForm" :size="formSize"
  334. status-icon>
  335. <el-form-item label="是否离郑" prop="leaveType">
  336. <el-radio-group v-model="ruleForm.leaveType" @change="leaveStatus">
  337. <el-radio value="0">不离郑</el-radio>
  338. <el-radio value="1">离郑</el-radio>
  339. </el-radio-group>
  340. </el-form-item>
  341. <el-form-item label="本人手机号码" prop="userPhone">
  342. <el-input v-model="ruleForm.userPhone" placeholder="请输入本人手机号码" />
  343. </el-form-item>
  344. <el-form-item label="班长姓名" prop="monitorName" v-if="ruleForm.leaveType == '1'">
  345. <el-input v-model="ruleForm.monitorName" placeholder="请输入班长姓名" />
  346. </el-form-item>
  347. <el-form-item label="宿舍" prop="dormitory">
  348. <el-input v-model="ruleForm.dormitory" placeholder="例如松15-XXX" />
  349. </el-form-item>
  350. <el-form-item label="请假原因" prop="reason">
  351. <el-input v-model="ruleForm.reason" type="textarea" placeholder="一定要写清楚,例如拔牙" />
  352. </el-form-item>
  353. <el-form-item label="出行目的地" prop="destination">
  354. <el-input v-model="ruleForm.destination" type="textarea"
  355. placeholder="一定要写清楚,例如郑州市中原区高新区郑州中心医院" />
  356. </el-form-item>
  357. <el-form-item label="父母是否知情" prop="isKnow">
  358. <el-radio-group v-model="ruleForm.isKnow">
  359. <el-radio value="1">知情</el-radio>
  360. <el-radio value="0">不知情</el-radio>
  361. </el-radio-group>
  362. </el-form-item>
  363. <el-form-item label="同行人电话" prop="companionsPhone" v-if="ruleForm.leaveType == '1'">
  364. <el-input v-model="ruleForm.companionsPhone" placeholder="请输入同行人电话" />
  365. </el-form-item>
  366. <el-form-item label="母亲电话" prop="motherPhone">
  367. <el-input v-model="ruleForm.motherPhone" placeholder="请输入母亲电话" />
  368. </el-form-item>
  369. <el-form-item label="父亲电话" prop="fatherPhone">
  370. <el-input v-model="ruleForm.fatherPhone" placeholder="请输入父亲电话" />
  371. </el-form-item>
  372. <el-form-item label="出行方式" prop="travelMode">
  373. <el-input v-model="ruleForm.travelMode" placeholder="请输入出行方式" />
  374. </el-form-item>
  375. <el-form-item label="请假时间" prop="startTime">
  376. <el-date-picker v-model="ruleForm.startTime" type="datetime" placeholder="请输入请假时间"
  377. style="width: 100%;" />
  378. </el-form-item>
  379. <el-form-item label="返校时间" prop="endTime">
  380. <el-date-picker v-model="ruleForm.endTime" type="datetime" placeholder="请输入返校时间"
  381. style="width: 100%;" />
  382. </el-form-item>
  383. </el-form>
  384. <div class="reset_sub">
  385. <el-button @click="resetData(ruleFormRef)">重置</el-button>
  386. <el-button type="success" @click="submitForm(ruleFormRef)" :disabled="buttonStatus">提交</el-button>
  387. </div>
  388. <div class="leave_tip"> 温馨提示:(天气寒冷,晚上行人少,为保证大家安全,返校时间尽量在21:00之前)
  389. </div>
  390. </div>
  391. <div v-show="type == '2'">
  392. <el-table :data="tableData" style="width: 100%;height: 60vh;"
  393. :header-cell-style="{ background: '#F8F8F8', color: '#606266' }">
  394. <el-table-column fixed prop="leaveType" label="是否离郑" width="" :formatter="leaveTypeFormatter" />
  395. <el-table-column prop="userPhone" label="本人手机号码" width="" />
  396. <el-table-column prop="monitorName" label="班长姓名" width="" />
  397. <el-table-column prop="dormitory" label="宿舍" width="" />
  398. <el-table-column prop="reason" label="请假原因" width="" />
  399. <el-table-column prop="destination" label="出行目的地" width="" />
  400. <el-table-column prop="isKnow" label="父母是否知情" width="" :formatter="isKnowFormatter" />
  401. <el-table-column prop="companionsPhone" label="同行人电话" width="" />
  402. <el-table-column prop="motherPhone" label="母亲电话" width="" />
  403. <el-table-column prop="fatherPhone" label="父亲电话" width="" />
  404. <el-table-column prop="travelMode" label="出行方式" width="" />
  405. <el-table-column prop="startTime" label="请假时间" width="" />
  406. <el-table-column prop="endTime" label="返校时间" width="" />
  407. <el-table-column fixed="right" prop="auditSuggest" label="审核建议" width="" />
  408. <el-table-column fixed="right" prop="auditStatus" label="审核状态" width=""
  409. :formatter="auditStatusFormatter" />
  410. <el-table-column fixed="right" prop="auditResult" label="审核结果" width=""
  411. :formatter="auditResultFormatter" />
  412. <el-table-column fixed="right" label="操作" min-width="">
  413. <template #default="scoped">
  414. <el-button v-show="scoped.row.auditResult == null" link type="primary" size="small"
  415. @click="editFun(scoped.row)">重新编辑</el-button>
  416. </template>
  417. </el-table-column>
  418. </el-table>
  419. <el-pagination background v-model:current-page="pageNum" :page-size="pageSize"
  420. layout="total, prev, pager, next" :total="total" @current-change="handleCurrentChange" />
  421. </div>
  422. </template>
  423. <CpdmLeaveEdit ref="editFlag" @search='listFun' />
  424. </el-dialog>
  425. </template>
  426. <style lang="scss" scoped>
  427. .leave {
  428. :deep(.el-form-item) {
  429. width: 50% !important;
  430. margin-top: 10px;
  431. }
  432. :deep(.el-input__wrapper) {
  433. align-items: center;
  434. background-color: #F7F7F7 !important;
  435. border-radius: 40px !important;
  436. // border: none;
  437. // outline: none !important;
  438. box-shadow: none;
  439. }
  440. :deep(.el-form-item__content) {
  441. align-items: flex-start !important;
  442. }
  443. }
  444. .reset_sub {
  445. display: flex;
  446. justify-content: space-around;
  447. }
  448. .leave_tip {
  449. margin-top: 20px;
  450. color: #5c5c5c;
  451. text-align: center;
  452. font-size: 12px;
  453. }
  454. .leave_title {
  455. text-align: center;
  456. color: #333333;
  457. font-weight: 700;
  458. font-size: 16px;
  459. margin-bottom: 20px;
  460. }
  461. </style>