This commit is contained in:
weipengfei 2024-07-04 17:59:46 +08:00
parent 74d981c5bd
commit 8f95b9733e
12 changed files with 341 additions and 311 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -50,6 +50,8 @@ const form = ref({
price: 0,
uid: '',
user_ship: '',
village: null,
brigade: null,
});
const cart_id = ref([]);
const isRePay = ref(false);
@ -109,6 +111,8 @@ const handleEnter = () => {
userRechangeAmountApi({
uid: form.value.uid,
user_ship: form.value.user_ship,
village: form.value.village,
brigade: form.value.brigade,
price: form.value.price,
pay_type: pay_type,
auth_code: input.value,
@ -326,6 +330,8 @@ const cashBnt = () => {
userRechangeAmountApi({
uid: form.value.uid,
user_ship: form.value.user_ship,
village: form.value.village,
brigade: form.value.brigade,
price: form.value.price,
pay_type: 17,
})

View File

@ -67,6 +67,7 @@ const printReceipt = (content = "") => {
// -
const letPrintReceipt = (content = "") => {
console.log("预打印");
let str = printTicket(content, true)
console.log(str);
@ -142,7 +143,7 @@ onUnmounted(() => {
justify-content: center;
cursor: pointer;
">
<el-icon color="#fff" size="18" @click="onRefresh">
<el-icon color="#fff" size="25" @click="onRefresh">
<Refresh />
</el-icon>
</div>

View File

@ -41,7 +41,7 @@ onMounted(() => {
<div class="my-code" v-show="type == 1">
<h2>订单核销</h2>
<div class="box">
<input ref="inputRef" v-model="code" placeholder="" class="input" @keyup.enter="handleEnterKey" />
<input ref="inputRef" v-model="code" placeholder="请输入核销码" class="input" @keyup.enter="handleEnterKey" />
<div class="btn" @click="handleEnterKey">查询</div>
</div>
<div class="to-list" @click="handleListed">

View File

@ -129,7 +129,12 @@ onUnmounted(() => {
</div>
<div class="header-input">
<el-input v-model="where.order_id" placeholder="请输入订单编号" @keydown.enter="getOrderList(true)"
@clear="getOrderList(true)" clearable>
@clear="getOrderList(true)" >
<template #suffix>
<el-icon v-if="where.order_id != ''" size="18" @click="where.order_id = '';getOrderList(true)" style="cursor: pointer;margin-right: 0.5rem;">
<CircleClose />
</el-icon>
</template>
<template #append>
<el-button type="primary" style="
background-color: #1890ff;

View File

@ -238,13 +238,12 @@ onUnmounted(() => {
>
</div> -->
</div>
<!-- <div class="update-price">
<div class="update-price">
<el-switch v-model="is_storage" size="large" inline-prompt active-text="存货" inactive-text="不存" />
</div> -->
</div>
</div>
<div class="order-btn">
<el-button class="btn" type="primary" @click="goPay" :disabled="list.length == 0">{{ "立即结账 (F9)"
}}</el-button>
<el-button class="btn" type="primary" @click="goPay" :disabled="list.length == 0">{{ "立即结账 (F9)" }}</el-button>
</div>
</div>
<price ref="priceRef" @changeAllPrice="changeAllPrice"></price>

View File

@ -27,7 +27,7 @@ const name = ref("");
const loadMore = () => {
emit("loadMore", {
store_name_code: name.value,
store_name: name.value,
});
};
@ -86,8 +86,14 @@ onUnmounted(() => {
<div class="header-nav" :class="{ 'input-focus': isfocus }">
<div class="nav-item-label">搜索 (Shift)</div>
<div class="nav-item-input">
<el-input v-model="name" placeholder=" 搜索商品名称/条形码或点击聚焦扫码, 按回车(Enter)搜索" clearable ref="codeRef"
@focus="focus" @blur="blur" @keyup.enter="handleEnter" @clear="handleEnter" />
<el-input v-model="name" placeholder="搜索商品名称/条形码或点击聚焦扫码, 按回车(Enter)搜索" ref="codeRef" @focus="focus"
@blur="blur" @keyup.enter="handleEnter" @clear="handleEnter" style="font-size: 1rem;">
<template #suffix>
<el-icon v-if="name!=''" size="28" @click="name = ''" style="cursor: pointer;margin-right: 1rem;">
<CircleClose />
</el-icon>
</template>
</el-input>
</div>
<div class="nav-item-btn" @click="handleEnter">
<el-button class="btn" type="primary"><el-icon>
@ -288,7 +294,8 @@ onUnmounted(() => {
justify-content: center;
}
}
.no-stock-re{
.no-stock-re {
position: absolute;
top: 0;
left: 0;

View File

@ -43,11 +43,15 @@ const getStoreList = (data = {}, reload = false) => {
...where.value,
...data,
};
console.log("===", data, where.value);
if (reload) {
storeList.value = [];
where.value.page_no = 1;
loadEnd.value = false;
}
if(data.top_cate_id==='') {
where.value.store_name = null;
}
loading.value = true;
saleStoreListApi({
...where.value,
@ -60,11 +64,11 @@ const getStoreList = (data = {}, reload = false) => {
if (res.data?.lists?.length < where.value.page_size) loadEnd.value = true;
storeList.value = storeList.value.concat(res.data.lists);
if (
data.store_name_code &&
data.store_name &&
storeList.value.length == 1 &&
isAllDigits(data.store_name_code)
isAllDigits(data.store_name)
) {
shopRef.value.code = "";
shopRef.value.name = "";
shopRef.value.inputBlur();
changeItem(storeList.value[0]);
}

View File

@ -1,11 +1,11 @@
<script setup>
import { ref, onMounted, onUnmounted } from "vue";
import {
orderListApi,
orderStatusApi,
orderLadingApi,
cartListApi,
saleOrderListApi,
orderListApi,
orderStatusApi,
orderLadingApi,
cartListApi,
saleOrderListApi,
} from "@/api/store.js";
import { useUserStore } from "@/store/user.js";
import { ElMessage } from "element-plus";
@ -15,48 +15,48 @@ import moment from "moment";
const userStore = useUserStore();
const props = defineProps({
isSystem: {
type: Boolean,
default: false,
},
source: {
type: Number,
default: 1,
},
isSystem: {
type: Boolean,
default: false,
},
source: {
type: Number,
default: 1,
},
});
const lists = ref([]);
const tabPosition = ref(1); // 1-, 2-
const changeTabPosition = (e) => {
where.value.page_no = 1;
loadEnd.value = false;
loading.value = false;
orderList.value = [];
getOrderList(true);
where.value.page_no = 1;
loadEnd.value = false;
loading.value = false;
orderList.value = [];
getOrderList(true);
};
const payRef = ref(null);
const date = ref("");
const changeDate = () => {
where.value.start_time = moment(date.value[0]).format('YYYY-MM-DD 00:00:00');
where.value.end_time = moment(date.value[1]).format('YYYY-MM-DD 23:59:59');
getOrderList(true);
where.value.start_time = moment(date.value[0]).format('YYYY-MM-DD 00:00:00');
where.value.end_time = moment(date.value[1]).format('YYYY-MM-DD 23:59:59');
getOrderList(true);
};
const disabledDate = (time)=>{
return time.getTime() > Date.now();
const disabledDate = (time) => {
return time.getTime() > Date.now();
}
const where = ref({
page_no: 1,
page_size: 20,
order_id: "",
start_time: "",
end_time: "",
is_sashier: 1, // 1-, 2-
page_no: 1,
page_size: 20,
order_id: "",
start_time: "",
end_time: "",
is_sashier: 1, // 1-, 2-
});
const loading = ref(false);
@ -66,32 +66,32 @@ const activeStore = ref(0);
const loadEnd = ref(false);
const orderList = ref([]);
const getOrderList = (reload = false) => {
if (reload) where.value.page_no = 1;
else if (loadEnd.value || loading.value) return;
loading.value = true;
if (tabPosition.value == 1) where.value.paid = null;
if (tabPosition.value == 2) where.value.paid = 0;
saleOrderListApi(where.value)
.then((res) => {
if (reload) orderList.value = res.data.lists;
else orderList.value = [...orderList.value, ...res.data.lists];
if (where.value.page_no == 1 && orderList.value.length > 0) mitt.emit("set-sale-order-detail", orderList.value[0]);
if (res.data.lists.length < where.value.page_size) loadEnd.value = true;
else where.value.page_no++;
activeStore.value = 0;
console.log(where.value.page_no);
total.value = res.data.count;
loading.value = false;
})
.catch((err) => {
loadEnd.value = true;
loading.value = false;
});
if (reload) where.value.page_no = 1;
else if (loadEnd.value || loading.value) return;
loading.value = true;
if (tabPosition.value == 1) where.value.paid = null;
if (tabPosition.value == 2) where.value.paid = 0;
saleOrderListApi(where.value)
.then((res) => {
if (reload) orderList.value = res.data.lists;
else orderList.value = [...orderList.value, ...res.data.lists];
if (where.value.page_no == 1 && orderList.value.length > 0) mitt.emit("set-sale-order-detail", orderList.value[0]);
if (res.data.lists.length < where.value.page_size) loadEnd.value = true;
else where.value.page_no++;
activeStore.value = 0;
console.log(where.value.page_no);
total.value = res.data.count;
loading.value = false;
})
.catch((err) => {
loadEnd.value = true;
loading.value = false;
});
};
const setForm = (item, index) => {
activeStore.value = index;
mitt.emit("set-sale-order-detail", item);
activeStore.value = index;
mitt.emit("set-sale-order-detail", item);
};
defineExpose({
@ -99,266 +99,254 @@ defineExpose({
})
onMounted(() => {
mitt.on("update-sale-order-detail", (item) => {
console.log("===");
orderList.value[activeStore.value].paid = 1;
});
mitt.on("update-sale-order-detail", (item) => {
console.log("===");
orderList.value[activeStore.value].paid = 1;
});
});
onUnmounted(()=>{
mitt.off("update-sale-order-detail");
onUnmounted(() => {
mitt.off("update-sale-order-detail");
})
</script>
<template>
<div class="my-order">
<div class="header-nav">
<div class="nav-item">
{{ "收银订单" }}
</div>
<div class="nav-item-btn">
<el-radio-group
v-model="tabPosition"
@change="changeTabPosition"
size="small"
>
<el-radio-button :value="1">全部</el-radio-button>
<el-radio-button :value="2">未支付</el-radio-button>
</el-radio-group>
<el-date-picker
v-model="date"
type="daterange"
start-placeholder="开始时间"
end-placeholder="结束时间"
size="small"
value-format="YYYY/MM/DD"
:disabled-date="disabledDate"
@change="changeDate"
:clearable="false"
style="width: 14rem; margin-left: 1rem"
/>
</div>
</div>
<div class="header-input">
<el-input
v-model="where.order_id"
placeholder="请输入订单编号"
@keydown.enter="getOrderList(true)"
@clear="getOrderList(true)"
clearable
>
<template #append>
<el-button
type="primary"
style="
<div class="my-order">
<div class="header-nav">
<div class="nav-item">
{{ "收银订单" }}
</div>
<div class="nav-item-btn">
<el-radio-group v-model="tabPosition" @change="changeTabPosition" size="small">
<el-radio-button :value="1">全部</el-radio-button>
<el-radio-button :value="2">未支付</el-radio-button>
</el-radio-group>
<el-date-picker v-model="date" type="daterange" start-placeholder="开始时间" end-placeholder="结束时间"
size="small" value-format="YYYY/MM/DD" :disabled-date="disabledDate" @change="changeDate"
:clearable="false" style="width: 14rem; margin-left: 1rem" />
</div>
</div>
<div class="header-input">
<el-input v-model="where.order_id" placeholder="请输入订单编号" @keydown.enter="getOrderList(true)"
@clear="getOrderList(true)">
<template #suffix>
<el-icon v-if="where.order_id != ''" size="18" @click="where.order_id = '';getOrderList(true)" style="cursor: pointer;margin-right: 0.5rem;">
<CircleClose />
</el-icon>
</template>
<template #append>
<el-button type="primary" style="
background-color: #1890ff;
color: #fff;
border-radius: 0 0.315rem 0.315rem 0;
"
@click="getOrderList(true)"
>搜索</el-button
>
</template>
</el-input>
</div>
<div
class="order-lists"
v-loading="loading"
v-infinite-scroll="getOrderList"
:infinite-scroll-distance="300"
:infinite-scroll-delay="500"
style="overflow: auto"
>
<div
class="item"
:class="{ 'item-active': activeStore == index }"
v-for="(item, index) in orderList"
:key="index"
@click="setForm(item, index)"
>
<div class="top">
<div class="sn" :class="'cahier'">单号: {{ item.order_id }}</div>
<div class="create-time">{{ item.pay_time }}</div>
" @click="getOrderList(true)">搜索</el-button>
</template>
</el-input>
</div>
<div class="shop">
<div class="left" v-if="item.product_info">
<el-image
v-for="(shop, imgkey) in item.product_info.slice(0, 5)"
:key="imgkey"
:src="shop.image"
class="shop-img"
></el-image>
<div v-if="item.product_info.length == 1" class="shop-name">
{{ item.product_info[0].store_name }}
</div>
</div>
<div class="right">
<div class="money">¥{{ item.pay_price }}</div>
<div class="count">{{ item.total_num }}款商品</div>
</div>
</div>
<div class="bottom">
<div class="pay">
<div v-if="item.paid">
{{ item.paid_name }}
<spna v-if="item.pay_type_name">({{ item.pay_type_name }})</spna>
<span v-else-if="item.pay_type == 9">(微信收款)</span>
<span v-else-if="item.pay_type == 17">(现金支付)</span>
<span v-else-if="item.pay_type == 13">(支付宝收款)</span>
<span v-else-if="item.pay_type == 3">(余额支付)</span>
<span v-else-if="item.pay_type == 1">(微信支付)</span>
</div>
<div v-else style="color: #ff4a00">{{ item.paid_name }}</div>
</div>
<!-- <div class="cashier" v-if="item.service_info">
<div class="order-lists" v-loading="loading" v-infinite-scroll="getOrderList" :infinite-scroll-distance="300"
:infinite-scroll-delay="500" style="overflow: auto">
<div class="item" :class="{ 'item-active': activeStore == index }" v-for="(item, index) in orderList"
:key="index" @click="setForm(item, index)">
<div class="top">
<div class="sn" :class="'cahier'">单号: {{ item.order_id }}</div>
<div class="create-time">{{ item.pay_time }}</div>
</div>
<div class="shop">
<div class="left" v-if="item.product_info">
<el-image v-for="(shop, imgkey) in item.product_info.slice(0, 5)" :key="imgkey"
:src="shop.image" class="shop-img"></el-image>
<div v-if="item.product_info.length == 1" class="shop-name">
{{ item.product_info[0].store_name }}
</div>
</div>
<div class="right">
<div class="money">¥{{ item.pay_price }}</div>
<div class="count">{{ item.total_num }}款商品</div>
</div>
</div>
<div class="bottom">
<div class="pay">
<div v-if="item.paid">
{{ item.paid_name }}
<spna v-if="item.pay_type_name">({{ item.pay_type_name }})</spna>
<span v-else-if="item.pay_type == 9">(微信收款)</span>
<span v-else-if="item.pay_type == 17">(现金支付)</span>
<span v-else-if="item.pay_type == 13">(支付宝收款)</span>
<span v-else-if="item.pay_type == 3">(余额支付)</span>
<span v-else-if="item.pay_type == 1">(微信支付)</span>
</div>
<div v-else style="color: #ff4a00">{{ item.paid_name }}</div>
</div>
<!-- <div class="cashier" v-if="item.service_info">
收银员: {{ item.service_info.nickname }}
</div>
<div class="cashier" v-else>平台订单</div> -->
</div>
</div>
<div v-if="loadEnd" class="load-end">没有更多了</div>
<div v-if="loading" class="load-end">加载中...</div>
</div>
</div>
<div v-if="loadEnd" class="load-end">没有更多了</div>
<div v-if="loading" class="load-end">加载中...</div>
</div>
</div>
</template>
<style scoped lang="scss">
.my-order {
border-radius: 1.2rem;
height: 100%;
background-color: #fff;
width: 30rem;
position: relative;
overflow: hidden;
border-radius: 1.2rem;
height: 100%;
background-color: #fff;
width: 30rem;
position: relative;
overflow: hidden;
.header-nav {
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 1rem;
height: 3.5rem;
.header-nav {
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 1rem;
height: 3.5rem;
span {
color: #ff4a00;
}
.nav-item {
font-weight: bold;
}
.nav-item-btn {
display: flex;
justify-content: space-between;
align-items: center;
}
}
.header-input {
padding: 1rem;
padding-top: 0;
height: 2.5rem;
border-bottom: 1px solid #eee;
}
.order-lists {
height: calc(100vh - 100px - 10.2rem);
overflow-y: auto;
.item {
padding: 1rem;
border-bottom: 1px solid #eee;
.top {
display: flex;
justify-content: space-between;
align-items: flex-end;
.sn {
font-weight: bold;
font-size: 0.9rem;
}
.cahier {
&::before {
content: "收银";
font-weight: 400;
font-size: 0.7rem;
padding: 0.1rem 0.1rem;
margin-right: 0.2rem;
border: 1px solid #2ec479;
color: #2ec479;
border-radius: 0.187rem;
}
}
.cahier2 {
&::before {
content: "平台";
font-weight: 400;
font-size: 0.7rem;
padding: 0.1rem 0.1rem;
margin-right: 0.2rem;
border: 1px solid #ff4a00;
span {
color: #ff4a00;
border-radius: 0.187rem;
}
}
.create-time {
font-size: 0.8rem;
}
}
.shop {
display: flex;
justify-content: space-between;
.right {
flex-shrink: 0;
display: flex;
flex-direction: column;
justify-content: center;
.money {
font-size: 1rem;
color: #ff4a00;
.nav-item {
font-weight: bold;
}
.count {
font-size: 0.7rem;
color: #999;
}
}
.left {
height: 4.5rem;
display: flex;
align-items: center;
.shop-img {
width: 3.5rem;
height: 3.5rem;
border-radius: 0.3rem;
margin-right: 0.4rem;
}
.shop-name {
font-size: 0.9rem;
color: #333;
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden;
/* 将文本限制为三行 */
-webkit-line-clamp: 3;
}
.nav-item-btn {
display: flex;
justify-content: space-between;
align-items: center;
}
}
.bottom {
display: flex;
justify-content: space-between;
font-size: 0.9rem;
color: #777;
.manage-btn {
color: #fff;
background-color: #e6a23c;
border-radius: 0.2rem;
padding: 0 0.2rem;
margin-left: 0.5rem;
}
}
}
.item-active {
background-color: #efefef;
.header-input {
padding: 1rem;
padding-top: 0;
height: 2.5rem;
border-bottom: 1px solid #eee;
}
.order-lists {
height: calc(100vh - 100px - 10.2rem);
overflow-y: auto;
.item {
padding: 1rem;
border-bottom: 1px solid #eee;
.top {
display: flex;
justify-content: space-between;
align-items: flex-end;
.sn {
font-weight: bold;
font-size: 0.9rem;
}
.cahier {
&::before {
content: "收银";
font-weight: 400;
font-size: 0.7rem;
padding: 0.1rem 0.1rem;
margin-right: 0.2rem;
border: 1px solid #2ec479;
color: #2ec479;
border-radius: 0.187rem;
}
}
.cahier2 {
&::before {
content: "平台";
font-weight: 400;
font-size: 0.7rem;
padding: 0.1rem 0.1rem;
margin-right: 0.2rem;
border: 1px solid #ff4a00;
color: #ff4a00;
border-radius: 0.187rem;
}
}
.create-time {
font-size: 0.8rem;
}
}
.shop {
display: flex;
justify-content: space-between;
.right {
flex-shrink: 0;
display: flex;
flex-direction: column;
justify-content: center;
.money {
font-size: 1rem;
color: #ff4a00;
font-weight: bold;
}
.count {
font-size: 0.7rem;
color: #999;
}
}
.left {
height: 4.5rem;
display: flex;
align-items: center;
.shop-img {
width: 3.5rem;
height: 3.5rem;
border-radius: 0.3rem;
margin-right: 0.4rem;
}
.shop-name {
font-size: 0.9rem;
color: #333;
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden;
/* 将文本限制为三行 */
-webkit-line-clamp: 3;
}
}
}
.bottom {
display: flex;
justify-content: space-between;
font-size: 0.9rem;
color: #777;
.manage-btn {
color: #fff;
background-color: #e6a23c;
border-radius: 0.2rem;
padding: 0 0.2rem;
margin-left: 0.5rem;
}
}
}
.item-active {
background-color: #efefef;
}
}
.load-end {
text-align: center;
padding: 1rem;
color: #333;
font-size: 0.8rem;
}
}
.load-end {
text-align: center;
padding: 1rem;
color: #333;
font-size: 0.8rem;
}
}
</style>

View File

@ -232,21 +232,31 @@ const updateAddress = async () => {
...addressInfo.value,
uid: formData.value.id
}).then(res => {
ElMessage.success('编辑成功')
selectedEd.value = JSON.parse(JSON.stringify(selectedValues.value))
ElMessage.success('编辑成功');
isDisabled.value = true;
})
}).catch(err => {
cancelUpdate();
} )
}
const cancelUpdate = () => {
selectedValues.value = JSON.parse(JSON.stringify(selectedEd.value))
if(selectedEd.value.length>0){
addressInfo.value.city = selectedEd.value[0]
addressInfo.value.area = selectedEd.value[1]
addressInfo.value.street = selectedEd.value[2]
addressInfo.value.village = selectedEd.value[3]
addressInfo.value.brigade = selectedEd.value[4]
}
isDisabled.value = true;
}
const isDisabled = ref(true);
const activeStore = ref(0);
const activeStoreList = ref(["基本信息"]);
// const activeStoreList = ref(["", ""]);
// const activeStoreList = ref([""]);
const activeStoreList = ref(["基本信息", "用户资产"]);
const isOut = ref(false); //
const productList = ref([]); //
@ -363,7 +373,9 @@ const shipRecharge = () => {
data: {
uid: formData.value.id,
price: shipForm.value.money,
user_ship: shipForm.value.user_ship
user_ship: shipForm.value.user_ship,
village: addressInfo.value.village,
brigade: addressInfo.value.brigade
}
});
payRef.value.drawer = true;
@ -372,11 +384,12 @@ const shipRecharge = () => {
})
}
const rechargeMoney = (type) => {
if(selectedEd.value.length == 0) return ElMessage.error("请先选择用户地址");
shipForm.value.type = type;
if (type == 'add') {
shipForm.value.user_ship = formData.value.user_ship;
shipForm.value.user_ship_name = formData.value.user_ship_name;
changeShip(shipForm.value.user_ship)
changeShip(shipForm.value.user_ship);
}
dialogFormShip.value = true;
}
@ -391,8 +404,10 @@ onMounted(() => {
data.phone = data.mobile + '';
delete data.mobile;
formData.value = Object.assign(res, data);
console.log(formData.value);
// console.log(formData.value);
})
selectedValues.value = [];
selectedEd.value = [];
getAddress();
initProduct(true);
shipForm.value = {
@ -528,7 +543,7 @@ onUnmounted(() => {
<div class="info-item-title">用户地址:</div>
<el-cascader :key="formData.id" style="flex: 1;" v-model="selectedValues" :options="options"
:props="props" :load="loadOptions" class="w-full" :disabled="isDisabled" />
<el-button v-if="isDisabled" type="primary" style="margin-left: 1rem;"
<el-button v-if="isDisabled && !selectedEd.length" type="primary" style="margin-left: 1rem;"
@click="isDisabled = false">修改</el-button>
<el-button v-if="!isDisabled" type="primary" style="margin-left: 1rem;"
@click="updateAddress">确认</el-button>

View File

@ -225,7 +225,12 @@ onUnmounted(() => {
</div>
<div class="header-input">
<el-input v-model="where.mobile" placeholder="搜索手机号" @keydown.enter="getOrderList(true)"
@clear="getOrderList(true)" clearable>
@clear="getOrderList(true)" >
<template #suffix>
<el-icon v-if="where.mobile != ''" size="18" @click="where.mobile = '';getOrderList(true)" style="cursor: pointer;margin-right: 0.5rem;">
<CircleClose />
</el-icon>
</template>
<template #append>
<el-button type="primary" style="
background-color: #1890ff;