PeriodDatePicker.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <template>
  2. <div class="fl time">
  3. <el-date-picker
  4. v-model="startTime"
  5. style="margin: 0"
  6. class="date-picker"
  7. :type="timeType || 'date'"
  8. :size="size"
  9. :style="{ width: width }"
  10. placeholder="开始日期"
  11. value-format="yyyy-MM-dd"
  12. :picker-options="pickerOptions1"
  13. :editable="false"
  14. :clearable="true"
  15. :disabled="isEdit"
  16. @change="timeChange"
  17. />
  18. <samp style="padding: 0 3px; margin: 0">至</samp>
  19. <el-date-picker
  20. style="margin: 0"
  21. :size="size"
  22. v-model="endTime"
  23. class="date-picker"
  24. :style="{ width: width }"
  25. :type="timeType || 'date'"
  26. placeholder="结束日期"
  27. :disabled="isEdit"
  28. :picker-options="pickerOptions2"
  29. :editable="false"
  30. value-format="yyyy-MM-dd"
  31. :clearable="true"
  32. @change="timeChange"
  33. />
  34. </div>
  35. </template>
  36. <script>
  37. // 选择时间段(只有日期)组件
  38. // timeReturned 返回值{startTime: Number,endTime: Number}
  39. export default {
  40. name: "PeriodDatePicker",
  41. props: ["start", "end", "disabled", "size", "width", "type", "timeType"],
  42. data() {
  43. return {
  44. startTime: this.start,
  45. endTime: this.end,
  46. isEdit: this.disabled,
  47. pickerOptions1: {
  48. disabledDate: (time) => {
  49. if (this.endTime != null && this.endTime != "" && time) {
  50. return time.getTime() > new Date(this.endTime).valueOf();
  51. }
  52. },
  53. },
  54. pickerOptions2: {
  55. disabledDate: (time) => {
  56. if (this.startTime != null && this.startTime != "" && time) {
  57. return time.getTime() < new Date(this.startTime).valueOf();
  58. }
  59. },
  60. },
  61. };
  62. },
  63. watch: {
  64. disabled: function (val) {
  65. this.isEdit = val;
  66. },
  67. start(val) {
  68. this.startTime = val;
  69. },
  70. end(val) {
  71. this.endTime = val;
  72. },
  73. },
  74. mounted() {},
  75. methods: {
  76. timeChange() {
  77. if (
  78. this.startTime !== "" &&
  79. this.startTime !== null &&
  80. this.endTime !== "" &&
  81. this.endTime !== null
  82. ) {
  83. if (this.type + "" === "1" && !this.setType(365)) {
  84. this.showMessage("时间跨度不能超过一年!");
  85. return;
  86. } else if (this.type + "" === "2" && !this.setType(90)) {
  87. this.showMessage("时间跨度不能超过90天!");
  88. return;
  89. } else if (this.type + "" === "3" && !this.setType(30)) {
  90. this.showMessage("时间跨度不能超过30天!");
  91. return;
  92. }else if (
  93. new Date(this.endTime).valueOf() < new Date(this.startTime).valueOf()
  94. ) {
  95. this.showMessage("结束时间不大于开始时间!");
  96. return;
  97. } else {
  98. this.timeReturned();
  99. }
  100. } else {
  101. this.timeReturned();
  102. }
  103. },
  104. timeReturned() {
  105. let s = this.startTime == null ? "" : this.startTime;
  106. let e = this.endTime == null ? "" : this.endTime;
  107. let model = {
  108. startTime: s == "" ? "" : this.transformTime(s),
  109. endTime: e == "" ? "" : this.transformTime(e),
  110. };
  111. this.$emit("timeReturned", model);
  112. },
  113. transformTime(tTime) {
  114. let time = new Date(tTime);
  115. let y = time.getFullYear();
  116. let M = time.getMonth() + 1;
  117. let d = time.getDate();
  118. return y + "-" + (M < 10 ? "0" + M : M) + "-" + (d < 10 ? "0" + d : d);
  119. },
  120. showMessage(message) {
  121. this.$message.error(message);
  122. this.startTime = "";
  123. this.endTime = "";
  124. this.timeReturned();
  125. },
  126. setType(days) {
  127. let step = 24 * 3600 * 1000;
  128. let sDay = new Date(this.startTime).valueOf();
  129. let eDay = new Date(this.endTime).valueOf();
  130. let isok = true;
  131. if (eDay - sDay > step * days) {
  132. isok = false;
  133. }
  134. return isok;
  135. },
  136. },
  137. };
  138. </script>
  139. <style lang="scss">
  140. .date-picker.el-input {
  141. // width: 150px !important;
  142. }
  143. </style>