Explorar o código

Merge branch 'master' into dev

xch1523480 hai 3 meses
pai
achega
a8d87b4361

+ 1 - 1
.eslintrc.js

@@ -97,8 +97,8 @@ module.exports = {
     'no-empty-character-class': 2,
     'no-empty-pattern': 2,
     'no-eval': 0,
+    'no-extend-native': 0,
     'no-ex-assign': 2,
-    'no-extend-native': 2,
     'no-extra-bind': 2,
     'no-extra-boolean-cast': 2,
     'no-extra-parens': [2, 'functions'],

+ 375 - 0
src/mobile/components/xFrom/dateTimePicker.vue

@@ -0,0 +1,375 @@
+<template>
+  <Popup
+    v-model="visible"
+    round
+    position="bottom"
+    safe-area-inset-top
+    safe-area-tab-bar
+    safe-area-inset-bottom
+    @close="visible = false"
+  >
+    <div class="flex_row v1">
+      <div class="v1_1" id="left">
+        <div
+          v-for="(item, index) in dateList"
+          :key="index"
+          :id="`left-${item.date}`"
+          :class="['v1_1_1', { active: dateActive(item, activeDate) }]"
+          @click="onChooseDate(item)"
+        >
+          {{ item.str }}
+        </div>
+      </div>
+      <div class="v1_2" id="right">
+        <div :class="['v1_2_1', { v1_2_2: type === 1 }]">
+          <div
+            v-for="(item, index) in timeList"
+            :key="index"
+            :id="`right-${item}`"
+            :class="[
+              'v1_2_1_1',
+              { active: hourActive(item, chooseDate, activeDate, chooseTime) },
+            ]"
+            @click="onChooseTime(item)"
+          >
+            {{ item }}
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="v2">
+      <Button
+        type="primary"
+        class="main_sure_bt"
+        block
+        @click="onConfirm"
+      >
+        确定
+      </Button>
+    </div>
+  </Popup>
+</template>
+
+<script>
+import { Toast, Popup, Button } from "vant";
+import moment from "moment";
+export default {
+  components: {
+    Popup,
+    Button,
+  },
+  props: {
+    value: {
+      type: String,
+      default: "",
+    },
+    type: {
+      //0:时间点 1:时间段
+      type: Number,
+      default: 0,
+    },
+    dateArr: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    timeArr: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+  },
+  data() {
+    return {
+      visible: false,
+      dateList: [],
+      timeList: [],
+      chooseDate: "",
+      chooseTime: "",
+      activeDate: "",
+      promiseStatus: null,
+    };
+  },
+  computed: {},
+  watch: {
+    dateArr: {
+      immediate: true,
+      deep: true,
+      handler() {
+        this.initPicker();
+      },
+    },
+    timeArr: {
+      immediate: true,
+      deep: true,
+      handler() {
+        this.initPicker();
+      },
+    },
+  },
+  created() {},
+  mounted() {},
+  methods: {
+    initPicker() {
+      this.dateList = this.dateArr?.length
+        ? this.dateArr
+        : this.getAllDateCN(new Date(), this.getDateTime());
+      this.timeList = {
+        0: this.getHours(),
+        1: this.timeArr?.length ? this.timeArr : this.getHoursRange(),
+      }[this.type];
+    },
+    getDateTime() {
+      const now = new Date();
+      // console.log(now, '一年后时间')
+      let year = now.getFullYear() + 1; //得到年份
+      let month = (now.getMonth() + 1).toString().padStart(2, "0"); //得到月份
+      let day = (now.getDate() - 1).toString().padStart(2, "0"); //得到日期
+
+      if (month === "01" && day === "00") {
+        year = now.getFullYear(); //得到年份
+        month = "12";
+        day = "31";
+      } else if (day === "00") {
+        year = now.getFullYear() + 1; //得到年份
+        month = now.getMonth().toString().padStart(2, "0"); //得到月份;
+        if (
+          month === "01" ||
+          month === "03" ||
+          month === "05" ||
+          month === "07" ||
+          month === "08" ||
+          month === "10" ||
+          month === "12"
+        ) {
+          //大月
+          day = "31";
+        } else if (
+          month === "04" ||
+          month === "06" ||
+          month === "09" ||
+          month === "11"
+        ) {
+          //小月
+          day = "30";
+        } else if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {
+          //瑞年
+          day = "29";
+        } else {
+          //平年
+          day = "28";
+        }
+      } else {
+        year = now.getFullYear() + 1; //得到年份
+        month = (now.getMonth() + 1).toString().padStart(2, "0"); //得到月份
+        day = (now.getDate() - 1).toString().padStart(2, "0"); //得到日期
+      }
+      return moment(`${year}-${month}-${day}`).toDate();
+    },
+    getAllDateCN(startTime, endTime) {
+      var date_all = [];
+      var i = 0;
+      while (endTime.getTime() - startTime.getTime() >= 0) {
+        var year = startTime.getFullYear();
+        var month = startTime.getMonth() + 1;
+        var day = startTime.getDate();
+        var weekStr = "";
+        var week = startTime.getDay();
+        if (week === 0) {
+          weekStr = "周日";
+        } else if (week === 1) {
+          weekStr = "周一";
+        } else if (week === 2) {
+          weekStr = "周二";
+        } else if (week === 3) {
+          weekStr = "周三";
+        } else if (week === 4) {
+          weekStr = "周四";
+        } else if (week === 5) {
+          weekStr = "周五";
+        } else if (week === 6) {
+          weekStr = "周六";
+        }
+        if (startTime.toDateString() === new Date().toDateString()) {
+          weekStr = "今天";
+        }
+        if (
+          startTime.toDateString() ===
+          new Date(new Date().setDate(new Date().getDate() + 1)).toDateString()
+        ) {
+          weekStr = "明天";
+        }
+        date_all[i] = {
+          date: `${year}-${month.az()}-${day.az()}`,
+          str: `${month}月${day}日 [${weekStr}]`,
+        };
+        startTime.setDate(startTime.getDate() + 1);
+        i += 1;
+      }
+      return date_all;
+    },
+    getHours() {
+      const arr = [];
+      for (let i = 0; i < 24; i++) {
+        arr.push(`${i.az()}:00`);
+        arr.push(`${i.az()}:30`);
+      }
+      return arr;
+    },
+    getHoursRange() {
+      const arr = [];
+      for (let i = 0; i < 24; i++) {
+        if (i < 23) {
+          arr.push(`${i.az()}:00-${(i + 1).az()}:00`);
+        } else {
+          arr.push(`${i.az()}:00-00:00`);
+        }
+      }
+      return arr;
+    },
+    dateActive(dateItem, activeDate) {
+      return dateItem.date === activeDate;
+    },
+    hourActive(hourItem, date, activeDate, hour) {
+      return hourItem === hour;
+    },
+    onChooseDate(item) {
+      this.activeDate = this.chooseDate = item.date;
+    },
+    onChooseTime(item) {
+      this.chooseTime = item;
+    },
+    showDatetimePicker() {
+      this.visible = true;
+      return new Promise((resolve, reject) => {
+        this.promiseStatus = { resolve, reject };
+      });
+    },
+    onConfirm() {
+      if (!this.chooseDate) {
+        Toast("请选择日期!");
+        return;
+      }
+      if (!this.chooseTime) {
+        Toast("请选择时间!");
+        return;
+      }
+      let value = this.chooseDate + " " + this.chooseTime + ":00";
+      if (this.type === 1) {
+        const times = this.chooseTime.split("-");
+        value = {
+          date: this.chooseDate,
+          times: times.map((item) => `${item}:00`),
+        };
+      }
+      this.promiseStatus.resolve(value);
+      this.$emit("confirm", value);
+      this.visible = false;
+    },
+  },
+};
+</script>
+
+<style scoped lang="less">
+.v1 {
+  height: 50vh;
+  align-items: flex-start;
+  overflow: hidden;
+  background: #fff;
+  margin-top: 0.16rem;
+  display: flex;
+  flex-direction: row;
+
+  .v1_1 {
+    height: 100%;
+    width: 2.2rem;
+    overflow-y: scroll;
+    overflow-x: hidden;
+    background: #f1f4f8;
+
+    .v1_1_1 {
+      font-size: 0.28rem;
+      color: #3c3c3c;
+      font-weight: bolder;
+      text-align: center;
+      line-height: 1.2rem;
+    }
+
+    .active {
+      background: #fff;
+      color: #fb4529;
+      font-weight: bolder;
+    }
+  }
+
+  .v1_2 {
+    height: 100%;
+    flex: 1;
+    overflow-y: scroll;
+    overflow-x: hidden;
+
+    .v1_2_1 {
+      justify-content: space-around;
+      flex-wrap: wrap;
+      display: flex;
+      flex-direction: row;
+
+      .v1_2_1_1 {
+        width: 2.2rem;
+        height: 1.2rem;
+        line-height: 1.2rem;
+        text-align: center;
+        border-radius: 0.6rem;
+        border: 1px solid #e6e6e6;
+        color: #696969;
+        font-size: 0.28rem;
+        margin-top: 0.28rem;
+      }
+
+      .active {
+        border-color: #fb4529;
+        color: #fb4529;
+      }
+
+      .disable {
+        background: #e6e6e6;
+      }
+    }
+
+    .v1_2_2 {
+      flex-direction: column;
+      align-items: center;
+
+      .v1_2_1_1 {
+        width: 80%;
+        height: 0.8rem;
+        border-radius: 0.4rem;
+        line-height: 0.8rem;
+      }
+    }
+  }
+}
+
+.v2 {
+  height: 1.76rem;
+  background: #fff;
+  box-shadow: 0px -2px 2px 0px rgba(243, 243, 243, 0.75);
+
+  .main_sure_bt {
+    width: 6.9rem;
+    height: 0.88rem;
+    background: linear-gradient(135deg, #fd7c32 0, #fb4529 100%);
+    box-shadow: 0px 4px 8px 0px rgba(255, 105, 51, 0.3);
+    border-radius: 0.44rem;
+    text-align: center;
+    line-height: 0.88rem;
+    font-size: 0.3rem;
+    color: #fff;
+    font-weight: 600;
+    margin: 0.18rem auto;
+    border: none;
+  }
+}
+</style>

+ 24 - 9
src/mobile/components/xFrom/field.vue

@@ -219,7 +219,7 @@
       label-width="60px"
       right-icon="arrow"
       placeholder="请选择"
-      @click="showDatetimePicker = true"
+      @click="onShowDatetimePicker"
     >
       <div slot="label">
         <span class="title">{{ component.cnName }}</span>
@@ -470,7 +470,7 @@
       />
     </Popup>
     <Popup
-      v-if="['datetime', 'date', 'date_interval'].includes(component.formType)"
+      v-if="['date', 'date_interval'].includes(component.formType)"
       v-model="showDatetimePicker"
       round
       position="bottom"
@@ -485,6 +485,12 @@
         @cancel="showDatetimePicker = false"
       />
     </Popup>
+    <DatetimePicker1
+      v-if="['datetime'].includes(component.formType)"
+      ref="DatetimePicker1"
+      :type="0"
+      @confirm="onValueChange"
+    />
   </div>
 </template>
 
@@ -519,6 +525,7 @@ import multiplePicker from "./multiplePicker";
 import moment from "moment";
 import axios from "axios";
 import mixins from "../mixins";
+import DatetimePicker1 from "./dateTimePicker.vue";
 export default {
   components: {
     Field,
@@ -543,7 +550,8 @@ export default {
     RequestTypeItem,
     BudgetAmountInput,
     ServiceTypeRadio,
-    ExpectBeginTimeSelect
+    ExpectBeginTimeSelect,
+    DatetimePicker1,
   },
   mixins: [mixins],
   props: {
@@ -613,7 +621,7 @@ export default {
           const component = JSON.parse(JSON.stringify(fieldItem));
           if (component.setting) {
             component.setting = component.setting.map((item) => {
-              item.text = item.label
+              item.text = item.label;
               return item;
             });
           }
@@ -684,13 +692,13 @@ export default {
   methods: {
     onValueChange(value) {
       let componentValue = "";
-      if (["date", "datetime"].includes(this.component.formType)) {
-        componentValue =
-          this.component.formType === "datetime"
-            ? moment(value).format("yyyy-MM-DD HH:mm:ss")
-            : moment(value).format("yyyy-MM-DD");
+      if (this.component.formType === "date") {
+        componentValue = moment(value).format("yyyy-MM-DD");
         this.value = componentValue;
         this.showDatetimePicker = false;
+      } else if (this.component.formType === "datetime") {
+        componentValue = moment(value).format("yyyy-MM-DD HH:mm:ss");
+        this.value = componentValue;
       } else if (this.component.formType === "date_interval") {
         if (this.dateIntervalType === "start") {
           this.value[0] = moment(value).format("yyyy-MM-DD");
@@ -958,6 +966,13 @@ export default {
       }
       return true;
     },
+    onShowDatetimePicker() {
+      if (this.component.formType === "datetime") {
+        this.$refs("DatetimePicker1").showDatetimePicker();
+        return;
+      }
+      this.showDatetimePicker = true;
+    },
     onClickCheckBox() {
       if (this.component.name === "acceptanceType") {
         if (

+ 70 - 39
src/mobile/components/xFrom/sysComponents/ExpectBeginTimeSelect.vue

@@ -9,41 +9,26 @@
       rows="1"
       input-align="right"
       readonly
-      @click="showDatetimePicker = true"
+      @click="showDatetimePicker"
     >
       <div slot="label" class="flex_row">
         <span>{{ component.cnName }}</span>
         <span v-if="component.required === 1" class="required">*</span>
       </div>
     </Field>
-    <Popup
-      v-model="showDatetimePicker"
-      round
-      position="bottom"
-      @close="showDatetimePicker = false"
-    >
-      <DatetimePicker
-        v-if="component.precisions === 1"
-        :min-date="minDate"
-        :max-date="maxDate"
-        type="datetime"
-        @confirm="onSelect"
-        @cancel="showDatetimePicker = false"
-      />
-      <Picker
-        v-if="component.precisions === 2"
-        :columns="setting"
-        show-toolbar
-        title="选择时间"
-        @confirm="onSelect"
-        @cancel="showDatetimePicker = false"
-      />
-    </Popup>
+    <DatetimePicker
+      ref="DatetimePicker"
+      :type="{ 1: 0, 2: 1 }[component.precisions]"
+      :dateArr="dateArr"
+      :timeArr="timeArr"
+      @confirm="onSelect"
+    />
   </div>
 </template>
 
 <script>
-import { Field, Popup, Icon, Picker, DatetimePicker } from "vant";
+import { Field, Popup, Icon, Picker } from "vant";
+import DatetimePicker from "../dateTimePicker.vue";
 import mixins from "../../mixins";
 import moment from "moment";
 export default {
@@ -80,10 +65,9 @@ export default {
     return {
       fieldList: [],
       setting: [],
-      showDatetimePicker: false,
       showText: "",
-      minDate: null,
-      maxDate: null,
+      dateArr: [],
+      timeArr: [],
     };
   },
   computed: {},
@@ -139,14 +123,23 @@ export default {
       }
       return item;
     });
-
-    this.minDate = moment(this.setting[0].value).toDate();
-    this.maxDate = moment(this.setting[this.setting.length - 1].value).toDate();
+    if (this.setting.length) {
+      this.dateArr = this.getAllDateCN(
+        moment(this.setting[0].value).toDate(),
+        moment(this.setting[this.setting.length - 1].value).toDate()
+      );
+      if (this.setting[0].children?.length) {
+        this.timeArr = this.setting[0].children.map((item) => item.value);
+      }
+    }
   },
   mounted() {},
   methods: {
-    onSelect(value, indexs) {
-      let val = {
+    showDatetimePicker() {
+      this.$refs["DatetimePicker"].showDatetimePicker();
+    },
+    onSelect(value) {
+      const val = {
         expectBeginTime: "",
         expectBeginToTime: "",
       };
@@ -155,16 +148,54 @@ export default {
         delete val.expectBeginToTime;
       }
       if (this.component.precisions === 2) {
-        const item = this.setting[indexs[0]];
-        let times = item.children[indexs[1]].value;
-        times = times.split("-");
-        val.expectBeginTime = `${item.value} ${times[0]}:00`;
-        val.expectBeginToTime = `${item.value} ${times[1]}:00`;
+        val.expectBeginTime = `${value.date} ${value.times[0]}`;
+        val.expectBeginToTime = `${value.date} ${value.times[1]}`;
       }
-      this.showDatetimePicker = false;
       this.$emit("input", val);
       this.$emit("change", val);
     },
+    getAllDateCN(startTime, endTime) {
+      var date_all = [];
+      var i = 0;
+      while (endTime.getTime() - startTime.getTime() >= 0) {
+        var year = startTime.getFullYear();
+        var month = startTime.getMonth() + 1;
+        var day = startTime.getDate();
+        var weekStr = "";
+        var week = startTime.getDay();
+        if (week === 0) {
+          weekStr = "周日";
+        } else if (week === 1) {
+          weekStr = "周一";
+        } else if (week === 2) {
+          weekStr = "周二";
+        } else if (week === 3) {
+          weekStr = "周三";
+        } else if (week === 4) {
+          weekStr = "周四";
+        } else if (week === 5) {
+          weekStr = "周五";
+        } else if (week === 6) {
+          weekStr = "周六";
+        }
+        if (startTime.toDateString() === new Date().toDateString()) {
+          weekStr = "今天";
+        }
+        if (
+          startTime.toDateString() ===
+          new Date(new Date().setDate(new Date().getDate() + 1)).toDateString()
+        ) {
+          weekStr = "明天";
+        }
+        date_all[i] = {
+          date: `${year}-${month.az()}-${day.az()}`,
+          str: `${month}月${day}日 [${weekStr}]`,
+        };
+        startTime.setDate(startTime.getDate() + 1);
+        i += 1;
+      }
+      return date_all;
+    },
   },
 };
 </script>

+ 8 - 1
src/mobile/pages/baseIndex.js

@@ -8,6 +8,13 @@ import { initLogin3 } from "../utils";
 import Lockr from 'lockr'
 const whiteList = ['/saas/login']
 const initMainCfg = (Vue, router) => {
+    Number.prototype.az = function (n = 2) {
+        let s = "";
+        for (let i = 1; i < n; i++) {
+            s += "0";
+        }
+        return (s + this).slice(-1 * n);
+    };
     // 忽略自定义元素标签抛出的报错
     Vue.config.ignoredElements = [
         'wx-open-launch-app',
@@ -19,7 +26,7 @@ const initMainCfg = (Vue, router) => {
         if (to.meta.title) {
             document.title = to.meta.title
         }
-        
+
         if (whiteList.includes(to.path)) {
             next()
             NProgress.done()

+ 7 - 1
src/views/workbench/index.vue

@@ -206,7 +206,13 @@
         <div class="account-center-avatarHolder">
           <div class="avatar_w">
             <div class="avatar">
-              <div class="logo-font">{{ logoFont }}</div>
+              <el-image
+                v-if="userInfo.enterpriseHeadPortrait"
+                :src="userInfo.enterpriseHeadPortrait"
+                style="width: 100%; height: 100%; border-radius: 50%"
+                fit="cover"
+              ></el-image>
+              <div v-else class="logo-font">{{ logoFont }}</div>
               <!-- <img src="~@/assets/logo_white.png" alt="" /> -->
             </div>
           </div>