Переглянути джерело

fix:订单及付款bug修改

snow 1 рік тому
батько
коміт
3e521070d5

+ 1 - 0
src/apis/components/letter.js

@@ -6,5 +6,6 @@ export default {
   delete: (data, params) => http(api + 'delete', data, 'post', params),
   detail: (data, params) => http(api + 'info', data, 'post', params),
   create: (data, params) => http(api + 'create', data, 'post', params),
+  status: (data, params) => http(api + 'status', data, 'post', params),
 }
 

+ 32 - 14
src/components/approval-node/src/credentials.vue

@@ -1,5 +1,5 @@
 <template>
-    <el-form label-position="left" :model="ruleForm" :rules="rules" ref="ruleForm" size="mini" label-width="95px">
+    <el-form label-position="left" :model="ruleForm" :rules="rules" ref="ruleForm" size="mini" :label-width="readonly ? '0px' :'95px'">
       <el-form-item label="付款总金额" :prop="amountProp"  v-if="isAmount">
         <digital-input
           style="width:100%"
@@ -16,7 +16,7 @@
         />
       </el-form-item>
 
-      <el-form-item label="凭证图片" :prop="imageProp">
+      <el-form-item :label="readonly ? '' : '凭证图片'" :prop="imageProp">
         <div class="good_info_img_div">
           <ul v-if="ruleForm[imageProp]" class="clear">
             <li
@@ -28,6 +28,7 @@
               <div class="img-show-li-div">
                 <img :src="img" class="img-show" alt="" />
                 <i
+                  v-if="!readonly"
                   class="el-icon-close"
                   @click="closeImg(iindex, imageProp)"
                 ></i>
@@ -38,7 +39,7 @@
               v-if="ruleForm[imageProp].length < 11"
             >
               <div class="activity-upload">
-                <div class="btnupload" style="position: relative">
+                <div class="btnupload" style="position: relative" v-if="!readonly">
                   <i class="el-icon-plus avatar-uploader-icon"></i>
                   <file-upload
                     class="Upload"
@@ -56,7 +57,7 @@
         </div>
       </el-form-item>
 
-      <el-form-item class="flex-end" style="width:100%">
+      <el-form-item class="flex-end" style="width:100%" v-if="!readonly">
         <el-button :loading="loading" type="primary" @click="onSubmit">保存</el-button>
       </el-form-item>
     </el-form>
@@ -66,6 +67,12 @@
 export default {
   name:'CredentialsNode',
   props:{
+    readonly:{
+      type:Boolean
+    },
+    url:{
+      type:Array,
+    },
     imageProp:{
       type:String,
       default:() => 'credentials'
@@ -81,21 +88,32 @@ export default {
     loading:{
       type:Boolean,
       default:() => false
+    },
+    status:{
+      type:Number
+    }
+  },
+  watch:{
+    url:{
+      handler(){
+        if(!this.url) return
+        this.ruleForm[this.imageProp] = [...this.url]
+      },
+      immediate:true
     }
   },
   data(){
-
-  const validateAmount = (rule, value, callback) => {
-    if (value === "") {
-      callback(new Error("付款金额不能为空!"));
-    } else {
-      if (Number(value) === 0) {
-        callback(new Error("付款金额不能为0!"));
+    const validateAmount = (rule, value, callback) => {
+      if (value === "") {
+        callback(new Error("付款金额不能为空!"));
       } else {
-        callback()
+        if (Number(value) === 0) {
+          callback(new Error("付款金额不能为0!"));
+        } else {
+          callback()
+        }
       }
-    }
-  };
+    };
 
     return {
       ruleForm:{

+ 4 - 1
src/components/globalComponents/ex-table/main.vue

@@ -129,7 +129,7 @@
     >
       <el-pagination
         :current-page="page.curr"
-        :page-sizes="[2, 5, 10, 15, 50, 100]"
+        :page-sizes="sizes ? sizes : [2, 5, 10, 15, 50, 100]"
         :page-size="page.size"
         :size="searchSize"
         :layout="!layout ? 'total, sizes, prev, pager, next, jumper' : layout"
@@ -260,6 +260,9 @@ export default {
      * page-curr-change  分页当前页改变
      * page-size-change  分页大小改变
      */
+    sizes:{
+      type:Array,
+    },
     page: {
       type: Object,
       default: {

+ 21 - 6
src/components/manage/src/letter/_columns.js

@@ -26,6 +26,11 @@ export const budget = [
       width: '120px',
       _slot_:'is_check'
   },
+  {
+    prop:mapFields.status,
+    label:'状态',
+    _slot_:'status'
+  },
   {
       prop: mapFields.letter,
       label: '评估预算函',
@@ -120,12 +125,17 @@ export const project = [
         label: '评估预算函编号',
         width: '120px',
     },
-    // {
-    //     prop: mapFields.status,
-    //     label: '是否选中',
-    //     width: '120px',
-    //     _slot_:'is_check'
-    // },
+    {
+        prop: mapFields.status,
+        label: '是否选中',
+        width: '120px',
+        _slot_:'is_check'
+    },
+    {
+        prop:mapFields.status,
+        label:'状态',
+        _slot_:'status'
+    },
     {
         prop: mapFields.letter,
         label: '计划预算函预览',
@@ -176,6 +186,11 @@ export const settlement = [
         width: '126px',
         _slot_:'letter'
     },
+    {
+        prop:mapFields.status,
+        label:'状态',
+        _slot_:'status'
+    },
     {
         prop: mapFields.budgetAmount,
         label: '评估预算金额',

+ 79 - 10
src/components/manage/src/letter/index.vue

@@ -9,11 +9,14 @@
     <ex-table
       :columns="[
         ...(isSelection ? [{ type: 'selection' }] : []),
-        ...mapColumns[type || 'budget'], { label: '操作', _slot_: 'action', width: '100px',fixed:'right'}
+        ...(mapColumns[type || 'budget']), 
+        ...(!readonly && type !== 'activity' ? [{ label: '操作', _slot_: 'action', width: '130px',fixed: 'right'}] : [])
       ]"
       @page-curr-change="handlePageChange"
       @page-size-change="handleSizeChange"
+      :noPagination="noPagination"
       :page="pageInfo"
+      :sizes="['15']"
       @screen-reset="
         pageInfo.curr = 1;
         parmValue.page = 1;
@@ -41,15 +44,34 @@
         </el-tag>
       </template>
 
+      <template #status="{scope}">
+        <el-tag size="mini" :type="Number(scope.row.status) === 2 ? '' :'info'">
+          {{(statusOptions.find(({value}) => Number(scope.row.status) === value) || {}).label || '--'}}
+        </el-tag>
+      </template>
+
       <template #action="{ scope }">
-        <!-- <el-button size="mini" type="text">发布</el-button> -->
+        <!-- 选中时不能取消发布 -->
         <el-button 
-          v-if="(Number(scope.row.is_check) !== mapCheck[type].ok)" type="text" 
+          size="mini" 
+          type="text" 
+          @click="onPublish(scope.row)">
+          {{Number(scope.row.status) === 1 ? '发布' : '取消发布'}}
+        </el-button>
+
+        <!-- 发布或选中的函无法删除编辑 -->
+        <el-button 
+          v-if="
+            (type !== 'activity' 
+            && (Number(scope.row.is_check) !== mapCheck[type].ok) 
+            && Number(scope.row.status) !== 2) || type === 'settlement'" 
+            type="text" 
           size="mini" 
           @click="linkToLetterUpdate(scope.row)"
         >编辑</el-button>
+
         <el-button 
-          v-if="type === 'budget' && Number(scope.row.is_check) !== mapCheck[type].ok" 
+          v-if="type === 'budget' && Number(scope.row.is_check) !== mapCheck[type].ok && Number(scope.row.status) !== 2" 
           type="text" 
           size="mini" 
           @click="deleteItem(scope.row)"
@@ -66,6 +88,7 @@
       :isFile="isFile"
       :title="title" 
       :type="type"
+      :id="id"
     />
 
     <preview-modal 
@@ -81,9 +104,9 @@ import { mapColumns, mapCheck, mapTitle } from "./_columns"
 import ExcelUploadModal from "./xlsxUploadModal.vue"
 import asyncRequest from "@/apis/components/letter"
 import PreviewModal from "./previewModal.vue"
-import { writeFile, utils } from "xlsx";
 import { template ,mapLetterToType } from "./_template"
 import mixinPage from "@/mixins/elPaginationHandle";
+import { writeFile, utils } from "xlsx";
 
 export default {
   name:'Letter',
@@ -98,6 +121,11 @@ export default {
         border: true,
         'max-height': '800px'
       },
+      statusOptions:[
+        { value:1,label:'草稿'},
+        { value:2,label:'已发布'}
+      ],
+      noPagination:false,
       parmValue:{
         page: 1, // 页码
         size: 15, // 每页显示条数
@@ -147,8 +175,6 @@ export default {
         ({ name,service_cat,unit,price,num,remark,total_fee,tax,pay_fee,tax_fee  })
       )
 
-      console.log(plan_info)
-
       const letter = await asyncRequest.create({
         plan_type: mapLetterToType[form],
         file: fileUrl ? fileUrl : plan_file,
@@ -173,7 +199,7 @@ export default {
       this.$emit('refresh')
     },
     handleSelection({list}){
-      this.$emit('selection', list.map(({id}) => id))
+      this.$emit('selection', list)
     },
     deleteItem(row){
       this.$confirm(`确认删除评估预算函 ${row.planCode}?`,{
@@ -211,20 +237,63 @@ export default {
       if(this.type !== 'project' && (this.beforeModalVisible && !this.beforeModalVisible())){
         return
       }
+
       this.xlsxVisible = true
     },
 
+    async onPublish(row){
+      if(Number(row.is_check) === 1 && this.type !== 'settlement'){
+        this.$message.warning('当前预算函已经被选中,无法取消发布!')
+        return
+      }
+
+      const { status, id } = row
+      this.loading = true
+
+      const baseMsg = `${mapTitle[this.type]} ${row.planCode}`
+      
+      const message = Number(status) === 1 
+      ? `确认发布${baseMsg}?`
+      : `确认将${baseMsg} 恢复为草稿`
+
+      this.$confirm(message,{
+        type:'warning'
+      }).then(async () => {
+        this.loading = true
+        const { code } = await asyncRequest.status({
+          id:[id],
+          status:Number(status) === 1 ? 2 : 1
+        })
+        this.loading = false
+
+        if(code !== 1) return
+
+        const message = Number(status) === 1 
+          ? `${baseMsg} 发布成功`
+          : `${baseMsg} 恢复草稿成功`
+
+        
+        if(Number(status) === 1){
+          this.$emit('publish-ok')
+        }
+
+      this.$message.success(message)
+
+        this.searchList()
+      })
+    },
+
     async searchList(){
-      // if(this.type === 'settlement') return
       this.loading = true
       const { code, data } = await asyncRequest.list({ 
-          plan_type :this.status,          
+          plan_type :this.status, 
           req_id: this.id ,
           ...this.parmValue
         })
       this.loading = false
       if(code !== 1) return
       this.tableData = data.list
+      this.noPagination = Number(data.count) <= 15
       this.pageInfo.total = Number(data.count)
     }
   }

+ 19 - 1
src/components/manage/src/letter/xlsxUploadModal.vue

@@ -73,6 +73,7 @@
 </template>
 
 <script>
+import asyncRequest from "@/apis/components/letter"
 import companyHelper from '@/mixins/companyHelper'
 import { utils, writeFile } from "xlsx"
 import { template, intergeFields } from "./_template"
@@ -90,7 +91,7 @@ import {
 
 export default {
   mixins: [companyHelper],
-  props: ['visible', 'title', 'requsetMethod','isFile', 'type'],
+  props: ['visible', 'title', 'requsetMethod','isFile', 'type', 'id'],
   data() {
     return {
       columns,
@@ -285,6 +286,23 @@ export default {
         return
       }
 
+      if(this.type === "settlement"){
+        const { code, data } = await asyncRequest.list({ 
+          plan_type : 3, 
+          req_id: this.id,
+          status: 2,
+          is_check: 1
+        })
+
+        if(code !== 1) return
+        const [letter] = data.list || []
+        const { store_id , plan_file} = letter
+        this.storeId = store_id
+        this.file_url = plan_file
+      }
+
+
+
       const planinfo = this.tableData.map(tableItem => requsetFields.reduce((prev, currentKey) => ({
         ...prev,
         [currentKey]: tableItem[currentKey]

+ 13 - 8
src/views/customerService/demandOrder/components/manageActivityScheme.vue

@@ -1,11 +1,15 @@
 <template>
  <div v-loading="loading">
     <ex-table
-      :columns="columns"
+      :columns="[
+        ...columns,
+        ...(readonly ? [] : [{ label:'操作', _slot_:'action', width:'80px' }])
+      ]"
       :table="table"
       :data="planList"
       style="margin: 15px 0 0 0"
       :page="pageInfo"
+      :noPagination="noPagination"
       @page-curr-change="handlePageChange"
       @page-size-change="handleSizeChange"
     >
@@ -33,10 +37,11 @@
 import asyncRequest from "@/apis/service/customerService/demandOrder";
 import mixinPage from "@/mixins/elPaginationHandle";
 export default {
-  props:['sitem'],
+  props:['sitem', 'readonly'],
   mixins:[mixinPage],
   data(){
     return {
+      noPagination:false,
       loading:false,
       planList: [],
       table: {
@@ -49,6 +54,10 @@ export default {
         curr: 1,
         total: 0,
       },
+       parmValue:{
+        page:1,
+        size:15
+      },
      columns: [
        {
            type: 'index',
@@ -91,11 +100,6 @@ export default {
            prop: "nickname",
            label: '创建人',
            width: '150px',
-       },
-       {
-        label:'操作',
-        _slot_:"action",
-        width:'80px'
        }
       ]
     }
@@ -128,13 +132,14 @@ export default {
     },
     async searchList(id){
       this.loading = true
-      const { code, data }  = await asyncRequest.planList({ req_id: id ? id :this.sitem.id, plan_type: 2 })
+      const { code, data }  = await asyncRequest.planList({ req_id: id ? id :this.sitem.id, plan_type: 2, ...this.parmValue })
       this.loading = false
 
       if(code === 1){
         const { list = [], count = 0 } = data
         this.planList = list;
         this.$emit('selectedChange',list.filter(({is_check}) => String(is_check) === "1").length)
+        this.noPagination = Number(count) <= 15
         this.pageInfo.total = count
       }
     }

+ 23 - 9
src/views/customerService/demandOrder/components/manageBudgetLetter.vue

@@ -1,14 +1,20 @@
 <template>
  <div v-loading="loading">
     <ex-table
-      :columns="columns"
+      :columns="[
+        ...columns,
+        ...(readonly ? [] : [{ label:'操作', _slot_:'action', width:'80px' }])
+      ]"
       :table="table"
       :data="planList"
       style="margin: 15px 0 0 0"
+      :sizes="[15]"
       :page="pageInfo"
+      :noPagination="noPagination"
       @page-curr-change="handlePageChange"
       @page-size-change="handleSizeChange"
     >
+      <!-- : -->
       <template #is_check="{scope}">
         <el-tag size="mini" :type="String(scope.row.is_check) === '1' ? '' :'info'">
          {{String(scope.row.is_check) === "1" ?  "已选择" : "未选择"}}
@@ -16,7 +22,10 @@
       </template>
 
       <template #letter="{scope}">
-        <a style="color:#409EFF" :href="scope.row.plan_file">{{getFileNameWithUrl(scope.row.plan_file)}}</a>
+        <a style="color:#409EFF" :href="scope.row.plan_file" v-if="scope.row.plan_file">{{
+            getFileNameWithUrl(scope.row.plan_file)
+        }}</a>
+        <p v-else>--</p>
       </template>
       
 
@@ -33,7 +42,7 @@
 import asyncRequest from "@/apis/service/customerService/demandOrder";
 import mixinPage from "@/mixins/elPaginationHandle";
 export default {
-  props:['sitem'],
+  props:['sitem','readonly'],
   mixins:[mixinPage],
   data(){
     return {
@@ -43,6 +52,10 @@ export default {
         stripe: true,
         border: true,
         'max-height': '800px'
+      },
+      parmValue:{
+        page:1,
+        size:15
       },
        pageInfo: {
         size: 15,
@@ -96,11 +109,6 @@ export default {
            prop: "create_time",
            label: '创建时间',
            minWidth: '150px',
-       },
-       {
-        label:'操作',
-        _slot_:"action",
-        width:'80px'
        }
       ]
     }
@@ -132,13 +140,19 @@ export default {
     },
     async searchList(id){
       this.loading = true
-      const { code, data }  = await asyncRequest.planList({ req_id: id ? id : this.sitem.id })
+      const { code, data }  = await asyncRequest.planList({ 
+          req_id: id ? id : this.sitem.id ,
+          status: 2,
+          plan_type: 1,
+          ...this.parmValue
+        })
       this.loading = false
 
       if(code === 1){
         const { list = [], count = 0 } = data
         this.planList = list;
         this.$emit('selectedChange',list.filter(({is_check}) => String(is_check) === "1").length)
+        this.noPagination = Number(count) <= 15
         this.pageInfo.total = count
       }
     }

+ 14 - 9
src/views/customerService/demandOrder/components/manageProjectLetter.vue

@@ -1,9 +1,13 @@
 <template>
  <div v-loading="loading" style="margin-bottom:10px">
     <ex-table
-      :columns="columns"
+      :columns="[
+        ...columns,
+        ...(readonly ? [] : [{ label:'操作', _slot_:'action', width:'80px' }])
+      ]"
       :table="table"
       :data="planList"
+      :noPagination="noPagination"
       style="margin: 15px 0 0 0"
       :page="pageInfo"
       @page-curr-change="handlePageChange"
@@ -16,7 +20,8 @@
       </template>
 
       <template #letter="{scope}">
-        <a style="color:#409EFF" :href="scope.row.plan_file">{{getFileNameWithUrl(scope.row.plan_file)}}</a>
+        <a v-if="scope.row.plan_file" style="color:#409EFF" :href="scope.row.plan_file">{{getFileNameWithUrl(scope.row.plan_file)}}</a>
+        <p v-else>--</p>
       </template>
 
       <template #action="{scope}">
@@ -32,7 +37,7 @@
 import asyncRequest from "@/apis/service/customerService/demandOrder";
 import mixinPage from "@/mixins/elPaginationHandle";
 export default {
-  props:['sitem'],
+  props:['sitem','readonly'],
   mixins:[mixinPage],
   data(){
     return {
@@ -48,6 +53,10 @@ export default {
         curr: 1,
         total: 0,
       },
+      parmValue:{
+        page:1,
+        size:15
+      },
      columns: [
        {
            type: 'index',
@@ -95,11 +104,6 @@ export default {
            prop: "create_time",
            label: '创建时间',
            width: '150px',
-       },
-       {
-           label:'操作',
-           _slot_:"action",
-           width:'80px'
        }
       ]
     }
@@ -132,13 +136,14 @@ export default {
     },
     async searchList(id){
       this.loading = true
-      const { code, data }  = await asyncRequest.planList({ req_id: id ? id :this.sitem.id, plan_type: 3 })
+      const { code, data }  = await asyncRequest.planList({ req_id: id ? id :this.sitem.id, plan_type: 3 , status:2 ,...this.parmValue})
       this.loading = false
 
       if(code !== 1) return
       const { list = [], count = 0 } = data
       this.planList = list;
       this.$emit('selectedChange',list.filter(({is_check}) => String(is_check) === "1").length)
+      this.noPagination = Number(count) <= 15
       this.pageInfo.total = count
     }
   }

+ 46 - 14
src/views/customerService/demandOrder/components/waitCustomerConfirm.vue

@@ -11,6 +11,20 @@
 
       <el-form-item>
         <div class="image">
+          <div class="image_container" v-for="(image,index) in ruleForm.image_file" :key="image">
+            <div style="margin-rigth:5px">
+              <img :src="image" class="avatar" />
+              <i class="el-icon-circle-close" @click="ruleForm.image_file.splice(index,1)"></i>
+            </div>
+          </div>
+
+          <div class="image_container"  v-for="(video,index) in ruleForm.video_file" :key="video">
+            <div style="margin-rigth:5px">
+              <video :src="video" class="avatar" autoplay />
+              <i class="el-icon-circle-close" @click="ruleForm.video_file.splice(index,1)"></i>
+            </div>
+          </div>
+
           <el-upload
               style="margin-right:10px"
               class="avatar-uploader"
@@ -19,12 +33,11 @@
               :http-request="evt => handleRequset(evt,'image')"
               :before-upload="beforeAvatarUpload"
             >
-            <div class="image_container"  v-if="ruleForm.image_file">
+            <!-- <div class="image_container"  v-if="ruleForm.image_file">
               <img :src="ruleForm.image_file" class="avatar" />
               <i class="el-icon-circle-close" @click="handleRemoveImage('image_file')"></i>
-            </div>
-
-            <div v-else>
+            </div> -->
+            <div>
               <i class="el-icon-camera avatar-uploader-icon"></i>
               <p>添加图片</p>
             </div>
@@ -37,12 +50,7 @@
               :before-upload="beforeVideoUpload"
               :http-request="evt => handleRequset(evt,'video')"
             >
-            <div class="image_container"  v-if="ruleForm.video_file">
-              <video :src="ruleForm.video_file" class="avatar" autoplay />
-              <i class="el-icon-circle-close" @click="handleRemoveImage('video_file')"></i>
-            </div>
-
-            <div v-else>
+            <div>
               <i class="el-icon-video-camera avatar-uploader-icon"></i>
               <p>添加视频</p>
             </div>
@@ -78,8 +86,8 @@ export default {
       ruleForm:{
         grade:'', //活动评价
         evaluate_content:'', //客户公司
-        image_file:'',
-        video_file:''
+        image_file:[],
+        video_file:[]
       }
     }
   },
@@ -112,10 +120,10 @@ export default {
         _formData.append("token", token);
         const api = prop === "image" ? asyncRequest.uploadImage : asyncRequest.uploadvideo
         const property = prop === 'image' ? 'image_file' : 'video_file'
-        const { message, code, data } = await api(_formData);
+        const { data } = await api(_formData);
         const { file: _file } = data
         const { full_url } = _file
-        this.ruleForm[property] = full_url
+        this.ruleForm[property].push(full_url)
       }catch(err){
         console.log(err)
       }
@@ -160,6 +168,12 @@ export default {
     },
     async onSubmit(){
        try {
+        const { video_file, image_file } = this.ruleForm
+        if(video_file.length === 0 && image_file.length === 0){
+          this.$message.warning('必须上传一条视频或图片')
+          return
+        }
+
          await this.$refs.ruleForm.validate()
          this.loading = true
 
@@ -168,6 +182,8 @@ export default {
          const { code } = await asyncRequest.evaluate({
           ...this.ruleForm,
           grade: Number(grade / 5).toFixed(2),
+          video_file:video_file.join(","),
+          image_file:image_file.join(","),
           id: this.sitem.id,
          })
          
@@ -237,6 +253,22 @@ export default {
 
   .image {
     display: flex;
+    width: 500px;
+    gap: 10px;
+    flex-wrap: wrap;
+
+    .image_container{
+      border: 1px dashed #d9d9d9;
+      border-radius: 6px;
+
+      .el-icon-circle-close{
+        cursor: pointer;
+
+        &:hover{
+          color:#409EFF;
+        }
+      }
+    }
 
     &_container{
       position: relative;

+ 59 - 18
src/views/customerService/demandOrder/detail.vue

@@ -7,33 +7,72 @@
            <el-collapse-item title="需求订单详情" name="1">
              <demand-detail :sitem="sitem" @refresh="refresh" @switchNode="handleSwitchNode" />
            </el-collapse-item>
-           <el-collapse-item title="评估预算函管理" name="2" v-if="Number(sitem.status) === 1">
-             <manage-budgeet-letter :sitem="sitem" @selectedChange="handleSelectedChange($event,'budget')" />
+
+           <el-collapse-item :title="Number(sitem.status) > 1 ? '评估预算函' :'评估预算函管理'" name="2" v-if="Number(sitem.status) >= 1">
+             <manage-budgeet-letter
+              :sitem="sitem" 
+              :readonly="Number(sitem.status) > 1"
+              @selectedChange="handleSelectedChange($event,'budget')" 
+            />
            </el-collapse-item> 
-           <el-collapse-item title="活动方案管理" name="3" v-if="Number(sitem.status) === 2">
-             <manage-activity-scheme :sitem="sitem" @selectedChange="handleSelectedChange($event,'activity')" />
+
+           <el-collapse-item :title="Number(sitem.status) > 2  ? '活动方案' :'活动方案管理'" name="3" v-if="Number(sitem.status) >= 2">
+             <manage-activity-scheme 
+              :sitem="sitem" 
+              :readonly="Number(sitem.status) > 2"
+              @selectedChange="handleSelectedChange($event,'activity')"
+            />
            </el-collapse-item> 
-           <el-collapse-item title="计划预算函管理" name="10" v-if="Number(sitem.status) === 3">
-             <manage-project-letter :sitem="sitem" @selectedChange="handleSelectedChange($event,'project')" />
+           
+           <el-collapse-item :title="Number(sitem.status) > 3 ? '计划预算函' : '计划预算函管理'" name="10" v-if="Number(sitem.status) >= 3">
+             <manage-project-letter
+              :sitem="sitem" 
+              :readonly="Number(sitem.status) > 3"
+              @selectedChange="handleSelectedChange($event,'project')" 
+            />
            </el-collapse-item> 
-           <el-collapse-item title="待客户上传确认凭证" name="4" v-if="Number(sitem.status) === 4">
-              <credentials-node @confirm="handleCustomerConfirm($event)" />
+           
+           <!-- 审批时查看凭证 驳回可以重新上传凭证 -->
+           <el-collapse-item 
+              v-if="Number(sitem.status) >= 4"
+              :title="Number(sitem.status) > 4 && Number(sitem.status) !== 8 ? '凭证图片' : '待客户上传确认凭证'" 
+              name="4"
+            >
+              <credentials-node
+                :readonly="Number(sitem.status) !== 4 && Number(sitem.status) !== 8"
+                :url="sitem.ReqProof ? sitem.ReqProof.filter(({user_type}) => user_type === 1).map(({proof_url}) => proof_url) : ''"
+                @confirm="handleCustomerConfirm($event)" 
+              />
            </el-collapse-item>
+
            <el-collapse-item title="待平台审核执行凭证" name="5" v-if="Number(sitem.status) === 5">
              <wait-execute-certificate :sitem="sitem" @refresh="initData" />
            </el-collapse-item>
+           
            <el-collapse-item title="待供应商确认已执行" name="6" v-if="Number(sitem.status) === 6">
              <wait-supplier-confirm :sitem="sitem" @refresh="initData"  />
            </el-collapse-item> 
+           
            <el-collapse-item title="待客户确认已执行" name="7" v-if="Number(sitem.status) === 7">
              <wait-customer-confirm :sitem="sitem" @refresh="initData" />
            </el-collapse-item>
-           <el-collapse-item title="待供应商上传结算函" name="8" v-if="Number(sitem.status) === 9">
-             <letter type="settlement" :requsetMethod="handleUploadLetter" :isFile="true" />
-           </el-collapse-item>
-          <el-collapse-item title="结算函" name="8" v-if="Number(sitem.status) > 9 && Number(sitem.status) !== 11">
-             <letter :id="sitem.id" type="settlement" status="4" :requsetMethod="handleUploadLetter" :isFile="true" :readonly="true" />
+           
+          <el-collapse-item 
+            :title="Number(sitem.status) >= 9 && Number(sitem.status) !== 11 ? '结算函' : '待客户上传结算函'"
+             v-if="Number(sitem.status) >= 9"
+             name="8" 
+          >
+             <letter 
+              :id="sitem.id" 
+              type="settlement" 
+              status="4"
+              :readonly="Number(sitem.status) > 9 && Number(sitem.status) !== 11"
+              :requsetMethod="handleUploadLetter" 
+              @publish-ok="refresh"
+              :isFile="true" 
+            />
            </el-collapse-item> 
+           
            <el-collapse-item title="待客户确认结算函" name="9" v-if="Number(sitem.status) === 10">
              <normal-node @confirm="handleConfirmSettlement" />
            </el-collapse-item>
@@ -193,14 +232,16 @@ export default {
       if(code !== 1) return
       this.initForm()
     },
-    async handleUploadLetter(settleinfo, file_url){
+    async handleUploadLetter(plan_info, file, store_id){
       const params = {
-        id: this.sitem.id,
-        settleinfo,
-        file_url
+        req_id: this.sitem.id,
+        plan_type: 4,
+        plan_info,
+        store_id,
+        file,
       }
 
-      const { code, msg, data } = await workbenchRequest.settle(params)
+      const { code, msg, data } = await asyncRequest.planCreate(params)
       
       if(code === 1){
         this.initData()

+ 1 - 1
src/views/customerService/invoiceApproval/columns.js

@@ -80,7 +80,7 @@ const listCol = [
     minWidth: '110px'
   },
   {
-    prop: 'subtotal_tax',
+    prop: 'subtotal_amount',
     label: '税前金额'
   },
   {

+ 5 - 12
src/views/customerService/invoiceApproval/index.vue

@@ -36,14 +36,6 @@
                 />
               </el-col>
 
-              <!-- <el-col :span="3" style="margin-right:10px">
-                <el-select v-model="parmValue.supplier" size="mini" placeholder="供应商企业" style="width:100%"
-                  @change=" pageInfo.curr = 1;
-                           parmValue.page = 1;
-                          searchList();"
-                  />
-              </el-col> -->
-
               <el-col :span="3" style="margin-right:10px">
                 <el-input v-model="parmValue.reqCode" size="mini" placeholder="需求订单编号" style="width:100%"
                        @change="pageInfo.curr = 1;
@@ -110,14 +102,14 @@
 
               <el-col :span="4" style="margin-right:10px">
                 <el-input size="mini" placeholder="发票代码" v-model="parmValue.invoiceCode"
-                  @change=" pageInfo.curr = 1;
+                  @change="pageInfo.curr = 1;
                            parmValue.page = 1;
                           searchList();"  />
               </el-col>
 
               <el-col :span="4">
                 <el-input size="mini" placeholder="发票号码" v-model="parmValue.invoiceNum"
-                  @change=" pageInfo.curr = 1;
+                  @change="pageInfo.curr = 1;
                            parmValue.page = 1;
                           searchList();"
                  />
@@ -148,9 +140,9 @@
             <el-row style="margin-top:10px">
               <el-col :span="4" style="margin-right:10px">
                 <el-select v-model="parmValue.invoice_type" size="mini" placeholder="发票类型" style="width:100%"
-                  @change=" pageInfo.curr = 1;
+                  @change="pageInfo.curr = 1;
                            parmValue.page = 1;
-                          searchList();"
+                           searchList();"
                   >
                     <el-option
                       v-for="type in invoiceTypeList"
@@ -227,6 +219,7 @@ import { invoiceTypeList } from '@/assets/js/statusList';
 import InvoiceModal from "./components/invoice-modal.vue"
 
 
+
 /**
  * @props
     create_start 创建开始时间

+ 1 - 1
src/views/customerService/paymentApply/detail.vue

@@ -31,7 +31,7 @@
 
             <el-collapse-item title="待供应商确认付款" name="3" v-if="sitem && Number(sitem.status) === 2">
               <div style="width:100%;display:flex;justify-content:flex-end;margin:10px 0px">
-                <el-button size="mini" type="primary">确认已付款</el-button>
+                <el-button size="mini" type="primary" @click="handleConfirm">确认已付款</el-button>
               </div>
             </el-collapse-item>
           </el-collapse>

+ 59 - 35
src/views/customerService/workbench/detail.vue

@@ -29,34 +29,43 @@
               <div class="page-main-title">活动要求</div>
               <ul class="page-main-ul clear">
                 <li>项目预算:</li>
-                <li>{{ sitem.budget }}</li>
+                <li>{{ sitem.budget || '--'}}</li>
                 <li>活动城市:</li>
-                <li>{{ sitem.shortname }}</li>
+                <li>{{ sitem.shortname || '--' }}</li>
                 <li>需求项目:</li>
-                <li>{{ sitem.req_demand}}</li>
+                <li>
+                  {{sitem.req_demand_name.map(({name}) => name).join(" + ")}}
+                </li>
                 <li>活动人数:</li>
-                <li>{{ sitem.participant }}</li>
+                <li>
+                  <span v-if="Number(sitem.participant_max) === 0">{{sitem.participant_min}}+</span>
+                  <span v-else>{{sitem.participant_min}} ~ {{sitem.participant_max}}</span> 人
+                </li>
                 <li>活动需求:</li>
-                <li>{{ sitem.require_item }}</li>
+                <li>{{ sitem.require_item || '--' }}</li>
                 <li>活动时间:</li>
-                <li>{{ sitem.act_time }}</li>
+                <li>{{ sitem.act_time || '--'}}</li>
               </ul>
             </div>
           </div>
         </div>
 
-        <div class="p-right">
-          <!-- <div style="display:flex;align-items:center;margin:10px 0px">
-            <p style="margin-right:10px">店铺:</p>
-            <search-store size="mini" :value.sync="storeId" />
-          </div> -->
-         
          <!-- v-if="storeId" -->
+        <div class="p-right">
+          <div style="margin:15px 0px" v-if="!isNegotiate">
+             <el-alert
+               title="订单已过磋商阶段,不允许上传方案。"
+               type="warning"
+               show-icon
+               :closable="false"
+             />
+          </div>
+
           <el-collapse v-model="actives">
             <el-collapse-item 
               name="1" 
               title="评估预算函" 
-              v-if="String(sitem.status) === '1' || String(sitem.status) === '2'">
+              v-if="(String(sitem.status) === '1' || String(sitem.status) === '2') || !isNegotiate">
               <letter
                 ref="evaLetter"
                 :status="1"
@@ -64,7 +73,7 @@
                 :id="sitem.id"
                 :isFile="true"
                 :isSelection="true"
-                :readonly="Number(sitem.status) !== 1"
+                :readonly="Number(sitem.status) !== 1 || !isNegotiate"
                 @selection="handleSelection($event, 'evalute')"
                 @updateLetter="linkToLetterUpdate"
                 :requsetMethod="requestBudgetLetter"
@@ -75,7 +84,7 @@
             <el-collapse-item 
               name="2"
               title="活动方案管理" 
-              v-if="String(sitem.status) === '2' || String(sitem.status) === '3'">
+              v-if="(String(sitem.status) === '2' || String(sitem.status) === '3') || !isNegotiate">
               <letter 
                 :status="2"
                 ref="actLetter"
@@ -83,7 +92,7 @@
                 :id="sitem.id"
                 :isFile="true"
                 :isSelection="true"
-                :readonly="Number(sitem.status) !== 2"
+                :readonly="Number(sitem.status) !== 2 || !isNegotiate"
                 :beforeModalVisible="beforeActivityModalVisible"
                 @selection="handleSelection($event, 'activity')"
                 :requsetMethod="reqsetActivityLetter"
@@ -95,14 +104,14 @@
             <el-collapse-item 
              name="3"
              title="计划预算函管理" 
-             v-if="String(sitem.status) === '3'">
+             v-if="String(sitem.status) === '3' || !isNegotiate">
               <letter
                 ref="proLetter"
                 :status="3"
                 type="project"
                 :id="sitem.id"
                 :isFile="true"
-                :readonly="Number(sitem.status) !== 3"
+                :readonly="Number(sitem.status) !== 3 || !isNegotiate"
                 @selection="handleSelection($event, 'project')"
                 :requsetMethod="requsetProjectLetter"
                 :beforeModalVisible="beforeProjectModalVisible"
@@ -151,7 +160,9 @@ export default {
   },
   data() {
     return {
+      isNegotiate: true,
       fullLoading:false,
+      refreshTimer: null,
       storeId: "",
       demandStatusOptions,
       countdown:'00:00:00',
@@ -191,12 +202,12 @@ export default {
     };
   },
   mounted() {
-    this.initForm();
+    this.initForm()
+    this.regiterRefreshTimer()
   },
   beforeDestroy() {
-    if (this.timer) {
-      clearInterval(this.timer);
-    }
+    this.clearRefreshTimer()
+    this.clearTimer()
   },
   methods: {
     async initForm() {
@@ -208,6 +219,20 @@ export default {
       await this.initData();
       this.loading = false;
     },
+    regiterRefreshTimer(){
+      this.refreshTimer = setInterval(async () => {
+        await this.initForm()
+        const letters = ['evaLetter','actLetter','proLetter']
+        letters.forEach(letter => {
+          this.$refs[letter] && this.$refs[letter].searchList()
+        })
+      }, 60000)
+    },
+    clearRefreshTimer(){
+      if(!this.refreshTimer) return
+      window.clearInterval(this.refreshTimer)
+      this.refreshTimer = null
+    },
     getTime(value) {
       var secondTime = parseInt(value);// 秒
       var minuteTime = 0;// 分
@@ -243,11 +268,13 @@ export default {
     },
     async initData() {
       const { code, message, data } = await asyncRequest.detail({
-        id: this.queryId,
+        id: this.queryId
       });
       if (code === 1) {
         this.sitem = data
-        const { req_endtime } = this.sitem;
+        const { req_endtime , flow_stage } = this.sitem;
+
+        this.isNegotiate = flow_stage === "磋商阶段"
         this.timer = setInterval(() => {
           let now = dayjs(new Date())
           const minuend = now.diff(req_endtime, 'second')
@@ -267,14 +294,6 @@ export default {
     handleSelection(val, key){
       this.selected[key] = val
     },
-    async repeat_initData() {
-      const { code, message, data } = await asyncRequest.detail({
-        infoNo: this.queryId,
-      });
-      const { status } = data;
-      const res = { code, status, message };
-      return res;
-    },
     getNewTime() {
       this.newTime = new Date().valueOf();
     },
@@ -299,9 +318,14 @@ export default {
         return false
       }
 
+      if(Number(this.selected.evalute[0].is_check) !== 1){
+        this.$message.warning('必须选择被选中的预算函')
+        return
+      }
+
       return {
-         req_id: this.$route.query.id,
-        id: this.selected.evalute[0],
+        req_id: this.$route.query.id,
+        id: this.selected.evalute[0].id,
         form: 'activity'
       }
     },
@@ -318,7 +342,7 @@ export default {
 
       return {
         req_id:this.$route.query.id,
-        id: this.selected.activity[0],
+        id: this.selected.activity[0].id,
         form: 'project'
       }
     },

+ 3 - 1
src/views/customerService/workbench/index.vue

@@ -152,7 +152,9 @@
               </div>
 
               <div class="task-card__content">
-                {{item.participant}},{{item.req_demand}}
+                <span v-if="Number(item.participant_max) === 0">{{item.participant_min}}+</span>
+                <span v-else>{{item.participant_min}} ~ {{item.participant_max}}</span> 人
+                 ,  {{item.req_demand_name.map(({name}) => name).join(" + ")}}
               </div>
 
               <div class="task-card__content">