ソースを参照

个贷流程后续优化1

wucl 1 年間 前
コミット
db05d9de25

+ 3 - 0
src/api/modules/businessProduction.js

@@ -24,4 +24,7 @@ export default {
    personalBag(params){
       return request.get(`businessProduction/bag/personal/${params}`)
    },
+   personalAllotRealAmount(params){
+      return request.post(`businessProduction/allotRealAmount/personal`,params)
+   },
 }

+ 5 - 1
src/api/modules/workNodeTaskRecord.js

@@ -16,5 +16,9 @@ export default {
   },
   personalTaskTodoList(params){
     return request.get(`workTaskRecord/personal/todo`,{ params: params })
-  }
+  },
+  persoanlTaskDoneList(params){
+    return request.get(`workTaskRecord/personal/done`,{ params: params })
+  },
+
 }

+ 4 - 2
src/components/personalForms/backgroundInfo.vue

@@ -387,13 +387,15 @@ export default {
                             this.$api.personalTarget.updateBackgroundInfo(this.backgroundInfo).then(res=>{
                                 if (res.code === 200 && res.data){
                                     this.$notify({
-                                        title: '区位状况保存成功',
+                                        title: '成功',
+                                        message:'区位状况保存成功',
                                         type: 'success',
                                         duration: 2000
                                     });
                                 }else{
                                     this.$notify({
-                                        title: '区位状况保存失败',
+                                        title: '失败',
+                                        message:'区位状况保存失败',
                                         type: 'error',
                                         duration: 2000
                                     });

+ 4 - 2
src/components/personalForms/entityInfo.vue

@@ -562,13 +562,15 @@ export default {
                             this.$api.personalTarget.updateEntityInfo(this.entityInfo).then(res=>{
                                 if (res.code === 200 && res.data){
                                     this.$notify({
-                                        title: '实物状况保存成功',
+                                        title: '成功',
+                                        message:'实物状况保存成功',
                                         type: 'success',
                                         duration: 2000
                                     });
                                 }else{
                                     this.$notify({
-                                        title: '实物状况保存失败',
+                                        title: '失败',
+                                        message:'实物状况保存失败',
                                         type: 'error',
                                         duration: 2000
                                     });

+ 5 - 14
src/components/personalForms/houseCertificate.vue

@@ -439,18 +439,7 @@ export default {
         if (this.houseCertificateObject){
             this.certificate = this.houseCertificateObject;
         }
-        if (this.houseCertificateObject==null){
-                    this.certificate.location = nv.location;
-                    this.certificate.sceneAddress = nv.location;
-                    this.certificate.bailor1 = nv.bailor1;
-                    this.certificate.bailor1Tel = nv.bailor1Tel;
-                    this.certificate.bailor2 = nv.bailor2;
-                    this.certificate.bailor2Tel = nv.bailor2Tel;
-                    this.certificate.allAcreage = nv.acreage;
-                    this.certificate.floors = nv.allFloor;
-                    this.certificate.ownerName = nv.ownerName;
-                    this.converteUseTo(nv.purpose);
-                }
+       
     },
     data() {
         return {
@@ -513,13 +502,15 @@ export default {
                             this.$api.personalTarget.updateHouseCer(this.certificate).then(res=>{
                                 if (res.code === 200 && res.data){
                                     this.$notify({
-                                        title: '房产证信息保存成功',
+                                        title: '成功',
+                                        message:'房产证信息保存成功',
                                         type: 'success',
                                         duration: 2000
                                     });
                                 }else{
                                     this.$notify({
-                                        title: '房产证信息保存失败',
+                                        title: '失败',
+                                        message:'房产证信息保存失败',
                                         type: 'error',
                                         duration: 2000
                                     });

+ 4 - 2
src/components/personalForms/immovableCertificate.vue

@@ -490,13 +490,15 @@ export default {
                             this.$api.personalTarget.updateImmovableCer(this.certificate).then(res=>{
                                 if (res.code === 200 && res.data){
                                     this.$notify({
-                                        title: '不动产权证信息保存成功',
+                                        title: '成功',
                                         type: 'success',
+                                        message:'不动产权证信息保存成功',
                                         duration: 2000
                                     });
                                 }else{
                                     this.$notify({
-                                        title: '不动产权证信息保存失败',
+                                        title: '失败',
+                                        message:'不动产权证信息保存失败',
                                         type: 'error',
                                         duration: 2000
                                     });

+ 4 - 2
src/components/personalForms/landCertificate.vue

@@ -244,13 +244,15 @@ export default {
                             this.$api.personalTarget.updateLandCer(this.certificate).then(res=>{
                                 if (res.code === 200 && res.data){
                                     this.$notify({
-                                        title: '国土证信息保存成功',
+                                        title: '成功',
+                                        message:'国土证信息保存成功',
                                         type: 'success',
                                         duration: 2000
                                     });
                                 }else{
                                     this.$notify({
-                                        title: '国土产权证信息保存失败',
+                                        title: '失败',
+                                        message:'国土产权证信息保存失败',
                                         type: 'error',
                                         duration: 2000
                                     });

+ 21 - 4
src/components/personalForms/sellingAbilityInfo.vue

@@ -289,7 +289,7 @@
                                         <el-date-picker
                                             v-model="sellingAbilityInfo.createDateD"
                                             type="date" style="width: 100%;"
-                                            placeholder="选择日期">
+                                            placeholder="选择日期" @change="getLimitDate()">
                                             </el-date-picker>
                                         </el-form-item>
                                       </el-col>
@@ -388,7 +388,7 @@ export default {
                 createDate:null,
                 sceneDateD:null,
                 createDateD:null,
-                limitDate:"limitDatelimitDate"
+                limitDate:null
           },
           outwardStaffs:[],
           
@@ -406,13 +406,15 @@ export default {
                             this.$api.personalTarget.updateSellingAbility(this.sellingAbilityInfo).then(res=>{
                                 if (res.code === 200 && res.data){
                                     this.$notify({
-                                        title: '变现能力分析保存成功',
+                                        title: '成功',
+                                        message:'变现能力分析保存成功',
                                         type: 'success',
                                         duration: 2000
                                     });
                                 }else{
                                     this.$notify({
-                                        title: '变现能力分析保存失败',
+                                        title: '失败',
+                                        message:'变现能力分析保存失败',
                                         type: 'error',
                                         duration: 2000
                                     });
@@ -436,7 +438,22 @@ export default {
             this.sellingAbilityInfo.outStaffTelNo = element.mobile;
           }
         })
+      },
+      getLimitDate(){
+        let createdDate = this.sellingAbilityInfo.createDateD;
+        let afterYearDate =  new Date(createdDate.getTime());
+        afterYearDate.setFullYear(afterYearDate.getFullYear() + 1);
+        afterYearDate.setDate(afterYearDate.getDate() - 1);
+        const created = createdDate.getFullYear()+'-'+this.addZero((createdDate.getMonth()+1))+'-'+this.addZero(createdDate.getDate());
+        const limit = afterYearDate.getFullYear()+'-'+this.addZero((afterYearDate.getMonth()+1))+'-'+this.addZero(afterYearDate.getDate());
+        this.sellingAbilityInfo.limitDate = created +' 至 '+limit;
+      },
+
+      addZero(num){
+        return (num < 10 ? '0' : '') + num.toString();
       }
+
+      
     }
 }
 </script>

+ 3 - 1
src/router/urlMap.js

@@ -98,6 +98,7 @@ import _views_assets_order_detail from '@/views/assets/orderDetail'
 import _views_personal_to_save_file from '@/views/personal/saveFileTodoList'
 import _views_personal_save_file from '@/views/personal/saveFileDoneList'
 import _views_personal_readonly_detail from '@/views/personal/readonlyDetail'
+import _views_personal_done from '@/views/personal/doneList'
 
 export default {
   _views_set_menu,
@@ -184,5 +185,6 @@ export default {
   _views_assets_order_detail,
   _views_personal_to_save_file,
   _views_personal_save_file,
-  _views_personal_readonly_detail
+  _views_personal_readonly_detail,
+  _views_personal_done
 }

+ 45 - 23
src/views/finance/fundList.vue

@@ -191,7 +191,7 @@
         <span>付款方:</span><span style="color:red;font-weight:bold">{{payer}}</span><span style="margin-left:20px">付款金额:</span><span style="color:red;font-weight:bold">{{amount}}¥</span><span style="margin-left:20px">的认领记录:</span>
       </div>
       <el-table
-        :data="claimListData"
+        :data="claimListData" border stripe height="500"
         style="width: 100%">
         <el-table-column
           align = "center"
@@ -342,8 +342,6 @@
               </el-button>
               <el-button class="filter-item" style="float: left;" round type="info" @click="downloadTemp()">下载模板
               </el-button>
-              <!-- <el-button class="filter-item" style="float: left;" round type="danger" @click="uploadTemp()">模板认领
-              </el-button> -->
                 <excelImport
                 style="float: left; margin-left: 10px; "
                   ref="uploadControl" buttonType="danger"
@@ -351,7 +349,7 @@
                   :flag="'financeClaim/personal/temp/upload/'+financeFundId"
                   :style-type="2"
                   title="模板认领"
-                  @fath="getList"
+                  @fath="getMyPersonalOrder"
                 />
               <!-- <input type="file" ref="fileInput" style="display: none" @change="handleFileChange" /> -->
             </template>
@@ -766,25 +764,49 @@ export default {
       this.notInfo = "此笔实收款剩余:";
     },
     claim(){
-      this.$api.businessProduction.allotRealAmount(this.claimOrders).then(res=>{
-        if (res.code === 200 && res.data){
-          this.$notify({
-            title: '成功',
-            message: '实收款认领成功',
-            type: 'success',
-            duration: 2000
-          });
-          this.getMyMajorOrder();
-          this.allotAmountDialog = false;
-        }else {
-          this.$notify({
-            title: '失败',
-            message: '实收款认领失败',
-            type: 'error',
-            duration: 2000
-          });
-        }
-      })
+      if (this.activeName === 'MAJOR_BUSINESS'){
+          this.$api.businessProduction.allotRealAmount(this.claimOrders).then(res=>{
+          if (res.code === 200 && res.data){
+            this.$notify({
+              title: '成功',
+              message: '实收款认领成功',
+              type: 'success',
+              duration: 2000
+            });
+            this.getMyMajorOrder();
+            this.allotAmountDialog = false;
+          }else {
+            this.$notify({
+              title: '失败',
+              message: '实收款认领失败',
+              type: 'error',
+              duration: 2000
+            });
+          }
+        })
+      }
+      if (this.activeName === 'PERSONAL_BUSINESS'){
+        this.$api.businessProduction.personalAllotRealAmount(this.claimOrders).then(res=>{
+          if (res.code === 200 && res.data){
+            this.$notify({
+              title: '成功',
+              message: '实收款认领成功',
+              type: 'success',
+              duration: 2000
+            });
+            this.getMyPersonalOrder();
+            this.allotAmountDialog = false;
+          }else {
+            this.$notify({
+              title: '失败',
+              message: '实收款认领失败',
+              type: 'error',
+              duration: 2000
+            });
+          }
+        })
+      }
+      
     },
     updateClaim(row){
       this.doClaimDialog = true;

+ 4 - 17
src/views/major/doneList.vue

@@ -44,7 +44,7 @@
       <parentTable  :data="pageData.records" slot="table" style="width: 100%;">
         <el-table-column label="业务类型" align="center">
           <template slot-scope="{row}">
-            <span>{{ businessTypeAlias(row.businessType) }}</span>
+            <span>大中型</span>
           </template>
         </el-table-column>
         <el-table-column label="项目名称" align="center" width="200" >
@@ -84,7 +84,7 @@
         </el-table-column>
         <el-table-column label="节点状态" align="center">
           <template slot-scope="{row}">
-            <span>{{ nodeStateAlias(row.state)}}</span>
+            <span>{{ row.state }}</span>
           </template>
         </el-table-column>
         <el-table-column label="处理意见" align="center" show-overflow-tooltip>
@@ -199,21 +199,8 @@ export default {
         }
         return '报告';
     },
-    businessTypeAlias(code){
-      return '大中型'
-    },
-    nodeStateAlias(code){
-      if (code === 'PASS'){
-          return '提交';
-      }
-      if (code === 'REVERSE'){
-        return '退回';
-      }
-      if (code === 'TERMINATE'){
-        return '终止';
-      }
-      return '-'
-    },
+
+
     getMajorNodes(){
         this.$api.workNode.nodesByBusiness('MAJOR_BUSINESS').then(res=>{
           if (res.code === 200){

+ 244 - 0
src/views/personal/doneList.vue

@@ -0,0 +1,244 @@
+<template>
+  <div class="app-container">
+    <div class="title-container">
+      <breadcrumb id="breadcrumb-container" class="breadcrumb-container" />
+    </div>
+    <y-page-list-layout :page-list="pageData" :page-para="listQuery" :get-page-list="getList">
+      <template slot="left">
+        <el-input v-model="listQuery.keyword" placeholder="坐落/项目编号/报告号" clearable
+          style="margin-left: 20px;width: 270px;float: left;">
+        </el-input>
+        <el-select v-model="listQuery.nodeName" placeholder="处理节点" style="margin-left: 20px;width: 200px;float: left;" clearable
+            filterable>
+          <el-option
+            v-for="item in persoanlNodes"
+            :key="item.code"
+            :label="item.name"
+            :value="item.name">
+          </el-option>
+        </el-select>
+        <el-select v-model="listQuery.state" placeholder="节点状态" style="margin-left: 20px;width: 200px;float: left;" clearable
+            filterable>
+          <el-option key="PASS" label="提交" value="PASS"></el-option>
+          <el-option key="TERMINATE" label="终止" value="TERMINATE"></el-option>
+          <el-option key="REVERSE" label="退回" value="REVERSE"></el-option>
+          <el-option key="SKIP" label="跳过" value="SKIP"></el-option>
+          <el-option key="RESTART" label="重置" value="RESTART"></el-option>
+        </el-select>
+        <el-date-picker
+          style="margin-left: 20px;float: left;"
+          v-model="finishTimeBucket"
+          type="daterange"
+          align="center"
+          unlink-panels
+          range-separator="至"
+          start-placeholder="处理日期(开始)"
+          end-placeholder="处理日期(结束)"
+          :picker-options="pickerOptions" value-format="yyyy-MM-dd">
+        </el-date-picker>
+        <el-button class="filter-item" style="margin-left: 10px;float: left;" type="primary" @click="searchList" round>搜索
+        </el-button>
+        <el-button class="filter-item" style="float: left;" round type="success" @click="resetSearch()">重置
+        </el-button>
+      </template>
+      <parentTable  :data="pageData.records" slot="table" style="width: 100%;">
+        <el-table-column label="业务类型" align="center">
+          <template slot-scope="{row}">
+            <span>个贷业务</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="坐落" align="center" width="200" >
+          <template slot-scope="{row}">
+            <span>{{ row.location }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="项目编号" align="center"  width='150'>
+          <template slot-scope="{row}">
+            <span>{{ row.orderId }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="客户名称" align="center" width="130">
+          <template slot-scope="{row}">
+            <span>{{ row.clientName==null?'-': row.clientName }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="业务来源" align="center" width="130">
+          <template slot-scope="{row}">
+            <span>{{ row.clientSubName }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="委托人" align="center">
+          <template slot-scope="{row}">
+            <span>{{ row.bailorA}} {{ row.bailorB}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="处理人" align="center">
+          <template slot-scope="{row}">
+            <span>{{ row.handler }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="处理节点" align="center"  width='150'>
+          <template slot-scope="{row}">
+            <span>{{ row.nodeName }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="处理时间" align="center" width='150'>
+          <template slot-scope="{row}">
+            <span>{{ row.finishTime }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="处理时长" align="center">
+          <template slot-scope="{row}">
+            <span>{{ row.handingTime }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="节点状态" align="center">
+          <template slot-scope="{row}">
+            <span>{{ row.state }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="处理意见" align="center" show-overflow-tooltip>
+          <template slot-scope="{row}">
+            <span>{{ row.comments==null?'-':row.comments}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center"  width='100'>
+          <template slot-scope="{row}">
+            <el-button v-if="row.instanceState==='CLOSED'" type="text" size="small" @click="activate(row)">激活</el-button>
+          </template>
+        </el-table-column>
+      </parentTable>
+    </y-page-list-layout>
+  </div>
+</template>
+<script>
+import YPageListLayout from '@/components/YPageListLayout'
+import Breadcrumb from '@/components/Breadcrumb'
+
+export default {
+  name: 'persoanlDoneList',
+  components: {
+    Breadcrumb,
+    YPageListLayout,
+  },
+  filters: {
+    
+  },
+  data() {
+    return {
+      pageData: { records: [] },
+      listQuery: {
+        page: 1,
+        size: 10,
+        descs: 'id',
+        startDate:null,
+        endDate:null,
+        keyword:null
+      },
+      finishTimeBucket:'',
+      persoanlNodes:[],
+      pickerOptions: {
+          shortcuts: [{
+            text: '最近一周',
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit('pick', [start, end]);
+            }
+          }, {
+            text: '最近一个月',
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+              picker.$emit('pick', [start, end]);
+            }
+          }, {
+            text: '最近三个月',
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+              picker.$emit('pick', [start, end]);
+            }
+          }]
+        },
+    }
+  },
+  created() {
+    this.getList();
+    this.getPersonalNodes();
+  },
+  methods: {
+  
+    resetSearch() {
+      this.$router.push({ query: {} });
+      this.finishTimeBucket = '';
+      this.listQuery = {
+        current: 1,
+        size: 10,
+        descs: 'id',
+      }
+      this.getList()
+    },
+   
+    searchList() {
+      // 重置分页
+      this.listQuery.page = 1
+      this.listQuery.size = 10
+      if (this.finishTimeBucket){
+        this.listQuery.startDate = this.finishTimeBucket[0]+' 00:00:00';
+        this.listQuery.endDate = this.finishTimeBucket[1]+ ' 23:59:59';
+      }
+      this.getList()
+    },
+    getList() {
+      this.$api.workNodeTaskRecord.persoanlTaskDoneList(Object.assign({}, this.listQuery)).then(res=>{
+        if (res.code ===200){
+            this.pageData = res.data;
+        }
+      })
+    },
+  
+    getPersonalNodes(){
+        this.$api.workNode.nodesByBusiness('PERSONAL_BUSINESS').then(res=>{
+          if (res.code === 200){
+              this.persoanlNodes = res.data
+          }
+        })
+    },
+    activate(row){
+      this.$confirm('确认激活:['+row.majorName+']订单?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+        center: true
+      }).then(()=>{
+          this.$api.workNodeInstance.activate(row.instanceId).then(res=>{
+            if (res.code === 200 && res.data){
+              this.$notify({
+                title: '成功',
+                message: '订单激活成功,可在我的待办中查看。',
+                type: 'success',
+                duration: 2000
+              });
+              this.getList();
+            }else {
+              this.$notify({
+                title: '失败',
+                message: '订单激活失败,请联系系统管理员。',
+                type: 'error',
+                duration: 2000
+              });
+            }
+          })
+      })
+    }
+  },
+  
+}
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 2 - 2
src/views/personal/order.vue

@@ -306,7 +306,7 @@
                       label-width="140px"
                       class="postInfo-container-item"
                     >
-                    <el-select v-model="personal.terminalClienteleType" placeholder="请选择" style="width:205px">
+                    <el-select v-model="personal.terminalClienteleType" placeholder="请选择" style="width:205px" @change="changeCustomerType(1)">
                             <el-option label="企业" value="企业"></el-option> 
                             <el-option label="个人" value="个人"></el-option>
                           </el-select>
@@ -1185,7 +1185,7 @@
               })
             }
         })
-      }
+        },
       },
     }
   </script>

+ 13 - 42
src/views/personal/readonlyDetail.vue

@@ -393,19 +393,7 @@
                       label-width="120px"
                       class="postInfo-container-item"
                     >
-                    <el-tooltip  v-if="currentNode.nodeCode==='DEPARTMENT_ALLOCATION'"
-                      placement="top-start"
-                      content="请确定外业人员"
-                      :manual=true
-                      v-model="outwardStaffTip"
-                      >
-                      <el-select v-model="personal.outwardStaff" filterable clearable>
-                        <el-option
-                          v-for="(item,id) in outwardStaffs" :key="item.id" :label="item.name" :value="item.id">
-                        </el-option>
-                      </el-select>
-                    </el-tooltip>
-                    <el-input :value="personal.outwardStaffName" class="filter-item" readonly disabled style=" width: 225px" v-else />
+                    <el-input :value="personal.outwardStaffName" class="filter-item" readonly disabled style=" width: 225px" />
                     </el-form-item>
                   </el-col>
                   <el-col :xs="24" :sm="12" :lg="5" :span="6">
@@ -918,9 +906,6 @@
                         </el-checkbox-group>
                       </el-form-item>
                     </el-col>
-                    <el-col :xs="24" :sm="12" :lg="6" :span="6" v-if="currentNode.nodeCode==='QUOTATION_FEEDBACK' || currentNode.nodeCode==='STATEMENT_FEEDBACK'">
-                        <el-button type="primary" @click="saveFeedback()">保存反馈</el-button>
-                    </el-col>
                   </el-row>
               </el-form>
             </div>  
@@ -1049,24 +1034,6 @@
             </el-table>
         </el-tab-pane>
       </el-tabs>
-      <el-dialog  :visible.sync="decideProductionTypeDialog" width="25%" center top="35vh" custom-class="doWarehouseClass">
-        <div>
-          <i class="el-icon-warning" style="color:RGB(230,162,60);font-size:22px;margin-right:10px;"></i>
-          <span style="position:absolute;top:58px">在此节点是否确定产品类型?</span>
-        </div>
-        <div style="margin-top:30px;margin-left:20px">
-          <el-radio-group v-model="target.feedback">
-            <el-radio label="NONE" value="NONE">不确定</el-radio>
-            <el-radio label="STATEMENT" value="STATEMENT">价值意见书</el-radio>
-            <el-radio label="REPORT" value="REPORT">报告</el-radio>
-            <el-radio label="LETTER" value="LETTER">复评函</el-radio>
-        </el-radio-group>
-        </div>
-        <span slot="footer" class="dialog-footer">
-          <el-button @click="decideProductionTypeDialog = false">取消</el-button>
-          <el-button type="primary" @click="saveFeedback()" >保存</el-button>
-        </span>
-      </el-dialog>
       <el-dialog  :visible.sync="inWarehouseDialog" width="30%" center top="35vh" custom-class="doWarehouseClass">
         <div>
           <i class="el-icon-warning" style="color:RGB(230,162,60);font-size:22px;margin-right:10px;"></i>
@@ -1502,7 +1469,7 @@
             productionId:null,
             hasStatement:false,
             hasReport:false,
-            feedback:[],
+            feedback:null,
             checkDialog:false,
             checkProDTO:{
               targetId:null,
@@ -1577,13 +1544,17 @@
                     if (res.data.sellingAbility){
                       this.target.sellingAbility = JSON.parse(res.data.sellingAbility);
                     }
-                    this.feedback = JSON.parse(res.data.feedback);
-                    this.nodeBusinessInfo.production = this.feedback;
-                    if (this.feedback.includes("STATEMENT")){
-                      this.hasStatement = true;
-                    }
-                    if (this.feedback.includes("REPORT")){
-                      this.hasReport = true;
+                    if (res.data.feedback){
+                      this.feedback = JSON.parse(res.data.feedback);
+                      this.nodeBusinessInfo.production = this.feedback;
+                      if (this.feedback.includes("STATEMENT")){
+                        this.hasStatement = true;
+                      }
+                      if (this.feedback.includes("REPORT")){
+                        this.hasReport = true;
+                      }
+                    }else{
+                      this.feedback = [];
                     }
                     
                 }

+ 161 - 45
src/views/personal/todoDetail.vue

@@ -248,9 +248,6 @@
                         <el-checkbox-button label="HOUSE_CERTIFICATE" name="credentials">房产证</el-checkbox-button>
                         <el-checkbox-button label="LAND_CERTIFICATE" name="credentials">国土证</el-checkbox-button>
                         <el-checkbox-button label="IMMOVABLE_CERTIFICATE" name="credentials">不动产权证</el-checkbox-button>
-                        <el-checkbox-button label="LEASE_CONTRACT" name="credentials">租赁合同</el-checkbox-button>
-                        <el-checkbox-button label="IDENTITY_CARD" name="credentials">身份证</el-checkbox-button>
-                        <el-checkbox-button label="NONE" name="credentials">无资料</el-checkbox-button>
                       </el-checkbox-group>
                     </el-form-item>
                   </el-col>
@@ -427,7 +424,7 @@
                     <el-form-item
                       label-width="160px"
                     >
-                    <el-button type="primary" round @click="saveOutwardStaff()">保存</el-button>
+                    <el-button v-if="currentNode.nodeCode === 'DEPARTMENT_ALLOCATION'" type="primary" round @click="saveOutwardStaff()">保存</el-button>
                     </el-form-item>
                   </el-col>
                 </el-row>
@@ -812,8 +809,6 @@
                         <el-checkbox-button label="HOUSE_CERTIFICATE" name="credentials">房产证</el-checkbox-button>
                         <el-checkbox-button label="LAND_CERTIFICATE" name="credentials" >国土证</el-checkbox-button>
                         <el-checkbox-button label="IMMOVABLE_CERTIFICATE" name="credentials" >不动产权证</el-checkbox-button>
-                        <el-checkbox-button label="LEASE_CONTRACT" name="credentials" >租赁合同</el-checkbox-button>
-                        <el-checkbox-button label="IDENTITY_CARD" name="credentials">身份证</el-checkbox-button>
                       </el-checkbox-group>
                   </div>
               </div>
@@ -931,7 +926,7 @@
                       </el-form-item>
                     </el-col>
                     <el-col :xs="24" :sm="12" :lg="6" :span="6" v-if="currentNode.nodeCode==='QUOTATION_FEEDBACK' || currentNode.nodeCode==='STATEMENT_FEEDBACK'">
-                        <el-button type="primary" @click="saveFeedback()">保存反馈</el-button>
+                        <el-button type="primary" round plain @click="saveFeedback()">保存反馈</el-button>
                     </el-col>
                   </el-row>
               </el-form>
@@ -949,10 +944,7 @@
                 </div>
               </div>
           </div>
-          <div style="display: flex;margin-top: 100px; width: 100%;">
-            <!-- <div style="position:absolute;top:80px; left:6%">
-              <el-button type="text">一键生成</el-button> <el-button type="text" @click="downloadPkg()">全部下载</el-button>
-            </div> -->
+          <div v-if="showProds" style="display: flex;margin-top: 100px; width: 100%;">
             <el-card :body-style="{ padding: '0px'}" shadow="always" style="margin-left: 5%; margin-right: 5%; width: 20%;" v-if="hasStatement">
               <img :src="statementCardPNG"  class="image">
               <div style="padding: 14px;">
@@ -1011,6 +1003,26 @@
                             <el-button type="text" style="position: relative; left: 10px;top: -4px;"  :disabled="currentNode.nodeCode!='WRITE_REPORT'">手动上传</el-button>
                   </el-upload>
             </el-card>
+            <el-card :body-style="{ padding: '0px'}" shadow="always" style="margin-left: 5%; margin-right: 5%;width: 20%;" v-if="hasLetter">
+              <img :src="letterCardPNG"  class="image">
+              <div style="padding: 14px;">
+                <span>复评函</span>
+                <span class="checked">{{ letterReprotProd.checkState }}<i v-if="letterReprotProd.checkState" class="el-icon-circle-check"></i></span>
+                <time class="time">{{ letterReprotProd.modified }}</time>
+                <div class="control" >
+                  <el-button type="text" class="button" @click="warehouse()" :disabled="currentNode.nodeCode!='LETTER_IN' && currentNode.nodeCode!='LETTER_OUT'">出入库</el-button>
+                </div>    
+              </div>
+              <el-upload style="position: relative; top: -10px;padding: 10px;"
+                    :action="'/api/personalProduction/upload/'+target.id+'/4'" :file-list="letterReprotProd.files" 
+                            :limit="1" :on-exceed="handleExceed" :on-preview="handleAttachmentPreview" :on-success="getProductions"
+                            :before-remove="handleRemoveFile">
+                            <el-button type="text" style="position: relative; left: 10px;top: -4px;"  :disabled="currentNode.nodeCode!='WRITE_LETTER'">手动上传</el-button>
+                  </el-upload>
+            </el-card>
+          </div>
+          <div v-else style="display: flex;margin-top: 100px; width: 100%;">
+            <span style="color:rgb(144,147,153); margin-left: 2.2%; width: 20%; margin-top:-3%">还没有选择产品类型</span>
           </div>
         </el-tab-pane>
         <el-tab-pane name="workflowLog" class="pane-class" :lazy=true>
@@ -1082,7 +1094,7 @@
         </div>
         <span slot="footer" class="dialog-footer">
           <el-button @click="decideProductionTypeDialog = false">取消</el-button>
-          <el-button type="primary" @click="saveFeedback()" >保存</el-button>
+          <el-button type="primary" @click="saveFeedbackWhenPrice()" >保存</el-button>
         </span>
       </el-dialog>
       <el-dialog  :visible.sync="inWarehouseDialog" width="30%" center top="35vh" custom-class="doWarehouseClass">
@@ -1233,7 +1245,32 @@
         feedback:{
           handler(newVal,oldVal){
             if (newVal!=oldVal){
+              this.nodeBusinessInfo.production = this.feedback;
               this.$refs.board.getInstanceQueue();
+              if (this.feedback.includes("STATEMENT")){
+                this.hasStatement = true;
+              }else{
+                this.hasStatement = false;
+              }
+              if (this.feedback.includes("REPORT")){
+                this.hasReport = true;
+              }else{
+                this.hasReport = false;
+              }
+              if (this.feedback.includes("LETTER")){
+                this.hasLetter = true;
+              }else{
+                this.hasLetter = false;
+              }
+              if (this.feedback.includes("REPORT") && this.feedback.includes("LETTER")){
+                this.$message.error('报告和复评函只能选其一');
+                this.feedback = oldVal;
+              }
+            }
+            if (this.feedback.length>0){
+                this.showProds = true
+            }else{
+              this.showProds = false;
             }
           },
           deep:true
@@ -1242,7 +1279,7 @@
       computed: {
         certificateCouldEdit(){
           let currentNodeCode = this.$route.query.currentNodeCode;
-          if (currentNodeCode==='GENERATE_STATEMENT'){
+          if (currentNodeCode==='GENERATE_STATEMENT' || currentNodeCode==='WRITE_REPORT' || currentNodeCode==='WRITE_LETTER'){
             return true;
           }else{
             return false;
@@ -1497,37 +1534,47 @@
                 targetId:null,
                 files:[],
                 created:null,
-                checkSatae:null
+                checkState:null
             },
             technicReportProd:{
                 id:null,
                 targetId:null,
                 files:[],
                 created:null,
-                checkSatae:null
+                checkState:null
             },
             finalReprotProd:{
                 id:null,
                 targetId:null,
                 files:[],
                 created:null,
+                checkState:null
+            },
+            letterReprotProd:{
+                id:null,
+                targetId:null,
+                files:[],
+                created:null,
                 checkSatae:null
             },
             statementCardPNG:emptyPNG,
             technicCardPNG:emptyPNG,
             finalCardPNG:emptyPNG,
+            letterCardPNG:emptyPNG,
             outWarehouseDialog:false,
             inWarehouseDialog:false,
             warehouseTip:null,
             productionId:null,
             hasStatement:false,
             hasReport:false,
-            feedback:[],
+            hasLetter:false,
+            feedback:null,
             checkDialog:false,
             checkProDTO:{
               targetId:null,
               production:null
-            }
+            },
+            showProds:true
 
         }
       },
@@ -1598,14 +1645,13 @@
                     if (res.data.sellingAbility){
                       this.target.sellingAbility = JSON.parse(res.data.sellingAbility);
                     }
-                    this.feedback = JSON.parse(res.data.feedback);
-                    this.nodeBusinessInfo.production = this.feedback;
-                    if (this.feedback.includes("STATEMENT")){
-                      this.hasStatement = true;
-                    }
-                    if (this.feedback.includes("REPORT")){
-                      this.hasReport = true;
+                    if (res.data.feedback){
+                      this.feedback = JSON.parse(res.data.feedback);
+                      this.nodeBusinessInfo.production = this.feedback;
+                    }else{
+                      this.feedback = []
                     }
+                  
                     
                 }
               })
@@ -1628,7 +1674,11 @@
                 })
             }
         },
-        handleClick(tab) {},
+        handleClick(tab) {
+          if ("producution" === tab && this.feedback==null){
+            this.feedback=[];
+          }
+        },
         showCredentials(){
           this.showCred = {};
           this.personal.credentials.forEach(element => {
@@ -1689,6 +1739,9 @@
                   callback(verify);
                   this.decideProductionTypeDialog = true
                   return ;
+                }else{
+                  callback(verify);
+                  return ;
                 }
               case "GENERATE_STATEMENT":
                   if (this.statementProd==null || this.statementProd.files.length===0){
@@ -1703,7 +1756,7 @@
                   callback(verify);
                   return ;
               case "REVIEW_STATEMENT":
-                if (!this.statementProd.checkState){
+                if (this.statementProd.checkState==='待审核'){
                   verify.state = false;
                   callback(verify);
                   this.checkProDTO.production = "STATEMENT";
@@ -1739,7 +1792,8 @@
                   callback(verify);
                   return ;
               case "CHECK_REPORT":
-                 if (!this.technicReportProd.checkState || !this.finalReprotProd.checkState){
+                console.log(this.technicReportProd.checkState)
+                 if (this.technicReportProd.checkState==='待审核' || this.finalReprotProd.checkState==='待审核'){
                     verify.state = false;
                     callback(verify);
                     this.checkProDTO.production = "REPORT";
@@ -1749,6 +1803,17 @@
                  }
                   callback(verify);
                   return ;
+              case "CHECK_LETTER":
+                if (!this.letterReprotProd.checkState){
+                  verify.state = false;
+                  callback(verify);
+                  this.checkProDTO.production = "LETTER";
+                  this.checkProDTO.targetId = this.target.id;
+                  this.checkDialog = true
+                  return ;
+                }
+                callback(verify);
+                return ;
             }
           }
         },
@@ -1809,7 +1874,7 @@
           this.$refs.board.commit(state);
         },
         jumpTabs(){
-          const orderTag = ['DEPARTMENT_ALLOCATION'];
+          const orderTag = ['OPENING_ORDER','DEPARTMENT_ALLOCATION'];
           const evaluate = ['SPOT_RECONNAISSANCE','DETERMINE_PRICE'];
           const certificates = ['GENERATE_STATEMENT','WRITE_REPORT','WRITE_LETTER']
           const nodeCode = this.$route.query.currentNodeCode;
@@ -1820,9 +1885,11 @@
             return 'evaluate'
           }
           if (certificates.includes(nodeCode)){
-            
             return 'certificateInfo';
           }
+          if (this.feedback==null){
+              this.feedback = [];
+          }
           return 'producution'
         },
         calulate(){
@@ -1925,7 +1992,7 @@
             }
           }
         },
-        saveFeedback(){
+        saveFeedbackWhenPrice(){
           this.nodeBusinessInfo.ifFeedback = true;
            if (this.target.id && this.target.feedback && this.target.feedback!='NONE'){
               this.nodeBusinessInfo.ifFeedback = false;
@@ -1934,11 +2001,6 @@
               feedbackReq.id = this.target.id;
               this.$api.personalTarget.feedback(feedbackReq);
            }
-           this.$notify({
-              title: '保存成功',
-              type: 'success',
-              duration: 2000
-            });
             this.decideProductionTypeDialog = false;
             this.commit("PASS");
         },
@@ -1958,6 +2020,33 @@
             this.showCred.showIdCer = !this.showCred.showIdCer;
         },
         genProductionFile(tag){
+          const certificates = this.personal.credentials
+          for (let i in certificates){
+              if (certificates[i]==='HOUSE_CERTIFICATE' && !this.target.houseCertificate){
+                this.$message.error('房产证信息未完善');
+                return;
+              }
+              if (certificates[i]==='LAND_CERTIFICATE' && !this.target.landCertificate){
+                this.$message.error('国土证信息未完善');
+                return;
+              }
+              if (certificates[i]==='IMMOVABLE_CERTIFICATE' && !this.target.immovableCertificate){
+                this.$message.error('不动产权证信息未完善');
+                return;
+              }
+          }
+          if (!this.target.entityInfo){
+            this.$message.error('实物状况信息未完善');
+            return ;
+          }
+          if (!this.target.backgroundInfo){
+            this.$message.error('区位状况信息未完善');
+            return ;
+          }
+          if (!this.target.sellingAbility){
+            this.$message.error('变现能力分析未完善');
+            return ;
+          }
           this.$confirm('系统生成将会覆盖原有文档,请确认是否继续?','提示',{
             confirmButtonText: '确认',
             cancelButtonText: '取消',
@@ -2127,6 +2216,18 @@
                       type: 'success',
                       duration: 2000
                   });
+                  const prodType = this.checkProDTO.production;
+                  if (prodType==='REPORT'){
+                    this.technicReportProd.checkState = '已审核';
+                    this.finalReprotProd.checkState = '已审核';
+                  }
+                  if (prodType==='STATEMENT'){
+                    this.statementProd.checkState = '已审核';
+                  }
+                  if (prodType==='LETTER'){
+                    this.letterReprotProd.checkState = '已审核';
+                  }
+                 this.commit("PASS"); 
               }else{
                 this.$notify({
                       title: '失败',
@@ -2136,7 +2237,6 @@
                     });
               }
               this.checkDialog = false;
-              this.getProductions();
             })
           }
           
@@ -2226,19 +2326,33 @@
         },
         saveFeedback(){
           let flag = true;
-         const oldFeedback = JSON.parse(this.target.feedback);
-         oldFeedback.forEach(element => {
-             if (!this.feedback.includes(element)){
-                this.$notify({
+          if (this.target.feedback){
+            const oldFeedback = JSON.parse(this.target.feedback);
+            oldFeedback.forEach(element => {
+                if (!this.feedback.includes(element)){
+                  if (element==='STATEMENT' && this.statementProd.id){
+                    this.$notify({
                         title: '提示',
                         message:'不能移除已存在的产品类型',
                         type: 'info',
                         duration: 2000
                       });
-                flag =false;   
-                return;
-             }
-         });
+                    flag =false;   
+                    return;
+                  }
+                  if (element==='REPORT' && (this.technicReportProd.id || this.finalReprotProd.id)){
+                    this.$notify({
+                        title: '提示',
+                        message:'不能移除已存在的产品类型',
+                        type: 'info',
+                        duration: 2000
+                      });
+                    flag =false;   
+                    return;
+                  }
+                }
+            });
+          }
          if (flag){
             const feedbackDTO = new Object();
             feedbackDTO.id = this.target.id;
@@ -2252,6 +2366,7 @@
                       type: 'success',
                       duration: 2000
                   });
+                  this.getPersonalTarget();
                 }else{
                   this.$notify({
                       title: '失败',
@@ -2262,7 +2377,8 @@
                 }
             })
           }
-         }
+         },
+
       }
     }
   </script>

+ 4 - 0
src/views/personal/todoList.vue

@@ -209,6 +209,10 @@ export default {
       else if(nodeCode==='REPORT_OUT_DEPARTMENT_CHECK' || nodeCode==='LETTER_OUT_DEPARTMENT_CHECK'){
         this.$router.push(`/out/warehouse/check?todoBusinessId=${row.businessId}&sNo=${row.orderId}&tId=${row.taskId}&cId=${row.currentNodeId}&nCode=${row.nodeCode}&businessType=PERSONAL_BUSINESS`)
       }
+      else if (row.nodeCode === 'BUSINESS_ARCHIVING'){
+          this.$router.push(`/personal/toSaveFile`)
+         return;
+      }
       else{
         this.$router.push(`/personal/todo?id=${row.businessId}&currentNodeCode=${row.nodeCode}&orderId=${row.orderId}&doWorkflow=${true}&back=${'/personal/todo/list'}`)
       }