修复个人中心问题

This commit is contained in:
hero920103 committed 2026-09-29 18:25:09 +08:00
1 parent 0dc5c2f075
commit ca4220f92c
44 files changed
+1793 -310

No files matched your search

@@ -3,7 +3,7 @@
:model-value="visible"
:title="project?.project_name || '项目详情'"
direction="rtl"
size="900px"
size="1200px"
@update:model-value="handleClose"
@opened="loadAll"
>
@@ -168,11 +168,32 @@ function statusOptionsExcept(cur) {
return PROJECT_STATUS_OPTIONS.filter((i) => String(i.value) !== String(cur));
}
/** 项目状态流转:成功后更新本地展示并通知父组件刷新列表 */
/**
* 项目状态流转:成功后更新本地展示并通知父组件刷新列表。
* 置为「异常」时先询问原因,原因会写入操作日志,便于追溯是什么导致的。
*/
async function handleChangeStatus(status) {
if (!props.project?.id) return;
let reason = "";
if (Number(status) === 5) {
try {
const { value } = await ElMessageBox.prompt(
"请填写项目异常原因,该原因会记入操作日志",
"异常原因",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
inputPlaceholder: "如:客户预算取消 / 供应商延期交付",
inputValidator: (v) => (String(v || "").trim() ? true : "异常原因不能为空"),
}
);
reason = String(value || "").trim();
} catch (e) {
return; // 用户取消:不流转状态
}
}
try {
await changeProjectStatus(props.project.id, Number(status));
await changeProjectStatus(props.project.id, Number(status), reason);
ElMessage.success(`状态已更新为「${projectStatusText(status)}」`);
props.project.status = Number(status);
emit("refresh");
@@ -253,11 +274,13 @@ defineExpose({ loadAll });
width: 100%;
min-width: 0;
// 关键:内容区占满「容器剩余宽度」并允许收缩,内部表格才能随容器自适应
// 关键:内容区占满「容器剩余宽度」并允许收缩,内部表格才能随容器自适应。
// 注意不能用 overflow: hidden——它会把附件/日志等较高的内容直接截断,
// 让内容自然撑高,滚动交给 drawer 自身(el-drawer__body)处理。
:deep(.el-tabs__content) {
flex: 1;
min-width: 0;
overflow: hidden;
overflow: visible;
padding-left: 4px;
}
@@ -44,6 +44,16 @@
</el-select>
</el-form-item>
</el-col>
<!-- 状态选「异常」时必须写明原因,原因会写入操作日志便于追溯 -->
<el-col v-if="Number(form.status) === 5" :span="12">
<el-form-item label="异常原因" prop="reason">
<el-input
v-model="form.reason"
placeholder="如:客户预算取消 / 供应商延期交付"
maxlength="100"
/>
</el-form-item>
</el-col>
<el-col v-if="isBackToBack" :span="12">
<el-form-item label="项目毛利">
<span class="profit-value">¥{{ formatMoney(profitAmount) }}</span>
@@ -299,6 +309,8 @@ const defaultForm = () => ({
downstream_contact: "",
downstream_phone: "",
status: 1,
// 异常原因:状态选「异常」时必填,会写入操作日志
reason: "",
start_date: "",
end_date: "",
address: "",
@@ -402,8 +414,21 @@ async function loadProjectProducts(projectId) {
}
}
/** 异常原因校验:状态改为「异常」时必填(原本已是异常且未改状态的除外,项目表未存历史原因) */
const validateReason = (rule, value, callback) => {
const isAbnormal = Number(form.status) === 5;
const keepOriginal =
isEdit.value && Number(props.editData?.status) === 5 && Number(form.status) === 5;
if (isAbnormal && !keepOriginal && !String(value || "").trim()) {
callback(new Error("请填写项目异常原因"));
} else {
callback();
}
};
const rules = {
project_name: [{ required: true, message: "请输入项目名称", trigger: "blur" }],
reason: [{ validator: validateReason, trigger: "blur" }],
};
watch(
@@ -695,6 +720,8 @@ async function handleSubmit() {
downstream_amount: hasCounterparty.value ? Number(form.downstream_amount) || 0 : 0,
amount: upstream, // 兼容旧字段
status: Number(form.status) || 1,
// 异常原因:后端仅在状态变为「异常」时校验并写入日志,其他状态忽略
reason: form.reason,
start_date: form.start_date,
end_date: form.end_date,
upstream_contact: form.upstream_contact,