From e8c6e0065e770119d6eee8a2d6344e063a237202 Mon Sep 17 00:00:00 2001 From: zhangminghua Date: Thu, 1 Dec 2022 11:21:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=90=8C=E6=98=8E=E7=BB=86=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=9A=82=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/lib/controllers/report/achievement.js | 28 +++++++++++ api/app/lib/routes/report/index.js | 3 ++ .../business/actions/achievement-report.js | 13 +++++ .../performanceReport/contractDetails.jsx | 47 ++++++++++++++++--- web/client/src/utils/webapi.js | 31 ++++++------ 5 files changed, 101 insertions(+), 21 deletions(-) diff --git a/api/app/lib/controllers/report/achievement.js b/api/app/lib/controllers/report/achievement.js index aa0a9f5..9a027ef 100644 --- a/api/app/lib/controllers/report/achievement.js +++ b/api/app/lib/controllers/report/achievement.js @@ -256,7 +256,35 @@ async function exportAchievementDetail(ctx, dataList) { } } } + +/** + * 查询合同明细表数据 + * @param {*} ctx ctx ctx.query:{keywordTarget-关键字项、keyword-关键字内容、limit-页宽, page-页码} + */ +async function getContractDetail(ctx) { + try { + const { models } = ctx.fs.dc; + const { keywordTarget, keyword, limit, page } = ctx.query; + const where = {}; + if (keywordTarget && keyword) { + where[keywordTarget] = { $iLike: `%${keyword}%` }; + } + let contractDetail = await models.ContractDetail.findAndCountAll({ + where: where, + offset: Number(page) * Number(limit), + limit: Number(limit), + order: [['id', 'DESC']] + }); + ctx.status = 200 + ctx.body = contractDetail; + } catch (error) { + ctx.fs.logger.error(`path:${ctx.path},error:${error}`) + ctx.status = 400; + ctx.body = { name: 'FindError', message: '查询合同明细表数据失败' } + } +} module.exports = { getReceivedDetail,//回款 getAchievementDetail,//业绩 + getContractDetail, } \ No newline at end of file diff --git a/api/app/lib/routes/report/index.js b/api/app/lib/routes/report/index.js index 9ad3518..b986cd6 100644 --- a/api/app/lib/routes/report/index.js +++ b/api/app/lib/routes/report/index.js @@ -15,4 +15,7 @@ module.exports = function (app, router, opts) { app.fs.api.logAttr['GET/detail/achievement'] = { content: '查询业绩明细表', visible: false }; router.get('/detail/achievement', achieve.getAchievementDetail); + + app.fs.api.logAttr['GET/contract/detail'] = { content: '查询合同明细表', visible: false }; + router.get('/contract/detail', achieve.getContractDetail); }; \ No newline at end of file diff --git a/web/client/src/sections/business/actions/achievement-report.js b/web/client/src/sections/business/actions/achievement-report.js index 9f06b51..b7d5e94 100644 --- a/web/client/src/sections/business/actions/achievement-report.js +++ b/web/client/src/sections/business/actions/achievement-report.js @@ -26,4 +26,17 @@ export function getAchievementDetail(query) { msg: { option: "查询业绩明细表" }, reducer: { name: "AchievementDetail", params: { noClear: true } }, }); +} + +//查询合同明细表 +export function getContractDetail(query) { + return (dispatch) => basicAction({ + type: "get", + dispatch: dispatch, + actionType: "GET_CONTRACT_DETAIL", + query: query, + url: `${ApiTable.getContractDetail}`, + msg: { option: "查询合同明细表" }, + reducer: { name: "ContractDetail", params: { noClear: true } }, + }); } \ No newline at end of file diff --git a/web/client/src/sections/business/containers/performanceReport/contractDetails.jsx b/web/client/src/sections/business/containers/performanceReport/contractDetails.jsx index b2cb4f0..b7a379b 100644 --- a/web/client/src/sections/business/containers/performanceReport/contractDetails.jsx +++ b/web/client/src/sections/business/containers/performanceReport/contractDetails.jsx @@ -1,6 +1,6 @@ import React, { useEffect, useState, useRef, useMemo } from 'react'; import { connect } from 'react-redux'; -import { Select, Input, Button, Table, Pagination, Skeleton } from '@douyinfe/semi-ui'; +import { Select, Input, Button, Table, Pagination, Skeleton, Toast, } from '@douyinfe/semi-ui'; import { SkeletonScreen, Setup } from "$components"; import { IconSearch } from '@douyinfe/semi-icons'; import ImportContractDetailsModal from './importContractDetailsModal'; @@ -10,7 +10,7 @@ import moment from 'moment' const ContractDetails = (props) => { const { dispatch, actions } = props - const { } = actions; + const { businessManagement } = actions; const [keywordTarget, setKeywordTarget] = useState('contractNo'); const [keyword, setKeyword] = useState('');//搜索内容 const [limits, setLimits] = useState()//每页实际条数 @@ -20,6 +20,10 @@ const ContractDetails = (props) => { const [setup, setSetup] = useState(false);//表格设置是否显现 const [setupp, setSetupp] = useState([]);//实际显示的表格列表 + + const [exportUrl, setExportUrl] = useState(''); + const page = useRef(query.page); + const CONTRACTDETAILS = "contractDetails"; const renderColumns = (columnKeys) => { let columns = []; @@ -52,6 +56,7 @@ const ContractDetails = (props) => { ) : ""; attribute(); + getContractDetailData(); }, []); //获取表格属性设置 function attribute() { @@ -66,9 +71,16 @@ const ContractDetails = (props) => { } setSetupp(newColumns); } - useEffect(() => { - }, [query]) + function getContractDetailData(param) { + let queryParam = param || query; + dispatch(businessManagement.getContractDetail({ keywordTarget, keyword, ...queryParam })).then(r => { + if (r.success) { + setTableData(r.payload?.data?.rows); + setLimits(r.payload?.data?.count); + } + }) + } function handleRow(record, index) {// 给偶数行设置斑马纹 if (index % 2 === 0) { return { @@ -80,6 +92,22 @@ const ContractDetails = (props) => { return {}; } } + + const exportAllData = () => { + dispatch(businessManagement.getContractDetail({ limit: 1, page: 0 })).then((res) => { + if (res.success) { + if (res.payload.data.count) { + let url = `export/contract/detail?token=${user.token}×tamp=${moment().valueOf()}` + setExportUrl(url); + } else { + Toast.info({ + content: '暂无可导出的数据', + duration: 3, + }) + } + } + }) + } const scroll = useMemo(() => ({}), []); return ( <> @@ -121,6 +149,7 @@ const ContractDetails = (props) => {
@@ -131,7 +160,9 @@ const ContractDetails = (props) => { onClick={() => { setImportModalV(true); }}> 导入
-
+
{ + exportAllData() + }}> 导出全部
@@ -172,7 +203,8 @@ const ContractDetails = (props) => { pageSizeOpts={[10, 20, 30, 40]} onChange={(currentPage, pageSize) => { setQuery({ limit: pageSize, page: currentPage - 1 }); - page.current = currentPage - 1 + getContractDetailData({ limit: pageSize, page: currentPage - 1 }); + page.current = currentPage - 1; }} /> @@ -186,6 +218,9 @@ const ContractDetails = (props) => { setImportModalV(false); }} /> : '' } + { + exportUrl ?