Commit 304cb871 authored by 何远江's avatar 何远江

添加excel订单解析,优化页面,删除无用菜单

parent 10f577e1
FROM nginx
MAINTAINER tanghao@163.com
VOLUME /tmp
ENV LANG en_US.UTF-8
RUN echo "server { \
listen 80; \
client_max_body_size 50M; \
location /api/ { \
proxy_pass http://192.168.3.91:10000/; \
proxy_redirect off; \
proxy_set_header Host topsun-excel-order; \
proxy_set_header X-Real-IP \$remote_addr; \
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; \
} \
#解决Router(mode: 'history')模式下,刷新路由地址不能找到页面的问题 \
location / { \
root /var/www/html/; \
index index.html index.htm; \
if (!-e \$request_filename) { \
rewrite ^(.*)\$ /index.html?s=\$1 last; \
break; \
} \
} \
access_log /var/log/nginx/access.log ; \
} " > /etc/nginx/conf.d/default.conf \
&& mkdir -p /var/www \
&& mkdir -p /var/www/html
ADD dist/ /var/www/html/
EXPOSE 80
EXPOSE 443
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
"loadsh": "^0.0.4", "loadsh": "^0.0.4",
"luckyexcel": "^1.0.1", "luckyexcel": "^1.0.1",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^3.2.1",
"sass": "^1.69.5", "sass": "^1.69.5",
"vue": "^3.3.4", "vue": "^3.3.4",
"vue-router": "^4.2.5", "vue-router": "^4.2.5",
......
import axios from 'axios' import axios from '@/utils/http'
const formHeader = { const formHeader = {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
} }
......
import axios from 'axios' import axios from '@/utils/http'
const formHeader = { const formHeader = {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
} }
...@@ -56,3 +57,15 @@ export const addUserOrderFileConf = (data: any) => { ...@@ -56,3 +57,15 @@ export const addUserOrderFileConf = (data: any) => {
export const editUserOrderFileConf = (data: any) => { export const editUserOrderFileConf = (data: any) => {
return axios.post('/api/userOrderFileConf/edit', data) return axios.post('/api/userOrderFileConf/edit', data)
} }
/**
* 获取用户
* @param data
* @returns
*/
export const getUserList = (params: any) => {
return axios.get('/api/sysUser/page', {
params,
headers: formHeader
})
}
import axios from 'axios' import axios from '@/utils/http'
const formHeader = { const formHeader = {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
} }
......
import axios from 'axios' import axios from '@/utils/http'
const formHeader = { const formHeader = {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
} }
...@@ -71,9 +72,9 @@ export const getExcelOrderIndex = (fileId: string) => { ...@@ -71,9 +72,9 @@ export const getExcelOrderIndex = (fileId: string) => {
* @param {String} productCode * @param {String} productCode
* @returns * @returns
*/ */
export const getVariableField = (productCode: any) => { export const getVariableField = (excelOrderId: any) => {
return axios.get('/api/excel/variableField', { return axios.get('/api/excel/variableField', {
params: { productCode }, params: { excelOrderId },
headers: formHeader headers: formHeader
}) })
} }
......
import axios from 'axios' import axios from '@/utils/http'
const formHeader = { const formHeader = {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
} }
...@@ -90,3 +91,27 @@ export const confirmExcelFileOrderById = (excelOrderId: string) => { ...@@ -90,3 +91,27 @@ export const confirmExcelFileOrderById = (excelOrderId: string) => {
headers: formHeader headers: formHeader
}) })
} }
/** 根据订单文件获取订单字段配置 */
export const getConfByExcelOrderId = (excelOrderId: string) => {
return axios.get('/api/excelFileOrder/getConfByExcelOrderId', {
params: { excelOrderId },
headers: formHeader
})
}
/** 转换订单记录 */
export const convertOrderPage = (params: any) => {
return axios.get('/api/convertOrder/page', {
params,
headers: formHeader
})
}
/** 批量删除记录 */
export const convertOrderBatchDeleteById = (ids: any) => {
return axios.get('/api/convertOrder/batchDeleteById', {
params: { ids },
headers: formHeader
})
}
import axios from 'axios' import axios from '@/utils/http'
const formHeader = { const formHeader = {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
} }
...@@ -76,12 +76,12 @@ export const deleteProductCategorys = (ids: string) => { ...@@ -76,12 +76,12 @@ export const deleteProductCategorys = (ids: string) => {
} }
/** /**
* 获取产品对照表 * 获取产品对照
* @param params * @param params
* @returns * @returns
*/ */
export const getProductCompareList = (params: any) => { export const getExcelProdFileConfPage = (params: any) => {
return axios.get('/api/productCompare/page', { return axios.get('/api/excelProductFileConf/page', {
params, params,
headers: formHeader headers: formHeader
}) })
...@@ -92,6 +92,13 @@ export const getProductCompareList = (params: any) => { ...@@ -92,6 +92,13 @@ export const getProductCompareList = (params: any) => {
* @param data * @param data
* @returns * @returns
*/ */
export const saveProductCompare = (data: any) => { export const saveExcelProdFileConf = (data: any) => {
return axios.post('/api/productCompare/add', data) return axios.post('/api/excelProductFileConf/add', data)
}
export const deleteExcelProdFileConfByIds = (ids: string) => {
return axios.get('/api/excelProductFileConf/batchDeleteByIds', {
params: {ids},
headers: formHeader
})
} }
\ No newline at end of file
...@@ -14,9 +14,7 @@ ...@@ -14,9 +14,7 @@
<el-form-item label="客户名称"> <el-form-item label="客户名称">
<el-input v-model="formState.customerName"></el-input> <el-input v-model="formState.customerName"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="客户类型">
<el-select v-model="formState.customerType"> </el-select>
</el-form-item>
<el-form-item> <el-form-item>
<el-button @click="resetForm">重置</el-button> <el-button @click="resetForm">重置</el-button>
<el-button @click="queryCustomer" type="primary">查询</el-button> <el-button @click="queryCustomer" type="primary">查询</el-button>
...@@ -27,11 +25,7 @@ ...@@ -27,11 +25,7 @@
<vxe-column type="checkbox" width="40"></vxe-column> <vxe-column type="checkbox" width="40"></vxe-column>
<!-- <vxe-column field="customerId" title="客户id"></vxe-column> --> <!-- <vxe-column field="customerId" title="客户id"></vxe-column> -->
<vxe-column field="customerName" title="客户名称"></vxe-column> <vxe-column field="customerName" title="客户名称"></vxe-column>
<vxe-column field="customerType" title="客户类型"> <vxe-column field="customerNickName" title="客户简称"></vxe-column>
<template #default="{ row }">
{{ row.customerType === 'brand' ? '品牌' : '工厂' }}
</template>
</vxe-column>
</vxe-table> </vxe-table>
<vxe-pager <vxe-pager
......
...@@ -16,9 +16,9 @@ ...@@ -16,9 +16,9 @@
<vxe-table ref="xTable" border :data="tableData" :loading="loading" size="mini" height="400"> <vxe-table ref="xTable" border :data="tableData" :loading="loading" size="mini" height="400">
<vxe-column type="checkbox" width="40"></vxe-column> <vxe-column type="checkbox" width="40"></vxe-column>
<vxe-column field="productId" title="产品id"></vxe-column> <vxe-column field="productCode" title="产品编码" width="200"></vxe-column>
<vxe-column field="productName" title="产品名称"></vxe-column> <vxe-column field="productName" title="产品名称"></vxe-column>
<vxe-column field="brandName" title="产品品牌"></vxe-column> <vxe-column field="productCategoryId_dictText" title="产品类型" width="200"></vxe-column>
</vxe-table> </vxe-table>
<vxe-pager <vxe-pager
......
<template>
<vxe-modal
v-model="showEdit"
:z-index="1006"
@hide="onHide"
title="用户选择"
width="800"
esc-closable
mask-closable
show-footer
>
<template #default>
<el-form :model="formState" size="small" inline>
<el-form-item label="用户名称">
<el-input v-model="formState.nickName"></el-input>
</el-form-item>
<el-form-item>
<el-button @click="resetForm">重置</el-button>
<el-button @click="queryUser" type="primary">查询</el-button>
</el-form-item>
</el-form>
<vxe-table ref="xTable" border :data="tableData" :loading="loading" size="small" height="400">
<vxe-column type="checkbox" width="40"></vxe-column>
<vxe-column field="nickName" title="用户名称"></vxe-column>
<vxe-column field="phonenumber" title="联系电话"></vxe-column>
<vxe-column field="email" title="邮箱"></vxe-column>
</vxe-table>
<vxe-pager
size="small"
background
v-model:current-page="formState.currentPage"
v-model:page-size="formState.pageSize"
:total="formState.total"
@page-change="queryUser"
:layouts="['PrevPage', 'JumpNumber', 'NextPage', 'Sizes', 'FullJump', 'Total']"
>
</vxe-pager>
</template>
<template #footer>
<el-button type="primary" @click="confirmModal">确认</el-button>
</template>
</vxe-modal>
</template>
<script lang="ts">
import { defineComponent, ref, onMounted, reactive, watch } from 'vue'
import { getUserList } from '@/api/customer'
import type { VxeTableInstance } from 'vxe-table'
export default defineComponent({
name: 'UserModal',
props: {
visible: {
type: Boolean,
default: false
}
},
emits: ['confirm', 'update:visible'],
setup(props, { emit }) {
const loading = ref(false)
const showEdit = ref(false)
const xTable = ref<VxeTableInstance>()
const tableData = ref([])
const formState = reactive({
nickName: '',
currentPage: 1,
pageSize: 10,
total: 0
})
watch(
() => props.visible,
(val) => {
showEdit.value = val
}
)
const resetForm = () => {
}
const queryUser = async () => {
loading.value = true
try {
const { data } = await getUserList(formState)
tableData.value = data.result.records
formState.total = +data.result.total
} catch {}
loading.value = false
}
const confirmModal = () => {
const list = xTable.value?.getCheckboxRecords()
emit('confirm', list)
emit('update:visible', false)
}
const onHide = () => {
emit('update:visible', false)
}
onMounted(() => {
queryUser()
})
return {
showEdit,
xTable,
formState,
loading,
tableData,
resetForm,
onHide,
confirmModal,
queryUser
}
}
})
</script>
<style lang="scss" scoped></style>
import { createRouter, createWebHistory } from 'vue-router' import { createRouter, createWebHistory } from 'vue-router'
import Layout from '@/layout/LayoutView.vue' import Layout from '@/layout/LayoutView.vue'
import type { App } from 'vue' import type { App } from 'vue'
import { useUserStore } from '@/stores/user'
const baseRoutes = [ const baseRoutes = [
{ {
path: '/', path: '/',
name: 'Root', name: 'Root',
redirect: '/home' redirect: '/order/list'
} }
] ]
export const routes = [ export const routes = [
{ // {
path: '/home', // path: '/home',
component: Layout, // component: Layout,
hiddenChild: true, // hiddenChild: true,
meta: { // meta: {
title: '首页' // title: '首页'
}, // },
children: [ // children: [
{ // {
path: '', // path: '',
name: 'Home', // name: 'Home',
component: () => import('@/views/home/HomeView.vue') // component: () => import('@/views/home/HomeView.vue')
} // }
] // ]
}, // },
{ {
path: '/order', path: '/order',
name: 'Order', name: 'Order',
...@@ -50,6 +51,14 @@ export const routes = [ ...@@ -50,6 +51,14 @@ export const routes = [
title: '订单转换' title: '订单转换'
} }
}, },
{
path: '/order/conver',
name: 'OrderConver',
component: () => import('@/views/order/convertOrder/index.vue'),
meta: {
title: '转换记录'
}
},
{ {
path: '/order/customer', path: '/order/customer',
name: 'OrderCustomer', name: 'OrderCustomer',
...@@ -89,40 +98,40 @@ export const routes = [ ...@@ -89,40 +98,40 @@ export const routes = [
} }
] ]
}, },
{ // {
path: '/configure', // path: '/configure',
name: 'Configure', // name: 'Configure',
component: Layout, // component: Layout,
meta: { // meta: {
title: '配置管理' // title: '配置管理'
}, // },
children: [ // children: [
{ // // {
path: '/configure/color', // // path: '/configure/color',
name: 'ConfigureColor', // // name: 'ConfigureColor',
component: () => import('@/views/configure/colors/ConfigureColor.vue'), // // component: () => import('@/views/configure/colors/ConfigureColor.vue'),
meta: { // // meta: {
title: '颜色管理' // // title: '颜色管理'
} // // }
}, // // },
{ // {
path: '/configure/factory', // path: '/configure/factory',
name: 'ConfigureFactory', // name: 'ConfigureFactory',
component: () => import('@/views/configure/factory/ConfigureFactory.vue'), // component: () => import('@/views/configure/factory/ConfigureFactory.vue'),
meta: { // meta: {
title: '工厂管理' // title: '工厂管理'
} // }
}, // },
{ // {
path: '/configure/brand', // path: '/configure/brand',
name: 'ConfigureBrand', // name: 'ConfigureBrand',
component: () => import('@/views/configure/brand/ConfigureBrand.vue'), // component: () => import('@/views/configure/brand/ConfigureBrand.vue'),
meta: { // meta: {
title: '品牌管理' // title: '品牌管理'
} // }
} // }
] // ]
}, // },
{ {
path: '/product', path: '/product',
name: 'Product', name: 'Product',
...@@ -139,14 +148,6 @@ export const routes = [ ...@@ -139,14 +148,6 @@ export const routes = [
title: '产品列表' title: '产品列表'
} }
}, },
{
path: '/product/category',
name: 'ProductCategory',
component: () => import('@/views/product/productCategory/ProductCategory.vue'),
meta: {
title: '产品类别'
}
},
{ {
path: '/product/compare', path: '/product/compare',
name: 'ProductCompare', name: 'ProductCompare',
...@@ -190,6 +191,20 @@ const router = createRouter({ ...@@ -190,6 +191,20 @@ const router = createRouter({
routes: [...baseRoutes, ...routes] routes: [...baseRoutes, ...routes]
}) })
router.beforeEach((to, from, next) => {
if (to.query.userId) {
const userStore = useUserStore()
userStore.setUserInfo(to.query.userId)
next({
replace: true,
path: to.path
})
}
next()
})
export function setupRouter(app: App) { export function setupRouter(app: App) {
app.use(router) app.use(router)
} }
......
import type { App } from 'vue'; import type { App } from 'vue'
import { createPinia } from 'pinia'; import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
const store = createPinia(); const store = createPinia()
store.use(piniaPluginPersistedstate)
export function setupStore(app: App<Element>) { export function setupStore(app: App<Element>) {
app.use(store); app.use(store)
} }
export { store }; export { store }
import type { Recordable } from '@/types/global'
import { defineStore } from 'pinia'
type StoreState = {
userId: string
}
export const useUserStore = defineStore('userStore', {
state: (): StoreState => ({
userId: ''
}),
getters: {
getUserInfo(): string {
return this.userId
}
},
actions: {
setUserInfo(id: any) {
this.userId = id
}
},persist: true
})
import axios, { type InternalAxiosRequestConfig } from 'axios'
import { useUserStore } from '@/stores/user'
const service = axios.create()
service.interceptors.request.use((config) => {
const userStore = useUserStore()
if (userStore.getUserInfo) {
config.headers.set('Userid', userStore.getUserInfo)
}
return config
})
export default service
\ No newline at end of file
import type { Recordable } from '@/types/global'
/**
* 处理查询参数模糊查询
* @param params
* @param field
*/
export function queryParamsFilter(params: Recordable, field?: string[]) {
const exclude = ['currentPage', 'pageSize', 'total', 'column', 'order'].concat(field || [])
const p = Object.assign({}, params)
for (const key in params) {
if (!exclude.includes(key)) {
p[key] = `*${p[key]}*`
}
}
return p
}
<template> <template>
<ExcelOperate v-if="loading" /> <ExcelOperate v-if="loading" />
<el-button class="page-back" type="primary" size="large" :icon="Back" circle @click="pageBack" />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
import { useRoute } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import { getOrderFileById } from '@/api/order' import { getOrderFileById } from '@/api/order'
import { useCommentExcel } from '@/stores/commentExcel' import { useCommentExcel } from '@/stores/commentExcel'
import ExcelOperate from './components/ExcelOperate/ExcelOperate.vue' import ExcelOperate from './components/ExcelOperate/ExcelOperate.vue'
import { Back } from '@element-plus/icons-vue'
const loading = ref(false) const loading = ref(false)
const route = useRoute() const route = useRoute()
const router = useRouter()
const { setFileInfo } = useCommentExcel() const { setFileInfo } = useCommentExcel()
// 获取文件信息及客户信息 // 获取文件信息及客户信息
...@@ -21,9 +24,19 @@ const queryFileInfo = async () => { ...@@ -21,9 +24,19 @@ const queryFileInfo = async () => {
loading.value = true loading.value = true
} }
const pageBack = () => {
router.go(-1)
}
onMounted(() => { onMounted(() => {
route.query?.fileId && queryFileInfo() route.query?.fileId && queryFileInfo()
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped>
.page-back {
position: fixed;
bottom: 40px;
right: 30px;
z-index: 1001;
}
</style>
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<p class="font-bold text-lg leading-10 border-b-2">客户邮箱管理</p> <p class="font-bold text-lg leading-10 border-b-2">客户邮箱管理</p>
<el-form class="pt-4" :inline="true" :model="formState"> <el-form class="pt-4" :inline="true" :model="formState">
<el-form-item label="客户"> <el-form-item label="客户">
<el-input v-model="formState.customerName" placeholder="" disabled> <el-input v-model="formState.customerName" placeholder="" readonly>
<template #append> <template #append>
<el-button :icon="MoreFilled" @click="openModal('search')"></el-button> <el-button :icon="MoreFilled" @click="openModal('search')"></el-button>
</template> </template>
......
<template> <template>
<div class="h-full flex flex-col bg-white p-2"> <div class="h-full flex flex-col bg-white p-2">
<p class="font-bold text-lg leading-10 border-b-2">客户列表</p> <p class="font-bold text-lg leading-10 border-b-2">工厂客户</p>
<el-form class="pt-2" :model="formState" size="small" inline> <el-form class="pt-2" :model="formState" inline>
<el-form-item label="客户名称"> <el-form-item label="客户名称">
<el-input v-model="formState.customerName"></el-input> <el-input v-model="formState.customerName"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="客户类型"> <el-form-item label="客户简称">
<el-select v-model="formState.customerType"> </el-select> <el-input v-model="formState.customerNickName"></el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="resetForm">重置</el-button> <el-button @click="resetForm">重置</el-button>
...@@ -22,14 +22,8 @@ ...@@ -22,14 +22,8 @@
:loading="loading" :loading="loading"
size="small" size="small"
> >
<vxe-column type="checkbox" width="40"></vxe-column>
<!-- <vxe-column field="customerId" title="客户id"></vxe-column> -->
<vxe-column field="customerName" title="客户名称"></vxe-column> <vxe-column field="customerName" title="客户名称"></vxe-column>
<vxe-column field="customerType" title="客户类型"> <vxe-column field="customerNickName" title="客户简称"></vxe-column>
<template #default="{ row }">
{{ row.customerType === 'brand' ? '品牌' : '工厂' }}
</template>
</vxe-column>
<vxe-column field="action" title="操作" width="100"> <vxe-column field="action" title="操作" width="100">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" text size="small" @click="toEmail(row)">查看邮箱</el-button> <el-button type="primary" text size="small" @click="toEmail(row)">查看邮箱</el-button>
...@@ -51,10 +45,11 @@ ...@@ -51,10 +45,11 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { defineComponent, ref, onMounted, reactive, watch } from 'vue' import { defineComponent, ref, onMounted, reactive, watch, unref } from 'vue'
import { getCustomerPage } from '@/api/customer' import { getCustomerPage } from '@/api/customer'
import type { VxeTableInstance } from 'vxe-table' import type { VxeTableInstance } from 'vxe-table'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { queryParamsFilter } from '@/utils/query';
const loading = ref(false) const loading = ref(false)
const router = useRouter() const router = useRouter()
...@@ -63,7 +58,7 @@ const xTable = ref<VxeTableInstance>() ...@@ -63,7 +58,7 @@ const xTable = ref<VxeTableInstance>()
const tableData = ref([]) const tableData = ref([])
const formState = reactive({ const formState = reactive({
customerName: '', customerName: '',
customerType: '', customerNickName: '',
currentPage: 1, currentPage: 1,
pageSize: 10, pageSize: 10,
total: 0 total: 0
...@@ -82,7 +77,9 @@ const toEmail = (row: any) => { ...@@ -82,7 +77,9 @@ const toEmail = (row: any) => {
const queryCustomer = async () => { const queryCustomer = async () => {
loading.value = true loading.value = true
try { try {
const { data } = await getCustomerPage(formState) // 模糊查询
const { data } = await getCustomerPage(queryParamsFilter(unref(formState)))
tableData.value = data.result.records tableData.value = data.result.records
formState.total = +data.result.total formState.total = +data.result.total
} catch {} } catch {}
...@@ -91,7 +88,7 @@ const queryCustomer = async () => { ...@@ -91,7 +88,7 @@ const queryCustomer = async () => {
const resetForm = () => { const resetForm = () => {
Object.assign(formState, { Object.assign(formState, {
customerName: '', customerName: '',
customerType: '' customerNickName: ''
}) })
} }
......
...@@ -3,14 +3,18 @@ ...@@ -3,14 +3,18 @@
<p class="font-bold text-lg leading-10 border-b-2">负责客户配置</p> <p class="font-bold text-lg leading-10 border-b-2">负责客户配置</p>
<el-form class="pt-4" :inline="true" :model="formState"> <el-form class="pt-4" :inline="true" :model="formState">
<el-form-item label="客户"> <el-form-item label="客户">
<el-input v-model="formState.customerId_dictText" placeholder="" disabled> <el-input v-model="formState.customerId_dictText" placeholder="" readonly>
<template #append> <template #append>
<el-button :icon="MoreFilled" @click="openModal('search')"></el-button> <el-button :icon="MoreFilled" @click="openModal('search')"></el-button>
</template> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item label="用户"> <el-form-item label="用户">
<el-input v-model="formState.userId_dictText" placeholder="" /> <el-input v-model="formState.userId_dictText" placeholder="">
<template #append>
<el-button :icon="MoreFilled" @click="openUserModal('search')"></el-button>
</template>
</el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
...@@ -58,7 +62,14 @@ ...@@ -58,7 +62,14 @@
</vxe-pager> </vxe-pager>
</div> </div>
<vxe-modal :z-index="1005" v-model="showEdit" title="编辑&保存" destroy-on-close esc-closable @hide="onHide"> <vxe-modal
:z-index="1005"
v-model="showEdit"
title="编辑&保存"
destroy-on-close
esc-closable
@hide="onHide"
>
<template #default> <template #default>
<el-form ref="formRef" label-width="90px" :model="formEdit" :rules="formRules"> <el-form ref="formRef" label-width="90px" :model="formEdit" :rules="formRules">
<el-form-item label="客户" prop="customerId_dictText"> <el-form-item label="客户" prop="customerId_dictText">
...@@ -70,9 +81,9 @@ ...@@ -70,9 +81,9 @@
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="userId_dictText"> <el-form-item label="用户" prop="userId_dictText">
<el-input v-model="formEdit.userId_dictText" disabled> <el-input v-model="formEdit.userId_dictText" disabled>
<!-- <template #append> <template #append>
<el-button :icon="MoreFilled" @click="openModal('edit')"></el-button> <el-button :icon="MoreFilled" @click="openUserModal('edit')"></el-button>
</template> --> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
...@@ -84,6 +95,7 @@ ...@@ -84,6 +95,7 @@
</vxe-modal> </vxe-modal>
<CustomerModal v-model:visible="visibleModal" @confirm="confirmCustomer" /> <CustomerModal v-model:visible="visibleModal" @confirm="confirmCustomer" />
<UserModal v-model:visible="visibleUserModal" @confirm="confirmUser" />
</div> </div>
</template> </template>
...@@ -94,14 +106,20 @@ import type { VxeTableInstance } from 'vxe-table' ...@@ -94,14 +106,20 @@ import type { VxeTableInstance } from 'vxe-table'
import { MoreFilled } from '@element-plus/icons-vue' import { MoreFilled } from '@element-plus/icons-vue'
import CustomerModal from '@/components/CustomerModal/CustomerModal.vue' import CustomerModal from '@/components/CustomerModal/CustomerModal.vue'
import UserModal from '@/components/UserModal/UserModal.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { getUserOrderFileConfPage, editUserOrderFileConf, addUserOrderFileConf, deleteUserOrderFileConfByIds } from '@/api/customer' import {
getUserOrderFileConfPage,
editUserOrderFileConf,
addUserOrderFileConf,
deleteUserOrderFileConfByIds
} from '@/api/customer'
const route = useRoute()
const visibleModal = ref(false) const visibleModal = ref(false)
const loading = ref(false) const loading = ref(false)
const saveLoading = ref(false) const saveLoading = ref(false)
const showEdit = ref(false) const showEdit = ref(false)
const visibleUserModal = ref(false)
const formState = reactive({ const formState = reactive({
customerId_dictText: '', customerId_dictText: '',
userId_dictText: '', userId_dictText: '',
...@@ -117,12 +135,13 @@ const formRef = ref() ...@@ -117,12 +135,13 @@ const formRef = ref()
const xTable = ref<VxeTableInstance>() const xTable = ref<VxeTableInstance>()
const formRules = reactive({ const formRules = reactive({
userId_dictText: [{ required: true, message: '请选择邮箱客户', trigger: 'change' }], userId_dictText: [{ required: true, message: '请选择邮箱客户', trigger: 'change' }],
customerId_dictText: [{ required: true, message: '请选择邮箱客户', trigger: 'change' }] customerId_dictText: [{ required: true, message: '请选择邮箱客户', trigger: 'change' }]
}) })
const formEdit = reactive<Record<string, any>>({ const formEdit = reactive<Record<string, any>>({
customerId_dictText: '', customerId_dictText: '',
userId_dictText: '', customerId: '',
userId: '',
userId_dictText: ''
}) })
const tableData = ref([]) const tableData = ref([])
...@@ -131,14 +150,17 @@ const onHide = () => { ...@@ -131,14 +150,17 @@ const onHide = () => {
Object.assign(formEdit, { Object.assign(formEdit, {
customerId_dictText: '', customerId_dictText: '',
userId_dictText: '', userId_dictText: '',
userId: '',
customerId: ''
}) })
} }
const onReset = () => { const onReset = () => {
Object.assign(formState, { Object.assign(formState, {
customerName: '', customerId: '',
email: '', customerId_dictText: '',
customerId: '' userId: '',
userId_dictText: ''
}) })
} }
...@@ -146,6 +168,11 @@ const openModal = (type: string) => { ...@@ -146,6 +168,11 @@ const openModal = (type: string) => {
visibleModal.value = true visibleModal.value = true
modalType.value = type modalType.value = type
} }
const openUserModal = (type: string) => {
visibleUserModal.value = true
modalType.value = type
}
const editRow = (row) => { const editRow = (row) => {
Object.assign(formEdit, row) Object.assign(formEdit, row)
showEdit.value = true showEdit.value = true
...@@ -187,6 +214,18 @@ const confirmCustomer = (list: any) => { ...@@ -187,6 +214,18 @@ const confirmCustomer = (list: any) => {
} }
} }
const confirmUser = (list: any) => {
const [item] = list
if (!item) return
if (modalType.value == 'edit') {
formEdit.userId = item.userId
formEdit.userId_dictText = item.nickName
} else {
formState.userId = item.userId
formState.userId_dictText = item.nickName
}
}
const onQuery = async () => { const onQuery = async () => {
loading.value = true loading.value = true
try { try {
......
<template>
<div class="h-full flex flex-col bg-white p-2">
<p class="font-bold text-lg leading-10 border-b-2">转换订单记录</p>
<el-form class="pt-2" :model="formState" inline>
<el-form-item label="客户名称">
<el-input v-model="formState.customerId_dictText">
<template #append>
<el-button :icon="MoreFilled" @click="visibleModal = true"></el-button>
</template>
</el-input>
</el-form-item>
<el-form-item>
<el-button @click="resetForm">重置</el-button>
<el-button @click="queryConvert" type="primary">查询</el-button>
</el-form-item>
</el-form>
<vxe-toolbar>
<template #buttons>
<el-button type="danger" @click="removeRows">删除</el-button>
</template>
</vxe-toolbar>
<vxe-table
ref="xTable"
min-height="460"
border
:data="tableData"
:loading="loading"
size="small"
>
<vxe-column type="checkbox" width="40"></vxe-column>
<vxe-column field="customerId_dictText" title="客户名称"></vxe-column>
<vxe-column field="convertOrderId" title="convertOrderId"></vxe-column>
<vxe-column field="excelOrderId" title="excelOrderId"></vxe-column>
<vxe-column field="createTime" title="创建时间"></vxe-column>
<vxe-column field="action" title="操作" width="100">
<template #default="{ row }">
<el-button type="primary" text size="small" @click="toDetail(row)">查看</el-button>
</template>
</vxe-column>
</vxe-table>
<vxe-pager
size="small"
background
v-model:current-page="formState.currentPage"
v-model:page-size="formState.pageSize"
:total="formState.total"
@page-change="queryConvert"
:layouts="['PrevPage', 'JumpNumber', 'NextPage', 'Sizes', 'FullJump', 'Total']"
>
</vxe-pager>
<vxe-modal esc-closable v-model="visible" title="解析详情" width="80%" show-footer>
<vxe-table
border
size="mini"
height="500"
show-overflow="tooltip"
show-header-overflow="tooltip"
:data="convertData"
>
<vxe-column
width="160"
v-for="item in tableTitle"
:title="item"
:key="item"
:field="item"
/>
</vxe-table>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
</vxe-modal>
<CustomerModal v-model:visible="visibleModal" @confirm="confirmCustomer" />
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted, reactive, watch } from 'vue'
import { convertOrderBatchDeleteById, convertOrderPage } from '@/api/order'
import type { VxeTableInstance } from 'vxe-table'
import CustomerModal from '@/components/CustomerModal/CustomerModal.vue'
import { ElMessage } from 'element-plus'
import { MoreFilled } from '@element-plus/icons-vue'
const visibleModal = ref(false)
const loading = ref(false)
const visible = ref(false)
const xTable = ref<VxeTableInstance>()
const tableData = ref([])
const formState = reactive({
customerId_dictText: '',
customerId: '',
currentPage: 1,
pageSize: 10,
total: 0,
column: 'createTime',
order: 'desc'
})
const tableTitle = ref([])
const convertData = ref([])
const toDetail = (row: any) => {
const titles: string[] = []
const record = row.orders[0]
let flatdatas: any = null
// 获取表头
for (const key in record) {
if (key == 'productProperties') {
if (record[key].length) {
flatdatas = {}
record[key].forEach((v) => {
titles.push(v.productPropertiesTitle)
flatdatas[v.productPropertiesTitle] = v.productPropertiesValue
})
}
} else {
titles.push(key)
}
}
tableTitle.value = titles
convertData.value = row.orders.map((item) => {
return {
...item,
...flatdatas
}
})
// 打开弹窗
visible.value = true
}
const queryConvert = async () => {
loading.value = true
try {
const { data } = await convertOrderPage(formState)
tableData.value = data.result.records
formState.total = +data.result.total
} catch {}
loading.value = false
}
const resetForm = () => {
Object.assign(formState, {
customerId: '',
customerId_dictText: ''
})
}
const confirmCustomer = (list) => {
const [item] = list
if (!item) return
formState.customerId = item.customerId
formState.customerId_dictText = item.customerName
}
const removeRows = async () => {
const list = xTable.value?.getCheckboxRecords()
if (list?.length) {
const ids = list.map((v) => v.convertOrderId).join(',')
await convertOrderBatchDeleteById(ids)
ElMessage.success('删除成功')
queryConvert()
}
}
onMounted(() => {
queryConvert()
})
</script>
<style lang="scss" scoped></style>
...@@ -2,11 +2,15 @@ ...@@ -2,11 +2,15 @@
<div class="w-full h-full bg-white p-4"> <div class="w-full h-full bg-white p-4">
<p class="font-bold text-lg leading-10 border-b-2">解析列表</p> <p class="font-bold text-lg leading-10 border-b-2">解析列表</p>
<el-form class="pt-4" :inline="true" :model="queryParams"> <el-form class="pt-4" :inline="true" :model="queryParams">
<el-form-item label="excelOrderId"> <!-- <el-form-item label="文件名称">
<el-input v-model="queryParams.excelOrderId" placeholder="" clearable /> <el-input v-model="queryParams.excelOrderId" placeholder="" clearable />
</el-form-item> </el-form-item> -->
<el-form-item label="templateFileId"> <el-form-item label="订单状态">
<el-input v-model="queryParams.templateFileId" placeholder="" clearable /> <el-select v-model="queryParams.status" placeholder="" clearable >
<template v-for="item in statusOptions">
<el-option :value="item.value" :label="item.label"></el-option>
</template>
</el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
...@@ -30,12 +34,24 @@ ...@@ -30,12 +34,24 @@
:data="tableData" :data="tableData"
> >
<vxe-column type="checkbox" width="50"></vxe-column> <vxe-column type="checkbox" width="50"></vxe-column>
<vxe-column field="fileId_dictText" title="文件名称"></vxe-column> <vxe-column field="fileId_dictText" title="文件名称">
<template #default="{row}">
<el-link target="_blank" :href="'/api/sys/static/'+ row.fileId_dictText">{{ row.fileId_dictText }}</el-link>
</template>
</vxe-column>
<vxe-column field="status_dictText" title="订单状态" width="200"></vxe-column> <vxe-column field="status_dictText" title="订单状态" width="200"></vxe-column>
<vxe-column field="createTime" title="创建时间" width="180"></vxe-column> <vxe-column field="createTime" title="创建时间" width="180"></vxe-column>
<vxe-column field="action" title="操作" width="120"> <vxe-column field="action" title="操作" width="120">
<template #default="{ row }"> <template #default="{ row }">
<el-link style="font-size: 12px" type="primary" @click="toDetail(row)">查看</el-link> <el-link style="font-size: 12px" type="primary" @click="toDetail(row)">查看</el-link>
<el-link
class="ml-1"
style="font-size: 12px"
type="primary"
v-if="row.status == 'un_convert'"
@click="confirmChange(row)"
>转换</el-link
>
<el-link <el-link
class="ml-1" class="ml-1"
style="font-size: 12px" style="font-size: 12px"
...@@ -63,62 +79,39 @@ ...@@ -63,62 +79,39 @@
<vxe-modal v-model="detailVisible" title="解析详情" width="80%" show-footer> <vxe-modal v-model="detailVisible" title="解析详情" width="80%" show-footer>
<vxe-table <vxe-table
border
size="mini" size="mini"
height="500"
show-overflow="tooltip" show-overflow="tooltip"
show-header-overflow="tooltip" show-header-overflow="tooltip"
:data="detailTable" :data="detailTable"
border
:expand-config="expandConfig"
height="500"
> >
<vxe-column title="行号" type="expand" width="120"> <vxe-column title="行号" width="120">
<template #default="{ row }">{{ row.sortNum }}</template> <template #default="{ row }">{{ row.sortNum }}</template>
<template #content="{ row, rowIndex }">
<div style="padding: 10px">
<template v-for="attchName of filterObjKeys(row.expendData)" :key="attchName">
<p>{{ attchName }}</p>
<vxe-table
:data="row.expendData[attchName]"
:header-row-style="{ background: '#f9f8f9' }"
min-height="120"
height="120"
size="mini"
show-overflow="tooltip"
show-header-overflow="tooltip"
style="width: 70vw"
border
>
<vxe-colgroup
v-for="key in filterObjKeys(row.expendData[attchName][0])"
:key="key"
:title="key"
>
<vxe-column :title="key" :field="key" width="200">
<template #header>
<div class="header-cell" @click="(e) => showPopover(e, key, attchName)">
<span>{{
allMapConfigs[attchName + '__' + key]?.orderFiled.fliedTitle || ''
}}</span>
<el-icon><Setting /></el-icon>
</div>
</template>
</vxe-column>
</vxe-colgroup>
</vxe-table>
</template>
</div>
</template>
</vxe-column> </vxe-column>
<vxe-column title="数据区" width="120"> <vxe-column title="数据区" width="120">
<template #default="{ row }">{{ row['数据区'] }}</template> <template #default="{ row }">{{ row['数据区'] }}</template>
</vxe-column> </vxe-column>
<template v-for="item in tableTitle" :key="item">
<vxe-colgroup :title="item"> <!-- 查看状态下直接显示 -->
<template v-if="currentRow.status == 'un_confirm'">
<vxe-column
v-for="item in tableTitle"
:key="item"
:title="item"
:field="item"
width="200"
/>
</template>
<!-- 转换下使用 -->
<template v-else>
<vxe-colgroup v-for="item in tableTitle" :key="item" :title="item">
<vxe-column :title="item" :field="item" width="200"> <vxe-column :title="item" :field="item" width="200">
<template #header> <template #header>
<div class="header-cell" @click="(e) => showPopover(e, item)"> <div class="header-cell" @click="(e) => showPopover(e, item)">
<span>{{ allMapConfigs[item]?.orderFiled.fliedTitle || '' }}</span> <span>{{ allMapConfigs[item]?.orderFiled.fliedTitle || '' }}</span>
<el-icon><Setting /></el-icon> <el-icon v-if="currentRow.status == 'un_convert'"><Setting /></el-icon>
</div> </div>
</template> </template>
</vxe-column> </vxe-column>
...@@ -141,14 +134,24 @@ ...@@ -141,14 +134,24 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="对应字段" prop="mapField"> <el-form-item label="对应字段" prop="mapField">
<el-select v-model="currentConfigColumn.mapField" :teleported="false" clearable> <el-select v-model="currentConfigColumn.mapField" placeholder="Select" :teleported="false">
<el-option-group v-for="group in allFields" :key="group.label" :label="group.label">
<el-option
v-for="item in group.options"
:key="item.filedName"
:label="item.fliedTitle"
:value="item.filedName"
/>
</el-option-group>
</el-select>
<!-- <el-select v-model="currentConfigColumn.mapField" :teleported="false" clearable>
<el-option <el-option
v-for="item in orderFieldList" v-for="item in orderFieldList"
:key="item.filedName" :key="item.filedName"
:value="item.filedName" :value="item.filedName"
:label="item.fliedTitle" :label="item.fliedTitle"
></el-option> ></el-option>
</el-select> </el-select> -->
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24" v-if="currentConfigColumn.mapField"> <el-col :span="24" v-if="currentConfigColumn.mapField">
...@@ -164,7 +167,7 @@ ...@@ -164,7 +167,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<template v-for="params in currentScriptParamsList"> <template v-for="params in currentScriptParamsList" :key="params.fliedTitle">
<el-col :span="24"> <el-col :span="24">
<el-form-item :label="params.fliedTitle"> <el-form-item :label="params.fliedTitle">
<el-input v-model="scriptPs[params.filedName]" /> <el-input v-model="scriptPs[params.filedName]" />
...@@ -190,7 +193,10 @@ ...@@ -190,7 +193,10 @@
</el-popover> </el-popover>
<template #footer> <template #footer>
<el-button @click="confirmChange">确认转换</el-button> <!-- <el-button @click="confirmChange" v-if="currentRow.status == 'un_convert'">确认转换</el-button> -->
<el-button @click="saveOrderField" v-if="currentRow.status == 'un_convert'" type="primary"
>保存</el-button
>
</template> </template>
</vxe-modal> </vxe-modal>
</template> </template>
...@@ -200,23 +206,25 @@ import { computed, onMounted, reactive, ref, watch } from 'vue' ...@@ -200,23 +206,25 @@ import { computed, onMounted, reactive, ref, watch } from 'vue'
import { Setting } from '@element-plus/icons-vue' import { Setting } from '@element-plus/icons-vue'
import { cloneDeep } from 'lodash-es' import { cloneDeep } from 'lodash-es'
import { import {
confirmExcelFileOrderById, confirmExcelFileOrderById,
convertExcelFileOrder, convertExcelFileOrder,
deleteExcelFileOrderById, deleteExcelFileOrderById,
getExcelFileOrderPage, getExcelFileOrderPage,
unconvertExcelFileOrder unconvertExcelFileOrder,
getConfByExcelOrderId,
saveConfExcelFileOrderPage
} from '@/api/order' } from '@/api/order'
import { ElMessage, ElMessageBox, ClickOutside as vClickOutside } from 'element-plus' import { ElMessage, ElMessageBox, ClickOutside as vClickOutside } from 'element-plus'
import type { VxeTableInstance } from 'vxe-table' import type { VxeTableInstance } from 'vxe-table'
import type { Recordable } from '@/types/global' import type { Recordable } from '@/types/global'
import { filterRunData } from '@/utils/excel' import { filterRunData } from '@/utils/excel'
import { apiGetOrderField, apiGetScript } from '@/api/excel' import { apiGetOrderField, apiGetScript, getVariableField } from '@/api/excel'
import { apiDictList } from '@/api/common'
const loading = ref(false) const loading = ref(false)
/**查询参数 */ /**查询参数 */
const queryParams = reactive({ const queryParams = reactive({
templateFileId: '', status: '',
excelOrderId: '',
currentPage: 1, currentPage: 1,
pageSize: 10, pageSize: 10,
total: 0, total: 0,
...@@ -225,7 +233,7 @@ const queryParams = reactive({ ...@@ -225,7 +233,7 @@ const queryParams = reactive({
}) })
/**所有列映射配置 */ /**所有列映射配置 */
const allMapConfigs = reactive<Recordable>({}) const allMapConfigs = ref<Recordable>({})
/**当前表单映射字段配置 */ /**当前表单映射字段配置 */
const currentConfigColumn = reactive({ const currentConfigColumn = reactive({
title: '', title: '',
...@@ -256,25 +264,30 @@ const detailVisible = ref(false) ...@@ -256,25 +264,30 @@ const detailVisible = ref(false)
const detailTable = ref<Recordable[]>([]) const detailTable = ref<Recordable[]>([])
/**表格title */ /**表格title */
const tableTitle = ref<string[]>([]) const tableTitle = ref<string[]>([])
const expandConfig = reactive({
visibleMethod({ row }) { const statusOptions = ref([])
if (typeof row.expendData === 'object') {
return true const queryDict = async (code: string) => {
} const { data } = await apiDictList({
return false dictCodes: code
} })
}) statusOptions.value = data.result[code]
}
const popoverRef = ref() const popoverRef = ref()
const buttonRef = ref() const buttonRef = ref()
const popoverVisible = ref(false) const popoverVisible = ref(false)
const showPopover = (e: any, title: string, groupTitle: string = '') => { const showPopover = (e: any, title: string, groupTitle: string = '') => {
if (currentRow.status != 'un_convert') {
return
}
buttonRef.value = e.target buttonRef.value = e.target
const t = groupTitle ? `${groupTitle}-${title}` : title const t = groupTitle ? `${groupTitle}-${title}` : title
// 设置标题 // 设置标题
currentConfigTitle.value = t currentConfigTitle.value = t
Object.assign(currentConfigColumn, { ...allMapConfigs[t], title, groupTitle }) Object.assign(currentConfigColumn, { ...allMapConfigs.value[t], title, groupTitle })
// 打开popover // 打开popover
popoverVisible.value = true popoverVisible.value = true
} }
...@@ -296,7 +309,10 @@ watch( ...@@ -296,7 +309,10 @@ watch(
(val) => { (val) => {
// 如果有值设置 currentConfigColumn.orderFiled字段 // 如果有值设置 currentConfigColumn.orderFiled字段
if (val) { if (val) {
const item = orderFieldList.value.find((v) => v.filedName == val) let item = orderFieldList.value.find((v) => v.filedName == val)
if (!item) {
item = variableField.value.find((v) => v.filedName == val)
}
Reflect.set(currentConfigColumn, 'orderFiled', item) Reflect.set(currentConfigColumn, 'orderFiled', item)
} else { } else {
Reflect.set(currentConfigColumn, 'orderFiled', {}) Reflect.set(currentConfigColumn, 'orderFiled', {})
...@@ -306,6 +322,17 @@ watch( ...@@ -306,6 +322,17 @@ watch(
} }
) )
const variableField = ref([])
const allFields = computed(() => {
return [{
label: '普通字段',
options: orderFieldList.value,
}, {
label: '变量字段',
options: variableField.value,
}]
})
/**重置popover配置表单 */ /**重置popover配置表单 */
const resetConfigForm = () => { const resetConfigForm = () => {
Object.assign(currentConfigColumn, { Object.assign(currentConfigColumn, {
...@@ -336,7 +363,7 @@ const gScriptPs = (scriptNames: null | Recordable[] | undefined) => { ...@@ -336,7 +363,7 @@ const gScriptPs = (scriptNames: null | Recordable[] | undefined) => {
// 查询是否有已经设置过的值 // 查询是否有已经设置过的值
const { title, groupTitle } = currentConfigColumn const { title, groupTitle } = currentConfigColumn
const t = groupTitle ? `${groupTitle}__${title}` : title const t = groupTitle ? `${groupTitle}__${title}` : title
const params = allMapConfigs[t].params const params = allMapConfigs.value[t].params
scriptNames.forEach((item) => { scriptNames.forEach((item) => {
Reflect.set(scriptPs.value, item.filedName, params[item.filedName] || '') Reflect.set(scriptPs.value, item.filedName, params[item.filedName] || '')
}) })
...@@ -352,16 +379,11 @@ const confirmConfig = () => { ...@@ -352,16 +379,11 @@ const confirmConfig = () => {
const { title, groupTitle } = currentConfigColumn const { title, groupTitle } = currentConfigColumn
// 保存本地配置 // 保存本地配置
title && title && Reflect.set(allMapConfigs.value, title, cloneDeep(currentConfigColumn))
Reflect.set(
allMapConfigs,
groupTitle ? `${groupTitle}__${title}` : title,
cloneDeep(currentConfigColumn)
)
// 关闭popover // 关闭popover
popoverVisible.value = false popoverVisible.value = false
console.log('allMapConfigs', allMapConfigs) console.log('allMapConfigs.value', allMapConfigs.value)
} }
const getScriptList = async () => { const getScriptList = async () => {
...@@ -373,6 +395,11 @@ const getOrderFields = async () => { ...@@ -373,6 +395,11 @@ const getOrderFields = async () => {
orderFieldList.value = data.result orderFieldList.value = data.result
} }
const getOrderVariableField = async () => {
const { data } = await getVariableField(currentRow.excelOrderId)
variableField.value = data.result
}
/**确认解析/转换的订单的状态 */ /**确认解析/转换的订单的状态 */
const confirmOrderStatus = async (row: any) => { const confirmOrderStatus = async (row: any) => {
if (row.status === 'un_confirm') { if (row.status === 'un_confirm') {
...@@ -384,6 +411,8 @@ const confirmOrderStatus = async (row: any) => { ...@@ -384,6 +411,8 @@ const confirmOrderStatus = async (row: any) => {
const { data } = await unconvertExcelFileOrder(row.excelOrderId) const { data } = await unconvertExcelFileOrder(row.excelOrderId)
if (data.code == 200) { if (data.code == 200) {
ElMessage.success(data.message || '操作成功!') ElMessage.success(data.message || '操作成功!')
} else {
ElMessage.error(data.message || '操作失败')
} }
} else if (row.status == 'converted') { } else if (row.status == 'converted') {
await ElMessageBox.confirm('是否确认转换后的订单?', '提示', { await ElMessageBox.confirm('是否确认转换后的订单?', '提示', {
...@@ -392,7 +421,7 @@ const confirmOrderStatus = async (row: any) => { ...@@ -392,7 +421,7 @@ const confirmOrderStatus = async (row: any) => {
type: 'warning' type: 'warning'
}) })
const {data} = await confirmExcelFileOrderById(row.excelOrderId) const { data } = await confirmExcelFileOrderById(row.excelOrderId)
if (data.code == 200) { if (data.code == 200) {
ElMessage.success(data.message || '操作成功!') ElMessage.success(data.message || '操作成功!')
} else { } else {
...@@ -403,14 +432,36 @@ const confirmOrderStatus = async (row: any) => { ...@@ -403,14 +432,36 @@ const confirmOrderStatus = async (row: any) => {
onQuery() onQuery()
} }
/**保存订单字段 */
const saveOrderField = async () => {
const params = {
templateFileId: currentRow.templateFileId,
confs: Object.values(allMapConfigs.value).filter((v) => {
if (v.title !== '') {
v.templateFileId = currentRow.templateFileId
return true
}
return false
})
}
await saveConfExcelFileOrderPage(params).then(({ data }) => {
if (data.code == 200) {
ElMessage.success(data.message || '保存成功!')
} else {
ElMessage.error(data.message || '保存失败!')
}
})
}
/** 确认订单转换 */ /** 确认订单转换 */
const confirmChange = async () => { const confirmChange = async (row) => {
await ElMessageBox.confirm('是否确认订单转换?', '提示', { await ElMessageBox.confirm('是否确认订单转换?', '提示', {
confirmButtonText: '转换', confirmButtonText: '转换',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}) })
const { data } = await convertExcelFileOrder(currentRow.excelOrderId) const { data } = await convertExcelFileOrder(row.excelOrderId)
if (data.code == 200) { if (data.code == 200) {
ElMessage.success(data.message || '转换成功!') ElMessage.success(data.message || '转换成功!')
detailVisible.value = false detailVisible.value = false
...@@ -419,9 +470,32 @@ const confirmChange = async () => { ...@@ -419,9 +470,32 @@ const confirmChange = async () => {
ElMessage.error(data.message || '转换失败!') ElMessage.error(data.message || '转换失败!')
} }
const toDetail = (row: any) => { const toDetail = async (row: any) => {
allMapConfigs.value = {}
Object.assign(currentRow, row) Object.assign(currentRow, row)
const { res, titles, configs } = filterRunData(row.orders) const { res, titles, configs } = filterRunData(row.orders)
await getOrderVariableField()
console.log('allFields', allFields)
const { data } = await getConfByExcelOrderId(row.excelOrderId)
if (data.result.length) {
const tmp = {
title: '',
content: '',
mapField: '',
scriptName: '',
groupTitle: '',
templateFileId: '',
excelOrderFiledConfId: '',
params: {},
orderFiled: {}
}
data.result.forEach((item: any) => {
item.params == null && (item.params = {})
item.orderFiled == null && (item.orderFiled = {})
configs[item.title] = Object.assign({}, tmp, item)
})
}
// 排除通过循环不显示的column // 排除通过循环不显示的column
const excludeTitles = ['sortNum', '数据区', 'expendData'] const excludeTitles = ['sortNum', '数据区', 'expendData']
detailTable.value = res detailTable.value = res
...@@ -432,7 +506,9 @@ const toDetail = (row: any) => { ...@@ -432,7 +506,9 @@ const toDetail = (row: any) => {
Reflect.deleteProperty(configs, key) Reflect.deleteProperty(configs, key)
}) })
Object.assign(allMapConfigs, configs) Object.assign(allMapConfigs.value, configs)
console.log('allMapConfigs.value', allMapConfigs.value)
} }
const filterObjKeys = (data: any) => { const filterObjKeys = (data: any) => {
...@@ -450,7 +526,9 @@ const removeRows = async () => { ...@@ -450,7 +526,9 @@ const removeRows = async () => {
} }
} }
const onReset = () => {} const onReset = () => {
queryParams.status = ''
}
const onQuery = async () => { const onQuery = async () => {
loading.value = true loading.value = true
try { try {
...@@ -465,6 +543,7 @@ onMounted(() => { ...@@ -465,6 +543,7 @@ onMounted(() => {
onQuery() onQuery()
getOrderFields() getOrderFields()
getScriptList() getScriptList()
queryDict('excel_order_status')
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
<template>
</template>
<script setup lang="ts">
</script>
<style lang="scss" scoped></style>
\ No newline at end of file
...@@ -26,20 +26,26 @@ ...@@ -26,20 +26,26 @@
size="small" size="small"
min-height="460" min-height="460"
border border
show-overflow='ellipsis' show-overflow="ellipsis"
:loading="loading" :loading="loading"
:data="tableData" :data="tableData"
> >
<vxe-column type="checkbox" width="50"></vxe-column> <vxe-column type="checkbox" width="50"></vxe-column>
<!-- <vxe-column field="orderFileId" title="文件id" width="200"></vxe-column> -->
<vxe-column field="customerId_dictText" title="客户名称" width="120"></vxe-column> <vxe-column field="customerId_dictText" title="客户名称" width="120"></vxe-column>
<vxe-column field="filePath" title="原始文件地址"></vxe-column> <vxe-column title="原始文件地址">
<vxe-column field="mergeFilePath" title="标注文件地址"></vxe-column> <template #default="{row}">
<el-link target="_blank" :href="'/api/sys/static/'+ row.filePath">{{ row.filePath }}</el-link>
</template>
</vxe-column>
<vxe-column title="标注文件地址">
<template #default="{row}">
<el-link target="_blank" :href="'/api/sys/static/'+ row.mergeFilePath">{{ row.mergeFilePath }}</el-link>
</template>
</vxe-column>
<vxe-column field="createTime" title="创建时间" width="180"></vxe-column> <vxe-column field="createTime" title="创建时间" width="180"></vxe-column>
<vxe-column field="action" title="操作" width="80"> <vxe-column field="action" title="操作" width="80">
<template #default="{row}"> <template #default="{ row }">
<el-button type="primary" text size="small" @click="toDetail2(row)">查看</el-button> <el-link type="primary" style="font-size: 12px;" :href="'/comment-excel?fileId=' + row.orderFileId" target="_blank">查看</el-link>
<!-- <el-button type="primary" text size="small" @click="toDetail2(row)">查看新</el-button> -->
</template> </template>
</vxe-column> </vxe-column>
</vxe-table> </vxe-table>
...@@ -63,8 +69,8 @@ import { onMounted, reactive, ref } from 'vue' ...@@ -63,8 +69,8 @@ import { onMounted, reactive, ref } from 'vue'
import { getOrderFilePage, deleteOrderFiles } from '@/api/order' import { getOrderFilePage, deleteOrderFiles } from '@/api/order'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import type { VxeTableInstance } from 'vxe-table' import type { VxeTableInstance } from 'vxe-table'
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router'
import { queryParamsFilter } from '@/utils/query'
const router = useRouter() const router = useRouter()
const loading = ref(false) const loading = ref(false)
...@@ -85,7 +91,7 @@ const tableData = ref([]) ...@@ -85,7 +91,7 @@ const tableData = ref([])
const removeRows = async () => { const removeRows = async () => {
const list = xTable.value?.getCheckboxRecords() const list = xTable.value?.getCheckboxRecords()
if (list?.length) { if (list?.length) {
const ids = list.map(v => v.orderFileId).join(',') const ids = list.map((v) => v.orderFileId).join(',')
await deleteOrderFiles(ids) await deleteOrderFiles(ids)
ElMessage.success('删除成功') ElMessage.success('删除成功')
onQuery() onQuery()
...@@ -109,11 +115,16 @@ const toDetail2 = (row: any) => { ...@@ -109,11 +115,16 @@ const toDetail2 = (row: any) => {
} }
}) })
} }
const onReset = () => {} const onReset = () => {
Object.assign(formState, {
filePath: '',
mergeFilePath: ''
})
}
const onQuery = async () => { const onQuery = async () => {
loading.value = true loading.value = true
try { try {
const { data } = await getOrderFilePage(formState) const { data } = await getOrderFilePage(queryParamsFilter(formState))
tableData.value = data.result.records tableData.value = data.result.records
formState.total = +data.result.total formState.total = +data.result.total
} catch {} } catch {}
......
...@@ -3,10 +3,21 @@ ...@@ -3,10 +3,21 @@
<p class="font-bold text-lg leading-10 border-b-2">产品对照管理</p> <p class="font-bold text-lg leading-10 border-b-2">产品对照管理</p>
<el-form class="pt-4" :inline="true" :model="formState"> <el-form class="pt-4" :inline="true" :model="formState">
<el-form-item label="产品名称"> <el-form-item label="产品名称">
<el-input v-model="formState.productName" placeholder="产品名称" clearable /> <el-input v-model="formState.productId_dictText" readonly placeholder="产品名称" clearable>
<template #append>
<el-button :icon="MoreFilled" @click="openModal('prod', 'search')" />
</template>
</el-input>
</el-form-item> </el-form-item>
<el-form-item label="客户名称"> <el-form-item label="客户名称">
<el-input v-model="formState.customerName" placeholder="客户名称" clearable /> <el-input v-model="formState.customerId_dictText" readonly placeholder="客户名称" clearable>
<template #append>
<el-button :icon="MoreFilled" @click="openModal('cust', 'search')" />
</template>
</el-input>
</el-form-item>
<el-form-item label="产品描述">
<el-input v-model="formState.excelFiled" placeholder="产品描述" clearable />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
...@@ -18,39 +29,27 @@ ...@@ -18,39 +29,27 @@
<div class=""> <div class="">
<vxe-toolbar> <vxe-toolbar>
<template #buttons> <template #buttons>
<!-- <vxe-button @click="allAlign = 'left'">居左</vxe-button> -->
<el-button type="primary" @click="showEdit = true">新增</el-button> <el-button type="primary" @click="showEdit = true">新增</el-button>
<el-button type="danger" @click="deleteRows">删除</el-button>
</template> </template>
</vxe-toolbar> </vxe-toolbar>
<vxe-table <vxe-table
ref="xTable" ref="xTable"
size="small" size="mini"
min-height="460" min-height="460"
border border
:loading="loading" :loading="loading"
:data="tableData" :data="tableData"
> >
<vxe-column type="checkbox" width="50"></vxe-column> <vxe-column type="checkbox" width="50"></vxe-column>
<!-- <vxe-column field="productCompareId" title="产品对照id" width="200"></vxe-column> --> <vxe-column field="productId_dictText" title="产品名称" width="200"></vxe-column>
<vxe-column field="productName" title="产品名称" width="200"></vxe-column> <vxe-column field="customerId_dictText" title="客户名称" width="200"></vxe-column>
<vxe-column field="customerName" title="客户名称" width="200"></vxe-column> <vxe-column field="excelFiled" title="产品描述"></vxe-column>
<vxe-column title="操作" width="90">
<vxe-column field="fileds" title="产品对照字段配置">
<template #default="{ row }"> <template #default="{ row }">
<span <el-link type="primary" style="font-size: 12px" @click="toEdit(row)">修改</el-link>
class="inline-block mr-2"
v-for="item in row.fileds"
:key="item.productCompareFiledId"
>
{{ `${item.productFiledTitle}=${item.productFiledValue}` }}
</span>
</template> </template>
</vxe-column> </vxe-column>
<!-- <vxe-column field="action" title="操作" width="100">
<template #default="{ row }">
<el-button type="primary" text size="small" @click="editRow(row)">修改</el-button>
</template>
</vxe-column> -->
</vxe-table> </vxe-table>
<vxe-pager <vxe-pager
...@@ -67,7 +66,7 @@ ...@@ -67,7 +66,7 @@
<vxe-modal <vxe-modal
v-model="showEdit" v-model="showEdit"
width="700" width="400"
title="编辑&保存" title="编辑&保存"
destroy-on-close destroy-on-close
esc-closable esc-closable
...@@ -84,68 +83,50 @@ ...@@ -84,68 +83,50 @@
:rules="formRules" :rules="formRules"
> >
<el-row :gutter="24"> <el-row :gutter="24">
<el-col :span="12"> <el-col :span="24">
<el-form-item label="产品名称" prop="productName"> <el-form-item label="产品名称" prop="productId_dictText">
<el-input v-model="formEdit.productName" disabled> <el-input v-model="formEdit.productId_dictText" disabled>
<template #append> <template #append>
<el-button :icon="MoreFilled" @click="prodVisible = true" /> <el-button :icon="MoreFilled" @click="openModal('prod', 'edit')" />
</template> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="24">
<el-form-item label="客户名称" prop="customerName"> <el-form-item label="客户名称" prop="customerId_dictText">
<el-input v-model="formEdit.customerName" disabled> <el-input v-model="formEdit.customerId_dictText" disabled>
<template #append> <template #append>
<el-button :icon="MoreFilled" @click="customerVisible = true" /> <el-button :icon="MoreFilled" @click="openModal('cust', 'edit')" />
</template> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item label="产品单位" prop="customerUnit">
<el-input v-model="formEdit.customerUnit"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="单位" prop="unit">
<el-input v-model="formEdit.unit"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="换算值" prop="unitRatio">
<el-input type="number" v-model="formEdit.unitRatio"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="产品描述" prop="excelFiled">
<el-input
style="width: 250px"
type="textarea"
:rows="5"
v-model="formEdit.excelFiled"
></el-input>
</el-form-item>
</el-col>
</el-row> </el-row>
<p class="font-bold border-b-2 mb-2 text-base">对照字段配置</p>
<el-scrollbar height="300" class="no-rule-container">
<template v-for="(item, idx) in formEdit.fileds">
<el-row>
<el-form-item label="产品字段">
<el-select
v-model="item.productFiled"
@change="(v) => productFiledChange(v, item)"
>
<template v-for="field in orderFields">
<el-option
:disabled="!!field.disabled"
:label="field.fliedTitle"
:value="field.filedName"
></el-option>
</template>
</el-select>
</el-form-item>
<el-form-item label="字段值">
<el-input v-model="item.productFiledValue"></el-input>
</el-form-item>
<el-form-item>
<el-button
v-if="idx === 0"
type="primary"
:icon="Plus"
circle
@click="addField"
></el-button>
<el-button
v-else-if="idx !== 0"
type="danger"
:icon="Delete"
circle
@click="removeField(idx)"
></el-button>
</el-form-item>
</el-row>
</template>
</el-scrollbar>
<el-row type="flex" justify="center"> <el-row type="flex" justify="center">
<el-button size="default" type="primary" @click="onSubmit" :loading="saveLoading" <el-button size="default" type="primary" @click="onSubmit" :loading="saveLoading"
...@@ -167,11 +148,13 @@ ...@@ -167,11 +148,13 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, onMounted, reactive, ref, unref, watch } from 'vue' import { computed, onMounted, reactive, ref, unref, watch } from 'vue'
import { getProductCompareList, saveProductCompare } from '@/api/product' import {
import { apiGetOrderField } from '@/api/excel' deleteExcelProdFileConfByIds,
getExcelProdFileConfPage,
saveExcelProdFileConf
} from '@/api/product'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import type { VxeTableInstance } from 'vxe-table' import type { VxeTableInstance } from 'vxe-table'
import { MoreFilled, Delete, Plus } from '@element-plus/icons-vue' import { MoreFilled, Delete, Plus } from '@element-plus/icons-vue'
import ProductModal from '@/components/ProductModal/ProductModal.vue' import ProductModal from '@/components/ProductModal/ProductModal.vue'
import CustomerModal from '@/components/CustomerModal/CustomerModal.vue' import CustomerModal from '@/components/CustomerModal/CustomerModal.vue'
...@@ -182,53 +165,62 @@ const loading = ref(false) ...@@ -182,53 +165,62 @@ const loading = ref(false)
const saveLoading = ref(false) const saveLoading = ref(false)
const showEdit = ref(false) const showEdit = ref(false)
const formState = reactive({ const formState = reactive({
productName: '', productId_dictText: '',
customerName: '', productId: '',
customerId: '',
customerId_dictText: '',
excelFiled: '',
currentPage: 1, currentPage: 1,
pageSize: 10, pageSize: 10,
total: 0 total: 0
}) })
const orderFields = ref<Record<string, any>>([])
const formRef = ref() const formRef = ref()
const xTable = ref<VxeTableInstance>() const xTable = ref<VxeTableInstance>()
const formRules = reactive({ const formRules = reactive({
productName: [{ required: true, message: '请输入产品名称', trigger: 'change' }] productId_dictText: [{ required: true, message: '请输入产品名称', trigger: 'change' }],
excelFiled: [{ required: true, message: '请输入产品描述', trigger: 'change' }]
}) })
const formEdit = reactive({ const formEdit = reactive({
productCompareId: null, productCompareId: null,
customerId: '', customerId: '',
customerName: '', customerId_dictText: '',
productName: '', productId_dictText: '',
productId: '', productId: '',
fileds: [ excelFiled: '',
{ customerUnit: '',
productCompareFiledId: null, unit: '',
productCompareId: null, unitRatio: ''
productFiled: '',
productFiledTitle: '',
productFiledValue: ''
}
]
})
const selectedFields = computed(() => {
return formEdit.fileds.map((v) => v.productFiled)
}) })
watch( const deleteRows = async () => {
selectedFields, const ids = xTable.value
(val) => { ?.getCheckboxRecords()
orderFields.value.forEach((item: any) => { .map((item) => {
if (val.includes(item.filedName)) { return item.excelProductFiledConfId
item.disabled = true
} else {
item.disabled = false
}
}) })
}, .join(',')
{ deep: true } const { data } = await deleteExcelProdFileConfByIds(ids as string)
) if (data.code === 200) {
ElMessage.success(data.message || '删除成功!')
onQuery()
} else {
ElMessage.error(data.message || '删除失败!')
}
}
const toEdit = (row: any) => {
Object.assign(formEdit, row)
showEdit.value = true
}
const modaltype = ref('search')
const openModal = (modal, type) => {
if (modal == 'prod') {
prodVisible.value = true
} else {
customerVisible.value = true
}
modaltype.value = type
}
const tableData = ref([]) const tableData = ref([])
const onHide = () => { const onHide = () => {
...@@ -236,53 +228,30 @@ const onHide = () => { ...@@ -236,53 +228,30 @@ const onHide = () => {
Object.assign(formEdit, { Object.assign(formEdit, {
productCompareId: null, productCompareId: null,
customerId: '', customerId: '',
customerName: '', customerId_dictText: '',
productName: '', productId_dictText: '',
productId: '', productId: '',
fileds: [ excelFiled: ''
{
productCompareFiledId: null,
productCompareId: null,
productFiled: '',
productFiledTitle: '',
productFiledValue: ''
}
]
}) })
} }
const addField = () => { const onReset = () => {
formEdit.fileds.splice(1, 0, { Object.assign(formState, {
productCompareFiledId: null, customerId: '',
productCompareId: null, customerId_dictText: '',
productFiled: '', productId: '',
productFiledTitle: '', productId_dictText: '',
productFiledValue: '' excelFiled: ''
}) })
} }
const removeField = (idx: number) => formEdit.fileds.splice(idx, 1)
const productFiledChange = (v: string | undefined, item: any) => {
if (v) {
item.productFiledTitle = orderFields.value.find((_) => _.filedName == v)?.fliedTitle || ''
}
}
const onReset = () => {}
// 表单提交 // 表单提交
const onSubmit = async () => { const onSubmit = async () => {
await formRef.value.validate() await formRef.value.validate()
saveLoading.value = true saveLoading.value = true
const params = {
productCompare: {
productCompareId: formEdit.productCompareId,
customerId: formEdit.customerId,
productId: formEdit.productId
},
fileds: formEdit.fileds
}
try { try {
await saveProductCompare(params) await saveExcelProdFileConf(formEdit)
ElMessage.success('操作成功!') ElMessage.success('操作成功!')
showEdit.value = false showEdit.value = false
onQuery() onQuery()
...@@ -295,19 +264,28 @@ const confirmModal = (list: any, type: 'prod' | 'customer') => { ...@@ -295,19 +264,28 @@ const confirmModal = (list: any, type: 'prod' | 'customer') => {
if (!item) return if (!item) return
const form = unref(formEdit) const form = unref(formEdit)
if (type === 'prod') { if (type === 'prod') {
console.log('type', type, item) if (modaltype.value == 'edit') {
form.productId = item.productId form.productId = item.productId
form.productName = item.productName form.productId_dictText = item.productName
} else {
formState.productId = item.productId
formState.productId_dictText = item.productName
}
} else { } else {
form.customerId = item.customerId if (modaltype.value == 'edit') {
form.customerName = item.customerName form.customerId = item.customerId
form.customerId_dictText = item.customerName
} else {
formState.customerId = item.customerId
formState.customerId_dictText = item.customerName
}
} }
} }
const onQuery = async () => { const onQuery = async () => {
loading.value = true loading.value = true
try { try {
const { data } = await getProductCompareList(formState) const { data } = await getExcelProdFileConfPage(formState)
tableData.value = data.result.records tableData.value = data.result.records
formState.total = +data.result.total formState.total = +data.result.total
} catch {} } catch {}
...@@ -316,9 +294,6 @@ const onQuery = async () => { ...@@ -316,9 +294,6 @@ const onQuery = async () => {
onMounted(() => { onMounted(() => {
onQuery() onQuery()
apiGetOrderField().then(({ data }) => {
orderFields.value = data.result
})
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
...@@ -3,10 +3,7 @@ ...@@ -3,10 +3,7 @@
<p class="font-bold text-lg leading-10 border-b-2">产品管理</p> <p class="font-bold text-lg leading-10 border-b-2">产品管理</p>
<el-form class="pt-4" :inline="true" :model="formState"> <el-form class="pt-4" :inline="true" :model="formState">
<el-form-item label="产品名称"> <el-form-item label="产品名称">
<el-input v-model="formState.productName" placeholder="颜色名称" clearable /> <el-input v-model="formState.productName" placeholder="产品名称" clearable />
</el-form-item>
<el-form-item label="产品品牌">
<el-input v-model="formState.brandName" placeholder="颜色名称" clearable />
</el-form-item> </el-form-item>
...@@ -17,12 +14,6 @@ ...@@ -17,12 +14,6 @@
</el-form> </el-form>
<div class=""> <div class="">
<vxe-toolbar>
<template #buttons>
<!-- <vxe-button @click="allAlign = 'left'">居左</vxe-button> -->
<el-button type="primary" @click="showEdit = true">新增</el-button>
</template>
</vxe-toolbar>
<vxe-table <vxe-table
ref="xTable" ref="xTable"
size="small" size="small"
...@@ -32,17 +23,9 @@ ...@@ -32,17 +23,9 @@
:data="tableData" :data="tableData"
> >
<vxe-column type="checkbox" width="50"></vxe-column> <vxe-column type="checkbox" width="50"></vxe-column>
<!-- <vxe-column field="productId" title="id" width="200"></vxe-column> --> <vxe-column field="productCode" title="产品编码" width="200"></vxe-column>
<vxe-column field="productName" title="产品名称" width="200"></vxe-column> <vxe-column field="productName" title="产品名称"></vxe-column>
<vxe-column field="productStatus" title="产品状态" width="200"></vxe-column> <vxe-column field="productCategoryId_dictText" title="产品类型" width="200"></vxe-column>
<vxe-column field="productUnit" title="产品单位" width="200"></vxe-column>
<vxe-column field="brandName" title="品牌名称" width="120"></vxe-column>
<vxe-column field="prodcutType" title="产品类型" show-overflow></vxe-column>
<vxe-column field="action" title="操作" width="100">
<template #default="{ row }">
<el-button type="primary" text size="small" @click="editRow(row)">修改</el-button>
</template>
</vxe-column>
</vxe-table> </vxe-table>
<vxe-pager <vxe-pager
...@@ -101,6 +84,7 @@ import { apiDictFindById } from '@/api/common' ...@@ -101,6 +84,7 @@ import { apiDictFindById } from '@/api/common'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import BrandModal from '@/components/BrandModal/BrandModal.vue' import BrandModal from '@/components/BrandModal/BrandModal.vue'
import type { VxeTableInstance } from 'vxe-table' import type { VxeTableInstance } from 'vxe-table'
import { queryParamsFilter } from '@/utils/query'
const brandVisible = ref(false) const brandVisible = ref(false)
const loading = ref(false) const loading = ref(false)
...@@ -108,7 +92,6 @@ const saveLoading = ref(false) ...@@ -108,7 +92,6 @@ const saveLoading = ref(false)
const showEdit = ref(false) const showEdit = ref(false)
const formState = reactive({ const formState = reactive({
productName: '', productName: '',
brandName: '',
currentPage: 1, currentPage: 1,
pageSize: 10, pageSize: 10,
total: 0 total: 0
...@@ -119,7 +102,6 @@ const formRef = ref() ...@@ -119,7 +102,6 @@ const formRef = ref()
const xTable = ref<VxeTableInstance>() const xTable = ref<VxeTableInstance>()
const formRules = reactive({ const formRules = reactive({
productName: [{ required: true, message: '请输入产品名称', trigger: 'change' }] productName: [{ required: true, message: '请输入产品名称', trigger: 'change' }]
// colorCode: [{ required: true, message: '请输入颜色编码', trigger: 'change' }]
}) })
const formEdit = reactive({ const formEdit = reactive({
productId: '', productId: '',
...@@ -147,7 +129,9 @@ const onHide = () => { ...@@ -147,7 +129,9 @@ const onHide = () => {
}) })
} }
const onReset = () => {} const onReset = () => {
formState.productName = ''
}
const editRow = (row) => { const editRow = (row) => {
Object.assign(formEdit, row) Object.assign(formEdit, row)
...@@ -175,7 +159,7 @@ const onSubmit = async () => { ...@@ -175,7 +159,7 @@ const onSubmit = async () => {
const onQuery = async () => { const onQuery = async () => {
loading.value = true loading.value = true
try { try {
const { data } = await getProductList(formState) const { data } = await getProductList(queryParamsFilter(formState))
tableData.value = data.result.records tableData.value = data.result.records
formState.total = +data.result.total formState.total = +data.result.total
} catch {} } catch {}
......
...@@ -2635,6 +2635,11 @@ pify@^2.3.0: ...@@ -2635,6 +2635,11 @@ pify@^2.3.0:
resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz" resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz"
integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
pinia-plugin-persistedstate@^3.2.1:
version "3.2.1"
resolved "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.1.tgz#66780602aecd6c7b152dd7e3ddc249a1f7a13fe5"
integrity sha512-MK++8LRUsGF7r45PjBFES82ISnPzyO6IZx3CH5vyPseFLZCk1g2kgx6l/nW8pEBKxxd4do0P6bJw+mUSZIEZUQ==
pinia@^2.1.7: pinia@^2.1.7:
version "2.1.7" version "2.1.7"
resolved "https://registry.npmmirror.com/pinia/-/pinia-2.1.7.tgz" resolved "https://registry.npmmirror.com/pinia/-/pinia-2.1.7.tgz"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment