运营段修改

This commit is contained in:
dev 2025-06-16 11:22:02 +08:00
parent e4397049ee
commit 51ea9d3bfa
61 changed files with 5466 additions and 1219 deletions

View File

@ -4,20 +4,13 @@ import { resolve } from 'node:path';
export default {
host: '112.74.106.216',
port: 22, // 默认 SSH 端口
port: 22,
username: 'root',
// 密码和私钥二选一
password: 'Smt1618?',
privateKey: null, // 示例: readFileSync(resolve(process.env.HOME, '.ssh/id_rsa')),
privateKey: null,
// 部署路径
remotePath: '/opt/1panel/apps/openresty/openresty/www/sites/www.amzups.com/index',
// 是否清空目标目录
cleanRemote: true
// 高级选项 (可选)
// uploadIgnore: ['*.map', 'tmp/*'],
// execAfterDeploy: 'sudo systemctl restart nginx'
};

View File

@ -1,39 +1,28 @@
# 页面标题
VITE_APP_TITLE = 瑷胜科技管理系统
VITE_APP_TITLE = 香港SMT订单物流管理系统
# 开发环境配置
VITE_APP_ENV = 'development'
# 开发环境
VITE_APP_BASE_API = '/dev-api'
VITE_BACKEND_URL = 'http://localhost:8080'
#VITE_BACKEND_URL = 'http://112.74.106.216:8080'
# 应用访问路径 例如使用前缀 /admin/
VITE_APP_CONTEXT_PATH = '/'
# 监控地址
VITE_APP_MONITOR_ADMIN = 'http://localhost:9090/admin/applications'
# SnailJob 控制台地址
VITE_APP_SNAILJOB_ADMIN = 'http://localhost:8800/snail-job'
VITE_APP_PORT = 80
# 接口加密功能开关(如需关闭 后端也必须对应关闭)
VITE_APP_ENCRYPT = true
# 接口加密传输 RSA 公钥与后端解密私钥对应 如更换需前后端一同更换
VITE_APP_RSA_PUBLIC_KEY = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
# 接口响应解密 RSA 私钥与后端加密公钥对应 如更换需前后端一同更换
VITE_APP_RSA_PRIVATE_KEY = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE='
# 客户端id
VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e'
# websocket 开关 默认使用sse推送
VITE_APP_WEBSOCKET = false
# sse 开关
VITE_APP_SSE = true

View File

@ -1,40 +1,28 @@
# 页面标题
VITE_APP_TITLE = 瑷胜科技管理系统
VITE_APP_TITLE = 香港SMT订单物流管理系统
# 生产环境配置
VITE_APP_ENV = 'production'
# 应用访问路径 例如使用前缀 /admin/
VITE_APP_CONTEXT_PATH = '/'
# 监控地址
VITE_APP_MONITOR_ADMIN = '/admin/applications'
# SnailJob 控制台地址
VITE_APP_SNAILJOB_ADMIN = '/snail-job'
# 生产环境
VITE_APP_BASE_API = '/prod-api'
VITE_BACKEND_URL = 'http://112.74.106.216:8080'
# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS = gzip
VITE_APP_PORT = 80
# 接口加密功能开关(如需关闭 后端也必须对应关闭)
VITE_APP_ENCRYPT = true
# 接口加密传输 RSA 公钥与后端解密私钥对应 如更换需前后端一同更换
VITE_APP_RSA_PUBLIC_KEY = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
# 接口响应解密 RSA 私钥与后端加密公钥对应 如更换需前后端一同更换
VITE_APP_RSA_PRIVATE_KEY = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE='
# 客户端id
VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e'
# websocket 开关 默认使用sse推送
VITE_APP_WEBSOCKET = false
# sse 开关
VITE_APP_SSE = true

View File

@ -3,7 +3,6 @@ import path from 'node:path';
import fs from 'node:fs';
import process from 'node:process';
// 动态导入配置文件(支持文件不存在的情况)
const loadConfig = async () => {
try {
const { default: config } = await import('./.deployrc.js');
@ -27,11 +26,9 @@ const ssh = new NodeSSH();
async function deploy() {
try {
// 加载配置
const config = await loadConfig();
validateConfig(config);
// 连接服务器
console.log('🔄 Connecting to server...');
await ssh.connect({
host: config.host,
@ -41,17 +38,14 @@ async function deploy() {
privateKey: config.privateKey
});
// 确保目录存在
console.log('📂 Ensuring remote directory exists...');
await ssh.execCommand(`mkdir -p ${config.remotePath}`);
// 清理目录
if (config.cleanRemote) {
console.log('🧹 Cleaning remote directory...');
await ssh.execCommand(`rm -rf ${config.remotePath}/*`);
}
// 上传文件
console.log('🚀 Uploading files...');
const uploadResult = await ssh.putDirectory('./dist', config.remotePath, {
recursive: true,

View File

@ -6,7 +6,7 @@
<meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<link rel="icon" href="/favicon.ico" />
<title>瑷胜科技管理系统</title>
<title>香港SMT订单物流管理系统</title>
<!--[if lt IE 11
]><script>
window.location.href = '/html/ie.html';

View File

@ -2,7 +2,7 @@
"$schema": "https://json.schemastore.org/tsconfig",
"name": "asinkeji",
"version": "5.3.0",
"description": "瑷胜科技管理系统",
"description": "香港SMT订单物流管理系统",
"author": "LionLi",
"license": "MIT",
"type": "module",
@ -28,6 +28,7 @@
"@vueup/vue-quill": "1.2.0",
"@vueuse/core": "11.3.0",
"animate.css": "4.1.1",
"countup.js": "^2.8.0",
"await-to-js": "3.0.0",
"axios": "1.7.8",
"crypto-js": "4.2.0",

View File

@ -18,5 +18,3 @@ onMounted(() => {
});
});
</script>

View File

@ -74,6 +74,8 @@ export interface InquiryRequestItemVO {
*/
channelId: string | number;
customsFlag: string;
quoteDate: string;
}

View File

@ -31,6 +31,8 @@ export interface LogisticsQuoteVO {
*/
leadTime: number;
minLeadTime: number;
/**
*
*/
@ -103,6 +105,8 @@ export interface LogisticsQuoteForm extends BaseEntity {
*/
leadTime?: number;
minLeadTime?: number;
/**
*
*/
@ -111,7 +115,7 @@ export interface LogisticsQuoteForm extends BaseEntity {
/**
*
*/
quoteDate?: string;
quoteDate?: string | Date | Date[];
/**
* Y已提交 N未提交
@ -133,6 +137,11 @@ export interface LogisticsQuoteForm extends BaseEntity {
*/
channelId?: string | number;
channelName?: string;
quoteStartDate?: string;
quoteEndDate?: string;
/**
* N不是 Y是
*/

View File

@ -51,6 +51,18 @@ export const updatePurchaseOrder = (data: PurchaseOrderForm) => {
});
};
/**
*
* @param data
*/
export const confirmPurchaseOrder = (data: PurchaseOrderForm) => {
return request({
url: '/amz/purchaseOrder/confirm',
method: 'post',
data: data
});
};
/**
*
* @param orderSn

View File

@ -1,4 +1,9 @@
import { ShipForwardVO } from '@/api/amz/shipForward/types';
import { PurchaseOrderItemVO } from '@/api/amz/purchaseOrderItem/types';
import { StatusHistoryVO } from '@/api/amz/statusHistory/types';
export interface PurchaseOrderVO {
id: string | number;
/**
*
*/
@ -253,6 +258,16 @@ export interface PurchaseOrderVO {
*
*/
dlvTimeVar: number;
remainingQuantity: number;
forwardList?: ShipForwardVO[];
items?: PurchaseOrderItemVO[];
sysStatusHistories?: StatusHistoryVO[];
hasForward?: number | string;
hasSendOrder?: number | string;
}
export interface PurchaseOrderForm extends BaseEntity {
@ -501,10 +516,17 @@ export interface PurchaseOrderForm extends BaseEntity {
*/
deliveryTime?: string;
/**
*
*/
divTime?: string;
/**
*
*/
dlvTimeVar?: number;
storeName?: string;
}
export interface PurchaseOrderQuery extends PageQuery {
@ -741,7 +763,7 @@ export interface PurchaseOrderQuery extends PageQuery {
/**
*
*/
orderStatus?: string;
orderStatus?: string | string[];
/**
*
@ -753,6 +775,9 @@ export interface PurchaseOrderQuery extends PageQuery {
*/
dlvTimeVar?: number;
storeName?: string;
sku?: string;
/**
*
*/

View File

@ -0,0 +1,71 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { PurchaseOrderItemVO, PurchaseOrderItemForm, PurchaseOrderItemQuery } from '@/api/amz/purchaseOrderItem/types';
/**
*
* @param query
* @returns {*}
*/
export const listPurchaseOrderItem = (query?: PurchaseOrderItemQuery): AxiosPromise<PurchaseOrderItemVO[]> => {
return request({
url: '/amz/purchaseOrderItem/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getPurchaseOrderItem = (id: string | number): AxiosPromise<PurchaseOrderItemVO> => {
return request({
url: '/amz/purchaseOrderItem/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addPurchaseOrderItem = (data: PurchaseOrderItemForm) => {
return request({
url: '/amz/purchaseOrderItem',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updatePurchaseOrderItem = (data: PurchaseOrderItemForm) => {
return request({
url: '/amz/purchaseOrderItem',
method: 'put',
data: data
});
};
export const updateOrderItemDetail = (data: any) => {
return request({
url: '/amz/purchaseOrderItem',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delPurchaseOrderItem = (id: string | number | Array<string | number>) => {
return request({
url: '/amz/purchaseOrderItem/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,435 @@
export interface PurchaseOrderItemVO {
/**
* ID
*/
id: string | number;
/**
*
*/
orderSn: string;
/**
* ID
*/
wid: string | number;
/**
*
*/
wareHouseName: string;
/**
*
*/
planSn: string;
/**
* ID
*/
productId: string | number;
/**
*
*/
productName: string;
/**
* SKU
*/
sku: string;
/**
* FNSKU
*/
fnsku: string;
/**
* ID
*/
sid: string | number;
/**
*
*/
model: string;
/**
*
*/
price: number;
/**
*
*/
amount: number;
/**
*
*/
quantityPlan: number;
/**
*
*/
quantityReal: number;
/**
*
*/
quantityEntry: number;
/**
*
*/
quantityReceive: number;
/**
* 退
*/
quantityReturn: number;
/**
*
*/
quantityExchange: number;
/**
*
*/
quantityQc: number;
/**
*
*/
quantityQcPrepare: number;
/**
*
*/
expectArriveTime: string;
/**
*
*/
remark: string;
/**
*
*/
casesNum: number;
/**
*
*/
quantityPerCase: number;
/**
* 0 1
*/
isDelete: number;
/**
*
*/
taxRate: string;
/**
* SPU
*/
spu: string;
/**
*
*/
spuName: string;
}
export interface PurchaseOrderItemForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
*
*/
orderSn?: string;
/**
* ID
*/
wid?: string | number;
/**
*
*/
wareHouseName?: string;
/**
*
*/
planSn?: string;
/**
* ID
*/
productId?: string | number;
/**
*
*/
productName?: string;
/**
* SKU
*/
sku?: string;
/**
* FNSKU
*/
fnsku?: string;
/**
* ID
*/
sid?: string | number;
/**
*
*/
model?: string;
/**
*
*/
price?: number;
/**
*
*/
amount?: number;
/**
*
*/
quantityPlan?: number;
/**
*
*/
quantityReal?: number;
/**
*
*/
quantityEntry?: number;
/**
*
*/
quantityReceive?: number;
/**
* 退
*/
quantityReturn?: number;
/**
*
*/
quantityExchange?: number;
/**
*
*/
quantityQc?: number;
/**
*
*/
quantityQcPrepare?: number;
/**
*
*/
expectArriveTime?: string;
/**
*
*/
remark?: string;
/**
*
*/
casesNum?: number;
/**
*
*/
quantityPerCase?: number;
/**
* 0 1
*/
isDelete?: number;
/**
*
*/
taxRate?: string;
/**
* SPU
*/
spu?: string;
/**
*
*/
spuName?: string;
}
export interface PurchaseOrderItemQuery extends PageQuery {
/**
*
*/
orderSn?: string;
/**
* ID
*/
wid?: string | number;
/**
*
*/
wareHouseName?: string;
/**
*
*/
planSn?: string;
/**
* ID
*/
productId?: string | number;
/**
*
*/
productName?: string;
/**
* SKU
*/
sku?: string;
/**
* FNSKU
*/
fnsku?: string;
/**
* ID
*/
sid?: string | number;
/**
*
*/
model?: string;
/**
*
*/
price?: number;
/**
*
*/
amount?: number;
/**
*
*/
quantityPlan?: number;
/**
*
*/
quantityReal?: number;
/**
*
*/
quantityEntry?: number;
/**
*
*/
quantityReceive?: number;
/**
* 退
*/
quantityReturn?: number;
/**
*
*/
quantityExchange?: number;
/**
*
*/
quantityQc?: number;
/**
*
*/
quantityQcPrepare?: number;
/**
*
*/
expectArriveTime?: string;
/**
*
*/
casesNum?: number;
/**
*
*/
quantityPerCase?: number;
/**
* 0 1
*/
isDelete?: number;
/**
*
*/
taxRate?: string;
/**
* SPU
*/
spu?: string;
/**
*
*/
spuName?: string;
/**
*
*/
params?: any;
}

View File

@ -58,7 +58,6 @@ export interface SendOrderVO {
* pending=confirm=, processing=completed=
*/
sendStatus: string;
}
export interface SendOrderForm extends BaseEntity {
@ -122,10 +121,12 @@ export interface SendOrderForm extends BaseEntity {
*/
sendStatus?: string;
sendDetail?: string;
orderDetailId?: string | number;
}
export interface SendOrderQuery extends PageQuery {
/**
*
*/
@ -181,11 +182,8 @@ export interface SendOrderQuery extends PageQuery {
*/
sendStatus?: string;
/**
*
*/
params?: any;
/**
*
*/
params?: any;
}

View File

@ -51,6 +51,18 @@ export const updateShipForward = (data: ShipForwardForm) => {
});
};
/**
*
* @param data
*/
export const sendUpdateShipForward = (data: ShipForwardForm) => {
return request({
url: '/amz/shipForward/sendUpdate',
method: 'put',
data: data
});
};
/**
*
* @param id

View File

@ -166,10 +166,16 @@ export interface ShipForwardForm extends BaseEntity {
*/
sendTime?: string;
expDeliveryDate?: string;
boxNum?: number;
/**
* ID
*/
orderDetailId?: string | number;
sfgAvlQty?: number | string;
/**
*
*/

View File

@ -1,6 +1,6 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { ShipmentPlanVO, ShipmentPlanForm, ShipmentPlanQuery } from '@/api/amz/shipmentPlan/types';
import { ShipmentPlanVO, ShipmentPlanForm, ShipmentPlanQuery, ShipmentPlanOrderVO } from '@/api/amz/shipmentPlan/types';
/**
*
@ -16,7 +16,7 @@ export const listShipmentPlan = (query?: ShipmentPlanQuery): AxiosPromise<Shipme
});
};
export const listShipmentPlanOrder = (query?: ShipmentPlanQuery): AxiosPromise<ShipmentPlanVO[]> => {
export const listShipmentPlanOrder = (query?: ShipmentPlanQuery): AxiosPromise<ShipmentPlanOrderVO[]> => {
return request({
url: '/amz/shipmentPlan/list/order',
method: 'get',
@ -81,6 +81,14 @@ export const updateShipmentPlan = (data: ShipmentPlanForm) => {
});
};
export const linkShipmentPlan = (data: ShipmentPlanForm) => {
return request({
url: '/amz/shipmentPlan/link',
method: 'put',
data: data
});
};
export const updateShipmentPlanList = (data: string[]) => {
return request({
url: '/amz/shipmentPlan/update/list/send',

View File

@ -131,7 +131,11 @@ export interface ShipmentPlanVO {
/**
* -KG
*/
vendorWeight: number;
vendorWeight?: number;
logisticsWeight?: number;
weightDiff?: number;
/**
*
@ -147,6 +151,29 @@ export interface ShipmentPlanVO {
*
*/
channelName: string;
/**
* id
*/
sendOrderId?: string | number;
}
interface Address {
name: string | null;
countryCode: string;
stateOrProvinceCode: string | null;
city: string;
region: string;
addressLine1: string;
addressLine2: string | null;
postalCode: string;
phone: string | null;
doorplate: string;
}
export interface DescriptItem {
label: string;
prop: keyof Address; // 确保属性存在于 Address 接口
}
export interface ShipmentPlanOrderVO {
@ -482,6 +509,8 @@ export interface ShipmentPlanQuery extends PageQuery {
*/
destination?: string;
sellerName?: string;
/**
*
*/

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { StatusHistoryVO, StatusHistoryForm, StatusHistoryQuery } from '@/api/amz/statusHistory/types';
/**
*
* @param query
* @returns {*}
*/
export const listStatusHistory = (query?: StatusHistoryQuery): AxiosPromise<StatusHistoryVO[]> => {
return request({
url: '/amz/statusHistory/list',
method: 'get',
params: query
});
};
/**
*
* @param historyId
*/
export const getStatusHistory = (historyId: string | number): AxiosPromise<StatusHistoryVO> => {
return request({
url: '/amz/statusHistory/' + historyId,
method: 'get'
});
};
/**
*
* @param data
*/
export const addStatusHistory = (data: StatusHistoryForm) => {
return request({
url: '/amz/statusHistory',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateStatusHistory = (data: StatusHistoryForm) => {
return request({
url: '/amz/statusHistory',
method: 'put',
data: data
});
};
/**
*
* @param historyId
*/
export const delStatusHistory = (historyId: string | number | Array<string | number>) => {
return request({
url: '/amz/statusHistory/' + historyId,
method: 'delete'
});
};

View File

@ -0,0 +1,115 @@
export interface StatusHistoryVO {
/**
* $column.columnComment
*/
historyId: string | number;
/**
* $column.columnComment
*/
tableName: string;
/**
* $column.columnComment
*/
recordId: string | number;
/**
* $column.columnComment
*/
statusColumn: string;
/**
* $column.columnComment
*/
oldStatus: string;
/**
* $column.columnComment
*/
newStatus: string;
/**
* $column.columnComment
*/
originalChangedAt: string;
}
export interface StatusHistoryForm extends BaseEntity {
/**
* $column.columnComment
*/
historyId?: string | number;
/**
* $column.columnComment
*/
tableName?: string;
/**
* $column.columnComment
*/
recordId?: string | number;
/**
* $column.columnComment
*/
statusColumn?: string;
/**
* $column.columnComment
*/
oldStatus?: string;
/**
* $column.columnComment
*/
newStatus?: string;
/**
* $column.columnComment
*/
originalChangedAt?: string;
}
export interface StatusHistoryQuery extends PageQuery {
/**
* $column.columnComment
*/
historyId?: string | number;
/**
* $column.columnComment
*/
tableName?: string;
/**
* $column.columnComment
*/
recordId?: string | number;
/**
* $column.columnComment
*/
statusColumn?: string;
/**
* $column.columnComment
*/
oldStatus?: string;
/**
* $column.columnComment
*/
newStatus?: string;
/**
* $column.columnComment
*/
originalChangedAt?: string;
/**
*
*/
params?: any;
}

View File

@ -34,6 +34,7 @@ export interface UserVO extends BaseEntity {
email: string;
phonenumber: string;
sex: string;
address: string;
avatar: string;
status: string;
delFlag: string;

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,40 @@
<template>
<span ref="countRef"></span>
</template>
<script setup lang="ts">
import { onMounted, ref, watch } from 'vue';
import { CountUp } from 'countup.js';
const props = defineProps({
end: {
type: Number,
required: true
},
options: {
type: Object,
default: () => ({}),
required: false
}
});
const countRef = ref<any>(null);
let countUp: any;
onMounted(() => {
countUp = new CountUp(countRef.value, props.end, props.options);
if (countUp.error) {
console.error(countUp.error);
return;
}
countUp.start();
});
watch(
() => props.end,
(newVal) => {
if (countUp) {
countUp.update(newVal);
}
}
);
</script>

View File

@ -1,17 +1,17 @@
<template>
<section class="app-main">
<el-watermark :font="font" :content="userNick">
<router-view v-slot="{ Component, route }">
<transition v-if="!route.meta.noCache" :enter-active-class="animante" mode="out-in">
<keep-alive v-if="!route.meta.noCache" :include="tagsViewStore.cachedViews">
<component :is="Component" v-if="!route.meta.link" :key="route.path" />
</keep-alive>
</transition>
<transition v-if="route.meta.noCache" :enter-active-class="animante" mode="out-in">
<component :is="Component" v-if="!route.meta.link && route.meta.noCache" :key="route.path" />
</transition>
</router-view>
</el-watermark>
<!-- <el-watermark :font="font" :content="userNick">-->
<router-view v-slot="{ Component, route }">
<transition v-if="!route.meta.noCache" :enter-active-class="animante" mode="out-in">
<keep-alive v-if="!route.meta.noCache" :include="tagsViewStore.cachedViews">
<component :is="Component" v-if="!route.meta.link" :key="route.path" />
</keep-alive>
</transition>
<transition v-if="route.meta.noCache" :enter-active-class="animante" mode="out-in">
<component :is="Component" v-if="!route.meta.link && route.meta.noCache" :key="route.path" />
</transition>
</router-view>
<!-- </el-watermark>-->
<iframe-toggle />
</section>
</template>
@ -29,24 +29,14 @@ const tagsViewStore = useTagsViewStore();
const userStore = useUserStore();
const font = reactive({
fontSize: 22,
color: 'rgba(0, 0, 0, .06)'
});
const currentUser = userStore.currentUser;
const userNick = computed(() => {
// if (roles.includes('superadmin')) {
// return '';
// } else if (roles.includes('wuliu')) {
// return '';
// } else if (roles.includes('yunying')) {
// return '';
// } else if (roles.includes('manager')) {
// return '';
// } else {
// return '';
// }
return currentUser.userName;
return currentUser.nickName;
});
//
const animante = ref<string>('');

View File

@ -77,9 +77,9 @@
<router-link v-if="!dynamic" to="/user/profile">
<el-dropdown-item>{{ proxy.$t('navbar.personalCenter') }}</el-dropdown-item>
</router-link>
<el-dropdown-item v-if="settingsStore.showSettings" command="setLayout">
<span>{{ proxy.$t('navbar.layoutSetting') }}</span>
</el-dropdown-item>
<!-- <el-dropdown-item v-if="settingsStore.showSettings" command="setLayout">-->
<!-- <span>{{ proxy.$t('navbar.layoutSetting') }}</span>-->
<!-- </el-dropdown-item>-->
<el-dropdown-item divided command="logout">
<span>{{ proxy.$t('navbar.logout') }}</span>
</el-dropdown-item>

View File

@ -7,15 +7,15 @@
<transition :enter-active-class="proxy?.animate.logoAnimate.enter" mode="out-in">
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo" />
<h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">
<h3 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">
{{ title }}
</h1>
</h3>
</router-link>
<router-link v-else key="expand" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo" />
<h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">
<h3 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">
{{ title }}
</h1>
</h3>
</router-link>
</transition>
</div>
@ -34,7 +34,7 @@ defineProps({
}
});
const title = ref('瑷胜科技管理系统');
const title = ref('SMT订单物流管理系统');
const settingsStore = useSettingsStore();
const sideTheme = computed(() => settingsStore.sideTheme);
</script>

View File

@ -1,24 +1,26 @@
<template>
<div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }">
<div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
<side-bar v-if="!sidebar.hide" class="sidebar-container" />
<div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container">
<!-- <el-scrollbar>
<el-watermark :font="font" :content="userNick">
<div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }">
<div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
<side-bar v-if="!sidebar.hide" class="sidebar-container" />
<div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container">
<!-- <el-scrollbar>
<div :class="{ 'fixed-header': fixedHeader }">
<navbar ref="navbarRef" @setLayout="setLayout" />
<tags-view v-if="needTagsView" />
</div>
<app-main />
<settings ref="settingRef" />
</el-scrollbar> -->
<div :class="{ 'fixed-header': fixedHeader }">
<navbar ref="navbarRef" @setLayout="setLayout" />
<navbar ref="navbarRef" @set-layout="setLayout" />
<tags-view v-if="needTagsView" />
</div>
<app-main />
<settings ref="settingRef" />
</el-scrollbar> -->
<div :class="{ 'fixed-header': fixedHeader }">
<navbar ref="navbarRef" @set-layout="setLayout" />
<tags-view v-if="needTagsView" />
</div>
<app-main />
<settings ref="settingRef" />
</div>
</div>
</el-watermark>
</template>
<script setup lang="ts">
@ -28,6 +30,7 @@ import useAppStore from '@/store/modules/app';
import useSettingsStore from '@/store/modules/settings';
import { initWebSocket } from '@/utils/websocket';
import { initSSE } from '@/utils/sse';
import useUserStore from '@/store/modules/user';
const settingsStore = useSettingsStore();
const theme = computed(() => settingsStore.theme);
@ -43,6 +46,19 @@ const classObj = computed(() => ({
mobile: device.value === 'mobile'
}));
const userStore = useUserStore();
const font = reactive({
fontSize: 20,
color: 'rgba(0, 0, 0, .06)'
});
const currentUser = userStore.currentUser;
const userNick = computed(() => {
return currentUser.nickName;
});
const { width } = useWindowSize();
const WIDTH = 992; // refer to Bootstrap's responsive design

View File

@ -26,13 +26,11 @@ import 'virtual:svg-icons-register';
import ElementIcons from '@/plugins/svgicon';
// permission control
import './permission';
import './userGetInfoBz';
// 国际化
import i18n from '@/lang/index';
// vxeTable
import VXETable from 'vxe-table';
import 'vxe-table/lib/style.css';

View File

@ -10,6 +10,7 @@ import ParentView from '@/components/ParentView/index.vue';
import InnerLink from '@/layout/components/InnerLink/index.vue';
import { createCustomNameComponent } from '@/utils/createCustomNameComponent';
import useUserStore from '@/store/modules/user';
// 匹配views里面所有的.vue文件
const modules = import.meta.glob('./../../views/**/*.vue');
@ -76,6 +77,15 @@ export const usePermissionStore = defineStore('permission', () => {
if (type && route.children) {
route.children = filterChildren(route.children, undefined);
}
if (route.path === '/demand') {
route.children.forEach((child) => {
if (child.path === 'purchaseOrderConfirm') {
if (useUserStore().roles.includes('gengdan')) {
child.meta.title = '创建半成品转发';
}
}
});
}
// Layout ParentView 组件特殊处理
if (route.component?.toString() === 'Layout') {
route.component = Layout;

View File

@ -82,6 +82,7 @@ declare global {
queryParams: D;
rules: ElFormRules;
rules2?: ElFormRules;
rules3?: ElFormRules;
}
/**

View File

@ -10,11 +10,11 @@ import useSettingsStore from '@/store/modules/settings';
import usePermissionStore from '@/store/modules/permission';
NProgress.configure({ showSpinner: false });
const whiteList = ['/login', '/register', '/social-callback', '/register*', '/register/*'];
const bZSettiong = ['/login', '/register', '/social-callback', '/register*', '/register/*'];
const isWhiteList = (path: string) => {
return whiteList.some(pattern => isPathMatch(pattern, path))
}
const isbZSettiong = (path: string) => {
return bZSettiong.some((pattern) => isPathMatch(pattern, path));
};
router.beforeEach(async (to, from, next) => {
NProgress.start();
@ -24,12 +24,11 @@ router.beforeEach(async (to, from, next) => {
if (to.path === '/login') {
next({ path: '/' });
NProgress.done();
} else if (isWhiteList(to.path)) {
} else if (isbZSettiong(to.path)) {
next();
} else {
if (useUserStore().roles.length === 0) {
isRelogin.show = true;
// 判断当前用户是否已拉取完user_info信息
const [err] = await tos(useUserStore().getInfo());
if (err) {
await useUserStore().logout();
@ -38,27 +37,31 @@ router.beforeEach(async (to, from, next) => {
} else {
isRelogin.show = false;
const accessRoutes = await usePermissionStore().generateRoutes();
// 根据roles权限生成可访问的路由表
accessRoutes.forEach((route) => {
if (!isHttp(route.path)) {
router.addRoute(route); // 动态添加可访问路由表
router.addRoute(route);
}
});
// @ts-expect-error hack方法 确保addRoutes已完成
next({ path: to.path, replace: true, params: to.params, query: to.query, hash: to.hash, name: to.name as string }); // hack方法 确保addRoutes已完成
next({
path: to.path,
replace: true,
params: to.params,
query: to.query,
hash: to.hash,
name: to.name as string
});
}
} else {
next();
}
}
} else {
// 没有token
if (isWhiteList(to.path)) {
// 在免登录白名单,直接进入
if (isbZSettiong(to.path)) {
next();
} else {
const redirect = encodeURIComponent(to.fullPath || '/');
next(`/login?redirect=${redirect}`); // 否则全部重定向到登录页
next(`/login?redirect=${redirect}`);
NProgress.done();
}
}

View File

@ -246,6 +246,13 @@ export const blobValidate = (data: any) => {
return data.type !== 'application/json';
};
export const formatText = (text) => {
if (text === null) {
return '';
}
return text.replace(/\n/g, '<br>');
};
export default {
handleTree
};

View File

@ -1,4 +1,4 @@
// src/utils/permission.ts
// src/utils/userGetInfoBz.ts
import { useUserStore } from '@/store/modules/user';
// 权限校验方法(替代指令的核心逻辑)

View File

@ -4,39 +4,39 @@
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="150px">
<el-form-item label="用户ID" prop="userId">
<el-input v-model="queryParams.userId" placeholder="请输入所属用户ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="领星ID" prop="sid">
<el-input v-model="queryParams.sid" placeholder="请输入领星ERP店铺标识ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="站点ID" prop="mid">
<el-input v-model="queryParams.mid" placeholder="请输入站点ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="用户ID" prop="userId">-->
<!-- <el-input v-model="queryParams.userId" placeholder="请输入所属用户ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="领星ID" prop="sid">-->
<!-- <el-input v-model="queryParams.sid" placeholder="请输入领星ERP店铺标识ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="站点ID" prop="mid">-->
<!-- <el-input v-model="queryParams.mid" placeholder="请输入站点ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="店铺名称" prop="storeName">
<el-input v-model="queryParams.storeName" placeholder="请输入店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="亚马逊店铺ID" prop="sellerId">
<el-input v-model="queryParams.sellerId" placeholder="请输入亚马逊店铺ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="店铺账户" prop="accountName">
<el-input v-model="queryParams.accountName" placeholder="请输入店铺账户名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="店铺ID" prop="sellerAccountId">
<el-input v-model="queryParams.sellerAccountId" placeholder="请输入店铺账号ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="站点简称" prop="region">
<el-input v-model="queryParams.region" placeholder="请输入站点简称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="商城国家" prop="country">
<el-input v-model="queryParams.country" placeholder="请输入商城所在国家" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="市场ID" prop="marketplaceId">
<el-input v-model="queryParams.marketplaceId" placeholder="请输入亚马逊市场ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="广告授权" prop="hasAdsSetting">
<el-input v-model="queryParams.hasAdsSetting" placeholder="请输入广告授权 0未授权 1已授权" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="亚马逊店铺ID" prop="sellerId">-->
<!-- <el-input v-model="queryParams.sellerId" placeholder="请输入亚马逊店铺ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="店铺账户" prop="accountName">-->
<!-- <el-input v-model="queryParams.accountName" placeholder="请输入店铺账户名称" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="店铺ID" prop="sellerAccountId">-->
<!-- <el-input v-model="queryParams.sellerAccountId" placeholder="请输入店铺账号ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="站点简称" prop="region">-->
<!-- <el-input v-model="queryParams.region" placeholder="请输入站点简称" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="商城国家" prop="country">-->
<!-- <el-input v-model="queryParams.country" placeholder="请输入商城所在国家" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="市场ID" prop="marketplaceId">-->
<!-- <el-input v-model="queryParams.marketplaceId" placeholder="请输入亚马逊市场ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="广告授权" prop="hasAdsSetting">-->
<!-- <el-input v-model="queryParams.hasAdsSetting" placeholder="请输入广告授权 0未授权 1已授权" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>

View File

@ -248,7 +248,7 @@
</el-row>
<el-form-item label="时效" prop="leadTime">
<div class="kgprice">
<el-input-number v-model="minDay" :min="1" :max="100">
<el-input-number v-model="quoteForm.minLeadTime" :min="1" :max="100">
<template #suffix>
<span></span>
</template>
@ -362,29 +362,9 @@ const initFormData: InquiryRequestForm = {
effectiveStartTime: undefined,
effectiveEndTime: undefined
};
const initQuoteForm: LogisticsMostQuoteForm = {
id: undefined,
userId: undefined,
destination: undefined,
transportChannel: undefined,
price: 10,
leadTime: 10,
surcharge: 0,
channelName: undefined,
quoteStartDate: undefined,
quoteEndDate: undefined,
quoteDate: [] as Date[],
isSubmitted: undefined,
remark: undefined,
channelType: undefined,
channelId: undefined,
isDdp: 'Y',
unit: 'kg',
backLogisticsType: '快递'
};
const data = reactive<PageData<InquiryRequestForm, InquiryRequestQuery>>({
form: { ...initFormData },
quoteForm: { ...initQuoteForm },
queryParams: {
pageNum: 1,
pageSize: 10,
@ -424,7 +404,7 @@ const data = reactive<PageData<InquiryRequestForm, InquiryRequestQuery>>({
}
});
const { queryParams, form, rules, quoteForm } = toRefs(data);
const { queryParams, form, rules } = toRefs(data);
const options = ref([
{
@ -437,6 +417,28 @@ const options = ref([
}
]);
const quoteForm = ref<LogisticsQuoteForm>({
id: undefined,
userId: undefined,
destination: undefined,
transportChannel: undefined,
price: 10,
minLeadTime: 10,
leadTime: 10,
surcharge: 0,
channelName: undefined,
quoteStartDate: undefined,
quoteEndDate: undefined,
quoteDate: [] as Date[],
isSubmitted: undefined,
remark: undefined,
channelType: undefined,
channelId: undefined,
isDdp: 'Y',
unit: 'kg',
backLogisticsType: '快递'
});
const handleChannelChange = ({ value, node }) => {
console.log('选中渠道ID:', value);
console.log('完整渠道信息:', node);
@ -541,18 +543,18 @@ const submitForm = () => {
});
};
const submitQuoteForm = async () => {
data.quoteForm.quoteStartDate = data.quoteForm.quoteDate[0];
data.quoteForm.quoteEndDate = data.quoteForm.quoteDate[1];
data.quoteForm.isSubmitted = 'Y';
console.log('submitQuoteForm', data.quoteForm);
const res = await checkPriceQuoteByBo(data.quoteForm);
quoteForm.value.quoteStartDate = quoteForm.value.quoteDate[0];
quoteForm.value.quoteEndDate = quoteForm.value.quoteDate[1];
quoteForm.value.isSubmitted = 'Y';
console.log('submitQuoteForm', quoteForm.value);
const res = await checkPriceQuoteByBo(quoteForm.value);
console.log('submitQuoteForm', res);
if (res.code === 200) {
// ElMessage.success('');
// quoteDialog.visible = false;
if (res.data === true) {
const res = await addMostLogisticsQuote(data.quoteForm);
const res = await addMostLogisticsQuote(quoteForm.value);
if (res.code === 200) {
ElMessage.success('提交成功');
quoteDialog.visible = false;
@ -564,7 +566,7 @@ const submitQuoteForm = async () => {
type: 'warning'
})
.then(async () => {
const res = await addMostLogisticsQuote(data.quoteForm);
const res = await addMostLogisticsQuote(quoteForm.value);
if (res.code === 200) {
ElMessage.success('提交成功');
quoteDialog.visible = false;
@ -597,11 +599,11 @@ const handleDelete = async (row?: InquiryRequestVO) => {
const handleSubmit = async (row?: InquiryRequestVO) => {
console.log('handleSubmit');
console.log(row.channelId);
data.quoteForm.id = row.id;
data.quoteForm.destination = row.destination;
data.quoteForm.transportChannel = row.transportChannel;
data.quoteForm.channelId = row.channelId;
data.quoteForm.channelName = row.channelName;
quoteForm.value.id = row.id;
quoteForm.value.destination = row.destination;
quoteForm.value.transportChannel = row.transportChannel;
quoteForm.value.channelId = row.channelId;
quoteForm.value.channelName = row.channelName;
quoteDialog.visible = true;
console.log(row.effectiveStartTime);
// quoteForm.quoteDate[0] = row.effectiveStartTime;
@ -610,8 +612,8 @@ const handleSubmit = async (row?: InquiryRequestVO) => {
const dateString2 = row.effectiveEndTime.replace(' ', 'T');
const date = new Date(dateString); // Date
const date2 = new Date(dateString2); // Date
data.quoteForm.quoteDate[0] = date;
data.quoteForm.quoteDate[1] = date2;
quoteForm.value.quoteDate[0] = date;
quoteForm.value.quoteDate[1] = date2;
};
/** 导出按钮操作 */

View File

@ -62,6 +62,11 @@
<el-table-column label="目的地仓库名称或编码" align="center" prop="destination" />
<el-table-column label="总箱子数量" align="center" prop="boxQuantity" />
<el-table-column label="总货件数量" align="center" prop="shipmentQuantity" />
<el-table-column label="订单状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="logic_order_status" :value="scope.row.status" />
</template>
</el-table-column>
<!-- <el-table-column label="亚马逊仓库实际上架日期" align="center" prop="amazonShelfDate" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.amazonShelfDate, '{y}-{m}-{d}') }}</span>-->
@ -90,7 +95,14 @@
v-hasPermi="['amz:logisticsOrder:remove']"
></el-button>
</el-tooltip>
<el-button link size="small" type="primary" @click="openDetail(scope.row)" v-hasRoles="['wuliu']"> 编辑订单明细 </el-button>
<el-popconfirm title="是否确认收货?" @confirm="handleConfirm(scope.row)">
<template #reference>
<el-button v-if="scope.row.status === 'unshipped'" link size="small" type="primary" v-hasRoles="['wuliu']"> 确认收货 </el-button>
</template>
</el-popconfirm>
<el-button v-if="scope.row.status === 'received'" link size="small" type="primary" @click="openDetail(scope.row)" v-hasRoles="['wuliu']">
编辑明细
</el-button>
</template>
</el-table-column>
</el-table>
@ -202,11 +214,13 @@ import { checkPermi } from '@/utils/permission';
import { LogisticsOrderDetailVO } from '@/api/amz/logisticsOrderDetail/types';
import { listLogisticsOrderDetail, updateList } from '@/api/amz/logisticsOrderDetail';
import 'handsontable/dist/handsontable.full.min.css';
import { InfoFilled } from '@element-plus/icons-vue';
// import 'handsontable/styles/ht-theme-horizon.css';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { biz_logistics_status } = toRefs<any>(proxy?.useDict('biz_logistics_status'));
const { logic_order_status } = toRefs<any>(proxy?.useDict('logic_order_status'));
//
registerAllModules();
@ -315,6 +329,13 @@ const hotSettings = ref({
if (prop === 'logisticsStatus') {
logisticsOrderDetailList.value[row].logisticsStatus = labelTovalueMap.value[newVal];
}
if (prop === 'logisticsWeight' || prop === 'pricePerKg' || prop === 'otherFee') {
console.log('计算总价');
logisticsOrderDetailList.value[row].totalFee =
(logisticsOrderDetailList.value[row].logisticsWeight ?? 0) * (logisticsOrderDetailList.value[row].pricePerKg ?? 0) +
(logisticsOrderDetailList.value[row].otherFee ?? 0);
}
});
console.log('logisticsOrderDetailList.value:', logisticsOrderDetailList.value);
},
@ -324,15 +345,15 @@ const hotSettings = ref({
'FBA货件编号',
'FBA箱号',
// '',
'物流渠道',
'目的地仓库',
// '',
// '',
'数量',
// '',
'物流追踪号',
'物流商计重',
// '',
'物流单价',
'物流计价重量',
// '',
'其他物流费用',
'费用合计',
'物流状态',
@ -353,8 +374,8 @@ const hotSettings = ref({
{ data: 'fbaShipmentId', className: 'htCenter', readOnly: true },
{ data: 'fbaBoxNumber', className: 'htCenter', readOnly: true }, // FBA
// { data: 'logisticsProviderName', className: 'htCenter', readOnly: true }, //
{ data: 'logisticsChannel', className: 'htCenter', readOnly: true }, //
{ data: 'destinationWarehouse', className: 'htCenter', readOnly: true }, //
// { data: 'logisticsChannel', className: 'htCenter', readOnly: true }, //
// { data: 'destinationWarehouse', className: 'htCenter', readOnly: true }, //
{ data: 'plannedQuantity', className: 'htCenter', readOnly: true }, //
// { data: 'shipmentQuantity', className: 'htCenter', readOnly: false, type: 'numeric' }, //
{ data: 'trackingNumber', className: 'htCenter', readOnly: false }, //
@ -403,9 +424,9 @@ const hotSettings = ref({
return td;
}
}, //
{ data: 'logisticsBillingWeight', className: 'htCenter', type: 'numeric', readOnly: true }, //
// { data: 'logisticsBillingWeight', className: 'htCenter', type: 'numeric', readOnly: true }, //
{
data: 'otherLogisticsFee',
data: 'otherFee',
className: 'htCenter',
type: 'numeric',
readOnly: false,
@ -717,6 +738,21 @@ const submitForm = () => {
});
};
const handleConfirm = async (row?: LogisticsOrderVO) => {
console.log('row:', row);
const updateData = {
id: row?.id,
status: 'received'
};
buttonLoading.value = true;
if (updateData.id) {
await updateLogisticsOrder(updateData).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
// dialog.visible = false;
await getList();
};
/** 删除按钮操作 */
const handleDelete = async (row?: LogisticsOrderVO) => {
const _ids = row?.id || ids.value;

View File

@ -349,8 +349,8 @@ const hotSettings = ref({
'FBA箱号',
'物流商ID',
'物流商名称',
'物流渠道',
'目的地仓库',
// '',
// '',
'计划数量',
'实际货件数量',
'物流追踪号',
@ -380,8 +380,8 @@ const hotSettings = ref({
{ data: 'fbaBoxNumber', className: 'htCenter', readOnly: true }, // FBA
{ data: 'logisticsProviderId', className: 'htCenter', readOnly: true }, // ID
{ data: 'logisticsProviderName', className: 'htCenter', readOnly: true }, //
{ data: 'logisticsChannel', className: 'htCenter', readOnly: true }, //
{ data: 'destinationWarehouse', className: 'htCenter', readOnly: true }, //
// { data: 'logisticsChannel', className: 'htCenter', readOnly: true }, //
// { data: 'destinationWarehouse', className: 'htCenter', readOnly: true }, //
{ data: 'plannedQuantity', className: 'htCenter', readOnly: true }, //
{ data: 'actualShipmentQuantity', className: 'htCenter', readOnly: true }, //
{ data: 'trackingNumber', className: 'htCenter', readOnly: false }, //

View File

@ -107,10 +107,11 @@
<!-- v-hasPermi="['amz:logisticsOrderQuotation:remove']"-->
<!-- ></el-button>-->
<!-- </el-tooltip>-->
<el-button v-if="scope.row.confirm == '0'" link type="primary" size="small" @click="handleQuotation(scope.row)" v-hasRoles="['wuliu']">
确认订单
</el-button>
<el-popconfirm title="是否确认订单?" @confirm="handleQuotation(scope.row)">
<template #reference>
<el-button v-if="scope.row.confirm == '0'" link type="primary" size="small" v-hasRoles="['wuliu']"> 确认订单 </el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>

View File

@ -22,9 +22,9 @@
<el-form-item label="报价生效日期" prop="quoteDate">
<el-date-picker clearable v-model="queryParams.quoteDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择报价生效日期" />
</el-form-item>
<el-form-item label="单位" prop="unit">
<el-input v-model="queryParams.unit" placeholder="请输入单位" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="单位" prop="unit">-->
<!-- <el-input v-model="queryParams.unit" placeholder="请输入单位" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
@ -182,9 +182,9 @@
<el-form-item label="报价备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入报价备注" />
</el-form-item>
<el-form-item label="单位" prop="unit">
<el-input v-model="form.unit" placeholder="请输入单位" />
</el-form-item>
<!-- <el-form-item label="单位" prop="unit">-->
<!-- <el-input v-model="form.unit" placeholder="请输入单位" />-->
<!-- </el-form-item>-->
</el-form>
<template #footer>
<div class="dialog-footer">

View File

@ -122,9 +122,9 @@
<el-form-item label="报价备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入报价备注" />
</el-form-item>
<el-form-item label="单位" prop="unit">
<el-input v-model="form.unit" placeholder="请输入单位" />
</el-form-item>
<!-- <el-form-item label="单位" prop="unit">-->
<!-- <el-input v-model="form.unit" placeholder="请输入单位" />-->
<!-- </el-form-item>-->
</el-form>
<template #footer>
<div class="dialog-footer">

View File

@ -4,161 +4,18 @@
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<!-- <el-form-item label="采购单号" prop="orderSn">-->
<!-- <el-input v-model="queryParams.orderSn" placeholder="请输入采购单号" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="自定义单号" prop="customOrderSn">-->
<!-- <el-input v-model="queryParams.customOrderSn" placeholder="请输入自定义单号" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="供应商ID" prop="supplierId">-->
<!-- <el-input v-model="queryParams.supplierId" placeholder="请输入供应商ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="供应商名称" prop="supplierName">-->
<!-- <el-input v-model="queryParams.supplierName" placeholder="请输入供应商名称" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购员ID" prop="optUid">-->
<!-- <el-input v-model="queryParams.optUid" placeholder="请输入采购员ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="审核人姓名" prop="auditorRealname">-->
<!-- <el-input v-model="queryParams.auditorRealname" placeholder="请输入审核人姓名" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="操作人姓名" prop="optRealname">-->
<!-- <el-input v-model="queryParams.optRealname" placeholder="请输入操作人姓名" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="最后操作人姓名" prop="lastRealname">-->
<!-- <el-input v-model="queryParams.lastRealname" placeholder="请输入最后操作人姓名" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="下单时间" prop="orderTime">-->
<!-- <el-date-picker clearable-->
<!-- v-model="queryParams.orderTime"-->
<!-- type="date"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- placeholder="请选择下单时间"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="应付货款" prop="payment">-->
<!-- <el-input v-model="queryParams.payment" placeholder="请输入应付货款" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="审核人员ID" prop="auditorUid">-->
<!-- <el-input v-model="queryParams.auditorUid" placeholder="请输入审核人员ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="审核时间" prop="auditorTime">-->
<!-- <el-date-picker clearable-->
<!-- v-model="queryParams.auditorTime"-->
<!-- type="date"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- placeholder="请选择审核时间"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="最后操作人员ID" prop="lastUid">-->
<!-- <el-input v-model="queryParams.lastUid" placeholder="请输入最后操作人员ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="最后操作时间" prop="lastTime">-->
<!-- <el-date-picker clearable-->
<!-- v-model="queryParams.lastTime"-->
<!-- type="date"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- placeholder="请选择最后操作时间"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="作废原因" prop="reason">-->
<!-- <el-input v-model="queryParams.reason" placeholder="请输入作废原因" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="是否含税0 否1 是" prop="isTax">-->
<!-- <el-input v-model="queryParams.isTax" placeholder="请输入是否含税0 否1 是" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="状态说明" prop="statusText">-->
<!-- <el-input v-model="queryParams.statusText" placeholder="请输入状态说明" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="支付状态说明" prop="payStatusText">-->
<!-- <el-input v-model="queryParams.payStatusText" placeholder="请输入支付状态说明" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="到货状态1 未到货, 2 部分到货, 3 全部到货" prop="statusShipped">-->
<!-- <el-input v-model="queryParams.statusShipped" placeholder="请输入到货状态1 未到货, 2 部分到货, 3 全部到货" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="到货状态说明" prop="statusShippedText">-->
<!-- <el-input v-model="queryParams.statusShippedText" placeholder="请输入到货状态说明" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="货物总价" prop="amountTotal">-->
<!-- <el-input v-model="queryParams.amountTotal" placeholder="请输入货物总价" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="总金额" prop="totalPrice">-->
<!-- <el-input v-model="queryParams.totalPrice" placeholder="请输入总金额" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="币种符号" prop="icon">-->
<!-- <el-input v-model="queryParams.icon" placeholder="请输入币种符号" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="其他费用" prop="otherFee">-->
<!-- <el-input v-model="queryParams.otherFee" placeholder="请输入其他费用" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="其他费用币种" prop="otherCurrency">-->
<!-- <el-input v-model="queryParams.otherCurrency" placeholder="请输入其他费用币种" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="运费" prop="shippingPrice">-->
<!-- <el-input v-model="queryParams.shippingPrice" placeholder="请输入运费" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="运费币种" prop="shippingCurrency">-->
<!-- <el-input v-model="queryParams.shippingCurrency" placeholder="请输入运费币种" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购币种" prop="purchaseCurrency">-->
<!-- <el-input v-model="queryParams.purchaseCurrency" placeholder="请输入采购币种" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购汇率" prop="purchaseRate">-->
<!-- <el-input v-model="queryParams.purchaseRate" placeholder="请输入采购汇率" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购总量" prop="quantityTotal">-->
<!-- <el-input v-model="queryParams.quantityTotal" placeholder="请输入采购总量" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="仓库ID" prop="wid">-->
<!-- <el-input v-model="queryParams.wid" placeholder="请输入仓库ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="仓库名称" prop="wareHouseName">-->
<!-- <el-input v-model="queryParams.wareHouseName" placeholder="请输入仓库名称" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="仓库名(备份)" prop="wareHouseBakName">-->
<!-- <el-input v-model="queryParams.wareHouseBakName" placeholder="请输入仓库名(备份)" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="入库量" prop="quantityEntry">-->
<!-- <el-input v-model="queryParams.quantityEntry" placeholder="请输入入库量" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="实际采购量" prop="quantityReal">-->
<!-- <el-input v-model="queryParams.quantityReal" placeholder="请输入实际采购量" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="待到货量" prop="quantityReceive">-->
<!-- <el-input v-model="queryParams.quantityReceive" placeholder="请输入待到货量" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购方ID" prop="purchaserId">-->
<!-- <el-input v-model="queryParams.purchaserId" placeholder="请输入采购方ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="联系人" prop="contactPerson">-->
<!-- <el-input v-model="queryParams.contactPerson" placeholder="请输入联系人" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="联系方式" prop="contactNumber">-->
<!-- <el-input v-model="queryParams.contactNumber" placeholder="请输入联系方式" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="结算方式7 现结, 8 月结" prop="settlementMethod">-->
<!-- <el-input v-model="queryParams.settlementMethod" placeholder="请输入结算方式7 现结, 8 月结" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="结算描述" prop="settlementDescription">-->
<!-- <el-input v-model="queryParams.settlementDescription" placeholder="请输入结算描述" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="支付方式" prop="paymentMethod">-->
<!-- <el-input v-model="queryParams.paymentMethod" placeholder="请输入支付方式" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="交货天数" prop="estDlvDays">
<el-input v-model="queryParams.estDlvDays" placeholder="请输入交货天数" clearable @keyup.enter="handleQuery" />
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="queryParams.orderSn" placeholder="请输入采购单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="店铺名称" prop="customOrderSn">
<el-input v-model="queryParams.storeName" placeholder="请输入店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="订单状态" prop="orderStatus">-->
<!-- <el-select v-model="queryParams.orderStatus" placeholder="请选择订单状态" clearable>-->
<!-- <el-option v-for="dict in vendor_order_status" :key="dict.value" :label="dict.label" :value="dict.value" />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item label="交货时间" prop="deliveryTime">
<el-date-picker clearable v-model="queryParams.deliveryTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择交货时间" />
</el-form-item>
<el-form-item label="订单交付变动天数" prop="dlvTimeVar">
<el-input v-model="queryParams.dlvTimeVar" placeholder="请输入订单交付变动天数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
@ -171,22 +28,22 @@
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:purchaseOrder:add']">新增 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:purchaseOrder:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:purchaseOrder:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:purchaseOrder:export']">导出 </el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:purchaseOrder:add']">新增 </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:purchaseOrder:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:purchaseOrder:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:purchaseOrder:export']">导出 </el-button>-->
<!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
@ -212,7 +69,7 @@
<!-- <el-table-column label="FNSKU" align="center" prop="fnsku" width="90px" />-->
<!-- <el-table-column label="店铺ID" align="center" prop="sid" width="70px" />-->
<!-- <el-table-column label="型号" align="center" prop="model" />-->
<!-- <el-table-column label="含税单价" align="center" prop="price" />-->
<el-table-column label="含税单价" align="center" prop="price" />
<!-- <el-table-column label="价税合计" align="center" prop="amount" />-->
<!-- <el-table-column label="计划采购量" align="center" prop="quantityPlan" />-->
<el-table-column label="实际采购量" align="center" prop="quantityReal" width="110px" />
@ -248,6 +105,11 @@
<!-- <el-table-column label="审核人姓名" align="center" prop="auditorRealname" />-->
<!-- <el-table-column label="操作人姓名" align="center" prop="optRealname" />-->
<!-- <el-table-column label="最后操作人姓名" align="center" prop="lastRealname" />-->
<!-- <el-table-column label="创建时间" align="center" prop="createTime" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="下单时间" align="center" prop="orderTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.orderTime, '{y}-{m}-{d}') }}</span>
@ -268,13 +130,17 @@
<!-- </el-table-column>-->
<!-- <el-table-column label="作废原因" align="center" prop="reason" />-->
<!-- <el-table-column label="是否含税" align="center" prop="isTax" />-->
<!-- <el-table-column label="采购单状态" align="center" prop="status" />-->
<el-table-column v-hasRoles="['superadmin', 'gengdan']" label="采购单状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="purchase_order_status" :value="scope.row.status" />
</template>
</el-table-column>
<!-- <el-table-column label="状态说明" align="center" prop="statusText" />-->
<!-- <el-table-column label="支付状态说明" align="center" prop="payStatusText" />-->
<!-- <el-table-column label="到货状态" align="center" prop="statusShipped" />-->
<!-- <el-table-column label="到货状态说明" align="center" prop="statusShippedText" />-->
<!-- <el-table-column label="货物总价" align="center" prop="amountTotal" />-->
<!-- <el-table-column label="总金额" align="center" prop="totalPrice" />-->
<el-table-column label="总金额" align="center" prop="totalPrice" />
<!-- <el-table-column label="币种符号" align="center" prop="icon" />-->
<!-- <el-table-column label="付款状态" align="center" prop="payStatus" />-->
@ -290,7 +156,7 @@
<!-- <el-table-column label="仓库名称" align="center" prop="wareHouseName" />-->
<!-- <el-table-column label="仓库名(备份)" align="center" prop="wareHouseBakName" />-->
<!-- <el-table-column label="入库量" align="center" prop="quantityEntry" />-->
<el-table-column label="实际采购量" align="center" prop="quantityReal" />
<el-table-column label="采购量" align="center" prop="quantityReal" />
<!-- <el-table-column label="待到货量" align="center" prop="quantityReceive" />-->
<!-- <el-table-column label="采购方ID" align="center" prop="purchaserId" />-->
<!-- <el-table-column label="联系人" align="center" prop="contactPerson" />-->
@ -298,18 +164,18 @@
<!-- <el-table-column label="结算方式" align="center" prop="settlementMethod" />-->
<!-- <el-table-column label="结算描述" align="center" prop="settlementDescription" />-->
<!-- <el-table-column label="支付方式" align="center" prop="paymentMethod" />-->
<el-table-column label="交货天数" align="center" prop="estDlvDays" />
<!-- <el-table-column label="预计交货天数" align="center" prop="estDlvDays" />-->
<el-table-column label="订单状态" align="center" prop="orderStatus">
<template #default="scope">
<dict-tag :options="vendor_order_status" :value="scope.row.orderStatus" />
</template>
</el-table-column>
<el-table-column label="交货时间" align="center" prop="deliveryTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.deliveryTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="订单交付变动天数" align="center" prop="dlvTimeVar" />
<!-- <el-table-column label="预计交货时间" align="center" prop="deliveryTime" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.deliveryTime, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="订单交付变动天数" align="center" prop="dlvTimeVar" />-->
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
@ -317,7 +183,16 @@
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:purchaseOrder:edit']"></el-button>-->
<!-- </el-tooltip>-->
<el-button size="small" link type="primary" @click="handleConfirm(scope.row)" v-hasPermi="['amz:purchaseOrder:remove']"> 确认 </el-button>
<el-button
size="small"
link
type="primary"
@click="handleConfirm(scope.row)"
v-hasRoles="['gongying']"
v-hasPermi="['amz:purchaseOrder:remove']"
>
确认
</el-button>
</template>
</el-table-column>
</el-table>
@ -484,9 +359,9 @@
</template>
</el-input-number>
</el-form-item>
<el-form-item label="订单交付变动天数" prop="dlvTimeVar">
<el-input v-model="form.dlvTimeVar" placeholder="请输入订单交付变动天数" />
</el-form-item>
<!-- <el-form-item label="订单交付变动天数" prop="dlvTimeVar">-->
<!-- <el-input v-model="form.dlvTimeVar" placeholder="请输入订单交付变动天数" />-->
<!-- </el-form-item>-->
</el-form>
<template #footer>
<div class="dialog-footer">
@ -499,12 +374,21 @@
</template>
<script setup name="PurchaseOrder" lang="ts">
import { listPurchaseOrder, getPurchaseOrder, delPurchaseOrder, addPurchaseOrder, updatePurchaseOrder } from '@/api/amz/purchaseOrder';
import {
listPurchaseOrder,
getPurchaseOrder,
delPurchaseOrder,
addPurchaseOrder,
updatePurchaseOrder,
confirmPurchaseOrder
} from '@/api/amz/purchaseOrder';
import { PurchaseOrderVO, PurchaseOrderQuery, PurchaseOrderForm } from '@/api/amz/purchaseOrder/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { vendor_order_status } = toRefs<any>(proxy?.useDict('vendor_order_status'));
const { purchase_order_status } = toRefs<any>(proxy?.useDict('purchase_order_status'));
const purchaseOrderList = ref<PurchaseOrderVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
@ -625,9 +509,10 @@ const data = reactive<PageData<PurchaseOrderForm, PurchaseOrderQuery>>({
settlementDescription: undefined,
paymentMethod: undefined,
estDlvDays: undefined,
orderStatus: 'ord_unconfirmed',
orderStatus: ['ord_unconfirmed'],
deliveryTime: undefined,
dlvTimeVar: undefined,
storeName: undefined,
params: {}
},
rules: {
@ -701,7 +586,11 @@ const { queryParams, form, rules } = toRefs(data);
/** 查询采购单主列表 */
const getList = async () => {
loading.value = true;
const res = await listPurchaseOrder(queryParams.value);
const copyParams = JSON.parse(JSON.stringify(queryParams.value)); // [1,2](@ref)
if (Array.isArray(copyParams.orderStatus)) {
copyParams.orderStatus = copyParams.orderStatus.join(','); // [6,7](@ref)
}
const res = await listPurchaseOrder(copyParams);
purchaseOrderList.value = res.rows;
total.value = res.total;
loading.value = false;
@ -767,8 +656,8 @@ const handleAdd = () => {
/** 修改按钮操作 */
const handleUpdate = async (row?: PurchaseOrderVO) => {
reset();
const _orderSn = row?.orderSn || ids.value[0];
const res = await getPurchaseOrder(_orderSn);
const _id = row?.id || ids.value[0];
const res = await getPurchaseOrder(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改采购单主';
@ -783,8 +672,8 @@ const handleConfirm = async (row?: PurchaseOrderVO) => {
// dialog.title = '';
console.log('row', row);
reset();
const _orderSn = row?.orderSn || ids.value[0];
const res = await getPurchaseOrder(_orderSn);
const _id = row?.id || ids.value[0];
const res = await getPurchaseOrder(_id);
Object.assign(form.value, res.data);
form.value.orderStatus = 'ord_confirmed';
dialog.visible = true;
@ -798,7 +687,7 @@ const submitForm = () => {
if (valid) {
buttonLoading.value = true;
if (form.value.orderSn) {
await updatePurchaseOrder(form.value).finally(() => (buttonLoading.value = false));
await confirmPurchaseOrder(form.value).finally(() => (buttonLoading.value = false));
} else {
await addPurchaseOrder(form.value).finally(() => (buttonLoading.value = false));
}
@ -836,7 +725,7 @@ onMounted(() => {
<style scoped>
/* 展开行容器 */
:deep(.el-table__expanded-cell) {
background: #ebf3ff !important;
background: #f5fbfd !important;
padding: 0 !important;
border-bottom: none !important;
}
@ -844,7 +733,7 @@ onMounted(() => {
/* 内嵌表格容器 */
:deep(.el-table__expanded-cell) .el-table {
--el-table-bg-color: #ebf3ff !important;
--el-table-tr-bg-color: #ebf3ff !important;
--el-table-tr-bg-color: #f5fbfd !important;
--el-table-header-bg-color: #cfe2ff !important; /* 表头变量 */
--el-table-header-text-color: #2c3e50 !important; /* 新增文字颜色 */
}
@ -879,7 +768,7 @@ onMounted(() => {
/* 内嵌表格hover效果 */
:deep(.el-table__expanded-cell) .el-table__body tr:hover > td {
background-color: #d3e3ff !important;
background-color: #ffffff !important;
}
/* 表头hover状态 */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,551 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="关联采购单号" prop="orderSn">
<el-input v-model="queryParams.orderSn" placeholder="请输入关联采购单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="仓库ID" prop="wid">
<el-input v-model="queryParams.wid" placeholder="请输入仓库ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="仓库名称" prop="wareHouseName">
<el-input v-model="queryParams.wareHouseName" placeholder="请输入仓库名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="采购计划号" prop="planSn">
<el-input v-model="queryParams.planSn" placeholder="请输入采购计划号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="本地产品ID" prop="productId">
<el-input v-model="queryParams.productId" placeholder="请输入本地产品ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="品名" prop="productName">
<el-input v-model="queryParams.productName" placeholder="请输入品名" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="SKU" prop="sku">
<el-input v-model="queryParams.sku" placeholder="请输入SKU" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="FNSKU" prop="fnsku">
<el-input v-model="queryParams.fnsku" placeholder="请输入FNSKU" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="店铺ID" prop="sid">
<el-input v-model="queryParams.sid" placeholder="请输入店铺ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="型号" prop="model">
<el-input v-model="queryParams.model" placeholder="请输入型号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="含税单价" prop="price">
<el-input v-model="queryParams.price" placeholder="请输入含税单价" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="价税合计" prop="amount">
<el-input v-model="queryParams.amount" placeholder="请输入价税合计" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="计划采购量" prop="quantityPlan">
<el-input v-model="queryParams.quantityPlan" placeholder="请输入计划采购量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="实际采购量" prop="quantityReal">
<el-input v-model="queryParams.quantityReal" placeholder="请输入实际采购量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="到货入库量" prop="quantityEntry">
<el-input v-model="queryParams.quantityEntry" placeholder="请输入到货入库量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="待到货量" prop="quantityReceive">
<el-input v-model="queryParams.quantityReceive" placeholder="请输入待到货量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="退货数" prop="quantityReturn">
<el-input v-model="queryParams.quantityReturn" placeholder="请输入退货数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="换货量" prop="quantityExchange">
<el-input v-model="queryParams.quantityExchange" placeholder="请输入换货量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="质检量" prop="quantityQc">
<el-input v-model="queryParams.quantityQc" placeholder="请输入质检量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="待质检量" prop="quantityQcPrepare">
<el-input v-model="queryParams.quantityQcPrepare" placeholder="请输入待质检量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="期待到货时间" prop="expectArriveTime">
<el-date-picker clearable
v-model="queryParams.expectArriveTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择期待到货时间"
/>
</el-form-item>
<el-form-item label="箱数" prop="casesNum">
<el-input v-model="queryParams.casesNum" placeholder="请输入箱数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="单箱数量" prop="quantityPerCase">
<el-input v-model="queryParams.quantityPerCase" placeholder="请输入单箱数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="是否删除0 否1 是" prop="isDelete">
<el-input v-model="queryParams.isDelete" placeholder="请输入是否删除0 否1 是" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="税率" prop="taxRate">
<el-input v-model="queryParams.taxRate" placeholder="请输入税率" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="SPU" prop="spu">
<el-input v-model="queryParams.spu" placeholder="请输入SPU" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="款名" prop="spuName">
<el-input v-model="queryParams.spuName" placeholder="请输入款名" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:purchaseOrderItem:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:purchaseOrderItem:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:purchaseOrderItem:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:purchaseOrderItem:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="purchaseOrderItemList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="采购单子项ID" align="center" prop="id" />
<el-table-column label="关联采购单号" align="center" prop="orderSn" />
<el-table-column label="仓库ID" align="center" prop="wid" />
<el-table-column label="仓库名称" align="center" prop="wareHouseName" />
<el-table-column label="采购计划号" align="center" prop="planSn" />
<el-table-column label="本地产品ID" align="center" prop="productId" />
<el-table-column label="品名" align="center" prop="productName" />
<el-table-column label="SKU" align="center" prop="sku" />
<el-table-column label="FNSKU" align="center" prop="fnsku" />
<el-table-column label="店铺ID" align="center" prop="sid" />
<el-table-column label="型号" align="center" prop="model" />
<el-table-column label="含税单价" align="center" prop="price" />
<el-table-column label="价税合计" align="center" prop="amount" />
<el-table-column label="计划采购量" align="center" prop="quantityPlan" />
<el-table-column label="实际采购量" align="center" prop="quantityReal" />
<el-table-column label="到货入库量" align="center" prop="quantityEntry" />
<el-table-column label="待到货量" align="center" prop="quantityReceive" />
<el-table-column label="退货数" align="center" prop="quantityReturn" />
<el-table-column label="换货量" align="center" prop="quantityExchange" />
<el-table-column label="质检量" align="center" prop="quantityQc" />
<el-table-column label="待质检量" align="center" prop="quantityQcPrepare" />
<el-table-column label="期待到货时间" align="center" prop="expectArriveTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.expectArriveTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="箱数" align="center" prop="casesNum" />
<el-table-column label="单箱数量" align="center" prop="quantityPerCase" />
<el-table-column label="是否删除0 否1 是" align="center" prop="isDelete" />
<el-table-column label="税率" align="center" prop="taxRate" />
<el-table-column label="SPU" align="center" prop="spu" />
<el-table-column label="款名" align="center" prop="spuName" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:purchaseOrderItem:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:purchaseOrderItem:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改供应商订单产品明细对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="purchaseOrderItemFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="采购单子项ID" prop="id">
<el-input v-model="form.id" placeholder="请输入采购单子项ID" />
</el-form-item>
<el-form-item label="关联采购单号" prop="orderSn">
<el-input v-model="form.orderSn" placeholder="请输入关联采购单号" />
</el-form-item>
<el-form-item label="仓库ID" prop="wid">
<el-input v-model="form.wid" placeholder="请输入仓库ID" />
</el-form-item>
<el-form-item label="仓库名称" prop="wareHouseName">
<el-input v-model="form.wareHouseName" placeholder="请输入仓库名称" />
</el-form-item>
<el-form-item label="采购计划号" prop="planSn">
<el-input v-model="form.planSn" placeholder="请输入采购计划号" />
</el-form-item>
<el-form-item label="本地产品ID" prop="productId">
<el-input v-model="form.productId" placeholder="请输入本地产品ID" />
</el-form-item>
<el-form-item label="品名" prop="productName">
<el-input v-model="form.productName" placeholder="请输入品名" />
</el-form-item>
<el-form-item label="SKU" prop="sku">
<el-input v-model="form.sku" placeholder="请输入SKU" />
</el-form-item>
<el-form-item label="FNSKU" prop="fnsku">
<el-input v-model="form.fnsku" placeholder="请输入FNSKU" />
</el-form-item>
<el-form-item label="店铺ID" prop="sid">
<el-input v-model="form.sid" placeholder="请输入店铺ID" />
</el-form-item>
<el-form-item label="型号" prop="model">
<el-input v-model="form.model" placeholder="请输入型号" />
</el-form-item>
<el-form-item label="含税单价" prop="price">
<el-input v-model="form.price" placeholder="请输入含税单价" />
</el-form-item>
<el-form-item label="价税合计" prop="amount">
<el-input v-model="form.amount" placeholder="请输入价税合计" />
</el-form-item>
<el-form-item label="计划采购量" prop="quantityPlan">
<el-input v-model="form.quantityPlan" placeholder="请输入计划采购量" />
</el-form-item>
<el-form-item label="实际采购量" prop="quantityReal">
<el-input v-model="form.quantityReal" placeholder="请输入实际采购量" />
</el-form-item>
<el-form-item label="到货入库量" prop="quantityEntry">
<el-input v-model="form.quantityEntry" placeholder="请输入到货入库量" />
</el-form-item>
<el-form-item label="待到货量" prop="quantityReceive">
<el-input v-model="form.quantityReceive" placeholder="请输入待到货量" />
</el-form-item>
<el-form-item label="退货数" prop="quantityReturn">
<el-input v-model="form.quantityReturn" placeholder="请输入退货数" />
</el-form-item>
<el-form-item label="换货量" prop="quantityExchange">
<el-input v-model="form.quantityExchange" placeholder="请输入换货量" />
</el-form-item>
<el-form-item label="质检量" prop="quantityQc">
<el-input v-model="form.quantityQc" placeholder="请输入质检量" />
</el-form-item>
<el-form-item label="待质检量" prop="quantityQcPrepare">
<el-input v-model="form.quantityQcPrepare" placeholder="请输入待质检量" />
</el-form-item>
<el-form-item label="期待到货时间" prop="expectArriveTime">
<el-date-picker clearable
v-model="form.expectArriveTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择期待到货时间">
</el-date-picker>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="箱数" prop="casesNum">
<el-input v-model="form.casesNum" placeholder="请输入箱数" />
</el-form-item>
<el-form-item label="单箱数量" prop="quantityPerCase">
<el-input v-model="form.quantityPerCase" placeholder="请输入单箱数量" />
</el-form-item>
<el-form-item label="是否删除0 否1 是" prop="isDelete">
<el-input v-model="form.isDelete" placeholder="请输入是否删除0 否1 是" />
</el-form-item>
<el-form-item label="税率" prop="taxRate">
<el-input v-model="form.taxRate" placeholder="请输入税率" />
</el-form-item>
<el-form-item label="SPU" prop="spu">
<el-input v-model="form.spu" placeholder="请输入SPU" />
</el-form-item>
<el-form-item label="款名" prop="spuName">
<el-input v-model="form.spuName" placeholder="请输入款名" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="PurchaseOrderItem" lang="ts">
import { listPurchaseOrderItem, getPurchaseOrderItem, delPurchaseOrderItem, addPurchaseOrderItem, updatePurchaseOrderItem } from '@/api/amz/purchaseOrderItem';
import { PurchaseOrderItemVO, PurchaseOrderItemQuery, PurchaseOrderItemForm } from '@/api/amz/purchaseOrderItem/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const purchaseOrderItemList = ref<PurchaseOrderItemVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const purchaseOrderItemFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: PurchaseOrderItemForm = {
id: undefined,
orderSn: undefined,
wid: undefined,
wareHouseName: undefined,
planSn: undefined,
productId: undefined,
productName: undefined,
sku: undefined,
fnsku: undefined,
sid: undefined,
model: undefined,
price: undefined,
amount: undefined,
quantityPlan: undefined,
quantityReal: undefined,
quantityEntry: undefined,
quantityReceive: undefined,
quantityReturn: undefined,
quantityExchange: undefined,
quantityQc: undefined,
quantityQcPrepare: undefined,
expectArriveTime: undefined,
remark: undefined,
casesNum: undefined,
quantityPerCase: undefined,
isDelete: undefined,
taxRate: undefined,
spu: undefined,
spuName: undefined,
}
const data = reactive<PageData<PurchaseOrderItemForm, PurchaseOrderItemQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
orderSn: undefined,
wid: undefined,
wareHouseName: undefined,
planSn: undefined,
productId: undefined,
productName: undefined,
sku: undefined,
fnsku: undefined,
sid: undefined,
model: undefined,
price: undefined,
amount: undefined,
quantityPlan: undefined,
quantityReal: undefined,
quantityEntry: undefined,
quantityReceive: undefined,
quantityReturn: undefined,
quantityExchange: undefined,
quantityQc: undefined,
quantityQcPrepare: undefined,
expectArriveTime: undefined,
casesNum: undefined,
quantityPerCase: undefined,
isDelete: undefined,
taxRate: undefined,
spu: undefined,
spuName: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "采购单子项ID不能为空", trigger: "blur" }
],
orderSn: [
{ required: true, message: "关联采购单号不能为空", trigger: "blur" }
],
wid: [
{ required: true, message: "仓库ID不能为空", trigger: "blur" }
],
wareHouseName: [
{ required: true, message: "仓库名称不能为空", trigger: "blur" }
],
planSn: [
{ required: true, message: "采购计划号不能为空", trigger: "blur" }
],
productId: [
{ required: true, message: "本地产品ID不能为空", trigger: "blur" }
],
productName: [
{ required: true, message: "品名不能为空", trigger: "blur" }
],
sku: [
{ required: true, message: "SKU不能为空", trigger: "blur" }
],
fnsku: [
{ required: true, message: "FNSKU不能为空", trigger: "blur" }
],
sid: [
{ required: true, message: "店铺ID不能为空", trigger: "blur" }
],
model: [
{ required: true, message: "型号不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "含税单价不能为空", trigger: "blur" }
],
amount: [
{ required: true, message: "价税合计不能为空", trigger: "blur" }
],
quantityPlan: [
{ required: true, message: "计划采购量不能为空", trigger: "blur" }
],
quantityReal: [
{ required: true, message: "实际采购量不能为空", trigger: "blur" }
],
quantityEntry: [
{ required: true, message: "到货入库量不能为空", trigger: "blur" }
],
quantityReceive: [
{ required: true, message: "待到货量不能为空", trigger: "blur" }
],
quantityReturn: [
{ required: true, message: "退货数不能为空", trigger: "blur" }
],
quantityExchange: [
{ required: true, message: "换货量不能为空", trigger: "blur" }
],
quantityQc: [
{ required: true, message: "质检量不能为空", trigger: "blur" }
],
quantityQcPrepare: [
{ required: true, message: "待质检量不能为空", trigger: "blur" }
],
expectArriveTime: [
{ required: true, message: "期待到货时间不能为空", trigger: "blur" }
],
remark: [
{ required: true, message: "备注不能为空", trigger: "blur" }
],
casesNum: [
{ required: true, message: "箱数不能为空", trigger: "blur" }
],
quantityPerCase: [
{ required: true, message: "单箱数量不能为空", trigger: "blur" }
],
isDelete: [
{ required: true, message: "是否删除0 否1 是不能为空", trigger: "blur" }
],
taxRate: [
{ required: true, message: "税率不能为空", trigger: "blur" }
],
spu: [
{ required: true, message: "SPU不能为空", trigger: "blur" }
],
spuName: [
{ required: true, message: "款名不能为空", trigger: "blur" }
],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询供应商订单产品明细列表 */
const getList = async () => {
loading.value = true;
const res = await listPurchaseOrderItem(queryParams.value);
purchaseOrderItemList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
purchaseOrderItemFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: PurchaseOrderItemVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加供应商订单产品明细";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: PurchaseOrderItemVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getPurchaseOrderItem(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改供应商订单产品明细";
}
/** 提交按钮 */
const submitForm = () => {
purchaseOrderItemFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updatePurchaseOrderItem(form.value).finally(() => buttonLoading.value = false);
} else {
await addPurchaseOrderItem(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: PurchaseOrderItemVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除供应商订单产品明细编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delPurchaseOrderItem(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('amz/purchaseOrderItem/export', {
...queryParams.value
}, `purchaseOrderItem_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,941 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="queryParams.orderSn" placeholder="请输入采购单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="店铺名称" prop="customOrderSn">
<el-input v-model="queryParams.storeName" placeholder="请输入店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="订单状态" prop="orderStatus">
<el-select multiple collapse-tags collapse-tags-tooltip v-model="queryParams.orderStatus" placeholder="请选择订单状态" clearable>
<el-option v-for="dict in vendor_order_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="交货时间" prop="deliveryTime">
<el-date-picker clearable v-model="queryParams.deliveryTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择交货时间" />
</el-form-item>
<el-form-item label="供应商名称" prop="supplierName">
<el-input v-model="queryParams.supplierName" placeholder="请输入供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="SKU" prop="customOrderSn">
<el-input v-model="queryParams.sku" placeholder="请输入sku" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">-->
<!-- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:purchaseOrder:add']">新增 </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:purchaseOrder:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:purchaseOrder:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:purchaseOrder:export']">导出 </el-button>-->
<!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="purchaseOrderList" @selection-change="handleSelectionChange">
<el-table-column type="expand">
<template #default="props">
<el-card shadow="never">
<!-- <template #header>-->
<!-- <div class="card-header">-->
<!-- <span>产品明细</span>-->
<!-- </div>-->
<!-- </template>-->
<el-table v-loading="loading" :data="props.row.items" :border="true" size="small" :header-cell-style="{ fontSize: '10px' }">
<!-- <el-table-column label="关联采购单号" align="center" prop="orderSn" />-->
<!-- <el-table-column label="仓库ID" align="center" prop="wid" />-->
<el-table-column label="仓库名称" align="center" prop="wareHouseName" width="70px" />
<!-- <el-table-column label="采购计划号" align="center" prop="planSn" />-->
<!-- <el-table-column label="本地产品ID" align="center" prop="productId" />-->
<el-table-column label="品名" align="center" prop="productName" width="200px" />
<el-table-column label="SKU" align="center" prop="sku" width="200px" />
<el-table-column label="FNSKU" align="center" prop="fnsku" width="90px" />
<el-table-column label="店铺ID" align="center" prop="sid" width="70px" />
<!-- <el-table-column label="型号" align="center" prop="model" />-->
<!-- <el-table-column label="含税单价" align="center" prop="price" />-->
<!-- <el-table-column label="价税合计" align="center" prop="amount" />-->
<!-- <el-table-column label="计划采购量" align="center" prop="quantityPlan" />-->
<el-table-column label="实际采购量" align="center" prop="quantityReal" width="90px" />
<!-- <el-table-column label="到货入库量" align="center" prop="quantityEntry" />-->
<!-- <el-table-column label="待到货量" align="center" prop="quantityReceive" />-->
<!-- <el-table-column label="退货数" align="center" prop="quantityReturn" />-->
<!-- <el-table-column label="换货量" align="center" prop="quantityExchange" />-->
<!-- <el-table-column label="质检量" align="center" prop="quantityQc" />-->
<!-- <el-table-column label="待质检量" align="center" prop="quantityQcPrepare" />-->
<!-- <el-table-column label="期待到货时间" align="center" prop="expectArriveTime" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.expectArriveTime, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="当前订单状态" align="center" prop="orderStatus">
<template #default="scope">
<dict-tag :options="vendor_order_status" :value="scope.row.orderStatus" />
</template>
</el-table-column>
<el-table-column label="订单状态时间线" align="center" prop="casesNum">
<template #default="scope">
<el-timeline style="max-width: 600px; margin-top: 25px">
<el-timeline-item
v-for="(activity, index) in scope.row.sysStatusHistories"
:key="index"
:type="'success'"
:timestamp="activity.originalChangedAt"
>
<dict-tag :options="vendor_order_status" :value="activity.newStatus" />
</el-timeline-item>
</el-timeline>
</template>
</el-table-column>
<!-- <el-table-column label="箱数" align="center" prop="casesNum" />-->
<!-- <el-table-column label="单箱数量" align="center" prop="quantityPerCase" />-->
<!-- <el-table-column label="是否删除0 否1 是" align="center" prop="isDelete" />-->
<!-- <el-table-column label="税率" align="center" prop="taxRate" />-->
<!-- <el-table-column label="SPU" align="center" prop="spu" />-->
<!-- <el-table-column label="款名" align="center" prop="spuName" />-->
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width" v-hasRoles="['superadmin', 'gengdan']">-->
<!-- <template #default="scope">-->
<!-- <el-button-->
<!-- size="small"-->
<!-- link-->
<!-- type="primary"-->
<!-- @click="handleForward(scope.row, props.row)"-->
<!-- v-hasPermi="['amz:purchaseOrder:remove']"-->
<!-- >-->
<!-- 货件转发-->
<!-- </el-button>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
</el-card>
</template>
</el-table-column>
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<!-- <el-table-column label="自定义单号" align="center" prop="customOrderSn" />-->
<!-- <el-table-column label="供应商ID" align="center" prop="supplierId" />-->
<el-table-column label="供应商名称" align="center" prop="supplierName" />
<el-table-column label="店铺名称" align="center" prop="storeName" />
<el-table-column width="150" label="转发详情" align="center">
<template #default="{ row }">
<el-button link type="primary" size="small" @click="openDetailDialog(row.forwardList)"> 查看详情</el-button>
</template>
</el-table-column>
<!-- <el-table-column label="采购员ID" align="center" prop="optUid" />-->
<!-- <el-table-column label="审核人姓名" align="center" prop="auditorRealname" />-->
<!-- <el-table-column label="操作人姓名" align="center" prop="optRealname" />-->
<!-- <el-table-column label="最后操作人姓名" align="center" prop="lastRealname" />-->
<el-table-column label="下单时间" align="center" prop="orderTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.orderTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="实际采购量" align="center" prop="quantityReal" />
<el-table-column label="剩余未交货" align="center" prop="remainingQuantity" width="90px" />
<el-table-column label="采购单是否延期" align="center" prop="divTime" width="280px">
<template #default="scope">
<el-tag type="success" v-if="scope.row.divTime == null">采购单未延期</el-tag>
<el-tag type="danger" v-else>已延期至:{{ parseTime(scope.row.divTime, '{y}-{m}-{d}') }}</el-tag>
</template>
</el-table-column>
<el-table-column label="交货天数" align="center" prop="estDlvDays" />
<!-- <el-table-column label="订单状态" align="center" prop="orderStatus">-->
<!-- <template #default="scope">-->
<!-- <dict-tag :options="vendor_order_status" :value="scope.row.orderStatus" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="交货时间" align="center" prop="deliveryTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.deliveryTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="订单交付变动天数" align="center" prop="dlvTimeVar" />-->
<el-table-column label="备注" align="center" prop="remark" />
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width" v-hasRoles="['superadmin', 'gengdan']">-->
<!-- <template #default="scope">-->
<!-- <el-tooltip content="修改" placement="top" v-hasRoles="['superadmin', 'gengdan']">-->
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:purchaseOrder:edit']"></el-button>-->
<!-- </el-tooltip>-->
<!-- &lt;!&ndash; <el-button size="small" link type="primary" @click="handleConfirm(scope.row)" v-hasPermi="['amz:purchaseOrder:remove']"> 确认 </el-button>&ndash;&gt;-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改采购单主对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="purchaseOrderFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="form.orderSn" placeholder="请输入采购单号" disabled />
</el-form-item>
<el-form-item label="交货天数" prop="estDlvDays">
<!-- <el-input v-model="form.estDlvDays" placeholder="请输入交货天数" />-->
<el-input-number v-model="form.estDlvDays" :min="0" :max="100" @change="delevAction()">
<template #suffix>
<span></span>
</template>
</el-input-number>
</el-form-item>
<!-- <el-form-item label="订单状态" prop="orderStatus">-->
<!-- <el-select v-model="form.orderStatus" placeholder="请选择订单状态">-->
<!-- <el-option v-for="dict in vendor_order_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item label="交货时间" prop="deliveryTime">
<el-date-picker
clearable
v-model="form.deliveryTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择交货时间"
disabled
>
</el-date-picker>
</el-form-item>
<!-- <el-form-item label="订单交付变动天数" prop="dlvTimeVar">-->
<!-- <el-input v-model="form.dlvTimeVar" placeholder="请输入订单交付变动天数" />-->
<!-- </el-form-item>-->
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
<el-dialog :title="forwardDialog.title" v-model="forwardDialog.visible" width="800px" append-to-body>
<el-form ref="shipForwardFormRef" :model="forwardForm" :rules="rules2" label-width="100px">
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="forwardForm.orderSn" placeholder="请输入采购单号" disabled />
</el-form-item>
<el-form-item label="店铺名称" prop="storeName">
<el-input v-model="forwardForm.storeName" placeholder="请输入采购店铺名称" disabled />
</el-form-item>
<el-form-item label="SKU" prop="sku">
<el-input v-model="forwardForm.sku" placeholder="请输入产品唯一标识码" disabled />
</el-form-item>
<el-form-item label="产品全称" prop="productName">
<el-input v-model="forwardForm.productName" placeholder="请输入产品全称" disabled />
</el-form-item>
<el-form-item label="发货数量" prop="quantitySend">
<!-- <el-input v-model="forwardForm.quantitySend" placeholder="请输入实际发货数量" />-->
<el-input-number v-model="forwardForm.quantitySend" :min="1" :max="maxQuality">
<template #suffix>
<span></span>
</template>
</el-input-number>
</el-form-item>
<el-form-item label="发货方" prop="outSupplierName">
<el-input v-model="forwardForm.outSupplierName" placeholder="请输入发货供应商名称" disabled />
</el-form-item>
<!-- <el-form-item label="发货方ID" prop="outSupplierId">-->
<!-- <el-input v-model="forwardForm.outSupplierId" placeholder="请输入发货供应商系统ID" />-->
<!-- </el-form-item>-->
<el-form-item label="收货方" prop="inSupplierName">
<!-- <el-input v-model="forwardForm.inSupplierName" placeholder="请输入收货供应商名称" />-->
<el-select v-model="selectUser" placeholder="请选择供应商" @change="selectAction">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.rawData" :disabled="item.disabled">
<!-- 自定义选项内容 -->
<span>{{ item.label }}</span>
<span style="float: right; color: #8492a6; font-size: 13px">
{{ item.rawData.userName }}
</span>
</el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="收货方ID" prop="inSupplierId">-->
<!-- <el-input v-model="forwardForm.inSupplierId" placeholder="请输入收货供应商系统ID" />-->
<!-- </el-form-item>-->
<el-form-item label="发货区间" prop="shipmentStart">
<el-date-picker
v-model="intervalDate"
type="daterange"
range-separator="到"
start-placeholder="开始日期"
end-placeholder="结束日期"
:size="'small'"
@change="intervalAction"
/>
</el-form-item>
<!-- <el-form-item label="跟单人" prop="trackerName">-->
<!-- <el-input v-model="forwardForm.trackerName" placeholder="请输入跟单人" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="跟单id" prop="trackerId">-->
<!-- <el-input v-model="forwardForm.trackerId" placeholder="请输入跟单id" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="发货时间" prop="sendTime">-->
<!-- <el-date-picker clearable v-model="forwardForm.sendTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货时间">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="forwardSubmitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
<el-dialog :title="forwardTableDialog.title" v-model="forwardTableDialog.visible" width="1800px" append-to-body>
<el-table :data="shipForwardList">
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="采购店铺名称" align="center" prop="storeName" />
<el-table-column label="SKU" align="center" prop="sku" />
<el-table-column label="产品全称" align="center" prop="productName" />
<el-table-column label="实际发货数量" align="center" prop="quantitySend" />
<el-table-column label="发货方" align="center" prop="outSupplierName" />
<!-- <el-table-column label="发货供应商系统ID" align="center" prop="outSupplierId" />-->
<el-table-column label="收货方" align="center" prop="inSupplierName" />
<!-- <el-table-column label="收货供应商系统ID" align="center" prop="inSupplierId" />-->
<el-table-column label="计划发货起始时间" align="center" prop="shipmentStart" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.shipmentStart, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="计划发货截止时间" align="center" prop="shipmentEnd" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.shipmentEnd, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="跟单人" align="center" prop="trackerName" />
<!-- <el-table-column label="跟单id" align="center" prop="trackerId" />-->
<el-table-column label="转发状态" align="center" prop="fwdStatus">
<template #default="scope">
<dict-tag :options="forward_status" :value="scope.row.fwdStatus" />
</template>
</el-table-column>
<el-table-column label="发货时间" align="center" prop="sendTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.sendTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
<!-- <template #default="scope">-->
<!-- <el-tooltip content="修改" placement="top">-->
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:shipForward:edit']"></el-button>-->
<!-- </el-tooltip>-->
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:shipForward:remove']"></el-button>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
<!-- <template #footer>-->
<!-- <div class="dialog-footer">-->
<!-- <el-button :loading="buttonLoading" type="primary" @click="forwardSubmitForm"> </el-button>-->
<!-- <el-button @click="cancel"> </el-button>-->
<!-- </div>-->
<!-- </template>-->
</el-dialog>
</div>
</template>
<script setup name="PurchaseOrder" lang="ts">
import { listPurchaseOrder, getPurchaseOrder, delPurchaseOrder, addPurchaseOrder, updatePurchaseOrder } from '@/api/amz/purchaseOrder';
import { PurchaseOrderVO, PurchaseOrderQuery, PurchaseOrderForm } from '@/api/amz/purchaseOrder/types';
import { ShipForwardForm, ShipForwardVO } from '@/api/amz/shipForward/types';
import { addShipForward, updateShipForward } from '@/api/amz/shipForward';
import { roleSelectPost } from '@/api/system/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { vendor_order_status } = toRefs<any>(proxy?.useDict('vendor_order_status'));
const { forward_status } = toRefs<any>(proxy?.useDict('forward_status'));
const purchaseOrderList = ref<PurchaseOrderVO[]>([]);
const shipForwardList = ref<ShipForwardVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const forwardDataLoading = ref(false);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const maxQuality = ref(0);
const shipForwardFormRef = ref<ElFormInstance>();
const queryFormRef = ref<ElFormInstance>();
const purchaseOrderFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const forwardDialog = reactive<DialogOption>({
visible: false,
title: ''
});
const forwardTableDialog = reactive<DialogOption>({
visible: false,
title: '转发明细'
});
const initFormData: PurchaseOrderForm = {
orderSn: undefined,
customOrderSn: undefined,
supplierId: undefined,
supplierName: undefined,
optUid: undefined,
auditorRealname: undefined,
optRealname: undefined,
lastRealname: undefined,
orderTime: undefined,
payment: undefined,
auditorUid: undefined,
auditorTime: undefined,
lastUid: undefined,
lastTime: undefined,
reason: undefined,
isTax: undefined,
status: undefined,
statusText: undefined,
payStatusText: undefined,
statusShipped: undefined,
statusShippedText: undefined,
amountTotal: undefined,
totalPrice: undefined,
icon: undefined,
payStatus: undefined,
remark: undefined,
otherFee: undefined,
otherCurrency: undefined,
feePartType: undefined,
shippingPrice: undefined,
shippingCurrency: undefined,
purchaseCurrency: undefined,
purchaseRate: undefined,
quantityTotal: undefined,
wid: undefined,
wareHouseName: undefined,
wareHouseBakName: undefined,
quantityEntry: undefined,
quantityReal: undefined,
quantityReceive: undefined,
purchaserId: undefined,
contactPerson: undefined,
contactNumber: undefined,
settlementMethod: undefined,
settlementDescription: undefined,
paymentMethod: undefined,
estDlvDays: undefined,
orderStatus: undefined,
deliveryTime: undefined,
dlvTimeVar: undefined
};
const data = reactive<PageData<PurchaseOrderForm, PurchaseOrderQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
orderSn: undefined,
customOrderSn: undefined,
supplierId: undefined,
supplierName: undefined,
optUid: undefined,
auditorRealname: undefined,
optRealname: undefined,
lastRealname: undefined,
orderTime: undefined,
payment: undefined,
auditorUid: undefined,
auditorTime: undefined,
lastUid: undefined,
lastTime: undefined,
reason: undefined,
isTax: undefined,
status: undefined,
statusText: undefined,
payStatusText: undefined,
statusShipped: undefined,
statusShippedText: undefined,
amountTotal: undefined,
totalPrice: undefined,
icon: undefined,
payStatus: undefined,
otherFee: undefined,
otherCurrency: undefined,
feePartType: undefined,
shippingPrice: undefined,
shippingCurrency: undefined,
purchaseCurrency: undefined,
purchaseRate: undefined,
quantityTotal: undefined,
wid: undefined,
wareHouseName: undefined,
wareHouseBakName: undefined,
quantityEntry: undefined,
quantityReal: undefined,
quantityReceive: undefined,
purchaserId: undefined,
contactPerson: undefined,
contactNumber: undefined,
settlementMethod: undefined,
settlementDescription: undefined,
paymentMethod: undefined,
estDlvDays: undefined,
orderStatus: undefined,
deliveryTime: undefined,
// dlvTimeVar: undefined,
params: {}
},
rules: {
// orderSn: [{ required: true, message: '', trigger: 'blur' }],
// customOrderSn: [{ required: true, message: '', trigger: 'blur' }],
// supplierId: [{ required: true, message: 'ID', trigger: 'blur' }],
// supplierName: [{ required: true, message: '', trigger: 'blur' }],
// optUid: [{ required: true, message: 'ID', trigger: 'blur' }],
// auditorRealname: [{ required: true, message: '', trigger: 'blur' }],
// optRealname: [{ required: true, message: '', trigger: 'blur' }],
// lastRealname: [{ required: true, message: '', trigger: 'blur' }],
// orderTime: [{ required: true, message: '', trigger: 'blur' }],
// payment: [{ required: true, message: '', trigger: 'blur' }],
// auditorUid: [{ required: true, message: 'ID', trigger: 'blur' }],
// auditorTime: [{ required: true, message: '', trigger: 'blur' }],
// lastUid: [{ required: true, message: 'ID', trigger: 'blur' }],
// lastTime: [{ required: true, message: '', trigger: 'blur' }],
// reason: [{ required: true, message: '', trigger: 'blur' }],
// isTax: [{ required: true, message: '0 1 ', trigger: 'blur' }],
// status: [
// {
// required: true,
// message: '-1 , 3 , 1 , 2 , 9 , 121 , 122 , 124 ',
// trigger: 'change'
// }
// ],
// statusText: [{ required: true, message: '', trigger: 'blur' }],
// payStatusText: [{ required: true, message: '', trigger: 'blur' }],
// statusShipped: [{ required: true, message: '1 , 2 , 3 ', trigger: 'blur' }],
// statusShippedText: [{ required: true, message: '', trigger: 'blur' }],
// amountTotal: [{ required: true, message: '', trigger: 'blur' }],
// totalPrice: [{ required: true, message: '', trigger: 'blur' }],
// icon: [{ required: true, message: '', trigger: 'blur' }],
// payStatus: [
// {
// required: true,
// message: '0 , 1 , 2 , 3 ',
// trigger: 'change'
// }
// ],
// remark: [{ required: true, message: '', trigger: 'blur' }],
// otherFee: [{ required: true, message: '', trigger: 'blur' }],
// otherCurrency: [{ required: true, message: '', trigger: 'blur' }],
// feePartType: [{ required: true, message: '0 , 1 , 2 ', trigger: 'change' }],
// shippingPrice: [{ required: true, message: '', trigger: 'blur' }],
// shippingCurrency: [{ required: true, message: '', trigger: 'blur' }],
// purchaseCurrency: [{ required: true, message: '', trigger: 'blur' }],
// purchaseRate: [{ required: true, message: '', trigger: 'blur' }],
// quantityTotal: [{ required: true, message: '', trigger: 'blur' }],
// wid: [{ required: true, message: 'ID', trigger: 'blur' }],
// wareHouseName: [{ required: true, message: '', trigger: 'blur' }],
// wareHouseBakName: [{ required: true, message: '()', trigger: 'blur' }],
// quantityEntry: [{ required: true, message: '', trigger: 'blur' }],
// quantityReal: [{ required: true, message: '', trigger: 'blur' }],
// quantityReceive: [{ required: true, message: '', trigger: 'blur' }],
// purchaserId: [{ required: true, message: 'ID', trigger: 'blur' }],
// contactPerson: [{ required: true, message: '', trigger: 'blur' }],
// contactNumber: [{ required: true, message: '', trigger: 'blur' }],
// settlementMethod: [{ required: true, message: '7 , 8 ', trigger: 'blur' }],
// settlementDescription: [{ required: true, message: '', trigger: 'blur' }],
// paymentMethod: [{ required: true, message: '', trigger: 'blur' }],
// dlvTimeVar: [{ required: true, message: '', trigger: 'blur' }]
deliveryTime: [{ required: true, message: '交货时间不能为空', trigger: 'blur' }],
estDlvDays: [{ required: true, message: '交货天数不能为空', trigger: 'blur' }],
orderStatus: [{ required: true, message: '订单状态不能为空', trigger: 'change' }]
},
rules2: {
id: [{ required: true, message: '$comment不能为空', trigger: 'blur' }],
orderSn: [{ required: true, message: '采购单号不能为空', trigger: 'blur' }],
storeName: [{ required: true, message: '采购店铺名称不能为空', trigger: 'blur' }],
sku: [{ required: true, message: '产品唯一标识码不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品全称不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '实际发货数量不能为空', trigger: 'blur' }],
outSupplierName: [{ required: true, message: '发货供应商名称不能为空', trigger: 'blur' }],
outSupplierId: [{ required: true, message: '发货供应商系统ID不能为空', trigger: 'blur' }],
inSupplierName: [{ required: true, message: '收货供应商名称不能为空', trigger: 'blur' }],
inSupplierId: [{ required: true, message: '收货供应商系统ID不能为空', trigger: 'blur' }],
shipmentStart: [{ required: true, message: '计划发货起始时间不能为空', trigger: 'blur' }],
shipmentEnd: [{ required: true, message: '计划发货截止时间不能为空', trigger: 'blur' }],
trackerName: [{ required: true, message: '跟单人不能为空', trigger: 'blur' }],
trackerId: [{ required: true, message: '跟单id不能为空', trigger: 'blur' }],
fwdStatus: [{ required: true, message: '转发状态不能为空', trigger: 'change' }],
sendTime: [{ required: true, message: '发货时间不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules, rules2 } = toRefs(data);
const forwardForm = ref<ShipForwardForm>({
id: undefined,
orderSn: undefined,
storeName: undefined,
sku: undefined,
productName: undefined,
quantitySend: undefined,
outSupplierName: undefined,
outSupplierId: undefined,
inSupplierName: undefined,
inSupplierId: undefined,
shipmentStart: undefined,
shipmentEnd: undefined,
trackerName: undefined,
trackerId: undefined,
fwdStatus: undefined,
sendTime: undefined
});
const intervalDate = ref<any>();
const intervalAction = () => {
console.log('intervalDate', intervalDate);
forwardForm.value.shipmentStart = getDateToString(intervalDate.value[0]);
forwardForm.value.shipmentEnd = getDateToString(intervalDate.value[1]);
};
const selectUser = ref<any>();
const selectAction = () => {
console.log('selectUser', selectUser);
forwardForm.value.inSupplierId = selectUser.value.userId;
forwardForm.value.inSupplierName = selectUser.value.nickName;
selectUser.value = selectUser.value.nickName;
};
const getDateToString = (date: Date): string => {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 0 1
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
};
/** 查询采购单主列表 */
const getList = async () => {
loading.value = true;
const copyParams = JSON.parse(JSON.stringify(queryParams.value)); // [1,2](@ref)
if (Array.isArray(copyParams.orderStatus)) {
copyParams.orderStatus = copyParams.orderStatus.join(','); // [6,7](@ref)
}
const res = await listPurchaseOrder(copyParams);
purchaseOrderList.value = res.rows;
purchaseOrderList.value.map((item) => {
if (item.forwardList) {
item.remainingQuantity = item.quantityReal - item.forwardList.reduce((sum, item) => sum + item.quantitySend, 0);
} else {
item.remainingQuantity = item.quantityReal;
}
});
total.value = res.total;
loading.value = false;
};
const options = ref([]);
const roleSelectAction = async () => {
const res = await roleSelectPost([5]);
console.log('res', res);
options.value = res.data.map((user) => ({
value: user.userId, // userId
label: user.nickName || '', // nickName
rawData: user //
}));
};
const openDetailDialog = (detail) => {
shipForwardList.value = detail;
forwardTableDialog.visible = true;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
purchaseOrderFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
const delevAction = () => {
form.value.deliveryTime = getDateAfterTwoDays(form.value.estDlvDays);
console.log('form.value', form.value.deliveryTime);
};
const getDateAfterTwoDays = (dayNum: number): string => {
const date = new Date(); //
date.setDate(date.getDate() + dayNum); // 2
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 0 1
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: PurchaseOrderVO[]) => {
ids.value = selection.map((item) => item.orderSn);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加采购单主';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: PurchaseOrderVO) => {
reset();
const _orderSn = row?.orderSn || ids.value[0];
const res = await getPurchaseOrder(_orderSn);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改采购单主';
};
const handleConfirm = async (row?: PurchaseOrderVO) => {
// reset();
// const _orderSn = row?.orderSn || ids.value[0];
// const res = await getPurchaseOrder(_orderSn);
// Object.assign(form.value, res.data);
// dialog.visible = true;
// dialog.title = '';
// id: undefined,
// orderSn: undefined,
// storeName: undefined,
// sku: undefined,
// productName: undefined,
// quantitySend: undefined,
// outSupplierName: undefined,
// outSupplierId: undefined,
// inSupplierName: undefined,
// inSupplierId: undefined,
// shipmentStart: undefined,
// shipmentEnd: undefined,
// trackerName: undefined,
// trackerId: undefined,
// fwdStatus: undefined,
// sendTime: undefined
console.log('row', row);
};
//row
const handleForward = async (row?, rowM?) => {
// reset();
// const _orderSn = row?.orderSn || ids.value[0];
// const res = await getPurchaseOrder(_orderSn);
// Object.assign(form.value, res.data);
// dialog.visible = true;
// dialog.title = '';
roleSelectAction();
forwardForm.value.orderSn = row?.orderSn;
forwardForm.value.storeName = rowM?.storeName;
forwardForm.value.sku = row?.sku;
forwardForm.value.productName = row?.productName;
forwardForm.value.quantitySend = row?.quantitySend;
forwardForm.value.outSupplierName = rowM?.supplierName;
forwardForm.value.outSupplierId = rowM?.supplierId;
forwardForm.value.orderDetailId = row?.id;
// forwardForm.value.inSupplierName = row?.inSupplierName;
// forwardForm.value.inSupplierId = row?.inSupplierId;
// forwardForm.value.shipmentStart = row?.shipmentStart;
// forwardForm.value.shipmentEnd = row?.shipmentEnd;
// forwardForm.value.trackerName = row?.trackerName;
// forwardForm.value.trackerId = row?.trackerId;
// forwardForm.value.fwdStatus = row?.fwdStatus;
// forwardForm.value.sendTime = row?.sendTime;
maxQuality.value = row?.quantityReal;
console.log('maxQuality', maxQuality.value);
console.log('row', row);
console.log('rowM', rowM);
forwardDialog.visible = true;
forwardDialog.title = '添加转发数据';
};
/** 提交按钮 */
const submitForm = () => {
purchaseOrderFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.orderSn) {
await updatePurchaseOrder(form.value).finally(() => (buttonLoading.value = false));
} else {
await addPurchaseOrder(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
const forwardSubmitForm = () => {
if (forwardForm.value.inSupplierName === forwardForm.value.outSupplierName) {
proxy?.$modal.msgError('请不要选择相同的供应商');
return;
}
shipForwardFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (forwardForm.value.id) {
await updateShipForward(forwardForm.value).finally(() => (buttonLoading.value = false));
} else {
await addShipForward(forwardForm.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
forwardDialog.visible = false;
// await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: PurchaseOrderVO) => {
const _orderSns = row?.orderSn || ids.value;
await proxy?.$modal.confirm('是否确认删除采购单主编号为"' + _orderSns + '"的数据项?').finally(() => (loading.value = false));
await delPurchaseOrder(_orderSns);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'amz/purchaseOrder/export',
{
...queryParams.value
},
`purchaseOrder_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>
<style scoped>
/* 展开行容器 */
:deep(.el-table__expanded-cell) {
background: #f5fbfd !important;
padding: 0 !important;
border-bottom: none !important;
}
/* 内嵌表格容器 */
:deep(.el-table__expanded-cell) .el-table {
--el-table-bg-color: #ebf3ff !important;
--el-table-tr-bg-color: #f5fbfd !important;
--el-table-header-bg-color: #cfe2ff !important; /* 表头变量 */
--el-table-header-text-color: #2c3e50 !important; /* 新增文字颜色 */
}
/* 表格主体容器 */
:deep(.el-table__expanded-cell) .el-table__body-wrapper {
background: #ebf3ff !important;
}
/* 表头单元格精准控制 */
:deep(.el-table__expanded-cell) .el-table__header th {
background-color: #cfe2ff !important; /* 覆盖默认背景 */
border-bottom: 2px solid #a6c5ff !important; /* 表头下边框 */
}
/* 表头文字样式 */
:deep(.el-table__expanded-cell) .el-table__header .cell {
color: #1a2b3c !important;
font-weight: 600; /* 加粗字体 */
}
/* 单元格背景 */
:deep(.el-table__expanded-cell) .el-table__body tr td {
background-color: transparent !important;
}
/* 消除卡片干扰 */
:deep(.el-card) {
background: transparent !important;
border: none !important;
}
/* 内嵌表格hover效果 */
:deep(.el-table__expanded-cell) .el-table__body tr:hover > td {
background-color: #ffffff !important;
}
/* 表头hover状态 */
:deep(.el-table__expanded-cell) .el-table__header tr:hover th {
background-color: #b6d4ff !important;
}
/* 表头排序按钮颜色 */
:deep(.el-table__expanded-cell) .el-table__header .sort-caret.ascending {
border-bottom-color: #1a2b3c;
}
:deep(.el-table__expanded-cell) .el-table__header .sort-caret.descending {
border-top-color: #1a2b3c;
}
</style>

View File

@ -16,21 +16,6 @@
<el-form-item label="产品名称" prop="productName">
<el-input v-model="queryParams.productName" placeholder="请输入产品名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货数量" prop="quantitySend">
<el-input v-model="queryParams.quantitySend" placeholder="请输入发货数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="单箱产品数量" prop="quantityPerBox">
<el-input v-model="queryParams.quantityPerBox" placeholder="请输入单箱产品数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="箱数" prop="boxCount">
<el-input v-model="queryParams.boxCount" placeholder="请输入箱数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="箱子尺寸" prop="boxDimensions">-->
<!-- <el-input v-model="queryParams.boxDimensions" placeholder="请输入箱子尺寸" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="单箱重量" prop="weightPerBox">
<el-input v-model="queryParams.weightPerBox" placeholder="请输入单箱重量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="实际采购店铺" prop="realStoreName">
<el-input v-model="queryParams.realStoreName" placeholder="请输入实际采购店铺" clearable @keyup.enter="handleQuery" />
</el-form-item>
@ -54,40 +39,68 @@
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:sendOrder:add']">新增 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:sendOrder:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:sendOrder:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:sendOrder:export']"> 导出 </el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:sendOrder:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:sendOrder:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:sendOrder:export']"> 导出 </el-button>-->
<!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="sendOrderList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="主键ID" align="center" prop="id" />-->
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="发货单号" align="center" prop="id" />
<el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="创建日期" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="发货日期" align="center" prop="sendDate" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.sendDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="采购店铺" align="center" prop="storeName" />
<el-table-column label="供应商名称" align="center" prop="sendName" />
<el-table-column label="物流商名称" align="center" prop="logisticsProviderName">
<template #default="{ row }">
<el-popover placement="top" title="物流商地址" :width="200" trigger="click">
<template #reference>
<el-button v-if="row.logisticsProviderName !== null" text size="small" type="primary">
{{ row.logisticsProviderName }}
</el-button>
</template>
<div>{{ row.address || '暂无地址' }}</div>
</el-popover>
</template>
</el-table-column>
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="发货数量" align="center" prop="quantitySend" />
<el-table-column label="单箱产品数量" align="center" prop="quantityPerBox" />
<el-table-column label="箱数" align="center" prop="boxCount" />
<!-- <el-table-column label="单箱产品数量" align="center" prop="quantityPerBox" />-->
<el-table-column label="箱数" align="center" prop="boxCount">
<template #default="{ row }">
<el-popover placement="top" title="装箱明细" :width="350" trigger="click">
<template #reference>
<el-button text size="small" type="primary"> {{ row.boxCount }}</el-button>
</template>
<div v-if="row.sendDetail !== null" v-html="formatText(row.sendDetail)"></div>
<div v-else>暂无数据</div>
</el-popover>
</template>
</el-table-column>
<el-table-column label="箱子尺寸" align="center" prop="boxDimensions" />
<el-table-column label="单箱重量" align="center" prop="weightPerBox" />
<el-table-column label="实际采购店铺" align="center" prop="realStoreName" />
<el-table-column label="重量" align="center" prop="weightPerBox" />
<el-table-column label="实际发货店铺" align="center" prop="realStoreName" />
<el-table-column label="发货状态" align="center" prop="sendStatus">
<template #default="scope">
<dict-tag :options="send_status" :value="scope.row.sendStatus" />
@ -95,7 +108,7 @@
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-tooltip content="修改" placement="top" v-if="scope.row.sendStatus === 'pending'">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:sendOrder:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
@ -108,7 +121,7 @@
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改供应商创建的发货单对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-dialog :title="dialog.title" v-model="dialog.visible" width="1000px" append-to-body>
<el-form ref="sendOrderFormRef" :model="form" :rules="rules" label-width="120px">
<!-- <el-form-item label="主键ID" prop="id">-->
<!-- <el-input v-model="form.id" placeholder="请输入主键ID" />-->
@ -116,43 +129,82 @@
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="form.orderSn" placeholder="请输入采购单号" @blur="blurAction" />
</el-form-item>
<el-form-item label="发货日期" prop="sendDate">
<el-date-picker clearable v-model="form.sendDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货日期">
</el-date-picker>
</el-form-item>
<!-- <el-form-item label="发货日期" prop="sendDate">-->
<!-- <el-date-picker clearable v-model="form.sendDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货日期">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购店铺" prop="storeName">-->
<!-- <el-input v-model="form.storeName" placeholder="请输入采购店铺" />-->
<!-- </el-form-item>-->
<el-form-item label="产品名称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入产品名称" />
</el-form-item>
<el-form-item label="发货" prop="quantitySend">
<el-form-item label="发货数" prop="quantitySend">
<el-input v-model="form.quantitySend" placeholder="请输入发货数量" />
</el-form-item>
<el-form-item label="单箱产品数量" prop="quantityPerBox">
<el-input v-model="form.quantityPerBox" placeholder="请输入单箱产品数量" />
<el-form-item label="总箱数" prop="boxCount">
<el-input v-model="form.boxCount" placeholder="请输入总箱数" />
</el-form-item>
<el-form-item label="箱数" prop="boxCount">
<el-input v-model="form.boxCount" placeholder="请输入箱数" />
<el-form-item v-if="form.quantitySend > 0 && form.boxCount > 0" label="箱子明细" prop="quantityPerBox">
<div class="max-w-800px">
<div v-for="(group, index) in groups" :key="index" class="flex gap-12px mb-16px items-center">
<el-input
v-model.number="groups[index].boxCount"
placeholder="箱子数量"
type="number"
min="0"
class="flex-1"
@input="validateInput(index, 'boxCount')"
/>
X
<el-input
v-model.number="groups[index].itemCount"
placeholder="每箱个数"
type="number"
min="0"
class="flex-1"
@input="validateInput(index, 'itemCount')"
/>
<el-input v-model.number="groups[index].lengthPerBox" placeholder="长(cm)" type="number" min="0" class="flex-1" />
<el-input v-model.number="groups[index].widthPerBox" placeholder="宽(cm)" type="number" min="0" class="flex-1" />
<el-input v-model.number="groups[index].heightPerBox" placeholder="高(cm)" type="number" min="0" class="flex-1" />
<el-input v-model.number="groups[index].weightPerBox" placeholder="单箱重量(kg)" type="number" min="0" class="flex-1" />
<el-button v-if="index > 0" @click="removeGroup(index)" type="danger" :icon="Close" circle size="small" />
<div v-else class="w-8 h-8"></div>
</div>
<div class="mb-16px text-left">
<span :class="['mr-8px', Number(totalNum) === Number(shipForm.quantitySend) ? 'text-green-500' : 'text-red-500']">
当前总量{{ totalNum }}/{{ form.quantitySend }}
</span>
<el-button @click="addGroup" type="primary" :icon="Plus" :disabled="totalNum >= form.quantitySend"> 添加一组 </el-button>
</div>
</div>
</el-form-item>
<!-- <el-form-item label="箱子尺寸" prop="boxDimensions">-->
<!-- <el-input v-model="form.boxDimensions" placeholder="请输入箱子尺寸" />-->
<!-- </el-form-item>-->
<el-form-item label="箱子尺寸" prop="boxDimensions">
<el-row>
<el-col :span="8">
<el-input v-model="plength" placeholder="请输入长" />
</el-col>
<el-col :span="8">
<el-input v-model="pwidth" placeholder="请输入宽" />
</el-col>
<el-col :span="8">
<el-input v-model="pheight" placeholder="请输入高" />
</el-col>
</el-row>
</el-form-item>
<el-form-item label="单箱重量" prop="weightPerBox">
<el-input v-model="form.weightPerBox" placeholder="请输入单箱重量" />
<!-- <el-form-item label="箱子尺寸" prop="boxDimensions">-->
<!-- <el-row>-->
<!-- <el-col :span="8">-->
<!-- <el-input v-model="plength" placeholder="请输入长" />-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-input v-model="pwidth" placeholder="请输入宽" />-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-input v-model="pheight" placeholder="请输入高" />-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- </el-form-item>-->
<el-form-item label="总重量" prop="weightPerBox">
<!-- <el-input v-model="totalWeight" placeholder="请输入总重量" disabled />-->
<el-input-number v-model="totalWeight" :min="0" :max="100000" disabled>
<template #suffix>
<span>kg</span>
</template>
</el-input-number>
</el-form-item>
<!-- <el-form-item label="实际采购店铺" prop="realStoreName">-->
<!-- <el-input v-model="form.realStoreName" placeholder="请输入实际采购店铺" />-->
@ -165,7 +217,7 @@
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"></el-button>
<el-button :loading="buttonLoading" type="primary" @click="submitForm"></el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
@ -177,6 +229,7 @@
import { listSendOrder, getSendOrder, delSendOrder, addSendOrder, updateSendOrder } from '@/api/amz/sendOrder';
import { SendOrderVO, SendOrderQuery, SendOrderForm } from '@/api/amz/sendOrder/types';
import { getPurchaseOrder } from '@/api/amz/purchaseOrder';
import { Close, Plus } from '@element-plus/icons-vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { send_status } = toRefs<any>(proxy?.useDict('send_status'));
@ -207,13 +260,14 @@ const initFormData: SendOrderForm = {
sendDate: undefined,
storeName: undefined,
productName: undefined,
quantitySend: undefined,
quantitySend: 0,
quantityPerBox: undefined,
boxCount: undefined,
boxDimensions: undefined,
weightPerBox: undefined,
realStoreName: undefined,
sendStatus: undefined
sendStatus: undefined,
sendDetail: undefined
};
const data = reactive<PageData<SendOrderForm, SendOrderQuery>>({
form: { ...initFormData },
@ -235,19 +289,22 @@ const data = reactive<PageData<SendOrderForm, SendOrderQuery>>({
},
rules: {
orderSn: [{ required: true, message: '采购单号不能为空', trigger: 'blur' }],
sendDate: [{ required: true, message: '发货日期不能为空', trigger: 'blur' }],
// sendDate: [{ required: true, message: '', trigger: 'blur' }],
storeName: [{ required: true, message: '采购店铺不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '发货数量不能为空', trigger: 'blur' }],
quantityPerBox: [{ required: true, message: '单箱产品数量不能为空', trigger: 'blur' }],
boxCount: [{ required: true, message: '箱数不能为空', trigger: 'blur' }],
boxDimensions: [
quantityPerBox: [
{
required: true,
message: '长宽高都不能为空',
validator: (rule, value, callback) => {
if (!plength.value || !pwidth.value || !pheight.value) {
callback(new Error('长宽高都不能为空'));
if (totalBoxCount.value != form.value.boxCount) {
console.log('totalBoxCount.value', totalBoxCount.value);
console.log('form.value.boxCount', form.value.boxCount);
callback(new Error('明细箱数和总箱数不匹配,请调整'));
}
//
if (totalNum.value > form.value.quantitySend) {
const exceed = totalNum.value - form.value.quantitySend;
callback(new Error('总量超出 ' + exceed + ',请调整'));
} else {
callback();
}
@ -255,6 +312,21 @@ const data = reactive<PageData<SendOrderForm, SendOrderQuery>>({
trigger: 'blur'
}
],
boxCount: [{ required: true, message: '箱数不能为空', trigger: 'blur' }],
// boxDimensions: [
// {
// required: true,
// message: '',
// validator: (rule, value, callback) => {
// if (!plength.value || !pwidth.value || !pheight.value) {
// callback(new Error(''));
// } else {
// callback();
// }
// },
// trigger: 'blur'
// }
// ],
weightPerBox: [{ required: true, message: '单箱重量不能为空', trigger: 'blur' }],
realStoreName: [{ required: true, message: '实际采购店铺不能为空', trigger: 'blur' }],
sendStatus: [{ required: true, message: '发货状态不能为空', trigger: 'change' }]
@ -263,6 +335,92 @@ const data = reactive<PageData<SendOrderForm, SendOrderQuery>>({
const { queryParams, form, rules } = toRefs(data);
const groups = ref([
{
boxCount: null,
itemCount: null,
lengthPerBox: null,
widthPerBox: null,
heightPerBox: null,
weightPerBox: null
}
]);
//
const totalNum = computed(() => {
return groups.value.reduce((sum, group) => {
const box = Number(group.boxCount) || 0;
const item = Number(group.itemCount) || 0;
return sum + box * item;
}, 0);
});
//
const totalBoxCount = computed(() => {
return groups.value.reduce((sum, group) => {
const box = Number(group.boxCount) || 0;
return sum + box;
}, 0);
});
const totalWeight = computed(() => {
return groups.value.reduce((sum, group) => {
const box = Number(group.boxCount) || 0;
return sum + box * group.weightPerBox;
}, 0);
});
//
const validateInput = (index, field) => {
const value = groups.value[index][field];
//
if (isNaN(value) || value < 0) {
ElMessage.warning('请输入有效的非负数');
groups.value[index][field] = null;
return false;
}
// //
// if (totalNum.value > form.value.quantitySend) {
// const exceed = totalNum.value - form.value.quantitySend;
// ElMessage.warning(` ${exceed}`);
// }
return true;
};
//
const addGroup = () => {
if (totalNum.value >= form.value.quantitySend) {
ElMessage.error(`当前总量已达${form.value.quantitySend},无法继续添加`);
return;
}
groups.value.push({
boxCount: null,
itemCount: null,
lengthPerBox: null,
widthPerBox: null,
heightPerBox: null,
weightPerBox: null
});
};
const formatText = (text) => {
if (text === null) {
return '';
}
return text.replace(/\n/g, '<br>');
};
//
const removeGroup = (index) => {
groups.value.splice(index, 1);
if (totalNum.value > form.value.quantitySend) {
ElMessage.warning('请调整剩余数值使总量不超过100');
}
};
/** 查询供应商创建的发货单列表 */
const getList = async () => {
loading.value = true;
@ -301,10 +459,10 @@ const blurAction = async () => {
return;
}
// const res = await getPurchaseOrder(form.value.orderSn);
// Object.assign(form.value, res.data);
// form.value.quantitySend = res.data.quantityReal;
// console.log('res', res);
const res = await getPurchaseOrder(form.value.orderSn);
Object.assign(form.value, res.data);
form.value.quantitySend = res.data.quantityReal;
console.log('res', res);
};
const isPOFormat = (input: string): boolean => {
@ -338,7 +496,32 @@ const handleUpdate = async (row?: SendOrderVO) => {
/** 提交按钮 */
const submitForm = () => {
form.value.weightPerBox = totalWeight.value;
form.value.boxDimensions = `${pwidth.value} x ${pheight.value} x ${plength.value}`;
const sendText = groups.value.reduce((sum, group, index) => {
return (
sum +
'规格' +
numberToLetter(index) +
': ' +
group.boxCount +
'箱' +
group.itemCount +
'件,长' +
group.lengthPerBox +
'cm宽' +
group.widthPerBox +
'cm高' +
group.heightPerBox +
'cm' +
'单箱重量' +
group.weightPerBox +
'kg' +
'\n'
);
}, '');
console.log('sendText: ', sendText);
form.value.sendDetail = sendText;
sendOrderFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
@ -354,6 +537,11 @@ const submitForm = () => {
});
};
function numberToLetter(num: number): string {
if (num < 0 || num > 25) throw new Error('数字需在 0-25 范围内');
return String.fromCharCode(num + 65);
}
/** 删除按钮操作 */
const handleDelete = async (row?: SendOrderVO) => {
const _ids = row?.id || ids.value;

View File

@ -16,21 +16,6 @@
<el-form-item label="产品名称" prop="productName">
<el-input v-model="queryParams.productName" placeholder="请输入产品名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货数量" prop="quantitySend">
<el-input v-model="queryParams.quantitySend" placeholder="请输入发货数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="单箱产品数量" prop="quantityPerBox">
<el-input v-model="queryParams.quantityPerBox" placeholder="请输入单箱产品数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="箱数" prop="boxCount">
<el-input v-model="queryParams.boxCount" placeholder="请输入箱数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="箱子尺寸" prop="boxDimensions">
<el-input v-model="queryParams.boxDimensions" placeholder="请输入箱子尺寸" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="单箱重量" prop="weightPerBox">
<el-input v-model="queryParams.weightPerBox" placeholder="请输入单箱重量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="实际采购店铺" prop="realStoreName">
<el-input v-model="queryParams.realStoreName" placeholder="请输入实际采购店铺" clearable @keyup.enter="handleQuery" />
</el-form-item>
@ -51,43 +36,70 @@
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:sendOrder:add']">新增 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:sendOrder:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:sendOrder:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:sendOrder:export']"> 导出 </el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:sendOrder:add']">新增 </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:sendOrder:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:sendOrder:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:sendOrder:export']"> 导出 </el-button>-->
<!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="sendOrderList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column type="selection" width="55" align="center" />-->
<!-- <el-table-column label="主键ID" align="center" prop="id" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="创建日期" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="发货日期" align="center" prop="sendDate" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.sendDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="采购店铺" align="center" prop="storeName" />
<el-table-column label="供应商名称" align="center" prop="sendName" />
<el-table-column label="物流商名称" align="center" prop="logisticsProviderName">
<template #default="{ row }">
<el-popover placement="top" title="物流商地址" :width="200" trigger="click">
<template #reference>
<el-button v-if="row.logisticsProviderName" text size="small" type="primary">
{{ row.logisticsProviderName }}
</el-button>
</template>
<div>{{ row.address || '暂无地址' }}</div>
</el-popover>
</template>
</el-table-column>
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="发货数量" align="center" prop="quantitySend" />
<el-table-column label="单箱产品数量" align="center" prop="quantityPerBox" />
<el-table-column label="箱数" align="center" prop="boxCount" />
<el-table-column label="箱子尺寸" align="center" prop="boxDimensions" />
<el-table-column label="单箱重量" align="center" prop="weightPerBox" />
<el-table-column label="实际采购店铺" align="center" prop="realStoreName" />
<el-table-column label="箱数" align="center" prop="boxCount">
<template #default="{ row }">
<el-popover placement="top" title="装箱明细" :width="350" trigger="click">
<template #reference>
<el-button text size="small" type="primary"> {{ row.boxCount }}</el-button>
</template>
<div v-if="row.sendDetail !== null" v-html="formatText(row.sendDetail)"></div>
<div v-else>暂无数据</div>
</el-popover>
</template>
</el-table-column>
<!-- <el-table-column label="箱子尺寸" align="center" prop="boxDimensions" />-->
<el-table-column label="总重量" align="center" prop="weightPerBox" />
<el-table-column label="实际发货店铺" align="center" prop="realStoreName" />
<el-table-column label="发货状态" align="center" prop="sendStatus">
<template #default="scope">
<dict-tag :options="send_status" :value="scope.row.sendStatus" />
@ -95,10 +107,10 @@
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:sendOrder:edit']"></el-button>
<el-tooltip content="推送" placement="top" v-if="scope.row.sendStatus === 'pending'">
<el-button circle icon="Top" @click="handleUpdate(scope.row)" v-hasRoles="['superadmin', 'gengdan']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-tooltip content="删除" placement="top" v-hasRoles="['superadmin']">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:sendOrder:remove']"></el-button>
</el-tooltip>
</template>
@ -110,43 +122,46 @@
<!-- 添加或修改供应商创建的发货单对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="sendOrderFormRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="主键ID" prop="id">
<el-input v-model="form.id" placeholder="请输入主键ID" />
</el-form-item>
<!-- <el-form-item label="主键ID" prop="id">-->
<!-- <el-input v-model="form.id" placeholder="请输入主键ID" />-->
<!-- </el-form-item>-->
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="form.orderSn" placeholder="请输入采购单号" />
</el-form-item>
<el-form-item label="发货日期" prop="sendDate">
<el-date-picker clearable v-model="form.sendDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货日期">
</el-date-picker>
<el-input v-model="form.orderSn" placeholder="请输入采购单号" disabled />
</el-form-item>
<!-- <el-form-item label="发货日期" prop="sendDate">-->
<!-- <el-date-picker clearable v-model="form.sendDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货日期" disabled>-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<el-form-item label="采购店铺" prop="storeName">
<el-input v-model="form.storeName" placeholder="请输入采购店铺" />
<el-input v-model="form.storeName" placeholder="请输入采购店铺" disabled />
</el-form-item>
<el-form-item label="产品名称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入产品名称" />
<el-input v-model="form.productName" placeholder="请输入产品名称" disabled />
</el-form-item>
<el-form-item label="发货数量" prop="quantitySend">
<el-input v-model="form.quantitySend" placeholder="请输入发货数量" />
</el-form-item>
<el-form-item label="单箱产品数量" prop="quantityPerBox">
<el-input v-model="form.quantityPerBox" placeholder="请输入单箱产品数量" />
<el-input v-model="form.quantitySend" placeholder="请输入发货数量" disabled />
</el-form-item>
<!-- <el-form-item label="单箱产品数量" prop="quantityPerBox">-->
<!-- <el-input v-model="form.quantityPerBox" placeholder="请输入单箱产品数量" disabled />-->
<!-- </el-form-item>-->
<el-form-item label="箱数" prop="boxCount">
<el-input v-model="form.boxCount" placeholder="请输入箱数" />
</el-form-item>
<el-form-item label="箱子尺寸" prop="boxDimensions">
<el-input v-model="form.boxDimensions" placeholder="请输入箱子尺寸" />
<el-input v-model="form.boxCount" placeholder="请输入箱数" disabled />
</el-form-item>
<!-- <el-form-item label="箱子尺寸" prop="boxDimensions">-->
<!-- <el-input v-model="form.boxDimensions" placeholder="请输入箱子尺寸" disabled />-->
<!-- </el-form-item>-->
<el-form-item label="单箱重量" prop="weightPerBox">
<el-input v-model="form.weightPerBox" placeholder="请输入单箱重量" />
</el-form-item>
<el-form-item label="实际采购店铺" prop="realStoreName">
<el-input v-model="form.realStoreName" placeholder="请输入实际采购店铺" />
<el-input v-model="form.weightPerBox" placeholder="请输入单箱重量" disabled />
</el-form-item>
<!-- <el-form-item label="实际采购店铺" prop="realStoreName">-->
<!-- <el-input v-model="form.realStoreName" placeholder="请输入实际采购店铺" />-->
<!-- </el-form-item>-->
<el-form-item label="发货状态" prop="sendStatus">
<el-select v-model="form.sendStatus" placeholder="请选择发货状态">
<el-option v-for="dict in send_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
<!-- <el-option v-for="dict in confirm_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>-->
<template v-for="dict in send_status" :key="dict.value">
<el-option v-if="dict.value == 'confirm'" :label="dict.label" :key="dict.value" :value="dict.value"></el-option>
</template>
</el-select>
</el-form-item>
</el-form>
@ -163,10 +178,10 @@
<script setup name="SendOrder" lang="ts">
import { listSendOrder, getSendOrder, delSendOrder, addSendOrder, updateSendOrder } from '@/api/amz/sendOrder';
import { SendOrderVO, SendOrderQuery, SendOrderForm } from '@/api/amz/sendOrder/types';
import { formatText } from '@/utils/asinkj';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { send_status } = toRefs<any>(proxy?.useDict('send_status'));
const sendOrderList = ref<SendOrderVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
@ -218,13 +233,13 @@ const data = reactive<PageData<SendOrderForm, SendOrderQuery>>({
},
rules: {
orderSn: [{ required: true, message: '采购单号不能为空', trigger: 'blur' }],
sendDate: [{ required: true, message: '发货日期不能为空', trigger: 'blur' }],
// sendDate: [{ required: true, message: '', trigger: 'blur' }],
storeName: [{ required: true, message: '采购店铺不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '发货数量不能为空', trigger: 'blur' }],
quantityPerBox: [{ required: true, message: '单箱产品数量不能为空', trigger: 'blur' }],
// quantityPerBox: [{ required: true, message: '', trigger: 'blur' }],
boxCount: [{ required: true, message: '箱数不能为空', trigger: 'blur' }],
boxDimensions: [{ required: true, message: '箱子尺寸不能为空', trigger: 'blur' }],
// boxDimensions: [{ required: true, message: '', trigger: 'blur' }],
weightPerBox: [{ required: true, message: '单箱重量不能为空', trigger: 'blur' }],
realStoreName: [{ required: true, message: '实际采购店铺不能为空', trigger: 'blur' }],
sendStatus: [{ required: true, message: '发货状态不能为空', trigger: 'change' }]
@ -238,6 +253,7 @@ const getList = async () => {
loading.value = true;
const res = await listSendOrder(queryParams.value);
sendOrderList.value = res.rows;
total.value = res.total;
loading.value = false;
};
@ -277,7 +293,7 @@ const handleSelectionChange = (selection: SendOrderVO[]) => {
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加供应商创建的发货单';
dialog.title = '更改发货数据';
};
/** 修改按钮操作 */
@ -286,8 +302,9 @@ const handleUpdate = async (row?: SendOrderVO) => {
const _id = row?.id || ids.value[0];
const res = await getSendOrder(_id);
Object.assign(form.value, res.data);
form.value.sendStatus = 'confirm';
dialog.visible = true;
dialog.title = '修改供应商创建的发货单';
dialog.title = '推送发货单';
};
/** 提交按钮 */

View File

@ -0,0 +1,355 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="120px">
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="queryParams.orderSn" placeholder="请输入采购单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货日期" prop="sendDate">
<el-date-picker clearable v-model="queryParams.sendDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择发货日期" />
</el-form-item>
<el-form-item label="采购店铺" prop="storeName">
<el-input v-model="queryParams.storeName" placeholder="请输入采购店铺" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="产品名称" prop="productName">
<el-input v-model="queryParams.productName" placeholder="请输入产品名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="实际采购店铺" prop="realStoreName">
<el-input v-model="queryParams.realStoreName" placeholder="请输入实际采购店铺" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货状态" prop="sendStatus">
<el-select v-model="queryParams.sendStatus" placeholder="请选择发货状态" clearable>
<el-option v-for="dict in send_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">-->
<!-- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:sendOrder:add']">新增 </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:sendOrder:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:sendOrder:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:sendOrder:export']"> 导出 </el-button>-->
<!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="sendOrderList" @selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" />-->
<!-- <el-table-column label="主键ID" align="center" prop="id" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="创建日期" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="发货日期" align="center" prop="sendDate" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.sendDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="采购店铺" align="center" prop="storeName" />
<el-table-column label="供应商名称" align="center" prop="sendName" />
<el-table-column label="物流商名称" align="center" prop="logisticsProviderName">
<template #default="{ row }">
<el-popover placement="top" title="物流商地址" :width="200" trigger="click">
<template #reference>
<el-button v-if="row.logisticsProviderName !== null" text size="small" type="primary">
{{ row.logisticsProviderName }}
</el-button>
</template>
<div>{{ row.address || '暂无地址' }}</div>
</el-popover>
</template>
</el-table-column>
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="发货数量" align="center" prop="quantitySend" />
<el-table-column label="箱数" align="center" prop="boxCount">
<template #default="{ row }">
<el-popover placement="top" title="装箱明细" :width="350" trigger="click">
<template #reference>
<el-button text size="small" type="primary"> {{ row.boxCount }}</el-button>
</template>
<div v-if="row.sendDetail !== null" v-html="formatText(row.sendDetail)"></div>
<div v-else>暂无数据</div>
</el-popover>
</template>
</el-table-column>
<!-- <el-table-column label="箱子尺寸" align="center" prop="boxDimensions" />-->
<el-table-column label="总重量" align="center" prop="weightPerBox" />
<el-table-column label="实际发货店铺" align="center" prop="realStoreName" />
<el-table-column label="发货状态" align="center" prop="sendStatus">
<template #default="scope">
<dict-tag :options="send_status" :value="scope.row.sendStatus" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button
v-if="scope.row.sendStatus === 'confirm'"
size="small"
link
type="primary"
@click="handleUpdate(scope.row)"
v-hasRoles="['superadmin', 'gengdan', 'yunying']"
>待创建FBA
</el-button>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:sendOrder:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改供应商创建的发货单对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="sendOrderFormRef" :model="form" :rules="rules" label-width="120px">
<!-- <el-form-item label="主键ID" prop="id">-->
<!-- <el-input v-model="form.id" placeholder="请输入主键ID" />-->
<!-- </el-form-item>-->
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="form.orderSn" placeholder="请输入采购单号" disabled />
</el-form-item>
<el-form-item label="采购店铺" prop="storeName">
<el-input v-model="form.storeName" placeholder="请输入采购店铺" disabled />
</el-form-item>
<el-form-item label="产品名称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入产品名称" disabled />
</el-form-item>
<!-- <el-form-item label="发货数量" prop="quantitySend">-->
<!-- <el-input v-model="form.quantitySend" placeholder="请输入发货数量" disabled />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="单箱产品数量" prop="quantityPerBox">-->
<!-- <el-input v-model="form.quantityPerBox" placeholder="请输入单箱产品数量" disabled />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="箱数" prop="boxCount">-->
<!-- <el-input v-model="form.boxCount" placeholder="请输入箱数" disabled />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="箱子尺寸" prop="boxDimensions">-->
<!-- <el-input v-model="form.boxDimensions" placeholder="请输入箱子尺寸" disabled />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="单箱重量" prop="weightPerBox">-->
<!-- <el-input v-model="form.weightPerBox" placeholder="请输入单箱重量" disabled />-->
<!-- </el-form-item>-->
<el-form-item label="指定发货日期" prop="sendDate">
<el-date-picker clearable v-model="form.sendDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货日期">
</el-date-picker>
</el-form-item>
<el-form-item label="实际发货店铺" prop="realStoreName">
<el-input v-model="form.realStoreName" placeholder="请输入实际采购店铺" />
</el-form-item>
<!-- <el-form-item label="发货状态" prop="sendStatus">-->
<!-- <el-select v-model="form.sendStatus" placeholder="请选择发货状态">-->
<!-- <el-option v-for="dict in send_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="SendOrder" lang="ts">
import { listSendOrder, getSendOrder, delSendOrder, addSendOrder, updateSendOrder } from '@/api/amz/sendOrder';
import { SendOrderVO, SendOrderQuery, SendOrderForm } from '@/api/amz/sendOrder/types';
import { formatText } from '@/utils/asinkj';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { send_status } = toRefs<any>(proxy?.useDict('send_status'));
const sendOrderList = ref<SendOrderVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const sendOrderFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: SendOrderForm = {
id: undefined,
orderSn: undefined,
sendDate: undefined,
storeName: undefined,
productName: undefined,
quantitySend: undefined,
quantityPerBox: undefined,
boxCount: undefined,
boxDimensions: undefined,
weightPerBox: undefined,
realStoreName: undefined,
sendStatus: undefined
};
const data = reactive<PageData<SendOrderForm, SendOrderQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
orderSn: undefined,
sendDate: undefined,
storeName: undefined,
productName: undefined,
quantitySend: undefined,
quantityPerBox: undefined,
boxCount: undefined,
boxDimensions: undefined,
weightPerBox: undefined,
realStoreName: undefined,
sendStatus: undefined,
params: {}
},
rules: {
orderSn: [{ required: true, message: '采购单号不能为空', trigger: 'blur' }],
sendDate: [{ required: true, message: '发货日期不能为空', trigger: 'blur' }],
storeName: [{ required: true, message: '采购店铺不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '发货数量不能为空', trigger: 'blur' }],
// quantityPerBox: [{ required: true, message: '', trigger: 'blur' }],
boxCount: [{ required: true, message: '箱数不能为空', trigger: 'blur' }],
boxDimensions: [{ required: true, message: '箱子尺寸不能为空', trigger: 'blur' }],
weightPerBox: [{ required: true, message: '单箱重量不能为空', trigger: 'blur' }],
realStoreName: [{ required: true, message: '实际采购店铺不能为空', trigger: 'blur' }]
// sendStatus: [{ required: true, message: '', trigger: 'change' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询供应商创建的发货单列表 */
const getList = async () => {
loading.value = true;
const res = await listSendOrder(queryParams.value);
sendOrderList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
sendOrderFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: SendOrderVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '更改发货数据';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: SendOrderVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getSendOrder(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '待创建FBA货件信息';
};
/** 提交按钮 */
const submitForm = () => {
sendOrderFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateSendOrder(form.value).finally(() => (buttonLoading.value = false));
} else {
await addSendOrder(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: SendOrderVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除供应商创建的发货单编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await delSendOrder(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'amz/sendOrder/export',
{
...queryParams.value
},
`sendOrder_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,644 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="120px">
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="queryParams.orderSn" placeholder="请输入采购单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货日期" prop="sendDate">
<el-date-picker clearable v-model="queryParams.sendDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择发货日期" />
</el-form-item>
<el-form-item label="采购店铺" prop="storeName">
<el-input v-model="queryParams.storeName" placeholder="请输入采购店铺" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="产品名称" prop="productName">
<el-input v-model="queryParams.productName" placeholder="请输入产品名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="实际采购店铺" prop="realStoreName">
<el-input v-model="queryParams.realStoreName" placeholder="请输入实际采购店铺" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货状态" prop="sendStatus">
<el-select v-model="queryParams.sendStatus" placeholder="请选择发货状态" clearable>
<el-option v-for="dict in send_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:sendOrder:add']">新增 </el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:sendOrder:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:sendOrder:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:sendOrder:export']"> 导出 </el-button>-->
<!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="sendOrderList" @selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column type="expand">
<template #default="props">
<el-card v-if="props.row.bizLogisticsOrder != null" shadow="never">
<!-- <el-table v-loading="loading" :data="props.row.items" :border="true" size="small" :header-cell-style="{ fontSize: '10px' }">-->
<!-- <el-table-column label="产品名称" align="center" prop="productName" />-->
<!-- <el-table-column label="发货数量" align="center" prop="quantitySend" />-->
<!-- <el-table-column label="单箱产品数量" align="center" prop="quantityPerBox" />-->
<!-- </el-table>-->
<el-descriptions size="small" border title="物流订单详情">
<el-descriptions-item label="物流订单号">{{ props.row.bizLogisticsOrder.orderId }} </el-descriptions-item>
<el-descriptions-item label="渠道名称">{{ props.row.bizLogisticsOrder.channelName }} </el-descriptions-item>
<el-descriptions-item label="目的地">{{ props.row.bizLogisticsOrder.destination }} </el-descriptions-item>
<el-descriptions-item label="订单状态">
<dict-tag :options="logic_order_status" :value="props.row.bizLogisticsOrder.status" />
</el-descriptions-item>
<el-descriptions-item label="物流商名称">{{ props.row.logisticsProviderName }}</el-descriptions-item>
<el-descriptions-item label="物流商地址">{{ props.row.address || '暂无地址' }}</el-descriptions-item>
<el-descriptions-item label="物流明细">
<el-button link type="primary" size="small" @click="openDetailDialog(props.row.bizLogisticsOrder.details)"> 查看详情 </el-button>
</el-descriptions-item>
<!-- <el-descriptions-item label="入库计划ID">{{ props.row.staInboundPlanId }}</el-descriptions-item>-->
<!-- <el-descriptions-item label="创建时间">{{ parseTime(props.row.gmtCreate, '{y}-{m}-{d}') }} </el-descriptions-item>-->
<!-- <el-descriptions-item label="物流商">{{ props.row.bizLogisticsOrder.logisticsProviderName }} </el-descriptions-item>-->
<!-- <el-descriptions-item label="预计到货开始日">{{ parseTime(props.row.staDeliveryStartDate, '{y}-{m}-{d}') }} </el-descriptions-item>-->
<!-- <el-descriptions-item label="预计到货截止日">{{ parseTime(props.row.staDeliveryEndDate, '{y}-{m}-{d}') }} </el-descriptions-item>-->
</el-descriptions>
</el-card>
<el-card v-else>
<el-card shadow="never"> 暂无物流信息 </el-card>
</el-card>
</template>
</el-table-column>
<el-table-column label="发货单号" align="center" prop="id" />
<el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="创建日期" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="发货日期" align="center" prop="sendDate" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.sendDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="采购店铺" align="center" prop="storeName" />
<el-table-column label="供应商名称" align="center" prop="sendName" />
<!-- <el-table-column label="物流商名称" align="center" prop="logisticsProviderName">-->
<!-- <template #default="{ row }">-->
<!-- <el-popover placement="top" title="物流商地址" :width="200" trigger="click">-->
<!-- <template #reference>-->
<!-- <el-button v-if="row.logisticsProviderName !== null" text size="small" type="primary">-->
<!-- {{ row.logisticsProviderName }}-->
<!-- </el-button>-->
<!-- </template>-->
<!-- <div>{{ row.address || '暂无地址' }}</div>-->
<!-- </el-popover>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="发货数量" align="center" prop="quantitySend" />
<!-- <el-table-column label="单箱产品数量" align="center" prop="quantityPerBox" />-->
<el-table-column label="箱数" align="center" prop="boxCount">
<template #default="{ row }">
<el-popover placement="top" title="装箱明细" :width="350" trigger="click">
<template #reference>
<el-button text size="small" type="primary"> {{ row.boxCount }}</el-button>
</template>
<div v-if="row.sendDetail !== null" v-html="formatText(row.sendDetail)"></div>
<div v-else>暂无数据</div>
</el-popover>
</template>
</el-table-column>
<!-- <el-table-column label="箱子尺寸" align="center" prop="boxDimensions" />-->
<el-table-column label="总重量" align="center" prop="weightPerBox" />
<el-table-column label="实际发货店铺" align="center" prop="realStoreName" />
<el-table-column label="发货状态" align="center" prop="sendStatus">
<template #default="scope">
<dict-tag :options="send_status" :value="scope.row.sendStatus" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top" v-if="scope.row.sendStatus === 'pending'">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:sendOrder:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:sendOrder:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改供应商创建的发货单对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="1000px" append-to-body>
<el-form ref="sendOrderFormRef" :model="form" :rules="rules" label-width="120px">
<!-- <el-form-item label="主键ID" prop="id">-->
<!-- <el-input v-model="form.id" placeholder="请输入主键ID" />-->
<!-- </el-form-item>-->
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="form.orderSn" placeholder="请输入采购单号" @blur="blurAction" />
</el-form-item>
<!-- <el-form-item label="发货日期" prop="sendDate">-->
<!-- <el-date-picker clearable v-model="form.sendDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货日期">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购店铺" prop="storeName">-->
<!-- <el-input v-model="form.storeName" placeholder="请输入采购店铺" />-->
<!-- </el-form-item>-->
<el-form-item label="产品名称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入产品名称" />
</el-form-item>
<el-form-item label="发货总数" prop="quantitySend">
<el-input v-model="form.quantitySend" placeholder="请输入发货数量" />
</el-form-item>
<el-form-item label="总箱数" prop="boxCount">
<el-input v-model="form.boxCount" placeholder="请输入总箱数" />
</el-form-item>
<el-form-item v-if="form.quantitySend > 0 && form.boxCount > 0" label="箱子明细" prop="quantityPerBox">
<div class="max-w-800px">
<div v-for="(group, index) in groups" :key="index" class="flex gap-12px mb-16px items-center">
<el-input
v-model.number="groups[index].boxCount"
placeholder="箱子数量"
type="number"
min="0"
class="flex-1"
@input="validateInput(index, 'boxCount')"
/>
X
<el-input
v-model.number="groups[index].itemCount"
placeholder="每箱个数"
type="number"
min="0"
class="flex-1"
@input="validateInput(index, 'itemCount')"
/>
<el-input v-model.number="groups[index].lengthPerBox" placeholder="长(cm)" type="number" min="0" class="flex-1" />
<el-input v-model.number="groups[index].widthPerBox" placeholder="宽(cm)" type="number" min="0" class="flex-1" />
<el-input v-model.number="groups[index].heightPerBox" placeholder="高(cm)" type="number" min="0" class="flex-1" />
<el-input v-model.number="groups[index].weightPerBox" placeholder="单箱重量(kg)" type="number" min="0" class="flex-1" />
<el-button v-if="index > 0" @click="removeGroup(index)" type="danger" :icon="Close" circle size="small" />
<div v-else class="w-8 h-8"></div>
</div>
<div class="mb-16px text-left">
<span :class="['mr-8px', Number(totalNum) === Number(shipForm.quantitySend) ? 'text-green-500' : 'text-red-500']">
当前总量{{ totalNum }}/{{ form.quantitySend }}
</span>
<el-button @click="addGroup" type="primary" :icon="Plus" :disabled="totalNum >= form.quantitySend"> 添加一组 </el-button>
</div>
</div>
</el-form-item>
<!-- <el-form-item label="箱子尺寸" prop="boxDimensions">-->
<!-- <el-input v-model="form.boxDimensions" placeholder="请输入箱子尺寸" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="箱子尺寸" prop="boxDimensions">-->
<!-- <el-row>-->
<!-- <el-col :span="8">-->
<!-- <el-input v-model="plength" placeholder="请输入长" />-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-input v-model="pwidth" placeholder="请输入宽" />-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-input v-model="pheight" placeholder="请输入高" />-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- </el-form-item>-->
<el-form-item label="总重量" prop="weightPerBox">
<!-- <el-input v-model="totalWeight" placeholder="请输入总重量" disabled />-->
<el-input-number v-model="totalWeight" :min="0" :max="100000" disabled>
<template #suffix>
<span>kg</span>
</template>
</el-input-number>
</el-form-item>
<!-- <el-form-item label="实际采购店铺" prop="realStoreName">-->
<!-- <el-input v-model="form.realStoreName" placeholder="请输入实际采购店铺" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="发货状态" prop="sendStatus">-->
<!-- <el-select v-model="form.sendStatus" placeholder="请选择发货状态">-->
<!-- <el-option v-for="dict in send_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
<el-dialog v-model="detailDialogVisible" title="货件明细" width="60%">
<el-table :data="detailTableData">
<el-table-column label="FBA货件编号" align="center" prop="fbaShipmentId" />
<el-table-column label="FBA箱号" align="center" prop="fbaBoxNumber" />
<el-table-column label="物流商名称" align="center" prop="logisticsProviderName" />
<el-table-column label="物流渠道" align="center" prop="channelName" />
<!-- <el-table-column label="物流称重" align="center" prop="logisticsWeight">-->
<!-- <template #default="scope">-->
<!-- {{ scope.row.logisticsWeight != null ? `${scope.row.logisticsWeight} kg` : '' }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="物流追踪号" align="center" prop="trackingNumber">
<template #default="scope">
<el-link type="success" :href="`https://t.17track.net/zh-cn#nums=${scope.row.trackingNumber}`" target="_blank">
{{ scope.row.trackingNumber }}
</el-link>
</template>
</el-table-column>
<el-table-column label="物流状态" align="center" prop="logisticsStatus">
<template #default="scope">
<dict-tag :options="biz_logistics_status" :value="scope.row.logisticsStatus" />
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updateTime" />
</el-table>
</el-dialog>
</div>
</template>
<script setup name="SendOrder" lang="ts">
import { listSendOrder, getSendOrder, delSendOrder, addSendOrder, updateSendOrder } from '@/api/amz/sendOrder';
import { SendOrderVO, SendOrderQuery, SendOrderForm } from '@/api/amz/sendOrder/types';
import { getPurchaseOrder } from '@/api/amz/purchaseOrder';
import { Close, Plus } from '@element-plus/icons-vue';
import { ElTable } from 'element-plus';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { send_status } = toRefs<any>(proxy?.useDict('send_status'));
const { logic_order_status } = toRefs<any>(proxy?.useDict('logic_order_status'));
const { biz_logistics_status } = toRefs<any>(proxy?.useDict('biz_logistics_status'));
const detailDialogVisible = ref(false);
const detailTableData = ref([]);
const sendOrderList = ref<SendOrderVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const plength = ref<string | number>();
const pheight = ref<string | number>();
const pwidth = ref<string | number>();
const queryFormRef = ref<ElFormInstance>();
const sendOrderFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: SendOrderForm = {
id: undefined,
orderSn: undefined,
sendDate: undefined,
storeName: undefined,
productName: undefined,
quantitySend: 0,
quantityPerBox: undefined,
boxCount: undefined,
boxDimensions: undefined,
weightPerBox: undefined,
realStoreName: undefined,
sendStatus: undefined,
sendDetail: undefined
};
const data = reactive<PageData<SendOrderForm, SendOrderQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
orderSn: undefined,
sendDate: undefined,
storeName: undefined,
productName: undefined,
quantitySend: undefined,
quantityPerBox: undefined,
boxCount: undefined,
boxDimensions: undefined,
weightPerBox: undefined,
realStoreName: undefined,
sendStatus: undefined,
params: {}
},
rules: {
orderSn: [{ required: true, message: '采购单号不能为空', trigger: 'blur' }],
// sendDate: [{ required: true, message: '', trigger: 'blur' }],
storeName: [{ required: true, message: '采购店铺不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '发货数量不能为空', trigger: 'blur' }],
quantityPerBox: [
{
validator: (rule, value, callback) => {
if (totalBoxCount.value != form.value.boxCount) {
console.log('totalBoxCount.value', totalBoxCount.value);
console.log('form.value.boxCount', form.value.boxCount);
callback(new Error('明细箱数和总箱数不匹配,请调整'));
}
//
if (totalNum.value > form.value.quantitySend) {
const exceed = totalNum.value - form.value.quantitySend;
callback(new Error('总量超出 ' + exceed + ',请调整'));
} else {
callback();
}
},
trigger: 'blur'
}
],
boxCount: [{ required: true, message: '箱数不能为空', trigger: 'blur' }],
// boxDimensions: [
// {
// required: true,
// message: '',
// validator: (rule, value, callback) => {
// if (!plength.value || !pwidth.value || !pheight.value) {
// callback(new Error(''));
// } else {
// callback();
// }
// },
// trigger: 'blur'
// }
// ],
weightPerBox: [{ required: true, message: '单箱重量不能为空', trigger: 'blur' }],
realStoreName: [{ required: true, message: '实际采购店铺不能为空', trigger: 'blur' }],
sendStatus: [{ required: true, message: '发货状态不能为空', trigger: 'change' }]
}
});
const { queryParams, form, rules } = toRefs(data);
const groups = ref([
{
boxCount: null,
itemCount: null,
lengthPerBox: null,
widthPerBox: null,
heightPerBox: null,
weightPerBox: null
}
]);
//
const totalNum = computed(() => {
return groups.value.reduce((sum, group) => {
const box = Number(group.boxCount) || 0;
const item = Number(group.itemCount) || 0;
return sum + box * item;
}, 0);
});
//
const totalBoxCount = computed(() => {
return groups.value.reduce((sum, group) => {
const box = Number(group.boxCount) || 0;
return sum + box;
}, 0);
});
const totalWeight = computed(() => {
return groups.value.reduce((sum, group) => {
const box = Number(group.boxCount) || 0;
return sum + box * group.weightPerBox;
}, 0);
});
//
const validateInput = (index, field) => {
const value = groups.value[index][field];
//
if (isNaN(value) || value < 0) {
ElMessage.warning('请输入有效的非负数');
groups.value[index][field] = null;
return false;
}
// //
// if (totalNum.value > form.value.quantitySend) {
// const exceed = totalNum.value - form.value.quantitySend;
// ElMessage.warning(` ${exceed}`);
// }
return true;
};
const openDetailDialog = (detail) => {
detailTableData.value = detail;
detailDialogVisible.value = true;
};
//
const addGroup = () => {
if (totalNum.value >= form.value.quantitySend) {
ElMessage.error(`当前总量已达${form.value.quantitySend},无法继续添加`);
return;
}
groups.value.push({
boxCount: null,
itemCount: null,
lengthPerBox: null,
widthPerBox: null,
heightPerBox: null,
weightPerBox: null
});
};
const formatText = (text) => {
if (text === null) {
return '';
}
return text.replace(/\n/g, '<br>');
};
//
const removeGroup = (index) => {
groups.value.splice(index, 1);
if (totalNum.value > form.value.quantitySend) {
ElMessage.warning('请调整剩余数值使总量不超过100');
}
};
/** 查询供应商创建的发货单列表 */
const getList = async () => {
loading.value = true;
const res = await listSendOrder(queryParams.value);
sendOrderList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
sendOrderFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
const blurAction = async () => {
if (!isPOFormat(form.value.orderSn)) {
return;
}
const res = await getPurchaseOrder(form.value.orderSn);
Object.assign(form.value, res.data);
form.value.quantitySend = res.data.quantityReal;
console.log('res', res);
};
const isPOFormat = (input: string): boolean => {
const poRegex = /^PO\d+$/;
return poRegex.test(input);
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: SendOrderVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加供应商创建的发货单';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: SendOrderVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getSendOrder(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改供应商创建的发货单';
};
/** 提交按钮 */
const submitForm = () => {
form.value.weightPerBox = totalWeight.value;
form.value.boxDimensions = `${pwidth.value} x ${pheight.value} x ${plength.value}`;
const sendText = groups.value.reduce((sum, group, index) => {
return (
sum +
'规格' +
numberToLetter(index) +
': ' +
group.boxCount +
'箱' +
group.itemCount +
'件,长' +
group.lengthPerBox +
'cm宽' +
group.widthPerBox +
'cm高' +
group.heightPerBox +
'cm' +
'单箱重量' +
group.weightPerBox +
'kg' +
'\n'
);
}, '');
console.log('sendText: ', sendText);
form.value.sendDetail = sendText;
sendOrderFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateSendOrder(form.value).finally(() => (buttonLoading.value = false));
} else {
await addSendOrder(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
function numberToLetter(num: number): string {
if (num < 0 || num > 25) throw new Error('数字需在 0-25 范围内');
return String.fromCharCode(num + 65);
}
/** 删除按钮操作 */
const handleDelete = async (row?: SendOrderVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除供应商创建的发货单编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await delSendOrder(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'amz/sendOrder/export',
{
...queryParams.value
},
`sendOrder_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>

View File

@ -10,33 +10,33 @@
<el-form-item label="店铺名称" prop="storeName">
<el-input v-model="queryParams.storeName" placeholder="请输入采购店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="sku" prop="sku">
<el-form-item label="SKU" prop="sku">
<el-input v-model="queryParams.sku" placeholder="请输入产品唯一标识码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="产品全称" prop="productName">
<el-input v-model="queryParams.productName" placeholder="请输入产品全称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="实际发货数量" prop="quantitySend">
<el-input v-model="queryParams.quantitySend" placeholder="请输入实际发货数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="发货数量" prop="quantitySend">-->
<!-- <el-input v-model="queryParams.quantitySend" placeholder="请输入发货数量" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="发货方" prop="outSupplierName">
<el-input v-model="queryParams.outSupplierName" placeholder="请输入发货供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货方ID" prop="outSupplierId">
<el-input v-model="queryParams.outSupplierId" placeholder="请输入发货供应商系统ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="发货方ID" prop="outSupplierId">-->
<!-- <el-input v-model="queryParams.outSupplierId" placeholder="请输入发货供应商系统ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="收货方" prop="inSupplierName">
<el-input v-model="queryParams.inSupplierName" placeholder="请输入收货供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收货方ID" prop="inSupplierId">
<el-input v-model="queryParams.inSupplierId" placeholder="请输入收货供应商系统ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="收货方ID" prop="inSupplierId">-->
<!-- <el-input v-model="queryParams.inSupplierId" placeholder="请输入收货供应商系统ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="跟单姓名" prop="trackerName">
<el-input v-model="queryParams.trackerName" placeholder="请输入跟单人" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="跟单ID" prop="trackerId">
<el-input v-model="queryParams.trackerId" placeholder="请输入跟单id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="跟单ID" prop="trackerId">-->
<!-- <el-input v-model="queryParams.trackerId" placeholder="请输入跟单id" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="发货时间" prop="sendTime">
<el-date-picker clearable v-model="queryParams.sendTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择发货时间" />
</el-form-item>
@ -52,48 +52,49 @@
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:shipForward:add']">新增 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:shipForward:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:shipForward:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:shipForward:export']">导出 </el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:shipForward:add']">新增 </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:shipForward:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:shipForward:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:shipForward:export']">导出 </el-button>-->
<!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="shipForwardList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="采购店铺名称" align="center" prop="storeName" />
<el-table-column label="SKU" align="center" prop="sku" />
<el-table-column label="产品全称" align="center" prop="productName" />
<el-table-column label="实际发货数量" align="center" prop="quantitySend" />
<el-table-column label="发货数量" align="center" prop="quantitySend" />
<el-table-column label="发货箱数" align="center" prop="boxNum" />
<el-table-column label="发货方" align="center" prop="outSupplierName" />
<!-- <el-table-column label="发货供应商系统ID" align="center" prop="outSupplierId" />-->
<el-table-column label="收货方" align="center" prop="inSupplierName" />
<!-- <el-table-column label="收货供应商系统ID" align="center" prop="inSupplierId" />-->
<el-table-column label="计划发货起始时间" align="center" prop="shipmentStart" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.shipmentStart, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="计划发货截止时间" align="center" prop="shipmentEnd" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.shipmentEnd, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="计划发货起始时间" align="center" prop="shipmentStart" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.shipmentStart, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="计划发货截止时间" align="center" prop="shipmentEnd" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.shipmentEnd, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="跟单人" align="center" prop="trackerName" />
<!-- <el-table-column label="跟单id" align="center" prop="trackerId" />-->
<el-table-column label="转发状态" align="center" prop="fwdStatus">
@ -106,16 +107,19 @@
<span>{{ parseTime(scope.row.sendTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:shipForward:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:shipForward:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="发货箱数" align="center" prop="boxNum" />
<el-table-column label="预计到达" align="center" prop="expDeliveryDate" width="180" />
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
<!-- <template #default="scope">-->
<!-- <el-tooltip content="修改" placement="top">-->
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:shipForward:edit']"></el-button>-->
<!-- </el-tooltip>-->
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:shipForward:remove']"></el-button>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
@ -136,20 +140,23 @@
<el-input v-model="form.productName" placeholder="请输入产品全称" />
</el-form-item>
<el-form-item label="发货数量" prop="quantitySend">
<el-input v-model="form.quantitySend" placeholder="请输入实际发货数量" />
<el-input v-model="form.quantitySend" placeholder="请输入发货数量" />
</el-form-item>
<el-form-item label="发货箱数" prop="quantitySend">
<el-input v-model="form.boxNum" placeholder="请输入发货箱数" disabled />
</el-form-item>
<el-form-item label="发货方" prop="outSupplierName">
<el-input v-model="form.outSupplierName" placeholder="请输入发货供应商名称" />
</el-form-item>
<el-form-item label="发货方ID" prop="outSupplierId">
<el-input v-model="form.outSupplierId" placeholder="请输入发货供应商系统ID" />
</el-form-item>
<!-- <el-form-item label="发货方ID" prop="outSupplierId">-->
<!-- <el-input v-model="form.outSupplierId" placeholder="请输入发货供应商系统ID" />-->
<!-- </el-form-item>-->
<el-form-item label="收货方" prop="inSupplierName">
<el-input v-model="form.inSupplierName" placeholder="请输入收货供应商名称" />
</el-form-item>
<el-form-item label="收货方ID" prop="inSupplierId">
<el-input v-model="form.inSupplierId" placeholder="请输入收货供应商系统ID" />
</el-form-item>
<!-- <el-form-item label="收货方ID" prop="inSupplierId">-->
<!-- <el-input v-model="form.inSupplierId" placeholder="请输入收货供应商系统ID" />-->
<!-- </el-form-item>-->
<el-form-item label="发货区间" prop="shipmentStart">
<el-date-picker
v-model="intervalDate"
@ -164,9 +171,9 @@
<el-form-item label="跟单人" prop="trackerName">
<el-input v-model="form.trackerName" placeholder="请输入跟单人" />
</el-form-item>
<el-form-item label="跟单id" prop="trackerId">
<el-input v-model="form.trackerId" placeholder="请输入跟单id" />
</el-form-item>
<!-- <el-form-item label="跟单id" prop="trackerId">-->
<!-- <el-input v-model="form.trackerId" placeholder="请输入跟单id" />-->
<!-- </el-form-item>-->
<el-form-item label="发货时间" prop="sendTime">
<el-date-picker clearable v-model="form.sendTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货时间">
</el-date-picker>
@ -389,7 +396,7 @@ const data = reactive<PageData<ShipForwardForm, ShipForwardQuery>>({
storeName: [{ required: true, message: '采购店铺名称不能为空', trigger: 'blur' }],
sku: [{ required: true, message: '产品唯一标识码不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品全称不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '实际发货数量不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '发货数量不能为空', trigger: 'blur' }],
outSupplierName: [{ required: true, message: '发货供应商名称不能为空', trigger: 'blur' }],
outSupplierId: [{ required: true, message: '发货供应商系统ID不能为空', trigger: 'blur' }],
inSupplierName: [{ required: true, message: '收货供应商名称不能为空', trigger: 'blur' }],

View File

@ -10,33 +10,33 @@
<el-form-item label="店铺名称" prop="storeName">
<el-input v-model="queryParams.storeName" placeholder="请输入采购店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="sku" prop="sku">
<el-form-item label="SKU" prop="sku">
<el-input v-model="queryParams.sku" placeholder="请输入产品唯一标识码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="产品全称" prop="productName">
<el-input v-model="queryParams.productName" placeholder="请输入产品全称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="实际发货数量" prop="quantitySend">
<el-input v-model="queryParams.quantitySend" placeholder="请输入实际发货数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="发货数量" prop="quantitySend">-->
<!-- <el-input v-model="queryParams.quantitySend" placeholder="请输入发货数量" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="发货方" prop="outSupplierName">
<el-input v-model="queryParams.outSupplierName" placeholder="请输入发货供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货方ID" prop="outSupplierId">
<el-input v-model="queryParams.outSupplierId" placeholder="请输入发货供应商系统ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="发货方ID" prop="outSupplierId">-->
<!-- <el-input v-model="queryParams.outSupplierId" placeholder="请输入发货供应商系统ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="收货方" prop="inSupplierName">
<el-input v-model="queryParams.inSupplierName" placeholder="请输入收货供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收货方ID" prop="inSupplierId">
<el-input v-model="queryParams.inSupplierId" placeholder="请输入收货供应商系统ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="收货方ID" prop="inSupplierId">-->
<!-- <el-input v-model="queryParams.inSupplierId" placeholder="请输入收货供应商系统ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="跟单姓名" prop="trackerName">
<el-input v-model="queryParams.trackerName" placeholder="请输入跟单人" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="跟单ID" prop="trackerId">
<el-input v-model="queryParams.trackerId" placeholder="请输入跟单id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="跟单ID" prop="trackerId">-->
<!-- <el-input v-model="queryParams.trackerId" placeholder="请输入跟单id" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="发货时间" prop="sendTime">
<el-date-picker clearable v-model="queryParams.sendTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择发货时间" />
</el-form-item>
@ -52,48 +52,50 @@
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:shipForward:add']">新增 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:shipForward:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:shipForward:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:shipForward:export']">导出 </el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:shipForward:add']">新增 </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:shipForward:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:shipForward:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:shipForward:export']">导出 </el-button>-->
<!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="shipForwardList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="采购店铺名称" align="center" prop="storeName" />
<el-table-column label="SKU" align="center" prop="sku" />
<el-table-column label="产品全称" align="center" prop="productName" />
<el-table-column label="实际发货数量" align="center" prop="quantitySend" />
<el-table-column label="发货数量" align="center" prop="quantitySend" />
<el-table-column label="发货箱数" align="center" prop="boxNum" />
<el-table-column label="发货方" align="center" prop="outSupplierName" />
<!-- <el-table-column label="发货供应商系统ID" align="center" prop="outSupplierId" />-->
<el-table-column label="收货方" align="center" prop="inSupplierName" />
<!-- <el-table-column label="收货供应商系统ID" align="center" prop="inSupplierId" />-->
<el-table-column label="计划发货起始时间" align="center" prop="shipmentStart" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.shipmentStart, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="计划发货截止时间" align="center" prop="shipmentEnd" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.shipmentEnd, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="计划发货起始时间" align="center" prop="shipmentStart" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.shipmentStart, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="计划发货截止时间" align="center" prop="shipmentEnd" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.shipmentEnd, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="跟单人" align="center" prop="trackerName" />
<!-- <el-table-column label="跟单id" align="center" prop="trackerId" />-->
<el-table-column label="转发状态" align="center" prop="fwdStatus">
@ -106,18 +108,11 @@
<span>{{ parseTime(scope.row.sendTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="预计到达" align="center" prop="expDeliveryDate" width="180" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button
link
type="primary"
icon="Edit"
@click="handleUpdate(scope.row)"
v-hasRoles="['superadmin']"
v-hasPermi="['amz:shipForward:edit']"
></el-button>
</el-tooltip>
<el-button text bg type="primary" size="small" @click="handleUpdate(scope.row)" v-hasRoles="['superadmin']"> 修改 </el-button>
<el-tooltip content="删除" placement="top">
<el-button
link
@ -129,9 +124,7 @@
></el-button>
</el-tooltip>
<el-button link type="primary" @click="handleReceive(scope.row)" v-hasRoles="['superadmin']" v-hasPermi="['amz:shipForward:remove']"
>确认收货
</el-button>
<el-button size="small" type="primary" @click="handleReceive(scope.row)" v-hasRoles="['superadmin', 'gongying']" text> </el-button>
</template>
</el-table-column>
</el-table>
@ -154,7 +147,10 @@
<el-input v-model="form.productName" placeholder="请输入产品全称" disabled />
</el-form-item>
<el-form-item label="发货数量" prop="quantitySend">
<el-input v-model="form.quantitySend" placeholder="请输入实际发货数量" disabled />
<el-input v-model="form.quantitySend" placeholder="请输入发货数量" disabled />
</el-form-item>
<el-form-item label="发货箱数" prop="quantitySend">
<el-input v-model="form.boxNum" placeholder="请输入发货箱数" disabled />
</el-form-item>
<el-form-item label="发货方" prop="outSupplierName">
<el-input v-model="form.outSupplierName" placeholder="请输入发货供应商名称" disabled />
@ -191,10 +187,10 @@
<!-- <el-form-item label="跟单id" prop="trackerId">-->
<!-- <el-input v-model="form.trackerId" placeholder="请输入跟单id" disabled/>-->
<!-- </el-form-item>-->
<el-form-item label="发货时间" prop="sendTime">
<el-date-picker clearable v-model="form.sendTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货时间" disabled>
</el-date-picker>
</el-form-item>
<!-- <el-form-item label="发货时间" prop="sendTime">-->
<!-- <el-date-picker clearable v-model="form.sendTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货时间" disabled>-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
</el-form>
<template #footer>
<div class="dialog-footer">
@ -412,7 +408,7 @@ const data = reactive<PageData<ShipForwardForm, ShipForwardQuery>>({
storeName: [{ required: true, message: '采购店铺名称不能为空', trigger: 'blur' }],
sku: [{ required: true, message: '产品唯一标识码不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品全称不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '实际发货数量不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '发货数量不能为空', trigger: 'blur' }],
outSupplierName: [{ required: true, message: '发货供应商名称不能为空', trigger: 'blur' }],
outSupplierId: [{ required: true, message: '发货供应商系统ID不能为空', trigger: 'blur' }],
inSupplierName: [{ required: true, message: '收货供应商名称不能为空', trigger: 'blur' }],
@ -570,7 +566,7 @@ const handleUpdate = async (row?: ShipForwardVO) => {
const res = await getShipForward(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改货件转发';
dialog.title = '确认收货';
};
/** 提交按钮 */

View File

@ -10,33 +10,33 @@
<el-form-item label="店铺名称" prop="storeName">
<el-input v-model="queryParams.storeName" placeholder="请输入采购店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="sku" prop="sku">
<el-form-item label="SKU" prop="sku">
<el-input v-model="queryParams.sku" placeholder="请输入产品唯一标识码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="产品全称" prop="productName">
<el-input v-model="queryParams.productName" placeholder="请输入产品全称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="实际发货数量" prop="quantitySend">
<el-input v-model="queryParams.quantitySend" placeholder="请输入实际发货数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="发货数量" prop="quantitySend">-->
<!-- <el-input v-model="queryParams.quantitySend" placeholder="请输入发货数量" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="发货方" prop="outSupplierName">
<el-input v-model="queryParams.outSupplierName" placeholder="请输入发货供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货方ID" prop="outSupplierId">
<el-input v-model="queryParams.outSupplierId" placeholder="请输入发货供应商系统ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="发货方ID" prop="outSupplierId">-->
<!-- <el-input v-model="queryParams.outSupplierId" placeholder="请输入发货供应商系统ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="收货方" prop="inSupplierName">
<el-input v-model="queryParams.inSupplierName" placeholder="请输入收货供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收货方ID" prop="inSupplierId">
<el-input v-model="queryParams.inSupplierId" placeholder="请输入收货供应商系统ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="收货方ID" prop="inSupplierId">-->
<!-- <el-input v-model="queryParams.inSupplierId" placeholder="请输入收货供应商系统ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="跟单姓名" prop="trackerName">
<el-input v-model="queryParams.trackerName" placeholder="请输入跟单人" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="跟单ID" prop="trackerId">
<el-input v-model="queryParams.trackerId" placeholder="请输入跟单id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="跟单ID" prop="trackerId">-->
<!-- <el-input v-model="queryParams.trackerId" placeholder="请输入跟单id" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="发货时间" prop="sendTime">
<el-date-picker clearable v-model="queryParams.sendTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择发货时间" />
</el-form-item>
@ -52,48 +52,50 @@
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:shipForward:add']">新增 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:shipForward:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:shipForward:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:shipForward:export']">导出 </el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:shipForward:add']">新增 </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:shipForward:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:shipForward:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:shipForward:export']">导出 </el-button>-->
<!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="shipForwardList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="采购店铺名称" align="center" prop="storeName" />
<el-table-column label="SKU" align="center" prop="sku" />
<el-table-column label="产品全称" align="center" prop="productName" />
<el-table-column label="实际发货数量" align="center" prop="quantitySend" />
<el-table-column label="发货数量" align="center" prop="quantitySend" />
<el-table-column label="发货箱数" align="center" prop="boxNum" />
<!-- <el-table-column label="发货供应商名称" align="center" prop="outSupplierName" />-->
<!-- <el-table-column label="发货供应商系统ID" align="center" prop="outSupplierId" />-->
<el-table-column label="收货方" align="center" prop="inSupplierName" />
<!-- <el-table-column label="收货供应商系统ID" align="center" prop="inSupplierId" />-->
<el-table-column label="计划发货起始时间" align="center" prop="shipmentStart" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.shipmentStart, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="计划发货截止时间" align="center" prop="shipmentEnd" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.shipmentEnd, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="计划发货起始时间" align="center" prop="shipmentStart" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.shipmentStart, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="计划发货截止时间" align="center" prop="shipmentEnd" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.shipmentEnd, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="跟单人" align="center" prop="trackerName" />
<!-- <el-table-column label="跟单id" align="center" prop="trackerId" />-->
<el-table-column label="转发状态" align="center" prop="fwdStatus">
@ -106,9 +108,10 @@
<span>{{ parseTime(scope.row.sendTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="预计到达" align="center" prop="expDeliveryDate" width="180" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:shipForward:edit']">发货 </el-button>
<el-button link type="primary" @click="handleUpdate(scope.row)" v-hasRoles="['superadmin', 'gongying']"> 发货 </el-button>
<el-tooltip content="删除" placement="top">
<el-button
@ -173,16 +176,34 @@
<!-- <el-input v-model="form.trackerId" placeholder="请输入跟单id" />-->
<!-- </el-form-item>-->
<el-form-item label="发货数量" prop="quantitySend">
<el-input v-model="form.quantitySend" placeholder="请输入实际发货数量" disabled />
<el-input v-model="form.quantitySend" placeholder="请输入发货数量" disabled />
</el-form-item>
<el-form-item label="发货箱数" prop="quantitySend">
<el-input v-model="form.boxNum" placeholder="请输入发货箱数" disabled />
</el-form-item>
<el-form-item label="发货时间" prop="sendTime">
<el-date-picker clearable v-model="form.sendTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货时间" disabled>
</el-date-picker>
</el-form-item>
<el-form-item label="预计到达时间" prop="expDeliveryDate">
<el-date-picker
clearable
v-model="form.expDeliveryDate"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请设置预计到达时间"
>
</el-date-picker>
</el-form-item>
<el-form-item label="发货箱数" prop="boxNum">
<!-- <el-input v-model="form.boxNum" placeholder="请输入发货数量" />-->
<el-input-number v-model="form.boxNum" :min="1" :max="10" controls-position="right" size="default" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">开始转发货物</el-button>
<el-button :loading="buttonLoading" type="primary" @click="sendUpdateShipForwardForm">开始转发货物</el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
@ -317,7 +338,7 @@
</template>
<script setup name="ShipForward" lang="ts">
import { listShipForward, getShipForward, delShipForward, addShipForward, updateShipForward } from '@/api/amz/shipForward';
import { listShipForward, getShipForward, delShipForward, addShipForward, updateShipForward, sendUpdateShipForward } from '@/api/amz/shipForward';
import { ShipForwardVO, ShipForwardQuery, ShipForwardForm } from '@/api/amz/shipForward/types';
import { listPurchaseOrder } from '@/api/amz/purchaseOrder';
import { PurchaseOrderVO } from '@/api/amz/purchaseOrder/types';
@ -365,7 +386,9 @@ const initFormData: ShipForwardForm = {
trackerName: undefined,
trackerId: undefined,
fwdStatus: undefined,
sendTime: undefined
sendTime: undefined,
expDeliveryDate: undefined,
boxNum: undefined
};
const data = reactive<PageData<ShipForwardForm, ShipForwardQuery>>({
form: { ...initFormData },
@ -396,7 +419,7 @@ const data = reactive<PageData<ShipForwardForm, ShipForwardQuery>>({
storeName: [{ required: true, message: '采购店铺名称不能为空', trigger: 'blur' }],
sku: [{ required: true, message: '产品唯一标识码不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品全称不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '实际发货数量不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '发货数量不能为空', trigger: 'blur' }],
outSupplierName: [{ required: true, message: '发货供应商名称不能为空', trigger: 'blur' }],
outSupplierId: [{ required: true, message: '发货供应商系统ID不能为空', trigger: 'blur' }],
inSupplierName: [{ required: true, message: '收货供应商名称不能为空', trigger: 'blur' }],
@ -579,6 +602,23 @@ const submitForm = () => {
});
};
const sendUpdateShipForwardForm = () => {
form.value.fwdStatus = 'processing';
shipForwardFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await sendUpdateShipForward(form.value).finally(() => (buttonLoading.value = false));
} else {
await addShipForward(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: ShipForwardVO) => {
const _ids = row?.id || ids.value;

View File

@ -29,9 +29,9 @@
<el-form-item label="创建时间" prop="gmtCreate">
<el-date-picker clearable v-model="queryParams.gmtCreate" type="date" value-format="YYYY-MM-DD" placeholder="请选择创建时间" />
</el-form-item>
<el-form-item label="同步时间" prop="syncTime">
<el-date-picker clearable v-model="queryParams.syncTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择同步时间" />
</el-form-item>
<!-- <el-form-item label="同步时间" prop="syncTime">-->
<!-- <el-date-picker clearable v-model="queryParams.syncTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择同步时间" />-->
<!-- </el-form-item>-->
<el-form-item label="计划发货日期" prop="staShipmentDate">
<el-date-picker
clearable

View File

@ -13,6 +13,9 @@
<el-form-item label="物流中心编码" prop="destination">
<el-input v-model="queryParams.destination" placeholder="请输入物流中心编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="店铺名称" prop="sellerName">
<el-input v-model="queryParams.sellerName" placeholder="请输入店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="创建日期" prop="deadline">
<el-date-picker clearable v-model="queryParams.gmtCreate" type="date" value-format="YYYY-MM-DD" placeholder="请选择创建日期" />
</el-form-item>
@ -81,8 +84,8 @@
<!-- <el-descriptions-item label="运输方案">{{ props.row.shippingSolution }}</el-descriptions-item>-->
<!-- <el-descriptions-item label="入库计划ID">{{ props.row.staInboundPlanId }}</el-descriptions-item>-->
<el-descriptions-item label="创建时间">{{ parseTime(props.row.gmtCreate, '{y}-{m}-{d}') }} </el-descriptions-item>
<!-- <el-descriptions-item label="计划发货日期">{{ parseTime(props.row.staShipmentDate, '{y}-{m}-{d}') }} </el-descriptions-item>-->
<!-- <el-descriptions-item label="创建时间">{{ parseTime(props.row.gmtCreate, '{y}-{m}-{d}') }} </el-descriptions-item>-->
<el-descriptions-item label="计划发货日期">{{ parseTime(props.row.staShipmentDate, '{y}-{m}-{d}') }} </el-descriptions-item>
<!-- <el-descriptions-item label="预计到货开始日">{{ parseTime(props.row.staDeliveryStartDate, '{y}-{m}-{d}') }} </el-descriptions-item>-->
<!-- <el-descriptions-item label="预计到货截止日">{{ parseTime(props.row.staDeliveryEndDate, '{y}-{m}-{d}') }} </el-descriptions-item>-->
</el-descriptions>
@ -91,7 +94,7 @@
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="创建日期" align="center" prop="gmtCreate" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.staShipmentDate, '{y}-{m}-{d}') }}</span>
<span>{{ parseTime(scope.row.gmtCreate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="店铺名称" align="center" prop="sellerName" />
@ -100,7 +103,7 @@
<template #default="scope">
<el-popover placement="top" :width="750" trigger="hover" @show="showPop(scope.row)">
<template #reference>
<el-button style="margin-right: 16px">查看</el-button>
<el-button size="small" plain style="margin-right: 16px">查看</el-button>
</template>
<el-table :data="scope.row.itemVoList">
<el-table-column width="200" property="productName" label="品名" />
@ -123,15 +126,56 @@
<!-- </RouterLink>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="总箱子数量" align="center" prop="boxQuantity" />
<el-table-column label="箱子尺寸" align="center" prop="boxSize" />
<el-table-column label="供应商称重-总重量" align="center" prop="vendorWeight" />
<el-table-column label="套数" align="center" prop="setTotal" />
<!-- <el-table-column label="总箱子数量" align="center" prop="boxQuantity" />-->
<!-- <el-table-column label="箱子尺寸" align="center" prop="boxSize" />-->
<!-- <el-table-column label="供应商称重-总重量" align="center" prop="vendorWeight" />-->
<!-- <el-table-column label="套数" align="center" prop="setTotal" />-->
<el-table-column label="关联采购单" align="center" prop="sendOrderId">
<template #default="scope">
<el-popover v-if="scope.row.sendOrderId" placement="top" :width="800" trigger="click">
<template #reference>
<!-- <el-button style="margin-right: 16px">Click to activate</el-button>-->
<el-button size="small" plain v-if="scope.row.sendOrderId" type="success"> 已关联</el-button>
</template>
<el-descriptions v-if="scope.row.sendOrderId" title="供应商发货单" border :column="2" label-class-name="desc-label">
<!-- 订单信息 -->
<el-descriptions-item label="订单编号" min-width="120px">
{{ scope.row.sendOrder.orderSn }}
</el-descriptions-item>
<el-descriptions-item label="产品名称">
{{ scope.row.sendOrder.productName }}
</el-descriptions-item>
<el-descriptions-item label="总箱数"> {{ scope.row.sendOrder.boxCount }} </el-descriptions-item>
<el-descriptions-item label="总重量"> {{ scope.row.sendOrder.weightPerBox }} kg</el-descriptions-item>
<el-descriptions-item label="箱体规格"> {{ scope.row.sendOrder.sendDetail }}</el-descriptions-item>
<!-- <el-descriptions-item label="每箱数量"> {{ scope.row.sendOrder.quantityPerBox }} / </el-descriptions-item>-->
</el-descriptions>
</el-popover>
<el-tooltip class="box-item" effect="dark" content="点击关联采购单" placement="top">
<el-button size="small" plain v-if="!scope.row.sendOrderId" type="info" @click="handleLink(scope.row)"> 未关联 </el-button>
</el-tooltip>
</template>
</el-table-column>
<!-- <el-table-column label="渠道ID" align="center" prop="channelId" />-->
<el-table-column width="150" label="仓库配送地址" align="center" prop="shipToAddress">
<template #default="{ row }">
<el-button @click="openAddressDialog(row.shipToAddress)"> 查看详情</el-button>
<!-- <el-button @click="openAddressDialog(row.shipToAddress)"> 查看详情</el-button>-->
<el-popover placement="left" :width="800" trigger="click">
<template #reference>
<!-- <el-button style="margin-right: 16px">Click to activate</el-button>-->
<el-button plain size="small" type="success"> 点击查看详情</el-button>
</template>
<el-descriptions title="收货地址信息" :column="3" border>
<el-descriptions-item v-for="item in descriptItems" :key="item.prop" :label="item.label">
{{ row.shipToAddress[item.prop] || 'N/A' }}
</el-descriptions-item>
</el-descriptions>
</el-popover>
</template>
</el-table-column>
<el-table-column label="亚马逊货件状态" align="center" width="180">
@ -143,9 +187,19 @@
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-tooltip content="向物流商询价" placement="top">
<el-button link type="primary" size="small" @click="handleUpdate(scope.row)" v-hasPermi="['amz:shipmentPlan:edit']"> </el-button>
</el-tooltip>
<el-tooltip content="关联采购单" placement="top">
<el-button
link
type="primary"
icon="Link"
size="small"
@click="handleLink(scope.row)"
v-hasPermi="['amz:shipmentPlan:edit']"
></el-button>
</el-tooltip>
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:shipmentPlan:remove']"></el-button>-->
<!-- </el-tooltip>-->
@ -172,6 +226,10 @@
<el-form-item label="物流中心编码" prop="destination">
<el-input v-model="form.destination" placeholder="请输入物流中心编码" disabled />
</el-form-item>
<el-form-item label="是否报关" prop="destination">
<el-switch v-model="customsFlag" active-value="1" inactive-value="0" />
</el-form-item>
<el-form-item label="物流渠道">
<el-cascader
ref="channelCascaderRef"
@ -184,28 +242,28 @@
filterable
/>
</el-form-item>
<el-form-item label="总箱子数量" prop="boxQuantity">
<el-input v-model="form.boxQuantity" placeholder="请输入总箱子数量" />
</el-form-item>
<el-form-item label="箱子尺寸" prop="boxSize">
<el-row>
<el-col :span="8">
<el-input v-model="plength" placeholder="请输入长" />
</el-col>
<el-col :span="8">
<el-input v-model="pwidth" placeholder="请输入宽" />
</el-col>
<el-col :span="8">
<el-input v-model="pheight" placeholder="请输入高" />
</el-col>
</el-row>
</el-form-item>
<el-form-item label="供应商称重-总重量" prop="vendorWeight">
<el-input v-model="form.vendorWeight" placeholder="请输入供应商称重-总重量" />
</el-form-item>
<el-form-item label="套数" prop="setTotal">
<el-input v-model="form.setTotal" placeholder="请输入套数" />
</el-form-item>
<!-- <el-form-item label="总箱子数量" prop="boxQuantity">-->
<!-- <el-input v-model="form.boxQuantity" placeholder="请输入总箱子数量" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="箱子尺寸" prop="boxSize">-->
<!-- <el-row>-->
<!-- <el-col :span="8">-->
<!-- <el-input v-model="plength" placeholder="请输入长" />-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-input v-model="pwidth" placeholder="请输入宽" />-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-input v-model="pheight" placeholder="请输入高" />-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="供应商称重-总重量" prop="vendorWeight">-->
<!-- <el-input v-model="form.vendorWeight" placeholder="请输入供应商称重-总重量" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="套数" prop="setTotal">-->
<!-- <el-input v-model="form.setTotal" placeholder="请输入套数" />-->
<!-- </el-form-item>-->
</el-form>
<template #footer>
<div class="dialog-footer">
@ -223,10 +281,10 @@
</el-dialog>
<el-dialog v-model="channelDialogVisible" title="批量提交询价" width="60%">
<el-form-item label="日期">
<el-date-picker v-model="shipDate" disabled type="date" placeholder="选择指定日期" value-format="YYYY-MM-DD" />
</el-form-item>
<el-form :model="form" label-width="auto" style="max-width: 600px">
<el-form-item label="日期">
<el-date-picker v-model="shipDate" disabled type="date" placeholder="选择指定日期" value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item label="渠道选择">
<el-cascader
v-model="selectedChannel"
@ -238,6 +296,9 @@
filterable
/>
</el-form-item>
<el-form-item label="是否报关" prop="destination">
<el-switch v-model="customsFlag" active-value="1" inactive-value="0" />
</el-form-item>
<el-button :loading="buttonLoading" type="primary" @click="batchSendRest()">批量提交询价</el-button>
</el-form>
@ -292,6 +353,41 @@
</el-table>
</el-dialog>
<el-dialog v-model="orderTableVisible.visible" title="选择需要关联的采购单" width="1800">
<el-table v-loading="loading" :data="sendOrderList">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="主键ID" align="center" prop="id" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="发货日期" align="center" prop="sendDate" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.sendDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="采购店铺" align="center" prop="storeName" />
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="发货数量" align="center" prop="quantitySend" />
<!-- <el-table-column label="单箱产品数量" align="center" prop="quantityPerBox" />-->
<el-table-column label="箱数" align="center" prop="boxCount" />
<!-- <el-table-column label="箱子尺寸" align="center" prop="boxDimensions" />-->
<el-table-column label="总重量" align="center" prop="weightPerBox" />
<el-table-column label="实际采购店铺" align="center" prop="realStoreName" />
<el-table-column label="发货状态" align="center" prop="sendStatus">
<template #default="scope">
<dict-tag :options="send_status" :value="scope.row.sendStatus" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" size="small" @click="handleLinkOrder(scope.row)">关联采购单</el-button>
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:sendOrder:remove']"></el-button>-->
<!-- </el-tooltip>-->
</template>
</el-table-column>
</el-table>
</el-dialog>
<el-drawer size="60%" v-model="drawer" :direction="direction">
<template #header>
<h4>物流商报价</h4>
@ -340,7 +436,8 @@ import {
delShipmentPlan,
addShipmentPlan,
updateShipmentPlan,
takeTodayAmzPlanData
takeTodayAmzPlanData,
linkShipmentPlan
} from '@/api/amz/shipmentPlan';
import { listAllLogisticsChannel } from '@/api/amz/logisticsChannel';
import type { DrawerProps } from 'element-plus';
@ -348,16 +445,21 @@ import { createBatch, createWithDesAndChannel, queryWithDesAndChannel } from '@/
import { queryLogisticsQuote } from '@/api/amz/logisticsQuote';
import { ShipmentPlanVO, ShipmentPlanQuery, ShipmentPlanForm } from '@/api/amz/shipmentPlan/types';
import { ShipmentPlanVO, ShipmentPlanQuery, ShipmentPlanForm, DescriptItem } from '@/api/amz/shipmentPlan/types';
import { ElTable } from 'element-plus';
import { LogisticsQuoteVO } from '@/api/amz/logisticsQuote/types';
import { createOrderForm } from '@/api/amz/logisticsOrder/types';
import { createLogisticsOrder } from '@/api/amz/logisticsOrder';
import { InquiryRequestItemVO } from '@/api/amz/inquiryRequest/types';
import { listSendOrder } from '@/api/amz/sendOrder';
import { PurchaseOrderVO } from '@/api/amz/purchaseOrder/types';
import { SendOrderVO } from '@/api/amz/sendOrder/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { biz_transport_channel } = toRefs<any>(proxy?.useDict('biz_transport_channel'));
const { send_status } = toRefs<any>(proxy?.useDict('send_status'));
const { sys_zero_one } = toRefs<any>(proxy?.useDict('sys_zero_one'));
const shipmentPlanList = ref<ShipmentPlanVO[]>([]);
@ -379,10 +481,48 @@ const dialog = reactive<DialogOption>({
title: ''
});
const orderTableVisible = reactive<DialogOption>({
visible: false,
title: ''
});
const handleCopy = (text) => {
proxy?.$modal.msgSuccess('复制成功');
};
//
// const shipToAddress = reactive<Address>({
// name: null,
// countryCode: 'US',
// stateOrProvinceCode: null,
// city: 'Joliet',
// region: 'IL',
// addressLine1: '250 EMERALD DR',
// addressLine2: null,
// postalCode: '60433-3280',
// phone: null,
// doorplate: '60433-3280'
// });
//
const descriptItems: DescriptItem[] = [
{ label: '姓名', prop: 'name' },
{ label: '国家', prop: 'countryCode' },
{ label: '州/省代码', prop: 'stateOrProvinceCode' },
{ label: '城市', prop: 'city' },
{ label: '州/省', prop: 'region' },
{ label: '地址行1', prop: 'addressLine1' },
{ label: '地址行2', prop: 'addressLine2' },
{ label: '邮政编码', prop: 'postalCode' },
{ label: '电话', prop: 'phone' },
{ label: '门牌号', prop: 'doorplate' }
];
//
const getFormattedValue = (value: string | null): string => {
return value ?? 'N/A';
};
const initFormData: ShipmentPlanForm = {
id: undefined,
sid: undefined,
@ -444,6 +584,7 @@ const data = reactive<PageData<ShipmentPlanForm, ShipmentPlanQuery>>({
channelName: undefined,
params: {}
},
rules: {
id: [{ required: true, message: '主键ID不能为空', trigger: 'blur' }],
sid: [{ required: true, message: '关联系统ID不能为空', trigger: 'blur' }],
@ -464,24 +605,41 @@ const data = reactive<PageData<ShipmentPlanForm, ShipmentPlanQuery>>({
shipToAddress: [{ required: true, message: '收货地址不能为空', trigger: 'blur' }],
referenceId: [{ required: true, message: '参考编号不能为空', trigger: 'blur' }],
staInboundPlanId: [{ required: true, message: '入库计划ID不能为空', trigger: 'blur' }],
isSta: [{ required: true, message: '是否STA计划不能为空', trigger: 'blur' }],
boxSize: [
{
required: true,
message: '长宽高都不能为空',
validator: (rule, value, callback) => {
if (!plength.value || !pwidth.value || !pheight.value) {
callback(new Error('长宽高都不能为空'));
} else {
callback();
}
},
trigger: 'blur'
}
]
isSta: [{ required: true, message: '是否STA计划不能为空', trigger: 'blur' }]
// boxSize: [
// {
// required: true,
// message: '',
// validator: (rule, value, callback) => {
// if (!plength.value || !pwidth.value || !pheight.value) {
// callback(new Error(''));
// } else {
// callback();
// }
// },
// trigger: 'blur'
// }
// ]
}
});
const orderQueryParams = ref({
pageNum: 1,
pageSize: 10,
orderSn: undefined,
sendDate: undefined,
storeName: undefined,
productName: undefined,
quantitySend: undefined,
quantityPerBox: undefined,
boxCount: undefined,
boxDimensions: undefined,
weightPerBox: undefined,
realStoreName: undefined,
sendStatus: 'confirm',
params: {}
});
const { queryParams, form, rules } = toRefs(data);
const createOrderData = ref<createOrderForm>({
@ -505,6 +663,10 @@ const createOrder = async (row: ShipmentPlanVO) => {
drawer.value = false;
};
const handleSendOrderClick = async (row: string) => {
console.log('row', row);
};
const dialogTableVisible = ref(false);
const plength = ref<string | number>();
const pheight = ref<string | number>();
@ -531,6 +693,7 @@ const tableData = ref([
transportChannel: 'sea'
}
]);
const sendOrderList = ref<SendOrderVO[]>([]);
const batchSendRest = async () => {
console.log('selectionDatas=', selectionDatas);
@ -543,13 +706,19 @@ const batchSendRest = async () => {
channelId: channel,
quoteDate: shipDate.value,
shipToAddress: item.shipToAddress,
shipmentId: item.shipmentId
shipmentId: item.shipmentId,
customsFlag: customsFlag.value
};
inquiryRequestItemVOList.value.push(inquiryRequestItemVO);
if (item.sendOrderId) {
inquiryRequestItemVOList.value.push(inquiryRequestItemVO);
}
});
});
console.log('inquiryRequestItemVOList=', inquiryRequestItemVOList);
if (inquiryRequestItemVOList.value.length === 0) {
ElMessage.warning('请选择已关联采购单的数据');
return;
}
const res = await createBatch(inquiryRequestItemVOList.value);
console.log('res', res);
if (res.code === 200) {
@ -627,6 +796,17 @@ const channelDialogVisibleAction = () => {
ElMessage.error('请选择需要批量提交的数据');
return;
}
let allHasSendOrder = true;
selectionDatas.value.forEach((item) => {
if (!item.sendOrderId) {
allHasSendOrder = false;
}
});
if (!allHasSendOrder) {
ElMessage.error('请选择已关联采购单的数据');
return;
}
channelDialogVisible.value = true;
console.log('channelDialogVisibleAction', selectionDatas.value.length);
@ -681,7 +861,7 @@ const countryMap = {
sg: '新加坡',
de: '德国',
fr: '法国',
gb: '英国',
uk: '英国',
it: '意大利',
es: '西班牙',
ru: '俄罗斯',
@ -777,6 +957,7 @@ const getShippingMethodName = (method) => {
//
const activeCollapse = ref(['us']); //
const selectedChannel = ref(null);
const customsFlag = ref('0');
const handleChannelSelect = (channelId) => {
console.log('Selected channel ID:', channelId);
@ -913,6 +1094,10 @@ const checkPrice = async () => {
/** 修改按钮操作 */
const handleUpdate = async (row?: ShipmentPlanVO) => {
if (!row.sendOrderId) {
ElMessage.warning('请先关联采购单!');
return;
}
reset();
const _id = row?.id || ids.value[0];
const res = await getShipmentPlan(_id);
@ -936,6 +1121,50 @@ const handleUpdate = async (row?: ShipmentPlanVO) => {
currentDes.value = row.destination;
};
const linkShipmentPlanVO = ref<ShipmentPlanVO>();
const handleLink = async (row: any) => {
console.log('row', row);
// const res = await getShipmentPlan(row.id);
// console.log('res', res);
// if (res.code == 200) {
// ElMessage.success('');
// getList();
// }
linkShipmentPlanVO.value = row;
orderQueryParams.value.realStoreName = row.sellerName;
orderQueryParams.value.sendStatus = 'confirm';
console.log('orderQueryParams', orderQueryParams.value);
const res = await listSendOrder(orderQueryParams.value);
sendOrderList.value = res.rows;
orderTableVisible.visible = true;
orderTableVisible.title = '选择需要关联的采购单';
console.log('res', res);
};
const handleLinkOrder = async (row: SendOrderVO) => {
console.log('row', row);
const updateForm = ref({
id: linkShipmentPlanVO.value.id,
sendOrderId: row.id,
sendStatus: 'completed',
shipmentId: linkShipmentPlanVO.value.shipmentId
// boxSize: plength.value + '*' + pwidth.value + '*' + pheight.value,
// vendorWeight: form.value.vendorWeight,
// setTotal: form.value.setTotal
// channelId: selectedChannel,
// channelName: channelCascaderRef.value.getCheckedNodes()[0].label
});
const res = await linkShipmentPlan(updateForm.value).finally(() => (buttonLoading.value = false));
console.log('res', res);
if (res.code == 200) {
orderTableVisible.visible = false;
ElMessage.success('关联成功');
getList();
}
};
const handleSend = async (row?: ShipmentPlanVO) => {
// reset();
// channelDialogVisible.value = true;

View File

@ -115,16 +115,59 @@
</template>
</el-table-column>
<el-table-column label="物流中心编码" align="center" prop="destination" />
<el-table-column label="总箱子数量" align="center" prop="boxQuantity" />
<el-table-column label="套数" align="center" prop="setTotal" />
<!-- <el-table-column label="总箱子数量" align="center" prop="boxQuantity" />-->
<!-- <el-table-column label="套数" align="center" prop="setTotal" />-->
<!-- <el-table-column label="箱子尺寸" align="center" prop="boxSize" />-->
<el-table-column label="供应商称重-总重量" align="center" prop="vendorWeight" />
<el-table-column label="物流称重-总重量" align="center" prop="vendorWeight" />
<el-table-column label="称重差异" align="center" prop="vendorWeight" />
<el-table-column label="物流称重-总重量" align="center" prop="logisticsWeight" />
<el-table-column label="称重差异" align="center" prop="weightDiff" />
<!-- <el-table-column label="渠道ID" align="center" prop="channelId" />-->
<el-table-column label="关联采购单" align="center" prop="sendOrderId">
<template #default="scope">
<el-popover v-if="scope.row.sendOrderId" placement="top" :width="800" trigger="click">
<template #reference>
<!-- <el-button style="margin-right: 16px">Click to activate</el-button>-->
<el-button size="small" plain v-if="scope.row.sendOrderId" type="success"> 已关联</el-button>
</template>
<el-descriptions v-if="scope.row.sendOrderId" title="供应商发货单" border :column="2" label-class-name="desc-label">
<!-- 订单信息 -->
<el-descriptions-item label="订单编号" min-width="120px">
{{ scope.row.sendOrder.orderSn }}
</el-descriptions-item>
<el-descriptions-item label="产品名称">
{{ scope.row.sendOrder.productName }}
</el-descriptions-item>
<el-descriptions-item label="总箱数"> {{ scope.row.sendOrder.boxCount }} </el-descriptions-item>
<el-descriptions-item label="总重量"> {{ scope.row.sendOrder.weightPerBox }} kg</el-descriptions-item>
<el-descriptions-item label="箱体规格"> {{ scope.row.sendOrder.sendDetail }}</el-descriptions-item>
<!-- <el-descriptions-item label="每箱数量"> {{ scope.row.sendOrder.quantityPerBox }} / </el-descriptions-item>-->
</el-descriptions>
</el-popover>
<!-- <el-tooltip class="box-item" effect="dark" content="点击关联采购单" placement="top">-->
<!-- <el-button size="small" plain v-if="!scope.row.sendOrderId" type="info" @click="handleLink(scope.row)"> 未关联 </el-button>-->
<!-- </el-tooltip>-->
</template>
</el-table-column>
<!-- <el-table-column label="渠道ID" align="center" prop="channelId" />-->
<el-table-column width="150" label="仓库配送地址" align="center" prop="shipToAddress">
<template #default="{ row }">
<el-button @click="openAddressDialog(row.shipToAddress)"> 查看详情</el-button>
<!-- <el-button @click="openAddressDialog(row.shipToAddress)"> 查看详情</el-button>-->
<el-popover placement="left" :width="800" trigger="click">
<template #reference>
<!-- <el-button style="margin-right: 16px">Click to activate</el-button>-->
<el-button plain size="small" type="success"> 点击查看详情</el-button>
</template>
<el-descriptions title="收货地址信息" :column="3" border>
<el-descriptions-item v-for="item in descriptItems" :key="item.prop" :label="item.label">
{{ row.shipToAddress[item.prop] || 'N/A' }}
</el-descriptions-item>
</el-descriptions>
</el-popover>
</template>
</el-table-column>
<el-table-column label="亚马逊货件状态" align="center" prop="gmtCreate" width="180">
@ -132,7 +175,7 @@
<el-tag>{{ scope.row.shipmentStatus }}</el-tag>
</template>
</el-table-column>
<el-table-column label="物流渠道" align="center" prop="channelName" />
<!-- <el-table-column label="物流渠道" align="center" prop="channelName" />-->
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
@ -318,7 +361,7 @@
</template>
<template #default>
<el-table v-loading="loading" :data="logisticsQuoteList" @selection-change="handleSelectionChange">
<el-table-column label="物流商用户ID" align="center" prop="userId" />
<el-table-column label="物流商名称" align="center" prop="logisticsName" />
<el-table-column label="目的地" align="center" prop="destination" />
<el-table-column label="渠道名称" align="center" prop="channelName" />
<el-table-column label="基础价格" align="center" prop="price" />
@ -477,6 +520,20 @@ const createOrderData = ref<createOrderForm>({
logicQuoteId: undefined
});
//
const descriptItems: DescriptItem[] = [
{ label: '姓名', prop: 'name' },
{ label: '国家', prop: 'countryCode' },
{ label: '州/省代码', prop: 'stateOrProvinceCode' },
{ label: '城市', prop: 'city' },
{ label: '州/省', prop: 'region' },
{ label: '地址行1', prop: 'addressLine1' },
{ label: '地址行2', prop: 'addressLine2' },
{ label: '邮政编码', prop: 'postalCode' },
{ label: '电话', prop: 'phone' },
{ label: '门牌号', prop: 'doorplate' }
];
const showPop = async (row: any) => {
console.log('row', row);
};
@ -582,6 +639,15 @@ const shipDate = ref(getLocalDate());
const getList = async () => {
loading.value = true;
const res = await listShipmentPlanOrder(queryParams.value);
res.rows.forEach((item) => {
item.vendorWeight = item.detailList.reduce((acc, cur) => {
return acc + cur.supplierWeight;
}, 0);
item.logisticsWeight = item.detailList.reduce((acc, cur) => {
return acc + cur.logisticsWeight;
}, 0);
item.weightDiff = item.vendorWeight - item.logisticsWeight;
});
shipmentPlanList.value = res.rows;
total.value = res.total;
loading.value = false;
@ -776,7 +842,7 @@ const checkPrice = async () => {
} else {
//
channelDialogVisible.value = false;
drawer.value = true;
// drawer.value = true;
logisticsQuoteList.value = res.rows;
}
};

View File

@ -104,15 +104,61 @@
</template>
</el-table-column>
<el-table-column label="物流中心编码" align="center" prop="destination" />
<el-table-column label="总箱子数量" align="center" prop="boxQuantity" />
<el-table-column label="箱子尺寸" align="center" prop="boxSize" />
<el-table-column label="供应商称重-总重量" align="center" prop="vendorWeight" />
<el-table-column label="套数" align="center" prop="setTotal" />
<!-- <el-table-column label="总箱子数量" align="center" prop="boxQuantity" />-->
<!-- <el-table-column label="箱子尺寸" align="center" prop="boxSize" />-->
<!-- <el-table-column label="供应商称重-总重量" align="center" prop="vendorWeight" />-->
<!-- <el-table-column label="套数" align="center" prop="setTotal" />-->
<!-- <el-table-column label="渠道ID" align="center" prop="channelId" />-->
<el-table-column label="关联采购单" align="center" prop="sendOrderId">
<template #default="scope">
<el-popover v-if="scope.row.sendOrderId" placement="top" :width="800" trigger="click">
<template #reference>
<!-- <el-button style="margin-right: 16px">Click to activate</el-button>-->
<el-button size="small" plain v-if="scope.row.sendOrderId" type="success"> 已关联</el-button>
</template>
<el-descriptions v-if="scope.row.sendOrderId" title="供应商发货单" border :column="2" label-class-name="desc-label">
<!-- 订单信息 -->
<el-descriptions-item label="订单编号" min-width="120px">
{{ scope.row.sendOrder.orderSn }}
</el-descriptions-item>
<el-descriptions-item label="产品名称">
{{ scope.row.sendOrder.productName }}
</el-descriptions-item>
<el-descriptions-item label="总箱数"> {{ scope.row.sendOrder.boxCount }} </el-descriptions-item>
<el-descriptions-item label="总重量"> {{ scope.row.sendOrder.weightPerBox }} kg</el-descriptions-item>
<el-descriptions-item label="箱体规格">
<div v-html="formatText(scope.row.sendOrder.sendDetail)"></div>
</el-descriptions-item>
<!-- <el-descriptions-item label="每箱数量"> {{ scope.row.sendOrder.quantityPerBox }} / </el-descriptions-item>-->
</el-descriptions>
</el-popover>
<!-- <el-tooltip class="box-item" effect="dark" content="点击关联采购单" placement="top">-->
<!-- <el-button size="small" plain v-if="!scope.row.sendOrderId" type="info" @click="handleLink(scope.row)"> 未关联 </el-button>-->
<!-- </el-tooltip>-->
</template>
</el-table-column>
<!-- <el-table-column label="渠道ID" align="center" prop="channelId" />-->
<el-table-column width="150" label="仓库配送地址" align="center" prop="shipToAddress">
<template #default="{ row }">
<el-button @click="openAddressDialog(row.shipToAddress)"> 查看详情</el-button>
<!-- <el-button @click="openAddressDialog(row.shipToAddress)"> 查看详情</el-button>-->
<el-popover placement="left" :width="800" trigger="click">
<template #reference>
<!-- <el-button style="margin-right: 16px">Click to activate</el-button>-->
<el-button plain size="small" type="success"> 点击查看详情</el-button>
</template>
<el-descriptions title="收货地址信息" :column="3" border>
<el-descriptions-item v-for="item in descriptItems" :key="item.prop" :label="item.label">
{{ row.shipToAddress[item.prop] || 'N/A' }}
</el-descriptions-item>
</el-descriptions>
</el-popover>
</template>
</el-table-column>
<el-table-column label="亚马逊货件状态" align="center" prop="gmtCreate" width="180">
@ -203,61 +249,11 @@
</el-dialog>
<el-dialog v-model="channelDialogVisible" title="查询报价" width="60%">
<!-- <el-radio-group v-model="form.status">-->
<!-- <el-radio v-for="dict in biz_transport_channel" :key="dict.value" :value="dict.value">-->
<!-- {{ dict.label }}-->
<!-- </el-radio>-->
<!-- </el-radio-group>-->
<!-- <el-radio-group v-model="form.status">-->
<!-- &lt;!&ndash; 按国家分组循环 &ndash;&gt;-->
<!-- <div v-for="(transportDict, country) in groupedChannels" :key="country">-->
<!-- &lt;!&ndash; 国家标题 &ndash;&gt;-->
<!-- <div class="country-title">{{ country }}</div>-->
<!-- &lt;!&ndash; 运输方式子分组 &ndash;&gt;-->
<!-- <div-->
<!-- v-for="(channels, transport) in transportDict"-->
<!-- :key="transport"-->
<!-- class="transport-group"-->
<!-- >-->
<!-- <el-radio-->
<!-- v-for="dict in channels"-->
<!-- :key="dict.value"-->
<!-- :value="dict.value"-->
<!-- border-->
<!-- class="channel-item"-->
<!-- >-->
<!-- {{ transport }} - {{ getChannelName(dict.label) }}-->
<!-- </el-radio>-->
<!-- </div>-->
<!-- </div>-->
<!-- </el-radio-group>-->
<el-form :model="form" label-width="auto" style="max-width: 600px">
<el-form-item label="目的地仓库">
<el-input v-model="currentDes" disabled />
</el-form-item>
<el-form-item label="渠道选择">
<!-- <el-collapse v-model="activeCollapse">-->
<!-- &lt;!&ndash; 遍历国家分组 &ndash;&gt;-->
<!-- <el-collapse-item v-for="(countryGroup, country) in groupedChannels" :key="country" :title="getCountryName(country)" :name="country">-->
<!-- &lt;!&ndash; 遍历运输方式 &ndash;&gt;-->
<!-- <div v-for="(methodGroup, method) in countryGroup" :key="method">-->
<!-- <div class="shipping-method-title">-->
<!-- {{ getShippingMethodName(method) }}-->
<!-- </div>-->
<!-- <el-radio-group v-model="selectedChannel" @change="handleChannelSelect">-->
<!-- &lt;!&ndash; 遍历具体渠道 &ndash;&gt;-->
<!-- <div v-for="channel in methodGroup" :key="channel.id" class="channel-item">-->
<!-- <el-radio :label="channel.id">-->
<!-- {{ getChannelLabel(channel.channelName) }}-->
<!-- </el-radio>-->
<!-- <div class="channel-description">{{ channel.description }}</div>-->
<!-- </div>-->
<!-- </el-radio-group>-->
<!-- </div>-->
<!-- </el-collapse-item>-->
<!-- </el-collapse>-->
<el-cascader
v-model="selectedChannel"
placeholder="请选择渠道"
@ -269,7 +265,7 @@
/>
</el-form-item>
<el-form-item label="日期选择">
<el-date-picker v-model="shipDate" type="date" placeholder="Pick a day" value-format="YYYY-MM-DD" :size="size" />
<el-date-picker v-model="shipDate" type="date" placeholder="Pick a day" value-format="YYYY-MM-DD" :size="'default'" />
</el-form-item>
<el-button :loading="buttonLoading" type="primary" @click="checkPrice()">查询报价</el-button>
</el-form>
@ -330,10 +326,11 @@
</template>
<template #default>
<el-table v-loading="loading" :data="logisticsQuoteList" @selection-change="handleSelectionChange">
<el-table-column label="物流商用户ID" align="center" prop="userId" />
<el-table-column label="物流商名称" align="center" prop="logisticsName" />
<el-table-column label="目的地" align="center" prop="destination" />
<el-table-column label="渠道名称" align="center" prop="channelName" />
<el-table-column label="基础价格" align="center" prop="price" />
<el-table-column label="最短时效" align="center" prop="minLeadTime" />
<el-table-column label="时效" align="center" prop="leadTime" />
<el-table-column label="附加费" align="center" prop="surcharge" />
<el-table-column label="报价生效日期" align="center" prop="quoteDate" width="120">
@ -341,11 +338,19 @@
<span>{{ parseTime(scope.row.quoteDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="提交状态" align="center" prop="isSubmitted" />
<el-table-column label="报价备注" align="center" prop="remark" />
<el-table-column label="渠道类型" align="center" prop="channelType" />
<el-table-column label="是否双清包税" align="center" prop="isDdp" />
<el-table-column label="提交状态" align="center" prop="isSubmitted">
<template #default="scope">
<dict-tag :options="sys_yes_no" :value="scope.row.isSubmitted" />
</template>
</el-table-column>
<!-- <el-table-column label="渠道类型" align="center" prop="channelType" />-->
<el-table-column label="是否双清包税" align="center" prop="isDdp">
<template #default="scope">
<dict-tag :options="sys_yes_no" :value="scope.row.isDdp" />
</template>
</el-table-column>
<el-table-column label="单位" align="center" prop="unit" />
<el-table-column label="报价备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button text size="small" type="primary" @click="createOrder(scope.row)" v-hasPermi="['amz:shipmentPlan:edit']">
@ -375,12 +380,12 @@ import {
takeTodayAmzPlanData
} from '@/api/amz/shipmentPlan';
import { listAllLogisticsChannel } from '@/api/amz/logisticsChannel';
import type { DrawerProps } from 'element-plus';
import { DrawerProps, ElNotification } from 'element-plus';
import { createWithDesAndChannel, queryWithDesAndChannel } from '@/api/amz/inquiryRequest';
import { queryLogisticsQuote, queryLogisticsQuoteWithDes } from '@/api/amz/logisticsQuote';
import { ShipmentPlanVO, ShipmentPlanQuery, ShipmentPlanForm } from '@/api/amz/shipmentPlan/types';
import { ShipmentPlanVO, ShipmentPlanQuery, ShipmentPlanForm, DescriptItem } from '@/api/amz/shipmentPlan/types';
import { ElTable } from 'element-plus';
import { LogisticsQuoteVO } from '@/api/amz/logisticsQuote/types';
import { createOrderForm } from '@/api/amz/logisticsOrder/types';
@ -388,6 +393,7 @@ import { createLogisticsOrder } from '@/api/amz/logisticsOrder';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { biz_transport_channel } = toRefs<any>(proxy?.useDict('biz_transport_channel'));
const { sys_yes_no } = toRefs<any>(proxy?.useDict('sys_yes_no'));
const { sys_zero_one } = toRefs<any>(proxy?.useDict('sys_zero_one'));
@ -408,6 +414,20 @@ const dialog = reactive<DialogOption>({
title: ''
});
//
const descriptItems: DescriptItem[] = [
{ label: '姓名', prop: 'name' },
{ label: '国家', prop: 'countryCode' },
{ label: '州/省代码', prop: 'stateOrProvinceCode' },
{ label: '城市', prop: 'city' },
{ label: '州/省', prop: 'region' },
{ label: '地址行1', prop: 'addressLine1' },
{ label: '地址行2', prop: 'addressLine2' },
{ label: '邮政编码', prop: 'postalCode' },
{ label: '电话', prop: 'phone' },
{ label: '门牌号', prop: 'doorplate' }
];
const initFormData: ShipmentPlanForm = {
id: undefined,
sid: undefined,
@ -727,7 +747,13 @@ const cancel = () => {
reset();
dialog.visible = false;
};
const formatText = (text) => {
// 1. HTML
const escaped = String(text).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;');
// 2.
return escaped.replace(/\n/g, '<br>');
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
@ -819,7 +845,13 @@ const checkPrice = async () => {
// if (res2.code == 200) {
// ElMessage({
ElMessage.warning('暂时没有物流商报价');
// ElMessage.warning('');
ElNotification({
title: '警告',
message: '暂时没有物流商报价',
type: 'warning',
duration: 3000
});
} else {
//
// ElMessage.success('');

View File

@ -1,14 +1,52 @@
<template>
<div class="app-container home">
<el-row :gutter="20">
<el-col :sm="24" :lg="12" style="padding-left: 20px">
<h2>物流商管理系统</h2>
</el-col>
<!-- <el-row :gutter="20" class="mb20">-->
<!-- <el-col :span="6">-->
<!-- <el-card shadow="hover" body-class="card-body">-->
<!-- <el-icon class="card-icon bg1">-->
<!-- <User />-->
<!-- </el-icon>-->
<!-- <div class="card-content">-->
<!-- <countup class="card-num color1" :end="6666" />-->
<!-- <div>用户访问量</div>-->
<!-- </div>-->
<!-- </el-card>-->
<!-- </el-col>-->
<!-- <el-col :span="6">-->
<!-- <el-card shadow="hover" body-class="card-body">-->
<!-- <el-icon class="card-icon bg2">-->
<!-- <ChatDotRound />-->
<!-- </el-icon>-->
<!-- <div class="card-content">-->
<!-- <countup class="card-num color2" :end="168" />-->
<!-- <div>系统消息</div>-->
<!-- </div>-->
<!-- </el-card>-->
<!-- </el-col>-->
<!-- <el-col :span="6">-->
<!-- <el-card shadow="hover" body-class="card-body">-->
<!-- <el-icon class="card-icon bg3">-->
<!-- <Goods />-->
<!-- </el-icon>-->
<!-- <div class="card-content">-->
<!-- <countup class="card-num color3" :end="8888" />-->
<!-- <div>商品数量</div>-->
<!-- </div>-->
<!-- </el-card>-->
<!-- </el-col>-->
<!-- <el-col :span="6">-->
<!-- <el-card shadow="hover" body-class="card-body">-->
<!-- <el-icon class="card-icon bg4">-->
<!-- <ShoppingCartFull />-->
<!-- </el-icon>-->
<!-- <div class="card-content">-->
<!-- <countup class="card-num color4" :end="568" />-->
<!-- <div>今日订单量</div>-->
<!-- </div>-->
<!-- </el-card>-->
<!-- </el-col>-->
<!-- </el-row>-->
<el-col :sm="24" :lg="12" style="padding-left: 20px">
<h2>物流商管理系统</h2>
</el-col>
</el-row>
<el-divider />
</div>
</template>
@ -16,6 +54,7 @@
<script setup name="Index" lang="ts">
import { queryLogisticsOrder } from '@/api/amz/logisticsOrder';
import { Action } from 'element-plus';
import { ChatDotRound, Goods, ShoppingCartFull, User } from '@element-plus/icons-vue';
const goTarget = (url: string) => {
window.open(url, '__blank');
@ -48,7 +87,30 @@ onMounted(async () => {
}
});
</script>
<style>
.card-body {
display: flex;
align-items: center;
height: 100px;
padding: 0;
}
.bg1 {
background: #2d8cf0;
}
.bg2 {
background: #64d572;
}
.bg3 {
background: #f25e43;
}
.bg4 {
background: #e9a745;
}
</style>
<style scoped lang="scss">
.home {
blockquote {
@ -113,4 +175,57 @@ onMounted(async () => {
}
}
}
.countup {
font-size: 24px;
}
.card-content {
flex: 1;
text-align: center;
font-size: 14px;
color: #999;
padding: 0 20px;
}
.card-num {
font-size: 30px;
}
.card-icon {
font-size: 50px;
width: 100px;
height: 100px;
text-align: center;
line-height: 100px;
color: #fff;
}
.color0 {
color: #fff;
}
.color1 {
color: #2d8cf0;
}
.color2 {
color: #64d572;
}
.color3 {
color: #f25e43;
}
.color4 {
color: #e9a745;
}
.text-right {
text-align: right;
}
.text-left {
text-align: left;
}
</style>

View File

@ -2,8 +2,8 @@
<div class="login">
<el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
<div class="title-box">
<h3 class="title">瑷胜科技管理系统</h3>
<lang-select />
<h3 class="title">香港SMT订单物流管理系统</h3>
<!-- <lang-select />-->
</div>
<!-- <el-form-item v-if="tenantEnabled" prop="tenantId">-->
<!-- <el-select v-model="loginForm.tenantId" filterable :placeholder="proxy.$t('login.selectPlaceholder')" style="width: 100%">-->

View File

@ -2,7 +2,7 @@
<div class="register">
<el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form">
<div class="title-box">
<h3 class="title">瑷胜科技管理系统</h3>
<h3 class="title">香港SMT订单物流管理系统</h3>
<lang-select />
</div>
<el-form-item v-if="tenantEnabled" prop="tenantId">

View File

@ -96,7 +96,14 @@
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column v-if="columns[0].visible" key="userId" label="用户编号" align="center" prop="userId" />
<el-table-column v-if="columns[1].visible" key="userName" label="用户登录名" align="center" prop="userName" :show-overflow-tooltip="true" />
<el-table-column
v-if="columns[1].visible"
key="userName"
label="用户登录名"
align="center"
prop="userName"
:show-overflow-tooltip="true"
/>
<el-table-column v-if="columns[2].visible" key="nickName" label="用户名称" align="center" prop="nickName" :show-overflow-tooltip="true" />
<el-table-column v-if="columns[3].visible" key="deptName" label="部门" align="center" prop="deptName" :show-overflow-tooltip="true" />
<el-table-column v-if="columns[4].visible" key="phonenumber" label="手机号码" align="center" prop="phonenumber" width="120" />

View File

@ -14,13 +14,13 @@
</div>
<ul class="list-group list-group-striped">
<li class="list-group-item">
<svg-icon icon-class="user" />
<svg-icon icon-class="my-copy" />
用户登录名
<div class="pull-right">{{ state.user.userName }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="user" />
用户登录
用户
<div class="pull-right">{{ state.user.nickName }}</div>
</li>
<li class="list-group-item">
@ -33,6 +33,11 @@
用户邮箱
<div class="pull-right">{{ state.user.email }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="company" />
地址
<div class="pull-right">{{ state.user.address }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="tree" />
所属部门

View File

@ -9,6 +9,9 @@
<el-form-item label="邮箱" prop="email">
<el-input v-model="userForm.email" maxlength="50" />
</el-form-item>
<el-form-item label="地址" prop="address">
<el-input v-model="userForm.address" maxlength="500" />
</el-form-item>
<el-form-item label="性别">
<el-radio-group v-model="userForm.sex">
<el-radio value="0"></el-radio>