京东打单

This commit is contained in:
DESKTOP-8FGKA8Q\chunfen 2024-12-28 15:40:08 +08:00
parent c662130a13
commit eea05ef828
6 changed files with 975 additions and 201 deletions

View File

@ -96,3 +96,11 @@ export function exportAfterOrder(params) {
responseType: 'blob'
})
}
export function getPrintInfo(params) {
return http({
url: "/api/print/orders",
method: "get",
params
})
}

View File

@ -82,3 +82,19 @@ export function orderRest(params) {
method: 'get',
})
}
export function shopAddress(params) {
return http({
url: "/api/shop_sends",
method: "get",
params,
});
}
export function updateShopAddress(params) {
return http({
url: '/api/shop_sends',
method: 'post',
params
})
}

View File

@ -0,0 +1,174 @@
<template>
<div>
<el-dialog :visible.sync="showVisible" title="地址管理" width="900px" @close="closeDialog">
<div style="margin-bottom: 20px;"><el-button type="primary" @click="addPrintAddr()">添加地址</el-button></div>
<div>
<el-table :data="addrList" border style="width: 100%;height: auto;" v-loading="loading">
<el-table-column prop="id" label="ID" align="center" width="70"/>
<el-table-column prop="name" label="姓名" align="center" width="100"/>
<el-table-column prop="mobile" label="联系方式" align="center" width="120"/>
<el-table-column label="详细地址">
<template slot-scope="scope">
<span>{{ scope.row.province }}{{ scope.row.city }}{{ scope.row.district }}{{ scope.row.detail }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100">
<template slot-scope="scope">
<el-button type="primary" size="mini" @click="editPrintAddr(scope.row)">编辑</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-dialog>
<el-dialog :visible.sync="printVisible" :title="curAddrId ? '编辑地址' : '新增地址'" width="500px">
<el-form label-width="100px">
<el-form-item label="姓名:">
<el-input v-model="printForm.name" type="input" placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="联系电话:">
<el-input v-model="printForm.mobile" type="input" placeholder="请输入联系电话" />
</el-form-item>
<el-form-item label="省:">
<el-input v-model="printForm.province" type="input" placeholder="请输入" />
</el-form-item>
<el-form-item label="市:">
<el-input v-model="printForm.city" type="input" placeholder="请输入号" />
</el-form-item>
<el-form-item label="区:">
<el-input v-model="printForm.district" type="input" placeholder="请输入" />
</el-form-item>
<el-form-item label="详细地址:">
<el-input v-model="printForm.detail" type="input" placeholder="街道-小区-门牌号" />
</el-form-item>
<el-form-item label="排序:">
<el-input v-model="printForm.sort" type="number" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="printVisible = false">取消</el-button>
<el-button type="primary" @click="commitPrintAddr()" :loading="btnLoading">确定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { shopAddress, updateShopAddress } from "@/api/shop"
export default {
props: {
id: {
type: Number,
default: () => {
return 0
}
},
show: {
type: Boolean,
default: () => {
return false
}
}
},
data() {
return {
btnLoading: false,
showVisible: false,
addrList: [],
curAddrId: '',
loading: false,
printForm: {},
printVisible: false
}
},
methods: {
getAddrList() {
this.loading = true
let params = {
shop_id: this.id,
page: 1,
pageSize: 1000
}
shopAddress(params).then((res) => {
console.log(res)
this.addrList = res.data.data
this.loading = false
}).catch(() => {
this.loading = false
})
},
addPrintAddr() {
this.curAddrId = ''
this.printForm = {}
this.printVisible = true
},
commitPrintAddr(){
if(!this.printForm.name) {
ElMessage({ type: 'warning', message: '请输入姓名' })
return
} else if(!this.printForm.mobile) {
ElMessage({ type: 'warning', message: '请输入联系电话' })
return
} else if(!this.printForm.province || !this.printForm.city || !this.printForm.district || !this.printForm.detail) {
ElMessage({ type: 'warning', message: '请输入地址信息' })
return
}
this.btnLoading = true
let params = {
...this.printForm
}
if(this.curAddrId) {
params.id = this.curAddrId
updateShopAddress(params).then((res) => {
this.$message({ type: 'success', message: '编辑成功' })
this.printVisible = false
this.getAddrList()
this.btnLoading = false
}).catch(() => {
this.btnLoading = false
})
} else {
updateShopAddress(params).then((res) => {
this.$message({ type: 'success', message: '添加成功' })
this.printVisible = false
this.getAddrList()
this.btnLoading = false
}).catch(() => {
this.btnLoading = false
})
}
},
editPrintAddr(row) {
this.curAddrId = row.id
this.printForm = JSON.parse(JSON.stringify(row))
this.printVisible = true
},
closeDialog() {
this.showVisible = false
this.$emit('close')
}
},
watch: {
show: {
handler(newVal, oldVal) {
if (newVal) {
this.showVisible = true
this.addrList = []
this.printList = []
this.getAddrList()
}
},
deep: true,
immediate: true
}
}
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,489 @@
<template>
<div class="conent">
<el-card>
<el-form ref="form" :inline="true" label-width="90px">
<el-form-item label="所属店铺:">
<el-select v-model="filter.shop_id" placeholder="店铺" @change="handleChoose()">
<el-option v-for="item in shopsList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="发货状态:">
<el-select v-model="filter.shipping_status" placeholder="发货状态" @change="handleChoose()">
<el-option value="" label="全部"></el-option>
<el-option value="0" label="未发货"></el-option>
<el-option value="2" label="部分发货"></el-option>
<el-option value="1" label="已发货"></el-option>
</el-select>
</el-form-item>
<el-form-item label="订单类型:">
<el-select v-model="filter.is_supplier" placeholder="订单类型" @change="handleChoose()">
<el-option value="" label="全部订单"></el-option>
<el-option :value="1" label="自卖团订单"></el-option>
<el-option :value="0" label="帮卖团订单"></el-option>
</el-select>
</el-form-item>
<el-form-item label="订单状态:">
<el-select v-model="filter.cancel_status" placeholder="订单状态" @change="handleChoose()">
<el-option value="" label="全部"></el-option>
<el-option :value="0" label="未取消"></el-option>
<el-option :value="1" label="已取消"></el-option>
</el-select>
</el-form-item>
<el-form-item label="售后状态:">
<el-select v-model="filter.after_sales_status" placeholder="售后状态" @change="handleChoose()">
<el-option value="" label="全部"></el-option>
<el-option :value="0" label="未售后"></el-option>
<el-option :value="1" label="有售后"></el-option>
</el-select>
</el-form-item>
<el-form-item label="商品数量:">
<el-select v-model="filter.goods_sku_num" placeholder="商品数量" @change="handleChoose()">
<el-option value="" label="全部"></el-option>
<el-option :value="1" label="1个商品"></el-option>
<el-option :value="2" label="2-5个商品"></el-option>
<el-option :value="6" label="6个以上商品"></el-option>
</el-select>
</el-form-item>
<el-form-item label="订单商品:">
<el-select v-model="filter.external_sku_ids" multiple filterable remote reserve-keyword placeholder="订单商品"
:remote-method="remoteMethod" :loading="searchLoading">
<el-option v-for="item in options" :key="item.external_sku_id" :label="item.title"
:value="item.external_sku_id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="下单时间:">
<el-date-picker v-model="confirmAt" type="datetimerange" range-separator="-" start-placeholder=""
end-placeholder="止" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" @change="handleChoose()">
</el-date-picker>
</el-form-item>
<el-form-item label="跟团号:">
<el-input v-model="filter.pno" placeholder="跟团号" @keyup.enter.native="handleChoose"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleChoose">筛选</el-button>
<el-button plain @click="handleReChoose">重置筛选</el-button>
<el-button type="primary" @click="openPrint">打印</el-button>
<!-- <el-button v-if="form.goods_sku_num === 2" type="primary">配货单导出</el-button> -->
<el-button type="warning" :loading="exportLoading" @click="handleExport" icon="el-icon-download">数据导出</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card style="margin-top: 10px">
<el-table v-loading="loading" ref="multipleTable" :data="orderList" style="width: 100%" border
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="店铺名称" prop="shop.name" />
<el-table-column label="跟团号" align="center">
<template slot-scope="scope">
{{ scope.row.is_supplier ? '自卖团: ' : '帮卖团: ' }}
{{ scope.row.is_supplier ? scope.row.participate_no : scope.row.supply_participate_no }}
</template>
</el-table-column>
<el-table-column label="收件人信息" width="240">
<template slot-scope="scope">
<p>{{ scope.row.receiver_name }}&nbsp;&nbsp;{{ scope.row.receiver_mobile }}</p>
<p>{{ scope.row.receiver_address_province }}/{{ scope.row.receiver_address_city }}/{{
scope.row.receiver_address_district }}</p>
<p>{{ scope.row.receiver_address_detail }}</p>
</template>
</el-table-column>
<el-table-column prop="shipping_status" label="发货状态" align="center"></el-table-column>
<el-table-column prop="cancel_status" label="订单状态" align="center"></el-table-column>
<el-table-column prop="after_sales_status" label="售后状态" align="center"></el-table-column>
<el-table-column label="商品信息" width="380">
<template slot-scope="scope">
<div v-for="item in scope.row.items" :key="item.id">
{{ item.goods_name }}
<span style="color: red;">+{{ item.goods_number }}</span>
</div>
</template>
</el-table-column>
<el-table-column prop="confirm_at" label="下单时间" width="150" align="center"></el-table-column>
</el-table>
<div class="page-pagination">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="page"
:page-sizes="[10, 50, 100]"
:page-size="per_page"
layout="prev, pager, next, sizes, jumper, total"
:total="total">
</el-pagination>
</div>
</el-card>
</div>
</template>
<script>
import { platOrderList, printOrders, printSuccess, exportOrder } from "@/api/plat";
import { storeList } from "@/api/shop"
import { goodsSkusList } from "@/api/goods"
import dayjs from 'dayjs'
export default {
data() {
return {
filter: {
shop_id: '',
shipping_status: '',
is_supplier: '',
cancel_status: 0,
after_sales_status: 0,
goods_sku_num: '',
external_sku_ids: '',
pno: ''
},
loading: false,
searchLoading: false,
options: [],
orderList: [],
total: 0,
page: 1, //
per_page: 10, //
shopsList: [],
confirmAt: [],
print_order_ids: '',
print_documents: [],
socket: null,
lockReconnect: false, //
timeout: 58 * 1000, //58
timeoutObj: null, //
serverTimeoutObj: null, //
timeoutnum: null, //
defaultPrinter: null,
taskIDArray: [],
requestIDGetGlobalConfig: '',
exportLoading: false
}
},
created() {
let start = dayjs().format('YYYY-MM-DD') + ' 00:00:00'
let end = dayjs().format('YYYY-MM-DD') + ' 23:59:59'
this.confirmAt = [start, end]
this.getOrderList()
this.getShopsList()
},
methods: {
getOrderList() {
this.loading = true
let params = {
...this.filter,
page: this.page,
per_page: this.per_page,
confirm_at_start: this.confirmAt ? this.confirmAt[0] : '',
confirm_at_end: this.confirmAt ? this.confirmAt[1] : ''
}
platOrderList(params).then((res) => {
this.orderList = res.data.data
this.total = res.data.meta.total
this.loading = false
}).catch(() => {
this.loading = false
})
},
getShopsList() {
let params = {
page: 0,
per_page: 99
}
storeList(params).then((res) => {
this.shopsList = res.data.data
})
},
handleSizeChange(val) {
this.page = 1
this.per_page = val
this.getOrderList()
},
handleCurrentChange(val) {
this.page = val
this.getOrderList()
},
handleChoose() {
this.page = 1
this.getOrderList()
},
handleReChoose() {
this.filter = {
shop_id: '',
shipping_status: '',
is_supplier: '',
cancel_status: 0,
after_sales_status: 0,
goods_sku_num: '',
external_sku_ids: '',
pno: ''
}
this.page = 1
this.getOrderList()
},
remoteMethod(query) {
if (query !== '') {
this.searchLoading = true;
setTimeout(() => {
this.searchLoading = false;
goodsSkusList(query).then((res) => {
this.options = res.data.filter(item => {
return item.title.toLowerCase().indexOf(query.toLowerCase()) > -1;
});
});
}, 200);
} else {
this.options = [];
}
},
print() {
const print_loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
printOrders(this.filter).then((res) => {
this.print_documents = res.data.documents;
this.print_order_ids = res.data.order_ids;
print_loading.close();
this.doPrint();
})
},
handleSelectionChange(val) {
let ids = []
val.forEach((item) => {
ids.push(item.id)
})
this.filter.ids = ids
},
initWebSocket() {
//weosocket
const wsuri = "ws://127.0.0.1:5000";
this.socket = new WebSocket(wsuri);
//
this.socket.onmessage = this.websocketonmessage;
//
this.socket.onopen = this.websocketonopen;
//
this.socket.onerror = this.websocketonerror;
//
this.socket.onclose = this.websocketclose;
},
//
websocketonopen() {
//
this.start();
if (this.socket.readyState === 1) {
//
this.getPrinters();
}
},
start() {
//
console.log("开启心跳");
var self = this;
self.timeoutObj && clearTimeout(self.timeoutObj);
self.serverTimeoutObj && clearTimeout(self.serverTimeoutObj);
self.timeoutObj = setTimeout(function () {
//
if (self.socket.readyState == 1) {
//
} else {
//
self.reconnect();
}
self.serverTimeoutObj = setTimeout(function () {
//
self.socket.close();
}, self.timeout);
}, self.timeout);
},
reconnect() {
//
var that = this;
if (that.lockReconnect) {
return;
}
that.lockReconnect = true;
//
that.timeoutnum && clearTimeout(that.timeoutnum);
that.timeoutnum = setTimeout(function () {
//
that.initWebSocket();
that.lockReconnect = false;
}, 5000);
},
//
websocketonerror() {
console.log("出现错误");
this.reconnect();
},
//
websocketonmessage(e) {
console.log(e);
if (JSON.parse(e.data).printers !== undefined) {
this.defaultPrinter = JSON.parse(e.data).defaultPrinter;
}
// JSON.parse JSON
console.log("默认打印机" + this.defaultPrinter)
if (JSON.parse(e.data).status === 'success') {
console.log("打印就绪..")
}
if (JSON.parse(e.data).status === 'failed') {
console.log("打印未就绪..")
}
if (JSON.parse(e.data).taskStatus === 'printed') {
console.log('出纸成功--打印成功')
//
printSuccess({ order_ids: this.print_order_ids }).then((res) => {
console.log(res)
})
}
if (JSON.parse(e.data).taskStatus === 'failed') {
console.log("打印失败!")
}
if (JSON.parse(e.data).taskStatus === 'canceled') {
console.log("打印取消!")
}
//
this.reset();
},
reset() {
//
var that = this;
//
clearTimeout(that.timeoutObj);
clearTimeout(that.serverTimeoutObj);
//
that.start();
},
websocketsend(Data) {
//
this.socket.send(Data);
},
//
websocketclose(e) {
//
console.log("断开连接", e);
//
this.reconnect();
},
getPrinters() {
var request = this.getRequestObject("getPrinters");
this.websocketsend(JSON.stringify(request));
},
doPrint() {
var request = this.getRequestObject("print");
request.task = new Object();
request.task.taskID = this.getUUID(8, 10);
// taskID taskIDArray
this.taskIDArray.push(request.task.taskID)
// ID
this.requestIDGetGlobalConfig = request.task.taskID
request.task.preview = false;
request.task.printer = this.defaultPrinter;
request.task.documents = this.print_documents;
console.log(request.task.documents)
this.websocketsend(JSON.stringify(request));
},
getRequestObject(cmd) {
var request = new Object();
// :ID,ID
request.requestID = this.getUUID(8, 16);
//:
request.version = "1.0";
//:
request.cmd = cmd;
return request;
},
getUUID(len, radix) {
var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
var uuid = [], i;
radix = radix || chars.length;
if (len) {
for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];
} else {
var r;
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
uuid[14] = '4';
for (i = 0; i < 36; i++) {
if (!uuid[i]) {
r = 0 | Math.random() * 16;
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
}
}
}
return uuid.join('');
},
handleExport() {
this.exportLoading = true
let params = {
...this.form,
page: 1,
per_page: this.per_page,
confirm_at_start: this.confirmAt[0] ? this.confirmAt[0] : '',
confirm_at_end: this.confirmAt[1] ? this.confirmAt[1] : '',
is_export: 1
}
// window.open("/api/plat_orders?" + this.objectToQueryString(params))
exportOrder(params).then((res) => {
this.downLoadXls(res.data)
this.$message({ type: 'success', message: '导出成功!' })
this.exportLoading = false
}).catch(() => {
this.exportLoading = false
})
},
downLoadXls(response) {
const content = response
const blob = new Blob([content])
const today = new Date().toLocaleDateString()
const fileName = `订单列表${today}.xlsx`
if ('download' in document.createElement('a')) {
// IE
const elink = document.createElement('a')
elink.download = fileName
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href) // URL
document.body.removeChild(elink)
} else {
// IE10+
navigator.msSaveBlob(blob, fileName)
}
},
objectToQueryString(obj) {
return Object.keys(obj)
.map(key => encodeURIComponent(key) + '=' + (obj[key] ? encodeURIComponent(obj[key]) : ''))
.join('&');
}
},
mounted() {
}
}
</script>
<style lang="scss" scoped>
</style>

View File

@ -18,6 +18,10 @@
</el-select>
</el-form-item>
<el-form-item label="订单ID:">
<el-input v-model="filter.id" placeholder="订单编号" @keyup.enter.native="handleChoose"></el-input>
</el-form-item>
<el-form-item label="订单类型:">
<el-select v-model="filter.is_supplier" placeholder="订单类型" @change="handleChoose()">
<el-option value="" label="全部订单"></el-option>
@ -60,20 +64,31 @@
</el-select>
</el-form-item>
<el-form-item label="下单时间:">
<el-date-picker v-model="confirmAt" type="datetimerange" range-separator="-" start-placeholder=""
end-placeholder="止" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" @change="handleChoose()">
</el-date-picker>
<el-form-item label="商品编码:">
<el-input v-model="filter.external_sku_id" placeholder="商品编码" @keyup.enter.native="handleChoose"></el-input>
</el-form-item>
<el-form-item label="跟团号:">
<el-input v-model="filter.pno" placeholder="跟团号" @keyup.enter.native="handleChoose"></el-input>
</el-form-item>
<el-form-item label="打印状态:">
<el-select v-model="filter.print_status" placeholder="请选择" @change="handleChoose()" clearable>
<el-option :value="1" label="已打印"></el-option>
<el-option :value="0" label="未打印"></el-option>
</el-select>
</el-form-item>
<el-form-item label="下单时间:">
<el-date-picker v-model="confirmAt" type="datetimerange" range-separator="-" start-placeholder=""
end-placeholder="止" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" @change="handleChoose()">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleChoose">筛选</el-button>
<el-button plain @click="handleReChoose">重置筛选</el-button>
<el-button type="primary" @click="print">打印</el-button>
<el-button type="primary" @click="openPrint">打印</el-button>
<!-- <el-button v-if="form.goods_sku_num === 2" type="primary">配货单导出</el-button> -->
<el-button type="warning" :loading="exportLoading" @click="handleExport" icon="el-icon-download">数据导出</el-button>
</el-form-item>
@ -83,7 +98,8 @@
<el-card style="margin-top: 10px">
<el-table v-loading="loading" ref="multipleTable" :data="orderList" style="width: 100%" border
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column type="selection" width="55" align="center" :selectable="selectable" />
<el-table-column label="订单ID" prop="id" width="80" align="center" />
<el-table-column label="店铺名称" prop="shop.name" />
<el-table-column label="跟团号" align="center">
<template slot-scope="scope">
@ -103,7 +119,7 @@
<el-table-column prop="shipping_status" label="发货状态" align="center"></el-table-column>
<el-table-column prop="cancel_status" label="订单状态" align="center"></el-table-column>
<el-table-column prop="after_sales_status" label="售后状态" align="center"></el-table-column>
<el-table-column label="商品信息" width="380">
<el-table-column label="商品信息" min-width="150">
<template slot-scope="scope">
<div v-for="item in scope.row.items" :key="item.id">
{{ item.goods_name }}
@ -111,6 +127,23 @@
</div>
</template>
</el-table-column>
<el-table-column label="面单信息" min-width="100" align="center">
<template slot-scope="scope">
<div v-if="scope.row.waybill">
<el-tag type="info" v-if="scope.row.waybill.status == 0">待申请运单</el-tag>
<el-tag type="primary" v-else-if="scope.row.waybill.status == 1">已申请运单</el-tag>
<el-tag type="warning" v-else-if="scope.row.waybill.status == 2">待打印</el-tag>
<el-tag type="success" v-else-if="scope.row.waybill.status == 3">打印成功</el-tag>
<div style="line-height: 16px;margin-top: 10px;">运单号{{ scope.row.waybill.waybill_code }}</div>
</div>
</template>
</el-table-column>
<el-table-column label="打印状态" align="center" width="110">
<template slot-scope="scope">
<span v-if="scope.row.print_status == 1" style="color: rgb(4, 190, 2);">已打印</span>
<span v-else>未打印</span>
</template>
</el-table-column>
<el-table-column prop="confirm_at" label="下单时间" width="150" align="center"></el-table-column>
</el-table>
@ -119,18 +152,66 @@
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="page"
:page-sizes="[10, 50, 100]"
:page-sizes="[10, 50, 100, 500]"
:page-size="per_page"
layout="prev, pager, next, sizes, jumper, total"
:total="total">
</el-pagination>
</div>
</el-card>
<el-dialog title="发货信息" width="960px" :visible.sync="showPrint" :close-on-click-modal="false" @close="closePrint">
<div v-if="connectStatus == 1" style="margin: -20px 0 20px;">
<el-alert title="已建立连接" type="success" show-icon></el-alert>
</div>
<el-table :data="tempList" style="width: 100%" border>
<el-table-column label="订单ID" prop="id" width="80" align="center" />
<el-table-column label="收件人信息" width="240">
<template slot-scope="scope">
<p>{{ scope.row.receiver_name }}&nbsp;&nbsp;{{ scope.row.receiver_mobile }}</p>
<p>{{ scope.row.receiver_address_province }}/{{ scope.row.receiver_address_city }}/{{
scope.row.receiver_address_district }}</p>
<p>{{ scope.row.receiver_address_detail }}</p>
</template>
</el-table-column>
<el-table-column prop="shipping_status" label="发货状态" align="center"></el-table-column>
<el-table-column prop="cancel_status" label="订单状态" align="center"></el-table-column>
<el-table-column label="商品信息" width="220">
<template slot-scope="scope">
<div v-for="item in scope.row.items" :key="item.id">
{{ item.goods_name }}
<span style="color: red;">+{{ item.goods_number }}</span>
</div>
</template>
</el-table-column>
<el-table-column label="打印状态" align="center">
<template slot-scope="scope">
<span v-if="scope.row.print_status == 0 || !scope.row.print_status">等待打印</span>
<span v-else-if="scope.row.print_status == 1" style="color: rgb(4, 190, 2);">打印成功</span>
<div v-else-if="scope.row.print_status == 2">
<div style="color: #f00;">打印失败</div>
<span style="font-size: 12px;color: #777;">{{ scope.row.fail_msg }}</span>
</div>
</template>
</el-table-column>
</el-table>
<el-form label-width="80px" style="margin-top: 20px;">
<el-form-item label="打印机:">
<el-select v-model="printName" placeholder="请选择打印机">
<el-option v-for="(item, i) in printsList" :key="i" :label="item" :value="item"></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button plain @click="showPrint = false">取消</el-button>
<el-button type="primary" @click="toPrint()" :loading="loading1">保存</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { platOrderList, printOrders, printSuccess, exportOrder } from "@/api/plat";
import { platOrderList, printOrders, getPrintInfo, exportOrder, printSuccess } from "@/api/plat";
import { storeList } from "@/api/shop"
import { goodsSkusList } from "@/api/goods"
import dayjs from 'dayjs'
@ -146,7 +227,8 @@ export default {
after_sales_status: 0,
goods_sku_num: '',
external_sku_ids: '',
pno: ''
pno: '',
external_sku_id: ''
},
loading: false,
searchLoading: false,
@ -168,7 +250,15 @@ export default {
defaultPrinter: null,
taskIDArray: [],
requestIDGetGlobalConfig: '',
exportLoading: false
exportLoading: false,
webSocket: null,
chooseList: [],
showPrint: false,
printName: '',
printsList: [],
loading1: false,
connectStatus: -1,
tempList: []
}
},
created() {
@ -261,176 +351,15 @@ export default {
this.doPrint();
})
},
selectable(row, index) {
if (row.shipping_status == '未发货' && row.cancel_status == '未取消' && row.print_status !== 1) {
return true
} else {
return false
}
},
handleSelectionChange(val) {
let ids = []
val.forEach((item) => {
ids.push(item.id)
})
this.filter.ids = ids
},
initWebSocket() {
//weosocket
const wsuri = "ws://127.0.0.1:5000";
this.socket = new WebSocket(wsuri);
//
this.socket.onmessage = this.websocketonmessage;
//
this.socket.onopen = this.websocketonopen;
//
this.socket.onerror = this.websocketonerror;
//
this.socket.onclose = this.websocketclose;
},
//
websocketonopen() {
//
this.start();
if (this.socket.readyState === 1) {
//
this.getPrinters();
}
},
start() {
//
console.log("开启心跳");
var self = this;
self.timeoutObj && clearTimeout(self.timeoutObj);
self.serverTimeoutObj && clearTimeout(self.serverTimeoutObj);
self.timeoutObj = setTimeout(function () {
//
if (self.socket.readyState == 1) {
//
} else {
//
self.reconnect();
}
self.serverTimeoutObj = setTimeout(function () {
//
self.socket.close();
}, self.timeout);
}, self.timeout);
},
reconnect() {
//
var that = this;
if (that.lockReconnect) {
return;
}
that.lockReconnect = true;
//
that.timeoutnum && clearTimeout(that.timeoutnum);
that.timeoutnum = setTimeout(function () {
//
that.initWebSocket();
that.lockReconnect = false;
}, 5000);
},
//
websocketonerror() {
console.log("出现错误");
this.reconnect();
},
//
websocketonmessage(e) {
console.log(e);
if (JSON.parse(e.data).printers !== undefined) {
this.defaultPrinter = JSON.parse(e.data).defaultPrinter;
}
// JSON.parse JSON
console.log("默认打印机" + this.defaultPrinter)
if (JSON.parse(e.data).status === 'success') {
console.log("打印就绪..")
}
if (JSON.parse(e.data).status === 'failed') {
console.log("打印未就绪..")
}
if (JSON.parse(e.data).taskStatus === 'printed') {
console.log('出纸成功--打印成功')
//
printSuccess({ order_ids: this.print_order_ids }).then((res) => {
console.log(res)
})
}
if (JSON.parse(e.data).taskStatus === 'failed') {
console.log("打印失败!")
}
if (JSON.parse(e.data).taskStatus === 'canceled') {
console.log("打印取消!")
}
//
this.reset();
},
reset() {
//
var that = this;
//
clearTimeout(that.timeoutObj);
clearTimeout(that.serverTimeoutObj);
//
that.start();
},
websocketsend(Data) {
//
this.socket.send(Data);
},
//
websocketclose(e) {
//
console.log("断开连接", e);
//
this.reconnect();
},
getPrinters() {
var request = this.getRequestObject("getPrinters");
this.websocketsend(JSON.stringify(request));
},
doPrint() {
var request = this.getRequestObject("print");
request.task = new Object();
request.task.taskID = this.getUUID(8, 10);
// taskID taskIDArray
this.taskIDArray.push(request.task.taskID)
// ID
this.requestIDGetGlobalConfig = request.task.taskID
request.task.preview = false;
request.task.printer = this.defaultPrinter;
request.task.documents = this.print_documents;
console.log(request.task.documents)
this.websocketsend(JSON.stringify(request));
},
getRequestObject(cmd) {
var request = new Object();
// :ID,ID
request.requestID = this.getUUID(8, 16);
//:
request.version = "1.0";
//:
request.cmd = cmd;
return request;
},
getUUID(len, radix) {
var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
var uuid = [], i;
radix = radix || chars.length;
if (len) {
for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];
} else {
var r;
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
uuid[14] = '4';
for (i = 0; i < 36; i++) {
if (!uuid[i]) {
r = 0 | Math.random() * 16;
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
}
}
}
return uuid.join('');
this.chooseList = val
},
handleExport() {
this.exportLoading = true
@ -476,6 +405,143 @@ export default {
return Object.keys(obj)
.map(key => encodeURIComponent(key) + '=' + (obj[key] ? encodeURIComponent(obj[key]) : ''))
.join('&');
},
// https://open.jdl.com/#/open-business-document/access-guide/157/54222
initWebSocket() {
try {
let State = new Array('正在连接', '已建立连接', '正在关闭连接', '已关闭连接')
let host = 'ws://localhost:9113'
const that = this
that.webSocket = new WebSocket(host)
that.webSocket.onopen = function() {
console.log(that.webSocket)
that.connectStatus = that.webSocket.readyState
that.getPrintList()
}
that.webSocket.onmessage = function(msg) {
let returnData = msg.data
let json = eval('(' + returnData + ')')
let content = json.content;
if(json.code == '6'){ //
that.printsList = content.split(',')
} else if(json.success == 'true' && json.code == '2'){ //
console.log('0.0', json)
that.getOrderList()
if(json.message == 'print success all'){ //
let ids = []
that.tempList.forEach((item, index) => {
ids.push(item.id)
that.$set(that.tempList[index], 'print_status', 1)
})
let params = {
order_ids: ids.join(',')
}
printSuccess(params)
} else if(json.message == 'print success, partly wrong.') { //
for (let i = 0; i < json.detailinfo.errors.length; i++) {
const it = json.detailinfo.errors[i]
that.$set(that.tempList[it.seq * 1 - 1], 'print_status', 2) //
that.$set(that.tempList[it.seq * 1 - 1], 'fail_msg', it.msg) //
}
let ids = []
that.tempList.forEach((item, index) => {
if(!item.fail_msg) {
that.$set(that.tempList[index], 'print_status', 1)
ids.push(item.id)
}
})
let params = {
order_ids: ids.join(',')
}
printSuccess(params) //
}
} else if(json.success == 'true' && json.code == '2') { //
for (let i = 0; i < json.detailinfo.detail.length; i++) {
const it = json.detailinfo.detail[i]
that.$set(that.tempList[it.seq * 1 - 1], 'print_status', 2)
that.$set(that.tempList[it.seq * 1 - 1], 'fail_msg', it.msg)
}
}
}
that.webSocket.onclose = function() {
that.$message({ type: 'info', message: State[that.webSocket.readyState] })
}
} catch (error) {
that.$message({ type: 'info', message: '连接失败' })
}
},
getPrintList() {
if(this.printsList.length){
return
}
//
var text = "{\"orderType\":\"GET_Printers\",\"pin\":\"用户名\",\"parameters\":{ \"tempUrl\":\"\", \"printName\":\"\", \"printData\":\"\" }}";
this.webSocket.send(text)
},
openPrint() {
if(this.chooseList.length) {
this.initWebSocket()
this.tempList = JSON.parse(JSON.stringify(this.chooseList))
this.tempList.forEach((item) => {
item.fail_msg = ''
})
this.showPrint = true
} else {
this.$message({ type: 'info', message: '请选择需要打印的订单' })
}
},
toPrint() {
if(!this.printName) {
this.$message({ type: 'info', message: '请选择打印机' })
return
}
this.loading1 = true
let ids = []
this.chooseList.forEach((item) => {
ids.push(item.id)
})
let params = {
ids: ids.join(',')
}
getPrintInfo(params).then((res) => {
let printObject = res.data.data
console.log(printObject)
let parameters = {
"orderType": "print",
"version": "2",
"parameters": {
"printName": this.printName,
"contents": []
}
}
for(let key in printObject) {
console.log(key)
parameters.parameters.contents.push({
"tempUrl": printObject[key].templateUrl,
"printData": printObject[key].encryptedData
})
}
this.webSocket.send(JSON.stringify(parameters))
this.loading1 = false
}).catch(() => {
this.loading1 = false
})
},
toPrint1() {
let printCmd = 'print'
let temp = 'https://template-content.jd.com/template-oss?tempCode=jdkd76x130'
let tempUser = ''
let printDataUser = ''
let printData = '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'
let text = "{\"orderType\": \""+ printCmd +"\", \"parameters\": {\"printName\": \""+ this.printName +"\", \"tempUrl\": \""+ temp +"\", \"customTempUrl\": \""+ tempUser +"\", \"customData\": [" + printDataUser +"], \"printData\": [\""+ printData +"\"] } }";
this.webSocket.send(text)
},
closePrint() {
this.$refs.multipleTable.clearSelection()
this.chooseList = []
this.printName = ''
this.webSocket.close()
}
}
}

View File

@ -18,28 +18,29 @@
</el-input>
</template>
</el-table-column> -->
<el-table-column label="操作" width="280">
<el-table-column label="操作" width="360">
<template slot-scope="scope">
<el-button type="danger" v-if="scope.row.status === '未授权'" size="mini"><a :href="scope.row.authUrl"
target="_blank" rel="noopener noreferrer">授权</a>
</el-button>
<div v-if="scope.row.status === '已授权'">
<template v-if="scope.row.status === '已授权'">
<el-button type="success" :disabled="true" size="mini">{{ scope.row.status }}</el-button>
<el-button @click="download(scope.row)" size="mini">下载商品</el-button>
<el-button type="primary" v-if="scope.row.status === '已授权'" size="mini"
@click="syncShopStock(scope.row.id)">同步库存</el-button>
</div>
<div v-if="scope.row.status === '重新授权'">
</template>
<template v-if="scope.row.status === '重新授权'">
<el-button type="danger" target="_blank" size="mini">
<a :href="scope.row.authUrl" rel="noopener noreferrer">重新授权</a>
</el-button>
<el-button @click="download(scope.row)" size="mini">下载商品</el-button>
</div>
</template>
<div v-if="scope.row.status === '无需授权'">
<el-button type="success" :disabled="true" size="mini">{{ scope.row.status }}</el-button>
</div>
<template v-if="scope.row.status === '无需授权'">
<el-button type="info" :disabled="true" size="mini">{{ scope.row.status }}</el-button>
</template>
<el-button type="warning" size="mini" @click="openAddr(scope.row.id)">发货地址</el-button>
</template>
</el-table-column>
</el-table>
@ -72,14 +73,22 @@
<el-button type="primary" @click="addSubmit"> </el-button>
</div>
</el-dialog>
<shop-address :show="showAddr" :id="shop_id" @close="showAddr = false"></shop-address>
</div>
</template>
<script>
import { shopListId, shopAdd, storeList, downloadGoods, updateStore, syncStoreStock } from "../../api/shop";
import shopAddress from "@/components/shop/address.vue"
export default {
components: { shopAddress },
data() {
return {
showAddr: false,
shop_id: 0,
dialogFormVisible: false,
form: {
name: "",
@ -98,7 +107,7 @@ export default {
],
},
storeId: [], // id
loading: true,
loading: false,
tableData: [],
Paginationdata: {}, //
current_page: 1, //
@ -135,6 +144,7 @@ export default {
//
getStoreList() {
this.loading = true
let page = {
page: this.current_page,
per_page: this.per_page,
@ -142,8 +152,11 @@ export default {
storeList(page).then((res) => {
this.tableData = res.data.data;
this.Paginationdata = res.data.meta;
});
this.loading = false
}).catch(() => {
this.loading = false
})
},
//
@ -167,19 +180,21 @@ export default {
//
download(row) {
const loading = this.$loading({
const Loading = this.$loading({
lock: true,
text: row.name + ' 店铺商品下载中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
downloadGoods(row.id).then((res) => {
loading.close();
Loading.close();
this.$message({
type: "success",
message: res.data.message,
});
});
}).catch(() => {
Loading.close()
})
},
handleCellChange(row) {
this.$confirm('确认修改成本变动吗?', '提示', {
@ -197,19 +212,25 @@ export default {
},
//
syncShopStock(id) {
let loading = this.$loading({
const Loading = this.$loading({
lock: true,
text: '店铺商品库存同步中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
syncStoreStock({ shop_id: id }).then((res) => {
loading.close();
Loading.close()
this.$message({
type: 'info',
message: res.data.message
})
});
}).catch(() => {
Loading.close()
})
},
openAddr(id) {
this.shop_id = id
this.showAddr = true
}
},
};