1.0.34 采购申请页面区分标准、非标准物料

dev
yinq 1 month ago
parent 2efbf747e2
commit bb7ff1d940

@ -14,6 +14,11 @@ export interface ProjectPurchaseVO {
*/ */
projectCode: string; projectCode: string;
/**
*
*/
purchaseCode?: string;
/** /**
* *
*/ */
@ -24,21 +29,41 @@ export interface ProjectPurchaseVO {
*/ */
managerId: string | number; managerId: string | number;
/**
*
*/
managerName?: string;
/** /**
* *
*/ */
chargeId: string | number; chargeId: string | number;
/**
*
*/
chargeName?: string;
/** /**
* *
*/ */
deputyId: string | number; deputyId: string | number;
/**
*
*/
deputyName?: string;
/** /**
* *
*/ */
reporterId: string | number; reporterId: string | number;
/**
*
*/
reporterName?: string;
/** /**
* *
*/ */
@ -107,6 +132,11 @@ export interface ProjectPurchaseForm extends BaseEntity {
*/ */
projectCode?: string; projectCode?: string;
/**
*
*/
purchaseCode?: string;
/** /**
* *
*/ */
@ -211,6 +241,11 @@ export interface ProjectPurchaseQuery extends PageQuery {
*/ */
projectCode?: string; projectCode?: string;
/**
*
*/
purchaseCode?: string;
/** /**
* *
*/ */

@ -13,7 +13,6 @@
/> />
<el-card shadow="never" class="mb-4"> <el-card shadow="never" class="mb-4">
<el-form ref="projectPurchaseFormRef" :model="form" :rules="rules" label-width="120px" :disabled="isReadOnly"> <el-form ref="projectPurchaseFormRef" :model="form" :rules="rules" label-width="120px" :disabled="isReadOnly">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
@ -25,6 +24,11 @@
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="采购编号" prop="purchaseCode">
<el-input v-model="form.purchaseCode" placeholder="自动生成" disabled />
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="项目名称" prop="projectName"> <el-form-item label="项目名称" prop="projectName">
<el-input v-model="form.projectName" placeholder="请选择项目后自动填充" disabled /> <el-input v-model="form.projectName" placeholder="请选择项目后自动填充" disabled />
@ -58,14 +62,14 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="收货人" prop="consigneeUser"> <el-form-item label="收货人" prop="consigneeUser">
<el-select v-model="form.consigneeUser" placeholder="请选择收货人" clearable filterable :disabled="isReadOnly" > <el-select v-model="form.consigneeUser" placeholder="请选择收货人" clearable filterable :disabled="isReadOnly">
<el-option v-for="user in userList" :key="user.nickName" :label="user.nickName" :value="user.nickName" /> <el-option v-for="user in userList" :key="user.nickName" :label="user.nickName" :value="user.nickName" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="收货地址" prop="consigneeAddress"> <el-form-item label="收货地址" prop="consigneeAddress">
<el-input type="textarea" v-model="form.consigneeAddress" placeholder="请输入收货地址" /> <el-input type="textarea" v-model="form.consigneeAddress" placeholder="请输入收货地址" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -83,7 +87,7 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="项目采购状态" prop="projectPurchaseStatus"> <el-form-item label="项目采购状态" prop="projectPurchaseStatus">
<el-radio-group v-model="form.projectPurchaseStatus" disabled> <el-radio-group v-model="form.projectPurchaseStatus" disabled>
<el-radio v-for="dict in project_purchase_status" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> <el-radio v-for="dict in project_purchase_status" :key="dict.value" :label="dict.value">{{ dict.label }} </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -96,39 +100,24 @@
</el-form> </el-form>
</el-card> </el-card>
<el-card shadow="never"> <el-card shadow="never" class="mb-4">
<template #header> <template #header>
<div class="flex items-center justify-between"> <div class="flex items-center">
<span>采购物料</span> <el-button type="primary" icon="Plus" @click="handleAddMaterial(true)" :disabled="disableMaterialActions" v-if="!isReadOnly" class="mr-2">
<div> 添加标准物料
<el-button icon="Refresh" @click="loadMaterials" class="mr-2" :disabled="materialLoading">刷新</el-button> </el-button>
<el-button
type="primary"
icon="Plus"
@click="handleAddMaterial"
:disabled="disableMaterialActions"
v-if="!isReadOnly"
>
新增物料
</el-button>
</div>
</div> </div>
</template> </template>
<el-table v-loading="materialLoading" :data="materialList" border> <el-table v-loading="materialLoading" :data="standardMaterialList" border :row-class-name="getRowClassName">
<el-table-column label="物料名称" prop="materialName" min-width="160" show-overflow-tooltip /> <el-table-column label="采购物料名称" prop="materialName" min-width="160" show-overflow-tooltip />
<el-table-column label="物料编码" prop="materialCode" min-width="140" show-overflow-tooltip /> <el-table-column label="采购物料编码" prop="materialCode" min-width="140" show-overflow-tooltip />
<el-table-column label="规格参数" prop="specificationDescription" min-width="160" show-overflow-tooltip /> <el-table-column label="规格参数" prop="specificationDescription" min-width="160" show-overflow-tooltip />
<el-table-column label="计划标识" prop="purchasePlanFlag" width="100"> <el-table-column label="计划标识" prop="purchasePlanFlag" width="100">
<template #default="scope"> <template #default="scope">
<dict-tag :options="purchase_plan_flag" :value="scope.row.purchasePlanFlag" /> <dict-tag :options="purchase_plan_flag" :value="scope.row.purchasePlanFlag" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="标准物料" prop="materialFlag" width="100">
<template #default="scope">
<dict-tag :options="material_flag" :value="scope.row.materialFlag" />
</template>
</el-table-column>
<el-table-column label="需采购数量" prop="needPurchaseAmount" width="120" /> <el-table-column label="需采购数量" prop="needPurchaseAmount" width="120" />
<el-table-column label="本次采购数量" prop="purchaseAmount" width="140" /> <el-table-column label="本次采购数量" prop="purchaseAmount" width="140" />
<el-table-column label="需求到货时间" prop="arrivalTime" width="180"> <el-table-column label="需求到货时间" prop="arrivalTime" width="180">
@ -136,16 +125,6 @@
<span>{{ proxy?.parseTime?.(scope.row.arrivalTime, '{y}-{m}-{d} {h}:{i}') || scope.row.arrivalTime }}</span> <span>{{ proxy?.parseTime?.(scope.row.arrivalTime, '{y}-{m}-{d} {h}:{i}') || scope.row.arrivalTime }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="是否备件" prop="spareFlag" width="100">
<template #default="scope">
<dict-tag :options="spare_flag" :value="scope.row.spareFlag" />
</template>
</el-table-column>
<el-table-column label="激活标识" prop="activeFlag" width="100">
<template #default="scope">
<dict-tag :options="active_flag" :value="scope.row.activeFlag" />
</template>
</el-table-column>
<el-table-column label="备注" prop="remark" min-width="160" show-overflow-tooltip /> <el-table-column label="备注" prop="remark" min-width="160" show-overflow-tooltip />
<el-table-column label="操作" fixed="right" width="160" align="center" v-if="!isReadOnly"> <el-table-column label="操作" fixed="right" width="160" align="center" v-if="!isReadOnly">
<template #default="scope"> <template #default="scope">
@ -156,58 +135,88 @@
</el-table> </el-table>
</el-card> </el-card>
<el-dialog :title="materialDialog.title" v-model="materialDialog.visible" width="600px" append-to-body> <el-card shadow="never">
<template #header>
<div class="flex items-center">
<el-button type="primary" icon="Plus" @click="handleAddMaterial(false)" :disabled="disableMaterialActions" v-if="!isReadOnly" class="mr-2">
添加非标准物料
</el-button>
</div>
</template>
<el-table v-loading="materialLoading" :data="nonStandardMaterialList" border :row-class-name="getRowClassName">
<el-table-column label="采购物料名称" prop="materialName" min-width="160" show-overflow-tooltip />
<el-table-column label="采购物料编码" prop="materialCode" min-width="140" show-overflow-tooltip />
<el-table-column label="规格参数" prop="specificationDescription" min-width="160" show-overflow-tooltip />
<el-table-column label="计划标识" prop="purchasePlanFlag" width="100">
<template #default="scope">
<dict-tag :options="purchase_plan_flag" :value="scope.row.purchasePlanFlag" />
</template>
</el-table-column>
<el-table-column label="需采购数量" prop="needPurchaseAmount" width="120" />
<el-table-column label="本次采购数量" prop="purchaseAmount" width="140" />
<el-table-column label="需求到货时间" prop="arrivalTime" width="180">
<template #default="scope">
<span>{{ proxy?.parseTime?.(scope.row.arrivalTime, '{y}-{m}-{d} {h}:{i}') || scope.row.arrivalTime }}</span>
</template>
</el-table-column>
<el-table-column label="备注" prop="remark" min-width="160" show-overflow-tooltip />
<el-table-column label="操作" fixed="right" width="160" align="center" v-if="!isReadOnly">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleEditMaterial(scope.row)"></el-button>
<el-button link type="danger" icon="Delete" @click="handleDeleteMaterial(scope.row)"></el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<el-dialog :title="materialDialog.title" v-model="materialDialog.visible" width="800px" append-to-body>
<el-form ref="materialFormRef" :model="materialForm" :rules="materialRules" label-width="120px"> <el-form ref="materialFormRef" :model="materialForm" :rules="materialRules" label-width="120px">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="计划标识" prop="purchasePlanFlag"> <el-form-item label="计划标识" prop="purchasePlanFlag">
<el-radio-group v-model="materialForm.purchasePlanFlag"> <el-radio-group v-model="materialForm.purchasePlanFlag">
<el-radio v-for="dict in purchase_plan_flag" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> <el-radio v-for="dict in purchase_plan_flag" :key="dict.value" :label="dict.value">{{ dict.label }} </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="12">-->
<!-- <el-form-item label="标准物料" prop="materialFlag">-->
<!-- <el-radio-group v-model="materialForm.materialFlag">-->
<!-- <el-radio v-for="dict in material_flag" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12"> <el-col :span="12">
<el-form-item label="标准物料" prop="materialFlag"> <el-form-item label="采购物料名称" prop="materialName">
<el-radio-group v-model="materialForm.materialFlag"> <el-input v-model="materialForm.materialName" placeholder="请输入采购物料名称" />
<el-radio v-for="dict in material_flag" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="物料名称" prop="materialName"> <el-form-item label="采购物料编码" prop="materialCode">
<el-input v-model="materialForm.materialName" placeholder="请输入物料名称" /> <el-input v-model="materialForm.materialCode" placeholder="请输入采购物料编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="物料编码" prop="materialCode">
<el-input v-model="materialForm.materialCode" placeholder="请输入物料编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="物料ID" prop="materialId">
<el-input v-model="materialForm.materialId" placeholder="请输入物料ID" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="销售物料ID" prop="relationMaterialId">
<el-input v-model="materialForm.relationMaterialId" placeholder="请输入销售物料ID" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="12">-->
<!-- <el-form-item label="物料ID" prop="materialId">-->
<!-- <el-input v-model="materialForm.materialId" placeholder="请输入物料ID" />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12">-->
<!-- <el-form-item label="销售物料ID" prop="relationMaterialId">-->
<!-- <el-input v-model="materialForm.relationMaterialId" placeholder="请输入销售物料ID" />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="24"> <el-col :span="24">
<el-form-item label="详细参数" prop="specificationDescription"> <el-form-item label="详细参数" prop="specificationDescription">
<el-input v-model="materialForm.specificationDescription" placeholder="请输入详细参数" /> <el-input v-model="materialForm.specificationDescription" placeholder="请输入详细参数" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="单位ID" prop="unitId"> <el-form-item label="单位" prop="unitId">
<el-input v-model="materialForm.unitId" placeholder="请输入单位ID" /> <el-select v-model="materialForm.unitId" placeholder="请选择单位" clearable filterable>
</el-form-item> <el-option v-for="item in unitInfoList" :key="item.unitId" :label="item.unitName" :value="item.unitId" />
</el-col> </el-select>
<el-col :span="12">
<el-form-item label="是否备件" prop="spareFlag">
<el-radio-group v-model="materialForm.spareFlag">
<el-radio v-for="dict in spare_flag" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -222,12 +231,12 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="需求到货时间" prop="arrivalTime"> <el-form-item label="需求到货时间" prop="arrivalTime">
<el-date-picker v-model="materialForm.arrivalTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择需求到货时间" /> <el-date-picker
</el-form-item> v-model="materialForm.arrivalTime"
</el-col> type="datetime"
<el-col :span="12"> value-format="YYYY-MM-DD HH:mm:ss"
<el-form-item label="序号" prop="serialNumber"> placeholder="请选择需求到货时间"
<el-input-number v-model="materialForm.serialNumber" :min="0" :controls="false" class="w-full" placeholder="请输入序号" /> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
@ -235,13 +244,6 @@
<el-input v-model="materialForm.remark" type="textarea" :rows="3" placeholder="请输入备注" /> <el-input v-model="materialForm.remark" type="textarea" :rows="3" placeholder="请输入备注" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item label="激活标识" prop="activeFlag">
<el-radio-group v-model="materialForm.activeFlag">
<el-radio v-for="dict in active_flag" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
<template #footer> <template #footer>
@ -259,18 +261,13 @@
</template> </template>
<script setup name="ProjectPurchaseEdit" lang="ts"> <script setup name="ProjectPurchaseEdit" lang="ts">
import { computed, reactive, ref, watch, getCurrentInstance, toRefs } from 'vue'; import { computed, reactive, ref, watch, getCurrentInstance, toRefs, onMounted, nextTick } from 'vue';
import type { ComponentInternalInstance } from 'vue'; import type { ComponentInternalInstance } from 'vue';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import type { FormInstance } from 'element-plus'; import type { FormInstance } from 'element-plus';
import { addProjectPurchase, getProjectPurchase, updateProjectPurchase, projectPurchaseSubmitAndFlowStart } from '@/api/oa/erp/projectPurchase'; import { addProjectPurchase, getProjectPurchase, updateProjectPurchase, projectPurchaseSubmitAndFlowStart } from '@/api/oa/erp/projectPurchase';
import type { ProjectPurchaseForm } from '@/api/oa/erp/projectPurchase/types'; import type { ProjectPurchaseForm } from '@/api/oa/erp/projectPurchase/types';
import { import { getErpProjectPurchaseMaterialList } from '@/api/oa/erp/projectPurchaseMaterial';
listProjectPurchaseMaterial,
addProjectPurchaseMaterial,
updateProjectPurchaseMaterial,
delProjectPurchaseMaterial
} from '@/api/oa/erp/projectPurchaseMaterial';
import type { ProjectPurchaseMaterialVO, ProjectPurchaseMaterialForm } from '@/api/oa/erp/projectPurchaseMaterial/types'; import type { ProjectPurchaseMaterialVO, ProjectPurchaseMaterialForm } from '@/api/oa/erp/projectPurchaseMaterial/types';
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';
@ -281,6 +278,7 @@ import type { ProjectInfoVO } from '@/api/oa/erp/projectInfo/types';
import { listUser } from '@/api/system/user'; import { listUser } from '@/api/system/user';
import type { UserVO, UserQuery } from '@/api/system/user/types'; import type { UserVO, UserQuery } from '@/api/system/user/types';
import { useUserStore } from '@/store/modules/user'; import { useUserStore } from '@/store/modules/user';
import { getBaseUnitInfoList } from '@/api/oa/base/unitInfo';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const router = useRouter(); const router = useRouter();
@ -307,6 +305,7 @@ const initFormData: ProjectPurchaseForm & { projectName?: string } = {
projectPurchaseId: undefined, projectPurchaseId: undefined,
projectId: undefined, projectId: undefined,
projectCode: undefined, projectCode: undefined,
purchaseCode: undefined,
projectName: undefined, projectName: undefined,
managerId: undefined, managerId: undefined,
chargeId: undefined, chargeId: undefined,
@ -334,7 +333,27 @@ const rules = {
const materialList = ref<ProjectPurchaseMaterialVO[]>([]); const materialList = ref<ProjectPurchaseMaterialVO[]>([]);
const materialLoading = ref(false); const materialLoading = ref(false);
const disableMaterialActions = computed(() => isReadOnly.value || !form.value.projectPurchaseId || materialLoading.value); const disableMaterialActions = computed(() => isReadOnly.value || materialLoading.value);
// materialFlag '1'
// materialFlag = 1
const standardMaterialList = computed(() => {
return materialList.value.filter((item) => item.materialFlag === '1');
});
// materialFlag '2'
const nonStandardMaterialList = computed(() => {
return materialList.value.filter((item) => item.materialFlag === '2');
});
//
const getRowClassName = ({ row }: { row: ProjectPurchaseMaterialVO }) => {
// '2' ''
if (row.purchasePlanFlag === '2' || row.purchasePlanFlag === '否' || row.purchasePlanFlag === '计划外') {
return 'plan-out-row';
}
return '';
};
// //
const userList = ref<UserVO[]>([]); const userList = ref<UserVO[]>([]);
@ -344,6 +363,13 @@ const getUserList = async () => {
userList.value = res.rows || []; userList.value = res.rows || [];
}; };
//
const unitInfoList = ref<any[]>([]);
const getUnitInfoListSelect = async () => {
const res = await getBaseUnitInfoList(null);
unitInfoList.value = res.data || [];
};
// //
const reporterName = computed(() => { const reporterName = computed(() => {
return userStore.nickname || ''; return userStore.nickname || '';
@ -379,10 +405,13 @@ const initMaterialFormData: ProjectPurchaseMaterialForm = {
const materialForm = ref<ProjectPurchaseMaterialForm>({ ...initMaterialFormData }); const materialForm = ref<ProjectPurchaseMaterialForm>({ ...initMaterialFormData });
const materialRules = { const materialRules = {
materialName: [{ required: true, message: '物料名称不能为空', trigger: 'blur' }], materialName: [{ required: true, message: '采购物料名称不能为空', trigger: 'blur' }],
purchaseAmount: [{ required: true, message: '采购数量不能为空', trigger: 'blur' }] purchaseAmount: [{ required: true, message: '采购数量不能为空', trigger: 'blur' }]
}; };
/**
* 重置主表表单
*/
const resetForm = () => { const resetForm = () => {
Object.assign(form.value, initFormData); Object.assign(form.value, initFormData);
form.value.projectPurchaseStatus = '1'; form.value.projectPurchaseStatus = '1';
@ -394,13 +423,18 @@ const resetForm = () => {
if (!form.value.activeFlag && active_flag.value?.length) { if (!form.value.activeFlag && active_flag.value?.length) {
form.value.activeFlag = active_flag.value[0].value; form.value.activeFlag = active_flag.value[0].value;
} }
}; };
/**
* 重置物料表单
*/
const resetMaterialForm = () => { const resetMaterialForm = () => {
Object.assign(materialForm.value, initMaterialFormData); Object.assign(materialForm.value, initMaterialFormData);
}; };
/**
* 根据项目采购ID加载详情
*/
const loadDetail = async (projectPurchaseId: string | number) => { const loadDetail = async (projectPurchaseId: string | number) => {
if (!projectPurchaseId) { if (!projectPurchaseId) {
resetForm(); resetForm();
@ -428,9 +462,9 @@ const loadDetail = async (projectPurchaseId: string | number) => {
} }
}; };
// /**
getUserList(); * 加载物料列表
*/
const loadMaterials = async () => { const loadMaterials = async () => {
if (!form.value.projectPurchaseId) { if (!form.value.projectPurchaseId) {
materialList.value = []; materialList.value = [];
@ -438,13 +472,17 @@ const loadMaterials = async () => {
} }
materialLoading.value = true; materialLoading.value = true;
try { try {
const res = await listProjectPurchaseMaterial({ projectPurchaseId: form.value.projectPurchaseId, pageNum: 1, pageSize: 999 }); const res = await getErpProjectPurchaseMaterialList({ projectPurchaseId: form.value.projectPurchaseId });
materialList.value = res?.rows || []; materialList.value = res?.data || [];
} finally { } finally {
materialLoading.value = false; materialLoading.value = false;
} }
}; };
/**
* 提交主表单
* @param status 提交状态draft or submit
*/
const submitForm = async (status: string, mode?: boolean) => { const submitForm = async (status: string, mode?: boolean) => {
if (!projectPurchaseFormRef.value) return; if (!projectPurchaseFormRef.value) return;
try { try {
@ -455,7 +493,16 @@ const submitForm = async (status: string, mode?: boolean) => {
buttonLoading.value = true; buttonLoading.value = true;
try { try {
const payload: ProjectPurchaseForm & { projectName?: string } = { ...form.value }; const payload: ProjectPurchaseForm & {
projectName?: string;
purchaseMaterialList?: ProjectPurchaseMaterialForm[];
} = {
...form.value,
purchaseMaterialList: materialList.value.map((item) => ({
...item,
projectPurchaseId: form.value.projectPurchaseId
}))
};
if (status !== 'draft') { if (status !== 'draft') {
payload.flowCode = FlowCodeEnum.PROJECT_PURCHASE_CODE; payload.flowCode = FlowCodeEnum.PROJECT_PURCHASE_CODE;
payload.variables = { payload.variables = {
@ -501,24 +548,32 @@ const submitForm = async (status: string, mode?: boolean) => {
} }
}; };
const handleAddMaterial = () => { /**
* 打开新增物料弹窗
* @param isStandard 是否标准物料
*/
const handleAddMaterial = (isStandard: boolean) => {
if (isReadOnly.value) { if (isReadOnly.value) {
return; return;
} }
if (!form.value.projectPurchaseId) {
proxy?.$modal.msgWarning('请先保存项目采购信息');
return;
}
resetMaterialForm(); resetMaterialForm();
materialForm.value.projectPurchaseId = form.value.projectPurchaseId;
materialForm.value.purchasePlanFlag = materialForm.value.purchasePlanFlag || (purchase_plan_flag.value?.[0]?.value ?? undefined); materialForm.value.purchasePlanFlag = materialForm.value.purchasePlanFlag || (purchase_plan_flag.value?.[0]?.value ?? undefined);
materialForm.value.materialFlag = materialForm.value.materialFlag || (material_flag.value?.[0]?.value ?? undefined); // isStandard materialFlag
if (isStandard) {
materialForm.value.materialFlag = '1'; //
materialDialog.title = '添加标准物料';
} else {
materialForm.value.materialFlag = '2'; //
materialDialog.title = '添加非标准物料';
}
materialForm.value.spareFlag = materialForm.value.spareFlag || (spare_flag.value?.[0]?.value ?? undefined); materialForm.value.spareFlag = materialForm.value.spareFlag || (spare_flag.value?.[0]?.value ?? undefined);
materialForm.value.activeFlag = materialForm.value.activeFlag || (active_flag.value?.[0]?.value ?? undefined); materialForm.value.activeFlag = materialForm.value.activeFlag || (active_flag.value?.[0]?.value ?? undefined);
materialDialog.title = '新增物料';
materialDialog.visible = true; materialDialog.visible = true;
}; };
/**
* 编辑物料
*/
const handleEditMaterial = (row: ProjectPurchaseMaterialVO) => { const handleEditMaterial = (row: ProjectPurchaseMaterialVO) => {
if (isReadOnly.value) { if (isReadOnly.value) {
return; return;
@ -529,39 +584,50 @@ const handleEditMaterial = (row: ProjectPurchaseMaterialVO) => {
materialDialog.visible = true; materialDialog.visible = true;
}; };
/**
* 提交物料表单仅操作本地列表
*/
const submitMaterialForm = () => { const submitMaterialForm = () => {
if (isReadOnly.value) { if (isReadOnly.value) {
return; return;
} }
materialFormRef.value?.validate(async (valid: boolean) => { materialFormRef.value?.validate((valid: boolean) => {
if (!valid) return; if (!valid) return;
materialLoading.value = true; if (materialForm.value.purchaseMaterialId) {
try { //
materialForm.value.projectPurchaseId = form.value.projectPurchaseId; const index = materialList.value.findIndex((item) => item.purchaseMaterialId === materialForm.value.purchaseMaterialId);
if (materialForm.value.purchaseMaterialId) { if (index !== -1) {
await updateProjectPurchaseMaterial(materialForm.value); Object.assign(materialList.value[index], materialForm.value);
} else {
await addProjectPurchaseMaterial(materialForm.value);
} }
proxy?.$modal.msgSuccess('操作成功'); } else {
materialDialog.visible = false; //
await loadMaterials(); materialList.value.push({ ...materialForm.value } as ProjectPurchaseMaterialVO);
} finally {
materialLoading.value = false;
} }
proxy?.$modal.msgSuccess('操作成功');
materialDialog.visible = false;
}); });
}; };
/**
* 删除物料仅操作本地列表
*/
const handleDeleteMaterial = async (row: ProjectPurchaseMaterialVO) => { const handleDeleteMaterial = async (row: ProjectPurchaseMaterialVO) => {
if (isReadOnly.value) { if (isReadOnly.value) {
return; return;
} }
await proxy?.$modal.confirm(`是否确认删除物料"${row.materialName}"`); await proxy?.$modal.confirm(`是否确认删除物料"${row.materialName}"`);
await delProjectPurchaseMaterial(row.purchaseMaterialId); const index = materialList.value.findIndex(
proxy?.$modal.msgSuccess('删除成功'); (item) => (row.purchaseMaterialId && item.purchaseMaterialId === row.purchaseMaterialId) || (!row.purchaseMaterialId && item === row)
await loadMaterials(); );
if (index !== -1) {
materialList.value.splice(index, 1);
proxy?.$modal.msgSuccess('删除成功');
}
}; };
/**
* 打开审批弹窗
*/
const approvalVerifyOpen = async () => { const approvalVerifyOpen = async () => {
taskVariables.value = { taskVariables.value = {
projectPurchaseId: form.value.projectPurchaseId, projectPurchaseId: form.value.projectPurchaseId,
@ -574,18 +640,27 @@ const approvalVerifyOpen = async () => {
} }
}; };
/**
* 查看审批记录
*/
const handleApprovalRecord = () => { const handleApprovalRecord = () => {
if (form.value.projectPurchaseId) { if (form.value.projectPurchaseId) {
approvalRecordRef.value?.init(form.value.projectPurchaseId); approvalRecordRef.value?.init(form.value.projectPurchaseId);
} }
}; };
/**
* 提交审批后的回调
*/
const submitCallback = async () => { const submitCallback = async () => {
await proxy?.$tab.closePage(route); await proxy?.$tab.closePage(route);
router.go(-1); router.go(-1);
}; };
// //
/**
* 打开项目选择弹窗
*/
const openProjectSelect = () => { const openProjectSelect = () => {
if (isReadOnly.value) { if (isReadOnly.value) {
return; return;
@ -594,6 +669,9 @@ const openProjectSelect = () => {
}; };
// //
/**
* 项目选择回调
*/
const projectInfoSelectCallBack = (data: ProjectInfoVO[]) => { const projectInfoSelectCallBack = (data: ProjectInfoVO[]) => {
if (data && data.length > 0) { if (data && data.length > 0) {
const project = data[0]; const project = data[0];
@ -607,23 +685,45 @@ const projectInfoSelectCallBack = (data: ProjectInfoVO[]) => {
} }
}; };
watch( //
() => ({ /**
id: route.query.id, * 初始化下拉数据
type: route.query.type, */
taskId: route.query.taskId const loadSelectOptions = () => {
}), getUserList();
async (val) => { getUnitInfoListSelect();
Object.assign(routeParams, val); };
pageType.value = (val.type as string) || 'add';
const projectPurchaseId = val.id as string | number | undefined; onMounted(async () => {
if (projectPurchaseId) { nextTick(async () => {
await loadDetail(projectPurchaseId); //
Object.assign(routeParams, route.query);
loadSelectOptions();
const id = routeParams.id as string | number;
const type = routeParams.type as string;
pageType.value = type || 'add';
if (id && (type === 'update' || type === 'view' || type === 'approval')) {
pageLoading.value = true;
try {
await loadDetail(id);
} finally {
pageLoading.value = false;
}
} else { } else {
resetForm(); resetForm();
materialList.value = []; materialList.value = [];
} }
}, });
{ immediate: true } });
);
</script> </script>
<style scoped>
:deep(.plan-out-row) {
background-color: #fffbe6 !important;
}
:deep(.plan-out-row:hover) {
background-color: #fff8d1 !important;
}
</style>

@ -7,6 +7,9 @@
<el-form-item label="项目号" prop="projectCode"> <el-form-item label="项目号" prop="projectCode">
<el-input v-model="queryParams.projectCode" placeholder="请输入项目号" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.projectCode" placeholder="请输入项目号" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="采购编号" prop="purchaseCode">
<el-input v-model="queryParams.purchaseCode" placeholder="请输入采购编号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="项目名称" prop="projectName"> <el-form-item label="项目名称" prop="projectName">
<el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
@ -50,12 +53,13 @@
<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="projectPurchaseId" width="120" v-if="columns[0].visible" /> <el-table-column label="项目采购ID" align="center" prop="projectPurchaseId" width="120" v-if="columns[0].visible" />
<el-table-column label="项目ID" align="center" prop="projectId" width="120" v-if="columns[2].visible" /> <el-table-column label="项目ID" align="center" prop="projectId" width="120" v-if="columns[2].visible" />
<el-table-column label="采购编号" align="center" prop="purchaseCode" width="150" v-if="columns[26].visible" />
<el-table-column label="项目号" align="center" prop="projectCode" width="150" v-if="columns[3].visible" /> <el-table-column label="项目号" align="center" prop="projectCode" width="150" v-if="columns[3].visible" />
<el-table-column label="项目名称" align="center" prop="projectName" width="200" show-overflow-tooltip v-if="columns[4].visible" /> <el-table-column label="项目名称" align="center" prop="projectName" width="200" show-overflow-tooltip v-if="columns[4].visible" />
<el-table-column label="项目经理" align="center" prop="managerId" width="120" v-if="columns[5].visible" /> <el-table-column label="项目经理" align="center" prop="managerName" width="120" v-if="columns[5].visible" />
<el-table-column label="部门负责人" align="center" prop="chargeId" width="120" v-if="columns[6].visible" /> <el-table-column label="部门负责人" align="center" prop="chargeName" width="120" v-if="columns[6].visible" />
<el-table-column label="分管副总" align="center" prop="deputyId" width="120" v-if="columns[7].visible" /> <el-table-column label="分管副总" align="center" prop="deputyName" width="120" v-if="columns[7].visible" />
<el-table-column label="提报人" align="center" prop="reporterId" width="120" v-if="columns[9].visible" /> <el-table-column label="提报人" align="center" prop="reporterName" width="120" v-if="columns[9].visible" />
<el-table-column label="收货人" align="center" prop="consigneeUser" width="120" v-if="columns[10].visible" /> <el-table-column label="收货人" align="center" prop="consigneeUser" width="120" v-if="columns[10].visible" />
<el-table-column label="收货地址" align="center" prop="consigneeAddress" width="200" show-overflow-tooltip v-if="columns[11].visible" /> <el-table-column label="收货地址" align="center" prop="consigneeAddress" width="200" show-overflow-tooltip v-if="columns[11].visible" />
<el-table-column label="收货人联系方式" align="center" prop="consigneeContact" width="150" v-if="columns[12].visible" /> <el-table-column label="收货人联系方式" align="center" prop="consigneeContact" width="150" v-if="columns[12].visible" />
@ -122,9 +126,9 @@ const total = ref(0);
const queryFormRef = ref<FormInstance>(); const queryFormRef = ref<FormInstance>();
const columns = ref<FieldOption[]>([ const columns = ref<FieldOption[]>([
{ key: 0, label: `项目采购ID`, visible: true }, { key: 0, label: `项目采购ID`, visible: false },
{ key: 1, label: `租户编号`, visible: true }, { key: 1, label: `租户编号`, visible: false },
{ key: 2, label: `项目ID`, visible: true }, { key: 2, label: `项目ID`, visible: false },
{ key: 3, label: `项目号`, visible: true }, { key: 3, label: `项目号`, visible: true },
{ key: 4, label: `项目名称`, visible: true }, { key: 4, label: `项目名称`, visible: true },
{ key: 5, label: `项目经理`, visible: true }, { key: 5, label: `项目经理`, visible: true },
@ -137,17 +141,18 @@ const columns = ref<FieldOption[]>([
{ key: 12, label: `收货人联系方式`, visible: true }, { key: 12, label: `收货人联系方式`, visible: true },
{ key: 13, label: `项目采购状态`, visible: true }, { key: 13, label: `项目采购状态`, visible: true },
{ key: 14, label: `流程状态`, visible: true }, { key: 14, label: `流程状态`, visible: true },
{ key: 15, label: `排序号`, visible: true }, { key: 15, label: `排序号`, visible: false },
{ key: 16, label: `合同/预算ID`, visible: true }, { key: 16, label: `合同/预算ID`, visible: false },
{ key: 17, label: `备注`, visible: true }, { key: 17, label: `备注`, visible: false },
{ key: 18, label: `是否备件类`, visible: true }, { key: 18, label: `是否备件类`, visible: false },
{ key: 19, label: `激活标识`, visible: true }, { key: 19, label: `激活标识`, visible: false },
{ key: 20, label: `删除标志`, visible: true }, { key: 20, label: `删除标志`, visible: false },
{ key: 21, label: `创建部门`, visible: true }, { key: 21, label: `创建部门`, visible: false },
{ key: 22, label: `创建人`, visible: true }, { key: 22, label: `创建人`, visible: false },
{ key: 23, label: `创建时间`, visible: true }, { key: 23, label: `创建时间`, visible: false },
{ key: 24, label: `更新人`, visible: true }, { key: 24, label: `更新人`, visible: false },
{ key: 25, label: `更新时间`, visible: true } { key: 25, label: `更新时间`, visible: false },
{ key: 26, label: `采购编号`, visible: true }
]); ]);
const data = reactive<{ queryParams: ProjectPurchaseQuery }>({ const data = reactive<{ queryParams: ProjectPurchaseQuery }>({
@ -156,6 +161,7 @@ const data = reactive<{ queryParams: ProjectPurchaseQuery }>({
pageSize: 10, pageSize: 10,
projectId: undefined, projectId: undefined,
projectCode: undefined, projectCode: undefined,
purchaseCode: undefined,
projectName: undefined, projectName: undefined,
managerId: undefined, managerId: undefined,
chargeId: undefined, chargeId: undefined,
@ -215,7 +221,7 @@ const handleUpdate = (row?: ProjectPurchaseVO) => {
} }
proxy?.$tab.closePage(route); proxy?.$tab.closePage(route);
router.push({ router.push({
path: '/oa/erp/projectPurchase/edit', path: '/purchase/projectPurchase/edit',
query: { id: projectPurchaseId, type: 'update' } query: { id: projectPurchaseId, type: 'update' }
}); });
}; };

Loading…
Cancel
Save