选商结果功能完善

This commit is contained in:
z9130 2024-10-22 19:59:41 +08:00
parent daec624df2
commit 40e5205ccb
17 changed files with 446 additions and 137 deletions

View File

@ -547,6 +547,15 @@ export default {
/** 合同系统/履行/履行提示/合同变更 获取合同变更信息 */
get_getContractChangeInfo: (data?: QueryOptions) =>
http.get('/app/lvxChange/getContractChangeInfo', data),
/** 合同系统/履行/履行提示/合同变更 查询流程未配置人员节点 */
get_getFlowNodeUserConfig: (data?: QueryOptions) =>
http.get('/app/lvxChange/getFlowNodeUserConfig', data),
/** 合同系统/履行/履行提示/合同变更 流程启动 */
post_startWorkFlow: (data?: BodyOptions) =>
http.post('/app/lvxChange/startWorkFlow', data),
/** 合同系统/履行/履行提示/合同变更 审核通过 */
post_submit: (data?: BodyOptions) =>
http.post('/app/lvxChange/submit', data),
},
contractRelieve: {
/** 合同系统/履行/履行提示/合同解除 获取合同解除信息 */
@ -579,6 +588,11 @@ export default {
lvxResult: {
/** 合同系统/履行/履行结果 履行结果保存 */
post_save: (data?: BodyOptions) => http.post('/app/lvxResult/save', data),
/** 合同系统/履行/履行结果 分页履行结果查询 */
get_page: (data?: QueryOptions) => http.get('/app/lvxResult/page', data),
/** 合同系统/履行/履行结果 已办 */
get_pageDone: (data?: QueryOptions) =>
http.get('/app/lvxResult/pageDone', data),
},
contractFiling: {
/** 合同系统/履行/履行提示/临时归档 保存临时归档信息 */
@ -641,7 +655,7 @@ export default {
/** 合同系统/签订 获取合同签订信息 */
get_getContractSignInfo: (data?: QueryOptions) =>
http.get('/app/qdSign/getContractSignInfo', data),
/** 合同系统/签订 打印签订审批表 */
/** 合同系统/打印 选商打印 */
get_printApprove: (data?: QueryOptions) =>
http.get('/app/qdSign/printApprove', data),
/** 合同系统/签订 打印文本 */
@ -806,6 +820,15 @@ export default {
/** 合同系统/选商/选商结果 待审核 */
get_toDoPage: (data?: QueryOptions) =>
http.get('/app/biddingResult/toDoPage', data),
/** 合同系统/选商/选商结果 查询合同信息 */
get_getContractInfo: (data?: QueryOptions) =>
http.get('/app/biddingResult/getContractInfo', data),
/** 合同系统/选商/选商结果 查询供应商列表 */
get_getProviderInfo: (data?: QueryOptions) =>
http.get('/app/biddingResult/getProviderInfo', data),
/** 合同系统/选商/选商结果 选商专家列表 */
get_queryBiddingExpert: (data?: QueryOptions) =>
http.get('/app/biddingResult/queryBiddingExpert', data),
},
home: {
/** 合同系统/首页待办/已办 首页待办 */
@ -859,8 +882,8 @@ export default {
/** 设备管理/设备静态库管理/设备调拨 调拨信息保存 */
post_save: (data?: BodyOptions) => http.post('/app/equAllot/save', data),
/** 设备管理/设备静态库管理/设备调拨 调拨信息删除 */
post_delete: (data?: BodyOptions) =>
http.post('/app/equAllot/delete', data),
post_deletes: (data?: BodyOptions) =>
http.post('/app/equAllot/deletes', data),
},
bidding: {
/** 合同系统/标段信息 标段查询 */
@ -870,6 +893,9 @@ export default {
/** 合同系统/标段信息 标段信息删除 */
post_deletes: (data?: BodyOptions) =>
http.post('/app/bidding/deletes', data),
/** 合同系统/选商/选商结果 查询标段列表 */
get_getBuddingPtInfoList: (data?: QueryOptions) =>
http.get('/app/bidding/getBuddingPtInfoList', data),
},
equAccident: {
/** 设备管理/设备使用管理/事故处理 事故处理(查询/获取) */
@ -915,8 +941,8 @@ export default {
post_save: (data?: BodyOptions) =>
http.post('/app/equDayRepair/save', data),
/** 设备管理/设备使用管理/日常维修 删除 */
get_deletes: (data?: QueryOptions) =>
http.get('/app/equDayRepair/deletes', data),
post_deletes: (data?: BodyOptions) =>
http.post('/app/equDayRepair/deletes', data),
/** 设备管理/查询管理/日常维修查询 查询 */
get_query: (data?: QueryOptions) =>
http.get('/app/equDayRepair/query', data),

View File

@ -636,7 +636,10 @@ onMounted(async () => {
保存
</vben-button>
<vben-button
v-if="['smEdit'].includes(selectMerchantsBasicInfo.step)"
v-if="
!selectMerchantsBasicInfoId ||
['smEdit'].includes(selectMerchantsBasicInfo.step)
"
:disabled="!selectMerchantsBasicInfoId"
variant="primary"
@click="handleSubmit('openModal')"

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { nextTick, onMounted, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
@ -12,12 +12,14 @@ import chooseCompanyModal from '../../company/list/choose-company-modal.vue';
const props = withDefaults(
defineProps<{
businseeData: any;
contractId: string;
projectId: string;
}>(),
{
contractId: '',
projectId: '',
businseeData: () => ({}),
},
);
@ -33,12 +35,10 @@ const companyChooseType = ref<'biddingProvider' | 'providerPt'>('providerPt');
/** 必填字段校验 */
const requiredFieldRules: any = {
// contractName: { required: true, message: "" },
// ctrType: { required: true, message: "" },
// ctrTwoType: { required: true, message: "" },
// fundAllocation: { required: true, message: "" },
// fundDitch: { required: true, message: "" },
// organiza: { required: true, message: "" },
openDate: { required: true, message: '开标时间不得为空' },
openPlace: { required: true, message: '开标地点不得为空' },
participant: { required: true, message: '参加人不得为空' },
processDesc: { required: true, message: '过程描述不得为空' },
};
/** 必填字段校验,如果是必填字段则返回对应message */
@ -51,6 +51,7 @@ function isRequired(field: string): string {
}
const biddingExpertRef = ref();
const bidList = ref<any[]>([]);
const biddingExpertList = ref([]);
@ -71,14 +72,17 @@ function onAddProviderPt(type: string, data?: any) {
chooseCompanyModalApi.setData({
title: '选择单位',
limitMultipleNum: 5,
guids: tableFullData.map((item) => item.guid) || [],
guids: tableFullData.map((item) => item._guid) || [],
});
chooseCompanyModalApi.open();
}
if (type === 'confirm') {
console.log(data);
data.map((item) => (item.guid = undefined));
data.map((item) => {
item._guid = item.guid;
item.guid = undefined;
});
providerPtRef1.value.insert(data);
providerPtRef2.value.insert(data);
}
@ -87,19 +91,22 @@ function onAddProviderPt(type: string, data?: any) {
function onAddBiddingProvider(type: string, data?: any) {
companyChooseType.value = 'biddingProvider';
const tableFullData = biddingProviderRef.value.getTableData()?.fullData || [];
console.log(tableFullData);
if (type === 'openModal') {
chooseCompanyModalApi.setData({
title: '选择单位',
limitMultipleNum: 1,
guids: tableFullData.map((item) => item.guid) || [],
guids: [],
});
chooseCompanyModalApi.open();
}
if (type === 'confirm') {
console.log(data);
data.map((item) => (item.guid = undefined));
data.map((item) => {
item._guid = item.guid;
item.guid = undefined;
});
biddingProviderRef.value.loadData(data);
}
}
@ -125,10 +132,10 @@ function onRemoveProviderPtRow(row) {
}
function handleChooseCompanyConfirm(e) {
if (companyChooseType.value == 'providerPt') {
if (companyChooseType.value === 'providerPt') {
onAddProviderPt('confirm', e);
}
if (companyChooseType.value == 'biddingProvider') {
if (companyChooseType.value === 'biddingProvider') {
onAddBiddingProvider('confirm', e);
}
}
@ -139,12 +146,17 @@ async function verify() {
for (const field of Object.keys(requiredFieldRules)) {
if (!biddingResult.value[field]) {
message.error(isRequired(field));
return;
return false;
}
}
return true;
}
function getFormData() {
async function getFormData() {
if (!(await verify())) {
return;
}
const _fullData1 = providerPtRef1.value.getTableData().fullData;
const _fullData2 = providerPtRef2.value.getTableData().fullData;
const _fullData3 = biddingExpertRef.value.getTableData().fullData;
@ -152,6 +164,64 @@ function getFormData() {
console.log(_fullData1, _fullData2, _fullData3, _fullData4);
if (_fullData1.length === 0) {
message.error('请添加标段信息');
return;
}
for (const item of _fullData1) {
if (!item.bidPlace) {
message.error('请补全标段信息中的投标地点');
return;
}
if (!item.bidMoney) {
message.error('请补全标段信息中的投标保证金');
return;
}
}
if (_fullData3.length === 0) {
message.error('请添加专家信息');
return;
}
for (const item of _fullData3) {
if (!item.expertName) {
message.error('请补全专家信息中的评委姓名');
return;
}
if (!item.expertSex) {
message.error('请补全专家信息中的性别');
return;
}
// if (!item.expertAge) {
// message.error('');
// return;
// }
// if (!item.expertDepartName) {
// message.error('');
// return;
// }
// if (!item.professionTypeName) {
// message.error('');
// return;
// }
// if (!item.titleTypeName) {
// message.error('');
// return;
// }
// if (!item.positionName) {
// message.error('');
// return;
// }
}
for (const item of _fullData2) {
if (!item.offerMoney) {
message.error('请补全单位报价及评标信息中的报价');
return;
}
}
const data1: any[] = [];
for (const item1 of _fullData1) {
@ -159,6 +229,7 @@ function getFormData() {
if (item1.providerId === item2.providerId) {
data1.push({
...item1,
phasePtId: '99999',
offerMoney: item2.offerMoney,
bidScore: item2.bidScore,
bidDesc: item2.bidDesc,
@ -172,6 +243,7 @@ function getFormData() {
tempBiddingResult.projectId = props.projectId;
const tempBiddingPtInfo = JSON.parse(JSON.stringify(biddingPtInfo.value));
tempBiddingPtInfo.projectId = props.projectId;
tempBiddingPtInfo.phasePtId = '99999';
_fullData3.map((item) => (item.projectId = props.projectId));
const form = {
@ -186,6 +258,53 @@ function getFormData() {
onMounted(async () => {
try {
// ;
let providerData = await Apis.contractRecommendProvider.get_list({
params: {
contractId: props.contractId,
},
});
providerData = providerData.rows || [];
//
nextTick(() => {
providerPtRef1.value.loadData(providerData);
providerPtRef2.value.loadData(providerData);
});
// if (props.businseeData.frameProtocol === '1') {
// for (const item of bidList.value) {
// const rows = [];
// for (const provider of providerData) {
// if (item.phaseSeq == provider.phaseSeq) {
// rows.push(provider);
// }
// }
// item.providerList = rows;
// // nextTick(() => {
// // providerGridRefs.value.get(`${item.phaseSeq}`).insert(rows);
// // });
// }
// } else {
// nextTick(() => {
// providerPtRef1.value.loadData(providerData);
// providerPtRef2.value.loadData(providerData);
// // providerGridRefs2.value.insert(providerData);
// });
// }
//
const expertData = await Apis.biddingResult.get_queryBiddingExpert({
params: {
projectId: props.projectId,
contractId: props.contractId,
},
});
console.log('专家信息', expertData);
nextTick(() => {
biddingExpertRef.value.loadData(expertData.rows);
});
//
const data = await Apis.biddingResult.get_page({
params: {
@ -242,7 +361,11 @@ defineExpose({
</vxe-column>
<vxe-column field="bidMoney" title="投标保证金">
<template #default="{ row }">
<a-input-number v-model:value="row.bidMoney" addon-after="" />
<a-input-number
v-model:value="row.bidMoney"
:min="0"
addon-after="元"
/>
</template>
</vxe-column>
<vxe-column field="operate" title="" width="100">
@ -330,24 +453,40 @@ defineExpose({
</vxe-column>
</vxe-table>
</a-descriptions-item>
<a-descriptions-item :span="1" label="开标时间">
<a-descriptions-item :span="1">
<template #label>
<span v-if="isRequired('openDate')" class="text-red-500">*</span>
开标时间
</template>
<a-date-picker
v-model:value="biddingResult.openDate"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</a-descriptions-item>
<a-descriptions-item :span="2" label="开标地点">
<a-descriptions-item :span="2">
<template #label>
<span v-if="isRequired('openPlace')" class="text-red-500">*</span>
开标地点
</template>
<a-input v-model:value="biddingResult.openPlace" />
</a-descriptions-item>
<a-descriptions-item :span="3" label="参加人">
<a-descriptions-item :span="3">
<template #label>
<span v-if="isRequired('participant')" class="text-red-500">*</span>
参加人
</template>
<a-textarea
v-model:value="biddingResult.participant"
:auto-size="{ minRows: 2, maxRows: 5 }"
/>
</a-descriptions-item>
<a-descriptions-item :span="3" label="过程描述">
<a-descriptions-item :span="3">
<template #label>
<span v-if="isRequired('processDesc')" class="text-red-500">*</span>
过程描述
</template>
<a-textarea
v-model:value="biddingResult.processDesc"
:auto-size="{ minRows: 2, maxRows: 5 }"
@ -384,6 +523,7 @@ defineExpose({
<template #default="{ row }">
<a-input-number
v-model:value="row.offerMoney"
:min="0"
addon-after="元"
/>
</template>

View File

@ -1,13 +1,14 @@
<script setup lang="ts">
import { computed, onMounted, ref } from 'vue';
import { computed, onMounted, reactive, ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { Page, useVbenModal } from '@vben/common-ui';
import { message, Modal } from 'ant-design-vue';
import { message, Modal, type UploadChangeParam } from 'ant-design-vue';
import { logger } from 'common-utils';
import Apis from '#/api';
import { FileUploader } from '#/utils/file';
import AuditNodeTable from '#/views/contract/components/audit-node-table/audit-node-table.vue';
import FileCard from '#/views/contract/components/file-card/file-card.vue';
import ApprovalCard from '#/views/contract/iframe-info/components/info-approval/approval-card.vue';
@ -20,11 +21,22 @@ const [ChooseUserModal, chooseUserModalApi] = useVbenModal({
connectedComponent: chooseUserModal,
});
const fileUploader = new FileUploader({});
const router = useRouter();
const route = useRoute();
const pageRef = ref();
const fillResultCardRef = ref();
const formRef = ref();
const form = reactive({
fileList: [],
});
const readOnly = computed(() => {
return false;
});
const id = ref(route.params.id);
const flowInstanceId = ref(route.query.flowInstanceId as string);
@ -39,8 +51,8 @@ const bidList = ref<any[]>([]);
const submitGuid = ref();
const collapses = ['1', '2', '3', '4', '5'];
// const collapses = ['5'];
// const collapses = ['1', '2', '3', '4', '5'];
const collapses = ['4', '5', '6'];
const collapseActiveKey = ref(collapses);
function areArraysEqualUnordered(arr1, arr2) {
if (arr1.length !== arr2.length) return false;
@ -55,6 +67,10 @@ function handleFold() {
collapseActiveKey.value = isFold.value ? collapses : [];
}
const handleChange = (info: UploadChangeParam) => {
form.fileList = info.fileList.length > 0 ? info.fileList : [];
};
/**
* 页面返回并关闭tab
*/
@ -81,16 +97,33 @@ function handleBack() {
async function handleSave() {
try {
await fillResultCardRef.value.verify();
} catch {
message.error('请完成必填项的填写');
const form = await fillResultCardRef.value.getFormData();
console.log(form);
if (!form) {
return;
}
try {
const form = fillResultCardRef.value.getFormData();
console.log(form);
{
const tempFileList = form.fileList || [];
let tempFiles: any = [];
if (tempFileList.length > 0) {
tempFiles = await fileUploader.upload(tempFileList, { source: 'ht' });
}
if (tempFiles) {
form.biddingResult = (
tempFiles.map((item) => item.fileUuid) || []
).join(',');
}
}
const data = await Apis.biddingResult.post_save({
params: {
contractId: businseeData.value.contractId,
projectId: businseeData.value.projectId,
// isKj: currData.value.frameProtocol === '1' ? '' : '',
isKj: '是',
},
data: form,
});
@ -103,7 +136,7 @@ async function handleSave() {
handleSubmit('openModal');
},
onCancel: () => {
back();
// back();
},
});
} catch (error) {
@ -111,23 +144,34 @@ async function handleSave() {
}
}
const nodeInfo = ref<any>({});
const chooseUserIds = ref([]);
async function handleSubmit(type: 'openModal' | 'submit') {
if (type === 'openModal') {
//
let tempNodeInfo = await Apis.biddingResult.get_getFlowNodeUserConfig({
params: { guid: submitGuid.value },
});
nodeInfo.value = tempNodeInfo = tempNodeInfo.rows[0];
chooseUserModalApi.setData({
title: '选择审批人',
title: `选择${tempNodeInfo.name}(${tempNodeInfo.selectMode})`,
limitMultipleNum: tempNodeInfo.selectMode === '多选' ? 10 : 1,
});
chooseUserModalApi.open();
}
if (type === 'submit') {
isLoading.value = true;
chooseUserIds.value = selectUsers.value.map((item) => item.ACCOUNT_ID);
try {
// await Apis.selectMerchantsBasicInfo.post_flowStart({
// data: {
// guid: selectMerchantsBasicInfoId.value,
// assigneeList: selectUsers.value.map((item) => item.ACCOUNT_ID),
// },
// });
await Apis.selectMerchantsBasicInfo.post_flowStart({
data: {
guid: selectMerchantsBasicInfoId.value,
assigneeList: selectUsers.value.map((item) => item.ACCOUNT_ID),
},
});
message.success('提交成功');
back();
} catch (error) {
@ -151,6 +195,8 @@ onMounted(async () => {
const business: any = await Apis.selectMerchantsBasicInfo.get_getOne({
params: { contractId: contract.contractId },
});
business.frameProtocol = contract.frameProtocol;
businseeData.value = business;
}
} catch (error) {
@ -192,6 +238,23 @@ onMounted(async () => {
>
提交
</vben-button>
<vben-button
v-if="['paApproval'].includes(currData.step) && taskId"
:disabled="!auditId"
variant="primary"
@click="handleAudit('openAccessModal')"
>
通过
</vben-button>
<vben-button
v-if="['paApproval'].includes(currData.step) && taskId"
:disabled="!auditId"
variant="destructive"
@click="handleAudit('openRejectModal')"
>
退回
</vben-button>
</template>
<vben-button variant="secondary" @click="handleBack()">
返回
@ -224,10 +287,41 @@ onMounted(async () => {
<FillResultCard
v-if="businseeData.projectId"
ref="fillResultCardRef"
:businsee-data="businseeData"
:contract-id="businseeData.contractId"
:project-id="businseeData.projectId"
/>
</a-collapse-panel>
<a-collapse-panel key="6" class="w-full" header="招标相关资料上传">
<a-form
ref="formRef"
:label-col="{ style: { width: '120px' } }"
:model="form"
>
<a-form-item label="合同附件" name="fileList">
<a-upload
v-model:file-list="form.fileList"
:before-upload="() => false"
:max-count="3"
accept=".pdf,.ppt,.pptx"
name="file"
@change="handleChange"
>
<a-button v-if="!readOnly">
<MdiUpload />
点击上传
</a-button>
<div
v-if="readOnly && form.fileList.length === 0"
class="text-gray-700"
>
无附件
</div>
</a-upload>
</a-form-item>
</a-form>
</a-collapse-panel>
</a-collapse>
</Page>
</template>

View File

@ -140,6 +140,9 @@ function handleCloseTag(row) {
checkRecords.value = checkRecords.value.filter(
(item) => item.guid != row.guid,
);
checkRecordIds.value = checkRecordIds.value.filter(
(item) => item != row.guid,
);
xGridRef.value?.setCheckboxRow(row, false);
}

View File

@ -1,14 +1,14 @@
<script setup lang="ts">
import type { VxeGridPropTypes } from 'vxe-table';
import { nextTick, onMounted, reactive, ref, watch } from 'vue';
import { message } from 'ant-design-vue';
import { logger } from 'common-utils';
import Apis from '#/api';
import { useVxeTable } from '#/hooks/vxeTable';
import { getAuditInfoColumns } from '#/views/contract/schema';
import { DICT_TYPE, getDictObj, getDictOptions } from '#/utils/dict';
import type { VxeGridPropTypes } from 'vxe-table';
import { useRender } from '#/hooks/useRender';
import { useVxeTable } from '#/hooks/vxeTable';
import { DICT_TYPE, getDictObj } from '#/utils/dict';
const props = withDefaults(
defineProps<{
@ -62,7 +62,7 @@ function getColumns(): any {
/** Hooks - 表格 */
const gridOptions = reactive(
gridProps({
height: '200px',
minHeight: '120px',
columns: getColumns(),
data: [],
toolbarConfig: {

View File

@ -1,5 +1,6 @@
<script setup lang="ts">
import { nextTick, onMounted, reactive, ref } from 'vue';
import { logger } from 'common-utils';
import { useVxeTable } from '#/hooks/vxeTable';
@ -25,7 +26,7 @@ const isLoading = ref(false);
/** Hooks - 表格 */
const gridOptions = reactive(
gridProps({
height: '200px',
minHeight: '120px',
columns: getColumnsByFiles({ readOnly: true }),
data: [],
toolbarConfig: {

View File

@ -5,7 +5,7 @@ import dayjs, { type Dayjs } from 'dayjs';
import { DICT_TYPE, getDictOptions } from '#/utils/dict';
export function getFormSchema(params: any = {}) {
const { chooseCompanyModalApi, formRef, dictMap } = params || {};
const { chooseCompanyModalApi, formRef, dictMap, sqConsignPt } = params || {};
const disabledDate = (current: Dayjs) => {
const form = formRef.value.form;
@ -83,8 +83,12 @@ export function getFormSchema(params: any = {}) {
name: 'fs-dict-select',
vModel: 'value',
allowClear: false,
showSearch: true,
filterOption: (input, option) => {
return option.label.includes(input.toLowerCase());
},
dict: dict({
data: [],
data: sqConsignPt,
}),
},
},

View File

@ -17,6 +17,8 @@ import Apis from '#/api';
import { useVxeTable } from '#/hooks/vxeTable';
import { DICT_TYPE, getDictDatasAsync } from '#/utils/dict';
import { FileUploader } from '#/utils/file';
import BasisTable from '#/views/contract/components/basis-table/basis-table.vue';
import ApprovalCard from '#/views/contract/iframe-info/components/info-approval/approval-card.vue';
import chooseUserModal from '#/views/system/user/choose-user-modal.vue';
import chooseCompanyModal from '../../company/list/choose-company-modal.vue';
@ -265,6 +267,8 @@ const businessData = ref<any>({});
const currData = ref({});
const sqConsignPt = ref<any>({});
onMounted(async () => {
isLoading.value = true;
try {
@ -275,6 +279,13 @@ onMounted(async () => {
contractTypeData.value = contractReferTypeData.rows || [];
//
const userData = await Apis.sqConsignPt.get_SigningaAuthorizationSerch({
params: {},
});
sqConsignPt.value = userData.rows.map((item) => ({
label: item.userPerson,
value: item.userId,
}));
const dictMap = await getDictDatasAsync(
[
@ -289,6 +300,7 @@ onMounted(async () => {
chooseCompanyModalApi,
formRef,
dictMap,
sqConsignPt: sqConsignPt.value,
});
formBindingByBaseInfo.value.columns = getFormSchemaByBaseInfo({
contractTypeData: contractTypeData.value,
@ -382,17 +394,11 @@ onMounted(async () => {
<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="formRefByBaseInfo"
class="w-full"
v-bind="formBindingByBaseInfo"
/>
<ApprovalCard :info="contractData" />
</a-collapse-panel>
<a-collapse-panel key="2" class="w-full" header="签约依据">
<VxeGrid ref="xGridRef" v-bind="gridOptions" class="">
<template #toolbar_buttons></template>
</VxeGrid>
<BasisTable :basis-id="contractData.basisId" />
</a-collapse-panel>
<a-collapse-panel key="3" class="w-full" header="合同基本信息二">

View File

@ -41,11 +41,12 @@ withDefaults(
{{ getDictObj(DICT_TYPE.contract_funding_source, info.fundDitch)?.label }}
</a-descriptions-item>
<a-descriptions-item label="预算金额">
{{ `${info.budgetSum || ''} ${info.priceTypeName || ''}` }}
<!-- {{ `${info.budgetSum || ''} ${info.priceTypeName || ''}` }} -->
{{ `${info.budgetSum || ''} ${'元'}` }}
</a-descriptions-item>
<a-descriptions-item :span="2" label="组织形式">
{{
getDictObj(DICT_TYPE.contract_organization_form, info.organiza?.label)
getDictObj(DICT_TYPE.contract_organization_form, info.organiza)?.label
}}
</a-descriptions-item>
<a-descriptions-item :span="3" label="相关附件">

View File

@ -1,21 +1,20 @@
<script setup lang="ts">
import { nextTick, onMounted, reactive, ref } from 'vue';
import { onMounted, ref } from 'vue';
import { message } from 'ant-design-vue';
import { logger } from 'common-utils';
import Apis from '#/api';
import { useVxeTable } from '#/hooks/vxeTable';
import { FileUploader } from '#/utils/file';
import { getAuditInfoColumns } from '#/views/contract/schema';
import ApprovalCard from '#/views/contract/iframe-info/components/info-approval/approval-card.vue';
import AuditNodeTable from '#/views/contract/components/audit-node-table/audit-node-table.vue';
import BasisTable from '#/views/contract/components/basis-table/basis-table.vue';
import ApprovalCard from '#/views/contract/iframe-info/components/info-approval/approval-card.vue';
const props = withDefaults(
defineProps<{
contractId?: string;
// flowInstanceId
flowInstanceId: string;
contractId?: string;
id?: string;
}>(),
{
@ -66,7 +65,7 @@ onMounted(async () => {
<div class="flex h-full w-full flex-col">
<a-collapse v-model:active-key="collapseActiveKey">
<a-collapse-panel key="1" class="w-full" header="基本信息">
<ApprovalCard :info="currData"></ApprovalCard>
<ApprovalCard :info="currData" />
</a-collapse-panel>
<a-collapse-panel key="2" class="w-full" header="签约依据信息">

View File

@ -20,6 +20,9 @@ onMounted(async () => {
// console.log(info.value);
const info = props.info;
//
//
if (info.contractId) {
//
if (info.frameProtocol === '1') {
const bidData = await Apis.bidding.get_list({
@ -41,18 +44,22 @@ onMounted(async () => {
},
});
if (info.frameProtocol === '0') {
providerPtList.value = providerData.rows;
providerPtList.value = providerData.rows.filter(
(item) => item.phaseSeq === 99_999,
);
}
if (info.frameProtocol === '1') {
bidList.value.forEach((bid) => {
bid.providerList = providerData.rows;
});
}
}
});
</script>
<template>
<a-descriptions
v-if="info.contractId"
:label-style="{ width: '150px' }"
bordered
size="small"
@ -88,7 +95,7 @@ onMounted(async () => {
{{ `${info.budgetSum || ''} ${info.priceTypeName || ''}` }}
</a-descriptions-item>
<a-descriptions-item
v-show="info.frameProtocol === '0'"
v-if="info.frameProtocol === '0'"
:span="3"
label="推荐供应商"
>
@ -101,7 +108,7 @@ onMounted(async () => {
</vxe-column>
<vxe-column field="qualification" title="资质情况">
<template #default="{ row }">
{{ row.qualification }}
{{ row.aptitudeName }}
</template>
</vxe-column>
<vxe-column field="contactPerson" title="联系人">
@ -124,26 +131,19 @@ onMounted(async () => {
</a-descriptions-item>
<a-descriptions-item
v-show="info.frameProtocol === '1'"
v-if="info.frameProtocol === '1'"
:span="3"
label="标段信息"
>
<template v-for="bid in bidList" :key="bid.id">
<vxe-table :data="[bid]" size="mini">
<vxe-column field="bidName" title="标段名称">
<vxe-column field="phaseName" title="标段名称">
<template #default="{ row }">
{{ row.bidName }}
{{ row.phaseName }}
</template>
</vxe-column>
<vxe-column field="phaseMoney" title="预算金额">
<template #default="{ row }">
{{ row.phaseMoney }}
</template>
</vxe-column>
<vxe-column field="phaseDesc" title="标段范围说明">
<template #default="{ row }">
{{ row.phaseDesc }}
</template>
<template #default="{ row }"> {{ row.phaseMoney }} </template>
</vxe-column>
<vxe-column field="phaseDesc" title="标段范围说明">
<template #default="{ row }">
@ -160,7 +160,7 @@ onMounted(async () => {
</vxe-column>
<vxe-column field="qualification" title="资质情况">
<template #default="{ row }">
{{ row.qualification }}
{{ row.aptitudeName }}
</template>
</vxe-column>
<vxe-column field="contactPerson" title="联系人">
@ -202,4 +202,5 @@ onMounted(async () => {
{{ info.stockPlanMx || '无' }}
</a-descriptions-item>
</a-descriptions>
<a-empty v-else :image="simpleImage" />
</template>

View File

@ -1,29 +1,22 @@
<script setup lang="ts">
import { nextTick, onMounted, reactive, ref } from 'vue';
import { onMounted, ref } from 'vue';
import { useRoute } from 'vue-router';
import { Modal } from 'ant-design-vue';
import { Empty, Modal } from 'ant-design-vue';
import { logger } from 'common-utils';
import Apis from '#/api';
import { useVxeTable } from '#/hooks/vxeTable';
import { FileUploader } from '#/utils/file';
import {
getAuditInfoColumns,
getColumnsByFiles,
} from '#/views/contract/schema';
import { getFormSchema } from '../info-approval/curd';
import { getFormSchemaByBusiness } from './curd';
import ApprovalCard from '#/views/contract/iframe-info/components/info-approval/approval-card.vue';
import AuditNodeTable from '#/views/contract/components/audit-node-table/audit-node-table.vue';
import FileCard from '#/views/contract/components/file-card/file-card.vue';
import ApprovalCard from '#/views/contract/iframe-info/components/info-approval/approval-card.vue';
import BusinessCard from '#/views/contract/iframe-info/components/info-business/business-card.vue';
const props = withDefaults(
defineProps<{
flowInstanceId: string;
contractId?: string;
flowInstanceId: string;
id?: string;
}>(),
{
@ -33,6 +26,8 @@ const props = withDefaults(
},
);
const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE;
const { xGridRef, gridProps } = useVxeTable({ ref: 'xGridRef' });
const { xGridRef: xGridRefByAuditInfo } = useVxeTable({
ref: 'xGridRefByAuditInfo',
@ -70,6 +65,7 @@ onMounted(async () => {
const business: any = await Apis.selectMerchantsBasicInfo.get_getOne({
params: { contractId: contract.contractId },
});
business.frameProtocol = contract.frameProtocol;
businseeData.value = business;
// xGridRef.value!.reloadColumn(getColumns());
}
@ -88,7 +84,10 @@ onMounted(async () => {
<template>
<div class="flex h-full w-full flex-col">
<a-collapse v-model:active-key="collapseActiveKey">
<a-collapse
v-if="!isLoading && businseeData.contractId"
v-model:active-key="collapseActiveKey"
>
<a-collapse-panel key="1" class="w-full" header="合同基本信息">
<ApprovalCard :info="currData" />
</a-collapse-panel>
@ -98,13 +97,18 @@ onMounted(async () => {
</a-collapse-panel>
<a-collapse-panel key="3" class="w-full" header="招标文件">
<FileCard :fileUuids="''"></FileCard>
<FileCard file-uuids="" />
</a-collapse-panel>
<a-collapse-panel key="4" class="w-full" header="审批信息">
<AuditNodeTable :flow-instance-id="props.flowInstanceId" />
</a-collapse-panel>
</a-collapse>
<a-empty v-if="!isLoading && !businseeData.contractId" :image="simpleImage">
<template #description>
<h3 class="text-center text-red-500">无合同选商信息</h3>
</template>
</a-empty>
</div>
</template>

View File

@ -72,9 +72,9 @@ const tabList = [
];
onMounted(() => {
// if (type) {
// tabKey.value = type;
// }
if (type) {
tabKey.value = type;
}
if (!type || !id) {
console.warn('缺少参数');
@ -90,7 +90,7 @@ onMounted(() => {
:is="item.component"
:id="id"
:contract-id="contractId"
:flowInstanceId="flowInstanceId"
:flow-instance-id="flowInstanceId"
/>
</a-tab-pane>
</a-tabs>

View File

@ -44,7 +44,7 @@ export default defineConfig(async () => {
'/api/czg/flowCenter': {
changeOrigin: true,
rewrite: (path) =>
path.replace(/^\/api\/flowCenter/, '/czg/flowCenter'),
path.replace(/^\/api\/czg\/flowCenter/, '/flowCenter'),
// target: `http://10.71.220.24:8083/rl`,
target: `http://192.168.147.164:19007`,
ws: true,
@ -52,7 +52,7 @@ export default defineConfig(async () => {
'/api/zp/flowCenter': {
changeOrigin: true,
rewrite: (path) =>
path.replace(/^\/api\/flowCenter/, '/zp/flowCenter'),
path.replace(/^\/api\/zp\/flowCenter/, '/flowCenter'),
// target: `http://10.71.220.24:8083/rl`,
target: `http://192.168.147.164:19007`,
ws: true,
@ -60,7 +60,7 @@ export default defineConfig(async () => {
'/api/zzz/flowCenter': {
changeOrigin: true,
rewrite: (path) =>
path.replace(/^\/api\/flowCenter/, '/zzz/flowCenter'),
path.replace(/^\/api\/zzz\/flowCenter/, '/flowCenter'),
// target: `http://10.71.220.24:8083/rl`,
target: `http://192.168.147.164:19007`,
ws: true,

View File

@ -31,7 +31,7 @@ function mergeDeep(target: any, source: any) {
*/
function defineOverridesPreferences(preferences: DeepPartial<Preferences>) {
let defaultPreferences: DeepPartial<Preferences> = {
const defaultPreferences: DeepPartial<Preferences> = {
app: {
accessMode: 'frontend',
colorGrayMode: false,
@ -41,7 +41,7 @@ function defineOverridesPreferences(preferences: DeepPartial<Preferences>) {
defaultAvatar: '',
dynamicTitle: true,
// 是否开启检查更新
enableCheckUpdates: true,
enableCheckUpdates: false,
// 检查更新的时间间隔,单位为分钟
checkUpdatesInterval: 1,
// 开启布局设置按钮

View File

@ -1,5 +1,6 @@
import type { BodyOptions, QueryOptions } from './global.d';
import { http } from './request/index';
import type { QueryOptions, BodyOptions } from './global.d';
export default {
meeting: {
@ -549,6 +550,15 @@ export default {
/** 合同系统/履行/履行提示/合同变更 获取合同变更信息 */
get_getContractChangeInfo: (data?: QueryOptions) =>
http.get('/app/lvxChange/getContractChangeInfo', data),
/** 合同系统/履行/履行提示/合同变更 查询流程未配置人员节点 */
get_getFlowNodeUserConfig: (data?: QueryOptions) =>
http.get('/app/lvxChange/getFlowNodeUserConfig', data),
/** 合同系统/履行/履行提示/合同变更 流程启动 */
post_startWorkFlow: (data?: BodyOptions) =>
http.post('/app/lvxChange/startWorkFlow', data),
/** 合同系统/履行/履行提示/合同变更 审核通过 */
post_submit: (data?: BodyOptions) =>
http.post('/app/lvxChange/submit', data),
},
contractRelieve: {
/** 合同系统/履行/履行提示/合同解除 获取合同解除信息 */
@ -581,6 +591,11 @@ export default {
lvxResult: {
/** 合同系统/履行/履行结果 履行结果保存 */
post_save: (data?: BodyOptions) => http.post('/app/lvxResult/save', data),
/** 合同系统/履行/履行结果 分页履行结果查询 */
get_page: (data?: QueryOptions) => http.get('/app/lvxResult/page', data),
/** 合同系统/履行/履行结果 已办 */
get_pageDone: (data?: QueryOptions) =>
http.get('/app/lvxResult/pageDone', data),
},
contractFiling: {
/** 合同系统/履行/履行提示/临时归档 保存临时归档信息 */
@ -643,7 +658,7 @@ export default {
/** 合同系统/签订 获取合同签订信息 */
get_getContractSignInfo: (data?: QueryOptions) =>
http.get('/app/qdSign/getContractSignInfo', data),
/** 合同系统/签订 打印签订审批表 */
/** 合同系统/打印 选商打印 */
get_printApprove: (data?: QueryOptions) =>
http.get('/app/qdSign/printApprove', data),
/** 合同系统/签订 打印文本 */
@ -812,6 +827,15 @@ export default {
/** 合同系统/选商/选商结果 待审核 */
get_toDoPage: (data?: QueryOptions) =>
http.get('/app/biddingResult/toDoPage', data),
/** 合同系统/选商/选商结果 查询合同信息 */
get_getContractInfo: (data?: QueryOptions) =>
http.get('/app/biddingResult/getContractInfo', data),
/** 合同系统/选商/选商结果 查询供应商列表 */
get_getProviderInfo: (data?: QueryOptions) =>
http.get('/app/biddingResult/getProviderInfo', data),
/** 合同系统/选商/选商结果 选商专家列表 */
get_queryBiddingExpert: (data?: QueryOptions) =>
http.get('/app/biddingResult/queryBiddingExpert', data),
},
home: {
/** 合同系统/首页待办/已办 首页待办 */
@ -865,8 +889,8 @@ export default {
/** 设备管理/设备静态库管理/设备调拨 调拨信息保存 */
post_save: (data?: BodyOptions) => http.post('/app/equAllot/save', data),
/** 设备管理/设备静态库管理/设备调拨 调拨信息删除 */
post_delete: (data?: BodyOptions) =>
http.post('/app/equAllot/delete', data),
post_deletes: (data?: BodyOptions) =>
http.post('/app/equAllot/deletes', data),
},
bidding: {
/** 合同系统/标段信息 标段查询 */
@ -876,6 +900,9 @@ export default {
/** 合同系统/标段信息 标段信息删除 */
post_deletes: (data?: BodyOptions) =>
http.post('/app/bidding/deletes', data),
/** 合同系统/选商/选商结果 查询标段列表 */
get_getBuddingPtInfoList: (data?: QueryOptions) =>
http.get('/app/bidding/getBuddingPtInfoList', data),
},
equAccident: {
/** 设备管理/设备使用管理/事故处理 事故处理(查询/获取) */
@ -921,8 +948,8 @@ export default {
post_save: (data?: BodyOptions) =>
http.post('/app/equDayRepair/save', data),
/** 设备管理/设备使用管理/日常维修 删除 */
get_deletes: (data?: QueryOptions) =>
http.get('/app/equDayRepair/deletes', data),
post_deletes: (data?: BodyOptions) =>
http.post('/app/equDayRepair/deletes', data),
/** 设备管理/查询管理/日常维修查询 查询 */
get_query: (data?: QueryOptions) =>
http.get('/app/equDayRepair/query', data),