浏览代码

政策争取

zhuangyunsheng 1 年之前
父节点
当前提交
2787a7cb75

+ 26 - 6
src/api/policy/share.js

@@ -1,4 +1,6 @@
 import request from "@/utils/request";
+import { useUserStore } from "@/store/user";
+const { userInfo } = useUserStore(); // store 用户
 
 export default {
     get: function (params) {
@@ -28,7 +30,10 @@ export default {
         return request({
             url: "/qdport-zcgx/share/saveDone",
             method: "post",
-            data
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
         })
     },
 
@@ -36,7 +41,10 @@ export default {
         return request({
             url: "/qdport-zcgx/share/update",
             method: "post",
-            data
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
         })
     },
 
@@ -55,7 +63,10 @@ export default {
         return request({
             url: "/qdport-zcgx/share/saveApprove",
             method: "post",
-            data
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
         })
     },
 
@@ -63,7 +74,10 @@ export default {
         return request({
             url: "/qdport-zcgx/share/withdraw",
             method: "post",
-            data
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
         })
     },
 
@@ -71,7 +85,10 @@ export default {
         return request({
             url: "/qdport-zcgx/share/approve",
             method: "post",
-            data
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
         })
     },
 
@@ -79,7 +96,10 @@ export default {
         return request({
             url: "/qdport-zcgx/share/refuse",
             method: "post",
-            data
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
         })
     }
 }

+ 23 - 6
src/api/policy/strive.js

@@ -1,4 +1,6 @@
 import request from "@/utils/request";
+import { useUserStore } from "@/store/user";
+const { userInfo } = useUserStore(); // store 用户
 
 export default {
     get: function (params) {
@@ -28,7 +30,10 @@ export default {
         return request({
             url: "/qdport-zcgx/strive/saveDone",
             method: "post",
-            data
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
         })
     },
 
@@ -36,15 +41,21 @@ export default {
         return request({
             url: "/qdport-zcgx/strive/update",
             method: "post",
-            data
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
         })
     },
 
-    explain: function (data) {
+    explain: function (data) { // 月度情况说明
         return request({
             url: "/qdport-zcgx/strive/updateById",
             method: "post",
-            data
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
         })
     },
 
@@ -63,7 +74,10 @@ export default {
         return request({
             url: "/qdport-zcgx/strive/saveApprove",
             method: "post",
-            data
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
         })
     },
 
@@ -71,7 +85,10 @@ export default {
         return request({
             url: "/qdport-zcgx/strive/withdraw",
             method: "post",
-            data
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
         })
     },
 

+ 24 - 37
src/components/Upload/tableImport.vue

@@ -1,5 +1,5 @@
 <template>
-    <el-upload :class="hasMargin && 'import-upload'"
+    <el-upload ref="uploader"
         action=""
         accept=".xlsx, .xls"
         :limit="1"
@@ -20,9 +20,8 @@
 	export default {
 		props: {
 			url: { type: String, default: "" },
-			hasMargin: { type: Boolean, default: true },
 			maxSize: { type: Number, default: 50 },
-			onSuccess: { type: Function, default: () => { return true } }
+			onSuccess: { type: Function, default: () => true }
 		},
 
 		data() {
@@ -33,6 +32,8 @@
 
 		methods: {
 			before(file) {
+                console.log(this.url)
+                if (!this.url) return false;
 				const maxSize = file.size / 1024 / 1024 < this.maxSize;
 				if (!maxSize) {
 					ElMessage.warning(`上传文件大小不能超过 ${this.maxSize}MB!`);
@@ -42,26 +43,16 @@
 
 			success(res, file) {
 				let os = this.onSuccess(res, file);
-				if (!this.url || os != undefined && os == false) return false;
- 
-                this.loading = ElLoading.service({
-                    lock: true,
-                    text: "导入中请等待…",
-                    spinner: "el-icon-loading",
-                    background: "rgba(0, 0, 0, 0.7)"
-                });
-                Folder.import(this.url, res).then(res => {
-                    if (res.code == 200) {
-                        this.loading && this.loading.close();
-                        ElMessage.success(res.data);
-                        this.$emit("success");
-                    } else ElMessage.error(res.msg);
-                }).catch(() => this.loading && this.loading.close());
+				if (os != undefined && os == false) return false;
+
+                ElMessage.success("导入成功");
+                this.$emit("importSuc");
+                this.$refs.uploader.clearFiles();
 			},
 
 			error(message) {
                 this.loading && this.loading.close();
-				ElNotification.error({ title: "上传文件未成功", message });
+				message && ElNotification.error({ title: "导入文件未成功", message });
 			},
 
 			request(param) {
@@ -74,24 +65,20 @@
 
 				const data = new FormData();
 				data.append(param.filename, param.file);
-
-                Folder.up(data, {
-					onUploadProgress: e => {
-						const percent = parseInt(((e.loaded / e.total) * 100) | 0, 10);
-						param.onProgress({ percent });
-					}
-				}).then(res => {
-                    this.loading && this.loading.close()
-					if (res.code == 200) param.onSuccess(res.data.link);
-					else param.onError(res.msg || "未知错误");
-				}).catch(err => param.onError(err));
+                
+                Folder.up(data).then(upRes => {
+                    if (upRes.code == 200) {
+                        this.loading.setText("导入中请等待…");
+                        Folder.import(this.url, upRes.data.link).then(res => {
+                            this.loading.close();
+                            if (res.code == 200) {
+                                if (res.data.length) param.onError(`有${res.data.length}条数据导入失败,序号为: ${res.data.map(d => d.index).join()}`);
+                                else param.onSuccess(res.data);
+                            } else param.onError(res.msg || "未知错误");
+                        }).catch(() => param.onError());
+                    } else param.onError(upRes.msg || "未知错误");
+				}).catch(() => param.onError());
 			}
 		}
 	}
-</script>
-
-<style lang="scss" scoped>
-.import-upload {
-  margin-right: 12px;
-}
-</style>
+</script>

+ 7 - 7
src/views/manage/policyShare/dialog.vue

@@ -68,6 +68,11 @@
                         </el-radio-group>
                     </el-form-item>
                 </el-col>
+                <el-col :span="12">
+                    <el-form-item label="分值(0-10)">
+                        <el-input-number v-model="form.score" :min="0" :max="10" :step="0.1" :precision="2" controls-position="right" 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="请选择入库类型">
@@ -75,11 +80,6 @@
                         </el-select>
                     </el-form-item>
                 </el-col>
-                <el-col :span="12">
-                    <el-form-item label="分值(0-10)">
-                        <el-input-number v-model="form.score" :min="0" :max="10" :step="0.1" :precision="2" controls-position="right" placeholder="请输入分值"></el-input-number>
-                    </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>
@@ -182,9 +182,9 @@ export default {
                     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 this.form[key] = res.data[key] || null;
+                        } else if (key == "isInWh") this.form.isInWh = !!res.data[key] && res.data[key] || 0;
+                        else this.form[key] = res.data[key] || null;
                     }
-                    this.form.updateId = userInfo.id;
                 } else ElMessage.error(res.msg);
             });
         },

+ 5 - 5
src/views/manage/policyShare/index.vue

@@ -71,15 +71,15 @@
         </div>
     </el-card>
 
-    <policy-detail v-if="dialog" ref="policyDetail" @success="reloadTable" @closed="closed"></policy-detail>
+    <policy-detail v-if="dialog" ref="policyDetail" isMaster @success="reloadTable" @closed="closed"></policy-detail>
 </template>
 
 <script>
 import API from "@/api/policy/share"
 import { exportExcel } from "@/utils/exportExcel";
-import { columns, levelDic, typeDic, storageTypeDic, whetherDic, statusDic } from "@/views/policyShare/main";
+import { columns, levelDic, typeDic, storageTypeDic, whetherDic } from "@/views/policyShare/main";
 import yhPagination from "@/components/Pagination/index.vue";
-import policyDetail from "./dialog.vue";
+import policyDetail from "@/views/policyShare/dialog.vue";
 
 export default {
     components: {
@@ -90,7 +90,7 @@ export default {
     data() {
         return {
             columns: columns.filter(c => c.props != "status"),
-            levelDic, typeDic, storageTypeDic, whetherDic, statusDic,
+            levelDic, typeDic, storageTypeDic, whetherDic,
 
             loading: false,
             createTime: [],
@@ -144,7 +144,7 @@ export default {
 
         table_add() {
             this.dialog = true;
-            this.$nextTick(() => this.$refs.policyDetail.init());
+            this.$nextTick(() => this.$refs.policyDetail.init("saveDone"));
         },
 
         table_edit(row, mode = "edit") {

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

@@ -0,0 +1,123 @@
+<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-position="right" 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(() => {
+                        ElMessage.success("操作成功");
+                        this.visible = false;
+                        this.$emit("success");
+                    });
+                } 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>

+ 46 - 84
src/views/policyShare/dialog.vue

@@ -29,88 +29,62 @@
                 </el-col>
                 <el-col :span="12">
                     <el-form-item label="政策名称" prop="name">
-                        <el-input v-model="form.name" :disabled="isApprove" placeholder="请输入政策名称"></el-input>
+                        <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" :disabled="isApprove" placeholder="请选择政策等级">
+                        <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" :disabled="isApprove" placeholder="请选择政策类别">
+                        <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" :disabled="isApprove" placeholder="请输入政策文号"></el-input>
+                        <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" :disabled="isApprove" placeholder="请输入联系方式"></el-input>
+                        <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" :disabled="isApprove" placeholder="请输入政策概要"></el-input>
+                        <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' || isApprove) && 'no-upload-btn'" label="附件">
-                        <yhUpload v-model="form.fileList" :limit="10" :disabled="isApprove" @updateTable="fileIsDel = true">
+                    <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>
-
-            <template v-if="form.status == 'done' || mode == 'agree'">
-                <div>审核详情</div>
-                <el-row>
-                    <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 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>
-                    <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-position="right" placeholder="请输入分值"></el-input-number>
-                        </el-form-item>
-                    </el-col>
-                </el-row>
-            </template>
-            <template v-if="form.status == 'inactive' || mode == 'refuse'">
-                <div>审核详情</div>
-                <el-row>
-                    <el-col :span="24">
-                        <el-form-item label="意见" prop="remark">
-                            <el-input v-model="form.remark" type="textarea" :rows="4" :disabled="mode == 'edit'" placeholder="请输入意见"></el-input>
-                        </el-form-item>
-                    </el-col>
-                </el-row>
-            </template>
         </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="validateForm(mode)">确 定</el-button>
+                <el-button type="primary" @click="policyApprove">确 定</el-button>
             </template>
-            <template v-if="mode == 'add' || mode == 'edit'">
+            <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>
@@ -122,29 +96,36 @@
 import Common from "@/api/common";
 import API from "@/api/policy/share";
 import { useUserStore } from "@/store/user";
-import { levelDic, typeDic, storageTypeDic, whetherDic } from "./main";
+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
+        yhUpload,
+        approveForm
     },
 
     data() {
         return {
-            levelDic, typeDic, storageTypeDic, whetherDic,
+            levelDic, typeDic,
 
             visible: false,
             mode: "add",
+            handler: "agree",
             titleMap: {
                 add: "新增",
+                saveDone: "新增",
                 edit: "编辑",
                 detail: "详情",
-                agree: "考核评分",
-                refuse: "退回意见"
+                decode: "添加解读"
             },
             form: {
                 id: null,
@@ -161,8 +142,9 @@ export default {
                 docNo: null,
                 contactPhone: null,
                 abstractContent: null,
+                decodeContent: null,
                 score: null,
-                isInWh: 0,
+                isInWh: this.isMaster && 1 || 0,
                 inWhType: null,
                 fileList: []
             },
@@ -175,10 +157,7 @@ export default {
                 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: "请输入退回意见" }]
+                decodeContent: [{ required: true, message: "请输入政策解读" }]
             },
 
             fileIsDel: false,
@@ -186,19 +165,14 @@ export default {
         }
     },
 
-    computed: {
-        isApprove() {
-            return this.mode == "agree" || this.mode == "refuse";
-        }
-    },
-
     mounted() {
         this.getUserDept();
     },
 
     methods: {
-        init(mode = "add") {
+        init(mode = "add", handler) {
             this.mode = mode;
+            this.handler = handler;
             this.visible = true;
             return this;
         },
@@ -212,7 +186,6 @@ export default {
                         } else if (key == "isInWh") this.form.isInWh = !!res.data[key] && res.data[key] || 0;
                         else this.form[key] = res.data[key] || null;
                     }
-                    this.form.updateId = userInfo.id;
                 } else ElMessage.error(res.msg);
             });
         },
@@ -227,14 +200,11 @@ export default {
         },
 
         // 表单提交方法
-        validateForm(mode) {
-            this.$refs.formRef.validate(valid => {
-                if (valid) {
-                    this.submit(mode);
-                } else {
-                    return false;
-                }
-            });
+        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) {
@@ -244,6 +214,10 @@ export default {
                 this.fileIsDel = false;
                 this.$emit("success", mode);
             });
+        },
+
+        policyApprove() {
+            this.$refs.approveForm.submit();
         }
     }
 }
@@ -259,16 +233,4 @@ export default {
     margin-top: 0;
   }
 }
-
-.el-input-number {
-  width: 100%;
-
-  :deep(.el-input) .el-input__wrapper {
-    padding: 1px 11px;
-
-    .el-input__inner {
-      text-align: unset;
-    }
-  }
-}
 </style>

+ 13 - 7
src/views/policyShare/index.vue

@@ -48,8 +48,8 @@
                 <el-button type="primary" icon="plus" @click="table_add">新增</el-button>
             </div>
             <div class="tjm_card_tools_right flex-row">
-                <table-import url="policyShare" @success="reloadTable"></table-import>
-                <el-button icon="download" @click="table_export">导出</el-button>
+                <table-import url="policyShare" @importSuc="reloadTable"></table-import>
+                <el-button class="export-btn" icon="download" @click="table_export">导出</el-button>
             </div>
         </div>
         <div class="tjm_card_table">
@@ -83,16 +83,16 @@
 
 <script>
 import API from "@/api/policy/share"
-import { useUserStore } from "@/store/user";
 import { exportExcel } from "@/utils/exportExcel";
 import { columns, levelDic, typeDic, storageTypeDic, whetherDic, statusDic } from "./main";
+
+import tableImport from "@/components/Upload/tableImport.vue";
 import yhPagination from "@/components/Pagination/index.vue";
 import policyDetail from "./dialog.vue";
 
-const { userInfo } = useUserStore(); // store 用户
-
 export default {
     components: {
+        tableImport,
         yhPagination,
         policyDetail
     },
@@ -183,7 +183,7 @@ export default {
                 confirmButtonText: "确定",
                 cancelButtonText: "取消"
             }).then(() => {
-                API[mode]({ ...row, updateId: userInfo.id }).then(res => {
+                API[mode](row).then(res => {
                     if (res.code === 200) {
                         ElMessage.success("操作成功");
                         this.reloadTable();
@@ -205,4 +205,10 @@ export default {
         }
     }
 }
-</script>
+</script>
+
+<style lang="scss" scoped>
+.export-btn {
+  margin-left: 12px;
+}
+</style>

+ 38 - 64
src/views/policyStrive/dialog.vue

@@ -29,93 +29,67 @@
                 </el-col>
                 <el-col :span="12">
                     <el-form-item label="项目名称" prop="name">
-                        <el-input v-model="form.name" :disabled="mode == 'explain'" placeholder="请输入项目名称"></el-input>
+                        <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" :disabled="mode == 'explain'" placeholder="请选择项目等级">
+                        <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" :disabled="mode == 'explain'" placeholder="请选择项目类别">
+                        <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" :disabled="mode == 'explain'" placeholder="请输入政策文号"></el-input>
+                        <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" :disabled="mode == 'explain'" placeholder="请输入联系方式"></el-input>
+                        <el-input v-model="form.contactPhone" placeholder="请输入联系方式"></el-input>
                     </el-form-item>
                 </el-col>
                 <el-col :span="12">
                     <el-form-item label="预计争取金额" prop="yjStriveAmount">
-                        <el-input-number v-model="form.yjStriveAmount" :min="0" :step="0.1" :precision="2" controls-position="right" :disabled="mode == 'explain'" placeholder="请输入预计争取金额"></el-input-number>
+                        <el-input-number v-model="form.yjStriveAmount" :min="0" :step="0.1" :precision="2" controls-position="right" placeholder="请输入预计争取金额"></el-input-number>
                     </el-form-item>
                 </el-col>
                 <el-col :span="12">
                     <el-form-item label="预计完成时间" prop="yjFinishTime">
-                        <el-date-picker v-model="form.yjFinishTime" value-format="YYYY-MM-DD" :disabled="mode == 'explain'" placeholder="请选择预计完成时间"></el-date-picker>
+                        <el-date-picker v-model="form.yjFinishTime" value-format="YYYY-MM-DD" placeholder="请选择预计完成时间"></el-date-picker>
                     </el-form-item>
                 </el-col>
                 <el-col :span="12">
                     <el-form-item label="责任人" prop="directorName">
-                        <el-input v-model="form.directorName" :disabled="mode == 'explain'" placeholder="请输入责任人"></el-input>
+                        <el-input v-model="form.directorName" 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" :disabled="mode == 'explain'" placeholder="请输入项目概要"></el-input>
+                        <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="(mode == 'detail' || mode == 'explain') && 'no-upload-btn'" label="附件">
-                        <yhUpload v-model="form.fileList" :limit="10" :disabled="mode == 'explain'" @updateTable="fileIsDel = true">
+                    <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-row v-if="form.status == 'done'">
-                <el-col :span="12">
-                    <el-form-item label="是否已落地" prop="isLand">
-                        <el-radio-group v-model="form.isLand" @change="form.landAmount = null, form.partPersonArr = 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>
-                <template v-if="form.isLand == 1">
-                    <el-col :span="12">
-                        <el-form-item label="落地金额" prop="landAmount">
-                            <el-input-number v-model="form.landAmount" :min="0" :step="0.1" :precision="2" controls-position="right" placeholder="请输入落地金额"></el-input-number>
-                        </el-form-item>
-                    </el-col>
-                    <el-col :span="24">
-                        <el-form-item label="参与人" prop="partPerson">
-                            <el-input v-model="form.partPerson" type="textarea" :rows="4" placeholder="请输入参与人(以英文 , 分割)"></el-input>
-                        </el-form-item>
-                    </el-col>
-                </template>
-                <el-col :span="24">
-                    <el-form-item class="label-column-2" :label="titleMap['explain']" prop="monthSituation" label-width="80px">
-                        <el-input v-model="form.monthSituation" type="textarea" :rows="4" :placeholder="`请输入${titleMap['explain']}`"></el-input>
-                    </el-form-item>
-                </el-col>
-            </el-row>
         </el-form>
+        <explain-form v-if="mode == 'detail' && form.id" ref="explainForm" :rowData="form" :disabled="!isExplain" @success="visible = false"></explain-form>
 
         <template #footer>
-            <template v-if="mode == 'explain'">
-                <el-button type="primary" @click="validateForm(mode)">保存上报</el-button>
+            <template v-if="isExplain">
+                <el-button type="primary" @click="policyExplain">保存上报</el-button>
             </template>
             <template v-if="mode == 'add' || mode == 'edit'">
                 <el-button type="primary" @click="validateForm(mode)">保 存</el-button>
@@ -129,28 +103,34 @@
 import Common from "@/api/common";
 import API from "@/api/policy/strive";
 import { useUserStore } from "@/store/user";
-import { levelDic, typeDic, whetherDic } from "@/views/policyShare/main";
+import { levelDic, typeDic } from "@/views/policyShare/main";
 import yhUpload from "@/components/Upload/index.vue";
+import explainForm from "@/views/policyStrive/explain.vue";
 
 const { userInfo } = useUserStore(); // store 用户
 
 export default {
     emits: ["success", "closed"],
+    props: {
+        isMaster: { type: Boolean, default: false }
+    },
+    
     components: {
-        yhUpload
+        yhUpload,
+        explainForm
     },
 
     data() {
         return {
-            levelDic, typeDic, whetherDic,
+            levelDic, typeDic,
 
             visible: false,
+            isExplain: false,
             mode: "add",
             titleMap: {
                 add: "新增",
                 edit: "编辑",
-                detail: "详情",
-                explain: "月度争取情况说明"
+                detail: "详情"
             },
             form: {
                 id: null,
@@ -188,11 +168,7 @@ export default {
                 directorName: [{ required: true, message: "请输入责任人" }],
                 yjFinishTime: [{ required: true, message: "请选择预计完成时间" }],
                 yjStriveAmount: [{ required: true, message: "请输入预计争取金额" }],
-                abstractContent: [{ required: true, message: "请输入政策概要" }],
-                isLand: [{ required: true }],
-                landAmount: [{ required: true, message: "请输入落地金额" }],
-                partPerson: [{ required: true, message: "请输入参与人(以英文 , 分割)" }],
-                monthSituation: [{ required: true, message: "请输入月度争取情况" }]
+                abstractContent: [{ required: true, message: "请输入政策概要" }]
             },
 
             fileIsDel: false,
@@ -205,8 +181,9 @@ export default {
     },
 
     methods: {
-        init(mode = "add") {
+        init(mode = "add", isExplain = false) {
             this.mode = mode;
+            this.isExplain = isExplain;
             this.visible = true;
             return this;
         },
@@ -220,7 +197,6 @@ export default {
                         } else if (key == "isLand") this.form.isLand = !!res.data[key] && res.data[key] || 0;
                         else this.form[key] = res.data[key] || null;
                     }
-                    this.form.updateId = userInfo.id;
                     this.form.partPerson = res.data["partPersonArr"] && JSON.parse(res.data["partPersonArr"]).map(item => item.name).join() || null;
                 } else ElMessage.error(res.msg);
             });
@@ -236,17 +212,15 @@ export default {
         },
 
         // 表单提交方法
-        validateForm(mode) {
-            this.$refs.formRef.validate(valid => {
-                if (valid) {
-                    this.submit(mode);
-                } else {
-                    return false;
-                }
-            });
+        async validateForm(mode) {
+            const promiseArray = [this.$refs.formRef.validate()];
+            this.isExplain && promiseArray.push(await this.$refs.explainForm.$refs.formRef.validate());
+            
+            return Promise.all(promiseArray).then(() => this.submit(mode)).catch(() => false);
         },
 			
         submit(mode) {
+            console.log('submit',mode)
             const partPersonArr = this.form.partPerson && JSON.stringify(this.form.partPerson.split(",").map(name => ({ name }))) || "";
             API[mode]({ ...this.form, partPersonArr }).then(() => {
                 ElMessage.success("操作成功");
@@ -254,6 +228,10 @@ export default {
                 this.fileIsDel = false;
                 this.$emit("success", mode);
             });
+        },
+
+        policyExplain() {
+            this.$refs.explainForm.submit();
         }
     }
 }
@@ -281,8 +259,4 @@ export default {
     }
   }
 }
-
-.label-column-2 :deep(.el-form-item__label) {
-  margin-left: 30px;
-}
 </style>

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

@@ -0,0 +1,122 @@
+<template>
+    <el-form v-if="disabled && form.monthSituation || !disabled" ref="formRef" :model="form" :rules="rules" :disabled="disabled" label-width="110px">
+        <div class="dialog-title">月度争取情况说明</div>
+        <el-row>
+            <el-col :span="12">
+                <el-form-item label="是否已落地" prop="isLand">
+                    <el-radio-group v-model="form.isLand" @change="form.landAmount = null, form.partPerson = null, form.partPersonArr = '[]'">
+                        <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>
+            <template v-if="form.isLand == 1">
+                <el-col :span="12">
+                    <el-form-item label="落地金额" prop="landAmount">
+                        <el-input-number v-model="form.landAmount" :min="0" :step="0.1" :precision="2" controls-position="right" placeholder="请输入落地金额"></el-input-number>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="参与人" prop="partPerson">
+                        <el-input v-model="form.partPerson" type="textarea" :rows="4" placeholder="请输入参与人(以英文 , 分割)"></el-input>
+                    </el-form-item>
+                </el-col>
+            </template>
+            <el-col :span="24">
+                <el-form-item class="label-column-2" label="月度争取情况说明" prop="monthSituation" label-width="80px">
+                    <el-input v-model="form.monthSituation" type="textarea" :rows="4" placeholder="请输入月度争取情况说明"></el-input>
+                </el-form-item>
+            </el-col>
+        </el-row>
+    </el-form>
+</template>
+
+<script>
+import API from "@/api/policy/strive";
+import { whetherDic } from "@/views/policyShare/main";
+
+export default {
+    props: {
+        isMaster: { type: Boolean, default: false },
+        disabled: { type: Boolean, default: true },
+        rowData: { type: Object, default: () => {} }
+    },
+
+    data() {
+        return {
+            whetherDic,
+
+            form: {
+                isLand: 0,
+                landAmount: null,
+                partPersonArr: "[]", // [{name: }]
+                partPerson: null, // a1,a2
+                monthSituation: null,
+            },
+
+            rules: {
+                isLand: [{ required: true }],
+                landAmount: [{ required: true, message: "请输入落地金额" }],
+                partPerson: [{ required: true, message: "请输入参与人(以英文 , 分割)" }],
+                monthSituation: [{ 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) {
+                    const partPersonArr = this.form.partPerson && JSON.stringify(this.form.partPerson.split(",").map(name => ({ name }))) || "";
+                    API.explain({ ...this.form, partPersonArr }).then(() => {
+                        ElMessage.success("操作成功");
+                        this.visible = false;
+                        this.$emit("success");
+                    });
+                } 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;
+    }
+  }
+}
+
+.label-column-2 :deep(.el-form-item__label) {
+  margin-left: 30px;
+}
+</style>

+ 24 - 6
src/views/policyStrive/index.vue

@@ -43,8 +43,20 @@
                 <el-button type="primary" icon="plus" @click="table_add">新增</el-button>
             </div>
             <div class="tjm_card_tools_right flex-row">
-                <table-import url="policyStrive" @success="reloadTable"></table-import>
-                <el-button icon="download" @click="table_export">导出</el-button>
+                <el-dropdown>
+                    <el-button icon="upload-filled">导入</el-button>
+                    <template #dropdown>
+                        <el-dropdown-menu>
+                            <el-dropdown-item>
+                                <table-import url="policyStrive" @importSuc="reloadTable">政策争取</table-import>
+                            </el-dropdown-item>
+                            <el-dropdown-item>
+                                <table-import url="policyStriveMonth" @importSuc="reloadTable">月度完成</table-import>
+                            </el-dropdown-item>
+                        </el-dropdown-menu>
+                    </template>
+                </el-dropdown>
+                <el-button class="export-btn" icon="download" @click="table_export">导出</el-button>
             </div>
         </div>
         <div class="tjm_card_table">
@@ -63,7 +75,7 @@
                             <el-button type="primary" link icon="delete" @click="table_del(scope.row)">删除</el-button>
                         </template>
                         <el-button v-if="scope.row.status == 'approve'" type="primary" link icon="refresh-right" @click="table_update(scope.row, 'withdraw')">撤回</el-button>
-                        <el-button v-if="scope.row.status == 'done'" type="primary" link icon="info-filled" @click="table_edit(scope.row, 'explain')">月度争取情况说明</el-button>
+                        <el-button v-if="scope.row.status == 'done'" type="primary" link icon="info-filled" @click="table_edit(scope.row, 'detail', true)">月度争取情况说明</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -152,9 +164,9 @@ export default {
             this.$nextTick(() => this.$refs.policyDetail.init());
         },
 
-        table_edit(row, mode = "edit") {
+        table_edit(row, mode = "edit", isExplain = false) {
             this.dialog = true;
-            this.$nextTick(() => this.$refs.policyDetail.init(mode).setData(row.id));
+            this.$nextTick(() => this.$refs.policyDetail.init(mode, isExplain).setData(row.id));
         },
 
         table_del(row) {
@@ -201,4 +213,10 @@ export default {
         }
     }
 }
-</script>
+</script>
+
+<style lang="scss" scoped>
+.export-btn {
+  margin-left: 12px;
+}
+</style>

+ 2 - 2
src/views/toDo/index.vue

@@ -46,7 +46,7 @@
         </div>
     </el-card>
 
-    <policy-share-detail v-if="dialog" ref="policy_share" @closed="reloadTable(), dialog = false"></policy-share-detail>
+    <policy-share-detail v-if="dialog" ref="policy_share" isApprove @closed="reloadTable(), dialog = false"></policy-share-detail>
 </template>
 
 <script>
@@ -116,7 +116,7 @@ export default {
         table_detail({ refId, refType }, mode = "agree") {
             if (refType == "policy_share") {
                 this.dialog = true;
-                this.$nextTick(() => this.$refs[refType].init(mode).setData(refId));
+                this.$nextTick(() => this.$refs[refType].init("detail", mode).setData(refId));
             }
             if (refType == "policy_strive") {
                 const msg = mode == "agree" && "同意" || "退回";