This commit is contained in:
parent
5449b2301c
commit
2bebabf1bc
|
@ -1,4 +1,5 @@
|
|||
VITE_NOW_TYPE = 'dist'
|
||||
|
||||
# VITE_BASE_URL = 'http://192.168.1.10:8546'
|
||||
VITE_BASE_URL = 'https://erp.lihaink.cn'
|
||||
VITE_PUSH_URL = 'ws://192.168.1.22:8787'
|
||||
VITE_BASE_URL = 'http://192.168.1.22:8546'
|
||||
# VITE_BASE_URL = 'https://erp.lihaink.cn'
|
|
@ -1,3 +1,4 @@
|
|||
VITE_NOW_TYPE = 'build'
|
||||
|
||||
VITE_PUSH_URL = 'ws://192.168.1.22:3133'
|
||||
VITE_BASE_URL = 'https://shop.lihaink.cn'
|
|
@ -15,6 +15,7 @@
|
|||
"mitt": "^3.0.1",
|
||||
"moment": "^2.30.1",
|
||||
"pinia": "^2.1.7",
|
||||
"print-js": "^1.6.0",
|
||||
"sass": "^1.72.0",
|
||||
"vue": "^3.4.21",
|
||||
"vue-router": "^4.3.0"
|
||||
|
@ -1469,6 +1470,11 @@
|
|||
"postcss": "^8.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/print-js": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/print-js/-/print-js-1.6.0.tgz",
|
||||
"integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg=="
|
||||
},
|
||||
"node_modules/proxy-from-env": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
"mitt": "^3.0.1",
|
||||
"moment": "^2.30.1",
|
||||
"pinia": "^2.1.7",
|
||||
"print-js": "^1.6.0",
|
||||
"sass": "^1.72.0",
|
||||
"vue": "^3.4.21",
|
||||
"vue-router": "^4.3.0"
|
||||
|
|
20
src/App.vue
20
src/App.vue
|
@ -1,13 +1,14 @@
|
|||
<script setup>
|
||||
import { onMounted } from 'vue'
|
||||
import { onMounted } from "vue";
|
||||
|
||||
onMounted(() => {
|
||||
document.body.style.setProperty('--el-color-primary', '#1890ff');
|
||||
document.body.style.setProperty('--el-upload-picture-card-size', '60px');
|
||||
document.body.style.setProperty('--el-upload-list-picture-card-size', '60px');
|
||||
})
|
||||
document.body.style.setProperty("--el-color-primary", "#1890ff");
|
||||
document.body.style.setProperty("--el-upload-picture-card-size", "60px");
|
||||
document.body.style.setProperty("--el-upload-list-picture-card-size", "60px");
|
||||
});
|
||||
const screenWidth = window.innerWidth;
|
||||
console.log('当前屏幕宽度:', screenWidth);
|
||||
console.log("当前屏幕宽度:", screenWidth);
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
@ -15,13 +16,14 @@ const screenWidth = window.innerWidth;
|
|||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
.el-button:focus{
|
||||
.el-button:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
// 取消input的上下箭头
|
||||
input::-webkit-outer-spin-button, input::-webkit-inner-spin-button {
|
||||
input::-webkit-outer-spin-button,
|
||||
input::-webkit-inner-spin-button {
|
||||
-webkit-appearance: none;
|
||||
margin: 0;
|
||||
margin: 0;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -73,6 +73,6 @@ export function saleStoreListApi(data) {
|
|||
/**
|
||||
* @description 店铺商品分类
|
||||
*/
|
||||
export function merchantCategoryListApi(id, data) {
|
||||
return request.get(`store/merchant/category/lst/${id}`, { params: data })
|
||||
export function merchantCategoryListApi(data) {
|
||||
return request.get(`goods/goodsclass/lists`, { params: data })
|
||||
}
|
|
@ -26,21 +26,21 @@ export function cartChangeApi(id, data) {
|
|||
* @description 结算
|
||||
*/
|
||||
export function orderCheckApi(data) {
|
||||
return request.post(`v2/order/check`, data)
|
||||
return request.post(`/order/RetailOrder/checkOrder`, data)
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 删除商品
|
||||
*/
|
||||
export function cartDeleteApi(data) {
|
||||
return request.post(`user/cart/delete`, data)
|
||||
return request.post(`/order/cart/delete`, data)
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 支付
|
||||
*/
|
||||
export function orderCreateApi(data) {
|
||||
return request.post(`v2/order/create`, data)
|
||||
return request.post(`/order/RetailOrder/createOrder`, data)
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -60,8 +60,8 @@ export function orderStatusApi(data) {
|
|||
/**
|
||||
* @description 订单列表
|
||||
*/
|
||||
export function orderListApi(id, data) {
|
||||
return request.get(`admin/${id}/order_list`, { params: data })
|
||||
export function orderListApi(data) {
|
||||
return request.get(`/order/retailOrder/merchant_order_list`, { params: data })
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -108,8 +108,22 @@ export function orderPriceApi(mer_id, data) {
|
|||
|
||||
|
||||
/**
|
||||
* @description 批发订单列表
|
||||
* @description 收银订单列表
|
||||
*/
|
||||
export function saleOrderListApi(mer_id, data) {
|
||||
return request.get(`order/list`, { params: data })
|
||||
export function saleOrderListApi(data) {
|
||||
return request.get(`/order/retailOrder/order_list`, { params: data })
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 采购订单提交
|
||||
*/
|
||||
export function createOrderApi(data) {
|
||||
return request.get(`/order/OpurchaseOrder/createOrder`, { params: data })
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 订单商品列表
|
||||
*/
|
||||
export function cashierinfoListApi(data) {
|
||||
return request.get(`/order/cashierinfo/lists`, { params: data })
|
||||
}
|
|
@ -0,0 +1,751 @@
|
|||
|
||||
|
||||
export const Push = function Push(options) {
|
||||
this.doNotConnect = 0;
|
||||
options = options || {};
|
||||
options.heartbeat = options.heartbeat || 25000;
|
||||
options.pingTimeout = options.pingTimeout || 10000;
|
||||
this.config = options;
|
||||
this.uid = 0;
|
||||
this.channels = {};
|
||||
this.connection = null;
|
||||
this.pingTimeoutTimer = 0;
|
||||
Push.instances.push(this);
|
||||
this.createConnection();
|
||||
}
|
||||
|
||||
Push.prototype.checkoutPing = function() {
|
||||
var _this = this;
|
||||
_this.checkoutPingTimer && clearTimeout(_this.checkoutPingTimer);
|
||||
_this.checkoutPingTimer = setTimeout(function () {
|
||||
_this.checkoutPingTimer = 0;
|
||||
if (_this.connection.state === 'connected') {
|
||||
_this.connection.send('{"event":"pusher:ping","data":{}}');
|
||||
if (_this.pingTimeoutTimer) {
|
||||
clearTimeout(_this.pingTimeoutTimer);
|
||||
_this.pingTimeoutTimer = 0;
|
||||
}
|
||||
_this.pingTimeoutTimer = setTimeout(function () {
|
||||
_this.connection.closeAndClean();
|
||||
if (!_this.connection.doNotConnect) {
|
||||
_this.connection.waitReconnect();
|
||||
}
|
||||
}, _this.config.pingTimeout);
|
||||
}
|
||||
}, this.config.heartbeat);
|
||||
};
|
||||
|
||||
Push.prototype.channel = function (name) {
|
||||
return this.channels.find(name);
|
||||
};
|
||||
Push.prototype.allChannels = function () {
|
||||
return this.channels.all();
|
||||
};
|
||||
Push.prototype.createConnection = function () {
|
||||
if (this.connection) {
|
||||
throw Error('Connection already exist');
|
||||
}
|
||||
var _this = this;
|
||||
var url = this.config.url;
|
||||
function updateSubscribed () {
|
||||
for (var i in _this.channels) {
|
||||
_this.channels[i].subscribed = false;
|
||||
}
|
||||
}
|
||||
this.connection = new Connection({
|
||||
url: url,
|
||||
app_key: this.config.app_key,
|
||||
onOpen: function () {
|
||||
_this.connection.state ='connecting';
|
||||
_this.checkoutPing();
|
||||
},
|
||||
onMessage: function(params) {
|
||||
if(_this.pingTimeoutTimer) {
|
||||
clearTimeout(_this.pingTimeoutTimer);
|
||||
_this.pingTimeoutTimer = 0;
|
||||
}
|
||||
|
||||
params = JSON.parse(params.data);
|
||||
var event = params.event;
|
||||
var channel_name = params.channel;
|
||||
|
||||
if (event === 'pusher:pong') {
|
||||
_this.checkoutPing();
|
||||
return;
|
||||
}
|
||||
if (event === 'pusher:error') {
|
||||
throw Error(params.data.message);
|
||||
}
|
||||
var data = JSON.parse(params.data), channel;
|
||||
if (event === 'pusher_internal:subscription_succeeded') {
|
||||
channel = _this.channels[channel_name];
|
||||
channel.subscribed = true;
|
||||
channel.processQueue();
|
||||
channel.emit('pusher:subscription_succeeded');
|
||||
return;
|
||||
}
|
||||
if (event === 'pusher:connection_established') {
|
||||
_this.connection.socket_id = data.socket_id;
|
||||
_this.connection.updateNetworkState('connected');
|
||||
_this.subscribeAll();
|
||||
}
|
||||
if (event.indexOf('pusher_internal') !== -1) {
|
||||
console.log("Event '"+event+"' not implement");
|
||||
return;
|
||||
}
|
||||
channel = _this.channels[channel_name];
|
||||
if (channel) {
|
||||
channel.emit(event, data);
|
||||
}
|
||||
},
|
||||
onClose: function () {
|
||||
updateSubscribed();
|
||||
},
|
||||
onError: function () {
|
||||
updateSubscribed();
|
||||
}
|
||||
});
|
||||
};
|
||||
Push.prototype.disconnect = function () {
|
||||
this.connection.doNotConnect = 1;
|
||||
this.connection.close();
|
||||
};
|
||||
|
||||
Push.prototype.subscribeAll = function () {
|
||||
if (this.connection.state !== 'connected') {
|
||||
return;
|
||||
}
|
||||
for (var channel_name in this.channels) {
|
||||
//this.connection.send(JSON.stringify({event:"pusher:subscribe", data:{channel:channel_name}}));
|
||||
this.channels[channel_name].processSubscribe();
|
||||
}
|
||||
};
|
||||
|
||||
Push.prototype.unsubscribe = function (channel_name) {
|
||||
if (this.channels[channel_name]) {
|
||||
delete this.channels[channel_name];
|
||||
if (this.connection.state === 'connected') {
|
||||
this.connection.send(JSON.stringify({event:"pusher:unsubscribe", data:{channel:channel_name}}));
|
||||
}
|
||||
}
|
||||
};
|
||||
Push.prototype.unsubscribeAll = function () {
|
||||
var channels = Object.keys(this.channels);
|
||||
if (channels.length) {
|
||||
if (this.connection.state === 'connected') {
|
||||
for (var channel_name in this.channels) {
|
||||
this.unsubscribe(channel_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.channels = {};
|
||||
};
|
||||
Push.prototype.subscribe = function (channel_name) {
|
||||
if (this.channels[channel_name]) {
|
||||
return this.channels[channel_name];
|
||||
}
|
||||
if (channel_name.indexOf('private-') === 0) {
|
||||
return createPrivateChannel(channel_name, this);
|
||||
}
|
||||
if (channel_name.indexOf('presence-') === 0) {
|
||||
return createPresenceChannel(channel_name, this);
|
||||
}
|
||||
return createChannel(channel_name, this);
|
||||
};
|
||||
Push.instances = [];
|
||||
|
||||
function createChannel(channel_name, push)
|
||||
{
|
||||
var channel = new Channel(push.connection, channel_name);
|
||||
push.channels[channel_name] = channel;
|
||||
channel.subscribeCb = function () {
|
||||
push.connection.send(JSON.stringify({event:"pusher:subscribe", data:{channel:channel_name}}));
|
||||
}
|
||||
channel.processSubscribe();
|
||||
return channel;
|
||||
}
|
||||
|
||||
function createPrivateChannel(channel_name, push)
|
||||
{
|
||||
var channel = new Channel(push.connection, channel_name);
|
||||
push.channels[channel_name] = channel;
|
||||
channel.subscribeCb = function () {
|
||||
__ajax({
|
||||
url: push.config.auth,
|
||||
type: 'POST',
|
||||
data: {channel_name: channel_name, socket_id: push.connection.socket_id},
|
||||
success: function (data) {
|
||||
data = JSON.parse(data);
|
||||
data.channel = channel_name;
|
||||
push.connection.send(JSON.stringify({event:"pusher:subscribe", data:data}));
|
||||
},
|
||||
error: function (e) {
|
||||
throw Error(e);
|
||||
}
|
||||
});
|
||||
};
|
||||
channel.processSubscribe();
|
||||
return channel;
|
||||
}
|
||||
|
||||
function createPresenceChannel(channel_name, push)
|
||||
{
|
||||
return createPrivateChannel(channel_name, push);
|
||||
}
|
||||
|
||||
/*window.addEventListener('online', function(){
|
||||
var con;
|
||||
for (var i in Push.instances) {
|
||||
con = Push.instances[i].connection;
|
||||
con.reconnectInterval = 1;
|
||||
if (con.state === 'connecting') {
|
||||
con.connect();
|
||||
}
|
||||
}
|
||||
});*/
|
||||
|
||||
|
||||
function Connection(options) {
|
||||
this.dispatcher = new Dispatcher();
|
||||
__extends(this, this.dispatcher);
|
||||
var properies = ['on', 'off', 'emit'];
|
||||
for (var i in properies) {
|
||||
this[properies[i]] = this.dispatcher[properies[i]];
|
||||
}
|
||||
this.options = options;
|
||||
this.state = 'initialized'; //initialized connecting connected disconnected
|
||||
this.doNotConnect = 0;
|
||||
this.reconnectInterval = 1;
|
||||
this.connection = null;
|
||||
this.reconnectTimer = 0;
|
||||
this.connect();
|
||||
}
|
||||
|
||||
Connection.prototype.updateNetworkState = function(state){
|
||||
var old_state = this.state;
|
||||
this.state = state;
|
||||
if (old_state !== state) {
|
||||
this.emit('state_change', { previous: old_state, current: state });
|
||||
}
|
||||
};
|
||||
|
||||
Connection.prototype.connect = function () {
|
||||
this.doNotConnect = 0;
|
||||
if (this.state === 'connected') {
|
||||
console.log('networkState is "' + this.state + '" and do not need connect');
|
||||
return;
|
||||
}
|
||||
if (this.reconnectTimer) {
|
||||
clearTimeout(this.reconnectTimer);
|
||||
this.reconnectTimer = 0;
|
||||
}
|
||||
|
||||
this.closeAndClean();
|
||||
|
||||
var options = this.options;
|
||||
var websocket = new WebSocket(options.url+'/app/'+options.app_key);
|
||||
|
||||
this.updateNetworkState('connecting');
|
||||
|
||||
var _this = this;
|
||||
websocket.onopen = function (res) {
|
||||
_this.reconnectInterval = 1;
|
||||
if (_this.doNotConnect) {
|
||||
_this.updateNetworkState('disconnected');
|
||||
websocket.close();
|
||||
return;
|
||||
}
|
||||
if (options.onOpen) {
|
||||
options.onOpen(res);
|
||||
}
|
||||
};
|
||||
|
||||
if (options.onMessage) {
|
||||
websocket.onmessage = options.onMessage;
|
||||
}
|
||||
|
||||
websocket.onclose = function (res) {
|
||||
websocket.onmessage = websocket.onopen = websocket.onclose = websocket.onerror = null;
|
||||
_this.updateNetworkState('disconnected');
|
||||
if (!_this.doNotConnect) {
|
||||
_this.waitReconnect();
|
||||
}
|
||||
if (options.onClose) {
|
||||
options.onClose(res);
|
||||
}
|
||||
};
|
||||
|
||||
websocket.onerror = function (res) {
|
||||
_this.close();
|
||||
if (!_this.doNotConnect) {
|
||||
_this.waitReconnect();
|
||||
}
|
||||
if (options.onError) {
|
||||
options.onError(res);
|
||||
}
|
||||
};
|
||||
this.connection = websocket;
|
||||
}
|
||||
|
||||
Connection.prototype.closeAndClean = function () {
|
||||
if(this.connection) {
|
||||
var websocket = this.connection;
|
||||
websocket.onmessage = websocket.onopen = websocket.onclose = websocket.onerror = null;
|
||||
try {
|
||||
websocket.close();
|
||||
} catch (e) {}
|
||||
this.updateNetworkState('disconnected');
|
||||
}
|
||||
};
|
||||
|
||||
Connection.prototype.waitReconnect = function () {
|
||||
if (this.state === 'connected' || this.state === 'connecting') {
|
||||
return;
|
||||
}
|
||||
if (!this.doNotConnect) {
|
||||
this.updateNetworkState('connecting');
|
||||
var _this = this;
|
||||
if (this.reconnectTimer) {
|
||||
clearTimeout(this.reconnectTimer);
|
||||
}
|
||||
this.reconnectTimer = setTimeout(function(){
|
||||
_this.connect();
|
||||
}, this.reconnectInterval);
|
||||
if (this.reconnectInterval < 1000) {
|
||||
this.reconnectInterval = 1000;
|
||||
} else {
|
||||
// 每次重连间隔增大一倍
|
||||
this.reconnectInterval = this.reconnectInterval * 2;
|
||||
}
|
||||
// 有网络的状态下,重连间隔最大2秒
|
||||
if (this.reconnectInterval > 2000 && navigator.onLine) {
|
||||
_this.reconnectInterval = 2000;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Connection.prototype.send = function(data) {
|
||||
if (this.state !== 'connected') {
|
||||
console.trace('networkState is "' + this.state + '", can not send ' + data);
|
||||
return;
|
||||
}
|
||||
this.connection.send(data);
|
||||
}
|
||||
|
||||
Connection.prototype.close = function(){
|
||||
this.updateNetworkState('disconnected');
|
||||
this.connection.close();
|
||||
}
|
||||
|
||||
var __extends = (this && this.__extends) || function (d, b) {
|
||||
for (var p in b) if (b.hasOwnProperty(p)) {d[p] = b[p];}
|
||||
function __() { this.constructor = d; }
|
||||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||||
};
|
||||
|
||||
function Channel(connection, channel_name) {
|
||||
this.subscribed = false;
|
||||
this.dispatcher = new Dispatcher();
|
||||
this.connection = connection;
|
||||
this.channelName = channel_name;
|
||||
this.subscribeCb = null;
|
||||
this.queue = [];
|
||||
__extends(this, this.dispatcher);
|
||||
var properies = ['on', 'off', 'emit'];
|
||||
for (var i in properies) {
|
||||
this[properies[i]] = this.dispatcher[properies[i]];
|
||||
}
|
||||
}
|
||||
|
||||
Channel.prototype.processSubscribe = function () {
|
||||
if (this.connection.state !== 'connected') {
|
||||
return;
|
||||
}
|
||||
this.subscribeCb();
|
||||
};
|
||||
|
||||
Channel.prototype.processQueue = function () {
|
||||
if (this.connection.state !== 'connected' || !this.subscribed) {
|
||||
return;
|
||||
}
|
||||
for (var i in this.queue) {
|
||||
this.queue[i]();
|
||||
}
|
||||
this.queue = [];
|
||||
};
|
||||
|
||||
Channel.prototype.trigger = function (event, data) {
|
||||
if (event.indexOf('client-') !== 0) {
|
||||
throw new Error("Event '" + event + "' should start with 'client-'");
|
||||
}
|
||||
var _this = this;
|
||||
this.queue.push(function () {
|
||||
_this.connection.send(JSON.stringify({ event: event, data: data, channel: _this.channelName }));
|
||||
});
|
||||
this.processQueue();
|
||||
};
|
||||
|
||||
////////////////
|
||||
var Collections = (function () {
|
||||
var exports = {};
|
||||
function extend(target) {
|
||||
var sources = [];
|
||||
for (var _i = 1; _i < arguments.length; _i++) {
|
||||
sources[_i - 1] = arguments[_i];
|
||||
}
|
||||
for (var i = 0; i < sources.length; i++) {
|
||||
var extensions = sources[i];
|
||||
for (var property in extensions) {
|
||||
if (extensions[property] && extensions[property].constructor &&
|
||||
extensions[property].constructor === Object) {
|
||||
target[property] = extend(target[property] || {}, extensions[property]);
|
||||
}
|
||||
else {
|
||||
target[property] = extensions[property];
|
||||
}
|
||||
}
|
||||
}
|
||||
return target;
|
||||
}
|
||||
|
||||
exports.extend = extend;
|
||||
function stringify() {
|
||||
var m = ["Push"];
|
||||
for (var i = 0; i < arguments.length; i++) {
|
||||
if (typeof arguments[i] === "string") {
|
||||
m.push(arguments[i]);
|
||||
}
|
||||
else {
|
||||
m.push(safeJSONStringify(arguments[i]));
|
||||
}
|
||||
}
|
||||
return m.join(" : ");
|
||||
}
|
||||
|
||||
exports.stringify = stringify;
|
||||
function arrayIndexOf(array, item) {
|
||||
var nativeIndexOf = Array.prototype.indexOf;
|
||||
if (array === null) {
|
||||
return -1;
|
||||
}
|
||||
if (nativeIndexOf && array.indexOf === nativeIndexOf) {
|
||||
return array.indexOf(item);
|
||||
}
|
||||
for (var i = 0, l = array.length; i < l; i++) {
|
||||
if (array[i] === item) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
exports.arrayIndexOf = arrayIndexOf;
|
||||
function objectApply(object, f) {
|
||||
for (var key in object) {
|
||||
if (Object.prototype.hasOwnProperty.call(object, key)) {
|
||||
f(object[key], key, object);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exports.objectApply = objectApply;
|
||||
function keys(object) {
|
||||
var keys = [];
|
||||
objectApply(object, function (_, key) {
|
||||
keys.push(key);
|
||||
});
|
||||
return keys;
|
||||
}
|
||||
|
||||
exports.keys = keys;
|
||||
function values(object) {
|
||||
var values = [];
|
||||
objectApply(object, function (value) {
|
||||
values.push(value);
|
||||
});
|
||||
return values;
|
||||
}
|
||||
|
||||
exports.values = values;
|
||||
function apply(array, f, context) {
|
||||
for (var i = 0; i < array.length; i++) {
|
||||
f.call(context || (window), array[i], i, array);
|
||||
}
|
||||
}
|
||||
|
||||
exports.apply = apply;
|
||||
function map(array, f) {
|
||||
var result = [];
|
||||
for (var i = 0; i < array.length; i++) {
|
||||
result.push(f(array[i], i, array, result));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
exports.map = map;
|
||||
function mapObject(object, f) {
|
||||
var result = {};
|
||||
objectApply(object, function (value, key) {
|
||||
result[key] = f(value);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
exports.mapObject = mapObject;
|
||||
function filter(array, test) {
|
||||
test = test || function (value) {
|
||||
return !!value;
|
||||
};
|
||||
var result = [];
|
||||
for (var i = 0; i < array.length; i++) {
|
||||
if (test(array[i], i, array, result)) {
|
||||
result.push(array[i]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
exports.filter = filter;
|
||||
function filterObject(object, test) {
|
||||
var result = {};
|
||||
objectApply(object, function (value, key) {
|
||||
if ((test && test(value, key, object, result)) || Boolean(value)) {
|
||||
result[key] = value;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
exports.filterObject = filterObject;
|
||||
function flatten(object) {
|
||||
var result = [];
|
||||
objectApply(object, function (value, key) {
|
||||
result.push([key, value]);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
exports.flatten = flatten;
|
||||
function any(array, test) {
|
||||
for (var i = 0; i < array.length; i++) {
|
||||
if (test(array[i], i, array)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
exports.any = any;
|
||||
function all(array, test) {
|
||||
for (var i = 0; i < array.length; i++) {
|
||||
if (!test(array[i], i, array)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
exports.all = all;
|
||||
function encodeParamsObject(data) {
|
||||
return mapObject(data, function (value) {
|
||||
if (typeof value === "object") {
|
||||
value = safeJSONStringify(value);
|
||||
}
|
||||
return encodeURIComponent(base64_1["default"](value.toString()));
|
||||
});
|
||||
}
|
||||
|
||||
exports.encodeParamsObject = encodeParamsObject;
|
||||
function buildQueryString(data) {
|
||||
var params = filterObject(data, function (value) {
|
||||
return value !== undefined;
|
||||
});
|
||||
return map(flatten(encodeParamsObject(params)), util_1["default"].method("join", "=")).join("&");
|
||||
}
|
||||
|
||||
exports.buildQueryString = buildQueryString;
|
||||
function decycleObject(object) {
|
||||
var objects = [], paths = [];
|
||||
return (function derez(value, path) {
|
||||
var i, name, nu;
|
||||
switch (typeof value) {
|
||||
case 'object':
|
||||
if (!value) {
|
||||
return null;
|
||||
}
|
||||
for (i = 0; i < objects.length; i += 1) {
|
||||
if (objects[i] === value) {
|
||||
return {$ref: paths[i]};
|
||||
}
|
||||
}
|
||||
objects.push(value);
|
||||
paths.push(path);
|
||||
if (Object.prototype.toString.apply(value) === '[object Array]') {
|
||||
nu = [];
|
||||
for (i = 0; i < value.length; i += 1) {
|
||||
nu[i] = derez(value[i], path + '[' + i + ']');
|
||||
}
|
||||
}
|
||||
else {
|
||||
nu = {};
|
||||
for (name in value) {
|
||||
if (Object.prototype.hasOwnProperty.call(value, name)) {
|
||||
nu[name] = derez(value[name], path + '[' + JSON.stringify(name) + ']');
|
||||
}
|
||||
}
|
||||
}
|
||||
return nu;
|
||||
case 'number':
|
||||
case 'string':
|
||||
case 'boolean':
|
||||
return value;
|
||||
}
|
||||
}(object, '$'));
|
||||
}
|
||||
|
||||
exports.decycleObject = decycleObject;
|
||||
function safeJSONStringify(source) {
|
||||
try {
|
||||
return JSON.stringify(source);
|
||||
}
|
||||
catch (e) {
|
||||
return JSON.stringify(decycleObject(source));
|
||||
}
|
||||
}
|
||||
|
||||
exports.safeJSONStringify = safeJSONStringify;
|
||||
return exports;
|
||||
})();
|
||||
|
||||
var Dispatcher = (function () {
|
||||
function Dispatcher(failThrough) {
|
||||
this.callbacks = new CallbackRegistry();
|
||||
this.global_callbacks = [];
|
||||
this.failThrough = failThrough;
|
||||
}
|
||||
Dispatcher.prototype.on = function (eventName, callback, context) {
|
||||
this.callbacks.add(eventName, callback, context);
|
||||
return this;
|
||||
};
|
||||
Dispatcher.prototype.on_global = function (callback) {
|
||||
this.global_callbacks.push(callback);
|
||||
return this;
|
||||
};
|
||||
Dispatcher.prototype.off = function (eventName, callback, context) {
|
||||
this.callbacks.remove(eventName, callback, context);
|
||||
return this;
|
||||
};
|
||||
Dispatcher.prototype.emit = function (eventName, data) {
|
||||
var i;
|
||||
for (i = 0; i < this.global_callbacks.length; i++) {
|
||||
this.global_callbacks[i](eventName, data);
|
||||
}
|
||||
var callbacks = this.callbacks.get(eventName);
|
||||
if (callbacks && callbacks.length > 0) {
|
||||
for (i = 0; i < callbacks.length; i++) {
|
||||
callbacks[i].fn.call(callbacks[i].context || (window), data);
|
||||
}
|
||||
}
|
||||
else if (this.failThrough) {
|
||||
this.failThrough(eventName, data);
|
||||
}
|
||||
return this;
|
||||
};
|
||||
return Dispatcher;
|
||||
}());
|
||||
|
||||
var CallbackRegistry = (function () {
|
||||
function CallbackRegistry() {
|
||||
this._callbacks = {};
|
||||
}
|
||||
CallbackRegistry.prototype.get = function (name) {
|
||||
return this._callbacks[prefix(name)];
|
||||
};
|
||||
CallbackRegistry.prototype.add = function (name, callback, context) {
|
||||
var prefixedEventName = prefix(name);
|
||||
this._callbacks[prefixedEventName] = this._callbacks[prefixedEventName] || [];
|
||||
this._callbacks[prefixedEventName].push({
|
||||
fn: callback,
|
||||
context: context
|
||||
});
|
||||
};
|
||||
CallbackRegistry.prototype.remove = function (name, callback, context) {
|
||||
if (!name && !callback && !context) {
|
||||
this._callbacks = {};
|
||||
return;
|
||||
}
|
||||
var names = name ? [prefix(name)] : Collections.keys(this._callbacks);
|
||||
if (callback || context) {
|
||||
this.removeCallback(names, callback, context);
|
||||
}
|
||||
else {
|
||||
this.removeAllCallbacks(names);
|
||||
}
|
||||
};
|
||||
CallbackRegistry.prototype.removeCallback = function (names, callback, context) {
|
||||
Collections.apply(names, function (name) {
|
||||
this._callbacks[name] = Collections.filter(this._callbacks[name] || [], function (oning) {
|
||||
return (callback && callback !== oning.fn) ||
|
||||
(context && context !== oning.context);
|
||||
});
|
||||
if (this._callbacks[name].length === 0) {
|
||||
delete this._callbacks[name];
|
||||
}
|
||||
}, this);
|
||||
};
|
||||
CallbackRegistry.prototype.removeAllCallbacks = function (names) {
|
||||
Collections.apply(names, function (name) {
|
||||
delete this._callbacks[name];
|
||||
}, this);
|
||||
};
|
||||
return CallbackRegistry;
|
||||
}());
|
||||
function prefix(name) {
|
||||
return "_" + name;
|
||||
}
|
||||
|
||||
function __ajax(options){
|
||||
options=options||{};
|
||||
options.type=(options.type||'GET').toUpperCase();
|
||||
options.dataType=options.dataType||'json';
|
||||
params=formatParams(options.data);
|
||||
|
||||
var xhr;
|
||||
if(window.XMLHttpRequest){
|
||||
xhr=new XMLHttpRequest();
|
||||
}else{
|
||||
xhr=ActiveXObject('Microsoft.XMLHTTP');
|
||||
}
|
||||
|
||||
xhr.onreadystatechange=function(){
|
||||
if(xhr.readyState === 4){
|
||||
var status=xhr.status;
|
||||
if(status>=200 && status<300){
|
||||
options.success&&options.success(xhr.responseText,xhr.responseXML);
|
||||
}else{
|
||||
options.error&&options.error(status);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(options.type==='GET'){
|
||||
xhr.open('GET',options.url+'?'+params,true);
|
||||
xhr.send(null);
|
||||
}else if(options.type==='POST'){
|
||||
xhr.open('POST',options.url,true);
|
||||
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
|
||||
xhr.send(params);
|
||||
}
|
||||
}
|
||||
|
||||
function formatParams(data){
|
||||
var arr=[];
|
||||
for(var name in data){
|
||||
arr.push(encodeURIComponent(name)+'='+encodeURIComponent(data[name]));
|
||||
}
|
||||
return arr.join('&');
|
||||
}
|
||||
|
||||
// export const push = {
|
||||
// a:6
|
||||
// }
|
|
@ -51,7 +51,7 @@ const setForm = (e) => {
|
|||
};
|
||||
|
||||
const setRePay = (e) => {
|
||||
form.value.order_price = e.price;
|
||||
form.value.total = e.price;
|
||||
order_id.value = e.order_id;
|
||||
};
|
||||
|
||||
|
@ -88,7 +88,7 @@ const handleEnter = () => {
|
|||
if (order_id.value) orderPay(order_id.value);
|
||||
else {
|
||||
let pay_type;
|
||||
if (regexWechat.test(input.value)) pay_type = "micropay";
|
||||
if (regexWechat.test(input.value)) pay_type = "9";
|
||||
else if (regexPay.test(input.value)) pay_type = "alipayBar";
|
||||
else {
|
||||
loading.value = false;
|
||||
|
@ -102,16 +102,15 @@ const handleEnter = () => {
|
|||
cart_id: cart_id.value,
|
||||
pay_type: pay_type,
|
||||
auth_code: input.value,
|
||||
staff_id: userStore.userInfo.service.service_id,
|
||||
})
|
||||
.then((res) => {
|
||||
if (res.status == 200 && (res.message == "支付成功" || res.message == "success")) {
|
||||
if (res.data.trade_state == 'SUCCESS') {
|
||||
drawer.value = false;
|
||||
ElMessage({
|
||||
message: res.message=='success'?'支付成功':res.message,
|
||||
message: res.data.trade_state_desc || '支付成功',
|
||||
type: "success",
|
||||
});
|
||||
audioplay(res.data.message||res.data.result.message);
|
||||
if(res.data.message) audioplay(res.data.message);
|
||||
beforeClose();
|
||||
} else {
|
||||
if (!res.data.group_order_sn) {
|
||||
|
@ -160,13 +159,13 @@ const orderPay = (id) => {
|
|||
};
|
||||
orderPayApi(id, query)
|
||||
.then((res) => {
|
||||
if (res.status == 200 && (res.message == "支付成功" || res.message == "success")) {
|
||||
if (res.data.trade_state == 'SUCCESS') {
|
||||
drawer.value = false;
|
||||
ElMessage({
|
||||
message: res.message=='success'?'支付成功':res.message,
|
||||
type: "success",
|
||||
});
|
||||
audioplay(res.data.message||res.data.result.message);
|
||||
if(res.data.message) audioplay(res.data.message);
|
||||
beforeClose();
|
||||
} else {
|
||||
order_id.value = res.data.group_order_id;
|
||||
|
@ -193,16 +192,16 @@ const getOrderStatus = (id) => {
|
|||
order_sn: id,
|
||||
})
|
||||
.then((res) => {
|
||||
if (res.data.paid == 1 || res.message == "支付成功") {
|
||||
if (res.data.trade_state == 'SUCCESS') {
|
||||
ElMessage({
|
||||
message: res.message,
|
||||
type: "success",
|
||||
});
|
||||
audioplay(res.data.message);
|
||||
if(res.data.message) audioplay(res.data.message);
|
||||
beforeClose();
|
||||
} else {
|
||||
ElMessage({
|
||||
message: res.message,
|
||||
message: res.data.trade_state=='USERPAYING' ? '用户正在支付中' : res.message,
|
||||
type: "error",
|
||||
});
|
||||
input.value = "";
|
||||
|
@ -256,7 +255,7 @@ const collection = ref(""); //输入的金额
|
|||
const changePrice = computed(() => {
|
||||
// 找零
|
||||
if (+collection.value > 0) {
|
||||
return (collection.value - form.value.order_price).toFixed(2);
|
||||
return (collection.value - form.value.total).toFixed(2);
|
||||
}
|
||||
return -1;
|
||||
});
|
||||
|
@ -298,26 +297,24 @@ const cashBnt = () => {
|
|||
changePrice.value === "" ||
|
||||
changePrice.value === null ||
|
||||
changePrice.value === undefined ||
|
||||
+collection.value < +form.value.order_price
|
||||
+collection.value < +form.value.total
|
||||
) return ElMessage.error("收款金额应该大于等于应收金额");
|
||||
if (order_id.value) orderPay(order_id.value);
|
||||
else
|
||||
orderCreateApi({
|
||||
address_id: "",
|
||||
key: form.value.key,
|
||||
cart_id: cart_id.value,
|
||||
pay_type: "cash_payment",
|
||||
staff_id: userStore.userInfo.service.service_id,
|
||||
})
|
||||
.then((res) => {
|
||||
if (res.status == 200 && res.message == "支付成功") {
|
||||
if (res.data.trade_state == 'SUCCESS') {
|
||||
drawer.value = false;
|
||||
ElMessage({
|
||||
message: res.message,
|
||||
type: "success",
|
||||
});
|
||||
changeActive(1);
|
||||
audioplay(res.data.message);
|
||||
if(res.data.message) audioplay(res.data.message);
|
||||
beforeClose();
|
||||
} else {
|
||||
if (!res.data.group_order_sn) {
|
||||
|
@ -462,7 +459,7 @@ onUnmounted(() => {
|
|||
</div>
|
||||
<div style="color: #999; padding: 2rem 0 0.3rem 0">应收金额(元):</div>
|
||||
<div style="color: #f5222d; padding-bottom: 2rem">
|
||||
¥<span style="font-size: 1.6rem">{{ form.order_price }}</span>
|
||||
¥<span style="font-size: 1.6rem">{{ form.total }}</span>
|
||||
</div>
|
||||
<div
|
||||
v-loading="loading"
|
||||
|
@ -513,7 +510,7 @@ onUnmounted(() => {
|
|||
><el-icon><Delete /></el-icon
|
||||
></el-button>
|
||||
<el-button @click="delNum(-1)">C</el-button>
|
||||
<el-button class="enter" :class="{'enter-disable': +collection < +form.order_price}" :disabled="+collection < +form.order_price" @click="cashBnt">
|
||||
<el-button class="enter" :class="{'enter-disable': +collection < +form.total}" :disabled="+collection < +form.total" @click="cashBnt">
|
||||
确认
|
||||
</el-button>
|
||||
</div>
|
||||
|
|
|
@ -3,9 +3,28 @@ import myHeader from "./myHeader.vue";
|
|||
import myAside from "./myAside.vue";
|
||||
import { ref, nextTick, onMounted, onUnmounted } from "vue";
|
||||
import mitt from "@/utils/mitt.js";
|
||||
import { useUserStore } from "@/store/user.js";
|
||||
import { Push } from "@/common/push.js";
|
||||
|
||||
const userStore = useUserStore();
|
||||
const connection = new Push({
|
||||
url: import.meta.env.VITE_PUSH_URL, // websocket地址
|
||||
app_key: '2ce3ce22329517213caa7dad261f5695',
|
||||
});
|
||||
|
||||
|
||||
// 浏览器监听user-1
|
||||
const user_channel = connection.subscribe(`user-${userStore.userInfo.id}`);
|
||||
// const user_channel = connection.subscribe(`user-${1}`);
|
||||
|
||||
// 当user-2频道有message事件的消息时
|
||||
user_channel.on('message', function (data) {
|
||||
console.log("收到消息--",data, JSON.parse(data.content));
|
||||
});
|
||||
// 断线事件
|
||||
user_channel.on('close', function () {
|
||||
|
||||
});
|
||||
|
||||
const KeyboardEvent = (e)=>{
|
||||
console.log('按下', e.keyCode);
|
||||
|
|
|
@ -10,14 +10,10 @@ const navTo = (name) => {
|
|||
router.push({ name });
|
||||
};
|
||||
const list = ref([
|
||||
{ name: "home", title: "收银", ico: "Sell", count: 0 },
|
||||
{ name: "order", title: "收银订单", ico: "DataLine", count: 0 },
|
||||
{ name: "orderSystem", title: "平台订单", ico: "DataAnalysis", count: 0 },
|
||||
{ name: "saleHome", title: "批发", ico: "Van", count: 0 },
|
||||
{ name: "saleOrder", title: "批发订单", ico: "Tickets", count: 0 },
|
||||
{ name: "convert", title: "核销", ico: "FullScreen", count: 0 },
|
||||
{ name: "shop", title: "商品", ico: "ShoppingBag", count: 0 },
|
||||
{ name: "orderCount", title: "订单统计", ico: "PieChart", count: 0 },
|
||||
{ name: "saleHome", title: "收银", ico: "Sell", count: 0 },
|
||||
{ name: "saleOrder", title: "收银订单", ico: "DataLine", count: 0 },
|
||||
{ name: "order", title: "待提采购", ico: "DataAnalysis", count: 0 },
|
||||
{ name: "orderSystem", title: "采购订单", ico: "Tickets", count: 0 },
|
||||
]);
|
||||
const aup = () => {
|
||||
let index = list.value.findIndex((item) => item.name == route.name);
|
||||
|
|
|
@ -3,7 +3,7 @@ import { useUserStore } from "@/store/user.js";
|
|||
import { ref } from "vue";
|
||||
import { info, logout } from "@/api/user.js";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { useRouter } from 'vue-router'
|
||||
import { useRouter } from "vue-router";
|
||||
|
||||
const userStore = useUserStore();
|
||||
|
||||
|
@ -12,25 +12,18 @@ merInfo.value = userStore.userInfo;
|
|||
|
||||
const router = useRouter();
|
||||
const onLogout = () => {
|
||||
logout().then(() => {
|
||||
userStore.setUserInfo({});
|
||||
userStore.setToken("");
|
||||
router.push("/login");
|
||||
}).catch(() => {
|
||||
ElMessage({
|
||||
message: "退出失败",
|
||||
type: "error",
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
userStore.setUserInfo({});
|
||||
userStore.setToken("");
|
||||
router.push("/login");
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="my-card">
|
||||
<div class="card-header">
|
||||
<div style="width: 4.5rem;">
|
||||
<el-image style="height: 2.5rem;width: 2.5rem;margin: 0 auto;"
|
||||
<div style="width: 4.5rem">
|
||||
<el-image
|
||||
style="height: 2.5rem; width: 2.5rem; margin: 0 auto"
|
||||
src="https://lihai001.oss-cn-chengdu.aliyuncs.com/def/12c93202404101530591311.png"
|
||||
></el-image>
|
||||
</div>
|
||||
|
@ -39,7 +32,7 @@ const onLogout = () => {
|
|||
<div class="card-body">
|
||||
<el-dropdown trigger="hover">
|
||||
<div class="el-dropdown-link">
|
||||
<el-avatar :src="merInfo.avatar" icon="user-filled"/>
|
||||
<el-avatar :src="merInfo.avatar" icon="user-filled" />
|
||||
<div class="info">
|
||||
<div>
|
||||
{{ merInfo.nickname }}
|
||||
|
@ -75,20 +68,20 @@ const onLogout = () => {
|
|||
}
|
||||
}
|
||||
}
|
||||
.el-dropdown-link{
|
||||
width: auto;
|
||||
.el-dropdown-link {
|
||||
width: auto;
|
||||
display: flex;
|
||||
color: #fff;
|
||||
align-items: center;
|
||||
.info {
|
||||
margin: 0 0.5rem;
|
||||
display: flex;
|
||||
color: #fff;
|
||||
align-items: center;
|
||||
.info{
|
||||
margin: 0 0.5rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-around;
|
||||
height: 100%;
|
||||
}
|
||||
flex-direction: column;
|
||||
justify-content: space-around;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.el-dropdown{
|
||||
border: none;
|
||||
.el-dropdown {
|
||||
border: none;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -62,7 +62,7 @@ const routes = [
|
|||
path: '/convert',
|
||||
name: 'convert',
|
||||
component: () => import('@/views/convert/index.vue'),
|
||||
}
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
|
@ -70,6 +70,11 @@ const routes = [
|
|||
name: 'login',
|
||||
component: () => import('@/views/login/index.vue'),
|
||||
},
|
||||
{
|
||||
path: '/test',
|
||||
name: 'test',
|
||||
component: () => import('@/views/test/test.vue'),
|
||||
},
|
||||
// 注意:通配符路由要放在最后
|
||||
{
|
||||
path: '/:catchAll(.*)',
|
||||
|
|
|
@ -6,7 +6,7 @@ import config from "@/config";
|
|||
|
||||
const request = axios.create({
|
||||
baseURL: config.url,
|
||||
timeout: 10000
|
||||
timeout: 60000
|
||||
})
|
||||
|
||||
|
||||
|
@ -32,7 +32,7 @@ request.interceptors.request.use(
|
|||
request.interceptors.response.use(
|
||||
response => {
|
||||
// 对响应数据做些什么,例如解析数据、统一处理错误等
|
||||
if (response.data.status === 401 || response.data.status === 40000) {
|
||||
if (response.data.status === 401 || response.data.status === 40000 || (response.data.code === -1 && response.data.msg === '登录超时,请重新登录')) {
|
||||
ElMessage({
|
||||
message: response.data.message,
|
||||
type: 'error',
|
||||
|
@ -51,6 +51,12 @@ request.interceptors.response.use(
|
|||
})
|
||||
throw new Error(response.data.message);
|
||||
}
|
||||
if (response.data.show) {
|
||||
ElMessage({
|
||||
message: response.data.msg,
|
||||
type: 'error',
|
||||
})
|
||||
}
|
||||
return response.data;
|
||||
},
|
||||
error => {
|
||||
|
|
|
@ -12,8 +12,8 @@ const accRef = ref(null);
|
|||
const pwdRef = ref(null);
|
||||
|
||||
const formLogin = ref({
|
||||
account: "xiao123",
|
||||
password: "123456",
|
||||
account: "",
|
||||
password: "",
|
||||
terminal: 3,
|
||||
scene: 1,
|
||||
});
|
||||
|
@ -31,11 +31,12 @@ const onLogin = () => {
|
|||
});
|
||||
login(formLogin.value)
|
||||
.then((res) => {
|
||||
console.log(res);
|
||||
if (res.data?.token) {
|
||||
if(!res.data.merchant||!res.data.merchant.service_phone) return ElMessage.error("请先完善商户信息");
|
||||
userStore.setToken(res.data.token);
|
||||
userStore.setUserInfo(res.data);
|
||||
router.push("/");
|
||||
// router.push("/test");
|
||||
}
|
||||
})
|
||||
.catch((err) => {});
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
<script setup>
|
||||
import { ref } from "vue";
|
||||
import { onMounted, onUnmounted, ref } from "vue";
|
||||
import {
|
||||
orderListApi,
|
||||
orderStatusApi,
|
||||
orderLadingApi,
|
||||
cartListApi,
|
||||
cashierinfoListApi,
|
||||
} from "@/api/store.js";
|
||||
import { useUserStore } from "@/store/user.js";
|
||||
import { ElMessage } from "element-plus";
|
||||
|
@ -15,9 +16,8 @@ import pay from "@/components/pay.vue";
|
|||
const userStore = useUserStore();
|
||||
const router = useRouter();
|
||||
|
||||
const formData = ref({});
|
||||
mitt.on("set-order-detail", (res) => {
|
||||
formData.value = res;
|
||||
const formData = ref({
|
||||
id: "",
|
||||
});
|
||||
|
||||
const list = ref([]);
|
||||
|
@ -39,7 +39,7 @@ const orderLading = () => {
|
|||
dialogVisible.value = false;
|
||||
orderLadingApi({
|
||||
order_sn: orderLadingSn.value,
|
||||
staff_id: userStore.userInfo.service.service_id
|
||||
staff_id: userStore.userInfo.service.service_id,
|
||||
}).then((res) => {
|
||||
ElMessage({
|
||||
message: res.message,
|
||||
|
@ -69,7 +69,7 @@ const getOrderStatus = (id) => {
|
|||
message: res.message,
|
||||
type: "success",
|
||||
});
|
||||
mitt.emit("update-order-detail", {});
|
||||
mitt.emit("update-c-order-detail", {});
|
||||
formData.value.paid = 1;
|
||||
} else {
|
||||
ElMessage({
|
||||
|
@ -80,85 +80,80 @@ const getOrderStatus = (id) => {
|
|||
})
|
||||
.catch((err) => {});
|
||||
};
|
||||
|
||||
const where = ref({
|
||||
page_no: 1,
|
||||
page_size: 15,
|
||||
loadend: false,
|
||||
loading: false,
|
||||
});
|
||||
const goods_list = ref([]);
|
||||
const getOrderList = () => {
|
||||
console.log("触底");
|
||||
if (formData.value.id && !where.value.loadend) {
|
||||
console.log("加载");
|
||||
where.value.loading = true;
|
||||
cashierinfoListApi({
|
||||
pid: formData.value.id,
|
||||
page_no: where.value.page_no,
|
||||
page_size: where.value.page_size,
|
||||
}).then((res) => {
|
||||
goods_list.value = [...goods_list.value, ...res.data.lists];
|
||||
if (res.data.lists.length < where.value.page_size)
|
||||
where.value.loadend = true;
|
||||
where.value.loading = false;
|
||||
where.value.page_no++;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
onMounted(() => {
|
||||
|
||||
mitt.on("set-c-order-detail", (res) => {
|
||||
formData.value = res;
|
||||
where.value.page_no = 1;
|
||||
where.value.loadend = false;
|
||||
where.value.loading = false;
|
||||
goods_list.value = [];
|
||||
getOrderList();
|
||||
});
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
mitt.off("set-c-order-detail");
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="my-order">
|
||||
<div class="header-nav">
|
||||
<div
|
||||
v-for="(item, index) in activeStoreList"
|
||||
:key="index"
|
||||
class="nav-item"
|
||||
:class="{
|
||||
'nav-item-active': activeStore == index,
|
||||
'nav-item-radius1': activeStore == index + 1,
|
||||
'nav-item-radius2': activeStore == index - 1,
|
||||
}"
|
||||
@click="activeStore = index"
|
||||
>
|
||||
{{ item }}
|
||||
</div>
|
||||
<div
|
||||
class="nav-item"
|
||||
:class="{
|
||||
'nav-item-radius2': activeStore == activeStoreList.length - 1,
|
||||
}"
|
||||
style="flex: 1"
|
||||
></div>
|
||||
</div>
|
||||
<div class="detail" v-loading="loading">
|
||||
<div class="table" v-if="formData.orderProduct && activeStore == 0">
|
||||
<div style="font-size: 0.9rem">
|
||||
共计
|
||||
<span style="color: #ff4a00">{{ formData.total_num }}</span> 件商品
|
||||
</div>
|
||||
<el-table
|
||||
style="height: calc(100vh - 100px - 14rem)"
|
||||
:data="formData.orderProduct"
|
||||
>
|
||||
<el-table-column prop="cart_info.product.store_name" label="商品信息">
|
||||
<template #default="{ row }">
|
||||
<div style="display: flex; align-items: center">
|
||||
<el-image
|
||||
style="height: 3rem; width: 3rem"
|
||||
:src="
|
||||
row.cart_info.productAttr.image ||
|
||||
row.cart_info.product.image
|
||||
"
|
||||
></el-image>
|
||||
<span style="margin-left: 0.5rem">{{
|
||||
row.cart_info.product.store_name
|
||||
}}</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="cart_info.productAttr.price"
|
||||
label="单价"
|
||||
width="150"
|
||||
/>
|
||||
<el-table-column prop="product_num" label="数量" width="150" />
|
||||
<el-table-column prop="total_price" label="总价" width="150" />
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="table" v-if="formData.orderProduct && activeStore == 1">
|
||||
<div
|
||||
class="table"
|
||||
v-loading="loading"
|
||||
v-infinite-scroll="getOrderList"
|
||||
infinite-scroll-distance="300"
|
||||
infinite-scroll-delay="300"
|
||||
style="overflow: auto"
|
||||
:infinite-scroll-immediate="false"
|
||||
>
|
||||
<div class="table-title">订单信息</div>
|
||||
<div class="table-info">
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">创建时间:</div>
|
||||
<div class="info-item-info">{{ formData.create_time }}</div>
|
||||
<div class="info-item-title">订单编号:</div>
|
||||
<div class="info-item-info">{{ formData.number }}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">商品总数:</div>
|
||||
<div class="info-item-info">{{ formData.total_num }}</div>
|
||||
<div class="info-item-title">商品款数:</div>
|
||||
<div class="info-item-info">{{ formData.goods_count }}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">商品总价:</div>
|
||||
<div class="info-item-info">¥{{ formData.total_price }}</div>
|
||||
<div class="info-item-info">¥{{ formData.total }}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">支付时间:</div>
|
||||
<div class="info-item-info">{{ formData.pay_time }}</div>
|
||||
<div class="info-item-title">创建时间:</div>
|
||||
<div class="info-item-info">{{ formData.create_time }}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">优惠抵扣:</div>
|
||||
|
@ -166,95 +161,72 @@ const getOrderStatus = (id) => {
|
|||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">实际支付:</div>
|
||||
<div class="info-item-info">¥{{ formData.pay_price }}</div>
|
||||
<div class="info-item-info">¥{{ formData.actual }}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">支付时间:</div>
|
||||
<div class="info-item-info">{{ formData.update_time }}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">支付方式:</div>
|
||||
<div class="info-item-info">
|
||||
<span v-if="formData.pay_type == 11">微信收款</span>
|
||||
<span v-if="formData.pay_type == 12">现金支付</span>
|
||||
<span v-if="formData.pay_type == 13">支付宝收款</span>
|
||||
<span v-if="formData.pay_type == 0">余额支付</span>
|
||||
<span v-if="formData.pay_type == 1">微信支付</span>
|
||||
<span v-if="formData.pay_type == 9">商户余额支付</span>
|
||||
<span v-if="formData.pay_type == 10">对公转账</span>
|
||||
<span v-if="formData.pay_type == 9">微信收款</span>
|
||||
<span v-if="formData.pay_type == 1">余额支付</span>
|
||||
<span v-if="formData.pay_type == 3">微信支付</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-title" v-if="formData.service_info">收银员信息</div>
|
||||
<div class="table-title">收货人信息</div>
|
||||
<div
|
||||
class="table-info"
|
||||
v-if="formData.service_info"
|
||||
v-if="formData.user_phone"
|
||||
style="flex-direction: column"
|
||||
>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">头像:</div>
|
||||
<div class="info-item-title">收货人:</div>
|
||||
<div class="info-item-info">
|
||||
<el-image
|
||||
style="height: 4rem; width: 4rem; border-radius: 50%"
|
||||
:src="formData.service_info.avatar"
|
||||
></el-image>
|
||||
{{ formData.real_name }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">昵称:</div>
|
||||
<div class="info-item-title">联系方式:</div>
|
||||
<div class="info-item-info">
|
||||
{{ formData.service_info.nickname }}
|
||||
{{ formData.user_phone }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">账号:</div>
|
||||
<div class="info-item-title">收货地址:</div>
|
||||
<div class="info-item-info">
|
||||
{{ formData.service_info.account }}
|
||||
{{ formData.user_address }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer" v-if="formData.service_info">
|
||||
<div class="info">
|
||||
<div class="ser">收银员: {{ formData.service_info.nickname }}</div>
|
||||
<div class="price">
|
||||
实付: <span>¥{{ formData.pay_price }}</span>
|
||||
</div>
|
||||
<div v-else class="add-address">
|
||||
<el-button type="primary" @click="addAddress()" size="Large" >点击添加收货地址</el-button>
|
||||
</div>
|
||||
<div class="handle" v-if="!formData.paid">
|
||||
<el-button class="btn" type="primary" @click="rePay(formData)"
|
||||
>重新支付</el-button
|
||||
>
|
||||
<el-button
|
||||
class="btn"
|
||||
type="primary"
|
||||
@click="getOrderStatus(formData.order_sn)"
|
||||
>检测状态</el-button
|
||||
>
|
||||
<el-button
|
||||
class="btn"
|
||||
type="success"
|
||||
@click="orderLadingComfirm(formData.order_sn)"
|
||||
>提单</el-button
|
||||
>
|
||||
<div style="font-size: 0.9rem">
|
||||
共计
|
||||
<span style="color: #ff4a00">{{ formData.goods_count }}</span> 款商品
|
||||
</div>
|
||||
<div class="handle" v-else>已支付</div>
|
||||
<el-table :data="goods_list">
|
||||
<el-table-column label="商品信息">
|
||||
<template #default="{ row }">
|
||||
<div style="display: flex; align-items: center">
|
||||
<el-image
|
||||
style="height: 3rem; width: 3rem"
|
||||
:src="row.imgs"
|
||||
></el-image>
|
||||
<span style="margin-left: 0.5rem">{{ row.goods_name }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="price" label="单价" width="150" />
|
||||
<el-table-column prop="nums" label="数量" width="150" />
|
||||
<el-table-column prop="total" label="总价" width="150">
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
<pay ref="payRef" />
|
||||
<el-dialog v-model="dialogVisible" title="提示" width="500">
|
||||
<span
|
||||
>提单前请清空购物车, 避免提单的商品与购物车商品混合,
|
||||
请确保购物车内无数据后再进行提单</span
|
||||
>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button v-if="cartCount > 0" @click="goHome">
|
||||
前去清空购物车
|
||||
</el-button>
|
||||
<el-button v-else type="primary" @click="orderLading">
|
||||
确认提单
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -267,36 +239,6 @@ const getOrderStatus = (id) => {
|
|||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
.header-nav {
|
||||
display: flex;
|
||||
background: linear-gradient(
|
||||
to bottom,
|
||||
#f5f5f5 50%,
|
||||
#fff 50%
|
||||
); /* 创建渐变背景 */
|
||||
.nav-item {
|
||||
height: 4rem;
|
||||
width: 8rem;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: 1.2rem;
|
||||
background-color: #f5f5f5;
|
||||
border-radius: 1rem 1rem 0 0;
|
||||
}
|
||||
.nav-item-active {
|
||||
background-color: #fff;
|
||||
position: relative;
|
||||
transition: 300ms;
|
||||
}
|
||||
.nav-item-radius1 {
|
||||
border-radius: 0 0 1rem 0;
|
||||
}
|
||||
.nav-item-radius2 {
|
||||
border-radius: 0 0 0 1rem;
|
||||
}
|
||||
}
|
||||
.detail {
|
||||
height: calc(100vh - 100px - 4rem);
|
||||
box-sizing: border-box;
|
||||
|
@ -305,17 +247,23 @@ const getOrderStatus = (id) => {
|
|||
.table {
|
||||
padding: 1rem;
|
||||
padding-bottom: 6rem;
|
||||
overflow-y: auto;
|
||||
height: 100%;
|
||||
|
||||
.table-title {
|
||||
font-weight: bold;
|
||||
padding-top: 1rem;
|
||||
}
|
||||
.add-address{
|
||||
margin-top: 1rem;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
.table-info {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
color: #777;
|
||||
font-size: 0.9rem;
|
||||
padding-bottom: 2rem;
|
||||
padding-bottom: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
border-bottom: 1px solid #eee;
|
||||
|
||||
&:last-child {
|
||||
|
@ -333,43 +281,6 @@ const getOrderStatus = (id) => {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
height: 6rem;
|
||||
box-sizing: border-box;
|
||||
padding: 0 1.5rem;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
box-shadow: 0 -1px 0.625rem #eee;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background-color: #fff;
|
||||
.info {
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
.ser {
|
||||
font-weight: bold;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
.price {
|
||||
margin-right: 1rem;
|
||||
span {
|
||||
color: #ff4a00;
|
||||
font-size: 1.2rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
.handle {
|
||||
.btn {
|
||||
border-radius: 4rem;
|
||||
padding: 1.2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -1,30 +1,34 @@
|
|||
<script setup>
|
||||
import { ref, onMounted } from "vue";
|
||||
import { ref, onMounted, onUnmounted } from "vue";
|
||||
import {
|
||||
orderListApi,
|
||||
orderStatusApi,
|
||||
orderLadingApi,
|
||||
cartListApi,
|
||||
saleOrderListApi,
|
||||
createOrderApi
|
||||
} from "@/api/store.js";
|
||||
import { useUserStore } from "@/store/user.js";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { useRouter, useRoute } from "vue-router";
|
||||
import { useRouter } from "vue-router";
|
||||
import mitt from "@/utils/mitt.js";
|
||||
import moment from "moment";
|
||||
|
||||
const route = useRoute();
|
||||
const userStore = useUserStore();
|
||||
const props = defineProps({
|
||||
isSystem: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
source: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
});
|
||||
|
||||
const list = ref([]);
|
||||
const lists = ref([]);
|
||||
|
||||
const tabPosition = ref(1); // 1-全部, 2-未支付
|
||||
const payType = ref(0); //支付方式
|
||||
const changeTabPosition = (e) => {
|
||||
where.value.page_no = 1;
|
||||
loadEnd.value = false;
|
||||
|
@ -35,29 +39,17 @@ const changeTabPosition = (e) => {
|
|||
|
||||
const payRef = ref(null);
|
||||
|
||||
const date = ref("");
|
||||
const changeDate = () => {
|
||||
where.value.date = date.value.join("-");
|
||||
const changeDate = (e) => {
|
||||
getOrderList(true);
|
||||
};
|
||||
|
||||
const where = ref({
|
||||
page_no: 1,
|
||||
page_size: 20,
|
||||
search_info: "",
|
||||
date: "",
|
||||
staff_id: 0,
|
||||
number: "",
|
||||
date: moment(new Date()).format("YYYY-MM-DD"),
|
||||
source: props.source,
|
||||
});
|
||||
if (route.query.date) {
|
||||
date.value = [
|
||||
moment(route.query.date).format("YYYY/MM/DD"),
|
||||
moment(route.query.date).format("YYYY/MM/DD"),
|
||||
];
|
||||
where.value.date = date.value.join("-");
|
||||
}
|
||||
if(route.query.payType){
|
||||
payType.value = route.query.payType;
|
||||
}
|
||||
|
||||
const loading = ref(false);
|
||||
const total = ref(0);
|
||||
|
@ -68,24 +60,17 @@ const orderList = ref([]);
|
|||
const getOrderList = (reload = false) => {
|
||||
if (reload) where.value.page_no = 1;
|
||||
else if (loadEnd.value || loading.value) return;
|
||||
if (!props.isSystem) {
|
||||
where.value.staff_id = userStore.userInfo.service.service_id;
|
||||
if (payType.value == 1) where.value.pay_type = "12";
|
||||
else if (payType.value == 2) where.value.pay_type = "11,13";
|
||||
else where.value.pay_type = "";
|
||||
}
|
||||
loading.value = true;
|
||||
if (tabPosition.value == 1) where.value.paid = null;
|
||||
if (tabPosition.value == 2) where.value.paid = 0;
|
||||
orderListApi(userStore.userInfo.service.mer_id, where.value)
|
||||
orderListApi(where.value)
|
||||
.then((res) => {
|
||||
if (reload) orderList.value = res.data.list;
|
||||
else orderList.value = [...orderList.value, ...res.data.list];
|
||||
if (res.data.list.length < where.value.page_size) loadEnd.value = true;
|
||||
if (reload) orderList.value = res.data.lists;
|
||||
else orderList.value = [...orderList.value, ...res.data.lists];
|
||||
if (res.data.lists.length < where.value.page_size) loadEnd.value = true;
|
||||
else where.value.page_no++;
|
||||
activeStore.value = 0;
|
||||
if (orderList.value.length > 0)
|
||||
mitt.emit("set-order-detail", orderList.value[0]);
|
||||
mitt.emit("set-c-order-detail", orderList.value[0]);
|
||||
total.value = res.data.count;
|
||||
loading.value = false;
|
||||
})
|
||||
|
@ -95,60 +80,56 @@ const getOrderList = (reload = false) => {
|
|||
});
|
||||
};
|
||||
|
||||
const submitOrder = ()=>{
|
||||
createOrderApi().then(res=>{
|
||||
console.log(res);
|
||||
})
|
||||
}
|
||||
|
||||
const setForm = (item, index) => {
|
||||
activeStore.value = index;
|
||||
mitt.emit("set-order-detail", item);
|
||||
mitt.emit("set-c-order-detail", item);
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
mitt.on("update-order-detail", (item) => {
|
||||
console.log("===");
|
||||
mitt.on("update-c-order-detail", (item) => {
|
||||
orderList.value[activeStore.value].paid = 1;
|
||||
});
|
||||
});
|
||||
onUnmounted(()=>{
|
||||
mitt.off("update-c-order-detail");
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="my-order" :class="{'my-order-no-system': !isSystem}">
|
||||
<div class="my-order">
|
||||
<div class="header-nav">
|
||||
<div class="nav-item">
|
||||
{{ isSystem ? "平台订单" : "收银订单" }}
|
||||
{{ "收银订单" }}
|
||||
</div>
|
||||
<div class="nav-item-btn">
|
||||
<el-radio-group
|
||||
<!-- <el-radio-group
|
||||
v-model="tabPosition"
|
||||
@change="changeTabPosition"
|
||||
size="small"
|
||||
>
|
||||
<el-radio-button :value="1">全部</el-radio-button>
|
||||
<el-radio-button :value="1">已支付</el-radio-button>
|
||||
<el-radio-button :value="2">未支付</el-radio-button>
|
||||
</el-radio-group>
|
||||
</el-radio-group> -->
|
||||
<el-date-picker
|
||||
v-model="date"
|
||||
type="daterange"
|
||||
start-placeholder="开始时间"
|
||||
end-placeholder="结束时间"
|
||||
v-model="where.date"
|
||||
type="date"
|
||||
placeholder="请选择时间"
|
||||
size="small"
|
||||
value-format="YYYY/MM/DD"
|
||||
:clearable="false"
|
||||
value-format="YYYY-MM-DD"
|
||||
@change="changeDate"
|
||||
style="width: 14rem; margin-left: 1rem"
|
||||
/>
|
||||
</div>
|
||||
<div class="nav-item-btn" v-if="!isSystem">
|
||||
<el-radio-group
|
||||
v-model="payType"
|
||||
@change="changeTabPosition"
|
||||
size="small"
|
||||
>
|
||||
<el-radio-button :value="0">全部</el-radio-button>
|
||||
<el-radio-button :value="1">现金收款</el-radio-button>
|
||||
<el-radio-button :value="2">线上收款</el-radio-button>
|
||||
</el-radio-group>
|
||||
</div>
|
||||
</div>
|
||||
<div class="header-input">
|
||||
<el-input
|
||||
v-model="where.search_info"
|
||||
v-model="where.number"
|
||||
placeholder="请输入订单编号"
|
||||
@keydown.enter="getOrderList(true)"
|
||||
@clear="getOrderList(true)"
|
||||
|
@ -169,7 +150,7 @@ onMounted(() => {
|
|||
</el-input>
|
||||
</div>
|
||||
<div
|
||||
class="order-list"
|
||||
class="order-lists"
|
||||
v-loading="loading"
|
||||
v-infinite-scroll="getOrderList"
|
||||
infinite-scroll-distance="300"
|
||||
|
@ -184,61 +165,53 @@ onMounted(() => {
|
|||
@click="setForm(item, index)"
|
||||
>
|
||||
<div class="top">
|
||||
<div
|
||||
class="sn"
|
||||
:class="
|
||||
item.pay_type === 11 ||
|
||||
item.pay_type === 12 ||
|
||||
item.pay_type === 13
|
||||
? 'cahier'
|
||||
: 'cahier2'
|
||||
"
|
||||
>
|
||||
单号: {{ item.order_sn }}
|
||||
</div>
|
||||
<div class="sn">单号: {{ item.number }}</div>
|
||||
<div class="create-time">{{ item.create_time }}</div>
|
||||
</div>
|
||||
<div class="shop">
|
||||
<div class="left" v-if="item.orderProduct">
|
||||
<div class="left" v-if="item.goods_list">
|
||||
<el-image
|
||||
v-for="(shop, imgkey) in item.orderProduct.slice(0, 5)"
|
||||
v-for="(shop, imgkey) in item.goods_list.slice(0, 5)"
|
||||
:key="imgkey"
|
||||
:src="
|
||||
shop.cart_info.productAttr.image || shop.cart_info.product.image
|
||||
"
|
||||
:src="shop.imgs"
|
||||
class="shop-img"
|
||||
></el-image>
|
||||
<div v-if="item.orderProduct.length == 1" class="shop-name">
|
||||
{{ item.orderProduct[0].cart_info.product.store_name }}
|
||||
<div v-if="item.goods_list.length == 1" class="shop-name">
|
||||
{{ item.goods_list[0].class_name }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="money">¥{{ item.pay_price }}</div>
|
||||
<div class="count">共{{ item.total_num }}件商品</div>
|
||||
<div class="money">¥{{ item.total }}</div>
|
||||
<div class="count">共{{ item.goods_count }}款商品</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="pay">
|
||||
<div v-if="item.paid">
|
||||
已支付
|
||||
<span v-if="item.pay_type == 13">(支付宝收款)</span>
|
||||
<span v-if="item.pay_type == 12">(现金支付)</span>
|
||||
<span v-if="item.pay_type == 11">(微信收款)</span>
|
||||
<span v-if="item.pay_type == 0">(余额支付)</span>
|
||||
<span v-if="item.pay_type == 1">(微信支付)</span>
|
||||
<span v-if="item.pay_type == 9">(商户余额支付)</span>
|
||||
<span v-if="item.pay_type == 10">(对公转账)</span>
|
||||
<span v-if="item.pay_type == 9">(微信收款)</span>
|
||||
<span v-if="item.pay_type == 1">(余额支付)</span>
|
||||
<span v-if="item.pay_type == 3">(微信支付)</span>
|
||||
</div>
|
||||
<div v-else style="color: #ff4a00">未支付</div>
|
||||
</div>
|
||||
<div class="cashier" v-if="item.service_info">
|
||||
<!-- <div class="cashier" v-if="item.service_info">
|
||||
收银员: {{ item.service_info.nickname }}
|
||||
</div>
|
||||
<div class="cashier" v-else>平台订单</div>
|
||||
<div class="cashier" v-else>平台订单</div> -->
|
||||
<div class="cashier" v-if="!item.address_id">
|
||||
<el-button size="small" type="primary" @click.stop="addAddress(item)">添加收货地址</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="loadEnd" class="load-end">没有更多了</div>
|
||||
<div v-if="loading" class="load-end">加载中...</div>
|
||||
<div style="width: 100%; height: 7rem"></div>
|
||||
</div>
|
||||
<div class="bottom-btn-fiexd" v-if="!loading">
|
||||
<el-button class="btn" type="primary" @click="submitOrder" :disabled="!orderList.length">
|
||||
提交采购</el-button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -267,7 +240,6 @@ onMounted(() => {
|
|||
}
|
||||
.nav-item-btn {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
@ -278,7 +250,7 @@ onMounted(() => {
|
|||
height: 2.5rem;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
.order-list {
|
||||
.order-lists {
|
||||
height: calc(100vh - 100px - 10.2rem);
|
||||
overflow-y: auto;
|
||||
.item {
|
||||
|
@ -364,6 +336,13 @@ onMounted(() => {
|
|||
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 {
|
||||
|
@ -376,13 +355,23 @@ onMounted(() => {
|
|||
color: #333;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
}
|
||||
.my-order-no-system{
|
||||
.header-nav{
|
||||
height: 5.5rem;
|
||||
}
|
||||
.order-list{
|
||||
height: calc(100vh - 100px - 12.2rem);
|
||||
.bottom-btn-fiexd {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
border-top: 1px solid #eee;
|
||||
background-color: #fff;
|
||||
z-index: 100;
|
||||
height: 5.2rem;
|
||||
padding: 1rem 1.5rem;
|
||||
.btn {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-size: 1.2rem;
|
||||
border-radius: 3rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -11,8 +11,8 @@ const sactive = ref(-1);
|
|||
const show = ref(false);
|
||||
|
||||
const getCategoryList = () => {
|
||||
merchantCategoryListApi(259).then((res) => {
|
||||
categoryList.value = res.data;
|
||||
merchantCategoryListApi().then((res) => {
|
||||
categoryList.value = res.data.lists;
|
||||
active.value = -1;
|
||||
});
|
||||
};
|
||||
|
@ -57,12 +57,12 @@ const changeActive = (index=-1, idnexc=-1) => {
|
|||
@click="changeActive(index)"
|
||||
@mousemove="sactive=index"
|
||||
>
|
||||
{{ item.cate_name }}
|
||||
{{ item.name }}
|
||||
</div>
|
||||
</template>
|
||||
<div class="active-card"
|
||||
@mouseout="sactive=-1" @mousemove="sactive=index">
|
||||
<div class="title">{{ item.cate_name }}</div>
|
||||
<div class="title">{{ item.name }}</div>
|
||||
<div class="list">
|
||||
<div
|
||||
:class="{ 'list-active': indexc == cactive }"
|
||||
|
@ -72,7 +72,7 @@ const changeActive = (index=-1, idnexc=-1) => {
|
|||
:key="indexc"
|
||||
@click="changeActive(index, indexc)"
|
||||
>
|
||||
{{ chil.cate_name }}
|
||||
{{ chil.name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script setup>
|
||||
import { ref, onMounted, onUnmounted, nextTick } from "vue";
|
||||
import { cartListApi, cartDeleteApi, cartChangeApi } from "@/api/store.js";
|
||||
import { cartListApi, cartDeleteApi, cartCreateApi } from "@/api/store.js";
|
||||
import price from "./price.vue";
|
||||
import mitt from "@/utils/mitt.js";
|
||||
import { useUserStore } from "@/store/user.js";
|
||||
|
@ -39,17 +39,12 @@ const getList = () => {
|
|||
allPrice.value = 0;
|
||||
costPrice.value = 0;
|
||||
discounts.value = 0;
|
||||
cartListApi({
|
||||
// staff_id: userStore.userInfo.service.service_id,
|
||||
sale_type: 2,
|
||||
}).then((res) => {
|
||||
// if (res.data?.list?.length > 0) {
|
||||
// list.value = res.data.list[0].list;
|
||||
// list.value.forEach((item) => {
|
||||
// allPrice.value += item.productAttr.price * item.cart_num;
|
||||
// });
|
||||
// costPrice.value = allPrice.value;
|
||||
// } else list.value = [];
|
||||
cartListApi().then((res) => {
|
||||
if (res.data?.lists?.length > 0) {
|
||||
list.value = res.data.lists;
|
||||
allPrice.value = +res.data.extend.total_price;
|
||||
costPrice.value = allPrice.value;
|
||||
} else list.value = [];
|
||||
});
|
||||
};
|
||||
getList();
|
||||
|
@ -61,12 +56,14 @@ const goPay = () => {
|
|||
};
|
||||
|
||||
const changeCartNum = (val, old) => {
|
||||
cartChangeApi(val.cart_id, {
|
||||
cart_num: val.cart_num,
|
||||
cartCreateApi({
|
||||
goods_id: val.goods_id,
|
||||
is_new: 0,
|
||||
cart_num: val.cart_num
|
||||
}).then((res) => {
|
||||
allPrice.value = 0;
|
||||
list.value.forEach((item) => {
|
||||
allPrice.value += item.productAttr.price * item.cart_num;
|
||||
allPrice.value += item.sell*item.cart_num;
|
||||
});
|
||||
costPrice.value = allPrice.value;
|
||||
});
|
||||
|
@ -76,11 +73,6 @@ const editAttr = (data) => {
|
|||
emit("editPupop", data);
|
||||
};
|
||||
|
||||
const editItem = (id, data) => {
|
||||
cartChangeApi(id, data).then((res) => {
|
||||
getList();
|
||||
});
|
||||
};
|
||||
|
||||
const changeAllPrice = (price) => {
|
||||
discounts.value = costPrice.value - price;
|
||||
|
@ -101,7 +93,6 @@ const showPrice = (type = true) => {
|
|||
defineExpose({
|
||||
getList,
|
||||
list,
|
||||
editItem,
|
||||
discounts,
|
||||
allPrice,
|
||||
});
|
||||
|
@ -129,7 +120,7 @@ onUnmounted(() => {
|
|||
<div class="my-order">
|
||||
<div class="header-nav">
|
||||
<div class="nav-item">
|
||||
已选购 <span>{{ list.length }}</span> 件
|
||||
已选购 <span>{{ list.length }}</span> 款
|
||||
</div>
|
||||
<div class="nav-item-clear" @click="clearAll">
|
||||
<el-icon><Delete /></el-icon>清空 (Delete)
|
||||
|
@ -141,27 +132,19 @@ onUnmounted(() => {
|
|||
<el-image
|
||||
loading="lazy"
|
||||
class="order-item-img"
|
||||
:src="
|
||||
(item.productAttr && item.productAttr.image) || item.product.image
|
||||
"
|
||||
:src="item.imgs"
|
||||
></el-image>
|
||||
<div class="order-item-info">
|
||||
<div class="order-item-title">
|
||||
<div class="title">{{ item.spu.store_name }}</div>
|
||||
<div class="title">{{ item.goods_name }}</div>
|
||||
<div class="delete" @click="deleteOne(item.cart_id)">删除</div>
|
||||
</div>
|
||||
<div class="order-item-sku">
|
||||
<span
|
||||
style="display: flex; align-items: center"
|
||||
@click="editAttr(item)"
|
||||
>商品规格: {{ item.productAttr.sku || "默认规格"
|
||||
}}<el-icon size="16" style="margin-left: 0.2rem"
|
||||
><ArrowDown /></el-icon
|
||||
></span>
|
||||
<span>{{ item.unit_name }}</span>
|
||||
</div>
|
||||
<div class="order-item-price">
|
||||
<div>
|
||||
¥<span>{{ item.productAttr.price }}</span>
|
||||
¥<span>{{ item.sell }}</span>
|
||||
</div>
|
||||
<div>
|
||||
<el-input-number
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script setup>
|
||||
import { ref, onMounted, onUnmounted, nextTick } from "vue";
|
||||
import { ElMessageBox } from "element-plus";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { getAttrValue } from "@/api/shop.js";
|
||||
import mitt from "@/utils/mitt.js";
|
||||
|
||||
|
@ -14,21 +14,16 @@ const show = (e) => {
|
|||
const form = ref({});
|
||||
const loading = ref(false);
|
||||
const mode = ref("add");
|
||||
const editForm = ref({});
|
||||
const setForm = (data, type = "add") => {
|
||||
mode.value = type;
|
||||
form.value = data;
|
||||
form.value = JSON.parse(JSON.stringify(data));
|
||||
};
|
||||
|
||||
const emit = defineEmits(["changeItem"]);
|
||||
|
||||
const changeItem = () => {
|
||||
return console.log(form.value);
|
||||
if (mode.value == "add") emit("changeItem", form.value);
|
||||
else
|
||||
emit("editItem", editForm.value.cart_id, {
|
||||
cart_num: editForm.value.cart_num,
|
||||
});
|
||||
if(!form.value.cart_num) form.value.cart_num = 1;
|
||||
emit("changeItem", form.value);
|
||||
dialogVisible.value = false;
|
||||
};
|
||||
|
||||
|
@ -78,7 +73,8 @@ const close = () => {
|
|||
ref="inputRef"
|
||||
v-model="form.cart_num"
|
||||
step-strictly
|
||||
:min="1"
|
||||
placeholder="请输入数量(默认为1)"
|
||||
:min="0"
|
||||
:step="1"
|
||||
style="width: 20rem"
|
||||
/>
|
||||
|
|
|
@ -104,7 +104,8 @@ onUnmounted(() => {
|
|||
<el-image loading="lazy" :src="item.imgs"></el-image>
|
||||
<div class="shop-name">{{ item.name }}</div>
|
||||
<div class="shop-price">
|
||||
¥<span>{{ item.sell }}/{{item.unit_name}}</span>
|
||||
¥<span>{{ item.sell }}</span>
|
||||
<span style="color: #777;font-size: 0.9rem;">/{{item.unit_name}}</span>
|
||||
</div>
|
||||
<div class="no-stock" v-if="item.stock == 0">
|
||||
<div>
|
||||
|
@ -133,6 +134,8 @@ onUnmounted(() => {
|
|||
box-sizing: border-box;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.header-nav {
|
||||
border-radius: 0.8rem;
|
||||
|
@ -178,7 +181,8 @@ onUnmounted(() => {
|
|||
}
|
||||
|
||||
.shop-list {
|
||||
height: calc(100vh - 9.75rem);
|
||||
/* height: calc(100vh - 9.75rem); */
|
||||
flex: 1;
|
||||
width: auto;
|
||||
overflow-y: auto;
|
||||
box-sizing: border-box;
|
||||
|
|
|
@ -62,11 +62,11 @@ function isAllDigits(str) {
|
|||
}
|
||||
|
||||
const cartAddInfo = (item, change = "") => {
|
||||
// console.log(item, change);
|
||||
console.log(item, change);
|
||||
let q = {
|
||||
goods_id: item.id,
|
||||
is_new: 0,
|
||||
cart_num: 1
|
||||
cart_num: item.cart_num
|
||||
};
|
||||
cartCreateApi(q).then((res) => {
|
||||
orderRef.value.getList();
|
||||
|
@ -74,14 +74,10 @@ const cartAddInfo = (item, change = "") => {
|
|||
};
|
||||
|
||||
const changeItem = (item, change) => {
|
||||
item.cart_num = 1;
|
||||
pupopRef.value.setForm(item, "add");
|
||||
pupopRef.value.show(true);
|
||||
pupopRef.value.show(true);
|
||||
};
|
||||
|
||||
const editItem = (id, data) => {
|
||||
orderRef.value.editItem(id, data);
|
||||
};
|
||||
|
||||
const editPupop = (item) => {
|
||||
pupopRef.value.setForm(item, "edit");
|
||||
|
@ -92,9 +88,6 @@ const editPupop = (item) => {
|
|||
const checkOut = () => {
|
||||
let cart_id = orderRef.value.list.map((item) => item.cart_id);
|
||||
let query = {
|
||||
takes: [],
|
||||
use_coupon: {},
|
||||
use_integral: false,
|
||||
cart_id: cart_id,
|
||||
};
|
||||
if (orderRef.value.discounts > 0) {
|
||||
|
@ -103,7 +96,7 @@ const checkOut = () => {
|
|||
}
|
||||
orderCheckApi(query).then((res) => {
|
||||
payRef.value.setForm({
|
||||
data: res.data,
|
||||
data: res.data.order,
|
||||
cart_id: cart_id,
|
||||
});
|
||||
});
|
||||
|
@ -147,9 +140,9 @@ onUnmounted(() => {
|
|||
@changeItem="changeItem"
|
||||
@loadMore="loadMore"
|
||||
/>
|
||||
<pupop ref="pupopRef" @changeItem="changeItem" @editItem="editItem" />
|
||||
<padding />
|
||||
<classify ref="classifyRef" @getStoreList="getStoreList"/>
|
||||
<pupop ref="pupopRef" @changeItem="cartAddInfo" />
|
||||
<!-- <padding />
|
||||
<classify ref="classifyRef" @getStoreList="getStoreList"/> -->
|
||||
<pay ref="payRef" @paySuccess="paySuccess" />
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
<script setup>
|
||||
import { ref } from "vue";
|
||||
import { onMounted, onUnmounted, ref } from "vue";
|
||||
import {
|
||||
orderListApi,
|
||||
orderStatusApi,
|
||||
orderLadingApi,
|
||||
cartListApi,
|
||||
cashierinfoListApi,
|
||||
} from "@/api/store.js";
|
||||
import { useUserStore } from "@/store/user.js";
|
||||
import { ElMessage } from "element-plus";
|
||||
|
@ -15,9 +16,8 @@ import pay from "@/components/pay.vue";
|
|||
const userStore = useUserStore();
|
||||
const router = useRouter();
|
||||
|
||||
const formData = ref({});
|
||||
mitt.on("set-order-detail", (res) => {
|
||||
formData.value = res;
|
||||
const formData = ref({
|
||||
id: "",
|
||||
});
|
||||
|
||||
const list = ref([]);
|
||||
|
@ -39,7 +39,7 @@ const orderLading = () => {
|
|||
dialogVisible.value = false;
|
||||
orderLadingApi({
|
||||
order_sn: orderLadingSn.value,
|
||||
staff_id: userStore.userInfo.service.service_id
|
||||
staff_id: userStore.userInfo.service.service_id,
|
||||
}).then((res) => {
|
||||
ElMessage({
|
||||
message: res.message,
|
||||
|
@ -69,7 +69,7 @@ const getOrderStatus = (id) => {
|
|||
message: res.message,
|
||||
type: "success",
|
||||
});
|
||||
mitt.emit("update-order-detail", {});
|
||||
mitt.emit("update-sale-order-detail", {});
|
||||
formData.value.paid = 1;
|
||||
} else {
|
||||
ElMessage({
|
||||
|
@ -80,85 +80,78 @@ const getOrderStatus = (id) => {
|
|||
})
|
||||
.catch((err) => {});
|
||||
};
|
||||
|
||||
const where = ref({
|
||||
page_no: 1,
|
||||
page_size: 15,
|
||||
loadend: false,
|
||||
loading: false,
|
||||
});
|
||||
const goods_list = ref([]);
|
||||
const getOrderList = () => {
|
||||
console.log("触底");
|
||||
if (formData.value.id && !where.value.loadend) {
|
||||
console.log("加载");
|
||||
where.value.loading = true;
|
||||
cashierinfoListApi({
|
||||
pid: formData.value.id,
|
||||
page_no: where.value.page_no,
|
||||
page_size: where.value.page_size,
|
||||
}).then((res) => {
|
||||
goods_list.value = [...goods_list.value, ...res.data.lists];
|
||||
if (res.data.lists.length < where.value.page_size)
|
||||
where.value.loadend = true;
|
||||
where.value.loading = false;
|
||||
where.value.page_no++;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
mitt.on("set-sale-order-detail", (res) => {
|
||||
formData.value = res;
|
||||
where.value.page_no = 1;
|
||||
where.value.loadend = false;
|
||||
where.value.loading = false;
|
||||
goods_list.value = [];
|
||||
getOrderList();
|
||||
});
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
mitt.off("set-sale-order-detail");
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="my-order">
|
||||
<div class="header-nav">
|
||||
<div
|
||||
v-for="(item, index) in activeStoreList"
|
||||
:key="index"
|
||||
class="nav-item"
|
||||
:class="{
|
||||
'nav-item-active': activeStore == index,
|
||||
'nav-item-radius1': activeStore == index + 1,
|
||||
'nav-item-radius2': activeStore == index - 1,
|
||||
}"
|
||||
@click="activeStore = index"
|
||||
>
|
||||
{{ item }}
|
||||
</div>
|
||||
<div
|
||||
class="nav-item"
|
||||
:class="{
|
||||
'nav-item-radius2': activeStore == activeStoreList.length - 1,
|
||||
}"
|
||||
style="flex: 1"
|
||||
></div>
|
||||
</div>
|
||||
<div class="detail" v-loading="loading">
|
||||
<div class="table" v-if="formData.orderProduct && activeStore == 0">
|
||||
<div style="font-size: 0.9rem">
|
||||
共计
|
||||
<span style="color: #ff4a00">{{ formData.total_num }}</span> 件商品
|
||||
</div>
|
||||
<el-table
|
||||
style="height: calc(100vh - 100px - 14rem)"
|
||||
:data="formData.orderProduct"
|
||||
>
|
||||
<el-table-column prop="cart_info.product.store_name" label="商品信息">
|
||||
<template #default="{ row }">
|
||||
<div style="display: flex; align-items: center">
|
||||
<el-image
|
||||
style="height: 3rem; width: 3rem"
|
||||
:src="
|
||||
row.cart_info.productAttr.image ||
|
||||
row.cart_info.product.image
|
||||
"
|
||||
></el-image>
|
||||
<span style="margin-left: 0.5rem">{{
|
||||
row.cart_info.product.store_name
|
||||
}}</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="cart_info.productAttr.price"
|
||||
label="单价"
|
||||
width="150"
|
||||
/>
|
||||
<el-table-column prop="product_num" label="数量" width="150" />
|
||||
<el-table-column prop="total_price" label="总价" width="150" />
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="table" v-if="formData.orderProduct && activeStore == 1">
|
||||
<div
|
||||
class="table"
|
||||
v-loading="loading"
|
||||
v-infinite-scroll="getOrderList"
|
||||
infinite-scroll-distance="300"
|
||||
infinite-scroll-delay="300"
|
||||
style="overflow: auto"
|
||||
:infinite-scroll-immediate="false"
|
||||
>
|
||||
<div class="table-title">订单信息</div>
|
||||
<div class="table-info">
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">创建时间:</div>
|
||||
<div class="info-item-info">{{ formData.create_time }}</div>
|
||||
<div class="info-item-title">订单编号:</div>
|
||||
<div class="info-item-info">{{ formData.number }}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">商品总数:</div>
|
||||
<div class="info-item-info">{{ formData.total_num }}</div>
|
||||
<div class="info-item-title">商品款数:</div>
|
||||
<div class="info-item-info">{{ formData.goods_count }}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">商品总价:</div>
|
||||
<div class="info-item-info">¥{{ formData.total_price }}</div>
|
||||
<div class="info-item-info">¥{{ formData.total }}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">支付时间:</div>
|
||||
<div class="info-item-info">{{ formData.pay_time }}</div>
|
||||
<div class="info-item-title">创建时间:</div>
|
||||
<div class="info-item-info">{{ formData.create_time }}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">优惠抵扣:</div>
|
||||
|
@ -166,95 +159,44 @@ const getOrderStatus = (id) => {
|
|||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">实际支付:</div>
|
||||
<div class="info-item-info">¥{{ formData.pay_price }}</div>
|
||||
<div class="info-item-info">¥{{ formData.actual }}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">支付时间:</div>
|
||||
<div class="info-item-info">{{ formData.update_time }}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">支付方式:</div>
|
||||
<div class="info-item-info">
|
||||
<span v-if="formData.pay_type == 11">微信收款</span>
|
||||
<span v-if="formData.pay_type == 12">现金支付</span>
|
||||
<span v-if="formData.pay_type == 13">支付宝收款</span>
|
||||
<span v-if="formData.pay_type == 0">余额支付</span>
|
||||
<span v-if="formData.pay_type == 1">微信支付</span>
|
||||
<span v-if="formData.pay_type == 9">商户余额支付</span>
|
||||
<span v-if="formData.pay_type == 10">对公转账</span>
|
||||
<span v-if="formData.pay_type == 9">微信收款</span>
|
||||
<span v-if="formData.pay_type == 1">余额支付</span>
|
||||
<span v-if="formData.pay_type == 3">微信支付</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-title" v-if="formData.service_info">收银员信息</div>
|
||||
<div
|
||||
class="table-info"
|
||||
v-if="formData.service_info"
|
||||
style="flex-direction: column"
|
||||
>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">头像:</div>
|
||||
<div class="info-item-info">
|
||||
<el-image
|
||||
style="height: 4rem; width: 4rem; border-radius: 50%"
|
||||
:src="formData.service_info.avatar"
|
||||
></el-image>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">昵称:</div>
|
||||
<div class="info-item-info">
|
||||
{{ formData.service_info.nickname }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-title">账号:</div>
|
||||
<div class="info-item-info">
|
||||
{{ formData.service_info.account }}
|
||||
</div>
|
||||
</div>
|
||||
<div style="font-size: 0.9rem">
|
||||
共计
|
||||
<span style="color: #ff4a00">{{ formData.goods_count }}</span> 款商品
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer" v-if="formData.service_info">
|
||||
<div class="info">
|
||||
<div class="ser">收银员: {{ formData.service_info.nickname }}</div>
|
||||
<div class="price">
|
||||
实付: <span>¥{{ formData.pay_price }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="handle" v-if="!formData.paid">
|
||||
<el-button class="btn" type="primary" @click="rePay(formData)"
|
||||
>重新支付</el-button
|
||||
>
|
||||
<el-button
|
||||
class="btn"
|
||||
type="primary"
|
||||
@click="getOrderStatus(formData.order_sn)"
|
||||
>检测状态</el-button
|
||||
>
|
||||
<el-button
|
||||
class="btn"
|
||||
type="success"
|
||||
@click="orderLadingComfirm(formData.order_sn)"
|
||||
>提单</el-button
|
||||
>
|
||||
</div>
|
||||
<div class="handle" v-else>已支付</div>
|
||||
<el-table :data="goods_list">
|
||||
<el-table-column label="商品信息">
|
||||
<template #default="{ row }">
|
||||
<div style="display: flex; align-items: center">
|
||||
<el-image
|
||||
style="height: 3rem; width: 3rem"
|
||||
:src="row.imgs"
|
||||
></el-image>
|
||||
<span style="margin-left: 0.5rem">{{ row.goods_name }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="price" label="单价" width="150" />
|
||||
<el-table-column prop="nums" label="数量" width="150" />
|
||||
<el-table-column prop="total" label="总价" width="150">
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
<pay ref="payRef" />
|
||||
<el-dialog v-model="dialogVisible" title="提示" width="500">
|
||||
<span
|
||||
>提单前请清空购物车, 避免提单的商品与购物车商品混合,
|
||||
请确保购物车内无数据后再进行提单</span
|
||||
>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button v-if="cartCount > 0" @click="goHome">
|
||||
前去清空购物车
|
||||
</el-button>
|
||||
<el-button v-else type="primary" @click="orderLading">
|
||||
确认提单
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -267,36 +209,6 @@ const getOrderStatus = (id) => {
|
|||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
.header-nav {
|
||||
display: flex;
|
||||
background: linear-gradient(
|
||||
to bottom,
|
||||
#f5f5f5 50%,
|
||||
#fff 50%
|
||||
); /* 创建渐变背景 */
|
||||
.nav-item {
|
||||
height: 4rem;
|
||||
width: 8rem;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: 1.2rem;
|
||||
background-color: #f5f5f5;
|
||||
border-radius: 1rem 1rem 0 0;
|
||||
}
|
||||
.nav-item-active {
|
||||
background-color: #fff;
|
||||
position: relative;
|
||||
transition: 300ms;
|
||||
}
|
||||
.nav-item-radius1 {
|
||||
border-radius: 0 0 1rem 0;
|
||||
}
|
||||
.nav-item-radius2 {
|
||||
border-radius: 0 0 0 1rem;
|
||||
}
|
||||
}
|
||||
.detail {
|
||||
height: calc(100vh - 100px - 4rem);
|
||||
box-sizing: border-box;
|
||||
|
@ -305,17 +217,19 @@ const getOrderStatus = (id) => {
|
|||
.table {
|
||||
padding: 1rem;
|
||||
padding-bottom: 6rem;
|
||||
overflow-y: auto;
|
||||
height: 100%;
|
||||
|
||||
.table-title {
|
||||
font-weight: bold;
|
||||
padding-top: 1rem;
|
||||
}
|
||||
.table-info {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
color: #777;
|
||||
font-size: 0.9rem;
|
||||
padding-bottom: 2rem;
|
||||
padding-bottom: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
border-bottom: 1px solid #eee;
|
||||
|
||||
&:last-child {
|
||||
|
@ -333,43 +247,6 @@ const getOrderStatus = (id) => {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
height: 6rem;
|
||||
box-sizing: border-box;
|
||||
padding: 0 1.5rem;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
box-shadow: 0 -1px 0.625rem #eee;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background-color: #fff;
|
||||
.info {
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
.ser {
|
||||
font-weight: bold;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
.price {
|
||||
margin-right: 1rem;
|
||||
span {
|
||||
color: #ff4a00;
|
||||
font-size: 1.2rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
.handle {
|
||||
.btn {
|
||||
border-radius: 4rem;
|
||||
padding: 1.2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
<script setup>
|
||||
import { ref, onMounted } from "vue";
|
||||
import { ref, onMounted, onUnmounted } from "vue";
|
||||
import {
|
||||
orderListApi,
|
||||
orderStatusApi,
|
||||
orderLadingApi,
|
||||
cartListApi,
|
||||
saleOrderListApi
|
||||
saleOrderListApi,
|
||||
} from "@/api/store.js";
|
||||
import { useUserStore } from "@/store/user.js";
|
||||
import { ElMessage } from "element-plus";
|
||||
|
@ -14,13 +14,17 @@ import mitt from "@/utils/mitt.js";
|
|||
|
||||
const userStore = useUserStore();
|
||||
const props = defineProps({
|
||||
isSystem:{
|
||||
type:Boolean,
|
||||
default:false
|
||||
}
|
||||
})
|
||||
isSystem: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
source: {
|
||||
type: Number,
|
||||
default: 1,
|
||||
},
|
||||
});
|
||||
|
||||
const list = ref([]);
|
||||
const lists = ref([]);
|
||||
|
||||
const tabPosition = ref(1); // 1-全部, 2-未支付
|
||||
const changeTabPosition = (e) => {
|
||||
|
@ -33,19 +37,18 @@ const changeTabPosition = (e) => {
|
|||
|
||||
const payRef = ref(null);
|
||||
|
||||
const date = ref('');
|
||||
const changeDate = ()=>{
|
||||
where.value.date = date.value.join('-');
|
||||
const date = ref("");
|
||||
const changeDate = () => {
|
||||
where.value.date = date.value.join("-");
|
||||
getOrderList(true);
|
||||
}
|
||||
};
|
||||
|
||||
const where = ref({
|
||||
page_no: 1,
|
||||
page_size: 20,
|
||||
store_name: "",
|
||||
number: "",
|
||||
date: "",
|
||||
staff_id: 0,
|
||||
sale_type: 2
|
||||
source: props.source,
|
||||
});
|
||||
|
||||
const loading = ref(false);
|
||||
|
@ -57,18 +60,17 @@ const orderList = ref([]);
|
|||
const getOrderList = (reload = false) => {
|
||||
if (reload) where.value.page_no = 1;
|
||||
else if (loadEnd.value || loading.value) return;
|
||||
if(!props.isSystem) where.value.staff_id = userStore.userInfo.service.service_id;
|
||||
loading.value = true;
|
||||
if (tabPosition.value == 1) where.value.paid = null;
|
||||
if (tabPosition.value == 2) where.value.paid = 0;
|
||||
saleOrderListApi(userStore.userInfo.service.mer_id, where.value)
|
||||
saleOrderListApi(where.value)
|
||||
.then((res) => {
|
||||
if (reload) orderList.value = res.data.list;
|
||||
else orderList.value = [...orderList.value, ...res.data.list];
|
||||
if (res.data.list.length < where.value.page_size) loadEnd.value = true;
|
||||
if (reload) orderList.value = res.data.lists;
|
||||
else orderList.value = [...orderList.value, ...res.data.lists];
|
||||
if (res.data.lists.length < where.value.page_size) loadEnd.value = true;
|
||||
else where.value.page_no++;
|
||||
activeStore.value = 0;
|
||||
mitt.emit("set-order-detail", orderList.value[0]);
|
||||
mitt.emit("set-sale-order-detail", orderList.value[0]);
|
||||
total.value = res.data.count;
|
||||
loading.value = false;
|
||||
})
|
||||
|
@ -80,14 +82,17 @@ const getOrderList = (reload = false) => {
|
|||
|
||||
const setForm = (item, index) => {
|
||||
activeStore.value = index;
|
||||
mitt.emit("set-order-detail", item);
|
||||
mitt.emit("set-sale-order-detail", item);
|
||||
};
|
||||
|
||||
onMounted(()=>{
|
||||
mitt.on("update-order-detail", (item) => {
|
||||
console.log('===');
|
||||
onMounted(() => {
|
||||
mitt.on("update-sale-order-detail", (item) => {
|
||||
console.log("===");
|
||||
orderList.value[activeStore.value].paid = 1;
|
||||
})
|
||||
});
|
||||
});
|
||||
onUnmounted(()=>{
|
||||
mitt.off("update-sale-order-detail");
|
||||
})
|
||||
</script>
|
||||
|
||||
|
@ -95,7 +100,7 @@ onMounted(()=>{
|
|||
<div class="my-order">
|
||||
<div class="header-nav">
|
||||
<div class="nav-item">
|
||||
{{ isSystem ? '平台订单' : '收银订单' }}
|
||||
{{ "收银订单" }}
|
||||
</div>
|
||||
<div class="nav-item-btn">
|
||||
<el-radio-group
|
||||
|
@ -103,7 +108,7 @@ onMounted(()=>{
|
|||
@change="changeTabPosition"
|
||||
size="small"
|
||||
>
|
||||
<el-radio-button :value="1">已支付</el-radio-button>
|
||||
<el-radio-button :value="1">全部</el-radio-button>
|
||||
<el-radio-button :value="2">未支付</el-radio-button>
|
||||
</el-radio-group>
|
||||
<el-date-picker
|
||||
|
@ -114,13 +119,13 @@ onMounted(()=>{
|
|||
size="small"
|
||||
value-format="YYYY/MM/DD"
|
||||
@change="changeDate"
|
||||
style="width: 14rem;margin-left: 1rem;"
|
||||
style="width: 14rem; margin-left: 1rem"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="header-input">
|
||||
<el-input
|
||||
v-model="where.store_name"
|
||||
v-model="where.number"
|
||||
placeholder="请输入订单编号"
|
||||
@keydown.enter="getOrderList(true)"
|
||||
@clear="getOrderList(true)"
|
||||
|
@ -141,7 +146,7 @@ onMounted(()=>{
|
|||
</el-input>
|
||||
</div>
|
||||
<div
|
||||
class="order-list"
|
||||
class="order-lists"
|
||||
v-loading="loading"
|
||||
v-infinite-scroll="getOrderList"
|
||||
infinite-scroll-distance="300"
|
||||
|
@ -156,58 +161,41 @@ onMounted(()=>{
|
|||
@click="setForm(item, index)"
|
||||
>
|
||||
<div class="top">
|
||||
<div
|
||||
class="sn"
|
||||
:class="
|
||||
item.pay_type === 11 ||
|
||||
item.pay_type === 12 ||
|
||||
item.pay_type === 13
|
||||
? 'cahier'
|
||||
: 'cahier2'
|
||||
"
|
||||
>
|
||||
单号: {{ item.order_sn }}
|
||||
</div>
|
||||
<div class="sn" :class="'cahier'">单号: {{ item.number }}</div>
|
||||
<div class="create-time">{{ item.create_time }}</div>
|
||||
</div>
|
||||
<div class="shop">
|
||||
<div class="left" v-if="item.orderProduct">
|
||||
<div class="left" v-if="item.goods_list">
|
||||
<el-image
|
||||
v-for="(shop, imgkey) in item.orderProduct.slice(0, 5)"
|
||||
v-for="(shop, imgkey) in item.goods_list.slice(0, 5)"
|
||||
:key="imgkey"
|
||||
:src="
|
||||
shop.cart_info.productAttr.image || shop.cart_info.product.image
|
||||
"
|
||||
:src="shop.imgs"
|
||||
class="shop-img"
|
||||
></el-image>
|
||||
<div v-if="item.orderProduct.length == 1" class="shop-name">
|
||||
{{ item.orderProduct[0].cart_info.product.store_name }}
|
||||
<div v-if="item.goods_list.length == 1" class="shop-name">
|
||||
{{ item.goods_list[0].class_name }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="money">¥{{ item.pay_price }}</div>
|
||||
<div class="count">共{{ item.total_num }}件商品</div>
|
||||
<div class="money">¥{{ item.total }}</div>
|
||||
<div class="count">共{{ item.goods_count }}款商品</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="pay">
|
||||
<div v-if="item.paid">
|
||||
已支付
|
||||
<span v-if="item.pay_type == 13">(支付宝收款)</span>
|
||||
<span v-if="item.pay_type == 12">(现金支付)</span>
|
||||
<span v-if="item.pay_type == 11">(微信收款)</span>
|
||||
<span v-if="item.pay_type == 0">(余额支付)</span>
|
||||
<span v-if="item.pay_type == 1">(微信支付)</span>
|
||||
<span v-if="item.pay_type == 9">(商户余额支付)</span>
|
||||
<span v-if="item.pay_type == 10">(对公转账)</span>
|
||||
<span v-if="item.pay_type == 9">(微信收款)</span>
|
||||
<span v-if="item.pay_type == 1">(余额支付)</span>
|
||||
<span v-if="item.pay_type == 3">(微信支付)</span>
|
||||
<!-- <span class="manage-btn">待处理</span> -->
|
||||
</div>
|
||||
<div v-else style="color: #ff4a00">未支付</div>
|
||||
</div>
|
||||
<div class="cashier" v-if="item.service_info">
|
||||
<!-- <div class="cashier" v-if="item.service_info">
|
||||
收银员: {{ item.service_info.nickname }}
|
||||
</div>
|
||||
<div class="cashier" v-else>平台订单</div>
|
||||
<div class="cashier" v-else>平台订单</div> -->
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="loadEnd" class="load-end">没有更多了</div>
|
||||
|
@ -235,7 +223,7 @@ onMounted(()=>{
|
|||
span {
|
||||
color: #ff4a00;
|
||||
}
|
||||
.nav-item{
|
||||
.nav-item {
|
||||
font-weight: bold;
|
||||
}
|
||||
.nav-item-btn {
|
||||
|
@ -250,7 +238,7 @@ onMounted(()=>{
|
|||
height: 2.5rem;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
.order-list {
|
||||
.order-lists {
|
||||
height: calc(100vh - 100px - 10.2rem);
|
||||
overflow-y: auto;
|
||||
.item {
|
||||
|
@ -336,7 +324,7 @@ onMounted(()=>{
|
|||
justify-content: space-between;
|
||||
font-size: 0.9rem;
|
||||
color: #777;
|
||||
.manage-btn{
|
||||
.manage-btn {
|
||||
color: #fff;
|
||||
background-color: #e6a23c;
|
||||
border-radius: 0.2rem;
|
||||
|
|
|
@ -9,9 +9,9 @@ import { ref, nextTick } from "vue";
|
|||
|
||||
<template>
|
||||
<div class="my-card">
|
||||
<order style="flex-shrink: 0;" ref="orderRef" isSystem/>
|
||||
<!-- <order style="flex-shrink: 0;" ref="orderRef" isSystem/>
|
||||
<padding />
|
||||
<detail ref="detailRef"/>
|
||||
<detail ref="detailRef"/> -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
<template>
|
||||
<!-- 小票内容 -->
|
||||
<div ref="receipt" id="receipt" style="max-width: 200px;">
|
||||
<h2>小票标题</h2>
|
||||
<p>商品名称: 商品1</p>
|
||||
<p>价格: ¥10.00</p>
|
||||
<p>数量: 1</p>
|
||||
<p>-------------------</p>
|
||||
<p>总计: ¥10.00</p>
|
||||
<p>-------------------</p>
|
||||
</div>
|
||||
<el-button type="priamry" @click="onPrint">打印</el-button>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import print from 'print-js'
|
||||
import { ref } from 'vue';
|
||||
|
||||
const receipt = ref(null);
|
||||
const onPrint = ()=>{
|
||||
console.log('开始打印', receipt);
|
||||
print({
|
||||
printable: 'receipt',
|
||||
type: 'html',
|
||||
maxWidth: '200'
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
#receipt {
|
||||
padding: 10px;
|
||||
padding-bottom: 20px;
|
||||
font-size: 12px;
|
||||
border: 1px solid #ccc;
|
||||
width: 200px;
|
||||
}
|
||||
</style>
|
Loading…
Reference in New Issue