feat(wms): 添加发货单到货确认节点

- 新增到货确认表单,包括到货标识选择和收货单附件上传
- 添加发货类型字段,替换手动输入发货单号为系统自动生成
- 新增抄送人员选择功能,支持多选用户
- 添加发货类型、需到货确认、到货标识等查询筛选条件
- 实现到货确认节点审批流程,支持申请人确认到货状态
- 添加到货确认时间范围查询功能
- 优化流程变量传递,确保审批流程正确流转
- 新增到货确认相关API接口和数据类型定义
dev
zangch@mesnac.com 6 days ago
parent ca45a573cc
commit 9526af3a02

@ -1,6 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { AxiosPromise } from 'axios'; import { AxiosPromise } from 'axios';
import { WmsShippingBillForm, WmsShippingBillQuery, WmsShippingBillVO } from '@/api/wms/wmsShippingBill/types'; import { WmsShippingArrivalConfirmForm, WmsShippingBillForm, WmsShippingBillQuery, WmsShippingBillVO } from '@/api/wms/wmsShippingBill/types';
/** /**
* *
@ -98,3 +98,15 @@ export const exportShippingBillWord = (shippingBillId: string | number) => {
responseType: 'blob' responseType: 'blob'
}); });
}; };
/**
*
* @param data
*/
export const arrivalConfirmShippingBill = (data: WmsShippingArrivalConfirmForm): AxiosPromise<WmsShippingBillVO> => {
return request({
url: '/wms/wmsShippingBill/arrivalConfirm',
method: 'post',
data: data
});
};

@ -181,6 +181,36 @@ export interface WmsShippingBillVO {
*/ */
flowStatus: string; flowStatus: string;
/**
* 1 0
*/
needArrivalConfirm?: string;
/**
* 0 1
*/
isAllReceiving?: string;
/**
* OSS ID
*/
arrivalReceiptOssId?: string;
/**
*
*/
arrivalConfirmTime?: string;
/**
* ID
*/
arrivalConfirmBy?: string | number;
/**
*
*/
arrivalConfirmByName?: string;
/** /**
* shipping_status1 2 3 4 * shipping_status1 2 3 4
*/ */
@ -205,6 +235,15 @@ export interface WmsShippingBillVO {
* *
*/ */
itemsVo?: WmsShippingDetailsVO[]; itemsVo?: WmsShippingDetailsVO[];
/**
*
*/
createBy?: string | number;
/**
*
*/
createTime?: string;
} }
export interface WmsShippingBillForm extends BaseEntity { export interface WmsShippingBillForm extends BaseEntity {
@ -408,6 +447,31 @@ export interface WmsShippingBillForm extends BaseEntity {
*/ */
detailsList?: WmsShippingDetailsForm[]; detailsList?: WmsShippingDetailsForm[];
/**
* 1 0
*/
needArrivalConfirm?: string;
/**
* 0 1
*/
isAllReceiving?: string;
/**
* OSS ID
*/
arrivalReceiptOssId?: string;
/**
*
*/
arrivalConfirmTime?: string;
/**
* ID
*/
arrivalConfirmBy?: string | number;
/** /**
* *
*/ */
@ -418,6 +482,11 @@ export interface WmsShippingBillForm extends BaseEntity {
*/ */
variables?: any; variables?: any;
/**
* ID
*/
tManagerId?: string | number;
/** /**
* *
*/ */
@ -590,6 +659,16 @@ export interface WmsShippingBillQuery extends PageQuery {
*/ */
shippingStatus?: string; shippingStatus?: string;
/**
* 1 0
*/
needArrivalConfirm?: string;
/**
* 0 1
*/
isAllReceiving?: string;
/** /**
* ID * ID
*/ */
@ -605,3 +684,26 @@ export interface WmsShippingBillQuery extends PageQuery {
*/ */
params?: any; params?: any;
} }
export interface WmsShippingArrivalConfirmForm {
/**
* ID
*/
shippingBillId: string | number;
/**
* 0 1
*/
isAllReceiving: string;
/**
* OSS ID
*/
arrivalReceiptOssId: string;
/**
*
*/
arrivalConfirmTime?: string;
/**
* ID
*/
taskId: string | number;
}

@ -14,6 +14,37 @@
/> />
</el-card> </el-card>
<!-- 全部到货确认区块仅到货确认节点允许申请人录入 -->
<el-card v-if="isArrivalConfirmApprover" shadow="never" style="margin-top: 10px; border: 1px solid #e6a23c">
<template #header>
<div style="text-align: left; font-weight: bold; font-size: 16px; color: #e6a23c">
<el-icon style="margin-right: 6px"><Warning /></el-icon>
</div>
</template>
<el-form :model="arrivalConfirmForm" label-width="120px" ref="arrivalConfirmFormRef">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="全部到货标识" prop="isAllReceiving" :rules="[{ required: true, message: '请选择全部到货标识', trigger: 'change' }]">
<el-radio-group v-model="arrivalConfirmForm.isAllReceiving">
<el-radio-button v-for="dict in is_all_receiving" :key="dict.value" :label="dict.value">
{{ dict.label }}
</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
label="收货单附件"
prop="arrivalReceiptOssId"
:rules="[{ required: arrivalConfirmForm.isAllReceiving === '0', message: '全部到货必须上传收货单', trigger: 'change' }]"
>
<fileUpload v-model="arrivalConfirmForm.arrivalReceiptOssId" :limit="5" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<!-- 基本信息区域 --> <!-- 基本信息区域 -->
<el-card shadow="never" style="margin-top: 0"> <el-card shadow="never" style="margin-top: 0">
<template #header> <template #header>
@ -30,11 +61,17 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="发货单号" prop="shippingCode"> <el-form-item label="发货单号" prop="shippingCode">
<el-input v-model="form.shippingCode" placeholder="请输入发货单号"> <el-input v-model="form.shippingCode" placeholder="由系统自动生成" disabled />
<template #append> </el-form-item>
<el-button type="primary" @click="generateShippingCode" :disabled="isCodeGenerated">生成单号</el-button> </el-col>
</template> <el-col :span="12">
</el-input> <el-form-item label="发货类型" prop="shippingType">
<el-select v-model="form.shippingType" placeholder="请选择发货类型" style="width: 100%">
<!-- <el-option label="普通发货" value="1" />
<el-option label="备件发货" value="2" />
<el-option label="物流发货" value="3" /> -->
<el-option v-for="dict in shipping_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -168,6 +205,25 @@
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<el-form label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="抄送人员" prop="tManagerId">
<el-select
v-model="form.tManagerId"
placeholder="请选择抄送人员"
:disabled="copyManagerDisabled"
clearable
filterable
multiple
style="width: 100%"
>
<el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card> </el-card>
<!-- 物流信息区域 --> <!-- 物流信息区域 -->
@ -401,8 +457,17 @@
</template> </template>
<script setup name="WmsShippingBillEdit" lang="ts"> <script setup name="WmsShippingBillEdit" lang="ts">
import { addWmsShippingBill, getWmsShippingBill, shippingBillSubmitAndFlowStart, updateWmsShippingBill } from '@/api/wms/wmsShippingBill'; import {
import { WmsShippingBillForm } from '@/api/wms/wmsShippingBill/types'; addWmsShippingBill,
arrivalConfirmShippingBill,
getWmsShippingBill,
shippingBillSubmitAndFlowStart,
updateWmsShippingBill
} from '@/api/wms/wmsShippingBill';
import { WmsShippingArrivalConfirmForm, WmsShippingBillForm } from '@/api/wms/wmsShippingBill/types';
import { useUserStore } from '@/store/modules/user';
import { getTask } from '@/api/workflow/task';
import type { FlowTaskVO } from '@/api/workflow/task/types';
import { WmsShippingDetailsForm } from '@/api/wms/wmsShippingDetails/types'; import { WmsShippingDetailsForm } from '@/api/wms/wmsShippingDetails/types';
import { listInventoryDetails } from '@/api/wms/inventoryDetails'; import { listInventoryDetails } from '@/api/wms/inventoryDetails';
import { InventoryDetailsQuery, InventoryDetailsVO } from '@/api/wms/inventoryDetails/types'; import { InventoryDetailsQuery, InventoryDetailsVO } from '@/api/wms/inventoryDetails/types';
@ -411,32 +476,83 @@ import { getCrmCustomerInfoList } from '@/api/oa/crm/customerInfo';
import { getCrmCustomerContactList } from '@/api/oa/crm/customerContact'; import { getCrmCustomerContactList } from '@/api/oa/crm/customerContact';
import type { CustomerContactVO } from '@/api/oa/crm/customerContact/types'; import type { CustomerContactVO } from '@/api/oa/crm/customerContact/types';
import { getCrmSupplierInfoList } from '@/api/oa/crm/crmSupplierInfo'; import { getCrmSupplierInfoList } from '@/api/oa/crm/crmSupplierInfo';
import { getRuleGenerateCode } from '@/api/system/codeRule'; import { listUser } from '@/api/system/user';
import type { UserQuery } from '@/api/system/user/types';
import SaleMaterialSelect from '@/components/SaleMaterialSelect/index.vue'; import SaleMaterialSelect from '@/components/SaleMaterialSelect/index.vue';
import SubmitVerify from '@/components/Process/submitVerify.vue'; import SubmitVerify from '@/components/Process/submitVerify.vue';
import ApprovalRecord from '@/components/Process/approvalRecord.vue'; import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import ApprovalButton from '@/components/Process/approvalButton.vue'; import ApprovalButton from '@/components/Process/approvalButton.vue';
import ProjectSelect from '@/components/ProjectSelect/index.vue'; import ProjectSelect from '@/components/ProjectSelect/index.vue';
import type { ProjectInfoVO } from '@/api/oa/erp/projectInfo/types'; import type { ProjectInfoVO } from '@/api/oa/erp/projectInfo/types';
import { listContractInfo } from '@/api/oa/erp/contractInfo'; import { getProjectInfo } from '@/api/oa/erp/projectInfo';
import { getContractInfo, listContractInfo } from '@/api/oa/erp/contractInfo';
import type { ContractInfoQuery, ContractInfoVO } from '@/api/oa/erp/contractInfo/types'; import type { ContractInfoQuery, ContractInfoVO } from '@/api/oa/erp/contractInfo/types';
import { CodeRuleEnum, FlowCodeEnum } from '@/enums/OAEnum'; import { FlowCodeEnum } from '@/enums/OAEnum';
import { Search } from '@element-plus/icons-vue'; import { Search, Warning } from '@element-plus/icons-vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const userStore = useUserStore();
// //
const routeParams = ref<Record<string, any>>({}); const routeParams = ref<Record<string, any>>({});
// //
const { shipping_mode, shipping_status, shipping_bill_status, material_source_type } = toRefs<any>( const { shipping_mode, shipping_status, shipping_bill_status, material_source_type, shipping_type, is_all_receiving } = toRefs<any>(
proxy?.useDict('shipping_mode', 'shipping_status', 'shipping_bill_status', 'material_source_type') proxy?.useDict('shipping_mode', 'shipping_status', 'shipping_bill_status', 'material_source_type', 'shipping_type', 'is_all_receiving')
); );
const buttonLoading = ref(false); const buttonLoading = ref(false);
const shippingBillFormRef = ref<ElFormInstance>(); const shippingBillFormRef = ref<ElFormInstance>();
const arrivalConfirmFormRef = ref<ElFormInstance>();
//
const arrivalConfirmForm = ref<WmsShippingArrivalConfirmForm>({
shippingBillId: '',
isAllReceiving: '0',
arrivalReceiptOssId: '',
taskId: ''
});
watch(
() => arrivalConfirmForm.value.isAllReceiving,
() => {
arrivalConfirmFormRef.value?.clearValidate(['arrivalReceiptOssId']);
}
);
const currentTask = ref<FlowTaskVO | null>(null);
// + +
const isArrivalConfirmApprover = computed(() => {
return (
routeParams.value.type === 'approval' &&
form.value.needArrivalConfirm === '1' &&
currentTask.value?.nodeCode === 'arrival-confirm' &&
String(currentTask.value?.businessId || '') === String(form.value.shippingBillId || '') &&
String(userStore.userId) === String(form.value.createBy)
);
});
const isArrivalConfirmNode = computed(() => {
return (
routeParams.value.type === 'approval' &&
currentTask.value?.nodeCode === 'arrival-confirm' &&
String(currentTask.value?.businessId || '') === String(form.value.shippingBillId || '')
);
});
const canEditCopyManager = computed(() => {
if (routeParams.value.type === 'view') {
return false;
}
const flowStatus = String(form.value.flowStatus || '');
// Why稿
return flowStatus === 'draft' || isArrivalConfirmNode.value;
});
const copyManagerDisabled = computed(() => !canEditCopyManager.value);
// //
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>(); const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
@ -445,13 +561,11 @@ const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
// //
const taskVariables = ref<Record<string, any>>({}); const taskVariables = ref<Record<string, any>>({});
//
const isCodeGenerated = ref(false);
// 1-ERP2-WMS使WMS // 1-ERP2-WMS使WMS
const materialSourceType = ref('2'); const materialSourceType = ref('2');
// //
const userList = ref<any[]>([]);
const customerList = ref<any[]>([]); const customerList = ref<any[]>([]);
const supplierList = ref<any[]>([]); const supplierList = ref<any[]>([]);
const warehouseList = ref<any[]>([]); const warehouseList = ref<any[]>([]);
@ -549,7 +663,6 @@ const validateContractWhenBind = (rule: any, value: any, callback: any) => {
const data = reactive<{ form: WmsShippingBillForm; rules: any }>({ const data = reactive<{ form: WmsShippingBillForm; rules: any }>({
form: { ...initFormData }, form: { ...initFormData },
rules: { rules: {
shippingCode: [{ required: true, message: '发货单号不能为空', trigger: 'blur' }],
shippingMode: [{ required: true, message: '发货方式不能为空', trigger: 'change' }], shippingMode: [{ required: true, message: '发货方式不能为空', trigger: 'change' }],
bindType: [{ required: true, message: '绑定类型不能为空', trigger: 'change' }], bindType: [{ required: true, message: '绑定类型不能为空', trigger: 'change' }],
projectId: [{ validator: validateProjectOrContract, trigger: 'change' }], projectId: [{ validator: validateProjectOrContract, trigger: 'change' }],
@ -560,17 +673,90 @@ const data = reactive<{ form: WmsShippingBillForm; rules: any }>({
const { form, rules } = toRefs(data); const { form, rules } = toRefs(data);
/** 生成发货单号 */ const normalizeWorkflowUserIds = (value: unknown): string | undefined => {
const generateShippingCode = async () => { if (Array.isArray(value)) {
if (isCodeGenerated.value) return; // const ids = value.map((item) => String(item ?? '').trim()).filter((item) => item.length > 0);
try { return ids.length > 0 ? ids.join(',') : undefined;
const params = { codeRuleCode: CodeRuleEnum.SHIPPING_BILL } as any; }
const res = await getRuleGenerateCode(params); if (value === undefined || value === null) {
form.value.shippingCode = res.msg; return undefined;
isCodeGenerated.value = true; }
proxy?.$modal.msgSuccess('发货单号生成成功'); const text = String(value).trim();
} catch (error) { return text.length > 0 ? text : undefined;
console.error('生成发货单号失败:', error); };
const toWorkflowUserIdArray = (value: unknown): (string | number)[] | undefined => {
const text = normalizeWorkflowUserIds(value);
if (!text) {
return undefined;
}
return text
.split(',')
.map((id) => id.trim())
.filter((id) => id.length > 0);
};
const buildFlowCopyVariables = async (submitData: WmsShippingBillForm) => {
let tManagerId = normalizeWorkflowUserIds((submitData as any).tManagerId);
const bindType = submitData.bindType;
// 使/
if (!tManagerId && bindType === '2') {
tManagerId = normalizeWorkflowUserIds((submitData as any).contractManagerId);
}
if (!tManagerId && bindType === '1') {
tManagerId = normalizeWorkflowUserIds((submitData as any).peopleId);
}
//
// Why tManagerId
if (bindType === '2' && !tManagerId && submitData.contractId) {
try {
const contractRes = await getContractInfo(submitData.contractId);
tManagerId = normalizeWorkflowUserIds((contractRes.data as any)?.contractManagerId);
} catch (error) {
console.error('加载合同负责人失败:', error);
}
}
//
if (bindType === '1' && !tManagerId && submitData.projectId) {
try {
const projectRes = await getProjectInfo(submitData.projectId);
tManagerId = normalizeWorkflowUserIds((projectRes.data as any)?.peopleId);
} catch (error) {
console.error('加载抄送人员失败:', error);
}
}
return { tManagerId };
};
const prepareTaskVariables = async () => {
const { tManagerId } = await buildFlowCopyVariables(form.value as WmsShippingBillForm);
if (tManagerId) {
// Why ${tManagerId}
taskVariables.value = { tManagerId };
return true;
}
// tManagerId
if (currentTask.value?.nodeCode === 'dept-leader') {
proxy?.$modal.msgError('未获取到到货确认抄送人ID(tManagerId),请先维护合同负责人或项目抄送人员');
return false;
}
taskVariables.value = {};
return true;
};
const syncCopyManagerSelection = async () => {
const current = normalizeWorkflowUserIds((form.value as any).tManagerId);
if (current) {
return;
}
const { tManagerId } = await buildFlowCopyVariables(form.value as WmsShippingBillForm);
if (tManagerId) {
// Why orderActivate
(form.value as any).tManagerId = toWorkflowUserIdArray(tManagerId);
} }
}; };
@ -604,6 +790,9 @@ const submitContractSelect = () => {
form.value.contractId = contract.contractId as any; form.value.contractId = contract.contractId as any;
form.value.contractCode = contract.contractCode || ''; form.value.contractCode = contract.contractCode || '';
form.value.contractName = contract.contractName || ''; form.value.contractName = contract.contractName || '';
const contractManagerId = normalizeWorkflowUserIds((contract as any).contractManagerId);
(form.value as any).contractManagerId = contractManagerId;
(form.value as any).tManagerId = toWorkflowUserIdArray(contractManagerId);
selectedContractName.value = contract.contractName || ''; selectedContractName.value = contract.contractName || '';
// SAP orderContractCode // SAP orderContractCode
selectedSapOrderCode.value = (contract as any).orderContractCode || ''; selectedSapOrderCode.value = (contract as any).orderContractCode || '';
@ -632,6 +821,9 @@ const projectInfoSelectCallBack = (data: ProjectInfoVO[]) => {
form.value.projectId = project.projectId; form.value.projectId = project.projectId;
form.value.projectCode = project.projectCode || ''; form.value.projectCode = project.projectCode || '';
form.value.projectName = project.projectName || ''; form.value.projectName = project.projectName || '';
const peopleId = normalizeWorkflowUserIds((project as any).peopleId);
(form.value as any).peopleId = peopleId;
(form.value as any).tManagerId = toWorkflowUserIdArray(peopleId);
selectedProjectName.value = project.projectName || ''; selectedProjectName.value = project.projectName || '';
// //
if (project.customerId) { if (project.customerId) {
@ -822,14 +1014,22 @@ const submitForm = async (status: string, mode: boolean) => {
const submitData = { ...form.value }; const submitData = { ...form.value };
if (status !== 'draft') { if (status !== 'draft') {
//
// - // -
submitData.flowCode = FlowCodeEnum.SHIPPING_BILL_CODE; submitData.flowCode = FlowCodeEnum.SHIPPING_BILL_CODE;
const { tManagerId } = await buildFlowCopyVariables(submitData);
if (!tManagerId) {
proxy?.$modal.msgError('未获取到到货确认抄送人ID(tManagerId),请先维护合同负责人或项目抄送人员');
return;
}
submitData.tManagerId = tManagerId;
// //
submitData.variables = { submitData.variables = {
shippingBillId: submitData.shippingBillId, shippingBillId: submitData.shippingBillId,
shippingCode: submitData.shippingCode, shippingCode: submitData.shippingCode,
projectName: submitData.projectName, projectName: submitData.projectName,
customerName: submitData.customerName customerName: submitData.customerName,
tManagerId
}; };
// //
submitData.bizExt = { submitData.bizExt = {
@ -844,6 +1044,7 @@ const submitForm = async (status: string, mode: boolean) => {
form.value = res.data; form.value = res.data;
proxy?.$modal.msgSuccess('提交成功'); proxy?.$modal.msgSuccess('提交成功');
} else { } else {
// 稿
// //
submitData.outStockBillStatus = '1'; submitData.outStockBillStatus = '1';
submitData.flowStatus = 'draft'; submitData.flowStatus = 'draft';
@ -867,16 +1068,16 @@ const submitForm = async (status: string, mode: boolean) => {
/** 加载下拉数据 */ /** 加载下拉数据 */
const loadSelectOptions = async () => { const loadSelectOptions = async () => {
try { try {
// const userQuery: UserQuery = { pageNum: 1, pageSize: 9999 };
const customerRes = await getCrmCustomerInfoList(null); const [userRes, customerRes, supplierRes, warehouseRes] = await Promise.all([
listUser(userQuery),
getCrmCustomerInfoList(null),
getCrmSupplierInfoList(null),
getWmsWarehouseInfoList(null)
]);
userList.value = userRes.rows || [];
customerList.value = customerRes.data || []; customerList.value = customerRes.data || [];
//
const supplierRes = await getCrmSupplierInfoList(null);
supplierList.value = supplierRes.data || []; supplierList.value = supplierRes.data || [];
//
const warehouseRes = await getWmsWarehouseInfoList(null);
warehouseList.value = warehouseRes.data || []; warehouseList.value = warehouseRes.data || [];
} catch (error) { } catch (error) {
console.error('加载下拉数据失败:', error); console.error('加载下拉数据失败:', error);
@ -888,6 +1089,10 @@ const loadFormData = async (id: string | number) => {
try { try {
const res = await getWmsShippingBill(id); const res = await getWmsShippingBill(id);
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
await syncCopyManagerSelection();
arrivalConfirmForm.value.shippingBillId = res.data.shippingBillId;
arrivalConfirmForm.value.isAllReceiving = res.data.isAllReceiving || '0';
arrivalConfirmForm.value.arrivalReceiptOssId = res.data.arrivalReceiptOssId || '';
selectedProjectName.value = form.value.projectName || ''; selectedProjectName.value = form.value.projectName || '';
selectedContractName.value = form.value.contractName || ''; selectedContractName.value = form.value.contractName || '';
// SAP // SAP
@ -916,11 +1121,6 @@ const loadFormData = async (id: string | number) => {
})); }));
} }
//
if (form.value.shippingCode) {
isCodeGenerated.value = true;
}
// ID // ID
if (form.value.customerId) { if (form.value.customerId) {
try { try {
@ -935,6 +1135,22 @@ const loadFormData = async (id: string | number) => {
} }
}; };
const loadCurrentTask = async () => {
if (routeParams.value.type !== 'approval' || !routeParams.value.taskId) {
currentTask.value = null;
return true;
}
try {
const res = await getTask(String(routeParams.value.taskId));
currentTask.value = res.data;
return !!currentTask.value;
} catch (error) {
currentTask.value = null;
console.error('加载当前审批任务失败:', error);
return false;
}
};
// //
const handleApprovalRecord = () => { const handleApprovalRecord = () => {
approvalRecordRef.value?.init(form.value.shippingBillId); approvalRecordRef.value?.init(form.value.shippingBillId);
@ -946,22 +1162,52 @@ const submitCallback = async () => {
router.go(-1); router.go(-1);
}; };
// //
const approvalVerifyOpen = async () => { const approvalVerifyOpen = async () => {
if (routeParams.value.type === 'approval' && routeParams.value.taskId) {
const taskLoaded = await loadCurrentTask();
if (!taskLoaded || !currentTask.value) {
proxy?.$modal.msgError('当前任务信息加载失败,请刷新后重试');
return;
}
}
if (isArrivalConfirmApprover.value) {
//
//
const valid = await arrivalConfirmFormRef.value?.validate().catch(() => false);
if (!valid) return;
//
arrivalConfirmForm.value.shippingBillId = form.value.shippingBillId!;
arrivalConfirmForm.value.taskId = String(routeParams.value.taskId);
try {
const res = await arrivalConfirmShippingBill(arrivalConfirmForm.value);
Object.assign(form.value, res.data);
arrivalConfirmForm.value.isAllReceiving = res.data.isAllReceiving || arrivalConfirmForm.value.isAllReceiving;
arrivalConfirmForm.value.arrivalReceiptOssId = res.data.arrivalReceiptOssId || arrivalConfirmForm.value.arrivalReceiptOssId;
} catch (error) {
console.error('到货确认保存失败:', error);
return;
}
}
const prepared = await prepareTaskVariables();
if (!prepared) return;
await submitVerifyRef.value?.openDialog(routeParams.value.taskId); await submitVerifyRef.value?.openDialog(routeParams.value.taskId);
}; };
onMounted(async () => { onMounted(async () => {
nextTick(async () => { nextTick(async () => {
routeParams.value = route.query; routeParams.value = route.query;
//
proxy?.$modal.loading('正在加载数据,请稍后...'); proxy?.$modal.loading('正在加载数据,请稍后...');
await loadSelectOptions(); await loadSelectOptions();
const id = routeParams.value.id as string | number; const id = routeParams.value.id as string | number;
if (id && (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval')) { if (id && (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval')) {
// //稿
await loadFormData(id); await loadFormData(id);
} }
await loadCurrentTask();
proxy?.$modal.closeLoading(); proxy?.$modal.closeLoading();
}); });

@ -18,11 +18,37 @@
<el-form-item label="客户名称" prop="customerName"> <el-form-item label="客户名称" prop="customerName">
<el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable style="width: 180px" @keyup.enter="handleQuery" /> <el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable style="width: 180px" @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="发货类型" prop="shippingType">
<el-select v-model="queryParams.shippingType" placeholder="请选择发货类型" clearable style="width: 180px">
<el-option v-for="dict in shipping_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="发货状态" prop="shippingStatus"> <el-form-item label="发货状态" prop="shippingStatus">
<el-select v-model="queryParams.shippingStatus" placeholder="请选择发货状态" clearable style="width: 180px"> <el-select v-model="queryParams.shippingStatus" placeholder="请选择发货状态" clearable style="width: 180px">
<el-option v-for="dict in shipping_status" :key="dict.value" :label="dict.label" :value="dict.value" /> <el-option v-for="dict in shipping_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="需到货确认" prop="needArrivalConfirm">
<el-select v-model="queryParams.needArrivalConfirm" placeholder="请选择" clearable style="width: 180px">
<el-option v-for="dict in need_arrival_confirm" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="到货标识" prop="isAllReceiving">
<el-select v-model="queryParams.isAllReceiving" placeholder="请选择到货标识" clearable style="width: 180px">
<el-option v-for="dict in is_all_receiving" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="到货确认时间">
<el-date-picker
v-model="arrivalConfirmTimeRange"
type="daterange"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
value-format="YYYY-MM-DD HH:mm:ss"
clearable
/>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"></el-button> <el-button type="primary" icon="Search" @click="handleQuery"></el-button>
<el-button icon="Refresh" @click="resetQuery"></el-button> <el-button icon="Refresh" @click="resetQuery"></el-button>
@ -59,35 +85,57 @@
<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="shippingCode" min-width="140" v-if="columns[0].visible" /> <el-table-column label="发货单号" align="center" prop="shippingCode" min-width="140" v-if="columns[0].visible" />
<el-table-column label="SAP订单号" align="center" prop="orderContractCode" min-width="140" show-overflow-tooltip v-if="columns[1].visible" /> <el-table-column label="SAP订单号" align="center" prop="orderContractCode" min-width="140" show-overflow-tooltip v-if="columns[1].visible" />
<el-table-column label="发货方式" align="center" prop="shippingMode" width="120" v-if="columns[2].visible"> <el-table-column label="发货类型" align="center" prop="shippingType" width="100" v-if="columns[2].visible">
<template #default="scope">
<dict-tag :options="shipping_type" :value="scope.row.shippingType" />
</template>
</el-table-column>
<el-table-column label="发货方式" align="center" prop="shippingMode" width="120" v-if="columns[3].visible">
<template #default="scope"> <template #default="scope">
<dict-tag :options="shipping_mode" :value="scope.row.shippingMode" /> <dict-tag :options="shipping_mode" :value="scope.row.shippingMode" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="项目名称" align="center" prop="projectName" min-width="160" show-overflow-tooltip v-if="columns[3].visible" /> <el-table-column label="项目名称" align="center" prop="projectName" min-width="160" show-overflow-tooltip v-if="columns[4].visible" />
<el-table-column label="客户名称" align="center" prop="customerName" min-width="140" show-overflow-tooltip v-if="columns[4].visible" /> <el-table-column label="客户名称" align="center" prop="customerName" min-width="140" show-overflow-tooltip v-if="columns[5].visible" />
<el-table-column label="供应商" align="center" prop="supplier" min-width="120" show-overflow-tooltip v-if="columns[5].visible" /> <el-table-column label="供应商" align="center" prop="supplier" min-width="120" show-overflow-tooltip v-if="columns[6].visible" />
<el-table-column label="发货单状态" align="center" prop="outStockBillStatus" width="110" v-if="columns[6].visible"> <el-table-column label="发货单状态" align="center" prop="outStockBillStatus" width="110" v-if="columns[7].visible">
<template #default="scope"> <template #default="scope">
<dict-tag :options="shipping_bill_status" :value="scope.row.outStockBillStatus" /> <dict-tag :options="shipping_bill_status" :value="scope.row.outStockBillStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="发货状态" align="center" prop="shippingStatus" width="100" v-if="columns[7].visible"> <el-table-column label="发货状态" align="center" prop="shippingStatus" width="100" v-if="columns[8].visible">
<template #default="scope"> <template #default="scope">
<dict-tag :options="shipping_status" :value="scope.row.shippingStatus" /> <dict-tag :options="shipping_status" :value="scope.row.shippingStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="计划到货时间" align="center" prop="planArrivalTime" width="110" v-if="columns[8].visible"> <el-table-column label="需到货确认" align="center" prop="needArrivalConfirm" width="100" v-if="columns[9].visible">
<template #default="scope">
<dict-tag :options="need_arrival_confirm" :value="scope.row.needArrivalConfirm" />
</template>
</el-table-column>
<el-table-column label="到货标识" align="center" prop="isAllReceiving" width="100" v-if="columns[10].visible">
<template #default="scope">
<dict-tag :options="is_all_receiving" :value="scope.row.needArrivalConfirm === '1' ? scope.row.isAllReceiving : undefined" />
<span v-if="scope.row.needArrivalConfirm === '0'">-</span>
</template>
</el-table-column>
<el-table-column label="到货确认时间" align="center" prop="arrivalConfirmTime" width="160" v-if="columns[11].visible">
<template #default="scope">
<span>{{ proxy?.parseTime(scope.row.arrivalConfirmTime, '{y}-{m}-{d} {h}:{i}:{s}') || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="到货确认人" align="center" prop="arrivalConfirmByName" width="110" show-overflow-tooltip v-if="columns[12].visible" />
<el-table-column label="计划到货时间" align="center" prop="planArrivalTime" width="110" v-if="columns[13].visible">
<template #default="scope"> <template #default="scope">
<span>{{ proxy?.parseTime(scope.row.planArrivalTime, '{y}-{m}-{d}') }}</span> <span>{{ proxy?.parseTime(scope.row.planArrivalTime, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="实际发货时间" align="center" prop="shippingTime" width="110" v-if="columns[9].visible"> <el-table-column label="实际发货时间" align="center" prop="shippingTime" width="110" v-if="columns[14].visible">
<template #default="scope"> <template #default="scope">
<span>{{ proxy?.parseTime(scope.row.shippingTime, '{y}-{m}-{d}') }}</span> <span>{{ proxy?.parseTime(scope.row.shippingTime, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="110" v-if="columns[10].visible"> <el-table-column label="创建时间" align="center" prop="createTime" width="110" v-if="columns[15].visible">
<template #default="scope"> <template #default="scope">
<span>{{ proxy?.parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> <span>{{ proxy?.parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template> </template>
@ -249,8 +297,8 @@ const router = useRouter();
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
// //
const { shipping_mode, shipping_status, shipping_bill_status } = toRefs<any>( const { shipping_mode, shipping_status, shipping_bill_status, shipping_type, need_arrival_confirm, is_all_receiving } = toRefs<any>(
proxy?.useDict('shipping_mode', 'shipping_status', 'shipping_bill_status') proxy?.useDict('shipping_mode', 'shipping_status', 'shipping_bill_status', 'shipping_type', 'need_arrival_confirm', 'is_all_receiving')
); );
const wmsShippingBillList = ref<WmsShippingBillVO[]>([]); const wmsShippingBillList = ref<WmsShippingBillVO[]>([]);
@ -274,15 +322,20 @@ const dialog = reactive<DialogOption>({
const columns = ref<FieldOption[]>([ const columns = ref<FieldOption[]>([
{ key: 0, label: '发货单号', visible: true }, { key: 0, label: '发货单号', visible: true },
{ key: 1, label: 'SAP订单号', visible: true }, { key: 1, label: 'SAP订单号', visible: true },
{ key: 2, label: '发货方式', visible: true }, { key: 2, label: '发货类型', visible: true },
{ key: 3, label: '项目名称', visible: false }, { key: 3, label: '发货方式', visible: true },
{ key: 4, label: '客户名称', visible: true }, { key: 4, label: '项目名称', visible: false },
{ key: 5, label: '供应商', visible: true }, { key: 5, label: '客户名称', visible: true },
{ key: 6, label: '发货单状态', visible: true }, { key: 6, label: '供应商', visible: true },
{ key: 7, label: '发货状态', visible: true }, { key: 7, label: '发货单状态', visible: true },
{ key: 8, label: '计划到货时间', visible: true }, { key: 8, label: '发货状态', visible: true },
{ key: 9, label: '实际发货时间', visible: true }, { key: 9, label: '需到货确认', visible: true },
{ key: 10, label: '创建时间', visible: false } { key: 10, label: '到货标识', visible: true },
{ key: 11, label: '到货确认时间', visible: true },
{ key: 12, label: '到货确认人', visible: false },
{ key: 13, label: '计划到货时间', visible: true },
{ key: 14, label: '实际发货时间', visible: true },
{ key: 15, label: '创建时间', visible: false }
]); ]);
const initFormData: WmsShippingBillForm = { const initFormData: WmsShippingBillForm = {
@ -362,6 +415,8 @@ const data = reactive<PageData<WmsShippingBillForm, WmsShippingBillQuery>>({
outStockBillStatus: undefined, outStockBillStatus: undefined,
flowStatus: undefined, flowStatus: undefined,
shippingStatus: undefined, shippingStatus: undefined,
needArrivalConfirm: undefined,
isAllReceiving: undefined,
warehouseId: undefined, warehouseId: undefined,
warehouseName: undefined, warehouseName: undefined,
params: {} params: {}
@ -372,6 +427,7 @@ const data = reactive<PageData<WmsShippingBillForm, WmsShippingBillQuery>>({
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
const arrivalConfirmTimeRange = ref<string[]>();
/** 查询发货单列表 */ /** 查询发货单列表 */
const getList = async () => { const getList = async () => {
@ -397,12 +453,23 @@ const reset = () => {
/** 搜索按钮操作 */ /** 搜索按钮操作 */
const handleQuery = () => { const handleQuery = () => {
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
if (!queryParams.value.params) {
queryParams.value.params = {};
}
if (arrivalConfirmTimeRange.value && arrivalConfirmTimeRange.value.length === 2) {
queryParams.value.params.beginArrivalConfirmTime = arrivalConfirmTimeRange.value[0];
queryParams.value.params.endArrivalConfirmTime = arrivalConfirmTimeRange.value[1];
} else {
queryParams.value.params.beginArrivalConfirmTime = undefined;
queryParams.value.params.endArrivalConfirmTime = undefined;
}
getList(); getList();
}; };
/** 重置按钮操作 */ /** 重置按钮操作 */
const resetQuery = () => { const resetQuery = () => {
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
arrivalConfirmTimeRange.value = undefined;
handleQuery(); handleQuery();
}; };

Loading…
Cancel
Save