Просмотр исходного кода

Merge branch 'develop' of http://120.55.44.4:10080/xujunjie/GtDigManageWeb into develop

ZhaoJun 1 год назад
Родитель
Сommit
935c3ec4ef

Разница между файлами не показана из-за своего большого размера
+ 0 - 355
public/Luckysheet/css/luckysheet.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 45839
public/Luckysheet/luckysheet.umd.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
public/Luckysheet/luckysheet.umd.js.map


Разница между файлами не показана из-за своего большого размера
+ 0 - 10
public/Luckysheet/plugins/css/pluginsCss.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 1
public/Luckysheet/plugins/js/plugin.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
public/Luckysheet/plugins/plugins.css


+ 2 - 2
src/pages/PSRManage/components/compareModal.js

@@ -27,9 +27,9 @@ const CompareModal = ({ list, open, onOk, onCancel }) => {
         }}
       >
         <Space direction="vertical">
-          {list?.map((item) => {
+          {list?.map((item, idx) => {
             return (
-              <Checkbox value={item.id}>
+              <Checkbox value={item.id} key={idx}>
                 {dayjs(item.day).format('YYYY-MM')}
               </Checkbox>
             );

+ 13 - 6
src/pages/PSRManage/components/saveOtherModal.js

@@ -2,7 +2,7 @@ import { DatePicker, Modal, Radio } from 'antd';
 import dayjs from 'dayjs';
 
 import { useState } from 'react';
-const SaveModal = ({ loading, open, onCancel, onOk }) => {
+const SaveModal = ({ loading, open, showType, onCancel, onOk }) => {
   const [day, setDay] = useState('1970-01-31');
   const [tab, setTab] = useState(1);
 
@@ -18,11 +18,18 @@ const SaveModal = ({ loading, open, onCancel, onOk }) => {
       onCancel={onCancel}
       onOk={() => onOk(tab == 1 ? { day } : { day, ver_type: 2 })}
     >
-      <span>类型:</span>
-      <Radio.Group onChange={(e) => setTab(e.target.value)} defaultValue={tab}>
-        <Radio.Button value={1}>月版本</Radio.Button>
-        <Radio.Button value={2}>基础版本</Radio.Button>
-      </Radio.Group>
+      {showType && (
+        <>
+          <span>类型:</span>
+          <Radio.Group
+            onChange={(e) => setTab(e.target.value)}
+            defaultValue={tab}
+          >
+            <Radio.Button value={1}>月版本</Radio.Button>
+            <Radio.Button value={2}>基础版本</Radio.Button>
+          </Radio.Group>
+        </>
+      )}
       {tab == '1' && (
         <div style={{ marginTop: '20px' }}>
           <span>月份:</span>

+ 145 - 38
src/pages/PSRManage/detail.js

@@ -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}

+ 1 - 1
src/pages/PSRManage/index.js

@@ -25,7 +25,7 @@ const PSRManage = () => {
       setSearchData({ ...searchData, current_page: 1, page_size });
     },
   });
-  console.log(data?.list);
+  // console.log(data?.list);
   const columns = [
     {
       title: '项目编号',

+ 13 - 8
src/pages/PSRManage/index.less

@@ -1,35 +1,40 @@
-.searchContent{
+.searchContent {
   display: flex;
   align-items: center;
   margin-bottom: 40px;
   width: calc(100% - 55px);
-  .itemFlex{
+  .itemFlex {
     display: flex;
     align-items: center;
     margin-right: 30px;
   }
-  .searchBtnSty{
+  .searchBtnSty {
     margin-right: 20px;
   }
 }
-.titleDev{
+.titleDev {
   display: flex;
   align-items: center;
   margin-bottom: 20px;
-  .title{
+  .title {
     margin-left: 30px;
     font-size: 22px;
   }
 }
-.excelTitle{
+.excelTitle {
   display: flex;
   align-items: center;
   margin-bottom: 20px;
   justify-content: space-between;
 }
-.exportDiv{
+.exportDiv {
   display: flex;
   flex-direction: row-reverse;
   margin-bottom: 20px;
 }
-
+.noData {
+  width: 100%;
+  height: 80vh;
+  text-align: center;
+  line-height: 60vh;
+}

+ 25 - 0
src/utils/exportExcl.js

@@ -17,8 +17,10 @@ export function getExcelBolob(luckysheet) {
     const worksheet = workbook.addWorksheet(table.name);
     const merge = (table.config && table.config.merge) || {};
     const borderInfo = (table.config && table.config.borderInfo) || {};
+    const columnlen = (table.config && table.config.columnlen) || {};
     // 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值
     setStyleAndValue(table.data, worksheet);
+    setColumnlen(columnlen, worksheet);
     setMerge(merge, worksheet);
     setBorder(borderInfo, worksheet);
     return true;
@@ -34,6 +36,14 @@ export function getExcelBolob(luckysheet) {
 }
 
 export function exportExcel(luckysheet, value) {
+  //处理时间错乱问题,把v全部换成m显示值
+  luckysheet.forEach((sheetData) => {
+    sheetData?.celldata.forEach((cell) => {
+      if (cell?.v) {
+        cell.v.v = cell.v.m;
+      }
+    });
+  });
   // return
   // 4.写入 buffer
   getExcelBolob(luckysheet).then((blob) => {
@@ -141,6 +151,21 @@ var setStyleAndValue = function (cellArr, worksheet) {
   });
 };
 
+//设置导出的列宽
+var setColumnlen = function (luckyColumnlen, worksheet) {
+  const columnlen = Object.values(luckyColumnlen);
+  const result = columnlen.map(function (elem, idx) {
+    // elem格式:{r: 0, c: 0, rs: 1, cs: 2}
+    // 按开始行,开始列,结束行,结束列合并(相当于 K10:M12)
+    return {
+      header: idx,
+      key: idx,
+      width: elem / 10,
+    };
+  });
+  worksheet.columns = result;
+};
+
 var fillConvert = function (bg) {
   if (!bg) {
     return {};

Некоторые файлы не были показаны из-за большого количества измененных файлов