From 78b91faa55e3c4de9cea3e6211ccd056b8ba575a Mon Sep 17 00:00:00 2001 From: cyonjan Date: Sat, 5 Jul 2025 21:43:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=95=E5=85=A5orderbase,=E8=A7=84=E8=8C=83a?= =?UTF-8?q?pi=E6=8E=A5=E5=8F=A3=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 106 +++- package.json | 3 +- src/api/index.js | 93 +++ src/api/inquiry.js | 39 +- src/api/product.js | 107 ++++ src/api/user.js | 25 +- src/components/BrandPicker.vue | 76 +++ src/components/Inquiry.vue | 832 +++++++++++++++++++++++++++ src/components/Offer.vue | 517 +++++++++++++++++ src/components/OrderBase.vue | 956 +++++++++++++++++++++++++++++++ src/components/OrderResult.vue | 390 +++++++++++++ src/components/ProductPicker.vue | 91 +++ src/components/Result.vue | 326 +++++++++++ src/components/icons/FocusIn.vue | 12 + src/components/icons/TopIcon.vue | 12 + src/store/index.js | 3 + src/utils/routeMenu.js | 16 +- src/views/inquiry/Index.vue | 61 +- src/views/inquiry/edit.vue | 230 ++++++++ 19 files changed, 3825 insertions(+), 70 deletions(-) create mode 100644 src/api/product.js create mode 100644 src/components/BrandPicker.vue create mode 100644 src/components/Inquiry.vue create mode 100644 src/components/Offer.vue create mode 100644 src/components/OrderBase.vue create mode 100644 src/components/OrderResult.vue create mode 100644 src/components/ProductPicker.vue create mode 100644 src/components/Result.vue create mode 100644 src/components/icons/FocusIn.vue create mode 100644 src/components/icons/TopIcon.vue create mode 100644 src/views/inquiry/edit.vue diff --git a/package-lock.json b/package-lock.json index d29a9ed..19f7593 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,8 @@ "pinia": "^3.0.2", "pinia-plugin-persistedstate": "^4.2.0", "vue": "^3.5.13", - "vue-router": "^4.5.1" + "vue-router": "^4.5.1", + "xlsx": "^0.18.5" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.3", @@ -2165,6 +2166,15 @@ "node": ">=0.4.0" } }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/async-validator": { "version": "4.2.5", "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", @@ -2321,6 +2331,19 @@ ], "license": "CC-BY-4.0" }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", @@ -2345,6 +2368,15 @@ "consola": "^3.2.3" } }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2406,6 +2438,18 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2887,6 +2931,15 @@ "node": ">= 6" } }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/fs-extra": { "version": "11.3.0", "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.0.tgz", @@ -4070,6 +4123,18 @@ "node": ">=0.10.0" } }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "license": "Apache-2.0", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/std-env": { "version": "3.9.0", "resolved": "https://registry.npmmirror.com/std-env/-/std-env-3.9.0.tgz", @@ -4589,6 +4654,45 @@ "node": ">= 12" } }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", diff --git a/package.json b/package.json index e268700..86bf742 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "pinia": "^3.0.2", "pinia-plugin-persistedstate": "^4.2.0", "vue": "^3.5.13", - "vue-router": "^4.5.1" + "vue-router": "^4.5.1", + "xlsx": "^0.18.5" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.3", diff --git a/src/api/index.js b/src/api/index.js index 3c37641..f123983 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -30,3 +30,96 @@ export const supplierList = () => { url: `/member/supplierlist/`, }) } + +export const searchMember = (keyword) => { + return service({ + method: 'post', + url: '/member/matchmember/' + keyword + }) +} + +export const memberInfo = (id) => { + return service({ + method: 'post', + url: '/member/memberinfo/' + id + }) +} + +export const searchBrand = (keyword) => { + return service({ + method: 'post', + url: '/accessory/searchbrand/' + keyword + }) +} + +export const searchProduct = (code) => { + return service({ + method: 'post', + url: '/product/searchproductbycode/' + code + }) +} +export const partsGoodsById = (id) => { + return service({ + method: 'get', + url: '/product/goodsById?id=' + id, + }) +} +export const hasProduct = (brand,code) => { + return service({ + method: 'post', + url: '/product/hasproduct', + data: { + code: code, + brand: brand + } + }) +} + +export const partsGoodsByCode = (code,brand=0) => { + return service({ + method: 'get', + url: '/product/goodsByCode?code=' + code + (brand ? '&brand=' + brand : ''), + }) +} + +export const onlyGoodsByCode = (code,brand=0) => { + return service({ + method: 'get', + url: '/product/onlyGoodsByCode?code=' + code + (brand ? '&brand=' + brand : ''), + }) +} +export const productInfo = (id) => { + return service({ + method: 'post', + url: '/product/product?id=' + id + }) +} +export const hasFocus = (brand,code) => { + return service({ + method: 'get', + url: `/store/hasfocus?brand=${brand}&code=${code}`, + }) +} +export const focusItem = (id) => { + return service({ + method: 'get', + url: '/store/focus_item/' + id, + }) +} +export const updateFocus = (data) => { + return service({ + method: 'post', + url: '/store/updatefocus', + data + }) +} +export const addFocusLog = (id,user_id,note) => { + return service({ + method: 'post', + url: '/store/addfocuslog?id=' + id, + data: { + note, + operator: user_id, + } + }) +} diff --git a/src/api/inquiry.js b/src/api/inquiry.js index 48c6d6e..d91c3a7 100644 --- a/src/api/inquiry.js +++ b/src/api/inquiry.js @@ -12,7 +12,6 @@ export const sellerList = () => { url: '/accessory/sellerlist/' }) } - export const inquiryFilter = (users,status,days=7) => { return service({ method: 'get', @@ -24,7 +23,6 @@ export const inquiryFilter = (users,status,days=7) => { } }) } - export const inquiryList = (users,keys={},page=1,page_size=20) => { return service({ method: 'post', @@ -37,14 +35,12 @@ export const inquiryList = (users,keys={},page=1,page_size=20) => { } }) } - export const customerList = () => { return service({ method: 'get', url: '/store/customerList' }) } - export const inquiryStatus = (ids) => { return service({ method: 'post', @@ -54,18 +50,24 @@ export const inquiryStatus = (ids) => { } }) } - -export const createInquiry = (user_id,note='') => { +export const createInquiry = (user_id,note='',subject='') => { return service({ method: 'post', url: '/store/createInquiry', data: { user_id, - note + note, + subject } }) } - +export const update = (id,data) => { + return service({ + method: 'post', + url: '/store/update/' + id, + data + }) +} export const removeInquiry = (ids) => { return service({ method: 'post', @@ -75,7 +77,6 @@ export const removeInquiry = (ids) => { } }) } - export const addInquiryGoods = (user_id,goods) => { return service({ method: 'post', @@ -86,3 +87,23 @@ export const addInquiryGoods = (user_id,goods) => { } }) } + +export const inquiryInfo = (id) => { + return service({ + method: 'get', + url: '/store/info', + params: { + id + } + }) +} + +export const inquiryGoodsList = (id) => { + return service({ + method: 'get', + url: '/store/goodsList', + params: { + id + } + }) +} diff --git a/src/api/product.js b/src/api/product.js new file mode 100644 index 0000000..3a8cede --- /dev/null +++ b/src/api/product.js @@ -0,0 +1,107 @@ +// 产品商品类API +import service from '@/service' + +export const searchProduct = (code) => { + return service({ + method: 'post', + url: '/product/searchproductbycode/' + code + }) +} + +export const partsGoodsById = (id) => { + return service({ + method: 'get', + url: '/product/goodsById', + params: { + id + } + }) +} + +export const hasProduct = (brand,code) => { + return service({ + method: 'post', + url: '/product/hasproduct', + data: { + code: code, + brand: brand + } + }) +} + +export const hasFocusBatch = (data) => { + return service({ + method: 'post', + url: '/store/hasfocusbatch', + data + }) +} + +export const hasBrandProduct = (brand,code) => { + return service({ + method: 'post', + url: '/product/hasbrandproduct', + data: { + code: code, + brand: brand + } + }) +} + +export const partsGoodsByCode = (code,brand=0) => { + return service({ + method: 'get', + url: '/product/goodsByCode', + params: { + code, + brand + } + }) +} + +export const onlyGoodsByCode = (code,brand=0) => { + return service({ + method: 'get', + url: '/product/onlyGoodsByCode?code=' + code + (brand ? '&brand=' + brand : ''), + }) +} + +export const productInfo = (id) => { + return service({ + method: 'post', + url: '/product/product?id=' + id + }) +} + +export const hasFocus = (brand,code) => { + return service({ + method: 'get', + url: `/store/hasfocus?brand=${brand}&code=${code}`, + }) +} + +export const focusItem = (id) => { + return service({ + method: 'get', + url: '/store/focus_item/' + id, + }) +} + +export const updateFocus = (data) => { + return service({ + method: 'post', + url: '/store/updatefocus', + data + }) +} + +export const addFocusLog = (id,user_id,note) => { + return service({ + method: 'post', + url: '/store/addfocuslog?id=' + id, + data: { + note, + operator: user_id, + } + }) +} diff --git a/src/api/user.js b/src/api/user.js index 81a5868..f2a2c67 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -40,6 +40,29 @@ export const getEmailCode = (email) => { export const loadShopInfo = () => { return service({ method: 'get', - url: '/store/loadShopInfo' + url: '/store/loadShopInfo', + }) +} + +export const addLog = (order_id,user,action,note) => { + return service({ + method: 'post', + url: '/store/addLog', + data: { + order_id, + action, + user, + note + } + }) +} + +export const getLog = (id) => { + return service({ + method: 'get', + url: '/store/getLog', + params: { + order_id: id, + } }) } diff --git a/src/components/BrandPicker.vue b/src/components/BrandPicker.vue new file mode 100644 index 0000000..e0d6f4c --- /dev/null +++ b/src/components/BrandPicker.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/components/Inquiry.vue b/src/components/Inquiry.vue new file mode 100644 index 0000000..d8c7ed9 --- /dev/null +++ b/src/components/Inquiry.vue @@ -0,0 +1,832 @@ + + + + \ No newline at end of file diff --git a/src/components/Offer.vue b/src/components/Offer.vue new file mode 100644 index 0000000..104669b --- /dev/null +++ b/src/components/Offer.vue @@ -0,0 +1,517 @@ + + + diff --git a/src/components/OrderBase.vue b/src/components/OrderBase.vue new file mode 100644 index 0000000..7e40449 --- /dev/null +++ b/src/components/OrderBase.vue @@ -0,0 +1,956 @@ + + + + + \ No newline at end of file diff --git a/src/components/OrderResult.vue b/src/components/OrderResult.vue new file mode 100644 index 0000000..07bdade --- /dev/null +++ b/src/components/OrderResult.vue @@ -0,0 +1,390 @@ + + + diff --git a/src/components/ProductPicker.vue b/src/components/ProductPicker.vue new file mode 100644 index 0000000..35aad49 --- /dev/null +++ b/src/components/ProductPicker.vue @@ -0,0 +1,91 @@ + + + diff --git a/src/components/Result.vue b/src/components/Result.vue new file mode 100644 index 0000000..edbe547 --- /dev/null +++ b/src/components/Result.vue @@ -0,0 +1,326 @@ + + + diff --git a/src/components/icons/FocusIn.vue b/src/components/icons/FocusIn.vue new file mode 100644 index 0000000..1334977 --- /dev/null +++ b/src/components/icons/FocusIn.vue @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/src/components/icons/TopIcon.vue b/src/components/icons/TopIcon.vue new file mode 100644 index 0000000..139d993 --- /dev/null +++ b/src/components/icons/TopIcon.vue @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/src/store/index.js b/src/store/index.js index 060dc52..0960517 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -68,6 +68,9 @@ export const useUserStore = defineStore('user-info',{ userId: (state) => { return state.userInfo.id || '' }, + userName: (state) => { + return state.userInfo.name || '' + }, isAdmin: (state) => { return state.userInfo.role === '0' || state.userInfo.role === '1' }, diff --git a/src/utils/routeMenu.js b/src/utils/routeMenu.js index a7dcd7c..1a9b3f4 100644 --- a/src/utils/routeMenu.js +++ b/src/utils/routeMenu.js @@ -1,8 +1,16 @@ export const adminRoutes = [ { - path:'/inquiry-list', - name:'InquiryList', + path:'/inquiry/list', + name:'inquiry-list', component: 'inquiry/Index' + },{ + path:'/inquiry/create', + name:'inquiry-create', + component: 'inquiry/edit' + },{ + path:'/inquiry/edit/:id', + name:'inquiry-edit', + component: 'inquiry/edit' },{ path:'/customer-list', name:'CustomerList', @@ -27,11 +35,11 @@ export const adminMenus = [ { icon: 'fa fa-list', name: '询盘列表', - path: '/inquiry-list' + path: '/inquiry/list' },{ icon: 'fa fa-plus', name: '新增询价', - path: '/inquiry-create' + path: '/inquiry/create' } ] },{ diff --git a/src/views/inquiry/Index.vue b/src/views/inquiry/Index.vue index d7c31a5..be9373f 100644 --- a/src/views/inquiry/Index.vue +++ b/src/views/inquiry/Index.vue @@ -59,12 +59,11 @@ - 手动建单 + 手动建单 合并订单 - - - @@ -197,7 +180,7 @@ @@ -240,28 +223,6 @@ - \ No newline at end of file