yusheng 1 год назад
Родитель
Сommit
c15789a207

+ 48 - 11
src/api/salesServiceManagement/index.js

@@ -1,7 +1,5 @@
 import request from '@/utils/request';
-import {
-  download
-} from '@/utils/file';
+import { download } from '@/utils/file';
 
 //需求---------------------------------------------------------------
 export async function getPageSalesDemand(data) {
@@ -66,7 +64,6 @@ export async function auditSalesDemand(data) {
   return Promise.reject(new Error(res.data.message));
 }
 
-
 // 计划-------------------------------------------------------------------
 export async function getSalesPlan(data) {
   const res = await request.get('/eom/afterSalesPlan/page', {
@@ -131,7 +128,9 @@ export async function saveOrUpdateSalesPlan(data) {
 
 //生成报价单
 export async function generateQuotationSheet(id) {
-  const res = await request.get(`/eom/afterSalesPlan/generateQuotationSheet/${id}`);
+  const res = await request.get(
+    `/eom/afterSalesPlan/generateQuotationSheet/${id}`
+  );
   if (res.data.code == 0) {
     return res.data.data;
   }
@@ -139,12 +138,9 @@ export async function generateQuotationSheet(id) {
 }
 //下载报价单
 export async function SalesPlanDownload(id) {
-  const res = await request.get(
-    `/eom/afterSalesPlan/download/${id}`, {
-      responseType: 'blob'
-    },
-
-  );
+  const res = await request.get(`/eom/afterSalesPlan/download/${id}`, {
+    responseType: 'blob'
+  });
 
   download(res.data, '报价单.xlsx');
 }
@@ -213,3 +209,44 @@ export async function reportWorkingSalesWorkOrder(data) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+//修改
+export async function updateScheme(data) {
+  const res = await request.put('/eom/afterSalesWorkOrder/updateScheme', data);
+  if (res.data.code === '0') {
+    return res.data.message;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+//验收
+export async function checkAndAccept(data) {
+  const res = await request.post(
+    '/eom/afterSalesWorkOrder/checkAndAccept',
+    data
+  );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+//评论
+
+//表格
+export async function evaluatePage(data) {
+  const res = await request.get('/eom/afterSalesEvaluation/page', {
+    params: data
+  });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+//保存
+export async function evaluateSave(data) {
+  const res = await request.get('/eom/afterSalesEvaluation/save', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 325 - 273
src/views/salesServiceManagement/components/applyForSpare.vue

@@ -1,308 +1,360 @@
 <template>
-    <ele-modal :visible.sync="visible" :title="title" width="75%" append-to-body @close="handleCancel" :maxable="true">
-        <el-form ref="form" :model="form" :rules="rules" label-width="100px" class="create-form">
-            <headerTitle title="基本信息" style="margin-top: 15px"></headerTitle>
-            <el-row :gutter="24">
-                <el-col v-bind="styleResponsive ? { lg: 8, md: 12 } : { span: 8 }">
-                    <el-form-item label="编码:" prop="code">
-                        <el-input v-model="form.code" disabled />
-                    </el-form-item>
-                </el-col>
-                <el-col v-bind="styleResponsive ? { lg: 8, md: 12 } : { span: 8 }">
-                    <el-form-item label="工单名称:" prop="name">
-                        <el-input v-model="form.name" disabled />
-                    </el-form-item>
-                </el-col>
-                <el-col v-bind="styleResponsive ? { lg: 8, md: 12 } : { span: 8 }">
-                    <el-form-item label="领用部门:" prop="receivingDeptName">
-                        <el-input v-model="form.receivingDeptName" disabled />
-                    </el-form-item>
-                </el-col>
-                <el-col v-bind="styleResponsive ? { lg: 8, md: 12 } : { span: 8 }">
-                    <el-form-item label="领用人:" prop="recipientName">
-                        <el-input v-model="form.recipientName" disabled />
-                    </el-form-item>
-                </el-col>
-                <el-col v-bind="styleResponsive ? { lg: 8, md: 12 } : { span: 8 }">
-                    <el-form-item label="使用时间:" prop="usageTime">
-                        <el-date-picker style="width: 100%" v-model="form.usageTime" type="date" placeholder="选择"
-                            value-format="yyyy-MM-dd">
-                        </el-date-picker>
-                    </el-form-item>
-                </el-col>
-                <el-col :span="8">
-                    <el-form-item label="使用部门" prop="useDeptName">
-                        <el-input v-model="form.useDeptName" />
-                    </el-form-item>
-                </el-col>
-                <el-col :span="8">
-                    <el-form-item label="使用人" prop="userName">
-                        <el-input v-model="form.userName" />
-                    </el-form-item>
-                </el-col>
+  <ele-modal
+    :visible.sync="visible"
+    :title="title"
+    width="75%"
+    append-to-body
+    @close="handleCancel"
+    :maxable="true"
+  >
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      label-width="100px"
+      class="create-form"
+    >
+      <headerTitle title="基本信息" style="margin-top: 15px"></headerTitle>
+      <el-row :gutter="24">
+        <el-col v-bind="styleResponsive ? { lg: 8, md: 12 } : { span: 8 }">
+          <el-form-item label="编码:" prop="code">
+            <el-input v-model="form.code" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { lg: 8, md: 12 } : { span: 8 }">
+          <el-form-item label="工单名称:" prop="name">
+            <el-input v-model="form.name" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { lg: 8, md: 12 } : { span: 8 }">
+          <el-form-item label="领用部门:" prop="receivingDeptName">
+            <el-input v-model="form.receivingDeptName" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { lg: 8, md: 12 } : { span: 8 }">
+          <el-form-item label="领用人:" prop="recipientName">
+            <el-input v-model="form.recipientName" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { lg: 8, md: 12 } : { span: 8 }">
+          <el-form-item label="使用时间:" prop="usageTime">
+            <el-date-picker
+              style="width: 100%"
+              v-model="form.usageTime"
+              type="date"
+              placeholder="选择"
+              value-format="yyyy-MM-dd"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="使用部门" prop="useDeptName">
+            <el-input v-model="form.useDeptName" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="使用人" prop="userName">
+            <el-input v-model="form.userName" />
+          </el-form-item>
+        </el-col>
 
-                <el-col v-bind="styleResponsive ? { lg: 24, md: 24 } : { span: 16 }">
-                    <el-form-item label="用途:" prop="purpose">
-                        <el-input v-model="form.purpose" type="textarea" :rows="2" />
-                    </el-form-item>
-                </el-col>
-            </el-row>
+        <el-col v-bind="styleResponsive ? { lg: 24, md: 24 } : { span: 16 }">
+          <el-form-item label="用途:" prop="purpose">
+            <el-input v-model="form.purpose" type="textarea" :rows="2" />
+          </el-form-item>
+        </el-col>
+      </el-row>
 
-            <headerTitle title="备品备件信息" style="margin-top: 15px"></headerTitle>
+      <headerTitle title="备品备件信息" style="margin-top: 15px"></headerTitle>
 
-            <ele-pro-table ref="table" :columns="columns" :datasource="tableList" row-key="id" height="30vh"
-                :needPage="false">
-                <template v-slot:toolbar>
-                    <div class="add-product" @click="addEquipment" v-if="inlet != 1">
-                        <i class="el-icon-circle-plus-outline"></i>
-                    </div>
-                </template>
-
-                <template v-slot:totalCount="{ row, $index }">
-                    <el-input type="number" placeholder="请输入" v-model="row.totalCount" @input="handleInput(row, $index)"
-                        min="0" :disabled="inlet == 1" />
-                </template>
-                <template v-slot:singlePrice="{ row, $index }">
-                    <el-input type="number" placeholder="请输入" v-model="row.singlePrice"
-                        @input="handleInput(row, $index)" min="0" :disabled="inlet == 1" />
-                </template>
-                <template v-slot:action="{ row }">
-                    <el-popconfirm class="ele-action" title="确定要删除吗?" @confirm="del(row.id)">
-                        <template v-slot:reference>
-                            <el-link type="danger" :underline="false" icon="el-icon-delete">
-                                删除
-                            </el-link>
-                        </template>
-                    </el-popconfirm>
-                </template>
-            </ele-pro-table>
-        </el-form>
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="tableList"
+        row-key="id"
+        height="30vh"
+        :needPage="false"
+      >
+        <template v-slot:toolbar>
+          <div class="add-product" @click="addEquipment" v-if="inlet != 1">
+            <i class="el-icon-circle-plus-outline"></i>
+          </div>
+        </template>
 
-        <template v-slot:footer v-if="this.inlet != 1">
-            <el-button @click="handleCancel">取消</el-button>
-            <el-button type="primary" @click="save" :loading="loading">
-                提交
-            </el-button>
+        <template v-slot:totalCount="{ row, $index }">
+          <el-input
+            type="number"
+            placeholder="请输入"
+            v-model="row.totalCount"
+            @input="handleInput(row, $index)"
+            min="0"
+            :disabled="inlet == 1"
+          />
+        </template>
+        <template v-slot:singlePrice="{ row, $index }">
+          <el-input
+            type="number"
+            placeholder="请输入"
+            v-model="row.singlePrice"
+            @input="handleInput(row, $index)"
+            min="0"
+            :disabled="inlet == 1"
+          />
         </template>
-        <AssetsDialog ref="selectStockLedgerDialogRef" :assetType="6" @choose="confirmChoose">
-        </AssetsDialog>
-    </ele-modal>
+        <template v-slot:action="{ row }">
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除吗?"
+            @confirm="del(row.id)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+      </ele-pro-table>
+    </el-form>
+
+    <template v-slot:footer v-if="this.inlet != 1">
+      <el-button @click="handleCancel">取消</el-button>
+      <el-button type="primary" @click="save" :loading="loading">
+        提交
+      </el-button>
+    </template>
+    <AssetsDialog
+      ref="selectStockLedgerDialogRef"
+      :assetType="6"
+      @choose="confirmChoose"
+    >
+    </AssetsDialog>
+  </ele-modal>
 </template>
 
 <script>
-import { saveOrUpdateSalesWorkOrder, saveOrUpdateSalesPlan, getSalesWorkOrderById } from '@/api/salesServiceManagement/index'
-import AssetsDialog from './AssetsDialog.vue'
+  import {
+    saveOrUpdateSalesWorkOrder,
+    saveOrUpdateSalesPlan,
+    getSalesWorkOrderById
+  } from '@/api/salesServiceManagement/index';
+  import AssetsDialog from './AssetsDialog.vue';
 
-export default {
+  export default {
     components: {
-        AssetsDialog
+      AssetsDialog
     },
     props: {
-        inlet: {
-            type: Number,
-            default: null
-        }
+      inlet: {
+        type: Number,
+        default: null
+      }
     },
     data() {
-        return {
-            visible: false,
-            loading: false,
-            title: '备品备件申请单',
-            type: '',
-            executorList: [],
-            form: {
-                code: '',
-                name: '',
-                receivingDeptName: '',
-                recipientName: '',
-                usageTime: '',
-                useDeptName: '',
-                userName: '',
-                purpose: ''
-            },
-            rules: {
-            },
-            tableList: [],
-            columns: [{
-                columnKey: 'index',
-                label: '序号',
-                type: 'index',
-                width: 55,
-                align: 'center',
-                showOverflowTooltip: true,
-                fixed: 'left'
-            },
+      return {
+        visible: false,
+        loading: false,
+        title: '备品备件申请单',
+        type: '',
+        executorList: [],
+        form: {
+          code: '',
+          name: '',
+          receivingDeptName: '',
+          recipientName: '',
+          usageTime: '',
+          useDeptName: '',
+          userName: '',
+          purpose: ''
+        },
+        rules: {},
+        tableList: [],
+        columns: [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true,
+            fixed: 'left'
+          },
 
-            {
-                prop: 'categoryCode',
-                label: '物品编码',
-                align: 'center'
-            },
-            {
-                prop: 'categoryName',
-                label: '物品名称',
-                align: 'center'
-            },
+          {
+            prop: 'categoryCode',
+            label: '物品编码',
+            align: 'center'
+          },
+          {
+            prop: 'categoryName',
+            label: '物品名称',
+            align: 'center'
+          },
 
-            {
-                prop: 'categoryModel',
-                label: '型号',
-                align: 'center'
-            },
-            {
-                prop: 'specification',
-                label: '规格',
-                align: 'center'
-            },
-            {
-                prop: 'level',
-                label: '级别',
-                align: 'center'
-            },
-            {
-                prop: 'totalCount',
-                label: '数量',
-                align: 'center',
-                width: 100,
-                slot: 'totalCount'
-            },
-            {
-                prop: 'singlePrice',
-                label: '单价',
-                align: 'center',
-                width: 100,
-                slot: 'singlePrice'
-            },
-            {
-                prop: 'totalPrice',
-                label: '总价',
-                align: 'center',
-                width: 100,
-            },
-            {
-                prop: 'measureQuantity',
-                label: '库存',
-                align: 'center',
-            },
-            {
-                prop: 'measureUnit',
-                label: '计量单位',
-                align: 'center'
-            },
-            {
-                prop: 'warehouseName',
-                label: '仓库',
-                align: 'center'
-            },
-            {
-                columnKey: 'action',
-                label: '操作',
-                width: 140,
-                align: 'center',
-                resizable: false,
-                fixed: 'right',
-                slot: 'action',
-                showOverflowTooltip: true,
-                show: this.inlet != 1
-            }],
-        };
+          {
+            prop: 'categoryModel',
+            label: '型号',
+            align: 'center'
+          },
+          {
+            prop: 'specification',
+            label: '规格',
+            align: 'center'
+          },
+          {
+            prop: 'level',
+            label: '级别',
+            align: 'center'
+          },
+          {
+            prop: 'totalCount',
+            label: '数量',
+            align: 'center',
+            width: 100,
+            slot: 'totalCount'
+          },
+          {
+            prop: 'singlePrice',
+            label: '单价',
+            align: 'center',
+            width: 100,
+            slot: 'singlePrice'
+          },
+          {
+            prop: 'totalPrice',
+            label: '总价',
+            align: 'center',
+            width: 100
+          },
+        //   {
+        //     prop: 'measureQuantity',
+        //     label: '库存',
+        //     align: 'center'
+        //   },
+          {
+            prop: 'measureUnit',
+            label: '计量单位',
+            align: 'center'
+          },
+          {
+            prop: 'warehouseName',
+            label: '仓库',
+            align: 'center'
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 140,
+            align: 'center',
+            resizable: false,
+            fixed: 'right',
+            slot: 'action',
+            showOverflowTooltip: true,
+            show: this.inlet != 1
+          }
+        ]
+      };
     },
 
     computed: {
-        // 是否开启响应式布局
-        styleResponsive() {
-            return this.$store.state.theme.styleResponsive;
-        }
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
     },
-    created() { },
+    created() {},
     methods: {
-        // 出库数量限制
-        handleInput(row, index) {
-            if (row.totalCount > row.measureQuantity) {
-                this.$set(this.tableList[index], 'totalCount', row.measureQuantity);
-            }
-            if (row.singlePrice == 0) {
-                this.$set(this.tableList[index], 'totalPrice', 0);
-            } else {
-                this.$set(this.tableList[index], 'totalPrice', Number(row.singlePrice) * Number(row.totalCount));
-            }
-            console.log(row, 'row,', index)
-        },
+      // 出库数量限制
+      handleInput(row, index) {
+        // if (row.totalCount > row.measureQuantity) {
+        //   this.$set(this.tableList[index], 'totalCount', row.measureQuantity);
+        // }
+        if (row.singlePrice == 0) {
+          this.$set(this.tableList[index], 'totalPrice', 0);
+        } else {
+          this.$set(
+            this.tableList[index],
+            'totalPrice',
+            Number(row.singlePrice) * Number(row.totalCount)
+          );
+        }
+        console.log(row, 'row,', index);
+      },
 
-        async open(row, type) {
-            console.log(type);
-            this.visible = true;
-            this.type = type;
+      async open(row, type) {
+        console.log(type);
+        this.visible = true;
+        this.type = type;
 
-            this.getSalesWorkOrderDetail(row)
-        },
-        async getSalesWorkOrderDetail(row) {
-            console.log(row, '申请备品备件列表详情')
-            this.form = row || {};
+        this.getSalesWorkOrderDetail(row);
+      },
+      async getSalesWorkOrderDetail(row) {
+        console.log(row, '申请备品备件列表详情');
+        this.form = row || {};
 
-            // const detailsArray = row?.sparePartsApplyVO.flatMap(item =>
-            //     item.details ? item.details.map(({ id, ...rest }) => rest) : []
-            // );
-            this.tableList = row.details || [];
+        this.tableList = row.details || [];
+      },
+      del(id) {
+        this.tableList = this.tableList.filter((item) => item.id != id);
+      },
+      handleCancel() {
+        this.tableList = [];
+        this.form = {};
+        this.visible = false;
+      },
+      addEquipment() {
+        console.log('152454564');
+        this.$refs.selectStockLedgerDialogRef.open(this.tableList);
+      },
+      /* 保存编辑 */
+      async save() {
+        this.loading = true;
 
-        },
-        del(id) {
-            this.tableList = this.tableList.filter((item) => item.id != id);
-        },
-        handleCancel() {
-            this.tableList = [];
-            this.form = {};
-            this.visible = false;
-        },
-        addEquipment() {
-            console.log('152454564')
-            this.$refs.selectStockLedgerDialogRef.open(this.tableList);
-        },
-        /* 保存编辑 */
-        async save() {
-            this.loading = true;
-
-            let requestName = this.type == 'work' ? saveOrUpdateSalesWorkOrder : saveOrUpdateSalesPlan
-            const res = await requestName({
-                id: this.form.id,
-                details: this.tableList
-            })
-            console.log(res, 'res')
-            this.loading = false;
-            if (!res) return
-            this.$message({
-                type: 'success',
-                message: '提交成功'
-            });
-            this.$emit('reload');
-            this.handleCancel();
-            this.loading = false;
-        },
-        confirmChoose(data) {
-            console.log(data, '选中')
-            data.map((item) => {
-                item.singlePrice = item.unitPrice
-                delete item.id
-                return {
-                    ...item
-                }
-            })
-            this.tableList = JSON.parse(JSON.stringify(data));
-        },
+        let requestName =
+          this.type == 'work'
+            ? saveOrUpdateSalesWorkOrder
+            : saveOrUpdateSalesPlan;
+        const res = await requestName({
+          ...this.form,
+          details: this.tableList
+        });
+        console.log(res, 'res');
+        this.loading = false;
+        if (!res) return;
+        this.$message({
+          type: 'success',
+          message: '提交成功'
+        });
+        this.$emit('reload');
+        this.handleCancel();
+        this.loading = false;
+      },
+      confirmChoose(data) {
+        console.log(data, '选中');
+        data.map((item) => {
+          item.singlePrice = item.unitPrice;
+          delete item.id;
+          return {
+            ...item
+          };
+        });
+        this.tableList = JSON.parse(JSON.stringify(data));
+      }
     }
-};
+  };
 </script>
 <style lang="scss" scoped>
-.basic-details-title {
+  .basic-details-title {
     margin: 10px 0;
-}
+  }
 
-.title {
+  .title {
     font-size: 16px;
     line-height: 45px;
-}
+  }
 
-.add-product {
+  .add-product {
     width: 100%;
     display: flex;
     align-items: center;
@@ -311,5 +363,5 @@ export default {
     color: #1890ff;
     margin: 10px 0;
     cursor: pointer;
-}
-</style>
+  }
+</style>

+ 85 - 32
src/views/salesServiceManagement/components/info.vue

@@ -70,7 +70,7 @@
       </el-col>
       <el-col :span="8">
         <el-form-item label="报修地址:" prop="level">
-          <el-input v-model="form.contactAddress" />
+          <el-input v-model="form.contactAddress" :readonly="type == 'view'" />
         </el-form-item>
       </el-col>
     </el-row>
@@ -139,6 +139,22 @@
           :type="type == 'view' ? 'view' : 'add'"
         ></fileMain>
       </template>
+      <template v-slot:action="{ row, $index }">
+        <el-link
+          type="danger"
+          :underline="false"
+          icon="el-icon-delete"
+          v-if="type != 'view'"
+          @click="del(row, $index)"
+          >删除
+        </el-link>
+      </template>
+      <template v-slot:headerTypeDescribe="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+      <template v-slot:headerType="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
     </ele-pro-table>
     <headerTitle
       title="联系人信息"
@@ -158,6 +174,9 @@
       <template v-slot:toolbar v-if="type != 'view'">
         <el-button type="primary" @click="addBank">添加</el-button>
       </template>
+      <template v-slot:headerContactName="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
       <template v-slot:action="{ row, $index }">
         <el-link
           type="danger"
@@ -169,13 +188,22 @@
         </el-link>
       </template>
 
-      <template v-slot:contactName="{ row }">
-        <el-input
-          v-model="row.contactName"
-          placeholder="请输入"
-          :disabled="type == 'view'"
-          maxlength="50"
-        ></el-input>
+      <template v-slot:contactName="{ row,$index  }">
+        <el-form-item
+          :prop="`contactInfoVOS.${$index}.contactName`"
+          :rules="{
+            required: true,
+            message: '请输入联系人名称',
+            trigger: 'change'
+          }"
+        >
+          <el-input
+            v-model="row.contactName"
+            placeholder="请输入"
+            :disabled="type == 'view'"
+            maxlength="50"
+          ></el-input>
+        </el-form-item>
       </template>
       <template v-slot:contactPhone="{ row }">
         <el-input
@@ -244,26 +272,9 @@
   export default {
     components: { fileMain, parentList, invoiceDialog },
     computed: {
-      ...mapGetters(['getDictValue'])
-    },
-    props: {
-      type: '',
-      isPurchaseNeed: {
-        default: true,
-        type: Boolean
-      }
-    },
-    data() {
-      return {
-        tableList: [],
-        typeOptions: [
-          { label: '维修', value: '1' },
-          { label: '保养', value: '2' },
-          { label: '安装', value: '3' }
-        ],
-        form: { contractInfo: {}, tableList: [], contactInfoVOS: [] },
-        rules: {},
-        bankColumns: [
+      ...mapGetters(['getDictValue']),
+      bankColumns() {
+        return [
           {
             type: 'index',
             width: 55,
@@ -273,6 +284,7 @@
             label: '姓名',
             prop: 'contactName',
             slot: 'contactName',
+            headerSlot: 'headerContactName',
             align: 'center'
           },
           {
@@ -322,10 +334,15 @@
             action: 'action',
             slot: 'action',
             label: '操作',
-            align: 'center'
+            align: 'center',
+            fixed: 'right',
+            showOverflowTooltip: true,
+            show: this.type != 'view'
           }
-        ],
-        columnsDetail: [
+        ];
+      },
+      columnsDetail() {
+        return [
           {
             columnKey: 'index',
             label: '序号',
@@ -437,6 +454,7 @@
             slot: 'type',
             label: '问题类型',
             align: 'center',
+            headerSlot: 'headerType',
             showOverflowTooltip: true,
             width: 120
           },
@@ -444,6 +462,7 @@
             prop: 'typeDescribe',
             slot: 'typeDescribe',
             label: '问题描述',
+            headerSlot: 'headerTypeDescribe',
             align: 'center',
             showOverflowTooltip: true,
             width: 400
@@ -454,8 +473,38 @@
             label: '附件',
             align: 'center',
             width: 120
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 150,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            fixed: 'right',
+            showOverflowTooltip: true,
+            show: this.type != 'view'
           }
-        ]
+        ];
+      }
+    },
+    props: {
+      type: '',
+      isPurchaseNeed: {
+        default: true,
+        type: Boolean
+      }
+    },
+    data() {
+      return {
+        tableList: [],
+        typeOptions: [
+          { label: '维修', value: '1' },
+          { label: '保养', value: '2' },
+          { label: '安装', value: '3' }
+        ],
+        form: { contractInfo: {}, tableList: [], contactInfoVOS: [] },
+        rules: {}
       };
     },
 
@@ -544,6 +593,10 @@
       handleBankDel(row, index) {
         this.form.contactInfoVOS.splice(index, 1);
       },
+      del(row, index) {
+        this.form.tableList.splice(index, 1);
+      },
+
       getValidate() {
         return new Promise((resolve, reject) => {
           this.$refs.form.validate((valid, obj) => {

+ 210 - 45
src/views/salesServiceManagement/components/sparePartsList.vue

@@ -31,7 +31,7 @@
               placeholder="请选择"
               class="w100"
               @change="typeIdChange(scope.row, scope.$index)"
-              :disabled="type == 'view'"
+              :disabled="type == 'view' || scope.row.isApply == 1"
             >
               <el-option
                 v-for="item in typeIdList"
@@ -59,18 +59,27 @@
           <el-form-item
             style="margin-bottom: 20px"
             :prop="'tableList.' + scope.$index + '.name'"
+            :rules="{
+              required: true,
+              message: '项目名称不能为空',
+              trigger: 'change'
+            }"
           >
             <el-input
-              :disabled="type == 'view'||scope.row.typeId == 2"
+              :disabled="type == 'view' || scope.row.typeId == 2"
               v-model="scope.row.name"
-              style="width: calc(100% - 62px);"
+              style="width: calc(100% - 62px)"
             ></el-input>
 
             <el-button
-              v-if="scope.row.typeId == 2"
+              v-if="
+                scope.row.typeId == 2 &&
+                scope.row.isApply != 1 &&
+                type == 'edit'
+              "
               size="small"
               type="primary"
-              style="margin-left: 4px;"
+              style="margin-left: 4px"
               @click.native="addEquipment(row, scope.$index)"
               >选择
             </el-button>
@@ -111,19 +120,21 @@
             style="margin-bottom: 20px"
             :prop="'tableList.' + scope.$index + '.content'"
           >
-              
-            <el-input v-model="scope.row.content"  :disabled="type == 'view'"></el-input>
+            <el-input
+              v-model="scope.row.content"
+              :disabled="type == 'view'"
+            ></el-input>
           </el-form-item>
         </template>
-        <template v-slot:measureQuantity="scope">
+        <template v-slot:totalCount="scope">
           <el-form-item
             style="margin-bottom: 20px"
-            :prop="'tableList.' + scope.$index + '.measureQuantity'"
-          > 
+            :prop="'tableList.' + scope.$index + '.totalCount'"
+          >
             <el-input
-              v-model="scope.row.measureQuantity"
-              @input="measureQuantityChange(scope.$index)"
-              :disabled="type == 'view'"
+              v-model="scope.row.totalCount"
+              @input="totalCountChange(scope.$index)"
+              :disabled="type == 'view' || scope.row.isApply == 1"
               type="number"
             ></el-input>
           </el-form-item>
@@ -150,13 +161,46 @@
           >
             <el-input
               v-model="scope.row.singlePrice"
-              @input="measureQuantityChange(scope.$index)"
+              @input="totalCountChange(scope.$index)"
               :disabled="type == 'view'"
               type="number"
-
             ></el-input>
           </el-form-item>
         </template>
+        <template v-slot:warehouseId="scope">
+          <el-form-item
+            style="margin-bottom: 20px"
+            :prop="'tableList.' + scope.$index + '.warehouseId'"
+          >
+            <el-select
+              v-model="scope.row.warehouseId"
+              placeholder="请选择仓库"
+              class="w100"
+              :disabled="type == 'view' || scope.row.isApply == 1"
+            >
+              <el-option
+                v-for="item in scope.row.warehouseList"
+                @click="warehouseChange(item, scope.row, scope.$index)"
+                :key="item.warehouseId"
+                :label="item.warehouseName"
+                :value="item.warehouseId"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </template>
+        <template v-slot:action="{ row, $index }">
+          <el-link
+            type="danger"
+            :underline="false"
+            icon="el-icon-delete"
+            v-if="type != 'view' && row.isApply != 1"
+            @click="del(row, $index)"
+            >删除
+          </el-link>
+        </template>
+        <template v-slot:headerName="{ column }">
+          <span class="is-required">{{ column.label }}</span>
+        </template>
       </ele-pro-table>
     </el-form>
     <AssetsDialog
@@ -172,25 +216,29 @@
       :is-get-inventory-total="true"
       @changeParent="confirmChoose"
       :ids="[6]"
-     :isFirstRefreshTable="true"
+      :isFirstRefreshTable="true"
     ></product-list>
     <!-- <applyForSpare ref="edit" :inlet="1" /> -->
   </div>
 </template>
 
 <script>
-  //   import applyForSpare from './applyForSpare.vue';
+  import {
+    getWarehouseOutStock,
+    getIdWarehouseList
+  } from '@/api/saleManage/saleorder';
+
   import AssetsDialog from './AssetsDialog.vue';
   import productList from '@/BIZComponents/product-list.vue';
 
-
   export default {
     components: {
       //   applyForSpare,
-      AssetsDialog,productList
+      AssetsDialog,
+      productList
     },
-    props:{
-        type:''
+    props: {
+      type: ''
     },
     data() {
       return {
@@ -211,8 +259,12 @@
             label: '差旅费',
             value: '3'
           }
-        ],
-        columnsDetail: [
+        ]
+      };
+    },
+    computed: {
+      columnsDetail() {
+        return [
           {
             columnKey: 'index',
             label: '序号',
@@ -225,7 +277,7 @@
             prop: 'typeId',
             label: '项目',
             align: 'center',
-            width: 150,
+            width: 120,
             slot: 'typeId',
             showOverflowTooltip: true
           },
@@ -242,9 +294,10 @@
             prop: 'name',
             label: '名称',
             align: 'center',
-            minWidth: 200,
+            minWidth: 250,
             slot: 'name',
-            showOverflowTooltip: true
+            showOverflowTooltip: true,
+            headerSlot: 'headerName'
           },
           {
             prop: 'categoryModel',
@@ -270,10 +323,24 @@
             align: 'center',
             showOverflowTooltip: true
           },
-
           {
-            prop: 'measureQuantity',
-            slot: 'measureQuantity',
+            prop: 'warehouseId',
+            minWidth: 170,
+            slot: 'warehouseId',
+            label: '仓库',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'warehouseNum',
+            minWidth: 100,
+            label: '库存',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'totalCount',
+            slot: 'totalCount',
             width: 100,
             label: '数量',
             align: 'center',
@@ -299,15 +366,25 @@
 
           {
             prop: 'settlementPrice',
-            width: 120,
+            width: 80,
             label: '合计',
             align: 'center',
             showOverflowTooltip: true
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 150,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            fixed: 'right',
+            showOverflowTooltip: true,
+            show: this.type == 'edit'
           }
-        ]
-      };
+        ];
+      }
     },
-    computed: {},
     watch: {},
     created() {},
     methods: {
@@ -320,12 +397,29 @@
           categoryModel: '',
           specification: '',
           content: '',
-          measureQuantity: 1,
+          totalCount: 1,
           measureUnit: '',
           singlePrice: '',
           settlementPrice: ''
         });
       },
+      getValidate() {
+        return new Promise((resolve, reject) => {
+          this.$refs.form.validate((valid, obj) => {
+            if (obj) {
+              let messages = Object.keys(obj).map((key) => obj[key][0]);
+              if (messages.length > 0) {
+                this.$message.warning(messages[0].message);
+              }
+            }
+            if (!valid) {
+              reject(false);
+            } else {
+              resolve(true);
+            }
+          });
+        });
+      },
       addBank() {
         this.form.tableList.push({
           typeId: '2',
@@ -334,7 +428,7 @@
           categoryModel: '',
           specification: '',
           content: '',
-          measureQuantity: 1,
+          totalCount: 1,
           measureUnit: '',
           singlePrice: '',
           settlementPrice: ''
@@ -347,24 +441,95 @@
       getTableValue() {
         return this.form.tableList;
       },
-      setTableValue(val){
-        this.$set(this.form,'tableList',val)
+      setTableValue(val) {
+        this.$set(this.form, 'tableList', val);
+        this.form.tableList.forEach(async (item, index) => {
+          if (item.typeId == 2) {
+            this.$set(
+              this.form.tableList[index],
+              'warehouseList',
+              await getIdWarehouseList({
+                categoryId: item.categoryId
+              })
+            );
+            if (item.warehouseId) {
+              this.$set(
+                this.form.tableList[index],
+                'warehouseNum',
+                await getWarehouseOutStock({
+                  warehouseId: item.warehouseId,
+                  code: item.code
+                })
+              );
+            }
+          }
+        });
       },
-      measureQuantityChange(index) {
+      totalCountChange(index) {
         let row = this.form.tableList[index];
-        if (row.measureQuantity && row.singlePrice) {
-          row.settlementPrice = row.measureQuantity * row.singlePrice;
+        if (row.totalCount && row.singlePrice) {
+          row.settlementPrice = row.totalCount * row.singlePrice;
         }
-        this.$set(this.form.tableList[index],'settlementPrice',row.settlementPrice||0)
+        this.$set(
+          this.form.tableList[index],
+          'settlementPrice',
+          row.settlementPrice || 0
+        );
+      },
+      del(row, index) {
+        this.form.tableList.splice(index, 1);
       },
-      confirmChoose(data) {
-       
+      async confirmChoose(data) {
         this.$set(this.form.tableList, this.currentIndex, data[0]);
-        this.$set(this.form.tableList[this.currentIndex],'categoryModel', data[0].modelType);
-        // this.$set(this.form.tableList, this.currentIndex, data[0]);
+        this.$set(
+          this.form.tableList[this.currentIndex],
+          'categoryModel',
+          data[0].modelType
+        );
+        this.$set(
+          this.form.tableList[this.currentIndex],
+          'categoryId',
+          data[0].id
+        );
+        this.$set(
+          this.form.tableList[this.currentIndex],
+          'measureUnit',
+          data[0].measuringUnit
+        );
+
+        this.$set(
+          this.form.tableList[this.currentIndex],
+          'warehouseList',
+          await getIdWarehouseList({
+            categoryId: data[0].id
+          })
+        );
+        if (this.form.tableList[this.currentIndex]?.warehouseList?.length) {
+          this.warehouseChange(
+            this.form.tableList[this.currentIndex].warehouseList[0],
+            this.form.tableList[this.currentIndex],
+            this.currentIndex
+          );
+        }
 
         this.$set(this.form.tableList[this.currentIndex], 'typeId', '2');
         this.$forceUpdate();
+      },
+      async warehouseChange(item, row, index) {
+        this.$set(
+          this.form.tableList[index],
+          'warehouseName',
+          item.warehouseName
+        );
+        this.$set(this.form.tableList[index], 'warehouseId', item.warehouseId);
+        this.$set(
+          this.form.tableList[index],
+          'warehouseNum',
+          await getWarehouseOutStock({
+            warehouseId: item.warehouseId,
+            code: row.code
+          })
+        );
       }
     }
   };

+ 6 - 4
src/views/salesServiceManagement/demandList/components/addDialog.vue

@@ -61,9 +61,8 @@
       init(row, type) {
         this.addRepairNotesDialog = true;
         this.type = type;
-        this.title = type=='add'?'新增':type=='view'?'详情':'修改';
+        this.title = type == 'add' ? '新增' : type == 'view' ? '详情' : '修改';
         if (row?.id) {
-         
           this.getDetail(row.id);
         } else {
         }
@@ -84,7 +83,10 @@
       },
       async submitAdd() {
         let data = this.$refs.infoRef.getValue();
-        console.log(data, 'data');
+        if (!data.contactInfoVOS?.length) {
+          this.$message.warning('联系人信息至少有1条');
+          return;
+        }
         try {
           let valid = await this.$refs.infoRef.getValidate();
           let pData = {
@@ -94,7 +96,7 @@
             contactName: data.contractInfo.name,
             orderCode: data.orderCode,
             orderId: data.orderId,
-            contactAddress:data.contactAddress,
+            contactAddress: data.contactAddress,
             productDetail: data.tableList.map((item) => {
               item['produceTime'] = item['produceTime'] || null;
               return item;

+ 139 - 0
src/views/salesServiceManagement/evaluate/components/addDialog.vue

@@ -0,0 +1,139 @@
+<template>
+  <ele-modal
+    custom-class="ele-dialog-form long-dialog-form"
+    :centered="true"
+    :visible.sync="addRepairNotesDialog"
+    title="评价"
+    :close-on-click-modal="false"
+    width="800px"
+    :maxable="true"
+    append-to-body
+    @close="handleClose"
+  >
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      label-width="100px"
+      class="create-form"
+    >
+      <el-form-item label="服务态度" prop="attitudeRating">
+        <div class="block">
+          <el-rate v-model="form.attitudeRating" show-text :texts="texts">
+          </el-rate>
+        </div>
+      </el-form-item>
+      <el-form-item label="响应速度" prop="responseSpeed">
+        <div class="block">
+          <el-rate v-model="form.responseSpeed" show-text :texts="texts">
+          </el-rate>
+        </div>
+      </el-form-item>
+      <el-form-item label="整体满意度" prop="serviceRating">
+        <div class="block">
+          <el-rate v-model="form.serviceRating" show-text :texts="texts">
+          </el-rate>
+        </div>
+      </el-form-item>
+      <el-form-item label="评价" prop="comment">
+        <el-input
+          type="textarea"
+          placeholder="请输入内容"
+          v-model="form.comment"
+          :disabled="type == 'view'"
+        >
+        </el-input>
+      </el-form-item>
+    </el-form>
+
+    <div slot="footer" class="footer">
+      <el-button type="primary" @click="submitAdd">确认</el-button>
+      <el-button @click="handleClose">返回</el-button>
+    </div>
+  </ele-modal>
+</template>
+
+<script>
+  import { evaluateSave } from '@/api/salesServiceManagement/index';
+
+  import fileMain from '@/components/addDoc/index.vue';
+  const def = {
+    attachmen: [],
+    attitudeRating: '',
+    code: '',
+    comment: '',
+    isAnonymous: '',
+    responseSpeed: '',
+    serviceRating: '',
+    workId: ''
+  };
+  export default {
+    components: {},
+    data() {
+      return {
+        texts: ['非常不满意', '不满意', '一般', '满意', '非常满意'],
+        rules: {
+          attitudeRating: [
+            { required: true, message: '请选择服务态度', trigger: 'change' }
+          ],
+          responseSpeed: [
+            { required: true, message: '请选择响应速度', trigger: 'change' }
+          ],
+          serviceRating: [
+            { required: true, message: '请选择服务评分', trigger: 'change' }
+          ]
+        },
+        title: '新增',
+        addRepairNotesDialog: false,
+        type: 'add',
+        form: { ...def }
+      };
+    },
+    created() {},
+    methods: {
+      open(row, type) {
+        this.addRepairNotesDialog = true;
+        this.type = type;
+        this.title = type == 'add' ? '新增' : '详情';
+        if (type != 'add') {
+          this.getDetail(row.id);
+        } else {
+          this.form.workId = row.id;
+        }
+      },
+      async getDetail(id) {
+        const res = await getSalesDemandById(id);
+        this.form = res;
+      },
+
+      handleClose() {
+        this.addRepairNotesDialog = false;
+        this.form = { ...def };
+      },
+      async submitAdd() {
+        alert(1)
+
+        try {
+          alert(1)
+          let valid = await this.$refs.form.validate();
+          console.log(this.form);
+          return;
+          const res = await evaluateSave(this.form);
+          if (res) {
+            this.$message.success('操作成功!');
+            this.$emit('refresh');
+            this.handleClose();
+          }
+        } catch (error) {}
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .block {
+    height: 36px;
+    display: flex;
+    align-items: center;
+  }
+</style>

+ 71 - 0
src/views/salesServiceManagement/evaluate/components/search.vue

@@ -0,0 +1,71 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form label-width="100px" class="ele-form-search" @keyup.enter.native="search" @submit.native.prevent>
+    <el-row :gutter="24">
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="编码:">
+          <el-input clearable v-model="where.code" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="工单编码:">
+          <el-input clearable v-model="where.workCode" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col class="ele-form-actions" v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-button type="primary" icon="el-icon-search" class="ele-btn-icon" @click="search" size="small">
+          查询
+        </el-button>
+        <el-button @click="reset" icon="el-icon-refresh-left" size="small" type="primary">重置</el-button>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+export default {
+  components: {},
+  data() {
+    // 默认表单数据
+    const defaultWhere = {
+      code: '',
+      workCode: '',
+    };
+    return {
+      // 表单数据
+      where: { ...defaultWhere },
+    };
+  },
+  computed: {
+    // 是否开启响应式布局
+    styleResponsive() {
+      return this.$store.state.theme.styleResponsive;
+    }
+  },
+  created() { },
+  methods: {
+    /* 搜索 */
+    search() {
+      this.$emit('search');
+    },
+    /*  重置 */
+    reset() {
+      this.where = { ...this.defaultWhere };
+      this.search();
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.ele-form-actions {
+  // display: flex;
+  // align-items: center;
+  // justify-content: flex-end;
+}
+
+::v-deep {
+  .el-range-editor--medium.el-input__inner {
+    width: 100%;
+  }
+}
+</style>

+ 145 - 0
src/views/salesServiceManagement/evaluate/index.vue

@@ -0,0 +1,145 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <search @search="reload"> </search>
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="datasource"
+        cache-key="systemRoleTable"
+        :pageSize="20"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar> </template>
+        <template v-slot:code="{ row }"
+          ><el-link
+            type="primary"
+            :underline="false"
+            @click="goDetail(row, 'view')"
+          >
+            {{ row.code }}
+          </el-link>
+        </template>
+        <!-- 操作列 -->
+        <template v-slot:action="{ row }"> </template>
+      </ele-pro-table>
+    </el-card>
+  </div>
+</template>
+
+<script>
+  import search from './components/search.vue';
+  import { evaluatePage } from '@/api/salesServiceManagement/index';
+
+  import dictMixins from '@/mixins/dictMixins';
+  export default {
+    mixins: [dictMixins],
+    components: {
+      search
+    },
+    data() {
+      return {
+        evaluateStatus: {
+          1: '非常不满意',
+          2: '不满意',
+          3: '一般',
+          4: '满意',
+          5: '非常满意'
+        },
+        // 表格列配置
+
+        // 加载状态
+        loading: false
+      };
+    },
+    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: 'workCode',
+            label: '工单编码',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'attitudeRating',
+            label: '服务态度评分',
+            align: 'center',
+            showOverflowTooltip: true,
+            formatter: (row) => {
+              return this.evaluateStatus[row.attitudeRating];
+            }
+          },
+          {
+            prop: 'responseSpeed',
+            label: '响应速度评分',
+            align: 'center',
+            showOverflowTooltip: true,
+            formatter: (row) => {
+              return this.evaluateStatus[row.responseSpeed];
+            }
+          },
+          {
+            prop: 'serviceRating',
+            label: '整体满意度',
+            align: 'center',
+            showOverflowTooltip: true,
+            formatter: (row) => {
+              return this.evaluateStatus[row.serviceRating];
+            }
+          },
+          {
+            prop: 'comment',
+            label: '评价内容',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 350
+          },
+
+          {
+            prop: 'createUserName',
+            label: '创建人',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'createTime',
+            label: '创建时间',
+            align: 'center',
+            showOverflowTooltip: true
+          }
+        ];
+      }
+    },
+    created() {},
+    methods: {
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return evaluatePage({ pageNum: page, size: limit, ...where });
+      },
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where });
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped></style>

+ 50 - 39
src/views/salesServiceManagement/index.vue

@@ -5,8 +5,12 @@
         <div class="switch">
           <div class="switch_left">
             <ul>
-              <li v-for="item in tabOptions" :key="item.key" :class="{ active: activeComp == item.key }"
-                @click="activeComp = item.key">
+              <li
+                v-for="item in tabOptions"
+                :key="item.key"
+                :class="{ active: activeComp == item.key }"
+                @click="activeComp = item.key"
+              >
                 {{ item.name }}
               </li>
             </ul>
@@ -25,51 +29,58 @@
           <div v-if="activeComp == 'workOrder'">
             <workOrder ref="workOrderRef" />
           </div>
+          <div v-if="activeComp == 'evaluate'">
+            <evaluate ref="evaluateRef" />
+          </div>
         </div>
       </el-card>
     </div>
+
   </div>
 </template>
 <script>
-import demandList from './demandList';
-import toDoList from './toDoList';
-import workOrder from './workOrder';
-export default {
-  components: { demandList, toDoList, workOrder },
-  data() {
-    return {
-      activeComp: 'demandList',
-      tabOptions: [
-        { key: 'demandList', name: '售后需求' },
-        { key: 'toDoList', name: '售后计划' },
-        { key: 'workOrder', name: '售后工单' },
-        { key: '1', name: '客户评价' },
-        { key: '2', name: '统计报表' }
-      ]
-    };
-  },
-  mounted() {
-    // switch (this.$route.query.title) {
-    //   case '工单':
-    //     this.activeComp = 'workOrder';
-    //     break;
-    //   default:
-    //     break;
-    // }
-  }
-};
+  import demandList from './demandList';
+  import toDoList from './toDoList';
+  import workOrder from './workOrder';
+  import evaluate from './evaluate';
+  export default {
+    components: { demandList, toDoList, workOrder, evaluate },
+    data() {
+      return {
+        activeComp: 'demandList',
+        tabOptions: [
+          { key: 'demandList', name: '售后需求' },
+          { key: 'toDoList', name: '售后计划' },
+          { key: 'workOrder', name: '售后工单' },
+          { key: 'evaluate', name: '客户评价' },
+          { key: '3', name: '配件申请记录' },
+          { key: '4', name: '故障知识库' },
+          { key: '2', name: '统计报表' }
+        ]
+      };
+    },
+    mounted() {
+      // switch (this.$route.query.title) {
+      //   case '工单':
+      //     this.activeComp = 'workOrder';
+      //     break;
+      //   default:
+      //     break;
+      // }
+    }
+  };
 </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>
+</style>

+ 62 - 23
src/views/salesServiceManagement/toDoList/components/addOrUpdateDialog.vue

@@ -28,7 +28,15 @@
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="名称" prop="name">
+          <el-form-item
+            label="名称"
+            prop="name"
+            :rules="{
+              required: true,
+              message: '请输入名称',
+              trigger: 'change'
+            }"
+          >
             <el-input
               v-model="addForm.name"
               size="small"
@@ -65,14 +73,14 @@
               >
                 <template #suffix>
                   <el-select
-                    v-model="addForm.isSyncBill"
+                    v-model="addForm.durationUnit"
                     size="small"
-                    style="width: 100%"
+                    style="width: 80px"
                     :disabled="type == 'view'"
                   >
-                    <el-option :value="1" label="分钟"></el-option>
-                    <el-option :value="2" label="小时"></el-option>
-                    <el-option :value="3" label="天"></el-option>
+                    <el-option :value="'1'" label="分钟"></el-option>
+                    <el-option :value="'2'" label="小时"></el-option>
+                    <el-option :value="'3'" label="天"></el-option>
                   </el-select>
                 </template>
               </el-input>
@@ -80,7 +88,15 @@
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="部门" prop="executeGroupId">
+          <el-form-item
+            label="部门"
+            prop="executeGroupId"
+            :rules="{
+              required: true,
+              message: '请选择部门',
+              trigger: 'change'
+            }"
+          >
             <deptSelect
               v-model="addForm.executeGroupId"
               @changeGroup="searchDeptNodeClick"
@@ -89,7 +105,15 @@
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="执行人" prop="executeUserId">
+          <el-form-item
+            label="执行人"
+            prop="executeUserId"
+            :rules="{
+              required: true,
+              message: '请选择执行人',
+              trigger: 'change'
+            }"
+          >
             <el-select
               v-model="addForm.executeUserId"
               size="small"
@@ -176,7 +200,8 @@
     executeUserId: '',
     executeUserName: '',
     urgent: null,
-    remark: ''
+    remark: '',
+    durationUnit: '2'
   };
   export default {
     components: {
@@ -277,21 +302,31 @@
           }
         });
       },
-      save() {
-        this.addForm.costListVOS = this.$refs.sparePartsRef.getTableValue();
-        this.$refs.addFormRef.validate(async (valid) => {
-          if (valid) {
-            let requestName = this.isDispatch
-              ? dispatchOrders
-              : updateSalesPlan;
-            const res = await requestName(this.addForm);
-            if (!res) return;
-            this.$message.success('保存成功');
-            this.visible = false;
-            this.$emit('reload');
-          }
-        });
+      async save() {
+        try {
+          await this.$refs.sparePartsRef.getValidate();
+          this.addForm.costListVOS = this.$refs.sparePartsRef.getTableValue();
+          this.$refs.addFormRef.validate(async (valid, obj) => {
+            if (obj) {
+              let messages = Object.keys(obj).map((key) => obj[key][0]);
+              if (messages.length > 0) {
+                this.$message.warning(messages[0].message);
+              }
+            }
+            if (valid) {
+              let requestName = this.isDispatch
+                ? dispatchOrders
+                : updateSalesPlan;
+              const res = await requestName(this.addForm);
+              if (!res) return;
+              this.$message.success('保存成功');
+              this.visible = false;
+              this.$emit('reload');
+            }
+          });
+        } catch (error) {}
       },
+
       async getInfo(id) {
         const res = await getSalesPlanById(id);
         if (!res) return;
@@ -318,4 +353,8 @@
       color: #40a9ff;
     }
   }
+  :deep(.el-input__suffix .el-input__inner) {
+    border: none;
+    background: none;
+  }
 </style>

+ 176 - 45
src/views/salesServiceManagement/workOrder/components/declarationDialog.vue

@@ -2,51 +2,154 @@
   <ele-modal
     custom-class="ele-dialog-form long-dialog-form"
     :visible.sync="visibleDialog"
-    title="报工"
+    :title="title"
     :close-on-click-modal="false"
     width="85%"
     append-to-body
     @close="handleClose"
     :maxable="true"
   >
-    <el-form ref="form" :model="addForm" label-width="100px">
-      <el-form-item label="实际起始时间" prop="time">
-        <el-date-picker
-          v-model="addForm.time"
-          type="datetimerange"
-          value-format="yyyy-MM-dd HH:mm:ss"
-          range-separator="至"
-          start-placeholder="实际开始日期"
-          end-placeholder="实际结束日期"
-          :disabled="type == 'view'"
-        >
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item label="附件:" prop="attachments">
-        <fileMain
-          v-model="addForm.attachments"
-          :type="type == 'view' ? 'view' : ''"
-        ></fileMain>
-      </el-form-item>
-      <el-form-item label="备注:" prop="reason">
-        <el-input
-          type="textarea"
-          placeholder="请输入内容"
-          v-model="addForm.reason"
-          :disabled="type == 'view'"
-        >
-        </el-input>
-      </el-form-item>
-    </el-form>
+    <el-form ref="form" :model="addForm" label-width="120px">
+      <el-row :gutter="24">
+        <el-col :span="8">
+          <el-form-item
+            label="实际起始时间"
+            prop="time"
+            :rules="{
+              required: true,
+              message: '实际起始时间',
+              trigger: 'change'
+            }"
+          >
+            <el-date-picker
+              style="width: 100%"
+              v-model="addForm.time"
+              type="datetimerange"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              range-separator="至"
+              start-placeholder="实际开始日期"
+              end-placeholder="实际结束日期"
+              :disabled="type == 'view'"
+              @change="getTime"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
 
-    <info ref="infoRef" type="view" :isPurchaseNeed="false"></info>
+        <el-col :span="8">
+          <el-form-item label="实际售后时长" prop="inFactDuration">
+            <el-input v-model="addForm.inFactDuration" :disabled="true">
+              <template slot="append">min</template>
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="附件" prop="attachments">
+            <fileMain
+              v-model="addForm.attachments"
+              :type="type == 'view' ? 'view' : 'add'"
+            ></fileMain>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="故障现象" prop="faultPhenomenon">
+            <el-input
+              type="textarea"
+              placeholder="请输入内容"
+              v-model="addForm.faultPhenomenon"
+              :disabled="type == 'view'"
+            >
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="故障原因" prop="faultReason">
+            <el-input
+              type="textarea"
+              placeholder="请输入内容"
+              v-model="addForm.faultReason"
+              :disabled="type == 'view'"
+            >
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="维修过程" prop="maintenanceProcess">
+            <el-input
+              type="textarea"
+              placeholder="请输入内容"
+              v-model="addForm.maintenanceProcess"
+              :disabled="type == 'view'"
+            >
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <info ref="infoRef" type="view" :isPurchaseNeed="false"></info>
+        </el-col>
+        <el-col :span="24">
+          <header-title title="方案" style="margin-top: 10px"></header-title>
+          <spareParts
+            ref="sparePartsRef"
+            :type="type == 'edit' ? 'edit' : 'view'"
+          ></spareParts>
+        </el-col>
+        <el-col :span="8" v-if="type=='view'">
+          <el-form-item label="报工时间" prop="acceptTime">
+            <el-input
+              v-model="addForm.acceptTime"
+              :disabled="true"
+            >
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8"  v-if="type=='view'">
+          <el-form-item label="报工人" prop="executeUserName">
+            <el-input
+              v-model="addForm.executeUserName"
+              :disabled="true"
+            >
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8"  v-if="type=='view'">
+          <el-form-item label="验收人" prop="accepterUserName">
+            <el-input
+              v-model="addForm.accepterUserName"
+              :disabled="true"
+            >
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8"  v-if="type=='view'">
+          <el-form-item label="验收时间" prop="accepterTime">
+            <el-input
+              v-model="addForm.accepterTime"
+              :disabled="true"
+            >
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8"  v-if="type=='view'">
+          <el-form-item label="验收意见" prop="accepterRemark">
+            <el-input
+              v-model="addForm.accepterRemark"
+              :disabled="true"
+            type="textarea"
+            >
+            </el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
 
-    <header-title title="方案"></header-title>
-    <spareParts ref="sparePartsRef" :type="type"></spareParts>
     <div slot="footer" class="footer">
-      <el-button type="primary" @click="submitAdd" v-if="type != 'view'"
+      <el-button type="primary" @click="submitAdd" v-if="type == 'report'"
         >提交</el-button
       >
+      <el-button type="primary" @click="submitAdd" v-if="type == 'edit'"
+        >保存</el-button
+      >
       <el-button @click="handleClose">取消</el-button>
     </div>
   </ele-modal>
@@ -54,8 +157,11 @@
 
 <script>
   import fileMain from '@/components/addDoc/index.vue';
-  import { getSalesWorkOrderById } from '@/api/salesServiceManagement/index';
-  import { reportWorkingSalesWorkOrder } from '@/api/salesServiceManagement/index';
+  import {
+    reportWorkingSalesWorkOrder,
+    updateScheme,
+    getSalesWorkOrderById
+  } from '@/api/salesServiceManagement/index';
   import spareParts from '@/views/salesServiceManagement/components/sparePartsList.vue';
   import info from '@/views/salesServiceManagement/components/info.vue';
   export default {
@@ -78,7 +184,7 @@
           reason: ''
         },
         row: {},
-        type: 'add'
+        type: ''
       };
     },
     created() {},
@@ -86,12 +192,18 @@
       open(row, type) {
         this.visibleDialog = true;
         this.type = type;
+        this.title = type == 'edit' ? '修改' : type == 'view' ? '详情' : '报工';
         this.getDetail(row);
       },
       async getDetail(row) {
-        console.log(row, 'row');
         const res = await getSalesWorkOrderById(row.id);
-        this.addForm=res
+        this.addForm = res;
+        if (this.addForm.acceptTime) {
+          this.$set(this.addForm, 'time', [
+            this.addForm.acceptTime,
+            this.addForm.finishTime
+          ]);
+        }
         this.$nextTick(() => {
           this.$refs.infoRef.init(res.afterSalesDemandVO);
           this.$refs.sparePartsRef.setTableValue(res?.costListVOS || []);
@@ -100,14 +212,20 @@
       async submitAdd() {
         this.$refs.form.validate(async (valid) => {
           if (valid) {
-            await reportWorkingSalesWorkOrder({
-              acceptTime: this.addForm.time[0],
-              finishTime: this.addForm.time[1],
+            let data = {
+              acceptTime: this.addForm.time?.[0],
+              finishTime: this.addForm.time?.[1],
               attachments: this.addForm.attachments,
-              id:this.addForm.id,
-              reason: this.addForm.reason,
+              maintenanceProcess: this.addForm.maintenanceProcess,
+              faultPhenomenon: this.addForm.faultPhenomenon,
+              faultReason: this.addForm.faultReason,
+              inFactDuration: this.addForm.inFactDuration,
+              id: this.addForm.id,
               costListVOS: this.$refs.sparePartsRef.getTableValue()
-            }).then((res) => {
+            };
+            let api =
+              this.type == 'edit' ? updateScheme : reportWorkingSalesWorkOrder;
+            await api(data).then((res) => {
               if (!res) return;
               this.$message.success('操作成功');
               this.visibleDialog = false;
@@ -118,6 +236,19 @@
           }
         });
       },
+      getTime() {
+        if (this.addForm.time?.length) {
+          this.$set(
+            this.addForm,
+            'inFactDuration',
+            parseInt(
+              (new Date(this.addForm.time[1]).getTime() -
+                new Date(this.addForm.time[0]).getTime()) /
+                60000
+            )
+          );
+        }
+      },
       handleClose() {
         this.visibleDialog = false;
       }

+ 416 - 248
src/views/salesServiceManagement/workOrder/index.vue

@@ -1,277 +1,445 @@
 <template>
-    <div class="ele-body">
-        <el-card shadow="never" v-loading="loading">
-            <work-search @search="reload"> </work-search>
-            <!-- 数据表格 -->
-            <ele-pro-table ref="table" :columns="columns" :datasource="datasource" cache-key="systemRoleTable"
-                :pageSize="20">
-                <!-- 表头工具栏 -->
-                <template v-slot:toolbar>
-                </template>
-                <template v-slot:code="{ row }">
-                    <el-link type="primary" :underline="false" @click="goDetail(row)">
-                        {{ row.code }}
-                    </el-link>
-                </template>
-                <!-- 操作列 -->
-                <template v-slot:action="{ row }">
-                    <el-link type="primary" :underline="false" @click="declarationForm(row)">
-                        报工
-                    </el-link>
-                    <el-popconfirm class="ele-action" title="确认删除这条记录吗?" @confirm="cancel(row)">
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <work-search @search="reload"> </work-search>
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="datasource"
+        cache-key="systemRoleTable"
+        :pageSize="20"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar> </template>
+        <template v-slot:code="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            @click="declarationForm(row, 'view')"
+          >
+            {{ row.code }}
+          </el-link>
+        </template>
+        <!-- 操作列 -->
+        <template v-slot:action="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            @click="declarationForm(row, 'edit')"
+            v-if="row.orderStatus == 1||row.orderStatus == 6"
+          >
+            修改
+          </el-link>
+          <el-link
+            type="primary"
+            :underline="false"
+            @click="declarationForm(row, 'report')"
+            v-if="row.orderStatus == 1||row.orderStatus == 6"
+          >
+            报工
+          </el-link>
+
+          <!-- <el-popconfirm class="ele-action" title="确认删除这条记录吗?" @confirm="cancel(row)">
                         <template v-slot:reference>
                             <el-link type="danger" :underline="false" icon="el-icon-delete">
                                 删除
                             </el-link>
                         </template>
-                    </el-popconfirm>
-                    <el-dropdown @command="(command) => handleCommand(command, row)">
-                        <span class="el-dropdown-link">
-                            操作菜单<i class="el-icon-arrow-down el-icon--right"></i>
-                        </span>
-                        <el-dropdown-menu slot="dropdown">
-                            <el-dropdown-item command="handleReceive">接收
-                            </el-dropdown-item>
-                            <el-dropdown-item command="toRedeploy">转派
-                            </el-dropdown-item>
-                            <el-dropdown-item command="addSpareItems">申请备品备件
-                            </el-dropdown-item>
-                        </el-dropdown-menu>
-                    </el-dropdown>
-                </template>
-            </ele-pro-table>
-        </el-card>
-        <!-- 详情 -->
-        <detailDialog ref="detailDialogRef"></detailDialog>
-        <!-- 备品备件 -->
-        <applyForSpare @reload="reload" ref="edit" />
-        <!-- 报工 -->
-        <declarationDialog ref="declarationDialogRef" @reload="reload"></declarationDialog>
-        <!-- 转派 -->
-        <redeployOther ref="redeployOtherRef" @reload="reload" />
-    </div>
+                    </el-popconfirm> -->
+          <el-dropdown
+            @command="(command) => handleCommand(command, row)"
+            v-if="row.orderStatus != 5"
+          >
+            <span class="el-dropdown-link">
+              操作菜单<i class="el-icon-arrow-down el-icon--right"></i>
+            </span>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item
+                command="handleReceive"
+                v-if="row.orderStatus == 0"
+                >接收
+              </el-dropdown-item>
+              <el-dropdown-item
+                command="toRedeploy"
+                v-if="row.orderStatus == 0 || row.orderStatus == 1"
+                >转派
+              </el-dropdown-item>
+              <el-dropdown-item
+                command="addSpareItems"
+                v-if="row.orderStatus == 1 || row.orderStatus == 2"
+                >申请备品备件
+              </el-dropdown-item>
+              <el-dropdown-item
+                command="checkAndAccept"
+                v-if="row.orderStatus == 3||row.orderStatus == 6"
+                >验收
+              </el-dropdown-item>
+              <el-dropdown-item command="evaluate" v-if="row.orderStatus == 4"
+                >评价
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </ele-pro-table>
+    </el-card>
+    <!-- 详情 -->
+    <detailDialog ref="detailDialogRef"></detailDialog>
+    <!-- 备品备件 -->
+    <applyForSpare @reload="reload" ref="edit" />
+    <!-- 报工 -->
+    <declarationDialog
+      ref="declarationDialogRef"
+      @reload="reload"
+    ></declarationDialog>
+    <!-- 转派 -->
+    <redeployOther ref="redeployOtherRef" @reload="reload" />
+    <ele-modal
+      custom-class="ele-dialog-form long-dialog-form"
+      :visible.sync="visibleCheckAndAccept"
+      title="验收"
+      :close-on-click-modal="false"
+      width="500px"
+      append-to-body
+      :maxable="true"
+    >
+      <div>
+        <el-form
+          ref="form"
+          :model="form"
+          :rules="rules"
+          label-width="100px"
+          class="create-form"
+        >
+          <el-form-item label="验收人" prop="accepterUserId">
+            <el-select
+              v-model="form.accepterUserId"
+              size="small"
+              style="width: 100%"
+            >
+              <el-option
+                :value="item.id"
+                :label="item.contactName"
+                v-for="(item, index) in contactInfoVOS"
+                @click.native="accepterUserChange(item)"
+                :key="index"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="验收意见" prop="accepterRemark">
+            <el-input
+              placeholder="请输入内容"
+              v-model="form.accepterRemark"
+              type="textarea"
+            >
+            </el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div slot="footer" class="footer">
+        <el-button type="primary" @click="checkAndAccept(1)">通过</el-button>
+        <el-button type="primary" @click="checkAndAccept(0)">不通过</el-button>
+        <el-button @click="visibleCheckAndAccept = false">取消</el-button>
+      </div>
+    </ele-modal>
+    <addDialog ref="addDialogRef" @succes="reload"></addDialog>
+  </div>
 </template>
 
 <script>
-import workSearch from './components/work-search.vue';
-
-import detailDialog from './components/detailDialog.vue'
-import applyForSpare from '../components/applyForSpare.vue';
-import declarationDialog from './components/declarationDialog.vue';
-import redeployOther from './components/redeployOther2.vue';
+  import workSearch from './components/work-search.vue';
 
+  import detailDialog from './components/detailDialog.vue';
+  import applyForSpare from '../components/applyForSpare.vue';
+  import declarationDialog from './components/declarationDialog.vue';
+  import redeployOther from './components/redeployOther2.vue';
+  import addDialog from '@/views/salesServiceManagement/evaluate/components/addDialog.vue';
 
-import { getSalesWorkOrder, deleteSalesWorkOrder, receiveSalesWorkOrder } from '@/api/salesServiceManagement/index';
+  import {
+    getSalesWorkOrder,
+    deleteSalesWorkOrder,
+    receiveSalesWorkOrder,
+    checkAndAccept,
+    getSalesWorkOrderById
+  } from '@/api/salesServiceManagement/index';
 
-import dictMixins from '@/mixins/dictMixins';
-export default {
+  import dictMixins from '@/mixins/dictMixins';
+  export default {
     mixins: [dictMixins],
     components: {
-        workSearch,
-        detailDialog,
-        applyForSpare,
-        declarationDialog,
-        redeployOther
+      workSearch,
+      detailDialog,
+      applyForSpare,
+      declarationDialog,
+      redeployOther,
+      addDialog
     },
     data() {
-        return {
-            workOrderStatus: [
-                { code: 0, label: '待接收' },
-                { code: 1, label: '执行中' },
-                { code: 2, label: '已完成' },
-                { code: 3, label: '已验收' },
-            ],
-            resultStatus: [
-                { code: 5, label: '未修复' },
-                { code: 4, label: '已修复' }
-            ],
-            // 表格列配置
-            columns: [
-                {
-                    columnKey: 'index',
-                    label: '序号',
-                    type: 'index',
-                    width: 55,
-                    align: 'center',
-                    showOverflowTooltip: true,
-                    fixed: 'left'
-                },
-                {
-                    prop: 'code',
-                    slot: 'code',
-                    label: '工单编号',
-                    align: 'center',
-                    showOverflowTooltip: true,
-                    minWidth: 150
-                },
-                {
-                    prop: 'planCode',
-                    label: '计划单号',
-                    align: 'center',
-                    showOverflowTooltip: true,
-                    minWidth: 110
-                },
-                {
-                    prop: 'planName',
-                    label: '计划名称',
-                    align: 'center',
-                    showOverflowTooltip: true,
-                    minWidth: 110
-                },
-                {
-                    prop: 'executeUserName',
-                    label: '执行人',
-                    align: 'center',
-                    showOverflowTooltip: true,
-                    minWidth: 110
-                },
-                // {
-                //     prop: 'assistsName',
-                //     label: '辅助人',
-                //     align: 'center',
-                //     showOverflowTooltip: true,
-                //     minWidth: 110
-                // },
+      return {
+        visibleCheckAndAccept: false,
+        form: {
+          accepterUserId: '',
+          accepterUserName: '',
+          accepterRemark: ''
+        },
+        contactInfoVOS: [],
+        workOrderStatus: [
+          { code: 0, label: '待接收' },
+          { code: 1, label: '已接收' },
+          { code: 2, label: '执行中' },
+          { code: 3, label: '待验收' },
+          { code: 4, label: '待评价' },
+          { code: 5, label: '已完成' },
+          { code: 6, label: '验收不通过' },
+        ],
+        resultStatus: [
+          { code: 5, label: '未修复' },
+          { code: 4, label: '已修复' }
+        ],
+        // 表格列配置
+        columns: [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true,
+            fixed: 'left'
+          },
+          {
+            prop: 'code',
+            slot: 'code',
+            label: '工单编号',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 150
+          },
+          {
+            prop: 'planCode',
+            label: '计划单号',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'planName',
+            label: '计划名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'executeUserName',
+            label: '报工人',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'accepterUserName',
+            label: '验收人',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'accepterTime',
+            label: '验收时间',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+
+          // {
+          //     prop: 'assistsName',
+          //     label: '辅助人',
+          //     align: 'center',
+          //     showOverflowTooltip: true,
+          //     minWidth: 110
+          // },
 
-                {
-                    prop: 'acceptTime',
-                    label: '开始时间',
-                    align: 'center',
-                    showOverflowTooltip: true,
-                    minWidth: 110
-                },
-                {
-                    prop: 'finishTime',
-                    label: '结束时间',
-                    align: 'center',
-                    showOverflowTooltip: true,
-                    minWidth: 110
-                },
-                {
-                    prop: 'planFinishTime',
-                    label: '计划完成时间',
-                    align: 'center',
-                    showOverflowTooltip: true,
-                    minWidth: 110
-                },
-                {
-                    columnKey: 'inFactDuration',
-                    label: '实际售后时长(分钟)',
-                    align: 'center',
-                    resizable: false,
-                    showOverflowTooltip: true,
-                    minWidth: 120,
-                    formatter: (row) => {
-                        if (row.finishTime && row.acceptTime) {
-                            return parseInt(
-                                (new Date(row.finishTime).getTime() -
-                                    new Date(row.acceptTime).getTime()) /
-                                60000
-                            );
-                        }
-                    }
-                },
-                {
-                    prop: 'orderStatus',
-                    label: '状态',
-                    align: 'center',
-                    showOverflowTooltip: true,
-                    formatter: (row) => {
-                        return this.workOrderStatus.filter(
-                            (item) => item.code == row.orderStatus
-                        )[0].label;
-                    }
-                },
-                // {
-                //     prop: 'acceptanceStatus',
-                //     label: '执行结果',
-                //     align: 'center',
-                //     showOverflowTooltip: true,
-                //     formatter: (row) => {
-                //         return row.acceptanceStatus
-                //             ? resultStatus.filter(
-                //                 (item) => item.code == row.acceptanceStatus
-                //             )[0].label
-                //             : '';
-                //     }
-                // },
-                {
-                    columnKey: 'action',
-                    label: '操作',
-                    width: 240,
-                    align: 'center',
-                    resizable: false,
-                    slot: 'action',
-                    showOverflowTooltip: true
-                }
-            ],
-            // 加载状态
-            loading: false,
-        };
+          {
+            prop: 'acceptTime',
+            label: '开始时间',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'finishTime',
+            label: '结束时间',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'planFinishTime',
+            label: '计划完成时间',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            columnKey: 'inFactDuration',
+            label: '实际售后时长(分钟)',
+            align: 'center',
+            resizable: false,
+            showOverflowTooltip: true,
+            minWidth: 120,
+            formatter: (row) => {
+              if (row.finishTime && row.acceptTime) {
+                return parseInt(
+                  (new Date(row.finishTime).getTime() -
+                    new Date(row.acceptTime).getTime()) /
+                    60000
+                );
+              }
+            }
+          },
+          {
+            prop: 'orderStatus',
+            label: '状态',
+            align: 'center',
+            showOverflowTooltip: true,
+            formatter: (row) => {
+              return this.workOrderStatus.find(
+                (item) => item.code == row.orderStatus
+              )?.label;
+            }
+          },
+
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 240,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true
+          }
+        ],
+        // 加载状态
+        loading: false,
+        row: {}
+      };
     },
     computed: {},
-    created() {
-    },
+    created() {},
     methods: {
-        /* 表格数据源 */
-        datasource({ page, limit, where, order }) {
-            return getSalesWorkOrder({ pageNum: page, size: limit, ...where });
-        },
-        /* 刷新表格 */
-        reload(where) {
-            this.$refs.table.reload({ page: 1, where });
-        },
-        async cancel(row) {
-            const res = await deleteSalesWorkOrder([row.id]);
-            if (res) {
-                this.$message.success('删除成功');
-                this.reload();
-            }
-        },
-        addSpareItems(row) {
-            let data = JSON.parse(JSON.stringify(row));
-            this.$refs.edit.open(data, 'work');
-        },
-        //接收
-        async handleReceive(row) {
-            const res = await receiveSalesWorkOrder(row)
-            if (!res) return
-            this.$message.success('操作成功')
-            this.reload()
-        },
-        // 转派
-        toRedeploy(row) {
-            this.$refs.redeployOtherRef.open(row, 'transfer');
-        },
-        //报工
-        declarationForm(row) {
-            this.$refs.declarationDialogRef.open(row)
-        },
-        goDetail(row) {
-            this.$refs.declarationDialogRef.open(row,'view');
-        },
-        handleCommand(command, row) {
-            if (command === 'addSpareItems') {
-                this.addSpareItems(row);
-            }
-            if (command === 'handleReceive') {
-                this.handleReceive(row);
-            }
-            if (command === 'toRedeploy') {
-                this.toRedeploy(row);
-            }
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return getSalesWorkOrder({ pageNum: page, size: limit, ...where });
+      },
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where });
+      },
+      async cancel(row) {
+        const res = await deleteSalesWorkOrder([row.id]);
+        if (res) {
+          this.$message.success('删除成功');
+          this.reload();
+        }
+      },
+      async addSpareItems(row) {
+        let data = await getSalesWorkOrderById(row.id);
+
+        this.$refs.edit.open(
+          {
+            receivingDeptName: data.executeGroupName,
+            receivingDeptId: data.executeGroupId,
+            recipientName: data.executeUserName,
+            recipientId: data.executeUserId,
+            name: data.name,
+            id: data.id,
+            details: data.costListVOS.filter((item) => {
+              if (item.typeId == 2 && item.isApply != 1) {
+                item.totalPrice = item.settlementPrice;
+                item.categoryCode = item.code;
+                item.categoryName = item.name;
+
+                return item;
+              }
+            })
+          },
+          'work'
+        );
+      },
+      //接收
+      async handleReceive(row) {
+        const res = await receiveSalesWorkOrder(row);
+        if (!res) return;
+        this.$message.success('操作成功');
+        this.reload();
+      },
+      //验收
+      async checkAndAccept(accepterStatus) {
+        if (!this.form.accepterUserId) {
+          this.$message.warning('请选择验收人!');
+          return;
+        }
+        const res = await checkAndAccept({
+          id: this.row.id,
+          ...this.form,
+          accepterStatus
+        });
+        if (!res) return;
+        this.$message.success('操作成功');
+        this.visibleCheckAndAccept = false;
+        this.reload();
+      },
+      accepterUserChange(item) {
+        this.form.accepterUserName = item.contactName;
+      },
+
+      // 转派
+      toRedeploy(row) {
+        this.$refs.redeployOtherRef.open(row, 'transfer');
+      },
+      //报工
+      declarationForm(row, type) {
+        this.$refs.declarationDialogRef.open(row, type);
+      },
+      goDetail(row) {
+        this.$refs.declarationDialogRef.open(row, 'view');
+      },
+      async handleCommand(command, row) {
+        if (command === 'addSpareItems') {
+          this.addSpareItems(row);
+        }
+        if (command === 'handleReceive') {
+          this.handleReceive(row);
+        }
+        if (command === 'toRedeploy') {
+          this.toRedeploy(row);
+        }
+        if (command == 'evaluate') {
+          this.$refs.addDialogRef.open(row, 'add');
+        }
+        if (command == 'checkAndAccept') {
+          this.visibleCheckAndAccept = true;
+          this.form = {
+            accepterUserId: '',
+            accepterUserName: '',
+            accepterRemark: ''
+          };
+          const { afterSalesDemandVO } = await getSalesWorkOrderById(row.id);
+          this.contactInfoVOS = afterSalesDemandVO.contactInfoVOS || [];
+          this.row = row;
         }
+      }
     }
-};
+  };
 </script>
 
 <style lang="scss" scoped>
-.el-dropdown-link {
+  .el-dropdown-link {
     cursor: pointer;
     color: var(--color-primary-5);
-}
+  }
 
-.el-icon-arrow-down {
+  .el-icon-arrow-down {
     font-size: 12px;
-}
-</style>
+  }
+</style>