소스 검색

接口联调

cxmo 1 년 전
부모
커밋
9c80fbb0d1

+ 83 - 0
src/api/modules/approve.js

@@ -104,6 +104,53 @@ export const approveInterence = {
     getApproveDetail(params){
         return http.get("/report_approve/detail",params)
     },
+    /**
+     * 审批消息通知
+     * @param {Object} params 
+     * @param {Number} params.PageSize
+     * @param {Number} params.CurrentIndex
+     * @returns 
+     */
+    getApproveMsgList(params){
+        return http.get("/report_approve/message/list",params)
+    },
+    /**
+     * 消息通知已读
+     * @param {Object} params 
+     * @param {Number} params.MessageId
+     * @returns 
+     */
+    readApproveMsg(params){
+        return http.post("/report_approve/message/read",params)
+    },
+    /**
+     * 撤销审批
+     * @param {Object} params 
+     * @param {Number} params.ReportApproveId
+     * @returns 
+     */
+    cancelApprove(params){
+        return http.post("/report_approve/cancel",params)
+    },
+    /**
+     * 通过审批
+     * @param {Object} params 
+     * @param {Number} params.ReportApproveId
+     * @returns 
+     */
+    passApprove(params){
+        return http.post("/report_approve/approve",params)
+    },
+    /**
+     * 驳回审批
+     * @param {Object} params 
+     * @param {Number} params.ReportApproveId
+     * @param {String} params.ApproveRemark
+     * @returns 
+     */
+    rejectApprove(params){
+        return http.post("/report_approve/refuse",params)
+    },
 
 
 
@@ -127,5 +174,41 @@ export const approveInterence = {
     reportCnCancel(params){
         return http.post("/report/approve/cancel",params)
     },
+    /**
+     * 英文研报提交审批
+     * @param {Object} params 
+     * @param {Number} params.ReportId
+     * @returns 
+     */
+    reportEnSubmit(params){
+        return http.post("/english_report/approve/submit",params)
+    },
+    /**
+     * 英文研报撤销审批
+     * @param {Object} params 
+     * @param {Number} params.ReportId
+     * @returns 
+     */
+    reportEnCancel(params){
+        return http.post("/english_report/approve/cancel",params)
+    },
+    /**
+     * 智能研报提交审批
+     * @param {Object} params 
+     * @param {Number} params.ReportId
+     * @returns 
+     */
+    reportSmartSubmit(params){
+        return http.post("/smart_report/approve/submit",params)
+    },
+    /**
+     * 智能研报撤销审批
+     * @param {Object} params 
+     * @param {Number} params.ReportId
+     * @returns 
+     */
+    reportSmartCancel(params){
+        return http.post("/smart_report/approve/cancel",params)
+    },
 
 }

+ 3 - 0
src/assets/img/approve_m/passed-msg.svg

@@ -0,0 +1,3 @@
+<svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M9.50115 0C4.25336 0 0 4.25284 0 9.5C0 14.7472 4.25336 19 9.50115 19C14.7489 19 19 14.7449 19 9.4977C19 4.25054 14.7444 0 9.50115 0ZM14.0439 7.59633L10.3922 11.1855L8.62384 12.9147C8.61695 12.9239 8.60776 12.933 8.59628 12.9445C8.5825 12.9583 8.56642 12.9721 8.55034 12.9859C8.44011 13.0915 8.29542 13.1489 8.14155 13.1489H8.11628C7.95552 13.1489 7.80624 13.0892 7.696 12.979C7.67992 12.9652 7.66614 12.9514 7.65236 12.9399C7.64318 12.9307 7.63629 12.9239 7.6294 12.9147L4.68053 9.96616C4.44168 9.72734 4.45775 9.32318 4.71498 9.06599C4.84588 8.9351 5.02043 8.86162 5.19727 8.86162C5.35803 8.86162 5.50731 8.92132 5.61755 9.03155L8.13006 11.5438L9.4644 10.2394L13.1183 6.65023C13.2286 6.5423 13.3756 6.48489 13.534 6.48489C13.7132 6.48489 13.89 6.56067 14.0209 6.69386C14.2735 6.95564 14.2873 7.3598 14.0439 7.59633Z" fill="#68BB8D"/>
+</svg>

+ 3 - 0
src/assets/img/approve_m/process-msg.svg

@@ -0,0 +1,3 @@
+<svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M9.5 0C4.25327 0 0 4.25324 0 9.50002C0 12.894 1.81074 16.0301 4.75 17.7273C7.68945 19.4242 11.3107 19.4242 14.25 17.7273C17.1895 16.0303 19 12.8942 19 9.50002C19.0002 4.25343 14.7467 0 9.5 0ZM9.5 14.7779C8.91712 14.7779 8.44444 14.3053 8.44444 13.7224C8.44444 13.3454 8.64566 12.9968 8.97222 12.8083C9.29879 12.6198 9.70122 12.6198 10.0278 12.8083C10.3543 12.9968 10.5556 13.3454 10.5556 13.7224C10.5556 14.3051 10.0831 14.7779 9.5 14.7779ZM10.5556 10.5556C10.5556 11.1888 10.1333 11.6111 9.5 11.6111C8.86667 11.6111 8.44444 11.1888 8.44444 10.5556V5.27788C8.44444 4.64459 8.86667 4.22234 9.5 4.22234C10.1333 4.22234 10.5556 4.64459 10.5556 5.27788V10.5556Z" fill="#E98F36"/>
+</svg>

+ 10 - 0
src/assets/img/approve_m/reject-msg.svg

@@ -0,0 +1,10 @@
+<svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_5316_6053)">
+<path d="M9.5 19C4.25362 19 0 14.7464 0 9.5C0 4.25362 4.25362 0 9.5 0C14.7464 0 19 4.25362 19 9.5C19 14.7464 14.7464 19 9.5 19ZM9.5 8.38058L5.57808 4.45708C5.50453 4.38405 5.41731 4.32621 5.32141 4.28688C5.2255 4.24756 5.12279 4.2275 5.01914 4.22787C4.91548 4.22824 4.81292 4.24902 4.71729 4.28903C4.62167 4.32903 4.53487 4.38749 4.46183 4.46104C4.38799 4.53391 4.32929 4.62067 4.28911 4.71631C4.24892 4.81195 4.22804 4.9146 4.22767 5.01834C4.22731 5.12209 4.24745 5.22488 4.28696 5.3208C4.32647 5.41673 4.38455 5.5039 4.45787 5.57729L8.38058 9.5L4.45708 13.4219C4.38405 13.4955 4.32621 13.5827 4.28688 13.6786C4.24756 13.7745 4.2275 13.8772 4.22787 13.9809C4.22824 14.0845 4.24902 14.1871 4.28903 14.2827C4.32903 14.3783 4.38749 14.4651 4.46104 14.5382C4.53391 14.612 4.62067 14.6707 4.71631 14.7109C4.81195 14.7511 4.9146 14.772 5.01834 14.7723C5.12209 14.7727 5.22488 14.7525 5.3208 14.713C5.41673 14.6735 5.5039 14.6154 5.57729 14.5421L9.5 10.6194L13.4219 14.5421C13.4955 14.6152 13.5827 14.673 13.6786 14.7123C13.7745 14.7517 13.8772 14.7717 13.9809 14.7713C14.0845 14.771 14.1871 14.7502 14.2827 14.7102C14.3783 14.6702 14.4651 14.6117 14.5382 14.5382C14.612 14.4653 14.6707 14.3785 14.7109 14.2829C14.7511 14.1873 14.772 14.0846 14.7723 13.9809C14.7727 13.8771 14.7525 13.7743 14.713 13.6784C14.6735 13.5825 14.6154 13.4953 14.5421 13.4219L10.6194 9.5L14.5421 5.57808C14.6152 5.50453 14.673 5.41731 14.7123 5.32141C14.7517 5.2255 14.7717 5.12279 14.7713 5.01914C14.771 4.91548 14.7502 4.81292 14.7102 4.71729C14.6702 4.62167 14.6117 4.53487 14.5382 4.46183C14.4653 4.38799 14.3785 4.32929 14.2829 4.28911C14.1873 4.24892 14.0846 4.22804 13.9809 4.22767C13.8771 4.22731 13.7743 4.24745 13.6784 4.28696C13.5825 4.32647 13.4953 4.38455 13.4219 4.45787L9.5 8.38058Z" fill="#D81E06"/>
+</g>
+<defs>
+<clipPath id="clip0_5316_6053">
+<rect width="19" height="19" fill="white"/>
+</clipPath>
+</defs>
+</svg>

+ 3 - 0
src/assets/img/approve_m/return-msg.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="18" viewBox="0 0 20 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12.6234 14.45C12.4885 14.45 12.3592 14.4018 12.2638 14.316C12.1685 14.2302 12.1149 14.1138 12.1149 13.9924C12.1149 13.871 12.1685 13.7546 12.2638 13.6688C12.3592 13.583 12.4885 13.5348 12.6234 13.5348C14.2122 13.5348 15.5047 12.3715 15.5047 10.9416C15.5047 9.51163 14.2122 8.34834 12.6234 8.34834H5.21424L8.66102 11.4501C8.75106 11.5369 8.80011 11.6518 8.79783 11.7705C8.79555 11.8893 8.74211 12.0026 8.64879 12.0865C8.55547 12.1705 8.42957 12.2185 8.29765 12.2205C8.16572 12.2225 8.0381 12.1783 7.94169 12.0972L3.26746 7.89071L7.94169 3.6839C8.03708 3.59805 8.16646 3.54982 8.30136 3.54982C8.43626 3.54982 8.56563 3.59805 8.66102 3.6839C8.7564 3.76975 8.80999 3.88618 8.80999 4.00759C8.80999 4.129 8.7564 4.24544 8.66102 4.33129L5.21424 7.43308H12.6234C14.7729 7.43308 16.5217 9.00702 16.5217 10.9416C16.5217 12.8761 14.7729 14.45 12.6234 14.45ZM10 0C4.48576 0 0 4.03749 0 9C0 13.9625 4.48576 18 10 18C15.5139 18 20 13.9625 20 9C20 4.03749 15.5139 0 10 0Z" fill="#797979"/>
+</svg>

+ 48 - 10
src/components/notificationMsg.vue

@@ -10,44 +10,82 @@
                 <el-tab-pane label="研报审批" name="first"></el-tab-pane>
             </el-tabs>
             <div class="massage-list">
-                <div class="message-item">
-                    <span class="icon">!</span>
+                <div class="message-item" v-for="item in msgList" :key="item.Id" @click="readMsg(item)">
+                    <span class="icon">
+                        <img :src="require(`@/assets/img/approve_m/${approveState[item.ApproveState]||'process'}-msg.svg`)" alt="">
+                    </span>
                     <div class="info">
                         <div class="head">
-                            <span class="title">您有新的代办任务</span>
-                            <span class="time">2023-11-17 09:10</span>
+                            <span class="title">{{item.Content}}</span>
+                            <span class="time">{{item.CreateTime}}</span>
                         </div>
-                        <div class="content">张三 提交的【研报审批】需要您审批,请及时处理</div>
+                        <div class="content">{{item.Remark||'无'}}</div>
                     </div>
                 </div>
+                <tableNoData v-if="!msgList.length" text="暂无消息"></tableNoData>
             </div>
         </div>
-        <span slot="reference" @click="visible = true">消息</span>
+        <span slot="reference" @click="visible = true" style="cursor: pointer;">
+            <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+                <path d="M16.7344 15.4904L15.2941 12.9564V7.84847C15.2941 5.89142 13.8231 3.77337 11.6786 2.99732C11.5741 1.96012 10.8811 1.20374 9.97287 1.20374C9.06595 1.20374 8.37036 1.96014 8.26717 2.99732C6.12392 3.77337 4.65292 5.8914 4.65292 7.84847V12.9564L3.14258 15.6146C3.04183 15.7903 3.04429 16.0054 3.14504 16.1799C3.24581 16.3544 3.43263 16.4601 3.63415 16.4601H7.22871C7.49293 17.7357 8.62233 18.6967 9.97289 18.6967C11.3247 18.6967 12.4541 17.7357 12.7171 16.4601H16.3116C16.3215 16.4601 16.3288 16.4601 16.3374 16.4601C16.6508 16.4601 16.904 16.2082 16.904 15.8948C16.904 15.7362 16.8401 15.5925 16.7344 15.4904ZM9.97287 2.33803C10.1769 2.33803 10.3415 2.49286 10.4472 2.7239C10.2899 2.70792 10.1375 2.67106 9.97287 2.67106C9.8082 2.67106 9.65583 2.70792 9.49851 2.7239C9.60422 2.49284 9.76889 2.33803 9.97287 2.33803ZM9.97287 17.5636C9.25396 17.5636 8.65303 17.1016 8.41951 16.4601H11.5262C11.2927 17.1015 10.693 17.5636 9.97287 17.5636ZM4.60745 15.3282L5.71102 13.3853C5.76015 13.3017 5.78719 13.2034 5.78719 13.1051V7.84847C5.78719 5.93934 7.57648 3.80413 9.97287 3.80413C12.3692 3.80413 14.161 5.93934 14.161 7.84847V13.1051C14.161 13.2034 14.1868 13.3017 14.2347 13.3853L15.3395 15.3282H4.60745Z" fill="currentColor"/>
+            </svg>
+        </span>
     </el-popover>
 </template>
 
 <script>
 export default {
+    props:{
+        msgList:{
+            type:Array,
+            default:[]
+        }
+    },
     data() {
+        this.approveState=['','process','passed','reject','return',]
         return {
             activeName:'first',
             visible:false
         };
     },
-    methods: {
-
-    },
+    methods:{
+        readMsg(msg){
+            const {ApproveState,ReportApproveId} = msg
+            /* const typeMap = {
+                1:'approve',
+                2:'detail',
+                3:'myself',
+                4:'myself'
+            } */
+            const type = ApproveState===1?'approve':ApproveState===4?'detail':'myself'
+            this.$router.push({
+                path:'/approveDetail',
+                query:{
+                    type,
+                    approveId:ReportApproveId
+                }
+            })
+        }
+    }
 };
 </script>
 
 <style lang="scss">
 .notifation-wrap{
     .massage-list{
-        padding: 10px;
+        padding: 0 10px;
+        max-height: 320px;
+        overflow-y: auto;
         .message-item{
+            cursor: pointer;
             display: flex;
+            padding: 5px 0;
+            border-bottom: 1px solid #E4E7ED;
             .icon{
                 width:40px;
+                display: flex;
+                align-items: flex-start;
+                justify-content: center;
             }
             .info{
                 flex:1;

+ 15 - 1
src/views/Home.vue

@@ -249,7 +249,7 @@
                 </div>
               </div>
                <!-- 消息通知 -->
-              <notification-msg />
+              <notification-msg :msg-list="approveMsgList"/>
               <el-dropdown trigger="click" style="width:130px;">
                 <span class="el-dropdown-link userinfo-inner">
                   <img src="~@/assets/img/home/avatar.png"/>
@@ -311,6 +311,7 @@ import {
   homeInterface
 } from "api/api.js";
 import { getPublicSettingsApi } from '@/api/modules/oldApi';
+import {approveInterence} from '@/api/modules/approve.js';
 import PwdDlg from "@/components/pwdDlg.vue";
 import questionMsgDia from "@/components/questionMsgDia.vue";
 import questionnaireDia from "../components/questionnaireDia.vue";
@@ -466,6 +467,8 @@ export default {
       //链接系统
       linkSystems: this.$setting.linkSystems,
       bus_code:"",
+
+      approveMsgList:[]
     };
   },
   created() {
@@ -482,6 +485,7 @@ export default {
     this.getBusinessCodeFun()
     
     this.getQuestionStaus()
+    this.getApproveMsgList()
   },
   mounted() {
     if (sessionStorage.getItem("hasGetMenu")) {
@@ -508,6 +512,16 @@ export default {
         this.dialogVisiblePwd = res.Data;
       }
     },
+    //获取审批消息列表
+    getApproveMsgList(){
+        approveInterence.getApproveMsgList({
+            CurrentIndex:1,
+            PageSize:1000
+        }).then(res=>{
+            if(res.Ret!==200) return 
+            this.approveMsgList = res.Data.List||[]
+        })
+    },
     // 点击导航 打开今日待办
     // handleShowSallerTodayList() {
     //   this.getSellerTodayList("click");

+ 151 - 24
src/views/approve_manage/approveDetail.vue

@@ -3,13 +3,22 @@
     <div class="approve-detail-wrap">
         <div class="approve-detail">
             <div class="approve-info">
-                <span>研报名称:国内碰上了疫情,美国碰上了倒挂(1234)国内碰上了疫情,美国碰上了倒挂(1234)</span>
-                <span>研报分类:中文研报/日度点评/知白守黑日评</span>
-                <span style="min-width: 100px;">发起人:789</span>
+                <span>研报名称:{{reportInfo.title}}</span>
+                <span>研报分类:{{reportInfo.classify}}</span>
+                <span style="min-width: 100px;">发起人:{{reportInfo.approver}}</span>
             </div>
             <div class="approve-content" 
                 v-loading="isLoading"
                 element-loading-text="研报加载中...">
+                <component v-if="reportInfo.reportId&&!isError"
+                    :is="reportInfo.componentName"
+                    :reportId="reportInfo.reportId"
+                    :isPreview="true"
+                    :isEn="reportInfo.type===2"
+                    @reportStartLoading="isLoading=true"
+                    @reportEndLoading="isLoading=false"
+                    @reportError="isError=true"
+                ></component>
                 <!-- <ReportDetail 
                     v-if="!isError"
                     :reportId="107"
@@ -18,11 +27,11 @@
                     @reportEndLoading="isLoading=false"
                     @reportError="isError=true"
                 /> -->
-                <Reportdtl 
+                <!-- <Reportdtl 
                     :reportId="3528"
                     :isEn="false"
                     @reportError="isError=true"
-                />
+                /> -->
                 <!-- <Reportdtl 
                     :reportId="3750"
                     :isEn="true"
@@ -34,10 +43,10 @@
         <div class="approve-tool">
             <div class="tool-btn">
                 <!-- 根据审批的状态决定显示 -->
-                <el-button>驳回</el-button>
-                <el-button>通过</el-button>
-                <el-button>撤销</el-button>
-                <el-button>返回</el-button>
+                <el-button type="danger" v-if="formType==='approve'&&approveInfo.isCurrentApprover" @click="handleRejectApprove">驳回</el-button>
+                <el-button type="primary" v-if="formType==='approve'&&approveInfo.isCurrentApprover" @click="changeApprove('pass')">通过</el-button>
+                <el-button type="primary" v-if="formType==='myself'&&approveInfo.state!==4" @click="changeApprove('return')">撤销</el-button>
+                <el-button type="primary" plain @click="$router.replace('/approveList')">返回</el-button>
             </div>
             <div class="approve-timeline-wrap">
                 <p>审批流程</p>
@@ -46,11 +55,17 @@
                         :TimeLineData="TimeLineData"
                     />
                 </div>
-                <div class="approve-status">
-                    <img src="~@/assets/img/approve_m/pending.png" alt="">
+                <div class="approve-status" >
+                    <img :src="require(`@/assets/img/approve_m/${approveInfo.stateText||'pending'}.png`)" alt="">
                 </div>
             </div>
         </div>
+        <RejectDialog 
+            :isDetailDialogShow="isDetailDialogShow"
+            :isEdit="true"
+            @close="isDetailDialogShow=false;"
+            @edit="rejectApprove"
+        />
     </div>
 </template>
 
@@ -58,15 +73,37 @@
 import ReportDetail from '@/views/smartReport/reportDetail.vue';
 import Reportdtl from '@/views/report_manage/reportdtl.vue'
 import TimeLine from './components/timeLine.vue';
+import RejectDialog from './components/rejectDialog.vue';
 import {approveInterence} from '@/api/modules/approve.js';
 export default {
+    components: { RejectDialog },
     data() {
         return {
             isError:false,
             isLoading:false,
-            TimeLineData:[]
+            isDetailDialogShow:false,
+            TimeLineData:[],
+            formType:'detail',//进入审批详情的方式:approve(待处理)/detail(已处理)/myself(我发起的)
+            reportInfo:{ //报告相关信息
+                reportId:0,//研报or智能研报的报告id
+                title:'',
+                classify:'',
+                approver:'',
+                componentName:'',
+                type:0,//1中文研报 2英文研报 3智能研报
+            },
+            approveInfo:{//审批相关的信息
+                state:1,//当前审批的状态:1-待审批;2-已审批;3-已驳回;4-已撤回
+                stateText:'pending',//审批状态对应图片文字:待审批(pending),已通过(passed),已驳回(reject),已撤回(return)
+                isCurrentApprover:false,//审批进行中的节点审批人是否是当前用户
+            },
         };
     },
+    computed:{
+        UserId(){
+            return Number(localStorage.getItem("AdminId"));
+        }
+    },
     methods: {
         getApproveDetail(){
             const {type,approveId} = this.$route.query
@@ -74,49 +111,139 @@ export default {
             approveInterence.getApproveDetail({
                 ReportApproveId:Number(approveId)
             }).then(res=>{
-                if(res.Ret!==200) return 
-                console.log('res',res)
+                if(res.Ret!==200) return
+                //格式化时间线数据 
                 this.formatTimeLineData(res.Data)
-                
+                const {Report={},Approve={}} = res.Data||{}
+                this.reportInfo = {
+                    reportId:Report.ReportId||0,
+                    title:Report.ReportTitle||'',
+                    classify:Report.ReportClassify||'',
+                    approver:Approve.ApplyUserName||'',
+                    componentName:Report.ReportType===3?'ReportDetail':'Reportdtl',
+                    type:Report.ReportType
+                }
+                this.formType = type||'detail'
+                this.approveInfo.state=Approve.State
+                this.approveInfo.stateText=['','pending','passed','reject','return'][Approve.State]
             })
         },
         //转换接口数据
         formatTimeLineData({Approve={},ApproveFlowNodes=[]}){
             const ApproveType = ['','依次审批','会签','或签']
+            const ApproveState = ['','待审批','已审批','已驳回']
+            //发起人节点
             const startNode = {
                 nodeType:1,
                 nodeText:'发起人:',
+                nodeStatus:'passed',
                 approveList:[{
-                    approveName:Approve.ApplyUserName||'',
+                    approverName:Approve.ApplyUserName||'',
                     approveTime:Approve.CreateTime||''
                 }]
             }
-            let Nodes = ApproveFlowNodes.map(i=>{
+            //审批节点,已做了排序
+            let currentIndex = 0
+            let Nodes = ApproveFlowNodes.map((i,index)=>{
+                //找到当前节点的index
+                if(i.ReportApproveNodeId===Approve.CurrNodeId){
+                    currentIndex = index
+                }
                 const node = {
                     nodeType:2,
                     nodeText:'审批人:'+i.Users.length+'人('+ApproveType[i.ApproveType]+')',
-                    nodeStatus:i.ReportApproveNodeId===Approve.CurrNodeId?'process':'reject',
+                    nodeStatus:i.ReportApproveNodeId===Approve.CurrNodeId?'process':'future',
                     approveType:ApproveType[i.ApproveType]
                 }
                 const approveList = i.Users.map(u=>{
+                    const {State='',ApproveTime='',ApproveRemark=''}=u.ApproveRecord||{}
                     return {
                         approverName:u.UserName,
-                        approveStatus:u.ApproveRecord.State,
-                        approveTime:u.ApproveRecord.ApproveTime,
-                        approveReason:u.ApproveRecord.ApproveRemark
+                        approveStatus:ApproveState[State]||'',
+                        approveTime:ApproveTime,
+                        approveReason:ApproveRemark
                     }
                 })
+                //检测当前节点的User与当前用户是否匹配
+                if(i.ReportApproveNodeId===Approve.CurrNodeId){
+                    //当前节点的User中,有没有当前用户
+                    const hasUser = i.Users.findIndex(u=>u.UserId===this.UserId)
+                    if(hasUser!==-1){
+                        //只有依次审批需要看顺序
+                        if(i.ApproveType===1){
+                            this.approveInfo.isCurrentApprover = i.Users[hasUser].ApproveRecord?true:false
+                        }else{
+                            this.approveInfo.isCurrentApprover = true
+                        }
+                    }else{
+                        this.approveInfo.isCurrentApprover = false
+                    }
+                }
                 node.approveList = approveList
                 return node
             })
-            this.TimeLineData = [...startNode,...Nodes]
-
+            Nodes.forEach((n,index)=>{
+                if(index<currentIndex){
+                    n.nodeStatus = 'passed'
+                }
+                if(index>currentIndex){
+                    n.nodeStatus = 'future'
+                }
+            })
+            //如果当前审批是已驳回,移除当前节点后面的节点
+            if(Approve.State===3){
+                Nodes = Nodes.filter((_,index)=>index<=currentIndex)
+                Nodes[currentIndex].nodeStatus = 'reject'
+            }
+            //如果当前审批已撤销,移除当前节点后面的节点,在最后加上撤销节点
+            if(Approve.State===4){
+                Nodes = Nodes.filter((_,index)=>index<=currentIndex)
+                //检查最后一个节点是否有人审批
+                let hasApprove = true
+                Nodes[currentIndex].approveList.forEach(u=>{
+                    if(!u.approveStatus){
+                        hasApprove = false
+                    }
+                })
+                //若没有,则把这个节点删除
+                !hasApprove&&(Nodes.pop())
+                Nodes.push({
+                    nodeType:3,
+                    nodeText:'发起人:',
+                    nodeStatus:'return',
+                    approveList:[{
+                        approverName:(Approve.ApplyUserName||'')+'(已撤销)',
+                        approveTime:Approve.ModifyTime||''
+                    }],
+                })
+            }
+            this.TimeLineData = [startNode,...Nodes]
+        },
+        changeApprove(type){
+            const {approveId} = this.$route.query
+            if(!approveId) return
+        },
+        handleRejectApprove(){
+            console.log('a?')
+            //打开驳回理由弹窗
+            this.isDetailDialogShow = true
+        },
+        rejectApprove(reason){
+            this.isDetailDialogShow = false
+            approveInterence.rejectApprove({
+                ReportApproveId:Number(this.$route.query.approveId),
+                ApproveRemark:reason||''
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.$message.success("驳回成功")
+                this.$router.replace("/approveList")
+            })
         }
     },
     mounted(){
         this.getApproveDetail()
     },
-    components: { TimeLine, ReportDetail ,Reportdtl }
+    components: { TimeLine, ReportDetail, Reportdtl, RejectDialog }
 };
 </script>
 

+ 76 - 50
src/views/approve_manage/approveList.vue

@@ -14,10 +14,11 @@
                     placeholder="请选择关联报告" clearable
                     :options="classifyTree"
                     :props="{value:'ClassifyId',label:'ClassifyName',children:'Children'}"
-                    @change="handleSearchChange">
+                    @change="handleCurrentChange(1)">
                 </el-cascader>
                 <div class="select-time-box">
                     <el-select v-show="activeTab!=='pending'" v-model="timeType" 
+                        @change="handleCurrentChange(1)"
                         placeholder="时间类型" style="max-width:120px;" class="custom-select">
                         <el-option label="提交时间" :value="1" />
                         <el-option label="处理时间" :value="2" v-if="activeTab==='processed'"/>
@@ -25,17 +26,20 @@
                     </el-select>
                     <div class="line" v-show="activeTab!=='pending'"></div>
                     <el-date-picker v-model="timeDate"
+                        @change="handleCurrentChange(1)"
                         type="daterange"
+                        value-format="yyyy-MM-dd"
                         range-separator="至"
                         start-placeholder="开始日期"
                         end-placeholder="结束日期">
                     </el-date-picker>
                 </div>
                 
-                <el-select placeholder="请选择处理状态" v-model="statusType" clearable v-show="activeTab!=='pending'">
+                <el-select placeholder="请选择处理状态" v-model="ApproveState" clearable v-show="activeTab!=='pending'"
+                    @change="handleCurrentChange(1)">
                     <template v-if="activeTab==='processed'">
-                        <el-option label="已同意" :value="1" />
-                        <el-option label="已驳回" :value="2" />
+                        <el-option label="已同意" :value="2" />
+                        <el-option label="已驳回" :value="3" />
                     </template>
                     <template v-if="activeTab==='originate'">
                         <el-option label="待审批" :value="1" />
@@ -46,44 +50,48 @@
                     
                 </el-select>
 
-                <el-input v-model="keyword" prefix-icon="el-icon-search" clearable
+                <el-input v-model="keyword" prefix-icon="el-icon-search" clearable @input="handleCurrentChange(1)"
                     placeholder="请输入报告标题" style="width:260px;margin-left: auto;"></el-input>
             </div>
             <div class="list-box">
-                <el-table :data="tableData" @sort-change="sortChange" border>
-                <el-table-column
-                    v-for="item in tableColumns"
-                    :key="item.key"
-                    :label="item.label"
-                    :prop="item.key"
-                    :sortable="item.sortable"
-                    align="center"
-                >
-                    <template slot-scope="{row}">
-                        <span v-if="item.key==='State'">
-                            {{['','待审批','已审批','已驳回','已撤销'][row.State]}}
-                        </span>
-                        <span v-else>{{row[item.key]}}</span>
-                    </template>
-                </el-table-column>
-                <el-table-column label="操作" align="center">
-                    <template slot-scope="{row}">
-                        <template v-if="activeTab==='pending'">
-                            <el-button type="text" style="padding:0;" @click="toApproveDetail(row,'approve')">审批</el-button>
+                <el-table 
+                    ref="reftable"
+                    v-loading="tableLoading"
+                    :data="tableData" 
+                    @sort-change="sortChange" border>
+                    <el-table-column
+                        v-for="item in tableColumns"
+                        :key="item.key"
+                        :label="item.label"
+                        :prop="item.key"
+                        :sortable="item.sortable"
+                        align="center"
+                    >
+                        <template slot-scope="{row}">
+                            <span v-if="item.key==='State'">
+                                {{['','待审批','已审批','已驳回','已撤销'][row.State]}}
+                            </span>
+                            <span v-else>{{row[item.key]}}</span>
                         </template>
-                        <template v-if="activeTab==='processed'">
-                            <el-button type="text" style="padding:0;" @click="toApproveDetail(row,'detail')">详情</el-button>
-                            <el-button type="text" style="padding:0" @click="handleShowDetail(row)">驳回理由</el-button>
+                    </el-table-column>
+                    <el-table-column label="操作" align="center">
+                        <template slot-scope="{row}">
+                            <template v-if="activeTab==='pending'">
+                                <el-button type="text" style="padding:0;" @click="toApproveDetail(row,'approve')">审批</el-button>
+                            </template>
+                            <template v-if="activeTab==='processed'">
+                                <el-button type="text" style="padding:0;" @click="toApproveDetail(row,'detail')">详情</el-button>
+                                <el-button type="text" style="padding:0" @click="handleShowDetail(row)">驳回理由</el-button>
+                            </template>
+                            <template v-if="activeTab==='originate'">
+                                <el-button type="text" style="padding:0;" @click="toApproveDetail(row,'myself')">详情</el-button>
+                                <el-button type="text" style="padding:0;" v-if="row.State!==4" @click="cancelApprove(row)">撤销</el-button>
+                                <el-button type="text" style="padding:0" @click="handleShowDetail(row)" v-if="row.State===3">驳回理由</el-button>
+                            </template>
                         </template>
-                        <template v-if="activeTab==='originate'">
-                            <el-button type="text" style="padding:0;" @click="toApproveDetail(row,'myself')" v-if="row.State!==4">详情</el-button>
-                            <el-button type="text" style="padding:0;" v-if="row.State!==4">撤销</el-button>
-                            <el-button type="text" style="padding:0" @click="handleShowDetail(row)" v-if="row.State===3">驳回理由</el-button>
-                        </template>
-                    </template>
-                    
-                </el-table-column>
-            </el-table>
+                        
+                    </el-table-column>
+                </el-table>
             <div style="text-align:right;margin-top:20px">
                 <el-pagination 
                         layout="total,prev,pager,next,jumper" 
@@ -133,13 +141,14 @@ export default {
             /* 筛选项 */
             timeType:1,
             timeDate:'',
-            statusType:'',
+            ApproveState:'',
             keyword:'',
             classify:'',
             /* 排序项 */
-            sortRule:0,
-            sortField:0,
-            
+            SortRule:0,
+            SortField:0,
+
+            tableLoading:false,
             tableData: [],
             tableColumns: approve_pending_columns,
             page: 1,
@@ -152,6 +161,8 @@ export default {
     },
     methods: {
         getTableData(){
+            this.tableLoading = true
+            this.tableData=[]
             const baseParams = {
                 ListType:tabMap[this.activeTab]||0,
                 PageSize:this.pageSize,
@@ -164,19 +175,20 @@ export default {
                 ClassifyFirstId:this.classify[this.classify.length-2]||0,
                 ClassifySecondId:this.classify[this.classify.length-1]||0,
                 //时间
-                TimeType:0,
-                StartTime:'',
-                EndTime:'',
+                TimeType:this.timeType,
+                StartTime:this.timeDate?this.timeDate[0]||'':'',
+                EndTime:this.timeDate?this.timeDate[1]||'':'',
                 //排序
-                SortRule:0,
-                SortField:0,
+                SortRule:this.SortRule,
+                SortField:this.SortField,
                 //处理状态
-                ApproveState:0,
+                ApproveState:this.ApproveState,
             }
             approveInterence.getApproveList({
                 ...baseParams,
                 ...selectParams
             }).then(res=>{
+                this.tableLoading=false
                 if(res.Ret!==200) return 
                 const {List=[],Paging={}} = res.Data||{}
                 this.tableData = List||[]
@@ -188,20 +200,25 @@ export default {
             this.getTableData()
         },
         sortChange({ prop, order }) {
+            this.SortRule = order==='ascending'?1:2
+            this.SortField= prop==='CreateTime'?1
+                            :prop==='HandleTime'?2:3
+            this.handleCurrentChange(1)
         },
         handleClick() {
             this.timeType = 1
             this.timeDate=''
+            this.SortField=0
+            this.SortField=0
             this.tableColumns = columnsMap[this.activeTab];
+            this.$refs.reftable.clearSort()
             this.handleCurrentChange(1)
         },
         handleShowDetail(data) {
             this.currentData = data;
             this.isDetailDialogShow = true;
         },
-        handleSearchChange(){},
         toApproveDetail(data,type){
-            console.log('data?',data)
             this.$router.push({
                 path:'/approveDetail',
                 query:{
@@ -209,7 +226,16 @@ export default {
                     approveId:data.ReportApproveId
                 }
             })
-        }
+        },
+        cancelApprove(item){
+            approveInterence.cancelApprove({
+                ReportApproveId:Number(item.ReportApproveId)
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.$message.success("撤销成功")
+                this.handleCurrentChange(1)
+            })
+        },
     },
     mounted(){
         this.getClassifyTree()

+ 1 - 1
src/views/approve_manage/approveSetting.vue

@@ -10,7 +10,7 @@
                 :props="{value:'ClassifyId',label:'ClassifyName',children:'Children'}"
                 @change="handleSearchChange"
                 style="margin-right: auto;margin-left: 15px;"></el-cascader>
-            <el-input v-model="Keyword"
+            <el-input v-model="Keyword" @input="handleCurrentChange(1)"
                 placeholder="请输入审批流名称" prefix-icon="el-icon-search" style="width:260px;"></el-input>
         </div>
         <div class="list-box">

+ 13 - 7
src/views/approve_manage/components/rejectDialog.vue

@@ -10,15 +10,15 @@
         center
     >
         <div class="dialog-content-wrap">
-            <el-input type="textarea" v-model="content" :disabled="!isEdit" :rows="10" placeholder="驳回理由为空"></el-input>
+            <el-input type="textarea" v-model="content" :disabled="!isEdit" :rows="10" placeholder="请输入驳回理由"></el-input>
         </div>
         <div class="dialog-btn-wrap">
             
             <template v-if="isEdit">
-                <el-button>取消</el-button>
-                <el-button @click="$emit('close')">确认</el-button>
+                <el-button @click="$emit('close')">取消</el-button>
+                <el-button type="primary" @click="handleConfirm">确认</el-button>
             </template>
-            <el-button v-else>知道了</el-button>
+            <el-button v-else @click="$emit('close')">知道了</el-button>
         </div>
     </el-dialog>
 </template>
@@ -36,13 +36,13 @@ export default {
         },
         data:{
             type:Object,
-            default:[]
+            default:()=>{return{}}
         }
     },
     watch:{
         isDetailDialogShow(val){
             if(val){
-                this.content = this.data.content||''
+                this.content = this.data.ApproveRemark||''
             }
         }
     },
@@ -52,7 +52,13 @@ export default {
         };
     },
     methods: {
-
+        handleConfirm(){
+            /* if(!this.content.length){
+                this.$message.warning("请输入驳回理由")
+                return
+            } */
+            this.$emit('edit',this.content)
+        }
     },
 };
 </script>

+ 2 - 2
src/views/approve_manage/components/timeLine.vue

@@ -49,7 +49,7 @@ export default {
                 {
                     nodeType:2,
                     nodeText:'审批人:', //需要拼接
-                    nodeStatus:'reject',//节点未进行到
+                    nodeStatus:'reject',//节点驳回
                     approveType:'依次审批',
                     approveList:[
                         {
@@ -66,7 +66,7 @@ export default {
                 {
                     nodeType:2,
                     nodeText:'审批人:', //需要拼接
-                    nodeStatus:'return',//节点
+                    nodeStatus:'return',//节点
                     approveType:'依次审批',
                     approveList:[
                         {

+ 1 - 1
src/views/approve_manage/components/timeLineItem.vue

@@ -2,7 +2,7 @@
     <div class="item-wrap">
         <div class="icon-wrap">
             <div :class="['icon',node.nodeStatus]">
-                <img :src="require(`@/assets/img/approve_m/${node.nodeStatus}-icon.svg`)" alt="" srcset="">
+                <img :src="require(`@/assets/img/approve_m/${node.nodeStatus}-icon.svg`)" alt="">
             </div>
             <div :class="['line',isLast?'last':'',node.nodeStatus]"></div>
         </div>

+ 1 - 1
src/views/approve_manage/config/tableConfig.js

@@ -60,7 +60,7 @@ export const approve_processed_status = [
 //审批管理-我发起的
 export const approve_originate_columns=[
     {
-        key:'ReportType',
+        key:'ReportTitle',
         label:'报告标题'
     },{
         key:'ReportClassify',

+ 5 - 4
src/views/approve_manage/mixins/approveMixins.js

@@ -1,8 +1,8 @@
 import {approveInterence} from '@/api/modules/approve.js'
-const filterNodes = (arr)=>{
+const filterNodes = (arr,hasDisabled)=>{
     arr.length &&arr.forEach((item) => {
-        item.disabled = item.HasFlow
-        item.Children.length && filterNodes(item.Children);
+        hasDisabled&&(item.disabled = item.HasFlow)
+        item.Children.length && filterNodes(item.Children,hasDisabled);
         if (!item.Children.length) {
             delete item.Children;
         }
@@ -20,7 +20,8 @@ export default{
             approveInterence.getReportClassifyTree().then(res=>{
                 if(res.Ret!==200) return 
                 this.classifyTree = res.Data||[]
-                filterNodes(this.classifyTree)
+                const hasDisabled = window.location.pathname.startsWith('/approveEdit')
+                filterNodes(this.classifyTree,hasDisabled)
                 if(this.getFlowDetail){
                     this.getFlowDetail()
                 }