Ver Fonte

Merge branch 'dev' of http://110.41.163.243:9980/kd-aiot/kd-aiot-frontend-eom into dev

yusheng há 1 ano atrás
pai
commit
62ced0645c

+ 46 - 4
src/api/salesServiceManagement/index.js

@@ -423,16 +423,13 @@ export async function checkByPlanId(id) {
 
 // 需求 按钮 权限
 export async function checkByWorkId(id) {
-  const res = await request.get(
-    `/eom/afterSalesWorkOrder/checkByWorkId/${id}`
-  );
+  const res = await request.get(`/eom/afterSalesWorkOrder/checkByWorkId/${id}`);
   if (res.data.code == 0) {
     return res.data.data;
   }
   return Promise.reject(new Error(res.data.message));
 }
 
-
 // 评论 校验当前登录人是否可以评论
 export async function afterSalesEvaluation(id) {
   const res = await request.get(
@@ -443,3 +440,48 @@ export async function afterSalesEvaluation(id) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+
+// 售后费用 表格
+export async function aftersalesrealcost(params) {
+  const res = await request.get(`/eom/aftersalesrealcost/page`, { params });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 售后费用 详情
+export async function salesrealcostinfo(id) {
+  const res = await request.get(`/eom/aftersalesrealcost/getById/${id}`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 售后费用 保存
+export async function costSave(data) {
+  const res = await request.post(`/eom/aftersalesrealcost/save`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 售后费用 修改
+export async function costUpdate(data) {
+  const res = await request.put(`/eom/aftersalesrealcost/update`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 售后费用 删除
+export async function costDelete(data) {
+  const res = await request.delete(`/eom/aftersalesrealcost/delete`, { data });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 142 - 136
src/views/financialManage/receivableManage/components/detailDialog.vue

@@ -28,36 +28,33 @@
         <headerTitle title="基本信息"></headerTitle>
         <el-row :gutter="12">
           <el-col :span="12">
-            <el-form-item
-              label="应收日期"
-              prop="receivableDate"
-             >
+            <el-form-item label="应收日期" prop="receivableDate">
               <el-date-picker
                 style="width: 100%"
                 v-model="form.receivableDate"
                 disabled
                 type="date"
-                value-format="yyyy-MM-dd">
+                value-format="yyyy-MM-dd"
+              >
               </el-date-picker>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item
-              label="应收金额"
-              prop="receivableTotalPrice"
-             >
-              <el-input-number disabled v-model="form.receivableTotalPrice" :precision="2" :controls="false"
-                               style="width: 100%"
-                               :min="0"></el-input-number>
+            <el-form-item label="应收金额" prop="receivableTotalPrice">
+              <el-input-number
+                disabled
+                v-model="form.receivableTotalPrice"
+                :precision="2"
+                :controls="false"
+                style="width: 100%"
+                :min="0"
+              ></el-input-number>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="12">
           <el-col :span="12">
-            <el-form-item
-              label="会计科目"
-              prop="accountingSubjectId"
-             >
+            <el-form-item label="会计科目" prop="accountingSubjectId">
               <ele-tree-select
                 disabled
                 clearable
@@ -74,62 +71,64 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item
-              label="发票编码"
-              prop="invoiceCode"
-             >
+            <el-form-item label="发票编码" prop="invoiceCode">
               <el-input disabled v-model="form.invoiceCode"></el-input>
             </el-form-item>
           </el-col>
-
-
         </el-row>
         <el-row :gutter="12">
           <el-col :span="12">
-            <el-form-item
-              label="来源类型"
-              prop="sourceType"
-             >
-             <el-input :value="form.sourceType==2?'合同':form.sourceType==3?'销售订单':'对账单'" disabled></el-input>
+            <el-form-item label="来源类型" prop="sourceType">
+              <el-input
+                :value="
+                  form.sourceType == 2
+                    ? '合同'
+                    : form.sourceType == 3
+                    ? '销售订单'
+                    : form.sourceType == 4
+                    ? '售后管理'
+                    : '对账单'
+                "
+                disabled
+              ></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item
-              label="来源编码"
-              prop="sourceCode"
-             >
+            <el-form-item label="来源编码" prop="sourceCode">
               <el-input v-model="form.sourceCode" disabled></el-input>
             </el-form-item>
           </el-col>
 
           <el-col :span="12">
-            <el-form-item
-              label="公司名称"
-              prop="contactName"
-             >
+            <el-form-item label="公司名称" prop="contactName">
               <el-input disabled v-model="form.contactName"></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item
-              label="备注"
-              prop="remark"
-             >
+            <el-form-item label="备注" prop="remark">
               <el-input disabled v-model="form.remark"></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="附件">
               <fileMain v-model="form.files" type="view"></fileMain>
-
             </el-form-item>
           </el-col>
         </el-row>
         <headerTitle title="收款信息"></headerTitle>
-        <info-table ref="feeRelatedInfoTable" @invoiceChange="init" dialog-type="view" v-if="form.id" :form.sync="form"></info-table>
+        <info-table
+          ref="feeRelatedInfoTable"
+          @invoiceChange="init"
+          dialog-type="view"
+          v-if="form.id"
+          :form.sync="form"
+        ></info-table>
       </el-form>
     </div>
-    <bpmDetail v-if="activeComp === 'bpm' && form.processInstanceId" :id="form.processInstanceId"></bpmDetail>
+    <bpmDetail
+      v-if="activeComp === 'bpm' && form.processInstanceId"
+      :id="form.processInstanceId"
+    ></bpmDetail>
     <div slot="footer">
       <el-button @click="cancel">返回</el-button>
     </div>
@@ -137,113 +136,120 @@
 </template>
 
 <script>
-import {getFile} from '@/api/system/file';
-import dictMixins from '@/mixins/dictMixins';
-// import fileMain from '@/components/addDoc/index.vue';
-
-import {getFinReceivableInfoAPI} from "@/api/financialManage/receivableManage";
-import {getTreeByPid} from "@/api/classifyManage";
-import infoTable from "@/views/financialManage/receivableManage/components/infoTable.vue";
-import bpmDetail from "@/views/bpm/processInstance/detail.vue";
-import tableInfo from "@/views/financialManage/invoiceManage/components/tableInfo.vue";
+  import { getFile } from '@/api/system/file';
+  import dictMixins from '@/mixins/dictMixins';
+  // import fileMain from '@/components/addDoc/index.vue';
 
-export default {
-  mixins: [dictMixins],
-  components: {
-    tableInfo, bpmDetail,
-    infoTable,
-    // fileMain
-  },
+  import { getFinReceivableInfoAPI } from '@/api/financialManage/receivableManage';
+  import { getTreeByPid } from '@/api/classifyManage';
+  import infoTable from '@/views/financialManage/receivableManage/components/infoTable.vue';
+  import bpmDetail from '@/views/bpm/processInstance/detail.vue';
+  import tableInfo from '@/views/financialManage/invoiceManage/components/tableInfo.vue';
 
-  data() {
-    return {
-      activeComp: 'main',
-      tabOptions: [
-        {key: 'main', name: '收款详情'},
-        {key: 'bpm', name: '流程详情'}
-      ],
-      dialogType: '',
-      form: {
-        accountingSubjectCode: "",
-        accountingSubjectId: '',
-        accountingSubjectName: "",
-        contactId: '',
-        contactName: "",
-        files: [],
-        id: '',
-        invoiceCode: "",
-        receivableDate: "",
-        receivableTotalPrice: '',
-        receivedTotalPrice: '',
-        remark: "",
-        sourceCode: "",
-        sourceId: "",
-        sourceType: '',
-        unreceiveTotalPrice: 0
-      },
-      accountingSubjectList: [],
-      rules: {
-        accountingSubjectId: {required: true, message: '请选择', trigger: 'change'},
-        receivableDate: {required: true, message: '请选择', trigger: 'change'},
-      }
-    };
-  },
-  props: {
-    detailDialogFlag: {
-      type: Boolean,
-      default: false,
+  export default {
+    mixins: [dictMixins],
+    components: {
+      tableInfo,
+      bpmDetail,
+      infoTable
+      // fileMain
     },
-  },
-  async created() {
 
-  },
-  methods: {
-    //获取详情
-    async init(id) {
-      await this.getClassifyList(24, 'accountingSubjectList')
-      this.form = await getFinReceivableInfoAPI(id)
-      this.$nextTick(()=>{
-        this.$refs.feeRelatedInfoTable.init()
-      })
+    data() {
+      return {
+        activeComp: 'main',
+        tabOptions: [
+          { key: 'main', name: '收款详情' },
+          { key: 'bpm', name: '流程详情' }
+        ],
+        dialogType: '',
+        form: {
+          accountingSubjectCode: '',
+          accountingSubjectId: '',
+          accountingSubjectName: '',
+          contactId: '',
+          contactName: '',
+          files: [],
+          id: '',
+          invoiceCode: '',
+          receivableDate: '',
+          receivableTotalPrice: '',
+          receivedTotalPrice: '',
+          remark: '',
+          sourceCode: '',
+          sourceId: '',
+          sourceType: '',
+          unreceiveTotalPrice: 0
+        },
+        accountingSubjectList: [],
+        rules: {
+          accountingSubjectId: {
+            required: true,
+            message: '请选择',
+            trigger: 'change'
+          },
+          receivableDate: {
+            required: true,
+            message: '请选择',
+            trigger: 'change'
+          }
+        }
+      };
     },
-    downloadFile(file) {
-      getFile({objectName: file.storePath}, file.name);
+    props: {
+      detailDialogFlag: {
+        type: Boolean,
+        default: false
+      }
     },
+    async created() {},
+    methods: {
+      //获取详情
+      async init(id) {
+        await this.getClassifyList(24, 'accountingSubjectList');
+        this.form = await getFinReceivableInfoAPI(id);
+        this.$nextTick(() => {
+          this.$refs.feeRelatedInfoTable.init();
+        });
+      },
+      downloadFile(file) {
+        getFile({ objectName: file.storePath }, file.name);
+      },
 
-    //获取分类管理中的数据
-    async getClassifyList(id, listName) {
-      let res = await getTreeByPid(id)
-      this[listName] = res.data
-    },
-    //获取会计科目选中数据
-    changeSubjectInfo(val) {
-      if (!val) return this.form.accountingSubjectName = ''
-      let data = this.$refs.treeSelect?.$refs?.tree?.getCurrentNode() || {}
-      this.form.accountingSubjectName = data.name
-    },
-    cancel() {
-      this.$emit('update:detailDialogFlag', false)
+      //获取分类管理中的数据
+      async getClassifyList(id, listName) {
+        let res = await getTreeByPid(id);
+        this[listName] = res.data;
+      },
+      //获取会计科目选中数据
+      changeSubjectInfo(val) {
+        if (!val) return (this.form.accountingSubjectName = '');
+        let data = this.$refs.treeSelect?.$refs?.tree?.getCurrentNode() || {};
+        this.form.accountingSubjectName = data.name;
+      },
+      cancel() {
+        this.$emit('update:detailDialogFlag', false);
+      }
     }
-  }
-};
+  };
 </script>
 
 <style scoped lang="scss">
-.ele-dialog-form {
-  .el-form-item {
-    margin-bottom: 10px;
+  .ele-dialog-form {
+    .el-form-item {
+      margin-bottom: 10px;
+    }
   }
-}
 
-.headbox {
-  display: flex;
-  justify-content: flex-start;
-  align-items: center;
+  .headbox {
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
 
-  .amount {
-    font-size: 14px;
-    font-weight: bold;
-    margin-right: 20px;
+    .amount {
+      font-size: 14px;
+      font-weight: bold;
+      margin-right: 20px;
+    }
   }
-}
 </style>

+ 0 - 1
src/views/salesServiceManagement/accessory/components/search.vue

@@ -83,7 +83,6 @@ export default {
         //   width: 380,
         //   type: 'input',
         //   placeholder: '',
-          
         // },
         {
           label: '创建时间:',

+ 3 - 1
src/views/salesServiceManagement/accessory/components/workOrderList.vue

@@ -173,7 +173,8 @@ export default {
           }
         }
       ],
-      radio: null
+      radio: null,
+      current:{},
     };
   },
 
@@ -182,6 +183,7 @@ export default {
     open(item) {
       if (item) {
         this.radio = item.id;
+        this.current = item;
       }
       this.visible = true;
     },

+ 4 - 5
src/views/salesServiceManagement/accessory/index.vue

@@ -64,13 +64,13 @@
         </template>
       </ele-pro-table>
     </el-card>
-    <process-submit-dialog
+    <!-- <process-submit-dialog
       :isNotNeedProcess="false"
       :processSubmitDialogFlag.sync="processSubmitDialogFlag"
       v-if="processSubmitDialogFlag"
       ref="processSubmitDialogRef"
       @reload="reload"
-    ></process-submit-dialog>
+    ></process-submit-dialog> -->
     <!-- 新建或编辑弹窗 -->
     <accessoryDialog ref="accessoryDialog" @refresh="reload" />
   </div>
@@ -79,7 +79,7 @@
 <script>
   import search from './components/search.vue';
   import accessoryDialog from './components/accessoryDialog.vue';
-  import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
+  // import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
 
   import {
     accessoryPage,
@@ -92,7 +92,7 @@
     components: {
       search,
       accessoryDialog,
-      processSubmitDialog
+      // processSubmitDialog
     },
     data() {
       return {
@@ -202,7 +202,6 @@
             showOverflowTooltip: true
           },
           {
-            prop: 'categoryName',
             label: '设备名称',
             align: 'center',
             showOverflowTooltip: true,

+ 0 - 7
src/views/salesServiceManagement/components/sparePartsList.vue

@@ -240,12 +240,6 @@
         </template>
       </ele-pro-table>
     </el-form>
-    <AssetsDialog
-      ref="selectStockLedgerDialogRef"
-      :assetType="6"
-      @choose="confirmChoose"
-      :isAll="false"
-    ></AssetsDialog>
     <product-list
       ref="productListRef"
       classType="1"
@@ -263,7 +257,6 @@
     getWarehouseOutStock,
     getIdWarehouseList
   } from '@/api/saleManage/saleorder';
-  import { parameterGetByCode } from '@/api/main/index.js';
   import AssetsDialog from './AssetsDialog.vue';
   import { getByCode } from '@/api/system/dictionary-data';
   import productList from '@/BIZComponents/product-list.vue';

+ 245 - 0
src/views/salesServiceManagement/cost/component/costDialog.vue

@@ -0,0 +1,245 @@
+<template>
+  <ele-modal
+    custom-class="ele-dialog-form long-dialog-form"
+    :centered="true"
+    :visible.sync="editRepairNotesDialog"
+    :title="title"
+    :close-on-click-modal="false"
+    width="85%"
+    :maxable="true"
+    append-to-body
+    @close="handleClose"
+  >
+    <div class="switch" v-if="type == 'view'">
+      <div class="switch_left">
+        <ul>
+          <li
+            v-for="item in tabOptions"
+            :key="item.key"
+            :class="{ active: activeComp == item.key }"
+            @click="handleTag(item.key)"
+          >
+            {{ item.name }}
+          </li>
+        </ul>
+      </div>
+    </div>
+    <el-form
+      v-show="activeComp === 'main'"
+      ref="recyleFormRef"
+      :model="form"
+      label-width="100px"
+    >
+      <headerTitle title="基本信息" style="margin-top: 15px"></headerTitle>
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="编码:" prop="code">
+            <el-input v-model="form.code" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item
+            label="工单名称:"
+            prop="workOrderName"
+            :rules="{
+              required: true,
+              message: '请选择工单',
+              trigger: 'change'
+            }"
+          >
+            <!--  :disabled="workOrderDis" -->
+            <el-input
+              v-model="form.workOrderName"
+              :disabled="workOrderDis"
+              @click.native="handHead"
+              placeholder="请选择"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="原因">
+            <el-input
+              v-model="form.remarks"
+              type="textarea"
+              :rows="2"
+              :disabled="type == 'view'"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <spareParts
+        obtain="仓库"
+        ref="sparePartsRef"
+        :type="title == '详情' ? 'view' : 'edit'"
+      ></spareParts>
+    </el-form>
+    <bpmDetail
+      v-if="activeComp === 'bpm' && processInstanceId"
+      :id="processInstanceId"
+    ></bpmDetail>
+    <template v-slot:footer>
+      <el-button @click="handleClose" :loading="loading">取消</el-button>
+      <el-button
+        type="primary"
+        v-if="type != 'view'"
+        @click="save"
+        :loading="loading"
+        >确认</el-button
+      >
+    </template>
+    <workOrderList ref="workOrderListRef" @changeSelect="changeSelect" />
+  </ele-modal>
+</template>
+
+<script>
+  import bpmDetail from '@/views/bpm/processInstance/detail.vue';
+  import workOrderList from '@/views/salesServiceManagement/accessory/components/workOrderList.vue';
+  import spareParts from '@/views/salesServiceManagement/components/sparePartsList.vue';
+  import {
+    costSave,
+    costUpdate,
+    salesrealcostinfo,
+    getSalesWorkOrderById
+  } from '@/api/salesServiceManagement/index';
+  export default {
+    props: {},
+    components: {
+      workOrderList,
+      spareParts,
+      bpmDetail
+    },
+    computed: {
+      workOrderDis() {
+        console.log(this.source, 'this.source 33');
+        if (this.source != 0) {
+          return true;
+        }
+        return this.type == 'view';
+      }
+    },
+    data() {
+      return {
+        loading: false,
+        title: '新增',
+        editRepairNotesDialog: false,
+        type: 'add',
+        form: {
+          remarks: '',
+          workOrderName: ''
+        },
+        source: 0,
+        activeComp: 'main',
+        processInstanceId:'0',
+        tabOptions: [
+          { key: 'main', name: '发货单详情' },
+          { key: 'bpm', name: '流程详情' }
+        ]
+      };
+    },
+    methods: {
+      init(row, type) {
+        this.editRepairNotesDialog = true;
+        this.type = type;
+        this.title = type == 'add' ? '新增' : type == 'edit' ? '编辑' : '详情';
+        if (row?.id) {
+          this.getDetail(row);
+        }
+      },
+      async getDetail(data) {
+        const res = await salesrealcostinfo(data.id);
+        this.processInstanceId = res.processInstanceId;
+        console.log(res, 'res 3333');
+        this.$refs.sparePartsRef.setTableValue(res?.detailLst || []);
+        this.$set(this.form, 'workOrderName', res.workOrderName);
+        this.form.workOrderCode = res.workOrderCode;
+        this.form.workOrderId = res.workOrderId;
+        this.$set(this.form, 'remarks', res.remarks);
+        this.form.id = data.id;
+        this.source = res.source || 0;
+        this.$set(this.form, 'code', res.code);
+      },
+      handleClose() {
+        this.editRepairNotesDialog = false;
+        this.form = {
+          remarks: '',
+          workOrderName: ''
+        };
+        this.$refs.recyleFormRef.resetFields();
+        this.$refs.sparePartsRef.setTableValue([]);
+        this.source = 0;
+        this.$refs.workOrderListRef.current = {};
+        this.$refs.workOrderListRef.radio = null;
+      },
+      async save() {
+        let detailLst = this.$refs.sparePartsRef.getTableValue() || [];
+        let totalPrice = this.$refs.sparePartsRef.totalPrice || 0;
+        if (detailLst.length == 0) {
+          this.$message.warning('请至少添加一条费用清单');
+          return;
+        }
+        this.$refs.recyleFormRef.validate(async (valid) => {
+          if (valid) {
+            let data = {
+              ...this.form,
+              detailLst,
+              totalPrice
+            };
+            try {
+              this.loading = true;
+              const requestName = this.type == 'add' ? costSave : costUpdate;
+              const res = await requestName(data);
+              this.loading = false;
+              if (res) {
+                this.$message.success('操作成功');
+                this.handleClose();
+                this.$emit('refresh');
+              }
+            } catch (err) {
+              this.loading = false;
+            }
+          }
+        });
+      },
+      // 选择工单
+      handHead() {
+        if (this.type != 'view') {
+          let data = {
+            name: this.form.workOrderName,
+            code: this.form.workOrderCode,
+            id: this.form.workOrderId
+          };
+          this.$refs.workOrderListRef.open(data);
+        }
+      },
+      handleTag(val) {
+        this.activeComp = val;
+      },
+      async changeSelect(row) {
+        if (row.id == this.form.workOrderId) {
+          return;
+        }
+        this.$set(this.form, 'workOrderName', row.name);
+        this.$set(this.form, 'workOrderCode', row.code);
+        this.form.workOrderId = row.id; // 工单id
+        this.$refs.sparePartsRef.form.tableList = [];
+        const res = await getSalesWorkOrderById(row.id);
+        this.$refs.sparePartsRef.setTableValue(res.costListVOS || []);
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .device_name {
+    .el-select-dropdown__wrap {
+      .el-select-dropdown__item {
+        padding: 0 !important;
+      }
+    }
+
+    .option_ {
+      width: 100%;
+      padding: 0 20px;
+    }
+  }
+</style>

+ 58 - 0
src/views/salesServiceManagement/cost/component/search.vue

@@ -0,0 +1,58 @@
+<!-- 搜索表单 -->
+<template>
+  <seekPage :seekList="seekList" :formLength="3" @search="search"></seekPage>
+</template>
+<script>
+  export default {
+    data() {
+      return {};
+    },
+    props: {
+      approvalList: {
+        type: Array,
+        default: () => []
+      }
+    },
+    computed: {
+      // 表格列配置
+      seekList() {
+        return [
+          {
+            label: '编码:',
+            value: 'code',
+            type: 'input',
+            placeholder: ''
+          },
+          {
+            label: '工单名称:',
+            value: 'workOrderName',
+            type: 'input',
+            placeholder: ''
+          },
+          {
+            label: '客户名称:',
+            value: 'contactName',
+            type: 'input',
+            placeholder: ''
+          },
+          {
+            label: '流程状态:',
+            width: 380,
+            value: 'approvalStatus',
+            type: 'select',
+            planList: this.approvalList,
+            placeholder: ''
+          }
+        ];
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search(e) {
+        this.$emit('search', {
+          ...e
+        });
+      }
+    }
+  };
+</script>

+ 259 - 0
src/views/salesServiceManagement/cost/index.vue

@@ -0,0 +1,259 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <search
+        class="seep-search"
+        :approvalList="approvalList"
+        user="recycleName"
+        @search="reload"
+      ></search>
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="datasource"
+        cache-key="systemRoleTable"
+        :pageSize="20"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="openEdit('', 'add')"
+            v-if="$hasPermission('eom:aftersalesrealcost:save')"
+            >新建</el-button
+          >
+        </template>
+        <template v-slot:code="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            @click="openEdit(row, 'view')"
+            >{{ row.code }}</el-link
+          >
+        </template>
+        <template v-slot:action="{ row }">
+          <el-link
+            type="primary"
+            v-if="row.approvalStatus == 0 && $hasPermission('eom:aftersalesrealcost:submit')"
+            :underline="false"
+            @click="openProcess(row)"
+            >提交</el-link
+          >
+          <el-link
+            v-if="row.approvalStatus == 0 && $hasPermission('eom:aftersalesrealcost:update')"
+            type="primary"
+            :underline="false"
+            @click="openEdit(row, 'edit')"
+            >修改</el-link
+          >
+          <el-popconfirm
+            v-if="(row.approvalStatus == 0 && row.source != 1) && $hasPermission('eom:aftersalesrealcost:delete')"
+            class="ele-action"
+            title="确定要删除当前费用清单数据吗?"
+            @confirm="deleteCost(row)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" icon="el-icon-delete" :underline="false"
+                >删除</el-link
+              >
+            </template>
+          </el-popconfirm>
+        </template>
+      </ele-pro-table>
+    </el-card>
+    <costDialog ref="recycleRef" @refresh="reload" />
+    <process-submit-dialog
+      :isNotNeedProcess="false"
+      :processSubmitDialogFlag.sync="processSubmitDialogFlag"
+      v-if="processSubmitDialogFlag"
+      ref="processSubmitDialogRef"
+      @reload="reload"
+    ></process-submit-dialog>
+  </div>
+</template>
+
+<script>
+  import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
+  import costDialog from './component/costDialog.vue';
+  import search from './component/search.vue';
+  import {
+    costDelete,
+    aftersalesrealcost
+  } from '@/api/salesServiceManagement/index';
+  export default {
+    components: {
+      search,
+      costDialog,
+      processSubmitDialog
+    },
+    data() {
+      return {
+        // 加载状态
+        loading: false,
+        processSubmitDialogFlag: false,
+        approvalList: [
+          {
+            label: '未提交',
+            value: 0
+          },
+          {
+            label: '审核中',
+            value: 1
+          },
+          {
+            label: '审核通过',
+            value: 2
+          },
+          {
+            label: '审核不通过',
+            value: 3
+          },
+        //   {
+        //     label: '终止审核中',
+        //     value: 4
+        //   },
+        //   {
+        //     label: '终止审核通过',
+        //     value: 5
+        //   },
+        //   {
+        //     label: '流程废止',
+        //     value: 7
+        //   }
+        ]
+      };
+    },
+    computed: {
+      columns() {
+        return [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true,
+            fixed: 'left'
+          },
+          {
+            slot: 'code',
+            prop: 'code',
+            label: '编码',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'workOrderCode',
+            label: '工单编码',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'workOrderName',
+            label: '工单名称',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'createTime',
+            label: '创建时间',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'contactName',
+            label: '客户名称',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'contactCode',
+            label: '客户编码',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'approvalStatus',
+            label: '流程状态',
+            align: 'center',
+            showOverflowTooltip: true,
+            formatter: (item) => {
+              let obj = this.approvalList.find(
+                (el) => el.value == item.approvalStatus
+              );
+              if (obj) {
+                return obj.label;
+              }
+              return '';
+            }
+          },
+          {
+            columnKey: 'action',
+            slot: 'action',
+            label: '操作',
+            align: 'center',
+            width: 180,
+            resizable: false,
+            showOverflowTooltip: true
+          }
+        ];
+      }
+    },
+    created() {},
+    methods: {
+      /* 表格数据源 */
+      async datasource({ page, limit, where, order }) {
+        return aftersalesrealcost({ pageNum: page, size: limit, ...where });
+      },
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where });
+      },
+
+      openEdit(row, type) {
+        this.$refs.recycleRef.init(row, type);
+      },
+
+      // 提交
+      openProcess(data) {
+        this.processSubmitDialogFlag = true;
+        this.$nextTick(() => {
+          let params = {
+            businessId: data.id,
+            businessKey: 'after_sale_fee',
+            formCreateUserId: data.createUserId,
+            variables: {
+              businessCode: data.code,
+              businessName: data.deptId,
+              businessType: '售后费用清单'
+            }
+          };
+          this.$refs.processSubmitDialogRef.init(params);
+        });
+      },
+      deleteCost(row) {
+        costDelete([row.id]).then((res) => {
+          if (res) {
+            this.$message.success('操作成功!');
+            this.reload();
+          }
+        });
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  ::v-deep .el-input__inner::placeholder {
+    font-size: 13px;
+  }
+  ::v-deep .seep-search {
+    .el-input__inner {
+      padding: 0 5px 0 10px;
+    }
+  }
+</style>

+ 2 - 2
src/views/salesServiceManagement/evaluate/components/search.vue

@@ -57,7 +57,7 @@ export default {
           label: '服务态度评分:',
           value: 'attitudeRating',
           width: 370,
-          labelWidth:130,
+          labelWidth:'130',
           type: 'select',
           planList: this.serviceList,
           placeholder: '请选择'
@@ -66,7 +66,7 @@ export default {
           label: '响应速度评分:',
           value: 'responseSpeed',
           width: 370,
-          labelWidth:130,
+          labelWidth:'130',
           type: 'select',
           planList: this.serviceList,
           placeholder: '请选择'

+ 63 - 57
src/views/salesServiceManagement/index.vue

@@ -10,7 +10,8 @@
                 :key="item.key"
                 :class="{ active: activeComp == item.key }"
                 @click="hander(item.key)"
-              >{{ item.name }}</li>
+                >{{ item.name }}</li
+              >
             </ul>
           </div>
           <!-- <div class="right" style="padding: 10px">
@@ -39,72 +40,77 @@
           <div v-if="activeComp == 'knowledge'">
             <knowledge ref="knowledgeRef" />
           </div>
+          <div v-if="activeComp == 'cost'">
+            <Cost ref="costRef" />
+          </div>
         </div>
       </el-card>
     </div>
   </div>
 </template>
 <script>
-import demandList from './demandList';
-import toDoList from './toDoList';
-import workOrder from './workOrder';
-import evaluate from './evaluate';
-import accessory from './accessory';
-import knowledge from './knowledge';
-import recycle from './recycle';
-
-export default {
-  components: {
-    demandList,
-    toDoList,
-    workOrder,
-    evaluate,
-    accessory,
-    knowledge,
-    recycle
-  },
-  data() {
-    return {
-      activeComp: 'demandList',
-      tabOptions: [
-        { key: 'demandList', name: '售后需求' },
-        { key: 'toDoList', name: '售后计划' },
-        { key: 'workOrder', name: '售后工单' },
-        { key: 'evaluate', name: '客户评价' },
-        { key: 'accessory', name: '配件申请记录' },
-        { key: 'recycle', name: '配件回收记录' },
-        { key: 'knowledge', name: '故障知识库' },
-        { key: '2', name: '统计报表' }
-      ]
-    };
-  },
-  mounted() {
-    // switch (this.$route.query.title) {
-    //   case '工单':
-    //     this.activeComp = 'workOrder';
-    //     break;
-    //   default:
-    //     break;
-    // }
-  },
-  methods: {
-    hander(key) {
-      this.activeComp = key;
+  import demandList from './demandList';
+  import toDoList from './toDoList';
+  import workOrder from './workOrder';
+  import evaluate from './evaluate';
+  import accessory from './accessory';
+  import knowledge from './knowledge';
+  import recycle from './recycle';
+  import Cost from './cost';
+  export default {
+    components: {
+      demandList,
+      toDoList,
+      workOrder,
+      evaluate,
+      accessory,
+      knowledge,
+      recycle,
+      Cost
+    },
+    data() {
+      return {
+        activeComp: 'demandList',
+        tabOptions: [
+          { key: 'demandList', name: '售后需求' },
+          { key: 'toDoList', name: '售后计划' },
+          { key: 'workOrder', name: '售后工单' },
+          { key: 'cost', name: '费用清单' },
+          { key: 'evaluate', name: '客户评价' },
+          { key: 'accessory', name: '配件申请记录' },
+          { key: 'recycle', name: '配件回收记录' },
+          { key: 'knowledge', name: '故障知识库' },
+          { key: '2', name: '统计报表' }
+        ]
+      };
+    },
+    mounted() {
+      // switch (this.$route.query.title) {
+      //   case '工单':
+      //     this.activeComp = 'workOrder';
+      //     break;
+      //   default:
+      //     break;
+      // }
+    },
+    methods: {
+      hander(key) {
+        this.activeComp = key;
+      }
     }
-  }
-};
+  };
 </script>
 <style lang="scss" scoped>
-::v-deep .el-card__body {
-  padding-top: 0;
-  padding-left: 0;
-}
+  ::v-deep .el-card__body {
+    padding-top: 0;
+    padding-left: 0;
+  }
 
-.main {
-  padding-left: 17px;
+  .main {
+    padding-left: 17px;
 
-  .plan {
-    padding-top: 15px;
+    .plan {
+      padding-top: 15px;
+    }
   }
-}
 </style>

+ 125 - 125
src/views/salesServiceManagement/toDoList/components/plan-search.vue

@@ -3,131 +3,131 @@
   <seekPage :seekList="seekList" :formLength="3" @search="search"></seekPage>
 </template>
 <script>
-export default {
-  data() {
-    return {
-      stateList: [
-        {
-          label: '待派单',
-          value: '0'
-        },
-        {
-          label: '已派单',
-          value: 1
-        },
-        {
-          label: '执行中',
-          value: 2
-        },
-        {
-          label: '已完成',
-          value: 3
-        },
-        {
-          label: '已撤回',
-          value: 4
-        },
-        {
-          label: '已驳回',
-          value: 5
-        }
-      ],
-      exigencyList: [
-        {
-          label: '普通',
-          value: 1
-        },
-        {
-          label: '紧急',
-          value: 2
-        },
-        {
-          label: '重要',
-          value: 3
-        }
-      ]
-    };
-  },
-  props: {},
-  computed: {
-    // 表格列配置
-    seekList() {
-      return [
-        {
-          label: '关键字:',
-          value: 'keyWord',
-          type: 'input',
-          placeholder: '计划单号/计划名称/设备名称'
-        },
-        {
-          label: '计划单号:',
-          value: 'code',
-          type: 'input',
-          placeholder: ''
-        },
-        {
-          label: '计划名称:',
-          value: 'name',
-          type: 'input',
-          placeholder: ''
-        },
-        {
-          label: '客户名称:',
-          width: 380,
-          value: 'contactName',
-          type: 'input',
-          placeholder: ''
-        },
-        {
-          label: '设备名称:',
-          width: 380,
-          value: 'deviceName',
-          type: 'input',
-          placeholder: ''
-        },
-        {
-          label: '状态:',
-          width: 380,
-          value: 'planStatus',
-          type: 'select',
-          planList: this.stateList,
-          placeholder: ''
-        },
-        {
-          label: '紧急状态:',
-          width: 380,
-          value: 'urgent',
-          type: 'select',
-          planList: this.exigencyList,
-          placeholder: ''
-        },
-        {
-          label: '创建人:',
-          width: 380,
-          value: 'createUserName',
-          type: 'input',
-          placeholder: ''
-        },
-        {
-          label: '创建时间:',
-          value: 'createTime',
-          type: 'date',
-          dateType: 'datetimerange',
-          placeholder: '',
-          width: 380,
-          valueAr: ['startTime', 'endTime']
-        },
+  export default {
 
-      ];
+    data() {
+      return {
+        stateList: [
+          {
+            label: '待派单',
+            value: '0'
+          },
+          {
+            label: '已派单',
+            value: 1
+          },
+          {
+            label: '执行中',
+            value: 2
+          },
+          {
+            label: '已完成',
+            value: 3
+          },
+          {
+            label: '已撤回',
+            value: 4
+          },
+          {
+            label: '已驳回',
+            value: 5
+          }
+        ],
+        exigencyList: [
+          {
+            label: '普通',
+            value: 1
+          },
+          {
+            label: '紧急',
+            value: 2
+          },
+          {
+            label: '重要',
+            value: 3
+          }
+        ]
+      };
+    },
+    props: {},
+    computed: {
+      // 表格列配置
+      seekList() {
+        return [
+          {
+            label: '关键字:',
+            value: 'keyWord',
+            type: 'input',
+            placeholder: '计划单号/计划名称/设备名称'
+          },
+          {
+            label: '计划单号:',
+            value: 'code',
+            type: 'input',
+            placeholder: ''
+          },
+          {
+            label: '计划名称:',
+            value: 'name',
+            type: 'input',
+            placeholder: ''
+          },
+          {
+            label: '客户名称:',
+            width: 380,
+            value: 'contactName',
+            type: 'input',
+            placeholder: ''
+          },
+          {
+            label: '设备名称:',
+            width: 380,
+            value: 'deviceName',
+            type: 'input',
+            placeholder: ''
+          },
+          {
+            label: '状态:',
+            width: 380,
+            value: 'planStatus',
+            type: 'select',
+            planList: this.stateList,
+            placeholder: ''
+          },
+          {
+            label: '紧急状态:',
+            width: 380,
+            value: 'urgent',
+            type: 'select',
+            planList: this.exigencyList,
+            placeholder: ''
+          },
+          {
+            label: '创建人:',
+            width: 380,
+            value: 'createUserName',
+            type: 'input',
+            placeholder: ''
+          },
+          {
+            label: '创建时间:',
+            value: 'createTime',
+            type: 'date',
+            dateType: 'datetimerange',
+            placeholder: '',
+            width: 380,
+            valueAr: ['startTime', 'endTime']
+          }
+        ];
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search(e) {
+        this.$emit('search', {
+          ...e
+        });
+      }
     }
-  },
-  methods: {
-    /* 搜索 */
-    search(e) {
-      this.$emit('search', {
-        ...e
-      });
-    }
-  }
-};
+  };
 </script>

+ 4 - 2
src/views/salesServiceManagement/workOrder/components/declarationDialog.vue

@@ -531,7 +531,8 @@
               inFactDuration: this.minutes,
               id: this.addForm.id,
               costListVOS: this.$refs[spare].getTableValue(),
-              salesDemandUpdatePO: obj
+              salesDemandUpdatePO: obj,
+              totalCost: this.$refs[spare].totalPrice || 0
             };
             // 报工 逻辑处理 配件申请清单数据
             if (type == 'report') {
@@ -589,7 +590,8 @@
               inFactDuration: this.minutes,
               id: this.addForm.id,
               costListVOS: this.$refs.sparePartsRef2.getTableValue(),
-              salesDemandUpdatePO: obj
+              salesDemandUpdatePO: obj,
+              totalCost: this.$refs['sparePartsRef2'].totalPrice || 0
             };
             if (!data.acceptTime || !data.finishTime) {
               data.acceptTime = '';