zhuangyunsheng преди 1 година
родител
ревизия
6a783d82b8

+ 8 - 2
src/api/policy/strive.js

@@ -93,7 +93,10 @@ export default {
         return request({
             url: "/qdport-zcgx/strive/approve",
             method: "post",
-            data
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
         })
     },
 
@@ -101,7 +104,10 @@ export default {
         return request({
             url: "/qdport-zcgx/strive/refuse",
             method: "post",
-            data
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
         })
     }
 }

+ 251 - 0
src/views/manage/policyShare/dialog.vue

@@ -0,0 +1,251 @@
+<template>
+    <el-dialog v-model="visible" :title="titleMap[mode]" width="680" @closed="$emit('closed', fileIsDel)">
+        <el-form ref="formRef" :model="form" :rules="rules" :disabled="mode == 'detail'" label-width="110px">
+            <el-row>
+                <el-col v-if="form.id" :span="12">
+                    <el-form-item label="政策编号" prop="businessNo">
+                        <el-input v-model="form.businessNo" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报人">
+                        <el-input v-model="form.createName" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报部门">
+                        <el-input v-model="form.deptName" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报单位">
+                        <el-input v-model="form.companyName" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col v-if="form.id" :span="12">
+                    <el-form-item label="填报时间">
+                        <el-date-picker v-model="form.createTime" readonly format="YYYY-MM-DD HH:mm:ss"></el-date-picker>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="政策名称" prop="name">
+                        <el-input v-model="form.name" placeholder="请输入政策名称"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="政策等级" prop="zcLevel">
+                        <el-select v-model="form.zcLevel" placeholder="请选择政策等级">
+                            <el-option v-for="item in levelDic" :key="item" :label="item" :value="item"></el-option>
+                        </el-select>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="政策类别" prop="zcType">
+                        <el-select v-model="form.zcType" placeholder="请选择政策类别">
+                            <el-option v-for="item in typeDic" :key="item" :label="item" :value="item"></el-option>
+                        </el-select>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="政策文号" prop="docNo">
+                        <el-input v-model="form.docNo" placeholder="请输入政策文号"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="联系方式" prop="contactPhone">
+                        <el-input v-model="form.contactPhone" placeholder="请输入联系方式"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="是否入库" prop="isInWh">
+                        <template v-if="mode == 'decode'">{{ whetherDic[form.isInWh] }}</template>
+                        <el-radio-group v-else v-model="form.isInWh" @change="form.inWhType = null">
+                            <el-radio v-for="(label, key) in whetherDic" :key="key" :label="label" :value="parseInt(key)"></el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="分值(0-10)" prop="score">
+                        <el-input-number v-model="form.score" :min="0" :max="10" :step="0.1" :precision="2" :controls="false" placeholder="请输入分值"></el-input-number>
+                    </el-form-item>
+                </el-col>
+                <el-col v-if="form.isInWh == 1" :span="12">
+                    <el-form-item label="入库类型" prop="inWhType">
+                        <template v-if="mode == 'decode'">{{ form.inWhType }}</template>
+                        <el-select v-else v-model="form.inWhType" placeholder="请选择入库类型">
+                            <el-option v-for="item in storageTypeDic" :key="item" :label="item" :value="item"></el-option>
+                        </el-select>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="政策概要" prop="abstractContent">
+                        <el-input v-model="form.abstractContent" type="textarea" :rows="4" placeholder="请输入政策概要"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col v-if="mode == 'decode' || form.inWhType == '文件类'" :span="24">
+                    <el-form-item label="政策解读" prop="decodeContent">
+                        <el-input v-model="form.decodeContent" type="textarea" :rows="4" placeholder="请输入政策解读"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item :class="mode == 'detail' && 'no-upload-btn'" label="附件">
+                        <yhUpload v-model="form.fileList" :limit="10" @updateTable="fileIsDel = true">
+                            <el-button type="primary" icon="upload" size="small"></el-button>
+                        </yhUpload>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+
+        <template #footer>
+            <template v-if="mode != 'detail'">
+                <el-button type="primary" @click="submit(mode == 'decode' && 'edit' || mode)">确 定</el-button>
+            </template>
+        </template>
+    </el-dialog>
+</template>
+
+<script>
+import Common from "@/api/common";
+import API from "@/api/policy/share";
+import { useUserStore } from "@/store/user";
+import { levelDic, typeDic, storageTypeDic, whetherDic } from "@/views/policyShare/main";
+import yhUpload from "@/components/Upload/index.vue";
+
+const { userInfo } = useUserStore(); // store 用户
+
+export default {
+    emits: ["success", "closed"],
+    
+    components: {
+        yhUpload
+    },
+
+    data() {
+        return {
+            levelDic, typeDic, storageTypeDic, whetherDic,
+
+            visible: false,
+            mode: "saveDone",
+            titleMap: {
+                saveDone: "新增",
+                edit: "编辑",
+                detail: "详情",
+                decode: "添加解读"
+            },
+            form: {
+                id: null,
+                businessNo: null,
+                status: null,
+                createId: userInfo.id,
+                createName: userInfo.name,
+                createTime: null,
+                name: null,
+                companyName: null,
+                deptName: null,
+                zcLevel: null,
+                zcType: null,
+                docNo: null,
+                contactPhone: null,
+                score: null,
+                isInWh: 1,
+                inWhType: null,
+                abstractContent: null,
+                decodeContent: null,
+                fileList: []
+            },
+
+            rules: {
+                businessNo: [{ required: true }],
+                name: [{ required: true, message: "请输入政策名称" }],
+                zcLevel: [{ required: true, message: "请选择政策等级" }],
+                zcType: [{ required: true, message: "请选择政策类别" }],
+                docNo: [{ required: true, message: "请输入政策文号" }],
+                contactPhone: [{ required: true, message: "请输入联系方式" }],
+                score: [{ required: true, message: "请输入分值" }],
+                isInWh: [{ required: true }],
+                inWhType: [{ required: true, message: "请选择入库类型" }],
+                abstractContent: [{ required: true, message: "请输入政策概要" }],
+                decodeContent: [{ required: true, message: "请输入政策解读" }]
+            },
+
+            fileIsDel: false
+        }
+    },
+
+    mounted() {
+        this.getUserDept();
+    },
+
+    methods: {
+        open(mode = "saveDone") {
+            this.mode = mode;
+            this.visible = true;
+            return this;
+        },
+
+        setData(id) {
+            API.detail(id).then(res => {
+                if (res.code === 200) {
+                    for (const key in this.form) {
+                        if (key == "fileList") this.form[key] = res.data[key].map(file => ({ ...file, name: file.originalName, path: file.fileDomain + "/" + file.fileName }));
+                        else if (key == "isInWh") this.form.isInWh = !!res.data[key] && res.data[key] || 0;
+                        else this.form[key] = res.data[key] || null;
+                    }
+                } else ElMessage.error(res.msg);
+            });
+        },
+
+        getUserDept() {
+            Common.getUserDept(userInfo.deptId).then(res => {
+                if (res.code === 200) {
+                    this.form.companyName = res.data.companyName;
+                    this.form.deptName = res.data.deptName;
+                }
+            });
+        },
+
+        // 表单提交方法
+        submit(mode) {
+            this.$refs.formRef.validate(valid => {
+                if (valid) {
+                    API[mode](this.form).then(res => {
+                        if (res.code === 200) {
+                            ElMessage.success("操作成功");
+                            this.visible = false;
+                            this.fileIsDel = false;
+                            this.$emit("success", mode);
+                        } else ElMessage.error(res.msg);
+                    });
+                } else {
+                    return false;
+                }
+            });
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.no-upload-btn :deep(.yh-upload-file) {
+  .el-upload {
+    display: none;
+  }
+
+  .el-upload-list.is-disabled {
+    margin-top: 0;
+  }
+}
+
+.el-input-number {
+  width: 100%;
+
+  :deep(.el-input) .el-input__wrapper {
+    padding: 1px 11px;
+
+    .el-input__inner {
+      text-align: unset;
+    }
+  }
+}
+</style>

+ 9 - 8
src/views/manage/policyShare/index.vue

@@ -57,7 +57,7 @@
                 <el-table-column label="操作" fixed="right" width="240">
                     <template #default="scope">
                         <el-button type="primary" link icon="edit" @click="table_edit(scope.row)">修改</el-button>
-                        <el-button v-if="scope.row.inWhType == '文件类'" type="primary" link @click="table_edit(scope.row, 'decode')">
+                        <el-button v-if="scope.row.isInWh == 1 && scope.row.inWhType == '文件类'" type="primary" link @click="table_edit(scope.row, 'decode')">
                             <template #icon><tjm-icon-fluent-emoji-high-contrast-open-book /></template>
                             添加解读
                         </el-button>
@@ -71,7 +71,7 @@
         </div>
     </el-card>
 
-    <policy-detail v-if="dialog" ref="policyDetail" isMaster @success="reloadTable" @closed="closed"></policy-detail>
+    <policy-detail v-if="dialog" ref="policyDetail" @success="reloadTable" @closed="closed"></policy-detail>
 </template>
 
 <script>
@@ -81,7 +81,7 @@ import { levelDic, typeDic, storageTypeDic, whetherDic } from "@/views/policySha
 import { columns } from "./main";
 
 import yhPagination from "@/components/Pagination/index.vue";
-import policyDetail from "@/views/policyShare/dialog.vue";
+import policyDetail from "./dialog.vue";
 
 export default {
     components: {
@@ -116,6 +116,7 @@ export default {
     methods: {
         columnFormat(row, props) {
             if (props == "isInWh") return whetherDic[row[props]] || "";
+            if (props == "inWhType") return row.isInWh == 1 && row[props] || "";
             return row[props];
         },
 
@@ -136,10 +137,10 @@ export default {
 
         reset() {
             this.createTime = [];
-            for (const key in this.params) {
-                if (key == "page") this.params[key] = 1;
-                else if (key == "size") this.params[key] = 10;
-                else this.params[key] = null;
+            this.params = {
+                page: 1,
+                size: 10,
+                status: "done"
             }
             this.reloadTable();
         },
@@ -153,7 +154,7 @@ export default {
 
         table_add() {
             this.dialog = true;
-            this.$nextTick(() => this.$refs.policyDetail.open("saveDone"));
+            this.$nextTick(() => this.$refs.policyDetail.open());
         },
 
         table_edit(row, mode = "edit") {

+ 4 - 4
src/views/manage/policyStrive/index.vue

@@ -137,10 +137,10 @@ export default {
 
         reset() {
             this.createTime = [];
-            for (const key in this.params) {
-                if (key == "page") this.params[key] = 1;
-                else if (key == "size") this.params[key] = 10;
-                else this.params[key] = null;
+            this.params = {
+                page: 1,
+                size: 10,
+                status: "done"
             }
             this.reloadTable();
         },

+ 0 - 125
src/views/policyShare/approve.vue

@@ -1,125 +0,0 @@
-<template>
-    <el-form ref="formRef" :model="form" :rules="rules" :disabled="disabled" label-width="110px">
-        <div class="dialog-title">{{ titleMap[handler] }}</div>
-        <el-row>
-            <template v-if="handler == 'agree'">
-                <el-col :span="12">
-                    <el-form-item label="是否入库" prop="isInWh">
-                        <el-radio-group v-model="form.isInWh" @change="form.inWhType = null">
-                            <el-radio v-for="(label, key) in whetherDic" :key="key" :label="label" :value="parseInt(key)"></el-radio>
-                        </el-radio-group>
-                    </el-form-item>
-                </el-col>
-                <el-col :span="12">
-                    <el-form-item label="分值(0-10)" :prop="!isMaster && 'score'">
-                        <el-input-number v-model="form.score" :min="0" :max="10" :step="0.1" :precision="2" :controls="false" placeholder="请输入分值"></el-input-number>
-                    </el-form-item>
-                </el-col>
-                <el-col v-if="form.isInWh == 1" :span="12">
-                    <el-form-item label="入库类型" prop="inWhType">
-                        <el-select v-model="form.inWhType" placeholder="请选择入库类型">
-                            <el-option v-for="item in storageTypeDic" :key="item" :label="item" :value="item"></el-option>
-                        </el-select>
-                    </el-form-item>
-                </el-col>
-            </template>
-
-            <el-col v-else :span="24">
-                <el-form-item label="意见" prop="remark">
-                    <el-input v-model="form.remark" type="textarea" :rows="4" placeholder="请输入意见"></el-input>
-                </el-form-item>
-            </el-col>
-        </el-row>
-    </el-form>
-</template>
-
-<script>
-import API from "@/api/policy/share";
-import { storageTypeDic, whetherDic } from "./main";
-
-export default {
-    props: {
-        isMaster: { type: Boolean, default: false },
-        handler: { type: String, default: "agree" },
-        disabled: { type: Boolean, default: true },
-        rowData: { type: Object, default: () => {} }
-    },
-
-    data() {
-        return {
-            storageTypeDic, whetherDic,
-            titleMap: {
-                agree: "考核评分",
-                refuse: "退回意见"
-            },
-
-            form: {
-                score: null,
-                isInWh: 0,
-                inWhType: null
-            },
-
-            rules: {
-                score: [{ required: true, message: "请输入分值" }],
-                isInWh: [{ required: true }],
-                inWhType: [{ required: true, message: "请选择入库类型" }],
-                // remark: [{ required: true, message: "请输入退回意见" }]
-            },
-        }
-    },
-
-    watch: {
-        rowData: {
-            deep: true,
-            handler(value) {
-                if (value.id) {
-                    this.form = Object.assign({}, this.rowData);
-                }
-            }
-        }
-    },
-
-    mounted() {
-        this.form = Object.assign({}, this.rowData);
-    },
-
-    methods: {
-        submit() {
-            this.$refs.formRef.validate(valid => {
-                if (valid) {
-                    API[this.handler](this.form).then(res => {
-                        if (res.code === 200) {
-                            ElMessage.success("操作成功");
-                            this.visible = false;
-                            this.$emit("success");
-                        } else ElMessage.error(res.msg);
-                    });
-                } else {
-                    return false;
-                }
-            });
-        }
-    }
-}
-</script>
-
-<style lang="scss" scoped>
-.dialog-title {
-  margin-bottom: 15px;
-  font-size: 15px;
-  font-weight: 600;
-  color: var(--el-text-color-primary);
-}
-
-.el-input-number {
-  width: 100%;
-
-  :deep(.el-input) .el-input__wrapper {
-    padding: 1px 11px;
-
-    .el-input__inner {
-      text-align: unset;
-    }
-  }
-}
-</style>

+ 32 - 81
src/views/policyShare/dialog.vue

@@ -1,30 +1,30 @@
 <template>
-    <el-dialog v-model="visible" :title="titleMap[mode]" :width="680" @closed="$emit('closed', fileIsDel)">
-        <el-form ref="formRef" :model="form" :rules="rules" :disabled="mode == 'detail'" label-width="110px">
+    <el-dialog v-model="visible" :title="titleMap[mode]" width="680" @closed="$emit('closed', fileIsDel)">
+        <el-form ref="formRef" :model="form" :rules="rules" label-width="110px">
             <el-row>
                 <el-col v-if="form.id" :span="12">
                     <el-form-item label="政策编号" prop="businessNo">
-                        <el-input v-model="form.businessNo" disabled></el-input>
+                        <el-input v-model="form.businessNo" readonly></el-input>
                     </el-form-item>
                 </el-col>
                 <el-col :span="12">
                     <el-form-item label="填报人">
-                        <el-input v-model="form.createName" disabled></el-input>
+                        <el-input v-model="form.createName" readonly></el-input>
                     </el-form-item>
                 </el-col>
                 <el-col :span="12">
                     <el-form-item label="填报部门">
-                        <el-input v-model="form.deptName" disabled></el-input>
+                        <el-input v-model="form.deptName" readonly></el-input>
                     </el-form-item>
                 </el-col>
                 <el-col :span="12">
                     <el-form-item label="填报单位">
-                        <el-input v-model="form.companyName" disabled></el-input>
+                        <el-input v-model="form.companyName" readonly></el-input>
                     </el-form-item>
                 </el-col>
                 <el-col v-if="form.id" :span="12">
                     <el-form-item label="填报时间">
-                        <el-date-picker v-model="form.createTime" disabled format="YYYY-MM-DD HH:mm:ss"></el-date-picker>
+                        <el-date-picker v-model="form.createTime" readonly format="YYYY-MM-DD HH:mm:ss"></el-date-picker>
                     </el-form-item>
                 </el-col>
                 <el-col :span="12">
@@ -61,13 +61,8 @@
                         <el-input v-model="form.abstractContent" type="textarea" :rows="4" placeholder="请输入政策概要"></el-input>
                     </el-form-item>
                 </el-col>
-                <el-col v-if="mode == 'decode'" :span="24">
-                    <el-form-item label="政策解读" prop="decodeContent">
-                        <el-input v-model="form.decodeContent" type="textarea" :rows="4" placeholder="请输入政策解读"></el-input>
-                    </el-form-item>
-                </el-col>
                 <el-col :span="24">
-                    <el-form-item :class="mode == 'detail' && 'no-upload-btn'" label="附件">
+                    <el-form-item label="附件">
                         <yhUpload v-model="form.fileList" :limit="10" @updateTable="fileIsDel = true">
                             <el-button type="primary" icon="upload" size="small"></el-button>
                         </yhUpload>
@@ -75,19 +70,10 @@
                 </el-col>
             </el-row>
         </el-form>
-        <approve-form v-if="isMaster || (mode == 'detail' && form.id)" ref="approveForm" :rowData="form" :handler="handler" :isMaster="isMaster" :disabled="isMaster ? false : !isApprove" @success="visible = false"></approve-form>
-    
+
         <template #footer>
-            <template v-if="isApprove">
-                <el-button type="primary" @click="policyApprove">确 定</el-button>
-            </template>
-            <template v-if="isMaster">
-                <el-button type="primary" @click="validateForm(mode == 'decode' && 'edit' || mode)">确 定</el-button>
-            </template>
-            <template v-if="!isMaster && (mode == 'add' || mode == 'edit')">
-                <el-button type="primary" @click="validateForm(mode)">保 存</el-button>
-                <el-button type="primary" @click="validateForm('saveApprove')">直接上报</el-button>
-            </template>
+            <el-button type="primary" @click="submit(mode)">保 存</el-button>
+            <el-button type="primary" @click="submit('saveApprove')">直接上报</el-button>
         </template>
     </el-dialog>
 </template>
@@ -98,19 +84,14 @@ import API from "@/api/policy/share";
 import { useUserStore } from "@/store/user";
 import { levelDic, typeDic } from "./main";
 import yhUpload from "@/components/Upload/index.vue";
-import approveForm from "@/views/policyShare/approve.vue";
 
 const { userInfo } = useUserStore(); // store 用户
 
 export default {
     emits: ["success", "closed"],
-    props: {
-        isMaster: { type: Boolean, default: false },
-        isApprove: { type: Boolean, default: false }
-    },
+    
     components: {
-        yhUpload,
-        approveForm
+        yhUpload
     },
 
     data() {
@@ -119,13 +100,9 @@ export default {
 
             visible: false,
             mode: "add",
-            handler: "agree",
             titleMap: {
                 add: "新增",
-                saveDone: "新增",
-                edit: "编辑",
-                detail: "详情",
-                decode: "添加解读"
+                edit: "编辑"
             },
             form: {
                 id: null,
@@ -142,10 +119,6 @@ export default {
                 docNo: null,
                 contactPhone: null,
                 abstractContent: null,
-                decodeContent: null,
-                score: null,
-                isInWh: this.isMaster && 1 || 0,
-                inWhType: null,
                 fileList: []
             },
 
@@ -156,12 +129,10 @@ export default {
                 zcType: [{ required: true, message: "请选择政策类别" }],
                 docNo: [{ required: true, message: "请输入政策文号" }],
                 contactPhone: [{ required: true, message: "请输入联系方式" }],
-                abstractContent: [{ required: true, message: "请输入政策概要" }],
-                decodeContent: [{ required: true, message: "请输入政策解读" }]
+                abstractContent: [{ required: true, message: "请输入政策概要" }]
             },
 
-            fileIsDel: false,
-            dialog: false
+            fileIsDel: false
         }
     },
 
@@ -170,9 +141,8 @@ export default {
     },
 
     methods: {
-        open(mode = "add", handler) {
+        open(mode = "add") {
             this.mode = mode;
-            this.handler = handler;
             this.visible = true;
             return this;
         },
@@ -181,9 +151,7 @@ export default {
             API.detail(id).then(res => {
                 if (res.code === 200) {
                     for (const key in this.form) {
-                        if (key == "fileList") {
-                            this.form[key] = res.data[key].map(file => ({ ...file, name: file.originalName, path: file.fileDomain + "/" + file.fileName }));
-                        } else if (key == "isInWh") this.form.isInWh = !!res.data[key] && res.data[key] || 0;
+                        if (key == "fileList") this.form[key] = res.data[key].map(file => ({ ...file, name: file.originalName, path: file.fileDomain + "/" + file.fileName }));
                         else this.form[key] = res.data[key] || null;
                     }
                 } else ElMessage.error(res.msg);
@@ -200,39 +168,22 @@ export default {
         },
 
         // 表单提交方法
-        async validateForm(mode) {
-            const promiseArray = [this.$refs.formRef.validate()];
-            this.isMaster && promiseArray.push(await this.$refs.approveForm.$refs.formRef.validate());
-
-            return Promise.all(promiseArray).then(() => this.submit(mode)).catch(() => false);
-        },
-			
         submit(mode) {
-            API[mode](this.form).then(res => {
-                if (res.code === 200) {
-                    ElMessage.success("操作成功");
-                    this.visible = false;
-                    this.fileIsDel = false;
-                    this.$emit("success", mode);
-                } else ElMessage.error(res.msg);
+            this.$refs.formRef.validate(valid => {
+                if (valid) {
+                    API[mode](this.form).then(res => {
+                        if (res.code === 200) {
+                            ElMessage.success("操作成功");
+                            this.visible = false;
+                            this.fileIsDel = false;
+                            this.$emit("success", mode);
+                        } else ElMessage.error(res.msg);
+                    });
+                } else {
+                    return false;
+                }
             });
-        },
-
-        policyApprove() {
-            this.$refs.approveForm.submit();
         }
     }
 }
-</script>
-
-<style lang="scss" scoped>
-.no-upload-btn :deep(.yh-upload-file) {
-  .el-upload {
-    display: none;
-  }
-
-  .el-upload-list.is-disabled {
-    margin-top: 0;
-  }
-}
-</style>
+</script>

+ 21 - 10
src/views/policyShare/index.vue

@@ -67,7 +67,7 @@
                             <el-button type="primary" link icon="upload" @click="table_update(scope.row)">提交</el-button>
                             <el-button type="primary" link icon="delete" @click="table_del(scope.row)">删除</el-button>
                         </template>
-                        <el-button v-if="scope.row.status == 'approve' || scope.row.status == 'done'" type="primary" link icon="tickets" @click="table_edit(scope.row, 'detail')">详情</el-button>
+                        <el-button v-if="scope.row.status == 'approve' || scope.row.status == 'done'" type="primary" link icon="tickets" @click="table_detail(scope.row)">详情</el-button>
                         <el-button v-if="scope.row.status == 'approve'" type="primary" link icon="refresh-right" @click="table_update(scope.row, 'withdraw')">撤回</el-button>
                     </template>
                 </el-table-column>
@@ -78,7 +78,8 @@
         </div>
     </el-card>
 
-    <policy-detail v-if="dialog" ref="policyDetail" @success="reloadTable" @closed="closed"></policy-detail>
+    <policy-dialog v-if="dialog.update" ref="policyDialog" @success="reloadTable" @closed="closed"></policy-dialog>
+    <policy-detail v-if="dialog.detail" ref="policyDetail" @closed="dialog.detail = false"></policy-detail>
 </template>
 
 <script>
@@ -88,13 +89,15 @@ import { columns, levelDic, typeDic, storageTypeDic, whetherDic, statusDic } fro
 
 import tableImport from "@/components/Upload/tableImport.vue";
 import yhPagination from "@/components/Pagination/index.vue";
-import policyDetail from "./dialog.vue";
+import policyDetail from "@/views/manage/policyShare/dialog.vue";
+import policyDialog from "./dialog.vue";
 
 export default {
     components: {
         tableImport,
         yhPagination,
-        policyDetail
+        policyDetail,
+        policyDialog
     },
 
     data() {
@@ -111,7 +114,10 @@ export default {
             total: 0,
             tableData: [],
 
-            dialog: false
+            dialog: {
+                update: false,
+                detail: false
+            }
         }
     },
 
@@ -159,13 +165,18 @@ export default {
         },
 
         table_add() {
-            this.dialog = true;
-            this.$nextTick(() => this.$refs.policyDetail.open());
+            this.dialog.update = true;
+            this.$nextTick(() => this.$refs.policyDialog.open());
         },
 
         table_edit(row, mode = "edit") {
-            this.dialog = true;
-            this.$nextTick(() => this.$refs.policyDetail.open(mode).setData(row.id));
+            this.dialog.update = true;
+            this.$nextTick(() => this.$refs.policyDialog.open(mode).setData(row.id));
+        },
+
+        table_detail(row) {
+            this.dialog.detail = true;
+            this.$nextTick(() => this.$refs.policyDetail.open("detail").setData(row.id));
         },
 
         table_del(row) {
@@ -201,7 +212,7 @@ export default {
 
         closed(e) {
             e && this.reloadTable();
-            this.dialog = false;
+            this.dialog.update = false;
         }
     }
 }

+ 0 - 24
src/views/policyStrive/explain.vue

@@ -271,30 +271,6 @@ export default {
   }
 }
 
-.reward-radio-item {
-  flex-direction: column;
-
-  :deep(.el-form-item__label) {
-    margin-bottom: 12px;
-    padding-right: 0;
-  }
-
-  :deep(.el-form-item__content) .el-radio {
-    align-items: unset;
-    height: fit-content;
-    margin-right: 0;
-
-    .el-radio__input {
-      padding-top: 9px;
-    }
-
-    .el-radio__label .reward-radio-item__content {
-      font-size: var(--el-font-size-small);
-      white-space: pre-wrap;
-    }
-  }
-}
-
 .label-column-2 :deep(.el-form-item__label) {
   margin-left: 30px;
 }

+ 29 - 12
src/views/publicDomain/index.vue

@@ -34,9 +34,11 @@
                 <template v-for="(item, index) in columns" :key="index">
                     <el-table-column :label="item.label" :prop="item.props" :width="item.width || 180" show-overflow-tooltip></el-table-column>
                 </template>
-                <el-table-column label="操作" fixed="right" width="220">
+                <el-table-column label="操作" fixed="right" width="240">
                     <template #default="scope">
                         <el-button type="primary" link icon="tickets" @click="table_detail(scope.row)">详情</el-button>
+                        <el-button type="primary" link icon="link" @click="table_link(scope.row)">政策关联</el-button>
+                        <el-button type="primary" link icon="chat-line-square" @click="table_msg(scope.row)">留言</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -46,7 +48,8 @@
         </div>
     </el-card>
 
-    <policy-detail v-if="dialog" ref="policyDetail" @closed="dialog = false"></policy-detail>
+    <policy-detail v-if="dialog.detail" ref="policyDetail" @closed="dialog.detail = false"></policy-detail>
+    <policy-link v-if="dialog.link" ref="policyLink" @closed="dialog.link = false"></policy-link>
 </template>
 
 <script>
@@ -55,12 +58,14 @@ import { levelDic, typeDic } from "@/views/policyShare/main";
 import { columns } from "./main";
 
 import yhPagination from "@/components/Pagination/index.vue";
-import policyDetail from "@/views/policyShare/dialog.vue";
+import policyDetail from "@/views/manage/policyShare/dialog.vue";
+import policyLink from "./link.vue";
 
 export default {
     components: {
         yhPagination,
-        policyDetail
+        policyDetail,
+        policyLink
     },
 
     data() {
@@ -79,7 +84,10 @@ export default {
             total: 0,
             tableData: [],
 
-            dialog: false
+            dialog: {
+                detail: false,
+                link: false
+            }
         }
     },
 
@@ -104,17 +112,26 @@ export default {
 
         reset() {
             this.createTime = [];
-            for (const key in this.params) {
-                if (key == "page") this.params[key] = 1;
-                else if (key == "size") this.params[key] = 10;
-                else this.params[key] = null;
+            this.params = {
+                page: 1,
+                size: 10,
+                isInWh: 1,
+                status: "done"
             }
             this.reloadTable();
         },
 
-        table_detail(row, mode = "detail") {
-            this.dialog = true;
-            this.$nextTick(() => this.$refs.policyDetail.open(mode).setData(row.id));
+        table_detail(row) {
+            this.dialog.detail = true;
+            this.$nextTick(() => this.$refs.policyDetail.open("detail").setData(row.id));
+        },
+
+        table_link(row) {
+            this.dialog.link = true;
+            this.$nextTick(() => this.$refs.policyLink.open().setData(row));
+        },
+
+        table_msg(row) {
         }
     }
 }

+ 159 - 0
src/views/publicDomain/link.vue

@@ -0,0 +1,159 @@
+<template>
+    <el-dialog v-model="visible" title="政策关联" width="80%" @closed="$emit('closed')">
+        <el-card class="tjm_card_style_custom" shadow="never">
+            <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-select v-model="params.zcLevel" clearable placeholder="请选择项目等级">
+                            <el-option v-for="item in levelDic" :key="item" :label="item" :value="item"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="项目类别">
+                        <el-select v-model="params.zcType" clearable placeholder="请选择项目类别">
+                            <el-option v-for="item in typeDic" :key="item" :label="item" :value="item"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="状态">
+                        <el-select v-model="params.isLand" clearable placeholder="请选择状态">
+                            <el-option v-for="(label, key) in statusDic" :key="key" :label="label" :value="parseInt(key)"></el-option>
+                        </el-select>
+                    </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-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-divider></el-divider>
+
+            <div class="tjm_card_table">
+                <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border>
+                    <el-table-column type="index" label="序号" width="55"></el-table-column>
+                    <template v-for="(item, index) in link_columns" :key="index">
+                        <el-table-column :label="item.label" :prop="item.props" :width="item.width || 180" show-overflow-tooltip>
+                            <template #default="scope">{{ columnFormat(scope.row, item.props) }}</template>
+                        </el-table-column>
+                    </template>
+                    <el-table-column label="操作" fixed="right" width="100">
+                        <template #default="scope">
+                            <el-button type="primary" link icon="tickets" @click="table_detail(scope.row)">详情</el-button>
+                        </template>
+                    </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-strive-detail v-if="dialog.detail" ref="policyStriveDetail" @closed="dialog.detail = false"></policy-strive-detail>
+</template>
+
+<script>
+import API from "@/api/policy/strive";
+import { levelDic, typeDic } from "@/views/policyShare/main";
+import { statusDic } from "@/views/manage/policyStrive/main";
+import { link_columns } from "./main";
+
+import yhPagination from "@/components/Pagination/index.vue";
+import policyStriveDetail from "@/views/policyStrive/explain.vue";
+
+export default {
+    emits: ["closed"],
+    
+    components: {
+        yhPagination,
+        policyStriveDetail
+    },
+
+    data() {
+        return {
+            link_columns, levelDic, typeDic, statusDic,
+            visible: false,
+
+            loading: false,
+            createTime: [],
+            params: {
+                page: 1,
+                size: 10,
+                status: "done",
+                docNo: null
+            },
+
+            total: 0,
+            tableData: [],
+
+            dialog: {
+                detail: false
+            }
+        }
+    },
+
+    methods: {
+        open() {
+            this.visible = true;
+            return this;
+        },
+
+        setData(data) {
+            this.params.docNo = data.docNo;
+            this.reloadTable();
+        },
+
+        columnFormat(row, props) {
+            if (props == "status") return statusDic[row.isLand] || "";
+            if (props == "landAmount") return row.isLand == 1 && row[props] || "";
+            return row[props];
+        },
+
+        reloadTable() {
+            this.params.beginCreateTime = this.createTime && this.createTime.length && this.createTime[0] + " 00:00:00" || null;
+            this.params.endCreateTime = this.createTime && this.createTime.length && this.createTime[1] + " 23:59:59" || null;
+
+            this.loading = true;
+            API.get(this.params).then(res => {
+                this.loading = false;
+                if (res.code === 200) {
+                    this.tableData = res.data.records;
+                    this.total = res.data.total;
+                } else ElMessage.error(res.msg);
+            }).catch(() => this.loading = false);
+        },
+
+        reset() {
+            this.createTime = [];
+            for (const key in this.params) {
+                if (key == "page") this.params[key] = 1;
+                else if (key == "size") this.params[key] = 10;
+                else {
+                    if (key != "status" && key != "docNo") this.params[key] = null;
+                }
+            }
+            this.reloadTable();
+        },
+
+        table_detail(row) {
+            this.dialog.detail = true;
+            this.$nextTick(() => this.$refs.policyStriveDetail.open("detail").setData(row.id));
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.tjm_card_style_custom {
+  border: none;
+
+  :deep(.el-card__body) {
+    padding: 0;
+  }
+}
+</style>

+ 16 - 0
src/views/publicDomain/main.js

@@ -7,4 +7,20 @@ export const columns = [
     { label: "发布单位", props: "companyName" },
     { label: "联系方式", props: "contactPhone" },
     { label: "发布时间", props: "createTime" }
+]
+
+export const link_columns = [
+    { label: "政策编号", props: "businessNo" },
+    { label: "状态", props: "status", width: "100" },
+    { label: "项目名称", props: "name" },
+    { label: "项目概要", props: "abstractContent" },
+    { label: "项目等级", props: "zcLevel", width: "100" },
+    { label: "项目类别", props: "zcType", width: "100" },
+    { label: "政策文号", props: "docNo" },
+    { label: "预计争取金额", props: "yjStriveAmount", width: "120" },
+    { label: "预计完成时间", props: "yjFinishTime", width: "120" },
+    { label: "责任人", props: "directorName" },
+    { label: "填报人", props: "createName" },
+    { label: "填报部门", props: "deptName" },
+    { label: "填报单位", props: "companyName" }
 ]

+ 16 - 17
src/views/toDo/index.vue

@@ -35,8 +35,8 @@
                 <el-table-column label="填报时间" prop="zcCreateTime" width="180" show-overflow-tooltip></el-table-column>
                 <el-table-column label="操作" fixed="right" width="160">
                     <template #default="scope">
-                        <el-button type="primary" link icon="circle-check" @click="table_detail(scope.row)">通过</el-button>
-                        <el-button type="primary" link icon="circle-close" @click="table_detail(scope.row, 'refuse')">退回</el-button>
+                        <el-button type="primary" link icon="circle-check" @click="table_approve(scope.row)">通过</el-button>
+                        <el-button type="primary" link icon="circle-close" @click="table_approve(scope.row, 'refuse')">退回</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -46,23 +46,22 @@
         </div>
     </el-card>
 
-    <policy-share-detail v-if="dialog" ref="policy_share" isApprove @closed="reloadTable(), dialog = false"></policy-share-detail>
+    <policy-share v-if="dialog" ref="policyShare" @success="reloadTable" @closed="dialog = false"></policy-share>
 </template>
 
 <script>
-import API from "@/api/policy/todo"
-import Strive from "@/api/policy/strive"
+import API from "@/api/policy/todo";
+import Strive from "@/api/policy/strive";
 import { useUserStore } from "@/store/user";
 import { typeDic } from "@/views/policyShare/main";
-import yhPagination from "@/components/Pagination/index.vue";
-import policyShareDetail from "@/views/policyShare/dialog.vue";
 
-const { userInfo } = useUserStore(); // store 用户
+import yhPagination from "@/components/Pagination/index.vue";
+import policyShare from "./share.vue";
 
 export default {
     components: {
         yhPagination,
-        policyShareDetail
+        policyShare
     },
 
     data() {
@@ -74,7 +73,7 @@ export default {
             params: {
                 page: 1,
                 size: 10,
-                todoUserId: userInfo.id
+                todoUserId: useUserStore().userInfo.id
             },
 
             total: 0,
@@ -105,18 +104,18 @@ export default {
     
         reset() {
             this.createTime = [];
-            for (const key in this.params) {
-                if (key == "page") this.params[key] = 1;
-                else if (key == "size") this.params[key] = 10;
-                else this.params[key] = null;
+            this.params = {
+                page: 1,
+                size: 10,
+                todoUserId: useUserStore().userInfo.id
             }
             this.reloadTable();
         },
     
-        table_detail({ refId, refType }, mode = "agree") {
+        table_approve({ refId, refType }, mode = "agree") {
             if (refType == "policy_share") {
                 this.dialog = true;
-                this.$nextTick(() => this.$refs[refType].open("detail", mode).setData(refId));
+                this.$nextTick(() => this.$refs.policyShare.open(mode).setData(refId));
             }
             
             if (refType == "policy_strive") {
@@ -126,7 +125,7 @@ export default {
                     confirmButtonText: "确定",
                     cancelButtonText: "取消"
                 }).then(() => {
-                    Strive[mode]({ id: refId, updateId: userInfo.id }).then(res => {
+                    Strive[mode]({ id: refId }).then(res => {
                         if (res.code === 200) {
                             ElMessage.success("操作成功");
                             this.reloadTable();

+ 231 - 0
src/views/toDo/share.vue

@@ -0,0 +1,231 @@
+<template>
+    <el-dialog v-model="visible" :title="titleMap[mode]" width="680" @closed="$emit('closed')">
+        <el-form :model="form" :rules="rules" disabled label-width="110px">
+            <el-row>
+                <el-col :span="12">
+                    <el-form-item label="政策编号" prop="businessNo">
+                        <el-input v-model="form.businessNo" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报人">
+                        <el-input v-model="form.createName" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报部门">
+                        <el-input v-model="form.deptName" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报单位">
+                        <el-input v-model="form.companyName" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报时间">
+                        <el-date-picker v-model="form.createTime" readonly format="YYYY-MM-DD HH:mm:ss"></el-date-picker>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="政策名称" prop="name">
+                        <el-input v-model="form.name" placeholder="请输入政策名称"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="政策等级" prop="zcLevel">
+                        <el-input v-model="form.zcLevel" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="政策类别" prop="zcType">
+                        <el-input v-model="form.zcType" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="政策文号" prop="docNo">
+                        <el-input v-model="form.docNo" placeholder="请输入政策文号"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="联系方式" prop="contactPhone">
+                        <el-input v-model="form.contactPhone" placeholder="请输入联系方式"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="政策概要" prop="abstractContent">
+                        <el-input v-model="form.abstractContent" type="textarea" :rows="4" placeholder="请输入政策概要"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item class="no-upload-btn" label="附件">
+                        <yhUpload v-model="form.fileList" :limit="10">
+                            <el-button type="primary" icon="upload" size="small"></el-button>
+                        </yhUpload>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+
+        <el-form ref="formRef" :model="form" :rules="rules" label-width="110px">
+            <el-row>
+                <template v-if="mode == 'agree'">
+                    <el-col :span="12">
+                        <el-form-item label="是否入库" prop="isInWh">
+                            <el-radio-group v-model="form.isInWh" @change="form.inWhType = null">
+                                <el-radio v-for="(label, key) in whetherDic" :key="key" :label="label" :value="parseInt(key)"></el-radio>
+                            </el-radio-group>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="分值(0-10)" prop="score">
+                            <el-input-number v-model="form.score" :min="0" :max="10" :step="0.1" :precision="2" :controls="false" placeholder="请输入分值"></el-input-number>
+                        </el-form-item>
+                    </el-col>
+                    <el-col v-if="form.isInWh == 1" :span="12">
+                        <el-form-item label="入库类型" prop="inWhType">
+                            <el-select v-model="form.inWhType" placeholder="请选择入库类型">
+                                <el-option v-for="item in storageTypeDic" :key="item" :label="item" :value="item"></el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+                </template>
+
+                <el-col v-if="mode == 'refuse'" :span="24">
+                    <el-form-item label="意见" prop="remark">
+                        <el-input v-model="form.remark" type="textarea" :rows="4" placeholder="请输入意见"></el-input>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+
+        <template #footer>
+            <template v-if="mode == 'agree' || mode == 'refuse'">
+                <el-button type="primary" @click="submit">确 定</el-button>
+            </template>
+        </template>
+    </el-dialog>
+</template>
+
+<script>
+import API from "@/api/policy/share";
+import { storageTypeDic, whetherDic } from "@/views/policyShare/main";
+
+import yhUpload from "@/components/Upload/index.vue";
+
+export default {
+    emits: ["success", "closed"],
+    
+    components: {
+        yhUpload
+    },
+
+    data() {
+        return {
+            storageTypeDic, whetherDic,
+
+            visible: false,
+            mode: "agree",
+            titleMap: {
+                agree: "考核评分",
+                refuse: "退回意见"
+            },
+            form: {
+                id: null,
+                businessNo: null,
+                status: null,
+                createId: null,
+                createName: null,
+                createTime: null,
+                name: null,
+                companyName: null,
+                deptName: null,
+                zcLevel: null,
+                zcType: null,
+                docNo: null,
+                contactPhone: null,
+                abstractContent: null,
+                score: null,
+                isInWh: 0,
+                inWhType: null,
+                fileList: []
+            },
+
+            rules: {
+                businessNo: [{ required: true }],
+                name: [{ required: true, message: "请输入政策名称" }],
+                zcLevel: [{ required: true, message: "请选择政策等级" }],
+                zcType: [{ required: true, message: "请选择政策类别" }],
+                docNo: [{ required: true, message: "请输入政策文号" }],
+                contactPhone: [{ required: true, message: "请输入联系方式" }],
+                abstractContent: [{ required: true, message: "请输入政策概要" }],
+                score: [{ required: true, message: "请输入分值" }],
+                isInWh: [{ required: true }],
+                inWhType: [{ required: true, message: "请选择入库类型" }],
+                // remark: [{ required: true, message: "请输入退回意见" }]
+            }
+        }
+    },
+
+    methods: {
+        open(mode = "agree") {
+            this.mode = mode;
+            this.visible = true;
+            return this;
+        },
+
+        setData(id) {
+            API.detail(id).then(res => {
+                if (res.code === 200) {
+                    for (const key in this.form) {
+                        if (key == "fileList") this.form[key] = res.data[key].map(file => ({ ...file, name: file.originalName, path: file.fileDomain + "/" + file.fileName }));
+                        else if (key == "isInWh") this.form.isInWh = !!res.data[key] && res.data[key] || 0;
+                        else this.form[key] = res.data[key] || null;
+                    }
+                } else ElMessage.error(res.msg);
+            });
+        },
+  
+        // 表单提交方法
+        submit() {
+            this.$refs.formRef.validate(valid => {
+                if (valid) {
+                    API[this.mode](this.form).then(res => {
+                        if (res.code === 200) {
+                            ElMessage.success("操作成功");
+                            this.visible = false;
+                            this.$emit("success");
+                        } else ElMessage.error(res.msg);
+                    });
+                } else {
+                    return false;
+                }
+            });
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.no-upload-btn :deep(.yh-upload-file) {
+  .el-upload {
+    display: none;
+  }
+
+  .el-upload-list.is-disabled {
+    margin-top: 0;
+  }
+}
+
+.el-input-number {
+  width: 100%;
+
+  :deep(.el-input) .el-input__wrapper {
+    padding: 1px 11px;
+
+    .el-input__inner {
+      text-align: unset;
+    }
+  }
+}
+</style>