Преглед на файлове

新增作息管理页面,修改弹窗,添加dayjs插件包

尹帮元 преди 2 години
родител
ревизия
57a479ef09

+ 1 - 0
package.json

@@ -41,6 +41,7 @@
     "axios": "0.24.0",
     "clipboard": "2.0.8",
     "core-js": "3.25.3",
+    "dayjs": "^1.11.9",
     "echarts": "5.4.0",
     "element-ui": "2.15.12",
     "file-saver": "2.0.5",

+ 1 - 1
src/components/RightToolbar/index.vue

@@ -11,7 +11,7 @@
         <el-button size="mini" circle icon="el-icon-menu" @click="showColumn()" />
       </el-tooltip>
     </el-row>
-    <el-dialog :title="title" :visible.sync="open" append-to-body>
+    <el-dialog :title="title" :visible.sync="open" width="550px" append-to-body>
       <el-transfer
         :titles="['显示', '隐藏']"
         v-model="value"

+ 212 - 0
src/components/model/index.vue

@@ -0,0 +1,212 @@
+<template>
+  <el-dialog
+    ref="modal"
+    :visible="visible"
+    v-bind="_attrs"
+    v-on="$listeners"
+    @close="handleCancel"
+    :fullscreen="fullscreen">
+
+    <slot></slot>
+    <!--有设置标题-->
+    <template v-if="!isNoTitle" slot="title">
+      <el-row class="j-modal-title-row" type="flex">
+        <el-col class="left">
+          <slot name="title">{{ title }}</slot>
+        </el-col>
+      </el-row>
+    </template>
+    <!--没有设置标题-->
+    <template v-else slot="title">
+      <el-row class="j-modal-title-row" type="flex">
+        <el-col v-if="switchFullscreen" class="right" @click="toggleFullscreen">
+          <el-button class="ant-modal-close ant-modal-close-x" ghost type="link" :icon="fullscreenButtonIcon"/>
+        </el-col>
+      </el-row>
+    </template>
+
+    <!-- 处理 scopedSlots -->
+    <template v-for="slotName of scopedSlotsKeys" :slot="slotName">
+      <slot :name="slotName"></slot>
+    </template>
+
+    <!-- 处理 slots -->
+    <template v-for="slotName of slotsKeys" v-slot:[slotName]>
+      <slot :name="slotName"></slot>
+    </template>
+
+  </el-dialog>
+</template>
+
+<script>
+
+import { getClass, getStyle } from '@/utils/ruoyi'
+
+export default {
+  props: {
+    title: String,
+    // 可使用 .sync 修饰符
+    visible: Boolean,
+    // 是否全屏弹窗
+    fullscreen: {
+      type: Boolean,
+      default: false
+    },
+    // 点击确定按钮的时候是否关闭弹窗
+    okClose: {
+      type: Boolean,
+      default: true
+    },
+  },
+  data() {
+    return {
+      // 内部使用的 slots ,不再处理
+      usedSlots: ['title'],
+      // 实际控制是否全屏的参数
+      innerFullscreen: this.fullscreen,
+    }
+  },
+  computed: {
+    // 一些未处理的参数或特殊处理的参数绑定到 a-modal 上
+    _attrs() {
+      let attrs = { ...this.$attrs }
+      // 如果全屏就将宽度设为 100%
+      if (this.innerFullscreen) {
+        attrs['width'] = '100%'
+      }
+      return attrs
+    },
+    modalClass() {
+      return {
+        'j-modal-box': true,
+        'fullscreen': this.innerFullscreen,
+        'no-title': this.isNoTitle,
+        'no-footer': this.isNoFooter,
+      }
+    },
+    modalStyle() {
+      let style = {}
+      // 如果全屏就将top设为 0
+      if (this.innerFullscreen) {
+        style['top'] = '0'
+      }
+      return style
+    },
+    isNoTitle() {
+      return !this.title && !this.allSlotsKeys.includes('title')
+    },
+    isNoFooter() {
+      return this._attrs['footer'] === null
+    },
+    slotsKeys() {
+      return Object.keys(this.$slots).filter(key => !this.usedSlots.includes(key))
+    },
+    scopedSlotsKeys() {
+      return Object.keys(this.$scopedSlots).filter(key => !this.usedSlots.includes(key))
+    },
+    allSlotsKeys() {
+      return Object.keys(this.$slots).concat(Object.keys(this.$scopedSlots))
+    },
+    // 切换全屏的按钮图标
+    fullscreenButtonIcon() {
+      return this.innerFullscreen ? 'fullscreen-exit' : 'fullscreen'
+    },
+  },
+  watch: {
+    visible() {
+      if (this.visible) {
+        this.innerFullscreen = this.fullscreen
+      }
+    },
+  },
+  methods: {
+    getClass(clazz) {
+      return { ...getClass(this), ...clazz }
+    },
+    getStyle(style) {
+      return { ...getStyle(this), ...style }
+    },
+
+    close() {
+      this.$emit('update:visible', false)
+    },
+    handleCancel() {
+      this.close()
+    },
+
+  }
+}
+</script>
+
+<style lang="scss">
+
+.j-modal-box {
+  &.fullscreen {
+    top: 0;
+    left: 0;
+    padding: 0;
+
+    // 兼容1.6.2版本的antdv
+    & .ant-modal {
+      top: 0;
+      padding: 0;
+      height: 100vh;
+    }
+
+    & .ant-modal-content {
+      height: 100vh;
+      border-radius: 0;
+
+      & .ant-modal-body {
+        /* title 和 footer 各占 55px */
+        height: calc(100% - 55px - 55px);
+        overflow: auto;
+      }
+    }
+
+    &.no-title, &.no-footer {
+      .ant-modal-body {
+        height: calc(100% - 55px);
+      }
+    }
+    &.no-title.no-footer {
+      .ant-modal-body {
+        height: 100%;
+      }
+    }
+  }
+
+  .j-modal-title-row {
+    .left {
+      width: calc(100% - 56px - 56px);
+    }
+
+    .right {
+      width: 56px;
+      position: inherit;
+
+      .ant-modal-close {
+        right: 56px;
+        color: rgba(0, 0, 0, 0.45);
+
+        &:hover {
+          color: rgba(0, 0, 0, 0.75);
+        }
+      }
+    }
+  }
+  &.no-title{
+    .ant-modal-header {
+      padding: 0px 24px;
+      border-bottom: 0px !important;
+    }
+  }
+}
+
+@media (max-width: 767px) {
+  .j-modal-box.fullscreen {
+    margin: 0;
+    max-width: 100vw;
+  }
+}
+</style>

+ 80 - 39
src/utils/ruoyi.js

@@ -1,49 +1,30 @@
-
+import dayjs from "dayjs";
 
 /**
  * 通用js方法封装处理
  * Copyright (c) 2019 ruoyi
  */
 
-// 日期格式化
-export function parseTime(time, pattern) {
-  if (arguments.length === 0 || !time) {
-    return null
-  }
-  const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
-  let date
-  if (typeof time === 'object') {
-    date = time
-  } else {
-    if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
-      time = parseInt(time)
-    } else if (typeof time === 'string') {
-      time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '');
-    }
-    if ((typeof time === 'number') && (time.toString().length === 10)) {
-      time = time * 1000
-    }
-    date = new Date(time)
-  }
-  const formatObj = {
-    y: date.getFullYear(),
-    m: date.getMonth() + 1,
-    d: date.getDate(),
-    h: date.getHours(),
-    i: date.getMinutes(),
-    s: date.getSeconds(),
-    a: date.getDay()
-  }
-  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
-    let value = formatObj[key]
-    // Note: getDay() returns 0 on Sunday
-    if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
-    if (result.length > 0 && value < 10) {
-      value = '0' + value
+
+// 时间比较
+export function timeCheck(srcs) {
+  srcs = srcs.filter((s) => s);
+  for (let i = srcs.length - 1; i > 0; i--) {
+    let a = timeToNumber(srcs[i]);
+    let b = timeToNumber(srcs[i - 1]);
+    if (a < b) {
+      return false;
     }
-    return value || 0
-  })
-  return time_str
+  }
+  return true;
+}
+
+// 日期格式化
+export function parseTime(value, format = "YYYY-MM-DD HH:mm:ss") {
+  if ((value + "").length == 10) {
+    value *= 1000;
+  }
+  return value && dayjs(value).format(format);
 }
 
 // 表单重置
@@ -231,3 +212,63 @@ export function tansParams(params) {
 export function blobValidate(data) {
   return data.type !== 'application/json'
 }
+
+
+//获取元素class
+export function getClass(ele) {
+  let data = {}
+  if (ele.data) {
+    data = ele.data
+  } else if (ele.$vnode && ele.$vnode.data) {
+    data = ele.$vnode.data
+  }
+  const tempCls = data.class || {}
+  const staticClass = data.staticClass
+  let cls = {}
+  staticClass &&
+  staticClass.split(' ').forEach(c => {
+    cls[c.trim()] = true
+  })
+  if (typeof tempCls === 'string') {
+    tempCls.split(' ').forEach(c => {
+      cls[c.trim()] = true
+    })
+  } else if (Array.isArray(tempCls)) {
+    classNames(tempCls)
+      .split(' ')
+      .forEach(c => {
+        cls[c.trim()] = true
+      })
+  } else {
+    cls = { ...cls, ...tempCls }
+  }
+  return cls
+}
+
+//获取元素style
+export function getStyle(ele, camel) {
+
+  getClass(ele)
+
+  let data = {}
+  if (ele.data) {
+    data = ele.data
+  } else if (ele.$vnode && ele.$vnode.data) {
+    data = ele.$vnode.data
+  }
+
+  // update-begin-author:sunjianlei date:20200303 for: style 和 staticStyle 可以共存
+  let style = data.style || {}
+  let staticStyle = data.staticStyle
+  staticStyle = staticStyle ? objectCamelize(data.staticStyle) : {}
+  // update-end-author:sunjianlei date:20200303 for: style 和 staticStyle 可以共存
+
+  if (typeof style === 'string') {
+    style = parseStyleText(style, camel)
+  } else if (camel && style) {
+    // 驼峰化
+    style = objectCamelize(style)
+  }
+  return { ...staticStyle, ...style }
+}
+

+ 0 - 1
src/views/business/checkNote/index.vue

@@ -483,7 +483,6 @@
 import {treeJson,tableJson} from './json'
 import {treeData} from './api'
 export default {
-  name: "safechecknorm",
   props: [],
   data() {
     return {

+ 1 - 1
src/views/login.vue

@@ -77,7 +77,7 @@ export default {
       codeUrl: "",
       loginForm: {
         username: "admin",
-        password: "111111",
+        password: "Admin1234",
         rememberMe: false,
         code: "",
         uuid: ""

+ 14 - 13
src/views/system/user/index.vue

@@ -217,12 +217,12 @@
     <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
-          <el-col :span="12">
+          <el-col :span="10">
             <el-form-item label="用户昵称" prop="name">
               <el-input v-model="form.name" placeholder="请输入用户昵称" maxlength="30" />
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="14">
             <el-form-item label="归属部门" prop="orgId">
 <!--              <el-cascader-->
 <!--                v-model="form.orgId"-->
@@ -241,14 +241,14 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="12">
+          <el-col :span="10">
             <el-form-item label="手机号码" prop="phone">
-              <el-input v-model="form.phone"  placeholder="请输入手机号码" maxlength="11" />
+              <el-input v-model="form.phone" placeholder="请输入手机号码" maxlength="11" />
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="14">
             <el-form-item label="角色">
-              <el-select  v-model="form.roleIds" multiple placeholder="请选择角色">
+              <el-select style="width: 100%;" v-model="form.roleIds" multiple placeholder="请选择角色">
                 <el-option
                   v-for="item in roleOptions"
                   :key="item.id"
@@ -266,21 +266,21 @@
           </el-col> -->
         </el-row>
         <el-row>
-          <el-col :span="12">
+          <el-col :span="10">
             <el-form-item v-if="!form.id" label="用户名称" prop="name">
               <el-input v-model="form.username" placeholder="请输入用户名称" maxlength="30" />
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="14">
             <el-form-item v-if="!form.id" label="用户密码" prop="password">
               <el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="20" show-password/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="12">
+          <el-col :span="10">
             <el-form-item label="用户性别">
-              <el-select v-model="form.gender" placeholder="请选择性别">
+              <el-select style="width: 100%;" v-model="form.gender" placeholder="请选择性别">
                 <el-option
                   v-for="dict in dict.type.sys_user_sex"
                   :key="dict.value"
@@ -290,7 +290,7 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="14">
             <el-form-item label="状态">
               <el-radio-group v-model="form.isLock">
                 <el-radio
@@ -511,8 +511,6 @@ export default {
     /** 查询用户列表 */
     getList(id) {
       this.loading = true;
-      console.log(this.queryParams,111);
-      console.log(this.addDateRange(this.queryParams, this.dateRange),2222);
       listUser(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
           //兼容框架userId字段
           response.rows.forEach(v=>{v.userId = v.id});
@@ -732,6 +730,9 @@ export default {
   }
 };
 </script>
+<style lang="scss">
+
+</style>
 <style lang="scss" scoped>
 
 </style>

+ 11 - 0
src/views/system/workTimeSet/api.js

@@ -0,0 +1,11 @@
+import request from '@/utils/request'
+
+// 获取树结构
+export function treeData(data) {
+  return request({
+    url: '/appRule/group',
+    method: 'post',
+    showLoading:true,
+    data
+  })
+}

+ 220 - 0
src/views/system/workTimeSet/dialog.edit.vue

@@ -0,0 +1,220 @@
+<template>
+  <div class="question-infos">
+    <el-dialog title="编辑作息" @close="handleClose" :visible="show" >
+      <div class="page-body">
+        <el-form :model="formData" :rules="formData.isEnable?formDataRules:null" size="small" ref="form" label-position="right"
+                 label-width="120px" label-prefix=":">
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item prop="orgName" label="机构:" >
+                <span>{{formData.orgName}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="日期:">
+                <span >{{parseTime(formData.ymdDate,"YYYY-MM-DD")}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="星期:">
+                <span>{{parseTime(formData.ymdDate,"dddd")}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item prop="isEnable" label="状态:">
+                <template >
+                  <el-radio-group v-model="formData.isEnable" @change="onEnableChange(formData)">
+                    <el-radio text-color="#48bb78" :label="true">营业</el-radio>
+                    <el-radio text-color="#f56565" :label="false">歇业</el-radio>
+                  </el-radio-group>
+                </template>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item prop="workTime" label="上班时间:">
+                <template >
+                  <el-time-select
+                      :picker-options="pickerOptions"
+                      v-model="formData.workTime"
+                      :disabled="!formData.isEnable || formData.isEnable === false"/>
+                </template>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item prop="openTime" label="营业时间:">
+                <template >
+                  <el-time-select
+                      :picker-options="pickerOptions"
+                      v-model="formData.openTime"
+                      :disabled="!formData.isEnable || formData.isEnable === false"/>
+                </template>
+              </el-form-item>
+            </el-col>
+              <el-col :span="12">
+
+              <el-form-item prop="noonbreakStart" label="午休开始:">
+                <template>
+                  <el-time-select
+                      :picker-options="pickerOptions"
+                      v-model="formData.noonbreakStart"
+                      :disabled="!formData.isEnable || formData.isEnable === false"/>
+                </template>
+              </el-form-item>
+              </el-col>
+            <el-col :span="12">
+              <el-form-item prop="noonbreakEnd" label="午休结束:">
+                <template >
+                  <el-time-select
+                      :picker-options="pickerOptions"
+                      v-model="formData.noonbreakEnd"
+                      :disabled="!formData.isEnable || formData.isEnable === false"/>
+                </template>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item prop="closeTime" label="营业终了:">
+                <template >
+                  <el-time-select
+                      :picker-options="pickerOptions"
+                      v-model="formData.closeTime"
+                      :disabled="!formData.isEnable || formData.isEnable === false"/>
+                </template>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item prop="workOffTime" label="下班时间:">
+                <template >
+                  <el-time-select
+                      :picker-options="pickerOptions"
+                      v-model="formData.workOffTime"
+                      :disabled="!formData.isEnable || formData.isEnable === false"/>
+                </template>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">取消</el-button>
+        <el-button type="primary" @click="onSubmit">确定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+
+export default {
+  data() {
+    return {
+      //弹窗展示
+      show:false,
+      //选中的id
+      id: null,
+      //form数据
+      formData: {},
+      workTimeId:null,
+      //表单验证
+      formDataRules: {
+        isEnable: [{ required: true, message: "请选择状态" }],
+        workTime: [{ required: true, message: "请输入上班时间" }],
+        openTime: [{ required: true, message: "请输入营业时间" }],
+        closeTime: [{ required: true, message: "请输入营业终了时间" }],
+        workOffTime: [{ required: true, message: "请输入下班时间" }],
+      },
+      //生成时间选项
+      pickerOptions() {
+        return {
+          start: "00:00",
+          end: "24:00",
+          step: "00:10",
+        };
+      },
+    };
+  },
+  created() {
+  },
+  methods: {
+    edit(row){
+      console.log(row,'11111')
+      this.show = true;
+      this.formData = row;
+    },
+    reset() {
+      return {
+        isEnable: 1,
+        openTime: null,
+        closeTime: null,
+        noonbreakStart: null,
+        noonbreakEnd: null,
+        workTime: null,
+        workOffTime: null,
+      };
+    },
+    onEnableChange(workTime) {
+      if (workTime.isEnable === false) {
+        workTime.openTime = null;
+        workTime.closeTime = null;
+        workTime.noonbreakStart = null;
+        workTime.noonbreakEnd = null;
+        workTime.workTime = null;
+        workTime.workOffTime = null;
+      }
+    },
+    handleClose() {
+      this.show = false;
+      this.formData = this.reset();
+      this.id=null;
+    },
+    onSubmit() {
+      this.$refs.form.validate((isValidate) => {
+        if (!isValidate) return;
+        if (!this.formData.noonbreakStart ^ !this.formData.noonbreakEnd) {
+          this.onError(`午休开始及结束时间必须同时配置`);
+          return;
+        }
+        if (
+            !timeCheck([
+              this.formData.workTime,
+              this.formData.openTime,
+              this.formData.noonbreakStart,
+              this.formData.noonbreakEnd,
+              this.formData.closeTime,
+              this.formData.workOffTime,
+            ])
+        ) {
+          this.onError(
+              `时间配置规则:上班时间<=营业时间<=午休开始<=午休结束<=营业终了<=下班时间`
+          );
+          return false;
+        }
+
+        //this.$api.workTime.saveOneWorkTime(this.formData);
+        this.$api.workTime.saveOneWorkTime(this.formData).then((v) => {
+          this.$emit("success");
+          this.onHide();
+        });
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.question-infos {
+  .el-form {
+    padding-top: 10px;
+
+  }
+}
+
+.el-rate {
+  margin-top: 6px;
+}
+
+.change-icon {
+  font-size: 18px;
+}
+</style>

+ 42 - 0
src/views/system/workTimeSet/index.vue

@@ -0,0 +1,42 @@
+<template>
+  <div class="app-container" style="padding-top: 5px;">
+
+    <el-tabs v-model="activeName" @tab-click="handleClick">
+      <el-tab-pane label="作息配置" name="作息配置">
+        <work-time></work-time>
+      </el-tab-pane>
+      <el-tab-pane label="按周配置作息" name="按周配置作息">
+
+      </el-tab-pane>
+      <el-tab-pane label="指定日期配置" name="指定日期配置">
+
+      </el-tab-pane>
+    </el-tabs>
+
+  </div>
+</template>
+
+<script>
+import WorkTime from './workTime'
+export default {
+  components:{
+    WorkTime
+  },
+  data() {
+    return {
+      activeName:'作息配置'
+    };
+  },
+  methods:{
+    handleClick(){
+
+    },
+  }
+};
+</script>
+<style lang="scss">
+
+</style>
+<style lang="scss" scoped>
+
+</style>

+ 198 - 0
src/views/system/workTimeSet/json.js

@@ -0,0 +1,198 @@
+export let json = {
+  "records": null,
+  "total": 744,
+  "size": 10,
+  "current": 1,
+  "orders": [],
+  "optimizeCountSql": true,
+  "hitCount": false,
+  "countId": null,
+  "maxLimit": null,
+  "content": [
+    {
+      "id": "2023D815|67",
+      "orgId": "67",
+      "isEnable": true,
+      "ymdDate": "2023-08-14T16:00:00.000+0000",
+      "workTime": "7:00",
+      "openTime": "9:30",
+      "noonbreakStart": null,
+      "noonbreakEnd": null,
+      "closeTime": "16:00",
+      "workOffTime": "20:00",
+      "orgName": "宝坻八门城支行",
+      "createTime": "2023-07-19T20:00:02.022+0000",
+      "updateTime": null,
+      "modifiedName": null,
+      "modifiedId": null,
+      "isEnableInt": null
+    },
+    {
+      "id": "2023D815|69",
+      "orgId": "69",
+      "isEnable": true,
+      "ymdDate": "2023-08-14T16:00:00.000+0000",
+      "workTime": "7:00",
+      "openTime": "9:30",
+      "noonbreakStart": null,
+      "noonbreakEnd": null,
+      "closeTime": "16:00",
+      "workOffTime": "20:00",
+      "orgName": "宝坻黄庄支行",
+      "createTime": "2023-07-19T20:00:02.488+0000",
+      "updateTime": null,
+      "modifiedName": null,
+      "modifiedId": null,
+      "isEnableInt": null
+    },
+    {
+      "id": "2023D815|71",
+      "orgId": "71",
+      "isEnable": true,
+      "ymdDate": "2023-08-14T16:00:00.000+0000",
+      "workTime": "7:00",
+      "openTime": "9:30",
+      "noonbreakStart": null,
+      "noonbreakEnd": null,
+      "closeTime": "16:00",
+      "workOffTime": "20:00",
+      "orgName": "宝坻石幢支行",
+      "createTime": "2023-07-19T20:00:02.973+0000",
+      "updateTime": null,
+      "modifiedName": null,
+      "modifiedId": null,
+      "isEnableInt": null
+    },
+    {
+      "id": "2023D815|68",
+      "orgId": "68",
+      "isEnable": true,
+      "ymdDate": "2023-08-14T16:00:00.000+0000",
+      "workTime": "7:00",
+      "openTime": "9:30",
+      "noonbreakStart": null,
+      "noonbreakEnd": null,
+      "closeTime": "16:00",
+      "workOffTime": "20:00",
+      "orgName": "宝坻方家庄支行",
+      "createTime": "2023-07-19T20:00:02.428+0000",
+      "updateTime": null,
+      "modifiedName": null,
+      "modifiedId": null,
+      "isEnableInt": null
+    },
+    {
+      "id": "2023D815|72",
+      "orgId": "72",
+      "isEnable": true,
+      "ymdDate": "2023-08-14T16:00:00.000+0000",
+      "workTime": "7:00",
+      "openTime": "9:30",
+      "noonbreakStart": null,
+      "noonbreakEnd": null,
+      "closeTime": "16:00",
+      "workOffTime": "20:00",
+      "orgName": "宝坻新安镇支行",
+      "createTime": "2023-07-19T20:00:03.167+0000",
+      "updateTime": null,
+      "modifiedName": null,
+      "modifiedId": null,
+      "isEnableInt": null
+    },
+    {
+      "id": "2023D815|75",
+      "orgId": "75",
+      "isEnable": true,
+      "ymdDate": "2023-08-14T16:00:00.000+0000",
+      "workTime": "7:00",
+      "openTime": "9:30",
+      "noonbreakStart": null,
+      "noonbreakEnd": null,
+      "closeTime": "16:00",
+      "workOffTime": "20:00",
+      "orgName": "宝坻城关支行",
+      "createTime": "2023-07-19T20:00:02.182+0000",
+      "updateTime": null,
+      "modifiedName": null,
+      "modifiedId": null,
+      "isEnableInt": null
+    },
+    {
+      "id": "2023D815|573",
+      "orgId": "573",
+      "isEnable": true,
+      "ymdDate": "2023-08-14T16:00:00.000+0000",
+      "workTime": "7:00",
+      "openTime": "9:30",
+      "noonbreakStart": null,
+      "noonbreakEnd": null,
+      "closeTime": "16:00",
+      "workOffTime": "20:00",
+      "orgName": "宝坻新开口支行",
+      "createTime": "2023-07-19T20:00:03.295+0000",
+      "updateTime": null,
+      "modifiedName": null,
+      "modifiedId": null,
+      "isEnableInt": null
+    },
+    {
+      "id": "2023D815|73",
+      "orgId": "73",
+      "isEnable": true,
+      "ymdDate": "2023-08-14T16:00:00.000+0000",
+      "workTime": "7:00",
+      "openTime": "9:30",
+      "noonbreakStart": null,
+      "noonbreakEnd": null,
+      "closeTime": "16:00",
+      "workOffTime": "20:00",
+      "orgName": "宝坻新城开发区支行",
+      "createTime": "2023-07-19T20:00:03.231+0000",
+      "updateTime": null,
+      "modifiedName": null,
+      "modifiedId": null,
+      "isEnableInt": null
+    },
+    {
+      "id": "2023D815|64",
+      "orgId": "64",
+      "isEnable": true,
+      "ymdDate": "2023-08-14T16:00:00.000+0000",
+      "workTime": "7:00",
+      "openTime": "9:30",
+      "noonbreakStart": null,
+      "noonbreakEnd": null,
+      "closeTime": "16:00",
+      "workOffTime": "20:00",
+      "orgName": "宝坻口东支行",
+      "createTime": "2023-07-19T20:00:02.668+0000",
+      "updateTime": null,
+      "modifiedName": null,
+      "modifiedId": null,
+      "isEnableInt": null
+    },
+    {
+      "id": "2023D815|74",
+      "orgId": "74",
+      "isEnable": true,
+      "ymdDate": "2023-08-14T16:00:00.000+0000",
+      "workTime": "7:00",
+      "openTime": "9:30",
+      "noonbreakStart": null,
+      "noonbreakEnd": null,
+      "closeTime": "16:00",
+      "workOffTime": "20:00",
+      "orgName": "宝坻宝平支行",
+      "createTime": "2023-07-19T20:00:02.119+0000",
+      "updateTime": "2023-07-26T05:43:04.005+0000",
+      "modifiedName": "张倩",
+      "modifiedId": 4243357399629825,
+      "isEnableInt": null
+    }
+  ],
+  "totalElements": 744,
+  "totalPages": 75,
+  "number": 75,
+  "searchCount": true,
+  "pages": 75
+}

+ 413 - 0
src/views/system/workTimeSet/workTime.vue

@@ -0,0 +1,413 @@
+<template>
+  <div class="tabs-container">
+
+    <el-row :gutter="20">
+      <!--部门数据-->
+      <el-col :span="4" :xs="24">
+        <div class="head-container">
+          <el-input
+            v-model="deptName"
+            placeholder="请输入部门名称"
+            clearable
+            size="small"
+            prefix-icon="el-icon-search"
+            style="margin-bottom: 20px"
+          />
+        </div>
+        <div class="tree-container">
+          <div style="margin-bottom: 10px;">
+            <el-checkbox v-model="queryParams.checkSub" @change="changeCheckBox">是否关联下级机构</el-checkbox>
+          </div>
+          <el-tree
+            :data="deptOptions"
+            :props="defaultProps"
+            :expand-on-click-node="false"
+            :filter-node-method="filterNode"
+            ref="tree"
+            node-key="id"
+            :default-expanded-keys="defaultKeys"
+            :default-checked-keys="defaultKeys"
+            @node-click="handleNodeClick"
+          />
+        </div>
+      </el-col>
+      <!--用户数据-->
+      <el-col :span="20" :xs="24">
+
+        <!--    搜索条件    -->
+        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+          <el-form-item label="日期范围">
+            <el-date-picker
+              v-model="queryParams.range"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item label="营业状态" prop="status">
+            <el-select
+              v-model="queryParams.isEnable"
+              placeholder="请选择"
+              clearable
+              style="width: 240px"
+            >
+              <el-option
+                v-for="dict in dict.type.sys_business_type"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <!--    按纽    -->
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="warning"
+              plain
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['system:time:export']">导出</el-button>
+          </el-col>
+          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
+        </el-row>
+
+        <el-table v-loading="loading" style="width: auto;" size="nimi" border :data="tableList">
+          <el-table-column v-if="columns[0].visible" prop="orgName" label="机构"></el-table-column>
+          <el-table-column v-if="columns[1].visible" label="日期" >
+            <span slot-scope="scope">{{parseTime(scope.row.ymdDate,"YYYY-MM-DD")}}</span>
+          </el-table-column>
+          <el-table-column v-if="columns[2].visible" label="营业状态">
+            <template slot-scope="r">{{r.row.isEnable!=true?'歇业':'营业'}}</template>
+          </el-table-column>
+          <el-table-column v-if="columns[3].visible" label="上下班时间段">
+            <template slot-scope="r">
+              <span>{{r.row.workTime}}-{{r.row.workOffTime}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="columns[4].visible" label="营业时间段">
+            <template slot-scope="r">
+              <span>{{r.row.openTime}}-{{r.row.closeTime}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="columns[5].visible" label="午休时间段">
+            <template slot-scope="scope">
+              <span>{{scope.row.noonbreakStart}}-{{scope.row.noonbreakEnd}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="columns[6].visible" prop="modifiedName" label="更新人"></el-table-column>
+          <el-table-column v-if="columns[7].visible" label="更新时间" >
+            <span slot-scope="scope">{{parseTime(scope.row.updateTime, "YYYY-MM-DD HH:mm:ss")}}</span>
+          </el-table-column>
+          <el-table-column v-if="columns[8].visible" label="操作列表" width="100" >
+            <template slot-scope="r">
+              <el-button type="text"  v-hasPermi="['system:user:edit']" @click="onEditTime(r.row)">编辑</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+          v-show="total>0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+        />
+      </el-col>
+    </el-row>
+
+
+    <dialog-edit ref="modalEdit" ></dialog-edit>
+
+  </div>
+</template>
+
+<script>
+import DialogEdit from './dialog.edit'
+import {json} from'./json'
+/** 引入节点树接口*/
+import { deptTreeSelect } from "@/api/system/user";
+
+export default {
+  /**  得先引入字典才能使用 */
+  dicts: ['sys_business_type'],
+  components: {DialogEdit},
+  data() {
+    let timea = new Date();
+    timea.setHours(0, 0, 0, 0);
+    let timeb = new Date(timea.getTime() - 3600 * 1000 * 24 * 30);
+    timeb.setHours(0, 0, 0, 0);
+    return {
+      //显示编辑弹窗
+      showEditDialog:false,
+      //选中的行
+      selectRow:null,
+      // 遮罩层
+      loading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 用户表格数据
+      tableList: null,
+      // 部门树选项
+      deptOptions: undefined,
+      // 是否显示弹出层
+      open: false,
+      // 部门名称
+      deptName: undefined,
+      // 表单参数
+      form: {},
+      //是否关联下级
+      checked: false,
+      defaultProps: {
+        children: "children",
+        label: "name"
+      },
+
+      // 查询参数
+      queryParams: {
+        page: 1,
+        size: 10,
+        checkSub: false,
+        orgId: null,
+        orgType: null,
+        range: [timeb, timea],
+      },
+      // 列信息
+      columns: [
+        { key: 0, label: `机构`, visible: true },
+        { key: 1, label: `日期`, visible: true },
+        { key: 2, label: `营业状态`, visible: true },
+        { key: 3, label: `上下班时间段`, visible: true },
+        { key: 4, label: `营业时间段`, visible: true },
+        { key: 5, label: `午休时间段`, visible: true },
+        { key: 6, label: `更新人`, visible: true },
+        { key: 7, label: `更新时间`, visible: true },
+        { key: 8, label: `操作`, visible: true }
+      ],
+      // 表单校验
+      rules: {
+        username: [
+          { required: true, message: "用户名称不能为空", trigger: "blur" },
+          { min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }
+        ],
+        name: [
+          { required: true, message: "用户昵称不能为空", trigger: "blur" }
+        ],
+        password: [
+          { required: true, message: "用户密码不能为空", trigger: "blur" },
+          { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
+        ],
+        // email: [
+        //   {
+        //     type: "email",
+        //     message: "请输入正确的邮箱地址",
+        //     trigger: ["blur", "change"]
+        //   }
+        // ],
+        phone: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "请输入正确的手机号码",
+            trigger: "blur"
+          }
+        ]
+      },
+      //默认选中节点
+      defaultKeys:[],
+      tartDatepickerOptions: {
+        disabledDate(time) {
+          const date = new Date();
+          date.setTime(date.getTime()- 3600 * 1000 * 24 );
+          return time.getTime() < date;
+        },
+      },
+      pickerOptions:{
+        start: "00:00",
+          end: "24:00",
+        step: "00:10",
+      },
+    };
+  },
+  watch: {
+    // 根据名称筛选部门树
+    deptName(val) {
+      this.$refs.tree.filter(val);
+    }
+  },
+  created() {
+    this.getDeptTree();
+    this.getConfigKey("sys.user.initPassword").then(response => {
+      this.initPassword = response.msg;
+    });
+  },
+  methods: {
+    //自定义数据
+    tenantIdnormalizer(node, instanceId) {
+      if (node.children && !node.children.length) {
+        delete node.children
+      }
+      return {
+        id: node.id,
+        label: node.name,
+        children: node.children
+      }
+    },
+    /** 下穿状态改变*/
+    changeCheckBox(){
+      this.getList();
+    },
+    /** 查询用户列表 */
+    getList(id) {
+      //this.loading = true;
+      console.log(this.queryParams,111);
+      console.log(this.addDateRange(this.queryParams, this.dateRange),2222);
+      this.tableList = json.content;
+      //  tableList(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+      //     //兼容框架userId字段
+      //     response.rows.forEach(v=>{v.userId = v.id});
+      //     this.userList = response.rows;
+      //     this.total = response.total;
+      //     this.loading = false;
+      //   }
+      // ).catch(err=>{
+      //   this.loading = false;
+      // })
+    },
+    /** 查询部门下拉树结构 */
+    getDeptTree() {
+      deptTreeSelect().then(response => {
+        this.deptOptions = response.data;
+        console.log( this.deptOptions,' this.deptOptions')
+        this.defaultKeys.push(response.data[0].id);
+        this.queryParams.orgId = response.data[0].id;
+        this.handleQuery();
+      });
+    },
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.name.indexOf(value) !== -1;
+    },
+    // 节点单击事件
+    handleNodeClick(data) {
+      this.queryParams.orgId = data.id;
+      this.handleQuery();
+    },
+    // 用户状态修改
+    handleStatusChange(row) {
+      let text = row.status === "1" ? "启用" : "停用";
+      this.$modal.confirm( '确认要' + text + '"' + row.name + '"用户吗?').then(function() {
+        const data = {
+          id:row.id,
+          isLock:row.isLock
+        }
+        return changeUserStatus(data);
+      }).then(() => {
+        this.$modal.msgSuccess(text + "成功");
+      }).catch(function() {
+        row.status = row.status === "0" ? "1" : "0";
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: undefined,
+        orgId: undefined,
+        username: undefined,
+        name: undefined,
+        password: undefined,
+        phone: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: []
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.orgId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 更多操作触发
+    handleCommand(command, row) {
+      switch (command) {
+        case "handleResetPwd":
+          this.handleResetPwd(row);
+          break;
+        case "handleAuthRole":
+          this.handleAuthRole(row);
+          break;
+        default:
+          break;
+      }
+    },
+
+    /** 编辑按钮操作 */
+    onEditTime(row) {
+      this.selectRow = row;
+      this.$refs.modalEdit.edit(row);
+      console.log(this.$refs.modalEdit,'modalEdit');
+    },
+
+    /** 提交按钮 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateUser(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/time/export', {
+        ...this.queryParams
+      }, `user_${new Date().getTime()}.xlsx`)
+    },
+    /** 下载模板操作 */
+    importTemplate() {
+      this.download('system/user/importTemplate', {
+      }, `user_template_${new Date().getTime()}.xlsx`)
+    },
+  }
+};
+</script>