修复:加载状态一直转圈圈,更新:下载模板和导出数据的放在同一个地方,把商品列表项的"下载模板"和“店铺商品映射”功能按钮移到了上方功能栏,并联调”同步数据“后端接口,修改了同步数据库的“新增”和“修改”表单字段规则
This commit is contained in:
parent
658c7689e0
commit
3754154e2f
@ -38,11 +38,11 @@ export async function deleteGoods(data) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function downloadTempGoods(data) {
|
export async function downloadTempGoods() {
|
||||||
data = stringify(data)
|
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/shop/shop-sync-productMapper/template?${data}`,
|
url: '/admin/shop/shop-sync-productMapper/template',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
|
responseType: 'blob',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,15 +58,18 @@ export async function batchCreateGoods(data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function batchExportGoods(data) {
|
export async function batchExportGoods(data) {
|
||||||
|
const formData = new URLSearchParams();
|
||||||
|
data.forEach(id => formData.append('ids', id));
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/shop/shop-sync-productMapper/exportSelected',
|
url: '/admin/shop/shop-sync-productMapper/exportSelected',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
},
|
},
|
||||||
data,
|
data: formData.toString(),
|
||||||
})
|
responseType: 'blob'
|
||||||
}
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export async function getProductMapping(data) {
|
export async function getProductMapping(data) {
|
||||||
return request({
|
return request({
|
||||||
@ -91,20 +94,26 @@ export async function downloadErrorReport(data) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function syncProductMaping() {
|
export async function syncProductMaping(storeId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/shop/shop-sync-productMapper/syncProductMaping`,
|
url: `/admin/shop/shop-sync-productMapper/syncProductMaping`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
},
|
},
|
||||||
|
params:{
|
||||||
|
storeId
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function importGoodsData(data) {
|
export async function importGoodsData(data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/shop/shop-sync-productMapper/importData`,
|
url: '/admin/shop/shop-sync-productMapper/importData',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'multipart/form-data',
|
||||||
|
},
|
||||||
data,
|
data,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -33,7 +33,7 @@ export function convertRouter(asyncRoutes) {
|
|||||||
|
|
||||||
if (route.meta.title == '店铺' && route.name == 'Vab330') {
|
if (route.meta.title == '店铺' && route.name == 'Vab330') {
|
||||||
const obj = {
|
const obj = {
|
||||||
path: '/goodsTool',
|
path: '/storeConf',
|
||||||
component: '@/views/store/storeConf/index',
|
component: '@/views/store/storeConf/index',
|
||||||
name: 'Vab88001',
|
name: 'Vab88001',
|
||||||
redirect: null,
|
redirect: null,
|
||||||
|
|||||||
119
src/views/product/goodsTool/BatchProductOperation.vue
Normal file
119
src/views/product/goodsTool/BatchProductOperation.vue
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog
|
||||||
|
title="批量商品上架"
|
||||||
|
:visible="visible"
|
||||||
|
width="600px"
|
||||||
|
@close="$emit('update:visible', false)"
|
||||||
|
>
|
||||||
|
<div class="operation-container">
|
||||||
|
<el-button plain type="info" @click="handleSyncProductMaping">
|
||||||
|
自动匹配规格
|
||||||
|
</el-button>
|
||||||
|
<el-button @click="handleSyncShopImages">图库匹配并上架商品</el-button>
|
||||||
|
<el-select
|
||||||
|
v-model="filter.storeId"
|
||||||
|
clearable
|
||||||
|
filterable
|
||||||
|
placeholder="选择店铺"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in shopList"
|
||||||
|
:key="item.store_id"
|
||||||
|
:label="item.store_name"
|
||||||
|
:value="item.store_id"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import GoodsToolApi from '@/api/goodsTool'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
filter: {
|
||||||
|
productName: '',
|
||||||
|
storeId: '',
|
||||||
|
},
|
||||||
|
tableData: [],
|
||||||
|
pagination: {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
total: 0,
|
||||||
|
},
|
||||||
|
selectedRowKeys: [],
|
||||||
|
shopList: [],
|
||||||
|
tableData: [],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
visible: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.getShopList()
|
||||||
|
this.getGoodsList()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleClose() {
|
||||||
|
this.$emit('update:visible', false)
|
||||||
|
},
|
||||||
|
open() {
|
||||||
|
console.log('123456456456')
|
||||||
|
this.$emit('update:visible', true)
|
||||||
|
},
|
||||||
|
async handleSyncProductMaping() {
|
||||||
|
const res = await GoodsToolApi.syncProductMaping(this.filter.storeId)
|
||||||
|
if (res.status == 200) {
|
||||||
|
this.$message.success('操作成功')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleSyncShopImages() {
|
||||||
|
if (!this.filter.storeId) {
|
||||||
|
this.$message.error('请选择店铺')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$confirm('确定要匹配当前选择店铺的商品图库?', '友情提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'danger',
|
||||||
|
}).then(async () => {
|
||||||
|
const res = await GoodsToolApi.syncShopImages({
|
||||||
|
storeId: this.filter.storeId,
|
||||||
|
})
|
||||||
|
if (res.status == 200) {
|
||||||
|
this.$message.success('操作成功')
|
||||||
|
this.getProductMapperList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleSelectionChange(selection) {
|
||||||
|
this.selectedRowKeys = selection.map((item) => item.id)
|
||||||
|
},
|
||||||
|
async getGoodsList() {
|
||||||
|
let res = await GoodsToolApi.getProductMapperList({
|
||||||
|
...this.filter,
|
||||||
|
pageNum: this.pagination.pageNum,
|
||||||
|
pageSize: this.pagination.pageSize,
|
||||||
|
})
|
||||||
|
this.tableData = res.data.items
|
||||||
|
this.pagination.total = res.data.records
|
||||||
|
},
|
||||||
|
async getShopList() {
|
||||||
|
let res = await GoodsToolApi.getShopList()
|
||||||
|
this.shopList = res.data.items
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.operation-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -319,25 +319,33 @@
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let res = null
|
try {
|
||||||
if (this.mode == 'add') {
|
let res = null;
|
||||||
res = await GoodsToolApi.batchCreateGoods(submitData)
|
if (this.mode === 'add') {
|
||||||
} else {
|
res = await GoodsToolApi.batchCreateGoods(submitData);
|
||||||
res = await GoodsToolApi.updateGoods({
|
|
||||||
...submitData?.[0],
|
|
||||||
id: this.batchForm.items?.[0].id,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res.status == 200) {
|
|
||||||
this.$message.success('操作成功')
|
|
||||||
} else {
|
|
||||||
this.loading = false
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
this.$message.error('请完善表单信息')
|
res = await GoodsToolApi.updateGoods({
|
||||||
return false
|
...submitData[0],
|
||||||
|
id: this.batchForm.items[0].id,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (res.status === 200) {
|
||||||
|
this.$message.success('操作成功');
|
||||||
|
this.drawerVisible = false; // 关闭抽屉
|
||||||
|
} else {
|
||||||
|
this.$message.error('操作失败: ' + res.msg);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('提交错误:', error);
|
||||||
|
this.$message.error('提交时发生错误');
|
||||||
|
} finally {
|
||||||
|
this.loading = false; // 确保无论成功或失败都重置 loading
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.$message.error('请完善表单信息');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -12,7 +12,7 @@
|
|||||||
:model="innerFormData"
|
:model="innerFormData"
|
||||||
:rules="rules"
|
:rules="rules"
|
||||||
>
|
>
|
||||||
<el-form-item label="店铺ID" prop="storeId">
|
<el-form-item label="店铺名字" prop="storeId" v-if="!isEdit">
|
||||||
<el-select v-model="innerFormData.storeId" placeholder="请选择店铺">
|
<el-select v-model="innerFormData.storeId" placeholder="请选择店铺">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in storeIdOptions"
|
v-for="item in storeIdOptions"
|
||||||
@ -22,7 +22,9 @@
|
|||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="店铺名字" prop="storeName" v-if="isEdit">
|
||||||
|
<el-input v-model="innerFormData.storeName" :disabled="isEdit"/>
|
||||||
|
</el-form-item>
|
||||||
<el-form-item label="数据库IP地址" prop="dbIp">
|
<el-form-item label="数据库IP地址" prop="dbIp">
|
||||||
<el-input v-model="innerFormData.dbIp" />
|
<el-input v-model="innerFormData.dbIp" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -61,9 +63,9 @@
|
|||||||
<el-form-item label="刷新时间" prop="refreshTime">
|
<el-form-item label="刷新时间" prop="refreshTime">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="innerFormData.refreshTime"
|
v-model="innerFormData.refreshTime"
|
||||||
:disabled="isEdit"
|
|
||||||
placeholder="请选择刷新时间"
|
placeholder="请选择刷新时间"
|
||||||
type="datetime"
|
type="datetime"
|
||||||
|
value-format="yyyy-MM-dd HH:mm:ss"
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
</el-date-picker>
|
</el-date-picker>
|
||||||
@ -91,7 +93,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="是否双向同步" prop="isTowSync">
|
<el-form-item label="是否双向同步" prop="isTowSync">
|
||||||
<el-radio-group v-model="innerFormData.isTowSync" :disabled="isEdit">
|
<el-radio-group v-model="innerFormData.isTowSync">
|
||||||
<el-radio :label="'1'">是</el-radio>
|
<el-radio :label="'1'">是</el-radio>
|
||||||
<el-radio :label="'0'">否</el-radio>
|
<el-radio :label="'0'">否</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
@ -134,7 +136,8 @@
|
|||||||
// 创建表单数据的副本,避免直接修改props
|
// 创建表单数据的副本,避免直接修改props
|
||||||
innerFormData: this.initFormData(),
|
innerFormData: this.initFormData(),
|
||||||
rules: {
|
rules: {
|
||||||
storeId: [{ required: true, message: '请选择店铺', trigger: 'blur' }],
|
storeId: [{ required: true, message: '请选择店铺', trigger: 'change' }],
|
||||||
|
// storeName: [{ required: true, message: '请输入店铺名字', trigger: 'blur' }],
|
||||||
dbIp: [
|
dbIp: [
|
||||||
{ required: true, message: '请输入数据库IP地址', trigger: 'blur' },
|
{ required: true, message: '请输入数据库IP地址', trigger: 'blur' },
|
||||||
{
|
{
|
||||||
@ -175,9 +178,9 @@
|
|||||||
remark: [
|
remark: [
|
||||||
{ required: true, message: '请输入备注信息', trigger: 'change' },
|
{ required: true, message: '请输入备注信息', trigger: 'change' },
|
||||||
],
|
],
|
||||||
refreshTime: [
|
// refreshTime: [
|
||||||
{ required: true, message: '请选择刷新时间', trigger: 'change' },
|
// { required: true, message: '请选择刷新时间', trigger: 'change' },
|
||||||
],
|
// ],
|
||||||
isTowSync: [
|
isTowSync: [
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
@ -219,6 +222,7 @@
|
|||||||
initFormData() {
|
initFormData() {
|
||||||
return {
|
return {
|
||||||
storeId: '',
|
storeId: '',
|
||||||
|
storeName:'',
|
||||||
dbIp: '',
|
dbIp: '',
|
||||||
dbType: '',
|
dbType: '',
|
||||||
dbName: '',
|
dbName: '',
|
||||||
@ -252,6 +256,7 @@
|
|||||||
this.$refs.formRef.validate((valid) => {
|
this.$refs.formRef.validate((valid) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
this.$emit('save', this.cloneData(this.innerFormData))
|
this.$emit('save', this.cloneData(this.innerFormData))
|
||||||
|
this.myVisible=false
|
||||||
} else {
|
} else {
|
||||||
this.$message.error('请完善表单信息')
|
this.$message.error('请完善表单信息')
|
||||||
return false
|
return false
|
||||||
|
|||||||
@ -43,6 +43,7 @@
|
|||||||
|
|
||||||
<el-table border :data="dbConfigList" stripe>
|
<el-table border :data="dbConfigList" stripe>
|
||||||
<el-table-column label="店铺ID" prop="storeId" />
|
<el-table-column label="店铺ID" prop="storeId" />
|
||||||
|
<el-table-column label="店铺名字" prop="storeName" />
|
||||||
<el-table-column label="数据库IP地址" prop="dbIp" />
|
<el-table-column label="数据库IP地址" prop="dbIp" />
|
||||||
<el-table-column label="数据库类型" prop="dbType" />
|
<el-table-column label="数据库类型" prop="dbType" />
|
||||||
<el-table-column label="数据库名称" prop="dbName" />
|
<el-table-column label="数据库名称" prop="dbName" />
|
||||||
@ -252,7 +253,8 @@
|
|||||||
let res = null
|
let res = null
|
||||||
if (this.isEditMode) {
|
if (this.isEditMode) {
|
||||||
res = await StoreConfApi.updateConfList({
|
res = await StoreConfApi.updateConfList({
|
||||||
...omit(data, ['refreshTime', 'isTowSync']),
|
// ...omit(data, ['refreshTime', 'isTowSync']),
|
||||||
|
...omit(data, ['storeName']),
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
res = await StoreConfApi.createConfList(data)
|
res = await StoreConfApi.createConfList(data)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user