Ver Fonte

进度-end

zhuangyunsheng há 1 ano atrás
pai
commit
1c92ce6465

+ 8 - 8
src/api/folder.js

@@ -41,16 +41,16 @@ export default {
         })
     },
 
-    download: function (url) { // url: string
+    download: function (url, isTxt = false) { // url: string, isTxt: txt解码
         return axios({
             url,
             method: "get",
             responseType: "blob",
-            // transformResponse: [, transformResponse: txt解码
-            //     async function (data) {
-            //         return await transformData(data);
-            //     }
-            // ]
+            transformResponse: isTxt && [
+                async function (data) {
+                    return await transformData(data);
+                }
+            ] || []
         })
     },
 
@@ -66,8 +66,8 @@ export default {
 }
 
 function transformData(data) {
-    return new Promise(resolve=>{
-        let reader = new FileReader();
+    return new Promise(resolve => {
+        const reader = new FileReader();
         reader.readAsText(data, "GBK");
         reader.onload = () => resolve(reader.result);
     });

+ 40 - 45
src/components/Upload/fileViewer.vue

@@ -24,23 +24,25 @@
 </template>
 
 <script>
-import { defineAsyncComponent } from "vue";
 import Folder from "@/api/folder";
+import { fileTypes, officeOptions } from "./main";
+
+import { defineAsyncComponent } from "vue";
 import vue_office_docx from "@vue-office/docx";
 import vue_office_excel from "@vue-office/excel";
 import vue_office_pdf from "@vue-office/pdf";
+import vue_office_txt from "@/components/Upload/txtViewer.vue";
 
 import "@vue-office/docx/lib/index.css";
 import "@vue-office/excel/lib/index.css";
 
-import { fileTypes, officeOptions } from "./main";
-
 export default {
     emits: ["closed"],
     components: {
         vue_office_docx,
         vue_office_excel,
         vue_office_pdf,
+        vue_office_txt,
         yhImageViewer: defineAsyncComponent(() => import("@/components/Upload/imageViewer.vue"))
     },
 
@@ -63,18 +65,10 @@ export default {
             this.filePath = uploadFile.path;
             this.fileType = fileTypes[uploadFile["fileType"]] || uploadFile["fileType"];
             if (!fileTypes[uploadFile["fileType"]]) {
-                ElMessage.warning("当前只支持预览.docx、.pdf、excel文件,文件已下载");
+                ElMessage.warning("当前只支持预览.txt、.docx、.pdf、.xlsx(.xls)文件,文件已下载");
                 this.downloadFile();
             } else {
                 if (this.fileType == "image") this.showViewer = true;
-                else if (this.fileType == "txt") {
-                this.downloadFile();
-        //             Folder.download(this.filePath, this.fileType).then(res => {
-        //                 res.data.then(txt=>{
-        //                     console.log(txt)
-        // })
-            // });
-                }
                 else {
                     this.loading = true;
                     this.visible = true;
@@ -88,7 +82,7 @@ export default {
             Folder.download(this.filePath).then(res => {
                 const a = document.createElement("a");
                 const blob = new Blob([res.data], { type: this.fileType });
-                // a.download = this.fileName;
+                a.download = this.fileName;
                 a.href = URL.createObjectURL(blob);
                 a.click();
             });
@@ -99,49 +93,50 @@ export default {
 
 <style lang="scss" scoped>
 .yh-file-viewer {
---el-overlay-color-lighter: gray;
-:deep(.el-dialog) {
-  --el-dialog-bg-color: transparent;
-  padding: 0;
-
-  .el-dialog__header {
+  --el-overlay-color-lighter: gray;
+  :deep(.el-dialog) {
+    --el-dialog-bg-color: transparent;
     padding: 0;
-  }
 
-  .el-dialog__body {
-    height: 100%;
-    padding: 0;
+    .el-dialog__header {
+      padding: 0;
+    }
+
+    .el-dialog__body {
+      height: 100%;
+      padding: 0;
 
-    .yh-file-viewer__header {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      padding: var(--el-dialog-padding-primary);
-      background: #fff;
+      .yh-file-viewer__header {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        padding: var(--el-dialog-padding-primary);
+        background: #fff;
 
-      .yh-file-viewer__title {
-        line-height: var(--el-dialog-font-line-height);
-        font-size: var(--el-dialog-title-font-size);
-        color: var(--el-text-color-primary);
+        .yh-file-viewer__title {
+          line-height: var(--el-dialog-font-line-height);
+          font-size: var(--el-dialog-title-font-size);
+          color: var(--el-text-color-primary);
 
-        button {
-          margin-left: var(--el-dialog-padding-primary);
+          button {
+            margin-left: var(--el-dialog-padding-primary);
 
-          svg {
-            margin-right: 6px;
+            svg {
+              margin-right: 6px;
+            }
           }
         }
-      }
 
-      .el-button.is-link:hover {
-        color: var(--el-color-primary);
+        .el-button.is-link:hover {
+          color: var(--el-color-primary);
+        }
       }
-    }
 
-    .yh-file-viewer__content {
-      height: calc(100% - 64px - 2 * var(--el-dialog-padding-primary));
-      padding: var(--el-dialog-padding-primary);
+      .yh-file-viewer__content {
+        height: calc(100% - 64px - 2 * var(--el-dialog-padding-primary));
+        padding: var(--el-dialog-padding-primary);
+      }
     }
   }
-}}
+}
 </style>

+ 2 - 2
src/components/Upload/main.js

@@ -21,8 +21,8 @@ export const officeOptions = {
     },
     pdf: {
         // width: 500, //number,可不传,用来控制pdf预览的宽度,默认根据文档实际宽度计算
-        // httpHeaders: {}, //object, Basic authentication headers
-        // password: '' //string, 加密pdf的密码
+        httpHeaders: {}, //object, Basic authentication headers
+        password: "" //string, 加密pdf的密码
     },
     docx: {
         className: "docx", //class name/prefix for default and document style classes

+ 51 - 0
src/components/Upload/txtViewer.vue

@@ -0,0 +1,51 @@
+<template>
+    <div class="vue-office-txt">
+        <div class="txt-wrapper">{{ textValue }}</div>
+    </div>
+</template>
+
+<script>
+import Folder from "@/api/folder";
+
+export default {
+    emits: ["closed"],
+
+    props: {
+        src: { type: String, default: "" },
+    },
+
+    data() {
+        return {
+            textValue: null
+        }
+    },
+
+    mounted() {
+        this.txtDecode();
+    },
+
+    methods: {
+        txtDecode() {
+            Folder.download(this.src, true).then(res => {
+                res.data.then(txt => {
+                    this.textValue = txt;
+                    this.$emit("rendered");
+                }).catch(() => this.$emit("error"));
+            }).catch(() => this.$emit("error"));
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.vue-office-txt {
+  background: gray;
+  padding: 0 20px 16px;
+
+  .txt-wrapper {
+    padding: 30px;
+    background: #fff;
+    white-space: pre-wrap;
+  }
+}
+</style>

+ 13 - 6
src/views/progress/component/share.vue

@@ -34,6 +34,7 @@
                     <el-table-column :label="item.label" :prop="item.props" :min-width="item.width || 180" show-overflow-tooltip>
                         <template #default="scope">
                             <el-tag v-if="item.props == 'ytbDate' && !columnFormat(scope.row, item.props)" type="info">未设置</el-tag>
+                            <el-tag v-else-if="item.props == 'isReport'" :type="tagType(columnFormat(scope.row, item.props))">{{ columnFormat(scope.row, item.props) }}</el-tag>
                             <el-button v-else-if="item.props == 'count'" type="primary" link @click.stop="table_detail(scope.row)">{{ columnFormat(scope.row, item.props) }}</el-button>
                             <template v-else>{{ columnFormat(scope.row, item.props) }}</template>
                         </template>
@@ -46,13 +47,13 @@
         </div>
     </el-card>
 
-    <policy-detail v-if="dialog" ref="policyDetail" @closed="dialog = false"></policy-detail>
+    <policy-detail v-if="dialog" ref="policyDetail" :createMonth="createMonth" @closed="dialog = false"></policy-detail>
 </template>
 
 <script>
 import moment from "moment";
 import API from "@/api/policy/progress";
-import { dept_columns as columns, deptTypeDic } from "@/views/progress/main";
+import { dept_columns as columns } from "@/views/progress/main";
 
 import yhPagination from "@/components/Pagination/index.vue";
 import policyDetail from "@/views/progress/dialog.vue";
@@ -65,7 +66,7 @@ export default {
 
     data() {
         return {
-            columns, deptTypeDic,
+            columns,
             loading: false,
             createMonth: moment().format("YYYY-MM"),
             createTime: [moment().startOf("month").format("YYYY-MM-DD"), moment().endOf("month").format("YYYY-MM-DD")],
@@ -91,9 +92,13 @@ export default {
             return moment(date).valueOf() > moment(this.createMonth).endOf("month").valueOf() || moment(date).valueOf() < moment(this.createMonth).startOf("month").valueOf()
         },
 
+        tagType(value) {
+            return value == "否" && "danger" || "primary";
+        },
+
         columnFormat(row, props) {
             if (props == "ytbDate") return row[props] && (this.createMonth + "-" + row[props]) || "";
-            if (props == "deptType") return deptTypeDic[row[props]] || "";
+            if (props == "isReport") return row.count > 0 && "是" || "否";
             return row[props];
         },
 
@@ -114,8 +119,10 @@ export default {
         },
 
         table_detail(row) {
-            this.dialog = true;
-            nextTick(() => this.$refs.policyDetail.open().setData(row));
+            if (row.count > 0) {
+                this.dialog = true;
+                nextTick(() => this.$refs.policyDetail.open().setData(row));
+            }
         }
     }
 }

+ 3 - 3
src/views/progress/component/strive.vue

@@ -74,8 +74,8 @@
 import moment from "moment";
 import API from "@/api/policy/progress";
 import { getMainList } from "@/api/system/depart";
-import { strive_columns as columns } from "@/views/progress/main";
 import { exportExcel } from "@/utils/exportExcel";
+import { strive_columns as columns } from "@/views/progress/main";
 
 import yhPagination from "@/components/Pagination/index.vue";
 import policyExplain from "@/views/policyStrive/explain.vue";
@@ -137,8 +137,8 @@ export default {
             if (props == "isReport") return row.isLand == 1 && row.sjFinishTime && "是" || "否";
             if (props == "isDelay") {
                 if (!row.ytbDate) return "否";
-                if (row.isLand == 1 && row.sjFinishTime) return moment(row.ytbDate).diff(row.sjFinishTime) < 0 && "是" || "否";
-                else return moment().diff(row.ytbDate) > 0 && "是" || "否";
+                if (row.isLand == 1 && row.sjFinishTime) return moment(this.createMonth + "-" + row.ytbDate).endOf("day").diff(row.sjFinishTime) < 0 && "是" || "否";
+                else return moment().diff(moment(this.createMonth + "-" + row.ytbDate).endOf("day")) > 0 && "是" || "否";
             }
 
             return row[props];

+ 48 - 59
src/views/progress/dialog.vue

@@ -1,32 +1,6 @@
 <template>
-    <el-dialog v-model="visible" title="政策关联" width="80%" @closed="$emit('closed')">
+    <el-dialog v-model="visible" title="政策分享" width="80%" @closed="$emit('closed')">
         <el-card class="tjm_card_style_custom">
-            <div class="tjm_card_select">
-                <el-scrollbar>
-                    <el-form class="tjm_card_select_left" :model="params" label-width="80px" label-position="left">
-                        <el-row :gutter="15">
-                            <!-- <el-col :lg="8" :md="12" :xs="24">
-                                <el-form-item label="填报人">
-                                    <el-input v-model="params.createName" clearable placeholder="请输入填报人"></el-input>
-                                </el-form-item>
-                            </el-col> -->
-                            <el-col :lg="12" :md="16" :xs="24" class="query-date-col">
-                                <el-form-item label="填报日期">
-                                    <el-date-picker v-model="createMonth" type="month" :clearable="false" value-format="YYYY-MM" placeholder="请选择填报月份" @change="monthChange"></el-date-picker>
-                                    <el-date-picker v-model="createTime" type="daterange" :disabled-date="disabledDate" :clearable="false" value-format="YYYY-MM-DD" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
-                                </el-form-item>
-                            </el-col>
-                        </el-row>            
-                    </el-form>
-
-                    <div class="tjm_card_select_right">
-                        <el-button type="primary" icon="search" @click="reloadTable">搜索</el-button>
-                        <el-button icon="refresh-right" @click="reset">重置</el-button>
-                    </div>
-                </el-scrollbar>
-            </div>
-            <el-divider></el-divider>
-
             <div class="tjm_card_tools">
                 <div class="tjm_card_tools_right">
                     <el-button icon="download" @click="table_export">导出</el-button>
@@ -40,7 +14,7 @@
                         <el-table-column :label="item.label" :prop="item.props" :min-width="item.width || 180" show-overflow-tooltip>
                             <template #default="scope">
                                 <el-tag v-if="item.props == 'ytbDate' && !columnFormat(scope.row, item.props)" type="info">未设置</el-tag>
-                                <el-tag v-else-if="item.props == 'isReport' || item.props == 'isDelay'" :type="tagType(columnFormat(scope.row, item.props))">{{ columnFormat(scope.row, item.props) }}</el-tag>
+                                <el-tag v-else-if="item.props == 'isDelay'" :type="tagType(columnFormat(scope.row, item.props))">{{ columnFormat(scope.row, item.props) }}</el-tag>
                                 <template v-else>{{ columnFormat(scope.row, item.props) }}</template>
                             </template>
                         </el-table-column>
@@ -52,51 +26,78 @@
                     </el-table-column> -->
                 </el-table>
             </div>
-            <div class="tjm_card_pagination">
-                <yh-pagination v-model:pageNo="params.page" v-model:pageSize="params.size" :total="total" @paginationChange="reloadTable"></yh-pagination>
-            </div>
         </el-card>
     </el-dialog>
 
-    <!-- <policy-explain v-if="dialog" ref="policyExplain" @closed="dialog = false"></policy-explain> -->
+    <policy-detail v-if="dialog" ref="policyDetail" @closed="dialog = false"></policy-detail>
 </template>
 
 <script>
 import moment from "moment";
-import API from "@/api/policy/progress";
+import { exportExcel } from "@/utils/exportExcel";
 import { share_columns as columns } from "@/views/progress/main";
+import policyDetail from "@/views/manage/policyShare/dialog.vue";
 
 export default {
     emits: ["closed"],
+    components: {
+        policyDetail
+    },
+
+    props: {
+        createMonth: { type: String, default: moment().format("YYYY-MM") }
+    },
     
     data() {
         return {
-            columns,
-
             visible: false,
-            loading: false,
-            createMonth: moment().format("YYYY-MM"),
-            createTime: [moment().startOf("month").format("YYYY-MM-DD"), moment().endOf("month").format("YYYY-MM-DD")],
-            params: {
-                page: 1,
-                size: 10
-            },
-
-            total: 0,
+
+            columns,
             tableData: [],
-            
+
             dialog: false
         }
     },
 
     methods: {
+        tagType(value) {
+            return value == "否" && "danger" || "primary";
+        },
+
+        columnFormat(row, props) {
+            if (props == "ytbDate") return row[props] && (this.createMonth + "-" + row[props]) || "";
+            if (props == "isDelay") {
+                if (!row.ytbDate) return "否";
+                return moment(this.createMonth + "-" + row.ytbDate).endOf("day").diff(row.createTime) < 0 && "是" || "否";
+            }
+
+            return row[props];
+        },
+
         open() {
             this.visible = true;
             return this;
         },
 
         setData(row) {
-            console.log(row)
+            this.tableData = row.shareList.map(item => {
+                item.deptCode = row.code;
+                item.ytbDate = row.ytbDate;
+                return item;
+            });
+        },
+
+        table_export() {
+            const header = columns.map(c => c.label);
+            const data = this.tableData.map(v => columns.map(c => c.props).map(j => this.columnFormat(v, j)));
+            const merges = [{ s: { r: 1, c: 0 }, e: { r: this.tableData.length, c: 0 } }];
+
+            exportExcel(header, data, merges, `${this.$route.name}.xlsx`);
+        },
+
+        table_detail(row) {
+            this.dialog = true;
+            nextTick(() => this.$refs.policyDetail.open("detail").setData(row.id));
         }
     }
 }
@@ -106,21 +107,9 @@ export default {
 .tjm_card_style_custom {
   border: none;
   box-shadow: 0 0;
-  margin-top: 0;
 
   :deep(.el-card__body) {
-    padding-top: 10px;
-
-    .query-date-col {
-      .el-date-editor.el-date-editor--month {
-        max-width: 110px;
-      }
-
-      .el-date-editor.el-date-editor--month + .el-date-editor {
-        flex: 1;
-        margin-left: 10px;
-      }
-    }
+    padding: 0;
 
     .tjm_card_tools {
       justify-content: flex-end;

+ 1 - 3
src/views/progress/main.js

@@ -3,12 +3,11 @@ export const progressTab = {
     policy_strive: "政策争取"
 }
 
-export const deptTypeDic = ["部门", "单位"];
 export const dept_columns = [
     { label: "部门名称", props: "name" },
     { label: "部门代码", props: "code", width: "120" },
-    { label: "类型", props: "deptType", width: "100" },
     { label: "应填报日期", props: "ytbDate", width: "120" },
+    { label: "是否上报", props: "isReport", width: "100" },
     { label: "政策数量", props: "count", width: "100" }
 ]
 
@@ -17,7 +16,6 @@ export const share_columns = [
     { label: "填报部门", props: "deptName" },
     { label: "填报人", props: "createName" },
     { label: "应填报日期", props: "ytbDate", width: "120" },
-    { label: "是否上报", props: "isReport", width: "100" },
     { label: "是否迟报", props: "isDelay", width: "100" }
 ]