diff --git a/src/views/oa/erp/projectAcceptance/edit.vue b/src/views/oa/erp/projectAcceptance/edit.vue index b24801d..cb5607d 100644 --- a/src/views/oa/erp/projectAcceptance/edit.vue +++ b/src/views/oa/erp/projectAcceptance/edit.vue @@ -21,25 +21,27 @@ - - - - - - - + + + + + + + - + + + @@ -47,11 +49,11 @@ @@ -62,19 +64,23 @@ :limit="5" :fileSize="20" :fileType="['doc', 'docx', 'pdf', 'xls', 'xlsx', 'png', 'jpg', 'jpeg']" - :disabled="formDisabled" + :disabled="isFormDisabled" :isShowTip="true" /> - + + + - + + + @@ -83,8 +89,8 @@ v-model="form.remark" type="textarea" :rows="3" - placeholder="确认该项目达到客户验收节点,可以进行发货款收取(如设计)。" - :disabled="formDisabled" + placeholder="确认该项目达到客户验收节点,可以进行验收。" + :disabled="isFormDisabled" /> @@ -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({ ...initFormData }); +/** 用户下拉(与项目信息 devEdit 一致) */ +const userList = ref([]); +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(); } } }; diff --git a/src/views/oa/erp/projectAcceptance/index.vue b/src/views/oa/erp/projectAcceptance/index.vue index 02c81f0..13ee1d9 100644 --- a/src/views/oa/erp/projectAcceptance/index.vue +++ b/src/views/oa/erp/projectAcceptance/index.vue @@ -54,69 +54,48 @@ - - - - - + + + + + - + - + - - - - + + + - + + @@ -166,7 +145,7 @@ const dialog = reactive({ // 列显隐信息 const columns = ref([ - { 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(); const approvalRecordRef = ref>(); 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);