<template>
|
<div
|
:style="{ 'z-index': zIndex }"
|
class="create-schedule">
|
<div
|
v-loading="loading"
|
class="add-schedule">
|
<div
|
slot="header"
|
class="header">
|
<span class="text">{{ text }}</span>
|
<img
|
class="el-icon-close rt"
|
src="@/assets/img/task_close.png"
|
alt=""
|
@click="close">
|
</div>
|
<div class="content">
|
<el-form
|
ref="form"
|
:model="formData"
|
:rules="rules">
|
<el-form-item
|
v-for="(item, index) in formList"
|
:prop="item.field"
|
:class="'el-form-item'+'-'+item.field"
|
:style="{'width': item.width}"
|
:label="item.label"
|
:key="index">
|
<template v-if="item.type === 'time'">
|
<el-date-picker
|
v-model="formData[item.field]"
|
type="datetime"
|
value-format="yyyy-MM-dd HH:mm:ss"
|
placeholder="选择日期时间"/>
|
</template>
|
<template v-else-if="item.type === 'textarea'">
|
<el-input
|
:autosize="{ minRows: 6}"
|
v-model="formData[item.field]"
|
type="textarea"
|
placeholder="请输入内容"/>
|
</template>
|
<template v-else-if="item.type === 'participant'">
|
<el-popover
|
placement="bottom-end"
|
width="280"
|
trigger="click">
|
<xh-user
|
ref="xhuser"
|
:selected-data="colleaguesList"
|
@changeCheckout="changeCheckout"/>
|
<div
|
slot="reference"
|
class="select-box">
|
<span
|
v-for="(item, index) in colleaguesList"
|
:key="index"
|
class="select-box-span">
|
{{ item.realname }}
|
<span
|
class="el-icon-close"
|
@click.stop="selectDelect(item, index)"/>
|
</span>
|
<span class="el-icon-plus"/>
|
</div>
|
</el-popover>
|
</template>
|
<template v-else-if="item.type === 'select'">
|
<el-select
|
v-model="formData[item.field]"
|
placeholder="请选择">
|
<el-option
|
v-for="item in options"
|
:key="item.value"
|
:label="item.label"
|
:value="item.value"/>
|
</el-select>
|
</template>
|
<template v-else-if="item.type === 'color'">
|
<el-input
|
v-model="formData[item.field]"
|
placeholder="请输入内容">
|
<i
|
slot="prefix"
|
class="el-input__icon">
|
<span
|
:style="{'background': formData.color}"
|
class="bg-color"/>
|
</i>
|
</el-input>
|
<div class="color-box">
|
<span
|
v-for="(item, index) in colorList"
|
:key="index"
|
:style="{'background': item}"
|
@click="changeColor(item)"/>
|
</div>
|
</template>
|
<el-input
|
v-else
|
v-model="formData[item.field]"/>
|
</el-form-item>
|
</el-form>
|
<!-- 关联业务 -->
|
<related-business
|
:all-data="allData"
|
@checkInfos="checkInfos"/>
|
</div>
|
<div class="footer">
|
<el-button
|
type="primary"
|
@click="onSubmit">保存</el-button>
|
<el-button @click="close">取消</el-button>
|
</div>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
// API
|
// import { scheduleAdd, scheduleEdit } from '@/api/oamanagement/schedule'
|
// 关联业务 - 选中列表
|
import relatedBusiness from '@/components/relatedBusiness'
|
import XhUser from '@/components/CreateCom/XhUser'
|
import { getMaxIndex, formatTimeToTimestamp } from '@/utils/index'
|
|
export default {
|
components: {
|
relatedBusiness,
|
XhUser
|
},
|
props: {
|
formData: {
|
type: Object,
|
default: () => {
|
return {
|
color: ''
|
}
|
}
|
},
|
text: {
|
type: String,
|
default: '创建日程'
|
},
|
appendToBody: {
|
type: Boolean,
|
default: false
|
}
|
},
|
data () {
|
var validateTime = (rule, value, callback) => {
|
if (this.formData.startTime && this.formData.endTime) {
|
if (
|
formatTimeToTimestamp(this.formData.startTime) >=
|
formatTimeToTimestamp(this.formData.endTime)
|
) {
|
callback(new Error('开始时间必须小于结束时间'))
|
}
|
}
|
callback()
|
}
|
return {
|
zIndex: getMaxIndex(),
|
formList: [
|
{ label: '主题', field: 'title', type: 'color' },
|
{ label: '开始时间', field: 'startTime', type: 'time' },
|
{ label: '结束时间', field: 'endTime', type: 'time' },
|
{ label: '参与人', field: 'ownerUserIds', type: 'participant' },
|
{ label: '备注', field: 'remark', type: 'textarea', width: '100%' }
|
],
|
// 提醒
|
options: [
|
{
|
value: 0,
|
label: '无'
|
},
|
{
|
value: 1,
|
label: '准时提醒'
|
},
|
{
|
value: 2,
|
label: '5分钟前'
|
},
|
{
|
value: 3,
|
label: '15分钟前'
|
},
|
{
|
value: 4,
|
label: '30分钟前'
|
},
|
{
|
value: 5,
|
label: '一个小时前'
|
},
|
{
|
value: 6,
|
label: '二个小时前'
|
},
|
{
|
value: 7,
|
label: '一天前'
|
},
|
{
|
value: 8,
|
label: '二天前'
|
},
|
{
|
value: 9,
|
label: '一周前'
|
}
|
],
|
// 上传的附件列表
|
fileList: [],
|
loading: false,
|
colorList: [
|
'#3E8EF7',
|
'#11C06C',
|
'#0BB2D4',
|
'#EB6709',
|
'#FF4C52',
|
'#526069',
|
'#9262F4'
|
],
|
rules: {
|
title: [
|
{ required: true, message: '主题不能为空', trigger: 'blur' },
|
{ max: 50, message: '主题长度最多为50个字符', trigger: 'blur' }
|
],
|
startTime: [
|
{ required: true, message: '开始时间不能为空', trigger: 'blur' },
|
{ validator: validateTime, trigger: 'blur' }
|
],
|
endTime: [
|
{ required: true, message: '结束时间不能为空', trigger: 'blur' },
|
{ validator: validateTime, trigger: 'blur' }
|
]
|
},
|
// 获取选择的数据id数组
|
relevanceAll: {},
|
allData: {},
|
// 负责人弹出框
|
colleaguesList: []
|
}
|
},
|
created () {},
|
mounted () {
|
if (this.appendToBody) {
|
document.body.appendChild(this.$el)
|
}
|
// 编辑时引用 - 自动勾选
|
this.allData.business = this.formData.businessList
|
? this.formData.businessList
|
: []
|
this.allData.contacts = this.formData.contactsList
|
? this.formData.contactsList
|
: []
|
this.allData.contract = this.formData.contractList
|
? this.formData.contractList
|
: []
|
this.allData.customer = this.formData.customerList
|
? this.formData.customerList
|
: []
|
if (this.formData.ownerList) {
|
this.colleaguesList = [].concat(this.formData.ownerList)
|
}
|
if (this.text === '创建日程') {
|
this.$set(this.formData, 'color', '#3E8EF7')
|
}
|
},
|
|
beforeDestroy () {
|
if (this.appendToBody && this.$el && this.$el.parentNode) {
|
this.$el.parentNode.removeChild(this.$el)
|
}
|
},
|
methods: {
|
close () {
|
if (this.$route.query.routerKey === 1) {
|
this.$router.go(-1)
|
} else {
|
this.$emit('closeDialog')
|
}
|
},
|
checkInfos (val) {
|
this.relevanceAll = val
|
},
|
onSubmit () {
|
this.$refs.form.validate(valid => {
|
if (valid) {
|
this.loading = true
|
// const data = this.formData
|
const ownerUserIds = []
|
for (const item of this.colleaguesList) {
|
ownerUserIds.push(item.userId)
|
}
|
if (this.text === '创建日程') {
|
// scheduleAdd({
|
// title: data.title,
|
// startTime: data.startTime,
|
// endTime: data.endTime,
|
// ownerUserIds: ownerUserIds.join(','),
|
// remark: data.remark,
|
// color: data.color,
|
// customerIds: this.relevanceAll.customerIds
|
// ? this.relevanceAll.customerIds.join(',')
|
// : [],
|
// contactsIds: this.relevanceAll.contactsIds
|
// ? this.relevanceAll.contactsIds.join(',')
|
// : [],
|
// businessIds: this.relevanceAll.businessIds
|
// ? this.relevanceAll.businessIds.join(',')
|
// : [],
|
// contractIds: this.relevanceAll.contractIds
|
// ? this.relevanceAll.contractIds.join(',')
|
// : []
|
// })
|
// .then(res => {
|
// if (this.$route.query.routerKey === 1) {
|
// this.$router.push('schedule')
|
// } else {
|
// this.$emit('onSubmit')
|
// }
|
// this.loading = false
|
// })
|
// .catch(() => {
|
// this.loading = false
|
// })
|
} else {
|
const list = {
|
customerIds: [],
|
contractIds: [],
|
contactsIds: [],
|
businessIds: []
|
}
|
// 客户
|
if (this.allData.customer) {
|
for (const item of this.allData.customer) {
|
list.customerIds.push(item.customerId)
|
}
|
}
|
// 合同
|
if (this.allData.contract) {
|
for (const item of this.allData.contract) {
|
list.contractIds.push(item.contractId)
|
}
|
}
|
// 联系人
|
if (this.allData.contacts) {
|
for (const item of this.allData.contacts) {
|
list.contactsIds.push(item.contactsId)
|
}
|
}
|
// 关联商机
|
if (this.allData.business) {
|
for (const item of this.allData.business) {
|
list.businessIds.push(item.businessId)
|
}
|
}
|
// const ids =
|
// JSON.stringify(this.relevanceAll) === '{}'
|
// ? list
|
// : this.relevanceAll
|
// scheduleEdit({
|
// eventId: data.eventId,
|
// title: data.title,
|
// startTime: data.startTime,
|
// endTime: data.endTime,
|
// ownerUserIds: ownerUserIds.join(','),
|
// remark: data.remark,
|
// color: data.color,
|
// customerIds: ids.customerIds.join(','),
|
// contactsIds: ids.contactsIds.join(','),
|
// businessIds: ids.businessIds.join(','),
|
// contractIds: ids.contractIds.join(',')
|
// })
|
// .then(res => {
|
// this.$emit('onSubmit')
|
// this.loading = false
|
// })
|
// .catch(() => {
|
// this.loading = false
|
// })
|
}
|
} else {
|
return false
|
}
|
})
|
},
|
// 附件 -- 上传
|
httpRequest (file) {
|
this.fileList.push(file.file)
|
},
|
// 附件 -- 删除
|
onRemove (file) {
|
for (const i in this.fileList) {
|
if (this.fileList[i].uid === file.uid) {
|
this.fileList.splice(i, 1)
|
}
|
}
|
},
|
changeColor (val) {
|
this.$set(this.formData, 'color', val)
|
},
|
changeCheckout (data) {
|
this.colleaguesList = data.data
|
},
|
// 删除选择员工
|
selectDelect (value, index) {
|
this.$refs.xhuser[0].cancelCheckItem(value)
|
this.colleaguesList.splice(index, 1)
|
}
|
}
|
}
|
</script>
|
<style scoped lang="scss">
|
.create-schedule {
|
background: #f5f6f9;
|
position: fixed;
|
top: 0;
|
right: 0;
|
left: 0;
|
bottom: 0;
|
z-index: 100;
|
padding: 40px 0;
|
.add-schedule {
|
display: flex;
|
flex-direction: column;
|
height: 100%;
|
width: 700px;
|
margin: 0 auto;
|
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
z-index: 100;
|
padding: 20px;
|
border-radius: 4px;
|
border: 1px solid #ebeef5;
|
background-color: #fff;
|
.header {
|
line-height: 40px;
|
height: 40px;
|
padding: 0 0 0 10px;
|
.text {
|
font-size: 17px;
|
}
|
.el-icon-close {
|
margin-right: 0;
|
width: 40px;
|
line-height: 40px;
|
padding: 10px;
|
cursor: pointer;
|
}
|
}
|
.content {
|
flex: 1;
|
overflow: auto;
|
.el-form /deep/ {
|
padding: 20px 20px 0;
|
overflow: hidden;
|
.el-form-item {
|
margin-bottom: 10px;
|
padding-bottom: 10px;
|
width: 50%;
|
float: left;
|
.el-date-editor {
|
width: 100%;
|
.el-range-separator {
|
width: 7%;
|
}
|
}
|
// .el-form-item__content>.el-input {
|
// width: 45%;
|
// }
|
.el-form-item__content {
|
.el-select {
|
width: 100%;
|
.el-input--suffix {
|
.el-input__inner {
|
height: 34px !important;
|
}
|
}
|
}
|
.el-input__inner {
|
vertical-align: bottom;
|
}
|
}
|
.el-form-item__label {
|
float: none;
|
font-size: 12px;
|
}
|
.el-textarea {
|
margin-top: 8px;
|
.el-textarea__inner {
|
resize: none;
|
}
|
}
|
.reinvent {
|
background: #f5f5f5;
|
margin-left: 20px;
|
padding: 20px;
|
font-size: 12px;
|
margin-top: 10px;
|
.top-nav {
|
// margin-left: 50px;
|
.el-select {
|
width: 178px;
|
margin: 0 5px 0 26px;
|
}
|
.checkbox-box {
|
margin-left: 53px;
|
line-height: normal;
|
margin-top: 10px;
|
.el-checkbox-group {
|
.el-checkbox + .el-checkbox {
|
margin-left: 15px;
|
}
|
}
|
}
|
}
|
.end-time {
|
margin-top: 15px;
|
.title {
|
float: left;
|
// line-height: normal;
|
}
|
.radio-box {
|
margin-left: 53px;
|
width: 178px;
|
.el-radio-group {
|
.never {
|
margin-top: 3px;
|
}
|
p {
|
margin-bottom: 10px;
|
}
|
.radio-epetition {
|
.el-select {
|
width: 80px;
|
margin: 0 5px;
|
}
|
}
|
.radio-end-time {
|
.el-date-editor {
|
width: 150px;
|
margin-left: 5px;
|
}
|
}
|
}
|
}
|
.result {
|
margin-left: 26px;
|
display: inline-block;
|
}
|
}
|
.el-input__inner {
|
vertical-align: middle !important;
|
}
|
}
|
.color-box {
|
margin-top: 10px;
|
line-height: normal;
|
span {
|
display: inline-block;
|
width: 18px;
|
height: 18px;
|
margin-right: 25px;
|
border-radius: 50%;
|
cursor: pointer;
|
}
|
span:last-child {
|
margin: 0;
|
}
|
}
|
.bg-color {
|
width: 15px;
|
height: 15px;
|
border-radius: 50%;
|
display: inline-block;
|
vertical-align: middle;
|
}
|
.el-input__prefix {
|
margin-top: 3px;
|
margin-left: 3px;
|
}
|
}
|
.el-form-item-ownerUserIds,
|
.el-form-item-startTime,
|
.el-form-item-remind_time {
|
padding-right: 25px;
|
}
|
|
.el-form-item-endTime,
|
.el-form-item-address {
|
padding-left: 25px;
|
padding-right: 0;
|
}
|
.el-form-item-title {
|
width: 100%;
|
margin-bottom: 5px;
|
.el-form-item__content {
|
width: 50%;
|
padding-right: 25px;
|
}
|
}
|
.select-box {
|
border: 1px solid #e6e6e6;
|
min-height: 34px;
|
line-height: 34px;
|
border-radius: 3px;
|
cursor: pointer;
|
display: inline-block;
|
width: 100%;
|
vertical-align: bottom;
|
position: relative;
|
padding-right: 36px;
|
}
|
.select-box > .el-icon-plus {
|
position: absolute;
|
top: 50%;
|
right: 0;
|
transform: translateY(-50%);
|
line-height: 34px;
|
font-size: 16px;
|
font-weight: 600;
|
color: #aaa;
|
padding-right: 10px;
|
}
|
.select-box > .select-box-span {
|
background: #eff3fc;
|
margin: 0 5px;
|
height: 27px;
|
line-height: 28px;
|
font-size: 12px;
|
color: #333;
|
padding: 0 5px;
|
display: inline-block;
|
}
|
}
|
}
|
.footer {
|
text-align: right;
|
padding-right: 20px;
|
}
|
}
|
}
|
</style>
|