validate.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import { ElMessage } from 'element-plus'
  2. import { baseinfo } from '@/data/inpatient'
  3. export function nullPatient() {
  4. const patient = baseinfo()
  5. if (patient.inpatientNo && patient.admissTimes) {
  6. return false
  7. } else {
  8. ElMessage({
  9. message: '请先选择患者!',
  10. type: 'warning',
  11. duration: 2500,
  12. showClose: true,
  13. })
  14. return true
  15. }
  16. }
  17. function isValidPhone(phone) {
  18. const myreg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/
  19. return myreg.test(phone)
  20. }
  21. function isValidIdcard(card) {
  22. const provinces = {
  23. 11: '北京',
  24. 12: '天津',
  25. 13: '河北',
  26. 14: '山西',
  27. 15: '内蒙古',
  28. 21: '辽宁',
  29. 22: '吉林',
  30. 23: '黑龙江',
  31. 31: '上海',
  32. 32: '江苏',
  33. 33: '浙江',
  34. 34: '安徽',
  35. 35: '福建',
  36. 36: '江西',
  37. 37: '山东',
  38. 41: '河南',
  39. 42: '湖北',
  40. 43: '湖南',
  41. 44: '广东',
  42. 45: '广西',
  43. 46: '海南',
  44. 50: '重庆',
  45. 51: '四川',
  46. 52: '贵州',
  47. 53: '云南',
  48. 54: '西藏',
  49. 61: '陕西',
  50. 62: '甘肃',
  51. 63: '青海',
  52. 64: '宁夏',
  53. 65: '新疆',
  54. 71: '台湾',
  55. 81: '香港',
  56. 82: '澳门',
  57. 91: '国外',
  58. }
  59. //检查号码是否符合规范,包括长度,类型
  60. const isCardNo = function (card) {
  61. //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
  62. const reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/
  63. return reg.test(card)
  64. }
  65. //取身份证前两位,校验省份
  66. const checkProvince = function (card) {
  67. const provinceCode = card.substr(0, 2)
  68. return provinces[provinceCode]
  69. }
  70. //检查生日是否正确
  71. const checkBirthday = function (card) {
  72. const len = card.length
  73. //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
  74. if (len === 15) {
  75. const re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/
  76. let arr_data = card.match(re_fifteen)
  77. let year = arr_data[2]
  78. let month = arr_data[3]
  79. let day = arr_data[4]
  80. let birthday = new Date('19' + year + '/' + month + '/' + day)
  81. return verifyBirthday('19' + year, month, day, birthday)
  82. }
  83. //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
  84. if (len === 18) {
  85. const re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/
  86. let arr_data = card.match(re_eighteen)
  87. let year = arr_data[2]
  88. let month = arr_data[3]
  89. let day = arr_data[4]
  90. let birthday = new Date(year + '/' + month + '/' + day)
  91. return verifyBirthday(year, month, day, birthday)
  92. }
  93. return false
  94. }
  95. //校验日期
  96. const verifyBirthday = function (year, month, day, birthday) {
  97. const now = new Date()
  98. var now_year = now.getFullYear()
  99. //年月日是否合理
  100. if (birthday.getFullYear() == year && birthday.getMonth() + 1 == month && birthday.getDate() == day) {
  101. //判断年份的范围(3岁到120岁之间)
  102. var time = now_year - year
  103. return time >= 3 && time <= 120
  104. }
  105. return false
  106. }
  107. //校验位的检测
  108. const checkParity = function (card) {
  109. //15位转18位
  110. card = changeFivteenToEighteen(card)
  111. const len = card.length
  112. if (len === 18) {
  113. const arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
  114. const arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2')
  115. var cardTemp = 0,
  116. i,
  117. valnum
  118. for (i = 0; i < 17; i++) {
  119. cardTemp += card.substr(i, 1) * arrInt[i]
  120. }
  121. valnum = arrCh[cardTemp % 11]
  122. return valnum == card.substr(17, 1)
  123. }
  124. return false
  125. }
  126. //15位转18位身份证号
  127. const changeFivteenToEighteen = function (card) {
  128. if (card.length === 15) {
  129. const arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
  130. const arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2')
  131. var cardTemp = 0,
  132. i
  133. card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6)
  134. for (i = 0; i < 17; i++) {
  135. cardTemp += card.substr(i, 1) * arrInt[i]
  136. }
  137. card += arrCh[cardTemp % 11]
  138. return card
  139. }
  140. return card
  141. }
  142. if (!card) {
  143. return false
  144. }
  145. card = card.trim()
  146. return card !== '' && isCardNo(card) && checkProvince(card) && checkBirthday(card) && checkParity(card)
  147. }
  148. export function validateCovidAnswer(answer) {
  149. if (!answer.name) {
  150. return '请填写姓名!'
  151. }
  152. if (!isValidPhone(answer.phone)) {
  153. return '请填写正确的手机号!'
  154. }
  155. if (!answer.patientId) {
  156. if (!isValidIdcard(answer.idcard)) {
  157. return '请填写正确的身份证号!'
  158. }
  159. }
  160. if (!answer.temperature) {
  161. return '请选择体温选项!'
  162. }
  163. if (answer.temperature === '2' && !answer.feverNumber) {
  164. return '体温为发烧时请填写具体温度!'
  165. }
  166. if (answer.item5 === 51 && answer.symptoms.length < 1) {
  167. return '请选择症状!'
  168. }
  169. let count = 0
  170. for (let key in answer) {
  171. if (key.indexOf('item') !== -1) {
  172. count++
  173. }
  174. }
  175. if (count < 5) {
  176. return '有未选择的选项!'
  177. }
  178. answer.addrAdditional = ''
  179. return ''
  180. }