修复:加载状态一直转圈圈,更新:下载模板和导出数据的放在同一个地方,把商品列表项的"下载模板"和“店铺商品映射”功能按钮移到了上方功能栏,并联调”同步数据“后端接口,修改了同步数据库的“新增”和“修改”表单字段规则

This commit is contained in:
lihaoyuan 2025-07-18 15:12:20 +08:00
parent 658c7689e0
commit 3754154e2f
7 changed files with 212 additions and 1586 deletions

View File

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

View File

@ -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,

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

View File

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

View File

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

View File

@ -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)