|
|
|
|
@ -21,21 +21,20 @@
|
|
|
|
|
ref="contractInfoFormRef"
|
|
|
|
|
:model="form"
|
|
|
|
|
:loading="buttonLoading"
|
|
|
|
|
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
|
|
|
|
|
:rules="rules"
|
|
|
|
|
label-width="120px"
|
|
|
|
|
>
|
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="有无合同" prop="contractFlag">
|
|
|
|
|
<el-radio-group v-model="form.contractFlag">
|
|
|
|
|
<el-radio-group v-model="form.contractFlag" :disabled="isFormDisabled">
|
|
|
|
|
<el-radio v-for="dict in contract_flag" :key="dict.value" :value="dict.value">{{ dict.label }} </el-radio>
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="合同编号" prop="contractCode">
|
|
|
|
|
<el-input v-model="form.contractCode" placeholder="请输入合同编号">
|
|
|
|
|
<el-input v-model="form.contractCode" placeholder="请输入合同编号" :disabled="isFormDisabled">
|
|
|
|
|
<template #append>
|
|
|
|
|
<el-button type="primary" @click="generateContractCode" :disabled="isCodeGenerated">生成合同编号 </el-button>
|
|
|
|
|
</template>
|
|
|
|
|
@ -44,7 +43,7 @@
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="合同名称" prop="contractName">
|
|
|
|
|
<el-input v-model="form.contractName" placeholder="请输入合同名称" />
|
|
|
|
|
<el-input v-model="form.contractName" placeholder="请输入合同名称" :disabled="isFormDisabled"/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
@ -54,30 +53,30 @@
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="合同类型" prop="contractType">
|
|
|
|
|
<el-select v-model="form.contractType" placeholder="请选择合同类型">
|
|
|
|
|
<el-option v-for="dict in contract_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<!-- <el-col :span="12">-->
|
|
|
|
|
<!-- <el-form-item label="合同类型" prop="contractType">-->
|
|
|
|
|
<!-- <el-select v-model="form.contractType" placeholder="请选择合同类型">-->
|
|
|
|
|
<!-- <el-option v-for="dict in contract_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>-->
|
|
|
|
|
<!-- </el-select>-->
|
|
|
|
|
<!-- </el-form-item>-->
|
|
|
|
|
<!-- </el-col>-->
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="业务方向" prop="businessDirection">
|
|
|
|
|
<el-select v-model="form.businessDirection" placeholder="请选择业务方向">
|
|
|
|
|
<el-select v-model="form.businessDirection" placeholder="请选择业务方向" :disabled="isFormDisabled">
|
|
|
|
|
<el-option v-for="dict in business_direction" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="部门" prop="contractDeptId">
|
|
|
|
|
<el-select v-model="form.contractDeptId" disabled>
|
|
|
|
|
<el-select v-model="form.contractDeptId" :disabled="isFormDisabled">
|
|
|
|
|
<el-option v-for="item in deptInfoList" :key="item.deptId" :label="item.deptName" :value="item.deptId" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="合同时间" prop="contractDate">
|
|
|
|
|
<el-date-picker clearable v-model="form.contractDate" type="date" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择合同时间">
|
|
|
|
|
<el-form-item label="合同签订日期" prop="contractDate">
|
|
|
|
|
<el-date-picker clearable v-model="form.contractDate" type="date" value-format="YYYY-MM-DD HH:mm:ss" :disabled="isFormDisabled" placeholder="请选择合同时间">
|
|
|
|
|
</el-date-picker>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
@ -88,44 +87,39 @@
|
|
|
|
|
</el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="付款方式" prop="paymentMethod">
|
|
|
|
|
<el-input v-model="form.paymentMethod" placeholder="(如:3-3-3-1)" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="甲方公司" prop="oneCustomerId">
|
|
|
|
|
<el-select v-model="form.oneCustomerId" placeholder="请选择甲方公司" filterable>
|
|
|
|
|
<el-select v-model="form.oneCustomerId" placeholder="请选择甲方公司" :disabled="isFormDisabled" filterable>
|
|
|
|
|
<el-option v-for="item in customerInfoList" :key="item.customerId" :label="item.customerName" :value="item.customerId" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="乙方公司" prop="twoCustomerId">
|
|
|
|
|
<el-select v-model="form.twoCustomerId" placeholder="请选择乙方公司" filterable>
|
|
|
|
|
<el-select v-model="form.twoCustomerId" placeholder="请选择乙方公司" :disabled="isFormDisabled" filterable>
|
|
|
|
|
<el-option v-for="item in customerInfoList" :key="item.customerId" :label="item.customerName" :value="item.customerId" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="甲方授权代表" prop="oneRepresent">
|
|
|
|
|
<el-input v-model="form.oneRepresent" placeholder="请输入甲方授权代表" />
|
|
|
|
|
<el-input v-model="form.oneRepresent" placeholder="请输入甲方授权代表" :disabled="isFormDisabled"/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="乙方授权代表" prop="twoRepresent">
|
|
|
|
|
<el-input v-model="form.twoRepresent" placeholder="请输入乙方授权代表" />
|
|
|
|
|
<el-input v-model="form.twoRepresent" placeholder="请输入乙方授权代表" :disabled="isFormDisabled"/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="甲方签字日期" prop="oneDate">
|
|
|
|
|
<el-date-picker clearable v-model="form.oneDate" type="date" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择甲方签字日期">
|
|
|
|
|
<el-date-picker clearable v-model="form.oneDate" type="date" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择甲方签字日期" :disabled="isFormDisabled">
|
|
|
|
|
</el-date-picker>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="乙方签字日期" prop="twoDate">
|
|
|
|
|
<el-date-picker clearable v-model="form.twoDate" type="date" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择乙方签字日期">
|
|
|
|
|
<el-date-picker clearable v-model="form.twoDate" type="date" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择乙方签字日期" :disabled="isFormDisabled">
|
|
|
|
|
</el-date-picker>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
@ -142,8 +136,22 @@
|
|
|
|
|
<!-- </el-form-item>-->
|
|
|
|
|
<!-- </el-col>-->
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="合同模板" prop="templateId">
|
|
|
|
|
<el-select v-model="form.templateId" placeholder="请选择合同模板" filterable>
|
|
|
|
|
<el-form-item label="合同模板标识" prop="contractTemplateFlag">
|
|
|
|
|
<el-radio-group v-model="form.contractTemplateFlag" :disabled="isFormDisabled">
|
|
|
|
|
<el-radio v-for="dict in contract_template_flag" :key="dict.value" :value="dict.value">{{ dict.label }} </el-radio>
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="合同负责人" prop="contractManagerId">
|
|
|
|
|
<el-select v-model="form.contractManagerId" placeholder="请选择该合同客户经理或签订人" :disabled="isFormDisabled" filterable>
|
|
|
|
|
<el-option v-for="item in userInfoList" :key="item.userId" :label="item.nickName" :value="item.userId" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="合同模板" prop="templateId" v-if="form.contractTemplateFlag !== '1'">
|
|
|
|
|
<el-select v-model="form.templateId" placeholder="请选择合同模板" :disabled="isFormDisabled" filterable>
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="item in printTemplateList"
|
|
|
|
|
:key="item.templateId"
|
|
|
|
|
@ -153,17 +161,34 @@
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<!-- <el-col :span="12">
|
|
|
|
|
<el-form-item label="合同大写金额" prop="capitalizedAmount">
|
|
|
|
|
<el-input v-model="form.capitalizedAmount" placeholder="请输入合同大写金额" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col> -->
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="附件" prop="ossId">
|
|
|
|
|
<!-- <el-input v-model="form.ossId" type="textarea" placeholder="请输入内容" />-->
|
|
|
|
|
<el-button type="primary" plain icon="Upload" @click="handleFile">上传合同附件</el-button>
|
|
|
|
|
<!-- <el-button type="primary" plain icon="Upload" @click="handleFile">上传合同附件</el-button>-->
|
|
|
|
|
<FileUpload
|
|
|
|
|
v-model="ossIdString"
|
|
|
|
|
:limit="5"
|
|
|
|
|
:fileSize="20"
|
|
|
|
|
:fileType="['doc', 'docx', 'pdf', 'xls', 'xlsx']"
|
|
|
|
|
:disabled="isFormDisabled"
|
|
|
|
|
:isShowTip="true"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="备注" prop="remark">
|
|
|
|
|
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
|
|
|
|
|
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" :disabled="isFormDisabled"/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<!-- <el-col :span="12">-->
|
|
|
|
|
<!-- <el-form-item label="付款方式" prop="paymentMethod">-->
|
|
|
|
|
<!-- <el-input v-model="form.paymentMethod" placeholder="(如:3-3-3-1)" />-->
|
|
|
|
|
<!-- </el-form-item>-->
|
|
|
|
|
<!-- </el-col>-->
|
|
|
|
|
</el-row>
|
|
|
|
|
</el-form>
|
|
|
|
|
</el-card>
|
|
|
|
|
@ -390,8 +415,10 @@ import { ref } from 'vue';
|
|
|
|
|
import { allListDept, listDept } from '@/api/system/dept';
|
|
|
|
|
import { getCrmCustomerInfoList } from '@/api/oa/crm/customerInfo';
|
|
|
|
|
import { getBasePrintTemplateList } from '@/api/oa/base/printTemplate';
|
|
|
|
|
import { getUserList } from '@/api/system/user';
|
|
|
|
|
import { CodeRuleEnum, FlowCodeEnum } from '@/enums/OAEnum';
|
|
|
|
|
import { getInfo } from '@/api/login';
|
|
|
|
|
import FileUpload from '@/components/FileUpload/index.vue';
|
|
|
|
|
|
|
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
|
|
const route = useRoute();
|
|
|
|
|
@ -399,8 +426,8 @@ const router = useRouter();
|
|
|
|
|
|
|
|
|
|
// 路由参数
|
|
|
|
|
const routeParams = ref<Record<string, any>>({});
|
|
|
|
|
const { contract_category, business_direction, contract_flag, contract_type, contract_status, material_flag } = toRefs<any>(
|
|
|
|
|
proxy?.useDict('contract_category', 'business_direction', 'contract_flag', 'contract_type', 'contract_status', 'material_flag')
|
|
|
|
|
const { contract_category, business_direction, contract_flag, contract_type, contract_status, material_flag, contract_template_flag } = toRefs<any>(
|
|
|
|
|
proxy?.useDict('contract_category', 'business_direction', 'contract_flag', 'contract_type', 'contract_status', 'material_flag', 'contract_template_flag')
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const buttonLoading = ref(false);
|
|
|
|
|
@ -471,6 +498,13 @@ const getCustomerInfoListSelect = async () => {
|
|
|
|
|
customerInfoList.value = res.data;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 查询用户信息下拉框结构 */
|
|
|
|
|
const userInfoList = ref([]);
|
|
|
|
|
const getUserInfoListSelect = async () => {
|
|
|
|
|
const res = await getUserList({ pageNum: 1, pageSize: 1000 });
|
|
|
|
|
userInfoList.value = res.data;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 合同物料对话框
|
|
|
|
|
const materialDialog = reactive({
|
|
|
|
|
visible: false,
|
|
|
|
|
@ -486,6 +520,7 @@ const initMaterialFormData: ContractMaterialForm = {
|
|
|
|
|
specificationDescription: undefined,
|
|
|
|
|
materialId: undefined,
|
|
|
|
|
relationMaterialId: undefined,
|
|
|
|
|
saleMaterialName: undefined,
|
|
|
|
|
amount: undefined,
|
|
|
|
|
unitId: undefined,
|
|
|
|
|
beforePrice: undefined,
|
|
|
|
|
@ -532,6 +567,9 @@ const initFormData: ContractInfoFormEx = {
|
|
|
|
|
signatureAppendix: undefined,
|
|
|
|
|
taxRate: undefined,
|
|
|
|
|
remark: undefined,
|
|
|
|
|
contractManagerId: undefined,
|
|
|
|
|
capitalizedAmount: undefined,
|
|
|
|
|
contractTemplateFlag: '2',
|
|
|
|
|
flowCode: undefined,
|
|
|
|
|
bizExt: undefined,
|
|
|
|
|
variables: undefined,
|
|
|
|
|
@ -546,7 +584,25 @@ const data = reactive<{ form: ContractInfoFormEx; rules: any }>({
|
|
|
|
|
contractFlag: [{ required: true, message: '有无合同不能为空', trigger: 'blur' }],
|
|
|
|
|
contractCode: [{ required: true, message: '合同编号不能为空', trigger: 'blur' }],
|
|
|
|
|
contractName: [{ required: true, message: '合同名称不能为空', trigger: 'blur' }],
|
|
|
|
|
paymentMethod: [{ required: true, message: '付款方式不能为空', trigger: 'blur' }]
|
|
|
|
|
businessDirection: [{ required: true, message: '业务方向不能为空', trigger: 'blur' }],
|
|
|
|
|
contractManagerId: [{ required: true, message: '合同负责人不能为空', trigger: 'blur' }],
|
|
|
|
|
contractTemplateFlag: [{ required: true, message: '合同模板标识不能为空', trigger: 'blur' }],
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 判断表单是否禁用(查看或审批模式)
|
|
|
|
|
const isFormDisabled = computed(() => {
|
|
|
|
|
return routeParams.value.type === 'view' || routeParams.value.type === 'approval';
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 附件ID字符串转换(用于FileUpload组件)
|
|
|
|
|
const ossIdString = computed({
|
|
|
|
|
get() {
|
|
|
|
|
const v = form.value.ossId as any;
|
|
|
|
|
return v === undefined || v === null ? '' : String(v);
|
|
|
|
|
},
|
|
|
|
|
set(val: string) {
|
|
|
|
|
form.value.ossId = val || (undefined as any);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@ -594,6 +650,7 @@ const saleMaterialSelectCallBack = (data: any) => {
|
|
|
|
|
materialForm.value.materialCode = materialList[0].materialCode;
|
|
|
|
|
materialForm.value.materialName = materialList[0].materialName;
|
|
|
|
|
materialForm.value.productName = materialList[0].saleMaterialName;
|
|
|
|
|
materialForm.value.saleMaterialName = materialList[0].saleMaterialName;
|
|
|
|
|
materialForm.value.relationMaterialId = materialList[0].relationMaterialId;
|
|
|
|
|
materialForm.value.customerName = materialList[0].customerName;
|
|
|
|
|
}
|
|
|
|
|
@ -616,9 +673,9 @@ const handleFile = () => {
|
|
|
|
|
/** 提交按钮 */
|
|
|
|
|
const submitForm = (status: string, mode: boolean) => {
|
|
|
|
|
try {
|
|
|
|
|
buttonLoading.value = true;
|
|
|
|
|
contractInfoFormRef.value?.validate(async (valid: boolean) => {
|
|
|
|
|
if (valid) {
|
|
|
|
|
buttonLoading.value = true;
|
|
|
|
|
// 设置后端发起和不等于草稿状态 直接走流程发起
|
|
|
|
|
if (status != 'draft') {
|
|
|
|
|
// 后端发起流程模式
|
|
|
|
|
@ -627,6 +684,7 @@ const submitForm = (status: string, mode: boolean) => {
|
|
|
|
|
form.value.variables = {
|
|
|
|
|
contractName: form.value.contractName,
|
|
|
|
|
totalPrice: form.value.totalPrice,
|
|
|
|
|
businessDirection: form.value.businessDirection,
|
|
|
|
|
contractCode: form.value.contractCode
|
|
|
|
|
};
|
|
|
|
|
// 流程实例业务扩展字段
|
|
|
|
|
@ -638,7 +696,6 @@ const submitForm = (status: string, mode: boolean) => {
|
|
|
|
|
form.value.flowStatus = 'waiting';
|
|
|
|
|
const res = await contractSubmitAndFlowStart(form.value).finally(() => (buttonLoading.value = false));
|
|
|
|
|
form.value = res.data;
|
|
|
|
|
buttonLoading.value = false;
|
|
|
|
|
proxy?.$modal.msgSuccess('操作成功');
|
|
|
|
|
proxy?.$tab.closePage();
|
|
|
|
|
router.go(-1);
|
|
|
|
|
@ -652,7 +709,6 @@ const submitForm = (status: string, mode: boolean) => {
|
|
|
|
|
} else {
|
|
|
|
|
await addContractInfo(form.value).finally(() => (buttonLoading.value = false));
|
|
|
|
|
}
|
|
|
|
|
buttonLoading.value = false;
|
|
|
|
|
proxy?.$modal.msgSuccess('暂存成功');
|
|
|
|
|
proxy?.$tab.closePage();
|
|
|
|
|
router.go(-1);
|
|
|
|
|
@ -675,6 +731,7 @@ const handleStartWorkFlow = async (data: ContractInfoForm) => {
|
|
|
|
|
contractId: data.contractId,
|
|
|
|
|
contractName: data.contractName,
|
|
|
|
|
totalPrice: data.totalPrice,
|
|
|
|
|
businessDirection: data.businessDirection,
|
|
|
|
|
contractCode: data.contractCode
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@ -803,18 +860,25 @@ const submitMaterialForm = () => {
|
|
|
|
|
(form.value as any).contractMaterialList = [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const unitInfo = unitInfoList.value.find((item: any) => item.unitId === materialForm.value.unitId);
|
|
|
|
|
const unitName = unitInfo ? unitInfo.unitName : '';
|
|
|
|
|
const materialData = {
|
|
|
|
|
...materialForm.value,
|
|
|
|
|
unitName: unitName
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (materialForm.value.contractMaterialId) {
|
|
|
|
|
// 编辑模式:更新现有物料
|
|
|
|
|
const index = (form.value as any).contractMaterialList.findIndex(
|
|
|
|
|
(item: any) => item.contractMaterialId === materialForm.value.contractMaterialId
|
|
|
|
|
);
|
|
|
|
|
if (index !== -1) {
|
|
|
|
|
(form.value as any).contractMaterialList[index] = { ...materialForm.value };
|
|
|
|
|
(form.value as any).contractMaterialList[index] = materialData;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 新增模式:添加新物料
|
|
|
|
|
const newMaterial = {
|
|
|
|
|
...materialForm.value,
|
|
|
|
|
...materialData,
|
|
|
|
|
contractMaterialId: Date.now() // 临时ID
|
|
|
|
|
};
|
|
|
|
|
(form.value as any).contractMaterialList.push(newMaterial);
|
|
|
|
|
@ -835,6 +899,7 @@ const loadSelectOptions = () => {
|
|
|
|
|
getDeptInfoListSelect();
|
|
|
|
|
getCustomerInfoListSelect();
|
|
|
|
|
getPrintTemplateListSelect();
|
|
|
|
|
getUserInfoListSelect();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
onMounted(async () => {
|
|
|
|
|
|