合同完善
This commit is contained in:
parent
29f2ff3e32
commit
bedd30704e
|
@ -50,11 +50,13 @@ export function getDictOpts(dictType: string) {
|
|||
export async function getDictDatasAsync(dictTypes: string[]) {
|
||||
const dictDataMap: Record<string, DictDataType[]> = {};
|
||||
const foundTypes = new Set<string>();
|
||||
|
||||
console.log(dictTypes);
|
||||
// debugger;
|
||||
// Process static dictionary data
|
||||
for (const dictType of Object.keys(dataModule)) {
|
||||
if (dictTypes.includes(dictType)) {
|
||||
const dictEntries = dataModule[dictType];
|
||||
if (dictEntries && dictEntries.data && dictEntries.data.length > 0) {
|
||||
dictEntries.data.forEach((dictData) => {
|
||||
dictData.type = dictType;
|
||||
|
||||
|
@ -70,14 +72,17 @@ export async function getDictDatasAsync(dictTypes: string[]) {
|
|||
} as DictDataType);
|
||||
});
|
||||
foundTypes.add(dictType);
|
||||
|
||||
}
|
||||
// If all types are found, return early
|
||||
console.log(foundTypes.size, dictTypes.length);
|
||||
if (foundTypes.size === dictTypes.length) {
|
||||
return dictDataMap;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(dictDataMap);
|
||||
|
||||
// Fetch remote dictionary data in parallel
|
||||
const promises = dictTypes.map(async (type) => {
|
||||
if (!foundTypes.has(type)) {
|
||||
|
|
|
@ -311,7 +311,7 @@ async function handleSubmit() {
|
|||
|
||||
async function handleAudit(
|
||||
type: 'accessConfirm' | 'reject' | 'rejectConfirm',
|
||||
data: any,
|
||||
data?: any,
|
||||
) {
|
||||
console.log(type);
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ import { useVbenModal } from '@vben/common-ui';
|
|||
import { dict } from '@fast-crud/fast-crud';
|
||||
import { VxeGrid } from 'vxe-table';
|
||||
|
||||
import { DICT_TYPE, getDictOptions } from '#/utils/dict';
|
||||
import { DICT_TYPE } from '#/utils/dict';
|
||||
|
||||
import chooseCompanyModal from '../../company/list/choose-company-modal.vue';
|
||||
import { getBidColumns, getProviderColumns } from './bid-columns';
|
||||
|
@ -14,7 +14,9 @@ const [ChooseCompanyModal, chooseCompanyModalApi] = useVbenModal({
|
|||
connectedComponent: chooseCompanyModal,
|
||||
});
|
||||
|
||||
export function getFormSchema(_params: any = {}) {
|
||||
export function getFormSchema(params: any = {}) {
|
||||
const { formRef, dictMap = {} } = params;
|
||||
|
||||
const xGridRef = ref();
|
||||
|
||||
/** Hooks - 表格 */
|
||||
|
@ -85,7 +87,7 @@ export function getFormSchema(_params: any = {}) {
|
|||
vModel: 'value',
|
||||
class: 'min-w-[200px]',
|
||||
dict: dict({
|
||||
data: getDictOptions(DICT_TYPE.contract_project_type),
|
||||
data: dictMap[DICT_TYPE.contract_project_type],
|
||||
}),
|
||||
},
|
||||
rules: [{ required: true, message: '请选择项目类别' }],
|
||||
|
@ -99,7 +101,7 @@ export function getFormSchema(_params: any = {}) {
|
|||
vModel: 'value',
|
||||
class: 'min-w-[200px]',
|
||||
dict: dict({
|
||||
data: getDictOptions(DICT_TYPE.comprehensive_project_name),
|
||||
data: dictMap[DICT_TYPE.comprehensive_project_name],
|
||||
}),
|
||||
},
|
||||
rules: [{ required: true, message: '请输入项目名称' }],
|
||||
|
@ -113,7 +115,7 @@ export function getFormSchema(_params: any = {}) {
|
|||
vModel: 'value',
|
||||
class: 'min-w-[200px]',
|
||||
dict: dict({
|
||||
data: getDictOptions(DICT_TYPE.contract_price_style),
|
||||
data: dictMap[DICT_TYPE.contract_price_style],
|
||||
}),
|
||||
},
|
||||
},
|
||||
|
@ -135,7 +137,7 @@ export function getFormSchema(_params: any = {}) {
|
|||
name: 'fs-dict-radio',
|
||||
vModel: 'value',
|
||||
dict: dict({
|
||||
data: getDictOptions(DICT_TYPE.contract_selection_method),
|
||||
data: dictMap[DICT_TYPE.contract_selection_method],
|
||||
}),
|
||||
},
|
||||
rules: [{ required: true, message: '请选择选商方式' }],
|
||||
|
@ -174,8 +176,8 @@ export function getFormSchema(_params: any = {}) {
|
|||
// },
|
||||
render({ form }) {
|
||||
// 注意此处的v-model写法
|
||||
const options1 = getDictOptions(DICT_TYPE.section_type, 'string');
|
||||
const options2 = getDictOptions(DICT_TYPE.section_num, 'string');
|
||||
const options1 = dictMap[DICT_TYPE.section_type];
|
||||
const options2 = dictMap[DICT_TYPE.section_num];
|
||||
let id = '';
|
||||
return (
|
||||
<div class="flex flex-col">
|
||||
|
|
|
@ -14,8 +14,9 @@ import {
|
|||
} from 'ant-design-vue';
|
||||
|
||||
import Apis from '#/api';
|
||||
import temporaryFormModal from '#/components/temporary-form-modal/temporary-form-modal.vue';
|
||||
import { useVxeTable } from '#/hooks/vxeTable';
|
||||
import { DICT_TYPE, getDictObj } from '#/utils/dict';
|
||||
import { DICT_TYPE, getDictDatasAsync, getDictObj } from '#/utils/dict';
|
||||
import { FileUploader } from '#/utils/file';
|
||||
import { logger } from '#/utils/logger';
|
||||
import chooseUserModal from '#/views/system/user/choose-user-modal.vue';
|
||||
|
@ -28,6 +29,10 @@ const [ChooseUserModal, chooseUserModalApi] = useVbenModal({
|
|||
connectedComponent: chooseUserModal,
|
||||
});
|
||||
|
||||
const [TemporaryFormModal, temporaryFormModalApi] = useVbenModal({
|
||||
connectedComponent: temporaryFormModal,
|
||||
});
|
||||
|
||||
const { xGridRef, gridProps } = useVxeTable({ ref: 'xGridRef' });
|
||||
|
||||
const fileUploader = new FileUploader({});
|
||||
|
@ -54,7 +59,7 @@ const formBindingByBaseInfo = ref({
|
|||
columns: {},
|
||||
});
|
||||
|
||||
const formBinding = ref({ ...getFormSchema() });
|
||||
const formBinding = ref(null);
|
||||
|
||||
/** Hooks - 表格 */
|
||||
const gridOptions = reactive(
|
||||
|
@ -138,6 +143,93 @@ async function handleChooseUserConfirm(e) {
|
|||
handleSubmit('submit');
|
||||
}
|
||||
|
||||
async function handleAudit(
|
||||
type: 'accessConfirm' | 'reject' | 'rejectConfirm',
|
||||
data?: any,
|
||||
) {
|
||||
console.log(type);
|
||||
|
||||
if (type === 'accessConfirm') {
|
||||
Modal.confirm({
|
||||
title: '提示',
|
||||
content: '是否确认审核通过?',
|
||||
onOk: async () => {
|
||||
try {
|
||||
await Apis.selectMerchantsBasicInfo.post_submit({
|
||||
params: {
|
||||
guid: selectMerchantsBasicInfoId.value,
|
||||
},
|
||||
data: {
|
||||
appId: id.value,
|
||||
taskId: currData.value.taskId,
|
||||
nodeId: '',
|
||||
comment: '通过',
|
||||
},
|
||||
});
|
||||
message.success('审核通过');
|
||||
back();
|
||||
} catch (error) {
|
||||
logger.error('审核通过失败', error);
|
||||
message.error('审核通过失败,请稍候再试');
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
if (type === 'reject') {
|
||||
Modal.confirm({
|
||||
title: '提示',
|
||||
content: '是否确认退回?',
|
||||
onOk: () => {
|
||||
temporaryFormModalApi.setData({
|
||||
title: '退回原因',
|
||||
schema: {
|
||||
columns: {
|
||||
comment: {
|
||||
title: '',
|
||||
key: 'comment',
|
||||
col: { span: 24 },
|
||||
colon: false,
|
||||
component: {
|
||||
name: 'a-textarea',
|
||||
vModel: 'value',
|
||||
autoSize: { minRows: 4, maxRows: 6 },
|
||||
placeholder: '请输入',
|
||||
},
|
||||
rules: [{ required: true, message: '请输入退回原因' }],
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
temporaryFormModalApi.open();
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
if (type === 'rejectConfirm') {
|
||||
const comment = data.comment;
|
||||
try {
|
||||
await Apis.selectMerchantsBasicInfo.post_rollback({
|
||||
params: {
|
||||
guid: selectMerchantsBasicInfoId.value,
|
||||
},
|
||||
data: {
|
||||
appId: selectMerchantsBasicInfoId.value,
|
||||
taskId: currData.value.taskId,
|
||||
nodeId: '',
|
||||
comment,
|
||||
},
|
||||
});
|
||||
temporaryFormModalApi.close();
|
||||
message.success('退回成功');
|
||||
back();
|
||||
} catch (error) {
|
||||
logger.error('合同立项退回失败', error);
|
||||
message.error('退回失败,请稍候再试');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function handleSave() {
|
||||
isLoading.value = true;
|
||||
|
||||
|
@ -323,16 +415,31 @@ async function handleSubmit(type: 'openModal' | 'submit') {
|
|||
const contractData = ref<any>({});
|
||||
const businessData = ref<any>({});
|
||||
|
||||
const auditId = ref();
|
||||
|
||||
onMounted(async () => {
|
||||
isLoading.value = true;
|
||||
|
||||
try {
|
||||
if (id.value) {
|
||||
const dictMap = await getDictDatasAsync([
|
||||
DICT_TYPE.contract_authorization_period,
|
||||
DICT_TYPE.comprehensive_project_name,
|
||||
DICT_TYPE.contract_price_style,
|
||||
DICT_TYPE.contract_selection_method,
|
||||
DICT_TYPE.section_type,
|
||||
DICT_TYPE.contract_project_type,
|
||||
DICT_TYPE.section_num,
|
||||
DICT_TYPE.contract_price_style,
|
||||
]);
|
||||
console.log(dictMap);
|
||||
const contractReferTypeData: any = await Apis.contractReferType.get_list({
|
||||
params: {},
|
||||
});
|
||||
contractTypeData.value = contractReferTypeData.rows || [];
|
||||
|
||||
formBinding.value = getFormSchema({ formRef, dictMap });
|
||||
|
||||
formBindingByBaseInfo.value.columns = getFormSchemaByBaseInfo({
|
||||
contractTypeData: contractTypeData.value,
|
||||
});
|
||||
|
@ -358,6 +465,7 @@ onMounted(async () => {
|
|||
const business: any = await Apis.selectMerchantsBasicInfo.get_getOne({
|
||||
params: { contractId: contract.contractId },
|
||||
});
|
||||
selectMerchantsBasicInfoId.value = business.guid;
|
||||
if (business.fileUuid) {
|
||||
const files = await fileUploader.select(business.fileUuid);
|
||||
business.fileList = files;
|
||||
|
@ -400,6 +508,11 @@ onMounted(async () => {
|
|||
@confirm="handleChooseUserConfirm"
|
||||
/>
|
||||
|
||||
<TemporaryFormModal
|
||||
class="w-[950px]"
|
||||
@confirm="handleAudit('rejectConfirm', $event)"
|
||||
/>
|
||||
|
||||
<a-affix
|
||||
:offset-top="0"
|
||||
:style="{ zIndex: 50 }"
|
||||
|
@ -410,12 +523,30 @@ onMounted(async () => {
|
|||
<vben-button variant="primary" @click="handleSave()">
|
||||
保存
|
||||
</vben-button>
|
||||
<vben-button variant="primary" @click="handleSubmit()">
|
||||
<vben-button
|
||||
:disabled="!selectMerchantsBasicInfoId"
|
||||
variant="primary"
|
||||
@click="handleSubmit('openModal')"
|
||||
>
|
||||
提交
|
||||
</vben-button>
|
||||
<vben-button variant="destructive" @click="handleDelete()">
|
||||
废除
|
||||
</vben-button>
|
||||
<vben-button
|
||||
v-if="selectMerchantsBasicInfoId"
|
||||
variant="primary"
|
||||
@click="handleAudit('accessConfirm')"
|
||||
>
|
||||
通过
|
||||
</vben-button>
|
||||
<vben-button
|
||||
v-if="selectMerchantsBasicInfoId"
|
||||
variant="destructive"
|
||||
@click="handleAudit('reject')"
|
||||
>
|
||||
退回
|
||||
</vben-button>
|
||||
<vben-button variant="secondary" @click="handleBack()">
|
||||
返回
|
||||
</vben-button>
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
import type { VxeGridPropTypes } from 'vxe-table';
|
||||
|
||||
export const PrimaryKey = 'guid';
|
||||
import { DICT_TYPE, getDictObj } from '#/utils/dict';
|
||||
|
||||
export const PrimaryKey = 'consignId';
|
||||
|
||||
export function getColumns(_params?: any): VxeGridPropTypes.Columns {
|
||||
return [
|
||||
|
@ -15,40 +17,43 @@ export function getColumns(_params?: any): VxeGridPropTypes.Columns {
|
|||
title: '签约授权编号',
|
||||
field: 'consignId',
|
||||
width: 200,
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
title: '受托人',
|
||||
field: 'trustee',
|
||||
field: 'userPerson',
|
||||
width: 200,
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
title: '授权类型',
|
||||
field: 'authorizationType',
|
||||
field: 'consignType',
|
||||
width: 120,
|
||||
align: 'center',
|
||||
slots: {
|
||||
default: ({ row }) => {
|
||||
return (
|
||||
getDictObj(DICT_TYPE.contract_authorization_type2, row.consignType)
|
||||
?.label || ''
|
||||
);
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '授权期限(起)',
|
||||
field: 'authorizationStartDate',
|
||||
width: 150,
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
title: '授权期限(止)',
|
||||
field: 'authorizationEndDate',
|
||||
width: 150,
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
field: 'operate',
|
||||
title: '操作',
|
||||
width: 60,
|
||||
align: 'center',
|
||||
fixed: 'right',
|
||||
slots: { default: 'operate' },
|
||||
},
|
||||
// {
|
||||
// field: 'operate',
|
||||
// title: '操作',
|
||||
// width: 60,
|
||||
// align: 'center',
|
||||
// fixed: 'right',
|
||||
// slots: { default: 'operate' },
|
||||
// },
|
||||
];
|
||||
}
|
||||
|
||||
|
|
|
@ -267,14 +267,20 @@ async function handleSave() {
|
|||
}
|
||||
}
|
||||
|
||||
async function handleSubmit() {
|
||||
async function handleSubmit(type: 'openModal' | 'submit') {
|
||||
// isLoading.value = true
|
||||
if (type === 'openModal') {
|
||||
chooseUserModalApi.setData({
|
||||
title: '选择审批人',
|
||||
});
|
||||
chooseUserModalApi.open();
|
||||
}
|
||||
|
||||
if (type === 'submit') {
|
||||
// handleSubmit();
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
isLoading.value = true;
|
||||
|
||||
|
@ -286,7 +292,7 @@ onMounted(async () => {
|
|||
|
||||
if (id.value) {
|
||||
const data: any = await Apis.contractBaseInfo.get_getOne({
|
||||
params: { guid: id.value },
|
||||
params: { contractId: id.value },
|
||||
});
|
||||
|
||||
currData.value = data;
|
||||
|
@ -369,7 +375,7 @@ onMounted(async () => {
|
|||
<vben-button
|
||||
v-if="!id || currData.step === 'edit' || !currData.taskId"
|
||||
variant="primary"
|
||||
@click="handleSubmit()"
|
||||
@click="handleSubmit('openModal')"
|
||||
>
|
||||
提交
|
||||
</vben-button>
|
||||
|
|
|
@ -5,7 +5,7 @@ import { dict } from '@fast-crud/fast-crud';
|
|||
import { useRender } from '#/hooks/useRender';
|
||||
import { DICT_TYPE, getDictOptions } from '#/utils/dict';
|
||||
|
||||
export const PrimaryKey = 'guid';
|
||||
export const PrimaryKey = 'contractId';
|
||||
|
||||
export function getColumns(_params?: any): VxeGridPropTypes.Columns {
|
||||
return [
|
||||
|
|
|
@ -3,7 +3,12 @@ import { computed, onMounted, reactive, ref } from 'vue';
|
|||
import { useRouter } from 'vue-router';
|
||||
|
||||
import { Page } from '@vben/common-ui';
|
||||
import { MdiExport, MdiRadioChecked, MdiRadioUnchecked } from '@vben/icons';
|
||||
import {
|
||||
MdiExport,
|
||||
MdiRadioChecked,
|
||||
MdiRadioUnchecked,
|
||||
MdiUpdate,
|
||||
} from '@vben/icons';
|
||||
|
||||
import { message } from 'ant-design-vue';
|
||||
|
||||
|
|
|
@ -371,13 +371,13 @@ function downloadFile(fileUrl) {
|
|||
:class="[bgColor]"
|
||||
class="content-area mb-4 flex h-[50vh] items-center overflow-y-auto rounded-lg p-4"
|
||||
>
|
||||
<p
|
||||
<div
|
||||
:class="[textColor, textSize, { 'font-bold': isBold }]"
|
||||
class="text-left"
|
||||
class="h-full text-left"
|
||||
style="white-space: pre-line"
|
||||
>
|
||||
{{ currentSpeaker.abstracts }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="attachments">
|
||||
|
|
Loading…
Reference in New Issue