zhuangyunsheng 1 yıl önce
ebeveyn
işleme
2166a856dc

BIN
public/home-header.png


BIN
public/homeBg.png


+ 3 - 3
src/assets/style/elementPlusCustom.scss

@@ -10,13 +10,13 @@
 }
 
 .el-input-number {
-    width: 100%;
+    width: 100% !important;
   
     .el-input .el-input__wrapper {
-      padding: 1px 11px;
+      padding: 1px 11px !important;
   
       .el-input__inner {
-        text-align: unset;
+        text-align: unset !important;
       }
     }
   }

+ 1 - 3
src/store/permission.js

@@ -40,9 +40,7 @@ export const usePermissionStore = defineStore(
 )
 
 function filterAsyncRouter(asyncRouterMap, httpSave = true) {
-    const blackList = ["/system/dataList",
-        "/progress" // 进度
-    ]
+    const blackList = ["/system/dataList"]
     const hideList = ["/publicDomain",
         // "/workflow"
     ]

+ 1 - 1
src/utils/exportExcel.js

@@ -15,7 +15,7 @@ export const exportExcel = (header, data, merges, name) => {
     const colWidth = data.map(d => d.map(val => {
         let wch = 10;
         // 是否为中文
-        if (val) wch = val.toString().split("").map(str => str.charCodeAt() > 255 && 2 || 1).reduce((p, v) => p + v);
+        if (val) wch = val.toString().split("").map(str => str.charCodeAt() > 255 && 2 || 1).reduce((p, v) => p + v) + 2;
         return { wch };
     }))
     // 以第一行为初始值

+ 5 - 4
src/views/home/index.vue

@@ -168,8 +168,8 @@ export default {
   display: flex;
   align-items: center;
   background-repeat: no-repeat;
-  background-size: 100% 94%;
-  height: 400px;
+  background-size: 100% 95%;
+  height: 500px;
 
   .el-form {
     width: 780px;
@@ -270,8 +270,8 @@ export default {
       }
 
       .el-card__body {
-        min-height: 208px;
-        max-height: 308px;
+        min-height: 312px; // 208
+        max-height: 412px; // 308  6条
         padding: 0;
         overflow: auto;
         font-family: 'Helvetica Neue', Helvetica, Arial, 'Hiragino Sans GB',
@@ -303,6 +303,7 @@ export default {
 
             span {
               margin-right: 6px;
+              font-weight: 600;
             }
           }
 

+ 126 - 25
src/views/progress/component/strive.vue

@@ -2,26 +2,37 @@
     <el-card class="tjm_card_style_custom">
         <div class="tjm_card_title">条件检索</div>
         <div class="tjm_card_select">
-            <el-form class="tjm_card_select_left" :model="params" inline label-width="80px" label-position="left">
-                <el-form-item label="项目名称">
-                    <el-input v-model="params.name" clearable placeholder="请输入项目名称"></el-input>
-                </el-form-item>
-                <el-form-item label="填报日期">
-                    <el-date-picker v-model="createTime" type="daterange" value-format="YYYY-MM-DD" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
-                </el-form-item>
-
-                <el-form-item>
+            <el-scrollbar>
+                <el-form class="tjm_card_select_left" :model="params" label-width="80px" label-position="left">
+                    <el-row :gutter="15">
+                        <el-col :lg="10" :md="12" :xs="24">
+                            <el-form-item label="所属部门">
+                                <el-tree-select v-model="deptQuery.modelValue" :data="deptQuery.data" :props="deptQuery.props" check-strictly filterable clearable placeholder="请选择所属部门" @node-click="nodeClick"></el-tree-select>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :lg="10" :md="12" :xs="24">
+                            <el-form-item label="项目名称">
+                                <el-input v-model="params.name" clearable placeholder="请输入项目名称"></el-input>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :lg="14" :md="20" :xs="24">
+                            <el-form-item class="query-date-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>
-                </el-form-item>
-            </el-form>
+                </div>
+            </el-scrollbar>
         </div>
         <el-divider></el-divider>
 
         <div class="tjm_card_tools">
-            <div class="tjm_card_tools_left">
-                <el-button type="primary" icon="tools" @click="$emit('condition_set')">设置应填报日期</el-button>
-            </div>
             <div class="tjm_card_tools_right">
                 <el-button icon="download" @click="table_export">导出</el-button>
             </div>
@@ -32,68 +43,146 @@
                 <el-table-column type="index" label="序号" width="55"></el-table-column>
                  <template v-for="(item, index) in columns" :key="index">
                     <el-table-column :label="item.label" :prop="item.props" :min-width="item.width || 180" show-overflow-tooltip>
-                        <template #default="scope">{{ columnFormat(scope.row, item.props) }}</template>
+                        <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>
+                            <template v-else>{{ columnFormat(scope.row, item.props) }}</template>
+                        </template>
                     </el-table-column>
                 </template>
-                <el-table-column label="操作" fixed="right" width="100">
+                <!-- <el-table-column label="操作" fixed="right" width="100">
                     <template #default="scope">
                         <el-button type="primary" link icon="tickets" @click.stop="table_detail(scope.row)">查看</el-button>
                     </template>
-                </el-table-column>
+                </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>
+
+    <policy-explain v-if="dialog" ref="policyExplain" @closed="dialog = false"></policy-explain>
 </template>
 
 <script>
+import moment from "moment";
 import API from "@/api/policy/progress";
-import { columns } from "@/views/progress/main";
+import { getMainList } from "@/api/system/depart";
+import { strive_columns as columns } from "@/views/progress/main";
+import { exportExcel } from "@/utils/exportExcel";
+
 import yhPagination from "@/components/Pagination/index.vue";
+import policyExplain from "@/views/policyStrive/explain.vue";
 
 export default {
     components: {
-        yhPagination
+        yhPagination,
+        policyExplain
+    },
+
+    props: {
+        ytbDate: { type: Number, default: 0 }
     },
 
     data() {
         return {
             columns,
 
+            deptQuery: {
+                modelValue: null,
+                data: [],
+                props: { 
+                    label: "name",
+                    value: "id"
+                },
+                paramsFormat: {
+                    0: "deptId",
+                    1: "companyId"
+                }
+            },
+
             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,
-            tableData: []
+            tableData: [],
+            
+            dialog: false
         }
     },
 
     mounted() {
+        this.getDeptTree();
         this.reloadTable();
     },
 
     methods: {
+        disabledDate(date) {
+            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 "ytbDate";
+            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 && "是" || "否";
+            }
+
             return row[props];
         },
 
+        getDeptTree() {
+            getMainList().then(res => this.deptQuery.data = res.data);
+        },
+
         reloadTable() {
+            this.params.beginCreateTime = this.createTime[0] + " 00:00:00";
+            this.params.endCreateTime = this.createTime[1] + " 23:59:59";
+
             this.loading = true;
             API.progress.strive(this.params).then(res => {
                 this.loading = false;
-                this.tableData = res.data.records;
+                this.tableData = res.data.records.map(item => {
+                    item.ytbDate = this.ytbDate && (this.createMonth + "-" + this.ytbDate) || "";
+                    return item;
+                });
                 this.total = res.data.total;
             }).catch(() => this.loading = false);
         },
 
+        nodeClick({ deptType, id }) {
+            for (const key in this.deptQuery.paramsFormat) {
+                this.params[this.deptQuery.paramsFormat[key]] = null;
+            }
+
+            this.params[this.deptQuery.paramsFormat[deptType]] = id;
+        },
+
+        monthChange(e) {
+            this.createTime = [moment(e).startOf("month").format("YYYY-MM-DD"), moment(e).endOf("month").format("YYYY-MM-DD")];
+        },
+
+        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)));
+
+            exportExcel(header, data, [], `${this.$route.name}.xlsx`);
+        },
+
         table_detail(row) {
-            // this.$emit("table_detail", );
+            this.dialog = true;
+            nextTick(() => this.$refs.policyExplain.open("detail").setData(row.id));
         }
     }
 }
@@ -103,12 +192,24 @@ export default {
 .tjm_card_style_custom {
   border: none;
   box-shadow: 0 0;
+  margin-top: 0;
 
   :deep(.el-card__body) {
     padding-top: 10px;
 
-    .tjm_card_table {
-      margin-top: 0;
+    .query-date-item .el-form-item__content {
+      .el-date-editor.el-date-editor--month {
+        flex-basis: 30%;
+      }
+
+      .el-date-editor.el-date-editor--month + .el-date-editor {
+        flex: 1;
+        margin-left: 10px;
+      }
+    }
+
+    .tjm_card_tools {
+      justify-content: flex-end;
     }
   }
 }

+ 0 - 65
src/views/progress/dialog.vue

@@ -1,65 +0,0 @@
-<template>
-    <el-dialog v-model="visible" title="设置应填报日期" @closed="$emit('closed')">
-        <el-form ref="formRef" :model="form" :rules="rules" label-width="110px">
-            <el-row>
-                <el-col :span="24">
-                    <el-form-item label="应填报日期" prop="ytbDate">
-                        <el-input-number v-model="form.ytbDate" :min="1" :max="28" :controls="false" placeholder="请输入应填报日期(为每月1日至28日中一天)"></el-input-number>
-                    </el-form-item>
-                </el-col>
-            </el-row>
-        </el-form>
-
-        <template #footer>
-            <el-button :loading="isSaving" type="primary" @click="submit">确 定</el-button>
-        </template>
-    </el-dialog>
-</template>
-
-<script>
-import API from "@/api/policy/progress";
-
-export default {
-    emits: ["success", "closed"],
-    
-    data() {
-        return {
-            visible: false,
-            isSaving: false,
-
-            form: {
-                ytbDate: null
-            },
-
-            rules: {
-                ytbDate: [{ required: true, message: "请输入应填报日期" }]
-            }
-        }
-    },
-
-    methods: {
-        open(data) {
-            this.form.ytbDate = data;
-            this.visible = true;
-            return this;
-        },
-        
-        // 表单提交方法
-        submit() {
-            this.$refs.formRef.validate(valid => {
-                if (valid) {
-                    this.isSaving = true;
-                    API.condition.edit(this.form).then(() => {
-                        this.isSaving = false;
-                        this.visible = false;
-                        ElMessage.success("操作成功");
-                        this.$emit("success");
-                    }).catch(() => this.isSaving = false);
-                } else {
-                    return false;
-                }
-            });
-        }
-    }
-}
-</script>

+ 1 - 33
src/views/progress/index.vue

@@ -1,33 +1,19 @@
 <template>
     <div class="progress-content">
-        <el-form class="progress-header">
-            <el-form-item label="应填报日期">
-                <el-tag v-if="ytbDate" type="primary" size="large">每月{{ ytbDate }}日</el-tag>
-                <el-tag v-else type="info" size="large">未设置</el-tag>
-            </el-form-item>
-        </el-form>
-
         <el-tabs v-model="element">
             <el-tab-pane v-for="(label, key) in progressTab" :key="key" :label="label" :name="key"></el-tab-pane>
         </el-tabs>
 
-        <component :is="allComps[element]" @condition_set="condition_set"></component>
+        <component :is="allComps[element]" :ytbDate="ytbDate"></component>
     </div>
-
-    <ytb-dialog v-if="dialog" ref="ytbDialog" @success="getCondition" @closed="dialog = false"></ytb-dialog>
 </template>
 
 <script>
 import API from "@/api/policy/progress";
 import { progressTab } from "@/views/progress/main";
-import ytbDialog from "@/views/progress/dialog.vue";
 import allComps from "@/views/progress/component/index";
 
 export default {
-    components: {
-        ytbDialog
-    },
-
     data() {
         return {
             allComps,
@@ -36,7 +22,6 @@ export default {
             // element: "policy_share",
             element: "policy_strive",
 
-            dialog: false,
             ytbDate: null
         }
     },
@@ -48,11 +33,6 @@ export default {
     methods: {
         getCondition() {
             API.condition.get().then(res => this.ytbDate = res.data || null).catch(() => this.ytbDate = null);
-        },
-
-        condition_set() {
-            this.dialog = true;
-            nextTick(() => this.$refs.ytbDialog.open(this.ytbDate));
         }
     }
 }
@@ -66,18 +46,6 @@ export default {
   border-radius: var(--el-border-radius-base);
   box-shadow: var(--el-box-shadow-light);
 
-  .progress-header {
-    margin: 5px 20px 10px;
-
-    .el-form-item {
-      margin-bottom: 0;
-
-      :deep(.el-form-item__label) {
-        color: var(--el-text-color-primary);
-      }
-    }
-  }
-
   .el-tabs {
     padding: 0 20px;
 

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

@@ -3,13 +3,13 @@ export const progressTab = {
     policy_strive: "政策争取"
 }
 
-export const columns = [
+export const strive_columns = [
     { label: "填报单位", props: "companyName" },
     { label: "填报部门", props: "deptName" },
     { label: "填报人", props: "createName" },
     { label: "项目名称", props: "name" },
     { label: "预计争取金额", props: "yjStriveAmount", width: "120" },
     { label: "应填报日期", props: "ytbDate", width: "120" },
-    { label: "是否上报", props: "ytbDate", width: "120" },
-    { label: "是否迟报", props: "ytbDate", width: "120" }
+    { label: "是否上报", props: "isReport", width: "100" },
+    { label: "是否迟报", props: "isDelay", width: "100" }
 ]

+ 79 - 0
src/views/system/setting/index.vue

@@ -0,0 +1,79 @@
+<template>
+    <el-card class="tjm_card_style_custom">
+        <el-tabs v-model="element">
+            <el-tab-pane label="应填报日期" name="ytbDate">
+                <el-form ref="formRef" :model="form" :rules="rules" label-width="110px">
+                    <el-row>
+                        <el-col :span="24">
+                            <el-form-item label="应填报日期" prop="ytbDate">
+                                <el-input-number v-model="form.ytbDate" :min="1" :max="28" :controls="false" placeholder="请输入应填报日期(为每月1日至28日中一天)"></el-input-number>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="24">
+                            <el-form-item class="handler-btn-item">
+                                <el-button :loading="isSaving" type="primary" @click="submit">确 定</el-button>
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                </el-form>
+            </el-tab-pane>
+        </el-tabs>
+    </el-card>
+</template>
+
+<script>
+import API from "@/api/policy/progress";
+
+export default {
+    data() {
+        return {
+            element: "ytbDate",
+
+            isSaving: false,
+            form: {
+                ytbDate: null
+            },
+
+            rules: {
+                ytbDate: [{ required: true, message: "请输入应填报日期" }]
+            }
+        }
+    },
+
+    mounted() {
+        this.getCondition();
+    },
+
+    methods: {
+        getCondition() {
+            API.condition.get().then(res => this.form.ytbDate = res.data || null).catch(() => this.form.ytbDate = null);
+        },
+
+        // 表单提交方法
+        submit() {
+            this.$refs.formRef.validate(valid => {
+                if (valid) {
+                    this.isSaving = true;
+                    API.condition.edit(this.form).then(() => {
+                        this.isSaving = false;
+                        this.visible = false;
+                        ElMessage.success("操作成功");
+                    }).catch(() => this.isSaving = false);
+                } else {
+                    return false;
+                }
+            });
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.handler-btn-item {
+  margin-top: 36px;
+
+  :deep(.el-form-item__content) {
+    justify-content: flex-end;
+  }
+}
+</style>

+ 16 - 4
src/views/system/user.vue

@@ -2,6 +2,7 @@
 import { getMainList } from "@/api/system/depart.js"
 import { getRoleList } from "@/api/system/role"
 import API from "@/api/system/log";
+import { exportExcel } from "@/utils/exportExcel";
 import {
     getUserList,
     addUser,
@@ -12,6 +13,7 @@ import {
     restPwdUser
 } from "@/api/system/user.js"
 const { proxy } = getCurrentInstance()
+const route = useRoute()
 
 //部门树
 const deptName = ref("")
@@ -228,6 +230,18 @@ function resetUserPwdBtn(row) {
         })
     })
 }
+
+function table_export() {
+    const header = ["用户名", "所属部门", "姓名", "手机号", "电子邮箱", "用户状态"];
+    const props = ["userName", "deptName", "name", "mobile", "email", "state"];
+
+    const data = tableData.value.map(v => props.map(j => {
+        if (j == "state") return ["启用", "禁用"][v[j]];
+        return v[j];
+    }));
+
+    exportExcel(header, data, [], `${route.name}.xlsx`);
+}
 </script>
 
 <template>
@@ -314,7 +328,7 @@ function resetUserPwdBtn(row) {
                         {{ ["启用", "禁用"][scope.row.state] }}
                     </template>
                 </el-table-column>
-                <el-table-column prop="ope" label="操作">
+                <el-table-column label="操作" width="120">
                     <template #default="scope">
                         <el-tooltip content="修改" placement="top">
                             <el-button
@@ -429,6 +443,4 @@ function resetUserPwdBtn(row) {
             </div>
         </template>
     </el-dialog>
-</template>
-
-<style lang="scss" scoped></style>
+</template>