|
|
|
|
@ -96,7 +96,7 @@
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="合同类型" prop="contract_type_id">
|
|
|
|
|
<el-select v-model="form.contract_type_id" placeholder="请选择合同类型" filterable clearable style="width: 100%">
|
|
|
|
|
<el-select v-model="form.contract_type_id" placeholder="请选择合同类型" filterable clearable style="width: 100%" @change="handleContractTypeChange">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="type in contractTypeOptions"
|
|
|
|
|
:key="type.id"
|
|
|
|
|
@ -221,19 +221,19 @@
|
|
|
|
|
/>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="科室" prop="owner_department_ids" :required="isEditMode()">
|
|
|
|
|
<el-form-item label="科室" prop="owner_department_ids_array">
|
|
|
|
|
<el-select v-model="form.owner_department_ids_array" multiple placeholder="请选择科室" filterable clearable style="width: 100%">
|
|
|
|
|
<el-option v-for="dept in departmentList" :key="dept.id" :label="dept.name" :value="dept.id.toString()" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="合同签订/变更经办人" prop="handler_admin_ids" :required="isEditMode()">
|
|
|
|
|
<el-form-item label="合同签订/变更经办人" prop="handler_admin_ids_array">
|
|
|
|
|
<el-select v-model="form.handler_admin_ids_array" multiple placeholder="请选择经办人" filterable clearable style="width: 100%">
|
|
|
|
|
<el-option v-for="user in userList" :key="user.id" :label="user.name" :value="user.id.toString()" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="申请科室经办人" prop="apply_handler_id" :required="isEditMode()">
|
|
|
|
|
<el-form-item label="申请科室经办人" prop="apply_handler_id_array">
|
|
|
|
|
<el-select v-model="form.apply_handler_id_array" placeholder="请选择" filterable multiple clearable style="width: 100%">
|
|
|
|
|
<el-option v-for="user in userList" :key="user.id" :label="user.name" :value="user.id.toString()" />
|
|
|
|
|
</el-select>
|
|
|
|
|
@ -328,7 +328,6 @@ import {
|
|
|
|
|
getContractByFlowId,
|
|
|
|
|
createContract,
|
|
|
|
|
getBudgetYearOptions,
|
|
|
|
|
save,
|
|
|
|
|
} from "@/api/flow";
|
|
|
|
|
import { userListNoAuth, departmentListNoAuth } from "@/api/common";
|
|
|
|
|
|
|
|
|
|
@ -439,17 +438,17 @@ export default {
|
|
|
|
|
// 监听多选下拉变化,触发校验
|
|
|
|
|
'form.owner_department_ids_array'() {
|
|
|
|
|
if (this.$refs.formRef) {
|
|
|
|
|
this.$refs.formRef.validateField('owner_department_ids', () => {});
|
|
|
|
|
this.$refs.formRef.validateField('owner_department_ids_array', () => {});
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
'form.handler_admin_ids_array'() {
|
|
|
|
|
if (this.$refs.formRef) {
|
|
|
|
|
this.$refs.formRef.validateField('handler_admin_ids', () => {});
|
|
|
|
|
this.$refs.formRef.validateField('handler_admin_ids_array', () => {});
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
'form.apply_handler_id_array'() {
|
|
|
|
|
if (this.$refs.formRef) {
|
|
|
|
|
this.$refs.formRef.validateField('apply_handler_id', () => {});
|
|
|
|
|
this.$refs.formRef.validateField('apply_handler_id_array', () => {});
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
'form.pay_plans'() {
|
|
|
|
|
@ -463,6 +462,16 @@ export default {
|
|
|
|
|
this.$refs.formRef.validateField('amount_description', () => {});
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// 监听合同类型变化,动态调整预算年度和项目经费来源的必填校验
|
|
|
|
|
'form.contract_type_id'() {
|
|
|
|
|
// 当合同类型改变时,重新验证相关字段
|
|
|
|
|
if (this.$refs.formRef) {
|
|
|
|
|
this.$nextTick(() => {
|
|
|
|
|
this.$refs.formRef.validateField('fund_source_year_id');
|
|
|
|
|
this.$refs.formRef.validateField('fund_source_budget_data_id');
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
async mounted() {
|
|
|
|
|
// 组件初始化时,如果value为空但有flowId,尝试从流程数据恢复合同
|
|
|
|
|
@ -514,7 +523,21 @@ export default {
|
|
|
|
|
trigger: 'blur'
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
budget_amount: [{ required: true, message: "请填写项目预算金额", trigger: "blur" }],
|
|
|
|
|
budget_amount: [
|
|
|
|
|
{ required: true, message: "请填写项目预算金额", trigger: "blur" },
|
|
|
|
|
{
|
|
|
|
|
validator: (rule, value, callback) => {
|
|
|
|
|
if (value === null || value === undefined || value === '') {
|
|
|
|
|
callback(new Error('请填写项目预算金额'));
|
|
|
|
|
} else if (value === 0) {
|
|
|
|
|
callback(new Error('项目预算金额不能为0'));
|
|
|
|
|
} else {
|
|
|
|
|
callback();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
trigger: 'blur'
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
contract_type_id: [{ required: true, message: "请选择合同类型", trigger: "change" }],
|
|
|
|
|
sign_date: [{ required: true, message: "请选择签订日期", trigger: "change" }],
|
|
|
|
|
apply_date: [{ required: true, message: "请选择申请日期", trigger: "change" }],
|
|
|
|
|
@ -531,18 +554,56 @@ export default {
|
|
|
|
|
// 编辑时全量校验(与合同编辑页面对齐)
|
|
|
|
|
this.rules = {
|
|
|
|
|
...baseRules,
|
|
|
|
|
fund_source_year_id: [{ required: true, message: "请选择预算年度", trigger: "change" }],
|
|
|
|
|
fund_source_budget_data_id: [{ required: true, message: "请选择项目经费来源", trigger: "change" }],
|
|
|
|
|
fund_source_year_id: [
|
|
|
|
|
{
|
|
|
|
|
validator: (rule, value, callback) => {
|
|
|
|
|
// 默认必填,只有当合同类型明确是"收入类"时才撤销必填校验
|
|
|
|
|
const contractTypeName = this.getContractTypeName();
|
|
|
|
|
if (contractTypeName === '收入类') {
|
|
|
|
|
// 收入类不需要必填
|
|
|
|
|
callback();
|
|
|
|
|
} else {
|
|
|
|
|
// 其他情况(包括未选择合同类型)都需要必填
|
|
|
|
|
if (!value) {
|
|
|
|
|
callback(new Error('请选择预算年度'));
|
|
|
|
|
} else {
|
|
|
|
|
callback();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
trigger: 'change'
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
fund_source_budget_data_id: [
|
|
|
|
|
{
|
|
|
|
|
validator: (rule, value, callback) => {
|
|
|
|
|
// 默认必填,只有当合同类型明确是"收入类"时才撤销必填校验
|
|
|
|
|
const contractTypeName = this.getContractTypeName();
|
|
|
|
|
if (contractTypeName === '收入类') {
|
|
|
|
|
// 收入类不需要必填
|
|
|
|
|
callback();
|
|
|
|
|
} else {
|
|
|
|
|
// 其他情况(包括未选择合同类型)都需要必填
|
|
|
|
|
if (!value) {
|
|
|
|
|
callback(new Error('请选择项目经费来源'));
|
|
|
|
|
} else {
|
|
|
|
|
callback();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
trigger: 'change'
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
is_government_purchase: [{ required: true, message: "请选择是否为政府采购", trigger: "change" }],
|
|
|
|
|
purchase_category_id: [{ required: true, message: "请选择采购类别", trigger: "change" }],
|
|
|
|
|
purchase_method_id: [{ required: true, message: "请选择采购方式", trigger: "change" }],
|
|
|
|
|
is_accepted: [{ required: true, message: "请选择是否验收", trigger: "change" }],
|
|
|
|
|
handler_admin_ids: [
|
|
|
|
|
handler_admin_ids_array: [
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
validator: (rule, value, callback) => {
|
|
|
|
|
const ids = this.form.handler_admin_ids_array;
|
|
|
|
|
if (!ids || !Array.isArray(ids) || ids.length === 0) {
|
|
|
|
|
const ids = Array.isArray(value) ? value : [];
|
|
|
|
|
if (ids.length === 0) {
|
|
|
|
|
callback(new Error('请选择合同签订/变更经办人'));
|
|
|
|
|
} else {
|
|
|
|
|
callback();
|
|
|
|
|
@ -551,12 +612,12 @@ export default {
|
|
|
|
|
trigger: ['change', 'blur']
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
apply_handler_id: [
|
|
|
|
|
apply_handler_id_array: [
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
validator: (rule, value, callback) => {
|
|
|
|
|
const ids = this.form.apply_handler_id_array;
|
|
|
|
|
if (!ids || !Array.isArray(ids) || ids.length === 0) {
|
|
|
|
|
const ids = Array.isArray(value) ? value : [];
|
|
|
|
|
if (ids.length === 0) {
|
|
|
|
|
callback(new Error('请选择申请科室经办人'));
|
|
|
|
|
} else {
|
|
|
|
|
callback();
|
|
|
|
|
@ -565,12 +626,12 @@ export default {
|
|
|
|
|
trigger: ['change', 'blur']
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
owner_department_ids: [
|
|
|
|
|
owner_department_ids_array: [
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
validator: (rule, value, callback) => {
|
|
|
|
|
const ids = this.form.owner_department_ids_array;
|
|
|
|
|
if (!ids || !Array.isArray(ids) || ids.length === 0) {
|
|
|
|
|
const ids = Array.isArray(value) ? value : [];
|
|
|
|
|
if (ids.length === 0) {
|
|
|
|
|
callback(new Error('请选择科室'));
|
|
|
|
|
} else {
|
|
|
|
|
callback();
|
|
|
|
|
@ -614,12 +675,30 @@ export default {
|
|
|
|
|
]
|
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
// 获取合同类型名称
|
|
|
|
|
getContractTypeName() {
|
|
|
|
|
if (!this.form.contract_type_id) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const contractType = this.contractTypeOptions.find(type => type.id === this.form.contract_type_id);
|
|
|
|
|
return contractType ? contractType.name : null;
|
|
|
|
|
},
|
|
|
|
|
handleFundSourceYearChange() {
|
|
|
|
|
this.form.fund_source_budget_data_id = null;
|
|
|
|
|
if (this.form.fund_source_year_id) {
|
|
|
|
|
this.fetchFundSourceOptions(this.form.fund_source_year_id);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// 处理合同类型变化
|
|
|
|
|
handleContractTypeChange() {
|
|
|
|
|
// 当合同类型改变时,重新验证预算年度和项目经费来源
|
|
|
|
|
if (this.$refs.formRef) {
|
|
|
|
|
this.$nextTick(() => {
|
|
|
|
|
this.$refs.formRef.validateField('fund_source_year_id');
|
|
|
|
|
this.$refs.formRef.validateField('fund_source_budget_data_id');
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
async fetchBudgetYearOptions() {
|
|
|
|
|
try {
|
|
|
|
|
const response = await getBudgetYearOptions(false);
|
|
|
|
|
@ -829,7 +908,41 @@ export default {
|
|
|
|
|
// 再次清除校验状态,确保填充数据后不会触发校验
|
|
|
|
|
this.$nextTick(() => {
|
|
|
|
|
if (this.$refs.formRef) {
|
|
|
|
|
this.$refs.formRef.clearValidate();
|
|
|
|
|
// 如果是编辑模式,在数据加载完成后,需要正确设置多选字段的校验状态
|
|
|
|
|
if (this.isEditMode()) {
|
|
|
|
|
// 延迟一下,确保DOM已更新和数据已填充
|
|
|
|
|
this.$nextTick(() => {
|
|
|
|
|
if (this.$refs.formRef) {
|
|
|
|
|
// 对于多选字段,如果数组有值,清除校验错误;如果为空,触发校验显示错误
|
|
|
|
|
// 这样确保编辑模式下,已填充的字段不显示错误,未填充的字段显示错误
|
|
|
|
|
const fieldsToCheck = [
|
|
|
|
|
{ prop: 'owner_department_ids_array', arrayField: 'owner_department_ids_array' },
|
|
|
|
|
{ prop: 'handler_admin_ids_array', arrayField: 'handler_admin_ids_array' },
|
|
|
|
|
{ prop: 'apply_handler_id_array', arrayField: 'apply_handler_id_array' },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
fieldsToCheck.forEach(({ prop, arrayField }) => {
|
|
|
|
|
const ids = this.form[arrayField];
|
|
|
|
|
if (ids && Array.isArray(ids) && ids.length > 0) {
|
|
|
|
|
// 有值,清除该字段的校验错误
|
|
|
|
|
this.$refs.formRef.clearValidate(prop);
|
|
|
|
|
} else {
|
|
|
|
|
// 无值,先清除之前的错误状态,然后触发校验显示错误
|
|
|
|
|
// 这样可以确保校验状态正确更新
|
|
|
|
|
this.$refs.formRef.clearValidate(prop);
|
|
|
|
|
this.$nextTick(() => {
|
|
|
|
|
if (this.$refs.formRef) {
|
|
|
|
|
this.$refs.formRef.validateField(prop, () => {});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
// 新建模式,清除所有校验状态
|
|
|
|
|
this.$refs.formRef.clearValidate();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
@ -1222,11 +1335,12 @@ export default {
|
|
|
|
|
this.dialogVisible = false;
|
|
|
|
|
Message.success(contractId ? "合同更新成功" : "合同创建成功");
|
|
|
|
|
|
|
|
|
|
// 如果是新建合同(不是更新)且有flowId,自动保存到流程字段
|
|
|
|
|
// 如果是新建合同(不是更新)且有flowId,自动保存到流程字段(轻量接口)
|
|
|
|
|
if (!contractId && this.flowId && this.fieldName) {
|
|
|
|
|
try {
|
|
|
|
|
await save(this.flowId, {
|
|
|
|
|
[this.fieldName]: String(data.id),
|
|
|
|
|
await request.post(`/api/oa/flow/save-field/${this.flowId}`, {
|
|
|
|
|
field_name: this.fieldName,
|
|
|
|
|
field_value: String(data.id),
|
|
|
|
|
});
|
|
|
|
|
// 静默保存,不显示提示
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|