修改退款审核、订单详情等页面显示

This commit is contained in:
geng.tang@qq.com
2024-01-26 15:33:03 +08:00
parent c3413fd1a0
commit 8f6567e57e
24 changed files with 677 additions and 178 deletions

View File

@@ -70,4 +70,5 @@ export interface EquipmentParam extends PageParam {
stockTotal?: number; stockTotal?: number;
merchantCode?: string; merchantCode?: string;
userId?: number; userId?: number;
isBind?: number;
} }

View File

@@ -18,6 +18,7 @@ export interface PageResult<T> {
list: T[]; list: T[];
// 总数量 // 总数量
count: number; count: number;
otherData?: object;
} }
/** /**

View File

@@ -7,7 +7,7 @@ import type { Merchant, MerchantParam } from './model';
*/ */
export async function pageMerchant(params: MerchantParam) { export async function pageMerchant(params: MerchantParam) {
const res = await request.get<ApiResult<PageResult<Merchant>>>( const res = await request.get<ApiResult<PageResult<Merchant>>>(
'/shop/merchant/page', '/open/merchant/page',
{ {
params params
} }

View File

@@ -119,3 +119,14 @@ export async function checkExistence(
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 更改电池
*/
export async function batteryChange(data){
const res = await request.post<ApiResult<unknown>>('/open/equipment/change', data);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -65,6 +65,11 @@ export interface Order {
// 用户ID // 用户ID
userId?: any; userId?: any;
nickname?: string; nickname?: string;
equipmentCode: string;
receiptPhone: string;
emergentUser: string;
officeAddress: string;
homeAddress: string;
} }
/** /**
@@ -93,4 +98,6 @@ export interface OrderParam extends PageParam {
isRenew?: number; isRenew?: number;
// 商户编号 // 商户编号
merchantCode?: string; merchantCode?: string;
expireDay?: number;
isExpire?: number;
} }

View File

@@ -32,6 +32,7 @@ export interface ProfitParam extends PageParam {
orderNo?: string; orderNo?: string;
orderUserName?: string; orderUserName?: string;
merchantName?: string; merchantName?: string;
merchantCode?: string;
beginDate?: string; beginDate?: string;
endDate?: string; endDate?: string;
scene?: number; scene?: number;

View File

@@ -35,7 +35,7 @@
// 字典数据 // 字典数据
const data = ref<SelectProps['options']>([]); const data = ref<SelectProps['options']>([]);
pageMerchant({}).then((res) => { pageMerchant({limit:100}).then((res) => {
res?.list.map((d) => { res?.list.map((d) => {
data.value?.push({ data.value?.push({
comments: d.merchantName, comments: d.merchantName,

View File

@@ -50,8 +50,8 @@ export const MAP_CODE = '7225174a116c1c44e1bd7a177d1787d5';
export const LICENSE_CODE = export const LICENSE_CODE =
'dk9mcwJyetRWQlxWRiojIzJCLi8mcQ5Wa4ojI0NWZqJWd6ICZpJCL0kjNwl1NnhENahnIvl2cyVmdiwiIiATMuEjI6IibQf0NW=='; 'dk9mcwJyetRWQlxWRiojIzJCLi8mcQ5Wa4ojI0NWZqJWd6ICZpJCL0kjNwl1NnhENahnIvl2cyVmdiwiIiATMuEjI6IibQf0NW==';
// 文件服务器地址 // 文件服务器地址
// export const FILE_SERVER = 'https://file.wsdns.cn'; export const FILE_SERVER = 'https://file.wsdns.cn';
export const FILE_SERVER = 'https://yxw.wsdns.cn'; // export const FILE_SERVER = 'https://yxw.wsdns.cn';
// 缩略图前缀 // 缩略图前缀
export const FILE_THUMBNAIL = FILE_SERVER + '/thumbnail'; export const FILE_THUMBNAIL = FILE_SERVER + '/thumbnail';
// 文件下载前缀 // 文件下载前缀

View File

@@ -258,6 +258,7 @@
} }
// 只查门店类型 // 只查门店类型
where.sceneType = 'SHOP_USER'; where.sceneType = 'SHOP_USER';
where.limit = 100;
return pageMerchant({ ...where, ...orders, page, limit }); return pageMerchant({ ...where, ...orders, page, limit });
}; };

View File

@@ -3,11 +3,13 @@
<a-space :size="10" style="flex-wrap: wrap"> <a-space :size="10" style="flex-wrap: wrap">
<a-radio-group v-model:value="listType" @change="handleTabs"> <a-radio-group v-model:value="listType" @change="handleTabs">
<a-radio-button :value="0">全部订单</a-radio-button> <a-radio-button :value="0">全部订单</a-radio-button>
<a-radio-button :value="1">待发货</a-radio-button> <!-- <a-radio-button :value="1">待发货</a-radio-button> -->
<a-radio-button :value="2">待收货</a-radio-button> <a-radio-button :value="2">待收货</a-radio-button>
<a-radio-button :value="3">待付款</a-radio-button> <a-radio-button :value="3">待付款</a-radio-button>
<a-radio-button :value="4">已完成</a-radio-button> <!-- <a-radio-button :value="4">已完成</a-radio-button> -->
<a-radio-button :value="5">已取消</a-radio-button> <a-radio-button :value="4">进行中</a-radio-button>
<!-- <a-radio-button :value="5">已取消</a-radio-button> -->
<a-radio-button :value="6">已退租</a-radio-button>
</a-radio-group> </a-radio-group>
<a-button <a-button
danger danger
@@ -98,7 +100,7 @@
where.userId = searchText.value; where.userId = searchText.value;
where.orderNo = undefined; where.orderNo = undefined;
} }
console.log(where); // console.log(where);
emit('search', { emit('search', {
...where, ...where,
createTimeStart: d1 ? d1 + ' 00:00:00' : '', createTimeStart: d1 ? d1 + ' 00:00:00' : '',
@@ -120,33 +122,34 @@
console.log('全部订单'); console.log('全部订单');
} }
// 待发货 // 待发货
if (listType == 1) { // if (listType == 1) {
console.log('待发货'); // console.log('待发货');
where.payStatus = 20; // where.payStatus = 20;
where.deliveryStatus = 10; // where.deliveryStatus = 10;
} // }
// 待收货 // 待收货
if (listType == 2) { if (listType == 2) {
console.log('待货'); // console.log('待货');
where.payStatus = 20; where.payStatus = 20;
where.deliveryStatus = 20; where.deliveryStatus <= 20;
where.receiptStatus = 10; where.receiptStatus = 10;
} }
// 待付款 // 待付款
if (listType == 3) { if (listType == 3) {
console.log('待付款'); // console.log('待付款');
where.payStatus = 10; where.payStatus = 10;
} }
// 已完成 // 已完成
if (listType == 4) { if (listType == 4) {
console.log('已完成'); // console.log('已完成');
where.payStatus = 20; where.payStatus = 20;
where.orderStatus = 30; where.orderStatus = 30;
} }
// 已取消 // 已取消
if (listType == 5) { if (listType == 5) {
console.log('已取消'); // console.log('已取消');
where.orderStatus = 20; // where.orderStatus = 20;
where.orderStatus = 21;
} }
emit('search', { emit('search', {
...where ...where

View File

@@ -0,0 +1,36 @@
<template>
<div style="max-width: 160px">
<a-input
allow-clear
size="small"
v-model:value="where.nickname"
placeholder="输入关键字搜索"
prefix-icon="el-icon-search"
@change="search"
>
<template #prefix>
<search-outlined class="ele-text-placeholder" />
</template>
</a-input>
</div>
</template>
<script lang="ts" setup>
import { reactive } from 'vue';
import { SearchOutlined } from '@ant-design/icons-vue';
import type { WhereType } from '../types';
const emit = defineEmits<{
(e: 'search', where: WhereType): void;
}>();
// 搜索表单
const where = reactive<WhereType>({
nickname: ''
});
/* 搜索 */
const search = () => {
emit('search', where);
};
</script>

View File

@@ -1,76 +1,91 @@
<!-- 角色选择下拉框 -->
<template> <template>
<a-select <div style="max-width: 260px">
show-search <ele-table-select
optionFilterProp="label" ref="selectRef"
:options="data" :multiple="false"
allow-clear :allow-clear="true"
:value="value" placeholder="请选择"
:placeholder="placeholder" value-key="userId"
@update:value="updateValue" label-key="nickname"
@search="onSearch" v-model:value="selectedValue"
@blur="onBlur" :table-config="tableConfig"
/> :overlay-style="{ width: '520px', maxWidth: '80%' }"
>
<!-- 表头工具栏 -->
<template #toolbar>
<user-advanced-search @search="search"/>
</template>
</ele-table-select>
</div>
<!-- <div style="margin-top: 12px">
<a-button type="primary" @click="setInitValue">回显数据</a-button>
</div> -->
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue'; import { ref, reactive } from 'vue';
import { message } from 'ant-design-vue';
import { listUsers } from '@/api/system/user'; import { listUsers } from '@/api/system/user';
import type { SelectProps } from 'ant-design-vue'; import UserAdvancedSearch from './user-advanced-search.vue';
import { UserParam } from '@/api/system/user/model'; import type { EleTableSelect } from 'ele-admin-pro/es';
import type { ProTableProps } from 'ele-admin-pro/es/ele-pro-table/types';
import type { WhereType } from '../types';
import type { User, UserParam } from '@/api/system/user/model';
const emit = defineEmits<{ const selectedValue = ref<number[]>([]);
(e: 'update:value', value: string): void;
(e: 'blur'): void;
}>();
withDefaults( // 选择框实例
defineProps<{ const selectRef = ref<InstanceType<typeof EleTableSelect> | null>(null);
value?: string;
placeholder?: string;
}>(),
{
placeholder: '请选择客户类型'
}
);
// 字典数据 // 表格配置
const data = ref<SelectProps['options']>([]); const tableConfig = reactive<ProTableProps>({
datasource: ({ page, limit, where, orders }) => {
return listUsers({ ...where, ...orders, page, limit });
},
columns: [
{
title: '用户编号',
dataIndex: 'userId',
sorter: true,
showSorterTooltip: false
},
{
title: '用户名',
key: 'nickname',
dataIndex: 'nickname',
sorter: false,
showSorterTooltip: false
},
,
{
title: '手机号',
key: 'phone',
dataIndex: 'phone',
sorter: false,
showSorterTooltip: false
}
],
toolkit: ['reload', 'columns'],
pageSize: 5,
pageSizeOptions: ['5', '10', '15', '20'],
size: 'small',
rowSelection: {
columnWidth: 38,
preserveSelectedRowKeys: true,
fixed: 'left'
},
toolsTheme: 'default',
bordered: true,
toolStyle: {
padding: '0 8px'
},
scroll: { x: 480 }
});
/* 更新选中数据 */ // 搜索
const updateValue = (value: string) => { const search = (where: WhereType) => {
emit('update:value', value); selectRef.value?.reload({
}; where,
page: 1
// 默认搜索条件 });
const where = ref<UserParam>({});
const search = () => {
/* 获取用户列 */
listUsers({ ...where?.value })
.then((result) => {
data.value = result?.map((d) => {
return {
value: d.userId,
label: d.nickname
};
});
})
.catch((e) => {
message.error(e.message);
});
};
const onSearch = (e) => {
where.value.nickname = e;
search();
};
search();
/* 失去焦点 */
const onBlur = () => {
emit('blur');
}; };
</script> </script>

View File

@@ -0,0 +1,7 @@
/**
* 搜索表单类型
*/
export interface WhereType {
keywords?: string;
nickname?: string;
}

View File

@@ -26,6 +26,11 @@
<!-- <a-radio-button value="offSale">已下架</a-radio-button>--> <!-- <a-radio-button value="offSale">已下架</a-radio-button>-->
<!-- <a-radio-button value="soldOut">已售罄</a-radio-button>--> <!-- <a-radio-button value="soldOut">已售罄</a-radio-button>-->
<!-- </a-radio-group>--> <!-- </a-radio-group>-->
<a-select v-model:value="isBind" style="width: 120px; margin: 0px 2px 0px 2px;" defaultValue="-1">
<a-select-option value="-1">全部</a-select-option>
<a-select-option value="0">未绑定</a-select-option>
<a-select-option value="1">已绑定</a-select-option>
</a-select>
<a-input-search <a-input-search
allow-clear allow-clear
v-model:value="searchText" v-model:value="searchText"
@@ -77,11 +82,13 @@
equipmentId: undefined, equipmentId: undefined,
equipmentName: '', equipmentName: '',
equipmentCode: '', equipmentCode: '',
merchantCode: '' merchantCode: '',
isBind: undefined
}); });
// 下来选项 // 下来选项
const type = ref('equipmentCode'); const type = ref('equipmentCode');
const isBind = ref();
// tabType // tabType
// const listType = ref('all'); // const listType = ref('all');
// 搜索内容 // 搜索内容
@@ -92,15 +99,19 @@
where.equipmentName = undefined; where.equipmentName = undefined;
where.equipmentCode = undefined; where.equipmentCode = undefined;
where.merchantCode = undefined; where.merchantCode = undefined;
where.isBind = undefined;
if (type.value == 'equipmentName') { if (type.value == 'equipmentName') {
where.equipmentName = searchText.value; where.equipmentName = searchText.value;
} } else if (type.value == 'equipmentCode') {
if (type.value == 'equipmentCode') {
where.equipmentCode = searchText.value; where.equipmentCode = searchText.value;
} } else if (type.value == 'merchantCode') {
if (type.value == 'merchantCode') {
where.merchantCode = searchText.value; where.merchantCode = searchText.value;
} }
if (isBind.value && isBind.value != '-1') {
where.isBind = parseInt(isBind.value);
} else {
where.isBind = undefined;
}
emit('search', where); emit('search', where);
}; };

View File

@@ -0,0 +1,132 @@
<!-- 服务编辑弹窗 -->
<template >
<ele-modal
:width="400"
:visible="visible"
:confirm-loading="loading"
:title="'更换电池'"
:body-style="{ paddingBottom: '8px' }"
@update:visible="updateVisible"
@ok="save"
>
<a-form
ref="formRef"
:model="form"
:rules="rules"
:wrapper-col="
styleResponsive ? { md: 19, sm: 19, xs: 24 } : { flex: '1' }
"
>
<a-form-item label="新电池编号">
<a-input
allow-clear
:maxlength="32"
placeholder="请输入新电池编号"
v-model:value="equipmentCode"
/>
</a-form-item>
</a-form>
</ele-modal>
</template>
<script lang="ts" setup>
import { ref, reactive, watch } from 'vue';
import { Form, message } from 'ant-design-vue';
import type { FormInstance, Rule } from 'ant-design-vue/es/form';
import { storeToRefs } from 'pinia';
import { useThemeStore } from '@/store/modules/theme';
import useFormData from '@/utils/use-form-data';
import type { Order } from '@/api/order/model';
import { Equipment } from "@/api/apps/equipment/model";
import { batteryChange } from '@/api/order';
// 是否开启响应式布局
const themeStore = useThemeStore();
const { styleResponsive } = storeToRefs(themeStore);
const emit = defineEmits<{
(e: 'done'): void;
(e: 'update:visible', visible: boolean): void;
}>();
const props = defineProps<{
// 弹窗是否打开
visible: boolean;
// 修改回显的数据
data?: Order | null;
}>();
//
const formRef = ref<FormInstance | null>(null);
// 提交状态
const loading = ref(false);
// 表单数据
const { form, resetFields, assignFields } = useFormData<Equipment>({
orderId: props.data?.orderId,
equipmentCode: ''
});
const equipmentCode = ref('')
// 表单验证规则
const rules = reactive<Record<string, Rule[]>>({
equipmentCode: [
{
required: true,
message: '请输入新电池编号',
type: 'string',
trigger: 'blur'
}
]
});
/* 保存编辑 */
const save = () => {
const app = this
if (!formRef.value) {
return;
}
formRef.value.validate()
.then(() => {
loading.value = true
batteryChange({
orderId:form.orderId,
equipmentCode: equipmentCode.value
})
.then((msg) => {
loading.value = false
message.success("更换电池成功!");
updateVisible(false);
emit('done');
loading.value = false;
})
.catch((e) => {
loading.value = false;
message.error("更换电池失败!" + e);
});
})
.catch(() => {});
};
const updateVisible = (value: boolean) => {
emit('update:visible', value);
};
watch(
() => props.visible,
(visible) => {
if (visible) {
if (props.data) {
assignFields(props.data);
}
} else {
resetFields();
formRef.value?.clearValidate();
}
}
);
</script>

View File

@@ -94,7 +94,7 @@ import { Order } from "@/api/order/model";
// 是否显示最大化切换按钮 // 是否显示最大化切换按钮
const maxable = ref(true); const maxable = ref(true);
// 用户信息 // 表单数据
const form = reactive<Equipment>({ const form = reactive<Equipment>({
equipmentCode: '', equipmentCode: '',
orderId: undefined orderId: undefined

View File

@@ -0,0 +1,90 @@
<template>
<a-card :bordered="false" :body-style="{ padding: '10px 20px' }">
<ele-pro-table
ref="tableRef"
size="small"
title="换电记录"
row-key="id"
:columns="columns"
:datasource="datasource"
:scroll="{ x: 800 }"
/>
</a-card>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import type { EleProTable } from 'ele-admin-pro/es';
import type {
DatasourceFunction,
ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types';
import { toDateString } from 'ele-admin-pro/es';
import { pageUsers } from '@/api/system/user';
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
// 表格列配置
const columns = ref<ColumnItem[]>([
{
key: 'index',
width: 48,
align: 'center',
fixed: 'left',
hideInSetting: true,
customRender: ({ index }) => index + (tableRef.value?.tableIndex ?? 0)
},
{
title: '用户账号',
dataIndex: 'username',
sorter: true,
ellipsis: true,
defaultSortOrder: 'ascend'
},
{
title: '用户名',
dataIndex: 'nickname',
sorter: true,
ellipsis: true
},
{
title: '性别',
dataIndex: 'sexName',
width: 140,
align: 'center',
sorter: true,
filters: [
{
text: '男',
value: '男'
},
{
text: '女',
value: '女'
}
],
filterMultiple: false,
defaultFilteredValue: ['男']
},
{
title: '手机号',
dataIndex: 'phone',
sorter: true,
ellipsis: true
},
{
title: '创建时间',
dataIndex: 'createTime',
sorter: true,
ellipsis: true,
customRender: ({ text }) => toDateString(text),
width: 180
}
]);
// 表格数据源
const datasource: DatasourceFunction = ({ page, limit, orders, filters }) => {
return pageUsers({ ...orders, ...filters, page, limit });
};
</script>

View File

@@ -254,15 +254,17 @@
</a-card> </a-card>
<a-card title="换电记录" class="order-card"> <a-card title="换电记录" class="order-card">
<a-spin :spinning="loading"> <a-spin :spinning="loading">
<a-table <ele-pro-table
:data-source="equipmentRecordList" :datasource="equipmentRecordList"
:columns="columns3" :columns="columns3"
row-key="id"
ref="tableRef3" ref="tableRef3"
:pagination="false" size="small"
:toolkit="[]"
> >
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'batteryModel'"> <template v-if="column.key === 'batteryModel'">
<div>电池租金:¥{{ record.batteryDeposit }}</div> <div>电池租金:¥{{ record.batteryRent }}</div>
<div>电池押金:¥{{ record.batteryDeposit }}</div> <div>电池押金:¥{{ record.batteryDeposit }}</div>
<div>电池保险:¥{{ record.batteryInsurance }}</div> <div>电池保险:¥{{ record.batteryInsurance }}</div>
</template> </template>
@@ -270,7 +272,7 @@
<span class="ele-text-danger">{{ expirationDay(record) }}</span> <span class="ele-text-danger">{{ expirationDay(record) }}</span>
</template> </template>
</template> </template>
</a-table> </ele-pro-table>
</a-spin> </a-spin>
</a-card> </a-card>
<a-card title="缴费记录" class="order-card"> <a-card title="缴费记录" class="order-card">
@@ -283,7 +285,7 @@
> >
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'batteryModel'"> <template v-if="column.key === 'batteryModel'">
<div>电池租金:¥{{ record.batteryDeposit }}</div> <div>电池租金:¥{{ record.batteryRent }}</div>
<div>电池押金:¥{{ record.batteryDeposit }}</div> <div>电池押金:¥{{ record.batteryDeposit }}</div>
<div>电池保险:¥{{ record.batteryInsurance }}</div> <div>电池保险:¥{{ record.batteryInsurance }}</div>
</template> </template>
@@ -302,6 +304,7 @@
<a-spin :spinning="loading"> <a-spin :spinning="loading">
<ele-image-upload <ele-image-upload
v-model:value="files" v-model:value="files"
da
disabled disabled
:item-style="{ width: '150px', height: '99px' }" :item-style="{ width: '150px', height: '99px' }"
/> />
@@ -329,7 +332,22 @@
: { span: 8 } : { span: 8 }
" "
> >
<a-form-item label="联系电话" name="payPrice" /> <a-form-item label="联系电话" name="receiptPhone">
<span>{{ data.receiptPhone }}</span>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col
v-bind="
styleResponsive
? { xl: 8, lg: 12, md: 12, sm: 24, xs: 24 }
: { span: 8 }
"
>
<a-form-item label="紧急联系人" name="emergentUser">
<span>{{ data.emergentUser }}</span>
</a-form-item>
</a-col> </a-col>
<a-col <a-col
v-bind=" v-bind="
@@ -338,7 +356,9 @@
: { span: 8 } : { span: 8 }
" "
> >
<a-form-item label="所在地区" name="payMethod" /> <a-form-item label="单位地址" name="officeAddress">
<span>{{ data.officeAddress }}</span>
</a-form-item>
</a-col> </a-col>
<a-col <a-col
v-bind=" v-bind="
@@ -347,7 +367,9 @@
: { span: 8 } : { span: 8 }
" "
> >
<a-form-item label="详细地址" name="payMethod" /> <a-form-item label="家庭地址" name="homeAddress">
<span>{{ data.homeAddress }}</span>
</a-form-item>
</a-col> </a-col>
</a-row> </a-row>
</a-card> </a-card>
@@ -363,11 +385,14 @@
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import { copyText } from '@/utils/common'; import { copyText } from '@/utils/common';
import { Order } from '@/api/order/model'; import { Order } from '@/api/order/model';
import type {
DatasourceFunction,
ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types';
import { listEquipmentOrderGoods } from '@/api/apps/equipment/order/goods'; import { listEquipmentOrderGoods } from '@/api/apps/equipment/order/goods';
import { EquipmentOrderGoods } from '@/api/apps/equipment/order/goods/model'; import { EquipmentOrderGoods } from '@/api/apps/equipment/order/goods/model';
import * as EquipmentApi from '@/api/apps/equipment'; import * as EquipmentApi from '@/api/apps/equipment';
import * as EquipmentRecordApi from '@/api/apps/equipment/record'; import * as EquipmentRecordApi from '@/api/apps/equipment/record';
import { ColumnItem } from 'ele-admin-pro/es/ele-pro-table/types';
import { listOrder, listOrderPay } from '@/api/order'; import { listOrder, listOrderPay } from '@/api/order';
import { CopyOutlined } from '@ant-design/icons-vue'; import { CopyOutlined } from '@ant-design/icons-vue';
import { EquipmentRecord } from '@/api/apps/equipment/record/model'; import { EquipmentRecord } from '@/api/apps/equipment/record/model';
@@ -396,7 +421,7 @@
const maxAble = ref(true); const maxAble = ref(true);
const EquipmentOrderGoodsList = ref<EquipmentOrderGoods[]>([]); const EquipmentOrderGoodsList = ref<EquipmentOrderGoods[]>([]);
const renewOrderList = ref<Order[]>([]); const renewOrderList = ref<Order[]>([]);
const equipmentRecordList = ref<EquipmentRecord[]>([]); // const equipmentRecordList = ref<EquipmentRecord[]>([]);
const bindEquipmentCode = ref<string>(); const bindEquipmentCode = ref<string>();
const files = ref<any[]>(); const files = ref<any[]>();
@@ -490,6 +515,26 @@
dataIndex: 'num', dataIndex: 'num',
key: 'num', key: 'num',
customRender: ({}) => 1 customRender: ({}) => 1
},
{
title: '收货人手机号',
key: 'receiptPhone',
dataIndex: 'receiptPhone'
},
{
title: '紧急联系人',
key: 'emergentUser',
dataIndex: 'emergentUser'
},
{
title: '单位地址',
key: 'officeAddress',
dataIndex: 'officeAddress'
},
{
title: '家庭地址',
key: 'homeAddress',
dataIndex: 'homeAddress'
} }
]); ]);
@@ -529,7 +574,7 @@
customRender: ({ text }) => '¥' + text customRender: ({ text }) => '¥' + text
}, },
{ {
title: '设备租金', title: '设备型号',
dataIndex: 'batteryModel', dataIndex: 'batteryModel',
key: 'batteryModel' key: 'batteryModel'
}, },
@@ -543,6 +588,21 @@
dataIndex: 'payTime', dataIndex: 'payTime',
key: 'payTime' key: 'payTime'
}, },
{
title: '电池租金',
dataIndex: 'batteryRent',
key: 'batteryRent'
},
{
title: '电池押金',
dataIndex: 'batteryDeposit',
key: 'batteryDeposit'
},
{
title: '电池保险',
dataIndex: 'batteryInsurance',
key: 'batteryInsurance'
},
{ {
title: '逾期状态', title: '逾期状态',
dataIndex: 'expirationDay', dataIndex: 'expirationDay',
@@ -680,21 +740,34 @@
}; };
const getEquipmentRecordList = () => { /* const getEquipmentRecordList: DatasourceFunction = () => {
EquipmentRecordApi.listEquipmentRecord({ return EquipmentRecordApi.pageEquipmentRecord({
orderId: order.orderId, orderId: order.orderId,
userId: order.userId userId: order.userId,
}).then((data) => { limit: 5
equipmentRecordList.value = data;
}); });
}; */
// 表格实例
const tableRef3 = ref<InstanceType<typeof EleProTable> | null>(null);
const equipmentRecordList: DatasourceFunction = ({
page,
limit,
where,
orders,
filters
}) => {
where.orderId = order.orderId
where.userId = order.userId
return EquipmentRecordApi.pageEquipmentRecord({ ...where, ...orders, page, limit });
}; };
const expirationDay = (order) => { const expirationDay = (order) => {
const setTime = new Date(order.expirationTime); const setTime = new Date(order.expirationTime);
const nowTime = new Date(); const nowTime = new Date();
const restSec = setTime.getTime() - nowTime.getTime(); const restSec = setTime.getTime() - nowTime.getTime();
console.log("计算剩余天数"); // console.log("计算剩余天数");
console.log(restSec); // console.log(restSec);
// 剩余天数 // 剩余天数
const day = parseInt(String(restSec / (60 * 60 * 24 * 1000))); const day = parseInt(String(restSec / (60 * 60 * 24 * 1000)));
if (day < 0) { if (day < 0) {
@@ -730,7 +803,7 @@
getEquipmentOrderGoods(); getEquipmentOrderGoods();
getRenewOrder(); getRenewOrder();
getEquipment(); getEquipment();
getEquipmentRecordList(); // getEquipmentRecordList();
} }
} else { } else {
resetFields(); resetFields();

View File

@@ -3,29 +3,25 @@
<a-space :size="10" style="flex-wrap: wrap"> <a-space :size="10" style="flex-wrap: wrap">
<a-radio-group v-model:value="listType" @change="handleTabs"> <a-radio-group v-model:value="listType" @change="handleTabs">
<a-radio-button :value="0">全部订单</a-radio-button> <a-radio-button :value="0">全部订单</a-radio-button>
<a-radio-button :value="1">待发货</a-radio-button> <!-- <a-radio-button :value="1">待发货</a-radio-button> -->
<a-radio-button :value="2">待收货</a-radio-button> <a-radio-button :value="2">待收货</a-radio-button>
<a-radio-button :value="3">待付款</a-radio-button> <a-radio-button :value="3">待付款</a-radio-button>
<a-radio-button :value="4">已完成</a-radio-button> <!-- <a-radio-button :value="4">已完成</a-radio-button> -->
<a-radio-button :value="5">已取消</a-radio-button> <a-radio-button :value="4">进行中</a-radio-button>
<!-- <a-radio-button :value="5">已取消</a-radio-button> -->
<a-radio-button :value="5">已退租</a-radio-button>
</a-radio-group> </a-radio-group>
<a-button
danger
type="primary"
class="ele-btn-icon"
:disabled="selection.length === 0"
@click="removeBatch"
>
<template #icon>
<delete-outlined />
</template>
<span>批量删除</span>
</a-button>
<a-range-picker <a-range-picker
v-model:value="dateRange" v-model:value="dateRange"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
class="ele-fluid" class="ele-fluid"
/> />
<a-select v-model:value="expire" style="width: 100px; " @change="search">
<a-select-option value="0">到期时间</a-select-option>
<a-select-option value="1">7</a-select-option>
<a-select-option value="2">3</a-select-option>
<a-select-option value="3">已逾期</a-select-option>
</a-select>
<a-input-search <a-input-search
allow-clear allow-clear
placeholder="请输入关键词" placeholder="请输入关键词"
@@ -42,6 +38,19 @@
</a-select> </a-select>
</template> </template>
</a-input-search> </a-input-search>
<a-button
danger
type="primary"
class="ele-btn-icon"
:disabled="selection.length === 0"
@click="removeBatch"
>
<template #icon>
<delete-outlined />
</template>
<span>批量删除</span>
</a-button>
</a-space> </a-space>
</template> </template>
@@ -77,6 +86,7 @@
const type = ref('keywords'); const type = ref('keywords');
// 搜索内容 // 搜索内容
const searchText = ref(''); const searchText = ref('');
const expire = ref('0');
// 日期范围选择 // 日期范围选择
const dateRange = ref<[string, string]>(['', '']); const dateRange = ref<[string, string]>(['', '']);
const listType = ref<number>(0); const listType = ref<number>(0);
@@ -84,20 +94,35 @@
/* 搜索 */ /* 搜索 */
const search = () => { const search = () => {
const [d1, d2] = dateRange.value ?? []; const [d1, d2] = dateRange.value ?? [];
if (type.value == 'orderNo') {
where.orderNo = searchText.value; if(expire.value == '1'){
where.userId = undefined; where.expireDay = 7
} where.isExpire = -1
if (type.value == 'userId') { } else if(expire.value == '2'){
where.userId = searchText.value; where.expireDay = 3
where.orderNo = undefined; where.isExpire = -1
} } else if(expire.value == '3'){
if (type.value == 'merchantCode') { where.isExpire = 1
where.merchantCode = searchText.value; where.expireDay = 0
where.orderNo = undefined; } else {
} where.isExpire = -1
if (type.value == 'keywords') { where.expireDay = 0
where.keywords = searchText.value;
if (type.value == 'orderNo') {
where.orderNo = searchText.value;
where.userId = undefined;
}
if (type.value == 'userId') {
where.userId = searchText.value;
where.orderNo = undefined;
}
if (type.value == 'merchantCode') {
where.merchantCode = searchText.value;
where.orderNo = undefined;
}
if (type.value == 'keywords') {
where.keywords = searchText.value;
}
} }
emit('search', { emit('search', {
...where, ...where,
@@ -116,36 +141,39 @@
const listType = Number(e.target.value); const listType = Number(e.target.value);
// 全部订单 // 全部订单
if (listType == 0) { if (listType == 0) {
console.log('全部订单'); // console.log('全部订单');
} else {
where.isExpire = -1
where.expireDay = 0
} }
// 待发货 // 待发货
if (listType == 1) { // if (listType == 1) {
console.log('待发货'); // console.log('待发货');
where.payStatus = 20; // where.payStatus = 20;
where.deliveryStatus = 10; // where.deliveryStatus = 10;
} // }
// 待收货 // 待收货
if (listType == 2) { if (listType == 2) {
console.log('待发货'); // console.log('待发货');
where.payStatus = 20; where.payStatus = 20;
where.deliveryStatus = 20; where.deliveryStatus <= 20;
where.receiptStatus = 10; where.receiptStatus = 10;
} }
// 待付款 // 待付款
if (listType == 3) { if (listType == 3) {
console.log('待付款'); // console.log('待付款');
where.payStatus = 10; where.payStatus = 10;
} }
// 已完成 // 已完成
if (listType == 4) { if (listType == 4) {
console.log('已完成'); // console.log('已完成');
where.payStatus = 20; where.payStatus = 20;
where.orderStatus = 30; where.orderStatus = 30;
} }
// 已取消 // 已取消
if (listType == 5) { if (listType == 5) {
console.log('已取消'); // console.log('已取消');
where.orderStatus = 20; where.receiptStatus = 30;
} }
emit('search', { emit('search', {
...where ...where

View File

@@ -23,6 +23,11 @@
/> />
</template> </template>
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'restDay'">
<strong v-if="record.restDay < 0" :style="{ color: 'red' }">{{ record.restDay }}</strong>
<span v-else-if="record.restDay >= 0">{{ record.restDay }}</span>
<span> </span>
</template>
<template v-if="column.key === 'merchantName'"> <template v-if="column.key === 'merchantName'">
<div style="display: flex; flex-direction: column"> <div style="display: flex; flex-direction: column">
<span>{{ record.merchantName }}</span> <span>{{ record.merchantName }}</span>
@@ -84,34 +89,23 @@
<div class="ele-text-placeholder"> <div class="ele-text-placeholder">
<!-- 发货状态--> <!-- 发货状态-->
<a-tag v-if="record.deliveryStatus === 10">未发货</a-tag> <a-tag v-if="record.deliveryStatus === 10">未发货</a-tag>
<a-tag v-if="record.deliveryStatus === 20" color="success" <a-tag v-else-if="record.deliveryStatus === 20" color="success"
>已发货</a-tag >已发货</a-tag>
>
</div> </div>
<div class="ele-text-placeholder"> <div class="ele-text-placeholder">
<!-- 收货状态--> <!-- 收货状态-->
<a-tag v-if="record.receiptStatus === 10">未收货</a-tag> <a-tag v-if="record.receiptStatus === 10">未收货</a-tag>
<a-tag v-if="record.receiptStatus === 20" color="success" <a-tag v-else-if="record.receiptStatus === 20" color="success">已收货</a-tag>
>已收货</a-tag <a-tag v-else-if="record.receiptStatus === 21" color="purple">退租中</a-tag>
> <a-tag v-else-if="record.receiptStatus === 30" color="error">已退租</a-tag>
<a-tag v-if="record.receiptStatus === 21" color="purple"
>退租中</a-tag
>
<a-tag v-if="record.receiptStatus === 30" color="error"
>已退租</a-tag
>
</div> </div>
<div class="ele-text-placeholder" v-if="record.orderSource != 10"> <div class="ele-text-placeholder" v-if="record.orderSource != 10">
<!-- 分期状态--> <!-- 分期状态-->
<a-tag v-if="record.fenqiStatus == 1" color="success" <a-tag v-if="record.fenqiStatus == 1" color="success"
>已完成</a-tag >已完成</a-tag
> >
<a-tag v-else-if="record.expirationDay < 0" color="error" <!-- <a-tag v-else-if="record.expirationDay < 0" color="error">逾期{{ record.expirationDay }}</a-tag> -->
>逾期{{ record.expirationDay }}</a-tag <!-- <a-tag v-else-if="record.expirationDay >= 0" color="warning">剩余{{ record.expirationDay }}</a-tag> -->
>
<a-tag v-else-if="record.expirationDay >= 0" color="warning"
>剩余{{ record.expirationDay }}</a-tag
>
</div> </div>
</template> </template>
<template v-if="column.key === 'comments'"> <template v-if="column.key === 'comments'">
@@ -175,13 +169,19 @@
</template> </template>
<template v-if="column.key === 'action'"> <template v-if="column.key === 'action'">
<a-space> <a-space>
<a-button @click="openInfo(record)">详情</a-button> <a-button class="ele-text-primary" @click="openInfo(record)">详情</a-button>
</a-space> </a-space>
<view v-if="record.deliveryStatus == 40">
<a-divider type="vertical" />
<a-button class="ele-text-danger" @click="openChange(record)">换电</a-button>
</view>
</template> </template>
</template> </template>
</ele-pro-table> </ele-pro-table>
</a-card> </a-card>
</div> </div>
<battery-change v-model:visible="showChange" :data="current" @done="reload"/>
<!-- 编辑弹窗 --> <!-- 编辑弹窗 -->
<Delivery v-model:visible="deliveryEdit" :data="current" @done="reload" /> <Delivery v-model:visible="deliveryEdit" :data="current" @done="reload" />
<Markdown <Markdown
@@ -227,10 +227,12 @@
import Markdown from './components/markdown.vue'; import Markdown from './components/markdown.vue';
import Field from './components/field.vue'; import Field from './components/field.vue';
import OrderInfo from './components/order-info.vue'; import OrderInfo from './components/order-info.vue';
import BatteryChange from './components/battery-change.vue';
import { pageOrder, removeOrder, removeBatchOrder } from '@/api/order'; import { pageOrder, removeOrder, removeBatchOrder } from '@/api/order';
import { alipayQuery } from '@/api/system/payment'; import { alipayQuery } from '@/api/system/payment';
import type { Order, OrderParam } from '@/api/order/model'; import type { Order, OrderParam } from '@/api/order/model';
import { getDictionaryOptions } from '@/utils/common'; import { getDictionaryOptions } from '@/utils/common';
import { Equipment } from "@/api/apps/equipment/model";
// 当前用户信息 // 当前用户信息
// const userStore = useUserStore(); // const userStore = useUserStore();
@@ -307,11 +309,11 @@
sorter: true sorter: true
}, },
{ {
title: '逾期天数', title: '剩余天数',
dataIndex: 'expirationDay', dataIndex: 'restDay',
key: 'expirationDay', key: 'restDay',
align: 'center', align: 'center',
sorter: true sorter: false
}, },
{ {
title: '买家', title: '买家',
@@ -360,6 +362,32 @@
// dataIndex: 'orderSourceData', // dataIndex: 'orderSourceData',
// key: 'orderSourceData' // key: 'orderSourceData'
// }, // },
{
title: '推荐人手机号',
key: 'dealerPhone',
dataIndex: 'dealerPhone',
ellipsis: true
},
{
title: '收货人手机号',
key: 'receiptPhone',
dataIndex: 'receiptPhone'
},
{
title: '紧急联系人',
key: 'emergentUser',
dataIndex: 'emergentUser'
},
{
title: '单位地址',
key: 'officeAddress',
dataIndex: 'officeAddress'
},
{
title: '家庭地址',
key: 'homeAddress',
dataIndex: 'homeAddress'
},
{ {
title: '配送方式', title: '配送方式',
key: 'deliveryType', key: 'deliveryType',
@@ -377,6 +405,7 @@
], ],
filterMultiple: false filterMultiple: false
}, },
{ {
title: '创建时间', title: '创建时间',
dataIndex: 'createTime', dataIndex: 'createTime',
@@ -412,6 +441,8 @@
const showInfo = ref(false); const showInfo = ref(false);
// 是否显示编辑弹窗 // 是否显示编辑弹窗
const showEdit = ref(false); const showEdit = ref(false);
// 是否显示换电弹窗
const showChange = ref(false);
const markdown = ref('请输入备注内容'); const markdown = ref('请输入备注内容');
const content = ref('请输入要修改的内容'); const content = ref('请输入要修改的内容');
const showMarkdown = ref(false); const showMarkdown = ref(false);
@@ -490,6 +521,12 @@
showInfo.value = true; showInfo.value = true;
}; };
/* 打开换电弹窗 */
const openChange = (row?: Order) => {
current.value = row ?? null;
showChange.value = true;
};
/* 打开高级搜索 */ /* 打开高级搜索 */
const openAdvanced = () => { const openAdvanced = () => {
showAdvancedSearch.value = !showAdvancedSearch.value; showAdvancedSearch.value = !showAdvancedSearch.value;

View File

@@ -8,11 +8,13 @@
row-key="profitId" row-key="profitId"
:columns="columns" :columns="columns"
:datasource="datasource" :datasource="datasource"
:parse-data="otherData"
v-model:selection="selection" v-model:selection="selection"
tool-class="ele-toolbar-form" tool-class="ele-toolbar-form"
:scroll="{ x: 1200 }" :scroll="{ x: 1200 }"
class="sys-org-table" class="sys-org-table"
:striped="true" :striped="true"
@done="onTableDone"
> >
<template #toolbar> <template #toolbar>
<search <search
@@ -67,6 +69,16 @@
</a-space> --> </a-space> -->
</template> </template>
</template> </template>
<template #summary>
<a-table-summary fixed>
<a-table-summary-row>
<a-table-summary-cell :index="0"></a-table-summary-cell>
<a-table-summary-cell :index="1">合计</a-table-summary-cell>
<a-table-summary-cell :col-span="4"></a-table-summary-cell>
<a-table-summary-cell :index="5">{{amountSummary}}</a-table-summary-cell>
</a-table-summary-row>
</a-table-summary>
</template>
</ele-pro-table> </ele-pro-table>
</a-card> </a-card>
@@ -79,7 +91,8 @@
import type { EleProTable } from 'ele-admin-pro'; import type { EleProTable } from 'ele-admin-pro';
import type { import type {
DatasourceFunction, DatasourceFunction,
ColumnItem ColumnItem,
EleProTableDone
} from 'ele-admin-pro/es/ele-pro-table/types'; } from 'ele-admin-pro/es/ele-pro-table/types';
import { toDateString } from 'ele-admin-pro'; import { toDateString } from 'ele-admin-pro';
import Search from './search.vue'; import Search from './search.vue';
@@ -172,6 +185,12 @@
// 是否显示高级搜索 // 是否显示高级搜索
const showAdvancedSearch = ref(false); const showAdvancedSearch = ref(false);
// 合计
const amountSummary = ref(0);
// 案卷数据
// const data = ref<Profit[]>([]);
// 表格数据源 // 表格数据源
const datasource: DatasourceFunction = ({ const datasource: DatasourceFunction = ({
page, page,
@@ -193,6 +212,23 @@
}); });
}; };
/* 表格数据加载完成事件 */
const onTableDone: EleProTableDone<Profit> = (res) => {
console.log(res);
// data.value = res.data;
/* amountSummary.value = res.data
.map((item) => Number(item.amount))
.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0); */
amountSummary.value = res.response.otherData.total;
};
/* 搜索 */ /* 搜索 */
const reload = (where?: ProfitParam) => { const reload = (where?: ProfitParam) => {
selection.value = []; selection.value = [];

View File

@@ -25,7 +25,7 @@
<a-select v-model:value="type" style="width: 100px; margin: -5px -12px"> <a-select v-model:value="type" style="width: 100px; margin: -5px -12px">
<a-select-option value="keywords">模糊搜索</a-select-option> <a-select-option value="keywords">模糊搜索</a-select-option>
<a-select-option value="orderNo">订单号</a-select-option> <a-select-option value="orderNo">订单号</a-select-option>
<a-select-option value="merchantName">门店名称</a-select-option> <a-select-option value="merchantCode">门店编号</a-select-option>
<a-select-option value="orderUserName">用户名</a-select-option> <a-select-option value="orderUserName">用户名</a-select-option>
</a-select> </a-select>
</template> </template>
@@ -74,8 +74,8 @@
if (type.value == 'orderUserName') { if (type.value == 'orderUserName') {
where.orderUserName = searchText.value; where.orderUserName = searchText.value;
} }
if (type.value == 'merchantName') { if (type.value == 'merchantCode') {
where.merchantName = searchText.value; where.merchantCode = searchText.value;
} }
if (type.value == 'keywords') { if (type.value == 'keywords') {
where.keywords = searchText.value; where.keywords = searchText.value;

View File

@@ -20,6 +20,10 @@
<a-radio :value="30">驳回</a-radio> <a-radio :value="30">驳回</a-radio>
</a-radio-group> </a-radio-group>
</a-form-item> </a-form-item>
<a-form-item label="返还押金" v-if="form.auditStatus === 20" >
<a-input-number :min="0" :max="9999999" v-model:value="form.refundMoney"/>
<span style="marginleft: 10px"> </span>
</a-form-item>
<a-alert v-if="form.auditStatus === 20" message="审核通过后,订单将变更为已退租状态,并且电池设备自动解绑。" type="warning" /> <a-alert v-if="form.auditStatus === 20" message="审核通过后,订单将变更为已退租状态,并且电池设备自动解绑。" type="warning" />
<a-form-item label="驳回原因" v-if="form.auditStatus === 30"> <a-form-item label="驳回原因" v-if="form.auditStatus === 30">
<a-textarea <a-textarea

View File

@@ -142,6 +142,11 @@
key: 'applyDesc', key: 'applyDesc',
ellipsis: true ellipsis: true
}, },
{
title: '实际返还金额',
dataIndex: 'refundMoney',
key: 'refundMoney'
},
{ {
title: '审核状态', title: '审核状态',
key: 'auditStatus', key: 'auditStatus',