WIN-20230912WHV\Administrator 2 lat temu
rodzic
commit
1ea3619a8f

+ 58 - 0
api/task.js

@@ -0,0 +1,58 @@
+import {request} from '@/service/ajax.js'
+
+const newsUrl = '/api/task/'
+// 获取基本信息
+export const getTaskType = (data) => request(newsUrl + 'type', 'post', { ...data },false)
+export const getTaskTypeInfo = (data) => request(newsUrl + 'type-info', 'post', { ...data },true)
+//获取任务基本选项信息
+export const getTaskOptions = (data) => request(newsUrl + 'options', 'post', { ...data },true)
+//获取联系人关系
+export const getTaskRelations = (data) => request(newsUrl + 'relations', 'post', { ...data },true)
+export const getClientInfo = (data) => request(newsUrl + 'client', 'post', { ...data },true)
+export const addTask = (data) => request(newsUrl + 'add', 'post', { ...data },true)
+// 任务详情
+export const getTaskDetail = (data) => request(newsUrl + 'detail', 'post', { ...data },true)
+//任务接单
+export const takeTask = (data) => request(newsUrl + 'take', 'post', { ...data },true)
+//审核
+export const auditTask = (data) => request(newsUrl + 'audit', 'post', { ...data },true)
+export const setMsg = (data) => request(newsUrl + 'add-msg', 'post', { ...data },true)
+export const getMsgList = (data) => request(newsUrl + 'msg-list', 'post', { ...data },false)
+export const getExecuteList = (data) => request(newsUrl + 'execute-list', 'post', { ...data },false)
+export const setExecute = (data) => request(newsUrl + 'set-execute', 'post', { ...data },false)
+export const getTaskStage = (data) => request(newsUrl + 'stage', 'post', { ...data },false)
+export const setExecuteTask = (data) => request(newsUrl + 'execute', 'post', { ...data },true)
+//获取可接单列表
+export const getTaskReceiving = (data) => request(newsUrl + 'receiving', 'post', { ...data },false)
+export const getTaskList = (data) => request(newsUrl + 'task-list', 'post', { ...data },false)
+export const endTask = (data) => request(newsUrl + 'end', 'post', { ...data },false)
+export const cancellation = (data) => request(newsUrl + 'cancellation', 'post', { ...data },false)
+export const delTask = (data) => request(newsUrl + 'del', 'post', { ...data },false)
+export const getStageList = (data) => request(newsUrl + 'stage-list', 'post', { ...data },false)
+export const getStageUser = (data) => request(newsUrl + 'stage-user', 'post', { ...data },false)
+export const getBusinessStageList = (data) => request(newsUrl + 'business-stage', 'post', { ...data },false)
+export const getBusinessCache = (data) => request(newsUrl + 'get-cache', 'post', { ...data },false)
+export const setBusinessCache = (data) => request(newsUrl + 'set-cache', 'post', { ...data },false)
+export const delBusinessCache = (data) => request(newsUrl + 'del-cache', 'post', { ...data },true)
+
+// 草稿Api
+export const addDraft = (data) => request(newsUrl + 'draft-add', 'post', { ...data },true)
+export const getDraftList = (data) => request(newsUrl + 'draft-list', 'post', { ...data },true)
+export const getDraftItem = (data) => request(newsUrl + 'draft-item', 'post', { ...data },true)
+export const delDraft = (data) => request(newsUrl + 'draft-del', 'post', { ...data },true)
+//阶段操作
+export const setStageOperate = (data) => request(newsUrl + 'operate', 'post', { ...data },true)
+export const getReturnedBankList = (data) => request(newsUrl + 'banks', 'post', { ...data },true)
+//录入数据校验
+export const verifyBusinessModuleKey = (data) => request(newsUrl + 'verify', 'post', { ...data },true)
+
+export const getWeekList = (data) => request(newsUrl + 'week', 'post', { ...data },true)
+export const getDayBacklogList = (data) => request(newsUrl + 'backlog', 'post', { ...data },true)
+export const setDayBacklog = (data) => request(newsUrl + 'status', 'post', { ...data },true)
+export const getProductData = (data) => request(newsUrl + 'product-data', 'post', { ...data },true)
+export const setPostLoan = (data) => request(newsUrl + 'set-loan', 'post', { ...data },true)
+
+
+// 贷后管理列表
+export const getLoanList = (data) => request(newsUrl + 'loan-list', 'post', { ...data },true)
+export const getAdjust = (data) => request(newsUrl + 'adjust', 'post', { ...data },true)

+ 127 - 0
components/PreviewImage/index.vue

@@ -0,0 +1,127 @@
+<template>
+  <view>
+    <uni-popup ref="popup" type="center">
+      <view class="popup-container" @click="close">
+
+        <swiper
+          class="swiper"
+          :current="current"
+          :duration="500"
+          @change="swiperChange"
+          @click.stop
+        >
+
+          <swiper-item
+            class="imgs-item"
+            v-for="(item, index) in imgs"
+            :key="index"
+          >
+            <movable-area scale-area class="movable-data">
+            <movable-view
+                class="movable-item"
+                direction="all"
+                :inertia="true"
+                :scale="true"
+                scale-min="1"
+                scale-max="4"
+            >
+              <image :src="item.img" mode="aspectFit" class="img"  />
+            </movable-view>
+            </movable-area>
+          </swiper-item>
+
+        </swiper>
+
+        <view class="count">{{ count }}/{{ imgs.length }}</view>
+      </view>
+    </uni-popup>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "PreviewImage",
+  props: {
+    imgs: {
+      type: Array,
+    },
+    current: {
+      type: Number,
+      default: 0,
+    },
+  },
+  data() {
+    return {
+      count: 1,
+    };
+  },
+
+  methods: {
+    swiperChange(e) {
+      this.count = e.detail.current + 1;
+    },
+    open(index) {
+      this.count = index + 1;
+      this.$refs.popup.open();
+    },
+    close() {
+      this.$refs.popup.close();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.popup-container {
+  position: relative;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 100vw;
+  height: 100vh;
+  background-color: rgba(0, 0, 0, 0.5);
+  color: #fff;
+
+  .count {
+    position: absolute;
+    bottom: 192px;
+    right: 10px;
+    width: 80px;
+    height: 30px;
+    color: #fff;
+    background-color: rgba(0, 0, 0, 0.5);
+    border-radius: 30px;
+    text-align: center;
+    line-height: 30px;
+  }
+}
+.swiper {
+  width: 100%;
+  height: 450px !important;
+}
+.imgs-item {
+  height: 100%;
+  .movable-data{
+    width: 100%;
+    height: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    .movable-item{
+      height: 100%;
+      width: 100%;
+      position:fixed;
+      overflow: hidden;
+      .img {
+        width: 100%;
+        height: 100%;
+        background-color: rgb(238, 238, 238);
+      }
+    }
+
+
+
+  }
+
+}
+</style>

+ 35 - 28
pages.json

@@ -1,32 +1,39 @@
 {
-	"pages": [
-		{
-			"path": "pages/index/index",
-			"style": {
-				"navigationBarTitleText": "首页演示"
-			}
-		},
-		{
-			"path": "pages/login/index",
-			"style": {
-				"navigationBarTitleText": "登陆"
-			}
-		}
-	],
-
-	"globalStyle": {
-		"navigationBarTextStyle": "black",
-		"navigationBarTitleText": "uni-app",
-		"navigationBarBackgroundColor": "#F8F8F8",
-		"backgroundColor": "#F8F8F8",
-		"navigationStyle": "custom"
-	},
-	"condition": {
-		"current": 0,
-		"list": [{
-			"name": "列表调试",
-			"path": "pages/text/index",
-			"query": ""
+  "pages": [
+    {
+      "path": "pages/index/index",
+      "style": {
+        "navigationBarTitleText": "首页演示"
+      }
+    },
+    {
+      "path": "pages/login/index",
+      "style": {
+        "navigationBarTitleText": "登陆"
+      }
+    },
+    {
+      "path": "pages/task/task-info",
+      "style": {
+        "navigationBarTitleText": "任务详情",
+        "enablePullDownRefresh": true
+      }
+    }
+  ],
+  "globalStyle": {
+    "navigationBarTextStyle": "black",
+    "navigationBarTitleText": "uni-app",
+    "navigationBarBackgroundColor": "#F8F8F8",
+    "backgroundColor": "#F8F8F8",
+    "navigationStyle": "custom"
+  },
+  "condition": {
+    "current": 0,
+    "list": [
+      {
+        "name": "列表调试",
+        "path": "pages/text/index",
+        "query": ""
 		}]
 	}
 }

+ 17 - 0
pages/index/task-item.vue

@@ -0,0 +1,17 @@
+<template>
+  <view>
+
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  }
+}
+</script>
+
+<style lang="scss">
+
+</style>

+ 472 - 0
pages/task/module/add-msg.vue

@@ -0,0 +1,472 @@
+<template>
+  <view class="msg-box">
+    <view class="leave-message-box" >
+      <view class="">
+        <textarea v-model="msgData.msg" placeholder="留个言吧" :maxlength="999" auto-height />
+      </view>
+      <view class="img-box">
+        <view class="credentials-img" @click="showImg(msgData.msg_img,pIndex)"
+              v-for="(msgImg,pIndex) in msgData.msg_img">
+          <image class="credentials-imgs" :src="msgImg.type===1?msgImg.url:getVideoImg(msgImg.url)" @error="" mode="aspectFill"></image>
+          <image v-if="msgImg.type===2"  class="video-img" src="@/static/task/video-img.png" mode=""></image>
+          <image @click.stop="shutImg(pIndex)" class="gb-img" src="@/static/login/gb.png" mode=""></image>
+
+        </view>
+        <view class="credentials-img">
+          <image class="img-box-img" @click="showUploadingImg(true)" src="/pages-task/static/add-client/scmb.png" mode=""></image>
+        </view>
+
+      </view>
+      <view class="file-box">
+        <view class="file-list">
+          <view class="file-item" v-for="(file,fileIndex) in msgData.file_list">
+            <view class="file-img">
+              <image src="/static/task/file-icon.png"></image>
+              <view class="img-icon" v-if="file.file_type===1">PDF</view>
+              <view class="img-icon icon-four" v-else-if="file.file_type===2">Word</view>
+              <view class="img-icon icon-two" v-else>XLS</view>
+            </view>
+            <view class="file-text">
+              {{file.name}}
+            </view>
+            <view class="file-set" @click.stop="setFile(fileIndex)">
+              <image src="/static/task/file-icon.png"></image>
+              <view class="but-list" :class="{'but-list-show':fileNum===fileIndex}">
+                <view class="but-item" @click.stop="editFile">重命名</view>
+                <view class="but-item" @click.stop="delFile(fileIndex)">删除</view>
+              </view>
+            </view>
+          </view>
+        </view>
+
+        <view class="add-file" @click="uploadingFile(5)">
+          <view class="add-img">
+            <image src="@/static/task/add-file.png"></image>
+          </view>
+          <view class="add-text">
+            上传附件文档
+          </view>
+        </view>
+
+      </view>
+    </view>
+
+    <uni-popup ref="editPopup" type="bottom">
+      <view class="popup-edit">
+        <view class="edit-nav">
+          修改文件名
+        </view>
+          <en-input label="文件名" placeholder="请输入文件名" v-model="fileName"></en-input>
+          <button class="edit-but" @click="setFileName">保存</button>
+      </view>
+    </uni-popup>
+
+    <uni-popup ref="popup" type="bottom">
+      <view class="popup-block">
+        <view class="popup-row" @click="uploadingFile(1)">拍照</view>
+        <view class="popup-row" @click="uploadingFile(2)">选择照片</view>
+        <view class="popup-row" @click="uploadingFile(3)">录像</view>
+        <view class="popup-row" @click="uploadingFile(4)">选择视频</view>
+        <view class="popup-row" @click="showUploadingImg(false)">取消</view>
+      </view>
+    </uni-popup>
+
+  </view>
+</template>
+
+<script>
+import txUploadFile from "@/common/js/txOssSts";
+import tools from "@/common/js/tools";
+import EnInput from "@/components/en-from/en-input/en-input";
+
+export default {
+  name: "add-msg",
+  components: {EnInput},
+  props: {
+    value:{
+      default:{
+        business_id: '',
+        reply_id: 0,
+        'msg': '',
+        'msg_img': [],
+        'file_list': [],
+      }
+    }
+  },
+  data() {
+    return {
+      fileNum:-1,
+      msgData:{
+        'msg': '',
+        'msg_img': [],
+        'file_list': [],
+      },
+      fileName:'',
+    }
+  },
+  watch: {
+    'msgData':{
+      handler() {
+        this.$emit('input',this.msgData)
+      },
+      deep: true
+    }
+  },
+  mounted() {
+    this.msgData=this.value
+  },
+  methods: {
+    setFile(fileIndex){
+      this.fileNum=fileIndex
+    },
+    setFileName(){
+      if( this.fileName===''){
+        tools.error('请输入文件名称')
+        return
+      }
+      this.msgData.file_list[this.fileNum].name=this.fileName
+      this.$refs.editPopup.close();
+      this.fileNum=-1
+    },
+    editFile(){
+      this.fileName=this.msgData.file_list[this.fileNum].name;
+      this.$refs.editPopup.open("bottom");
+    },
+    delFile(fileIndex){
+      this.msgData.file_list.splice(fileIndex, 1)
+      this.fileNum=-1
+    },
+    getVideoImg(url){
+      return tools.getOssVideo(url)
+    },
+    shutImg(indexT) {
+      this.msgData.msg_img.splice(indexT, 1)
+    },
+    showImg(item, index) {
+
+    },
+    showUploadingImg(showImg) {
+      if (showImg) {
+        this.$refs.popup.open("bottom");
+      } else {
+        this.$refs.popup.close();
+      }
+      tools.hideLoading()
+    },
+    uploadingFile(fileType){
+      if(fileType<3){
+        this.uploadingImg(fileType)
+      }else if(fileType<5){
+        this.uploadingVideo(fileType)
+      }else {
+        this.uploadingWord()
+      }
+    },
+    uploadingWord(){
+      tools.showLoading()
+      wx.chooseMessageFile({
+        count: 5, //默认100
+        type: 'file', //默认100
+        extension:['pdf','doc','docx','xlsx','xls'],
+        success:  (res)=> {
+          console.log('---------------------------------------------');
+          console.log(res);
+          if (res.tempFiles.length > 0) {
+            res.tempFiles.forEach((tempFilePath) => {
+              console.log(tempFilePath)
+              txUploadFile(tempFilePath.path).then((data) => {
+                if (!data) {
+                  tools.error('图片上传失败')
+                } else {
+                  console.log({'name':tempFilePath.name,'file_type':tools.getFileType(data.Location),'url':data.Location})
+                  console.log('---------------------------------------------');
+                  this.msgData.file_list.push({'name':tempFilePath.name,'file_type':tools.getFileType(data.Location),'url':data.Location})
+                }
+              })
+            })
+            this.showUploadingImg(false);
+          } else {
+            tools.error("请选择上传文件")
+            tools.hideLoading()
+          }
+        },
+        fail:(e)=>{
+          tools.hideLoading()
+        }
+      });
+
+    },
+    uploadingVideo(sourceType){
+      tools.showLoading()
+      uni.chooseVideo({
+        sizeType: "compressed",
+        sourceType: [sourceType === 3 ? 'camera' : 'album'],
+        success:  (res) =>{
+          txUploadFile(res.tempFilePath).then((data) => {
+            if (!data) {
+              tools.error('视频上传失败')
+            } else {
+              setTimeout(()=>{
+                this.msgData.msg_img.push({'type':2,'url':data.Location})
+              },1500)
+            }
+            this.showUploadingImg(false);
+          }).catch((e)=>{
+            tools.hideLoading()
+          })
+        },
+        fail:(e)=>{
+          tools.hideLoading()
+        }
+      });
+    },
+    uploadingImg(sourceType) {
+      tools.showLoading()
+      uni.chooseMedia({
+        mediaType: 'image',
+        count: sourceType === 1 ? 1 : 9, //默认9
+        sizeType: "compressed",
+        sourceType: [sourceType === 1 ? 'camera' : 'album'],
+        success: (res) => {
+          console.log(res)
+          if (res.tempFiles.length > 0) {
+            res.tempFiles.forEach((tempFile) => {
+              txUploadFile(tempFile.tempFilePath).then((data) => {
+                if (!data) {
+                  tools.error('图片上传失败')
+                } else {
+                  this.msgData.msg_img.push({'type':1,'url':data.Location})
+                }
+              })
+            })
+            this.showUploadingImg(false);
+          } else {
+            tools.error("请选择上传的图片")
+            tools.hideLoading()
+          }
+        },
+        fail:(e)=>{
+          tools.hideLoading()
+        }
+      });
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.msg-box{
+  .popup-block {
+    border-radius: 20rpx 20rpx 0rpx 0rpx;
+    overflow: hidden;
+    background-color: #f5f5f5;
+
+    .popup-row {
+      height: 100rpx;
+      background-color: #fff;
+      text-align: center;
+      line-height: 100rpx;
+      border-bottom: 2rpx solid #f5f5f5;
+
+      &:nth-child(4) {
+        margin-bottom: 20rpx;
+      }
+
+      &:last-child {
+        height: 112rpx;
+        border: none;
+        line-height: 112rpx;
+      }
+
+      &:active {
+        background-color: rgb(244, 244, 244);
+      }
+    }
+  }
+  .popup-edit{
+    border-radius: 20rpx 20rpx 0rpx 0rpx;
+    overflow: hidden;
+    background-color: #fff;
+    padding: 20rpx;
+    min-height: 50vh;
+    position: relative;
+    .edit-nav {
+      font-size: 18px;
+      font-weight: bold;
+      text-align: center;
+      padding: 30rpx 0 15rpx;
+      background: #fff;
+    }
+    .edit-but{
+      margin-top: 20rpx;
+      height: 88rpx;
+      line-height: 88rpx;
+      text-align: center;
+      font-size: 32rpx;
+      background: #3169FA;
+      color: #fff;
+      position: absolute;
+      bottom: 20rpx;
+      width: calc(100vw - 20rpx);
+    }
+  }
+  .leave-message-box {
+    width: 100%;
+    height: auto;
+    padding: 36rpx 30rpx 52rpx;
+    box-sizing: border-box;
+    background: #fff;
+
+    .img-box {
+      width: 100%;
+      height: auto;
+      display: flex;
+      flex-wrap: wrap;
+      padding: 40rpx 0 0 0;
+
+      .credentials-img {
+        width: calc((100vw - 92rpx)/3);
+        height: calc((100vw - 92rpx)/3);
+        margin-right:16rpx;
+        position: relative;
+        .credentials-imgs {
+          width: calc((100vw - 92rpx)/3);
+          height: calc((100vw - 92rpx)/3);
+          display: block;
+        }
+        .video-img{
+          position: absolute;
+          top:calc(50% - 28rpx);
+          left:calc(50% - 28rpx);
+          width: 56rpx;
+          height: 56rpx;
+        }
+        .gb-img {
+          width: 32rpx;
+          height: 32rpx;
+          position: absolute;
+          right: 0;
+          top: 0;
+          z-index: 2;
+        }
+        .img-box-img {
+          width: calc((100vw - 92rpx)/3);
+          height: calc((100vw - 92rpx)/3);
+        }
+      }
+      .credentials-img:nth-of-type(3n+0){
+        margin-right:0;
+      }
+      .credentials-img:nth-of-type(n+4){
+        margin-top:16rpx;
+      }
+
+
+
+    }
+    .file-box{
+      .file-list{
+        .file-item{
+          height:72rpx;
+          padding: 39rpx 2rpx;
+          display: flex;
+          justify-content: left;
+          .file-img{
+            height: 72rpx;
+            width: 72rpx;
+            position: relative;
+            .img-icon{
+              position: absolute;
+              left: 0;
+              top: 37rpx;
+              width: 32rpx;
+              height: 20rpx;
+              background: #F24949;
+              font-weight: 600;
+              color: #FFFFFF;
+              font-size: 12rpx;
+              line-height: 20rpx;
+              text-align: center;
+            }
+            .icon-two{
+              background: #00BF72;
+            }
+            .icon-three{
+              background: #F9742C;
+            }
+            .icon-four{
+              background: #0083FB;
+            }
+            image{
+              height: 72rpx;
+              width: 72rpx;
+            }
+          }
+          .file-text{
+            margin-left: 24rpx;
+            width: calc(100vw - 214rpx);
+            height: 72rpx;
+            line-height: 72rpx;
+            color: #333333;
+            display: -webkit-box;
+            -webkit-line-clamp: 1;
+            -webkit-box-orient: vertical;
+            overflow: hidden;
+          }
+          .file-set{
+            margin-top:21rpx ;
+            width: 30rpx;
+            position: relative;
+            image{
+              width: 30rpx;
+              height: 30rpx;
+            }
+
+            .but-list{
+              display: none;
+              position: absolute;
+              width: 168rpx;
+              height: 204rpx;
+              left: -200rpx;
+              top: 15rpx;
+              background: rgba(51,51,51,0.39);
+              border-radius: 8rpx;
+              padding-left: 32rpx;
+              .but-item{
+                height: 102rpx;
+                line-height: 102rpx;
+                font-size: 32rpx;
+                color: #FFFFFF;
+              }
+            }
+            .but-list-show{
+              display: block;
+            }
+          }
+        }
+      }
+      .add-file{
+        height:72rpx;
+        padding: 39rpx 2rpx;
+        display: flex;
+        justify-content: left;
+        .add-img{
+          height: 72rpx;
+          width: 72rpx;
+          image{
+            height: 72rpx;
+            width: 72rpx;
+          }
+        }
+        .add-text{
+          height: 72rpx;
+          line-height: 72rpx;
+          color: #333333;
+          margin-left: 16rpx;
+        }
+      }
+    }
+  }
+}
+
+</style>

+ 113 - 0
pages/task/module/identity-item.vue

@@ -0,0 +1,113 @@
+<template>
+  <view class="identity-box">
+    <view class="identity-item">
+      <view class="item-img" @click="previewImage(identity_one)">
+        <image v-if="identity_one"  :src="identity_one" mode="aspectFill"></image>
+        <image v-else  src="https://wealfavor-1257406827.cos.ap-beijing.myqcloud.com/app-serve/2023-4-16/gk2xruydmj.png" mode="aspectFill"></image>
+        <view class="img-text">身份证正面</view>
+      </view>
+      <view class="item-img" @click="previewImage(identity_two)">
+        <image v-if="identity_two" :src="identity_two" mode="aspectFill"></image>
+        <image v-else src="https://wealfavor-1257406827.cos.ap-beijing.myqcloud.com/app-serve/2023-4-16/gk2xsr9ud6.png" mode="aspectFill"></image>
+        <view class="img-text">身份证反面</view>
+      </view>
+    </view>
+
+  </view>
+</template>
+
+<script>
+
+
+export default {
+  name: "identity-item",
+  components: {},
+  props: {
+    'identityOne':{
+      default:'',
+    },
+    'identityTwo':{
+      default:'',
+    },
+
+  },
+  data() {
+    return {
+      identity_one:'',
+      identity_two:'',
+
+    }
+  },
+  watch: {
+    'identityOne':function (){
+      this.setIdentityOne()
+    },
+    'identityTwo':function (){
+      this.setIdentityTwo()
+    }
+  },
+  mounted() {
+    this.setIdentityOne()
+    this.setIdentityTwo()
+  },
+  methods: {
+    previewImage(img){
+      this.$emit('onShowImg',img)
+    },
+    setIdentityOne(){
+      if(this.identityOne){
+        if(this.identityOne!==this.identity_one){
+          this.identity_one=this.identityOne
+        }
+      }
+    },
+    setIdentityTwo(){
+      if(this.identityTwo){
+        if(this.identityTwo!==this.identity_two){
+          this.identity_two=this.identityTwo
+        }
+      }
+    },
+    closePopup(e){
+      if(e.show===false){
+        this.isUploading=false
+      }
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import "static/css/common/wh-common";
+.identity-box{
+  .identity-title{
+    padding: 20rpx 0;
+    font-size: 24rpx;
+    color: #999;
+    font-weight: 400;
+  }
+  .identity-item{
+    display: flex;
+    justify-content: space-between;
+    padding-bottom: 20rpx;
+    .item-img{
+      width: calc(50% - 9rpx);
+      image{
+        width:100%;
+        height: 190rpx;
+        border-radius: 6rpx;
+      }
+      .img-text{
+        margin-top: 19rpx;
+        text-align: center;
+        color: #232A35;
+        font-size: 24rpx;
+        font-weight: 400;
+
+      }
+    }
+  }
+
+}
+
+</style>

+ 107 - 0
pages/task/module/item-img.vue

@@ -0,0 +1,107 @@
+<template>
+  <view class="item-line" :class="{'line-one':lineType===1,'line-two':lineType===2}">
+    <view class="item-img">
+      <view class="item-key">{{label}}</view>
+      <view class="item-img">
+        <view class="img-item" v-for="img in imgList">
+          <image :src="img" @click="previewImage(img)" mode="aspectFill"></image>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "item-img",
+  components: {},
+  props: {
+    lineType:{
+      type:Number,
+      default:0
+    },
+    label: {
+      type: String,
+      default: '标题'
+    },
+    value: {
+      default: []
+    },
+    keyStr: {
+      default: true
+    },
+    typeKeys:{
+      default:[]
+    }
+  },
+  data() {
+    return {
+      imgList:[],
+      isShow:true
+    }
+  },
+  watch: {},
+  mounted() {
+    this.setIsShow()
+    this.setImgList()
+  },
+  methods: {
+    setImgList(){
+      if(typeof this.value ==='string'){
+        this.imgList=[this.value]
+      }else {
+        this.imgList=this.value
+      }
+    },
+    setIsShow(){
+      if(this.keyStr!==true){
+        if(this.typeKeys.indexOf(this.keyStr)<0){
+          this.isShow=false
+        }
+      }
+    },
+    previewImage(img){
+     this.$emit('onShowImg',img)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.item-line{
+  padding: 16rpx 0;
+  .item-img{
+    .item-key{
+      color: #999999;
+      font-size: 30rpx;
+      margin-bottom: 16rpx;
+    }
+    .item-img{
+      height: auto;
+      display: flex;
+      flex-wrap: wrap;
+      .img-item{
+        display: inline-block;
+        margin-right:12rpx;
+        image{
+          width: calc((100vw - 100rpx)/4);
+          height: calc((100vw - 100rpx)/4);
+          border-radius: 8rpx;
+        }
+      }
+      .img-item:nth-of-type(4n+0){
+        margin-right:0;
+      }
+      .img-item:nth-of-type(n+5){
+        margin-top:12rpx;
+      }
+    }
+  }
+}
+.line-one{
+  padding-top: 0;
+}
+.line-two{
+  padding-bottom: 0;
+}
+</style>

+ 91 - 0
pages/task/module/item-text.vue

@@ -0,0 +1,91 @@
+<template>
+  <view class="item-line" v-show="isShow" :class="{'line-one':lineType===1,'line-two':lineType===2}">
+    <view class="item-text">
+      <view class="item-key">{{label}}</view>
+      <view class="item-value" v-if="radioType">{{radioData[value+'']}}{{rightText?rightText:''}}</view>
+      <view class="item-value" v-else>{{value?value:'-'}} {{rightText?rightText:''}}</view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "item-text",
+  components: {},
+  props: {
+    lineType:{
+      type:Number,
+      default:0
+    },
+    label: {
+      type: String,
+      default: '标题'
+    },
+    rightText: {
+      type: String,
+      default: ''
+    },
+    value: {
+      default: ''
+    },
+    keyStr: {
+      default: true
+    },
+    radioData:{
+      default:false
+    },
+    typeKeys:{
+      default:[]
+    }
+  },
+  data() {
+    return {
+      radioType:false,
+      isShow:true
+    }
+  },
+  watch: {},
+  mounted() {
+    if(this.radioData){
+      this.radioType=true
+    }
+    this.setIsShow()
+  },
+  methods: {
+    setIsShow(){
+      if(this.keyStr!==true){
+        if(this.typeKeys.indexOf(this.keyStr)<0){
+          this.isShow=false
+        }
+      }
+
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.item-line{
+  padding: 16rpx 0;
+  .item-text{
+    display: flex;
+    justify-content: space-between;
+    .item-key{
+      color: #999999;
+      font-size: 30rpx;
+      min-width: 130rpx;
+      margin-right: 20rpx;
+    }
+    .item-value{
+      color: #333333;
+      font-size: 30rpx;
+    }
+  }
+}
+.line-one{
+  padding-top: 0;
+}
+.line-two{
+  padding-bottom: 0;
+}
+</style>

+ 82 - 0
pages/task/module/item-title.vue

@@ -0,0 +1,82 @@
+<template>
+  <view class="item-line" :class="{'line-one':lineType===1,'line-two':lineType===2,'line-three':lineType===3}">
+    <view class="item-title" :class="{'title-two':titleType===2}">
+      <view class="title-circle"></view>
+      <view class="title-text">{{label}}</view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "item-title",
+  components: {},
+  props: {
+    lineType:{
+      type:Number,
+      default:0
+    },
+    titleType:{
+      type:Number,
+      default:1
+    },
+    label: {
+      type: String,
+      default: '标题'
+    },
+  },
+  data() {
+    return {}
+  },
+  watch: {},
+  mounted() {
+
+  },
+  methods: {}
+}
+</script>
+
+<style scoped lang="scss">
+.item-line{
+  padding: 16rpx 0;
+  .item-title{
+    display: flex;
+    justify-content: left;
+    height: 45rpx;
+    .title-circle{
+      margin-top: 19rpx;
+      margin-right: 8rpx;
+      width: 12rpx;
+      height: 12rpx;
+      border-radius: 50%;
+      background: #306AFB;
+    }
+    .title-text{
+      font-size: 32rpx;
+      color: #333;
+      font-weight: 600;
+      line-height: 45rpx;
+    }
+  }
+  .title-two{
+    .title-circle{
+      display: none;
+    }
+    .title-text{
+      color: #333333;
+      font-weight: 400;
+      font-size: 28rpx;
+    }
+  }
+}
+.line-one{
+  padding-top: 0;
+}
+.line-two{
+  padding-bottom: 0;
+}
+.line-three{
+  padding-top: 32rpx;
+}
+
+</style>

+ 80 - 0
pages/task/module/task-apply-for.vue

@@ -0,0 +1,80 @@
+<template>
+  <view class="item-box">
+    <item-title label="基本信息" :line-type="1"></item-title>
+    <item-text label="贷款额度" :value="applyFor.quota"  :type-keys="typeKeys" key-str="quota"  right-text="万元"></item-text>
+    <item-text label="批复额度" v-if="applyFor.out_total>0" :value="applyFor.out_total"  :type-keys="typeKeys" key-str="out_total"  right-text="万元"></item-text>
+    <item-text label="回款额度" v-if="applyFor.returned_total>0" :value="applyFor.returned_total"  :type-keys="typeKeys" key-returned_total="insurance_name"  right-text="万元"></item-text>
+    <item-text label="是否涉农" :value="applyFor.is_farming"  :type-keys="typeKeys" key-str="is_farming" :radio-data="isNo" ></item-text>
+    <item-text label="贷款类型" :value="applyFor.loan_form_name"  :type-keys="typeKeys" key-str="loan_form"  ></item-text>
+    <item-text label="贷款类别" :value="applyFor.loan_type_name"  :type-keys="typeKeys" key-str="loan_type"  ></item-text>
+    <item-text label="投向行业" :value="applyFor.loan_industry_name"  :type-keys="typeKeys" key-str="loan_industry"  ></item-text>
+    <item-text label="企业类型" :value="applyFor.enterprise_type_name"  :type-keys="typeKeys" key-str="enterprise_type"  ></item-text>
+    <item-text label="材料费支付状态" :value="applyFor.pay_status"  :type-keys="typeKeys" key-str="pay_status"  :radio-data="{'1':'已缴纳','0':'未缴纳'}"></item-text>
+    <view class="apply-item" v-for="(applyItem,applyKey) in applyFor.apply_data">
+      <item-title :label="(applyItem.apply_type*1===1?'抵押':'买卖')+'抵押信息('+(applyKey+1)+')'" ></item-title>
+      <item-text label="申请类型" :value="applyItem.apply_type"  :type-keys="typeKeys" key-str="apply_type" :radio-data="{'1':'抵押','2':'买卖'}"  ></item-text>
+      <view v-if="applyItem.propertyName!==''">
+        <item-title label="绑定资产信息" ></item-title>
+        <item-text label="资产信息" :value="applyItem.propertyName"   ></item-text>
+      </view>
+      <view  v-if="applyItem.apply_type*1===2">
+        <item-text label="成交价" :value="applyItem.transaction"  :type-keys="typeKeys" key-str="transaction"  right-text="万元"></item-text>
+        <item-text label="定金" :value="applyItem.pricing"  :type-keys="typeKeys" key-str="pricing"  right-text="万元"></item-text>
+        <item-text label="资金监管" :value="applyItem.supervise"  :type-keys="typeKeys" key-str="supervise"  right-text="万元"></item-text>
+        <item-text label="批复类型" :value="applyItem.reply_type"  :type-keys="typeKeys" key-str="reply_type"  :radio-data="{'1':'商业','2':'组合'}"></item-text>
+        <item-text label="成交中介" :value="applyItem.intermediary"  :type-keys="typeKeys" key-str="intermediary"  ></item-text>
+      </view>
+     <view class="applyBank" v-for="(repayment,repaymentKey) in applyItem.repayment_data">
+       <item-title :label="(applyItem.apply_type*1===1?'还款信息':'监管银行卡信息')+'('+(repaymentKey+1)+')'"  :title-type="2"></item-title>
+       <item-text label="还款金额" :value="repayment.money"  v-if="applyItem.apply_type*1===1"  right-text="万元"></item-text>
+       <item-text label="银行卡号" :value="repayment.bank_num"    ></item-text>
+       <item-text label="所属银行" :value="repayment.bank_name"   ></item-text>
+     </view>
+      <view class="applyBank" v-for="(loan,loanKey) in applyItem.loan_data">
+        <item-title :label="'放款银行卡信息('+(loanKey+1)+')'"  :title-type="2"></item-title>
+        <item-text label="批复金额" :value="loan.money"   right-text="万元"></item-text>
+        <item-text label="银行卡号" :value="loan.bank_num"    ></item-text>
+        <item-text label="所属银行" :value="loan.bank_name"    ></item-text>
+      </view>
+
+
+
+    </view>
+
+  </view>
+</template>
+
+<script>
+import ItemTitle from "@/pages-task/task-info/module/item-title";
+import ItemText from "@/pages-task/task-info/module/item-text";
+export default {
+  name: "task-apply-for",
+  components: {ItemText, ItemTitle},
+  props: {
+    applyFor:{
+      default:{}
+    },
+    typeKeys:{
+      default:[]
+    }
+  },
+  data() {
+    return {
+      isNo:{'1':'是','0':'否'}
+    }
+  },
+  watch: {},
+  mounted() {
+
+  },
+  methods: {
+    onShowImg(img){
+      this.$emit('onShowImg',img)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/static/css/task-info/item";
+</style>

+ 80 - 0
pages/task/module/task-client.vue

@@ -0,0 +1,80 @@
+<template>
+  <view class="item-box">
+    <item-title label="客户基本信息" :line-type="1"></item-title>
+    <view class="item-line">
+      <identity-item @onShowImg="onShowImg" :identity-one="business.identity_one" :identity-two="business.identity_two"></identity-item>
+    </view>
+    <item-text label="姓名" :value="business.name" key-str="name" :type-keys="typeKeys"></item-text>
+    <item-text label="身份证" :value="business.id_number" key-str="id_number" :type-keys="typeKeys"></item-text>
+    <item-text label="性别" :value="business.sex" key-str="sex" :type-keys="typeKeys" :radio-data="{'1':'男','2':'女'}"></item-text>
+    <item-text label="生日" :value="business.birthday" birthday="sex" :type-keys="typeKeys"></item-text>
+    <item-text label="手机号" :value="business.phone" key-str="phone" :type-keys="typeKeys"></item-text>
+    <item-text label="日常居城市" :value="business.resident_city" key-str="resident_city" :type-keys="typeKeys"></item-text>
+    <item-text label="日常居住地" :value="business.resident_address" key-str="resident_address" :type-keys="typeKeys"></item-text>
+    <item-title label="婚姻状况信息" :line-type="3" v-show="verifyKey('marriage_type')"></item-title>
+    <view >
+      <item-text label="婚姻状况信息" :value="business.marriage_type" key-str="marriage_type" :type-keys="typeKeys" :radio-data="{'1':'单身','2':'已婚','3':'离异','4':'丧偶'}"></item-text>
+      <item-img @onShowImg="onShowImg" label="结婚证件" v-if="business.marriage_type>1" :value="business.marriage_img" key-str="marriage_img" :type-keys="typeKeys"></item-img>
+      <view v-if="business.marriage_type===2">
+        <item-title label="配偶基本信息" :line-type="3"></item-title>
+        <view class="item-line">
+          <identity-item @onShowImg="onShowImg" :identity-one="business.m_identity_one" :identity-two="business.m_identity_two"></identity-item>
+        </view>
+        <item-text label="配偶姓名" :value="business.mate_name" key-str="mate_name" :type-keys="typeKeys"></item-text>
+        <item-text label="配偶身份证号" :value="business.mate_id_number" key-str="mate_id_number" :type-keys="typeKeys"></item-text>
+        <item-text label="配偶手机号" :value="business.mate_phone" key-str="mate_phone" :type-keys="typeKeys"></item-text>
+        <item-text label="配偶所在企业" :value="business.mate_firm" key-str="mate_firm" :type-keys="typeKeys"></item-text>
+      </view>
+    </view>
+
+    <item-title label="教育背景/职业信息" :line-type="3" v-show="verifyKey('education_type') || verifyKey('employ_type') || verifyKey('firm_name')|| verifyKey('firm_city')|| verifyKey('firm_address')"></item-title>
+    <item-text label="教育背景" :value="business.education_name" key-str="education_type" :type-keys="typeKeys"></item-text>
+    <item-text label="雇佣类型" :value="business.employ_type" key-str="employ_type" :type-keys="typeKeys" :radio-data="{'1':'受薪','2':'自雇'}"></item-text>
+    <item-text label="企业名称" :value="business.firm_name" key-str="firm_name" :type-keys="typeKeys"></item-text>
+    <item-text label="公司城市" :value="business.firm_city" key-str="firm_city" :type-keys="typeKeys"></item-text>
+    <item-text label="公司地址" :value="business.firm_address" key-str="firm_address" :type-keys="typeKeys"></item-text>
+    <item-title label="社保基本信息" :line-type="3" v-show="verifyKey('social_num') || verifyKey('reserved_money')"></item-title>
+    <item-text label="社保连续缴纳时间" :value="business.social_num" key-str="social_num" :type-keys="typeKeys" right-text="个月"></item-text>
+    <item-text label="公积金缴费基数" :value="business.reserved_money" key-str="reserved_money" :type-keys="typeKeys" right-text="元"></item-text>
+  </view>
+</template>
+
+<script>
+import IdentityItem from "@/pages-task/task-info/module/identity-item";
+import ItemTitle from "@/pages-task/task-info/module/item-title";
+import ItemText from "@/pages-task/task-info/module/item-text";
+import ItemImg from "@/pages-task/task-info/module/item-img";
+
+export default {
+  name: "task-client",
+  components: {ItemImg, ItemText, ItemTitle, IdentityItem},
+  props: {
+    business:{
+      default:{}
+    },
+    typeKeys:{
+      default:[]
+    }
+  },
+  data() {
+    return {}
+  },
+  watch: {},
+  mounted() {
+
+  },
+  methods: {
+    verifyKey(field) {
+      return this.typeKeys.indexOf(field) >= 0
+    },
+    onShowImg(img){
+      this.$emit('onShowImg',img)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/static/css/task-info/item";
+
+</style>

+ 86 - 0
pages/task/module/task-credit.vue

@@ -0,0 +1,86 @@
+<template>
+  <view class="item-box">
+  <view class="tripartite-item">
+    <item-img label="征信照片" :value="credit.credit_img" @onShowImg="onShowImg"></item-img>
+  </view>
+  <view class="tripartite-item" v-for="(deal,dealIndex) in credit.deal_data">
+    <item-title :title-type="2" v-if="deal.deal_type*1===1" label="个人住房贷款" ></item-title>
+    <item-title :title-type="2" v-else-if="deal.deal_type*1===2" label="个人商用住房贷款" ></item-title>
+    <item-title :title-type="2" v-else-if="deal.deal_type*1===3" label="其他类贷款" ></item-title>
+    <item-title :title-type="2" v-else-if="deal.deal_type*1===4" label="贷记卡" ></item-title>
+    <item-title :title-type="2" v-else-if="deal.deal_type*1===5" label="其他" ></item-title>
+    <item-text label="账户数" :value="deal.account_num" ></item-text>
+    <item-text label="首笔业务发放年份" :value="deal.first_date" ></item-text>
+  </view>
+
+    <view class="tripartite-item" v-for="(overdue,overdueIndex) in credit.overdue_data">
+      <item-title :title-type="2" v-if="overdue.overdue_type*1===1" label="循环贷款账户一信息汇总" ></item-title>
+      <item-title :title-type="2" v-else-if="overdue.overdue_type*1===2" label="循环贷款账户二信息汇总" ></item-title>
+      <item-title :title-type="2" v-else-if="overdue.overdue_type*1===3" label="循环贷款账户三信息汇总" ></item-title>
+      <item-title :title-type="2" v-else-if="overdue.overdue_type*1===4" label="贷记卡账户信息汇总" ></item-title>
+      <item-title :title-type="2" v-else-if="overdue.overdue_type*1===5" label="准贷记卡账户信息汇总" ></item-title>
+      <item-text label="管理机构数" :value="overdue.regulate_num" ></item-text>
+      <item-text label="账户数" :value="overdue.account_num" ></item-text>
+      <item-text label="授信总额" :value="overdue.credit_money" ></item-text>
+      <item-text label="余额" :value="overdue.balance" ></item-text>
+      <item-text label="最近6个月平均应还" :value="overdue.average_money" ></item-text>
+      <item-text label="最长逾期月数" :value="overdue.overdue_num" ></item-text>
+      <item-text label="单月最高逾期金额" :value="overdue.overdue_money" ></item-text>
+    </view>
+    <view class="tripartite-item" v-for="(query,queryIndex) in credit.query_data">
+      <item-title :title-type="2" v-if="query.query_type*1===1" label="近6个月查询机构数" ></item-title>
+      <item-title :title-type="2" v-else-if="query.query_type*1===2" label="近6个月查询次数" ></item-title>
+      <item-title :title-type="2" v-else-if="query.query_type*1===3" label="近2年查询次数" ></item-title>
+      <view v-if="query.query_type<=2">
+        <item-text label="贷款审批" :value="query.loans_num" ></item-text>
+        <item-text label="信用审批" :value="query.credit_num" ></item-text>
+      </view>
+      <view v-if="query.query_type*1===2">
+        <item-text label="本人查询" :value="query.self_num" ></item-text>
+      </view>
+      <view v-if="query.query_type*1===3">
+        <item-text label="贷后管理" :value="query.post_loan_num" ></item-text>
+        <item-text label="担保资格审查" :value="query.guarantee_num" ></item-text>
+        <item-text label="法人代表、负责人、高管等自信审查" :value="query.legal_num" ></item-text>
+      </view>
+    </view>
+
+
+  </view>
+</template>
+
+<script>
+import ItemImg from "@/pages-task/task-info/module/item-img";
+import IdentityItem from "@/pages-task/task-info/module/identity-item";
+import ItemText from "@/pages-task/task-info/module/item-text";
+import ItemTitle from "@/pages-task/task-info/module/item-title";
+
+export default {
+  name: "task-credit",
+  components: {ItemImg, IdentityItem, ItemText, ItemTitle},
+  props: {
+    credit:{
+      default:{}
+    },
+    typeKeys:{
+      default:[]
+    }
+  },
+  data() {
+    return {}
+  },
+  watch: {},
+  mounted() {
+
+  },
+  methods: {
+    onShowImg(img){
+      this.$emit('onShowImg',img)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/static/css/task-info/item";
+</style>

+ 44 - 0
pages/task/module/task-linkman.vue

@@ -0,0 +1,44 @@
+<template>
+  <view class="item-box">
+    <view class="linkman-item" v-for="(item,index) in linkman">
+    <item-title :label="'联系人('+(index+1)+')'" :line-type="index===0?1:3" :title-type="2"></item-title>
+    <item-text label="姓名" :value="item.name"  key-str="name" :type-keys="typeKeys" ></item-text>
+    <item-text label="关系" :value="item.relation_name"  key-str="relation" :type-keys="typeKeys"></item-text>
+    <item-text label="手机号"  :value="item.phone"  key-str="phone" :type-keys="typeKeys"></item-text>
+    <item-text label="关系" v-if="item.special_plane!==''" :value="item.special_plane"  key-str="special_plane" :type-keys="typeKeys" ></item-text>
+  </view>
+  </view>
+</template>
+
+<script>
+import IdentityItem from "@/pages-task/task-info/module/identity-item";
+import ItemText from "@/pages-task/task-info/module/item-text";
+import ItemTitle from "@/pages-task/task-info/module/item-title";
+
+export default {
+  name: "task-linkman",
+  components: { IdentityItem, ItemText, ItemTitle},
+  props: {
+    linkman:{
+      default:[]
+    },
+    typeKeys:{
+      default:[]
+    }
+  },
+  data() {
+    return {
+
+    }
+  },
+  watch: {},
+  mounted() {
+
+  },
+  methods: {}
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/static/css/task-info/item";
+</style>

+ 44 - 0
pages/task/module/task-post-loan.vue

@@ -0,0 +1,44 @@
+<template>
+  <view class="item-box">
+    <item-title label="放款信息" ></item-title>
+    <item-text label="贷款银行" :value="postLoan.bank_name" ></item-text>
+    <item-text label="贷款金额" :value="postLoan.loans_money" ></item-text>
+    <item-text label="年化利率" :value="postLoan.interest_rate" ></item-text>
+    <item-title label="还款信息" ></item-title>
+    <item-text label="还款期数" :value="postLoan.refund_num" ></item-text>
+    <item-text label="还款方式" :value="postLoan.repayment_type_name" ></item-text>
+    <item-text label="还款日期" :value="postLoan.repayment_date" ></item-text>
+    <item-text label="每期还款金额" :value="postLoan.repayment_money" ></item-text>
+  </view>
+</template>
+
+<script>
+import IdentityItem from "@/pages-task/task-info/module/identity-item";
+import ItemText from "@/pages-task/task-info/module/item-text";
+import ItemTitle from "@/pages-task/task-info/module/item-title";
+
+export default {
+  name: "task-post-loan",
+  components: { IdentityItem, ItemText, ItemTitle},
+  props: {
+    postLoan:{
+      default:{}
+    },
+    typeKeys:{
+      default:[]
+    }
+  },
+  data() {
+    return {}
+  },
+  watch: {},
+  mounted() {
+    console.log(this.postLoan)
+  },
+  methods: {}
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/static/css/task-info/item";
+</style>

+ 90 - 0
pages/task/module/task-property.vue

@@ -0,0 +1,90 @@
+<template>
+  <view class="item-box">
+    <view  v-for="(property,propertyKey) in propertyList">
+      <view class="property-item" v-if="property.property_type===1">
+        <item-title label="不动资产信息" :line-type="propertyKey===0?1:3"></item-title>
+        <item-text label="产权人" :value="property.data.property_owner"  key-str="property_owner" :type-keys="typeKeys" ></item-text>
+        <item-text label="房产证号" :value="property.data.deed_num"  key-str="deed_num" :type-keys="typeKeys" ></item-text>
+        <item-text label="房产地址" :value="property.data.house_city"  key-str="house_city" :type-keys="typeKeys" ></item-text>
+        <item-text label="房屋用途" :value="property.data.house_address"  key-str="house_address" :type-keys="typeKeys" ></item-text>
+        <item-text label="建成年份" :value="property.data.build_date"  key-str="build_date" :type-keys="typeKeys" ></item-text>
+        <item-text label="建筑面积" :value="property.data.covered_area"  key-str="house_use" :type-keys="typeKeys"  right-text="㎡"></item-text>
+        <item-img label="房产证件" @onShowImg="onShowImg" :value="property.data.certificate_img"  key-str="certificate_img" :type-keys="typeKeys" ></item-img>
+        <item-img label="房产关联图片" @onShowImg="onShowImg"  :value="property.data.property" key-str="property" :type-keys="typeKeys" ></item-img>
+        <item-text label="备注" :value="property.data.remark"  key-str="remark" :type-keys="typeKeys" ></item-text>
+      </view>
+      <view class="property-item" v-else-if="property.property_type===2">
+        <item-title label="车辆信息" :line-type="propertyKey===0?1:3"></item-title>
+        <item-text label="品牌类型"  key-str="brand_id" :type-keys="typeKeys"  :value="property.data.brand_name"></item-text>
+        <item-text label="车牌类型"  key-str="car_type" :type-keys="typeKeys"  :value="property.data.car_type" :radio-data="{'1':'运营车','2':'非运营车'}"></item-text>
+        <item-text label="车牌号"  key-str="car_num" :type-keys="typeKeys"  :value="property.data.car_num"></item-text>
+        <item-text label="车架号"  key-str="car_vin" :type-keys="typeKeys"  :value="property.data.car_vin"></item-text>
+        <item-text label="车辆颜色"  key-str="colour" :type-keys="typeKeys"  :value="property.data.colour"></item-text>
+        <item-text label="裸车价格"  key-str="car_price" :type-keys="typeKeys"  :value="property.data.car_price"></item-text>
+        <item-text label="车辆登记时间"  key-str="register_date" :type-keys="typeKeys"  :value="property.data.register_date"></item-text>
+        <item-img label="行驶证" @onShowImg="onShowImg"  key-str="register_img" :type-keys="typeKeys" :value="property.data.register_img"></item-img>
+        <item-img label="登记证书" @onShowImg="onShowImg"  key-str="driving_img" :type-keys="typeKeys" :value="property.data.driving_img"></item-img>
+        <item-img label="车辆关联图片" @onShowImg="onShowImg"  key-str="car_img" :type-keys="typeKeys" :value="property.data.car_img"></item-img>
+        <item-text label="备注" :value="property.data.remark"  key-str="remark" :type-keys="typeKeys" ></item-text>
+      </view>
+      <view class="property-item" v-else-if="property.property_type===3">
+        <item-title label="保单信息"  :line-type="propertyKey===0?1:3"></item-title>
+        <item-text label="保险公司名称"  key-str="insurance_name" :type-keys="typeKeys" :value="property.data.insurance_name" ></item-text>
+        <item-text label="保险类型"  key-str="type_name" :type-keys="typeKeys"  :value="property.data.insurance_type" ></item-text>
+        <item-text label="年缴费额"  key-str="year_money" :type-keys="typeKeys"  :value="property.data.year_money"></item-text>
+        <item-text label="是否满足缴费情况"  key-str="is_fees" :type-keys="typeKeys"  :value="property.data.is_fees" :radio-data="isNo"></item-text>
+        <item-text label="保单有效期"  key-str="validity_date" :type-keys="typeKeys"  :value="property.data.validity_date"></item-text>
+        <item-img label="保单相关图片" @onShowImg="onShowImg"  key-str="insurance_img" :type-keys="typeKeys" :value="property.data.insurance_img"></item-img>
+        <item-text label="备注" :value="property.data.remark"  key-str="remark" :type-keys="typeKeys" ></item-text>
+      </view>
+      <view class="property-item" v-else-if="property.property_type===4">
+        <item-title label="企业信息" :line-type="propertyKey===0?1:3"></item-title>
+        <item-text label="企业名称"  key-str="firm_name" :type-keys="typeKeys"  :value="property.data.firm_name"></item-text>
+        <item-text label="成立时间"  key-str="establish_date" :type-keys="typeKeys"  :value="property.data.establish_date"></item-text>
+        <item-text label="经营城市"  key-str="establish_city" :type-keys="typeKeys"  :value="property.data.establish_city"></item-text>
+        <item-text label="实际经营地"  key-str="establish_address" :type-keys="typeKeys"  :value="property.data.establish_address"></item-text>
+        <item-text label="年交税额"  key-str="year_tax" :type-keys="typeKeys"  :value="property.data.year_tax"></item-text>
+        <item-text label="税务等级"  key-str="tax_grade" :type-keys="typeKeys"  :value="property.data.tax_grade_name" right-text="级"></item-text>
+        <item-text label="税务有无断缴"  key-str="is_end_tax" :type-keys="typeKeys"  :value="property.data.is_end_tax" :radio-data="isNo"></item-text>
+        <item-text label="年开票额度"  key-str="year_invoice" :type-keys="typeKeys"  :value="property.data.year_invoice"></item-text>
+        <item-img  label="企业相关图片"  @onShowImg="onShowImg" key-str="firm_img" :type-keys="typeKeys" :value="property.data.firm_img"></item-img>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import ItemTitle from "@/pages-task/task-info/module/item-title";
+import ItemText from "@/pages-task/task-info/module/item-text";
+import ItemImg from "@/pages-task/task-info/module/item-img";
+
+export default {
+  name: "task-property",
+  components: {ItemImg, ItemText, ItemTitle},
+  props: {
+    propertyList: {
+      default: {}
+    },
+    typeKeys: {
+      default: []
+    }
+  },
+  data() {
+    return {
+      isNo:{'1':'是','0':'否'}
+    }
+  },
+  watch: {},
+  mounted() {
+  },
+  methods: {
+    onShowImg(img){
+      this.$emit('onShowImg',img)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/static/css/task-info/item";
+</style>

+ 71 - 0
pages/task/module/task-tripartite.vue

@@ -0,0 +1,71 @@
+<template>
+  <view class="item-box">
+    <view class="tripartite-item" v-for="(item,index) in tripartite">
+      <view v-if="item.type===1">
+        <item-title label="担保人信息" :line-type="index===0?1:3"></item-title>
+        <view class="item-line">
+          <identity-item @onShowImg="onShowImg"  :identity-two="item.identity_two" :identity-one="item.identity_one"></identity-item>
+        </view>
+        <item-text label="姓名" :value="item.name" key-str="name" :type-keys="typeKeys"></item-text>
+        <item-text label="身份证" :value="item.id_number" key-str="id_number" :type-keys="typeKeys"></item-text>
+        <view class="ban-item" v-for="(bank,bankIndex) in item.bank_data">
+          <item-title :label="'银行卡信息('+(bankIndex+1)+')'" :title-type="2"></item-title>
+          <item-text label="账户姓名" :value="bank.name"></item-text>
+          <item-text label="银行卡号" :value="bank.bank_num"></item-text>
+          <item-text label="所属银行" :value="bank.bank_name"></item-text>
+        </view>
+
+      </view>
+      <view v-else>
+        <item-title label="担保企业信息" :line-type="index===0?1:3"></item-title>
+        <item-text label="企业名称" :value="item.name" key-str="name" :type-keys="typeKeys"></item-text>
+        <item-text label="营业执照编号" :value="item.id_number" key-str="id_number" :type-keys="typeKeys"></item-text>
+        <item-img label="营业执照" @onShowImg="onShowImg" :value="item.identity_one" key-str="identity_one" :type-keys="typeKeys"></item-img>
+        <view class="ban-item" v-for="(bank,bankIndex) in item.bank_data">
+          <item-title :label="'银行卡信息('+(bankIndex+1)+')'" :title-type="2"></item-title>
+          <item-text label="账户姓名" :value="bank.name"></item-text>
+          <item-text label="银行卡号" :value="bank.bank_num"></item-text>
+          <item-text label="所属银行" :value="bank.bank_name"></item-text>
+        </view>
+      </view>
+
+    </view>
+
+  </view>
+</template>
+
+<script>
+import ItemText from "@/pages-task/task-info/module/item-text";
+import ItemTitle from "@/pages-task/task-info/module/item-title";
+import IdentityItem from "@/pages-task/task-info/module/identity-item";
+import ItemImg from "@/pages-task/task-info/module/item-img";
+
+export default {
+  name: "task-tripartite",
+  components: {ItemImg, IdentityItem, ItemText, ItemTitle},
+  props: {
+    tripartite: {
+      default: []
+    },
+    typeKeys: {
+      default: []
+    }
+  },
+  data() {
+    return {}
+  },
+  watch: {},
+  mounted() {
+
+  },
+  methods: {
+    onShowImg(img){
+      this.$emit('onShowImg',img)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/static/css/task-info/item";
+</style>

+ 1381 - 0
pages/task/task-info.vue

@@ -0,0 +1,1381 @@
+<template>
+  <view class="task-box" :class="isExecute>0?'task-info':'task-info-two'">
+    <en-nav :isBackShow="true" :backType="false" :titleColor="titleColor" :title="title"
+            :bgckgroundBox="titleBg"></en-nav>
+    <view class="task-title">
+      <text >{{business.status_name}}</text>
+    </view>
+    <view class="switch-box">
+      <view class="switch-left" @click="switchShow(1)">
+        <view class="" :class="switchNum===1?'switch-left-style':''">
+          任务信息
+        </view>
+        <view class="switch-left-styles" v-if="switchNum===1"></view>
+      </view>
+      <view class="switch-left switch-right" @click="switchShow(2)">
+        <view class="" :class="switchNum===2?'switch-left-style':''">
+          流程进度
+        </view>
+        <view class="switch-left-styles" v-if="switchNum===2"></view>
+      </view>
+    </view>
+    <view class="" v-if="switchNum===1">
+      <view class="content">
+        <uni-collapse>
+          <uni-collapse-item v-for="typeItem in product.type_data" :title="typeItem.type_name" v-show="product.product_types.indexOf('1')>=0">
+            <view class="basic-information" v-if="typeItem.type==='1'">
+              <task-client :business="business" :type-keys="typeItem.type_keys" @onShowImg="onShowImg"></task-client>
+            </view>
+            <view class="basic-information" v-else-if="typeItem.type==='2'">
+              <task-property :property-list="propertyList" :type-keys="typeItem.type_keys" @onShowImg="onShowImg"></task-property>
+            </view>
+            <view class="basic-information" v-else-if="typeItem.type==='3'">
+              <task-apply-for :apply-for="applyFor" :type-keys="typeItem.type_keys" @onShowImg="onShowImg"></task-apply-for>
+            </view>
+            <view class="basic-information" v-else-if="typeItem.type==='4'">
+             <task-tripartite :tripartite="tripartite" :type-keys="typeItem.type_keys" @onShowImg="onShowImg"></task-tripartite>
+            </view>
+            <view class="basic-information" v-else-if="typeItem.type==='5'">
+              <task-linkman :linkman="linkman" :type-keys="typeItem.type_keys" ></task-linkman>
+            </view>
+            <view class="basic-information" v-else-if="typeItem.type==='6'">
+              <task-credit :credit="credit" :type-keys="typeItem.type_keys" @onShowImg="onShowImg"></task-credit>
+            </view>
+            <view class="basic-information" v-else-if="typeItem.type==='7'">
+              <task-post-loan :post-loan="postLoan" :type-keys="typeItem.type_keys"></task-post-loan>
+            </view>
+          </uni-collapse-item>
+
+        </uni-collapse>
+      </view>
+      <view class="set-box">
+        <view class="set-title">
+          任务执行信息
+        </view>
+        <view class="task-phase">
+          <view class="task-phase-left">
+            任务阶段
+          </view>
+          <view class="task-phase-right">
+            {{ stageData.stageName ? stageData.stageName : '未设置阶段' }}
+          </view>
+        </view>
+        <view class="task-phase perform-personnel">
+          <view class="task-phase-left">
+            执行人员
+          </view>
+          <view class="task-phase-left">
+            {{ stageData.userName ? stageData.userName : '暂无执行人' }}
+          </view>
+        </view>
+      </view>
+      <view class="leave-message-box">
+        <view class="title-name">
+          留言
+        </view>
+        <view class="leave-message" v-for="(msg,mIndex) in msgList">
+          <image class="head-portrait" :src="msg.head_img" mode=""></image>
+          <view class="leave-message-right">
+            <view class="leave-message-right-one">
+              <view class="one-name">
+                <view class="name">
+                  {{ msg.name }}
+                </view>
+                <view class="state">
+                  {{ msg.position_name }}
+                </view>
+              </view>
+              <view class="one-reply" @click="goToUrl(1,msg.id)">
+                回复
+              </view>
+            </view>
+            <view class="leave-message-right-two">
+              <text>{{ msg.msg }}</text>
+            </view>
+            <view class="leave-message-right-three">
+              <view class="three-item" v-for="(msg_img,index) in msg.msg_img" :key="index">
+                <view class="three-img" @click.stop="onShowImg(msg_img.url)" v-if="msg_img.type===1">
+                  <image
+                      :src="msg_img.url" mode="aspectFill"></image>
+                </view>
+                <view class="three-img three-video" @click.stop="showVideoImg(msg_img.url)" v-else>
+                  <image class="three-img"
+                         :src="getVideoImg(msg_img.url)" mode="aspectFill"></image>
+                  <image class="video-img" src="@/static/task/video-img.png" mode=""></image>
+                </view>
+              </view>
+            </view>
+            <view class="leave-message-right-file" v-if="msg.file_list.length>0">
+              <view class="file-list">
+                <view class="file-item" @click.stop="openFile(file)" v-for="(file,fileIndex) in msg.file_list">
+                  <view class="file-img">
+                    <image src="/static/task/file-icon.png"></image>
+                    <view class="img-icon" v-if="file.file_type===1">PDF</view>
+                    <view class="img-icon icon-four" v-else-if="file.file_type===2">Word</view>
+                    <view class="img-icon icon-two" v-else>XLS</view>
+                  </view>
+                  <view class="file-text">
+                    {{ file.name }}
+                  </view>
+                </view>
+              </view>
+            </view>
+            <view class="leave-message-right-four">
+              {{ msg.created_at }}
+            </view>
+            <view class="leave-message-right-five" v-for="replyItem in msg.reply_list">
+              <view class="info-list">
+                <view class="reply-info">
+                  <view>
+                    <text class="info-name">{{ replyItem.name }}</text>
+                    <text
+                        class="reply">&nbsp;&nbsp;回复&nbsp;&nbsp;
+                    </text>
+                    <text
+                        class="info-name">{{ replyItem.ru_name }}:
+                    </text>
+                  </view>
+                  <view>
+                    <text class="info-content">{{ replyItem.msg }}</text>
+                  </view>
+
+
+
+                </view>
+              </view>
+              <view class="info-img-box" v-if="replyItem.msg_img.length>0">
+                <view class="info-item" v-for="(r_img,index) in replyItem.msg_img">
+                  <view class="info-img" @click.stop="onShowImg(r_img.url)" v-if="r_img.type===1">
+                    <image :src="r_img.url" mode="aspectFill"></image>
+                  </view>
+                  <view class="info-img info-video" @click.stop="showVideoImg(r_img.url)" v-else>
+                    <image class="three-img"
+                           :src="getVideoImg(r_img.url)" mode="aspectFill"></image>
+                    <image class="video-img" src="@/static/task/video-img.png" mode=""></image>
+                  </view>
+                </view>
+              </view>
+              <view class="info-file-list" v-if="replyItem.file_list.length>0">
+                <view class="file-list">
+                  <view class="file-item" @click.stop="openFile(file)" v-for="(file,fileIndex) in replyItem.file_list">
+                    <view class="file-img">
+                      <image src="/static/task/file-icon.png"></image>
+                      <view class="img-icon" v-if="file.file_type===1">PDF</view>
+                      <view class="img-icon icon-four" v-else-if="file.file_type===2">Word</view>
+                      <view class="img-icon icon-two" v-else>XLS</view>
+                    </view>
+                    <view class="file-text">
+                      {{ file.name }}
+                    </view>
+                  </view>
+                </view>
+              </view>
+              <view class="one-reply" @click="goToUrl(1,replyItem.id)">
+                回复
+              </view>
+            </view>
+
+          </view>
+        </view>
+        <view class="blank-box" v-if="msgList.length<=0">
+          <image class="blank-box-img" src="https://wealfavor-1257406827.cos.ap-beijing.myqcloud.com/static/rwzx/blank-img.png" mode=""></image>
+          <view class="blank-box-text">
+            暂无内容
+          </view>
+        </view>
+      </view>
+      <view class="but-box" v-if="isExecute>0 && business.status<4">
+        <view class="but" v-if="isExecute===3" @click="takeTask">
+          <!--领取操作-->
+          领取
+        </view>
+        <view class="but" v-else-if="isExecute===5" @click="endTask">
+          <!--完成操作-->
+          完成
+        </view>
+        <view class="but-box-two" v-else-if="isExecute===4">
+          <!--        部门主管操作-->
+                    <view class="turn-single but-two" @click="cancellation" >
+                      作废
+                    </view>
+          <view class="turn-single but-two" @click="openExecute">
+            交接
+          </view>
+          <view class="operation but-two" @click="goToUrl(1)">
+            反馈
+          </view>
+        </view>
+        <view class="but-box-two" v-else-if="isExecute===2">
+          <!-- 超级管理员操作-->
+          <view class="turn-single but-two" @click="cancellation" >
+            作废
+          </view>
+          <view class="operation but-two" @click="goToUrl(1)">
+            反馈
+          </view>
+        </view>
+        <view class="but-box-two" v-else-if="isExecute===7">
+          <!-- 超级管理员操作-->
+
+          <view class="operation but-one" @click="editTask()">
+            编辑
+          </view>
+        </view>
+        <view class="but-box-two" v-else-if="isExecute===8">
+          <!-- 超级管理员操作-->
+
+          <view class="operation but-one" @click="setPostLoan()">
+            完善贷后
+          </view>
+        </view>
+        <view class="but-box-two" v-else-if="isExecute===6">
+          <view class="turn-single but-three" @click="openExecute">
+            交接
+          </view>
+          <view class="turn-single but-three" @click="auditTask(2)">
+            拒绝
+          </view>
+          <view class="operation but-three" @click="auditTask(1)">
+            同意
+          </view>
+        </view>
+        <view class="but-box-two" v-else>
+
+          <view class="turn-single but-two" @click="openExecute">
+            交接
+          </view>
+          <view class="operation but-two" @click="setStage()">
+            操作
+          </view>
+        </view>
+      </view>
+      <view v-show="showExecute">
+        <uni-data-picker class="" popup-title="选择执行人" :localdata="executeData" ref="popupObj"
+                         @change="setNewExecute"
+                         :border="false" :clear-icon="false" @popupclosed="setPopupClosed">
+        </uni-data-picker>
+      </view>
+    </view>
+    <view class="schedule-box" v-else>
+      <view class="schedule-list" v-for="(item,index) in businessStageList" :key="index">
+        <view class="list-one">
+          <view class="list-left">
+            <view class="mark">
+              <view class="mark-two" :class="{'mark-two-no':item.id<=0}"></view>
+            </view>
+            <text class="switch-digital" :class="{'switch-digital-no':item.id<=0}">
+              {{ item.stage_name }}
+            </text>
+            <text class="switch-hr" v-if="item.id>0"></text>
+            {{ item.id <= 0 ? '' : item.name }}
+          </view>
+          <view class="list-right">
+            {{ item.updated_at }}
+          </view>
+        </view>
+        <view class="list-hr" v-if="businessStageList.length>(index+1)"></view>
+      </view>
+    </view>
+
+    <uni-popup ref="popup" type="bottom">
+      <view class="task-msg-box">
+        <taskSet ref="taskSetObj" :businessId="businessId" @endTaskSet="endTaskSet"></taskSet>
+      </view>
+    </uni-popup>
+    <uni-popup ref="feedback" type="bottom">
+      <view class="task-msg-box">
+        <taskMsg :businessId="businessId" :replyId="replyId"></taskMsg>
+      </view>
+    </uni-popup>
+    <uni-popup ref="videoPopup" @change="closeVideoImg">
+      <view class="video-box" v-if="videoUrl">
+        <video class="myVideo" :src="videoUrl" :autoplay="true"></video>
+      </view>
+    </uni-popup>
+  </view>
+</template>
+
+<script>
+
+import taskSet from "./task-set"
+import taskMsg from "./task-msg"
+import {
+  getStageList,
+  getTaskDetail,
+  cancellation,
+  endTask,
+  getExecuteList,
+  getMsgList,
+  setExecute,
+  takeTask, getBusinessStageList,
+} from "@/api/task";
+import tools from "@/service/tools";
+import UniPopup from "@/uni_modules/uni-popup/components/uni-popup/uni-popup";
+import EnNav from "@/components/en-utils/en-nav/en-nav";
+import TaskClient from "./module/task-client";
+import TaskProperty from "./module/task-property";
+import TaskApplyFor from "./module/task-apply-for";
+import TaskLinkman from "./module/task-linkman";
+import TaskTripartite from "./module/task-tripartite";
+import TaskCredit from "./module/task-credit";
+import TaskPostLoan from "./module/task-post-loan";
+
+export default {
+  components: {
+    TaskPostLoan,
+    TaskCredit,
+    TaskTripartite,
+    TaskLinkman,
+    TaskApplyFor,
+    TaskProperty,
+    TaskClient,
+    EnNav,
+    UniPopup,
+    taskSet,
+    taskMsg
+  },
+  data() {
+    return {
+      title: '任务详情',
+      titleColor: '#fff',
+      titleBg: '',
+      switchNum: 1,
+      product: {
+        product_name: '',
+        product_types: [],
+        type_data:[]
+      },
+      business: {
+        status: 1,
+        phone: '',
+        identity_one: '',
+        identity_two: '',
+        marriage_img: [],
+        credit_img: [],
+      }, //基本信息
+      propertyList: [], //资产信息
+      applyFor: {}, //申请信息
+      credit: {}, //征信信息
+      postLoan: {}, //贷后信息
+      tripartite: [], //第三方信息
+      linkman: [], //联系人信息
+      stageData: {
+        stageName: '',
+        userName: ""
+      },
+      isAjax: false,
+      isExecute: 0,
+      msgList: [],
+      executeData: [],
+      showExecute: false,
+      businessId: 0,
+      auditType: 0,
+      previewList: [],
+      current: 0,
+      imgKey: 0,
+      imgList: [],
+      replyId: "",
+      stageList: [],
+      businessStageList: [],
+      businessFile: {
+        fileList: [],
+        imgList: [],
+        videoList: [],
+      },
+      videoUrl: ''
+    }
+  },
+  onPageScroll(e) {
+    if (e.scrollTop > 50) {
+      this.titleBg = '#fff'
+      this.titleColor = '#333333'
+    } else {
+      this.titleBg = ''
+      this.titleColor = '#fff'
+    }
+  },
+  onLoad(data) {
+    if (data.id === undefined) {
+      this.backEvent();
+    } else {
+      this.businessId = data.id
+      this.getTaskDetail()
+      this.getStageList()
+    }
+  },
+  mounted() {
+    uni.$on('newMsg', () => {
+      if (this.$refs.feedback) {
+        this.$refs.feedback.close()
+      }
+      //重新加载msg信息
+      this.getMsgList();
+
+    })
+    uni.$on('newTaskInfo',()=>{
+      this.getTaskDetail()
+    })
+  },
+  methods: {
+    openFile(file) {
+      if (!file.url) {
+        tools.error('下载地址不存在')
+        return
+      }
+      tools.showLoading()
+      uni.downloadFile({
+        url: file.url, //仅为示例,并非真实的资源
+        success: (dRes) => {
+          tools.hideLoading()
+          if (dRes.statusCode === 200) {
+            tools.success('下载成功')
+            uni.saveFile({
+              tempFilePath: dRes.tempFilePath,
+              success: (res) => {
+                uni.openDocument({
+                  filePath: res.savedFilePath,
+                  showMenu: true,
+                  success: function (res) {
+                  }
+                });
+              }
+            });
+          }
+        }
+      });
+    },
+    getVideoImg(url) {
+      return tools.getOssVideo(url)
+    },
+    closeVideoImg(e) {
+      if (!e.show) {
+        console.log('关闭视频了')
+        this.videoUrl = ''
+      }
+    },
+    showVideoImg(url) {
+      console.log(url)
+      this.videoUrl = url
+      this.$refs.videoPopup.open('center')
+    },
+    setPostLoan(){
+      uni.navigateTo({
+        url: '/pages-task/task-info/task-loan?id=' +  this.business.id
+      });
+    },
+    editTask() {
+      // uni.reLaunch({
+      //   url: '/pages/add-client/add-client?businessId=' + this.business.id
+      // })
+      uni.reLaunch({
+        url: '/pages-task/add-client/new-add?businessId=' + this.business.id
+      })
+    },
+    getBusinessStageList() {
+      getBusinessStageList({'business_id': this.businessId}).then((res) => {
+        if (res.code === 1) {
+          this.businessStageList = res.data
+        }
+      })
+    },
+    getStageList() {
+      getStageList({'id': this.businessId}).then((res) => {
+        if (res.code === 1) {
+          this.stageList = res.data
+        }
+      })
+    },
+    switchShow(num) {
+      this.switchNum = num
+    },
+    onShowImg(item) {
+      if (this.businessFile.imgList.length < 0) {
+        this.businessFile.imgList.push(item)
+      }
+      // 预览图片
+      uni.previewImage({
+        current: item,
+        urls: this.businessFile.imgList,
+      });
+    },
+    makingCall() {
+      tools.makingCall(this.business.phone)
+    },
+    openExecute() {
+      this.executeData = [];
+      getExecuteList({
+        'business_id': this.business.id
+      }).then((res) => {
+        if (res.code === 1) {
+          res.data.forEach((item) => {
+            this.executeData.push({
+              'text': item.name,
+              'value': item.id
+            })
+          })
+          this.showExecute = true;
+          this.$refs.popupObj.show();
+        }
+      })
+    },
+    setPopupClosed() {
+      //关闭选择器
+      this.showExecute = false;
+    },
+    setNewExecute(e) {
+      //设置新执行人
+      console.log(e)
+      let newUid = e.detail.value[0].value
+      console.log(newUid)
+      if (!newUid) {
+        newUid = 0;
+      }
+      setExecute({
+        'business_id': this.business.id,
+        'user_id': newUid
+      }).then((res) => {
+        if (res.code === 1) {
+          tools.success(res.msg)
+          uni.$emit('newReceiving')
+          this.getTaskDetail()
+
+        } else {
+          tools.error(res.msg)
+        }
+        this.showExecute = false
+      })
+    },
+    getMsgList() {
+      getMsgList({
+        'business_id': this.business.id
+      }).then((res) => {
+        if (res.code === 1) {
+          this.msgList = res.data;
+          // this.setImgList()
+        }
+      })
+    },
+    goToUrl(type, id) {
+      this.replyId = id
+      this.$refs.feedback.open()
+    },
+    endTaskSet() {
+      this.$refs.popup.close();
+      this.getTaskDetail()
+      this.getStageList()
+    },
+    setStage() {
+      this.$refs.popup.open("bottom");
+      this.$refs.taskSetObj.startStage();
+    },
+    auditTask(auditType) {
+      this.$refs.popup.open("bottom");
+      this.auditType = auditType
+      this.$refs.taskSetObj.startAuditType(auditType);
+    },
+    takeTask() {
+      if (this.isAjax) {
+        // return;
+      }
+      this.isAjax = true;
+      takeTask({
+        'id': this.business.id
+      }).then((res) => {
+        if (res.code === 1) {
+          tools.success('领取成功')
+          uni.$emit('newReceiving')
+          this.getTaskDetail()
+        } else {
+          this.isAjax = false;
+          tools.error(res.msg)
+        }
+      })
+    },
+    endTask() {
+      uni.showModal({
+        title: '提示',
+        content: '是否完成当前任务?',
+        success: (res) => {
+          console.log(res)
+          if (res.confirm) {
+
+            endTask({
+              'id': this.business.id
+            }).then((res) => {
+              if (res.code === 1) {
+                this.business.status = 4;
+                this.isExecute = 0;
+                tools.success(res.msg)
+                uni.$emit('newReceiving')
+              } else {
+                tools.error(res.msg)
+              }
+            })
+          }
+        }
+      });
+    },
+    cancellation() {
+      uni.showModal({
+        title: '提示',
+        content: '是否作废当前任务?',
+        success: (res) => {
+          console.log(res)
+          if (res.confirm) {
+
+            cancellation({
+              'id': this.business.id
+            }).then((res) => {
+              if (res.code === 1) {
+                this.business.status = 5;
+                this.isExecute = 0;
+                tools.success(res.msg)
+                uni.$emit('newReceiving')
+              } else {
+                tools.error(res.msg)
+              }
+            })
+          }
+        }
+      });
+    },
+    async getTaskDetail() {
+      const res = await getTaskDetail({
+        id: this.businessId
+      })
+      if (res.code === 1) {
+        this.product = res.data.product
+        this.title = this.product.product_name
+        this.business = res.data.business
+        this.propertyList = res.data.propertyList
+        this.applyFor = res.data.applyFor
+        this.tripartite = res.data.tripartite
+        this.linkman = res.data.linkman
+        this.credit = res.data.credit
+        this.postLoan = res.data.postLoan
+        this.stageData = res.data.stageData
+        this.isExecute = res.data.isExecute
+        this.businessFile = res.data.businessFile
+        this.getMsgList();
+        this.getBusinessStageList()
+      } else {
+        this.backEvent();
+      }
+    },
+    backEvent() {
+      uni.navigateBack({
+        delta: 1
+      })
+    }
+
+  },
+}
+</script>
+<style lang="scss" scoped>
+/deep/ .uni-collapse-item__title-text {
+  color: #333333 !important;
+  font-size: 34rpx !important;
+  font-weight: 600 !important;
+}
+
+.task-box {
+  background-image: url("@/static/img/task/task-bg.png");
+  background-repeat: no-repeat;
+  background-size: 100% auto;
+  background-color: #F6F7FB;
+  min-height: 100vh;
+  .task-title{
+    padding: 0 32rpx;
+    height: 120rpx;
+    line-height: 120rpx;
+    text{
+      font-size: 44rpx;
+      font-weight: 600;
+      color: #fff;
+    }
+  }
+
+  .video-box {
+    height: 70vh;
+    width: 100vw;
+
+    .myVideo {
+      height: 70vh;
+      width: 100vw;
+    }
+  }
+
+  .blank-box {
+    width: 100%;
+    min-height: 30vh;
+
+    .blank-box-img {
+      width: 500rpx;
+      height: 500rpx;
+      margin: 0 auto;
+    }
+
+    .blank-box-text {
+      font-size: 15px;
+      color: #666666;
+      text-align: center;
+    }
+  }
+
+  .content {
+    margin: 0 0 22rpx 0;
+  }
+
+  .switch-box {
+    width: 100%;
+    height: auto;
+    padding: 26rpx 0 6rpx 0;
+    display: flex;
+    background: #fff;
+    margin: 0 0 20rpx 0;
+
+    .switch-left {
+      width: 50%;
+      font-size: 32rpx;
+      color: #999999;
+      text-align: center;
+    }
+
+    .switch-left-text {
+      padding: 0 0 20rpx 0;
+    }
+
+    .switch-left-style {
+      color: #306AFB;
+      font-weight: 600;
+      padding: 0 0 20rpx 0;
+    }
+
+    .switch-left-styles {
+      width: 134rpx;
+      height: 4rpx;
+      background: #306AFB;
+      margin: 0 auto;
+    }
+  }
+
+
+  .set-box {
+    margin: 0 0 20rpx 0;
+    background: #fff;
+
+    .set-title {
+      font-size: 34rpx;
+      color: #333333;
+      font-weight: 600;
+      padding: 17px 32rpx;
+      box-sizing: border-box;
+    }
+
+    .task-phase {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 17px 32rpx;
+      box-sizing: border-box;
+      border-top: 1px solid #F0F0F0;
+
+      .task-phase-left {
+        font-size: 16px;
+        color: #666666;
+      }
+
+      .task-phase-right {
+        font-size: 16px;
+        color: #232A35;
+      }
+    }
+
+    .perform-personnel {
+      .perform-personnel-left {
+      }
+
+      .perform-personnel-right {
+      }
+    }
+  }
+
+  .leave-message-box {
+    width: 100%;
+    height: auto;
+    background: #fff;
+    padding: 32rpx 32rpx;
+    box-sizing: border-box;
+    // margin: 0 0 20rpx 0;
+
+    .title-name {
+      font-size: 34rpx;
+      color: #232A35;
+      font-weight: 600;
+      margin: 0 0 32rpx 0;
+    }
+
+    .leave-message {
+      width: 100%;
+      height: auto;
+      display: flex;
+
+      .head-portrait {
+        width: 90rpx;
+        height: 90rpx;
+        display: block;
+        margin: 0 20rpx 0 0;
+        border-radius: 50%;
+        flex-shrink: 0;
+      }
+
+      .leave-message-right {
+        width: 100%;
+        height: auto;
+        box-sizing: border-box;
+
+        .leave-message-right-one {
+          width: 95%;
+          height: auto;
+          display: flex;
+          justify-content: space-between;
+          margin: 0 0 24rpx 0;
+
+          .one-name {
+            display: flex;
+            align-items: center;
+
+            .name {
+              font-size: 16px;
+              color: #5C7C9B;
+              padding: 0 20rpx 0 0;
+              box-sizing: border-box;
+            }
+
+            .state {
+              height: 32rpx;
+              padding: 0 4rpx;
+              box-sizing: border-box;
+              background: #3169FA;
+              border-radius: 3px;
+              font-size: 10px;
+              color: #FFFFFF;
+              line-height: 32rpx;
+            }
+          }
+
+          .one-reply {
+            padding: 6rpx 12rpx;
+            border: 1px solid #DCDCDC;
+            border-radius: 2px;
+            font-size: 12px;
+            color: #000000;
+          }
+        }
+
+        .leave-message-right-two {
+          width: 578rpx;
+          height: auto;
+          margin: 0 0 16rpx 0;
+          box-sizing: border-box;
+          display: inline-block;
+          text{
+            font-size: 14px;
+            color: #232A35;
+            word-wrap: break-word;
+          }
+        }
+
+        .leave-message-right-three {
+          width: 100%;
+          height: auto;
+          // background: pink;
+          display: flex;
+          flex-wrap: wrap;
+
+          .three-item {
+            width: calc((100vw - 220rpx) / 3);
+            height: calc((100vw - 220rpx) / 3);
+            margin-right: 16rpx;
+
+            .three-img {
+              image {
+                width: calc((100vw - 220rpx) / 3);
+                height: calc((100vw - 220rpx) / 3);
+              }
+            }
+
+            .three-video {
+              position: relative;
+
+              .video-img {
+                position: absolute;
+                top: calc(50% - 28rpx);
+                left: calc(50% - 28rpx);
+                width: 56rpx;
+                height: 56rpx;
+              }
+            }
+          }
+
+
+          .three-item:nth-of-type(3n+0) {
+            margin-right: 0;
+          }
+
+          .three-item:nth-of-type(n+4) {
+            margin-top: 16rpx;
+          }
+
+
+        }
+
+        .leave-message-right-file {
+          margin-top: 20rpx;
+          margin-bottom: 20rpx;
+          width: calc(100vw - 174rpx);
+
+          .file-list {
+            border: 2rpx solid #F0F0F0;
+
+            .file-item {
+              height: 72rpx;
+              padding: 19rpx 20rpx;
+              display: flex;
+              justify-content: left;
+
+              .file-img {
+                height: 72rpx;
+                width: 72rpx;
+                position: relative;
+
+                .img-icon {
+                  position: absolute;
+                  left: 0;
+                  top: 37rpx;
+                  width: 32rpx;
+                  height: 20rpx;
+                  background: #F24949;
+                  font-weight: 600;
+                  color: #FFFFFF;
+                  font-size: 12rpx;
+                  line-height: 20rpx;
+                  text-align: center;
+                }
+
+                .icon-two {
+                  background: #00BF72;
+                }
+
+                .icon-three {
+                  background: #F9742C;
+                }
+
+                .icon-four {
+                  background: #0083FB;
+                }
+
+                image {
+                  height: 72rpx;
+                  width: 72rpx;
+                }
+              }
+
+              .file-text {
+                margin-left: 24rpx;
+                width: calc(100vw - 184rpx);
+                height: 72rpx;
+                line-height: 72rpx;
+                color: #333333;
+                display: -webkit-box;
+                -webkit-line-clamp: 1;
+                -webkit-box-orient: vertical;
+                overflow: hidden;
+              }
+
+            }
+          }
+        }
+
+        .leave-message-right-four {
+          font-size: 12px;
+          color: #A6A6A6;
+          margin: 0 0 21rpx 0;
+        }
+
+        .leave-message-right-five {
+          width: 100%;
+          height: auto;
+          background: #F6F6F6;
+          border-radius: 6rpx;
+          padding: 24rpx 24rpx 10rpx;
+          box-sizing: border-box;
+
+          .info-list {
+            width: 100%;
+            flex-wrap: wrap;
+            .reply-info{
+              .info-name {
+                font-size: 28rpx;
+                color: #5C7C9B;
+                flex-shrink: 0;
+                word-wrap: break-word;
+                box-sizing: border-box;
+                display: inline-block;
+              }
+
+              .reply {
+                font-size: 28rpx;
+                color: #232A35;
+                flex-shrink: 0;
+                padding-left: 6rpx;
+                padding-right: 6rpx;
+              }
+
+              .info-content {
+                font-size: 28rpx;
+                color: #232A35;
+                //flex-wrap: wrap-reverse
+                word-wrap: break-word;
+                box-sizing: border-box;
+                display: inline-block;
+              }
+            }
+
+
+
+          }
+
+          .one-reply {
+            padding: 6rpx 12rpx;
+            border: 1px solid #DCDCDC;
+            border-radius: 2px;
+            font-size: 12px;
+            color: #000000;
+            width: 50rpx;
+            margin-top: 20rpx;
+          }
+
+          .info-img-box {
+            margin-top: 28rpx;
+            width: 100%;
+            height: auto;
+            display: flex;
+            flex-wrap: wrap;
+
+            .info-item {
+              width: calc((100vw - 244rpx) / 4);
+              height: calc((100vw - 244rpx) / 4);
+              margin-right: 8rpx;
+
+              .info-img {
+                image {
+                  width: calc((100vw - 244rpx) / 4);
+                  height: calc((100vw - 244rpx) / 4);
+                }
+              }
+
+              .info-video {
+                position: relative;
+
+                .video-img {
+                  position: absolute;
+                  top: calc(50% - 15rpx);
+                  left: calc(50% - 15rpx);
+                  width: 30rpx;
+                  height: 30rpx;
+                }
+              }
+            }
+
+            .info-item:nth-of-type(4n+0) {
+              margin-right: 0;
+            }
+
+            .info-item:nth-of-type(n+5) {
+              margin-top: 16rpx;
+            }
+
+          }
+
+          .info-file-list {
+            margin-top: 20rpx;
+            //margin-bottom: 20rpx;
+            width: calc(100vw - 174rpx);
+
+            .file-list {
+              border: 2rpx solid #F0F0F0;
+
+              .file-item {
+                height: 72rpx;
+                padding: 19rpx 20rpx;
+                display: flex;
+                justify-content: left;
+
+                .file-img {
+                  height: 72rpx;
+                  width: 72rpx;
+                  position: relative;
+
+                  .img-icon {
+                    position: absolute;
+                    left: 0;
+                    top: 37rpx;
+                    width: 32rpx;
+                    height: 20rpx;
+                    background: #F24949;
+                    font-weight: 600;
+                    color: #FFFFFF;
+                    font-size: 12rpx;
+                    line-height: 20rpx;
+                    text-align: center;
+                  }
+
+                  .icon-two {
+                    background: #00BF72;
+                  }
+
+                  .icon-three {
+                    background: #F9742C;
+                  }
+
+                  .icon-four {
+                    background: #0083FB;
+                  }
+
+                  image {
+                    height: 72rpx;
+                    width: 72rpx;
+                  }
+                }
+
+                .file-text {
+                  margin-left: 24rpx;
+                  width: calc(100vw - 184rpx);
+                  height: 72rpx;
+                  line-height: 72rpx;
+                  color: #333333;
+                  display: -webkit-box;
+                  -webkit-line-clamp: 1;
+                  -webkit-box-orient: vertical;
+                  overflow: hidden;
+                }
+
+              }
+            }
+          }
+        }
+
+
+      }
+    }
+
+    .leave-message:nth-of-type(n+1) {
+      margin-top: 20rpx;
+    }
+
+  }
+
+  .but-box {
+    width: 100%;
+    height: auto;
+    padding: 12rpx 32rpx;
+    box-sizing: border-box;
+    background: #fff;
+    position: fixed;
+    left: 0;
+    bottom: 0;
+
+
+    .but {
+      width: 100%;
+      height: auto;
+      padding: 11px 0;
+      background: #3169FA;
+      text-align: center;
+      font-size: 16px;
+      color: #FFFFFF;
+      border-radius: 4px;
+    }
+
+    .but-box-two {
+      display: flex;
+      align-items: center;
+
+      .Leave-message {
+        // padding: 0 26rpx;
+        //width: 118rpx;
+        //height: 88rpx;
+        border: 1px solid #DCDCDC;
+        line-height: 88rpx;
+        background: #fff;
+        color: #232A35;
+        border-radius: 8rpx;
+        text-align: center;
+      }
+
+      .contact-user {
+        padding: 8rpx 0;
+        //width: 174rpx;
+        // height: 88rpx;
+        border: 1px solid #3169FA;
+        // line-height: 88rpx;
+        background: #fff;
+        margin: 0 16rpx;
+        text-align: center;
+        border-radius: 8rpx;
+
+        .contact-user-one {
+          color: #3169FA;
+        }
+
+        .contact-user-two {
+          font-size: 10px;
+          color: #3169FA;
+        }
+      }
+
+      .turn-single {
+        // padding: 0 56rpx;
+        //width: 174rpx;
+        //height: 88rpx;
+        border: 1px solid #3169FA;
+        line-height: 88rpx;
+        background: #fff;
+        margin: 0 16rpx;
+        color: #3169FA;
+        border-radius: 8rpx;
+        text-align: center;
+      }
+
+      .operation {
+        // padding: 0 56rpx;
+        //width: 174rpx;
+        //height: 88rpx;
+        line-height: 88rpx;
+        background: #3169FA;
+        color: #fff;
+        border-radius: 8rpx;
+        text-align: center;
+      }
+
+      .but-one {
+        width: 100%;
+        height: auto;
+        text-align: center;
+        border-radius: 8rpx;
+      }
+
+      .but-two {
+        width: 50%;
+        height: auto;
+        text-align: center;
+        border-radius: 8rpx;
+      }
+
+      .but-three {
+        width: 33.33%;
+        height: auto;
+        text-align: center;
+        border-radius: 8rpx;
+      }
+    }
+  }
+
+  .schedule-box {
+    padding: 32rpx 34rpx 26rpx;
+    box-sizing: border-box;
+    background: #fff;
+
+    .schedule-list {
+      .list-one {
+        display: flex;
+        justify-content: space-between;
+
+        .list-left {
+          max-width: 364rpx;
+          display: flex;
+          align-items: flex-start;
+          font-size: 14px;
+          color: #333333;
+
+          .mark {
+            // width: 22rpx;
+            // height: 22rpx;
+            background: rgba(#3169FA, 0.1);
+            border-radius: 50%;
+            margin: 10rpx 9px 0 0;
+            padding: 6rpx;
+            flex-shrink: 0;
+
+            .mark-two {
+              width: 12rpx;
+              height: 12rpx;
+              background: #3169FA;
+              border-radius: 50%;
+              margin: 0 auto;
+            }
+
+            .mark-two-no {
+              background: #999;
+            }
+          }
+
+          .switch-digital {
+            color: #333333;
+            font-size: 28rpx;
+            font-weight: 600;
+            flex-shrink: 0;
+            line-height: 36rpx;
+          }
+
+          .switch-digital-no {
+            color: #999;
+            font-weight: 400;
+          }
+
+          .switch-hr {
+            width: 18rpx;
+            height: 2rpx;
+            background: #707070;
+            margin: 18rpx 13rpx 0;
+            flex-shrink: 0;
+          }
+        }
+
+        .list-right {
+          font-size: 13px;
+          color: #999999;
+        }
+      }
+
+      .list-hr {
+        width: 2rpx;
+        height: 50rpx;
+        background: #F0F0F0;
+        margin: 9rpx 0 9rpx 12rpx;
+      }
+    }
+  }
+
+  .task-msg-box {
+    width: 100%;
+    border-radius: 20rpx 20rpx 0rpx 0rpx;
+  }
+
+}
+
+.task-info-two {
+  width: 100%;
+  height: auto;
+  padding: 0;
+}
+
+.task-info {
+  width: 100%;
+  height: auto;
+  padding: 0 0 112rpx 0;
+}
+
+
+</style>

+ 90 - 0
pages/task/task-loan.vue

@@ -0,0 +1,90 @@
+<template>
+  <view class="task-box" >
+    <en-nav :title="title"></en-nav>
+    <post-loan-item v-model="postLoan" :showKeys="[]"></post-loan-item>
+    <view class="but but-all" @click="setPostLoan">保存</view>
+  </view>
+</template>
+
+<script>
+
+import EnNav from "@/components/en-utils/en-nav/en-nav";
+import PostLoanItem from "@/pages-task/add-client/new-model/post-loan-item";
+import {setPostLoan} from "@/api/task";
+import tools from "@/common/js/tools";
+
+export default {
+  components: {
+    PostLoanItem,
+    EnNav,
+  },
+  data() {
+    return {
+      title: '完善贷后',
+      titleColor: '#fff',
+      titleBg: '',
+      businessId: '',
+      postLoan: {
+        'bank_id':'',
+        'loans_money':'',
+        'interest_rate':'',
+        'repayment_money':'',
+        'refund_num':'',
+        'repayment_type':'1',
+        'repayment_date':'',
+      },
+    }
+  },
+  onLoad(data) {
+    if (data.id === undefined) {
+      this.backEvent();
+    } else {
+      this.businessId = data.id
+    }
+  },
+  mounted() {
+
+  },
+  methods: {
+    setPostLoan(){
+      setPostLoan({'businessId':this.businessId,'postLoan':this.postLoan}).then((res)=>{
+        if(res.code===1){
+          tools.success(res.msg)
+          uni.$emit('newTaskList')
+          uni.$emit('newTaskInfo')
+          setTimeout(()=>{
+            this.backEvent()
+          },1500)
+        }else {
+          tools.error(res.msg)
+        }
+      })
+    },
+    backEvent() {
+      uni.navigateBack({
+        delta: 1
+      })
+    }
+
+  },
+}
+</script>
+<style lang="scss" scoped>
+.task-box{
+  background: #fff;
+  .but{
+    width: 90%;
+    margin: auto;
+    border-radius: 8rpx;
+    text-align: center;
+    height: 88rpx;
+    line-height: 88rpx;
+  }
+  .but-all{
+    color: #fff;
+    background: #306AFB;
+  }
+}
+
+
+</style>

+ 328 - 0
pages/task/task-msg.vue

@@ -0,0 +1,328 @@
+<template>
+  <view class="task-set">
+    <!-- <headNav :isBackShow="false" :textContents="'任务反馈'" :navBackgroundColor="'#fff'"></headNav> -->
+    <view class="nav">
+      任务反馈
+    </view>
+<!--    <view class="content">-->
+<!--      <view class="leave-message-box">-->
+<!--        <view class="">-->
+<!--          <textarea placeholder="留个言吧" v-model="msgData.msg" :maxlength="999" auto-height />-->
+<!--        </view>-->
+<!--        <view class="img-box">-->
+<!--          <view class="credentials-img" @click="showImg(msgData.msg_img,pIndex)"-->
+<!--            v-for="(msg_img,pIndex) in msgData.msg_img">-->
+<!--            <image class="credentials-imgs" :src="msg_img" mode="aspectFit"></image>-->
+<!--            <image @click="shutImg(pIndex)" class="gb-img" src="@/static/login/gb.png" mode=""></image>-->
+<!--          </view>-->
+
+<!--          <image class="img-box-img" @click="showUploadingImg(true)" src="@/static/add-client/scmb.png" mode=""></image>-->
+<!--        </view>-->
+<!--      </view>-->
+<!--    </view>-->
+    <add-msg v-model="msgData"></add-msg>
+    <view class="submit-box" @click="setMsg">
+      <view class="submit">
+        提交
+      </view>
+    </view>
+    <uni-popup ref="popup" type="bottom">
+      <view class="popup-block">
+        <view class="popup-row" @click="uploadingImg(1)">拍照</view>
+        <view class="popup-row" @click="uploadingImg(2)">从手机里面选择</view>
+        <view class="popup-row" @click="showUploadingImg(false)">取消</view>
+      </view>
+    </uni-popup>
+    <PreviewImage ref="previewImage" :imgs="previewList" :current="current"></PreviewImage>
+  </view>
+</template>
+
+<script>
+  import txUploadFile from "@/common/js/txOssSts";
+  import tools from "@/common/js/tools";
+  import {
+    setMsg
+  } from "@/api/task";
+  import PreviewImage from "@/components/PreviewImage/index";
+  import AddMsg from "@/pages-task/task-info/module/add-msg";
+
+  export default {
+    props: {
+      businessId: {
+        default: 0
+      },
+      replyId:{
+        default: 0
+      }
+
+    },
+    components: {
+      AddMsg,
+      PreviewImage
+    },
+    data() {
+      return {
+        title: "",
+        msgData: {
+          business_id: '',
+          msg: '',
+          reply_id: 0,
+          msg_img: [],
+          file_list: [],
+        },
+        isAjax: false,
+        previewList: [],
+        current: 0
+      }
+    },
+    onLoad() {
+
+    },
+    watch:{
+      'replyId':function (){
+        if (this.replyId) {
+          this.msgData.reply_id = this.replyId;
+        }else {
+          this.msgData.reply_id =''
+        }
+      }
+    },
+    mounted() {
+      console.log('-----------businessId:'+this.businessId,'--------------replyId:'+this.replyId)
+      this.msgData.business_id = this.businessId
+      if (this.replyId) {
+        this.msgData.reply_id = this.replyId;
+      }
+    },
+    methods: {
+
+      showImg(item, index) {
+        if (typeof item === 'string') {
+          item = [item];
+        }
+        this.previewList = item
+        this.current = index
+        this.$refs.previewImage.open(index);
+      },
+      setMsg() {
+        if (this.isAjax) {
+          return;
+        }
+        // this.isAjax=true;
+        this.msgData.business_id = this.businessId
+        if (this.replyId) {
+          this.msgData.reply_id = this.replyId;
+        }
+        setMsg(this.msgData).then((res) => {
+          if (res.code === 1) {
+            tools.success(res.msg)
+            uni.$emit('newMsg')
+            this.msgData.reply_id=''
+            this.msgData.msg=''
+            this.msgData.msg_img=[]
+          } else {
+            tools.error(res.msg)
+            this.isAjax = false;
+          }
+
+        })
+      },
+      shutImg(indexT) {
+        this.msgData.msg_img.splice(indexT, 1)
+      },
+      showUploadingImg(showImg) {
+        if (showImg) {
+          this.$refs.popup.open("bottom");
+          // this.uploadingImg(2)
+        } else {
+          this.$refs.popup.close();
+        }
+      },
+      uploadingImg(sourceType) {
+        uni.chooseMedia({
+          mediaType: 'image',
+          count: sourceType === 1 ? 1 : 9, //默认9
+          sizeType: "compressed",
+          sourceType: [sourceType === 1 ? 'camera' : 'album'],
+          success: (res) => {
+            console.log(res)
+            if (res.tempFiles.length > 0) {
+              res.tempFiles.forEach((tempFile) => {
+                txUploadFile(tempFile.tempFilePath).then((data) => {
+                  if (!data) {
+                    tools.error('图片上传失败')
+                  } else {
+                    this.msgData.msg_img.push(data.Location)
+                  }
+                })
+              })
+              this.showUploadingImg(false);
+            } else {
+              tools.error("请选择上传的图片")
+            }
+          },
+        });
+      },
+      leftClick() {
+        uni.navigateBack({
+          delta: 1
+        })
+      },
+    },
+  }
+</script>
+<style lang="scss" scoped>
+  .popup-block {
+    border-radius: 20rpx 20rpx 0rpx 0rpx;
+
+    background-color: #f5f5f5;
+
+    .popup-row {
+      height: 100rpx;
+      background-color: #fff;
+      text-align: center;
+      line-height: 100rpx;
+      border-bottom: 2rpx solid #f5f5f5;
+
+      &:nth-child(2) {
+        margin-bottom: 20rpx;
+      }
+
+      &:last-child {
+        height: 112rpx;
+        border: none;
+        line-height: 112rpx;
+      }
+
+      &:active {
+        background-color: rgb(244, 244, 244);
+      }
+    }
+  }
+
+  .task-set {
+    width: 100%;
+    min-height: 50vh;
+    max-height: 70vh;
+    background: #F6F7FB;
+    overflow: auto;
+    border-radius: 20rpx 20rpx 0rpx 0rpx;
+    .nav {
+      font-size: 18px;
+      font-weight: bold;
+      text-align: center;
+      padding: 30rpx 0 15rpx;
+      background: #fff;
+    }
+
+    .content {
+      width: 100%;
+      height: auto;
+      padding: 22rpx 0 0 0;
+
+      .choose-box {
+        width: 100%;
+        height: auto;
+        padding: 34rpx 35rpx;
+        box-sizing: border-box;
+        background: #fff;
+        border-top: 1px solid #F0F0F0;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+
+        .choose-box-left {
+          font-size: 16px;
+          color: #666666;
+        }
+
+        .choose-box-right {
+          display: flex;
+          align-items: center;
+
+          .choose-box-right-content {
+            font-size: 16px;
+            font-weight: 400;
+            color: #232A35;
+            margin: 0 18rpx 0 0;
+          }
+
+          .choose-box-right-img {
+            width: 12rpx;
+            height: 20rpx;
+          }
+        }
+      }
+
+      .choose-box-two {
+        margin: 0 0 22rpx 0;
+      }
+
+      .leave-message-box {
+        width: 100%;
+        height: auto;
+        padding: 36rpx 30rpx 106rpx;
+        box-sizing: border-box;
+        background: #fff;
+
+        .img-box {
+          width: 100%;
+          height: auto;
+          display: flex;
+          align-items: center;
+          padding: 40rpx 0 0 0;
+
+          .credentials-img {
+            width: 160rpx;
+            height: 160rpx;
+            margin: 0 16rpx 30rpx 0;
+            position: relative;
+
+            .credentials-imgs {
+              width: 100%;
+              height: 100%;
+              display: block;
+            }
+
+            .gb-img {
+              width: 32rpx;
+              height: 32rpx;
+              position: absolute;
+              right: 0;
+              top: 0;
+              z-index: 2;
+            }
+          }
+
+          .img-box-img {
+            width: 216rpx;
+            height: 216rpx;
+          }
+        }
+      }
+    }
+
+    .submit-box {
+      width: 100%;
+      height: auto;
+      border-top: 1px solid #F0F0F0;
+      background: #fff;
+      position: fixed;
+      left: 0;
+      bottom: 0;
+      padding: 12rpx 32rpx;
+      box-sizing: border-box;
+
+      .submit {
+        width: 100%;
+        height: auto;
+        background: #3169FA;
+        border-radius: 4px;
+        font-size: 16px;
+        color: #FFFFFF;
+        padding: 20rpx 0;
+        text-align: center;
+      }
+    }
+  }
+</style>

+ 465 - 0
pages/task/task-set.vue

@@ -0,0 +1,465 @@
+<template>
+  <view class="task-set">
+    <!-- <headNav :isBackShow="true" :textContents="'任务设置'" :navBackgroundColor="'#fff'"></headNav> -->
+    <view class="nav">
+      任务设置
+    </view>
+<!--    <view class="task-tab" v-if="stageData.operate_ids.length>0">-->
+<!--      <view class="tab-item" :class="{'tab-select':operateType===1}" @click="setOperateType(1)">任务操作</view>-->
+<!--      <view class="tab-item" :class="{'tab-select':operateType===2}" @click="setOperateType(2)">阶段操作</view>-->
+<!--    </view>-->
+    <view v-if="true">
+      <view class="content">
+        <view class="choose-box">
+          <view class="choose-box-left">
+            下一处理阶段
+          </view>
+          <view class="choose-box-right" @click="openPopupObj(1)">
+            <view class="choose-box-right-content">
+              {{stageData.stageName?stageData.stageName:'请选择任务阶段'}}
+            </view>
+            <image class="choose-box-right-img" src="@/static/add-client/choose.png" mode=""></image>
+          </view>
+        </view>
+        <view class="choose-box choose-box-two" v-if="selectType<2">
+          <view class="choose-box-left">
+            下一执行人员
+          </view>
+          <view class="choose-box-right" @click="openPopupObj(2)">
+            <view class="choose-box-right-content">
+              {{stageData.userName?stageData.userName:'请选择执行人员'}}
+            </view>
+            <image class="choose-box-right-img" src="@/static/add-client/choose.png" mode=""></image>
+          </view>
+        </view>
+        <view class="choose-box-stage">
+          <en-input v-if="stageData.operate_ids.indexOf('2')>-1" label="回款金额" v-model="businessData.returned_total" type="digit" placeholder="请输入回款金额" right-text="万元"></en-input>
+          <en-input v-if="stageData.operate_ids.indexOf('1')>-1" label="出款金额" v-model="businessData.out_total" type="digit" placeholder="请输入出款金额"  right-text="万元"></en-input>
+          <en-input v-if="stageData.operate_ids.indexOf('4')>-1" label="银行出款" v-model="businessData.bank_total" type="digit" placeholder="请输入银行出款"  right-text="万元"></en-input>
+          <view v-if="stageData.operate_ids.indexOf('3')>-1">
+            <en-input label="回款姓名" v-model="businessData.returned_name" type="text" placeholder="请输入回款人姓名"></en-input>
+            <en-select  label="回款银行" v-model="businessData.returned_bank_id" :localData="bankData"  placeholder="请选择还款银行"></en-select>
+          </view>
+        </view>
+        <add-msg v-model="msgData"></add-msg>
+      </view>
+      <view class="submit-box" @click="submit">
+        <view class="submit">
+          提交
+        </view>
+      </view>
+      <view v-show="showExecute">
+        <uni-data-picker class="" :popup-title="popupTitle" :localdata="popupData" ref="popupObj" @change="setNewExecute"
+                         :border="false" :clear-icon="false" @popupclosed="setPopupClosed">
+        </uni-data-picker>
+      </view>
+    </view>
+    <view class="operate-box" v-else>
+      <view class="content-box">
+        <en-input v-if="stageData.operate_ids.indexOf('1')>-1" label="回款金额" v-model="operateData.returned_total" type="number" placeholder="请输入回款金额"></en-input>
+        <en-input v-if="stageData.operate_ids.indexOf('2')>-1" label="出款金额" v-model="operateData.out_total" type="number" placeholder="请选择还款银行"></en-input>
+      </view>
+      <view class="submit-box" @click="submitOperate">
+        <view class="submit">
+          提交
+        </view>
+      </view>
+    </view>
+
+
+  </view>
+</template>
+
+<script>
+import {
+  auditTask, getReturnedBankList,
+  getTaskStage,
+  setExecuteTask, setStageOperate
+} from "@/api/task";
+  import tools from "@/service/tools";
+  import PreviewImage from "@/components/PreviewImage/index";
+  import {getStageUser} from "@/api/task";
+  import AddMsg from "./module/add-msg";
+  import EnInput from "@/components/en-from/en-input/en-input";
+import EnSelect from "@/components/en-from/en-select/en-select";
+
+  export default {
+    props: {
+      businessId: {
+        default: 0
+      },
+
+    },
+    components: {
+      EnSelect,
+      EnInput,
+      AddMsg,
+      PreviewImage
+    },
+    data() {
+      return {
+        stageData: {
+          operate_ids:[]
+        },
+        businessData: {
+          'id': '',
+          'manage_id': '',
+          'stage_id': '',
+          'audit_type': '',
+          'msg': '',
+          'msg_img': [],
+          'file_list': [],
+          'returned_total':'',
+          'out_total':'',
+          'bank_total':'',
+          'returned_name':'',
+          'returned_bank_id':'',
+        },
+        msgData:{
+          'msg': '',
+          'msg_img': [],
+          'file_list': [],
+        },
+        users: [],
+        stageList: [],
+        isAudit: false,
+        showExecute: false,
+        popupData: [],
+        popupType: 1,
+        auditType: 0,
+        popupTitle: '',
+        previewList: [],
+        current: 0,
+        selectType: 1,
+        //新增阶段操作数据
+        operateType:1,
+        stageId:0,
+        operateArr:[],
+        operateData:{
+          'returned_total':'',
+          'out_total':'',
+          'returned_bank':'',
+          'returned_bank_id':'',
+        },
+        bankData:[]
+      }
+    },
+    watch:{
+      'msgData':{
+        handler() {
+          this.businessData.msg=this.msgData.msg
+          this.businessData.msg_img=this.msgData.msg_img
+          this.businessData.file_list=this.msgData.file_list
+        },
+        deep: true
+      }
+    },
+    mounted() {
+      this.getTaskStage();
+    },
+    methods: {
+      setOperateType(operateType){
+        if(this.operateType!==operateType){
+          this.operateType=operateType
+        }
+      },
+      submitOperate(){
+        this.operateData.businessId=this.businessData.id
+        this.operateData.stageId=this.stageId
+        setStageOperate(this.operateData).then((res)=>{
+          if(res.code===1){
+            this.operateData={
+              'returned_total':'',
+              'out_total':'',
+            }
+            this.operateType=1
+            tools.success(res.msg)
+            this.$emit('endTaskSet')
+          }else {
+            tools.error(res.msg)
+          }
+        })
+      },
+      setPopupClosed() {
+        //关闭选择器
+        this.showExecute = false;
+      },
+      setNewExecute(e) {
+        //设置新执行人
+        let newData = e.detail.value[0]
+        this.showExecute = false;
+        if (this.popupType === 1) {
+          this.businessData.stage_id = newData.value
+          this.stageData.stageName = newData.text
+          this.getStageUser(this.businessData.stage_id)
+          this.stageList.forEach((stage) => {
+            if (stage.value === newData.value) {
+              if (stage.type !== 2  ) {
+                this.selectType = 2
+              }else {
+                this.selectType = 1
+              }
+            }
+          })
+        } else {
+          this.businessData.manage_id = newData.value
+          this.stageData.userName = newData.text
+        }
+      },
+      getStageUser(stage_id){
+        getStageUser({'stage_id':stage_id}).then((res)=>{
+          if(res.code===1){
+            this.users=res.data
+            this.businessData.manage_id =  this.users[0].value
+            this.stageData.userName = this.users[0].text
+          }
+        })
+      },
+      openPopupObj(type) {
+        this.popupType = type;
+        if (type === 1) {
+          if (this.selectType > 2) {
+            tools.error('此阶段不能修')
+            return false;
+          }
+          this.popupTitle = '请选择执行阶段'
+          this.popupData = this.stageList
+        } else {
+          if (this.selectType > 1) {
+            tools.error('此阶段不能修改')
+            return false;
+          }
+          this.popupTitle = '请选择执行人'
+          this.popupData = this.users
+        }
+        this.showExecute = true;
+        this.$refs.popupObj.show();
+      },
+      startStage() {
+        this.isAudit = false;
+        this.getTaskStage();
+      },
+      startAuditType(auditType) {
+        this.isAudit = true;
+        this.businessData.audit_type = auditType;
+        this.getTaskStage();
+      },
+      submit() {
+        // console.log('sadsadsajkhhjasd---------------------')
+        // uni.$emit('updateMemberInfo')
+        // console.log('newReceiving:---------------------')
+        if (this.isAudit) {
+          this.auditTask()
+        } else {
+          this.setExecuteTask()
+        }
+      },
+      setExecuteTask() {
+        setExecuteTask(this.businessData).then((auditRes) => {
+          if (auditRes.code === 1) {
+            tools.success(auditRes.msg)
+            this.$emit('endTaskSet')
+            uni.$emit('newTaskList')
+          } else {
+            tools.error(auditRes.msg)
+          }
+        })
+      },
+      auditTask() {
+
+        uni.showModal({
+          title: '提示',
+          content: this.businessData.audit_type === 1 ? '是否通过当前任务?' : '是否驳回当前任务?',
+          success: (res) => {
+            if (res.confirm) {
+              auditTask(this.businessData).then((auditRes) => {
+                if (auditRes.code === 1) {
+                  tools.success(auditRes.msg)
+                  this.$emit('endTaskSet')
+                  uni.$emit('newTaskList')
+                  console.log('newReceiving:---------------------')
+                } else {
+                  tools.error(auditRes.msg)
+                }
+              })
+            }
+          }
+        });
+      },
+      getTaskStage() {
+        getTaskStage({
+          'id': this.businessId
+        }).then((res) => {
+          if (res.code === 1) {
+            this.stageData = res.data.stageData;
+            console.log(this.stageData.operate_ids)
+            if(this.stageData.operate_ids.indexOf('3')>-1){
+              //获取回款银行信息
+              getReturnedBankList().then((bankRes)=>{
+                if(bankRes.code===1){
+                  this.bankData=bankRes.data
+                }
+              })
+            }
+            this.businessData.id = res.data.business.id;
+            this.businessData.manage_id = res.data.business.manage_id;
+            this.businessData.stage_id = res.data.business.stage_id;
+            this.stageId = res.data.business.stage_id;
+            this.users = res.data.users;
+            this.stageList = res.data.stageList;
+            let isNext=false
+            this.stageList.forEach((item)=>{
+              if(res.data.business.stage_id===item.value){
+                isNext=true
+              }else if(isNext){
+                this.businessData.stage_id=item.value
+                this.stageData.stageName=item.text
+                this.getStageUser(this.businessData.stage_id)
+                if (item.type > 2 ) {
+                  this.selectType = 2
+                }else {
+                  this.selectType = 1
+                }
+                isNext=false
+              }
+            })
+
+            if (this.stageData.operateNum > 1) {
+              this.selectType = 3;
+            }
+          } else {
+            tools.error('阶段信息异常')
+          }
+        })
+      },
+      leftClick() {
+        uni.navigateBack({
+          delta: 1
+        })
+      },
+    },
+  }
+</script>
+<style lang="scss" scoped>
+
+
+  .task-set {
+    width: 100%;
+    min-height: 50vh;
+    max-height: 70vh;
+    background: #F6F7FB;
+    overflow: auto;
+    border-radius: 20rpx 20rpx 0rpx 0rpx;
+    .nav {
+      font-size: 18px;
+      font-weight: bold;
+      text-align: center;
+      padding: 30rpx 0 15rpx;
+      background: #fff;
+    }
+    .task-tab{
+      display: flex;
+      justify-content: space-between;
+      height: 88rpx;
+      .tab-item{
+        width: 50%;
+        height: 100%;
+        font-size: 14px;
+        color: #333333;
+        line-height: 88rpx;
+        text-align: center;
+        background: #fff;
+        border: 2rpx solid #3169FA;
+        box-sizing: border-box;
+      }
+      .tab-select{
+        background: #3169FA;
+        color: #FFFFFF;
+        border:none;
+      }
+    }
+
+    .content {
+      width: 100%;
+      height: auto;
+      padding: 22rpx 0 106rpx 0;
+
+      .choose-box {
+        width: 100%;
+        height: auto;
+        padding: 34rpx 35rpx;
+        box-sizing: border-box;
+        background: #fff;
+        border-top: 1px solid #F0F0F0;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+
+        .choose-box-left {
+          font-size: 16px;
+          color: #666666;
+        }
+
+        .choose-box-right {
+          display: flex;
+          align-items: center;
+
+          .choose-box-right-content {
+            font-size: 16px;
+            font-weight: 400;
+            color: #232A35;
+            margin: 0 18rpx 0 0;
+          }
+
+          .choose-box-right-img {
+            width: 12rpx;
+            height: 20rpx;
+          }
+        }
+      }
+
+      .choose-box-stage{
+        background: #fff;
+        padding: 0 22rpx;
+        margin-bottom: 22rpx;
+      }
+
+      .choose-box-two {
+        margin: 0 0 22rpx 0;
+      }
+
+
+    }
+
+    .submit-box {
+      width: 100%;
+      height: auto;
+      border-top: 1px solid #F0F0F0;
+      background: #fff;
+      position: fixed;
+      left: 0;
+      bottom: 0;
+      padding: 12rpx 32rpx;
+      box-sizing: border-box;
+
+      .submit {
+        width: 100%;
+        height: auto;
+        background: #3169FA;
+        border-radius: 4px;
+        font-size: 16px;
+        color: #FFFFFF;
+        padding: 20rpx 0;
+        text-align: center;
+      }
+    }
+    .operate-box{
+      .content-box {
+        margin-top: 20rpx;
+        height: auto;
+        padding: 0 20rpx;
+        background: #fff;
+      }
+    }
+  }
+</style>