Commit 4b651e3f authored by 罗超's avatar 罗超

Merge branch 'master' of http://gitlab.oytour.com/luochao/confucius

# Conflicts:
#	src/App.vue
#	src/utils/erpindex.js
parents 8f0f69bb b6e869fe
......@@ -7,20 +7,12 @@
<script>
export default {
name: "App",
mounted() {
if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|wOSBrowser|BrowserNG|WebOS)/i))) {
//alert("shouji");
} else {
//alert("diannao");
document.write('<link href="font.css" rel="stylesheet" type="text/css" media="screen" />');
}
},
};
</script>
<style>
@import url("//at.alicdn.com/t/font_2077629_ew7nihu6b4p.css");
@import url("~assets/css/font.css");
@import url("//at.alicdn.com/t/font_2077629_8vzffiv0anf.css");
.q-scrollarea__thumb {
z-index: 999999 !important;
}
......
......@@ -152,4 +152,65 @@ export function GetMyEducationContractPageList(data) {
method: 'post',
data
})
}
\ No newline at end of file
}
/**
* 获取退课协议管理列表
*
*/
export function GetBackClassProtocolPage(data) {
return request({
url: '/EducationContract/GetBackClassProtocolPage',
method: 'post',
data
})
}
/**
* 获取退课详情
*
*/
export function GetBackClassProtocol(data) {
return request({
url: '/EducationContract/GetBackClassProtocol',
method: 'post',
data
})
}
/**
* 获取签字
*
*/
export function SetBackClassProtocolSign(data) {
return request({
url: '/EducationContract/SetBackClassProtocolSign',
method: 'post',
data
})
}
/**
* 销售确认退课协议
*
*/
export function SetBackClassProtocolSure(data) {
return request({
url: '/EducationContract/SetBackClassProtocolSure',
method: 'post',
data
})
}
/**
 * 获取签字二维码链接
 *
 */
export function CreateWeChatCode(data) {
  return request({
    url: '/EducationContract/CreateWeChatCode',
    method: 'post',
    data
  })
}
\ No newline at end of file
import request from '../../utils/request'
/**
* 获取网站导航分页
*
*/
export function getWeChatConfigInfo(data) {
return request({
url: '/QYWeChat/GetWeChatConfigInfo',
method: 'post',
data
})
}
/**
* 获取网站导航分页
*
*/
export function setWeChatConfig(data) {
return request({
url: '/QYWeChat/SetWeChatConfig',
method: 'post',
data
})
}
/**
* 初始化 同步部门至企业微信
*
*/
export function setSyncEduDepartment(data) {
return request({
url: '/QYWeChat/SetSyncEduDepartment',
method: 'post',
data
})
}
/**
* 初始化 同步员工至企业微信
*
*/
export function SetSynvEduEmployee(data) {
return request({
url: '/QYWeChat/SetSynvEduEmployee',
method: 'post',
data
})
}
\ No newline at end of file
......@@ -8,7 +8,7 @@ LoadingBar.setDefaults({
position: "bottom"
});
let loadAsyncRouter = false;
const whiteList = ["/login", "/", "/contractConfirm","/contractPay","/contractView","/contractSign","/noticeView","/autologin"]; // 不重定向白名单
const whiteList = ["/login", "/", "/contractConfirm","/contractPay","/contractView","/contractSign","/noticeView","/autologin","/courseRefundH5"]; // 不重定向白名单
router.beforeEach((to, from, next) => {
localStorage.setItem("routerBefore", from.path);
LoadingBar.start();
......
......@@ -217,6 +217,10 @@
ref="ClassStyle" :options="classSetList" label="排课安排" :dense="false" class="col-6 q-pr-lg q-pr-lg"
emit-value map-options @input="changeClassStyle(objOption.ClassStyle)" />
</div>
<div class="col-6">
<q-input filled stack-label maxlength="6" v-model="objOption.ClassHours" :dense="false"
class="col-6 q-pr-lg q-pb-lg" label="学习课时(课程)" @keyup.native="checkInteger(objOption,'ClassHours')" disable />
</div>
</div>
<div class="row wrap" v-if="objOption.ClassStyle==1">
<div class="col-6">
......@@ -338,11 +342,8 @@
</template>
<div class="row wrap" style="margin-top:30px;">
<div class="col-6">
<q-input filled stack-label maxlength="6" v-model="objOption.ClassHours" :dense="false"
class="col-6 q-pr-lg q-pb-lg" label="学习课时" @keyup.native="checkInteger(objOption,'ClassHours')" />
</div>
<div class="col-6">
<div class="col-6" style="display:none">
<q-select label="课时分钟数" filled stack-label v-model="objOption.ClassHourMinute"
:options="ClassHourMinuteArray" option-value="Id" option-label="Name" :dense="false"
class="col-6 q-pr-lg q-pb-lg" emit-value map-options>
......@@ -521,6 +522,9 @@
if (val.SellPrice) {
this.objOption.SellPrice = val.SellPrice;
}
if (val.ClassHours) {
this.objOption.ClassHours = val.ClassHours;
}
}
}
},
......
......@@ -267,7 +267,7 @@
</div>
</div>
<div class="row col-12" v-if="choosePlat.find((e) => e == 4)">
<!-- <span class="q-mb-sm">选择分类:</span>
<span class="q-mb-sm">选择分类:</span>
<q-card class="full-width">
<q-tree
class="col-sm-6"
......@@ -280,7 +280,7 @@
default-expand-all
@update:ticked="handleCheckChange"
/>
</q-card> -->
</q-card>
</div>
</q-card-section>
<q-separator />
......
This diff is collapsed.
<style>
.editOrderDrawerTop {
width: 100%;
height: 50px;
display: flex;
justify-content: space-between;
background-color: #f0f5fb;
padding: 5px 10px;
align-items: center;
}
.disableStatus {
opacity: 0.3 !important;
cursor: auto;
}
.imgstyle {
width: 100%;
height: 126px;
border-radius: 4px;
}
.avatar-uploader .el-upload {
border-radius: 6px;
cursor: pointer;
width: 100%;
height: 100%;
color: #8c939d;
position: relative;
overflow: hidden;
}
.addDutyMain {
display: inline-block;
width: 118px;
height: 118px;
font-size: 40px;
border: 1px dashed #d9d9d9;
line-height: 118px;
}
.up-box {
width: 90px;
height: 90px;
border: 1px dashed #ccc;
text-align: center;
line-height: 80px;
font-size: 50px;
cursor: pointer;
}
</style>
<template>
<div>
<q-dialog v-model="IsShow" persistent>
<q-card style="width: 800px; max-width: 80vw;">
<q-card-section>
<div class="text-h6">小程序</div>
</q-card-section>
<q-separator />
<q-card-section class="q-pt-none">
<el-form ref="addMsg" :model="addMsg" label-width="120px">
<el-form-item label="添加方式:">
<q-radio v-model="addMsg.Addtype" val="1" label="新建" />
<q-radio v-model="addMsg.Addtype" val="2" label="导入" />
</el-form-item>
<div v-if="addMsg.Addtype ==1 ">
<el-form-item label="图片封面:" required>
<div class="up-box" @click="selectimg(2)">
<span v-if="addMsg.CoverImage==''">+</span>
<q-img v-else :src="addMsg.CoverImage" style="width: 100%;height: 100%;display: flex;">
</q-img>
</div>
</el-form-item>
<el-form-item label="添加标题:" required>
<q-input clearable standout="bg-primary text-white" v-model="addMsg.title" label="标题" style="width: 80%;" />
</el-form-item>
<el-form-item label="AppID:" required>
<q-input clearable standout="bg-primary text-white" v-model="addMsg.AppID" label="请填写小程序AppID,必须是关联到企业的小程序应用" style="width: 80%;" />
</el-form-item>
<el-form-item label="page路径:" required>
<q-input clearable standout="bg-primary text-white" v-model="addMsg.link" label="请填写小程序路径,例如:pages/index" style="width: 80%;" />
</el-form-item>
<el-form-item label="素材同步:">
<div class="q-gutter-sm" style="align-items: flex-start;display: flex;">
<q-radio v-model="addMsg.issynchro" val="2" label="不同步" />
<q-radio v-model="addMsg.issynchro" val="1" label="同步至【内容引擎】" />
<div v-if="addMsg.issynchro==1" style="width: 200px;">
<q-select filled stack-label option-value="ID" option-label="Name"
v-model="addMsg.classifyId" ref="ID" :options="classifyList" label="分类" :dense="false" emit-value map-options />
</div>
</div>
</el-form-item>
</div>
<div v-if="addMsg.Addtype ==2 ">
<el-form-item label="小程序:" required>
<q-btn color="accent" class="q-mr-md" label="选择小程序" @click="selectimg(4)" />
</el-form-item>
</div>
</el-form>
</q-card-section>
<q-separator />
<q-card-actions align="right" class="bg-white">
<q-btn class="q-mr-md" label="取消" @click="closeEditOrder" />
<q-btn color="accent" class="q-mr-md" label="保存" @click="saveOrderInfo()" />
</q-card-actions>
</q-card>
</q-dialog>
<!-- 图片 -->
<selectMaterial v-if="isshowselectMaterial" :materialType="materialType" :saveobj='Selectobj'
@close="getclose()" @success='getsuccess'>
</selectMaterial>
</div>
</template>
<script>
import {
UploadSelfFile
} from "../../api/common/common"; //上传图片
import selectMaterial from "./selectMaterial"
export default {
props: {
saveobj: {
type: Object,
default: null,
},
},
components: {
selectMaterial,
},
data() {
return {
IsShow: true,
addMsg: {
Addtype: '1',//添加方式 1为新建
CoverImage: '',
title:'',
Content:'',
issynchro:'1',
classifyId:'',
AppID:'',
link:'',
},
materialType: 2,
Selectobj: {},
isshowselectMaterial: false,
classifyList:[
{Name:'活动',ID:1,},
{Name:'产品',ID:2,},
{Name:'校园',ID:3,},
],
}
},
created() {
if (JSON.stringify(this.saveobj) !== '{}') {
this.addMsg = JSON.parse(JSON.stringify(this.saveobj))
}
},
mounted() {
},
watch: {
},
methods: {
//关闭弹窗
closeEditOrder() {
this.$emit('close')
},
selectimg(type) {//素材选择 图片模式
this.materialType = type;
this.isshowselectMaterial = true;
},
getclose() {//素材关闭
this.isshowselectMaterial = false
},
getsuccess(data) {//选择数据回来
this.Selectobj = data
this.addMsg.CoverImage = data.img
this.isshowselectMaterial = false
},
saveOrderInfo(){
this.$emit('success',this.addMsg)
}
}
}
</script>
\ No newline at end of file
<style>
.editOrderDrawerTop {
width: 100%;
height: 50px;
display: flex;
justify-content: space-between;
background-color: #f0f5fb;
padding: 5px 10px;
align-items: center;
}
.disableStatus {
opacity: 0.3 !important;
cursor: auto;
}
.imgstyle {
width: 100%;
height: 126px;
border-radius: 4px;
}
.avatar-uploader .el-upload {
border-radius: 6px;
cursor: pointer;
width: 100%;
height: 100%;
color: #8c939d;
position: relative;
overflow: hidden;
}
.addDutyMain {
display: inline-block;
width: 118px;
height: 118px;
font-size: 40px;
border: 1px dashed #d9d9d9;
line-height: 118px;
}
.up-box {
width: 90px;
height: 90px;
border: 1px dashed #ccc;
text-align: center;
line-height: 80px;
font-size: 50px;
cursor: pointer;
}
</style>
<template>
<div>
<q-dialog v-model="IsShow" persistent>
<q-card style="width: 800px; max-width: 80vw;">
<q-card-section>
<div class="text-h6">图文</div>
</q-card-section>
<q-separator />
<q-card-section class="q-pt-none">
<el-form ref="addMsg" :model="addMsg" label-width="120px">
<el-form-item label="添加方式:">
<q-radio v-model="addMsg.Addtype" val="1" label="新建" />
<q-radio v-model="addMsg.Addtype" val="2" label="导入" />
</el-form-item>
<div v-if="addMsg.Addtype ==1 ">
<el-form-item label="图片封面:" required>
<div class="up-box" @click="selectimg(2)">
<span v-if="addMsg.CoverImage==''">+</span>
<q-img v-else :src="addMsg.CoverImage" style="width: 100%;height: 100%;display: flex;">
</q-img>
</div>
</el-form-item>
<el-form-item label="添加标题:" required>
<q-input clearable standout="bg-primary text-white" v-model="addMsg.title" label="标题" style="width: 80%;" />
</el-form-item>
<el-form-item label="添加描述:">
<q-input v-model="addMsg.Content" filled clearable type="textarea" label="文本内容" style="width: 80%;"/>
</el-form-item>
<el-form-item label="素材同步:">
<div class="q-gutter-sm" style="align-items: flex-start;display: flex;">
<q-radio v-model="addMsg.issynchro" val="2" label="不同步" />
<q-radio v-model="addMsg.issynchro" val="1" label="同步至【内容引擎】" />
<div v-if="addMsg.issynchro==1" style="width: 200px;">
<q-select filled stack-label option-value="ID" option-label="Name"
v-model="addMsg.classifyId" ref="ID" :options="classifyList" label="分类" :dense="false" emit-value map-options />
</div>
</div>
</el-form-item>
<el-form-item label="点击链接:" required>
<q-input clearable standout="bg-primary text-white" v-model="addMsg.link" label="请输入跳转链接,且必须以http://或https://开头" style="width: 80%;" />
</el-form-item>
</div>
<div v-if="addMsg.Addtype ==2 ">
<el-form-item label="图片:" required>
<q-btn color="accent" class="q-mr-md" label="选择图文" @click="selectimg(3)" />
</el-form-item>
</div>
</el-form>
</q-card-section>
<q-separator />
<q-card-actions align="right" class="bg-white">
<q-btn class="q-mr-md" label="取消" @click="closeEditOrder" />
<q-btn color="accent" class="q-mr-md" label="保存" @click="saveOrderInfo()" />
</q-card-actions>
</q-card>
</q-dialog>
<!-- 图片 -->
<selectMaterial v-if="isshowselectMaterial" :materialType="materialType" :saveobj='Selectobj'
@close="getclose()" @success='getsuccess'>
</selectMaterial>
</div>
</template>
<script>
import {
UploadSelfFile
} from "../../api/common/common"; //上传图片
import selectMaterial from "./selectMaterial"
export default {
props: {
saveobj: {
type: Object,
default: null,
},
},
components: {
selectMaterial,
},
data() {
return {
IsShow: true,
addMsg: {
Addtype: '1',//添加方式 1为新建
CoverImage: '',
title:'',
Content:'',
issynchro:'1',
classifyId:'',
link:'',
},
materialType: 2,
Selectobj: {},
isshowselectMaterial: false,
classifyList:[
{Name:'活动',ID:1,},
{Name:'产品',ID:2,},
{Name:'校园',ID:3,},
],
}
},
created() {
if (JSON.stringify(this.saveobj) !== '{}') {
this.addMsg = JSON.parse(JSON.stringify(this.saveobj))
}
},
mounted() {
},
watch: {
},
methods: {
//关闭弹窗
closeEditOrder() {
this.$emit('close')
},
selectimg(type) {//素材选择 图片模式
this.materialType = type;
this.isshowselectMaterial = true;
},
getclose() {//素材关闭
this.isshowselectMaterial = false
},
getsuccess(data) {//选择数据回来
this.Selectobj = data
this.addMsg.CoverImage = data.img
this.isshowselectMaterial = false
},
saveOrderInfo(){
this.$emit('success',this.addMsg)
}
}
}
</script>
\ No newline at end of file
<style>
.editOrderDrawerTop {
width: 100%;
height: 50px;
display: flex;
justify-content: space-between;
background-color: #f0f5fb;
padding: 5px 10px;
align-items: center;
}
.disableStatus{
opacity: 0.3 !important;
cursor: auto;
}
.imgstyle{
width:100%;height: 126px;border-radius: 4px;
}
.avatar-uploader .el-upload {
border-radius: 6px;
cursor: pointer;
width: 100%;
height: 100%;
color: #8c939d;
position: relative;
overflow: hidden;
}
.addDutyMain {
display: inline-block;
width: 118px;
height: 118px;
font-size: 40px;
border: 1px dashed #d9d9d9;
line-height: 118px;
}
</style>
<!--订单操作-->
<template>
<div>
<q-dialog v-model="IsShow" persistent>
<q-card style="width: 900px; max-width: 80vw;">
<q-card-section>
<div class="text-h6">选择素材</div>
</q-card-section>
<q-separator />
<q-card-section class="q-pt-none">
<div class="page-search row items-center">
<div class="col row wrap q-mr-lg q-col-gutter-md" style="margin-top: 0;">
<div class="col-4">
<q-select filled stack-label @input="resetSearch" option-value="ID" option-label="Name"
v-model="msg.classifyId" ref="ID" :options="classifyList" label="分类" :dense="false" emit-value map-options />
</div>
<div class="col-4">
<q-input @input="resetSearch" clearable standout="bg-primary text-white" v-model="msg.EmployeeName"
label="输入搜索内容" maxlength="20" />
</div>
<div class="col-4" v-if="materialType==2" >
<q-btn class="q-mr-md" icon="cloud_upload" label="本地上传" @click="localUpload" />
</div>
</div>
</div>
<div class="q-pa-md">
<div class="q-col-gutter-md row items-start">
<div class="col-2" v-for="(x,y) in data" @click="Selectobj = x">
<q-img
:src="x.img"
class="imgstyle"
:style="{border:x.Id == Selectobj.Id?'2px solid #91d5ff':'2px solid #FFF'}"
>
<div class="absolute-bottom text-subtitle1 text-center" style="padding: 0;">
{{x.name}}
</div>
</q-img>
</div>
</div>
</div>
</q-card-section>
<q-separator />
<q-card-actions align="right" class="bg-white">
<q-btn class="q-mr-md" label="取消" @click="closeEditOrder" />
<q-btn color="accent" class="q-mr-md" label="保存" @click="saveOrderInfo()" />
</q-card-actions>
</q-card>
</q-dialog>
<q-dialog v-model="Islocal" persistent>
<q-card style="width: 800px; max-width: 80vw;">
<q-card-section>
<div class="text-h6">新建图片素材</div>
</q-card-section>
<q-separator />
<q-card-section class="q-pt-none" style="margin-top: 15px;height: 300px;">
<el-form ref="localMsg" :model="localMsg" label-width="120px">
<el-form-item label="上传图片:">
<el-upload class="avatar-uploader addDutyMain" action="" :before-upload="uploadFile"
:show-file-list="false">
<i class="el-icon-plus avatar-uploader-icon" v-if="localMsg.img==''"></i>
<q-img
v-else
:src="localMsg.img"
style="width: 100%;height: 100%;border-radius: 6px;display: flex;"
>
</q-img>
</el-upload>
<div>(图片大小不超过2M,支持JPG、JPEG及PNG格式)</div>
</el-form-item>
<el-form-item label="素材同步:">
<div class="q-gutter-sm" style="align-items: flex-start;display: flex;">
<q-radio v-model="localMsg.issynchro" val="2" label="不同步" />
<q-radio v-model="localMsg.issynchro" val="1" label="同步至【内容引擎】" />
<div v-if="localMsg.issynchro==1" style="width: 200px;">
<q-select filled stack-label option-value="ID" option-label="Name"
v-model="localMsg.classifyId" ref="ID" :options="classifyList" label="分类" :dense="false" emit-value map-options />
</div>
</div>
</el-form-item>
</el-form>
</q-card-section>
<q-separator />
<q-card-actions align="right" class="bg-white">
<q-btn class="q-mr-md" label="取消" @click="Islocal = false" />
<q-btn color="accent" class="q-mr-md" label="上传" @click="savelocal()" />
</q-card-actions>
</q-card>
</q-dialog>
</div>
</template>
<script>
import {
UploadSelfFile
} from "../../api/common/common"; //上传图片
export default {
props: {
saveobj: {
type: Object,
default: null,
},
materialType: {
type: Number,
default: 1
}
},
data() {
return {
IsShow: true,
Islocal:false,
saveStart:false,
msg:{
pageIndex: 1,
pageSize: 10,
classifyId:0,//分类id
Name:'',//文字搜索
},
classifyList:[
{Name:'全部',ID:0,},
{Name:'活动',ID:1,},
{Name:'产品',ID:2,},
{Name:'校园',ID:3,},
],
data:[
{name:'dj.png',img:'http://imgfile.oytour.com/EduSystem/Test/Upload/course/202107070330161360000000064.jpg',Id:1},
{name:'王者荣耀.png',img:'http://imgfile.oytour.com/EduSystem/Test/Upload/course/202107090216027320000000011.jpg',Id:2},
{name:'花火.png',img:'http://imgfile.oytour.com/EduSystem/Test/Upload/course/202107090331312620000000094.jpeg',Id:3},
{name:'你的名字.png',img:'http://imgfile.oytour.com/EduSystem/Test/Upload/course/202107090302364350000000080.jpg',Id:4},
],
Selectobj:null,
localMsg:{//本地上传对象
img:'',
issynchro:'1',//是否同步 1是
classifyID:0,//同步的时候的分类id
}
}
},
created(){
this.Selectobj = JSON.parse(JSON.stringify(this.saveobj))
this.getList()
},
mounted() {
},
watch: {
},
methods: {
//关闭弹窗
closeEditOrder() {
// this.IsShowEditOrder = false;
this.$emit('close')
},
getList(){//获取数据
console.log('获取数据')
},
resetSearch(){
this.msg.pageIndex = 1;
this.getList()
},
saveOrderInfo(){//保存返回数据
if(JSON.stringify(this.Selectobj) == "{}"){
this.$q.notify({
type: 'negative',
message: `还未选择`,
position: 'top'
})
return
}
this.$emit('success',this.Selectobj)
},
localUpload(){//图片模式的时候本地上传
this.Islocal = true
},
savelocal(){//本地上传操作
//这里做上传操作 刷新列表
},
uploadFile(files) {
UploadSelfFile("course", files, res => {
if (res.Code == 1) {
this.localMsg.img = res.FileUrl;
}
});
},
}
}
</script>
\ No newline at end of file
......@@ -160,7 +160,7 @@
</span>
</div>
</div>
<div class="row" style="margin-top:20px;display:none;">
<div class="row" style="margin-top:20px;">
<div class="col-6 q-pr-lg">
<q-input filled v-model="BackAccountName" label="退还账户名"></q-input>
</div>
......@@ -170,8 +170,8 @@
</div>
<q-input filled stack-label :dense="false" v-model="applyReason" style="margin-top: 20px" type="textarea"
class="col-12" label="申请理由" />
<q-input filled stack-label :dense="false" v-model="StateMent" style="margin-top: 20px;display:none" type="textarea"
class="col-12" label="协议申明" />
<q-input filled stack-label :dense="false" v-model="StateMent" style="margin-top: 20px;" type="textarea"
class="col-12" label="协议申明(在退课协议中显示)" />
<div class="row">
<div class="col-12 q-mt-md text-grey-6">
上传附件:<span class="fj-tip" style="font-size: 10px; color: #f00">*单文件限制5M内</span>
......@@ -338,9 +338,10 @@
picIsShow: false,
picObj: [],
initialIndex: 0,
BackAccountName: '工行', //退还户名
BackAccount: '123', //退还账户
StateMent:'我是协议' //协议申明
BackAccountName: '', //退还户名
BackAccount: '', //退还账户
StateMent: '' //协议申明
};
},
created() {
......@@ -440,7 +441,6 @@
// 预览上传文件
if (i.Type == 3) {
this.picObj.push(i.Url);
// this.imgList.push(i.Url)
this.picIsShow = true;
} else {
if (
......
This diff is collapsed.
......@@ -74,9 +74,9 @@
<q-select :disable="modityOrderType==2" standout="bg-primary text-white" option-value="Id" option-label="Name"
v-model="OrderMsg.OrderSource" :options="SourceEnumList" emit-value map-options class="q-pb-lg"
label="客人来源" />
<q-select :disable="(modityOrderType==2)||(OrderMsg.JoinType==3)" v-model="OrderMsg.HelpEnterId" :options="EmployeeList" filled
use-input label="协助老师" option-label="EmployeeName" option-value="Id" ref="EmployeeName" class="col-6 q-pb-lg"
emit-value map-options @filter="filterFn">
<q-select :disable="(modityOrderType==2)||(OrderMsg.JoinType==3)" v-model="OrderMsg.HelpEnterId"
:options="EmployeeList" filled use-input label="协助老师" option-label="EmployeeName" option-value="Id"
ref="EmployeeName" class="col-6 q-pb-lg" emit-value map-options @filter="filterFn">
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
......@@ -172,7 +172,7 @@
StartClassHours: 0, //已上课时
EffectTime: '', //生效时间
UpOrderId: 0, //前置订单编号
JoinType:1,//订单报入类型
JoinType: 1, //订单报入类型
},
IsShowUpPrice: false, //是否显示高于定价
UnitPrice: 0,
......@@ -302,7 +302,7 @@
this.OrderMsg.OrderNature = tempData.OrderNature;
this.OrderMsg.OldPreferPrice = tempData.OldPreferPrice;
this.OrderMsg.CourseId = tempData.CourseId;
this.OrderMsg.JoinType=tempData.JoinType;
this.OrderMsg.JoinType = tempData.JoinType;
this.OrderMsg.StartClassHours = tempData.StartClassHours;
this.OrderMsg.IsChaBan = tempData.IsChaBan;
this.OrderMsg.EffectTime = tempData.EffectTime;
......@@ -326,7 +326,7 @@
this.OrderMsg.IsChaBan = this.isChaBan;
this.OrderMsg.EffectTime = "";
this.OrderMsg.UpOrderId = 0;
this.OrderMsg.JoinType=1;
this.OrderMsg.JoinType = 1;
this.OrderMsg.OrderType = this.orderType;
if (this.OrderMsg.OrderType == 2) {
this.OrderMsg.OrderNature = 1;
......
......@@ -380,21 +380,23 @@
<span @click="isShowPop=true">查看合同</span>
<q-popup-proxy v-if="isShowPop">
<q-banner>
<div style="width: 550px;max-height:220px;overflow:auto;">
<div style="width: 700px;max-height:220px;overflow:auto;">
<table class="Contract_Table">
<tr>
<th>姓名</th>
<th style="width:180px;">合同编号</th>
<th>状态</th>
<th width="200px;">操作</th>
<th style="width:100px;">姓名</th>
<th style="width:150px;">合同编号</th>
<th style="width:50px;">状态</th>
<th style="width:150px;">上传合同信息</th>
<th style="width:200px;">操作</th>
</tr>
<tr v-for="subItem in item.GuestList">
<td>{{subItem.GuestName}}</td>
<td>
<span style="color:var(--q-color-primary);cursor:pointer;"
@click="getShowContract(subItem)">{{subItem.ContractNo}}</span>
{{subItem.ContractNo}}
</td>
<td>{{subItem.ContractStatusStr}}</td>
<td> <span style="color:var(--q-color-primary);cursor:pointer;"
@click="getShowContract(subItem)">{{subItem.GuestContractNo}}</span></td>
<td>
<template v-if="subItem.ContractId==0">
<q-btn v-if="AuthorityObj.isShowEdit" color="accent" size="sm"
......
......@@ -728,10 +728,10 @@
})
},
approvalOrder(num){
if(this.GetDetail.Is_AuditSelf==1){
this.Error("制单人跟审核人不能相同哟,请转交!");
return;
}
// if(this.GetDetail.Is_AuditSelf==1){
// this.Error("制单人跟审核人不能相同哟,请转交!");
// return;
// }
if(this.needSign){
if(this.addMsg.SignImage==""){
this.Error("请签名!");
......
......@@ -739,10 +739,10 @@ import {
})
},
approvalOrder(num){
if(this.GetDetail.Is_AuditSelf==1){
this.Error("制单人跟审核人不能相同哟,请转交!");
return;
}
// if(this.GetDetail.Is_AuditSelf==1){
// this.Error("制单人跟审核人不能相同哟,请转交!");
// return;
// }
if(this.needSign){
if(this.addMsg.SignImage==""){
this.Error("请签名!");
......
<style>
</style>
<template>
<div>
退学协议管理
<div class="page-body">
<div class="page-search row items-center">
<div class="col row wrap q-mr-lg q-col-gutter-md">
<div class="col-3">
<q-input @change="resetSearch" clearable standout="bg-primary text-white" v-model="msg.QOrderId" label="订单编号"
@clear="resetSearch" maxlength="30" />
</div>
<div class="col-3">
<q-select @input="resetSearch" standout="bg-primary text-white" v-model="msg.AuditStatus"
:options="StatusOpts" option-value="Id" option-label="Name" label="状态" emit-value map-options />
</div>
<div class="col-3">
<q-input @change="resetSearch" clearable standout="bg-primary text-white" v-model="msg.ProtocolNum"
label="合同编号" @clear="resetSearch" maxlength="30" />
</div>
<div class="col-3">
<q-input @change="resetSearch" clearable standout="bg-primary text-white" v-model="msg.PartyAName"
label="学生姓名" @clear="resetSearch" maxlength="30" />
</div>
<div class="col-3">
<q-select @input="resetSearch" standout="bg-primary text-white" option-value="Id" option-label="EmployeeName"
v-model="msg.QCreateBy" :options="EmployeeList" emit-value map-options label="业务员" use-input
@filter="filterFn2" clearable />
</div>
</div>
</div>
</template>
\ No newline at end of file
<courserefund-form :loading="loading" :dataList="dataList" @success="getList"></courserefund-form>
<q-pagination class="full-width justify-end" v-model="msg.pageIndex" color="primary" :max="pageCount" :input="true"
@input="changePage" />
</div>
</template>
<script>
import {
GetBackClassProtocolPage
} from "../../api/sale/contract";
import {
queryEmployee
} from '../../api/users/user';
import courserefundForm from "../../components/course/courserefund-form"
export default {
meta: {
title: "退课协议管理",
},
components: {
courserefundForm
},
data() {
return {
loading: true,
msg: {
pageIndex: 1,
pageSize: 12,
PartyAName: '',
AuditStatus: -1,
QOrderId: '',
ProtocolNum: '',
IsQueryAll: 1,
QCreateBy:"",//业务员
},
pageCount: 0,
dataList: [],
//状态下拉
StatusOpts: [{
Id: -1,
Name: "不限",
},
{
Id: 1,
Name: "审核中",
},
{
Id: 2,
Name: "审核通过",
},
{
Id: 3,
Name: "驳回",
},
{
Id: 4,
Name: "待签字",
},
{
Id: 5,
Name: "待确认",
},
{
Id: 6,
Name: "生效",
},
],
EmployeeList: [], //业务员
AllemployeeList: [],
};
},
created() {
this.getEmployee()
},
mounted() {
this.getList();
},
methods: {
//业务员
getEmployee() {
var qMsg = {
Dept_Id: 0
}
queryEmployee(qMsg).then(res => {
if (res.Code == 1) {
this.EmployeeList = res.Data;
this.AllemployeeList = JSON.parse(JSON.stringify(this.EmployeeList));
}
}).catch(() => {
})
},
//筛选业务员
filterFn2(val, update) {
update(() => {
if (val === '') {
this.EmployeeList = JSON.parse(JSON.stringify(this.AllemployeeList))
} else {
const needle = val.toLowerCase()
this.EmployeeList = this.AllemployeeList.filter(v => v.EmployeeName.toLowerCase().indexOf(needle) > -1)
}
})
},
//获取校区列表
getList() {
this.loading = true;
GetBackClassProtocolPage(this.msg).then((res) => {
this.loading = false;
if (res.Code == 1) {
this.dataList = res.Data.PageData;
this.pageCount = res.Data.PageCount;
}
});
},
//重新查询
resetSearch() {
this.msg.pageIndex = 1;
this.getList();
},
//分页改变
changePage(val) {
this.msg.pageIndex = val;
this.getList();
}
},
};
</script>
<style lang="sass">
@import url('~assets/css/table.sass')
</style>
<style>
</style>
<template>
<div>报名合同管理</div>
</template>
\ No newline at end of file
<div class="page-body">
<div class="page-search row items-center">
<div class="col row wrap q-mr-lg q-col-gutter-md">
<div class="col-3">
<q-input @change="resetSearch" clearable standout="bg-primary text-white" v-model="msg.OrderId" label="订单id"
@clear="resetSearch" maxlength="30" />
</div>
<div class="col-3">
<q-select @input="resetSearch" standout="bg-primary text-white" option-value="Id" option-label="Name"
v-model="msg.CType" :options="CTypeList" emit-value map-options label="类型" />
</div>
<div class="col-3">
<q-select @input="resetSearch" standout="bg-primary text-white" v-model="msg.Status" :options="StatusOpts"
option-value="Id" option-label="Name" label="状态" emit-value map-options />
</div>
<div class="col-3">
<q-input @change="resetSearch" clearable standout="bg-primary text-white" v-model="msg.ContractNo"
label="合同编号" @clear="resetSearch" maxlength="30" />
</div>
<div class="col-3">
<q-input @change="resetSearch" clearable standout="bg-primary text-white" v-model="msg.StudentName"
label="学生姓名" @clear="resetSearch" maxlength="30" />
</div>
<div class="col-3">
<q-select @input="resetSearch" standout="bg-primary text-white" option-value="Id" option-label="EmployeeName"
v-model="msg.QCreateBy" :options="EmployeeList" emit-value map-options label="业务员" use-input
@filter="filterFn2" clearable />
</div>
</div>
</div>
<div class="page-content">
<q-table :pagination="msg" :loading="loading" no-data-label="暂无相关数据" flat class="sticky-column-table"
separator="none" title="合同信息" :data="dataList" :columns="columns" row-key="name">
<template v-slot:top="props">
<div class="col-2 q-table__title">合同信息</div>
<q-space />
<div class="page-option"></div>
</template>
<template v-slot:body-cell-CreateByName="props">
<q-td :props="props">
<q-avatar rounded size="sm" v-if="props.row.CreateByPhoto">
<img :src="props.row.CreateByPhoto" />
</q-avatar>
<q-avatar rounded size="sm" color="teal-10" text-color="white" v-if="!props.row.CreateByPhoto">
{{ props.value.substring(0, 1) }}</q-avatar>
{{ props.row.CreateByName }}
</q-td>
</template>
<template v-slot:body-cell-StudentName="props">
<q-td auto-width :props="props">
<span v-if="props.row.Sign" style="color: #67c23a">【已签字】</span>
<span v-else style="color: #e95252">【未签字】</span>
{{ props.row.StudentName }}
</q-td>
</template>
<template v-slot:body-cell-Status="props">
<q-td auto-width :props="props">
<span v-if="props.row.Status == 0" style="color: #e6a23c">草稿</span>
<span v-if="props.row.Status == 1" style="color: #409eff">提交审核</span>
<span v-if="props.row.Status == 2" style="color: #67c23a">审合通过</span>
<span v-if="props.row.Status == 3" style="color: #f56c6c">驳回</span>
<span v-if="props.row.Status == 4" style="color: #e95252">取消</span>
</q-td>
</template>
<template v-slot:body-cell-IsCompanySeal="props">
<q-td auto-width :props="props">
<span v-if="props.row.IsCompanySeal == 0" style="color: #e95252">未盖章</span>
<span v-if="props.row.IsCompanySeal == 1" style="color: #67c23a">已盖章</span>
</q-td>
</template>
<template v-slot:bottom>
<q-pagination class="full-width justify-end" v-model="msg.pageIndex" color="primary" :max="pageCount"
:input="true" @input="changePage" />
</template>
<template v-slot:body-cell-optioned="props">
<q-td :props="props">
<q-btn flat size="xs" icon="iconfont icon-View" color="accent" @click="goContract(props.row)"
style="font-weight: 400" label="查看" />
</q-td>
</template>
</q-table>
</div>
</div>
</template>
<script>
import {
GetEducationContractPageCodeList,
GetMyEducationContractPageList,
SetEducationContractAudit,
GetDownLoadEducationContract,
SetEducationContractCopy,
} from "../../api/sale/contract";
import {
downloadLocalFile
} from "../../api/common/common";
import {
queryEmployee
} from '../../api/users/user';
export default {
meta: {
title: "合同查询",
},
components: {
},
data() {
return {
columns: [{
name: "ContractNo",
label: "合同编号",
align: "left",
field: "ContractNo",
},
{
name: "CTypeName",
label: "类型",
align: "left",
field: "CTypeName",
},
{
name: "StudentName",
label: "学生名称",
field: "StudentName",
align: "left",
},
{
name: "CourseName",
label: "课程名称",
align: "left",
field: "CourseName",
},
{
name: "CreateByName",
label: "创建人",
align: "left",
field: "CreateByName",
},
{
name: "CreateTime",
label: "创建时间",
align: "left",
field: "CreateTime",
},
{
name: "SchoolStatusStr",
label: "学管部审核状态",
align: "left",
field: "SchoolStatusStr",
},
{
name: "AdminStatusStr",
label: "行政审核状态",
align: "left",
field: "AdminStatusStr",
},
{
name: "IsCompanySeal",
label: "是否盖章",
align: "left",
field: "Status",
},
{
name: "optioned",
label: "操作",
field: "RoomId",
},
],
loading: true,
msg: {
pageIndex: 1,
pageSize: 12,
rowsPerPage: 12,
OrderId: "", //订单id
CType: 0, //1培训 2留学
Status: -1, //0草稿 1提交审核 2审核通过 3驳回 4取消
ContractNo: "", //合同编号
StudentName: "", //学生姓名
IsQueryAll: 1,
QCreateBy: "",
},
pageCount: 0,
dataList: [],
//类型下拉
CTypeList: [{
Id: 0,
Name: "不限",
},
{
Id: 1,
Name: "培训",
},
{
Id: 2,
Name: "留学",
},
],
//状态下拉
StatusOpts: [{
Id: -1,
Name: "不限",
},
{
Id: 0,
Name: "草稿",
},
{
Id: 1,
Name: "提交审核",
},
{
Id: 2,
Name: "审核通过(行政)",
},
{
Id: 5,
Name: "审核通过(学管)",
},
{
Id: 3,
Name: "驳回",
},
{
Id: 4,
Name: "取消",
},
],
EmployeeList: [], //业务员
AllemployeeList: [],
};
},
created() {
this.getEmployee()
},
mounted() {
if (this.$route.query && this.$route.query.Name) {
//从订单完成统计跳转过来的带的参数
this.msg.ContractNo = decodeURI(this.$route.query.Name);
}
this.getList();
},
methods: {
//业务员
getEmployee() {
var qMsg = {
Dept_Id: 0
}
queryEmployee(qMsg).then(res => {
if (res.Code == 1) {
this.EmployeeList = res.Data;
this.AllemployeeList = JSON.parse(JSON.stringify(this.EmployeeList));
}
}).catch(() => {
})
},
//筛选业务员
filterFn2(val, update) {
update(() => {
if (val === '') {
this.EmployeeList = JSON.parse(JSON.stringify(this.AllemployeeList))
} else {
const needle = val.toLowerCase()
this.EmployeeList = this.AllemployeeList.filter(v => v.EmployeeName.toLowerCase().indexOf(needle) > -1)
}
})
},
//获取校区列表
getList() {
this.loading = true;
GetMyEducationContractPageList(this.msg).then((res) => {
this.loading = false;
if (res.Code == 1) {
this.dataList = res.Data.PageData;
this.pageCount = res.Data.PageCount;
}
});
},
//重新查询
resetSearch() {
this.msg.pageIndex = 1;
this.getList();
},
//分页改变
changePage(val) {
this.msg.pageIndex = val;
this.getList();
},
//跳转至编辑
goContract(item) {
let routeUrl = this.$router.resolve({
path: "/contractView",
query: {
ContractId: item.Id,
},
});
window.open(routeUrl.href, "_blank");
},
},
};
</script>
<style lang="sass">
@import url('~assets/css/table.sass')
</style>
......@@ -28,18 +28,21 @@
justify-content: space-around;
align-items: center;
}
.signature .icoDicv{
width:40px;
height:40px;
.signature .icoDicv {
width: 40px;
height: 40px;
background: gray;
border-radius: 50%;
color:#fff;
color: #fff;
text-align: center;
line-height: 40px;
}
.signature .icoDicv i{
font-size:25px;
.signature .icoDicv i {
font-size: 25px;
}
</style>
<template>
<div class="signature" @touchmove.prevent>
......@@ -70,7 +73,8 @@
</template>
<script>
import {
SetEducationContractSign
SetEducationContractSign,
SetBackClassProtocolSign
} from '../api/sale/contract'
export default {
data() {
......@@ -83,11 +87,15 @@
y: 0,
},
moving: false, // 是否正在绘制中且移动
msg:{
msg: {
ContractId: 0,
Sign:''
Sign: ''
},
Money:0
Money: 0,
Type: 1, //1为电子合同签字 2为退课协议签字
BackMsg: {
Id: 0
}
};
},
mounted() {
......@@ -100,10 +108,15 @@
if (this.$route.query.ContractId) {
this.msg.ContractId = this.$route.query.ContractId;
}
if (this.$route.query.Money){
if (this.$route.query.Money) {
this.Money = this.$route.query.Money;
}
if (this.$route.query.Id) {
this.BackMsg.Id = this.$route.query.Id;
}
if (this.$route.query.Type) {
this.Type = this.$route.query.Type;
}
},
methods: {
// 触摸(开始)
......@@ -214,24 +227,45 @@
},
//提交数据
SaveMsg() {
SetEducationContractSign(this.msg).then(res => {
if (res.Code == 1) {
this.$q.notify({
icon: 'iconfont icon-chenggong',
color: 'accent',
timeout: 2000,
message: '保存成功!',
position: 'top'
})
this.$router.push({
path: '/contractPay',
query: {
contractId: this.msg.ContractId,
Money: this.Money
}
});
}
})
if (this.Type == 1) {
SetEducationContractSign(this.msg).then(res => {
if (res.Code == 1) {
this.$q.notify({
icon: 'iconfont icon-chenggong',
color: 'accent',
timeout: 2000,
message: '保存成功!',
position: 'top'
})
this.$router.push({
path: '/contractPay',
query: {
contractId: this.msg.ContractId,
Money: this.Money
}
});
}
})
}
if(this.Type == 2){
SetBackClassProtocolSign(this.BackMsg).then(res => {
if (res.Code == 1) {
this.$q.notify({
icon: 'iconfont icon-chenggong',
color: 'accent',
timeout: 2000,
message: '保存成功!',
position: 'top'
})
this.$router.push({
path: '/courseRefundH5',
query: {
Id: this.BackMsg.Id,
}
});
}
})
}
},
//base64转Blob
......@@ -258,12 +292,21 @@
},
//返回上一级
goback() {
this.$router.push({
path: '/contractConfirm',
query: {
ContractId: this.msg.ContractId
}
});
if(this.Type==1){
this.$router.push({
path: '/contractConfirm',
query: {
ContractId: this.msg.ContractId
}
});
}else{
this.$router.push({
path: '/courseRefundH5',
query: {
Id: this.BackMsg.Id
}
});
}
},
},
};
......
......@@ -36,7 +36,7 @@
label="状态"
/>
</div>
<!-- <div class="col-3">
<div class="col-3">
<q-select
@input="resetSearch"
standout="bg-primary text-white"
......@@ -48,7 +48,7 @@
map-options
label="上架渠道"
/>
</div> -->
</div>
</div>
</div>
<div class="page-content">
......@@ -381,12 +381,12 @@ export default {
align: "left",
format: (val, row) => `${val}课时`,
},
// {
// name: "plat",
// label: "上架渠道",
// field: "plat",
// align: "left",
// },
{
name: "plat",
label: "上架渠道",
field: "plat",
align: "left",
},
{
name: "CreateByName",
label: "创建人",
......
......@@ -29,19 +29,22 @@
.TuiContract {
position: absolute;
bottom: 28px;
right: 130px;
right: 70px;
}
.Tui_Jiafang{
display:flex;
font-size:20px;
margin-bottom:20px;
.Tui_Jiafang {
display: flex;
font-size: 20px;
margin-bottom: 20px;
}
.Tui_Inner{
.Tui_Inner {
text-indent: 40px;
font-size:20px;
font-size: 20px;
line-height: 35px;
margin-bottom:10px;
margin-bottom: 10px;
}
.TuitractInput {
border: 0;
display: inline-block;
......@@ -51,82 +54,145 @@
text-align: center;
text-indent: 0;
}
.Tui_SignZhang{
.Tui_SignZhang {
display: flex;
font-size:20px;
font-size: 20px;
justify-content: space-between;
margin-bottom:20px;
margin-bottom: 20px;
}
</style>
<template>
<div class="TuitractView">
<div class="firstPage">
<div class="operationTitle">
<div class="operationAgree">培训课程退款协议</div>
<div class="TuiContract">合约编号:123</div>
<div class="TuiContract">合约编号:{{dataList.ProtocolNum}}</div>
</div>
<div class="Tui_Jiafang">
<div style="margin-right:100px;">甲方:</div>
<div>(家长/监护人):</div>
<div style="margin-right:100px;">甲方:{{dataList.PartyAName}}</div>
<div>(家长/监护人):{{dataList.PartyAGuardian}}</div>
</div>
<div class="Tui_Jiafang">
<div style="margin-right:150px;">乙方:</div>
<div>法定代表人:</div>
<div style="margin-right:150px;">乙方:{{dataList.PartyBName}}</div>
<div>法定代表人:{{dataList.PartyBLegal}}</div>
</div>
<div class="Tui_Inner">
甲乙双方经平等友好协商就 <div class="TuitractInput" style="width: 90px;">1988</div>
<div class="TuitractInput" style="width: 80px;">12</div><div class="TuitractInput" style="width: 80px;">12</div>
甲乙双方经平等友好协商就 <div class="TuitractInput" style="width: 90px;">{{getData(dataList.CreateTimeStr,1)}}</div>
<div class="TuitractInput" style="width: 80px;">{{getData(dataList.CreateTimeStr,2)}}</div>
<div class="TuitractInput" style="width: 80px;">{{getData(dataList.CreateTimeStr,3)}}</div>
签订的《培训课程协议》解除合作关系。
</div>
<div class="Tui_Inner">第一条:原协议内容</div>
<div class="Tui_Inner">
原协议报名人员:<div class="TuitractInput" style="width: 300px;">1988</div>
原协议报名人员:<div class="TuitractInput" style="width: 300px;">{{dataList.OldSaleMan}}</div>
</div>
<div class="Tui_Inner">
原报名项目:<div class="TuitractInput" style="width: 300px;">1988</div>
原报名项目:<div class="TuitractInput" style="width: 300px;">{{dataList.CNMoneyStr}}</div>
</div>
<div class="Tui_Inner">
原报名项目原价:<div class="TuitractInput" style="width: 100px;">1988</div>
折后(优惠)价:<div class="TuitractInput" style="width: 100px;">1988</div>
原报名项目原价:<div class="TuitractInput" style="width: 100px;">{{dataList.OldSellPrice}}</div>
折后(优惠)价:<div class="TuitractInput" style="width: 100px;">{{dataList.OldDiscountMoney}}</div>
</div>
<div class="Tui_Inner">
原协议已收学费:<div class="TuitractInput" style="width: 300px;text-align:left;">
大写:
大写:{{dataList.OldIncomeStr}}
</div>
(¥<div class="TuitractInput" style="width: 100px;">12</div>元整)。
(¥<div class="TuitractInput" style="width: 100px;">{{dataList.OldIncome}}</div>元整)。
</div>
<div class="Tui_Inner">
原收据编号:<div class="TuitractInput" style="width: 150px;"></div>
原收据编号:<div class="TuitractInput" style="width: 150px;">{{dataList.OldFinaceNum}}</div>
</div>
<div class="Tui_Inner">
原收款人:<div class="TuitractInput" style="width: 150px;"></div>
原收款人:<div class="TuitractInput" style="width: 150px;">{{dataList.OldReceiveMan}}</div>
</div>
<div class="Tui_Inner">
第二条:乙方共计课时<div class="TuitractInput" style="width: 80px;"></div>节;已销课时
<div class="TuitractInput" style="width: 80px;"></div>节:剩余课时
<div class="TuitractInput" style="width: 80px;"></div>
第二条:乙方共计课时<div class="TuitractInput" style="width: 80px;">{{dataList.TotalClassHours}}</div>节;已销课时
<div class="TuitractInput" style="width: 80px;">{{dataList.CompleteHours}}</div>节:剩余课时
<div class="TuitractInput" style="width: 80px;">{{dataList.SurplusHours}}</div>
</div>
<div class="Tui_Inner">
甲方应退还乙方未上课时费用<div class="TuitractInput" style="width: 200px;">五千六百八十元整</div>
(¥<div class="TuitractInput" style="width: 80px;"></div>元整),原协
议自动终止、收据自动失效。退还帐户名<div class="TuitractInput" style="width: 200px;"></div>,退还帐号:<div class="TuitractInput" style="width: 300px;"></div>
甲方应退还乙方未上课时费用<div class="TuitractInput" style="width: 200px;">{{dataList.CNMoneyStr}}</div>
(¥<div class="TuitractInput" style="width: 150px;">{{dataList.BackMoney}}</div>),原协
议自动终止、收据自动失效。退还帐户名<div class="TuitractInput" style="width: 200px;">{{dataList.BackAccountName}}</div>,退还帐号:<div class="TuitractInput"
style="width: 200px;">{{dataList.BackAccount}}</div>
退还学费=乙方已缴总学费-已上课程学费-(乙方已缴学费-已上课程学费)*10%,其中“(乙方已缴课程学费)*10%”为违约金。
</div>
<div class="Tui_Inner">
第三条:乙方应将原协议和收据原件交还甲方,若原件无法交还,请乙方<br/>在此声明:
<div class="TuitractInput" style="width: 300px;"></div>
第三条:乙方应将原协议和收据原件交还甲方,若原件无法交还,请乙方<br />在此声明:
<div class="TuitractInput" style="width: 750px;text-align:left;">{{dataList.StateMent}}</div>
</div>
<div class="Tui_Inner">
第四条:本协议自签订之日起正式生效。
</div>
<div class="Tui_SignZhang">
<div>甲方(家长/监护人)签字(盖章): </div>
<div>甲方(家长/监护人)签字(盖章): </div>
<div>甲方(家长/监护人)签字(盖章): {{dataList.PartyASign}}</div>
<div>乙方签字(盖章):{{dataList.PartyBSign}}</div>
</div>
<div class="Tui_SignZhang">
<div>签署日期:</div>
<div>签署日期:</div>
<div>签署日期:{{dataList.PartyASignDate}}</div>
<div>签署日期:{{dataList.PartyBSignDate}}</div>
</div>
</div>
</div>
</template>
<script>
import {
GetBackClassProtocol
} from "../api/sale/contract";
export default {
meta: {
title: "退课协议管理",
},
data() {
return {
msg: {
Id: 0
},
dataList: {},
};
},
created() {
},
mounted() {
if(this.$route.query.Id){
this.msg.Id = this.$route.query.Id;
}
this.getList();
},
methods: {
//获取校区列表
getList() {
this.loading = true;
GetBackClassProtocol(this.msg).then((res) => {
this.loading = false;
if (res.Code == 1) {
this.dataList = res.Data;
}
});
},
//获取日期
getData(dateStr,type){
if(dateStr){
let timeOne = dateStr.split(' ')[0];
let Year = timeOne.split('-')[0];
let Month = timeOne.split('-')[1];
let day = timeOne.split('-')[2];
if(type==1){
return Year
}
if(type==2){
return Month
}
if(type==3){
return day
}
}
}
},
};
</script>
This diff is collapsed.
This diff is collapsed.
<template>
<div class="welcomeList page-body">
<!-- <div class="page-search row items-center">
<div class="col row wrap q-mr-lg q-col-gutter-md">
</div>
</div> -->
<div class="page-content">
<q-table :pagination="msg" :loading="loading" no-data-label="暂无相关数据" flat class="sticky-column-table"
separator="none" title="" :data="data" :columns="columns" row-key="name">
<template v-slot:top="props">
<div class="col-2 q-table__title">欢迎语列表</div>
<q-space />
<q-btn color="accent" style="float:right;margin-right:0;" size="sm" class="q-mr-md" icon="add"
label="新增欢迎语" @click="goadd()"></q-btn>
</template>
<template v-slot:body-cell-Type="props">
<q-td :props="props">
<span v-if="props.row.Type==1">图文</span>
<span v-if="props.row.Type==2">图片</span>
</q-td>
</template>
<template v-slot:body-cell-Content="props">
<q-td :props="props">
<div style="max-width: 800px;white-space: normal;">
{{props.row.Content}}
</div>
</q-td>
</template>
<template v-slot:body-cell-optioned="props">
<q-td :props="props">
<q-btn flat size="xs" icon="edit" style="font-weight:400;color: #3FC4FF" class="q-mr-xs"
label="编辑" @click="goDetailed(props.row,'0')" />
<q-btn flat size="xs" icon="delete" style="font-weight:400;color: #3FC4FF" class="q-mr-xs"
label="删除" @click="goDetailed(props.row,'0')" />
</q-td>
</template>
<template v-slot:bottom>
<q-pagination class="full-width justify-end" v-model="msg.pageIndex" color="primary" :max="pageCount"
:input="true" @input="changePage" />
</template>
</q-table>
</div>
</div>
</template>
<script>
export default {
meta: {
title: "欢迎语列表"
},
name: "welcomeList",
data() {
return {
loading: false,
ISsystem: false,
data: [{Type:1,Content:'文本:您好,##客户名称##!亲~你終於來啦!!我是你的专属顾问,任何有关日语学习问题都可以问我哦!!~~~~~~~~~~ 加入甲鹤大家庭~优惠天天有 第一条~9.9块日语体验课!! 第二条~每周活动免费参加! 第三条~猛戳我,”赞羊”电商优惠券免费送!! 第四条~再戳我,”旅游优惠券”我再送! ~~~~~从现在起”甲鹤日语”就是你学习日语的好帮手!! 现在回复”甲鹤”两个字~看看甲鹤想给你看甚么?~呵呵呵!',applymember:'通用',UpdateTime:'2021-08-04 15:48'}],
pageCount: 0,
msg: {
pageIndex: 1,
pageSize: 10,
rowsPerPage: 10,
Month: '',
TeacherId: 0,
State: 0,
},
//公告column
columns: [{
name: 'Type',
label: '欢迎语类型',
align: 'left'
},
{
name: 'Content',
field: 'Content',
label: '欢迎语内容',
align: 'left',
},
{
name: 'applymember',
field: 'applymember',
label: '使用成员',
align: 'left'
},
{
name: 'UpdateTime',
field: 'UpdateTime',
label: '创建时间',
align: 'left'
},
{
name: 'optioned',
label: '操作',
field: 'DeptId'
}
],
}
},
created() {
},
methods: {
changePage(e){
},
goadd(){
this.$router.push({
path:'/enterprise/addWelcome',
});
}
}
}
</script>
<style>
.welcomeList .Sysuser_Date .el-input--prefix .el-input__inner {
background-color: red;
border: 0;
}
.welcomeList .state-item {
padding: 2px 5px;
border-radius: 3px;
text-align: center;
font-size: 10px;
}
.welcomeList .frIdlist {
padding: 3px 10px;
border-radius: 3px;
background: #EEEEEF;
align-items: center;
justify-content: center;
margin-right: 5px;
margin-bottom: 5px;
cursor: pointer;
}
.class-popover .q-pr-lg {
padding-right: 0;
margin-top: 20px;
}
.welcomeList .el-date-editor.el-input {
width: 100%;
}
.welcomeList .el-date-editor.el-input input {
background-color: transparent !important;
}
.welcomeList .el-range-editor .el-range-input {
background: none;
}
.Sysuser_Date .el-input__inner {
background: transparent !important;
border: 0 !important;
}
.welcomeList .el-drawer.rtl{
overflow: inherit;
}
</style>
\ No newline at end of file
<style>
</style>
<template>
<div class="page-body">
<div class="page-search row items-center">
<div class="col row wrap q-mr-lg q-col-gutter-md">
<div class="col-3">
<q-input @change="resetSearch" clearable standout="bg-primary text-white" v-model="msg.QOrderId" label="订单编号"
@clear="resetSearch" maxlength="30" />
</div>
<div class="col-3">
<q-select @input="resetSearch" standout="bg-primary text-white" v-model="msg.AuditStatus"
:options="StatusOpts" option-value="Id" option-label="Name" label="状态" emit-value map-options />
</div>
<div class="col-3">
<q-input @change="resetSearch" clearable standout="bg-primary text-white" v-model="msg.ProtocolNum"
label="合同编号" @clear="resetSearch" maxlength="30" />
</div>
<div class="col-3">
<q-input @change="resetSearch" clearable standout="bg-primary text-white" v-model="msg.PartyAName"
label="学生姓名" @clear="resetSearch" maxlength="30" />
</div>
</div>
</div>
<courserefund-form :loading="loading" :dataList="dataList" :authObj="authObj" @success="refreshClassProtocol">
</courserefund-form>
<q-pagination class="full-width justify-end" v-model="msg.pageIndex" color="primary" :max="pageCount" :input="true"
@input="changePage" />
</div>
</template>
<script>
import {
GetBackClassProtocolPage
} from "../../api/sale/contract";
import courserefundForm from "../../components/course/courserefund-form"
export default {
meta: {
title: "退课协议管理",
},
components: {
courserefundForm
},
data() {
return {
loading: true,
msg: {
pageIndex: 1,
pageSize: 12,
PartyAName: '',
AuditStatus: -1,
QOrderId: '',
ProtocolNum: '',
IsQueryAll: 0
},
pageCount: 0,
dataList: [],
//状态下拉
StatusOpts: [{
Id: -1,
Name: "不限",
},
{
Id: 1,
Name: "审核中",
},
{
Id: 2,
Name: "审核通过",
},
{
Id: 3,
Name: "驳回",
},
{
Id: 4,
Name: "待签字",
},
{
Id: 5,
Name: "待确认",
},
{
Id: 6,
Name: "生效",
},
],
authObj: {
isShowCopyLink: true, //显示复制链接
isShowSure: true, //显示确认退课协议按钮
}
};
},
created() {
},
mounted() {
this.getList();
},
methods: {
//刷新页面
refreshClassProtocol() {
this.getList();
},
//获取校区列表
getList() {
this.loading = true;
GetBackClassProtocolPage(this.msg).then((res) => {
this.loading = false;
if (res.Code == 1) {
this.dataList = res.Data.PageData;
this.pageCount = res.Data.PageCount;
}
});
},
//重新查询
resetSearch() {
this.msg.pageIndex = 1;
this.getList();
},
//分页改变
changePage(val) {
this.msg.pageIndex = val;
this.getList();
},
},
};
</script>
<style lang="sass">
@import url('~assets/css/table.sass')
</style>
<style>
.weChatConfig .Period-rules {
display: flex;
margin-bottom: 24px;
padding-left: 20px;
}
.weChatConfig .Period_Spreate {
flex: 1;
min-width: 200px;
margin-right: 32px;
}
.weChatConfig .Period-rule-title {
color: #646a73;
margin-bottom: 4px;
display: flex;
align-items: center;
}
.weChatConfig .Period-info-icon {
margin-left: 8px;
color: #8f959e;
line-height: 1;
vertical-align: top;
}
.process_Btn_List {
display: flex;
justify-content: flex-end;
padding: 20px;
}
.processBtn_Cancel {
width: 90px;
height: 35px;
border: 1px solid #A1AAB2;
color: #000000;
background-color: #fff;
text-align: center;
line-height: 35px;
border-radius: 5px;
cursor: pointer;
margin-right: 20px;
}
.processBtn_Save {
width: 90px;
height: 35px;
background-color: #2961FE;
color: #FFF;
text-align: center;
line-height: 35px;
border-radius: 5px;
cursor: pointer;
}
.baseSetForm_Dialog {
margin: 20px;
}
.cycle_Title {
font-size: 20px;
font-weight: 500;
color: #1f2329;
}
.Period-alert {
padding: 9px 16px;
border-radius: 4px;
background-color: #f0f4ff;
line-height: 22px;
color: #1f2329;
display: flex;
align-items: center;
margin-top: 20px;
margin-bottom: 12px;
font-size: 13px;
}
.Okr_Length {
font-weight: 500;
color: #1f2329;
}
.FormItem-asterisk {
position: relative;
top: 3px;
margin-left: 3px;
color: #f54a45;
line-height: 1;
}
.baseSetForm_Dialog .el-radio {
display: block;
margin-bottom: 15px;
}
</style>
<template>
<div class="page-body">
<div class="weChatConfig">
<div style="text-align:right;">
<q-btn color="accent" size="sm" class="q-mr-md" @click="geteject" label="修改基础配置" />
</div>
<div class="Period-rules">
<div class="Period_Spreate">
<div class="Period-rule-title">企业名称</div>
<div>{{baseObj.Name}}</div>
</div>
<div class="Period_Spreate">
<div class="Period-rule-title">
企业ID
</div>
<div>{{baseObj.WX_CorpId}}</div>
</div>
</div>
<div class="Period-rules">
<div class="Period_Spreate">
<div class="Period-rule-title">通讯录管理secret</div>
<div>{{baseObj.Employee_Secret}}</div>
</div>
<div class="Period_Spreate">
<div class="Period-rule-title">
外部联系人管理secret
</div>
<div>
{{baseObj.Contact_Secret}}
</div>
</div>
</div>
<div class="Period-rules">
<div class="Period_Spreate">
<div class="Period-rule-title">
开启状态
</div>
<div>
{{baseObj.Enable==1?'已开启':'未开启'}}
</div>
</div>
</div>
</div>
<q-dialog v-model="isShowBaseSet" maximized full-height seamless position="right" @hide="closeProcess">
<q-card style="margin-top:61px;width:500px" class="no-border-radius classinfo_Dialog">
<div class="baseSetForm_Dialog">
<div class="cycle_Title">微信配置</div>
<div style="margin-top: 10px;">
<q-input filled stack-label :dense="false" v-model="addMsg.Name" ref="Name"
class="col-12 q-pb-lg" label="企业名称" :rules="[val => !!val || '请填写企业名称']" />
</div>
<div>
<q-input filled stack-label :dense="false" v-model="addMsg.WX_CorpId" ref="WX_CorpId"
class="col-12 q-pb-lg" label="企业微信ID" :rules="[val => !!val || '请填写企业微信ID']" />
</div>
<div>
<q-input filled stack-label :dense="false" v-model="addMsg.Employee_Secret" ref="Employee_Secret"
class="col-12 q-pb-lg" label="企业通讯录secret" :rules="[val => !!val || '请填写企业通讯录secret']" />
</div>
<div>
<q-input filled stack-label :dense="false" v-model="addMsg.Contact_Secret" ref="Contact_Secret"
class="col-12 q-pb-lg" label="企业外部联系人secret" :rules="[val => !!val || '请填写企业外部联系人secret']" />
</div>
<div class="Okr_Length" style="margin:20px 0;display: flex;align-items: center;">
<div style="color:#1f2329;margin-right: 10px;">开启状态</div>
<el-switch v-model="addMsg.Enable" :active-value="1" :inactive-value="2"></el-switch>
</div>
</div>
<div class="process_Btn_List">
<div class="processBtn_Cancel" @click="closeProcess">关闭</div>
<div class="processBtn_Save" @click="setBaseInfo">确定</div>
</div>
</q-card>
<div class="dialog-out-close" @click="closeProcess"
style="height:40px !important;border-top-left-radius: 4px !important;border-bottom-left-radius: 4px !important;">
<q-icon name="iconfont icon-jujue1" size="26px" />
</div>
</q-dialog>
</div>
</template>
<script>
import {
getWeChatConfigInfo,
setWeChatConfig
} from '../../api/system/wechat';
export default {
meta: {
title: "企业微信设置"
},
components: {
},
data() {
return {
isShowBaseSet: false,
baseObj: {},
addMsg:{},
}
},
mounted() {
this.getList();
},
methods: {
//获取okr配置信息
getList() {
getWeChatConfigInfo({}).then(res => {
if (res.Code == 1) {
this.baseObj = res.Data;
}
})
},
//关闭流程设置
closeProcess() {
this.isShowBaseSet = false;
},
geteject(){
this.addMsg = JSON.parse(JSON.stringify(this.baseObj))
this.isShowBaseSet = true;
},
setBaseInfo(){
this.$refs.Name.validate();
this.$refs.WX_CorpId.validate();
this.$refs.Employee_Secret.validate();
this.$refs.Contact_Secret.validate();
if(!this.$refs.Name.hasError && !this.$refs.WX_CorpId.hasError && !this.$refs.Employee_Secret.hasError && !this.$refs.Contact_Secret.hasError){
let msg={
Id: this.addMsg.Id,
Name: this.addMsg.Name,
WX_CorpId: this.addMsg.WX_CorpId,
Employee_Secret: this.addMsg.Employee_Secret,
Contact_Secret: this.addMsg.Contact_Secret,
Enable: this.addMsg.Enable,
}
setWeChatConfig(msg).then(res => {
if (res.Code == 1) {
this.$q.notify({
icon: 'iconfont icon-chenggong',
color: 'accent',
timeout: 2000,
message: '数据保存成功!',
position: 'top'
})
this.getList()
this.isShowBaseSet = false;
}
})
}
}
}
}
</script>
\ No newline at end of file
......@@ -15,8 +15,9 @@
line-height: 16px;
border-radius: 4px;
}
.bill_Rearsons{
width:250px;
.bill_Rearsons {
width: 250px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis
......
......@@ -113,6 +113,12 @@ const routes = [{
component: () =>
import("pages/system/okrmanage.vue")
},
{
path: "/system/weChatConfig", //企业微信设置
component: () =>
import("pages/system/weChatConfig.vue")
},
{
path: "/system/webkitManage", //网站管理
component: () =>
......@@ -739,6 +745,11 @@ const routes = [{
component: () =>
import("pages/sale/contractManage.vue")
},
{
path: "/sale/contractRefund", //销售 退课管理
component: () =>
import("pages/sale/contractRefund.vue")
},
{
path: "/sale/contractEdit", //销售 新增-编辑-查看合同
component: () =>
......@@ -1118,7 +1129,17 @@ const routes = [{
path: "/stuMan/unfinishedStudent", //学管 未完成学员名单
component: () =>
import("pages/stuMan/unfinishedStudent")
}
},
{
path: "/enterprise/welcomeList", //企微 欢迎语列表
component: () =>
import("pages/enterprise/welcomeList")
},
{
path: "/enterprise/addWelcome", //企微 欢迎语修改新增
component: () =>
import("pages/enterprise/addWelcome")
},
],
},
......@@ -1155,6 +1176,11 @@ const routes = [{
component: () =>
import("pages/courseRefund.vue")
},
{
path: "/courseRefundH5",
component: () =>
import("pages/courseRefundH5.vue")
},
{
path: "/financial/financalDocument/PrintPage", //财务单据打印
component: () =>
......
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