zhuangyunsheng пре 1 година
родитељ
комит
c30b36eee5

+ 5 - 2
package.json

@@ -20,16 +20,19 @@
         "fuse.js": "^6.6.2",
         "js-cookie": "^3.0.5",
         "mitt": "^3.0.1",
+        "moment": "^2.29.4",
         "pinia": "^2.1.6",
         "pinia-plugin-persist": "^1.0.0",
         "vue": "^3.3.4",
         "vue-i18n": "^9.5.0",
         "vue-router": "^4.2.4",
-		"xlsx-js-style": "^1.2.0"
+        "xlsx-js-style": "^1.2.0"
     },
     "devDependencies": {
         "@iconify-json/ep": "^1.1.12",
+        "@iconify-json/fluent-emoji-high-contrast": "^1.2.1",
         "@iconify-json/mdi": "^1.1.54",
+        "@iconify-json/tabler": "^1.2.5",
         "@rushstack/eslint-patch": "^1.3.3",
         "@vitejs/plugin-vue": "^4.3.4",
         "@vue/eslint-config-prettier": "^8.0.0",
@@ -44,4 +47,4 @@
         "vite": "^4.4.9",
         "vite-plugin-svg-icons": "^2.0.1"
     }
-}
+}

+ 9 - 1
src/api/policy/strive.js

@@ -3,6 +3,14 @@ import { useUserStore } from "@/store/user";
 const { userInfo } = useUserStore(); // store 用户
 
 export default {
+    calculate: function (data) {
+        return request({
+            url: "/qdport-zcgx/strive/calculate",
+            method: "post",
+            data
+        })
+    },
+
     get: function (params) {
         return request({
             url: "/qdport-zcgx/strive/page",
@@ -37,7 +45,7 @@ export default {
         })
     },
 
-    explain: function (data) { // 月度情况说明
+    updateById: function (data) { // 月度情况说明/打分/奖励分配
         return request({
             url: "/qdport-zcgx/strive/updateById",
             method: "post",

+ 42 - 10
src/views/manage/policyStrive/index.vue

@@ -46,14 +46,14 @@
                         <template #default="scope">{{ columnFormat(scope.row, item.props) }}</template>
                     </el-table-column>
                 </template>
-                <el-table-column label="奖励分配人员" width="120">
+                <el-table-column label="操作" fixed="right" width="240">
                     <template #default="scope">
-                        <el-button type="primary" link icon="download" @click="person_distribute">分配</el-button>
-                    </template>
-                </el-table-column>
-                <el-table-column label="操作" fixed="right" width="100">
-                    <template #default="scope">
-                        <el-button type="primary" link icon="edit" @click="table_score(scope.row)">打分</el-button>
+                        <el-button type="primary" link icon="tickets" @click="table_detail(scope.row)">详情</el-button>
+                        <el-button v-if="scope.row.isReward == 0 && scope.row.isLand == 1 && scope.row.rewardRadix" type="primary" link icon="star" @click="table_score(scope.row)">打分</el-button>
+                        <el-button v-if="scope.row.rewardScore" type="primary" link @click="table_reward(scope.row)">
+                            <template #icon><tjm-icon-tabler-arrows-split-2 /></template>
+                            奖励分配
+                        </el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -62,6 +62,10 @@
             <yh-pagination v-model:pageNo="params.page" v-model:pageSize="params.size" :total="total" @paginationChange="reloadTable"></yh-pagination>
         </div>
     </el-card>
+
+    <policy-strive-detail v-if="dialog.detail" ref="policyStriveDetail" @success="reloadTable" @closed="closed"></policy-strive-detail>
+    <policy-strive-score v-if="dialog.score" ref="policyStriveScore" @success="reloadTable" @closed="closed"></policy-strive-score>
+    <policy-strive-reward v-if="dialog.reward" ref="policyStriveReward" @success="reloadTable" @closed="closed"></policy-strive-reward>
 </template>
 
 <script>
@@ -70,10 +74,16 @@ import { exportExcel } from "@/utils/exportExcel";
 import { levelDic, typeDic } from "@/views/policyShare/main";
 import { columns, statusDic } from "./main";
 import yhPagination from "@/components/Pagination/index.vue";
+import policyStriveDetail from "@/views/policyStrive/dialog.vue";
+import policyStriveScore from "./scoreDialog.vue";
+import policyStriveReward from "./rewardDialog.vue";
 
 export default {
     components: {
-        yhPagination
+        yhPagination,
+        policyStriveDetail,
+        policyStriveScore,
+        policyStriveReward
     },
 
     data() {
@@ -89,7 +99,13 @@ export default {
             },
 
             total: 0,
-            tableData: []
+            tableData: [],
+
+            dialog: {
+                detail: false,
+                score: false,
+                reward: false
+            }
         }
     },
 
@@ -99,7 +115,8 @@ export default {
 
     methods: {
         columnFormat(row, props) {
-            if (props == "status") return statusDic[row["isLand"]] || "";
+            if (props == "status") return statusDic[row.isLand] || "";
+            if (props == "landAmount" || props == "rewardRadix") return row.isLand == 1 && row[props] || "";
             return row[props];
         },
 
@@ -133,6 +150,21 @@ export default {
             const data = this.tableData.map(v => this.columns.map(c => c.props).map(j => this.columnFormat(v, j)));
 
             exportExcel(header, data, [], `${this.$route.name}.xlsx`);
+        },
+
+        table_detail(row) {
+            this.dialog.detail = true;
+            this.$nextTick(() => this.$refs.policyStriveDetail.init("detail").setData(row.id));
+        },
+
+        table_score(row) {
+            this.dialog.score = true;
+            this.$nextTick(() => this.$refs.policyStriveScore.init().setData(row));
+        },
+
+        table_reward(row) {
+            this.dialog.reward = true;
+            this.$nextTick(() => this.$refs.policyStriveReward.init().setData(row));
         }
     }
 }

+ 4 - 5
src/views/manage/policyStrive/main.js

@@ -13,12 +13,11 @@ export const columns = [
     { label: "填报部门", props: "deptName" },
     { label: "填报单位", props: "companyName" },
     { label: "联系方式", props: "contactPhone" },
-
     { label: "考核基数", props: "rewardRadix", width: "100" },
-    { label: "实施难易程度", props: "implementScore" },
-    { label: "复制推广潜力", props: "promotionScore" },
-    { label: "政策争取效果", props: "striveScore" },
-    { label: "奖励标准", props: "rewardScore" }
+    { label: "实施难易程度", props: "implementScore", width: "120" },
+    { label: "复制推广潜力", props: "promotionScore", width: "120" },
+    { label: "政策争取效果", props: "striveScore", width: "120" },
+    { label: "奖励标准", props: "rewardScore", width: "120" }
 ]
 
 export const statusDic = {

+ 107 - 0
src/views/manage/policyStrive/rewardDialog.vue

@@ -0,0 +1,107 @@
+<template>
+    <el-dialog v-model="visible" title="奖励分配人员" width="700" @closed="$emit('closed')">
+        <el-form ref="formRef" :model="form" :rules="rules" :disabled="disabled" label-width="110px">
+            <el-row>
+                <el-col :span="12">
+                    <el-form-item label="奖励标准">
+						<el-input-number v-model="form.rewardScore" readonly :precision="2" :controls="false"></el-input-number>
+                    </el-form-item>
+                </el-col>
+
+                <el-col :span="24">
+                    <el-form-item label="参与人" prop="partPerson">
+                        <el-table header-cell-class-name="tjm_card_table_header" :data="form.partPerson" border>
+			                <el-table-column label="参与人" prop="name"></el-table-column>
+			                <el-table-column label="奖励分配" prop="reward">
+                                <template #default="scope">
+                                    <el-input-number v-model="scope.row.reward" :min="0" :max="form.rewardScore" :step="0.1" :precision="2" :controls="false"></el-input-number>
+                                </template>
+                            </el-table-column>
+                        </el-table>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+
+        <template #footer>
+            <el-button type="primary" @click="submit">确 定</el-button>
+        </template>
+    </el-dialog>
+</template>
+
+<script>
+import API from "@/api/policy/strive";
+
+export default {
+    emits: ["success", "closed"],
+    props: {
+        disabled: { type: Boolean, default: false }
+    },
+
+    data() {
+        return {
+            visible: false,
+
+            form: {
+                id: null,
+                rewardScore: null,
+                partPersonArr: "[]",
+                partPerson: []
+            },
+
+            rules: {
+                partPerson: [{ required: true, message: "请分配奖励" },
+                    { validator: (rule, value, callback) => {
+                        if (value.findIndex(v => !v.reward) != -1) return callback(new Error("请分配奖励"));
+                        callback();
+                    }}
+                ],
+            }
+        }
+    },
+
+    methods: {
+        init() {
+            this.visible = true;
+            return this;
+        },
+
+        setData(data) {
+            for (const key in this.form) {
+                this.form[key] = data[key] || null;
+            }
+
+            this.form.partPerson = data["partPersonArr"] && JSON.parse(data["partPersonArr"]) || [];
+        },
+
+        // 表单提交方法
+        submit() {
+            this.$refs.formRef.validate(valid => {
+                if (valid) {
+                    API.updateById({ ...this.form, isReward: 1, partPersonArr: JSON.stringify(this.form.partPerson) }).then(() => {
+                        ElMessage.success("操作成功");
+                        this.visible = false;
+                        this.$emit("success");
+                    });
+                } else {
+                    return false;
+                }
+            });
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.el-input-number {
+  width: 100%;
+
+  :deep(.el-input) .el-input__wrapper {
+    padding: 1px 11px;
+
+    .el-input__inner {
+      text-align: unset;
+    }
+  }
+}
+</style>

+ 131 - 0
src/views/manage/policyStrive/scoreDialog.vue

@@ -0,0 +1,131 @@
+<template>
+    <el-dialog v-model="visible" title="政策考核评分" width="700" @closed="$emit('closed')">
+        <el-form ref="formRef" :model="form" :rules="rules" :disabled="disabled" label-width="110px">
+            <el-row>
+                <el-col :span="12">
+                    <el-form-item label="落地金额">
+						<el-input-number v-model="form.landAmount" readonly :precision="2" :controls="false"></el-input-number>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="考核基数">
+						<el-input-number v-model="form.rewardRadix" readonly :controls="false"></el-input-number>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="实施难易程度" prop="implementScore">
+                        <el-input-number v-model="form.implementScore" :min="0" :max="1" :step="0.1" :precision="2" :controls="false" placeholder="实施难易程度" @change="calcWeight"></el-input-number>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="复制推广潜力" prop="promotionScore">
+                        <el-input-number v-model="form.promotionScore" :min="0" :max="1" :step="0.1" :precision="2" :controls="false" placeholder="复制推广潜力" @change="calcWeight"></el-input-number>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="政策争取效果" prop="striveScore">
+                        <el-input-number v-model="form.striveScore" :min="0" :max="1" :step="0.1" :precision="2" :controls="false" placeholder="政策争取效果" @change="calcWeight"></el-input-number>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="奖励标准" prop="rewardScore">
+						<el-input-number v-model="form.rewardScore" readonly :controls="false"></el-input-number>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+
+        <template #footer>
+            <el-button type="primary" @click="submit">确 定</el-button>
+        </template>
+    </el-dialog>
+</template>
+
+<script>
+import API from "@/api/policy/strive";
+
+export default {
+    emits: ["success", "closed"],
+    props: {
+        disabled: { type: Boolean, default: false }
+    },
+
+    data() {
+        return {
+            visible: false,
+
+            form: {
+                id: null,
+                landAmount: null,
+                rewardRadix: null,
+                implementScore: null,
+                promotionScore: null,
+                striveScore: null,
+                rewardScore: null
+            },
+
+            rules: {
+                implementScore: [{ required: true, message: "请输入分值" }],
+                promotionScore: [{ required: true, message: "请输入分值" }],
+                striveScore: [{ required: true, message: "请输入分值" }]
+            }
+        }
+    },
+
+    methods: {
+        init() {
+            this.visible = true;
+            return this;
+        },
+
+        setData(data) {
+            for (const key in this.form) {
+                this.form[key] = data[key] || null;
+            }
+
+            this.calcWeight();
+        },
+
+        calcWeight() {
+            API.calculate({
+                rewardRadix: !!this.form.rewardRadix && this.form.rewardRadix || 0,
+                implementScore: !!this.form.implementScore && this.form.implementScore || 0,
+                promotionScore: !!this.form.promotionScore && this.form.promotionScore || 0,
+                striveScore: !!this.form.striveScore && this.form.striveScore || 0
+            }).then(res => {
+                if (res.code === 200) this.form.rewardScore = res.data != 0 && res.data || null;
+                else this.form.rewardScore = null;
+            }).catch(() => this.form.rewardScore = null);
+        },
+
+        // 表单提交方法
+        submit() {
+            this.$refs.formRef.validate(valid => {
+                if (valid) {
+                    API.updateById({ ...this.form }).then(() => {
+                        ElMessage.success("操作成功");
+                        this.visible = false;
+                        this.$emit("success");
+                    });
+                } else {
+                    return false;
+                }
+            });
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.el-input-number {
+  width: 100%;
+
+  :deep(.el-input) .el-input__wrapper {
+    padding: 1px 11px;
+
+    .el-input__inner {
+      text-align: unset;
+    }
+  }
+}
+</style>

+ 56 - 21
src/views/policyStrive/dialog.vue

@@ -1,5 +1,5 @@
 <template>
-    <el-dialog v-model="visible" :title="titleMap[mode]" :width="680" @closed="$emit('closed', fileIsDel)">
+    <el-dialog v-model="visible" :title="titleMap[mode]" width="700" top="5vh" @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">
@@ -76,6 +76,20 @@
                         <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 label="政策考核类别" prop="rewardType">
+                        <el-collapse v-model="activeNames">
+                            <el-radio-group v-model="form.rewardType">
+                                <el-collapse-item v-for="(item, key) in rewardTypeDic" :key="key" :name="key + 1">
+                                    <template #title>
+                                        <el-radio :label="item.label" :value="key + 1"></el-radio>
+                                    </template>
+                                    {{ item.value }}
+                                </el-collapse-item>
+                            </el-radio-group>
+                        </el-collapse>
+                    </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">
@@ -85,25 +99,27 @@
                 </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>
+        <explain-form v-if="mode == 'detail' && form.id" ref="explainForm" :rowData="form" :disabled="!isExplain" @success="visible = false, $emit('success')"></explain-form>
 
         <template #footer>
             <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>
-                <el-button type="primary" @click="validateForm('saveApprove')">直接上报</el-button>
+                <el-button type="primary" @click="submit(mode)">保 存</el-button>
+                <el-button type="primary" @click="submit('saveApprove')">直接上报</el-button>
             </template>
         </template>
     </el-dialog>
 </template>
 
 <script>
+import moment from "moment";
 import Common from "@/api/common";
 import API from "@/api/policy/strive";
 import { useUserStore } from "@/store/user";
 import { levelDic, typeDic } from "@/views/policyShare/main";
+import { rewardTypeDic } from "@/views/policyStrive/main";
 import yhUpload from "@/components/Upload/index.vue";
 import explainForm from "@/views/policyStrive/explain.vue";
 
@@ -122,7 +138,8 @@ export default {
 
     data() {
         return {
-            levelDic, typeDic,
+            levelDic, typeDic, rewardTypeDic,
+            activeNames: [],
 
             visible: false,
             isExplain: false,
@@ -150,8 +167,10 @@ export default {
                 yjFinishTime: null,
                 yjStriveAmount: null,
                 abstractContent: null,
+                rewardType: null,
                 isLand: 0,
                 landAmount: null,
+                sjFinishTime: null,
                 partPersonArr: "[]", // [{name: }]
                 partPerson: null, // a1,a2
                 monthSituation: null,
@@ -168,7 +187,8 @@ export default {
                 directorName: [{ required: true, message: "请输入责任人" }],
                 yjFinishTime: [{ required: true, message: "请选择预计完成时间" }],
                 yjStriveAmount: [{ required: true, message: "请输入预计争取金额" }],
-                abstractContent: [{ required: true, message: "请输入政策概要" }]
+                rewardType: [{ required: true, message: "请选择政策考核类别" }],
+                abstractContent: [{ required: true, message: "请输入政策概要" }],
             },
 
             fileIsDel: false,
@@ -197,7 +217,11 @@ export default {
                         } else if (key == "isLand") this.form.isLand = !!res.data[key] && res.data[key] || 0;
                         else this.form[key] = res.data[key] || null;
                     }
+                    res.data["rewardType"] && this.activeNames.push(res.data["rewardType"]);
+                    if (this.isExplain && !res.data["sjFinishTime"]) this.form.sjFinishTime = moment().format("YYYY-MM-DD");
                     this.form.partPerson = res.data["partPersonArr"] && JSON.parse(res.data["partPersonArr"]).map(item => item.name).join() || null;
+
+                    this.$nextTick(() => this.isExplain && this.$refs.explainForm && this.$refs.explainForm.$el.scrollIntoView({ block: "center" }));
                 } else ElMessage.error(res.msg);
             });
         },
@@ -212,24 +236,22 @@ export default {
         },
 
         // 表单提交方法
-        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("操作成功");
-                this.visible = false;
-                this.fileIsDel = false;
-                this.$emit("success", mode);
+            this.$refs.formRef.validate(valid => {
+                if (valid) {
+                    const partPersonArr = this.form.partPerson && JSON.stringify(this.form.partPerson.split(",").map(name => ({ name }))) || "";
+                    API[mode]({ ...this.form, partPersonArr }).then(() => {
+                        ElMessage.success("操作成功");
+                        this.visible = false;
+                        this.fileIsDel = false;
+                        this.$emit("success", mode);
+                    });
+                } else {
+                    return false;
+                }
             });
         },
-
+			
         policyExplain() {
             this.$refs.explainForm.submit();
         }
@@ -259,4 +281,17 @@ export default {
     }
   }
 }
+
+.el-collapse .el-radio-group {
+  display: block;
+
+  .el-radio {
+    margin-right: 0;
+    text-align: left;
+
+    :deep(.el-radio__label) {
+      line-height: 1;
+    }
+  }
+}
 </style>

+ 9 - 2
src/views/policyStrive/explain.vue

@@ -15,6 +15,11 @@
                         <el-input-number v-model="form.landAmount" :min="0" :step="0.1" :precision="2" :controls="false" placeholder="请输入落地金额"></el-input-number>
                     </el-form-item>
                 </el-col>
+                <el-col :span="12">
+                    <el-form-item label="实际完成时间" prop="sjFinishTime">
+                        <el-date-picker v-model="form.sjFinishTime" value-format="YYYY-MM-DD" placeholder="请选择实际完成时间"></el-date-picker>
+                    </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>
@@ -49,13 +54,15 @@ export default {
                 isLand: 0,
                 landAmount: null,
                 partPersonArr: "[]", // [{name: }]
+                sjFinishTime: null,
                 partPerson: null, // a1,a2
-                monthSituation: null,
+                monthSituation: null
             },
 
             rules: {
                 isLand: [{ required: true }],
                 landAmount: [{ required: true, message: "请输入落地金额" }],
+                sjFinishTime: [{ required: true, message: "请选择时实际完成时间" }],
                 partPerson: [{ required: true, message: "请输入参与人(以英文 , 分割)" }],
                 monthSituation: [{ required: true, message: "请输入月度争取情况" }]
             },
@@ -82,7 +89,7 @@ export default {
             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(() => {
+                    API.updateById({ ...this.form, partPersonArr }).then(() => {
                         ElMessage.success("操作成功");
                         this.visible = false;
                         this.$emit("success");

Разлика између датотеке није приказан због своје велике величине
+ 19 - 0
src/views/policyStrive/main.js