Commit 20c5307b authored by 高宇's avatar 高宇

完成统计分析中的工作日志;

parent 6aab2ca2
...@@ -47,6 +47,12 @@ ...@@ -47,6 +47,12 @@
"title": "日程管理单行", "title": "日程管理单行",
"appName": 'calendar', "appName": 'calendar',
"url": "/fullCalendarLine" "url": "/fullCalendarLine"
},
{
isRouteShow: 1,
title: '工作日志',
appName: 'calendar',
url: '/analysisCalendar'
} }
], ],
homePage: { homePage: {
......
...@@ -22,5 +22,11 @@ export default { ...@@ -22,5 +22,11 @@ export default {
}, },
getCalendarEvents: { getCalendarEvents: {
url: '/vue/calendar/ajax-data' url: '/vue/calendar/ajax-data'
},
getAnalysisFilter: {
url: '/vue/analysis/get-filter-calendar'
},
getAnalysisCalendar: {
url: '/vue/analysis/get-calendar'
} }
} }
// const urlEnd = process.env.NODE_ENV !== 'production' ? '?duplextrans' : '' // const urlEnd = process.env.NODE_ENV !== 'production' ? '?duplextrans' : ''
export default { export default {
// 获取列表筛选条件 // 获取列表筛选条件
getFilter: { getWorkFilter: {
url: '/vue/work-log/get-filter' url: '/vue/work-log/get-filter'
}, },
// 获取列表 // 获取列表
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
font-weight: 400; font-weight: 400;
line-height: 1.5; line-height: 1.5;
text-align: left; text-align: left;
text-align: start;
text-decoration: none; text-decoration: none;
text-shadow: none; text-shadow: none;
text-transform: none; text-transform: none;
...@@ -17,7 +16,7 @@ ...@@ -17,7 +16,7 @@
word-spacing: normal; word-spacing: normal;
white-space: normal; white-space: normal;
line-break: auto; line-break: auto;
font-size: 0.875rem; /*font-size: 0.875rem;*/
word-wrap: break-word; word-wrap: break-word;
opacity: 0; opacity: 0;
} }
......
<template>
<section class="analysis-calendar content">
<el-row :gutter="10" class="header-title">
<el-col :span="20">
<h2>工作日志</h2>
</el-col>
<el-col :span="4">
<el-cascader
size="mini"
v-model="item.cascader"
:props="props"
clearable
change-on-select
:options="optionsList"
@change="setCascader(item)"
></el-cascader>
</el-col>
</el-row>
<div class="page-body-content">
<analysis-nav></analysis-nav>
<div class="analysis-box">
<calender-grid ref="calenderGrid"
:user-id="form.user_id"
:department-id="form.department_id"
:resources="resources"></calender-grid>
</div>
</div>
</section>
</template>
<script>
import calenderGrid from './calenderGrid'
import {findWhere} from '../../../lib/viewHelper'
import {
requestAPI,
api
} from '@/lib/commonMixin'
export default {
name: '',
components: {
calenderGrid
// FullCalendar
},
data () {
return {
props: {
label: 'name',
value: 'key',
children: 'child'
},
optionsList: [],
item: {},
form: {
user_id: '',
department_id: ''
},
resources: []
}
},
methods: {
setCascader () {
if (this.item.cascader.length === 1) {
this.form[this.item.key] = this.item.cascader[0]
this.form[this.item.itemKey] = ''
} else if (this.item.cascader.length === 2) {
this.form[this.item.key] = this.item.cascader[0]
this.form[this.item.itemKey] = this.item.cascader[1]
} else {
this.form[this.item.itemKey] = ''
this.form[this.item.key] = ''
}
// this.getMapData()
},
setDefault () {
if (this.item.default) {
let keys = findWhere(this.optionsList, this.item.default, 'key')
if (keys.node) {
if (keys.parentNode) {
this.form[this.item.itemKey] = keys.node.key
this.form[this.item.key] = keys.parentNode.key
this.item.cascader = [keys.parentNode.key, keys.node.key]
} else {
this.form[this.item.itemKey] = ''
this.form[this.item.key] = keys.node.key
this.item.cascader = [keys.node.key]
}
}
}
},
setFormFilter (item) {
this.item = item
if (item.itemKey) {
this.$set(this.form, item.itemKey, '')
this.$set(this.form, item.key, '')
this.$set(this.item, 'cascader', [])
}
this.optionsList = item.value
this.$set(this.form, item.key, '')
this.$nextTick(() => {
this.setDefault()
})
}
},
created () {
requestAPI(api.getAnalysisFilter).then(res => {
this.setFormFilter(res[0])
})
}
}
</script>
<style scoped>
.analysis-box{
padding: 10px;
background: #fff;
}
</style>
<template>
<section class="calendar-box">
<FullCalendar
class='demo-app-calendar'
ref="fullCalendar"
first-day="1"
slotDuration="00:30:00"
:header="{
left: 'prev,next today',
center: 'title',
right: 'timeGridWeek,dayGridMonth'
}"
:default-date="defaultDate"
:content-height="500"
:locales="[cnLocale]"
:column-header-text="false"
locale="zh-cn"
slot-duration="01:00"
:slot-label-format="{
hour: 'numeric',
omitZeroMinute: true
}"
:title-format="{year: 'numeric', month: 'long'}"
:plugins="calendarPlugins"
:weekends="calendarWeekends"
:events="calendarEvents"
scheduler-license-key="GPL-My-Project-Is-Open-Source"
next-day-threshold="00:00:00"
@select="selectDate"
@eventRender="eventRender"
@eventDragStop="eventDragStop"
@datesRender="datesRender"
:event-time-format="{hour: 'numeric', minute: '2-digit', hour12: false}"
/>
</section>
</template>
<script>
// import FullCalendar from '@fullcalendar/vue'
import dayGridPlugin from '@fullcalendar/daygrid'
import timeGridPlugin from '@fullcalendar/timegrid'
import interactionPlugin from '@fullcalendar/interaction'
// import bootstrapPlugin from '@fullcalendar/bootstrap'
import cnLocale from '@fullcalendar/core/locales/zh-cn'
import {
requestAPI,
api
} from '@/lib/commonMixin'
import $ from 'jquery'
require('bootstrap')
export default {
name: 'calendar-grid',
components: {
// FullCalendar
},
data () {
return {
cnLocale,
// bootstrapPlugin,
filter: [],
operationTitle: '',
operationPage: '',
calendarPlugins: [ // plugins must be defined in the JS
dayGridPlugin,
timeGridPlugin,
interactionPlugin // needed for dateClick
// bootstrapPlugin
],
defaultDate: new Date(),
calendarWeekends: true
}
},
methods: {
eventDragStop () {
console.log(arguments)
},
mouseenter () {
console.log(arguments)
},
addNewCalendar () {
},
resetForm () {
},
updateForm () {
},
searchKeyword () {
},
close () {
},
getFilter () {
requestAPI(api.getFilter).then(res => {
this.filter = res
})
},
eventMouseEnter (info) {
// $(info.el)
console.log(info)
},
datesRender (info) {
$('[data-toggle="tooltip"]').tooltip()
},
eventRender (info) {
// console.log(info)
// info.el = $('el-tooltip')
info.el.setAttribute('data-id', info.event.id)
info.el.setAttribute('data-model', info.event.extendedProps.nonstandard.model)
info.el.setAttribute('data-toggle', 'tooltip')
info.el.setAttribute('data-html', true)
info.el.setAttribute('title', info.event.extendedProps.nonstandard.field1)
if (info.event.extendedProps.nonstandard.model) {
$(info.el).addClass('edit-calendar')
}
// console.log($(info.el))
},
selectDate (info) {
// console.log(this.$refs.fullCalendar.getApi().view.type)
// info.jsEvent.preventDefault()
this.$message({
message: '添加'
})
this.$emit('update:add', info, this.$refs.fullCalendar.getApi().view.type)
},
eventClick (info) {
info.jsEvent.preventDefault()
this.$message({
message: '编辑'
})
this.$emit('update:edit', info)
},
calendarEvents (info, successCallback, failureCallback) {
let ids = {}
if (this.userId) {
ids.user_id = this.userId
} else {
if (this.departmentId) {
ids.department_id = this.departmentId
}
}
requestAPI(api.getAnalysisCalendar, {
data: {
...ids,
start: info.start.valueOf() / 1000,
end: info.end.valueOf() / 1000
}
}).then(res => {
res.event.forEach(item => {
item.allDay = false
})
console.log(res.event)
successCallback(res.event)
this.defaultDate = res.defaultDate
}).catch(_ => {
}).finally(() => {
$('[data-toggle="tooltip"]').tooltip()
})
},
updateDate () {
this.$refs.fullCalendar.getApi().refetchEvents()
}
},
created () {
},
mounted () {
},
props: ['userId', 'departmentId'],
watch: {
'userId' (val) {
this.$refs.fullCalendar.getApi().refetchEvents()
}
}
}
</script>
<style lang="sass">
@import '~@fullcalendar/core/main.css';
@import '~@fullcalendar/daygrid/main.css';
@import '~@fullcalendar/timegrid/main.css';
@import '~@fullcalendar/timeline/main.css';
@import '~@fullcalendar/resource-timeline/main.css';
@import '../../../assets/css/tooltip.css';
</style>
<style>
.demo-app-calendar .fc-day.fc-sat,.demo-app-calendar .fc-day.fc-sun{
background: #d7d7d7;
opacity: .3;
}
.tooltip p {
text-align: left;
}
.fc-view-container{
font-size: 12px;
}
.demo-app-calendar .fc-event {
border-color: transparent;
font-size: 12px;
}
.demo-app-calendar .fc-event .fc-content{
color: #000;
}
.demo-app-calendar .fc-day-top.fc-other-month {
opacity: 1;
}
.fc-button {
color: #333;
border: 1px solid;
border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);
background-color: #f5f5f5;
}
.fc-button:hover{
color: #333;
text-decoration: none;
background: 0 -15px;
border-color: #ccc;
-webkit-transition: background-position .1s linear;
-moz-transition: background-position .1s linear;
-o-transition: background-position .1s linear;
transition: background-position .1s linear;
}
.fc-button-primary:not(:disabled):active, .fc-button-primary:not(:disabled).fc-button-active{
background-color: #e6e6e6;
border-color: #ccc;
color: #333;
}
.fc-button-primary:disabled {
background-color: #e6e6e6;
border-color: #ccc;
color: #212529;
}
</style>
<template> <template>
<section> <section class="calendar-box">
<FullCalendar <FullCalendar
class='demo-app-calendar' class='demo-app-calendar'
ref="fullCalendar" ref="fullCalendar"
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
hour: 'numeric', hour: 'numeric',
omitZeroMinute: true omitZeroMinute: true
}" }"
:title-format="{year: 'numeric', month: '2-digit'}"
:plugins="calendarPlugins" :plugins="calendarPlugins"
:weekends="calendarWeekends" :weekends="calendarWeekends"
:events="calendarEvents" :events="calendarEvents"
...@@ -32,6 +33,7 @@ ...@@ -32,6 +33,7 @@
@eventDragStop="eventDragStop" @eventDragStop="eventDragStop"
@eventClick="eventClick" @eventClick="eventClick"
@datesRender="datesRender" @datesRender="datesRender"
:event-time-format="{hour: 'numeric', minute: '2-digit', hour12: false}"
/> />
</section> </section>
</template> </template>
...@@ -41,7 +43,7 @@ ...@@ -41,7 +43,7 @@
import dayGridPlugin from '@fullcalendar/daygrid' import dayGridPlugin from '@fullcalendar/daygrid'
import timeGridPlugin from '@fullcalendar/timegrid' import timeGridPlugin from '@fullcalendar/timegrid'
import interactionPlugin from '@fullcalendar/interaction' import interactionPlugin from '@fullcalendar/interaction'
import bootstrapPlugin from '@fullcalendar/bootstrap' // import bootstrapPlugin from '@fullcalendar/bootstrap'
import cnLocale from '@fullcalendar/core/locales/zh-cn' import cnLocale from '@fullcalendar/core/locales/zh-cn'
import { import {
requestAPI, requestAPI,
...@@ -58,15 +60,15 @@ ...@@ -58,15 +60,15 @@
data () { data () {
return { return {
cnLocale, cnLocale,
bootstrapPlugin, // bootstrapPlugin,
filter: [], filter: [],
operationTitle: '', operationTitle: '',
operationPage: '', operationPage: '',
calendarPlugins: [ // plugins must be defined in the JS calendarPlugins: [ // plugins must be defined in the JS
dayGridPlugin, dayGridPlugin,
timeGridPlugin, timeGridPlugin,
interactionPlugin, // needed for dateClick interactionPlugin // needed for dateClick
bootstrapPlugin // bootstrapPlugin
], ],
defaultDate: new Date(), defaultDate: new Date(),
calendarWeekends: true calendarWeekends: true
...@@ -146,6 +148,10 @@ ...@@ -146,6 +148,10 @@
end: info.end.valueOf() / 1000 end: info.end.valueOf() / 1000
} }
}).then(res => { }).then(res => {
res.event.forEach(item => {
item.allDay = false
})
console.log(res.event)
successCallback(res.event) successCallback(res.event)
this.defaultDate = res.defaultDate this.defaultDate = res.defaultDate
}).catch(_ => { }).catch(_ => {
...@@ -186,4 +192,43 @@ ...@@ -186,4 +192,43 @@
.tooltip p { .tooltip p {
text-align: left; text-align: left;
} }
.fc-view-container{
font-size: 12px;
}
.demo-app-calendar .fc-event {
border-color: transparent;
font-size: 12px;
}
.demo-app-calendar .fc-event .fc-content{
color: #000;
}
.demo-app-calendar .fc-day-top.fc-other-month {
opacity: 1;
}
.fc-button {
color: #333;
border: 1px solid;
border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);
background-color: #f5f5f5;
}
.fc-button:hover{
color: #333;
text-decoration: none;
background: 0 -15px;
border-color: #ccc;
-webkit-transition: background-position .1s linear;
-moz-transition: background-position .1s linear;
-o-transition: background-position .1s linear;
transition: background-position .1s linear;
}
.fc-button-primary:not(:disabled):active, .fc-button-primary:not(:disabled).fc-button-active{
background-color: #e6e6e6;
border-color: #ccc;
color: #333;
}
.fc-button-primary:disabled {
background-color: #e6e6e6;
border-color: #ccc;
color: #212529;
}
</style> </style>
<template> <template>
<section> <section class="calendar-box">
<FullCalendar <FullCalendar
class='demo-app-calendar' class='demo-app-calendar'
ref="fullCalendar" ref="fullCalendar"
......
...@@ -297,6 +297,9 @@ ...@@ -297,6 +297,9 @@
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.calendar-box {
padding: 10px;
}
.text-info { .text-info {
color: #17a2b8 !important; color: #17a2b8 !important;
} }
......
...@@ -283,7 +283,7 @@ ...@@ -283,7 +283,7 @@
}) })
}, },
getFilter () { getFilter () {
requestAPI(api.getFilter).then(res => { requestAPI(api.getWorkFilter).then(res => {
this.filter = res this.filter = res
}) })
} }
......
<template> <template>
<div> <div>
<el-row class="form-content">
<el-form size="mini" :model="clientForm" label-width="0" label-position="top"> <el-form size="mini" :model="clientForm" label-width="0" label-position="top">
<el-row class="form-content">
<el-col :span="4" v-for="(item, key) in filter" :key="key"> <el-col :span="4" v-for="(item, key) in filter" :key="key">
<el-form-item> <el-form-item>
<span slot="label" v-if="item.key !== 'Filter[sort]'"> <span slot="label" v-if="item.key !== 'Filter[sort]'">
...@@ -36,14 +36,15 @@ ...@@ -36,14 +36,15 @@
></el-cascader> ></el-cascader>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-form>
</el-row> </el-row>
</el-form>
</div> </div>
</template> </template>
<script> <script>
import {findWhere} from '../../lib/viewHelper' import {findWhere} from '../../lib/viewHelper'
import $ from 'jquery' import $ from 'jquery'
export default { export default {
name: 'client-form', name: 'client-form',
data () { data () {
...@@ -61,7 +62,7 @@ ...@@ -61,7 +62,7 @@
hideCascader (key) { hideCascader (key) {
// this.$refs['elCasc' + key][0].menuVisible = false // this.$refs['elCasc' + key][0].menuVisible = false
}, },
setCascader (item, key) { setCascader (item) {
if (item.cascader.length === 1) { if (item.cascader.length === 1) {
this.clientForm[item.key] = item.cascader[0] this.clientForm[item.key] = item.cascader[0]
this.clientForm[item.itemKey] = '' this.clientForm[item.itemKey] = ''
......
import calendar from '../components/calendar/list' import calendar from '../components/calendar/list'
import fullCalendarGrid from '../components/calendar/fullCalendarGrid' import fullCalendarGrid from '../components/calendar/fullCalendarGrid'
import fullCalendarLine from '../components/calendar/fullCalendarLine' import fullCalendarLine from '../components/calendar/fullCalendarLine'
import analysisCalendar from '../components/calendar/analysisCalendar/calendar'
const projectTitle = '金畅逍BMS - ' const projectTitle = '金畅逍BMS - '
const routes = [ const routes = [
...@@ -27,6 +28,14 @@ const routes = [ ...@@ -27,6 +28,14 @@ const routes = [
meta: { meta: {
title: projectTitle + '日程管理' title: projectTitle + '日程管理'
} }
},
{
path: '/analysisCalendar',
name: 'analysisCalendar',
component: analysisCalendar,
mate: {
title: projectTitle + '工作日志'
}
} }
] ]
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment