|
@@ -233,6 +233,8 @@ const PSRDetail = () => {
|
|
|
const [compareOpen, setCompareOpen] = useState(false);
|
|
|
const [compareValues, setCompareValues] = useState([]);
|
|
|
const [isOriginVer, setIsOriginVer] = useState(false); //是否原始版本 是的话只能另存不能编辑
|
|
|
+ const [noData, setNoData] = useState(false); //是否展示导出按钮
|
|
|
+ const titleRef = useRef('');
|
|
|
|
|
|
const luckysheetRef = useRef();
|
|
|
const iframeRef = useRef();
|
|
@@ -310,14 +312,13 @@ const PSRDetail = () => {
|
|
|
},
|
|
|
);
|
|
|
|
|
|
- //保存/另存为月度psr和现金流接口
|
|
|
+ //保存月度psr和现金流接口
|
|
|
const { run: runSave, loading: saveLoading } = useRequest(
|
|
|
(data) => querySavePsrMonth(data),
|
|
|
{
|
|
|
manual: true,
|
|
|
onSuccess: () => {
|
|
|
message.success('保存成功');
|
|
|
- if (open) setOpen(false);
|
|
|
},
|
|
|
onError: () => {
|
|
|
message.success('添加失败');
|
|
@@ -325,6 +326,23 @@ const PSRDetail = () => {
|
|
|
},
|
|
|
);
|
|
|
|
|
|
+ //另存为月度psr和现金流接口
|
|
|
+ const { run: runSaveOther, loading: saveOtherLoading } = useRequest(
|
|
|
+ (data) => querySavePsrMonth(data),
|
|
|
+ {
|
|
|
+ manual: true,
|
|
|
+ onSuccess: () => {
|
|
|
+ message.success('另存成功');
|
|
|
+ if (open) setOpen(false);
|
|
|
+ //另存成功之后切换到最新的记录
|
|
|
+ initPsrActrual(key);
|
|
|
+ },
|
|
|
+ onError: () => {
|
|
|
+ message.success('另存失败');
|
|
|
+ },
|
|
|
+ },
|
|
|
+ );
|
|
|
+
|
|
|
//请求月度psr和现金流详情接口
|
|
|
const { run: runDetail } = useRequest((data) => queryPsrMonthDetail(data), {
|
|
|
manual: true,
|
|
@@ -337,11 +355,29 @@ const PSRDetail = () => {
|
|
|
setExcelData({ ...data, name });
|
|
|
setHistoryOpen(false);
|
|
|
const jsonData = JSON.parse(data.json_data);
|
|
|
- if (jsonData[0].celldata && typeof jsonData[0].celldata == 'string')
|
|
|
- jsonData[0].celldata = JSON.parse(jsonData[0].celldata);
|
|
|
- if (jsonData[0].config && typeof jsonData[0].config == 'string')
|
|
|
- jsonData[0].config = JSON.parse(jsonData[0].config);
|
|
|
+ console.log(jsonData);
|
|
|
+
|
|
|
+ // if (Array.isArray(data)) {
|
|
|
+ jsonData.map((item) => {
|
|
|
+ if (item.celldata && typeof item.celldata == 'string')
|
|
|
+ item.celldata = JSON.parse(item.celldata);
|
|
|
+ if (item.config && typeof item.config == 'string')
|
|
|
+ item.config = JSON.parse(item.config);
|
|
|
+ });
|
|
|
+ // } else {
|
|
|
+ // if (data.celldata) data.celldata = JSON.parse(data.celldata);
|
|
|
+ // if (data.config) data.config = JSON.parse(data.config);
|
|
|
+ // }
|
|
|
renderSheet(jsonData, data.is_edit);
|
|
|
+
|
|
|
+ // if (jsonData[0].celldata && typeof jsonData[0].celldata == 'string')
|
|
|
+ // jsonData[0].celldata = JSON.parse(jsonData[0].celldata);
|
|
|
+ // if (jsonData[0].config && typeof jsonData[0].config == 'string')
|
|
|
+ // jsonData[0].config = JSON.parse(jsonData[0].config);
|
|
|
+ // renderSheet(jsonData, data.is_edit);
|
|
|
+ } else {
|
|
|
+ setExcelData({ name: '' });
|
|
|
+ setNoData(true);
|
|
|
}
|
|
|
},
|
|
|
});
|
|
@@ -382,6 +418,19 @@ const PSRDetail = () => {
|
|
|
}, [key]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
+ let str = '';
|
|
|
+ switch (key) {
|
|
|
+ case '2':
|
|
|
+ str = '签字版PSR_';
|
|
|
+ break;
|
|
|
+ case '3':
|
|
|
+ str = '过程/终版PSR_';
|
|
|
+ break;
|
|
|
+ case '4':
|
|
|
+ str = '现金流_';
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ titleRef.current = str;
|
|
|
setCompareValues([]);
|
|
|
if (key) {
|
|
|
onChange(key);
|
|
@@ -415,12 +464,14 @@ const PSRDetail = () => {
|
|
|
initPsrActrual(key);
|
|
|
}
|
|
|
};
|
|
|
- //请求前两个tab的数据
|
|
|
+ //请求 过程/终版PSR 现金流的数据
|
|
|
const initPsrActrual = async (key) => {
|
|
|
const data_type = key == '3' ? 1 : 2;
|
|
|
const res = await queryPsrMonthLast({ project_id: projectId, data_type });
|
|
|
if (res.data?.length > 0 && res.data[0].json_data) {
|
|
|
- let name = dayjs(res.data[0].day).format('YYYY-MM');
|
|
|
+ let name = `${titleRef.current}${dayjs(res.data[0].day).format(
|
|
|
+ 'YYYY-MM',
|
|
|
+ )}`;
|
|
|
if (res.data[0].ver_type == 1) name = '原始版本';
|
|
|
if (res.data[0].ver_type == 2) name = '基础版本';
|
|
|
|
|
@@ -428,30 +479,44 @@ const PSRDetail = () => {
|
|
|
setIsOriginVer(isOrigin);
|
|
|
setExcelData({ ...res.data[0], name });
|
|
|
const data = JSON.parse(res.data[0].json_data);
|
|
|
- if (data.celldata) data.celldata = JSON.parse(data.celldata);
|
|
|
- if (data.config) data.config = JSON.parse(data.config);
|
|
|
- renderSheet(
|
|
|
- Array.isArray(data) ? data : [data],
|
|
|
- isOrigin ? 0 : res.data[0].is_edit,
|
|
|
- );
|
|
|
+ const canEdit = isOrigin ? 0 : res.data[0].is_edit;
|
|
|
+ if (Array.isArray(data)) {
|
|
|
+ data.map((item) => {
|
|
|
+ if (item.celldata && typeof item.celldata == 'string')
|
|
|
+ item.celldata = JSON.parse(item.celldata);
|
|
|
+ if (item.config && typeof item.config == 'string')
|
|
|
+ item.config = JSON.parse(item.config);
|
|
|
+ });
|
|
|
+ renderSheet(data, canEdit);
|
|
|
+ } else {
|
|
|
+ if (data.celldata) data.celldata = JSON.parse(data.celldata);
|
|
|
+ if (data.config) data.config = JSON.parse(data.config);
|
|
|
+ renderSheet([data], canEdit);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ setIsOriginVer(false);
|
|
|
+ setExcelData({ name: '' });
|
|
|
+ setNoData(true);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
//另存为月版本
|
|
|
const handlerSaveOther = (data) => {
|
|
|
const luckyData = luckysheetRef.current?.toJson();
|
|
|
- luckyData?.data.forEach(item => delete item.data)
|
|
|
+ luckyData?.data.forEach((item) => delete item.data);
|
|
|
//设置表单日期
|
|
|
- const day =
|
|
|
+ const date =
|
|
|
data.ver_type == 2 //基础版本是创建当天的日期 月版本是创建月份的最后一天
|
|
|
? dayjs().format('YYYY-MM-DD')
|
|
|
: dayjs(data.day).endOf('month').format('YYYY-MM-DD');
|
|
|
+
|
|
|
+ const days = changeDate(date);
|
|
|
const celldata = luckyData?.data[0]?.celldata;
|
|
|
const rc = key == '3' ? { r: 1, c: 1 } : { r: 1, c: 3 }; //psr日期位置是1 1 现金流日期位置是 1 3
|
|
|
const dateItem = celldata?.find((item) => item.r == rc.r && item.c == rc.c);
|
|
|
if (dateItem) {
|
|
|
- dateItem.v.v = day;
|
|
|
- dateItem.v.m = day;
|
|
|
+ dateItem.v.v = days + '';
|
|
|
+ // dateItem.v.m = days;
|
|
|
}
|
|
|
|
|
|
if (luckyData?.data) {
|
|
@@ -461,7 +526,7 @@ const PSRDetail = () => {
|
|
|
json_data: JSON.stringify(luckyData.data),
|
|
|
data_type: data_type,
|
|
|
};
|
|
|
- runSave(params);
|
|
|
+ runSaveOther(params);
|
|
|
}
|
|
|
};
|
|
|
//保存
|
|
@@ -535,9 +600,9 @@ const PSRDetail = () => {
|
|
|
return preValues;
|
|
|
};
|
|
|
|
|
|
- const exportExcl = (title) => {
|
|
|
+ const exportExcl = (className) => {
|
|
|
const luckyData = luckysheetRef.current?.toJson();
|
|
|
- exportExcel(luckyData.data, title);
|
|
|
+ exportExcel(luckyData.data, className);
|
|
|
};
|
|
|
|
|
|
const handlerLoad = () => {
|
|
@@ -545,12 +610,18 @@ const PSRDetail = () => {
|
|
|
luckysheetRef.current = contentWindow.luckysheet;
|
|
|
};
|
|
|
const renderSheet = (currentData, is_edit = false) => {
|
|
|
+ if (!currentData || !currentData[0]?.celldata) {
|
|
|
+ setNoData(true);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ setNoData(false);
|
|
|
if (!luckysheetRef.current) {
|
|
|
setTimeout(() => {
|
|
|
renderSheet(currentData, is_edit);
|
|
|
}, 500);
|
|
|
return;
|
|
|
}
|
|
|
+ console.log('----------------------', currentData);
|
|
|
const data = currentData;
|
|
|
//设置单元格不可编辑
|
|
|
data?.forEach((item) => {
|
|
@@ -589,6 +660,9 @@ const PSRDetail = () => {
|
|
|
luckysheetRef.current.refreshFormula();
|
|
|
},
|
|
|
workbookCreateAfter: async () => {
|
|
|
+ setTimeout(() => {
|
|
|
+ luckysheetRef.current.refreshFormula();
|
|
|
+ }, 800);
|
|
|
//当前为为终版psr标签并且可编辑状态时填充人日数据
|
|
|
if (key == '3' && is_edit) {
|
|
|
fillWorkLoadData();
|
|
@@ -614,7 +688,7 @@ const PSRDetail = () => {
|
|
|
// item.config.authority = { sheet: true, hintText };
|
|
|
});
|
|
|
|
|
|
- console.log(option.data);
|
|
|
+ console.log(JSON.stringify(option));
|
|
|
//设置不可编辑
|
|
|
if (!is_edit) unableEdit(option);
|
|
|
|
|
@@ -629,7 +703,7 @@ const PSRDetail = () => {
|
|
|
param.e_time = dayjs('2023-07').endOf('month').format('YYYY-MM-DD');
|
|
|
const res = await queryPsrWorkLoad(param);
|
|
|
if (res?.data) {
|
|
|
- const data = { '02-010': [800, 100] };
|
|
|
+ const data = res?.data; //{ '02-010': [800, 100] };
|
|
|
Object.keys(data).forEach((code) => {
|
|
|
const list = data[code]; //第一个是当月的,第二个是累计的
|
|
|
const fill = workConfig.find((item) => item.code == code)?.fill;
|
|
@@ -642,7 +716,7 @@ const PSRDetail = () => {
|
|
|
// luckysheetRef.current.setCellValue(8, 8, res.data.Month);
|
|
|
}
|
|
|
};
|
|
|
- const renderTitle = (data_type, title) => {
|
|
|
+ const renderTitle = (data_type, name) => {
|
|
|
if (compareValues?.length == 2) {
|
|
|
return (
|
|
|
<div className={styles.exportDiv}>
|
|
@@ -664,7 +738,11 @@ const PSRDetail = () => {
|
|
|
//投标版psr
|
|
|
return (
|
|
|
<div className={styles.exportDiv}>
|
|
|
- <Button type="primary" onClick={() => exportExcl(title)}>
|
|
|
+ <Button
|
|
|
+ type="primary"
|
|
|
+ onClick={() => exportExcl(name)}
|
|
|
+ disabled={noData}
|
|
|
+ >
|
|
|
导出
|
|
|
</Button>
|
|
|
</div>
|
|
@@ -673,9 +751,9 @@ const PSRDetail = () => {
|
|
|
//签字版psr
|
|
|
return (
|
|
|
<div className={styles.excelTitle}>
|
|
|
- <div>
|
|
|
- 当前PSR表单:
|
|
|
- <span style={{ color: 'blue' }}>{excelData?.name}</span>
|
|
|
+ <div style={{ minWidth: '10px' }}>
|
|
|
+ {/* 当前PSR表单:
|
|
|
+ <span style={{ color: 'blue' }}>{excelData?.name}</span> */}
|
|
|
</div>
|
|
|
<Space>
|
|
|
<Button
|
|
@@ -684,10 +762,15 @@ const PSRDetail = () => {
|
|
|
run(init_flow_id);
|
|
|
setHistoryOpen(true);
|
|
|
}}
|
|
|
+ disabled={noData}
|
|
|
>
|
|
|
- {`${title}历史版本`}
|
|
|
+ 历史版本
|
|
|
</Button>
|
|
|
- <Button type="primary" onClick={() => exportExcl(title)}>
|
|
|
+ <Button
|
|
|
+ type="primary"
|
|
|
+ onClick={() => exportExcl(name)}
|
|
|
+ disabled={noData}
|
|
|
+ >
|
|
|
导出
|
|
|
</Button>
|
|
|
</Space>
|
|
@@ -697,7 +780,7 @@ const PSRDetail = () => {
|
|
|
return (
|
|
|
<div className={styles.excelTitle}>
|
|
|
<div>
|
|
|
- 当前PSR表单:
|
|
|
+ 当前{key == '4' ? '现金流' : 'PSR'}表单:
|
|
|
<span style={{ color: 'blue' }}>{excelData?.name}</span>
|
|
|
</div>
|
|
|
<Space>
|
|
@@ -707,8 +790,9 @@ const PSRDetail = () => {
|
|
|
runList();
|
|
|
setHistoryOpen(true);
|
|
|
}}
|
|
|
+ disabled={noData}
|
|
|
>
|
|
|
- {`${title}历史版本`}
|
|
|
+ 历史版本
|
|
|
</Button>
|
|
|
<Button
|
|
|
type="primary"
|
|
@@ -720,14 +804,23 @@ const PSRDetail = () => {
|
|
|
<Button
|
|
|
type="primary"
|
|
|
onClick={handlerSave}
|
|
|
+ loading={saveLoading}
|
|
|
disabled={!excelData?.is_edit || isOriginVer}
|
|
|
>
|
|
|
保存
|
|
|
</Button>
|
|
|
- <Button type="primary" onClick={() => setCompareOpen(true)}>
|
|
|
+ <Button
|
|
|
+ type="primary"
|
|
|
+ onClick={() => setCompareOpen(true)}
|
|
|
+ disabled={noData}
|
|
|
+ >
|
|
|
比对
|
|
|
</Button>
|
|
|
- <Button type="primary" onClick={() => exportExcl(title)}>
|
|
|
+ <Button
|
|
|
+ type="primary"
|
|
|
+ onClick={() => exportExcl(excelData?.name)}
|
|
|
+ disabled={noData}
|
|
|
+ >
|
|
|
导出
|
|
|
</Button>
|
|
|
</Space>
|
|
@@ -826,7 +919,16 @@ const PSRDetail = () => {
|
|
|
{/* <input type="file" onChange={handlerOnChange} /> */}
|
|
|
<span className={styles.title}>{project_name}</span>
|
|
|
</div>
|
|
|
- <Tabs defaultActiveKey="1" type="card" items={items} onChange={setKey} />
|
|
|
+ <Tabs
|
|
|
+ defaultActiveKey="1"
|
|
|
+ type="card"
|
|
|
+ items={items}
|
|
|
+ onChange={(key) => {
|
|
|
+ setKey(key);
|
|
|
+ titleRef.current = '';
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ {noData && <div className={styles.noData}>暂无数据</div>}
|
|
|
{compareValues?.length == 2 ? (
|
|
|
<CompareCom values={compareValues} />
|
|
|
) : (
|
|
@@ -834,13 +936,14 @@ const PSRDetail = () => {
|
|
|
style={{
|
|
|
width: '100%',
|
|
|
height: '80vh',
|
|
|
+ overflowX: 'hidden',
|
|
|
+ display: noData ? 'none' : 'block',
|
|
|
}}
|
|
|
ref={iframeRef}
|
|
|
onLoad={handlerLoad}
|
|
|
src="/luckysheet.html"
|
|
|
/>
|
|
|
)}
|
|
|
-
|
|
|
<Drawer
|
|
|
title="历史版本"
|
|
|
placement="right"
|
|
@@ -852,14 +955,18 @@ const PSRDetail = () => {
|
|
|
items={historyList?.map((item) => {
|
|
|
return {
|
|
|
children: (
|
|
|
- <a onClick={() => handlerDetailClick(item.id)}>{item.name}</a>
|
|
|
+ <a onClick={() => handlerDetailClick(item.id)}>
|
|
|
+ {titleRef.current}
|
|
|
+ {item.name}
|
|
|
+ </a>
|
|
|
),
|
|
|
};
|
|
|
})}
|
|
|
/>
|
|
|
</Drawer>
|
|
|
<SaveModal
|
|
|
- loading={saveLoading}
|
|
|
+ showType={key == '4'}
|
|
|
+ loading={saveOtherLoading}
|
|
|
open={open}
|
|
|
onCancel={() => setOpen(false)}
|
|
|
onOk={handlerSaveOther}
|