From 35e4de39fa64fe95a0f0a37fc746e639747c2771 Mon Sep 17 00:00:00 2001 From: z9130 <984661593@qq.com> Date: Fri, 11 Oct 2024 12:22:43 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AB=8B=E9=A1=B9=E5=BA=9F=E9=99=A4=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=9B=E9=80=89=E5=95=86=E6=A0=87=E6=AE=B5=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E5=92=8C=E4=BE=9B=E5=BA=94=E5=95=86=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AF=B9=E6=8E=A5=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-contract/src/utils/dict/shared.ts | 2 + .../src/utils/dict/static.data.js | 8 + .../views/contract/approval/edit/index.vue | 184 +++++++++- .../contract/business/edit/bid-columns.tsx | 35 +- .../src/views/contract/business/edit/curd.tsx | 23 +- .../views/contract/business/edit/index.vue | 318 ++++++++++++++++-- .../components/todo-page/todo-page.vue | 23 +- .../web-contract/src/views/contract/schema.ts | 16 +- apps/web-contract/vite.config.mts | 26 +- 9 files changed, 524 insertions(+), 111 deletions(-) diff --git a/apps/web-contract/src/utils/dict/shared.ts b/apps/web-contract/src/utils/dict/shared.ts index 6c4256b8..e759b25b 100644 --- a/apps/web-contract/src/utils/dict/shared.ts +++ b/apps/web-contract/src/utils/dict/shared.ts @@ -48,6 +48,8 @@ export enum DICT_TYPE { payment_nature = 'payment_nature', /** 合同立项节点流程 */ contract_approval_flow_node = 'contract_approval_flow_node', + /** 合同选商节点流程 */ + contract_business_flow_node = 'contract_business_flow_node', /** 合同立项节点流程 */ contract_abolish_flow_node = 'contract_abolish_flow_node', /** 合同授权类型 */ diff --git a/apps/web-contract/src/utils/dict/static.data.js b/apps/web-contract/src/utils/dict/static.data.js index f726742c..90825cd0 100644 --- a/apps/web-contract/src/utils/dict/static.data.js +++ b/apps/web-contract/src/utils/dict/static.data.js @@ -77,6 +77,14 @@ export default { { label: '待废除审批', value: 'abolishDepartmentAudit' }, ]), + contract_business_flow_node: createEntry('合同选商节点流程', [ + { label: '待提交', value: 'edit' }, + { label: '待部门审核', value: 'departmentAudit' }, + { label: '已结束', value: 'end' }, + { label: '废除发起', value: 'abolishEdit' }, + { label: '待废除审批', value: 'abolishDepartmentAudit' }, + ]), + contract_abolish_flow_node: createEntry('合同立项节点流程', [ { label: '待提交', value: 'edit' }, { label: '待部门审核', value: 'departmentAudit' }, diff --git a/apps/web-contract/src/views/contract/approval/edit/index.vue b/apps/web-contract/src/views/contract/approval/edit/index.vue index 4e7bcd67..1e70cd8a 100644 --- a/apps/web-contract/src/views/contract/approval/edit/index.vue +++ b/apps/web-contract/src/views/contract/approval/edit/index.vue @@ -149,19 +149,129 @@ function removeRow(row) { } } -function handleAbolish() { - Modal.confirm({ - title: '提示', - content: '是否确认作废该合同?确认后该合同无法再次使用', - okType: 'danger', - onOk: async () => { - // await Apis.contractBaseInfo.post_abolish({ - // data: { - // guid: currData.value['guid'], - // }, - // }); - }, - }); +const userModalOpenType = ref<'abolish' | 'audit'>('audit'); +const currAuditType = ref<'abolish' | 'audit'>('audit'); + +const userListByAbolish = ref([]); + +async function handleAbolish(type: 'openModal' | 'confirm') { + userModalOpenType.value = 'abolish'; + if (type === 'openModal') { + Modal.confirm({ + title: '提示', + content: '是否确认作废该合同?确认后该合同无法再次使用', + okType: 'danger', + onOk: async () => { + chooseUserModalApi.setData({ + title: '选择立项废除审批人', + userIds: [], + }); + chooseUserModalApi.open(); + }, + }); + } + if (type === 'confirm') { + const hideLoading = message.loading('提交中...', 0); + try { + await Apis.contractBaseInfo.post_abolishFlowStart({ + data: { + guid: currData.value['guid'], + assigneeList: userListByAbolish.value.map((item) => item.ACCOUNT_ID), + }, + }); + } catch (error) { + logger.error('立项废除提交失败', error); + } finally { + hideLoading(); + } + } +} + +async function handleAbolishAudit( + type: 'accessConfirm' | 'reject' | 'rejectConfirm', + data?: any, +) { + console.log(type); + + if (type === 'accessConfirm') { + Modal.confirm({ + title: '提示', + content: '是否确认立项废除审核通过?', + onOk: async () => { + try { + await Apis.contractBaseInfo.post_abolishSubmit({ + params: { + guid: id.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.contractBaseInfo.post_rollback({ + params: { + guid: id.value, + }, + data: { + appId: id.value, + taskId: currData.value.taskId, + nodeId: '', + comment, + }, + }); + temporaryFormModalApi.close(); + message.success('退回成功'); + back(); + } catch (error) { + logger.error('合同立项退回失败', error); + message.error('退回失败,请稍候再试'); + } + } } function handleDelete() { @@ -195,6 +305,11 @@ function handleChooseConfirm(rows) { async function handleChooseUserConfirm(e) { chooseUserModalApi.close(); isLoading.value = true; + if (userModalOpenType.value === 'abolish') { + userListByAbolish.value = e; + handleAbolish('confirm'); + return; + } try { await Apis.contractBaseInfo.post_applyFlowStart({ data: { @@ -302,9 +417,11 @@ async function handleSave() { } async function handleSubmit() { + userModalOpenType.value = 'audit'; // isLoading.value = true chooseUserModalApi.setData({ title: '选择审批人', + userIds: [], }); chooseUserModalApi.open(); } @@ -316,6 +433,10 @@ async function handleAudit( console.log(type); if (type === 'accessConfirm') { + if (currAuditType.value === 'abolish') { + await handleAbolish('confirm'); + return; + } Modal.confirm({ title: '提示', content: '是否确认审核通过?', @@ -535,7 +656,7 @@ onMounted(async () => { currData.inputUserId === userInfo!.userId " variant="destructive" - @click="handleAbolish()" + @click="handleAbolish('openModal')" > 废除 @@ -546,6 +667,41 @@ onMounted(async () => { > 删除 + + + 废除通过 + + + + 废除拒绝 + + + + 通过 + 返回 diff --git a/apps/web-contract/src/views/contract/business/edit/bid-columns.tsx b/apps/web-contract/src/views/contract/business/edit/bid-columns.tsx index 7ff8403d..fdaa384b 100644 --- a/apps/web-contract/src/views/contract/business/edit/bid-columns.tsx +++ b/apps/web-contract/src/views/contract/business/edit/bid-columns.tsx @@ -2,16 +2,10 @@ import type { VxeGridPropTypes } from 'vxe-table'; export function getBidColumns(_params?: any): VxeGridPropTypes.Columns { const columns: VxeGridPropTypes.Columns = [ - { - field: 'operate', - title: '操作', - width: 120, - slots: { default: 'operate-slot' }, - }, - { - type: 'seq', - width: 50, - }, + // { + // type: 'seq', + // width: 50, + // }, { type: 'expand', width: '0px', @@ -35,6 +29,13 @@ export function getBidColumns(_params?: any): VxeGridPropTypes.Columns { minWidth: 300, slots: { default: 'phasedesc-slot' }, }, + { + field: 'operate', + title: '操作', + width: 120, + fixed: 'right', + slots: { default: 'operate-slot' }, + }, ]; return columns; @@ -42,12 +43,6 @@ export function getBidColumns(_params?: any): VxeGridPropTypes.Columns { export function getProviderColumns(_params?: any): VxeGridPropTypes.Columns { const columns: VxeGridPropTypes.Columns = [ - { - field: 'operate', - title: '操作', - width: 120, - slots: { default: 'operate-slot' }, - }, { field: 'providerName', title: '供应商名称', @@ -77,7 +72,13 @@ export function getProviderColumns(_params?: any): VxeGridPropTypes.Columns { minWidth: 200, slots: { default: 'remarks-slot' }, }, - + { + field: 'operate', + title: '操作', + width: 120, + fixed: 'right', + slots: { default: 'operate-slot' }, + }, ]; return columns; diff --git a/apps/web-contract/src/views/contract/business/edit/curd.tsx b/apps/web-contract/src/views/contract/business/edit/curd.tsx index b7f7f2b8..40d8c2ff 100644 --- a/apps/web-contract/src/views/contract/business/edit/curd.tsx +++ b/apps/web-contract/src/views/contract/business/edit/curd.tsx @@ -17,27 +17,6 @@ const [ChooseCompanyModal, chooseCompanyModalApi] = useVbenModal({ const xGridRefs = ref>(new Map()); const gridRefs = ref>(new Map()); - -export function getExtraData() { - // let tempBiddingList = xGridRef.value.getTableData().fullData; - // console.log(gridRefs.value); - - for (const [key, value] of xGridRefs.value) { - console.log(`Key: ${key}, Value: ${value}`); - let xRef = value; - console.log(xRef.getTableData().fullData); - } - - for (const [key, value] of gridRefs.value) { - console.log(`Key: ${key}, Value: ${value}`); - let xRef = value; - console.log(xRef.getTableData().fullData); - } - - return { - biddingList: [], - }; -} export function getFormSchema(params: any = {}) { let { formRef, dictMap = {}, bidList = [] } = params; @@ -299,7 +278,7 @@ export function getFormSchema(params: any = {}) { ), 'contactPhone-slot': ({ row }: any) => ( - + ), 'remarks-slot': ({ row }: any) => ( diff --git a/apps/web-contract/src/views/contract/business/edit/index.vue b/apps/web-contract/src/views/contract/business/edit/index.vue index 291b7436..4adcb559 100644 --- a/apps/web-contract/src/views/contract/business/edit/index.vue +++ b/apps/web-contract/src/views/contract/business/edit/index.vue @@ -23,7 +23,13 @@ import chooseUserModal from '#/views/system/user/choose-user-modal.vue'; import { getColumns } from '../../approval/signing-basis/columns'; import { getFormSchema as getFormSchemaByBaseInfo } from './basic-info-curd'; -import { getFormSchema, getExtraData } from './curd'; +import { getFormSchema } from './curd'; +import { getBidColumns, getProviderColumns } from './bid-columns'; +import chooseCompanyModal from '../../company/list/choose-company-modal.vue'; + +const [ChooseCompanyModal, chooseCompanyModalApi] = useVbenModal({ + connectedComponent: chooseCompanyModal, +}); const [ChooseUserModal, chooseUserModalApi] = useVbenModal({ connectedComponent: chooseUserModal, @@ -52,6 +58,9 @@ const isLoading = ref(false); const contractTypeData = ref([]); const currData = ref({}); +const bidGridRefs = ref>(new Map()); +const providerGridRefs = ref>(new Map()); + const formBindingByBaseInfo = ref({ col: { span: 24 }, initialForm: {}, @@ -80,6 +89,43 @@ const gridOptions = reactive( }), ); +const gridOptionsByBid = ref({ + height: 100, + showOverflow: true, + columns: getBidColumns({ readOnly: false }), + data: [], + toolbarConfig: { + enabled: false, + }, + pagerConfig: { + enabled: false, + }, + rowConfig: { + useKey: true, + isCurrent: false, + keyField: 'id', + }, + expandConfig: { + expandAll: true, + reserve: true, + showIcon: false, + }, +}); + +const gridOptionsByProvider = ref({ + columns: getProviderColumns({ readOnly: false }), + toolbarConfig: { + enabled: false, + }, + pagerConfig: { + enabled: false, + }, + rowConfig: { + useKey: true, + isCurrent: false, + }, +}); + const fileList = ref([]); function handleBack() { @@ -137,6 +183,7 @@ function handleFold() { function loadDataByContractTypeData() {} const selectUsers = ref([]); + async function handleChooseUserConfirm(e) { selectUsers.value = e; chooseUserModalApi.close(); @@ -144,6 +191,77 @@ async function handleChooseUserConfirm(e) { handleSubmit('submit'); } +const currBid = ref(); + +function handleChooseCompanyConfirm(e) { + console.log(currBid.value); + const gridRef = providerGridRefs.value.get(currBid.value.phaseSeq); // Assuming you have a main grid ref + // 找到对应的标段 + let bidRef = bidGridRefs.value.get(currBid.value.phaseSeq); + let bidFullData = bidRef.getTableData().fullData; + for (const item of bidFullData) { + if (item.phaseSeq === currBid.value.phaseSeq) { + item.providerList = item.providerList || []; + item.providerList.push(...e); + bidRef.loadData(bidFullData); + break; + } + } + console.log(bidRef.getTableData()); + gridRef && gridRef.insertAt(e, -1); +} + +const bidList = ref([]); + +function onBidNumChange(value) { + let fullData = bidList.value; + const currentLength = fullData.length; + + let rowsToAdd = []; + if (value < currentLength) { + // 删除多余的行(从 value 开始的行) + fullData.splice(value); // 直接对数组进行截取 + } else if (value > currentLength) { + // 插入新的行数据 + rowsToAdd = Array.from({ length: value - currentLength }).map((_, i) => ({ + phaseSeq: currentLength + i + 1 + '', + phaseName: `第${currentLength + i + 1}标段`, + phaseMoney: null, + phaseDesc: '', + providerList: [], + })); + + // 将新行插入到 fullData 中 + fullData.push(...rowsToAdd); // 使用 push 追加行 + } + bidList.value = fullData; + + setTimeout(() => { + console.log(bidGridRefs.value); + console.log(rowsToAdd); + for (const item of rowsToAdd) { + console.log(item.phaseSeq, bidGridRefs.value.get(item.phaseSeq + '')); + bidGridRefs.value.get(item.phaseSeq + '').insertAt(item, -1); + } + }, 300); +} + +function onChooseProvider(row) { + currBid.value = row; + const gridRef = providerGridRefs.value.get(currBid.value.phaseSeq); // Assuming you have a main grid ref + const tableFullData = gridRef?.getTableData()?.fullData || []; + chooseCompanyModalApi.setData({ + title: '选择供应商', + limitMultipleNum: 5, + guids: tableFullData.map((item) => item.guid) || [], + }); + chooseCompanyModalApi.open(); +} + +function removeProvider(row) { + const gridRef = providerGridRefs.value.get(currBid.value.phaseSeq); +} + async function handleAudit( type: 'accessConfirm' | 'reject' | 'rejectConfirm', data?: any, @@ -155,23 +273,24 @@ async function handleAudit( title: '提示', content: '是否确认审核通过?', onOk: async () => { - const [error, _] = await Apis.selectMerchantsBasicInfo.post_submit({ - params: { - guid: selectMerchantsBasicInfoId.value, - }, - data: { - appId: id.value, - taskId: currData.value.taskId, - nodeId: '', - comment: '通过', - }, - }); - if (error) { + try { + await Apis.selectMerchantsBasicInfo.post_submit({ + params: { + guid: selectMerchantsBasicInfoId.value, + }, + data: { + appId: id.value, + taskId: currData.value.taskId, + nodeId: '', + comment: '通过', + }, + }); + message.success('审核通过'); + } catch (error) { logger.error('审核通过失败', error); message.error('审核通过失败,请稍候再试'); return; } - message.success('审核通过'); }, }); } @@ -231,22 +350,60 @@ async function handleAudit( } async function handleSave() { - console.log(formRefByBaseInfo.value.form); + try { + await formRef.value.submit(); + await formRefByBaseInfo.value.submit(); + } catch { + message.error('请完成必填项的填写'); + return; + } - console.log(formRef.value.form); + let tempBidList: any = []; + let tempProviderList: any = []; + + for (const item of bidList.value) { + const gridRef = bidGridRefs.value.get(item.phaseSeq); + let fullData = gridRef.getTableData().fullData; + if (fullData.length > 0) { + let bidInfo = fullData[0]; + if (!bidInfo.phaseName) { + message.error(`【标段${item.phaseSeq}】中的标段名称不能为空`); + return; + } + if (!bidInfo.phaseMoney) { + message.error(`【${item.phaseName}】中的预算金额不能为空`); + return; + } + bidInfo.id = undefined; + tempBidList.push(bidInfo); + + for (const item2 of bidInfo.providerList || []) { + item2.phaseSeq = item.phaseSeq; + if (!item2.aptitudeName) { + message.error(`【标段${item.phaseSeq}】中供应商资质名称不能为空`); + return; + } + if (!item2.contactPerson) { + message.error(`【标段${item.phaseSeq}】中供应商联系人不能为空`); + return; + } + if (!item2.contactPhone) { + message.error(`【标段${item.phaseSeq}】中供应商联系人电话不能为空`); + return; + } + tempProviderList.push(item2); + } + } + } + + console.log(tempBidList); + console.log(tempProviderList); + + // return; - console.log(getExtraData()); - return; isLoading.value = true; try { - try { - await formRef.value.submit(); - await formRefByBaseInfo.value.submit(); - } catch { - message.error('请完成必填项的填写'); - return; - } const contractForm = formRefByBaseInfo.value.form; const bussinessForm = formRef.value.form; @@ -295,7 +452,8 @@ async function handleSave() { const form = { contractBaseInfo: contractForm, selectMerchantsBasicInfo: bussinessForm, - biddingList: [], + biddingList: tempBidList, + contractRecommendProviderList: tempProviderList, }; // if (form.selectMerchantsBasicInfo.isBid) { @@ -517,6 +675,11 @@ onMounted(async () => { @confirm="handleChooseUserConfirm" /> + + { />
- - - + + +
+ 标段数量: + + +
+
+ + +
+ +
+ 标段{{ item.phaseSeq }} + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/apps/web-contract/src/views/contract/components/todo-page/todo-page.vue b/apps/web-contract/src/views/contract/components/todo-page/todo-page.vue index c1806586..bc8224e0 100644 --- a/apps/web-contract/src/views/contract/components/todo-page/todo-page.vue +++ b/apps/web-contract/src/views/contract/components/todo-page/todo-page.vue @@ -8,6 +8,7 @@ import Apis from '#/api'; import { useVxeTable } from '#/hooks/vxeTable'; import { getTodoColumns } from '#/views/contract/schema'; import { toDetailPage } from '#/views/contract/utils'; +import { logger } from 'common-utils'; const props = withDefaults( defineProps<{ @@ -121,19 +122,17 @@ const grid2Options = reactive( ); function toDetail(type: string, id: string, row?: any) { - switch (type) { - case 'contractSetup': { - router.push(`/contract/approval/edit/${id}`); - break; - } - case 'selectMerchant': { - router.push(`/contract/business/edit/${row.contractId}`); - break; - } - default: { - break; - } + console.log(type, row); + if (['contractSetup', 'contractSetupAbolish'].includes(type)) { + router.push(`/contract/approval/edit/${id}`); + return; } + + if (['selectMerchant'].includes(type)) { + router.push(`/contract/business/edit/${row.contractId}`); + return; + } + logger.error('toDetail not support type:' + type, row); } onMounted(() => {}); diff --git a/apps/web-contract/src/views/contract/schema.ts b/apps/web-contract/src/views/contract/schema.ts index 4c87a402..44b897c1 100644 --- a/apps/web-contract/src/views/contract/schema.ts +++ b/apps/web-contract/src/views/contract/schema.ts @@ -5,6 +5,7 @@ import { h } from 'vue'; import { Tooltip } from 'ant-design-vue'; import { DICT_TYPE, getDictObj } from '#/utils/dict'; +import { useRender } from '#/hooks/useRender'; export const PrimaryKey = 'guid'; @@ -25,13 +26,20 @@ export function getTodoColumns(_params: any = {}): VxeGridPropTypes.Columns { width: 120, slots: { default: ({ row }) => { - return ( - getDictObj(DICT_TYPE.contract_todo_type, row.module)?.label || '' - ); + return row.flowName; + }, + }, + }, + { + field: 'taskName', + title: '任务', + width: 150, + slots: { + default: ({ row }) => { + return row.taskName; }, }, }, - { field: 'taskName', title: '任务', width: 200 }, { field: 'createTime', title: '分配时间', width: 150 }, { field: 'inputDepartName', title: '承办单位/部门', width: 150 }, { field: 'assigneeName', title: '承办人', width: 100 }, diff --git a/apps/web-contract/vite.config.mts b/apps/web-contract/vite.config.mts index 248ca7de..f74951c5 100644 --- a/apps/web-contract/vite.config.mts +++ b/apps/web-contract/vite.config.mts @@ -30,35 +30,35 @@ export default defineConfig(async () => { changeOrigin: true, rewrite: (path) => path.replace(/^\/api\/app/, '/'), // target: `http://10.71.220.24:8083/rl`, - target: `http://192.168.148.88:8083/rl`, + target: `http://192.168.147.164:8083/rl`, ws: true, }, '/api/flowCenter': { changeOrigin: true, rewrite: (path) => path.replace(/^\/api\/flowCenter/, '/flowCenter'), // target: `http://10.71.220.24:8083/rl`, - target: `http://192.168.148.88:19007`, + target: `http://192.168.147.164:19007`, ws: true, }, '/api/czg/flowCenter': { changeOrigin: true, rewrite: (path) => path.replace(/^\/api\/flowCenter/, '/flowCenter'), // target: `http://10.71.220.24:8083/rl`, - target: `http://192.168.148.88:19007`, + target: `http://192.168.147.164:19007`, ws: true, }, '/api/zp/flowCenter': { changeOrigin: true, rewrite: (path) => path.replace(/^\/api\/flowCenter/, '/flowCenter'), // target: `http://10.71.220.24:8083/rl`, - target: `http://192.168.148.88:19007`, + target: `http://192.168.147.164:19007`, ws: true, }, '/api/zzz/flowCenter': { changeOrigin: true, rewrite: (path) => path.replace(/^\/api\/flowCenter/, '/flowCenter'), // target: `http://10.71.220.24:8083/rl`, - target: `http://192.168.148.88:19007`, + target: `http://192.168.147.164:19007`, ws: true, }, '/api/czg/app': { @@ -71,15 +71,15 @@ export default defineConfig(async () => { '/api/czg/uc': { changeOrigin: true, rewrite: (path) => path.replace(/^\/api\/czg\/uc/, '/'), - target: `http://192.168.148.88:8082`, - // target: `http://192.168.148.88:8082`, + target: `http://192.168.147.164:8082`, + // target: `http://192.168.147.164:8082`, ws: true, }, '/api/uc': { changeOrigin: true, rewrite: (path) => path.replace(/^\/api\/uc/, '/'), // target: `http://10.71.220.24:8082`, - target: `http://192.168.148.88:8082`, + target: `http://192.168.147.164:8082`, ws: true, }, '/api/xmh/app': { @@ -93,7 +93,7 @@ export default defineConfig(async () => { changeOrigin: true, rewrite: (path) => path.replace(/^\/api\/xmh\/uc/, '/'), // mock代理目标地址 - target: `http://192.168.148.88:8082`, + target: `http://192.168.147.164:8082`, ws: true, }, '/api/zp/app': { @@ -107,21 +107,21 @@ export default defineConfig(async () => { changeOrigin: true, rewrite: (path) => path.replace(/^\/api\/zp\/uc/, '/'), // mock代理目标地址 - target: `http://192.168.148.88:8082`, + target: `http://192.168.147.164:8082`, ws: true, }, '/api/zzz/app': { changeOrigin: true, rewrite: (path) => path.replace(/^\/api\/zzz\/app/, '/'), // target: `http://192.168.0.193:8083/rl`, - target: `http://192.168.148.88:8089/rl`, + target: `http://192.168.147.164:8089/rl`, ws: true, }, '/api/zzz/uc': { changeOrigin: true, rewrite: (path) => path.replace(/^\/api\/zzz\/uc/, '/'), - target: `http://192.168.148.88:8082`, - // target: `http://192.168.148.88:8082`, + target: `http://192.168.147.164:8082`, + // target: `http://192.168.147.164:8082`, ws: true, }, },