From 0543936df8f9d4e219a8d21f6ea968254406724d Mon Sep 17 00:00:00 2001 From: 97694731 <97694731@qq.com> Date: Thu, 4 Jun 2026 11:18:46 +0800 Subject: [PATCH] change store --- .github/workflows/ci.yaml | 117 + backups/EmployeeAdd.vue.bak | 384 ++ backups/EmployeeList.vue.bak | 494 +++ backups/Login.vue.bak | 213 ++ backups/ReviewIllegalBook.vue.bak | 475 +++ backups/ShippingOrder.vue.bak | 771 ++++ backups/camera.vue.bak | 3364 +++++++++++++++++ backups/config.js.bak | 97 + backups/config.vue.bak | 968 +++++ backups/goodsPop_index.vue.bak | 369 ++ backups/reviewIllegalBook.js.bak | 0 backups/shipping-order.js.bak | 93 + src/api/book.js | 50 + src/api/config.js | 44 + src/api/employee.js | 62 + src/api/login.js | 12 + src/api/reviewIllegalBook.js | 49 + src/api/shipping-order.js | 78 + src/api/wave-task.js | 9 + src/components/AdminLayout.vue | 2 +- src/components/goodsPop/index.vue | 6 +- src/components/wave/camera.vue | 62 +- src/utils/request.js | 4 +- src/views/admin/Dashboard.vue | 4 +- src/views/admin/EmployeeAdd.vue | 6 +- src/views/admin/EmployeeList.vue | 28 +- src/views/config/config.vue | 5 +- src/views/login/Login.vue | 5 +- .../reviewIllegalBook/ReviewIllegalBook.vue | 30 +- src/views/shipping-order/ShippingOrder.vue | 69 +- src/views/wave/Wave.vue | 8 +- verifyTool/data/goods_pricing.db | Bin 28672 -> 28672 bytes vite.config.js | 4 +- 使用文档.md | 454 +++ 技术文档.md | 489 +++ 35 files changed, 8681 insertions(+), 144 deletions(-) create mode 100644 .github/workflows/ci.yaml create mode 100644 backups/EmployeeAdd.vue.bak create mode 100644 backups/EmployeeList.vue.bak create mode 100644 backups/Login.vue.bak create mode 100644 backups/ReviewIllegalBook.vue.bak create mode 100644 backups/ShippingOrder.vue.bak create mode 100644 backups/camera.vue.bak create mode 100644 backups/config.js.bak create mode 100644 backups/config.vue.bak create mode 100644 backups/goodsPop_index.vue.bak create mode 100644 backups/reviewIllegalBook.js.bak create mode 100644 backups/shipping-order.js.bak create mode 100644 src/api/book.js create mode 100644 src/api/employee.js create mode 100644 src/api/login.js create mode 100644 使用文档.md create mode 100644 技术文档.md diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 00000000..d12429fa --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,117 @@ +name: CI + +on: + push: + branches: [ main, master, develop ] + pull_request: + branches: [ main, master, develop ] + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [18.x, 20.x] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Build + run: npm run build + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: dist-${{ matrix.node-version }} + path: dist/ + retention-days: 7 + + lint: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20.x' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run ESLint + run: npm run lint + continue-on-error: true + + - name: TypeScript type check + run: npx tsc --noEmit + + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20.x' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run tests + run: npm run test + continue-on-error: true + + deploy-preview: + needs: [build] + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + name: dist-20.x + path: dist/ + + - name: Deploy to preview environment + run: echo "Preview deployment would happen here" + # 可以添加实际的部署步骤,例如部署到 Vercel、Netlify 等 + + security: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Run npm audit + run: npm audit --audit-level=moderate + continue-on-error: true + + - name: Run Snyk security scan + uses: snyk/actions/node@master + continue-on-error: true + env: + SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} diff --git a/backups/EmployeeAdd.vue.bak b/backups/EmployeeAdd.vue.bak new file mode 100644 index 00000000..6e064ebc --- /dev/null +++ b/backups/EmployeeAdd.vue.bak @@ -0,0 +1,384 @@ + + + + + \ No newline at end of file diff --git a/backups/EmployeeList.vue.bak b/backups/EmployeeList.vue.bak new file mode 100644 index 00000000..6e6b9ebc --- /dev/null +++ b/backups/EmployeeList.vue.bak @@ -0,0 +1,494 @@ + + + + + \ No newline at end of file diff --git a/backups/Login.vue.bak b/backups/Login.vue.bak new file mode 100644 index 00000000..ff3583c7 --- /dev/null +++ b/backups/Login.vue.bak @@ -0,0 +1,213 @@ + + + + + \ No newline at end of file diff --git a/backups/ReviewIllegalBook.vue.bak b/backups/ReviewIllegalBook.vue.bak new file mode 100644 index 00000000..980da91c --- /dev/null +++ b/backups/ReviewIllegalBook.vue.bak @@ -0,0 +1,475 @@ + + + + + + + diff --git a/backups/ShippingOrder.vue.bak b/backups/ShippingOrder.vue.bak new file mode 100644 index 00000000..2a130b24 --- /dev/null +++ b/backups/ShippingOrder.vue.bak @@ -0,0 +1,771 @@ + + + + + diff --git a/backups/camera.vue.bak b/backups/camera.vue.bak new file mode 100644 index 00000000..2f7408c5 --- /dev/null +++ b/backups/camera.vue.bak @@ -0,0 +1,3364 @@ + + + + + + + \ No newline at end of file diff --git a/backups/config.js.bak b/backups/config.js.bak new file mode 100644 index 00000000..3970e6ff --- /dev/null +++ b/backups/config.js.bak @@ -0,0 +1,97 @@ +import axios from 'axios' + +/** + * 测试连接核价器 + * @param {string} ip - IP 地址 + * @param {string} port - 端口 + * @returns {Promise} + */ +export const testConnection = (ip, port) => { + const params = new URLSearchParams() + params.append('isbn', '0') + params.append('out_id', '0') + params.append('quality', '0') + params.append('query_index', '1') + params.append('user_id', '0') + return axios.post(`http://${ip}:${port}/api/goods/query`, params.toString(), { + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + timeout: 10000 + }).then(res => res.data) +} + +/** + * 保存新价格到核价器 + * @param {string} ip - IP 地址 + * @param {string} port - 端口 + * @returns {Promise} + */ +export const saveNewPrice = (ip, port, newPrice, placeholderDownPrice, minShippingFee, minPrice, verifyIndex) => { + const formData = new URLSearchParams() + formData.append('new_price', newPrice) + formData.append('placeholder_down_price', placeholderDownPrice) + formData.append('min_shipping_fee', minShippingFee) + formData.append('min_price', minPrice) + formData.append('query_index', verifyIndex) + console.log(formData.toString()) + return axios.post(`http://${ip}:${port}/api/config/price/set`, formData.toString(), { + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + timeout: 10000 + }).then(res => res.data) +} + +/** + * 孔夫子旧书网登录(直接请求核价器) + * @param {string} username - 孔网用户名 + * @param {string} password - 孔网密码 + * @param {string} ip - 核价器 IP + * @param {string} port - 核价器端口 + * @returns {Promise<{code: number, data: {token: string, nickname: string}, message: string}>} + */ +export const kongfzLogin = (username, password, ip, port) => { + const formData = new FormData() + formData.append('username', username) + formData.append('password', password) + return axios.post(`http://${ip}:${port}/api/kfz/login`, formData, { + timeout: 15000 + }).then(res => res.data) +} + +/** + * 批量提交 Token 到核价器 + * @param {Array<{username: string, token: string}>} tokens - 账号 Token 列表 + * @param {string} ip - 核价器 IP + * @param {string} port - 核价器端口 + * @returns {Promise} + */ +export const batchAddTokens = (tokens, ip, port) => { + return axios.post(`http://${ip}:${port}/api/token/add`, tokens, { + headers: { 'Content-Type': 'application/json' }, + timeout: 10000 + }).then(res => res.data) +} + +/** + * 从核价器获取已保存的 Token 列表 + * @param {string} ip - 核价器 IP + * @param {string} port - 核价器端口 + * @returns {Promise<{code: number, data: Array<{Username: string, Token: string, ID: number, IsEnable: boolean}>, message: string}>} + */ +export const fetchTokenList = (ip, port) => { + return axios.post(`http://${ip}:${port}/api/token/list`, {}, { + headers: { 'Content-Type': 'application/json' }, + timeout: 10000 + }).then(res => res.data) +} + + +/** + * 从核价器获取config配置 + * @param {string} ip - 核价器 IP + * @param {string} port - 核价器端口 + */ +export const fetchConfig = (ip, port) => { + return axios.post(`http://${ip}:${port}/api/config/price/get`, {}, { + headers: { 'Content-Type': 'application/json' }, + timeout: 10000 + }).then(res => res.data) +} \ No newline at end of file diff --git a/backups/config.vue.bak b/backups/config.vue.bak new file mode 100644 index 00000000..6667e81c --- /dev/null +++ b/backups/config.vue.bak @@ -0,0 +1,968 @@ + + + + + \ No newline at end of file diff --git a/backups/goodsPop_index.vue.bak b/backups/goodsPop_index.vue.bak new file mode 100644 index 00000000..3855004d --- /dev/null +++ b/backups/goodsPop_index.vue.bak @@ -0,0 +1,369 @@ + + + + + diff --git a/backups/reviewIllegalBook.js.bak b/backups/reviewIllegalBook.js.bak new file mode 100644 index 00000000..e69de29b diff --git a/backups/shipping-order.js.bak b/backups/shipping-order.js.bak new file mode 100644 index 00000000..ccbc759b --- /dev/null +++ b/backups/shipping-order.js.bak @@ -0,0 +1,93 @@ +import request from '@/utils/request' + +/** 发货单 API 基础路径 */ +const API_BASE = '/shipping-order' + +/** + * 标准化列表接口返回的数据格式 + * @param {Object} payload - 接口返回的原始响应对象 + * @returns {{ list: Array, total: number }} 标准化后的列表数据 + */ +const normalizeListResponse = (payload) => { + const data = payload?.data + if (!data) return { list: [], total: 0 } + if (Array.isArray(data)) return { list: data, total: data.length } + return { + list: Array.isArray(data.list) ? data.list : [], + total: typeof data.total === 'number' ? data.total : 0 + } +} + +/** + * 获取发货单列表(支持分页和筛选) + * @param {Object} params - 请求参数 + * @param {string} [params.check_no] - 搜索关键字(发货单号) + * @param {number} [params.status] - 状态筛选 + * @param {number} [params.customer_id] - 客户ID筛选 + * @param {number} [params.warehouse_id] - 仓库ID筛选 + * @param {number} [params.sales_order_id] - 销售订单ID筛选 + * @param {number} [params.wave_task_id] - 波次任务ID筛选 + * @param {number} [params.page] - 当前页码 + * @param {number} [params.pageSize] - 每页条数 + * @returns {Promise<{ list: Array, total: number }>} 标准化后的发货单列表 + */ +export const fetchShippingOrderList = async ({ check_no, status, customer_id, warehouse_id, sales_order_id, wave_task_id, page, pageSize }) => { + const params = { + check_no: check_no || undefined, + status, + customer_id, + warehouse_id, + sales_order_id, + wave_task_id, + page, + page_size: pageSize + } + const response = await request.get(`${API_BASE}/list`, { params }) + return normalizeListResponse(response) +} + +/** + * 获取单个发货单详情(含明细行) + * @param {string|number} id - 发货单ID + * @returns {Promise} 发货单详情对象 + */ +export const fetchShippingOrderDetail = async (id) => { + const response = await request.get(`${API_BASE}/detail`, { params: { id } }) + return response?.data || null +} + +/** + * 生成发货单(form-data 格式) + * @param {Object} params + * @param {number} params.total - 选中的出库单数量 + * @param {number[]} params.outbound_order_ids - 选中的出库单 ID 数组 + * @returns {Promise} + */ +export const createShippingOrder = async ({ total, outbound_order_ids }) => { + // 手动构建 FormData,按照 outbound_order_ids[0]={id} 的格式 + const formData = new FormData() + formData.append('total', String(total)) + outbound_order_ids.forEach((id, index) => { + formData.append(`order_ids[${index}]`, String(id)) + }) + return request.post(`${API_BASE}/create`, formData) +} + +/** + * 更新发货单物流信息(form-data 格式) + * @param {Object} params + * @param {number} params.shipping_order_id - 发货单ID + * @param {number} params.sales_order_item_id - 销售订单明细ID + * @param {string} params.logistics_company - 物流公司 + * @param {string} params.logistics_no - 物流单号 + * @returns {Promise} + */ +export const updateShippingOrderLogistics = async ({ shipping_order_id, sales_order_item_id, logistics_company, logistics_no }) => { + const formData = new FormData() + formData.append('shipping_order_id', String(shipping_order_id)) + formData.append('total', '1') + formData.append('sales_order_item_id', String(sales_order_item_id)) + formData.append('logistics_company', logistics_company) + formData.append('logistics_no', logistics_no) + return request.post(`${API_BASE}/update`, formData) +} diff --git a/src/api/book.js b/src/api/book.js new file mode 100644 index 00000000..63080bb8 --- /dev/null +++ b/src/api/book.js @@ -0,0 +1,50 @@ +import request from '@/utils/request' + +/** + * 根据 ISBN 查询书籍信息 + * @param {string} isbn - ISBN 编号 + * @returns {Promise} 接口返回的 Promise 对象,包含书籍信息 + */ +export const getBookInfo = async (isbn) => { + return request.get('/getBookInfo', { params: { isbn } }) +} + +/** + * 同步/保存书籍信息 + * @param {Object} params - 书籍数据 + * @param {string} [params.book_name] - 书名 + * @param {string} [params.author] - 作者 + * @param {string} [params.publisher] - 出版社 + * @param {string} [params.publication_time] - 出版时间 + * @param {string} [params.binding_layout] - 装帧 + * @param {number} [params.fix_price] - 定价 + * @param {string} [params.isbn] - ISBN + * @param {string|number} [params.page_count] - 页数 + * @param {string|number} [params.word_count] - 字数 + * @param {string} [params.book_format] - 开本 + * @param {number} [params.fid] - 上级ID + * @param {string} [params.f_isbn] - 上级ISBN + * @param {string} [params.f_book_name] - 上级书名 + * @param {string} [params.live_image] - 实拍图片 + * @param {string|number} [params.type] - 类型 + * @returns {Promise} + */ +export const syncBook = async (params) => { + const body = {} + if (params.book_name) body['book_name'] = params.book_name + if (params.author) body['author'] = params.author + if (params.publisher) body['publisher'] = params.publisher + if (params.publication_time) body['publication_time'] = params.publication_time + if (params.binding_layout) body['binding_layout'] = params.binding_layout + if (params.fix_price !== undefined) body['fix_price'] = params.fix_price + if (params.isbn) body['isbn'] = params.isbn + if (params.page_count) body['page_count'] = params.page_count + if (params.word_count) body['word_count'] = params.word_count + if (params.book_format) body['book_format'] = params.book_format + if (params.fid !== undefined) body['fid'] = params.fid + if (params.f_isbn) body['f_isbn'] = params.f_isbn + if (params.f_book_name) body['f_book_name'] = params.f_book_name + if (params.live_image) body['live_image[0]'] = params.live_image + if (params.type) body['type'] = params.type + return request.post('/syncBook', body) +} diff --git a/src/api/config.js b/src/api/config.js index 3970e6ff..a28d3c44 100644 --- a/src/api/config.js +++ b/src/api/config.js @@ -94,4 +94,48 @@ export const fetchConfig = (ip, port) => { headers: { 'Content-Type': 'application/json' }, timeout: 10000 }).then(res => res.data) +} + +/** + * 向核价器查询商品信息 + * @param {Object} params - 查询参数 + * @param {string} params.ip - 核价器 IP + * @param {string} params.port - 核价器端口 + * @param {string} params.isbn - ISBN + * @param {string|number} params.outId - 商品外部ID + * @param {string|number} params.quality - 品质 + * @param {string|number} params.queryIndex - 查询索引 + * @param {string|number} params.userId - 用户ID + * @param {string} [params.placeholderDownPrice] - 占位降价金额 + * @param {string} [params.minShippingFee] - 最低运费 + * @param {string} [params.minPrice] - 最低书价 + * @returns {Promise} + */ +export const queryGoodsPrice = ({ ip, port, isbn, outId, quality, queryIndex, userId, placeholderDownPrice, minShippingFee, minPrice }) => { + const params = new URLSearchParams() + params.append('isbn', isbn) + params.append('out_id', String(outId)) + params.append('quality', String(quality)) + params.append('query_index', String(queryIndex)) + params.append('user_id', String(userId)) + if (placeholderDownPrice) params.append('placeholder_down_price', placeholderDownPrice) + if (minShippingFee) params.append('min_shipping_fee', minShippingFee) + if (minPrice) params.append('min_price', minPrice) + return axios.post(`http://${ip}:${port}/api/goods/query`, params.toString(), { + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + timeout: 10000 + }).then(res => res.data) +} + +/** + * 删除核价器中的 Token + * @param {string} ip - 核价器 IP + * @param {string} port - 核价器端口 + * @param {string|number} id - Token ID + * @returns {Promise} + */ +export const deleteToken = (ip, port, id) => { + return axios.get(`http://${ip}:${port}/api/token/delete`, { + params: { id } + }).then(res => res.data) } \ No newline at end of file diff --git a/src/api/employee.js b/src/api/employee.js new file mode 100644 index 00000000..bc5ac524 --- /dev/null +++ b/src/api/employee.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +/** + * 获取员工/代理列表 + * @param {Object} params - 查询参数 + * @param {number} [params.page] - 当前页码 + * @param {number} [params.page_size] - 每页条数 + * @param {number|string} [params.status] - 状态筛选 + * @param {string} [params.keyword] - 搜索关键词(工号/姓名/账号) + * @returns {Promise<{ code: number, data: { list: Array, total: number } }>} + */ +export const fetchEmployeeList = async (params) => { + return request.get('/admin/employee/list', { params }) +} + +/** + * 添加员工/代理 + * @param {Object} params - 添加参数 + * @param {string} params.name - 姓名 + * @param {string} params.password - 密码 + * @param {string} params.phone - 手机号 + * @param {number} [params.fid] - 上级ID + * @param {number} [params.about_id] - about_id + * @returns {Promise} + */ +export const addEmployee = async (params) => { + return request.post('/admin/employee/add', params) +} + +/** + * 代理积分充值 + * @param {string|number} employeeId - 员工ID + * @param {Object} data - 充值数据 + * @param {number} data.amount - 充值数量 + * @param {string} [data.remark] - 备注 + * @returns {Promise} + */ +export const topupEmployee = async (employeeId, data) => { + return request.post(`/admin/employee/topup/${employeeId}`, data) +} + +/** + * 代理积分扣减 + * @param {string|number} employeeId - 员工ID + * @param {Object} data - 扣减数据 + * @param {number} data.amount - 扣减数量 + * @param {string} [data.remark] - 备注 + * @returns {Promise} + */ +export const deductEmployee = async (employeeId, data) => { + return request.post(`/admin/employee/deduct/${employeeId}`, data) +} + +/** + * 启用/禁用代理 + * @param {'enable'|'disable'} action - 操作类型 + * @param {string|number} employeeId - 员工ID + * @returns {Promise} + */ +export const toggleEmployeeStatus = async (action, employeeId) => { + return request.post(`/admin/employee/${action}/${employeeId}`) +} diff --git a/src/api/login.js b/src/api/login.js new file mode 100644 index 00000000..c7cb8cc0 --- /dev/null +++ b/src/api/login.js @@ -0,0 +1,12 @@ +import request from '@/utils/request' + +/** + * 登录 + * @param {'admin'|'employee'} type - 登录类型,'admin' 对应管理员(255),'employee' 对应代理(128) + * @param {Object} formData - 表单数据 { username, password } + * @returns {Promise} + */ +export const login = async (type, formData) => { + const role = type === 'admin' ? '255' : '128' + return request.post(`/login/${role}`, { ...formData, type: 1 }) +} diff --git a/src/api/reviewIllegalBook.js b/src/api/reviewIllegalBook.js index e69de29b..116f9d3d 100644 --- a/src/api/reviewIllegalBook.js +++ b/src/api/reviewIllegalBook.js @@ -0,0 +1,49 @@ +import request from '@/utils/request' + +/** + * 标准化列表接口返回的数据格式 + */ +const normalizeListResponse = (payload) => { + const data = payload?.data + if (!data) { + return { list: [], total: 0 } + } + if (Array.isArray(data)) { + return { list: data, total: data.length } + } + return { + list: Array.isArray(data.list) ? data.list : [], + total: typeof data.total === 'number' ? data.total : Array.isArray(data.list) ? data.list.length : 0 + } +} + +/** + * 获取书目异常记录列表 + * @param {Object} params - 查询参数 + * @param {string} [params.barcode] - ISBN + * @param {number|string} [params.status] - 状态筛选 + * @param {number} [params.page] - 当前页码 + * @param {number} [params.page_size] - 每页条数 + * @returns {Promise<{ list: Array, total: number }>} + */ +export const fetchProductLogList = async (params) => { + const res = await request.get('/product_log/list', { params }) + const data = res?.data + return { + list: Array.isArray(data?.list) ? data.list : Array.isArray(data) ? data : [], + total: data?.total || 0 + } +} + +/** + * 删除书目异常记录 + * @param {string|number} id - 记录ID + * @returns {Promise} + */ +export const deleteProductLog = async (id) => { + const formData = new FormData() + formData.append('id', String(id)) + return request.post('/product_log/delete', formData, { + headers: { 'Content-Type': 'multipart/form-data' } + }) +} diff --git a/src/api/shipping-order.js b/src/api/shipping-order.js index ccbc759b..831b5f47 100644 --- a/src/api/shipping-order.js +++ b/src/api/shipping-order.js @@ -1,8 +1,13 @@ import request from '@/utils/request' +import axios from 'axios' /** 发货单 API 基础路径 */ const API_BASE = '/shipping-order' +// 外部 API 基础地址 +const BZY_API_BASE = 'https://api.buzhiyushu.cn' +const PRINT_API_BASE = 'https://print.buzhiyushu.cn' + /** * 标准化列表接口返回的数据格式 * @param {Object} payload - 接口返回的原始响应对象 @@ -91,3 +96,76 @@ export const updateShippingOrderLogistics = async ({ shipping_order_id, sales_or formData.append('logistics_no', logistics_no) return request.post(`${API_BASE}/update`, formData) } + +// ───────── 外部快递/打印相关 API ───────── + +/** + * 获取快递账号列表(外部接口) + * @param {string|number} shopId - 店铺ID + * @returns {Promise} + */ +export const fetchFastMailList = async (shopId) => { + const res = await axios.get(`${BZY_API_BASE}/zhishu/fastMail/listApi`, { + params: { shopId } + }) + return res.data +} + +/** + * 创建快递面单(外部打印接口) + * @param {Object} params - 面单参数 + * @param {string} params.type - 快递类型 + * @param {string} params.partnerId - 合作方ID + * @param {string} params.secret - 密钥 + * @param {string} params.orderSn - 平台单号 + * @param {string} params.contact - 联系人 + * @param {string} params.phoneNumber - 联系电话 + * @param {string} params.province - 省份 + * @param {string} params.city - 城市 + * @param {string} params.area - 区县 + * @param {string} params.town - 详细地址 + * @returns {Promise} + */ +export const createOrderBatch = async (params) => { + const formData = new FormData() + formData.append('type', params.type) + formData.append('partnerId', params.partnerId) + formData.append('secret', params.secret) + formData.append('orderSn', params.orderSn) + formData.append('contact', params.contact) + formData.append('phoneNumber', params.phoneNumber) + formData.append('province', params.province) + formData.append('city', params.city) + formData.append('area', params.area) + formData.append('town', params.town) + const res = await axios.post(`${PRINT_API_BASE}/api/print/createOrderBatch`, formData) + return res.data +} + +/** + * 获取打印面单信息(外部打印接口) + * @param {Object} params - 参数 + * @param {string} params.mailno - 快递单号 + * @param {string} params.partnerId - 合作方ID + * @param {string} params.secret - 密钥 + * @returns {Promise} + */ +export const createBmOrderDaYin = async (params) => { + const res = await axios.get(`${PRINT_API_BASE}/api/print/createBmOrderDaYin`, { params }) + return res.data +} + +/** + * 回填快递单号(外部接口) + * @param {Object} params - 参数 + * @param {string} params.code - 快递公司编码 + * @param {string} params.orderNo - 快递单号 + * @param {string} params.erpOrderId - ERP 订单ID + * @returns {Promise} + */ +export const submitCompanyOrder = async (params) => { + const res = await axios.post(`${BZY_API_BASE}/zhishu/orderExternalGoods/submitCompanyOrder`, params, { + headers: { 'Content-Type': 'application/json' } + }) + return res.data +} diff --git a/src/api/wave-task.js b/src/api/wave-task.js index 26f63fd1..356676dd 100644 --- a/src/api/wave-task.js +++ b/src/api/wave-task.js @@ -136,3 +136,12 @@ export const createWaveOutboundRelease = async (relatedOrderId, waveId) => { formData.append('wave_id', waveId) return request.post('/wave/outbound/release', formData) } + +/** + * 查询波次状态 + * @param {string|number} id + * @returns + */ +export const getWaveStatusById = async (id) => { + return request.get(`/wave/getWaveStatusById?id=${id}`) +} \ No newline at end of file diff --git a/src/components/AdminLayout.vue b/src/components/AdminLayout.vue index 5f714e0f..fd550cf9 100644 --- a/src/components/AdminLayout.vue +++ b/src/components/AdminLayout.vue @@ -26,7 +26,7 @@ 代理列表 添加代理 - 账户类型 + 账户类型 diff --git a/src/components/goodsPop/index.vue b/src/components/goodsPop/index.vue index 3855004d..0331a0de 100644 --- a/src/components/goodsPop/index.vue +++ b/src/components/goodsPop/index.vue @@ -96,7 +96,7 @@ diff --git a/src/views/config/config.vue b/src/views/config/config.vue index 6667e81c..7bab6c55 100644 --- a/src/views/config/config.vue +++ b/src/views/config/config.vue @@ -289,6 +289,7 @@ import { fetchTokenList, saveNewPrice, fetchConfig, + deleteToken, } from '@/api/config' const STORAGE_KEY_FILE_DIR = 'file_dir' @@ -444,9 +445,7 @@ export default { type: 'warning' }) // 调用删除接口 - await axios.get(`http://${ip.value}:${port.value}/api/token/delete`, { - params: { id: entry.id } - }) + await deleteToken(ip.value, port.value, entry.id!) // 同时清除 username 对应的 localStorage key localStorage.removeItem(entry.username) const list = loadSavedAccounts().filter(a => a.account !== entry.account) diff --git a/src/views/login/Login.vue b/src/views/login/Login.vue index ff3583c7..469ecd00 100644 --- a/src/views/login/Login.vue +++ b/src/views/login/Login.vue @@ -72,7 +72,7 @@ User, Lock } from '@element-plus/icons-vue' - import request from '@/utils/request' + import { login } from '@/api/login' import { setAdminToken, setAdminUserInfo @@ -132,8 +132,7 @@ loading.value = true try { - const type = activeTab.value === 'admin' ? '255' : '128' - const res = await request.post(`/login/${type}`, { ...formData, type: 1 }) + const res = await login(activeTab.value, { ...formData }) if (res.code === 200) { setAdminToken(res.data.token) diff --git a/src/views/reviewIllegalBook/ReviewIllegalBook.vue b/src/views/reviewIllegalBook/ReviewIllegalBook.vue index 980da91c..ad9a075d 100644 --- a/src/views/reviewIllegalBook/ReviewIllegalBook.vue +++ b/src/views/reviewIllegalBook/ReviewIllegalBook.vue @@ -217,7 +217,7 @@