1.0.33 初始化采购信息

dev
yinq 3 months ago
parent 0f9db52a19
commit 5e0576c8a8

@ -0,0 +1,88 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { ProjectPurchaseVO, ProjectPurchaseForm, ProjectPurchaseQuery } from '@/api/oa/erp/projectPurchase/types';
/**
*
* @param query
* @returns {*}
*/
export const listProjectPurchase = (query?: ProjectPurchaseQuery): AxiosPromise<ProjectPurchaseVO[]> => {
return request({
url: '/oa/erp/projectPurchase/list',
method: 'get',
params: query
});
};
/**
*
* @param projectPurchaseId
*/
export const getProjectPurchase = (projectPurchaseId: string | number): AxiosPromise<ProjectPurchaseVO> => {
return request({
url: '/oa/erp/projectPurchase/' + projectPurchaseId,
method: 'get'
});
};
/**
*
* @param data
*/
export const addProjectPurchase = (data: ProjectPurchaseForm) => {
return request({
url: '/oa/erp/projectPurchase',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateProjectPurchase = (data: ProjectPurchaseForm) => {
return request({
url: '/oa/erp/projectPurchase',
method: 'put',
data: data
});
};
/**
*
* @param data
*/
export const projectPurchaseSubmitAndFlowStart = (data: ProjectPurchaseForm) => {
return request({
url: '/oa/erp/projectPurchase/submitAndFlowStart',
method: 'post',
data: data
});
};
/**
*
* @param projectPurchaseId
*/
export const delProjectPurchase = (projectPurchaseId: string | number | Array<string | number>) => {
return request({
url: '/oa/erp/projectPurchase/' + projectPurchaseId,
method: 'delete'
});
};
/**
*
* @param query
* @returns {*}
*/
export function getErpProjectPurchaseList (query) {
return request({
url: '/oa/erp/projectPurchase/getErpProjectPurchaseList',
method: 'get',
params: query
});
};

@ -0,0 +1,291 @@
export interface ProjectPurchaseVO {
/**
* ID
*/
projectPurchaseId: string | number;
/**
* ID
*/
projectId: string | number;
/**
*
*/
projectCode: string;
/**
*
*/
projectName?: string;
/**
*
*/
managerId: string | number;
/**
*
*/
chargeId: string | number;
/**
*
*/
deputyId: string | number;
/**
*
*/
reporterId: string | number;
/**
*
*/
consigneeUser: string;
/**
*
*/
consigneeAddress: string;
/**
*
*/
consigneeContact: string;
/**
* (1 2 3 4 5 6 7)
*/
projectPurchaseStatus: string;
/**
*
*/
flowStatus: string;
/**
*
*/
sortOrder: number;
/**
* /ID
*/
relationId: string | number;
/**
*
*/
remark: string;
/**
* 1 0
*/
spareFlag: string;
/**
* 1 0
*/
activeFlag: string;
}
export interface ProjectPurchaseForm extends BaseEntity {
/**
* ID
*/
projectPurchaseId?: string | number;
/**
* ID
*/
projectId?: string | number;
/**
*
*/
projectCode?: string;
/**
*
*/
projectName?: string;
/**
*
*/
managerId?: string | number;
/**
*
*/
chargeId?: string | number;
/**
*
*/
deputyId?: string | number;
/**
*
*/
reporterId?: string | number;
/**
*
*/
consigneeUser?: string;
/**
*
*/
consigneeAddress?: string;
/**
*
*/
consigneeContact?: string;
/**
* (1 2 3 4 5 6 7)
*/
projectPurchaseStatus?: string;
/**
*
*/
flowStatus?: string;
/**
*
*/
sortOrder?: number;
/**
* /ID
*/
relationId?: string | number;
/**
*
*/
remark?: string;
/**
* 1 0
*/
spareFlag?: string;
/**
* 1 0
*/
activeFlag?: string;
/**
*
*/
flowCode?: any;
/**
*
*/
variables?: any;
/**
*
*/
bizExt?: any;
}
export interface ProjectPurchaseQuery extends PageQuery {
/**
* ID
*/
projectId?: string | number;
/**
*
*/
projectCode?: string;
/**
*
*/
projectName?: string;
/**
*
*/
managerId?: string | number;
/**
*
*/
chargeId?: string | number;
/**
*
*/
deputyId?: string | number;
/**
*
*/
reporterId?: string | number;
/**
*
*/
consigneeUser?: string;
/**
*
*/
consigneeAddress?: string;
/**
*
*/
consigneeContact?: string;
/**
* (1 2 3 4 5 6 7)
*/
projectPurchaseStatus?: string;
/**
*
*/
flowStatus?: string;
/**
*
*/
sortOrder?: number;
/**
* /ID
*/
relationId?: string | number;
/**
* 1 0
*/
spareFlag?: string;
/**
* 1 0
*/
activeFlag?: string;
/**
*
*/
params?: any;
}

@ -0,0 +1,76 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { ProjectPurchaseMaterialVO, ProjectPurchaseMaterialForm, ProjectPurchaseMaterialQuery } from '@/api/oa/erp/projectPurchaseMaterial/types';
/**
*
* @param query
* @returns {*}
*/
export const listProjectPurchaseMaterial = (query?: ProjectPurchaseMaterialQuery): AxiosPromise<ProjectPurchaseMaterialVO[]> => {
return request({
url: '/oa/erp/projectPurchaseMaterial/list',
method: 'get',
params: query
});
};
/**
*
* @param purchaseMaterialId
*/
export const getProjectPurchaseMaterial = (purchaseMaterialId: string | number): AxiosPromise<ProjectPurchaseMaterialVO> => {
return request({
url: '/oa/erp/projectPurchaseMaterial/' + purchaseMaterialId,
method: 'get'
});
};
/**
*
* @param data
*/
export const addProjectPurchaseMaterial = (data: ProjectPurchaseMaterialForm) => {
return request({
url: '/oa/erp/projectPurchaseMaterial',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateProjectPurchaseMaterial = (data: ProjectPurchaseMaterialForm) => {
return request({
url: '/oa/erp/projectPurchaseMaterial',
method: 'put',
data: data
});
};
/**
*
* @param purchaseMaterialId
*/
export const delProjectPurchaseMaterial = (purchaseMaterialId: string | number | Array<string | number>) => {
return request({
url: '/oa/erp/projectPurchaseMaterial/' + purchaseMaterialId,
method: 'delete'
});
};
/**
*
* @param query
* @returns {*}
*/
export function getErpProjectPurchaseMaterialList (query) {
return request({
url: '/oa/erp/projectPurchaseMaterial/getErpProjectPurchaseMaterialList',
method: 'get',
params: query
});
};

@ -0,0 +1,276 @@
export interface ProjectPurchaseMaterialVO {
/**
* ID
*/
purchaseMaterialId: string | number;
/**
* ID
*/
projectPurchaseId: string | number;
/**
* ID
*/
relationDetailsId: string | number;
/**
* 1 0
*/
spareFlag: string;
/**
* 1 2
*/
purchasePlanFlag: string;
/**
* 1 2
*/
materialFlag: string;
/**
* ID
*/
materialId: string | number;
/**
* ID
*/
relationMaterialId: string | number;
/**
*
*/
materialCode: string;
/**
*
*/
materialName: string;
/**
*
*/
specificationDescription: string;
/**
* ID
*/
unitId: string | number;
/**
*
*/
needPurchaseAmount: number;
/**
*
*/
purchaseAmount: number;
/**
*
*/
arrivalTime: string;
/**
*
*/
serialNumber: number;
/**
*
*/
remark: string;
/**
* 1 0
*/
activeFlag: string;
}
export interface ProjectPurchaseMaterialForm extends BaseEntity {
/**
* ID
*/
purchaseMaterialId?: string | number;
/**
* ID
*/
projectPurchaseId?: string | number;
/**
* ID
*/
relationDetailsId?: string | number;
/**
* 1 0
*/
spareFlag?: string;
/**
* 1 2
*/
purchasePlanFlag?: string;
/**
* 1 2
*/
materialFlag?: string;
/**
* ID
*/
materialId?: string | number;
/**
* ID
*/
relationMaterialId?: string | number;
/**
*
*/
materialCode?: string;
/**
*
*/
materialName?: string;
/**
*
*/
specificationDescription?: string;
/**
* ID
*/
unitId?: string | number;
/**
*
*/
needPurchaseAmount?: number;
/**
*
*/
purchaseAmount?: number;
/**
*
*/
arrivalTime?: string;
/**
*
*/
serialNumber?: number;
/**
*
*/
remark?: string;
/**
* 1 0
*/
activeFlag?: string;
}
export interface ProjectPurchaseMaterialQuery extends PageQuery {
/**
* ID
*/
projectPurchaseId?: string | number;
/**
* ID
*/
relationDetailsId?: string | number;
/**
* 1 0
*/
spareFlag?: string;
/**
* 1 2
*/
purchasePlanFlag?: string;
/**
* 1 2
*/
materialFlag?: string;
/**
* ID
*/
materialId?: string | number;
/**
* ID
*/
relationMaterialId?: string | number;
/**
*
*/
materialCode?: string;
/**
*
*/
materialName?: string;
/**
*
*/
specificationDescription?: string;
/**
* ID
*/
unitId?: string | number;
/**
*
*/
needPurchaseAmount?: number;
/**
*
*/
purchaseAmount?: number;
/**
*
*/
arrivalTime?: string;
/**
*
*/
serialNumber?: number;
/**
* 1 0
*/
activeFlag?: string;
/**
*
*/
params?: any;
}

@ -54,6 +54,11 @@ export enum FlowCodeEnum {
*/
CONTRACT_CODE = 'OAC',
/**
* KEY
*/
PROJECT_PURCHASE_CODE = 'xmcg',
/**
* KEY
*/

@ -0,0 +1,629 @@
<template>
<div class="p-2" v-loading="pageLoading">
<approvalButton
class="mb-4"
@submitForm="submitForm"
@approvalVerifyOpen="approvalVerifyOpen"
@handleApprovalRecord="handleApprovalRecord"
:buttonLoading="buttonLoading"
:id="form.projectPurchaseId as any"
:status="form.flowStatus as any"
:pageType="pageType"
:mode="false"
/>
<el-card shadow="never" class="mb-4">
<el-form ref="projectPurchaseFormRef" :model="form" :rules="rules" label-width="120px" :disabled="isReadOnly">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="项目号" prop="projectCode">
<el-input v-model="form.projectCode" placeholder="请选择项目" readonly>
<template #append>
<el-button icon="Search" @click="openProjectSelect" :disabled="isReadOnly">选择</el-button>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目名称" prop="projectName">
<el-input v-model="form.projectName" placeholder="请选择项目后自动填充" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目经理" prop="managerId">
<el-select v-model="form.managerId" placeholder="请选择项目后自动填充" disabled>
<el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门负责人" prop="chargeId">
<el-select v-model="form.chargeId" placeholder="请选择项目后自动填充" disabled>
<el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分管副总" prop="deputyId">
<el-select v-model="form.deputyId" placeholder="请选择项目后自动填充" disabled>
<el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="提报人" prop="reporterId">
<el-input v-model="reporterName" placeholder="当前登录用户" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="收货人" prop="consigneeUser">
<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-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="收货地址" prop="consigneeAddress">
<el-input type="textarea" v-model="form.consigneeAddress" placeholder="请输入收货地址" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系方式" prop="consigneeContact">
<el-input v-model="form.consigneeContact" placeholder="请输入收货人联系方式" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否备件类" prop="spareFlag">
<el-radio-group v-model="form.spareFlag" disabled>
<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-col>
<el-col :span="24">
<el-form-item label="项目采购状态" prop="projectPurchaseStatus">
<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-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" :rows="3" placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-card shadow="never">
<template #header>
<div class="flex items-center justify-between">
<span>采购物料</span>
<div>
<el-button icon="Refresh" @click="loadMaterials" class="mr-2" :disabled="materialLoading">刷新</el-button>
<el-button
type="primary"
icon="Plus"
@click="handleAddMaterial"
:disabled="disableMaterialActions"
v-if="!isReadOnly"
>
新增物料
</el-button>
</div>
</div>
</template>
<el-table v-loading="materialLoading" :data="materialList" border>
<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="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="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="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="操作" 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="600px" append-to-body>
<el-form ref="materialFormRef" :model="materialForm" :rules="materialRules" label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="计划标识" prop="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-group>
</el-form-item>
</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-form-item label="物料名称" prop="materialName">
<el-input v-model="materialForm.materialName" 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-col>
<el-col :span="24">
<el-form-item label="详细参数" prop="specificationDescription">
<el-input v-model="materialForm.specificationDescription" placeholder="请输入详细参数" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位ID" prop="unitId">
<el-input v-model="materialForm.unitId" placeholder="请输入单位ID" />
</el-form-item>
</el-col>
<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-col>
<el-col :span="12">
<el-form-item label="需采购数量" prop="needPurchaseAmount">
<el-input-number v-model="materialForm.needPurchaseAmount" :min="0" :controls="false" class="w-full" placeholder="请输入数量" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="本次采购数量" prop="purchaseAmount">
<el-input-number v-model="materialForm.purchaseAmount" :min="0" :controls="false" class="w-full" placeholder="请输入数量" />
</el-form-item>
</el-col>
<el-col :span="12">
<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-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="序号" prop="serialNumber">
<el-input-number v-model="materialForm.serialNumber" :min="0" :controls="false" class="w-full" placeholder="请输入序号" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="materialForm.remark" type="textarea" :rows="3" placeholder="请输入备注" />
</el-form-item>
</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-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" :loading="materialLoading" @click="submitMaterialForm"> </el-button>
<el-button @click="materialDialog.visible = false"> </el-button>
</div>
</template>
</el-dialog>
<submitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" />
<approvalRecord ref="approvalRecordRef" />
<ProjectSelect ref="projectSelectRef" :multiple="false" @confirm-call-back="projectInfoSelectCallBack" />
</div>
</template>
<script setup name="ProjectPurchaseEdit" lang="ts">
import { computed, reactive, ref, watch, getCurrentInstance, toRefs } from 'vue';
import type { ComponentInternalInstance } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import type { FormInstance } from 'element-plus';
import { addProjectPurchase, getProjectPurchase, updateProjectPurchase, projectPurchaseSubmitAndFlowStart } from '@/api/oa/erp/projectPurchase';
import type { ProjectPurchaseForm } from '@/api/oa/erp/projectPurchase/types';
import {
listProjectPurchaseMaterial,
addProjectPurchaseMaterial,
updateProjectPurchaseMaterial,
delProjectPurchaseMaterial
} from '@/api/oa/erp/projectPurchaseMaterial';
import type { ProjectPurchaseMaterialVO, ProjectPurchaseMaterialForm } from '@/api/oa/erp/projectPurchaseMaterial/types';
import SubmitVerify from '@/components/Process/submitVerify.vue';
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import ApprovalButton from '@/components/Process/approvalButton.vue';
import ProjectSelect from '@/components/ProjectSelect/index.vue';
import { FlowCodeEnum } from '@/enums/OAEnum';
import type { ProjectInfoVO } from '@/api/oa/erp/projectInfo/types';
import { listUser } from '@/api/system/user';
import type { UserVO, UserQuery } from '@/api/system/user/types';
import { useUserStore } from '@/store/modules/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const router = useRouter();
const route = useRoute();
const userStore = useUserStore();
const { active_flag, project_purchase_status, spare_flag, purchase_plan_flag, material_flag } = toRefs<any>(
proxy?.useDict('active_flag', 'project_purchase_status', 'spare_flag', 'purchase_plan_flag', 'material_flag')
);
const routeParams = reactive<Record<string, any>>({});
const pageType = ref<string>((route.query.type as string) || 'add');
const isReadOnly = computed(() => pageType.value === 'view' || pageType.value === 'approval');
const pageLoading = ref(false);
const buttonLoading = ref(false);
const projectPurchaseFormRef = ref<FormInstance>();
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
const projectSelectRef = ref<InstanceType<typeof ProjectSelect>>();
const taskVariables = ref<Record<string, any>>({});
const initFormData: ProjectPurchaseForm & { projectName?: string } = {
projectPurchaseId: undefined,
projectId: undefined,
projectCode: undefined,
projectName: undefined,
managerId: undefined,
chargeId: undefined,
deputyId: undefined,
reporterId: undefined,
consigneeUser: undefined,
consigneeAddress: undefined,
consigneeContact: undefined,
projectPurchaseStatus: undefined,
flowStatus: undefined,
sortOrder: undefined,
relationId: undefined,
remark: undefined,
spareFlag: undefined,
activeFlag: undefined
};
const form = ref<ProjectPurchaseForm & { projectName?: string }>({ ...initFormData });
const rules = {
projectCode: [{ required: true, message: '项目号不能为空', trigger: 'blur' }],
consigneeUser: [{ required: true, message: '收货人不能为空', trigger: 'blur' }],
consigneeAddress: [{ required: true, message: '收货地址不能为空', trigger: 'blur' }]
};
const materialList = ref<ProjectPurchaseMaterialVO[]>([]);
const materialLoading = ref(false);
const disableMaterialActions = computed(() => isReadOnly.value || !form.value.projectPurchaseId || materialLoading.value);
//
const userList = ref<UserVO[]>([]);
const getUserList = async () => {
const params: UserQuery = { pageNum: 1, pageSize: 9999 };
const res = await listUser(params);
userList.value = res.rows || [];
};
//
const reporterName = computed(() => {
return userStore.nickname || '';
});
const materialDialog = reactive({
visible: false,
title: ''
});
const materialFormRef = ref<FormInstance>();
const initMaterialFormData: ProjectPurchaseMaterialForm = {
purchaseMaterialId: undefined,
projectPurchaseId: undefined,
relationDetailsId: undefined,
spareFlag: undefined,
purchasePlanFlag: undefined,
materialFlag: undefined,
materialId: undefined,
relationMaterialId: undefined,
materialCode: undefined,
materialName: undefined,
specificationDescription: undefined,
unitId: undefined,
needPurchaseAmount: undefined,
purchaseAmount: undefined,
arrivalTime: undefined,
serialNumber: undefined,
remark: undefined,
activeFlag: undefined
};
const materialForm = ref<ProjectPurchaseMaterialForm>({ ...initMaterialFormData });
const materialRules = {
materialName: [{ required: true, message: '物料名称不能为空', trigger: 'blur' }],
purchaseAmount: [{ required: true, message: '采购数量不能为空', trigger: 'blur' }]
};
const resetForm = () => {
Object.assign(form.value, initFormData);
form.value.projectPurchaseStatus = '1';
form.value.flowStatus = 'draft';
//
if (userStore.userId) {
form.value.reporterId = userStore.userId;
}
if (!form.value.activeFlag && active_flag.value?.length) {
form.value.activeFlag = active_flag.value[0].value;
}
};
const resetMaterialForm = () => {
Object.assign(materialForm.value, initMaterialFormData);
};
const loadDetail = async (projectPurchaseId: string | number) => {
if (!projectPurchaseId) {
resetForm();
materialList.value = [];
return;
}
pageLoading.value = true;
try {
resetForm();
const res = await getProjectPurchase(projectPurchaseId);
Object.assign(form.value, res?.data || {});
if (!form.value.projectPurchaseStatus) {
form.value.projectPurchaseStatus = '1';
}
if (!form.value.flowStatus) {
form.value.flowStatus = 'draft';
}
// ID
if (userList.value.length === 0) {
await getUserList();
}
await loadMaterials();
} finally {
pageLoading.value = false;
}
};
//
getUserList();
const loadMaterials = async () => {
if (!form.value.projectPurchaseId) {
materialList.value = [];
return;
}
materialLoading.value = true;
try {
const res = await listProjectPurchaseMaterial({ projectPurchaseId: form.value.projectPurchaseId, pageNum: 1, pageSize: 999 });
materialList.value = res?.rows || [];
} finally {
materialLoading.value = false;
}
};
const submitForm = async (status: string, mode?: boolean) => {
if (!projectPurchaseFormRef.value) return;
try {
await projectPurchaseFormRef.value.validate();
} catch (error) {
return;
}
buttonLoading.value = true;
try {
const payload: ProjectPurchaseForm & { projectName?: string } = { ...form.value };
if (status !== 'draft') {
payload.flowCode = FlowCodeEnum.PROJECT_PURCHASE_CODE;
payload.variables = {
projectPurchaseId: payload.projectPurchaseId,
projectCode: payload.projectCode,
projectName: payload.projectName
};
payload.bizExt = {
businessTitle: '项目采购审批',
businessCode: payload.projectCode
};
payload.projectPurchaseStatus = '2';
payload.flowStatus = 'waiting';
const res: any = await projectPurchaseSubmitAndFlowStart(payload);
if (res?.data) {
Object.assign(form.value, res.data);
} else {
Object.assign(form.value, payload);
}
proxy?.$modal.msgSuccess('操作成功');
proxy?.$tab.closePage();
router.go(-1);
} else {
payload.projectPurchaseStatus = '1';
payload.flowStatus = 'draft';
if (payload.projectPurchaseId) {
await updateProjectPurchase(payload);
} else {
const res: any = await addProjectPurchase(payload);
const newId = res?.data?.projectPurchaseId ?? res?.data ?? res?.msg;
if (newId) {
payload.projectPurchaseId = newId;
form.value.projectPurchaseId = newId as any;
}
}
Object.assign(form.value, payload);
proxy?.$modal.msgSuccess('暂存成功');
proxy?.$tab.closePage();
router.go(-1);
}
} finally {
buttonLoading.value = false;
}
};
const handleAddMaterial = () => {
if (isReadOnly.value) {
return;
}
if (!form.value.projectPurchaseId) {
proxy?.$modal.msgWarning('请先保存项目采购信息');
return;
}
resetMaterialForm();
materialForm.value.projectPurchaseId = form.value.projectPurchaseId;
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);
materialForm.value.spareFlag = materialForm.value.spareFlag || (spare_flag.value?.[0]?.value ?? undefined);
materialForm.value.activeFlag = materialForm.value.activeFlag || (active_flag.value?.[0]?.value ?? undefined);
materialDialog.title = '新增物料';
materialDialog.visible = true;
};
const handleEditMaterial = (row: ProjectPurchaseMaterialVO) => {
if (isReadOnly.value) {
return;
}
resetMaterialForm();
Object.assign(materialForm.value, row);
materialDialog.title = '编辑物料';
materialDialog.visible = true;
};
const submitMaterialForm = () => {
if (isReadOnly.value) {
return;
}
materialFormRef.value?.validate(async (valid: boolean) => {
if (!valid) return;
materialLoading.value = true;
try {
materialForm.value.projectPurchaseId = form.value.projectPurchaseId;
if (materialForm.value.purchaseMaterialId) {
await updateProjectPurchaseMaterial(materialForm.value);
} else {
await addProjectPurchaseMaterial(materialForm.value);
}
proxy?.$modal.msgSuccess('操作成功');
materialDialog.visible = false;
await loadMaterials();
} finally {
materialLoading.value = false;
}
});
};
const handleDeleteMaterial = async (row: ProjectPurchaseMaterialVO) => {
if (isReadOnly.value) {
return;
}
await proxy?.$modal.confirm(`是否确认删除物料"${row.materialName}"`);
await delProjectPurchaseMaterial(row.purchaseMaterialId);
proxy?.$modal.msgSuccess('删除成功');
await loadMaterials();
};
const approvalVerifyOpen = async () => {
taskVariables.value = {
projectPurchaseId: form.value.projectPurchaseId,
projectCode: form.value.projectCode,
projectName: form.value.projectName
};
const taskId = (routeParams.taskId as string) || (route.query.taskId as string);
if (taskId) {
await submitVerifyRef.value?.openDialog(taskId);
}
};
const handleApprovalRecord = () => {
if (form.value.projectPurchaseId) {
approvalRecordRef.value?.init(form.value.projectPurchaseId);
}
};
const submitCallback = async () => {
await proxy?.$tab.closePage(route);
router.go(-1);
};
//
const openProjectSelect = () => {
if (isReadOnly.value) {
return;
}
projectSelectRef.value?.open();
};
//
const projectInfoSelectCallBack = (data: ProjectInfoVO[]) => {
if (data && data.length > 0) {
const project = data[0];
form.value.projectId = project.projectId;
form.value.projectCode = project.projectCode;
form.value.projectName = project.projectName;
form.value.managerId = project.managerId;
form.value.chargeId = project.chargeId;
form.value.deputyId = project.deputyId;
form.value.spareFlag = project.spareFlag;
}
};
watch(
() => ({
id: route.query.id,
type: route.query.type,
taskId: route.query.taskId
}),
async (val) => {
Object.assign(routeParams, val);
pageType.value = (val.type as string) || 'add';
const projectPurchaseId = val.id as string | number | undefined;
if (projectPurchaseId) {
await loadDetail(projectPurchaseId);
} else {
resetForm();
materialList.value = [];
}
},
{ immediate: true }
);
</script>

@ -0,0 +1,254 @@
<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="100px">
<el-form-item label="项目号" prop="projectCode">
<el-input v-model="queryParams.projectCode" placeholder="请输入项目号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="项目名称" prop="projectName">
<el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="项目经理" prop="managerId">
<el-input v-model="queryParams.managerId" placeholder="请输入项目经理" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="项目采购状态" prop="projectPurchaseStatus">
<el-select v-model="queryParams.projectPurchaseStatus" placeholder="请选择项目采购状态" clearable>
<el-option v-for="dict in project_purchase_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="['oa/erp:projectPurchase:add']"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['oa/erp:projectPurchase:edit']"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['oa/erp:projectPurchase:remove']"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['oa/erp:projectPurchase:export']"></el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="projectPurchaseList" @selection-change="handleSelectionChange">
<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="projectId" width="120" v-if="columns[2].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="managerId" 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="deputyId" 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="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="consigneeContact" width="150" v-if="columns[12].visible" />
<el-table-column label="项目采购状态" align="center" prop="projectPurchaseStatus" width="140" v-if="columns[13].visible">
<template #default="scope">
<dict-tag :options="project_purchase_status" :value="scope.row.projectPurchaseStatus" />
</template>
</el-table-column>
<el-table-column label="流程状态" align="center" prop="flowStatus" width="120" v-if="columns[14].visible" />
<el-table-column label="排序号" align="center" prop="sortOrder" width="100" v-if="columns[15].visible" />
<el-table-column label="合同/预算ID" align="center" prop="relationId" width="130" v-if="columns[16].visible" />
<el-table-column label="备注" align="center" prop="remark" width="180" show-overflow-tooltip v-if="columns[17].visible" />
<el-table-column label="是否备件类" align="center" prop="spareFlag" width="120" v-if="columns[18].visible">
<template #default="scope">
<dict-tag :options="spare_flag" :value="scope.row.spareFlag" />
</template>
</el-table-column>
<el-table-column label="激活标识" align="center" prop="activeFlag" width="120" v-if="columns[19].visible">
<template #default="scope">
<dict-tag :options="active_flag" :value="scope.row.activeFlag" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" width="160" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="查看" placement="top">
<el-button link type="info" icon="View" @click="handleView(scope.row)"></el-button>
</el-tooltip>
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['oa/erp:projectPurchase:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['oa/erp:projectPurchase: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>
</div>
</template>
<script setup name="ProjectPurchase" lang="ts">
import { reactive, ref, toRefs, getCurrentInstance, onMounted } from 'vue';
import type { ComponentInternalInstance } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import type { FormInstance } from 'element-plus';
import { listProjectPurchase, delProjectPurchase } from '@/api/oa/erp/projectPurchase';
import type { ProjectPurchaseVO, ProjectPurchaseQuery } from '@/api/oa/erp/projectPurchase/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const router = useRouter();
const route = useRoute();
const { active_flag, project_purchase_status, spare_flag } = toRefs<any>(proxy?.useDict('active_flag', 'project_purchase_status', 'spare_flag'));
const projectPurchaseList = ref<ProjectPurchaseVO[]>([]);
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<FormInstance>();
const columns = ref<FieldOption[]>([
{ key: 0, label: `项目采购ID`, visible: true },
{ key: 1, label: `租户编号`, visible: true },
{ key: 2, label: `项目ID`, visible: true },
{ key: 3, label: `项目号`, visible: true },
{ key: 4, label: `项目名称`, visible: true },
{ key: 5, label: `项目经理`, visible: true },
{ key: 6, label: `部门负责人`, visible: true },
{ key: 7, label: `分管副总`, visible: true },
{ key: 8, label: `版本`, visible: true },
{ key: 9, label: `提报人`, visible: true },
{ key: 10, label: `收货人`, visible: true },
{ key: 11, label: `收货地址`, visible: true },
{ key: 12, label: `收货人联系方式`, visible: true },
{ key: 13, label: `项目采购状态`, visible: true },
{ key: 14, label: `流程状态`, visible: true },
{ key: 15, label: `排序号`, visible: true },
{ key: 16, label: `合同/预算ID`, visible: true },
{ key: 17, label: `备注`, visible: true },
{ key: 18, label: `是否备件类`, visible: true },
{ key: 19, label: `激活标识`, visible: true },
{ key: 20, label: `删除标志`, visible: true },
{ key: 21, label: `创建部门`, visible: true },
{ key: 22, label: `创建人`, visible: true },
{ key: 23, label: `创建时间`, visible: true },
{ key: 24, label: `更新人`, visible: true },
{ key: 25, label: `更新时间`, visible: true }
]);
const data = reactive<{ queryParams: ProjectPurchaseQuery }>({
queryParams: {
pageNum: 1,
pageSize: 10,
projectId: undefined,
projectCode: undefined,
projectName: undefined,
managerId: undefined,
chargeId: undefined,
deputyId: undefined,
reporterId: undefined,
consigneeUser: undefined,
consigneeAddress: undefined,
consigneeContact: undefined,
projectPurchaseStatus: undefined,
flowStatus: undefined,
sortOrder: undefined,
relationId: undefined,
spareFlag: undefined,
activeFlag: undefined,
params: {}
}
});
const { queryParams } = toRefs(data);
const getList = async () => {
loading.value = true;
const res = await listProjectPurchase(queryParams.value);
projectPurchaseList.value = res.rows;
total.value = res.total;
loading.value = false;
};
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
const handleSelectionChange = (selection: ProjectPurchaseVO[]) => {
ids.value = selection.map((item) => item.projectPurchaseId);
single.value = selection.length !== 1;
multiple.value = selection.length === 0;
};
const handleAdd = () => {
proxy?.$tab.closePage(route);
router.push({
path: '/purchase/projectPurchase/edit',
query: { type: 'add' }
});
};
const handleUpdate = (row?: ProjectPurchaseVO) => {
const projectPurchaseId = row?.projectPurchaseId || ids.value[0];
if (!projectPurchaseId) {
return;
}
proxy?.$tab.closePage(route);
router.push({
path: '/oa/erp/projectPurchase/edit',
query: { id: projectPurchaseId, type: 'update' }
});
};
const handleView = (row: ProjectPurchaseVO) => {
proxy?.$tab.closePage(route);
router.push({
path: '/oa/erp/projectPurchase/edit',
query: { id: row.projectPurchaseId, type: 'view' }
});
};
const handleDelete = async (row?: ProjectPurchaseVO) => {
const projectPurchaseIds = row?.projectPurchaseId || ids.value;
await proxy?.$modal.confirm(`是否确认删除项目采购信息编号为"${projectPurchaseIds}"的数据项?`).finally(() => {
loading.value = false;
});
await delProjectPurchase(projectPurchaseIds);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
const handleExport = () => {
proxy?.download(
'oa/erp/projectPurchase/export',
{
...queryParams.value
},
`projectPurchase_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>

@ -0,0 +1,446 @@
<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='100px'>
<el-form-item label="项目采购ID" prop="projectPurchaseId">
<el-input v-model="queryParams.projectPurchaseId" placeholder="请输入项目采购ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="关联明细ID" prop="relationDetailsId">
<el-input v-model="queryParams.relationDetailsId" placeholder="请输入关联明细ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="是否备件类" prop="spareFlag">
<el-select v-model="queryParams.spareFlag" placeholder="请选择是否备件类" clearable >
<el-option v-for="dict in spare_flag" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="计划标识" prop="purchasePlanFlag">
<el-select v-model="queryParams.purchasePlanFlag" placeholder="请选择计划标识" clearable >
<el-option v-for="dict in purchase_plan_flag" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="标准物料标识" prop="materialFlag">
<el-select v-model="queryParams.materialFlag" placeholder="请选择标准物料标识" clearable >
<el-option v-for="dict in material_flag" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="物料ID" prop="materialId">
<el-input v-model="queryParams.materialId" placeholder="请输入物料ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="销售物料ID" prop="relationMaterialId">
<el-input v-model="queryParams.relationMaterialId" placeholder="请输入销售物料ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="采购物料编码" prop="materialCode">
<el-input v-model="queryParams.materialCode" placeholder="请输入采购物料编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="采购物料名称" prop="materialName">
<el-input v-model="queryParams.materialName" placeholder="请输入采购物料名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="详细参数" prop="specificationDescription">
<el-input v-model="queryParams.specificationDescription" placeholder="请输入详细参数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="单位ID" prop="unitId">
<el-input v-model="queryParams.unitId" placeholder="请输入单位ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="需采购总数量" prop="needPurchaseAmount">
<el-input v-model="queryParams.needPurchaseAmount" placeholder="请输入需采购总数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="本次采购数量" prop="purchaseAmount">
<el-input v-model="queryParams.purchaseAmount" placeholder="请输入本次采购数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="需求到货时间" prop="arrivalTime">
<el-date-picker clearable
v-model="queryParams.arrivalTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择需求到货时间"
/>
</el-form-item>
<el-form-item label="序号" prop="serialNumber">
<el-input v-model="queryParams.serialNumber" placeholder="请输入序号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="激活标识" prop="activeFlag">
<el-select v-model="queryParams.activeFlag" placeholder="请选择激活标识" clearable >
<el-option v-for="dict in active_flag" :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="['oa/erp:projectPurchaseMaterial:add']"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['oa/erp:projectPurchaseMaterial:edit']"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['oa/erp:projectPurchaseMaterial:remove']"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['oa/erp:projectPurchaseMaterial:export']"></el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="projectPurchaseMaterialList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="项目采购ID" align="center" prop="purchaseMaterialId" v-if="columns[0].visible"/>
<el-table-column label="项目采购ID" align="center" prop="projectPurchaseId" v-if="columns[2].visible"/>
<el-table-column label="关联明细ID" align="center" prop="relationDetailsId" v-if="columns[3].visible"/>
<el-table-column label="是否备件类" align="center" prop="spareFlag" v-if="columns[4].visible">
<template #default="scope">
<dict-tag :options="spare_flag" :value="scope.row.spareFlag"/>
</template>
</el-table-column>
<el-table-column label="计划标识" align="center" prop="purchasePlanFlag" v-if="columns[5].visible">
<template #default="scope">
<dict-tag :options="purchase_plan_flag" :value="scope.row.purchasePlanFlag"/>
</template>
</el-table-column>
<el-table-column label="标准物料标识" align="center" prop="materialFlag" v-if="columns[6].visible">
<template #default="scope">
<dict-tag :options="material_flag" :value="scope.row.materialFlag"/>
</template>
</el-table-column>
<el-table-column label="物料ID" align="center" prop="materialId" v-if="columns[7].visible"/>
<el-table-column label="销售物料ID" align="center" prop="relationMaterialId" v-if="columns[8].visible"/>
<el-table-column label="采购物料编码" align="center" prop="materialCode" v-if="columns[9].visible"/>
<el-table-column label="采购物料名称" align="center" prop="materialName" v-if="columns[10].visible"/>
<el-table-column label="详细参数" align="center" prop="specificationDescription" v-if="columns[11].visible"/>
<el-table-column label="单位ID" align="center" prop="unitId" v-if="columns[12].visible"/>
<el-table-column label="需采购总数量" align="center" prop="needPurchaseAmount" v-if="columns[13].visible"/>
<el-table-column label="本次采购数量" align="center" prop="purchaseAmount" v-if="columns[14].visible"/>
<el-table-column label="需求到货时间" align="center" prop="arrivalTime" width="180" v-if="columns[15].visible">
<template #default="scope">
<span>{{ parseTime(scope.row.arrivalTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="序号" align="center" prop="serialNumber" v-if="columns[16].visible"/>
<el-table-column label="备注" align="center" prop="remark" v-if="columns[17].visible"/>
<el-table-column label="激活标识" align="center" prop="activeFlag" v-if="columns[18].visible">
<template #default="scope">
<dict-tag :options="active_flag" :value="scope.row.activeFlag"/>
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" 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="['oa/erp:projectPurchaseMaterial:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['oa/erp:projectPurchaseMaterial: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="projectPurchaseMaterialFormRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="项目采购ID" prop="projectPurchaseId">
<el-input v-model="form.projectPurchaseId" placeholder="请输入项目采购ID" />
</el-form-item>
<el-form-item label="关联明细ID" prop="relationDetailsId">
<el-input v-model="form.relationDetailsId" placeholder="请输入关联明细ID" />
</el-form-item>
<el-form-item label="是否备件类" prop="spareFlag">
<el-radio-group v-model="form.spareFlag">
<el-radio
v-for="dict in spare_flag"
:key="dict.value"
:value="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="计划标识" prop="purchasePlanFlag">
<el-radio-group v-model="form.purchasePlanFlag">
<el-radio
v-for="dict in purchase_plan_flag"
:key="dict.value"
:value="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="标准物料标识" prop="materialFlag">
<el-radio-group v-model="form.materialFlag">
<el-radio
v-for="dict in material_flag"
:key="dict.value"
:value="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="物料ID" prop="materialId">
<el-input v-model="form.materialId" placeholder="请输入物料ID" />
</el-form-item>
<el-form-item label="销售物料ID" prop="relationMaterialId">
<el-input v-model="form.relationMaterialId" placeholder="请输入销售物料ID" />
</el-form-item>
<el-form-item label="采购物料编码" prop="materialCode">
<el-input v-model="form.materialCode" placeholder="请输入采购物料编码" />
</el-form-item>
<el-form-item label="采购物料名称" prop="materialName">
<el-input v-model="form.materialName" placeholder="请输入采购物料名称" />
</el-form-item>
<el-form-item label="详细参数" prop="specificationDescription">
<el-input v-model="form.specificationDescription" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="单位ID" prop="unitId">
<el-input v-model="form.unitId" placeholder="请输入单位ID" />
</el-form-item>
<el-form-item label="需采购总数量" prop="needPurchaseAmount">
<el-input v-model="form.needPurchaseAmount" placeholder="请输入需采购总数量" />
</el-form-item>
<el-form-item label="本次采购数量" prop="purchaseAmount">
<el-input v-model="form.purchaseAmount" placeholder="请输入本次采购数量" />
</el-form-item>
<el-form-item label="需求到货时间" prop="arrivalTime">
<el-date-picker clearable
v-model="form.arrivalTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择需求到货时间">
</el-date-picker>
</el-form-item>
<el-form-item label="序号" prop="serialNumber">
<el-input v-model="form.serialNumber" placeholder="请输入序号" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="激活标识" prop="activeFlag">
<el-radio-group v-model="form.activeFlag">
<el-radio
v-for="dict in active_flag"
:key="dict.value"
:value="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</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="ProjectPurchaseMaterial" lang="ts">
import { listProjectPurchaseMaterial, getProjectPurchaseMaterial, delProjectPurchaseMaterial, addProjectPurchaseMaterial, updateProjectPurchaseMaterial } from '@/api/oa/erp/projectPurchaseMaterial';
import { ProjectPurchaseMaterialVO, ProjectPurchaseMaterialQuery, ProjectPurchaseMaterialForm } from '@/api/oa/erp/projectPurchaseMaterial/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { active_flag, purchase_plan_flag, material_flag, spare_flag } = toRefs<any>(proxy?.useDict('active_flag', 'purchase_plan_flag', 'material_flag', 'spare_flag'));
const projectPurchaseMaterialList = ref<ProjectPurchaseMaterialVO[]>([]);
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 projectPurchaseMaterialFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
//
const columns = ref<FieldOption[]>([
{ key: 0, label: `项目采购ID`, visible: true },
{ key: 1, label: `租户编号`, visible: true },
{ key: 2, label: `项目采购ID`, visible: true },
{ key: 3, label: `关联明细ID`, visible: true },
{ key: 4, label: `是否备件类`, visible: true },
{ key: 5, label: `计划标识`, visible: true },
{ key: 6, label: `标准物料标识`, visible: true },
{ key: 7, label: `物料ID`, visible: true },
{ key: 8, label: `销售物料ID`, visible: true },
{ key: 9, label: `采购物料编码`, visible: true },
{ key: 10, label: `采购物料名称`, visible: true },
{ key: 11, label: `详细参数`, visible: true },
{ key: 12, label: `单位ID`, visible: true },
{ key: 13, label: `需采购总数量`, visible: true },
{ key: 14, label: `本次采购数量`, visible: true },
{ key: 15, label: `需求到货时间`, visible: true },
{ key: 16, label: `序号`, visible: true },
{ key: 17, label: `备注`, visible: true },
{ key: 18, label: `激活标识`, visible: true },
{ key: 19, label: `删除标志`, visible: true },
{ key: 20, label: `创建部门`, visible: true },
{ key: 21, label: `创建人`, visible: true },
{ key: 22, label: `创建时间`, visible: true },
{ key: 23, label: `更新人`, visible: true },
{ key: 24, label: `更新时间`, visible: true },
]);
const initFormData: ProjectPurchaseMaterialForm = {
purchaseMaterialId: undefined,
projectPurchaseId: undefined,
relationDetailsId: undefined,
spareFlag: undefined,
purchasePlanFlag: undefined,
materialFlag: undefined,
materialId: undefined,
relationMaterialId: undefined,
materialCode: undefined,
materialName: undefined,
specificationDescription: undefined,
unitId: undefined,
needPurchaseAmount: undefined,
purchaseAmount: undefined,
arrivalTime: undefined,
serialNumber: undefined,
remark: undefined,
activeFlag: undefined,
}
const data = reactive<PageData<ProjectPurchaseMaterialForm, ProjectPurchaseMaterialQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
projectPurchaseId: undefined,
relationDetailsId: undefined,
spareFlag: undefined,
purchasePlanFlag: undefined,
materialFlag: undefined,
materialId: undefined,
relationMaterialId: undefined,
materialCode: undefined,
materialName: undefined,
specificationDescription: undefined,
unitId: undefined,
needPurchaseAmount: undefined,
purchaseAmount: undefined,
arrivalTime: undefined,
serialNumber: undefined,
activeFlag: undefined,
params: {
}
},
rules: {
materialFlag: [
{ required: true, message: "标准物料标识不能为空", trigger: "change" }
],
materialName: [
{ required: true, message: "采购物料名称不能为空", trigger: "blur" }
],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询项目采购物料列表 */
const getList = async () => {
loading.value = true;
const res = await listProjectPurchaseMaterial(queryParams.value);
projectPurchaseMaterialList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
projectPurchaseMaterialFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: ProjectPurchaseMaterialVO[]) => {
ids.value = selection.map(item => item.purchaseMaterialId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加项目采购物料";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: ProjectPurchaseMaterialVO) => {
reset();
const _purchaseMaterialId = row?.purchaseMaterialId || ids.value[0]
const res = await getProjectPurchaseMaterial(_purchaseMaterialId);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改项目采购物料";
}
/** 提交按钮 */
const submitForm = () => {
projectPurchaseMaterialFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.purchaseMaterialId) {
await updateProjectPurchaseMaterial(form.value).finally(() => buttonLoading.value = false);
} else {
await addProjectPurchaseMaterial(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: ProjectPurchaseMaterialVO) => {
const _purchaseMaterialIds = row?.purchaseMaterialId || ids.value;
await proxy?.$modal.confirm('是否确认删除项目采购物料编号为"' + _purchaseMaterialIds + '"的数据项?').finally(() => loading.value = false);
await delProjectPurchaseMaterial(_purchaseMaterialIds);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('oa/erp/projectPurchaseMaterial/export', {
...queryParams.value
}, `projectPurchaseMaterial_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>
Loading…
Cancel
Save