|
|
|
|
@ -21,25 +21,27 @@
|
|
|
|
|
<el-input v-model="form.acceptanceCode" placeholder="由系统自动生成" disabled />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="项目名称" prop="projectName">
|
|
|
|
|
<el-input v-model="form.projectName" placeholder="请选择项目" readonly :disabled="routeParams.type !== 'add'">
|
|
|
|
|
<template #suffix>
|
|
|
|
|
<el-icon v-if="routeParams.type === 'add'" style="cursor: pointer" @click="openProjectSelect">
|
|
|
|
|
<Search />
|
|
|
|
|
</el-icon>
|
|
|
|
|
</template>
|
|
|
|
|
</el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="项目编号" prop="projectCode">
|
|
|
|
|
<el-input v-model="form.projectCode" placeholder="自动带出" disabled />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="项目名称" prop="projectName">
|
|
|
|
|
<el-input v-model="form.projectName" placeholder="请选择项目" readonly :disabled="isFormDisabled">
|
|
|
|
|
<template #suffix>
|
|
|
|
|
<el-icon style="cursor: pointer" @click="openProjectSelect">
|
|
|
|
|
<Search />
|
|
|
|
|
</el-icon>
|
|
|
|
|
</template>
|
|
|
|
|
</el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="项目经理" prop="managerId">
|
|
|
|
|
<el-input v-model="form.projectManagerName" placeholder="自动带出" disabled />
|
|
|
|
|
<el-select v-model="form.managerId" placeholder="由项目自动带出" disabled 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>
|
|
|
|
|
|
|
|
|
|
@ -47,11 +49,11 @@
|
|
|
|
|
<el-form-item label="验收日期" prop="acceptanceDate">
|
|
|
|
|
<el-date-picker
|
|
|
|
|
v-model="form.acceptanceDate"
|
|
|
|
|
type="datetime"
|
|
|
|
|
value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
|
|
type="date"
|
|
|
|
|
value-format="YYYY-MM-DD"
|
|
|
|
|
placeholder="请选择验收日期"
|
|
|
|
|
:disabled="formDisabled"
|
|
|
|
|
clearable
|
|
|
|
|
:disabled="isFormDisabled"
|
|
|
|
|
:clearable="false"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
@ -62,19 +64,23 @@
|
|
|
|
|
:limit="5"
|
|
|
|
|
:fileSize="20"
|
|
|
|
|
:fileType="['doc', 'docx', 'pdf', 'xls', 'xlsx', 'png', 'jpg', 'jpeg']"
|
|
|
|
|
:disabled="formDisabled"
|
|
|
|
|
:disabled="isFormDisabled"
|
|
|
|
|
:isShowTip="true"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="部门负责人" prop="chargeId">
|
|
|
|
|
<el-input v-model="form.chargeName" placeholder="自动带出" disabled />
|
|
|
|
|
<el-select v-model="form.chargeId" placeholder="由项目自动带出" disabled 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-col :span="12">
|
|
|
|
|
<el-form-item label="分管副总" prop="deputyId">
|
|
|
|
|
<el-input v-model="form.deputyName" placeholder="自动带出" disabled />
|
|
|
|
|
<el-select v-model="form.deputyId" placeholder="由项目自动带出" disabled 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-col :span="24">
|
|
|
|
|
@ -83,8 +89,8 @@
|
|
|
|
|
v-model="form.remark"
|
|
|
|
|
type="textarea"
|
|
|
|
|
:rows="3"
|
|
|
|
|
placeholder="确认该项目达到客户验收节点,可以进行发货款收取(如设计)。"
|
|
|
|
|
:disabled="formDisabled"
|
|
|
|
|
placeholder="确认该项目达到客户验收节点,可以进行验收。"
|
|
|
|
|
:disabled="isFormDisabled"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
@ -117,6 +123,7 @@ import {
|
|
|
|
|
import type { ProjectAcceptanceForm } from '@/api/oa/erp/projectAcceptance/types';
|
|
|
|
|
import { FlowCodeEnum } from '@/enums/OAEnum';
|
|
|
|
|
import SubmitVerify from '@/components/Process/submitVerify.vue';
|
|
|
|
|
import { getUserList } from '@/api/system/user';
|
|
|
|
|
|
|
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
|
|
const route = useRoute();
|
|
|
|
|
@ -167,12 +174,52 @@ const initFormData: ProjectAcceptanceForm = {
|
|
|
|
|
|
|
|
|
|
const form = ref<ProjectAcceptanceForm>({ ...initFormData });
|
|
|
|
|
|
|
|
|
|
/** 用户下拉(与项目信息 devEdit 一致) */
|
|
|
|
|
const userList = ref<any[]>([]);
|
|
|
|
|
const getUserSelectList = async () => {
|
|
|
|
|
const res = await getUserList({} as any);
|
|
|
|
|
userList.value = res.data || [];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 根据当前 ID 从 userList 同步流程变量用的姓名字段;下拉未包含该用户时保留表单已有姓名 */
|
|
|
|
|
const syncPersonNamesFromIds = () => {
|
|
|
|
|
const nick = (id: string | number | undefined, fallback: string | undefined) => {
|
|
|
|
|
if (id === undefined || id === null || id === '') return '';
|
|
|
|
|
const u = userList.value.find((x) => String(x.userId) === String(id));
|
|
|
|
|
if (u) return String(u.nickName || u.userName || '').trim();
|
|
|
|
|
return String(fallback ?? '').trim();
|
|
|
|
|
};
|
|
|
|
|
form.value.projectManagerName = nick(form.value.managerId, form.value.projectManagerName) as any;
|
|
|
|
|
form.value.chargeName = nick(form.value.chargeId, form.value.chargeName) as any;
|
|
|
|
|
form.value.deputyName = nick(form.value.deputyId, form.value.deputyName) as any;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const rules = {
|
|
|
|
|
projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
|
|
|
|
|
projectCode: [{ required: true, message: '项目号不能为空', trigger: 'blur' }],
|
|
|
|
|
acceptanceDate: [{ required: true, message: '验收日期不能为空', trigger: 'change' }]
|
|
|
|
|
acceptanceDate: [{ required: true, message: '验收日期不能为空', trigger: 'change' }],
|
|
|
|
|
ossId: [
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
validator: (_rule: any, _value: any, callback: (e?: Error) => void) => {
|
|
|
|
|
const v = form.value.ossId;
|
|
|
|
|
if (v === undefined || v === null || String(v).trim() === '') {
|
|
|
|
|
callback(new Error('请上传验收单附件'));
|
|
|
|
|
} else {
|
|
|
|
|
callback();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
trigger: 'change'
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
} as any;
|
|
|
|
|
|
|
|
|
|
/** 验收日期设为当天(yyyy-MM-dd) */
|
|
|
|
|
const setAcceptanceDateToday = () => {
|
|
|
|
|
const d = new Date();
|
|
|
|
|
form.value.acceptanceDate = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}` as any;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const ossIdString = computed({
|
|
|
|
|
get() {
|
|
|
|
|
const v = form.value.ossId as any;
|
|
|
|
|
@ -185,7 +232,6 @@ const ossIdString = computed({
|
|
|
|
|
|
|
|
|
|
/** 打开项目选择弹窗 */
|
|
|
|
|
const openProjectSelect = () => {
|
|
|
|
|
if (routeParams.value.type !== 'add') return;
|
|
|
|
|
projectSelectRef.value?.open();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@ -194,10 +240,11 @@ const projectInfoSelectCallBack = async (data: ProjectInfoVO[]) => {
|
|
|
|
|
if (data && data.length > 0) {
|
|
|
|
|
const project = data[0];
|
|
|
|
|
form.value.projectId = project.projectId;
|
|
|
|
|
form.value.projectName = project.projectName || '';
|
|
|
|
|
form.value.projectCode = project.projectCode || '';
|
|
|
|
|
// 调用 onProjectChange 填充其他关联字段
|
|
|
|
|
await onProjectChange(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;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@ -206,18 +253,14 @@ const onProjectChange = async (val: any) => {
|
|
|
|
|
const { data } = await prepareProjectAcceptanceByProjectId(val);
|
|
|
|
|
Object.assign(form.value, data);
|
|
|
|
|
form.value.projectId = val;
|
|
|
|
|
applyLeaderFromManager();
|
|
|
|
|
syncPersonNamesFromIds();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const applyLeaderFromManager = () => {};
|
|
|
|
|
|
|
|
|
|
const loadDetail = async () => {
|
|
|
|
|
console.log('loadDetail start');
|
|
|
|
|
if (!routeParams.value.id) return;
|
|
|
|
|
const res = await getProjectAcceptance(routeParams.value.id);
|
|
|
|
|
console.log('loadDetail res:', res);
|
|
|
|
|
Object.assign(form.value, res.data);
|
|
|
|
|
console.log('loadDetail end');
|
|
|
|
|
syncPersonNamesFromIds();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const submitForm = (status: string, mode: boolean) => {
|
|
|
|
|
@ -253,7 +296,7 @@ const submitForm = (status: string, mode: boolean) => {
|
|
|
|
|
};
|
|
|
|
|
form.value.bizExt = {
|
|
|
|
|
businessCode: form.value.acceptanceCode,
|
|
|
|
|
businessTitle: form.value.projectName
|
|
|
|
|
businessTitle: form.value.projectName + '验收确认'
|
|
|
|
|
};
|
|
|
|
|
await submitProjectAcceptanceAndFlowStart(form.value);
|
|
|
|
|
proxy?.$modal.msgSuccess('操作成功');
|
|
|
|
|
@ -264,7 +307,6 @@ const submitForm = (status: string, mode: boolean) => {
|
|
|
|
|
// 暂存:显式设置流程状态为 draft
|
|
|
|
|
form.value.flowStatus = 'draft' as any;
|
|
|
|
|
form.value.acceptanceStatus = '1'; // 业务状态:暂存
|
|
|
|
|
|
|
|
|
|
if (form.value.acceptanceId) {
|
|
|
|
|
await updateProjectAcceptance(form.value);
|
|
|
|
|
} else {
|
|
|
|
|
@ -296,38 +338,34 @@ const handleApprovalRecord = () => {
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 表单禁用逻辑(与项目信息保持一致,且只有草稿状态可编辑)
|
|
|
|
|
const formDisabled = computed(() => {
|
|
|
|
|
/** 表单是否禁用:查看/审批模式,或非暂存业务状态 */
|
|
|
|
|
const isFormDisabled = computed(() => {
|
|
|
|
|
if (routeParams.value.type === 'view' || routeParams.value.type === 'approval') {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
// 仅草稿状态(acceptanceStatus === '1')允许编辑,其余状态只读
|
|
|
|
|
// 仅暂存(acceptanceStatus === '1')可编辑,其余只读
|
|
|
|
|
if (!form.value.acceptanceStatus) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return form.value.acceptanceStatus !== '1';
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const setNowIfAdd = () => {
|
|
|
|
|
const d = new Date();
|
|
|
|
|
const s = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')} ${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}:${String(d.getSeconds()).padStart(2, '0')}`;
|
|
|
|
|
form.value.acceptanceDate = s as any;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const loadFormData = async () => {
|
|
|
|
|
// 获取路由参数(与项目信息保持一致)
|
|
|
|
|
routeParams.value = route.query;
|
|
|
|
|
await getUserSelectList();
|
|
|
|
|
// 重置表单
|
|
|
|
|
form.value = { ...initFormData };
|
|
|
|
|
|
|
|
|
|
await loadDetail();
|
|
|
|
|
|
|
|
|
|
if (routeParams.value.type === 'add') {
|
|
|
|
|
setNowIfAdd();
|
|
|
|
|
setAcceptanceDateToday();
|
|
|
|
|
// 如果传递了projectId参数,自动加载项目信息
|
|
|
|
|
const projectId = routeParams.value.projectId;
|
|
|
|
|
if (projectId) {
|
|
|
|
|
await onProjectChange(projectId);
|
|
|
|
|
setAcceptanceDateToday();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|