1.1.7 项目验收确认页面显示逻辑优化,流程回显数据逻辑bug修复

dev
yinq 3 weeks ago
parent fd8a0a486d
commit d1ff671dcb

@ -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();
}
}
};

@ -54,69 +54,48 @@
<el-table v-loading="loading" border :data="projectAcceptanceList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" type="index" width="50" align="center" v-if="columns[0].visible" />
<el-table-column label="验收确认编号" align="center" prop="acceptanceCode" v-if="columns[1].visible" />
<el-table-column label="项目号" align="center" prop="projectCode" v-if="columns[2].visible" />
<el-table-column label="项目名称" align="center" prop="projectName" v-if="columns[3].visible" />
<el-table-column label="项目经理" align="center" prop="projectManagerName" v-if="columns[4].visible">
<el-table-column label="序号" type="index" width="60" align="center" v-if="columns[0].visible" />
<el-table-column label="验收确认编号" align="center" prop="acceptanceCode" width="150" show-overflow-tooltip v-if="columns[1].visible" />
<el-table-column label="项目号" align="center" prop="projectCode" width="130" show-overflow-tooltip v-if="columns[2].visible" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="160" show-overflow-tooltip v-if="columns[3].visible" />
<el-table-column label="项目经理" align="center" prop="projectManagerName" width="100" show-overflow-tooltip v-if="columns[4].visible">
<template #default="scope">
<span>{{ scope.row.projectManagerName }}</span>
</template>
</el-table-column>
<el-table-column label="验收日期" align="center" prop="acceptanceDate" width="180" v-if="columns[5].visible">
<el-table-column label="验收日期" align="center" prop="acceptanceDate" width="112" v-if="columns[5].visible">
<template #default="scope">
<span>{{ parseTime(scope.row.acceptanceDate, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
<span>{{ parseTime(scope.row.acceptanceDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="验收单附件" align="center" v-if="columns[6].visible">
<el-table-column label="验收单附件" align="center" width="108" v-if="columns[6].visible">
<template #default="scope">
<el-button v-if="scope.row.ossId" link type="primary" icon="Download" @click="downloadOss(scope.row.ossId)"></el-button>
<span v-else style="color: #999">暂无附件</span>
</template>
</el-table-column>
<el-table-column label="部门负责人" align="center" prop="chargeName" v-if="columns[7].visible" />
<el-table-column label="分管副总" align="center" prop="deputyName" v-if="columns[8].visible" />
<el-table-column label="备注" align="center" prop="remark" v-if="columns[9].visible" />
<el-table-column label="业务状态" align="center" prop="acceptanceStatus" v-if="columns[10].visible">
<el-table-column label="部门负责人" align="center" prop="chargeName" width="110" show-overflow-tooltip v-if="columns[7].visible" />
<el-table-column label="分管副总" align="center" prop="deputyName" width="100" show-overflow-tooltip v-if="columns[8].visible" />
<el-table-column label="业务状态" align="center" prop="acceptanceStatus" width="104" v-if="columns[10].visible">
<template #default="scope">
<dict-tag :options="acceptance_status" :value="scope.row.acceptanceStatus || ''" />
</template>
</el-table-column>
<el-table-column label="流程状态" align="center" v-if="columns[11].visible">
<el-table-column label="流程状态" align="center" width="104" v-if="columns[11].visible">
<template #default="scope">
<dict-tag :options="wf_business_status" :value="scope.row.flowStatus || 'draft'" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" min-width="140" show-overflow-tooltip v-if="columns[9].visible" />
<el-table-column label="操作" align="center" width="120" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip
content="修改"
placement="top"
v-if="!scope.row.flowStatus || scope.row.flowStatus === 'draft' || scope.row.flowStatus === 'back' || scope.row.flowStatus === 'cancel'"
>
<el-tooltip content="修改" placement="top" v-if="isAcceptanceDraft(scope.row)">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['oa/erp:projectAcceptance:edit']"></el-button>
</el-tooltip>
<el-tooltip
content="查看"
placement="top"
v-if="scope.row.flowStatus && scope.row.flowStatus !== 'draft' && scope.row.flowStatus !== 'back'"
>
<el-tooltip content="查看" placement="top" v-if="isAcceptanceNotDraft(scope.row)">
<el-button link type="info" icon="DocumentChecked" @click="handleView(scope.row)"></el-button>
</el-tooltip>
<el-tooltip
content="删除"
placement="top"
v-if="!scope.row.flowStatus || scope.row.flowStatus === 'draft' || scope.row.flowStatus === 'back' || scope.row.flowStatus === 'cancel'"
>
<el-button
link
type="danger"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['oa/erp:projectAcceptance:remove']"
></el-button>
</el-tooltip>
<el-tooltip content="审批记录" placement="top" v-if="scope.row.flowStatus && scope.row.flowStatus !== 'draft'">
<el-tooltip content="审批记录" placement="top" v-if="isAcceptanceNotDraft(scope.row)">
<el-button link type="warning" icon="Histogram" @click="handleApprovalRecord(scope.row)"></el-button>
</el-tooltip>
</template>
@ -166,7 +145,7 @@ const dialog = reactive<DialogOption>({
//
const columns = ref<FieldOption[]>([
{ key: 0, label: `序号`, visible: true },
{ key: 0, label: `序号`, visible: false },
{ key: 1, label: `验收确认编号`, visible: true },
{ key: 2, label: `项目号`, visible: false },
{ key: 3, label: `项目名称`, visible: true },
@ -220,6 +199,18 @@ const acceptanceDateRange = ref<string[]>();
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
const refreshFlagKey = 'projectAcceptanceListShouldRefresh';
/** 业务状态为暂存1或未赋值可修改、删除与字典 acceptance_status 一致) */
const isAcceptanceDraft = (row: ProjectAcceptanceVO) => {
const s = row.acceptanceStatus;
return s === undefined || s === null || s === '' || s === '1';
};
/** 已非暂存(审批中、可用等):仅查看、审批记录 */
const isAcceptanceNotDraft = (row: ProjectAcceptanceVO) => {
const s = row.acceptanceStatus;
return s !== undefined && s !== null && s !== '' && s !== '1';
};
/** 查询项目验收确认列表 */
const getList = async () => {
loading.value = true;
@ -307,6 +298,19 @@ const handleView = (row: ProjectAcceptanceVO) => {
/** 删除按钮操作 */
const handleDelete = async (row?: ProjectAcceptanceVO) => {
if (row) {
if (!isAcceptanceDraft(row)) {
proxy?.$modal.msgWarning('仅暂存状态可删除');
return;
}
} else {
const rows = projectAcceptanceList.value.filter((r) => ids.value.includes(r.acceptanceId as any));
if (rows.some((r) => !isAcceptanceDraft(r))) {
proxy?.$modal.msgWarning('仅暂存状态的记录可删除,请重新选择');
return;
}
if (!ids.value.length) return;
}
const _acceptanceIds = row?.acceptanceId || ids.value;
await proxy?.$modal.confirm('是否确认删除项目验收确认编号为"' + _acceptanceIds + '"的数据项?').finally(() => (loading.value = false));
await delProjectAcceptance(_acceptanceIds);

Loading…
Cancel
Save