Commit 503c4005 authored by 罗超's avatar 罗超
parents 30c65297 4732b3ea
......@@ -182,7 +182,7 @@ body,
.page-content .q-table__container .scroll::-webkit-scrollbar,
.myscroll::-webkit-scrollbar {
width: 10px;
width: 6px;
height: 5px;
}
......
......@@ -247,6 +247,9 @@ export function UploadFileToSystem(uploadConfig, fileFullPath, fileObj, uploadLo
if (configObj.isCreateCover && configObj.isCreateCover == 1) {
url += "&isCreateCover=1"
}
if (configObj.isOcr && configObj.isOcr == 1) {
url += "&ocr=1"
}
}
let formData = new FormData()
formData.append('myfile', fileObj)
......
......@@ -621,6 +621,7 @@ export function SetImportCourse(data) {
data
})
}
/**
* 保存选择 以导入
* @param {JSON对象} data
......@@ -631,4 +632,16 @@ export function SetImportCourse(data) {
method: 'post',
data
})
}
/**
* 获取返佣设置下拉
* @param {JSON对象} data
*/
export function GetCourseRebateSetList(data) {
return request({
url: '/Course/GetCourseRebateSetList',
method: 'post',
data
})
}
\ No newline at end of file
......@@ -221,4 +221,16 @@ export function ForwardStudent(data) {
method: 'post',
data
})
}
/**
* 设置客户状态
* @param {JSON参数} data
*/
export function SetStuStage(data) {
return request({
url: '/User/SetStudentStage',
method: 'post',
data
})
}
\ No newline at end of file
......@@ -573,6 +573,87 @@ export function getTeacherContributeConfig(data) {
data
})
}
/**
* 获取市场顾问提成规则列表
*/
export function getSellAchievementsRuleList(data) {
return request({
url: '/SellAchievements/GetSellAchievementsRuleList',
method: 'post',
data
});
}
/**
* 市场顾问保存规则
*/
export function setSellAchievementsRule(data) {
return request({
url: '/SellAchievements/SetSellAchievementsRule',
method: 'post',
data
});
}
/**
* 市场顾问保存删除
*/
export function delSellAchievementsRule(data) {
return request({
url: '/SellAchievements/DelSellAchievementsRule',
method: 'post',
data
});
}
/**
* 获取人头奖金配置分页列表
*/
export function GetBounsPlanPage(data) {
return request({
url: '/Bonus/GetBounsPlanPage',
method: 'post',
data
});
}
/**
* 新增修改人头奖金配置
*/
export function SetBounsPlan(data) {
return request({
url: '/Bonus/SetBounsPlan',
method: 'post',
data
});
}
/**
* 新增修改人头奖金配置
*/
export function RemoveBonusPlan(data) {
return request({
url: '/Bonus/RemoveBonusPlan',
method: 'post',
data
});
}
/**
* 获取人头奖金配置
*/
export function GetBonusPlan(data) {
return request({
url: '/Bonus/GetBonusPlan',
method: 'post',
data
});
}
......
......@@ -6,13 +6,18 @@ import request from '../../utils/request'
*/
export function GetCustomerPage(data) {
return request({
// url: '/B2BCustomer/GetCustomerPage',
url: '/B2BCustomer/GetCustomerPage',
method: 'post',
data
})
}
export function GetCustomerPage_v2(data) {
return request({
url: '/B2BCustomer/GetCustomerPageList_V2',
method: 'post',
data
})
}
/**
* 新增修改同业客户资料
*
......
......@@ -121,7 +121,8 @@ export function getGuestEducationEnumList(data) {
*/
export function getGuestLearningGoalsEnumList(data) {
return request({
url: '/order/GetGuestLearningGoalsEnumList',
// url: '/order/GetGuestLearningGoalsEnumList',
url:'/CustomerStudent/GetLearningGoalsList',
method: 'post',
data
})
......@@ -388,7 +389,8 @@ export function getMyCustomerList(data) {
// 获取收客渠道下拉
export function GetStuChannelList(data) {
return request({
url: '/User/GetStuChannelList',
// url: '/User/GetStuChannelList',
url:"/CustomerStudent/GetChannelList",
method: 'post',
data
});
......
......@@ -665,4 +665,15 @@ export function GetStudentTypeList(data) {
method: 'post',
data
});
}
/**
* 获取客户需求下拉
*/
export function GetNeedsList(data) {
return request({
url: '/CustomerStudent/GetNeedsList',
method: 'post',
data
});
}
\ No newline at end of file
......@@ -510,10 +510,138 @@ export function RemodeStudentType(data) {
});
}
/**
* 获取学习目的分页列表
*/
export function GetLearningGoalsPage(data) {
return request({
url: '/CustomerStudent/GetLearningGoalsPage',
method: 'post',
data
});
}
/**
* 新增修改学习目的
*/
export function SetLearningGoals(data) {
return request({
url: '/CustomerStudent/SetLearningGoals',
method: 'post',
data
});
}
/**
* 根据编号获取学习目的详情
*/
export function GetLearningGoals(data) {
return request({
url: '/CustomerStudent/GetLearningGoals',
method: 'post',
data
});
}
/**
* 根据编号删除学习目的
*/
export function RemoveLearningGoals(data) {
return request({
url: '/CustomerStudent/RemoveLearningGoals',
method: 'post',
data
});
}
/**
* 获取收客渠道分页列表
*/
export function GetChannelPage(data) {
return request({
url: '/CustomerStudent/GetChannelPage',
method: 'post',
data
});
}
/**
* 新增修改收客渠道
*/
export function SetChannel(data) {
return request({
url: '/CustomerStudent/SetChannel',
method: 'post',
data
});
}
/**
* 根据编号获取收客渠道详情
*/
export function GetChannel(data) {
return request({
url: '/CustomerStudent/GetChannel',
method: 'post',
data
});
}
/**
* 根据编号删除收客渠道
*/
export function RemoveChannel(data) {
return request({
url: '/CustomerStudent/RemoveChannel',
method: 'post',
data
});
}
/**
* 获取客户需求分页
*/
export function GetNeedsPage(data) {
return request({
url: '/CustomerStudent/GetNeedsPage',
method: 'post',
data
});
}
/**
* 新增修改
*/
export function SetNeeds(data) {
return request({
url: '/CustomerStudent/SetNeeds',
method: 'post',
data
});
}
/**
* 根据编号获取
*/
export function GetNeeds(data) {
return request({
url: '/CustomerStudent/GetNeeds',
method: 'post',
data
});
}
/**
* 根据编号删除
*/
export function RemoveNeeds(data) {
return request({
url: '/CustomerStudent/RemoveNeeds',
method: 'post',
data
});
}
\ No newline at end of file
......@@ -186,3 +186,80 @@ export function UpdateEmployeeType(data) {
data
})
}
/**
* 获取用户角色下拉
* @param {查询参数} data
*/
export function GetUserRoleList(data) {
return request({
url: '/User/GetUserRoleList',
method: 'post',
data
})
}
/**
* 获取企业分页列表
* @param {查询参数} data
*/
export function GetEnterprisePage(data) {
return request({
url: '/B2BCustomer/GetEnterprisePage',
method: 'post',
data
})
}
/**
* 获取企业下拉数据
* @param {查询参数} data
*/
export function GetEnterpriseList(data) {
return request({
url: '/B2BCustomer/GetEnterpriseList',
method: 'post',
data
})
}
/**
* 新增修改企业信息
* @param {查询参数} data
*/
export function SetEnterprise(data) {
return request({
url: '/B2BCustomer/SetEnterprise',
method: 'post',
data
})
}
/**
* 根据编号获取企业信息详情
* @param {查询参数} data
*/
export function GetEnterprise(data) {
return request({
url: '/B2BCustomer/GetEnterprise',
method: 'post',
data
})
}
/**
* 根据编号删除企业信息
* @param {查询参数} data
*/
export function RemoveEnterprise(data) {
return request({
url: '/B2BCustomer/RemoveEnterprise',
method: 'post',
data
})
}
......@@ -142,4 +142,26 @@
td:first-child, th:first-child
position: sticky
left: 0
\ No newline at end of file
left: 0
.sticky-two-header-table
/* height or max-height is important */
.q-table__top,
.q-table__bottom,
thead tr:first-child th
/* bg color is important for th; just specify one */
background-color: #f5f6f7
thead tr th
position: sticky
z-index: 2 !important
thead tr th:nth-child(-n+2)
z-index: 3 !important
thead tr:first-child th
top: 0
/* this is when the loading indicator appears */
&.q-table--loading thead tr:last-child th
/* height of all previous header rows */
top: 48px
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -47,6 +47,36 @@
<span>电话</span>
<span>{{Data.ContactNumber}}</span>
</div>
<!-- QQ -->
<div class="q-my-sm" v-if="editField=='QQ'">
<div class="flex justify-between items-center q-mb-sm">
<span>QQ</span>
<div>
<q-btn size="sm" text-color="primary" label="取消" @click="showEdit('')"></q-btn>
<q-btn size="sm" color="primary" label="确定" class="q-ml-sm" @click="save('QQ',Data.QQ,)"></q-btn>
</div>
</div>
<q-input outlined dense v-model="Data.QQ" ref="QQ"></q-input>
</div>
<div class="flex justify-between items-center q-my-lg" v-else @click="showEdit('QQ')">
<span>QQ</span>
<span>{{Data.QQ}}</span>
</div>
<!-- 微信 -->
<div class="q-my-sm" v-if="editField=='WeChatNo'">
<div class="flex justify-between items-center q-mb-sm">
<span>微信</span>
<div>
<q-btn size="sm" text-color="primary" label="取消" @click="showEdit('')"></q-btn>
<q-btn size="sm" color="primary" label="确定" class="q-ml-sm" @click="save('WeChatNo',Data.WeChatNo,)"></q-btn>
</div>
</div>
<q-input outlined dense v-model="Data.WeChatNo" ref="WeChatNo"></q-input>
</div>
<div class="flex justify-between items-center q-my-lg" v-else @click="showEdit('WeChatNo')">
<span>微信</span>
<span>{{Data.WeChatNo}}</span>
</div>
<!-- 类型 -->
<div class="q-my-sm" v-if="editField=='CustomerType'">
<div class="flex justify-between items-center q-mb-sm">
......
This diff is collapsed.
......@@ -112,8 +112,8 @@
</div>
<div class="row wrap">
<div class="col-6">
<q-input filled stack-label maxlength="20" :dense="false" v-model="objOption.ContactNumber"
ref="ContactNumber" class="col-6 q-pr-lg q-pb-lg" label="联系电话" :rules="[val => !!val || '请输入联系电话']" />
<q-input filled stack-label maxlength="20" :dense="false" v-model="objOption.ContactNumber" lazy-rules
ref="ContactNumber" class="col-6 q-pr-lg q-pb-lg" label="联系电话" />
</div>
<div class="col-6">
<q-input filled stack-label maxlength="40" v-model="objOption.EnterpriseName" :label="EnterpriseLabelName">
......@@ -127,24 +127,29 @@
class="col-6 q-pb-lg" label="传真" /> -->
</div>
</div>
<!-- <div class="row wrap">
<div class="row wrap">
<div class="col-6">
<q-input filled stack-label maxlength="20" :dense="false" v-model="objOption.QQ" ref="QQ"
class="col-6 q-pr-lg q-pb-lg" label="QQ" />
<q-input filled stack-label maxlength="20" :dense="false" v-model:number="objOption.QQ" ref="QQ"
type="number" :min="0" class="col-6 q-pr-lg q-pb-lg" label="QQ" />
</div>
<div class="col-6">
<q-input filled stack-label maxlength="20" :dense="false" v-model="objOption.WeChatNo" ref="wechat"
class="col-6 q-pr-lg q-pb-lg" label="微信" />
</div>
<!-- <div class="col-6">
<q-input filled stack-label maxlength="20" :dense="false" v-model="objOption.Email" ref="Email"
class="col-6 q-pb-lg" label="Email" />
</div>
</div> -->
</div> -->
</div>
<div class="row wrap">
<div class="col-6">
<q-input filled stack-label maxlength="20" :dense="false" v-model="objOption.Account" ref="Account"
class="col-6 q-pr-lg q-pb-lg" label="账号" />
<!-- <q-input filled stack-label maxlength="20" :dense="false" v-model="objOption.Account" ref="Account"
class="col-6 q-pr-lg q-pb-lg" label="账号" /> -->
<q-input filled stack-label :dense="false" v-model="objOption.Address" ref="Address"
class="col-6 q-pr-lg q-pb-lg" label="详细地址" />
</div>
<div class="col-6">
<q-input filled stack-label :dense="false" v-model="objOption.Address" ref="Address" class="col-6 q-pb-lg"
label="详细地址" />
</div>
</div>
<div class="row wrap">
......@@ -157,7 +162,7 @@
class="col-6 q-pb-lg" label="UnionId" />
</div>
</div>
<div class="row wrap">
<!-- <div class="row wrap">
<div class="col-6">
<q-input filled stack-label maxlength="20" disable :dense="false" v-model="objOption.WeChatName"
ref="WeChatName" class="col-6 q-pr-lg q-pb-lg" label="微信名" />
......@@ -167,7 +172,7 @@
<img :src="objOption.WeChatPhoto" alt="" />
</div>
</div>
</div>
</div> -->
<div class="row wrap">
<div class="col-12">
<q-input filled type="textarea" stack-label :dense="false" v-model="objOption.Remark" ref="Remark"
......@@ -190,6 +195,9 @@
SetCustomer,
GetCustomer
} from "../../api/sale/peemanagement";
import {
validateTel
} from '../../utils/validate'
export default {
components: {},
props: {
......@@ -200,6 +208,7 @@
},
data() {
return {
validateTel,
persistent: true,
objOption: {
CustomerId: 0, //客户编号
......@@ -208,6 +217,7 @@
Sex: 1, //性别(1-男,2-女)
Fax: "", //传真
QQ: "",
WeChatNo: "", //微信
Email: "", //邮箱
Address: '', //详细地址
Images: "", //营业照片
......@@ -246,7 +256,7 @@
created() {},
mounted() {
this.initObj()
console.log("sss",this.customerObj)
console.log("sss", this.customerObj)
},
methods: {
//初始化表单
......@@ -264,6 +274,7 @@
this.objOption.Sex = tempData.Sex;
this.objOption.Fax = tempData.Fax;
this.objOption.QQ = tempData.QQ;
this.objOption.WeChatNo = tempData.WeChatNo
this.objOption.Email = tempData.Email;
this.objOption.Address = tempData.Address;
this.objOption.Account = tempData.Account;
......@@ -284,6 +295,7 @@
this.objOption.Sex = 1;
this.objOption.Fax = '';
this.objOption.QQ = '';
this.objOption.WeChatNo = '';
this.objOption.Email = '';
this.objOption.Address = '';
this.objOption.Account = '';
......@@ -300,9 +312,27 @@
//保存
saveCourse() {
this.$refs.CustomerName.validate();
this.$refs.ContactNumber.validate();
// this.$refs.ContactNumber.validate();
this.$refs.Address.validate();
if (!this.$refs.CustomerName.hasError && !this.$refs.ContactNumber.hasError && !this.$refs.Address.hasError) {
if (!this.objOption.ContactNumber && !this.objOption.QQ && !this.objOption.WeChatNo) {
this.$q.notify({
type:'warning',
message: "电话,qq,微信至少填写一个",
timeout:2000,
position: "top",
});
return
}
if(this.objOption.ContactNumber&& !validateTel(this.objOption.ContactNumber)){
this.$q.notify({
type:'warning',
message: "请输入正确的11位号码",
timeout:2000,
position: "top",
});
return
}
if (!this.$refs.CustomerName.hasError && !this.$refs.Address.hasError) {
this.saveCustomLoading = true;
SetCustomer(this.objOption).then(res => {
if (res.Code == 1) {
......
<template>
<q-dialog v-model="persistent" content-class="bg-grey-1" persistent transition-show="scale" transition-hide="scale">
<q-card style="width: 400px;max-width:400px;">
<q-card-section>
<div class="text-h6">{{optionTitle}}</div>
</q-card-section>
<q-card-section class="q-pt-none scroll" style="max-height: 70vh">
<div class="row wrap">
<q-input filled stack-label maxlength="30" :dense="false" v-model="objOption.EnterpriseName" ref="EnterpriseName"
class="col-12 q-pb-lg" label="企业名称" :rules="[val => !!val || '请填写企业名称']" />
</div>
</q-card-section>
<q-separator />
<q-card-actions align="right" class="bg-white">
<q-btn label="取消" flat color="grey-10" style="font-weight:400 !important" @click="closeSaveForm" />
<q-btn label="立即提交" color="accent q-px-md" style="font-weight:400 !important" :loading="saveLoading"
@click="saveEnterprise" />
</q-card-actions>
</q-card>
</q-dialog>
</template>
<script>
import {
SetEnterprise,
GetEnterprise,
} from '../../api/users/user'
export default {
props: {
saveObj: {
type: Object,
default: null
}
},
data() {
return {
persistent: true,
saveLoading: false,
objOption: {
Id:0,
EnterpriseName:""
},
optionTitle: "",
}
},
mounted() {
this.initObj();
},
methods: {
//初始化表单
initObj() {
// if (this.saveObj && this.saveObj.Id > 0) {
// this.objOption.Id = this.saveObj.Id;
// this.objOption.EnterpriseName = this.saveObj.EnterpriseName;
// this.objOption.No = this.saveObj.No;
// this.optionTitle = "修改企业信息"
// } else {
// this.optionTitle = "新增企业信息"
// this.objOption.Id = 0;
// this.objOption.StageName = '';
// this.objOption.No = '';
// }
if (this.saveObj && this.saveObj.Id > 0) {
GetEnterprise({
Id: this.saveObj.Id
}).then(res => {
this.objOption.Id = res.Data.Id;
this.objOption.EnterpriseName = res.Data.EnterpriseName;
})
this.optionTitle = "修改企业信息"
} else {
this.optionTitle = "新增企业信息"
this.objOption.Id = 0;
this.objOption.EnterpriseName = '';
}
},
//关闭弹窗
closeSaveForm() {
this.$emit('close')
},
//保存菜单
saveEnterprise() {
this.$refs.EnterpriseName.validate();
if (!this.$refs.EnterpriseName.hasError) {
this.saveLoading = true
SetEnterprise(this.objOption).then(res => {
this.saveLoading = false;
if (res.Code == 1) {
this.$q.notify({
icon: 'iconfont icon-chenggong',
color: 'accent',
timeout: 2000,
message: '数据保存成功!',
position: 'top'
})
this.$emit("success")
this.closeSaveForm()
}
})
}
}
}
}
</script>
......@@ -170,7 +170,10 @@
item.TargetOrderId
}}
</div>
<div>{{ item.EnterName }}</div>
<div>{{ item.CreateByName }}</div>
<div>课程顾问:{{ item.ConsultantName||'无' }}</div>
<div>市场专员:{{ item.EnterName ||'无' }}</div>
<div style="margin-top: 10px">{{ item.CreateTime }}</div>
<template v-if="AuthorityObj.isShowName">
<div
......@@ -345,7 +348,7 @@
<span style="color: #02C499">{{ item.OrderStateName }}</span>
</div>
</td>
<td style="border:none" v-if="viewType == 0">
<td v-if="viewType == 0">
<template
v-if="(isEditOrder || AuthorityObj.isShowEdit) && comefrom == 0"
>
......@@ -2819,7 +2822,7 @@ li {
}
.table-body {
height: 590px;
/* height: 590px; */
overflow-x: hidden;
overflow-y: auto;
}
......
......@@ -351,6 +351,24 @@
label: "客户电话",
align: "left"
},
{
name: "QQ",
field: "QQ",
label: "QQ",
align: "left"
},
{
name: "WeChatNo",
field: "WeChatNo",
label: "微信",
align: "left"
},
{
name: "StuTypeName",
label: "客户类型",
field: "StuTypeName",
align: "left"
},
{
name: "StuStageName",
field: "StuStageName",
......
......@@ -8,7 +8,7 @@
<div class="text-caption q-mb-md q-px-xs text-grey-6">基本资料</div>
<div class="row wrap">
<q-select filled v-if="isEditShow" stack-label option-value="SId" option-label="SName"
v-model="objOption.School_Id" ref="School_Id" :options="schoolList" label="所属校区" :dense="false"
v-model="objOption.School_Id" ref="School_Id" :options="schoolList" label="所属校区"
class="col-6 q-pb-lg q-pr-lg" emit-value map-options @input="schoolChagne" />
<selectTree :treeData='DeptList' v-if="isEditShow" :defaultArray="returnString" nodeKey="DeptId"
:multiple="false" labelKey="DeptName" childrenKey="ChildList" tipText="选择部门" @getChild="getChild"
......@@ -59,7 +59,7 @@
:rules="[val => !!val || '密码']" />
<q-select filled stack-label option-value="Id" option-label="Name" v-model="objOption.LeaveStatus" @input='getLeave'
ref="Education" :options="LeaveStatusList" label="在职状态" :dense="false" class="col-6 q-pr-lg q-pb-lg"
emit-value map-options />
emit-value map-options />
<q-input v-show="objOption.AccountId>0 && objOption.LeaveStatus==4" filled v-model="objOption.LeaveTime"
class="col-6 q-pr-lg q-pb-lg" mask="date" label="离职时间">
<template v-slot:append>
......@@ -70,19 +70,21 @@
</q-icon>
</template>
</q-input>
<div class="col-6 q-pb-lg" style="margin-top:20px;">
<q-uploader style="display: inline-block;max-height: 320px;max-width: 100%; background-repeat:no-repeat"
:style="{'background-image':'url(' + objOption.UserIcon + ')'}" max-files="1" hide-upload-btn
@rejected="onRejected" label="头像" accept=".jpg, image/*" auto-upload :factory="uploadFile" no-thumbnails>
</q-uploader>
</div>
<q-select filled stack-label :disable="objOption.AccountId==0?false:true" option-value="Id"
option-label="Value" ref="ID" v-model="objOption.AccountType" :options="AccountTypeList" label="用户类型"
:dense="false" class="col-6 q-pr-lg q-pb-lg" emit-value map-options />
<q-select filled stack-label option-value="Id" option-label="EmployeeName" ref="ID"
v-model="objOption.DirectSupervisor" :options="EmployeeList" label="直属上级" :dense="false"
class="col-6 q-pr-lg q-pb-lg" emit-value map-options />
<q-select filled stack-label option-value="Id" option-label="Name" ref="UserRole" clearable
v-model="objOption.UserRole" :options="roleList" label="用户角色" :dense="false"
class="col-6 q-pr-lg q-pb-lg" emit-value map-options />
<div class="col-6 q-pb-lg" style="margin-top:20px;">
<q-uploader style="display: inline-block;max-height: 320px;max-width: 100%; background-repeat:no-repeat"
:style="{'background-image':'url(' + objOption.UserIcon + ')'}" max-files="1" hide-upload-btn
@rejected="onRejected" label="头像" accept=".jpg, image/*" auto-upload :factory="uploadFile" no-thumbnails>
</q-uploader>
</div>
</div>
</q-card-section>
<q-separator />
......@@ -116,7 +118,8 @@
} from '../../../api/common/common'
import selectTree from '../../common/select-tree'
import {
queryEmployee //员工列表
queryEmployee, //员工列表
GetUserRoleList
} from '../../../api/users/user'
export default {
components: {},
......@@ -153,7 +156,8 @@
AccountType: 1, // 是否是老师
AccountId: 0, //账号对应的表主键编号
Email: "", //邮箱
DirectSupervisor: 0 //直属上级
DirectSupervisor: 0, //直属上级
UserRole: '' //用户角色(1-市场人员,2-课程顾问)
},
optionTitle: "",
schoolList: [],
......@@ -168,6 +172,7 @@
Id: 1,
Name: '女'
}],
roleList:[],
EducationList: [], //学历数组
LeaveStatusList: [], //在职状态
isEditShow: false, //是否显示修改应该隐藏
......@@ -196,11 +201,19 @@
this.getEducationList();
this.getLeaveState();
this.Employee();
this.getRoleList();
},
mounted() {
this.initObj();
},
methods: {
getRoleList(){
GetUserRoleList().then(res => {
if (res.Code == 1) {
this.roleList = res.Data;
}
})
},
Employee() {
var qMsg = {
EmployeeName: ''
......@@ -322,6 +335,7 @@
this.objOption.AccountId = res.Data.AccountId;
this.objOption.Email = res.Data.Email;
this.objOption.DirectSupervisor = res.Data.DirectSupervisor;
this.objOption.UserRole = res.Data.UserRole;
if (this.objOption.School_Id) {
this.queryDeptTree();
}
......
......@@ -38,10 +38,13 @@
@click="isShowAdd=false" />
<template v-if="isShowAdd">
<div class="row wrap">
<q-select filled stack-label option-label="Name" v-model="AssitMsg.AssistType" option-value="Id"
<q-select filled stack-label option-label="Name" @input="getRole" v-model="AssitMsg.AssistType" option-value="Id"
:options="AssistDropList" label="角色" dense class="col-6 q-pb-lg q-pr-lg" emit-value map-options />
<q-select filled dense v-model="AssitMsg.AssistId" @filter="filterEmployee" use-input :options="myEmployeeList"
<q-select filled dense v-if="AssitMsg.AssistType==2" v-model="AssitMsg.AssistId" :options="RoleListData"
option-label="EmployeeName" class="col-6 q-pb-lg" option-value="Id" emit-value map-options />
<q-select filled dense v-else v-model="AssitMsg.AssistId" @filter="filterEmployee" use-input :options="myEmployeeList"
option-label="EmployeeName" class="col-6 q-pb-lg" option-value="Id" emit-value map-options />
<i class="iconfont icon-close delAssist"></i>
</div>
<div class="row wrap" style="margin-bottom:10px;float:right;">
......@@ -100,8 +103,8 @@
AssitMsg: {
StuId: 1, //学员编号
Id: 0, //编号
AssistId: 1, //员工编号
AssistType: 1 //类型
AssistId: '', //员工编号
AssistType: '' //类型
},
msg: {
StuId: 1
......@@ -110,6 +113,7 @@
dataList: [],
page_Count: 0,
AssistDropList: [], //下拉数据
RoleListData:[], //课程顾问下拉数据
employeeList: [],
myEmployeeList: [],
}
......@@ -128,21 +132,38 @@
methods: {
//获取协助人员
GetAssistTypeList() {
this.AssistDropList = [];
GetAssistTypeList({}).then(res => {
if (res.Code == 1) {
this.AssistDropList = res.Data;
let template = res.Data;
template.forEach(x=>{
if(x.Id!=1){
this.AssistDropList.push(x);
}
})
}
})
},
//获取员工列表
getEmployeeList() {
queryEmployee({
IsLeave: 1
IsLeave: 1,
UserRole: 0
}).then(res => {
this.employeeList = res.Data;
this.myEmployeeList = res.Data;
})
},
//切换课程顾问
getRole() {
queryEmployee({
IsLeave: 1,
UserRole: 2
}).then(res => {
this.RoleListData = res.Data;
})
},
//筛选员工
filterEmployee(val, update, abort) {
update(() => {
......
......@@ -4,12 +4,21 @@
<template>
<div>
<div class="row wrap">
<q-btn label="新增" color="accent q-mb-lg" size="sm" @click="isShowAdd=true" />
<q-btn label="取消" style="margin-left:20px;" v-if="isShowAdd" flat color="grey-10 q-mb-lg" size="sm" @click="isShowAdd=false" />
<q-btn label="新增" color="accent q-mb-lg" size="sm" @click="isShowAdd=true" />
<q-btn label="取消" style="margin-left:20px;" v-if="isShowAdd" flat color="grey-10 q-mb-lg" size="sm"
@click="isShowAdd=false" />
</div>
<template v-if="isShowAdd">
<UeEditor v-if="isShowAdd" v-model="flowMsg.Remark" class="q-pb-lg" :config="config"></UeEditor>
<q-btn label="新增" color="accent q-mb-lg" size="md" @click="saveFlow()" />
<UeEditor v-if="isShowAdd" v-model="flowMsg.Remark" class="q-pb-sm" :config="config"></UeEditor>
<div class="row q-mb-lg flex justify-between items-center">
<q-select filled v-model="stuStageId" dense :options="cusStateList" option-label="Name" option-value="Id"
emit-value map-options label="客户状态" class="col-6" />
<div>
<q-btn label="保存" color="accent " size="md" @click="saveFlow()" />
</div>
</div>
</template>
<div style="display:flex;flex:1;flex-direction: column;overflow:hidden;">
<div class="TimeLineDiv">
......@@ -42,7 +51,8 @@
import {
queryStudentFollowPage, //获取到访列表
saveStudentFollow,
deleteStudentFollow
deleteStudentFollow,
SetStuStage
} from '../../../api/customerstudent/customerstudent';
export default {
......@@ -53,6 +63,14 @@
UeEditor
},
props: {
stateId:{
type:Number,
default:0
},
stateList: {
type: Array,
default: () => []
},
saveObj: {
type: Object,
default: null
......@@ -60,22 +78,25 @@
},
data() {
return {
isShowAdd:false,
isShowAdd: false,
config: {
initialFrameWidth: null,
initialFrameHeight: 90
},
flowMsg:{
StuId:0,
Remark:''
flowMsg: {
StuId: 0,
Remark: '',
stuState: 0,
},
msg: {
pageIndex: 1,
pageSize: 12,
StuId: 0
},
dataList:[],
page_Count:0
dataList: [],
page_Count: 0,
stuStageId:0,
cusStateList: [],
}
},
created() {
......@@ -84,14 +105,20 @@
this.flowMsg.StuId = this.saveObj.StuId;
}
},
watch:{
stateId(val){
this.stuStageId=val
}
},
mounted() {
this.getList();
this.stuStageId=this.stateId
this.cusStateList = this.stateList;
this.getList();
},
methods: {
//保存跟进
saveFlow() {
if(this.flowMsg.Remark==''){
if (this.flowMsg.Remark == '') {
this.$q.notify({
type: 'negative',
position: "top",
......@@ -115,8 +142,11 @@
}).catch(() => {
})
if(this.stuStageId??0>0){
this.setStuStage()
}
},
getList(){
getList() {
queryStudentFollowPage(this.msg).then(res => {
if (res.Code == 1) {
this.dataList = res.Data.PageData;
......@@ -127,16 +157,16 @@
})
},
//清除
clearMsg(){
this.flowMsg.Remark='';
clearMsg() {
this.flowMsg.Remark = '';
this.isShowAdd = false;
},
changePage(val){
changePage(val) {
this.msg.pageIndex = val;
this.getList();
},
//删除跟进
delFollow(Id){
delFollow(Id) {
let that = this
this.$q.dialog({
title: '提示信息',
......@@ -157,8 +187,17 @@
})
that.getList()
})
}).onCancel(() => {});
}
}).onCancel(() => {});
},
setStuStage(){
const msg={
StuId:this.saveObj.StuId,
StuStage:this.stuStageId,
}
SetStuStage(msg).then(res=>{
this.$emit('update')
})
},
},
}
......
......@@ -57,8 +57,8 @@
ref="ClassRoomId" :options="ClassRoomList" label="关联教室" class="col-6 q-pb-lg q-pr-lg"
emit-value map-options />
</div>
<div class="row wrap" style="margin-bottom:10px;">
<q-btn label="新增" color="accent q-mb-lg" size="md" @click="saveAppointForm()" />
<div class="row wrap justify-end q-pr-lg" style="margin-bottom:10px;">
<q-btn label="保存" color="accent q-mb-lg" size="md" @click="saveAppointForm()" />
</div>
</template>
<div style="display:flex;flex:1;flex-direction: column;overflow:hidden;">
......
......@@ -2,14 +2,17 @@
.studentDate .el-input__inner {
background-color: transparent;
border: 0;
height: 28px!important;
height: 28px !important;
}
.studentDate .el-input{
height:28px!important;
.studentDate .el-input {
height: 28px !important;
}
.el-select-dropdown{
z-index:8888!important;
.el-select-dropdown {
z-index: 8888 !important;
}
</style>
<template>
<div>
......@@ -30,7 +33,8 @@
<div class="row warp studentDate">
<q-field filled class="q-pb-lg q-pr-lg" dense>
 <template v-slot:control>
<el-time-select v-model="VisitMsg.VisitTime" size="mini" ref="ClassTime" style="width:230px" :picker-options="{
<el-time-select v-model="VisitMsg.VisitTime" size="mini" ref="ClassTime" style="width:230px"
:picker-options="{
start: '09:00',
step: '00:15',
end: '21:00',
......@@ -40,23 +44,22 @@
</q-field>
<q-field filled class="q-pb-lg" dense>
 <template v-slot:control>
<el-select v-model="VisitMsg.ReceptionPersion" filterable style="width:230px;" size="mini" placeholder="接待人">
<el-option
v-for="item in myEmployeeList"
:key="item.Id"
:label="item.EmployeeName"
:value="item.Id">
<el-select v-model="VisitMsg.ReceptionPersion" filterable style="width:230px;" size="mini"
placeholder="接待人">
<el-option v-for="item in myEmployeeList" :key="item.Id" :label="item.EmployeeName" :value="item.Id">
</el-option>
</el-select>
 </template>
</q-field>
 
</template>
</q-field>
</div>
<div class="row wrap">
<q-input filled v-model="VisitMsg.Remark" dense :rows="3" type="textarea" class="col-12 q-pb-lg q-pr-lg" label="备注">
<q-input filled v-model="VisitMsg.Remark" dense :rows="3" type="textarea" class="col-12 q-pb-lg q-pr-lg"
label="备注">
</q-input>
</div>
<div class="row wrap" style="margin-bottom:10px;">
<div class="row wrap justify-end q-pr-lg" style="margin-bottom:10px;">
<q-btn label="保存" color="accent q-mb-lg" size="md" @click="saveVisit()" />
</div>
</template>
......@@ -97,14 +100,17 @@
<q-banner v-if="isShowEdit">
<div class="row wrap" style="margin-top:10px;width:300px;">
<q-input filled v-model="feedBackMsg.Feedback" :rows="3" type="textarea"
class="col-12 q-pb-lg" label="请输入反馈内容">
class="col-12 q-pb-sm" label="请输入反馈内容">
</q-input>
</div>
<div class="row wrap" style="margin-top:10px;width:300px;">
<q-radio v-model="feedBackMsg.IsVisit" :val="0" label="未到访" />
<q-radio v-model="feedBackMsg.IsVisit" :val="1" label="已到访" />
<div class="row wrap q-col-gutter-sm" style="width:300px;">
<q-select filled v-model="stuStageId" dense :options="cusStateList" option-label="Name"
option-value="Id" emit-value map-options label="客户状态" class="col-6" />
<q-select filled v-model="feedBackMsg.IsVisit" dense :options="VisitList"
emit-value map-options label="是否到访" class="col-6" />
</div>
<div class="row wrap" style="float:right;margin-bottom:10px;">
<div class="row wrap q-my-sm" style="float:right;">
<q-btn label="保存" color="accent" size="sm" @click="SetFeedBack()" />
</div>
</q-banner>
......@@ -132,23 +138,32 @@
<script>
import {
getSchoolDropdown, //获取校区列表
queryStuStageList, //获取客户阶段列表
} from '../../../api/school/index';
import {
queryStudentVisitPage, //获取到访列表
saveStudentVisit,
deleteStudentVisit,
saveStudentVisitFeedback
saveStudentVisitFeedback,
SetStuStage
} from '../../../api/customerstudent/customerstudent';
import {
queryEmployee
} from '../../../api/users/user'
export default {
meta: {
title: ""
},
props: {
stateId:{
type:Number,
default:0
},
stateList: {
type: Array,
default: () => []
},
saveObj: {
type: Object,
default: null
......@@ -182,8 +197,19 @@
feedBackMsg: {
Id: 0, //编号
IsVisit: 0, //到访状态(1-已到访,0-未到访)
Feedback: '' //反馈
Feedback: '', //反馈
},
VisitList:[
{
label:'未到访',
value:0
},{
label:'已到访',
value:1
}
],
stuStageId:0,
cusStateList: [],
}
},
created() {
......@@ -191,12 +217,20 @@
this.msg.StuId = this.saveObj.StuId;
}
},
watch:{
stateId(val){
console.log(val)
this.stuStageId=val
}
},
mounted() {
this.stuStageId=this.stateId
this.cusStateList = this.stateList;
this.getSchool();
this.getEmployeeList();
this.getList();
let userInfo = this.getLocalStorage();
if(userInfo){
if (userInfo) {
this.VisitMsg.ReceptionPersion = parseInt(userInfo.Id);
}
},
......@@ -225,6 +259,9 @@
this.isShowEdit = false;
}
});
if(this.stuStageId??0>0){
this.setStuStage()
}
},
//获取校区列表
getSchool() {
......@@ -260,7 +297,7 @@
//保存数据
saveVisit() {
this.VisitMsg.StuId = this.saveObj.StuId;
if(this.VisitMsg.Date==''){
if (this.VisitMsg.Date == '') {
this.$q.notify({
type: 'negative',
position: "top",
......@@ -269,7 +306,7 @@
})
return;
}
if(this.VisitMsg.VisitTime==''){
if (this.VisitMsg.VisitTime == '') {
this.$q.notify({
type: 'negative',
position: "top",
......@@ -333,7 +370,16 @@
changePage(val) {
this.msg.pageIndex = val;
this.getList();
}
},
setStuStage(){
const msg={
StuId:this.saveObj.StuId,
StuStage:this.stuStageId,
}
SetStuStage(msg).then(res=>{
this.$emit('update')
})
},
},
}
......
......@@ -13,21 +13,18 @@
<q-input filled class="col-6 q-pb-lg q-pr-lg" dense v-model="yueMsg.AppointmentPoint" label="约访地点"></q-input>
<q-field filled class="q-pb-lg" dense>
 <template v-slot:control>
<el-date-picker
v-model="yueMsg.AppointmentTime"
type="datetime"
size="mini"
style="width:228px"
<el-date-picker v-model="yueMsg.AppointmentTime" type="datetime" size="mini" style="width:228px"
placeholder="选择约访日期时间!">
</el-date-picker>
</template>
</q-field>
</div>
<div class="row wrap">
<q-input filled v-model="yueMsg.Remark" dense :rows="3" type="textarea" class="col-12 q-pb-lg q-pr-lg" label="备注">
<q-input filled v-model="yueMsg.Remark" dense :rows="3" type="textarea" class="col-12 q-pb-lg q-pr-lg"
label="备注">
</q-input>
</div>
<div class="row wrap" style="margin-bottom:10px;">
<div class="row wrap justify-end q-pr-lg" style="margin-bottom:10px;">
<q-btn label="保存" color="accent q-mb-lg" size="md" @click="savePoint()" />
</div>
</template>
......@@ -57,8 +54,10 @@
<q-banner v-if="isShowEdit">
<div class="row wrap" style="margin-top:10px;width:300px;">
<q-input filled v-model="feedBackMsg.Feedback" :rows="3" type="textarea"
class="col-12 q-pb-lg" label="请输入反馈内容">
class="col-12 q-pb-sm" label="请输入反馈内容">
</q-input>
<q-select filled v-model="stuStageId" dense :options="cusStateList"
option-label="Name" option-value="Id" emit-value map-options label="客户状态" class="col-12 q-pb-sm" />
</div>
<div class="row wrap" style="float:right;margin-bottom:10px;">
<q-btn label="保存" color="accent" size="sm" @click="SetFeedBack()" />
......@@ -91,7 +90,8 @@
saveStudentAppointment,
queryStudentAppointmentPage,
deleteStudentAppointment,
saveStudentAppointmentFeedBack
saveStudentAppointmentFeedBack,
SetStuStage
} from '../../../api/customerstudent/customerstudent';
export default {
......@@ -102,6 +102,14 @@
},
props: {
stateId:{
type:Number,
default:0
},
stateList: {
type: Array,
default: () => []
},
saveObj: {
type: Object,
default: null
......@@ -125,19 +133,28 @@
//反馈信息
feedBackMsg: {
Id: 0,
Feedback: '' //反馈
Feedback: '', //反馈
},
isShowEdit: false,
dataList: [],
page_Count: 0
page_Count: 0,
cusStateList: [],
stuStageId:0,
}
},
created() {
if (this.saveObj && this.saveObj.StuId) {
this.msg.StuId = this.saveObj.StuId;
}
},
watch:{
stateId(val){
this.stuStageId=val
}
},
mounted() {
this.stuStageId=this.stateId
this.cusStateList = this.stateList;
this.getList();
},
methods: {
......@@ -163,11 +180,14 @@
this.isShowEdit = false;
}
});
if(this.stuStageId??0>0){
this.setStuStage()
}
},
//保存约访
savePoint() {
this.yueMsg.StuId = this.saveObj.StuId;
if(this.yueMsg.AppointmentPoint==''){
if (this.yueMsg.AppointmentPoint == '') {
this.$q.notify({
type: 'negative',
position: "top",
......@@ -176,7 +196,7 @@
})
return;
}
if(this.yueMsg.AppointmentTime==''){
if (this.yueMsg.AppointmentTime == '') {
this.$q.notify({
type: 'negative',
position: "top",
......@@ -249,7 +269,16 @@
changePage(val) {
this.msg.pageIndex = val;
this.getList();
}
},
setStuStage(){
const msg={
StuId:this.saveObj.StuId,
StuStage:this.stuStageId,
}
SetStuStage(msg).then(res=>{
this.$emit('update')
})
},
}
}
......
......@@ -4,7 +4,8 @@
<div class="MycustomMain">
<div class="myCustomBottom">
<div class="myDetail-info">
<student-left :save-obj="saveObj" :AddType="1" @success="refreshStudentPage" @close="closeCutomer"></student-left>
<student-left :save-obj="saveObj" :AddType="1" @success="refreshStudentPage" @close="closeCutomer">
</student-left>
</div>
</div>
<div class="dialog-out-close" @click="closeCutomer">
......@@ -12,10 +13,8 @@
</div>
</div>
</q-dialog>
</template>
<script>
import studentLeft from '../student/student-left';
export default {
meta: {
......@@ -52,7 +51,6 @@
}
},
}
</script>
<style>
.MycustomMain {
......@@ -86,4 +84,4 @@
.myDetail-info::-webkit-scrollbar {
display: none;
}
</style>
</style>
\ No newline at end of file
......@@ -19,7 +19,28 @@
full-mask
mask="###########"
label="客户电话"
@input="checkStuTel"
@blur="checkStuTel(1)"
></q-input>
</div>
<div class="q-mt-xs row q-col-gutter-md">
<q-input
class="col-6"
filled
v-model="customObj.QQ"
dense
full-mask
mask="###########"
label="客户QQ"
@blur="checkStuTel(2)"
></q-input>
<q-input
class="col-6"
filled
v-model="customObj.WeChatNo"
dense
full-mask
label="客户微信号"
@blur="checkStuTel(3)"
></q-input>
</div>
<div class="q-mt-xs row q-col-gutter-md">
......@@ -36,6 +57,34 @@
behavior="menu"
class="col-6"
/>
<q-select
filled
v-model="customObj.StuChannel"
v-if="customObj.CreateType==1"
label="获客渠道"
dense
:options="StuChannelList"
option-label="Name"
option-value="Id"
emit-value
map-options
class="col-6"
behavior="menu"
/>
<q-select
filled
v-model="customObj.CustomerId"
v-if="customObj.CreateType==2"
label="关联同行"
dense
:options="customList"
option-label="CustomerName"
option-value="CustomerId"
emit-value
map-options
class="col-6"
behavior="menu"
/>
<q-select
v-if="customObj.CreateType == 3"
filled
......@@ -52,28 +101,44 @@
behavior="menu"
class="col-6"
/>
<q-select
v-if="customObj.CreateType == 4"
filled
v-model="customObj.StuSourceId"
dense
:options="customList"
option-label="CustomerName"
option-value="CustomerId"
emit-value
map-options
label="转介人"
behavior="menu"
class="col-6"
/>
</div>
<div class="q-mt-xs row q-col-gutter-md">
<q-select
filled
v-model="customObj.StuChannel"
label="获客渠道"
v-model="customObj.StuType"
dense
:options="StuChannelList"
:options="customTypeList"
option-label="Name"
option-value="Id"
emit-value
map-options
class="col-6"
label="客户类型"
behavior="menu"
class="col-6"
/>
</div>
<div class="q-mt-xs row q-col-gutter-md">
<q-input
filled
v-model="customObj.PlatformName"
:label="customObj.StuChannel == 6 ? '平台名称' : '其他渠道名称'"
dense
class="col-6"
v-if="customObj.StuChannel == 6 || customObj.StuChannel == 7"
v-if="customObj.CreateType==1&&(customObj.StuChannel == 6 || customObj.StuChannel == 7)"
></q-input>
</div>
<div style="font-size:12px;" class="text-grey-6 q-my-md">补充资料</div>
......@@ -198,14 +263,16 @@
import {
getStudentInfo, //获取学员客户信息
queryStuStageList, //获取客户阶段列表
saveStudent //保存学员信息
saveStudent, //保存学员信息
GetStudentTypeList
} from "../../../api/school/index";
import {
getGuestBasicsEnumList,
getGuestEducationEnumList,
getGuestLearningGoalsEnumList,
GetStuChannelList,
CreateTypeList
CreateTypeList,
GetCustomerList
} from "../../../api/sale/sale";
import { queryEmployee, queryStudentByTel } from "../../../api/users/user";
export default {
......@@ -249,7 +316,9 @@ export default {
myEmployeeList: [],
customFromList: [],
StuChannelList: [], //收客渠道
AssistDropList: [] //协助人员
AssistDropList: [], //协助人员
customList:[],
customTypeList:[] //客户类型
};
},
created() {
......@@ -260,6 +329,8 @@ export default {
this.getEmployeeList();
this.GetStuChannelList();
this.getCustomFrom();
this.GetCustomerList();
this.getCustomTypeList();
if (this.saveObj && this.saveObj.StuId > 0) {
this.customMsg.StuId = this.saveObj.StuId;
this.queryStuInfo();
......@@ -275,13 +346,36 @@ export default {
}
});
},
checkStuTel() {
if (this.customObj.StuTel && this.customObj.StuTel.length == 11) {
queryStudentByTel({ StuTel: this.customObj.StuTel }).then(r => {
if (r.Data) {
this.$emit("success", r.Data, 1);
}
});
checkStuTel(type) {
//验证手机
if(type==1){
if (this.customObj.StuTel && this.customObj.StuTel.length == 11) {
queryStudentByTel({ StuTel: this.customObj.StuTel, QQ:'', WeChatNo:'' }).then(r => {
if (r.Data) {
this.$emit("success", r.Data, 1);
}
});
}
}
//验证QQ
if(type==2){
if (this.customObj.QQ) {
queryStudentByTel({ StuTel: '', QQ:this.customObj.QQ , WeChatNo:'' }).then(r => {
if (r.Data) {
this.$emit("success", r.Data, 1);
}
});
}
}
//验证微信
if(type==3){
if (this.customObj.WeChatNo) {
queryStudentByTel({ StuTel: '', QQ:'' , WeChatNo:this.customObj.WeChatNo }).then(r => {
if (r.Data) {
this.$emit("success", r.Data, 1);
}
});
}
}
},
validate() {
......@@ -289,8 +383,8 @@ export default {
console.log(this.customObj);
if (!this.customObj.StuName) {
msg = "请输入客户名称";
} else if (!this.customObj.StuTel || this.customObj.StuTel.length != 11) {
msg = "请输入正确的客户手机号";
} else if (!this.customObj.StuTel && !this.customObj.QQ && !this.customObj.WeChatNo) {
msg = "请至少输入一个手机号QQ号微信号";
} else if (!this.customObj.CreateType) {
msg = "请选择客户来源";
} else if (!this.customObj.StuChannel) {
......@@ -381,6 +475,22 @@ export default {
this.customState = res.Data;
});
},
//获取客户下拉数据
GetCustomerList() {
GetCustomerList().then(res => {
if (res.Code == 1) {
this.customList = res.Data;
}
})
},
//获取客户类型
getCustomTypeList(){
GetStudentTypeList().then(res => {
if (res.Code == 1) {
this.customTypeList = res.Data;
}
})
},
queryStuInfo() {
getStudentInfo({
StuId: this.customMsg.StuId
......
......@@ -15,7 +15,7 @@
<!-- <div class="wechat_Name">张飞微信</div> -->
</div>
</div>
<div class="custom_HRight">
<div class="custom_HRight" v-if="getJudgeTrans()">
<q-btn color="primary" size="sm" label="转交" @click="isShowTrans=true">
<q-popup-proxy :offset="[10, 10]">
<q-banner v-if="isShowTrans">
......@@ -30,7 +30,7 @@
</div>
<div class="custom_Bottom">
<div class="detail-info">
<student-left :save-obj="saveObj" @success="refreshStudentPage"></student-left>
<student-left :stuData="stuData" :save-obj="saveObj" @success="refreshStudentPage" @getrecord="getrecord" @update="queryStuInfo"></student-left>
</div>
<div class="detail-travel">
<div class="detail_first">
......@@ -50,15 +50,19 @@
</div>
<!-- 记录 -->
<template v-if="ckedTab==1">
<student-record :save-obj="baseObj" @success="refreshStudentPage"></student-record>
<student-record :save-obj="baseObj" @success="refreshStudentPage" ref="mychild"></student-record>
</template>
<!-- 操作 -->
<template v-if="ckedTab==2">
<div class="operate_Content" style="margin-top:20px;">
<student-visit :save-obj="baseObj" :StuId="baseObj.StuId" v-if="secondType==1" @success="refreshStudentPage"></student-visit>
<student-yuefang :save-obj="baseObj" v-if="secondType==2" @success="refreshStudentPage"></student-yuefang>
<student-genjin :save-obj="baseObj" v-if="secondType==3" @success="refreshStudentPage"></student-genjin>
<student-shiting :save-obj="baseObj" v-if="secondType==4" @success="refreshStudentPage"></student-shiting>
<student-visit :stateId="stateId" :stateList="customStateList" @update="queryStuInfo" :save-obj="baseObj" :StuId="baseObj.StuId"
v-if="secondType==1" @success="refreshStudentPage"></student-visit>
<student-yuefang :stateId="stateId" :stateList="customStateList" @update="queryStuInfo" :save-obj="baseObj" v-if="secondType==2"
@success="refreshStudentPage"></student-yuefang>
<student-genjin :stateId="stateId" :stateList="customStateList" @update="queryStuInfo" :save-obj="baseObj" v-if="secondType==3"
@success="refreshStudentPage"></student-genjin>
<student-shiting :save-obj="baseObj" v-if="secondType==4" @success="refreshStudentPage">
</student-shiting>
</div>
</template>
<!-- 订单 -->
......@@ -91,7 +95,10 @@
import {
ForwardStudent
} from '../../../api/customerstudent/customerstudent'
import {
getStudentInfo,//获取学员客户信息
queryStuStageList, //获取客户阶段列表
} from '../../../api/school/index';
import studentLeft from '../student/student-left';
import studentRecord from '../student/student-record';
import studentVisit from '../student/student-visit';
......@@ -120,6 +127,10 @@
saveObj: {
type: Object,
default: null
},
isJudgeTrans: {
type: Number,
default: null
}
},
data() {
......@@ -152,14 +163,35 @@
//员工列表
employeeList: [],
myEmployeeList: [],
isShowTrans: false
isShowTrans: false,
customStateList: [],
stateId:0,
stuData:{},
}
},
created() {
this.getStuStageList()
this.queryStuInfo()
},
mounted() {
this.baseObj = this.saveObj;
this.getEmployeeList();
},
methods: {
//判断是否显示转交
getJudgeTrans() {
let userInfo = this.getLocalStorage();
let Id = userInfo.Id;
if (this.isJudgeTrans == 1) {
if (this.baseObj.CreateBy == Id) {
return true
} else {
return false
}
} else {
return true
}
},
closeCutomer() {
this.$emit('close')
},
......@@ -203,9 +235,30 @@
}
this.isShowTrans = false;
})
}
},
//保存成功后调用记录
getrecord() {
this.$refs.mychild.getStuLogPage();
},
//获取客户阶段列表
getStuStageList() {
queryStuStageList().then(res => {
this.customStateList = res.Data;
})
},
queryStuInfo() {
getStudentInfo({
StuId: this.saveObj.StuId
}).then(res => {
if (res.Code == 1) {
this.stuData=res.Data
this.stateId = res.Data.StuStage;
}
});
},
},
}
</script>
<style>
.custom_RModel {
......@@ -472,18 +525,22 @@
width: 57px;
text-align-last: justify;
}
.Stu_OrderId{
.Stu_OrderId {
color: #2961FE;
font-weight: bold;
text-decoration: underline;
cursor: pointer;
}
.Stu_HtLeft{
width:57px;
.Stu_HtLeft {
width: 57px;
display: inline-block;
text-align-last: justify;
}
.fullscreen{
z-index:3000;
.fullscreen {
z-index: 3000;
}
</style>
\ No newline at end of file
</style>
......@@ -29,16 +29,16 @@
</style>
<template>
<div class="stuList">
<q-table :pagination="pageMsg" :loading="loading" no-data-label="暂无相关数据" flat selection="multiple"
<q-table :pagination="pageMsg" :loading="loading" no-data-label="暂无相关数据" flat selection="single"
:selected.sync="selection" class="sticky-right-column-table sticky-tow-column-table" separator="none"
:data="dataList" :columns="columns" row-key="StuId" hide-bottom>
<template v-slot:top="props">
<div class="col-2 q-table__title">我的客户</div>
<template v-slot:top>
<div class="col-2 q-table__title">学员信息</div>
<q-space />
<div class="page-option">
<q-btn color="accent" class="q-mr-md" size="sm" icon="swap_horiz" label="转订单" :disable="selection.length===0"
@click="transferOrder" />
<q-btn color="accent" class="q-mr-md" size="sm" icon="add" label="新增客户" @click="EditStudent(null)" />
<q-btn color="accent" class="q-mr-md" size="sm" icon="add" label="新增学员" @click="EditStudent(null)" />
</div>
</template>
<template v-slot:body-cell-StuIcon="props">
......@@ -77,9 +77,11 @@
<div style="max-height:600px;overflow-y:auto;">
<table class="stuListTable" style="border-collapse:collapse;">
<tr>
<th>角色</th>
<th>协同人</th>
</tr>
<tr v-for="(sItem,sIndex) in props.row.AssistList" style="border-bottom:1px dashed #d1d1d1;" :key="sIndex">
<td>{{sItem.AssistTypeName}}</td>
<td>{{sItem.AssistName}}</td>
</tr>
</table>
......@@ -98,7 +100,7 @@
</q-table>
<student-form v-if="isShowStuForm" :save-obj="stuOption" @close="closeStuForm" @success="refreshStuList">
</student-form>
<studentRight-form v-if="isShowStuRight" :save-obj="stuOption" @close="closeStuForm" @success="refreshStuList">
<studentRight-form v-if="isShowStuRight" :isJudgeTrans="isJudgeTrans" :save-obj="stuOption" @close="closeStuForm" @success="refreshStuList">
</studentRight-form>
<studentAdd-form v-if="isShowAdd" :save-obj="stuOption" @close="closeStuForm" @success="refreshStuList">
</studentAdd-form>
......@@ -116,6 +118,10 @@
dataList: {
type: Array,
default: null
},
isJudgeTrans:{
type: Number,
default: null
}
},
components: {
......@@ -151,12 +157,36 @@
field: "StuTel",
align: "left"
},
{
name: "QQ",
label: "QQ",
field: "QQ",
align: "left"
},
{
name: "WeChatNo",
label: "微信",
field: "WeChatNo",
align: "left"
},
{
name: "StuTypeName",
label: "客户类型",
field: "StuTypeName",
align: "left"
},
{
name: "StuStageName",
label: "客户阶段",
field: "StuStageName",
align: "left"
},
{
name: "StuNeedsName",
label: "客户需求",
field: "StuNeedsName",
align: "left"
},
{
name: "StuProfession",
label: "职业",
......@@ -240,14 +270,12 @@
stuOption: null,
isShowAdd: false,
selection: [],
isShowTransfer: false,
isShowTransfer: false
};
},
watch:{
dataList:{
handler(val){
console.log(201,val)
this.selection=[];
},
deep:true
......
......@@ -409,4 +409,7 @@ export default {
background-color: transparent;
border: none;
}
/deep/.q-stepper__step-inner{
padding:0 24px;
}
</style>
\ No newline at end of file
<template>
<div class="orderCourse">
<q-table
:pagination="msg"
selection="single"
:selected.sync="selection"
no-data-label="暂无相关数据"
flat
class="sticky-tow-column-table "
separator="none"
:data="dataList"
:columns="columns"
row-key="ClassId"
title="日语培训产品列表"
@update:selected ="emitSel"
>
<!-- <template v-slot:body-cell-ClassName="props">
<q-td :props="props">
{{ props.row.ClassName }}
</q-td>
</template> -->
<template v-slot:bottom> </template>
</q-table>
</div>
<q-table :pagination="msg" selection="single" :selected.sync="selection" no-data-label="暂无相关数据" flat
class="sticky-tow-column-table sticky-two-header-table" separator="none" :data="dataList" :columns="columns"
row-key="ClassId" @update:selected="emitSel" table-class="table" hide-bottom>
</q-table>
</template>
<script>
export default {
props: {
dataList: {
type: Array,
default: () => []
},
select:{
type: Array,
default: () => []
}
},
data() {
return {
selection: [],
msg: {
pageIndex: 1,
rowsPerPage: 0
export default {
props: {
dataList: {
type: Array,
default: () => []
},
columns: [
{
name: "ClassName",
label: "班级",
align: "left",
field: "ClassName"
},
{
name: "CourseName",
label: "课程",
field: "CourseName",
align: "left"
},
{
name: "TeacherName",
label: "老师",
field: "TeacherName",
align: "left"
select: {
type: Array,
default: () => []
}
},
data() {
return {
selection: [],
msg: {
pageIndex: 1,
rowsPerPage: 0
},
{
name: "OpenTime",
label: "上课时间",
field: "OpenTime",
align: "left"
}
]
};
},
mounted() {
this.selection=this.select
},
methods: {
emitSel(val){
this.$emit("select",val)
columns: [{
name: "ClassName",
label: "班级",
align: "left",
field: "ClassName"
},
{
name: "CourseName",
label: "课程",
field: "CourseName",
align: "left"
},
{
name: "TeacherName",
label: "老师",
field: "TeacherName",
align: "left"
},
{
name: "OpenTime",
label: "上课时间",
field: "OpenTime",
align: "left"
}
]
};
},
mounted() {
this.selection = this.select
},
methods: {
emitSel(val) {
this.$emit("select", val)
},
}
};
}
};
</script>
<style >
.orderCourse .q-table__bottom {
min-height: 0;
}
<style>
.table {
max-height: 400px;
}
.table::-webkit-scrollbar {
width: 5px;
height: 5px;
}
.table::-webkit-scrollbar-track {
background: #fff;
border-radius: 2px;
}
.table::-webkit-scrollbar-thumb {
background: #444;
border-radius: 10px;
}
.table::-webkit-scrollbar-thumb:hover {
background: #999;
}
.table::-webkit-scrollbar-corner {
background: #204754;
}
</style>
<!--订单操作-->
<template>
<div>
<div class="q-mb-sm text-accent">
<span class="text-primary">班级:</span>{{saveObj.ClassName}}
<span class="q-ml-md text-primary">课程:</span>{{saveObj.CourseName}}
</div>
<div class="row q-mb-md">
<div class="col-10 flex">
<div v-for="(item, index) in stuData.StuList">
......@@ -210,7 +214,7 @@
label="客人来源"
/>
<q-select
:disable="modityOrderType == 2 || OrderMsg.JoinType == 3"
:disable="(modityOrderType == 2 || OrderMsg.JoinType == 3)||HelpEnterDisable"
v-model="OrderMsg.HelpEnterId"
:options="EmployeeList"
filled
......@@ -233,7 +237,7 @@
</template>
</q-select>
<q-select
:disable="modityOrderType == 2 || OrderMsg.JoinType == 3"
:disable="(modityOrderType == 2 || OrderMsg.JoinType == 3)||CourseConsultantDisable"
v-model="OrderMsg.CourseConsultantId"
:options="EmployeeList"
filled
......@@ -293,6 +297,15 @@
label="少价金额(每人)"
:hint="'总少价金额:' + OrderMsg.PerLessMoney * OrderMsg.GuestNum"
/>
<q-input
disable
v-if="OrderMsg.EnterId >0"
filled
stack-label
v-model="EnterName"
class="col-6 q-py-sm"
label="市场人员"
/>
<q-input
filled
stack-label
......@@ -322,9 +335,10 @@ import {
queryChaClassInfo,
GetSelectClassOrderList, //获取前置下拉
} from "../../../../api/sale/sale";
import {
GetStudentAssistList,
} from '../../../../api/sale/sale'//获取协助人员
import { queryEmployee } from "../../../../api/users/user"; //获取员工
import { mapState } from "vuex";
export default {
props: {
saveObj: {
......@@ -384,9 +398,11 @@ export default {
CustomerId: 0, //同行
OrderIdentify: 2, //标识参数, 1产品下单 2客户转订单
StuIds: "",
EnterId:0,//市场人员
// NormalCommission:'',//正常返佣金额
// RenewCommission:"",// 预计返佣金额
},
EnterName:'',//市场人员
Unit_PriceRemark: "", //单价规则
IsShowUpPrice: false, //是否显示高于定价
UnitPrice: 0,
......@@ -396,6 +412,8 @@ export default {
CourseList: [], //课程列表
courseObj: {}, //选择的课程
beforeOrderList: [], //前置订单数据
HelpEnterDisable:false,//是否可选择协助教师
CourseConsultantDisable:false,//是否可选择课程顾问
};
},
created() {
......@@ -409,9 +427,29 @@ export default {
},
mounted() {
this.initData();
this.getAssistList();
this.OrderMsg.EnterId=this.stuData.EnterId
this.EnterName=this.stuData.EnterName
},
watch: {},
methods: {
//获取协助人员
getAssistList() {
const ids = this.stuData.StuList.map(e => e.StuId).toString();
GetStudentAssistList({StuId: ids}).then(res => {
if (res.Code == 1) {
res.Data.map(e=>{
if(e.AssistType==4){
this.OrderMsg.HelpEnterId=e.AssistId
this.HelpEnterDisable=true
}
if(e.AssistType==2){
this.OrderMsg.CourseConsultantId=e.AssistId
this.CourseConsultantDisable=true
}
})
}
})
},
//获取班级课程信息
initConfig() {
var qMsg = {
......@@ -438,7 +476,6 @@ export default {
},
//计算课程单价和应收金额
calcPrice() {
console.log("this.OrderMsg",this.OrderMsg)
var guestNum = 0;
if (this.OrderMsg.GuestNum && this.OrderMsg.GuestNum > 0) {
guestNum = Number(this.OrderMsg.GuestNum);
......@@ -675,7 +712,6 @@ export default {
//修改订单
saveOrderInfo() {
//插班验证课程和生效时间
console.log(783,this.OrderMsg)
if (this.OrderMsg.IsChaBan == 1) {
this.$refs.CourseId.validate();
this.$refs.EffectTime.validate();
......
......@@ -7,7 +7,7 @@
<q-card-section class="q-pt-none scroll" style="max-height: 70vh">
<div class="text-caption q-mb-lg q-px-md text-grey-6">{{Type==1?'留学':'就业'}}信息</div>
<div class="row wrap">
<q-input filled stack-label maxlength="30" :dense="false" v-model="objOption.Name" ref="Name"
<q-input filled stack-label maxlength="300" :dense="false" v-model="objOption.Name" ref="Name"
class="col-6 q-pr-lg q-pb-lg" label="项目名称" :rules="[val => !!val || '项目名称']" />
<q-select filled stack-label option-value="Id" option-label="Name" v-model="objOption.SupplierId"
ref="SupplierId" :options="supplierList" label="供应商" :dense="false" :rules="[val => !!val || '请选择供应商']"
......
<template>
<q-dialog v-model="persistent" content-class="bg-grey-1" persistent transition-show="scale" transition-hide="scale">
<q-card style="width: 400px;max-width:400px;">
<q-card-section>
<div class="text-h6">{{optionTitle}}</div>
</q-card-section>
<q-card-section class="q-pt-none scroll" style="max-height: 70vh">
<div class="row wrap">
<q-input filled stack-label maxlength="30" :dense="false" v-model="objOption.Name" ref="Name"
class="col-12 q-pb-lg" label="需求" :rules="[val => !!val || '请填写需求']" />
</div>
</q-card-section>
<q-separator />
<q-card-actions align="right" class="bg-white">
<q-btn label="取消" flat color="grey-10" style="font-weight:400 !important" @click="closeSaveForm" />
<q-btn label="立即提交" color="accent q-px-md" style="font-weight:400 !important" :loading="saveLoading"
@click="saveNeed" />
</q-card-actions>
</q-card>
</q-dialog>
</template>
<script>
import {
SetNeeds,
GetNeeds
} from '../../api/system/index'
export default {
props: {
saveObj: {
type: Object,
default: null
}
},
data() {
return {
persistent: true,
saveLoading: false,
objOption: {
Id: 0,
Name: '',
},
optionTitle: "",
}
},
mounted() {
this.initObj();
},
methods: {
//初始化表单
initObj() {
if (this.saveObj && this.saveObj.Id > 0) {
GetNeeds({
Id: this.saveObj.Id
}).then(res => {
this.objOption.Id = this.saveObj.Id;
this.objOption.Name = this.saveObj.Name;
})
this.optionTitle = "修改客户需求"
} else {
this.optionTitle = "新增客户需求"
this.objOption.Id = 0;
this.objOption.Name = '';
}
},
//关闭弹窗
closeSaveForm() {
this.$emit('close')
},
//保存菜单
saveNeed() {
this.$refs.Name.validate();
if (!this.$refs.Name.hasError) {
this.saveLoading = true
SetNeeds(this.objOption).then(res => {
this.saveLoading = false;
if (res.Code == 1) {
this.$q.notify({
icon: 'iconfont icon-chenggong',
color: 'accent',
timeout: 2000,
message: '数据保存成功!',
position: 'top'
})
this.$emit("success")
this.closeSaveForm()
}
})
}
}
}
}
</script>
This diff is collapsed.
This diff is collapsed.
......@@ -188,6 +188,10 @@
padding: 0!important;
height:20px;
}
.yangben_bg{
background-image: url(../assets/images/yangben.png);
background-size:100%;
}
</style>
<template>
<div class="TcConfirmMain">
......@@ -216,7 +220,7 @@
</div>
</div>
<div class="ContractMain">
<div style="padding:100px 15px 80px 15px;" v-if="ActiveTab==1">
<div style="padding:100px 15px 80px 15px;" v-if="ActiveTab==1" :class="{'yangben_bg':gmsg.ContractId==7}">
<div class="contractTitle">一、声明</div>
<p>当您签署此协议之前,请确保已清楚了解以下事宜:</p>
<p>1、温馨提示:日语学习的过程中,学员的上课到勤率越高,教学成果会更好,学员达成课程学习目标的概率将会较高。</p>
......@@ -794,6 +798,9 @@
if (this.$route.query.ContractId) {
this.gmsg.ContractId = this.$route.query.ContractId;
this.getList();
}else{
this.gmsg.ContractId = 7;
this.getList();
}
},
methods: {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -69,4 +69,10 @@ export function compareObject(objA, objB,ignoreArray, endLoop) {
isSame = compareObject(objB, objA,ignoreArray, true)
}
return isSame
}
//验证11位的号码
export function validateTel(tel) {
const reg = /^1[3|4|5|7|8]\d{9}$/
return reg.test(tel)
}
\ No newline at end of file
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