Переглянути джерело

乐团主管日程安排

1
mo 4 роки тому
батько
коміт
7095263255

+ 67 - 29
src/views/main/abnormal/index.vue

@@ -1,44 +1,82 @@
 <template>
   <div>
-    <el-collapse>
-      <el-collapse-item title="一致性 Consistency" name="1">
-        <template #title>
-          <title-item
-            :data="{
-              name: 'name',
-              school: 'school',
-              message: 'message'
-            }"
-          />
-        </template>
-        <div>与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;</div>
-        <div>在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等。</div>
-      </el-collapse-item>
-      <div @click="send">21312312</div>
-      <el-collapse-item title="反馈 Feedback" name="2">
-        <div>控制反馈:通过界面样式和交互动效让用户可以清晰的感知自己的操作;</div>
-        <div>页面反馈:操作后,通过页面元素的变化清晰地展现当前状态。</div>
-      </el-collapse-item>
-      <el-collapse-item title="效率 Efficiency" name="3">
-        <div>简化流程:设计简洁直观的操作流程;</div>
-        <div>清晰明确:语言表达清晰且表意明确,让用户快速理解进而作出决策;</div>
-        <div>帮助用户识别:界面简单直白,让用户快速识别而非回忆,减少用户记忆负担。</div>
-      </el-collapse-item>
-      <el-collapse-item title="可控 Controllability" name="4">
-        <div>用户决策:根据场景可给予用户操作建议或安全提示,但不能代替用户进行决策;</div>
-        <div>结果可控:用户可以自由的进行操作,包括撤销、回退和终止当前操作等。</div>
-      </el-collapse-item>
-    </el-collapse>
+    <save-form inline :model="search" @submit="FetchList" @reset="FetchList">
+      <el-form-item prop="organIds">
+        <el-select
+          multiple
+          clearable
+          filterable
+          collapse-tags
+          v-model="search.organIds"
+        >
+          <el-option v-for="(item,index) in selects.branchs"
+            :key="index"
+            :label="item.name"
+            :value="item.id"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-button native-type="submit" type="primary">搜索</el-button>
+      <el-button native-type="reset" type="danger">重置</el-button>
+    </save-form>
+    <title-item
+      type="error"
+      :data="[
+        {
+          name: '老师考勤异常',
+          num: 1
+        },
+        {
+          name: '未签到签退',
+          num: 3
+        }
+      ]"
+    >
+      <el-button type="text">立即处理<i class="el-icon-d-arrow-right"/></el-button>
+    </title-item>
+    <title-item
+      :data="[
+        {
+          name: '老师请假',
+          num: 1
+        },
+        {
+          name: '学生请假',
+          num: 3
+        }
+      ]"
+    >
+      <el-button type="text">立即处理<i class="el-icon-d-arrow-right"/></el-button>
+    </title-item>
   </div>
 </template>
 <script>
+import { getIndexError } from '@/views/main/api'
 import { createNotification } from '@/helpers/notification'
 import title from './title'
 export default {
   components: {
     'title-item': title
   },
+  data() {
+    return {
+      search: {
+        organIds: []
+      },
+    }
+  },
+  mounted() {
+    this.FetchList()
+    this.$store.dispatch('setBranchs')
+  },
   methods: {
+    async FetchList() {
+      try {
+        const res = await getIndexError({
+          ...this.search,
+          organIds: this.search.organIds.join(',')
+        })
+      } catch (error) {}
+    },
     send() {
       createNotification({
         title: '测试发送通知',

+ 43 - 14
src/views/main/abnormal/title.vue

@@ -1,10 +1,12 @@
 <template>
-  <div class="title">
-    <div v-if="type == 'philharmonic'">
-      <span>{{data.name}}</span>
-      <span>{{data.school}}</span>
-      <span><b>{{data.message}}</b></span>
+  <div class="title" :class="{error: type === 'error', warning: type === 'warning'}">
+    <div>
+      <span v-for="(item, index) in data" :key="index">
+        <span>{{item.name}}</span>
+        <b>{{item.num}}</b>
+      </span>
     </div>
+    <slot/>
   </div>
 </template>
 <script>
@@ -12,30 +14,57 @@ export default {
   props: {
     type: {
       type: String,
-      default: 'philharmonic'
+      default: 'warning'
     },
     data: {
-      type: Object,
-      default: {}
+      type: Array,
+      default: []
     }
   }
 }
 </script>
 <style lang="less" scoped>
 .title{
-  >div{
-    position: relative;
-    padding-left: 20px;
-    font-size: 14px;
+  height: 48px;
+  line-height: 48px;
+  background-color: rgba(0, 0, 0, .02);
+  overflow: hidden;
+  margin-bottom: 20px;
+  display: flex;
+  justify-content: space-between;
+  padding-right: 10px;
+  font-weight: bold;
+  b{
+    font-size: 18px;
+  }
+  &.error {
+    b{
+      color: #ED6F62;
+    }
+    &:before{
+      background-color: #ED6F62;
+    }
+  }
+  &.warning {
+    b{
+      color: #F2A24A;
+    }
     &:before{
+      background-color: #F2A24A;
+    }
+  }
+  &:before{
       content: '';
       display: block;
       position: absolute;
-      width: 5px;
-      background-color: #F56C6C;
+      width: 7px;
       height: 48px;
       left: 0;
     }
+  >div{
+    position: relative;
+    padding-left: 20px;
+    font-size: 14px;
     >span{
       margin-right: 10px;
       display: inline-block;

+ 7 - 2
src/views/main/api.js

@@ -1,6 +1,6 @@
 import request2 from '@/utils/request2'
 
-// 填加学员接口
+// 获取首页数据
 export const getIndex = data => request2({
   url: '/api-web/newIndex',
   params: data,
@@ -11,4 +11,9 @@ export const getInspectionItem = data => request2({
   params: data,
   method: 'get',
 })
-
+// 获取异常处理
+export const getIndexError = data => request2({
+  url: '/api-web/getIndexErrData',
+  params: data,
+  method: 'get',
+})

+ 0 - 1
src/views/main/baseinfo/curriculum.vue

@@ -15,7 +15,6 @@
     </statistic>
     <ve-line :settings="{
       area: true,
-      stack: { '课程': ['乐团课', 'VIP课', '网管课'] },
     }" :data="chartData" height="350px" :data-empty="dataEmpty"/>
   </el-card>
 </template>

+ 1 - 0
src/views/main/baseinfo/index.vue

@@ -95,6 +95,7 @@ export default {
   methods: {
     reset() {
       this.$set(this.search, 'year', this.$helpers.dayjs())
+      this.$set(this.search, 'organIds', [])
       this.FetchDetail()
     },
     async FetchDetail() {

+ 0 - 1
src/views/main/baseinfo/management.vue

@@ -15,7 +15,6 @@
     </statistic>
     <ve-line :settings="{
       area: true,
-      stack: { '金额': ['应收金额', '预收金额', '预付金额', '应付金额', '营收金额'] },
     }" :data="chartData" height="350px" :data-empty="dataEmpty"/>
   </el-card>
 </template>

+ 8 - 3
src/views/main/index.vue

@@ -4,16 +4,19 @@
       <div class="squrt"></div>控制台
     </h2>
     <div class="m-core">
-       <tab-router>
+      <tab-router>
         <el-tab-pane lazy label="基本信息" name="baseinfo">
           <baseinfo/>
         </el-tab-pane>
-        <!-- <el-tab-pane lazy label="异常处理" name="abnormal">
+        <el-tab-pane lazy label="异常处理" name="abnormal">
           <abnormal/>
         </el-tab-pane> -->
         <el-tab-pane lazy label="【乐团主管】日程安排" name="teamSchedule">
           <teamSchedule />
         </el-tab-pane>
+        <el-tab-pane lazy label="【分部经理】日程安排" name="ScheduleBranch">
+          <ScheduleBranch/>
+        </el-tab-pane>
       </tab-router>
     </div>
   </div>
@@ -22,12 +25,14 @@
 import baseinfo from './baseinfo'
 import abnormal from './abnormal'
 import teamSchedule from './teamSchedule'
+import ScheduleBranch from './schedule-branch'
 export default {
   name: 'Main',
   components: {
     baseinfo,
     abnormal,
-    teamSchedule
+    teamSchedule,
+    ScheduleBranch,
   },
 }
 </script>

+ 126 - 0
src/views/main/schedule-branch/index.vue

@@ -0,0 +1,126 @@
+<template>
+  <div>
+    <save-form inline :model="search" @submit="submit" @reset="reset">
+      <el-form-item prop="organIds">
+        <el-select
+          multiple
+          clearable
+          filterable
+          collapse-tags
+          v-model="search.organIds"
+          placeholder="请选择分部"
+        >
+          <el-option v-for="(item,index) in selects.branchs"
+            :key="index"
+            :label="item.name"
+            :value="item.id"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="organIds">
+        <el-select
+          v-model.trim="search.teacherIdList"
+          clearable
+          filterable
+          placeholder="请选择老师"
+        >
+          <el-option v-for="(item, index) in selects.teachers"
+            :key="index"
+            :value="item.id"
+            :label="item.realName"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="month">
+        <el-date-picker
+          v-model="search.month"
+          type="month"
+          placeholder="请选择月份">
+        </el-date-picker>
+      </el-form-item>
+      <el-button native-type="submit" type="primary">搜索</el-button>
+      <el-button native-type="reset" type="danger">重置</el-button>
+    </save-form>
+    <el-button type="primary" @click="visible = true">添加任务</el-button>
+    <el-table
+      :data="list"
+      style="width: 100%"
+      :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+    >
+      <el-table-column
+        label="分部"
+        prop="分部"
+      ></el-table-column>
+      <el-table-column
+        label="工作周期"
+        prop="工作周期"
+      ></el-table-column>
+      <el-table-column
+        label="乐团主管"
+        prop="乐团主管"
+      ></el-table-column>
+      <el-table-column
+        label="任务事项数量"
+        prop="任务事项数量"
+      ></el-table-column>
+      <el-table-column
+        label="任务总次数"
+        prop="任务总次数"
+      ></el-table-column>
+      <el-table-column
+        label="操作"
+        prop="操作"
+      >
+        <template slot-scope="scope">
+          <el-button type="text">查看</el-button>
+          <el-button type="text">修改任务</el-button>
+          <el-button type="text">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-dialog
+      :visible.sync="visible"
+      title="创建任务"
+      width="800px"
+    >
+      <create/>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import create from './modals/create'
+const initSearch = {
+  organIds: [],
+  month: '',
+}
+export default {
+  components: {
+    create
+  },
+  data() {
+    return {
+      search: {...initSearch},
+      list: [],
+      visible: false,
+    }
+  },
+  mounted() {
+    this.FetchList()
+    this.$store.dispatch('setBranchs')
+    this.$store.dispatch('setTeachers')
+  },
+  methods: {
+    submit() {
+      this.FetchList()
+    },
+    reset() {
+      this.search = {...initSearch}
+      this.FetchList()
+    },
+    async FetchList() {
+      try {
+
+      } catch (error) {}
+    }
+  }
+}
+</script>

+ 201 - 0
src/views/main/schedule-branch/modals/create.vue

@@ -0,0 +1,201 @@
+<template>
+  <div>
+    <el-form ref="form" :model="form" inline>
+      <el-row>
+        <el-col :span="6">
+          <el-form-item
+            label="分部"
+            prop="organId"
+            :rules="[{required: true, message: '请选择分部'}]"
+          >
+            <el-select
+              clearable
+              filterable
+              v-model="form.organId"
+              placeholder="请选择分部"
+            >
+              <el-option v-for="(item,index) in selects.branchs"
+                :key="index"
+                :label="item.name"
+                :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item
+            label="工作周期"
+            prop="month"
+            :rules="[{required: true, message: '请选择工作周期'}]"
+          >
+            <el-date-picker
+              v-model="form.month"
+              type="month"
+              placeholder="请选择工作周期">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row class="group" v-for="(groupItem, groupIndex) in form.group" :key="groupIndex">
+        <el-col :span="6">
+          <el-form-item
+            label="乐团主管"
+            :prop="`group.${groupIndex}.zhuguan`"
+            :rules="[{required: true, message: '请选择乐团主管'}]"
+          >
+            <el-select
+              clearable
+              filterable
+              v-model="groupItem.zhuguan"
+              placeholder="请选择分部"
+            >
+              <el-option v-for="(item,index) in selects.branchs"
+                :key="index"
+                :label="item.name"
+                :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <template v-for="(matterItem, matterIndex) in groupItem.matter">
+          <el-col :offset="matterIndex === 0 ? 0 : 6" :span="6" :key="groupIndex + '-' + matterIndex">
+            <el-form-item
+              :label="'任务事项' + (matterIndex + 1)"
+              :prop="`group.${groupIndex}.matter.${matterIndex}.type`"
+            >
+              <el-select
+                clearable
+                filterable
+                v-model="matterItem.type"
+                placeholder="请选择任务事项"
+              >
+                <el-option v-for="(item,index) in selects.branchs"
+                  :key="index"
+                  :label="item.name"
+                  :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6" :key="groupIndex + '-' + matterIndex">
+            <el-form-item
+              :label="'任务次数' + (matterIndex + 1)"
+              :prop="`group.${groupIndex}.matter.${matterIndex}.num`"
+            >
+              <el-select
+                clearable
+                filterable
+                v-model="matterItem.num"
+                placeholder="请输入次数"
+              >
+                <el-option v-for="(item,index) in selects.branchs"
+                  :key="index"
+                  :label="item.name"
+                  :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6" :key="groupIndex + '-' + matterIndex">
+            <div class="ctrl">
+              <span>
+                <el-tooltip content="添加任务" placement="top" :open-delay=".5">
+                  <el-button
+                    icon="el-icon-plus"
+                    @click="createMatter(groupItem.matter)"
+                    circle
+                    size="small"
+                  ></el-button>
+                </el-tooltip>
+                <el-tooltip content="删除任务" placement="top" :open-delay=".5">
+                  <el-button
+                    icon="el-icon-minus"
+                    circle
+                    size="small"
+                    @click="removeMatter(groupItem.matter, matterIndex)"
+                    :disabled="groupItem.matter.length <= 1"
+                  ></el-button>
+                </el-tooltip>
+              </span>
+              <el-tooltip content="删除乐团主管" placement="top" :open-delay=".5">
+                <el-button
+                  icon="el-icon-delete"
+                  circle
+                  type="danger"
+                  size="small"
+                  v-if="matterIndex === 0"
+                  @click="removeGroup(form.group, groupIndex)"
+                  :disabled="form.group.length <= 1"
+                ></el-button>
+              </el-tooltip>
+            </div>
+          </el-col>
+        </template>
+      </el-row>
+      <el-button @click="createGroup" plain block style="width: 100%">添加乐团主管</el-button>
+    </el-form>
+    <div slot="footer" style="text-align: right;margin-top: 20px;">
+      <el-button>取消</el-button>
+      <el-button type="primary" @click="submit">确认</el-button>
+    </div>
+  </div>
+</template>
+<script>
+const emptyMatter = {
+  name: '',
+  num: ''
+}
+export default {
+  data() {
+    return {
+      form: {
+        organId: '',
+        group: [{
+          person: '',
+          matter: [{...emptyMatter}]
+        }]
+      }
+    }
+  },
+  methods: {
+    createGroup() {
+      this.form.group.push({
+        person: '',
+        matter: [{...emptyMatter}]
+      })
+    },
+    createMatter(matter) {
+      matter.push({...emptyMatter})
+    },
+    removeMatter(matter, index) {
+      matter.splice(index, 1)
+    },
+    removeGroup(group, index) {
+      group.splice(index, 1)
+    },
+    async submit() {
+      try {
+        this.$refs.form.validate(async valid => {
+          if (valid) {
+            console.log(this.form)
+            this.$emit('close')
+            this.$emit('submited')
+          }
+        })
+      } catch (error) {}
+    }
+  }
+}
+</script>
+<style lang="less" scoped>
+.group{
+  background-color: rgba(0, 0, 0, 0.05);
+  padding: 10px;
+  border-radius: 3px;
+  margin-bottom: 10px;
+}
+.ctrl{
+  margin-top: 45px;
+  display: flex;
+  justify-content: space-between;
+  i{
+    font-size: 24px;
+  }
+}
+</style>