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>
This diff is collapsed.
<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,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