diff --git a/src/api/largeScreen/index.ts b/src/api/largeScreen/index.ts new file mode 100644 index 0000000..1a0da4c --- /dev/null +++ b/src/api/largeScreen/index.ts @@ -0,0 +1,99 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { MasterVO, MasterForm, MasterQuery } from '@/api/patch/types'; +/** + * 合同金额 + * + */ +export const totalAmount = () => { + return request({ + url: '/money/big/screen/totalAmount', + method: 'get' + }); +}; + +/** + * 查询项目位置列表 + * + */ export const projectGis = (clientid) => { + return request({ + url: '/money/big/screen/project/gis', + method: 'get', + params: clientid + }); +}; + +/** + * 应收实收 + * + */ export const incomePay = (clientid) => { + return request({ + url: '/money/big/screen/income/pay', + method: 'get', + params: clientid + }); +}; + +/** + * 收入合同分析 + * + */ export const incomeAnalyze = (clientid) => { + return request({ + url: '/money/big/screen/income/analyze', + method: 'get', + params: clientid + }); +}; +/** + * 应付实付 + * + */ export const expensesPay = (clientid) => { + return request({ + url: '/money/big/screen/expenses/pay', + method: 'get', + params: clientid + }); +}; +/** + * 支出合同分析 + * + */ export const expensesAnalyze = (clientid) => { + return request({ + url: '/money/big/screen/expenses/analyze', + method: 'get', + params: clientid + }); +}; +/** + * 成本 + * + */ export const cost = (clientid) => { + return request({ + url: '/money/big/screen/cost', + method: 'get', + params: clientid + }); +}; + +// 资金KPI +export const monthMoney = () => { + return request({ + url: '/money/big/screen/monthMoney', + method: 'get', + }); +}; +// 现金流 +export const monthCash = () => { + return request({ + url: '/money/big/screen/monthCash', + method: 'get', + }); +}; +// 现金流总和 + +export const cashTotal = () => { + return request({ + url: '/money/big/screen/cashTotal', + method: 'get', + }); +}; diff --git a/src/api/materials/materialsUseRecord/index.ts b/src/api/materials/materialsUseRecord/index.ts new file mode 100644 index 0000000..177b5b2 --- /dev/null +++ b/src/api/materials/materialsUseRecord/index.ts @@ -0,0 +1,70 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { MaterialsUseRecordVO, MaterialsUseRecordForm, MaterialsUseRecordQuery } from '@/api/materials/materialsUseRecord/types'; + +/** + * 查询材料使用登记列表 + * @param query + * @returns {*} + */ + +export const listMaterialsUseInventory = (query?: MaterialsUseRecordQuery): AxiosPromise => { + return request({ + url: '/materials/materialsInventory/list', + method: 'get', + params: query + }); +}; +export const listMaterialsUseRecord = (query?: MaterialsUseRecordQuery): AxiosPromise => { + return request({ + url: '/materials/materialsUseRecord/list', + method: 'get', + params: query + }); +}; + +/** + * 查询材料使用登记详细 + * @param id + */ +export const getMaterialsUseRecord = (id: string | number): AxiosPromise => { + return request({ + url: '/materials/materialsUseRecord/' + id, + method: 'get' + }); +}; + +/** + * 新增材料使用登记 + * @param data + */ +export const addMaterialsUseRecord = (data: MaterialsUseRecordForm) => { + return request({ + url: '/materials/materialsUseRecord', + method: 'post', + data: data + }); +}; + +/** + * 修改材料使用登记 + * @param data + */ +export const updateMaterialsUseRecord = (data: MaterialsUseRecordForm) => { + return request({ + url: '/materials/materialsUseRecord', + method: 'put', + data: data + }); +}; + +/** + * 删除材料使用登记 + * @param id + */ +export const delMaterialsUseRecord = (id: string | number | Array) => { + return request({ + url: '/materials/materialsUseRecord/' + id, + method: 'delete' + }); +}; diff --git a/src/api/materials/materialsUseRecord/types.ts b/src/api/materials/materialsUseRecord/types.ts new file mode 100644 index 0000000..697f347 --- /dev/null +++ b/src/api/materials/materialsUseRecord/types.ts @@ -0,0 +1,111 @@ +export interface MaterialsUseRecordVO { + /** + * 主键ID + */ + id: string | number; + + /** + * 项目ID + */ + projectId: string | number; + + /** + * 库存ID + */ + inventoryId: string | number; + + /** + * 使用部位 + */ + usePart: string; + + /** + * 使用数量 + */ + useNumber: number; + + /** + * 剩余量 + */ + residueNumber: string | number; + + /** + * 备注 + */ + remark: string; + +} + +export interface MaterialsUseRecordForm extends BaseEntity { + /** + * 主键ID + */ + id?: string | number; + + /** + * 项目ID + */ + projectId?: string | number; + + /** + * 库存ID + */ + inventoryId?: string | number; + + /** + * 使用部位 + */ + usePart?: string; + + /** + * 使用数量 + */ + useNumber?: number; + + /** + * 剩余量 + */ + residueNumber?: string | number; + + /** + * 备注 + */ + remark?: string; + +} + +export interface MaterialsUseRecordQuery extends PageQuery { + + /** + * 项目ID + */ + projectId?: string | number; + + /** + * 库存ID + */ + inventoryId?: string | number; + + /** + * 使用部位 + */ + usePart?: string; + + /** + * 使用数量 + */ + useNumber?: number; + + /** + * 剩余量 + */ + residueNumber?: string | number; + + /** + * 日期范围参数 + */ + params?: any; +} + + + diff --git a/src/api/tender/index.ts b/src/api/tender/index.ts index fd5a8ec..10a75dd 100644 --- a/src/api/tender/index.ts +++ b/src/api/tender/index.ts @@ -44,6 +44,7 @@ export const importExcelFile = (query: any, data: any): AxiosPromise => { }; //招标计划列表 + export const tenderPlanList = (query: any): AxiosPromise => { return request({ url: '/tender/biddingPlan/list', @@ -113,7 +114,14 @@ export const getUnitList = (query: any): AxiosPromise => { params: query }); }; - +//修改状态 +export const editStatus = (query: any): AxiosPromise => { + return request({ + url: '/tender/biddingPlan/editStatus', + method: 'put', + data: query + }); +}; //获取审核状态 export const getApproval = (id) => { return request({ diff --git a/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss index d2ecb24..d9409ed 100644 --- a/src/assets/styles/ruoyi.scss +++ b/src/assets/styles/ruoyi.scss @@ -288,3 +288,14 @@ h6 { .top-right-btn { margin-left: auto; } + +.text-two-lines { + display: -webkit-box; /* 触发弹性盒模型 */ + -webkit-box-orient: vertical; /* 垂直排列文本行 */ + -webkit-line-clamp: 2; /* 限制显示2行 */ + /* 3. 超出部分处理 */ + overflow: hidden; /* 隐藏超出容器的内容 */ + text-overflow: ellipsis; /* 超出部分显示省略号 */ + /* 可选:优化文本间距 */ + line-height: 1.5; /* 行高,控制两行的垂直间距 */ +} diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue index 8bfd847..5011b9d 100644 --- a/src/components/FileUpload/index.vue +++ b/src/components/FileUpload/index.vue @@ -1,11 +1,28 @@ - + diff --git a/src/views/biddingManagemen/listOfWinningBids/index copy 2.vue b/src/views/biddingManagemen/listOfWinningBids/index copy 2.vue new file mode 100644 index 0000000..1e7356c --- /dev/null +++ b/src/views/biddingManagemen/listOfWinningBids/index copy 2.vue @@ -0,0 +1,524 @@ + + + + + diff --git a/src/views/biddingManagemen/listOfWinningBids/index copy.vue b/src/views/biddingManagemen/listOfWinningBids/index copy.vue deleted file mode 100644 index cd2f39a..0000000 --- a/src/views/biddingManagemen/listOfWinningBids/index copy.vue +++ /dev/null @@ -1,344 +0,0 @@ - - - diff --git a/src/views/biddingManagemen/listOfWinningBids/index.vue b/src/views/biddingManagemen/listOfWinningBids/index.vue index f2c7700..9ea8b22 100644 --- a/src/views/biddingManagemen/listOfWinningBids/index.vue +++ b/src/views/biddingManagemen/listOfWinningBids/index.vue @@ -2,18 +2,66 @@
- + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + 中标 + 未中标 - - - + + + + - - - + + + + + + - - + + + - - + + + + - - - - - - + + - - + + - + + + - --> + + + + + + + + + + + + + + + + + + + + + + + + + @@ -142,172 +215,291 @@ diff --git a/src/views/contract/division/index.vue b/src/views/contract/division/index.vue index fe7153c..f78dd09 100644 --- a/src/views/contract/division/index.vue +++ b/src/views/contract/division/index.vue @@ -25,6 +25,7 @@ + - + + + + + - + @@ -284,6 +292,7 @@ const handleShowFileList = async (row: IncomeContractVO) => { }); } + onMounted(() => { getList(); }); diff --git a/src/views/ctr/index.vue b/src/views/ctr/index.vue index 6bb4d68..0412f38 100644 --- a/src/views/ctr/index.vue +++ b/src/views/ctr/index.vue @@ -1,429 +1,422 @@ +
- - + + + + + + + + + + + + + - - - - - - - - - - - - - - diff --git a/src/views/largeScreen/components/ProgressComponent.vue b/src/views/largeScreen/components/ProgressComponent.vue index da1b86c..36bc86b 100644 --- a/src/views/largeScreen/components/ProgressComponent.vue +++ b/src/views/largeScreen/components/ProgressComponent.vue @@ -1,17 +1,17 @@ \ No newline at end of file + diff --git a/src/views/largeScreen/components/RevenueContractCard.vue b/src/views/largeScreen/components/RevenueContractCard.vue index 14154dc..ff4d3bc 100644 --- a/src/views/largeScreen/components/RevenueContractCard.vue +++ b/src/views/largeScreen/components/RevenueContractCard.vue @@ -2,29 +2,12 @@
{{ title }}
- +
- {{ formattedValue }} + {{ props.value }} {{ unit }}
- - -
@@ -78,6 +61,10 @@ const props = defineProps({ customStyles: { type: Object, default: () => ({}) + }, + showIcon: { + type: Boolean, + default: false } }); @@ -103,22 +90,24 @@ const trendText = computed(() => { display: flex; flex-direction: column; justify-content: space-between; - padding: 20px; + padding: 35px 10px; box-sizing: border-box; border: 1px solid rgba(29, 214, 255, 0.1); border-radius: 4px; // 增加轻微圆角,提升视觉效果 - + &__title { font-size: 14px; - color: #8FABBF; + color: #8fabbf; line-height: 20px; } - + &__value-container { - display: flex; + // display: flex; align-items: baseline; + // align-items: center; + // flex-direction: column; } - + &__value { font-size: 24px; color: #fff; @@ -126,34 +115,34 @@ const trendText = computed(() => { margin-right: 5px; font-weight: bold; } - + &__unit { - color: #8FABBF; + color: #8fabbf; font-size: 14px; } - + &__footer { display: flex; justify-content: space-between; align-items: center; } - + &__trend { display: flex; align-items: center; } - + &__trend-icon { width: 12px; height: 12px; margin-right: 4px; } - + &__trend-text { font-size: 14px; - color: #8FABBF; + color: #8fabbf; } - + &__badge { width: 40px; height: 40px; diff --git a/src/views/largeScreen/components/bottomboxconpoent.vue b/src/views/largeScreen/components/bottomboxconpoent.vue index 6735331..f904057 100644 --- a/src/views/largeScreen/components/bottomboxconpoent.vue +++ b/src/views/largeScreen/components/bottomboxconpoent.vue @@ -1,45 +1,162 @@ \ No newline at end of file +.bottom_box_text { + color: rgba(143, 171, 191, 1); + font-size: 14px; + line-height: 20px; + margin-bottom: 5px; +} + +.bottom_box_bottom { + width: 100%; + height: 8px; + margin: 5px 0; +} + +.cost-item { + color: #fff; + font-size: 14px; + line-height: 26px; + display: flex; + justify-content: space-between; +} + +.cost-label { + color: rgba(143, 171, 191, 1); +} + +.cost-value { + font-weight: 500; + color: #fff; +} + diff --git a/src/views/largeScreen/components/centerPage.vue b/src/views/largeScreen/components/centerPage.vue index aee49f0..952a419 100644 --- a/src/views/largeScreen/components/centerPage.vue +++ b/src/views/largeScreen/components/centerPage.vue @@ -1,146 +1,160 @@ + \ No newline at end of file diff --git a/src/views/largeScreen/components/leftPage.vue b/src/views/largeScreen/components/leftPage.vue index 683c9a3..8df1317 100644 --- a/src/views/largeScreen/components/leftPage.vue +++ b/src/views/largeScreen/components/leftPage.vue @@ -1,56 +1,300 @@ @@ -58,13 +302,23 @@ onMounted(() => { .leftPage { width: 100%; height: 100%; - .kpi_box{ + + .kpi_box { margin-bottom: 10px; } - .contract_box{ - height: 35vh; + + .contract_box { + height: 33vh; + display: flex; + flex-direction: column; // 按钮区和图表区垂直排列 } - .kpi_box,.contract_box { + + .chart-container { + height: 28vh; + } + + .kpi_box, + .contract_box { padding: 10px; box-sizing: border-box; border: 1px solid rgba(29, 214, 255, 0.3); diff --git a/src/views/largeScreen/components/optionList.ts b/src/views/largeScreen/components/optionList.ts index 822fd94..0daec3b 100644 --- a/src/views/largeScreen/components/optionList.ts +++ b/src/views/largeScreen/components/optionList.ts @@ -255,6 +255,7 @@ export const getLineOption = (lineData: any) => { const maxData = Math.max(...lineData.line1.flat()); const option = { + backgroundColor: '', tooltip: { trigger: 'axis', @@ -312,7 +313,7 @@ export const getLineOption = (lineData: any) => { axisLabel: { textStyle: { color: '#fff' - } + }, } }, yAxis: { @@ -698,17 +699,31 @@ export const getBarOptions = (data: any) => { backgroundColor: '', grid: { left: '8%', - top: '4%', + top: '10%', // 顶部留一点空间给 legend bottom: '8%', right: '2%' }, + legend: { + data: ['现金流入', '现金流出'], // 与 series.name 对应 + top: '0%', + textStyle: { color: '#fff', fontSize: 12 } + }, tooltip: { show: true, backgroundColor: '', trigger: 'axis', - formatter: '{b0}:{c0}万元', + // formatter: '{b0}:{c0}万元', + formatter: (params: any) => { + // params 是数组,对应每条柱子 + return params + .map((p: any) => `${p.seriesName}:${p.value} 万元`) + .join('
'); + }, textStyle: { color: '#fff' + }, + axisPointer: { + type: 'shadow' // 默认为直线,可选为:'line' | 'shadow', } // borderColor: 'rgba(252, 217, 18, 1)' }, @@ -779,6 +794,7 @@ export const getBarOptions = (data: any) => { // ], series: [ { + name: '现金流入', type: 'bar', data: data.value[0], // stack: '合并', @@ -817,6 +833,7 @@ export const getBarOptions = (data: any) => { } }, { + name: '现金流出', type: 'bar', data: data.value[1], // stack: '合并', @@ -846,12 +863,12 @@ export const getBarOptions = (data: any) => { ) }, label: { - show: false, + show: true, formatter: '{c}', position: 'top', color: '#fff', - fontSize: 10 - // padding: 5 + fontSize: 10, + padding: 5 } } ] @@ -862,7 +879,7 @@ export const getBarOptions = (data: any) => { // 收支合同分析 export const getBarOptions2 = (data: any) => { const option = { - color:['#FF932A', '#678FE6', '#1DD6FF', '#00E396'], + color: ['#FF932A', '#678FE6', '#1DD6FF', '#00E396'], title: { text: '数量(个)', subtext: '16', @@ -872,14 +889,16 @@ export const getBarOptions2 = (data: any) => { color: '#9DADB7', fontSize: 16 }, - subtextStyle:{ + subtextStyle: { color: '#707070', fontSize: 32, fontWeight: 'bold' } }, tooltip: { - trigger: 'item' + trigger: 'item', + show: true + }, legend: { top: '5%', @@ -907,7 +926,7 @@ export const getBarOptions2 = (data: any) => { show: false }, data: [ - { value: 3, name: '100万一下' }, + { value: 3, name: '100万以下' }, { value: 4, name: '100-500万' }, { value: 5, name: '500-1000万' }, { value: 4, name: '1000万以上' }, diff --git a/src/views/largeScreen/components/rightPage.vue b/src/views/largeScreen/components/rightPage.vue index bcde746..f9e9bfd 100644 --- a/src/views/largeScreen/components/rightPage.vue +++ b/src/views/largeScreen/components/rightPage.vue @@ -11,17 +11,17 @@
现金流入
-
1000000
+
{{ bigDataObj.incomeCash }}
万元
现金流出
-
1000000
+
{{ bigDataObj.expensesCash }}
万元
净现金流
-
1000000
+
{{ bigDataObj.profitCash }}
万元
@@ -33,7 +33,7 @@
项目进度
100%
--> - @@ -45,45 +45,63 @@ import TitleComponent from './TitleComponent.vue'; import EchartBox from '@/components/EchartBox/index.vue'; import { getLineOption, getBarOptions } from './optionList'; import ProgressComponent from './ProgressComponent.vue'; +import { monthMoney, monthCash, cashTotal } from '@/api/largeScreen/index'; const lineOption = ref(); const barOption = ref(); +const bigDataObj = ref({}); + +const getCapitalData = async () => { + const { data } = await monthMoney() + const month = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']; + const income = data.map((item: any) => item.incomeAmount); + const expenses = data.map((item: any) => item.expensesAmount); + const profit = data.map((item: any) => item.profitAmount); -const getCapitalData = (data?: any) => { - // const xData = data.map((item) => item.time); - // const yData = data.map((item) => item.content); const lineData = { - xLabel: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + xLabel: month, line1: [ - [100, 200, 150, 300, 250, 350, 400, 350, 450, 500, 400, 550], - [220, 250, 230, 280, 270, 300, 350, 320, 380, 400, 450, 500], - [300, 350, 320, 380, 400, 450, 500, 480, 520, 550, 600, 650] + income, + expenses, + profit ] // line2: ['20', '50', '12', '65', '30', '60'] }; lineOption.value = getLineOption(lineData); }; -const getTurnoverList = (data?: any) => { +const getTurnoverList = async () => { // const xData = data.map((item) => item.time); // const yData = data.map((item) => { // // 先将content转换为数字,再调用toFixed // const num = Number(item.content); // return isNaN(num) ? 0 : Number(num.toFixed(2)); // }); + const { data } = await monthCash() + // const month = data.map((item: any) => item.month); + const month = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']; + const income = data.map((item: any) => item.incomeAmount); + const expenses = data.map((item: any) => item.expensesAmount); const barData = { - name: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + name: month, value: [ - [2, 5, 15, 30, 25, 35, 40, 35, 45, 50, 40, 55], - [4, 3, 6, 11, 15, 22, 30, 14, 48, 22, 25, 60] + income, + expenses ] }; + console.log(barData); + barOption.value = getBarOptions(barData); }; +const getTotalAmonunt = async () => { + const { data } = await cashTotal() + bigDataObj.value = data +}; onMounted(() => { getCapitalData(); getTurnoverList(); + getTotalAmonunt(); }); //资金KPI diff --git a/src/views/largeScreen/index.vue b/src/views/largeScreen/index.vue index 8ce47fd..43428c8 100644 --- a/src/views/largeScreen/index.vue +++ b/src/views/largeScreen/index.vue @@ -1,4 +1,4 @@ -