This commit is contained in:
z9130 2024-09-20 11:42:15 +08:00
commit 3985bf343f
8 changed files with 1924 additions and 4 deletions

View File

@ -0,0 +1,111 @@
import { dict } from '@fast-crud/fast-crud';
import { DICT_TYPE, getDictObj, getDictOptions } from '#/utils/dict';
import type { delay } from 'lodash-es';
import type { Dayjs } from 'dayjs';
import dayjs from 'dayjs';
export function getFormSchema(_params: any = {}) {
return {
labelCol: { style: { width: '140px' } },
initialForm: {
currencyTypeId: 'CNY',
},
columns: {
ctrBaseId: {
title: '合同编号',
key: 'ctrBaseId',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
rules: [{ required: true, message: '请输入' }],
},
ctrName: {
title: '合同名称',
key: 'ctrName',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
rules: [{ required: true, message: '请输入合同名称' }],
},
breachReason: {
title: '违约方',
key: 'breachReason',
col: { span: 12 },
component: {
name: 'fs-dict-radio',
vModel: 'value',
dict: dict({
data: [
{ label: '我方违约', value: 0 },
{ label: '对方违约', value: 1 },
{ label: '双方违约', value: 2 },
],
}),
},
},
lidatedDamages: {
title: '违约金',
key: 'lidatedDamages',
col: { span: 12 },
component: {
name: 'a-input-number',
vModel: 'value',
allowClear: false,
},
},
breachReasonDesc: {
title: '违约情况简述',
key: 'breachReasonDesc',
col: { span: 12 },
component: {
name: 'a-textarea',
vModel: 'value',
autosize: { minRows: 4, maxRows: 6 },
},
},
proposal: {
title: '处理意见',
key: 'proposal',
col: { span: 12 },
component: {
name: 'a-textarea',
vModel: 'value',
autosize: { minRows: 4, maxRows: 6 },
},
},
},
};
}
export function getFormSchemaByCertification(_params: any = {}) {
return {
labelCol: { style: { width: '140px' } },
initialForm: {},
columns: {
},
};
}
export function getFormSchemaByShareholder(_params: any = {}) {
return {
labelCol: { style: { width: '140px' } },
columns: {
},
};
}

View File

@ -1,3 +1,288 @@
<script setup lang="ts">
import { computed, nextTick, onMounted, ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { Page } from '@vben/common-ui';
import { MdiUpload } from '@vben/icons';
import { useUserStore } from '@vben/stores';
import {
message,
Modal,
type UploadChangeParam,
type UploadFile,
} from 'ant-design-vue';
import Apis from '#/api';
import { FileUploader } from '#/utils/file';
import {
getFormSchema,
getFormSchemaByCertification,
getFormSchemaByShareholder,
} from './curd';
const fileUploader = new FileUploader({});
const router = useRouter();
const route = useRoute();
const id = route.params.id;
const pageRef = ref();
const formRef = ref();
const formRefByBank = ref();
const formRefByCertification = ref();
const formRefByShareholder = ref();
const isLoading = ref(false);
const formBinding = ref({
...getFormSchema(),
});
const formBindingByCertification = ref({
...getFormSchemaByCertification(),
});
const formBindingByShareholder = ref({
...getFormSchemaByShareholder(),
});
const collapses = ['1', '2', '3', '4', '5'];
const collapseActiveKey = ref(collapses);
function areArraysEqualUnordered(arr1, arr2) {
if (arr1.length !== arr2.length) return false;
const sortedArr1 = [...arr1].sort();
const sortedArr2 = [...arr2].sort();
return JSON.stringify(sortedArr1) === JSON.stringify(sortedArr2);
}
const isFold = computed(() => {
return !areArraysEqualUnordered(collapses, collapseActiveKey.value);
});
function handleFold() {
collapseActiveKey.value = isFold.value ? collapses : [];
}
function handleBack() {
Modal.confirm({
title: '提示',
content: `是否确认返回上一页面?`,
onOk: async () => {
back();
},
});
}
/**
* 页面返回并关闭tab
*/
function back() {
router.replace('/contract/company/list');
}
const fileList = ref<UploadFile[]>([]);
const handleChange = (info: UploadChangeParam) => {
fileList.value = info.fileList.length > 0 ? info.fileList : [];
};
const handleChangeByCertification = (info: UploadChangeParam) => {
formRefByCertification.value.setFormData({
fileList: info.fileList.length > 0 ? info.fileList : [],
});
};
function loadDataByContractTypeData() {}
async function handleSave() {
isLoading.value = true;
try {
const form = formRef.value.form;
console.log(formRef.value);
try {
await formRef.value.submit();
} catch {
message.error('请完成必填项的填写');
return;
}
const userStore = useUserStore();
let newForm:any = {};
//
const fileList = formRef.value.form.fileList;
let files: any = [];
if (fileList && fileList.length > 0) {
files = await fileUploader.upload(fileList, { source: 'ht' });
}
console.log(files);
if (files) {
newForm.fileUuid = (files.map((item) => item.fileUuid) || []).join(',');
}
newForm = Object.assign({}, formRef.value.form, newForm);
delete newForm.fileList;
// // name
// for (const item of contractTypeData.value) {
// if (item.contrLevelId == newForm.ctrType) {
// newForm.ctrTypeName = item.contrLevelName;
// }
// if (item.contrLevelId == newForm.ctrTwoType) {
// newForm.ctrTwoTypeName = item.contrLevelName;
// }
// }
// newForm.fundDitchName = getDictObj(
// DICT_TYPE.contract_funding_source,
// newForm.fundDitch,
// )?.label;
// newForm.priceTypeName = getDictObj(
// DICT_TYPE.contract_currency_unit,
// newForm.priceType,
// )?.label;
// newForm.contractMoney = newForm.budgetSum;
// newForm.currentContStepId = 0;
console.log(newForm);
await Apis.proProviderInfo.post_save({ data: newForm });
} catch (error) {
message.error('提交失败,请稍候再试');
console.log(error);
} finally {
isLoading.value = false;
}
}
onMounted(async () => {
isLoading.value = true;
console.log(id);
// let formSchema = getFormSchema()
// formBinding.value = formSchema
try {
if (id) {
// const data = await Apis.proProviderInfo.get_Query({
// params: { guid: id },
// });
// console.log(data);
// currData.value = data;
// nextTick(() => {
// formRef.value.setFormData(data);
// });
// if (data.fileUuid) {
// const files = await fileUploader.select(data.fileUuid);
// console.log(files);
// nextTick(() => {
// formRef.value.setFormData({
// fileList: files,
// });
// });
// }
// loadDataByContractTypeData();
}
} catch (error) {
console.log(error);
Modal.error({
content: '当前合同信息不存在',
onOk() {
back();
},
title: '提示',
});
} finally {
isLoading.value = false;
}
});
</script>
<template>
<div>break</div>
<Page ref="pageRef" content-class="h-full flex flex-col">
<a-affix
:offset-top="0"
:style="{ zIndex: 50 }"
:target="() => pageRef.bodyRef"
>
<div class="flex w-full flex-row bg-white pl-1 pt-1">
<a-space class="flex-1">
</a-space>
<vben-button variant="secondary" @click="handleFold()">
一键{{ isFold ? '展开' : '收起' }}
</vben-button>
</div>
</a-affix>
<a-spin :spinning="isLoading">
<div class="mx-auto overflow-auto py-2">
<a-collapse v-model:active-key="collapseActiveKey" :bordered="false">
<a-collapse-panel key="1" class="w-full" header="违约情况申报">
<fs-form ref="formRef" class="w-full" v-bind="formBinding" />
</a-collapse-panel>
<a-collapse-panel key="3" class="w-full" header="已上传附件">
<fs-form
ref="formRefByCertification"
class="w-full"
v-bind="formBindingByCertification"
>
<template #form_fileList="scope">
<a-upload
v-model:file-list="scope.form.fileList"
:before-upload="() => false"
:max-count="3"
accept=".pdf"
name="file"
@change="handleChangeByCertification"
>
<vben-button variant="secondary">
<MdiUpload />
点击上传
</vben-button>
</a-upload>
</template>
</fs-form>
</a-collapse-panel>
<a-collapse-panel key="5" class="w-full" header="文件名">
<a-form :label-col="{ style: { width: '120px' } }">
<a-form-item label="附件上传" name="fileList">
<a-upload
v-model:file-list="fileList"
:before-upload="() => false"
:max-count="3"
accept=".pdf,.ppt,.pptx"
name="file"
@change="handleChange"
>
<a-button>
<MdiUpload />
点击上传
</a-button>
</a-upload>
</a-form-item>
</a-form>
</a-collapse-panel>
</a-collapse>
</div>
</a-spin>
</Page>
</template>
<style scoped></style>

View File

@ -0,0 +1,263 @@
import { dict } from '@fast-crud/fast-crud';
import { DICT_TYPE, getDictObj, getDictOptions } from '#/utils/dict';
import type { delay } from 'lodash-es';
import type { Dayjs } from 'dayjs';
import dayjs from 'dayjs';
export function getFormSchema(_params: any = {}) {
return {
labelCol: { style: { width: '140px' } },
initialForm: {
currencyTypeId: 'CNY',
},
columns: {
ctrBaseId: {
title: '合同编号',
key: 'ctrBaseId',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
rules: [{ required: true, message: '请输入' }],
},
ctrName: {
title: '合同名称',
key: 'ctrName',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
rules: [{ required: true, message: '请输入合同名称' }],
},
changeReason: {
title: '变更原因',
key: 'changeReason',
col: { span: 12 },
component: {
name: 'fs-dict-radio',
vModel: 'value',
dict: dict({
data: [
{ label: '我方', value: 0 },
{ label: '对方', value: 1 },
{ label: '双方', value: 2 },
{ label: '其它', value: 3 },
],
}),
},
},
performDescribe: {
title: '变更原因说明',
key: 'performDescribe',
col: { span: 12 },
component: {
name: 'a-textarea',
vModel: 'value',
autosize: { minRows: 4, maxRows: 6 },
},
},
changeMatters: {
title: '变更事项',
key: 'changeMatters',
col: { span: 24 },
component: {
name: 'fs-dict-checkbox',
vModel: 'value',
dict: dict({
data: [
{ label: '合同名称', value: 0 },
{ label: '标的金额', value: 1 },
{ label: '履行期限', value: 2 },
{ label: '合同相对人', value: 3 },
{ label: '纠纷解决方式', value: 4 },
{ label: '其它', value: 5 },
],
}),
},
},
changeCtrName: {
title: '合同名称变更为',
key: 'changeCtrName',
col: { span: 24 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
priObjectSum: {
title: '原标的金额',
key: 'priObjectSum',
col: { span: 12 },
component: {
name: 'a-input-number',
vModel: 'value',
allowClear: false,
},
},
objectsSum: {
title: '累变更后标的金额',
key: 'objectsSum',
col: { span: 12 },
component: {
name: 'a-input-number',
vModel: 'value',
allowClear: false,
},
},
oldperformtime: {
title: '原履行时间',
key: 'oldperformtime',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
performStartDate: {
title: '变更后履行时间',
key: 'performStartDate',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
providerChange: {
title: '合同相对人变更',
key: 'providerChange',
col: { span: 24 },
component: {
name: 'fs-dict-radio',
vModel: 'value',
dict: dict({
data: [
{ label: '名称变更', value: 0 },
{ label: '法人变更', value: 1 },
],
}),
},
},
priProviderName: {
title: '原合同相对人',
key: 'priProviderName',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
providerName: {
title: '变更为',
key: 'providerName',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
juridicalPerson: {
title: '原供应商法人',
key: 'juridicalPerson',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
oldsuppliesotherpersonchange: {
title: '变更后供应商法人',
key: 'oldsuppliesotherpersonchange',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
isDisputeMethod: {
title: '解决纠纷方式',
key: 'isDisputeMethod',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
disputeMethod: {
title: '变更为',
key: 'disputeMethod',
col: { span: 24 },
component: {
name: 'fs-dict-radio',
vModel: 'value',
dict: dict({
data: [
{ label: '仲裁', value: 0 },
{ label: '诉讼', value: 1 },
{ label: '其它', value: 2 },
],
}),
},
},
other: {
title: '其他',
key: 'other',
col: { span: 24 },
component: {
name: 'a-textarea',
vModel: 'value',
autosize: { minRows: 4, maxRows: 6 },
},
},
//需要更换对应的组件
fileUuid: {
title: '附件',
key: 'fileUuid',
col: { span: 24 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
},
};
}
export function getFormSchemaByCertification(_params: any = {}) {
return {
labelCol: { style: { width: '140px' } },
initialForm: {},
columns: {
},
};
}
export function getFormSchemaByShareholder(_params: any = {}) {
return {
labelCol: { style: { width: '140px' } },
columns: {
},
};
}

View File

@ -1,3 +1,288 @@
<script setup lang="ts">
import { computed, nextTick, onMounted, ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { Page } from '@vben/common-ui';
import { MdiUpload } from '@vben/icons';
import { useUserStore } from '@vben/stores';
import {
message,
Modal,
type UploadChangeParam,
type UploadFile,
} from 'ant-design-vue';
import Apis from '#/api';
import { FileUploader } from '#/utils/file';
import {
getFormSchema,
getFormSchemaByCertification,
getFormSchemaByShareholder,
} from './curd';
const fileUploader = new FileUploader({});
const router = useRouter();
const route = useRoute();
const id = route.params.id;
const pageRef = ref();
const formRef = ref();
const formRefByBank = ref();
const formRefByCertification = ref();
const formRefByShareholder = ref();
const isLoading = ref(false);
const formBinding = ref({
...getFormSchema(),
});
const formBindingByCertification = ref({
...getFormSchemaByCertification(),
});
const formBindingByShareholder = ref({
...getFormSchemaByShareholder(),
});
const collapses = ['1', '2', '3', '4', '5'];
const collapseActiveKey = ref(collapses);
function areArraysEqualUnordered(arr1, arr2) {
if (arr1.length !== arr2.length) return false;
const sortedArr1 = [...arr1].sort();
const sortedArr2 = [...arr2].sort();
return JSON.stringify(sortedArr1) === JSON.stringify(sortedArr2);
}
const isFold = computed(() => {
return !areArraysEqualUnordered(collapses, collapseActiveKey.value);
});
function handleFold() {
collapseActiveKey.value = isFold.value ? collapses : [];
}
function handleBack() {
Modal.confirm({
title: '提示',
content: `是否确认返回上一页面?`,
onOk: async () => {
back();
},
});
}
/**
* 页面返回并关闭tab
*/
function back() {
router.replace('/contract/company/list');
}
const fileList = ref<UploadFile[]>([]);
const handleChange = (info: UploadChangeParam) => {
fileList.value = info.fileList.length > 0 ? info.fileList : [];
};
const handleChangeByCertification = (info: UploadChangeParam) => {
formRefByCertification.value.setFormData({
fileList: info.fileList.length > 0 ? info.fileList : [],
});
};
function loadDataByContractTypeData() {}
async function handleSave() {
isLoading.value = true;
try {
const form = formRef.value.form;
console.log(formRef.value);
try {
await formRef.value.submit();
} catch {
message.error('请完成必填项的填写');
return;
}
const userStore = useUserStore();
let newForm:any = {};
//
const fileList = formRef.value.form.fileList;
let files: any = [];
if (fileList && fileList.length > 0) {
files = await fileUploader.upload(fileList, { source: 'ht' });
}
console.log(files);
if (files) {
newForm.fileUuid = (files.map((item) => item.fileUuid) || []).join(',');
}
newForm = Object.assign({}, formRef.value.form, newForm);
delete newForm.fileList;
// // name
// for (const item of contractTypeData.value) {
// if (item.contrLevelId == newForm.ctrType) {
// newForm.ctrTypeName = item.contrLevelName;
// }
// if (item.contrLevelId == newForm.ctrTwoType) {
// newForm.ctrTwoTypeName = item.contrLevelName;
// }
// }
// newForm.fundDitchName = getDictObj(
// DICT_TYPE.contract_funding_source,
// newForm.fundDitch,
// )?.label;
// newForm.priceTypeName = getDictObj(
// DICT_TYPE.contract_currency_unit,
// newForm.priceType,
// )?.label;
// newForm.contractMoney = newForm.budgetSum;
// newForm.currentContStepId = 0;
console.log(newForm);
await Apis.proProviderInfo.post_save({ data: newForm });
} catch (error) {
message.error('提交失败,请稍候再试');
console.log(error);
} finally {
isLoading.value = false;
}
}
onMounted(async () => {
isLoading.value = true;
console.log(id);
// let formSchema = getFormSchema()
// formBinding.value = formSchema
try {
if (id) {
// const data = await Apis.proProviderInfo.get_Query({
// params: { guid: id },
// });
// console.log(data);
// currData.value = data;
// nextTick(() => {
// formRef.value.setFormData(data);
// });
// if (data.fileUuid) {
// const files = await fileUploader.select(data.fileUuid);
// console.log(files);
// nextTick(() => {
// formRef.value.setFormData({
// fileList: files,
// });
// });
// }
// loadDataByContractTypeData();
}
} catch (error) {
console.log(error);
Modal.error({
content: '当前合同信息不存在',
onOk() {
back();
},
title: '提示',
});
} finally {
isLoading.value = false;
}
});
</script>
<template>
<div>change</div>
<Page ref="pageRef" content-class="h-full flex flex-col">
<a-affix
:offset-top="0"
:style="{ zIndex: 50 }"
:target="() => pageRef.bodyRef"
>
<div class="flex w-full flex-row bg-white pl-1 pt-1">
<a-space class="flex-1">
</a-space>
<vben-button variant="secondary" @click="handleFold()">
一键{{ isFold ? '展开' : '收起' }}
</vben-button>
</div>
</a-affix>
<a-spin :spinning="isLoading">
<div class="mx-auto overflow-auto py-2">
<a-collapse v-model:active-key="collapseActiveKey" :bordered="false">
<a-collapse-panel key="1" class="w-full" header="合同变更申报">
<fs-form ref="formRef" class="w-full" v-bind="formBinding" />
</a-collapse-panel>
<a-collapse-panel key="3" class="w-full" header="已上传履行附件">
<fs-form
ref="formRefByCertification"
class="w-full"
v-bind="formBindingByCertification"
>
<template #form_fileList="scope">
<a-upload
v-model:file-list="scope.form.fileList"
:before-upload="() => false"
:max-count="3"
accept=".pdf"
name="file"
@change="handleChangeByCertification"
>
<vben-button variant="secondary">
<MdiUpload />
点击上传
</vben-button>
</a-upload>
</template>
</fs-form>
</a-collapse-panel>
<a-collapse-panel key="5" class="w-full" header="已上传履行附件">
<a-form :label-col="{ style: { width: '120px' } }">
<a-form-item label="附件上传" name="fileList">
<a-upload
v-model:file-list="fileList"
:before-upload="() => false"
:max-count="3"
accept=".pdf,.ppt,.pptx"
name="file"
@change="handleChange"
>
<a-button>
<MdiUpload />
点击上传
</a-button>
</a-upload>
</a-form-item>
</a-form>
</a-collapse-panel>
</a-collapse>
</div>
</a-spin>
</Page>
</template>
<style scoped></style>

View File

@ -0,0 +1,298 @@
import { dict } from '@fast-crud/fast-crud';
import { DICT_TYPE, getDictObj, getDictOptions } from '#/utils/dict';
import type { delay } from 'lodash-es';
import type { Dayjs } from 'dayjs';
import dayjs from 'dayjs';
export function getFormSchema(_params: any = {}) {
return {
labelCol: { style: { width: '140px' } },
initialForm: {
currencyTypeId: 'CNY',
},
columns: {
ctrBaseId: {
title: '合同编号',
key: 'ctrBaseId',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
rules: [{ required: true, message: '请输入合同编号' }],
},
ctrName: {
title: '合同名称',
key: 'ctrName',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
rules: [{ required: true, message: '请输入' }],
},
contractMoney: {
title: '合同标的金额',
key: 'contractMoney',
col: { span: 12 },
component: {
name: 'a-input-number',
vModel: 'value',
allowClear: false,
},
},
paymentSum: {
title: '累计结算金额',
key: 'paymentSum',
col: { span: 12 },
component: {
name: 'a-input-number',
vModel: 'value',
allowClear: false,
},
},
paymentMoney: {
title: '本次付款金额',
key: 'paymentMoney',
col: { span: 12 },
component: {
name: 'a-input-number',
vModel: 'value',
allowClear: false,
},
},
surplusMoney: {
title: '剩余金额',
key: 'surplusMoney',
col: { span: 12 },
component: {
name: 'a-input-number',
vModel: 'value',
allowClear: false,
},
},
paymentDate: {
title: '应付款时间',
key: 'paymentDate',
col: { span: 12 },
component: {
name: 'a-date-picker',
vModel: 'value',
allowClear: false,
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
},
rules: [{ required: true, message: '请选择应付款时间' }],
},
paympaymentKindIdenttype: {
title: '付款性质',
key: 'paymentKindId',
col: { span: 12 },
component: {
name: 'fs-dict-select',
vModel: 'value',
class: 'min-w-[200px]',
dict: dict({
data: getDictOptions(DICT_TYPE.counterparty_nature),
}),
},
rules: [{ required: true, message: '请选择付款性质' }],
},
paymentUnit: {
title: '付款单位',
key: 'paymentUnit',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
gatheringUnit: {
title: '收款单位',
key: 'gatheringUnit',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
gatheringBank: {
title: '开户银行',
key: 'gatheringBank',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
gatheringAccount: {
title: '收款账号',
key: 'gatheringAccount',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
paymentRemark: {
title: '合同约定的付款条件',
key: 'paymentRemark',
col: { span: 24 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
creditCode: {
title: '合同相对人履约情况',
key: 'creditCode',
col: { span: 24 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
checkResult: {
title: '本次验收成果',
key: 'checkResult',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
delaySay: {
title: '延迟履行说明',
key: 'delaySay',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
isYsDelay: {
title: '验收是否延迟履行',
key: 'isYsDelay',
col: { span: 12 },
component: {
name: 'fs-dict-radio',
vModel: 'value',
dict: dict({
data: [
{ label: '否', value: 0 },
{ label: '是', value: 1 },
],
}),
},
},
isFkDelay: {
title: '付款是否延迟履行',
key: 'isFkDelay',
col: { span: 12 },
component: {
name: 'fs-dict-radio',
vModel: 'value',
dict: dict({
data: [
{ label: '否', value: 0 },
{ label: '是', value: 1 },
],
}),
},
},
isOver: {
title: '合同是否履行完毕',
key: 'isOver',
col: { span: 12 },
component: {
name: 'fs-dict-radio',
vModel: 'value',
dict: dict({
data: [
{ label: '否', value: 0 },
{ label: '是', value: 1 },
],
}),
},
},
toUsePerson: {
title: '对方经办人',
key: 'toUsePerson',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
doneDate: {
title: '完成时间',
key: 'doneDate',
col: { span: 12 },
component: {
name: 'a-date-picker',
vModel: 'value',
allowClear: false,
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
},
rules: [{ required: true, message: '请选择有效期' }],
},
remark: {
title: '付款备注',
key: 'remark',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
},
// marketScope: {
// title: '营业执照经营范围',
// key: 'marketScope',
// col: { span: 24 },
// component: {
// name: 'a-textarea',
// vModel: 'value',
// autosize: { minRows: 4, maxRows: 6 },
// },
// },
},
};
}
export function getFormSchemaByCertification(_params: any = {}) {
return {
labelCol: { style: { width: '140px' } },
initialForm: {},
columns: {
},
};
}
export function getFormSchemaByShareholder(_params: any = {}) {
return {
labelCol: { style: { width: '140px' } },
columns: {
},
};
}

View File

@ -1,3 +1,288 @@
<script setup lang="ts">
import { computed, nextTick, onMounted, ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { Page } from '@vben/common-ui';
import { MdiUpload } from '@vben/icons';
import { useUserStore } from '@vben/stores';
import {
message,
Modal,
type UploadChangeParam,
type UploadFile,
} from 'ant-design-vue';
import Apis from '#/api';
import { FileUploader } from '#/utils/file';
import {
getFormSchema,
getFormSchemaByCertification,
getFormSchemaByShareholder,
} from './curd';
const fileUploader = new FileUploader({});
const router = useRouter();
const route = useRoute();
const id = route.params.id;
const pageRef = ref();
const formRef = ref();
const formRefByBank = ref();
const formRefByCertification = ref();
const formRefByShareholder = ref();
const isLoading = ref(false);
const formBinding = ref({
...getFormSchema(),
});
const formBindingByCertification = ref({
...getFormSchemaByCertification(),
});
const formBindingByShareholder = ref({
...getFormSchemaByShareholder(),
});
const collapses = ['1', '2', '3', '4', '5'];
const collapseActiveKey = ref(collapses);
function areArraysEqualUnordered(arr1, arr2) {
if (arr1.length !== arr2.length) return false;
const sortedArr1 = [...arr1].sort();
const sortedArr2 = [...arr2].sort();
return JSON.stringify(sortedArr1) === JSON.stringify(sortedArr2);
}
const isFold = computed(() => {
return !areArraysEqualUnordered(collapses, collapseActiveKey.value);
});
function handleFold() {
collapseActiveKey.value = isFold.value ? collapses : [];
}
function handleBack() {
Modal.confirm({
title: '提示',
content: `是否确认返回上一页面?`,
onOk: async () => {
back();
},
});
}
/**
* 页面返回并关闭tab
*/
function back() {
router.replace('/contract/company/list');
}
const fileList = ref<UploadFile[]>([]);
const handleChange = (info: UploadChangeParam) => {
fileList.value = info.fileList.length > 0 ? info.fileList : [];
};
const handleChangeByCertification = (info: UploadChangeParam) => {
formRefByCertification.value.setFormData({
fileList: info.fileList.length > 0 ? info.fileList : [],
});
};
function loadDataByContractTypeData() {}
async function handleSave() {
isLoading.value = true;
try {
const form = formRef.value.form;
console.log(formRef.value);
try {
await formRef.value.submit();
} catch {
message.error('请完成必填项的填写');
return;
}
const userStore = useUserStore();
let newForm:any = {};
//
const fileList = formRef.value.form.fileList;
let files: any = [];
if (fileList && fileList.length > 0) {
files = await fileUploader.upload(fileList, { source: 'ht' });
}
console.log(files);
if (files) {
newForm.fileUuid = (files.map((item) => item.fileUuid) || []).join(',');
}
newForm = Object.assign({}, formRef.value.form, newForm);
delete newForm.fileList;
// // name
// for (const item of contractTypeData.value) {
// if (item.contrLevelId == newForm.ctrType) {
// newForm.ctrTypeName = item.contrLevelName;
// }
// if (item.contrLevelId == newForm.ctrTwoType) {
// newForm.ctrTwoTypeName = item.contrLevelName;
// }
// }
// newForm.fundDitchName = getDictObj(
// DICT_TYPE.contract_funding_source,
// newForm.fundDitch,
// )?.label;
// newForm.priceTypeName = getDictObj(
// DICT_TYPE.contract_currency_unit,
// newForm.priceType,
// )?.label;
// newForm.contractMoney = newForm.budgetSum;
// newForm.currentContStepId = 0;
console.log(newForm);
await Apis.proProviderInfo.post_save({ data: newForm });
} catch (error) {
message.error('提交失败,请稍候再试');
console.log(error);
} finally {
isLoading.value = false;
}
}
onMounted(async () => {
isLoading.value = true;
console.log(id);
// let formSchema = getFormSchema()
// formBinding.value = formSchema
try {
if (id) {
// const data = await Apis.proProviderInfo.get_Query({
// params: { guid: id },
// });
// console.log(data);
// currData.value = data;
// nextTick(() => {
// formRef.value.setFormData(data);
// });
// if (data.fileUuid) {
// const files = await fileUploader.select(data.fileUuid);
// console.log(files);
// nextTick(() => {
// formRef.value.setFormData({
// fileList: files,
// });
// });
// }
// loadDataByContractTypeData();
}
} catch (error) {
console.log(error);
Modal.error({
content: '当前合同信息不存在',
onOk() {
back();
},
title: '提示',
});
} finally {
isLoading.value = false;
}
});
</script>
<template>
<div>payment</div>
<Page ref="pageRef" content-class="h-full flex flex-col">
<a-affix
:offset-top="0"
:style="{ zIndex: 50 }"
:target="() => pageRef.bodyRef"
>
<div class="flex w-full flex-row bg-white pl-1 pt-1">
<a-space class="flex-1">
</a-space>
<vben-button variant="secondary" @click="handleFold()">
一键{{ isFold ? '展开' : '收起' }}
</vben-button>
</div>
</a-affix>
<a-spin :spinning="isLoading">
<div class="mx-auto overflow-auto py-2">
<a-collapse v-model:active-key="collapseActiveKey" :bordered="false">
<a-collapse-panel key="1" class="w-full" header="基本信息">
<fs-form ref="formRef" class="w-full" v-bind="formBinding" />
</a-collapse-panel>
<a-collapse-panel key="3" class="w-full" header="历史记录">
<fs-form
ref="formRefByCertification"
class="w-full"
v-bind="formBindingByCertification"
>
<template #form_fileList="scope">
<a-upload
v-model:file-list="scope.form.fileList"
:before-upload="() => false"
:max-count="3"
accept=".pdf"
name="file"
@change="handleChangeByCertification"
>
<vben-button variant="secondary">
<MdiUpload />
点击上传
</vben-button>
</a-upload>
</template>
</fs-form>
</a-collapse-panel>
<a-collapse-panel key="5" class="w-full" header="上传附件">
<a-form :label-col="{ style: { width: '120px' } }">
<a-form-item label="附件上传" name="fileList">
<a-upload
v-model:file-list="fileList"
:before-upload="() => false"
:max-count="3"
accept=".pdf,.ppt,.pptx"
name="file"
@change="handleChange"
>
<a-button>
<MdiUpload />
点击上传
</a-button>
</a-upload>
</a-form-item>
</a-form>
</a-collapse-panel>
</a-collapse>
</div>
</a-spin>
</Page>
</template>
<style scoped></style>

View File

@ -0,0 +1,108 @@
import { dict } from '@fast-crud/fast-crud';
import { DICT_TYPE, getDictObj, getDictOptions } from '#/utils/dict';
import type { delay } from 'lodash-es';
import type { Dayjs } from 'dayjs';
import dayjs from 'dayjs';
export function getFormSchema(_params: any = {}) {
return {
labelCol: { style: { width: '140px' } },
initialForm: {
currencyTypeId: 'CNY',
},
columns: {
ctrBaseId: {
title: '合同编号',
key: 'ctrBaseId',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
rules: [{ required: true, message: '请输入' }],
},
ctrName: {
title: '合同名称',
key: 'ctrName',
col: { span: 12 },
component: {
name: 'a-input',
vModel: 'value',
allowClear: false,
},
rules: [{ required: true, message: '请输入合同名称' }],
},
canType: {
title: '事项',
key: 'canType',
col: { span: 24 },
component: {
name: 'fs-dict-radio',
vModel: 'value',
dict: dict({
data: [
{ label: '合同终止', value: 0 },
{ label: '合同解除', value: 1 },
],
}),
},
},
cancelReason: {
title: '变更原因',
key: 'cancelReason',
col: { span: 12 },
component: {
name: 'fs-dict-radio',
vModel: 'value',
dict: dict({
data: [
{ label: '我方', value: 0 },
{ label: '对方', value: 1 },
{ label: '双方', value: 2 },
{ label: '其他', value: 3 },
],
}),
},
},
cancelReasonDesc: {
title: '变更原因说明',
key: 'cancelReasonDesc',
col: { span: 12 },
component: {
name: 'a-textarea',
vModel: 'value',
autosize: { minRows: 4, maxRows: 6 },
},
},
},
};
}
export function getFormSchemaByCertification(_params: any = {}) {
return {
labelCol: { style: { width: '140px' } },
initialForm: {},
columns: {
},
};
}
export function getFormSchemaByShareholder(_params: any = {}) {
return {
labelCol: { style: { width: '140px' } },
columns: {
},
};
}

View File

@ -1,3 +1,288 @@
<script setup lang="ts">
import { computed, nextTick, onMounted, ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { Page } from '@vben/common-ui';
import { MdiUpload } from '@vben/icons';
import { useUserStore } from '@vben/stores';
import {
message,
Modal,
type UploadChangeParam,
type UploadFile,
} from 'ant-design-vue';
import Apis from '#/api';
import { FileUploader } from '#/utils/file';
import {
getFormSchema,
getFormSchemaByCertification,
getFormSchemaByShareholder,
} from './curd';
const fileUploader = new FileUploader({});
const router = useRouter();
const route = useRoute();
const id = route.params.id;
const pageRef = ref();
const formRef = ref();
const formRefByBank = ref();
const formRefByCertification = ref();
const formRefByShareholder = ref();
const isLoading = ref(false);
const formBinding = ref({
...getFormSchema(),
});
const formBindingByCertification = ref({
...getFormSchemaByCertification(),
});
const formBindingByShareholder = ref({
...getFormSchemaByShareholder(),
});
const collapses = ['1', '2', '3', '4', '5'];
const collapseActiveKey = ref(collapses);
function areArraysEqualUnordered(arr1, arr2) {
if (arr1.length !== arr2.length) return false;
const sortedArr1 = [...arr1].sort();
const sortedArr2 = [...arr2].sort();
return JSON.stringify(sortedArr1) === JSON.stringify(sortedArr2);
}
const isFold = computed(() => {
return !areArraysEqualUnordered(collapses, collapseActiveKey.value);
});
function handleFold() {
collapseActiveKey.value = isFold.value ? collapses : [];
}
function handleBack() {
Modal.confirm({
title: '提示',
content: `是否确认返回上一页面?`,
onOk: async () => {
back();
},
});
}
/**
* 页面返回并关闭tab
*/
function back() {
router.replace('/contract/company/list');
}
const fileList = ref<UploadFile[]>([]);
const handleChange = (info: UploadChangeParam) => {
fileList.value = info.fileList.length > 0 ? info.fileList : [];
};
const handleChangeByCertification = (info: UploadChangeParam) => {
formRefByCertification.value.setFormData({
fileList: info.fileList.length > 0 ? info.fileList : [],
});
};
function loadDataByContractTypeData() {}
async function handleSave() {
isLoading.value = true;
try {
const form = formRef.value.form;
console.log(formRef.value);
try {
await formRef.value.submit();
} catch {
message.error('请完成必填项的填写');
return;
}
const userStore = useUserStore();
let newForm:any = {};
//
const fileList = formRef.value.form.fileList;
let files: any = [];
if (fileList && fileList.length > 0) {
files = await fileUploader.upload(fileList, { source: 'ht' });
}
console.log(files);
if (files) {
newForm.fileUuid = (files.map((item) => item.fileUuid) || []).join(',');
}
newForm = Object.assign({}, formRef.value.form, newForm);
delete newForm.fileList;
// // name
// for (const item of contractTypeData.value) {
// if (item.contrLevelId == newForm.ctrType) {
// newForm.ctrTypeName = item.contrLevelName;
// }
// if (item.contrLevelId == newForm.ctrTwoType) {
// newForm.ctrTwoTypeName = item.contrLevelName;
// }
// }
// newForm.fundDitchName = getDictObj(
// DICT_TYPE.contract_funding_source,
// newForm.fundDitch,
// )?.label;
// newForm.priceTypeName = getDictObj(
// DICT_TYPE.contract_currency_unit,
// newForm.priceType,
// )?.label;
// newForm.contractMoney = newForm.budgetSum;
// newForm.currentContStepId = 0;
console.log(newForm);
await Apis.proProviderInfo.post_save({ data: newForm });
} catch (error) {
message.error('提交失败,请稍候再试');
console.log(error);
} finally {
isLoading.value = false;
}
}
onMounted(async () => {
isLoading.value = true;
console.log(id);
// let formSchema = getFormSchema()
// formBinding.value = formSchema
try {
if (id) {
// const data = await Apis.proProviderInfo.get_Query({
// params: { guid: id },
// });
// console.log(data);
// currData.value = data;
// nextTick(() => {
// formRef.value.setFormData(data);
// });
// if (data.fileUuid) {
// const files = await fileUploader.select(data.fileUuid);
// console.log(files);
// nextTick(() => {
// formRef.value.setFormData({
// fileList: files,
// });
// });
// }
// loadDataByContractTypeData();
}
} catch (error) {
console.log(error);
Modal.error({
content: '当前合同信息不存在',
onOk() {
back();
},
title: '提示',
});
} finally {
isLoading.value = false;
}
});
</script>
<template>
<div>relieve</div>
<Page ref="pageRef" content-class="h-full flex flex-col">
<a-affix
:offset-top="0"
:style="{ zIndex: 50 }"
:target="() => pageRef.bodyRef"
>
<div class="flex w-full flex-row bg-white pl-1 pt-1">
<a-space class="flex-1">
</a-space>
<vben-button variant="secondary" @click="handleFold()">
一键{{ isFold ? '展开' : '收起' }}
</vben-button>
</div>
</a-affix>
<a-spin :spinning="isLoading">
<div class="mx-auto overflow-auto py-2">
<a-collapse v-model:active-key="collapseActiveKey" :bordered="false">
<a-collapse-panel key="1" class="w-full" header="合同终止(解除)解除申报">
<fs-form ref="formRef" class="w-full" v-bind="formBinding" />
</a-collapse-panel>
<a-collapse-panel key="3" class="w-full" header="已上传附件">
<fs-form
ref="formRefByCertification"
class="w-full"
v-bind="formBindingByCertification"
>
<template #form_fileList="scope">
<a-upload
v-model:file-list="scope.form.fileList"
:before-upload="() => false"
:max-count="3"
accept=".pdf"
name="file"
@change="handleChangeByCertification"
>
<vben-button variant="secondary">
<MdiUpload />
点击上传
</vben-button>
</a-upload>
</template>
</fs-form>
</a-collapse-panel>
<a-collapse-panel key="5" class="w-full" header="文件名">
<a-form :label-col="{ style: { width: '120px' } }">
<a-form-item label="附件上传" name="fileList">
<a-upload
v-model:file-list="fileList"
:before-upload="() => false"
:max-count="3"
accept=".pdf,.ppt,.pptx"
name="file"
@change="handleChange"
>
<a-button>
<MdiUpload />
点击上传
</a-button>
</a-upload>
</a-form-item>
</a-form>
</a-collapse-panel>
</a-collapse>
</div>
</a-spin>
</Page>
</template>
<style scoped></style>