CpdmLeaveEdit.vue 16 KB

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