|
|
|
@ -122,13 +122,21 @@
|
|
|
|
<!-- </el-form-item>-->
|
|
|
|
<!-- </el-form-item>-->
|
|
|
|
<!-- </el-col>-->
|
|
|
|
<!-- </el-col>-->
|
|
|
|
<el-col :span="12">
|
|
|
|
<el-col :span="12">
|
|
|
|
<el-form-item label="合同模板ID" prop="templateId">
|
|
|
|
<el-form-item label="合同模板" prop="templateId">
|
|
|
|
<el-input v-model="form.templateId" placeholder="请输入合同模板ID" />
|
|
|
|
<el-select v-model="form.templateId" placeholder="请选择合同模板" filterable>
|
|
|
|
|
|
|
|
<el-option
|
|
|
|
|
|
|
|
v-for="item in printTemplateList"
|
|
|
|
|
|
|
|
:key="item.templateId"
|
|
|
|
|
|
|
|
:label="item.templateName + '-' + item.version"
|
|
|
|
|
|
|
|
:value="item.templateId"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</el-select>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</el-col>
|
|
|
|
</el-col>
|
|
|
|
<el-col :span="12">
|
|
|
|
<el-col :span="12">
|
|
|
|
<el-form-item label="附件ID" prop="ossId">
|
|
|
|
<el-form-item label="附件" prop="ossId">
|
|
|
|
<el-input v-model="form.ossId" type="textarea" placeholder="请输入内容" />
|
|
|
|
<!-- <el-input v-model="form.ossId" type="textarea" placeholder="请输入内容" />-->
|
|
|
|
|
|
|
|
<el-button type="primary" plain icon="Upload" @click="handleFile">上传合同附件</el-button>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</el-col>
|
|
|
|
</el-col>
|
|
|
|
<el-col :span="12">
|
|
|
|
<el-col :span="12">
|
|
|
|
@ -208,7 +216,7 @@
|
|
|
|
<el-col :span="12">
|
|
|
|
<el-col :span="12">
|
|
|
|
<el-form-item label="计划标识" prop="planFlag">
|
|
|
|
<el-form-item label="计划标识" prop="planFlag">
|
|
|
|
<el-radio-group v-model="materialForm.planFlag">
|
|
|
|
<el-radio-group v-model="materialForm.planFlag">
|
|
|
|
<el-radio v-for="dict in plan_flag" :key="dict.value" :value="dict.value">{{ dict.label }} </el-radio>
|
|
|
|
<el-radio v-for="dict in plan_flag" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
|
|
|
|
</el-radio-group>
|
|
|
|
</el-radio-group>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</el-col>
|
|
|
|
</el-col>
|
|
|
|
@ -326,6 +334,21 @@
|
|
|
|
</el-dialog>
|
|
|
|
</el-dialog>
|
|
|
|
<!-- 销售物料选择 -->
|
|
|
|
<!-- 销售物料选择 -->
|
|
|
|
<SaleMaterialSelect ref="saleMaterialSelectRef" :multiple="false" @confirm-call-back="saleMaterialSelectCallBack"></SaleMaterialSelect>
|
|
|
|
<SaleMaterialSelect ref="saleMaterialSelectRef" :multiple="false" @confirm-call-back="saleMaterialSelectCallBack"></SaleMaterialSelect>
|
|
|
|
|
|
|
|
<!-- 添加或修改OSS对象存储对话框 -->
|
|
|
|
|
|
|
|
<el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body>
|
|
|
|
|
|
|
|
<el-form ref="ossFormRef" :model="form" :rules="rules" label-width="80px">
|
|
|
|
|
|
|
|
<el-form-item label="文件名">
|
|
|
|
|
|
|
|
<fileUpload v-if="type === 0" v-model="ossFileModel" />
|
|
|
|
|
|
|
|
<imageUpload v-if="type === 1" v-model="ossFileModel" />
|
|
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
</el-form>
|
|
|
|
|
|
|
|
<template #footer>
|
|
|
|
|
|
|
|
<div class="dialog-footer">
|
|
|
|
|
|
|
|
<el-button type="primary" @click="submitOss">确 定</el-button>
|
|
|
|
|
|
|
|
<el-button @click="cancel">取 消</el-button>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-dialog>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
@ -340,6 +363,7 @@ import SaleMaterialSelect from '@/components/SaleMaterialSelect/index.vue';
|
|
|
|
import { ref } from 'vue';
|
|
|
|
import { ref } from 'vue';
|
|
|
|
import { listDept } from '@/api/system/dept';
|
|
|
|
import { listDept } from '@/api/system/dept';
|
|
|
|
import { getCrmCustomerInfoList } from '@/api/oa/crm/customerInfo';
|
|
|
|
import { getCrmCustomerInfoList } from '@/api/oa/crm/customerInfo';
|
|
|
|
|
|
|
|
import { getBasePrintTemplateList } from '@/api/oa/base/printTemplate';
|
|
|
|
|
|
|
|
|
|
|
|
const route = useRoute();
|
|
|
|
const route = useRoute();
|
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
|
@ -350,6 +374,15 @@ const { contract_category, business_direction, active_flag, contract_flag, contr
|
|
|
|
const buttonLoading = ref(false);
|
|
|
|
const buttonLoading = ref(false);
|
|
|
|
const contractInfoFormRef = ref<ElFormInstance>();
|
|
|
|
const contractInfoFormRef = ref<ElFormInstance>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const type = ref(0);
|
|
|
|
|
|
|
|
const dialog = reactive<DialogOption>({
|
|
|
|
|
|
|
|
visible: false,
|
|
|
|
|
|
|
|
title: ''
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// OSS 上传内部 v-model 中转,避免直接绑定到 form 的未知属性
|
|
|
|
|
|
|
|
const ossFileModel = ref<string | string[] | undefined>(undefined);
|
|
|
|
|
|
|
|
|
|
|
|
// 合同编号生成状态
|
|
|
|
// 合同编号生成状态
|
|
|
|
const isCodeGenerated = ref(false);
|
|
|
|
const isCodeGenerated = ref(false);
|
|
|
|
|
|
|
|
|
|
|
|
@ -363,6 +396,13 @@ const contractMaterialList = computed(() => {
|
|
|
|
return (form.value as any).contractMaterialList || [];
|
|
|
|
return (form.value as any).contractMaterialList || [];
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** 查询打印模板下拉框结构 */
|
|
|
|
|
|
|
|
const printTemplateList = ref([]);
|
|
|
|
|
|
|
|
const getPrintTemplateListSelect = async () => {
|
|
|
|
|
|
|
|
let res = await getBasePrintTemplateList(null);
|
|
|
|
|
|
|
|
printTemplateList.value = res.data;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/** 查询单位信息下拉框结构 */
|
|
|
|
/** 查询单位信息下拉框结构 */
|
|
|
|
const unitInfoList = ref([]);
|
|
|
|
const unitInfoList = ref([]);
|
|
|
|
const getUnitInfoListSelect = async () => {
|
|
|
|
const getUnitInfoListSelect = async () => {
|
|
|
|
@ -419,7 +459,9 @@ const materialRules = {
|
|
|
|
taxRate: [{ required: true, message: '税率不能为空', trigger: 'blur' }]
|
|
|
|
taxRate: [{ required: true, message: '税率不能为空', trigger: 'blur' }]
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const initFormData: ContractInfoForm = {
|
|
|
|
type ContractInfoFormEx = ContractInfoForm & { file?: any };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const initFormData: ContractInfoFormEx = {
|
|
|
|
contractId: undefined,
|
|
|
|
contractId: undefined,
|
|
|
|
contractFlag: '1',
|
|
|
|
contractFlag: '1',
|
|
|
|
contractCode: undefined,
|
|
|
|
contractCode: undefined,
|
|
|
|
@ -445,10 +487,11 @@ const initFormData: ContractInfoForm = {
|
|
|
|
taxRate: undefined,
|
|
|
|
taxRate: undefined,
|
|
|
|
remark: undefined,
|
|
|
|
remark: undefined,
|
|
|
|
activeFlag: '1',
|
|
|
|
activeFlag: '1',
|
|
|
|
contractMaterialList: []
|
|
|
|
contractMaterialList: [],
|
|
|
|
|
|
|
|
file: undefined
|
|
|
|
} as any;
|
|
|
|
} as any;
|
|
|
|
|
|
|
|
|
|
|
|
const data = reactive<{ form: ContractInfoForm; rules: any }>({
|
|
|
|
const data = reactive<{ form: ContractInfoFormEx; rules: any }>({
|
|
|
|
form: { ...initFormData },
|
|
|
|
form: { ...initFormData },
|
|
|
|
rules: {
|
|
|
|
rules: {
|
|
|
|
contractId: [{ required: true, message: '合同ID不能为空', trigger: 'blur' }]
|
|
|
|
contractId: [{ required: true, message: '合同ID不能为空', trigger: 'blur' }]
|
|
|
|
@ -476,7 +519,6 @@ watch(
|
|
|
|
// 生成合同编号
|
|
|
|
// 生成合同编号
|
|
|
|
const generateContractCode = async () => {
|
|
|
|
const generateContractCode = async () => {
|
|
|
|
if (isCodeGenerated.value) return; // 如果已经生成过,直接返回
|
|
|
|
if (isCodeGenerated.value) return; // 如果已经生成过,直接返回
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const params = { codeRuleCode: '1001' } as any;
|
|
|
|
const params = { codeRuleCode: '1001' } as any;
|
|
|
|
const res = await getRuleGenerateCode(params);
|
|
|
|
const res = await getRuleGenerateCode(params);
|
|
|
|
@ -509,6 +551,20 @@ const saleMaterialSelectCallBack = (data) => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** 取消按钮 */
|
|
|
|
|
|
|
|
function cancel() {
|
|
|
|
|
|
|
|
dialog.visible = false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** 文件按钮操作 */
|
|
|
|
|
|
|
|
const handleFile = () => {
|
|
|
|
|
|
|
|
type.value = 0;
|
|
|
|
|
|
|
|
dialog.visible = true;
|
|
|
|
|
|
|
|
dialog.title = '上传合同附件';
|
|
|
|
|
|
|
|
// 打开时回显已有附件
|
|
|
|
|
|
|
|
ossFileModel.value = form.value.ossId as any;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const submitForm = () => {
|
|
|
|
const submitForm = () => {
|
|
|
|
contractInfoFormRef.value?.validate(async (valid: boolean) => {
|
|
|
|
contractInfoFormRef.value?.validate(async (valid: boolean) => {
|
|
|
|
if (valid) {
|
|
|
|
if (valid) {
|
|
|
|
@ -524,6 +580,14 @@ const submitForm = () => {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 确认上传,仅关闭弹窗并依赖 v-model 同步到 ossId
|
|
|
|
|
|
|
|
const submitOss = () => {
|
|
|
|
|
|
|
|
// 将上传组件返回的 ossId 串写回表单
|
|
|
|
|
|
|
|
form.value.ossId = ossFileModel.value as any;
|
|
|
|
|
|
|
|
dialog.visible = false;
|
|
|
|
|
|
|
|
proxy?.$modal.msgSuccess('附件已更新');
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 获取合同物料列表
|
|
|
|
// 获取合同物料列表
|
|
|
|
const getContractMaterialList = async () => {
|
|
|
|
const getContractMaterialList = async () => {
|
|
|
|
if (!form.value.contractId) return;
|
|
|
|
if (!form.value.contractId) return;
|
|
|
|
@ -670,8 +734,17 @@ const submitMaterialForm = () => {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//初始化调用
|
|
|
|
|
|
|
|
const loadSelectOptions = () => {
|
|
|
|
|
|
|
|
getUnitInfoListSelect();
|
|
|
|
|
|
|
|
getDeptInfoListSelect();
|
|
|
|
|
|
|
|
getCustomerInfoListSelect();
|
|
|
|
|
|
|
|
getPrintTemplateListSelect();
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
onMounted(async () => {
|
|
|
|
onMounted(async () => {
|
|
|
|
const id = (route.query.id || route.params.id) as string | number;
|
|
|
|
const id = (route.query.id || route.params.id) as string | number;
|
|
|
|
|
|
|
|
loadSelectOptions();
|
|
|
|
if (id) {
|
|
|
|
if (id) {
|
|
|
|
proxy?.$modal.loading('正在加载数据,请稍后...');
|
|
|
|
proxy?.$modal.loading('正在加载数据,请稍后...');
|
|
|
|
const res = await getContractInfo(id);
|
|
|
|
const res = await getContractInfo(id);
|
|
|
|
@ -697,8 +770,16 @@ onMounted(async () => {
|
|
|
|
isCodeGenerated.value = false;
|
|
|
|
isCodeGenerated.value = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
await getUnitInfoListSelect();
|
|
|
|
|
|
|
|
await getDeptInfoListSelect();
|
|
|
|
|
|
|
|
await getCustomerInfoListSelect();
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 监听上传组件返回的文件(ossId 串)并同步到表单字段
|
|
|
|
|
|
|
|
// 同步表单初值到上传模型
|
|
|
|
|
|
|
|
watch(
|
|
|
|
|
|
|
|
() => form.value.ossId,
|
|
|
|
|
|
|
|
(val) => {
|
|
|
|
|
|
|
|
if (!dialog.visible) {
|
|
|
|
|
|
|
|
ossFileModel.value = val as any;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
);
|
|
|
|
</script>
|
|
|
|
</script>
|
|
|
|
|