This commit is contained in:
van
2026-04-09 12:52:32 +08:00
parent ffe48e0417
commit 416a7d77f5
4 changed files with 771 additions and 2 deletions

76
src/api/jarvis/goofish.js Normal file
View 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' })
}

View 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>

View 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>

View File

@@ -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()
},