snow 1 year ago
parent
commit
0231e5f9c5
26 changed files with 372 additions and 310 deletions
  1. 3 1
      src/apis/components/search.js
  2. 6 1
      src/apis/service/customerService/demandOrder/index.js
  3. 6 4
      src/components/approval-node/src/credentials.vue
  4. 0 134
      src/components/globalComponents/search-company/index.vue
  5. 56 2
      src/components/manage/src/letter/_columns.js
  6. 25 12
      src/components/manage/src/letter/index.vue
  7. 1 1
      src/components/manage/src/letter/previewModal.vue
  8. 10 10
      src/components/manage/src/letter/xlsxUploadModal.vue
  9. 5 1
      src/components/search/index.js
  10. 49 0
      src/components/search/src/customer.vue
  11. 55 0
      src/components/search/src/demand.vue
  12. 8 3
      src/components/search/src/store.vue
  13. 5 6
      src/views/customerService/demandOrder/columns.js
  14. 9 12
      src/views/customerService/demandOrder/components/demandDetail/index.vue
  15. 30 22
      src/views/customerService/demandOrder/components/demandDetail/requsetPerpaymentModal.vue
  16. 18 17
      src/views/customerService/demandOrder/components/demandDetail/uploadCertificateModal.vue
  17. 1 3
      src/views/customerService/demandOrder/components/waitExecuteCertificate.vue
  18. 40 24
      src/views/customerService/demandOrder/detail.vue
  19. 15 7
      src/views/customerService/demandOrder/index.vue
  20. 4 17
      src/views/customerService/invoiceApproval/index.vue
  21. 4 10
      src/views/customerService/paymentApply/detail.vue
  22. 6 13
      src/views/customerService/paymentApply/index.vue
  23. 10 7
      src/views/customerService/workbench/detail.vue
  24. 3 1
      src/views/platformService/invoice/index.vue
  25. 2 1
      src/views/platformService/settlement/index.vue
  26. 1 1
      src/views/serviceParam/sort/index.vue

+ 3 - 1
src/apis/components/search.js

@@ -1,5 +1,7 @@
 import http from "@/apis/axios";
-const api = "admin/";
+
 export default {
     store: (data, params) => http("admin/supplierStore/index", data, "post", params),
+    customer: (data, params) => http("admin/customer/query", data, "post", params),
+    demand: (data, params) => http("admin/service_item/index", data, "post", params)
 };

+ 6 - 1
src/apis/service/customerService/demandOrder/index.js

@@ -3,20 +3,25 @@ import http from "@/apis/axios";
 const api = "admin/order/";
 
 const planAPI = 'admin/planOrder/'
+
+const preAPI  = 'admin/prepayRatio/'
 export default {
    // 分页查询
   list: (data, params) => http(api + "orderlist", data, "post", params),
   status: (data, params) => http(api + "status", data, "post", params),
   evaluate: (data, params) => http(api + "evaluate", data, "post", params),
+
   // 详情
   detail: (data, params) => http(api + "orderinfo", data, "post", params),
   //申请预付
   prepayApply: (data, params) => http(api + "prepayapply", data, "post", params),
   //需求订单状态
   checkNode: (data, params) => http(api + "checknode", data, "post", params),
-
   proofCheck: (data, params) => http(api + "proofcheck", data, "post", params),
+  prepayOrder: (data, params) => http(api + "prepayorder", data, "post", params),
 
+  settle:(data, params) => http(planAPI + 'settle', data, 'post', params),
+  prepayRatio: (data, params) => http(preAPI + "index", data, "post", params),
   //预算函编辑
   planUpdate:(data, params) => http(planAPI + 'save', data, 'post', params),
   //预算函详情

+ 6 - 4
src/components/approval-node/src/credentials.vue

@@ -47,9 +47,7 @@
                     :multiple="true"
                     :uploadcondition="beforeAvatarUpload"
                     @UploadErrorEvent="UploadErrorEvent($event, imageProp)"
-                    @UploadSuccessEvent="
-                      UploadSuccessEvent($event, imageProp)
-                    "
+                    @UploadSuccessEvent="UploadSuccessEvent($event, imageProp)"
                   ></file-upload>
                 </div>
               </div>
@@ -59,7 +57,7 @@
       </el-form-item>
 
       <el-form-item class="flex-end" style="width:100%">
-        <el-button type="primary" @click="onSubmit">保存</el-button>
+        <el-button :loading="loading" type="primary" @click="onSubmit">保存</el-button>
       </el-form-item>
     </el-form>
 </template>
@@ -79,6 +77,10 @@ export default {
     isAmount:{
       type:Boolean,
       default:() => false
+    },
+    loading:{
+      type:Boolean,
+      default:() => false
     }
   },
   data(){

+ 0 - 134
src/components/globalComponents/search-company/index.vue

@@ -1,134 +0,0 @@
-<template>
-  <el-select
-    v-model="value"
-    multiple
-    filterable
-    remote
-    clearable
-    collapse-tags
-    :multiple-limit="1"
-    reserve-keyword
-    :size="size || 'medium'"
-    style="width: 100%"
-    :placeholder="placeholder || ''"
-    :disabled="disabled"
-    :remote-method="remoteMethod"
-    :loading="selectLoading"
-    @change="selectChange"
-  >
-    <el-option
-      v-for="(item, index) in options"
-      :key="item.id + index"
-      :label="item.company"
-      :value="item.companyNo + ''"
-      :disabled="!noDisabled && item.status + '' !== '1'"
-    />
-  </el-select>
-</template>
-
-<script>
-import asyncRequest from '@/apis/components/search-work-company'
-import resToken from '@/mixins/resToken'
-export default {
-  name: 'SearchCompany',
-  mixins: [resToken],
-  props: ['size', 'value', 'placeholder', 'isDetail', 'disabled', 'names', 'type', 'isp', 'noDisabled'],
-  /**
-   * 属性集合
-   * @param {String}        size             : 组件大小            非必填
-   * @param {Array}         value            : 选中值              必填
-   * @param {String}        placeholder      : 提示信息            非必填
-   * @param {Boolean}       isDetail          : 是否是详情逻辑       必填
-   * @param {Boolean}       disabled         : 是否禁用            必填
-   * @param {String}        names            : 选中值label         展示详情必填
-   * @param {String}        type             : 数据类型            非必填 1是平台供应商0非平台供应商
-   */
-  /**
-   * 事件集合
-   * @searchChange             : 选中值变化调用   抛出选中数据
-   */
-  data() {
-    return {
-      options: [],
-      selectLoading: false,
-      searchName: ''
-    }
-  },
-  watch: {
-    names: function(val, old) {
-      // console.log(val, old, this.isDetail, "1");
-      this.searchName = val
-      if (this.isDetail && this.searchName) {
-        this.remoteMethod(this.searchName, this.isp)
-      }
-    },
-    isDetail: function(val, old) {
-      // console.log(val, old, this.isDetail, "2");
-      if (val && this.searchName) {
-        this.remoteMethod(this.searchName, this.isp)
-      }
-    }
-  },
-  mounted() {
-    this.options = []
-    this.selectLoading = false
-  },
-  methods: {
-    async selectChange(e) {
-      // console.log(e);
-      // console.log("1111" + this.isp);
-      if (e && e.length > 0) {
-        const index = this.options.findIndex((v) => v.companyNo === e[0])
-        if (index !== -1) {
-          const model = {
-            id: this.options[index].id,
-            code: this.options[index].companyNo,
-            label: this.options[index].company,
-            isPower: this.options[index].has_account + '' !== '0'
-          }
-          this.$emit('searchChange', model)
-        } else {
-          this.$emit('searchChange', {})
-        }
-      } else {
-        this.$emit('searchChange', {})
-      }
-    },
-    async remoteMethod(query, types) {
-      this.selectLoading = true
-      if (query !== '') {
-        this.options = []
-        const formValue = {
-          page: 1,
-          size: 100,
-          company: query,
-          code: '',
-          is_platform: this.type ? this.type : ''
-        }
-        const { code, data, message } = await asyncRequest.list(formValue)
-        if (code === 0) {
-          const { list } = data
-          this.options = list
-          if (types) {
-            // console.log(this.value);
-            const index = this.options.findIndex((v) => v.companyNo + '' === this.value[0] + '')
-            // console.log(this.options);
-            // console.log(index);
-            if (index !== -1) {
-              await this.selectChange([this.options[index].companyNo])
-            }
-          }
-          // console.log(types);
-        } else if (code >= 100 && code <= 104) {
-          await this.logout()
-        } else {
-          this.$message.warning(message)
-        }
-      } else {
-        this.options = []
-      }
-      this.selectLoading = false
-    }
-  }
-}
-</script>

+ 56 - 2
src/components/manage/src/letter/_columns.js

@@ -30,6 +30,7 @@ export const budget = [
       prop: mapFields.letter,
       label: '评估预算函',
       width: '156px',
+      _slot_:'letter'
   },
   {
       prop: mapFields.budgetAmount,
@@ -79,6 +80,7 @@ export const activity = [
         prop: mapFields.letter,
         label: '评估预算函',
         width: '156px',
+        _slot_:'letter'
     },
     {
         prop: mapFields.budgetAmount,
@@ -124,6 +126,50 @@ export const project = [
         width: '120px',
         _slot_:'is_check'
     },
+    {
+        prop: mapFields.letter,
+        label: '评估预算函',
+        width: '156px',
+        _slot_:'letter'
+    },
+    {
+        prop: mapFields.budgetAmount,
+        label: '评估预算金额',
+        width: '180px',
+    },
+    {
+        prop: mapFields.supplierStoreName,
+        label: '供应商店铺名称',
+        width: '156px',
+    },
+    {
+        prop: mapFields.supplierCompanyName,
+        label: '供应商公司名称',
+        width: '156px',
+    },
+    {
+        prop: mapFields.creator,
+        label: '创建人',
+        width: '150px',
+    },
+    {
+        prop: mapFields.createTime,
+        label: '创建时间',
+        minWidth: '150px',
+    },
+]
+
+export const settlement = [
+    {
+        type: 'index',
+        label: '序号',
+        width: '70px'
+    },
+    {
+        prop: mapFields.letterNo,
+        label: '评估预算函编号',
+        width: '120px',
+    },
     {
         prop: mapFields.letter,
         label: '评估预算函',
@@ -159,7 +205,8 @@ export const project = [
 const mapColumns = {
     budget,
     activity,
-    project
+    project,
+    settlement
 }
 
 
@@ -178,10 +225,17 @@ const mapCheck = {
     }
 }
 
+const mapTitle = {
+    budget: '预算函',
+    activity: '活动方案',
+    project: '计划预算函',
+    settlement: '结算函'
+}
 
 
 
 export  {
   mapColumns,
-  mapCheck
+  mapCheck,
+  mapTitle
 }

+ 25 - 12
src/components/manage/src/letter/index.vue

@@ -1,8 +1,8 @@
 <template>
   <div>
     <div style="display:flex;justify-content:flex-end" v-if="!readonly">
-      <el-button size="mini" @click="onDownloadTemplate">下载{{title}}模板</el-button>
-      <el-button size="mini" type="primary" @click="handleUploadModalVisible">上传{{title}}</el-button>
+      <el-button size="mini" @click="onDownloadTemplate">下载{{mapTitle[type]}}模板</el-button>
+      <el-button size="mini" type="primary" @click="handleUploadModalVisible">上传{{mapTitle[type]}}</el-button>
     </div>
     <ex-table
       :columns="[...(isSelection ? [{type:'selection'}] : []), ...mapColumns[type || 'budget'], { label: '操作', _slot_: 'action', width:'80px',fixed:'right'}]"
@@ -17,13 +17,17 @@
         </el-tag>
       </template>
 
-      <template #action="{scope}">
+      <template #letter="{}">
+        <a href="http://hwpro.test241.wanyuhengtong.com/storage/default/20230608/6916c8847df2d1ee629c3490fe43501003ef1e7a.xlsx">{{getFileNameWithUrl('http://hwpro.test241.wanyuhengtong.com/storage/default/20230608/6916c8847df2d1ee629c3490fe43501003ef1e7a.xlsx')}}</a>
+      </template>
+      <template #action="{ scope }">
         <el-button type="text" size="mini" @click="openModal(scope.row)">查看</el-button>
       </template>
     </ex-table>
 
     <excel-upload-modal 
       :visible.sync="xlsxVisible"
+      :type="type"
       :requsetMethod="requsetMethod"
       @submit="handleSubmit"
       @refresh="onSearch"
@@ -45,7 +49,7 @@ import PreviewModal from "./previewModal.vue"
 import asyncRequest from "@/apis/components/letter"
 import { writeFile, utils } from "xlsx";
 import { template } from "./_template"
-import { mapColumns, mapCheck } from "./_columns"
+import { mapColumns, mapCheck, mapTitle } from "./_columns"
 
 export default {
   name:'Letter',
@@ -59,8 +63,9 @@ export default {
         border: true,
         'max-height': '800px'
       },
-      sitem:{},
+      sitem: {},
       mapCheck,
+      mapTitle,
       mapColumns,
       tableData:[],
       xlsxVisible:false,
@@ -83,10 +88,16 @@ export default {
       const workBook = utils.book_new()
       const workSheet = utils.json_to_sheet(template)
       utils.book_append_sheet(workBook,workSheet,"sheet")
-      writeFile(workBook,`${this.title}模板.xlsx`,{
+      writeFile(workBook,`${mapTitle[this.type]}模板.xlsx`,{
         bookType:'xlsx'
       })
     },
+    getFileNameWithUrl(url){
+      const chunks = url.split('/')
+      const fullFileName = chunks[chunks.length - 1]
+      const [ fileName, suffix ] = fullFileName.split('.')
+      return (fileName.length > 10 ? fileName[0] + fileName[1]  + '...' + fileName[fileName.length -1] : fileName) + '.' + suffix
+    },
     handleUploadModalVisible(){
       if(this.beforeModalVisible && !this.beforeModalVisible()){
         return
@@ -95,17 +106,19 @@ export default {
       this.xlsxVisible = true
     },
     async onSearch(){
+      if(this.type === 'settlement') return
       this.loading = true
-      const { code, data } = await asyncRequest.list({
-        status:this.status,
-        req_id: this.id
-      })
+      const { code, data } = await asyncRequest.list({ status:this.status, req_id: this.id })
       this.loading = false
-
       if(code !== 1) return
-
       this.tableData = data.list
     }
   }
 }
 </script>
+
+<style lang="scss" scoped>
+a{
+  color: #409EFF !important;
+}
+</style>

+ 1 - 1
src/components/manage/src/letter/previewModal.vue

@@ -25,7 +25,7 @@
 
 <script>
 export default {
-  props:['visible','sitem'],
+  props:['visible','sitem', 'type'],
   computed:{
     innerVisible:{
       get(){

+ 10 - 10
src/components/manage/src/letter/xlsxUploadModal.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-dialog :title="`上传${title}方案`" :visible="innerVisible" width="1024px" @close="handleClose" center>
+  <el-dialog :title="`上传${mapTitle[type]}方案`" :close-on-click-modal="false" :visible="innerVisible" width="1024px" @close="handleClose" center>
 
     <div v-if="file_url && isFile" style="margin-left:20px">
       <a :href="file_url">点击下载</a>
@@ -33,7 +33,9 @@
     <div style="padding:10px" v-loading="loading">
      <div v-if="tableData && tableData.length > 0" class="tr" style="padding: 10px 0 0 0">
       <el-button :size="'mini'" @click="() => tableData = []">取消</el-button>
-      <el-button type="primary" :size="'mini'" @click="onSubmit">提交</el-button>
+      <el-button type="primary" :size="'mini'" @click="onSubmit">{{
+        type === 'settlement' ? '保存' : '提交'  
+      }}</el-button>
       </div>
       <div v-else>
         <upload-excel :on-success="onSuccess" :before-upload="beforeUpload" />
@@ -51,20 +53,22 @@
 
 <script>
 import companyHelper from '@/mixins/companyHelper'
-import { template } from "./_template"
 import { utils, writeFile } from "xlsx"
+import { template } from "./_template"
+import { mapTitle } from './_columns'
 
 import {
   columns,
   getColumn,
   requsetFields,
   requiredFields,
-  getTableProperty,
+  getTableProperty
 } from './_template'
 
+
 export default {
   mixins: [companyHelper],
-  props: ['visible', 'title', 'requsetMethod','isFile'],
+  props: ['visible', 'title', 'requsetMethod','isFile', 'type'],
   data() {
     return {
       columns,
@@ -72,6 +76,7 @@ export default {
       tableData: [],
       file_url:"",
       isInit:true,
+      mapTitle,
       table: {
         stripe: true,
         border: true,
@@ -106,7 +111,6 @@ export default {
     },
     validateTableHeader(header, importHeader) {
       let isHeaderOk = true
-      console.log(header,importHeader)
       if (header.length !== importHeader.length) return false
       for (const index in header) {
         const field = header[index]
@@ -216,17 +220,13 @@ export default {
         this.$message.warning('请上传文件!')
         return
       }
-
-      
       const planinfo = this.tableData.map(tableItem => requsetFields.reduce((prev, currentKey) => ({
         ...prev,
         [currentKey]: tableItem[currentKey]
       }), {}))
-
       this.loading = true
       const { code } = await this.requsetMethod(planinfo, this.file_url)
       this.loading = false
-
       if(code !== 1) return
       this.$emit('refresh')
       this.innerVisible = false

+ 5 - 1
src/components/search/index.js

@@ -1,7 +1,11 @@
 import SearchStore from "./src/store.vue"
+import SearchCustomer from "./src/customer.vue"
+import SearchDemand from "./src/demand.vue"
 
 const searchComponents = [
-  SearchStore
+  SearchStore,
+  SearchCustomer,
+  SearchDemand
 ]
 
 export default searchComponents

+ 49 - 0
src/components/search/src/customer.vue

@@ -0,0 +1,49 @@
+<template>
+  <el-select
+    v-model="_value"
+    :size="size" 
+    remote
+    :remote-method="onFetch"
+    :placeholder="placeholder || '请选择客户公司'"
+    :loading="loading"
+    reserve-keyword
+    filterable
+    clearable
+  >
+    <el-option v-for="item in list" :key="item.id" :value="item.id" :label="item.store_name" />
+  </el-select>
+</template>
+
+
+<script>
+import asyncRequest from "@/apis/components/search"
+export default {
+  name:'SearchCustomer',
+  props:['size', 'value' , 'placeholder'],
+  data(){
+    return {
+      loading: false,
+      list: []
+    }
+  },
+  computed:{
+    _value:{
+        get(){
+          return this.value
+        },
+        set(newVal){
+          const current = this.list.find(({id}) => id === newVal)
+          this.$emit('change', current)
+          this.$emit('update:value', newVal)
+        }
+    }
+  },
+  methods:{
+    async onFetch(keyword){
+      const {code, data} = await asyncRequest.customer({companyName: keyword})
+      if(code !== 1) return
+      this.list = data
+    }
+  }
+}
+</script>

+ 55 - 0
src/components/search/src/demand.vue

@@ -0,0 +1,55 @@
+<template>
+  <el-select
+    v-model="_value"
+    :size="size" 
+    :remote-method="onFetch"
+    placeholder="请选择活动需求"
+    :loading="loading"
+    reserve-keyword
+    filterable
+    remote
+    clearable
+  >
+    <el-option 
+      v-for="item in list"
+      :label="item.name" 
+      :value="item.id" 
+      :key="item.id" 
+    />
+  </el-select>
+</template>
+
+
+<script>
+import asyncRequest from "@/apis/components/search"
+export default {
+  name:'SearchDemand',
+  props:['size', 'value'],
+  data(){
+    return {
+      loading: false,
+      list: []
+    }
+  },
+  computed:{
+    _value:{
+      get(){
+        return this.value
+      },
+      set(newVal){
+        const current = this.list.find(({id}) => id === newVal)
+        this.$emit('update:value', newVal)
+        this.$emit('change', current)
+      }
+    }
+  },
+  methods:{
+    async onFetch(keyword){
+      const {code, data} = await asyncRequest.demand({name: keyword})
+      if(code !== 1) return
+      this.list = data.list
+    }
+  }
+}
+</script>
+

+ 8 - 3
src/components/search/src/store.vue

@@ -8,14 +8,19 @@
     :loading="loading"
     reserve-keyword
     filterable
+    clearable
   >
-    <el-option v-for="item in list" :key="item.id" :value="item.id" :label="item.store_name" />
+    <el-option 
+      :key="id" 
+      :value="id" 
+      v-for="{ id, store_name } in list" 
+      :label="store_name" 
+    />
   </el-select>
 </template>
-
-
 <script>
 import asyncRequest from "@/apis/components/search"
+
 export default {
   name:'SearchStore',
   props:['size', 'value'],

+ 5 - 6
src/views/customerService/demandOrder/columns.js

@@ -9,9 +9,8 @@ const statusList = [
 
 //*  预付类型选项 **/ 
 const prepaymentTypeOptions =  [
-  {value:0,label:"未申请预付"},
-  {value:1,label:"已申请预付"},
-  {value:2,label:"预付完成"},
+  { value:1, label:"客户垫付"},
+  { value:2, label:"平台垫付"},
 ]
 
 const listCol = [
@@ -162,13 +161,13 @@ const demandDetailColumns = [
     span:8
   },
   {
-    prop:'todo',
+    prop:'TODO',
     label:'预付类型',
     span:8,
     _slot_:'prepaymentType'
   },
   {
-    prop:'todo',
+    prop:'TODO',
     label:'预付金额',
     span:8,
     _slot_:'prepaymentAmount'
@@ -179,7 +178,7 @@ const demandDetailColumns = [
     span:8
   },
   {
-    prop:'todo',
+    prop:'TODO',
     label:'当前状态',
     span:16,
     _slot_:'currentStatus'

+ 9 - 12
src/views/customerService/demandOrder/components/demandDetail/index.vue

@@ -1,11 +1,11 @@
 <template>
-  <div>
+  <div> 
     <show-data-table
       style="padding: -5px 0 10px 0"
       v-if="newTime !== ''"
       :newTime="newTime"
       :sitem="sitem"
-      :columns="demandDetailColumns" 
+      :columns="demandDetailColumns"
     >
       <template #prepaymentType>
         <div class="flex-between align-center" style="height:18px;padding-top:5px">
@@ -34,10 +34,10 @@
       <template #currentStatus>
         <div class="align-center" style="height:18px;padding-top:5px">
           <el-tag size="mini" style="margin-left:5px">{{
-            demandStatusOptions.find(({value}) => value === String(sitem.status)).label
+            (demandStatusOptions.find(({value}) => value === String(sitem.status)) || {}).label || '--'
             }}</el-tag>
           <el-button 
-            v-if="Number(sitem.status) > 2 && Number(sitem.status) < 5"
+            v-if="Number(sitem.status) >= 2 && Number(sitem.status) <= 5"
             style="margin-left:5px;line-height:8px" type="primary" size="mini"
              @click="handleSwitchNode('prev')">
              切换到上一节点
@@ -59,17 +59,14 @@
 </template>
 
 <script>
-import { demandDetailColumns, prepaymentTypeOptions } from "./../../columns"
+import { demandDetailColumns, prepaymentTypeOptions } from "../../columns"
 import RequestPerpaymentModal from "./requsetPerpaymentModal.vue"
 import UploadCerfificateModal from "./uploadCertificateModal.vue"
 import { demandStatusOptions } from '@/assets/js/statusList'
 
 export default {
   name:'demandDetail',
-  components:{
-    RequestPerpaymentModal,
-    UploadCerfificateModal
-  },
+  components:{ RequestPerpaymentModal, UploadCerfificateModal },
   props:{
     data:{
       type:Object,
@@ -93,10 +90,10 @@ export default {
     return {
       demandStatusOptions,
       prepaymentTypeOptions,
-      requsetModalVisible:false, //申请预付模态框
-      uploadModalVisible:false, // 上传预付凭证模态框
+      requsetModalVisible: false, //申请预付模态框
+      uploadModalVisible: false, // 上传预付凭证模态框
       demandDetailColumns,
-      newTime:""
+      newTime: ""
     }
   },
   methods:{

+ 30 - 22
src/views/customerService/demandOrder/components/demandDetail/requsetPerpaymentModal.vue

@@ -7,21 +7,25 @@
         </el-select>
       </el-form-item>
 
-      <el-form-item label="支付比例" prop="prepay_tax">
-        <el-select style="width:100%" v-model="ruleForm.prepay_tax" placeholder="支付比例">
-          <el-option v-for="ratio in payRatioOptions" :key="ratio.value" :label="ratio.label" :value="ratio.value"  />
+      <el-form-item label="支付比例" prop="prepay_tax"> 
+        <el-select style="width:100%" v-model="ruleForm.prepay_tax" placeholder="支付比例" :disabled="!ruleForm.prepay_type">
+          <el-option 
+            v-for="payRatio in payRatioOptions" 
+            :key="payRatio.id" 
+            :value="payRatio.id" 
+            :label="payRatio.ratio" 
+          />
         </el-select>
       </el-form-item>
-
+    
       <el-form-item class="flex-end">
-        <el-button type="primary" @click="onSubmit">保存</el-button>
+        <el-button type="primary" @click="onSubmit">保 存</el-button>
       </el-form-item>
     </el-form>
   </el-dialog>
 </template>
-
 <script>
-import { prepaymentTypeOptions } from "./../../columns"
+import { prepaymentTypeOptions } from "../../columns"
 import asyncRequest from "@/apis/service/customerService/demandOrder";
 
 /**
@@ -29,7 +33,6 @@ import asyncRequest from "@/apis/service/customerService/demandOrder";
   prepay_type  //预付类型
   prepay_tax  //支付比例
 */
-
 export default {
   props:['visible','sitem'],
   computed:{
@@ -45,15 +48,8 @@ export default {
   data(){
     return {
       prepaymentTypeOptions,
-      payRatioOptions:[
-        { value: "50", label: "50%"},
-        { value: "30", label: "30%"},
-        { value: "10", label: "10%"},
-      ],
-      ruleForm:{
-          prepay_type:"",  //预付类型
-          prepay_tax:"" //支付比例
-      },
+      payRatioOptions:[],
+      ruleForm: { prepay_type:"",  /* 预付类型**/ prepay_tax:"" /* 支付比例 **/ },
       rules:{
         prepay_type:[{
           required:true,
@@ -68,14 +64,27 @@ export default {
       }
     }
   },
+  watch:{
+    'ruleForm.prepay_type':{
+      handler(){
+        this.prepay_tax = ""
+        this.fetchPrepayRatioOptions()
+      }
+    }
+  },
   methods:{
     onClose(){
-      this.ruleForm = {
+      this.ruleForm = { 
         prepay_type:"",  //预付类型
         prepay_tax:"" //支付比例
       }
       this.innerVisible = false
     },
+    async fetchPrepayRatioOptions(){
+      const { code, data } = await asyncRequest.prepayRatio({ name: this.ruleForm.prepay_type, status: 1 })
+      if(code !== 1) return
+      this.payRatioOptions = data.list
+    },
     async onSubmit(){
       try {
         await this.$refs.ruleForm.validate()
@@ -83,10 +92,9 @@ export default {
           id:this.sitem.id,
           ...this.ruleForm
         })
-        if(code === 1){
-          this._visible = false
-          this.$emit("refresh")
-        }
+        if(code !== 1) return
+        this._visible = false
+        this.$emit("refresh")
       }catch(err){
         console.log(err)
       }

+ 18 - 17
src/views/customerService/demandOrder/components/demandDetail/uploadCertificateModal.vue

@@ -1,19 +1,19 @@
 <template>
   <el-dialog :visible="innerVisible" width="500px" title="上传预付付款凭证" center :close-on-click-modal="false" @close="handleClose">
-    <credentials-node is-amount />
+    <credentials-node :loading="loading" is-amount @confirm="onSubmit" />
   </el-dialog>
 </template>
 
 <script>
-
+import asyncRequest from "@/apis/service/customerService/demandOrder";
 /***
  *
-  prepaymentAmount //预付总金额
-  certificateImage //付款凭证图
+  prepay_amount //预付总金额
+  prepay_image //付款凭证图
  */
 
 export default {
-  props:['visible'],
+  props:['visible','sitem'],
   computed:{
     innerVisible:{
       get(){
@@ -26,12 +26,13 @@ export default {
   },
   data(){
     return {
+      loading:false,
       ruleForm:{
-        prepaymentAmount:"", //预付总金额
-        certificateImage:"", //付款凭证图
+        prepay_amount:"", //预付总金额
+        prepay_image:"", //付款凭证图
       },
       rules:{
-         prepaymentAmount:[
+         prepay_amount:[
           {
             required:true,
             trigger:'change',
@@ -51,8 +52,8 @@ export default {
   methods:{
      handleClose(){
       this.ruleForm = {
-        prepaymentAmount: "", //预付总金额
-        certificateImage: ""  //付款凭证图
+        prepay_amount: "", //预付总金额
+        prepay_image: ""  //付款凭证图
       }
 
        this.innerVisible = false
@@ -101,13 +102,13 @@ export default {
                 this.$refs.ruleForm.validateField(key);
             }
         },
-        async onSubmit(){
-          try {
-            await this.$refs.ruleForm.validate()
-            console.log('todo...')
-          }catch(err){
-            console.log(err)
-          }
+        async onSubmit({amount:prepay_amount,credentials:prepay_image}){
+          this.loading = true
+          const { code } = await asyncRequest.prepayOrder({ id: this.sitem.id, prepay_amount, prepay_image })
+          this.loading = false
+          if(code !== 1) return
+          this.innerVisible = false
+          this.$emit('refresh')
       }
     }
 }

+ 1 - 3
src/views/customerService/demandOrder/components/waitExecuteCertificate.vue

@@ -7,9 +7,7 @@
       </el-form-item>
 
       <el-form-item label="客户公司" prop="customer_id">
-        <el-select v-model="ruleForm.customer_id" placeholder="客户公司" style="width:500px">
-          <el-option />
-        </el-select>
+        <search-customer :data.sync="ruleForm.customer_id" style="width:500px" />
       </el-form-item>
 
       <el-form-item label="审核备注" prop="remark">

+ 40 - 24
src/views/customerService/demandOrder/detail.vue

@@ -5,18 +5,19 @@
         <el-tab-pane label="需求订单详情" name="1">
           <el-collapse v-model="activeNames" style="margin: -18px 0 0 0">
             <el-collapse-item title="需求订单详情" name="1">
-              <demand-detail :sitem="sitem" @refresh="refresh" @switchNode="handleSwitchNode" />
+              <demand-detail :sitem="sitem" @refresh="refresh" @switch-node="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')" />
+              <manage-budgeet-letter :sitem="sitem" @selected-change="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')" />
+              <manage-activity-scheme :sitem="sitem" @selected-change="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')" />
+              <manage-project-letter :sitem="sitem" @selected-change="handleSelectedChange($event,'project')" />
             </el-collapse-item>
 
             <el-collapse-item title="待客户上传确认凭证" name="4" v-if="Number(sitem.status) === 4">
@@ -25,11 +26,10 @@
 
             <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>,
 
             <el-collapse-item title="待供应商确认已执行" name="6" v-if="Number(sitem.status) === 6">
               <wait-supplier-confirm :sitem="sitem" @refresh="initData"  />
-              <!-- <credentials-node @confirm="handleSupplierConfirm($event)" /> -->
             </el-collapse-item>
 
             <el-collapse-item title="待客户确认已执行" name="7" v-if="Number(sitem.status) === 7">
@@ -37,8 +37,7 @@
             </el-collapse-item>
 
             <el-collapse-item title="待供应商上传结算函" name="8" v-if="Number(sitem.status) === 9">
-              <!-- <letter title="结算" /> -->
-              <settlement-letter :sitem="sitem"  @refresh="initData" />
+              <letter type="settlement" :requsetMethod="handleUploadLetter" :isFile="true" />
             </el-collapse-item>
 
             <el-collapse-item title="待客户确认结算函" name="9" v-if="Number(sitem.status) === 10">
@@ -52,24 +51,24 @@
 </template>
 <script>
 import asyncRequest from "@/apis/service/customerService/demandOrder";
-import privateField from '../../../mixins/privateField';
+
+import privateField from '@/mixins/privateField'
 import DemandDetail from "./components/demandDetail/index.vue"
 import ManageBudgeetLetter from "./components/manageBudgetLetter.vue"
-import ManageActivityScheme from "./components/manageActivityScheme.vue"
 import ManageProjectLetter from "./components/manageProjectLetter.vue"
-import WaitExecuteCertificate from "./components/waitExecuteCertificate.vue"
 import WaitSupplierConfirm from "./components/waitSupplierConfirm.vue"
 import WaitCustomerConfirm from "./components/waitCustomerConfirm.vue"
 import SettlementLetter from "./components/settlementLetter/index.vue"
+import workbenchRequest from "@/apis/service/customerService/workbench"
+import ManageActivityScheme from "./components/manageActivityScheme.vue"
+import WaitExecuteCertificate from "./components/waitExecuteCertificate.vue"
 
-// import LetterModal from "./components/letterModal/index.vue"
-import resToken from "@/mixins/resToken";
 import { mapGetters } from "vuex";
 import { statusList } from "./columns";
+import resToken from "@/mixins/resToken";
 
 export default {
   components: { 
-    // LetterModal,
     DemandDetail, 
     ManageBudgeetLetter, 
     WaitSupplierConfirm, 
@@ -82,7 +81,13 @@ export default {
   name: "demandOrderDetail",
   mixins: [resToken,privateField],
   computed: {
-    ...mapGetters(["tablebtnSize", "searchSize", "size", "private_field", "isSupertube"]),
+    ...mapGetters([
+      "tablebtnSize", 
+      "searchSize",
+      "size",
+      "private_field", 
+      "isSupertube"
+    ]),
     powers() {
       const { btnList } = this.$store.getters;
       const tran = btnList.find((item) => item.menu_route == "demandOrderDetail") || {};
@@ -181,8 +186,9 @@ export default {
           return
         }
 
-        if(updatedStatus === 4 && (this.selected.project === 0 || this.selected.project > 1) ){
-          this.$message.warning('未选择计划预算函')
+        if(updatedStatus === 4 && this.selected.project !== 1){
+          const warn = this.selected.project === 0 ? '未选择结算函' : '只能选一个结算'
+          this.$message.warning(warn)
           return
         }
       }
@@ -191,6 +197,21 @@ export default {
       if(code !== 1) return
       this.initForm()
     },
+    async handleUploadLetter(settleinfo, file_url){
+      const params = {
+        id: this.sitem.id,
+        settleinfo,
+        file_url
+      }
+
+      const result = await workbenchRequest.settle(params)
+      
+      if(reuslt.code === 1){
+        this.initData()
+      } 
+
+      return result
+    },
     async handleCustomerConfirm(data){
       const { credentials: proof_url  } = data
       const { code } = await asyncRequest.proofCheck({ id: this.sitem.id,proof_url, status: 5 })
@@ -204,12 +225,7 @@ export default {
       this.initData()
     },
     async handleConfirmSettlement(data){
-      const { code } = await asyncRequest.status({
-        id:this.sitem.id,
-        ...data,
-        status:data.status === '1' ? '11' : '12',
-      })
-
+      const { code } = await asyncRequest.status({ id:this.sitem.id, ...data, status:data.status === '1' ? '12' : '11' })
       if(code !== 1) return
       this.initData() 
     },
@@ -240,7 +256,7 @@ export default {
     padding: 10px;
     height: 100%;
     width: 100%;
-  }
+  } 
   .bargainListDetail-title {
     border-top: 1px solid #ebeef5;
     span {

+ 15 - 7
src/views/customerService/demandOrder/index.vue

@@ -47,7 +47,6 @@
                 </el-select>
               </el-col>
                             
-
               <el-col :span="3" style="width: 66px; float: right">
                 <el-button
                   :size="searchSize"
@@ -97,13 +96,18 @@
               </el-col>
 
               <el-col :span="4">
-                <el-select  v-model="parmValue.activityDemand" style="width:100%" size="mini" placeholder="活动需求" @change="
+                <!-- <el-select  v-model="parmValue.activityDemand" style="width:100%" size="mini" placeholder="活动需求" @change="
                 pageInfo.curr = 1;
                 parmValue.page = 1;
                 searchList();
                ">
                   <el-option />
-                </el-select>
+                </el-select> -->
+                <search-demand size="mini" :value.sync="parmValue.activityDemand"  @change="
+                  pageInfo.curr = 1;
+                  parmValue.page = 1;
+                  searchList();
+                " />
               </el-col>
             </el-row>
 
@@ -136,7 +140,6 @@
               </el-col>
             </el-row>
 
-
             <el-row style="margin-top:10px">
               <el-col :span="4">
                 <el-select size="mini" style="width:100%" placeholder="需求项目" v-model="parmValue.demandProject" @change="
@@ -157,13 +160,19 @@
               </el-col>
 
               <el-col :span="4" style="margin-left:10px">
-                <el-select size="mini" placeholder="需求企业" v-model="parmValue.demandEnterprise" @change="
+                <!-- <el-select size="mini" placeholder="需求企业" v-model="parmValue.demandEnterprise" @change="
                 pageInfo.curr = 1;
                 parmValue.page = 1;
                 searchList();
                ">
                   <el-option />
-                </el-select>
+                </el-select> -->
+                <search-customer size="mini" placeholder="需求公司" :value.sync="parmValue.demandEnterprises" @change="
+                  pageInfo.curr = 1;
+                  parmValue.page = 1;
+                  searchList();
+                  " 
+                />
               </el-col>
             </el-row>
 
@@ -260,7 +269,6 @@ const mapDateFields = {
   }
 }
 
-
 export default {
   name: "bargainList",
   mixins: [mixinPage, resToken, companyHelper],

+ 4 - 17
src/views/customerService/invoiceApproval/index.vue

@@ -1,8 +1,6 @@
 <template>
   <div class="bargainList pagePadding">
-    <div
-      v-if=" powers.some((i) => i == '001')"
-    >
+    <div>
       <ex-table
         v-loading="loading"
         :table="table"
@@ -244,9 +242,6 @@
         </template>
       </ex-table>
     </div>
-    <div v-else>
-      <no-auth></no-auth>
-    </div>
 
     <ApprovalModal :visible.sync="visible" />
   </div>
@@ -297,9 +292,7 @@ export default {
     ...mapGetters(["tablebtnSize", "searchSize", "size"]),
     powers() {
       const tran =
-        this.$store.getters.btnList.find(
-          (item) => item.menu_route == "bargainList"
-        ) || {};
+        this.$store.getters.btnList.find((item) => item.menu_route == "invoiceApproval") || {};
       const { action } = tran ?? {};
       return action ?? [];
     },
@@ -311,7 +304,7 @@ export default {
       customerCode: [], //客户公司code
       statusList,
       sitem: null,
-      loading: true,
+      loading: false,
       showModel: false,
       isDetail: false,
       modelId: 0,
@@ -453,13 +446,7 @@ export default {
     },
     // 列表搜索
     async searchList() {
-      // if (
-      //   (this.parmValue.start !== "" && this.parmValue.end === "") ||
-      //   (this.parmValue.start === "" && this.parmValue.end !== "")
-      // ) {
-      //   this.$message.warning("时间区间不完整!");
-      //   return;
-      // }
+      return
 
       for(const field of Object.keys(mapDateFields)){
         const startField = `${field}Start`

+ 4 - 10
src/views/customerService/paymentApply/detail.vue

@@ -6,9 +6,9 @@
           <el-collapse v-model="activeNames" style="margin: -18px 0 0 0">
             <el-collapse-item :title="'付款申请信息展示'" name="1">
               <show-data-table
+                v-if="newTime !== ''"
                 style="padding: -5px 0 10px 0"
                 :newTime="newTime"
-                v-if="newTime !== ''"
                 :sitem="{}"
                 :columns="editColumns"
               />
@@ -34,11 +34,11 @@
 </template>
 <script>
 import asyncRequest from "@/apis/service/customerService/paymentApply";
+import privateField from '@/mixins/privateField';
 import resToken from "@/mixins/resToken";
+import { editColumns } from "./columns";
 import { mapGetters } from "vuex";
 
-import { editColumns } from "./columns";
-import privateField from '@/mixins/privateField';
 export default {
   name: "bargainListDetail",
   mixins: [resToken,privateField],
@@ -46,13 +46,7 @@ export default {
     ...mapGetters(["tablebtnSize", "searchSize", "size", "private_field", "isSupertube"]),
     powers() {
       const { btnList } = this.$store.getters;
-      const tran = btnList.find((item) => item.menu_route == "bargainListDetail") || {};
-      const { action } = tran ?? {};
-      return action ?? [];
-    },
-    ppowers() {
-      const { roleProcess } = this.$store.getters;
-      const tran = roleProcess.find((i) => i.process_type === "YJD") || {};
+      const tran = btnList.find((item) => item.menu_route == "paymentApplyDetail") || {};
       const { action } = tran ?? {};
       return action ?? [];
     },

+ 6 - 13
src/views/customerService/paymentApply/index.vue

@@ -1,8 +1,6 @@
 <template>
   <div class="bargainList pagePadding">
-    <div
-      v-if=" powers.some((i) => i == '001')"
-    >
+    <div>
       <ex-table
         v-loading="loading"
         :table="table"
@@ -144,18 +142,11 @@
             content="详情"
             placement="top"
           >
-            <i
-              class="el-icon-view tb-icon"
-              
-               @click="getRouter('paymentApplyDetail', scope.row.bargainNo )"
-            ></i>
+            <i class="el-icon-view tb-icon" @click="getRouter('paymentApplyDetail', scope.row.bargainNo )" />
           </el-tooltip>
         </template>
       </ex-table>
     </div>
-    <div v-else>
-      <no-auth></no-auth>
-    </div>
   </div>
 </template>
 <script>
@@ -198,7 +189,7 @@ export default {
       statusList,
       sitem: null,
 
-      loading: true,
+      loading: false,
       showModel: false,
       isDetail: false,
       modelId: 0,
@@ -349,6 +340,8 @@ export default {
     },
     // 列表搜索
     async searchList() {
+      return
+
       if (
         (this.parmValue[mapFields.createStart] !== "" && this.parmValue[mapFields.createEnd] === "") ||
         (this.parmValue[mapFields.createStart] === "" && this.parmValue[mapFields.createEnd] !== "")
@@ -424,7 +417,7 @@ export default {
       } else {
         this.parmValue[mapFields.createEnd] = "";
       }
-      if (this.parmValue[mapFields.createStart] !== "" && this.parmValue[mapField.createEnd] !== "") {
+      if (this.parmValue[mapFields.createStart] !== "" && this.parmValue[mapFields.createEnd] !== "") {
         this.pageInfo.curr = 1;
         this.parmValue.page = 1;
         await this.searchList();

+ 10 - 7
src/views/customerService/workbench/detail.vue

@@ -121,10 +121,7 @@ export default {
   computed: {
     ...mapGetters(["tablebtnSize", "searchSize", "size"]),
     powers() {
-      const tran =
-        this.$store.getters.btnList.find(
-          (item) => item.menu_route == "workbenchDetail"
-        ) || {};
+      const tran = this.$store.getters.btnList.find((item) => item.menu_route == "workbenchDetail") || {};
       const { action } = tran ?? {};
       return action ?? [];
     },
@@ -204,13 +201,19 @@ export default {
         }
       }
 
-      var result = "" + parseInt(secondTime) + ":";
+      const s = String(secondTime)
+      var result = s.length === 1 ? '0' + s : s
+
       if(minuteTime > 0) {
-        result = "" + parseInt(minuteTime) + ":" + result;
+        const m = String(minuteTime)
+        result = "" + (m.length === 1 ? '0' + m : m) + ":" + result;
       }
+
       if(hourTime > 0) {
-        result = "" + parseInt(hourTime) + ":" + result;
+        const h =  String(hourTime)
+        result = "" + (h.length === 1 ? '0' + h : h) + ":" + result;
       }
+
       return result;
     },
     async initData() {

+ 3 - 1
src/views/platformService/invoice/index.vue

@@ -257,7 +257,7 @@ export default {
       customerCode: [], //客户公司code
       statusList,
       sitem: null,
-      loading: true,
+      loading: false,
       showModel: false,
       isDetail: false,
       modelId: 0,
@@ -411,6 +411,8 @@ export default {
     },
     // 列表搜索
     async searchList() {
+      return
+      
       this.loading = true;
       const res = await asyncRequest.list({
         ...this.parmValue,

+ 2 - 1
src/views/platformService/settlement/index.vue

@@ -211,7 +211,7 @@ export default {
     return {
       statusList,
       sitem: null,
-      loading: true,
+      loading: false,
       showModel: false,
       isDetail: false,
       modelId: 0,
@@ -344,6 +344,7 @@ export default {
     },
     // 列表搜索
     async searchList() {
+      return
       if (
         (this.parmValue.createStart !== "" && this.parmValue.createEnd === "") ||
         (this.parmValue.createStart === "" && this.parmValue.createEnd !== "")

+ 1 - 1
src/views/serviceParam/sort/index.vue

@@ -88,7 +88,7 @@
                   searchList();
                 "
                 placeholder="名称"
-              ></el-input>
+              />
             </el-col>
             <el-col
               :span="3"