1
This commit is contained in:
76
src/api/jarvis/goofish.js
Normal file
76
src/api/jarvis/goofish.js
Normal file
@@ -0,0 +1,76 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
/* ---------- 闲管家应用配置 ---------- */
|
||||
export function listErpOpenConfig(query) {
|
||||
return request({ url: '/jarvis/erpOpenConfig/list', method: 'get', params: query })
|
||||
}
|
||||
|
||||
export function getErpOpenConfig(id) {
|
||||
return request({ url: '/jarvis/erpOpenConfig/' + id, method: 'get' })
|
||||
}
|
||||
|
||||
export function addErpOpenConfig(data) {
|
||||
return request({ url: '/jarvis/erpOpenConfig', method: 'post', data })
|
||||
}
|
||||
|
||||
export function updateErpOpenConfig(data) {
|
||||
return request({ url: '/jarvis/erpOpenConfig', method: 'put', data })
|
||||
}
|
||||
|
||||
export function delErpOpenConfig(ids) {
|
||||
return request({ url: '/jarvis/erpOpenConfig/' + ids, method: 'delete' })
|
||||
}
|
||||
|
||||
/** 闲管家「查询快递公司」(与 Apifox 一致:服务端 POST {} + 签名) */
|
||||
export function listGoofishExpressCompanies(appKey) {
|
||||
return request({
|
||||
url: '/jarvis/erpOpenConfig/expressCompanies',
|
||||
method: 'get',
|
||||
params: appKey ? { appKey } : {}
|
||||
})
|
||||
}
|
||||
|
||||
/* ---------- 闲管家订单 ---------- */
|
||||
export function listGoofishOrder(query) {
|
||||
return request({ url: '/jarvis/erpGoofishOrder/list', method: 'get', params: query })
|
||||
}
|
||||
|
||||
export function getGoofishOrder(id) {
|
||||
return request({ url: '/jarvis/erpGoofishOrder/' + id, method: 'get' })
|
||||
}
|
||||
|
||||
export function pullGoofishOrders(appKey, hours) {
|
||||
return request({
|
||||
url: '/jarvis/erpGoofishOrder/pull/' + encodeURIComponent(appKey),
|
||||
method: 'post',
|
||||
params: hours != null ? { hours } : {}
|
||||
})
|
||||
}
|
||||
|
||||
export function pullAllGoofishOrders(hours) {
|
||||
return request({
|
||||
url: '/jarvis/erpGoofishOrder/pullAll',
|
||||
method: 'post',
|
||||
params: hours != null ? { hours } : {}
|
||||
})
|
||||
}
|
||||
|
||||
/** 历史全量:按服务端 pull-full-history-days + 时间分段拉 update_time */
|
||||
export function pullGoofishOrdersFull(appKey) {
|
||||
return request({
|
||||
url: '/jarvis/erpGoofishOrder/pull/' + encodeURIComponent(appKey) + '/full',
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
|
||||
export function pullAllGoofishOrdersFull() {
|
||||
return request({ url: '/jarvis/erpGoofishOrder/pullAll/full', method: 'post' })
|
||||
}
|
||||
|
||||
export function refreshGoofishDetail(id) {
|
||||
return request({ url: '/jarvis/erpGoofishOrder/refreshDetail/' + id, method: 'post' })
|
||||
}
|
||||
|
||||
export function retryGoofishShip(id) {
|
||||
return request({ url: '/jarvis/erpGoofishOrder/retryShip/' + id, method: 'post' })
|
||||
}
|
||||
466
src/views/system/goofish/erpGoofishOrder/index.vue
Normal file
466
src/views/system/goofish/erpGoofishOrder/index.vue
Normal file
@@ -0,0 +1,466 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-alert type="info" :closable="false" show-icon class="mb8">
|
||||
<template slot="title">
|
||||
<div style="line-height:1.6">
|
||||
① 第三方单号:本地京东单「第三方单号」= 闲鱼 order_no,用于关联与写入收件地址(jd_order.address)、物流 Redis 运单。<br>
|
||||
② 闲管家订单详情<strong>往往不落明文收货地址</strong>;列表中的地址优先来自详情字段,否则来自关联的京东「地址」。<br>
|
||||
③ 自动发货前请在「应用配置」填写 express_code(日日顺一般为 rrs)。<br>
|
||||
④ <strong>增量拉单</strong>:按「pull-lookback-hours」回溯;<strong>历史全量</strong>:按「pull-full-history-days」起点 + 「pull-time-chunk-seconds」对 update_time 分段;单次请求的 update_time 跨度不得超过「pull-max-update-time-range-seconds」(默认约 180 天,避免平台「仅 6 个月内」报错),过长区间会自动再拆段。
|
||||
</div>
|
||||
</template>
|
||||
</el-alert>
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="96px">
|
||||
<el-form-item label="AppKey" prop="appKey">
|
||||
<el-input v-model="queryParams.appKey" placeholder="可选" clearable @keyup.enter.native="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="订单号" prop="orderNo">
|
||||
<el-input v-model="queryParams.orderNo" placeholder="闲鱼订单号" clearable @keyup.enter.native="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="订单状态" prop="orderStatus">
|
||||
<el-select v-model="queryParams.orderStatus" placeholder="全部" clearable style="width: 130px">
|
||||
<el-option v-for="o in orderStatusOptions" :key="o.v" :label="o.l" :value="o.v" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="发货状态" prop="shipStatus">
|
||||
<el-select v-model="queryParams.shipStatus" placeholder="全部" clearable style="width: 120px">
|
||||
<el-option label="未发货" :value="0" />
|
||||
<el-option label="成功" :value="1" />
|
||||
<el-option label="失败" :value="2" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
@click="handlePullAll"
|
||||
v-hasPermi="['jarvis:erpGoofishOrder:edit']"
|
||||
>增量拉单</el-button>
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-time"
|
||||
size="mini"
|
||||
@click="handlePullHistoryFull"
|
||||
v-hasPermi="['jarvis:erpGoofishOrder:edit']"
|
||||
>历史全量拉单</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" />
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="list">
|
||||
<el-table-column label="ID" prop="id" width="72" />
|
||||
<el-table-column label="订单号" prop="orderNo" min-width="150" show-overflow-tooltip />
|
||||
<el-table-column label="商品" min-width="260">
|
||||
<template slot-scope="scope">
|
||||
<div class="goods-cell">
|
||||
<el-image
|
||||
v-if="goodsThumb(scope.row)"
|
||||
:src="goodsThumb(scope.row)"
|
||||
:preview-src-list="[goodsThumb(scope.row)]"
|
||||
fit="cover"
|
||||
class="goods-thumb"
|
||||
>
|
||||
<div slot="error" class="goods-thumb-error"><i class="el-icon-picture-outline" /></div>
|
||||
</el-image>
|
||||
<div v-else class="goods-thumb goods-thumb--empty"><i class="el-icon-goods" /></div>
|
||||
<span class="goods-title-txt" :title="displayGoodsTitle(scope.row)">{{ displayGoodsTitle(scope.row) }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="买家 buyer_nick" prop="buyerNick" width="120" show-overflow-tooltip />
|
||||
<el-table-column label="会员名" prop="userName" width="110" show-overflow-tooltip />
|
||||
<el-table-column label="订单状态" prop="orderStatus" width="92">
|
||||
<template slot-scope="scope">
|
||||
{{ orderStatusLabel(scope.row.orderStatus) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="实付 pay_amount" prop="payAmount" width="118" align="right">
|
||||
<template slot-scope="scope">
|
||||
{{ formatPayDisplay(scope.row) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="退款" prop="refundStatus" width="64" />
|
||||
<el-table-column label="第三方单号(本地)" prop="jdThirdPartyOrderNo" min-width="130" show-overflow-tooltip />
|
||||
<el-table-column label="内部单" prop="jdRemark" width="100" show-overflow-tooltip />
|
||||
<el-table-column label="运单号 waybill_no" prop="detailWaybillNo" min-width="128" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ displayWaybillNo(scope.row) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="快递 express_name" min-width="130" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
<span v-if="displayExpressName(scope.row) !== '—'">
|
||||
{{ displayExpressName(scope.row) }}
|
||||
<template v-if="scope.row.detailExpressCode || detailDataField(scope.row, 'express_code')">
|
||||
({{ scope.row.detailExpressCode || detailDataField(scope.row, 'express_code') }})
|
||||
</template>
|
||||
</span>
|
||||
<span v-else>—</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="运单(本地扫描)" prop="localWaybillNo" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column label="收货人/手机" min-width="120" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ displayReceiverName(scope.row) }} {{ displayReceiverMobile(scope.row) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="省/市/区/镇" min-width="140" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ displayRecvSplit(scope.row) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="详细 address" min-width="130" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ displayAddressLine(scope.row) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="京东地址(兜底)" prop="jdAddress" min-width="140" show-overflow-tooltip />
|
||||
<el-table-column label="发货" prop="shipStatus" width="76">
|
||||
<template slot-scope="scope">
|
||||
{{ shipLabel(scope.row.shipStatus) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="更新时间" prop="modifyTime" width="100">
|
||||
<template slot-scope="scope">
|
||||
<span v-if="scope.row.modifyTime">{{ scope.row.modifyTime }}</span>
|
||||
<span v-else>-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" width="200" fixed="right">
|
||||
<template slot-scope="scope">
|
||||
<el-button size="mini" type="text" @click="openJson(scope.row)" v-hasPermi="['jarvis:erpGoofishOrder:query']">详情JSON</el-button>
|
||||
<el-button size="mini" type="text" @click="handleRefresh(scope.row)" v-hasPermi="['jarvis:erpGoofishOrder:edit']">刷新详情</el-button>
|
||||
<el-button size="mini" type="text" @click="handleRetryShip(scope.row)" v-hasPermi="['jarvis:erpGoofishOrder:edit']">重试发货</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
|
||||
|
||||
<el-dialog title="订单详情 JSON(含开放平台原始返回)" :visible.sync="jsonOpen" width="900px" append-to-body>
|
||||
<el-tabs v-model="jsonTab">
|
||||
<el-tab-pane label="摘要" name="sum">
|
||||
<el-descriptions :column="1" border size="small">
|
||||
<el-descriptions-item label="商品标题 title">
|
||||
<div class="sum-goods">
|
||||
<el-image
|
||||
v-if="goodsThumb(jsonRow)"
|
||||
:src="goodsThumb(jsonRow)"
|
||||
:preview-src-list="[goodsThumb(jsonRow)]"
|
||||
fit="cover"
|
||||
class="sum-goods-img"
|
||||
>
|
||||
<div slot="error" class="goods-thumb-error"><i class="el-icon-picture-outline" /></div>
|
||||
</el-image>
|
||||
<span>{{ displayGoodsTitle(jsonRow) }}</span>
|
||||
</div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="运单号 waybill_no">{{ displayWaybillNo(jsonRow) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="快递公司 express_name">{{ displayExpressName(jsonRow) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="实付 pay_amount(分→元)">{{ formatPayDisplay(jsonRow) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="本地扫描运单">{{ jsonRow.localWaybillNo || '-' }}</el-descriptions-item>
|
||||
<el-descriptions-item label="买家昵称 buyer_nick">{{ displayBuyerNick(jsonRow) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="收货人 receiver_name">{{ displayReceiverName(jsonRow) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="手机 receiver_mobile">{{ displayReceiverMobile(jsonRow) || '—' }}</el-descriptions-item>
|
||||
<el-descriptions-item label="省/市/区/镇 prov…town">{{ displayRecvSplit(jsonRow) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="详细地址 address">{{ displayAddressLine(jsonRow) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="拼接区划 receiver_region">{{ jsonRow.receiverRegion || '—' }}</el-descriptions-item>
|
||||
<el-descriptions-item label="京东地址">{{ jsonRow.jdAddress || '-' }}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="detail_json" name="detail">
|
||||
<pre class="json-pre">{{ pretty(jsonRow.detailJson) }}</pre>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="last_notify_json" name="notify">
|
||||
<pre class="json-pre">{{ pretty(jsonRow.lastNotifyJson) }}</pre>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
<p v-if="jsonRow.shipError" style="color:#f56c6c">发货错误:{{ jsonRow.shipError }}</p>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listGoofishOrder, pullAllGoofishOrders, pullAllGoofishOrdersFull, pullGoofishOrdersFull, refreshGoofishDetail, retryGoofishShip } from '@/api/jarvis/goofish'
|
||||
|
||||
export default {
|
||||
name: 'ErpGoofishOrder',
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
showSearch: true,
|
||||
total: 0,
|
||||
list: [],
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
appKey: undefined,
|
||||
orderNo: undefined,
|
||||
orderStatus: undefined,
|
||||
shipStatus: undefined
|
||||
},
|
||||
orderStatusOptions: [
|
||||
{ v: 11, l: '待付款' },
|
||||
{ v: 12, l: '待发货' },
|
||||
{ v: 21, l: '已发货' },
|
||||
{ v: 22, l: '已完成' },
|
||||
{ v: 23, l: '已退款' },
|
||||
{ v: 24, l: '已关闭' }
|
||||
],
|
||||
jsonOpen: false,
|
||||
jsonTab: 'sum',
|
||||
jsonRow: {}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getList()
|
||||
},
|
||||
methods: {
|
||||
orderStatusLabel(s) {
|
||||
const o = this.orderStatusOptions.find(x => x.v === s)
|
||||
return o ? o.l : (s == null ? '-' : s)
|
||||
},
|
||||
shipLabel(s) {
|
||||
if (s === 1) return '成功'
|
||||
if (s === 2) return '失败'
|
||||
return '未发'
|
||||
},
|
||||
detailDataField(row, key) {
|
||||
if (!row || !row.detailJson) return null
|
||||
try {
|
||||
const root = JSON.parse(row.detailJson)
|
||||
const d = root && root.data ? root.data : root
|
||||
if (!d || d[key] === undefined || d[key] === null || d[key] === '') return null
|
||||
return d[key]
|
||||
} catch (e) {
|
||||
return null
|
||||
}
|
||||
},
|
||||
displayGoodsTitle(row) {
|
||||
if (!row) return '—'
|
||||
if (row.goodsTitle) return row.goodsTitle
|
||||
const t = this.detailDataField(row, 'goods')
|
||||
if (t && t.title) return t.title
|
||||
return '—'
|
||||
},
|
||||
displayBuyerNick(row) {
|
||||
if (!row) return '—'
|
||||
return row.buyerNick || this.detailDataField(row, 'buyer_nick') || '—'
|
||||
},
|
||||
displayReceiverName(row) {
|
||||
if (!row) return '-'
|
||||
return row.receiverName || this.detailDataField(row, 'receiver_name') || '-'
|
||||
},
|
||||
displayReceiverMobile(row) {
|
||||
if (!row) return ''
|
||||
const m = row.receiverMobile || this.detailDataField(row, 'receiver_mobile')
|
||||
return m || ''
|
||||
},
|
||||
displayRecvSplit(row) {
|
||||
if (!row) return '—'
|
||||
const p = row.recvProvName || this.detailDataField(row, 'prov_name')
|
||||
const c = row.recvCityName || this.detailDataField(row, 'city_name')
|
||||
const a = row.recvAreaName || this.detailDataField(row, 'area_name')
|
||||
const t = row.recvTownName || this.detailDataField(row, 'town_name')
|
||||
const s = [p, c, a, t].filter(x => x != null && String(x).trim() !== '').map(x => String(x).trim()).join(' ')
|
||||
return s || '—'
|
||||
},
|
||||
displayAddressLine(row) {
|
||||
if (!row) return '—'
|
||||
const a = row.receiverAddress || this.detailDataField(row, 'address')
|
||||
return a || '—'
|
||||
},
|
||||
displayWaybillNo(row) {
|
||||
if (!row) return '—'
|
||||
return row.detailWaybillNo || this.detailDataField(row, 'waybill_no') || '—'
|
||||
},
|
||||
displayExpressName(row) {
|
||||
if (!row) return '—'
|
||||
const name = row.detailExpressName || this.detailDataField(row, 'express_name')
|
||||
if (name) return name
|
||||
const code = row.detailExpressCode || this.detailDataField(row, 'express_code')
|
||||
return code || '—'
|
||||
},
|
||||
payAmountFen(row) {
|
||||
if (!row) return null
|
||||
if (row.payAmount != null && row.payAmount !== '') {
|
||||
const n = Number(row.payAmount)
|
||||
return Number.isNaN(n) ? null : n
|
||||
}
|
||||
const v = this.detailDataField(row, 'pay_amount')
|
||||
if (v == null || v === '') return null
|
||||
const n = Number(v)
|
||||
return Number.isNaN(n) ? null : n
|
||||
},
|
||||
formatPayDisplay(row) {
|
||||
const fen = this.payAmountFen(row)
|
||||
if (fen == null) return '—'
|
||||
return (fen / 100).toFixed(2) + ' 元'
|
||||
},
|
||||
/** 后端 goodsImageUrl;无则尝试从 detail_json 补一张(旧数据未落库时) */
|
||||
goodsThumb(row) {
|
||||
if (!row) return ''
|
||||
if (row.goodsImageUrl) return row.goodsImageUrl
|
||||
const raw = row.detailJson
|
||||
if (!raw) return ''
|
||||
try {
|
||||
const root = JSON.parse(raw)
|
||||
const data = root && root.data ? root.data : root
|
||||
const g = data && data.goods
|
||||
if (!g) return ''
|
||||
if (g.images && g.images.length) return g.images[0]
|
||||
return g.image || g.pic || g.cover || ''
|
||||
} catch (e) {
|
||||
return ''
|
||||
}
|
||||
},
|
||||
pretty(s) {
|
||||
if (!s) return '-'
|
||||
try {
|
||||
return JSON.stringify(JSON.parse(s), null, 2)
|
||||
} catch (e) {
|
||||
return s
|
||||
}
|
||||
},
|
||||
getList() {
|
||||
this.loading = true
|
||||
listGoofishOrder(this.queryParams).then(res => {
|
||||
this.list = res.rows
|
||||
this.total = res.total
|
||||
this.loading = false
|
||||
}).catch(() => { this.loading = false })
|
||||
},
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1
|
||||
this.getList()
|
||||
},
|
||||
resetQuery() {
|
||||
this.resetForm('queryForm')
|
||||
this.handleQuery()
|
||||
},
|
||||
handlePullAll() {
|
||||
this.$modal.confirm('按配置 pull-lookback-hours 拉取所有启用账号订单(增量),可能较耗时,是否继续?').then(() => {
|
||||
return pullAllGoofishOrders()
|
||||
}).then(res => {
|
||||
const n = (res && res.data && res.data.processedItems) ? res.data.processedItems : 0
|
||||
this.$modal.msgSuccess('增量拉单完成,处理项约 ' + n)
|
||||
this.getList()
|
||||
}).catch(() => {})
|
||||
},
|
||||
handlePullHistoryFull() {
|
||||
this.$prompt('留空 = 所有启用应用;否则只拉此处填写的 AppKey(须已在配置中心启用)', '历史全量拉单', {
|
||||
confirmButtonText: '开始',
|
||||
cancelButtonText: '取消',
|
||||
inputPlaceholder: '可选 AppKey',
|
||||
inputValue: this.queryParams.appKey || ''
|
||||
}).then(({ value }) => {
|
||||
const key = value != null ? String(value).trim() : ''
|
||||
const req = key ? pullGoofishOrdersFull(key) : pullAllGoofishOrdersFull()
|
||||
return req.then(res => ({ res, key }))
|
||||
}).then(({ res, key }) => {
|
||||
const n = (res && res.data && res.data.processedItems) ? res.data.processedItems : 0
|
||||
const d = res && res.data ? res.data.pullFullHistoryDays : ''
|
||||
const c = res && res.data ? res.data.pullTimeChunkSeconds : ''
|
||||
this.$modal.msgSuccess(
|
||||
(key ? '已按 AppKey 拉取' : '已全部启用账号拉取') + `,处理项约 ${n}(pull-full-history-days=${d}, chunk 秒=${c})`
|
||||
)
|
||||
this.getList()
|
||||
}).catch(() => {})
|
||||
},
|
||||
handleRefresh(row) {
|
||||
refreshGoofishDetail(row.id).then(() => {
|
||||
this.$modal.msgSuccess('已请求刷新详情')
|
||||
this.getList()
|
||||
})
|
||||
},
|
||||
handleRetryShip(row) {
|
||||
retryGoofishShip(row.id).then(() => {
|
||||
this.$modal.msgSuccess('已重试发货流程')
|
||||
this.getList()
|
||||
})
|
||||
},
|
||||
openJson(row) {
|
||||
this.jsonRow = { ...row }
|
||||
this.jsonTab = 'sum'
|
||||
this.jsonOpen = true
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.json-pre {
|
||||
max-height: 480px;
|
||||
overflow: auto;
|
||||
background: #1e1e1e;
|
||||
color: #d4d4d4;
|
||||
padding: 12px;
|
||||
border-radius: 4px;
|
||||
font-size: 12px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
.mb8 {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.goods-cell {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
.goods-thumb {
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
flex-shrink: 0;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #ebeef5;
|
||||
background: #f5f7fa;
|
||||
}
|
||||
.goods-thumb--empty {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: #c0c4cc;
|
||||
font-size: 20px;
|
||||
}
|
||||
.goods-thumb-error {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: #c0c4cc;
|
||||
font-size: 18px;
|
||||
}
|
||||
.goods-title-txt {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
line-height: 1.4;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
.sum-goods {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 12px;
|
||||
}
|
||||
.sum-goods-img {
|
||||
width: 72px;
|
||||
height: 72px;
|
||||
flex-shrink: 0;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #ebeef5;
|
||||
}
|
||||
</style>
|
||||
227
src/views/system/goofish/erpOpenConfig/index.vue
Normal file
227
src/views/system/goofish/erpOpenConfig/index.vue
Normal file
@@ -0,0 +1,227 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
|
||||
<el-form-item label="AppKey" prop="appKey">
|
||||
<el-input v-model="queryParams.appKey" placeholder="AppKey" clearable @keyup.enter.native="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-select v-model="queryParams.status" placeholder="全部" clearable style="width: 120px">
|
||||
<el-option label="正常" value="0" />
|
||||
<el-option label="停用" value="1" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['jarvis:erpOpenConfig:add']">新增</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" />
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="list">
|
||||
<el-table-column label="ID" prop="id" width="70" />
|
||||
<el-table-column label="AppKey" prop="appKey" min-width="140" show-overflow-tooltip />
|
||||
<el-table-column label="闲鱼会员名" prop="xyUserName" width="120" show-overflow-tooltip />
|
||||
<el-table-column label="快递编码" prop="expressCode" width="100" show-overflow-tooltip />
|
||||
<el-table-column label="快递名称" prop="expressName" width="100" show-overflow-tooltip />
|
||||
<el-table-column label="状态" prop="status" width="72">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ scope.row.status === '0' ? '正常' : '停用' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="排序" prop="orderNum" width="70" />
|
||||
<el-table-column label="备注" prop="remark" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['jarvis:erpOpenConfig:edit']">修改</el-button>
|
||||
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['jarvis:erpOpenConfig:remove']">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
|
||||
|
||||
<el-dialog title="闲管家快递公司(点击行填入表单)" :visible.sync="expressOpen" width="720px" append-to-body @open="loadExpressList">
|
||||
<p style="margin:0 0 8px;font-size:12px;color:#909399">签名与 POST 体必须为 <code>{}</code>;Apifox 里 body 留空会导致签名校验失败。</p>
|
||||
<el-table v-loading="expressLoading" :data="expressList" size="small" max-height="400" @row-click="pickExpress">
|
||||
<el-table-column prop="code" label="编码(code)" width="140" />
|
||||
<el-table-column prop="express_name" label="名称" min-width="160" show-overflow-tooltip />
|
||||
<el-table-column prop="express_alias" label="简称" width="100" />
|
||||
<el-table-column prop="is_hot" label="热门" width="72">
|
||||
<template slot-scope="scope">{{ scope.row.is_hot ? '是' : '' }}</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog :title="title" :visible.sync="open" width="560px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="110px">
|
||||
<el-form-item label="AppKey" prop="appKey">
|
||||
<el-input v-model="form.appKey" placeholder="开放平台 AppKey" :disabled="!!form.id" />
|
||||
</el-form-item>
|
||||
<el-form-item label="AppSecret" prop="appSecret">
|
||||
<el-input v-model="form.appSecret" type="password" show-password placeholder="AppSecret" />
|
||||
</el-form-item>
|
||||
<el-form-item label="闲鱼会员名" prop="xyUserName">
|
||||
<el-input v-model="form.xyUserName" placeholder="展示用,可选" />
|
||||
</el-form-item>
|
||||
<el-form-item label="快递编码" prop="expressCode">
|
||||
<el-input v-model="form.expressCode" placeholder="如日日顺为 rrs(以平台列表为准)">
|
||||
<el-button slot="append" type="primary" @click="openExpressDialog">拉取列表</el-button>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="快递名称" prop="expressName">
|
||||
<el-input v-model="form.expressName" placeholder="如 日日顺" />
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-radio-group v-model="form.status">
|
||||
<el-radio label="0">正常</el-radio>
|
||||
<el-radio label="1">停用</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="排序" prop="orderNum">
|
||||
<el-input-number v-model="form.orderNum" :min="0" controls-position="right" style="width: 160px" />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" type="textarea" rows="2" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listErpOpenConfig, getErpOpenConfig, addErpOpenConfig, updateErpOpenConfig, delErpOpenConfig, listGoofishExpressCompanies } from '@/api/jarvis/goofish'
|
||||
|
||||
export default {
|
||||
name: 'ErpOpenConfig',
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
showSearch: true,
|
||||
total: 0,
|
||||
list: [],
|
||||
open: false,
|
||||
title: '',
|
||||
queryParams: { pageNum: 1, pageSize: 10, appKey: undefined, status: undefined },
|
||||
form: {},
|
||||
expressOpen: false,
|
||||
expressLoading: false,
|
||||
expressList: [],
|
||||
rules: {
|
||||
appKey: [{ required: true, message: 'AppKey 不能为空', trigger: 'blur' }],
|
||||
appSecret: [{ required: true, message: 'AppSecret 不能为空', trigger: 'blur' }],
|
||||
status: [{ required: true, message: '状态必选', trigger: 'change' }]
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getList()
|
||||
},
|
||||
methods: {
|
||||
getList() {
|
||||
this.loading = true
|
||||
listErpOpenConfig(this.queryParams).then(res => {
|
||||
this.list = res.rows
|
||||
this.total = res.total
|
||||
this.loading = false
|
||||
}).catch(() => { this.loading = false })
|
||||
},
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1
|
||||
this.getList()
|
||||
},
|
||||
resetQuery() {
|
||||
this.resetForm('queryForm')
|
||||
this.handleQuery()
|
||||
},
|
||||
reset() {
|
||||
this.form = {
|
||||
id: undefined,
|
||||
appKey: undefined,
|
||||
appSecret: undefined,
|
||||
xyUserName: undefined,
|
||||
expressCode: undefined,
|
||||
expressName: '日日顺',
|
||||
status: '0',
|
||||
orderNum: 0,
|
||||
remark: undefined
|
||||
}
|
||||
this.resetForm('form')
|
||||
},
|
||||
handleAdd() {
|
||||
this.reset()
|
||||
this.open = true
|
||||
this.title = '新增应用配置'
|
||||
},
|
||||
handleUpdate(row) {
|
||||
this.reset()
|
||||
const id = row.id
|
||||
getErpOpenConfig(id).then(res => {
|
||||
this.form = res.data
|
||||
this.open = true
|
||||
this.title = '修改应用配置'
|
||||
})
|
||||
},
|
||||
submitForm() {
|
||||
this.$refs.form.validate(valid => {
|
||||
if (!valid) return
|
||||
if (this.form.id != null) {
|
||||
updateErpOpenConfig(this.form).then(() => {
|
||||
this.$modal.msgSuccess('修改成功')
|
||||
this.open = false
|
||||
this.getList()
|
||||
})
|
||||
} else {
|
||||
addErpOpenConfig(this.form).then(() => {
|
||||
this.$modal.msgSuccess('新增成功')
|
||||
this.open = false
|
||||
this.getList()
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
cancel() {
|
||||
this.open = false
|
||||
},
|
||||
openExpressDialog() {
|
||||
this.expressOpen = true
|
||||
},
|
||||
loadExpressList() {
|
||||
const appKey = this.form && this.form.appKey ? this.form.appKey : undefined
|
||||
this.expressLoading = true
|
||||
listGoofishExpressCompanies(appKey).then(res => {
|
||||
const data = res.data || {}
|
||||
this.expressList = data.list || []
|
||||
this.expressLoading = false
|
||||
if (!this.expressList.length) {
|
||||
this.$modal.msgWarning('列表为空或未返回 list,请检查后台报错或密钥')
|
||||
}
|
||||
}).catch(() => { this.expressLoading = false })
|
||||
},
|
||||
pickExpress(row) {
|
||||
if (!row) return
|
||||
this.form.expressCode = row.code
|
||||
this.form.expressName = row.express_name || row.express_alias || ''
|
||||
this.expressOpen = false
|
||||
this.$modal.msgSuccess('已填入:' + row.code)
|
||||
},
|
||||
handleDelete(row) {
|
||||
this.$modal.confirm('是否确认删除编号为 ' + row.id + ' 的配置?').then(() => {
|
||||
return delErpOpenConfig(row.id)
|
||||
}).then(() => {
|
||||
this.getList()
|
||||
this.$modal.msgSuccess('删除成功')
|
||||
}).catch(() => {})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -134,11 +134,11 @@ export default {
|
||||
}
|
||||
return 'F-' + s
|
||||
},
|
||||
/** 地址压成一行:换行/多空格合并为单空格,去掉中文逗号 */
|
||||
/** 地址压成一行:换行/多空格合并为单空格,去掉中英文逗号 */
|
||||
compressAddressOneLine(raw) {
|
||||
if (raw == null) return ''
|
||||
return String(raw)
|
||||
.replace(/,/g, '')
|
||||
.replace(/[,,]/g, '')
|
||||
.replace(/\s+/g, ' ')
|
||||
.trim()
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user