Преглед на файлове

履职任务实现无周期

jiawuxian преди 1 година
родител
ревизия
9d03566d53

+ 22 - 0
src/api/resumption/plan.js

@@ -51,6 +51,15 @@ export function get(id) {
     method: 'get'
   })
 }
+
+// 查询【请填写功能名称】详细
+export function getDetail(id) {
+  return request({
+    url: '/core/api/plan/find/detail/' + id,
+    method: 'get'
+  })
+}
+
 // immediateEffect:使用中、停用状态下编辑时有效
 export function update(data,immediateEffect) {
   return request({
@@ -67,3 +76,16 @@ export function del(id) {
     method: 'delete'
   })
 }
+
+/**
+ * 获取指定机构的行社
+ * @param {} planId 
+ * @returns 
+ */
+export function getDesignateHangshe(planId){
+  return request({
+    url: '/core/api/plan/designatehangshe/' + planId,
+    method: 'get',
+    showLoading:true
+  })
+}

+ 27 - 11
src/views/resumption/plan/dialog.detail.vue

@@ -6,23 +6,37 @@
           formData.planName
         }}</el-descriptions-item>
         <el-descriptions-item label="任务类型">{{
-          getLabel(dict.type.resumption_plan_type,formData.planType)          
+          getLabel(dict.type.resumption_plan_type, formData.planType)
         }}</el-descriptions-item>
         <el-descriptions-item label="任务周期">{{
-           getLabel(dict.type.resumption_plan_cycle,formData.planCycle)
+          getLabel(dict.type.resumption_plan_cycle, formData.planCycle)
         }}</el-descriptions-item>
         <el-descriptions-item label="任务时间">{{
-          getLabel(dict.type.resumption_plan_exec,formData.planExec)
+          getLabel(dict.type.resumption_plan_exec, formData.planExec)
         }}</el-descriptions-item>
         <el-descriptions-item label="机构类型">{{
-          getLabel(orgTypeOptions,formData.execOrgType)
+          getLabel(orgTypeOptions, formData.execOrgType)
         }}</el-descriptions-item>
         <el-descriptions-item label="履职人员">
-          {{resumptionRoles.filter(r=>formData.roleList.includes(r.id)).map(r=>r.name).join("、")}}
+          {{
+            resumptionRoles
+              .filter((r) => formData.roleList.includes(r.id))
+              .map((r) => r.name)
+              .join("、")
+          }}
         </el-descriptions-item>
-        <el-descriptions-item label="任务次数"  :span="2">{{
+        <el-descriptions-item label="任务次数" :span="formData.planCycle == 0?1:2">{{
           formData.count
         }}</el-descriptions-item>
+        <el-descriptions-item label="开始时间" v-if="formData.planCycle == 0">{{
+          dayjs(formData.startDate).format("YYYY-MM-DD")
+        }}</el-descriptions-item>
+        <el-descriptions-item label="开始时间" v-if="formData.planCycle == 0">{{
+          dayjs(formData.endDate).format("YYYY-MM-DD")
+        }}</el-descriptions-item>
+        <el-descriptions-item label="履职机构" :span="4">{{
+          formData.orgs ? formData.orgs.map((o) => o.name).join("、") : ""
+        }}</el-descriptions-item>
         <el-descriptions-item label="备注" :span="4">{{
           formData.note
         }}</el-descriptions-item>
@@ -52,7 +66,7 @@
           </template>
         </el-table-column>
       </el-table>
-      <div slot="footer" class="dialog-footer" style="margin-top:20px">       
+      <div slot="footer" class="dialog-footer" style="margin-top: 20px">
         <el-button @click="onHide">关闭</el-button>
       </div>
     </DialogCom>
@@ -63,6 +77,7 @@
 import { findAllRole } from "@/api/system/role";
 import * as api from "@/api/resumption/plan";
 import { getLabel } from "@/views/commonOption.js";
+import dayjs from "dayjs";
 export default {
   dicts: [
     "resumption_plan_type",
@@ -85,16 +100,17 @@ export default {
       isShow: false,
       tableData: [],
       formData: {
-        roleList:[]
+        roleList: [],
       },
-      resumptionRoles:[],
+      resumptionRoles: [],
     };
   },
   methods: {
     getLabel,
+    dayjs,
     show(id) {
       this.tableData = null;
-      api.get(id).then((r) => {
+      api.getDetail(id).then((r) => {
         this.formData = r.data;
         this.tableData = r.data.itemList;
         this.isShow = true;
@@ -108,7 +124,7 @@ export default {
         let params = {
           orgType: this.formData.execOrgType,
         };
-        debugger
+
         findAllRole(params).then((res) => {
           this.resumptionRoles = res.data;
         });

+ 132 - 58
src/views/resumption/plan/dialog.edit.vue

@@ -26,7 +26,7 @@
                   name="planName"
                   placeholder="请输入任务名称"
                   clearable
-                  style="width: 217px;max-height:33px"
+                  style="width: 217px; max-height: 33px"
                 />
               </el-form-item>
             </el-col>
@@ -96,34 +96,57 @@
                 </el-select>
               </el-form-item>
             </el-col>
-            <!-- <el-col :span="6">
-              <el-form-item prop="planStatus" label="计划状态:"> -->
-            <!-- <el-select
-                  :disabled="getDistributePlanStatus()"
-                  prop="planStatus"
-                  label="计划状态"
-                  v-model="formData.planStatus"
-                  placeholder="请选择计划状态"
-                  clearable
-                >
-                  <el-option
-                    v-for="item in dict.type.resumption_plan_status"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select> -->
-            <!-- <el-switch
-                  v-model="formData.planStatus"
-                  active-value="1"
-                  inactive-value="0"
-                ></el-switch> -->
-            <!-- </el-form-item> -->
-            <!-- </el-col> -->
           </el-row>
           <el-row>
             <el-col :span="6">
+              <el-form-item prop="count" label="任务次数:">
+                <el-input-number
+                  :disabled="cannotEdit()"
+                  v-model="formData.count"
+                  controls-position="right"
+                  @change="handleChange"
+                  :min="parentCount"
+                  :max="9"
+                  style="width: 217px"
+                ></el-input-number>
+              </el-form-item> </el-col
+            ><el-col :span="6">
+              <el-form-item
+                prop="startDate"
+                label="开始时间:"
+                v-if="formData.planCycle == 0"
+              >
+                <el-date-picker
+                  :disabled="cannotEdit()"
+                  v-model="formData.startDate"
+                  style="width: 217px"
+                  value-format="yyyy-MM-dd 00:00:00"
+                  placeholder="请选择开始时间"
+                  type="date"
+                  :clearable="false"
+                  :picker-options="datepickerOptions"
+                ></el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item
+                prop="endDate"
+                label="结束时间:"
+                v-if="formData.planCycle == 0"
+              >
+                <el-date-picker
+                  :disabled="cannotEdit()"
+                  v-model="formData.endDate"
+                  style="width: 217px"
+                  value-format="yyyy-MM-dd 23:59:59"
+                  placeholder="请选择结束时间"
+                  type="date"
+                  :clearable="false"
+                  :picker-options="datepickerOptions"
+                ></el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
               <el-form-item prop="execOrgType" label="机构类型:">
                 <el-select
                   :disabled="cannotEdit()"
@@ -163,18 +186,29 @@
                 </el-select>
               </el-form-item>
             </el-col>
-
             <el-col :span="6">
-              <el-form-item prop="count" label="任务次数:">
-                <el-input-number
+              <el-form-item :span="6" prop="checkOrgIds" label="履职机构">
+                <org-tree-select
                   :disabled="cannotEdit()"
-                  style="margin-left: 10px"
-                  v-model="formData.count"
-                  controls-position="right"
-                  @change="handleChange"
-                  :min="parentCount"
-                  :max="9"
-                ></el-input-number>
+                  v-model="formData.orgList"
+                  class="org-selector"
+                  :queryData="parseInt(formData.execOrgType)"
+                  :enabledCheckOrgTypes="parseInt(formData.execOrgType)"
+                  :disable="true"
+                >
+                </org-tree-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12" v-if="formData.planCycle==0">
+              <el-form-item prop="note" label="备注">
+                <el-input
+                  :disabled="cannotEdit()"
+                  v-model="formData.note"
+                  :maxlength="255"
+                  clearable
+                  placeholder="请输入备注"
+                  style="width:calc(100% - 17px)"
+                />
               </el-form-item>
             </el-col>
             <!-- <el-col :span="6">
@@ -195,26 +229,31 @@
               </el-form-item>
             </el-col> -->
           </el-row>
-          <el-form-item prop="note" label="备注">
-            <el-input
-              :disabled="cannotEdit()"
-              v-model="formData.note"
-              :maxlength="255"
-              clearable
-              placeholder="请输入备注"
-            />
-          </el-form-item>
+              <el-form-item prop="note" label="备注" v-if="formData.planCycle!=0">
+                <el-input
+                  :disabled="cannotEdit()"
+                  v-model="formData.note"
+                  :maxlength="255"
+                  clearable
+                  placeholder="请输入备注"
+                  style="width:calc(100% - 17px)"
+                />
+              </el-form-item>
+            
         </el-form>
-        <el-button
-          @click="openSelect"
-          v-if="formData.id == null || formData.planOfOrgId == orgId"
-          ><span class="requiredlabel">选择履职内容</span></el-button
-        >
-        <el-button
-          @click="deleteSelected"
-          v-if="formData.id == null || formData.planOfOrgId == orgId"
-          >批量删除</el-button
-        >
+        <div style="margin-bottom: 10px">
+          <el-button
+            @click="openSelect"
+            v-if="formData.id == null || formData.planOfOrgId == orgId"
+            ><span class="requiredlabel">选择履职内容</span></el-button
+          >
+          <el-button
+            @click="deleteSelected"
+            v-if="formData.id == null || formData.planOfOrgId == orgId"
+            >批量删除</el-button
+          >
+        </div>
+
         <el-table
           :data="tableData"
           style="width: 100%"
@@ -291,7 +330,7 @@
         </el-table>
       </div>
 
-      <div slot="footer" class="dialog-footer">
+      <div slot="footer" class="dialog-footer" style="margin-top: 10px">
         <el-button type="primary" @click="onSubmit">确定</el-button>
         <el-button @click="onHide">取消</el-button>
       </div>
@@ -313,6 +352,7 @@ import { statusOptions } from "./../../commonOption";
 import { findAllRole } from "@/api/system/role";
 import DialogSelect from "@/views/resumption/ruleManager/dialog.select.point.vue";
 import DialogThreeState from "@/components/message/threeStateMessageBox.vue";
+import OrgTreeSelect from "@/components/orgTreeSelect";
 export default {
   dicts: [
     "resumption_plan_type",
@@ -399,8 +439,17 @@ export default {
         ],
         planExec: [{ required: true, message: "请选择任务时间" }],
         count: [{ required: true, message: "请选择任务次数" }],
+        startDate: [{ required: true, message: "请选择开始时间" }],
+        endDate: [{ required: true, message: "请选择结束时间" }],
       },
       statusOptions: statusOptions,
+      datepickerOptions: {
+        disabledDate(time) {
+          const date = new Date();
+          date.setTime(date.getTime() - 3600 * 1000 * 24);
+          return time.getTime() < date;
+        },
+      },
     };
   },
   props: {
@@ -523,6 +572,10 @@ export default {
         return false;
       }
 
+      if (this.formData.planCycle == 0 && this.formData.taskHasCompleted == 1) {
+        return true;
+      }
+
       if (this.formData.planOfOrgId != this.orgId) {
         return true;
       }
@@ -537,6 +590,10 @@ export default {
         return false;
       }
 
+      if (this.formData.planCycle == 0 && this.formData.taskHasCompleted == 1) {
+        return true;
+      }
+
       let r =
         this.formData.planOfOrgId != this.orgId ||
         this.formData.planCreateOrgId != this.orgId;
@@ -844,7 +901,6 @@ export default {
         // this.formData.planStatus = 0;
         // this.isSubmitting = true;
         // this.formData.note = this.formData.description;
-       
 
         this.formData.itemList = this.tableData == null ? [] : this.tableData;
         //新需求,自动填充角色
@@ -860,6 +916,13 @@ export default {
         // this.formData.roleList =
         //   this.selectedValues.length == 0 ? null : this.selectedValues;
         //停用、使用中编辑
+        if (
+          this.formData.planCycle == "0" &&
+          dayjs(this.formData.endDate).isBefore(this.formData.startDate)
+        ) {
+          this.$message.info("开始时间不能晚于结束时间");
+          return;
+        }
 
         if (this.formData.planStatus == "1") {
           let msg;
@@ -915,7 +978,7 @@ export default {
     //apimark//
   },
   mounted() {},
-  components: { DialogSelect, DialogThreeState },
+  components: { DialogSelect, DialogThreeState, OrgTreeSelect },
 };
 </script>
 
@@ -935,4 +998,15 @@ export default {
   display: flex;
   align-items: center;
 }
+.org-selector {
+  ::v-deep .el-popover__reference-wrapper {
+    display: flex;
+    width: 100%;
+  }
+  ::v-deep .tags-box {
+    width: calc(100% - 18px) !important;
+    min-height: 33px;
+    max-height: 33px !important;
+  }
+}
 </style>

+ 38 - 21
src/views/resumption/plan/distribute.vue

@@ -9,7 +9,7 @@
     append-to-body
   >
     <div class="el-dialog-div">
-      <el-row :gutter="10" >
+      <el-row :gutter="10">
         <el-col :span="1.5">
           <el-input
             size="mini"
@@ -38,7 +38,12 @@
           >
         </el-col>
       </el-row>
-      <el-table :data="tableData" height="400px" size="small" v-loading="loading">
+      <el-table
+        :data="tableData"
+        height="400px"
+        size="small"
+        v-loading="loading"
+      >
         <el-table-column type="index" label="序号" width="80"></el-table-column>
         <el-table-column prop="orgName" label="机构名称"></el-table-column>
         <el-table-column prop="status" label="计划状态" width="150px">
@@ -66,17 +71,17 @@
 </template>
 <script>
 import { listByTypes } from "@/api/system/org.js";
-
+import { getDesignateHangshe } from "@/api/resumption/plan.js";
 export default {
   components: {},
   data() {
     return {
       isShow: false,
-      loading:false,
+      loading: false,
       info: this.emptyInfo(),
       tableData: [],
       filterName: null,
-      plan:null
+      plan: null,
     };
   },
   computed: {},
@@ -91,21 +96,33 @@ export default {
   },
   methods: {
     show(plan) {
-      this.plan=plan
-      this.isShow = true;
-      this.loading=true;
+      this.plan = plan;
+
       this.info.id = plan.id;
-      listByTypes({
-        orgId: plan.planCreateOrgId,
-        orgTypes: ["3"],
-      }).then((r) => {
-        this.loading=false;
-        this.info.orgAndStatus = r.data.map((d) => {
-          return { orgId: d.id, orgName: d.shortName, status: "1" };
-        });
-        this.tableData = this.info.orgAndStatus;
-      }).catch(()=>{
-        this.loading=false;
+      getDesignateHangshe(plan.id).then((r) => {
+        if (r.data && r.data.length > 0) {
+          this.info.orgAndStatus = r.data.map((d) => {
+            return { orgId: d.id, orgName: d.shortName, status: "1" };
+          });
+          this.$emit("select", this.info, plan);
+        } else {
+          this.isShow = true;
+          this.loading = true;
+          listByTypes({
+            orgId: plan.planCreateOrgId,
+            orgTypes: ["3"],
+          })
+            .then((r) => {
+              this.loading = false;
+              this.info.orgAndStatus = r.data.map((d) => {
+                return { orgId: d.id, orgName: d.shortName, status: "1" };
+              });
+              this.tableData = this.info.orgAndStatus;
+            })
+            .catch(() => {
+              this.loading = false;
+            });
+        }
       });
     },
     handleAllStatus(status) {
@@ -124,12 +141,12 @@ export default {
     },
     onHide() {
       this.info = this.emptyInfo();
-      this.filterName=null;
+      this.filterName = null;
       this.isShow = false;
     },
     onSubmit() {
       console.info(this.info);
-      this.$emit("select", this.info,this.plan);
+      this.$emit("select", this.info, this.plan);
       this.onHide();
     },
     emptyInfo() {

+ 80 - 41
src/views/resumption/plan/index.vue

@@ -166,13 +166,14 @@
               align="center"
               width="80px"
               v-if="columns[0].visible"
-            ><template slot-scope="scope">
+              ><template slot-scope="scope">
                 {{
                   (queryParams.pageNum - 1) * queryParams.pageSize +
                   scope.$index +
                   1
                 }}
-              </template></el-table-column>
+              </template></el-table-column
+            >
             <el-table-column
               prop="planName"
               align="center"
@@ -294,7 +295,12 @@
               v-if="false"
             ></el-table-column>
 
-            <el-table-column fixed="right" align="center" width="210" label="操作">
+            <el-table-column
+              fixed="right"
+              align="center"
+              width="210"
+              label="操作"
+            >
               <template slot-scope="r">
                 <el-button
                   size="mini"
@@ -395,7 +401,7 @@ export default {
     OrgTree,
     DialogDistribute,
     DialogThreeState,
-    DialogDetail
+    DialogDetail,
   },
   data() {
     const { params, query } = this.$route;
@@ -538,6 +544,14 @@ export default {
     // },
     //开始撤回
     chhuile(row) {
+      if (row.planCycle == "0" && row.taskHasCompleted == 1) {
+        //无周期任务有已完成时,不能撤回
+        this.$modal.alertSuccess(
+          "存在已完成任务,无周期任务不允许撤回,如需删除下发任务请点击“删除”。"
+        );
+        return;
+      }
+
       let msg = "";
       if (row.taskHasCompleted != 1) {
         msg = "因不存在已完成任务,撤回后将删除所有生成任务?";
@@ -570,23 +584,36 @@ export default {
     sel(selectList, row) {
       let msg = "";
       if (row.planStatus == 0) {
-        msg = "请选择下发后立即生成或下周期生成任务。";
-        this.$refs["DialogThreeState"].show(
-          msg,
-          (state) => {
-            if (state == 0 || state == 1) {
-              this.distributeInner(selectList, state == 1);
+        if (row.planCycle == 0) {
+          //无周期任务,
+          msg = "确定下发任务并立即生成任务?";
+          this.$modal.confirm(msg).then(() => {
+            this.distributeInner(selectList, true);
+          });
+        } else {
+          msg = "请选择下发后立即生成或下周期生成任务。";
+          this.$refs["DialogThreeState"].show(
+            msg,
+            (state) => {
+              if (state == 0 || state == 1) {
+                this.distributeInner(selectList, state == 1);
+              }
+            },
+            {
+              yesText: "立即生成",
+              noText: "下周期",
+              cancelText: "取消",
             }
-          },
-          {
-            yesText: "立即生成",
-            noText: "下周期",
-            cancelText: "取消",
-          }
-        );
+          );
+        }
       } else if (row.planStatus == 2) {
+        if (row.planCycle == 0) {
+          msg = "已存在已完成任务,是否确定下发?";
+        } else {
+          msg = "因存在已完成任务,是否确定从下周期生成任务?";
+        }
         this.$modal
-          .confirm("因存在已完成任务,是否确定从下周期生成任务?")
+          .confirm(msg)
           .then(() => {
             this.distributeInner(selectList, false);
           });
@@ -609,26 +636,38 @@ export default {
 
     onHSPlanDistribute(row) {
       if (row.planStatus == 0) {
-        let msg = "请选择下发后立即生成或下周期生成任务。";
-        this.$refs["DialogThreeState"].show(
-          msg,
-          (state) => {
-            if (state == 0 || state == 1) {
-              this.distributeHS(row.id, state == 1);
+        if (row.planCycle == 0) {
+          //无周期任务,
+          let msg = "确定下发任务并立即生成任务?";
+          this.$modal.confirm(msg).then(() => {
+            this.distributeHS(row.id, true);
+          });
+        } else {
+          let msg = "请选择下发后立即生成或下周期生成任务。";
+          this.$refs["DialogThreeState"].show(
+            msg,
+            (state) => {
+              if (state == 0 || state == 1) {
+                this.distributeHS(row.id, state == 1);
+              }
+            },
+            {
+              yesText: "立即生成",
+              noText: "下周期",
+              cancelText: "取消",
             }
-          },
-          {
-            yesText: "立即生成",
-            noText: "下周期",
-            cancelText: "取消",
-          }
-        );
+          );
+        }
       } else if (row.planStatus == 2) {
-        this.$modal
-          .confirm("因存在已完成任务,是否确定从下周期生成任务?")
-          .then(() => {
-            this.distributeHS(row.id, false);
-          });
+        if (row.planCycle == 0) {
+          msg = "已存在已完成任务,是否确定下发?";
+        } else {
+          msg = "因存在已完成任务,是否确定从下周期生成任务?";
+        }
+
+        this.$modal.confirm(msg).then(() => {
+          this.distributeHS(row.id, false);
+        });
       } else {
         this.distributeHS(row.id, false);
       }
@@ -731,11 +770,11 @@ export default {
         }
       } else if (row.planStatus == 2) {
         // if (row.hasTaskCurrentCycle) {
-          if (row.planCycle == 2) {
-            msg = "本次删除将强制删除今日所有任务?";
-          } else {
-            msg = "本次删除将强制删除当前任务时间及以后所有任务";
-          }
+        if (row.planCycle == 2) {
+          msg = "本次删除将强制删除今日所有任务?";
+        } else {
+          msg = "本次删除将强制删除当前任务时间及以后所有任务";
+        }
         // } else {
         //   msg = '是否确认删除名称为"' + row.planName + '"的任务?';
         // }