Explorar o código

故障知识库列表 对接数据

8521520123jsy hai 1 ano
pai
achega
c6750c6b81

+ 26 - 3
src/api/salesServiceManagement/index.js

@@ -275,9 +275,32 @@ export async function knowledgePage(data) {
 
 // 故障知识库 表格 新增
 export async function faultKnowledgeSave(data) {
-  const res = await request.post('/eom/faultKnowledgeBase/saveBatch', {
-    data: data
-  });
+  const res = await request.post('/eom/faultKnowledgeBase/saveBatch',
+    data
+  );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+
+// 故障知识库 表格 修改
+export async function faultKnowledgeUpdate(data) {
+  const res = await request.put('/eom/faultKnowledgeBase/update',
+    data
+  );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 故障知识库 表格 删除
+export async function faultDelete(data) {
+  const res = await request.delete('/eom/faultKnowledgeBase/delete',
+    { data }
+  );
   if (res.data.code == 0) {
     return res.data.data;
   }

+ 211 - 4
src/views/salesServiceManagement/accessory/components/accessoryDialog.vue

@@ -10,24 +10,170 @@
     append-to-body
     @close="handleClose"
   >
-  <el-form ref="form">
-
-  </el-form>
+    <el-form ref="accessoryFormRef" :model="form" label-width="100px">
+      <headerTitle title="基本信息" style="margin-top: 15px"></headerTitle>
+      <el-row>
+        <el-col :span="6">
+          <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="name"
+            :rules="{
+            required: true,
+            message: '请选择工单',
+            trigger: 'change'
+          }"
+          >
+            <el-input v-model="form.name" readonly @click.native="handHead" placeholder="请选择" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item
+            label="领用部门"
+            prop="receivingDeptId"
+            :rules="{
+              required: true,
+              message: '请输入领用部门',
+              trigger: 'change'
+            }"
+          >
+            <el-select
+              style="width: 100%;"
+              v-model="form.receivingDeptId"
+              disabled
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in loginChangeGroupVOList"
+                :key="item.groupId"
+                :label="item.groupName"
+                :value="item.groupId"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item
+            label="领用人"
+            prop="recipientId"
+            :rules="{
+              required: true,
+              message: '请输入领用人',
+              trigger: 'change'
+            }"
+          >
+            <el-select style="width: 100%;" v-model="form.recipientId" disabled placeholder="请选择">
+              <el-option
+                v-for="item in loginChangeRoleVOList"
+                :key="item.roleId"
+                :label="item.roleName"
+                :value="item.roleId"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="6">
+          <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="6">
+          <el-form-item
+            label="使用部门"
+            prop="useDeptId"
+            :rules="{
+              required: true,
+              message: '请选择部门',
+              trigger: 'change'
+            }"
+          >
+            <deptSelect v-model="form.useDeptId" @changeGroup="searchDeptNodeClick" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item
+            label="使用人"
+            prop="userId"
+            :rules="{
+              required: true,
+              message: '请选择使用人',
+              trigger: 'change'
+            }"
+          >
+            <el-select
+              v-model="form.userId"
+              size="small"
+              style="width: 100%"
+              filterable
+              @change="changeUser"
+            >
+              <el-option
+                v-for="item in executorList"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="用途:" prop="purpose">
+            <el-input v-model="form.purpose" type="textarea" :rows="2" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <!-- 配件信息 -->
+      <spareInfo ref="spareInfoRef" />
+    </el-form>
+    <workOrderList ref="workOrderListRef" @changeSelect="changeSelect" />
+    <div slot="footer" class="footer">
+      <el-button type="primary" @click="save">保存</el-button>
+      <el-button @click="handleClose">取消</el-button>
+    </div>
   </ele-modal>
 </template>
 
 <script>
+import deptSelect from '@/components/CommomSelect/dept-select.vue';
+import workOrderList from './workOrderList.vue';
+import spareInfo from './spareInfo.vue';
+import { getUserPage } from '@/api/system/organization';
 export default {
   data() {
     return {
       title: '新增',
       addRepairNotesDialog: false,
       type: 'add',
-      form: {}
+      form: {},
+      loginChangeRoleVOList: [],
+      executorList: [] // 执行人列表
     };
   },
+  components: { workOrderList, spareInfo, deptSelect },
+  computed: {
+    // 部门下拉
+    loginChangeGroupVOList() {
+      return this.$store.state.user?.info?.loginChangeGroupVOList;
+    }
+  },
   methods: {
     init(row, type) {
+      let currentUser = JSON.parse(sessionStorage['currentUser']);
+      this.form.receivingDeptId = currentUser.currentGroupId; // 部门id
+      this.form.recipientId = currentUser.currentRoleId; // 领用人Id
+      this.roleVOListData();
       this.addRepairNotesDialog = true;
       this.type = type;
       this.title = type == 'add' ? '新增' : type == 'view' ? '详情' : '修改';
@@ -35,7 +181,68 @@ export default {
         this.getDetail(row.id);
       }
     },
+    // 选择工单
+    handHead() {
+      if (this.type != 'view') {
+        this.$refs.workOrderListRef.open();
+      }
+    },
+    // 确认选择工单
+    changeSelect(row) {
+      this.$set(this.form, 'name', row.name);
+      this.form.repairId = row.id;
+    },
+    // 角色下拉
+    roleVOListData() {
+      let arr = this.loginChangeGroupVOList.find((item) => {
+        return item.groupId == this.form.receivingDeptId;
+      })?.loginChangeRoleVOList;
+      this.loginChangeRoleVOList = arr;
+    },
+    //选择部门(搜索)
+    searchDeptNodeClick(info, data) {
+      if (info) {
+        // 根据部门获取人员
+        this.form.useDeptName = data.name;
+        const params = { groupId: info };
+        this.getUserList(params);
+        this.$set(this.form, 'userName', '');
+        this.$set(this.form, 'userId', '');
+      } else {
+        this.form.useDeptId = null;
+      }
+    },
+    // 获取审核人列表、巡点检人员
+    async getUserList(params) {
+      try {
+        let data = { pageNum: 1, size: -1 };
+        // 如果传了参数就是获取巡点检人员数据
+        if (params) {
+          data = Object.assign(data, params);
+        }
+        const res = await getUserPage(data);
+        if (params) {
+          this.executorList = res.list;
+        }
+      } catch (error) {}
+    },
+    // 选择使用人
+    changeUser(val) {
+      this.executorList.map((item) => {
+        if (item.id == val) {
+          this.form.userName = item.name;
+        }
+      });
+    },
     getDetail(id) {},
+    save() {
+      this.$refs.accessoryFormRef.validate(async (valid) => {
+        if (valid) {
+
+          console.log(this.form,'00000');
+        }
+      });
+    },
     handleClose() {
       this.addRepairNotesDialog = false;
       this.form = {};

+ 186 - 0
src/views/salesServiceManagement/accessory/components/spareInfo.vue

@@ -0,0 +1,186 @@
+<template>
+  <el-form ref="spareInfoRef">
+    <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">
+          <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"
+        />
+      </template>
+      <template v-slot:singlePrice="{ row, $index }">
+        <el-input
+          type="number"
+          placeholder="请输入"
+          v-model="row.singlePrice"
+          @input="handleInput(row, $index)"
+          min="0"
+        />
+      </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>
+    <AssetsDialog ref="selectStockLedgerDialogRef" :assetType="6" @choose="confirmChoose"></AssetsDialog>
+  </el-form>
+</template>
+
+<script>
+import AssetsDialog from '../../components/AssetsDialog.vue';
+export default {
+  components: {
+    AssetsDialog
+  },
+  data() {
+    return {
+      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: '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,
+        }
+      ]
+    };
+  },
+  methods: {
+    // 出库数量限制
+    handleInput(row, index) {
+      if (row.singlePrice == 0) {
+        this.$set(this.tableList[index], 'totalPrice', 0);
+      } else {
+        this.$set(
+          this.tableList[index],
+          'totalPrice',
+          Number(row.singlePrice) * Number(row.totalCount)
+        );
+      }
+    },
+    del(id) {
+      this.tableList = this.tableList.filter((item) => item.id != id);
+    },
+    addEquipment() {
+      this.$refs.selectStockLedgerDialogRef.open(this.tableList);
+    },
+    confirmChoose(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>
+.add-product {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  // justify-content: flex-end;
+  font-size: 30px;
+  color: #1890ff;
+  margin: 10px 0;
+  cursor: pointer;
+}
+</style>

+ 227 - 0
src/views/salesServiceManagement/accessory/components/workOrderList.vue

@@ -0,0 +1,227 @@
+<template>
+  <el-dialog
+    title="选择工单"
+    custom-class="ele-dialog-form long-dialog-form"
+    :visible.sync="visible"
+    :before-close="handleClose"
+    :close-on-click-modal="false"
+    top="5vh"
+    :close-on-press-escape="false"
+    append-to-body
+    width="70%"
+  >
+    <el-card shadow="never">
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="datasource"
+        row-key="id"
+        height="calc(100vh - 460px)"
+        class="dict-table"
+        @cell-click="cellClick"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:action="{ row }">
+          <el-radio class="radio" v-model="radio" :label="row.id">
+            <i></i>
+          </el-radio>
+        </template>
+      </ele-pro-table>
+    </el-card>
+
+    <div slot="footer">
+      <el-button type="primary" size="small" @click="selected">选择</el-button>
+      <el-button size="small" @click="handleClose">关闭</el-button>
+    </div>
+  </el-dialog>
+</template>
+  
+  <script>
+import { getSalesWorkOrder } from '@/api/salesServiceManagement/index';
+import workSearch from '../../workOrder/components/work-search.vue';
+// import AssetTree from '@/components/AssetTree';
+
+export default {
+  components: {
+    workSearch
+    // AssetTree
+  },
+  props: {
+    classType: {
+      type: Number | String,
+      default: 1
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      workOrderStatus: [
+        { code: 0, label: '待接收' },
+        { code: 1, label: '已接收' },
+        { code: 2, label: '执行中' },
+        { code: 3, label: '待验收' },
+        { code: 4, label: '待评价' },
+        { code: 5, label: '已完成' },
+        { code: 6, label: '验收不通过' }
+      ],
+      columns: [
+        {
+          action: 'action',
+          slot: 'action',
+          align: 'center',
+          label: '选择'
+        },
+        {
+          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: '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;
+          }
+        }
+      ],
+      radio: null
+    };
+  },
+
+  watch: {},
+  methods: {
+    open(item) {
+      if (item) {
+        this.radio = item.id;
+      }
+      this.visible = true;
+    },
+
+    /* 表格数据源 */
+    datasource({ page, limit, where, order }) {
+      return getSalesWorkOrder({
+        pageNum: page,
+        size: limit,
+        ...where
+      });
+    },
+
+    /* 刷新表格 */
+    reload(where) {
+      this.$refs.table.reload({ page: 1, where });
+    },
+
+    // 单击获取id
+    cellClick(row) {
+      this.current = row;
+      this.radio = row.id;
+    },
+    handleClose() {
+      this.visible = false;
+      this.current = null;
+      this.radio = '';
+    },
+
+    selected() {
+      if (!this.current) {
+        return this.$message.warning('请选择工单');
+      }
+      this.$emit('changeSelect', this.current);
+      this.handleClose();
+    }
+  }
+};
+</script>
+  
+  <style lang="scss" scoped>
+</style>
+  

+ 12 - 2
src/views/salesServiceManagement/accessory/index.vue

@@ -10,6 +10,16 @@
         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')"
+          >新建</el-button>
+        </template>
         <template v-slot:action="{ row }">
           <el-link type="primary" :underline="false" @click="openEdit(row, 'view')">详情</el-link>
         </template>
@@ -22,11 +32,11 @@
   
   <script>
 // import search from './components/search.vue';
-import accessoryDialog from './components/accessoryDialog.vue'
+import accessoryDialog from './components/accessoryDialog.vue';
 import { accessoryPage } from '@/api/salesServiceManagement/index';
 // import dictMixins from '@/mixins/dictMixins';
 export default {
-//   mixins: [dictMixins],
+  //   mixins: [dictMixins],
   components: {
     // search
     accessoryDialog

+ 222 - 243
src/views/salesServiceManagement/components/applyForSpare.vue

@@ -7,36 +7,30 @@
     @close="handleCancel"
     :maxable="true"
   >
-    <el-form
-      ref="form"
-      :model="form"
-      :rules="rules"
-      label-width="100px"
-      class="create-form"
-    >
+    <el-form ref="form" :model="form" :rules="rules" label-width="90px" 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-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
           <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-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
           <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-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
           <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-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
           <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-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
           <el-form-item label="使用时间:" prop="usageTime">
             <el-date-picker
               style="width: 100%"
@@ -44,29 +38,28 @@
               type="date"
               placeholder="选择"
               value-format="yyyy-MM-dd"
-            >
-            </el-date-picker>
+            ></el-date-picker>
           </el-form-item>
         </el-col>
-        <el-col :span="8">
+        <el-col :span="6">
           <el-form-item label="使用部门" prop="useDeptName">
             <el-input v-model="form.useDeptName" />
           </el-form-item>
         </el-col>
-        <el-col :span="8">
+        <el-col :span="6">
           <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-col v-bind="styleResponsive ? { lg: 6, md: 24 } : { span: 6 }">
           <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"
@@ -103,15 +96,9 @@
           />
         </template>
         <template v-slot:action="{ row }">
-          <el-popconfirm
-            class="ele-action"
-            title="确定要删除吗?"
-            @confirm="del(row.id)"
-          >
+          <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>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">删除</el-link>
             </template>
           </el-popconfirm>
         </template>
@@ -120,247 +107,239 @@
 
     <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>
+      <el-button type="primary" @click="save" :loading="loading">提交</el-button>
     </template>
-    <AssetsDialog
-      ref="selectStockLedgerDialogRef"
-      :assetType="6"
-      @choose="confirmChoose"
-    >
-    </AssetsDialog>
+    <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 {
-    components: {
-      AssetsDialog
-    },
-    props: {
-      inlet: {
-        type: Number,
-        default: null
-      }
-    },
-    data() {
-      return {
-        visible: false,
-        loading: false,
-        title: '备品备件申请单',
-        type: '',
-        executorList: [],
-        form: {
-          code: '',
-          name: '',
-          receivingDeptName: '',
-          recipientName: '',
-          usageTime: '',
-          useDeptName: '',
-          userName: '',
-          purpose: ''
+export default {
+  components: {
+    AssetsDialog
+  },
+  props: {
+    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'
         },
-        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: '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: '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;
+  computed: {
+    // 是否开启响应式布局
+    styleResponsive() {
+      return this.$store.state.theme.styleResponsive;
+    }
+  },
+  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)
+        );
       }
     },
-    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);
-      },
 
-      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 || {};
 
-        this.tableList = row.details || [];
-      },
-      del(id) {
-        this.tableList = this.tableList.filter((item) => item.id != id);
-      },
-      handleCancel() {
-        this.tableList = [];
-        this.form = {};
-        this.visible = false;
-      },
-      addEquipment() {
-        this.$refs.selectStockLedgerDialogRef.open(this.tableList);
-      },
-      /* 保存编辑 */
-      async save() {
-        this.loading = true;
+      this.tableList = row.details || [];
+    },
+    del(id) {
+      this.tableList = this.tableList.filter((item) => item.id != id);
+    },
+    handleCancel() {
+      this.tableList = [];
+      this.form = {};
+      this.visible = false;
+    },
+    addEquipment() {
+      this.$refs.selectStockLedgerDialogRef.open(this.tableList);
+    },
+    /* 保存编辑 */
+    async save() {
+      this.loading = true;
 
-        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));
-      }
+      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 {
-    margin: 10px 0;
-  }
+.basic-details-title {
+  margin: 10px 0;
+}
 
-  .title {
-    font-size: 16px;
-    line-height: 45px;
-  }
+.title {
+  font-size: 16px;
+  line-height: 45px;
+}
 
-  .add-product {
-    width: 100%;
-    display: flex;
-    align-items: center;
-    // justify-content: flex-end;
-    font-size: 30px;
-    color: #1890ff;
-    margin: 10px 0;
-    cursor: pointer;
-  }
+.add-product {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  // justify-content: flex-end;
+  font-size: 30px;
+  color: #1890ff;
+  margin: 10px 0;
+  cursor: pointer;
+}
 </style>

+ 174 - 0
src/views/salesServiceManagement/knowledge/components/editDialog.vue

@@ -0,0 +1,174 @@
+<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"
+  >
+    <el-form ref="editFormRef" :model="editForm" label-width="100px">
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="编码">
+            <el-input v-model="editForm.code" disabled></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item
+            label="故障类型"
+            prop="type"
+            :rules="{
+              required: true,
+              message: '请选择故障类型',
+              trigger: 'change'
+            }"
+          >
+            <el-select
+              style="width: 100%;"
+              v-model="editForm.type"
+              :disabled="type == 'view'"
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in typeOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item
+            label="故障现象"
+            prop="faultPhenomenon"
+            :rules="{
+              required: true,
+              message: '请输入故障现象',
+              trigger: 'change'
+            }"
+          >
+            <el-input
+              v-model="editForm.faultPhenomenon"
+              size="small"
+              placeholder="请输入"
+              :disabled="type == 'view'"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="8">
+          <el-form-item
+            label="故障原因"
+            prop="faultReason"
+            :rules="{
+              required: true,
+              message: '请输入故障原因',
+              trigger: 'change'
+            }"
+          >
+            <el-input
+              v-model="editForm.faultReason"
+              size="small"
+              placeholder="请输入"
+              :disabled="type == 'view'"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item
+            label="维修过程"
+            prop="maintenanceProcess"
+            :rules="{
+              required: true,
+              message: '请输入维修过程',
+              trigger: 'change'
+            }"
+          >
+            <el-input
+              v-model="editForm.maintenanceProcess"
+              size="small"
+              placeholder="请输入"
+              :disabled="type == 'view'"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="附件">
+            <fileMain :type="type == 'view' ? 'view' : ''" v-model="editForm.attachments"></fileMain>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template v-slot:footer>
+      <el-button @click="handleClose">取消</el-button>
+      <el-button type="primary" v-if="type == 'edit'" @click="save" :loading="loading">确认</el-button>
+    </template>
+  </ele-modal>
+</template>
+  
+  <script>
+import { faultKnowledgeUpdate } from '@/api/salesServiceManagement/index';
+import fileMain from '@/components/addDoc/index.vue';
+export default {
+  props: {
+    typeOptions: {
+      type: Array,
+      default: () => []
+    }
+  },
+  components: { fileMain },
+  data() {
+    return {
+      loading: false,
+      title: '修改',
+      editRepairNotesDialog: false,
+      type: 'edit',
+      editForm: {}
+    };
+  },
+  methods: {
+    init(row, type) {
+      this.editRepairNotesDialog = true;
+      this.type = type;
+      this.title = type == 'edit' ? '修改' : '详情';
+      this.editForm = {
+        code: row.code,
+        type: String(row.type),
+        faultPhenomenon: row.faultPhenomenon,
+        faultReason: row.faultReason,
+        maintenanceProcess: row.maintenanceProcess,
+        attachments: row.attachments,
+        id: row.id
+      };
+    },
+    handleClose() {
+      this.editRepairNotesDialog = false;
+      this.editForm = {};
+      this.$refs.editFormRef.clearValidate();
+    },
+    save() {
+      this.$refs.editFormRef.validate(async (valid) => {
+        if (valid) {
+          let data = JSON.parse(JSON.stringify(this.editForm));
+          delete data.code;
+          const res = await faultKnowledgeUpdate(data);
+          if (res) {
+            this.$message.success('操作成功');
+            this.handleClose();
+            this.$emit('refresh');
+          }
+        }
+      });
+    }
+  }
+};
+</script>
+  
+  <style>
+</style>

+ 102 - 27
src/views/salesServiceManagement/knowledge/components/knowledeDialog.vue

@@ -10,16 +10,98 @@
     append-to-body
     @close="handleClose"
   >
-    <el-form ref="form" :model="form" :rules="rules" class="create-form">
+    <el-form ref="form" :model="form" class="create-form">
       <ele-pro-table
+        ref="tableRef"
         :columns="faultList"
-        :datasource="issuesListData"
+        :datasource="form.issuesListData"
         :need-page="false"
+        :initLoad="false"
         maxHeight="600px"
         class="el-form-box"
         :toolkit="[]"
       >
-     
+        <template v-slot:toolbar>
+          <el-button type="primary" @click="addfault">添加</el-button>
+        </template>
+        <template v-slot:headerType="{ column }">
+          <span class="is-required">{{ column.label }}</span>
+        </template>
+        <template v-slot:headerPhenomenon="{ column }">
+          <span class="is-required">{{ column.label }}</span>
+        </template>
+        <template v-slot:headerMaintenance="{ column }">
+          <span class="is-required">{{ column.label }}</span>
+        </template>
+        <template v-slot:headerFaultReason="{ column }">
+          <span class="is-required">{{ column.label }}</span>
+        </template>
+        <template v-slot:type="{ row,$index }">
+          <el-form-item
+            :prop="`issuesListData.${$index}.type`"
+            :rules="{
+                required: true,
+                message: '请选择故障类型',
+                trigger: 'change'
+              }"
+          >
+            <el-select v-model="row.type" :placeholder="`请选择`">
+              <el-option
+                v-for="item in typeOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </template>
+        <template v-slot:faultPhenomenon="{ row,$index }">
+          <el-form-item
+            :prop="`issuesListData.${$index}.faultPhenomenon`"
+            :rules="{
+                  required: true,
+                  message: '请输入故障现象',
+                  trigger: 'change'
+                }"
+          >
+            <el-input v-model="row.faultPhenomenon" placeholder="请输入"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:faultReason="{ row,$index }">
+          <el-form-item
+            :prop="`issuesListData.${$index}.faultReason`"
+            :rules="{
+                  required: true,
+                  message: '请输入故障原因',
+                  trigger: 'change'
+                }"
+          >
+            <el-input v-model="row.faultReason" placeholder="请输入"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:maintenanceProcess="{ row,$index }">
+          <el-form-item
+            :prop="`issuesListData.${$index}.maintenanceProcess`"
+            :rules="{
+                  required: true,
+                  message: '请输入维修过程',
+                  trigger: 'change'
+                }"
+          >
+            <el-input v-model="row.maintenanceProcess" placeholder="请输入"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:attachments="{ row }">
+          <fileMain v-model="row.attachments"></fileMain>
+        </template>
+
+        <template v-slot:action="{ row,$index }">
+          <el-popconfirm class="ele-action" title="确定要删除当前故障吗?" @confirm="delSon(row,$index)">
+            <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>
@@ -39,9 +121,8 @@ export default {
       title: '新增',
       loading: false,
       addRepairNotesDialog: false,
-      type: 'add',
-      form: {},
-      issuesListData: [],
+      form: { issuesListData: [] },
+      //   issuesListData: [],
       rules: {},
       typeOptions: [
         { label: '维修', value: '1' },
@@ -112,47 +193,41 @@ export default {
     }
   },
   methods: {
-    init(row, type) {
+    init() {
       this.addRepairNotesDialog = true;
-      this.type = type;
-      this.title = type == 'add' ? '新增' : type == 'view' ? '详情' : '修改';
-      if (row?.id) {
-        this.getDetail(row.id);
-      }
     },
     // 增加
     addfault() {
-      this.issuesListData.push({
+      this.form.issuesListData.push({
         maintenanceProcess: '',
         type: '',
         faultPhenomenon: ''
       });
     },
-    // 详情
-    getDetail(id) {},
-
     // 删除
     delSon(data, index) {
-      this.issuesListData.splice(index, 1);
+      this.form.issuesListData.splice(index, 1);
     },
     // 取消
     handleClose() {
       this.addRepairNotesDialog = false;
-      this.issuesListData = [];
+      this.form.issuesListData = [];
     },
 
     // 保存
     async save() {
-        console.log(this.$refs.form,'222222222')
-      let valid = this.$refs.form.getValidate();
-      console.log(valid,'valid')  
-      return
-      const res = await faultKnowledgeSave(this.issuesListData);
-      if (res) {
-        this.$message.success('操作成功!');
-        this.$emit('success');
-        this.handleClose();
+      if (this.form.issuesListData.length == 0) {
+        this.$message.warning('请最少添加一条故障数据');
+        return;
       }
+      let valid = await this.getValidate();
+      faultKnowledgeSave(this.form.issuesListData).then((res) => {
+        if (res) {
+          this.$message.success('操作成功!');
+          this.$emit('refresh');
+          this.handleClose();
+        }
+      });
     },
     getValidate() {
       return new Promise((resolve, reject) => {

+ 43 - 7
src/views/salesServiceManagement/knowledge/index.vue

@@ -17,28 +17,49 @@
             type="primary"
             icon="el-icon-plus"
             class="ele-btn-icon"
-            @click="openEdit('', 'add')"
+            @click="openAdd('', 'add')"
           >新建</el-button>
         </template>
+        <template v-slot:attachments="{row}">
+          <fileMain type="view" v-model="row.attachments"></fileMain>
+        </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" :underline="false" @click="openEdit(row, 'view')">详情</el-link>
+          <el-link
+            v-if="!row.workId"
+            type="primary"
+            :underline="false"
+            @click="openEdit(row, 'edit')"
+          >修改</el-link>
+          <el-popconfirm class="ele-action" title="确定要删除当前故障吗?" @confirm="deleteFault(row)">
+            <template v-slot:reference>
+              <el-link v-if="!row.workId" type="danger" icon="el-icon-delete" :underline="false">删除</el-link>
+            </template>
+          </el-popconfirm>
         </template>
       </ele-pro-table>
     </el-card>
     <!-- 新建或编辑弹窗 -->
     <knowledeDialog ref="knowledeDialog" @refresh="reload" />
+    <EditDialog ref="editDialog" @refresh="reload" :typeOptions="typeOptions" />
   </div>
 </template>
 <script>
 // import search from './components/search.vue';
-import { knowledgePage } from '@/api/salesServiceManagement/index';
+import { knowledgePage, faultDelete } from '@/api/salesServiceManagement/index';
 import knowledeDialog from './components/knowledeDialog.vue';
+import EditDialog from './components/editDialog.vue';
+import fileMain from '@/components/addDoc/index.vue';
 // import dictMixins from '@/mixins/dictMixins';
 export default {
   //   mixins: [dictMixins],
   components: {
     // search
-    knowledeDialog
+    knowledeDialog,
+    EditDialog,
+    fileMain
   },
   data() {
     return {
@@ -99,9 +120,11 @@ export default {
           showOverflowTooltip: true
         },
         {
-          prop: 'code',
+          columnKey: 'attachments',
+          prop: 'attachments',
           label: '附件',
           align: 'center',
+          slot: 'attachments',
           showOverflowTooltip: true
         },
         {
@@ -127,9 +150,22 @@ export default {
       this.$refs.table.reload({ page: 1, where });
     },
 
-    // 打开详情
+    // 打开详情/修改
     openEdit(row, type) {
-      this.$refs.knowledeDialog.init(row, type);
+      this.$refs.editDialog.init(row, type);
+    },
+    // 打开新增
+    openAdd() {
+      this.$refs.knowledeDialog.init();
+    },
+    // 删除
+    deleteFault(row) {
+      faultDelete([row.id]).then((res) => {
+        if (res) {
+          this.$message.success('操作成功!');
+          this.reload();
+        }
+      });
     }
   }
 };

+ 1 - 3
src/views/salesServiceManagement/workOrder/index.vue

@@ -68,7 +68,7 @@
               <el-dropdown-item
                 command="addSpareItems"
                 v-if="row.orderStatus == 1 || row.orderStatus == 2"
-                >申请备品备
+                >申请
               </el-dropdown-item>
               <el-dropdown-item
                 command="checkAndAccept"
@@ -148,7 +148,6 @@
 
 <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';
@@ -344,7 +343,6 @@
       },
       async addSpareItems(row) {
         let data = await getSalesWorkOrderById(row.id);
-
         this.$refs.edit.open(
           {
             receivingDeptName: data.executeGroupName,