Compare commits

...

2 Commits

Author SHA1 Message Date
BabyBoy
c8f2245fd3 文章管理 2025-08-15 15:43:11 +08:00
BabyBoy
6ef17079b9 比例调整,代理,推荐人 2025-08-14 11:17:19 +08:00
21 changed files with 1101 additions and 295 deletions

View File

@ -17,6 +17,15 @@ export function getOmsOrder(id) {
method: 'get'
});
}
// 订单退款
export function refundOrder(data) {
return request({
url: '/oms/order/refund',
method: 'get',
params: data
});
}
// 查询订单手机号密文
export function getDecryptPhone(id) {
return request({

View File

@ -9,6 +9,23 @@ export function listPmsProduct(query, pageReq) {
params: pageReq
});
}
// 查询商品分类数据
export function getproductCategoryNameLike() {
return request({
url: '/pms/productCategory/list',
method: 'post',
data: {}
});
}
// 查询商品分类数据
export function getbrand() {
return request({
url: '/pms/brand/page',
method: 'post',
data: {}
});
}
//审核
export function productaudit(query, pageReq) {
return request({

View File

@ -0,0 +1,66 @@
import { PostForm, PostQuery, PostVO } from './types';
import { AxiosPromise } from 'axios';
import request from '@/utils/request';
// 查询文章列表
export function listPost(query: PostQuery): AxiosPromise<PostVO[]> {
return request({
url: '/content/article/page',
method: 'post',
data: query
});
}
// 查询文章列表tree
export function listCategory(query: any): AxiosPromise<PostVO[]> {
return request({
url: '/content/article/category/tree',
method: 'post',
data: query
});
}
// 查询文章详细
export function getPost(postId: string | number): AxiosPromise<PostVO> {
return request({
url: '/content/article/' + postId,
method: 'get'
});
}
// 获取文章选择框列表
export function optionselect(deptId?: number | string, postIds?: (number | string)[]): AxiosPromise<PostVO[]> {
return request({
url: '/system/post/optionselect',
method: 'get',
params: {
postIds: postIds,
deptId: deptId
}
});
}
// 新增文章
export function addPost(data: PostForm) {
return request({
url: '/content/article/add',
method: 'post',
data: data
});
}
// 修改文章
export function updatePost(data: PostForm) {
return request({
url: '/content/article/update',
method: 'post',
data: data
});
}
// 删除文章
export function delPost(postId: string | number | (string | number)[]) {
return request({
url: '/content/article/' + postId,
method: 'delete'
});
}

View File

@ -0,0 +1,28 @@
export interface PostVO extends BaseEntity {
postId: number | string;
deptId: number | string;
postCode: string;
postName: string;
postCategory: string;
deptName: string;
postSort: number;
status: string;
remark: string;
}
export interface PostForm {
id: number | string | undefined;
title: number | string | undefined;
type: number | string | undefined;
sort: number | string | undefined;
content: string | undefined;
status: number | string | undefined;
categoryId: number | string | undefined;
}
export interface PostQuery {
title: string;
current: number;
size: number;
categoryId: number | string;
}

View File

@ -0,0 +1,59 @@
import { PostForm, PostQuery, PostVO } from './types';
import { AxiosPromise } from 'axios';
import request from '@/utils/request';
// 查询文章分类列表
export function listPost(query: PostQuery | any): AxiosPromise {
return request({
url: '/content/article/category/tree',
method: 'post',
data: query
});
}
// 查询文章详细
export function getPost(postId: string | number): AxiosPromise<PostVO> {
return request({
url: '/content/article/category/' + postId,
method: 'get'
});
}
// 获取岗位选择框列表
export function optionselect(deptId?: number | string, postIds?: (number | string)[]): AxiosPromise<PostVO[]> {
return request({
url: '/system/post/optionselect',
method: 'get',
params: {
postIds: postIds,
deptId: deptId
}
});
}
// 新增分类
export function addPost(data: PostForm) {
return request({
url: '/content/article/category/add',
method: 'post',
data: data
});
}
// 修改岗位
export function updatePost(data: PostForm) {
return request({
url: '/content/article/update',
method: 'post',
data: data
});
}
// 删除
export function delPost(postId: string | number | (string | number)[]) {
return request({
url: '/content/article/category/' + postId,
method: 'delete'
});
}

View File

@ -0,0 +1,36 @@
export interface PostVO extends BaseEntity {
postId: number | string;
deptId: number | string;
postCode: string;
postName: string;
postCategory: string;
deptName: string;
postSort: number;
status: string;
remark: string;
}
export interface PostForm {
id: number | string | undefined;
name: number | string | undefined;
level: number | string | undefined;
parentId: number | string | undefined;
sort: number | string | undefined;
oneName: number | string | undefined;
type: number | string | undefined;
}
export interface PostQuery {
id: number | string;
name: string;
current: number;
size: number;
parentId: number | string;
sort: number | string;
level: number | string;
type: number | string;
}

View File

@ -28,7 +28,7 @@ export function getTenant(id: string | number): AxiosPromise<TenantVO> {
}
// 新增租户
export function addTenant(data: TenantForm) {
export function addTenant(data: any) {
return request({
url: '/system/tenant/add',
method: 'post',
@ -41,7 +41,7 @@ export function addTenant(data: TenantForm) {
}
// 修改租户
export function updateTenant(data: TenantForm) {
export function updateTenant(data: any) {
return request({
url: '/system/tenant/update',
method: 'post',

View File

@ -9,6 +9,15 @@ export function listUmsMember(query, pageReq) {
params: pageReq
});
}
// 查询会员账号钱账单
export function listCurrent(query, pageReq) {
return request({
url: '/ums/account/bill',
method: 'post',
data: query,
params: pageReq
});
}
// 查询会员信息详细
export function getUmsMember(id) {

View File

@ -1,114 +1,111 @@
<template>
<el-form size='small'>
<el-form-item>
<el-radio v-model='radioValue' :label="1">
允许的通配符[, - * /]
</el-radio>
</el-form-item>
<el-form size="small">
<el-form-item>
<el-radio v-model="radioValue" :label="1"> 允许的通配符[, - * /] </el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="2">
周期从
<el-input-number v-model='cycle01' :min="1" :max="11" /> -
<el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : 2" :max="12" />
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model="radioValue" :label="2">
周期从
<el-input-number v-model="cycle01" :min="1" :max="11" /> - <el-input-number v-model="cycle02" :min="cycle01 ? cycle01 + 1 : 2" :max="12" />
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="3">
<el-input-number v-model='average01' :min="1" :max="11" /> 月开始
<el-input-number v-model='average02' :min="1" :max="12 - average01 || 0" /> 月月执行一次
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model="radioValue" :label="3">
<el-input-number v-model="average01" :min="1" :max="11" /> 月开始
<el-input-number v-model="average02" :min="1" :max="12 - average01 || 0" /> 月月执行一次
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="4">
指定
<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
<el-option v-for="item in 12" :key="item" :value="item">{{item}}</el-option>
</el-select>
</el-radio>
</el-form-item>
</el-form>
<el-form-item>
<el-radio v-model="radioValue" :label="4">
指定
<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width: 100%">
<el-option v-for="item in 12" :key="item" :value="item">{{ item }}</el-option>
</el-select>
</el-radio>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
radioValue: 1,
cycle01: 1,
cycle02: 2,
average01: 1,
average02: 1,
checkboxList: [],
checkNum: this.check
}
},
name: 'crontab-month',
props: ['check', 'cron'],
methods: {
//
radioChange() {
switch (this.radioValue) {
case 1:
this.$emit('update', 'month', '*');
break;
case 2:
this.$emit('update', 'month', this.cycleTotal);
break;
case 3:
this.$emit('update', 'month', this.averageTotal);
break;
case 4:
this.$emit('update', 'month', this.checkboxString);
break;
}
},
//
cycleChange() {
if (this.radioValue == '2') {
this.$emit('update', 'month', this.cycleTotal);
}
},
//
averageChange() {
if (this.radioValue == '3') {
this.$emit('update', 'month', this.averageTotal);
}
},
// checkbox
checkboxChange() {
if (this.radioValue == '4') {
this.$emit('update', 'month', this.checkboxString);
}
}
},
watch: {
'radioValue': 'radioChange',
'cycleTotal': 'cycleChange',
'averageTotal': 'averageChange',
'checkboxString': 'checkboxChange'
},
computed: {
//
cycleTotal: function () {
const cycle01 = this.checkNum(this.cycle01, 1, 11)
const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : 2, 12)
return cycle01 + '-' + cycle02;
},
//
averageTotal: function () {
const average01 = this.checkNum(this.average01, 1, 11)
const average02 = this.checkNum(this.average02, 1, 12 - average01 || 0)
return average01 + '/' + average02;
},
// checkbox
checkboxString: function () {
let str = this.checkboxList.join();
return str == '' ? '*' : str;
}
}
}
data() {
return {
radioValue: 1,
cycle01: 1,
cycle02: 2,
average01: 1,
average02: 1,
checkboxList: [],
checkNum: this.check
};
},
name: 'crontab-month',
props: ['check', 'cron'],
methods: {
//
radioChange() {
switch (this.radioValue) {
case 1:
this.$emit('update', 'month', '*');
break;
case 2:
this.$emit('update', 'month', this.cycleTotal);
break;
case 3:
this.$emit('update', 'month', this.averageTotal);
break;
case 4:
this.$emit('update', 'month', this.checkboxString);
break;
}
},
//
cycleChange() {
if (this.radioValue == '2') {
this.$emit('update', 'month', this.cycleTotal);
}
},
//
averageChange() {
if (this.radioValue == '3') {
this.$emit('update', 'month', this.averageTotal);
}
},
// checkbox
checkboxChange() {
if (this.radioValue == '4') {
this.$emit('update', 'month', this.checkboxString);
}
}
},
watch: {
'radioValue': 'radioChange',
'cycleTotal': 'cycleChange',
'averageTotal': 'averageChange',
'checkboxString': 'checkboxChange'
},
computed: {
//
cycleTotal: function () {
const cycle01 = this.checkNum(this.cycle01, 1, 11);
const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : 2, 12);
return cycle01 + '-' + cycle02;
},
//
averageTotal: function () {
const average01 = this.checkNum(this.average01, 1, 11);
const average02 = this.checkNum(this.average02, 1, 12 - average01 || 0);
return average01 + '/' + average02;
},
// checkbox
checkboxString: function () {
let str = this.checkboxList.join();
return str == '' ? '*' : str;
}
}
};
</script>

View File

@ -32,6 +32,11 @@
{{ scope.row.type === 1 ? '商家' : scope.row.type === 2 ? '代理' : '平台' }}
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="180">
<template #default="scope">
<el-button type="primary" @click="handleSeach(scope.row)">查看明细</el-button>
</template>
</el-table-column>
</el-table>
<div class="block">
<pagination
@ -42,6 +47,14 @@
@pagination="getListList"
/>
</div>
<el-dialog v-model="dialogVisible" title="明细" width="1200px" append-to-body>
<el-table :data="tableData" style="width: 100%">
<el-table-column label="序号" align="center" type="index" width="80" />
<el-table-column label="订单号" align="center" prop="orderNo" :show-overflow-tooltip="true" />
<el-table-column label="订单金额" align="center" prop="orderAmount" :show-overflow-tooltip="true" />
<el-table-column label="积分" align="center" prop="integralBalance" :show-overflow-tooltip="true" />
</el-table>
</el-dialog>
</el-card>
</div>
</template>
@ -74,7 +87,12 @@ const getListList = async () => {
const handleQuery = () => {
getListList();
};
const showRefuteDialog = ref(false);
const tableData = ref([]);
const dialogVisible = ref(false);
//
const handleSeach = (row: any) => {
console.log(row);
};
const resetQuery = () => {
queryParams.value = {
current: 1,

View File

@ -5,12 +5,12 @@
<h3 class="title">{{ title }}</h3>
<lang-select />
</div>
<el-form-item v-if="tenantEnabled" prop="tenantId">
<!-- <el-form-item v-if="tenantEnabled" prop="tenantId">
<el-select v-model="loginForm.tenantId" filterable :placeholder="proxy.$t('login.selectPlaceholder')" style="width: 100%">
<el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"></el-option>
<template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template>
</el-select>
</el-form-item>
</el-form-item> -->
<el-form-item prop="username">
<el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" :placeholder="proxy.$t('login.username')">
<template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
@ -73,7 +73,7 @@
</el-form>
<!-- 底部 -->
<div class="el-login-footer">
<span>Copyright © 2018-2025 疯狂的狮子Li All Rights Reserved.</span>
<!-- <span>Copyright © 2018-2025 疯狂的狮子Li All Rights Reserved.</span> -->
</div>
</div>
</template>

View File

@ -37,14 +37,14 @@
<el-descriptions-item label="分佣信息">{{ getPayType(orderDetail) }}</el-descriptions-item>-->
</el-descriptions>
</el-card>
<el-card class="mt10">
<!-- <el-card class="mt10">
<el-descriptions title="收货信息" :column="2" border label-class-name="my-label" contentClassName="my-content">
<el-descriptions-item label="收货人姓名">{{ getHiddenName(addressInfo.name) }}</el-descriptions-item>
<el-descriptions-item label="收货人手机号">{{ addressInfo.userPhone }}</el-descriptions-item>
<el-descriptions-item label="收货区域">{{ addressInfo.area }}</el-descriptions-item>
<el-descriptions-item label="详细地址">{{ getHiddenDetailAddress(addressInfo.address) }}</el-descriptions-item>
</el-descriptions>
</el-card>
</el-card> -->
<el-card class="mt10">
<template v-slot:header>
<div style="font-size: 16px; font-weight: bold">商品信息</div>
@ -68,22 +68,22 @@
</el-table-column>
</el-table>
</el-card>
<el-card class="mt10">
<el-descriptions title="物流信息" :column="3" border label-class-name="my-label" contentClassName="my-content">
<el-descriptions-item label="发货时间">{{ parseTime(orderDetail.deliveryTime, '') }}</el-descriptions-item>
<el-descriptions-item label="快递单号">{{ orderDetail.expressNo }}</el-descriptions-item>
<el-descriptions-item label="物流公司">{{ orderDetail.expressName }}</el-descriptions-item>
<!-- <el-descriptions-item label="物流进度">-->
<!-- <el-popover placement="top" width="300" trigger="hover" popper-class="popperOptions">-->
<!-- <el-timeline-item v-for="(activity, index) in aliLogisticsInfoList" :key="index"-->
<!-- :timestamp="activity.time">-->
<!-- {{ activity.context }}-->
<!-- </el-timeline-item>-->
<!-- <span slot="reference">{{ orderDetail.logistics }}</span>-->
<!-- </el-popover>-->
<!-- </el-descriptions-item>-->
</el-descriptions>
</el-card>
<!-- <el-card class="mt10"> -->
<!-- <el-descriptions title="物流信息" :column="3" border label-class-name="my-label" contentClassName="my-content"> -->
<!-- <el-descriptions-item label="发货时间">{{ parseTime(orderDetail.deliveryTime, '') }}</el-descriptions-item> -->
<!-- <el-descriptions-item label="快递单号">{{ orderDetail.expressNo }}</el-descriptions-item> -->
<!-- <el-descriptions-item label="物流公司">{{ orderDetail.expressName }}</el-descriptions-item> -->
<!-- <el-descriptions-item label="物流进度">-->
<!-- <el-popover placement="top" width="300" trigger="hover" popper-class="popperOptions">-->
<!-- <el-timeline-item v-for="(activity, index) in aliLogisticsInfoList" :key="index"-->
<!-- :timestamp="activity.time">-->
<!-- {{ activity.context }}-->
<!-- </el-timeline-item>-->
<!-- <span slot="reference">{{ orderDetail.logistics }}</span>-->
<!-- </el-popover>-->
<!-- </el-descriptions-item>-->
<!-- </el-descriptions> -->
<!-- </el-card> -->
</el-main>
</div>
</template>

View File

@ -61,7 +61,7 @@
<el-input v-model.trim="queryParams.userPhone" placeholder="请输入会员手机号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="省市区" prop="provinces">
<address-selector v-model="queryParams.provinces"></address-selector>
<address-selector v-model="queryParams.provinces" :style="{ width: '100%' }" />
</el-form-item>
<el-form-item class="flex_one tr">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@ -77,30 +77,12 @@
<div>{{ scope.row.memberPhoneEncrypted }}</div>
</template>
</el-table-column>
<!-- <el-table-column label="买家信息" width="116">
<template v-slot="scope">
<div>{{ scope.row.memberUsername }}</div>
<div>{{ scope.row.memberPhoneEncrypted }}</div>
</template>
</el-table-column>-->
<el-table-column label="卖家信息" width="116">
<template v-slot="scope">
<div>{{ scope.row.tenantContactName }}</div>
<div>{{ scope.row.tenantContactPhone }}</div>
</template>
</el-table-column>
<!-- <el-table-column label="代理信息" width="116">
<template v-slot="scope">
<div>代理人姓名{{ scope.row.deliverySn }}</div>
<div>代理区域{{ scope.row.deliverySn }}</div>
<div>代理手机号{{ scope.row.deliverySn }}</div>
</template>
</el-table-column>-->
<!-- <el-table-column label="商品信息">
<template v-slot="scope">
<div>{{ scope.row.productName }}</div>
</template>
</el-table-column>-->
<el-table-column label="核销码" width="130">
<template v-slot="scope">
{{ scope.row.code }}
@ -131,26 +113,26 @@
<!-- <el-table-column label="分佣信息" prop="couponAmount" width="80"> </el-table-column>-->
<el-table-column label="订单类型" prop="couponAmount" width="100">
<template v-slot="scope">
<el-tag type="primary">
{{ getEmulistLabelById(scope.row.type, orderTypeMap) }}
</el-tag>
<!-- <el-tag type="primary"> -->
{{ getEmulistLabelById(scope.row.type, orderTypeMap) }}
<!-- </el-tag> -->
</template>
</el-table-column>
<el-table-column label="交易编号" prop="id" width="120" align="center">
<template v-slot="scope">
<el-link type="primary" icon="Copy" link @click="copy(scope.row.id)" :underline="false">
{{ scope.row.id }}
<el-icon><CopyDocument /></el-icon>
</el-link>
<!-- <el-link type="primary" icon="Copy" link @click="copy(scope.row.id)" :underline="false"> -->
{{ scope.row.id }}
<!-- <el-icon><CopyDocument /></el-icon>
</el-link> -->
</template>
</el-table-column>
<el-table-column label="订单编号" prop="orderSn" width="80"> </el-table-column>
<el-table-column label="订单状态" prop="status" width="160">
<template v-slot="scope">
<div>
<el-tag style="margin-right: 10px">
{{ getEmulistLabelById(scope.row.status, orderStatusMap) }}
</el-tag>
<!-- <el-tag style="margin-right: 10px"> -->
{{ getEmulistLabelById(scope.row.status, orderStatusMap) }}
<!-- </el-tag> -->
</div>
<!-- <div v-if="scope.row.deliverySn">
物流单号{{ scope.row.deliverySn }}
@ -161,19 +143,24 @@
</el-table-column>
<el-table-column label="退款状态" prop="aftersaleStatus" width="100">
<template v-slot="scope">
<el-tag type="primary">
{{ getEmulistLabelById(scope.row.aftersaleStatus, orderAftersaleMap) }}
</el-tag>
<!-- <el-tag type="primary"> -->
{{ getEmulistLabelById(scope.row.aftersaleStatus, orderStatusMap) }}
<!-- </el-tag> -->
</template>
</el-table-column>
<el-table-column label="提现状态" prop="withdrawStatus" width="100">
<el-table-column label="核销状态" prop="status" width="100">
<template v-slot="scope">
{{ getEmulistLabelById(scope.row.status, orderWithdrawMap) }}
</template>
</el-table-column>
<!-- <el-table-column label="提现状态" prop="withdrawStatus" width="100">
<template v-slot="scope">
<el-tag type="primary">
{{ getEmulistLabelById(scope.row.withdrawStatus, orderWithdrawMap) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="收件信息" prop="receiverName" width="280">
</el-table-column> -->
<!-- <el-table-column label="收件信息" prop="receiverName" width="280">
<template v-slot="scope">
<div>
<span>{{ scope.row.decrypt ? scope.row.receiverName : getHiddenName(scope.row.receiverName) }} {{ scope.row.receiverPhone }}</span>
@ -185,7 +172,7 @@
<span>{{ scope.row.decrypt ? scope.row.receiverDetailAddress : getHiddenDetailAddress(scope.row.receiverDetailAddress) }}</span>
</div>
</template>
</el-table-column>
</el-table-column> -->
<el-table-column label="备注留言" prop="note" width="160">
<template v-slot="scope">
<div>
@ -223,6 +210,7 @@
<el-button text size="small" type="primary" @click="goDetail(scope.row)" v-hasPermi="['oms:order:query']">详情 </el-button>
<el-button text size="small" type="primary" @click="showLog(scope.row.id)" v-hasPermi="['oms:order:log']">记录 </el-button>
<el-button text size="small" type="primary" @click="handleDelivery(scope.row)">核销 </el-button>
<el-button text size="small" type="primary" @click="handleRefund(scope.row)">退款</el-button>
</template>
</el-table-column>
</el-table>
@ -270,6 +258,20 @@
</div>
</template>
</el-dialog>
<!-- 退款弹窗 -->
<el-dialog :title="refundObj.title" v-model="refundObj.open" width="500px" append-to-body>
<el-form ref="noteForm" :model="refundObj.form" label-width="100px">
<el-form-item label="退款原因" prop="reason">
<el-input type="textarea" v-model="refundObj.form.reason" controls-position="right" :min="0" :rows="3" />
</el-form-item>
</el-form>
<template v-slot:footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleConfirmRefund()"> 确认退款 </el-button>
<el-button @click="refundObj.open = false"> </el-button>
</div>
</template>
</el-dialog>
<!-- 日志 -->
<el-dialog :title="logObj.title" v-model="logObj.open" width="500px" append-to-body>
<el-timeline v-if="logObj.logList.length">
@ -321,7 +323,8 @@ import {
saveMerchantNote,
updateOmsOrder,
updateReceiverAddress,
viewLog
viewLog,
refundOrder
} from '@/api/oms/order';
import AddressSelector from '@/views/components/AddressSelector/index.vue';
import dateUtil, { dateFormat } from '@/utils/DateUtil';
@ -408,10 +411,22 @@ export default {
title: null,
form: {
id: null,
merchantNote: null
},
open: false
},
refundObj: {
title: null,
form: {
orderId: null,
reason: null
},
open: false,
rules: {
reason: [{ required: true, message: '退款金额不能为空', trigger: 'blur' }]
}
},
logObj: {
title: '日志',
logList: null,
@ -460,6 +475,19 @@ export default {
this.getList();
},
methods: {
handleRefund(row) {
this.refundObj.title = '退款';
this.refundObj.open = true;
this.refundObj.form.orderId = row.id;
},
async handleConfirmRefund() {
const res = await refundOrder(this.refundObj.form);
if (res.code == 200) {
this.$modal.msgSuccess('退款提交');
this.getList();
this.refundObj.open = false;
}
},
/** 日期组件设置为今天 */
setToday() {
const temp = new Date();

View File

@ -9,11 +9,15 @@
<el-form-item label="名称" prop="name">
<el-input v-model="queryParams.nameLike" placeholder="请输入商品名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="品牌" prop="brandName">
<el-input v-model="queryParams.brandNameLike" placeholder="请输入品牌名称" clearable @keyup.enter="handleQuery" />
<el-form-item label="品牌" prop="brandId">
<el-select v-model="queryParams.brandId" placeholder="请选择品牌" clearable @change="handleQuery">
<el-option v-for="item in getbrandList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="分类" prop="productCategoryName">
<el-input v-model="queryParams.productCategoryNameLike" placeholder="请输入分类名称" clearable @keyup.enter="handleQuery" />
<el-form-item label="分类" prop="categoryId">
<el-select v-model="queryParams.categoryId" placeholder="请选择分类" clearable @change="handleQuery">
<el-option v-for="item in getCategoryNameLike" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="编码" prop="outProductId">
<el-input v-model="queryParams.outProductId" placeholder="请输入商品编码" clearable @keyup.enter="handleQuery" />
@ -35,18 +39,12 @@
</template>
<el-table v-loading="loading" :data="pmsProductList" border>
<!-- <el-table-column label="主图" prop="pic">
<template v-slot="{ row }">
<el-image v-if="row.pic" :src="row.pic" :preview-src-list="[row.pic]" class="small-img" />
</template>
</el-table-column>-->
<el-table-column label="店铺名称" min-width="120" prop="contactUserName" align="center"> </el-table-column>
<el-table-column label="店铺手机号" prop="contactPhone" min-width="115" align="center"> </el-table-column>
<el-table-column label="配送方式" prop="distribution" align="center">
<template v-slot="scope">{{ scope.row.distribution == 1 ? '到店核销' : scope.row.distribution == 2 ? '自提' : '配送' }} </template>
</el-table-column>
<el-table-column label="商品名称" prop="name" align="center"> </el-table-column>
<!-- <el-table-column label="商品描述" prop="describe"> </el-table-column> -->
<el-table-column label="商品类型" prop="type" align="center">
<template v-slot="scope">{{ scope.row.type == 1 ? '团购' : scope.row.type == 2 ? '拼团' : '秒杀' }} </template>
</el-table-column>
@ -91,45 +89,8 @@
<el-table-column label="审核状态" prop="authFlag" fixed="right" min-width="110" align="center">
<template v-slot="scope">
{{ scope.row.authFlag == 1 ? '待审核' : scope.row.authFlag == 2 ? '审核通过' : '审核驳回' }}
<!-- <el-switch
:model-value="scope.row.authFlag"
:active-value="1"
:inactive-value="0"
active-text="通过"
inactive-text="驳回"
inline-prompt
:before-change="
() => {
// return handleChangeUserStatus(scope.row);
}
"
>
</el-switch> -->
</template></el-table-column
>
<!-- <el-table-column label="名称/编码" min-width="200" prop="outProductId">
<template v-slot="{ row }">
<div>名称{{ row.name }}</div>
<div v-if="row.outProductId">编码{{ row.outProductId }}</div>
</template>
</el-table-column>
<el-table-column label="品牌/分类" prop="brandName">
<template v-slot="{ row }">
<div v-if="row.brandName">品牌{{ row.brandName }}</div>
<div v-if="row.productCategoryName">分类{{ row.productCategoryName }}</div>
</template>
</el-table-column>
<el-table-column label="价格/排序" prop="price">
<template v-slot="{ row }">
<div v-if="row.price">价格{{ row.price }}</div>
<div v-if="row.sort">排序{{ row.sort }}</div>
</template>
</el-table-column>
<el-table-column label="上架状态" prop="publishStatus">
<template v-slot="{ row }">
<dict-tag :value="row.publishStatus" prop-name="pms_publish_status" />
</template>
</el-table-column>-->
<el-table-column label="操作" class-name="small-padding fixed-width" width="150" align="center" fixed="right">
<template v-slot="scope">
<el-button text type="primary" icon="Edit" @click="handleUpdate(scope.row)">修改 </el-button>
@ -138,9 +99,6 @@
<br />
<el-button text type="primary" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
</template>
<!-- <template v-slot="scope">
<el-button text type="primary" @click="showProductEditModal(scope.row)">编辑</el-button>
</template>-->
</el-table-column>
</el-table>
@ -221,12 +179,11 @@
</template>
<script>
import { delPmsProduct, listPmsProduct, productpublish, productaudit } from '@/api/pms/product';
import { delPmsProduct, listPmsProduct, productpublish, productaudit, getproductCategoryNameLike, getbrand } from '@/api/pms/product';
import { isStarRepo } from '@/utils/is-star-plugin';
import { useUserStore } from '@/store/modules/user';
import AddressSelector from '@/views/components/AddressSelector/index.vue';
import { editUserData } from '@/api/ums/member.js';
export default {
name: 'PmsProduct',
components: { AddressSelector },
@ -273,6 +230,8 @@ export default {
/* email: [{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }],*/
phone: [{ required: true, pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }]
},
getCategoryNameLike: [],
getbrandList: [],
//
queryParams: {
pageNum: 1,
@ -291,12 +250,15 @@ export default {
detailHtml: null,
detailMobileHtml: null,
brandName: null,
productCategoryName: null
productCategoryName: null,
brandId: null
}
};
},
created() {
this.getList();
this.getgetproductCategoryNameLike();
this.getbrand();
},
computed: {
userId: {
@ -306,6 +268,16 @@ export default {
}
},
methods: {
//
async getgetproductCategoryNameLike() {
const res = await getproductCategoryNameLike();
this.getCategoryNameLike = res.data;
},
//
async getbrand() {
const res = await getbrand();
this.getbrandList = res.data;
},
//
async authInfoProduct() {
const res = await productaudit(this.authInfo, this.authInfo);

View File

@ -67,7 +67,7 @@
</el-form>
<!-- 底部 -->
<div class="el-register-footer">
<span>Copyright © 2018-2025 疯狂的狮子Li All Rights Reserved.</span>
<!-- <span>Copyright © 2018-2025 疯狂的狮子Li All Rights Reserved.</span> -->
</div>
</div>
</template>

View File

@ -0,0 +1,327 @@
<template>
<div class="p-2">
<el-row :gutter="20">
<!-- 部门树 -->
<el-col :lg="4" :xs="24" style="">
<el-card shadow="hover">
<!-- <el-input v-model="deptName" placeholder="请输入分类名称" prefix-icon="Search" clearable /> -->
<el-tree
ref="deptTreeRef"
class="mt-2"
node-key="id"
:data="deptOptions"
:props="{ label: 'name', children: 'children' } as any"
:expand-on-click-node="false"
:filter-node-method="filterNode"
highlight-current
default-expand-all
@node-click="handleNodeClick"
/>
</el-card>
</el-col>
<el-col :lg="20" :xs="24">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="80px">
<el-form-item label="文章标题:" prop="postCode">
<el-input v-model="queryParams.title" placeholder="请输入文章标题" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="hover">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button v-hasPermi="['content:article:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
</el-col>
</el-row>
</template>
<el-table v-loading="loading" border :data="postList">
<el-table-column label="分类名称" align="center" prop="type" />
<el-table-column label="文章标题" align="center" prop="title" />
<el-table-column label="是否显示" align="center" width="100">
<template #default="{ row }">
<!-- <el-switch v-model="row.status" active-value="0" inactive-value="1" @change="() => handleStatusChange(row)"> </el-switch> -->
</template>
</el-table-column>
<el-table-column label="排序" align="center" prop="sort" />
<el-table-column label="操作" width="180" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button v-hasPermi="['content:article:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button v-hasPermi="['content:article:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" v-model:page="queryParams.current" v-model:limit="queryParams.size" :total="total" @pagination="getList" />
</el-card>
<!-- 添加或修改岗位对话框 -->
<el-dialog v-model="dialog.visible" :title="dialog.title" width="1000px" append-to-body>
<el-form ref="postFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="文章标题" prop="title" label-width="100px">
<el-input style="width: 100%" v-model="form.title" placeholder="请输入文章标题" />
</el-form-item>
<el-form-item label="文章分类" prop="categoryId" label-width="100px">
<el-cascader
style="width: 100%"
v-model="form.categoryId"
:options="deptOptions"
:props="{
value: 'id',
label: 'name',
children: 'children',
checkStrictly: true,
emitPath: false
}"
placeholder="请选择文章分类"
clearable
filterable
/>
</el-form-item>
<el-form-item label="文章类型" prop="type" label-width="100px">
<el-select v-model="form.type" placeholder="请选择文章分类" style="width: 100%">
<el-option v-for="item in enterpriseList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="文章排序" prop="sort" label-width="100px">
<el-input v-model="form.sort" placeholder="请输入文章排序" style="width: 100%" />
</el-form-item>
<el-form-item label="文章内容" prop="content" label-width="100px">
<Editor ref="editorRef" v-model="form.content" />
</el-form-item>
<el-form-item label="文章状态" prop="status">
<DictRadio v-model="form.status" radioData="cont_article_status" :show-all="'all'" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</el-col>
</el-row>
</div>
</template>
<script setup name="Post" lang="ts">
import { listPost, addPost, delPost, getPost, updatePost, listCategory } from '@/api/system/article';
import { PostForm, PostQuery, PostVO } from '@/api/system/article/types';
import { DeptVO } from '@/api/system/dept/types';
import api from '@/api/system/user';
import Editor from '@/components/Editor/index.vue';
import { getDictionaryByKey } from '@/utils/dict';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable'));
const postList = ref<PostVO[]>([]);
const loading = ref(true);
const showSearch = ref(true);
const total = ref(0);
const deptName = ref('');
const deptOptions = ref<any[]>([]);
const deptTreeRef = ref<ElTreeInstance>();
const postFormRef = ref<ElFormInstance>();
const queryFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: PostForm = {
id: undefined,
title: '',
type: undefined,
sort: undefined,
categoryId: undefined,
content: '',
status: ''
};
const data = reactive<PageData<PostForm, PostQuery>>({
form: { ...initFormData },
queryParams: {
current: 1,
size: 10,
title: undefined,
categoryId: undefined
},
rules: {
title: [{ required: true, message: '文章标题不能为空', trigger: 'blur' }],
type: [{ required: true, message: '文章类型不能为空', trigger: 'blur' }],
categoryId: [{ required: true, message: '文章分类不能为空', trigger: 'blur' }],
sort: [{ required: true, message: '文章排序不能为空', trigger: 'blur' }],
content: [{ required: true, message: '文章内容不能为空', trigger: 'blur' }],
status: [{ required: true, message: '文章状态不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs<PageData<PostForm, PostQuery>>(data);
/** 角色状态修改 */
const handleStatusChange = async (row: any) => {
const text = row.status === '0' ? '启用' : '停用';
try {
await proxy?.$modal.confirm('确认要"' + text + '""' + row.roleName + '"角色吗?');
await changeRoleStatus(row.roleId, row.status);
proxy?.$modal.msgSuccess(text + '成功');
} catch {
row.status = row.status === '0' ? '1' : '0';
}
};
/** 通过条件过滤节点 */
const filterNode = (value: string, data: any) => {
if (!value) return true;
return data.label.indexOf(value) !== -1;
};
const enterpriseList = ref([]); //
const getByKey = async () => {
const value1 = await getDictionaryByKey('cont_article_type');
console.log(value1);
value1.forEach((item: any) => {
item.value = Number(item.value);
});
enterpriseList.value = value1;
};
/** 根据名称筛选部门树 */
watchEffect(
() => {
deptTreeRef.value?.filter(deptName.value);
},
{
flush: 'post' // watchEffectDOMDOM
}
);
watch(deptName, (val) => {
deptTreeRef.value?.filter(val);
});
const queryTree = ref({
current: 1,
size: 10,
id: '',
name: undefined,
parentId: undefined,
sort: undefined,
level: undefined,
type: undefined
});
/** 查询文章分类下拉树结构 */
const getTreeSelect = async () => {
const res = await listCategory(queryTree.value);
deptOptions.value = res.data;
};
/** 节点单击事件 */
const handleNodeClick = (data: DeptVO) => {
queryParams.value.categoryId = data.id;
handleQuery();
};
/** 查询岗位列表 */
const getList = async () => {
loading.value = true;
const res = await listPost(queryParams.value);
postList.value = res.data.records;
total.value = res.data.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
postFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
queryParams.value.categoryId = undefined;
queryParams.value.title = undefined;
queryParams.value.current = 1;
handleQuery();
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加岗位';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: any) => {
reset();
getByKey();
const postId = row.id;
const res = await getPost(postId);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改岗位';
};
/** 提交按钮 */
const submitForm = () => {
postFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
form.value.id ? await updatePost(form.value) : await addPost(form.value);
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: any) => {
const postIds = row.id;
await proxy?.$modal.confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?');
await delPost(postIds);
await getList();
proxy?.$modal.msgSuccess('删除成功');
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'system/post/export',
{
...queryParams.value
},
`post_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getTreeSelect(); //
getList();
getByKey();
});
</script>

View File

@ -0,0 +1,213 @@
<template>
<div class="p-2">
<el-row :gutter="20">
<el-col>
<el-card shadow="hover">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button v-hasPermi="['system:post:add']" type="primary" plain icon="Plus" @click="handleAdd">新增一级分类</el-button>
</el-col>
</el-row>
</template>
<el-table v-loading="loading" border :data="postList" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" row-key="id">
<el-table-column label="分类名称" align="left" prop="name" />
<el-table-column label="排序" align="center" prop="sort" />
<el-table-column label="操作" width="180" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="添加子分类" placement="top" v-if="scope.row.parentId == 0 || scope.row.parentId == '0'">
<el-button v-hasPermi="['system:post:add']" link type="primary" icon="Plus" @click="handleAddChild(scope.row)"></el-button>
</el-tooltip>
<el-tooltip content="修改" placement="top">
<el-button v-hasPermi="['system:post:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button v-hasPermi="['system:post:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
</el-card>
<!-- 添加或修改岗位对话框 -->
<el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body>
<el-form ref="postFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="上级分类" prop="name">
<span v-if="form.parentId">{{ form.oneName }}</span>
<span v-else>顶级分类</span>
</el-form-item>
<el-form-item label="分类名称" prop="name">
<el-input v-model="form.name" autocomplete="off" />
</el-form-item>
<el-form-item label="排序" prop="level">
<el-input v-model="form.sort" autocomplete="off" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</el-col>
</el-row>
</div>
</template>
<script setup name="Post" lang="ts">
import { listPost, getPost, updatePost, addPost, delPost } from '@/api/system/category';
import { PostVO, PostForm, PostQuery } from '@/api/system/category/types';
import { DeptVO } from '@/api/system/dept/types';
import api from '@/api/system/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable'));
const postList = ref<PostVO[]>([]);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<number | string>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const deptName = ref('');
const deptOptions = ref<DeptVO[]>([]);
const deptTreeRef = ref<ElTreeInstance>();
const postFormRef = ref<ElFormInstance>();
const queryFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: PostForm = {
id: undefined,
name: undefined,
level: undefined,
parentId: undefined,
sort: undefined,
type: undefined,
oneName: undefined
};
const data = reactive<PageData<PostForm, PostQuery>>({
form: { ...initFormData },
queryParams: {
current: 1,
size: 10,
id: '',
name: undefined,
parentId: undefined,
sort: undefined,
level: undefined,
type: undefined
},
rules: {
postName: [{ required: true, message: '岗位名称不能为空', trigger: 'blur' }],
postCode: [{ required: true, message: '岗位编码不能为空', trigger: 'blur' }],
deptId: [{ required: true, message: '部门不能为空', trigger: 'blur' }],
postSort: [{ required: true, message: '岗位顺序不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs<PageData<PostForm, PostQuery>>(data);
const handleAddChild = (row: PostForm) => {
reset();
form.value.parentId = row.id;
form.value.oneName = row.name;
dialog.visible = true;
dialog.title = '添加' + row.name + ' 子分类';
};
/** 查询文章分类列表 */
const getList = async () => {
loading.value = true;
const res = await listPost(queryParams.value);
postList.value = res.data;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
postFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
if (queryParams.value.deptId) {
queryParams.value.belongDeptId = undefined;
}
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
queryParams.value.pageNum = 1;
queryParams.value.deptId = undefined;
deptTreeRef.value?.setCurrentKey(undefined);
/** 清空左边部门树选中值 */
queryParams.value.belongDeptId = undefined;
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: PostVO[]) => {
ids.value = selection.map((item) => item.postId);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加分类';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: any) => {
const postId = row.id;
const res = await getPost(postId);
Object.assign(form.value, res.data);
console.log(form.value);
dialog.visible = true;
dialog.title = '修改分类';
};
/** 提交按钮 */
const submitForm = () => {
postFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
form.value.id ? await updatePost(form.value) : await addPost(form.value);
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row: any) => {
const postIds = row.id;
await proxy?.$modal.confirm('是否确认删除岗位编号为"' + row.id + '"的数据项?');
await delPost(postIds);
await getList();
proxy?.$modal.msgSuccess('删除成功');
};
onMounted(() => {
getList();
});
</script>

View File

@ -237,37 +237,34 @@ const mul = ref<string>('');
const isFuttl = ref<boolean>(false);
//
const funseach = (data: any) => {
getTenantPackage();
// getTenantPackage();
templateDetailList.value = [];
constdfrom.value = [];
sexDialog.value.visible = true;
secform.value.templateId = data.id;
mul.value = data.templateType;
sexDialog.value.title = '模板详情';
getsections({ 'templateId': data.id }).then((res: any) => {
if (res.code == 200) {
if (res.data.length > 0) {
console.log(res.data.length);
if (data.templateType == '1') {
// isFuttl.value = true;
isFuttl.value = true;
if (data.templateType == '1') {
res.data.forEach((item: any) => {
templateDetailList.value.push({
rateName: item.rateName,
rate: item.rate,
id: item.id
});
res.data.forEach((item: any) => {
templateDetailList.value.push({
rateName: item.rateName,
rate: item.rate,
id: item.id
});
} else {
res.data.forEach((item: any) => {
constdfrom.value.push({
minAmount: item.minAmount,
maxAmount: item.maxAmount,
rate: item.rate,
id: item.id
});
});
}
});
} else {
isFuttl.value = false;
res.data.forEach((item: any) => {
constdfrom.value.push({
minAmount: item.minAmount,
maxAmount: item.maxAmount,
rate: item.rate,
id: item.id
});
});
}
}
});
@ -276,51 +273,7 @@ const secformRef = ref<ElFormInstance>();
const constdfromRef = ref<ElFormInstance>();
//
const addsectionasync = async () => {
//
if (isFuttl.value) {
if (mul.value == '1') {
secformRef.value?.validate(async (valid: boolean) => {
if (valid) {
// const valuefn = JSON.stringify(templateDetailList.value);
secform.value.templateList = JSON.stringify(templateDetailList.value);
const res = await putsections(secform.value);
if (res.code == 200) {
isFuttl.value = false;
ElMessage.success('修改成功');
sexDialog.value.visible = false;
getList();
secform.value = {
templateId: '',
templateList: ''
};
templateDetailList.value = [];
}
}
});
} else {
constdfromRef.value?.validate(async (valid: boolean) => {
if (valid) {
// const valuefn = JSON.stringify(constdfrom.value);
secform.value.templateList = JSON.stringify(constdfrom.value);
const res = await putsections(secform.value);
if (res.code == 200) {
isFuttl.value = false;
ElMessage.success('修改成功');
sexDialog.value.visible = false;
getList();
secform.value = {
templateId: '',
templateList: ''
};
constdfrom.value = [];
}
}
});
}
} else {
//
addsecfun();
}
addsecfun();
};
const addsecfun = () => {
if (mul.value == '1') {
@ -329,7 +282,6 @@ const addsecfun = () => {
secform.value.templateList = JSON.stringify(templateDetailList.value);
const res = await addsection(secform.value);
if (res.code == 200) {
isFuttl.value = false;
ElMessage.success('新增成功');
sexDialog.value.visible = false;
getList();
@ -347,7 +299,6 @@ const addsecfun = () => {
secform.value.templateList = JSON.stringify(constdfrom.value);
const res = await addsection(secform.value);
if (res.code == 200) {
isFuttl.value = false;
ElMessage.success('新增成功');
sexDialog.value.visible = false;
getList();
@ -448,7 +399,7 @@ const resetQuery = () => {
/** 新增按钮操作 */
const handleAdd = () => {
reset();
getTenantPackage();
// getTenantPackage();
dialog.visible = true;
dialog.title = '新增模板';
};
@ -456,7 +407,7 @@ const handleAdd = () => {
/** 修改按钮操作 */
const handleUpdate = async (row?: TenantVO) => {
reset();
await getTenantPackage();
// await getTenantPackage();
const _id = row?.id;
// const res = await getTenant(_id);
Object.assign(form.value, row);

View File

@ -93,6 +93,11 @@
<span>{{ proxy.parseTime(scope.row.expireTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column> -->
<el-table-column label="签约状态" align="center" prop="signStatus">
<template #default="scope">
{{ signList.filter((item) => item.value == scope.row.signStatus)[0]?.label }}
</template>
</el-table-column>
<el-table-column label="租户状态" align="center" prop="status">
<template #default="scope">
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
@ -401,7 +406,7 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="签约状态" prop="signStatus" align="left">
<el-form-item label="签约状态" prop="signStatus" align="left" v-if="form.id">
<el-select v-model="form.signStatus" placeholder="请选择签约状态" clearable>
<el-option v-for="(item, index) in signList" :key="index" :label="item.label" :value="item.value" />
</el-select>
@ -838,10 +843,12 @@ const data = reactive<PageData<TenantForm, TenantQuery>>({
rules: {
id: [{ required: true, message: 'id不能为空', trigger: 'blur' }],
tenantId: [{ required: true, message: '租户编号不能为空', trigger: 'blur' }],
bankPhone: [{ required: true, message: '开户行预留手机号不能为空', trigger: 'blur' }],
contactUserName: [{ required: true, message: '联系人不能为空', trigger: 'blur' }],
contactPhone: [{ required: true, message: '联系电话不能为空', trigger: 'blur' }],
contractAttachment: [{ required: true, message: '签约附件不能为空', trigger: 'blur' }],
attachment: [{ required: true, message: '营业执照附件不能为空', trigger: 'blur' }],
signDate: [{ required: true, message: '签约日期不能为空', trigger: 'blur' }],
certificate: [{ required: true, message: '身份证附件不能为空', trigger: 'blur' }],
promoteList: [{ required: true, message: '推广附件不能为空', trigger: 'blur' }],
packageId: [{ required: true, message: '套餐编号不能为空', trigger: 'blur' }],

View File

@ -55,9 +55,9 @@
<el-tab-pane label="修改密码" name="resetPwd">
<resetPwd />
</el-tab-pane>
<el-tab-pane label="第三方应用" name="thirdParty">
<!-- <el-tab-pane label="第三方应用" name="thirdParty">
<thirdParty :auths="state.auths" />
</el-tab-pane>
</el-tab-pane> -->
<el-tab-pane label="在线设备" name="onlineDevice">
<onlineDevice :devices="state.devices" />
</el-tab-pane>

View File

@ -37,20 +37,69 @@
<el-table-column label="积分余额" prop="integral" align="center">
<template v-slot="scope"> {{ scope.row.integral || '0.00' }} </template>
</el-table-column>
<el-table-column label="操作" align="center">
<template v-slot="scope">
<el-button v-hasPermi="['system:tenant:edit']" link type="primary" @click="showTenantBannedInfoModal(scope.row, true)">
查看明细
</el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.current" v-model:limit="queryParams.size" @pagination="getList" />
</el-card>
</div>
<el-dialog v-model="isshow" title="明细" width="1200px" append-to-body>
<el-card shadow="hover">
<el-form :model="queryParams" ref="query" :inline="true" v-show="showSearch" label-width="100px" size="default" class="ry_form">
<el-form-item label="时间:" prop="date">
<el-date-picker
v-model="query.date"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
/>
</el-form-item>
<el-form-item label="类型:" prop="changeType">
<el-select v-model="query.changeType" placeholder="请选择类型" clearable size="default" style="width: 240px">
<el-option label="收入" value="1" />
<el-option label="支出" value="2" />
</el-select>
</el-form-item>
<el-form-item class="flex_one tr">
<el-button type="primary" icon="Search" @click="getFomg">搜索</el-button>
</el-form-item>
</el-form>
</el-card>
<el-table :data="tableData" border>
<el-table-column label="变动类型" prop="accountType" align="center" />
<el-table-column label="变动来源" prop="accountTypeDesc" align="center" />
<el-table-column label="用户类型" prop="userType" align="center" />
<el-table-column label="余额" prop="moneyBalance" align="center" />
<el-table-column label="变动前余额" prop="beforeBalance" align="center" />
<el-table-column label="变动后余额" prop="afterBalance" align="center" />
<el-table-column label="变动金额" prop="changeAmount" align="center" />
<el-table-column label="变动类型" prop="changeType" align="center" />
<el-table-column label="创建时间" prop="createTime" align="center" />
<el-table-column label="备注" prop="remark" align="center" />
</el-table>
<pagination :total="totals" v-model:page="query.current" v-model:limit="query.size" @pagination="getFomg" />
</el-dialog>
</div>
</template>
<script>
import { getUserAccountList } from '@/api/ums/member';
import { getUserAccountList, listCurrent } from '@/api/ums/member';
export default {
name: 'UmeAccount',
data() {
return {
tableData: [],
isshow: false,
show: false,
//
loading: true,
@ -71,6 +120,14 @@ export default {
name: null,
phone: null,
type: null
},
totals: 0,
query: {
current: 1,
size: 10,
accountld: null,
date: null,
changeType: null
}
};
},
@ -79,6 +136,18 @@ export default {
this.getList();
},
methods: {
showTenantBannedInfoModal(row) {
this.query.accountld = row.id;
this.getFomg();
},
async getFomg() {
const res = await listCurrent(this.query);
if (res.code === 200) {
this.tableData = res.data.records;
this.totals = res.data.total;
this.isshow = true;
}
},
/** 查询会员信息列表 */
getList() {
// type: 1 2 3 4