|
@@ -8,7 +8,6 @@
|
|
|
<div class="m-core"
|
|
|
style="overflow: hidden">
|
|
|
<el-form :model="form"
|
|
|
- :rules="rules"
|
|
|
ref="accountForm"
|
|
|
size="small"
|
|
|
:inline="true"
|
|
@@ -20,27 +19,18 @@
|
|
|
:closable="false"
|
|
|
style="margin-bottom: 20px"
|
|
|
></el-alert>
|
|
|
- <el-row>
|
|
|
- <el-col :span="5">
|
|
|
- <el-form-item label="服务名称"
|
|
|
- prop="name">
|
|
|
- <el-input v-model="form.name"
|
|
|
- placeholder="请输入服务名称"></el-input>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="5">
|
|
|
- <el-form-item label="产品服务"
|
|
|
- prop="bankCode">
|
|
|
- <el-select v-model="form.bankCode"
|
|
|
- placeholder="请选择产品服务">
|
|
|
- <el-option v-for="(item, index) in backList"
|
|
|
- :key="index"
|
|
|
- :label="item.title"
|
|
|
- :value="item.value"></el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
+ <el-form-item label="服务名称" prop="name" :rules="[{ required: true, message: '请输入服务名称', trigger: 'blur' }]">
|
|
|
+ <el-input v-model="form.name" placeholder="请输入服务名称"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="产品服务" prop="productId" :rules="[{ required: true, message: '请选择产品服务', trigger: 'change' }]">
|
|
|
+ <el-select v-model="form.productId"
|
|
|
+ placeholder="请选择产品服务">
|
|
|
+ <el-option v-for="(item, index) in productList"
|
|
|
+ :key="index"
|
|
|
+ :label="item.name"
|
|
|
+ :value="item.id"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
|
|
|
<el-alert
|
|
|
title="服务属性"
|
|
@@ -49,39 +39,48 @@
|
|
|
style="margin-bottom: 20px"
|
|
|
></el-alert>
|
|
|
|
|
|
- <div class="serviceAttr">
|
|
|
- <el-row>
|
|
|
- <el-col :span="5">
|
|
|
- <el-form-item label="付费模式"
|
|
|
- prop="legalPerson">
|
|
|
- <el-input v-model="form.legalPerson" placeholder="请输入付费模式"></el-input>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="19">
|
|
|
+ <div class="serviceAttr" v-for="(attrList, index) in form.attrList" :key="index">
|
|
|
+ <div class="serviceBlock">
|
|
|
+ <el-form-item label="付费模式"
|
|
|
+ :prop="'attrList.' + index + '.mode'"
|
|
|
+ :rules="[{ required: true, message: '请选择付费模式', trigger: 'change' }]">
|
|
|
+ <el-select v-model="attrList.mode" placeholder="请选择付费模式">
|
|
|
+ <el-option label="月" value="MONTH"></el-option>
|
|
|
+ <el-option label="年" value="YEAR"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ <div class="serviceBlock">
|
|
|
+ <div v-for="(attrItem, i) in attrList.attr" :key="i">
|
|
|
<el-form-item label="学员上限"
|
|
|
- prop="legalMp">
|
|
|
- <el-input v-model="form.legalMp" placeholder="请输入学员上限">
|
|
|
+ :prop="'attrList.' + index + '.attr.' + i + '.studentUpLimit'"
|
|
|
+ :rules="[{ required: true, message: '请输入学员上限', trigger: 'blur' },
|
|
|
+ {type: 'number', message: '学员上限必须为数字值' }]">
|
|
|
+ <el-input v-model.number="attrItem.studentUpLimit" placeholder="请输入学员上限">
|
|
|
<span slot="append">人</span>
|
|
|
</el-input>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="服务原价"
|
|
|
- prop="legalCertId">
|
|
|
- <el-input v-model="form.legalCertId" placeholder="请输入服务原价">
|
|
|
+ :prop="'attrList.' + index + '.attr.' + i + '.originalPrice'"
|
|
|
+ :rules="[{ required: true, message: '请输入服务原价', trigger: 'blur' },
|
|
|
+ {type: 'number', message: '服务原价必须为数字值' }]">
|
|
|
+ <el-input v-model.number="attrItem.originalPrice" placeholder="请输入服务原价">
|
|
|
<span slot="append">元</span>
|
|
|
</el-input>
|
|
|
</el-form-item>
|
|
|
- <el-button icon="el-icon-plus" size="small" circle></el-button>
|
|
|
- <el-button icon="el-icon-minus" size="small" circle type="danger"></el-button>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-row>
|
|
|
- <el-col :span="13" :offset="5" style="padding-left: 120px">
|
|
|
- <el-form-item class="add">
|
|
|
- <el-button icon="el-icon-plus" style="width: 200px">添加模式</el-button>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
+ <el-button icon="el-icon-minus" size="small" circle type="danger" @click="onRemoveItem(attrList.attr, i)" :disabled="attrList.attr.length <= 1"></el-button>
|
|
|
+ </div>
|
|
|
+ <el-form-item class="add" style="padding-left: 120px; display: block;">
|
|
|
+ <el-button icon="el-icon-plus" style="width: 200px" @click="onAddItem('child', attrList.attr)">添加模式</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ <div class="list-remove">
|
|
|
+ <el-button type="text" size="small" icon="el-icon-delete" @click="onRemoveItem(form.attrList, index)" :disabled="form.attrList.length <= 1">删除</el-button>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
+ <el-form-item class="add" style="margin-top: 18px">
|
|
|
+ <el-button icon="el-icon-plus" style="width: 200px" :disabled="form.attrList.length >= 2" @click="onAddItem('parent')">添加模式</el-button>
|
|
|
+ </el-form-item>
|
|
|
</el-form>
|
|
|
<el-button type="primary" size="small" @click="onSubmit('accountForm')">确 定</el-button>
|
|
|
<el-button @click="onCancel" size="small">取 消</el-button>
|
|
@@ -90,62 +89,26 @@
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
-// import { cityJson } from "./cityJson";
|
|
|
-// import { bankJson } from "./bankJson";
|
|
|
-import { getToken } from "@/utils/auth";
|
|
|
-import load from '@/utils/loading'
|
|
|
-// import { createMember, updateMember } from './api.js'
|
|
|
-import { isvalidPhone } from '@/utils/validate'
|
|
|
-let validPhone = (rule, value, callback) => {
|
|
|
- if (!value) {
|
|
|
- callback(new Error('请输入公司法人手机号'))
|
|
|
- } else if (!isvalidPhone(value)) {
|
|
|
- callback(new Error('请输入正确的11位手机号码'))
|
|
|
- } else {
|
|
|
- callback()
|
|
|
- }
|
|
|
-}
|
|
|
+import { platformProductQueryPage } from '../productManger/api'
|
|
|
+import { platformServeAdd, platformServeUpdate, platformServeQueryInfo } from './api'
|
|
|
export default {
|
|
|
- name: 'ADaPayAccount',
|
|
|
+ name: 'serviceManger',
|
|
|
data () {
|
|
|
const query = this.$route.query
|
|
|
return {
|
|
|
payType: query.type,
|
|
|
+ productList: [],
|
|
|
form: {
|
|
|
- memberId: null,
|
|
|
+ attrList: [{
|
|
|
+ mode: null,
|
|
|
+ attr: [{
|
|
|
+ originalPrice: null,
|
|
|
+ studentUpLimit: null,
|
|
|
+ }]
|
|
|
+ }],
|
|
|
name: null,
|
|
|
- legalPerson: null,
|
|
|
- legalMp: null,
|
|
|
- legalCertId: null,
|
|
|
- legalCertIdExpires: null,
|
|
|
- cardNo: null,
|
|
|
- bankCode: null,
|
|
|
- provCode: null,
|
|
|
- areaCode: null,
|
|
|
- socialCreditCode: null,
|
|
|
- socialCreditCodeExpires: null,
|
|
|
- businessScope: null,
|
|
|
- address: null,
|
|
|
- multipartFile: null,
|
|
|
- zipCode: null
|
|
|
- },
|
|
|
- rules: {
|
|
|
- memberId: [{ required: true, message: '请输入商户号', trigger: 'blur' }],
|
|
|
- name: [{ required: true, message: '请输入公司名称', trigger: 'blur' }],
|
|
|
- legalPerson: [{ required: true, message: '请输入公司法人', trigger: 'blur' }],
|
|
|
- legalMp: [{ type: 'number', required: true, validator: validPhone, trigger: 'blur' }],
|
|
|
- legalCertId: [{ required: true, message: '请输入法人身份证号', trigger: 'blur' }],
|
|
|
- legalCertIdExpires: [{ required: true, message: '请选择身份证有效期', trigger: 'change' }],
|
|
|
- cardNo: [{ required: true, message: '请输入银行卡号', trigger: 'blur' }],
|
|
|
- bankCode: [{ required: true, message: '请选择所属银行', trigger: 'change' }],
|
|
|
- provCode: [{ required: true, message: '请选择省份', trigger: 'change' }],
|
|
|
- areaCode: [{ required: true, message: '请选择城市', trigger: 'change' }],
|
|
|
- socialCreditCode: [{ required: true, message: '请输入统一社会信用码', trigger: 'blur' }],
|
|
|
- socialCreditCodeExpires: [{ required: true, message: '请选择统一社会信用码有效期', trigger: 'change' }],
|
|
|
- businessScope: [{ required: true, message: '请输入经营范围', trigger: 'blur' }],
|
|
|
- address: [{ required: true, message: '请输入公司地址', trigger: 'blur' }],
|
|
|
- multipartFile: [{ required: true, message: '请上传证照文件', trigger: 'change' }],
|
|
|
- zipCode: [{ required: true, message: '请输入邮编', trigger: 'blur' }]
|
|
|
+ productId: null,
|
|
|
+ id: query.id || null
|
|
|
}
|
|
|
};
|
|
|
},
|
|
@@ -153,66 +116,71 @@ export default {
|
|
|
this.__init()
|
|
|
},
|
|
|
methods: {
|
|
|
- __init () {
|
|
|
- const query = this.$route.query
|
|
|
- this.payType = query.type
|
|
|
- this.row = query.row ? JSON.parse(query.row) : {}
|
|
|
- this.files = null
|
|
|
- this.fileList = []
|
|
|
- this.form.multipartFile = null
|
|
|
- if (this.payType == 'update') {
|
|
|
- const row = this.row
|
|
|
- this.id = row.id
|
|
|
- this.form = {
|
|
|
- memberId: row.memberId,
|
|
|
- name: row.name,
|
|
|
- legalPerson: row.legalPerson,
|
|
|
- legalMp: row.legalMp,
|
|
|
- legalCertId: row.legalCertId,
|
|
|
- legalCertIdExpires: row.legalCertIdExpires,
|
|
|
- cardNo: row.cardNo,
|
|
|
- bankCode: row.bankCode,
|
|
|
- provCode: row.provCode,
|
|
|
- areaCode: row.areaCode,
|
|
|
- socialCreditCode: row.socialCreditCode,
|
|
|
- socialCreditCodeExpires: row.socialCreditCodeExpires,
|
|
|
- businessScope: row.businessScope,
|
|
|
- address: row.address,
|
|
|
- multipartFile: row.multipartFile,
|
|
|
- zipCode: row.zipCode
|
|
|
- }
|
|
|
- this.cityList.forEach(item => {
|
|
|
- if (item.value == row.provCode) {
|
|
|
- this.selectListCity = item.cities
|
|
|
+ async __init () {
|
|
|
+ try {
|
|
|
+ const res = await platformProductQueryPage({ page: 1, rows: 999 })
|
|
|
+ this.productList = res.data?.rows || []
|
|
|
+ if (this.payType == 'update') {
|
|
|
+ const queryInfo = await platformServeQueryInfo({ id: this.form.id })
|
|
|
+ console.log(queryInfo)
|
|
|
+ const result = queryInfo.data || null
|
|
|
+ if(result) {
|
|
|
+ this.form.productId = Number(result.productId),
|
|
|
+ this.form.name = result.name,
|
|
|
+ this.form.attrList = this.formatAttr(result.detailList, 'asc')
|
|
|
}
|
|
|
+ }
|
|
|
+ } catch(e) {}
|
|
|
+ },
|
|
|
+ onAddItem(type, row) {
|
|
|
+ // 添加子项目
|
|
|
+ if(type == 'child') {
|
|
|
+ row.push({
|
|
|
+ mode: null,
|
|
|
+ originalPrice: null,
|
|
|
+ studentUpLimit: null,
|
|
|
+ })
|
|
|
+ } else if(type == 'parent') {
|
|
|
+ this.form.attrList.push({
|
|
|
+ mode: null,
|
|
|
+ attr: [{
|
|
|
+ originalPrice: null,
|
|
|
+ studentUpLimit: null,
|
|
|
+ }]
|
|
|
})
|
|
|
- } else if (this.payType == 'create') {
|
|
|
- this.$refs["accountForm"].resetFields()
|
|
|
}
|
|
|
},
|
|
|
+ onRemoveItem(row, index) {
|
|
|
+ this.$confirm("是否删除?", "提示", {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ type: "warning",
|
|
|
+ }).then( async() => {
|
|
|
+ row.splice(index, 1)
|
|
|
+ });
|
|
|
+ },
|
|
|
async onSubmit (formName) {
|
|
|
this.$refs[formName].validate(valid => {
|
|
|
if (valid) {
|
|
|
- const form = this.form
|
|
|
- let formData = new FormData()
|
|
|
- formData.append("memberId", form.memberId)
|
|
|
- formData.append("name", form.name)
|
|
|
- formData.append("legalPerson", form.legalPerson)
|
|
|
- formData.append("legalMp", form.legalMp)
|
|
|
- formData.append("legalCertId", form.legalCertId)
|
|
|
- formData.append("legalCertIdExpires", form.legalCertIdExpires)
|
|
|
- formData.append("cardNo", form.cardNo)
|
|
|
- formData.append("bankCode", form.bankCode)
|
|
|
- formData.append("provCode", form.provCode)
|
|
|
- formData.append("areaCode", form.areaCode)
|
|
|
- formData.append("socialCreditCode", form.socialCreditCode)
|
|
|
- formData.append("socialCreditCodeExpires", form.socialCreditCodeExpires)
|
|
|
- formData.append("businessScope", form.businessScope)
|
|
|
- formData.append("address", form.address)
|
|
|
- formData.append("multipartFile", form.multipartFile)
|
|
|
- formData.append("zipCode", form.zipCode)
|
|
|
+ const { attrList, ...res } = this.form
|
|
|
+ let isYear = 0, isMonth = 0
|
|
|
+ attrList.forEach(attr => {
|
|
|
+ if(attr.mode == 'YEAR') {
|
|
|
+ isYear++
|
|
|
+ } else if(attr.mode == 'MONTH') {
|
|
|
+ isMonth ++
|
|
|
+ }
|
|
|
+ })
|
|
|
+ if(isYear > 1 || isMonth > 1) {
|
|
|
+ this.$message.error('付费模式重复')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const params = {
|
|
|
+ ...res,
|
|
|
+ detailList: this.formatAttr(attrList)
|
|
|
+ }
|
|
|
if (this.payType == 'create') {
|
|
|
- createMember(formData).then(res => {
|
|
|
+ platformServeAdd(params).then(res => {
|
|
|
if (res.code == 200) {
|
|
|
this.$message.success('保存成功')
|
|
|
this.onCancel()
|
|
@@ -221,8 +189,7 @@ export default {
|
|
|
}
|
|
|
})
|
|
|
} else if (this.payType == 'update') {
|
|
|
- formData.append('id', this.id)
|
|
|
- updateMember(formData).then(res => {
|
|
|
+ platformServeUpdate(params).then(res => {
|
|
|
if (res.code == 200) {
|
|
|
this.$message.success('保存成功')
|
|
|
this.onCancel()
|
|
@@ -243,25 +210,46 @@ export default {
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
- handleChange (file) {
|
|
|
- this.files = file
|
|
|
- this.form.multipartFile = file.raw
|
|
|
- this.$refs["accountForm"].validateField('multipartFile')
|
|
|
- },
|
|
|
- handleRemove (file, fileList) {
|
|
|
- this.files = null
|
|
|
- this.form.multipartFile = null
|
|
|
- },
|
|
|
- handlePreview (file) {
|
|
|
- // (file);
|
|
|
- },
|
|
|
- onProvChange (value) {
|
|
|
- this.form.areaCode = null
|
|
|
- this.cityList.forEach(item => {
|
|
|
- if (item.value == value) {
|
|
|
- this.selectListCity = item.cities
|
|
|
+ formatAttr(row, type) { // 格式化数据
|
|
|
+ let resultArray = []
|
|
|
+ if(!row) return
|
|
|
+ if(type == 'asc') { // 修改时获取数据重新拼装数据
|
|
|
+ let isType = []
|
|
|
+ row.forEach(ele => {
|
|
|
+ if(isType.includes(ele.mode)) {
|
|
|
+ resultArray.forEach(arr => {
|
|
|
+ if(arr.mode == ele.mode) {
|
|
|
+ arr.attr.push({
|
|
|
+ originalPrice: ele.originalPrice,
|
|
|
+ studentUpLimit: ele.studentUpLimit
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ isType.push(ele.mode)
|
|
|
+ resultArray.push({
|
|
|
+ mode: ele.mode,
|
|
|
+ attr: [{
|
|
|
+ originalPrice: ele.originalPrice,
|
|
|
+ studentUpLimit: ele.studentUpLimit
|
|
|
+ }]
|
|
|
+ })
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ for(let item of row) {
|
|
|
+ if(item.attr && item.attr.length > 0) {
|
|
|
+ for(let child of item.attr) {
|
|
|
+ resultArray.push({
|
|
|
+ mode: item.mode,
|
|
|
+ originalPrice: child.originalPrice,
|
|
|
+ studentUpLimit: child.studentUpLimit
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- })
|
|
|
+ }
|
|
|
+ return resultArray
|
|
|
},
|
|
|
onCancel () {
|
|
|
this.$store.dispatch('delVisitedViews', this.$route)
|
|
@@ -273,13 +261,26 @@ export default {
|
|
|
};
|
|
|
</script>
|
|
|
<style lang='scss' scoped>
|
|
|
-.el-input,
|
|
|
-.el-textarea,
|
|
|
-.el-select {
|
|
|
- width: 100% !important;
|
|
|
-}
|
|
|
.serviceAttr {
|
|
|
+ position: relative;
|
|
|
+ margin-top: 18px;
|
|
|
padding-top: 18px;
|
|
|
background-color: #f4f4f5;
|
|
|
+ overflow: hidden;
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
}
|
|
|
+.list-remove {
|
|
|
+ position: absolute;
|
|
|
+ right: 20px;
|
|
|
+ top: 18px;
|
|
|
+ .el-button--text {
|
|
|
+ font-size: 18px;
|
|
|
+ color: #F56C6C;
|
|
|
+ &.is-disabled {
|
|
|
+ color: #C0C4CC;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
</style>
|