Parcourir la source

feat:质检中心,已质检列表完成对接;

zhangchong il y a 1 an
Parent
commit
7b7b2141ce

+ 32 - 0
src/api/quality/index.ts

@@ -26,4 +26,36 @@ export const qualityList = (params: object) => {
         method: 'get',
         params
     });
+};
+/**
+ * @description 更新质检
+ * @param {object}  data
+ */
+export const qualityUpdate = (data: object) => {
+    return request({
+        url: `/api/v1/Quality`,
+        method: 'put',
+        data
+    });
+};
+/**
+ * @description 删除质检
+ * @param {object}  data
+ */
+export const qualityDelete = (data: object) => {
+    return request({
+        url: `/api/v1/Quality`,
+        method: 'delete',
+        data
+    });
+};
+/**
+ * @description 查询质检实体
+ * @param id
+ */
+export const qualityDetail = (id: string) => {
+    return request({
+        url: `/api/v1/Quality/${id}`,
+        method: 'get'
+    });
 };

+ 2 - 1
src/utils/formatTime.ts

@@ -143,7 +143,8 @@ export function formatAxis(param: Date): string {
  * @description param 调用 `formatDuration(秒) 转换成xx:xx:xx的格式
  * @returns {string} 输出 即xx:xx:xx的格式;
  */
-export function formatDuration(time:any,showHour:boolean = true) : string{
+export function formatDuration(time:any,showHour:boolean = true){
+	if(!time) return '';
 	if(time > -1){
 		const hour = Math.floor(time / 3600);
 		const min = Math.floor(time / 60) % 60;

+ 362 - 0
src/views/quality/done/components/Quality-inspection.vue

@@ -0,0 +1,362 @@
+<template>
+  <el-dialog v-model="state.dialogVisible" :title="dialogTitle" draggable ref="dialogRef" width="50%" append-to-body destroy-on-close @close="close">
+    <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="110px">
+      <el-row :gutter="10">
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="工单编码:"> {{ state.orderDetail.no }} </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="来电号码:">
+            {{ state.orderDetail.fromPhone }}
+            <el-button
+                plain
+                title="录音文件"
+                size="small"
+                type="primary"
+                class="ml8"
+                @click="recordFile(state.orderDetail.callId)"
+                v-if="state.orderDetail.callId"
+            >录音文件</el-button
+            >
+          </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="受理人:">
+						<span
+            >{{ state.orderDetail.acceptorName }} <span v-if="state.orderDetail?.acceptorStaffNo">[{{ state.orderDetail?.acceptorStaffNo }}]</span>
+						</span></el-form-item
+          >
+        </el-col>
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="受理时间:"> {{ formatDate(state.orderDetail?.startTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+        </el-col>
+      </el-row>
+      <el-divider content-position="left"><span class="font16"> 质检内容</span></el-divider>
+      <div class="mt20 mb20">
+        <el-button type="primary" class="mb10" @click="onAddItem" v-if="!viewMode">新增扣分项</el-button>
+        <!-- 表格 -->
+        <el-table :data="tableData" border row-key="name">
+          <el-table-column label="扣分时间点" show-overflow-tooltip align="center">
+            <template #default="{ row }">
+              {{ formatDuration(row.second,false) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="name" label="扣分项" show-overflow-tooltip align="center"></el-table-column>
+          <el-table-column prop="content" label="扣分内容" show-overflow-tooltip align="center"></el-table-column>
+          <el-table-column prop="grade" label="分值(分)" show-overflow-tooltip align="center"></el-table-column>
+          <el-table-column label="操作" width="120" fixed="right" align="center" v-if="!viewMode">
+            <template #default="{ row }">
+              <el-button link type="primary" @click="onEditItem(row)"> 编辑 </el-button>
+              <el-button link type="primary" @click="onDeleteItem(row)"> 删除 </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <el-row :gutter="10">
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="总分:"> 100 分 </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="当前质检得分:"> {{ score }} </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <el-form-item label="质检评价:" prop="content" :rules="[{ required: true, message: '请输入质检评价', trigger: 'blur' }]">
+            <el-input
+                v-model="state.ruleForm.content"
+                placeholder="请输入质检评价"
+                clearable
+                type="textarea"
+                :autosize="{ minRows: 4, maxRows: 8 }"
+                :disabled="viewMode"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
+			<span class="dialog-footer" v-if="!viewMode">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" v-waves="'light'" :loading="state.loading">确 定 </el-button>
+			</span>
+    </template>
+  </el-dialog>
+  <el-dialog
+      v-model="state.dialogVisibleItem"
+      :title="dialogTitleItem"
+      draggable
+      ref="dialogItemRef"
+      width="600px"
+      append-to-body
+      destroy-on-close
+      @close="closeItem"
+  >
+    <el-form :model="state.ruleItemForm" ref="ruleItemFormRef" label-width="100px">
+      <el-form-item label="扣分时间点" prop="value" :rules="[{ required: true, message: '请输入扣分时间点', trigger: 'change' }]">
+        <el-time-picker
+            v-model="state.ruleItemForm.value"
+            placeholder="请选择扣分时间点"
+            @change="selectSecond"
+            value-format="mm:ss"
+            format="mm:ss"
+            :picker-options="{
+						selectableRange: '00:00:00 - 00:59:59',
+					}"
+            popper-class="noneMinute"
+        />
+      </el-form-item>
+      <el-form-item label="扣分项" prop="name" :rules="[{ required: true, message: '请选择扣分项', trigger: 'change' }]">
+        <el-select v-model="state.ruleItemForm.name" placeholder="请选择扣分项" class="w100" @change="changeProject">
+          <el-option v-for="item in projectArray" :key="item.id" :label="item.name" :value="item.name" :disabled="item.disabled" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="分值" prop="grade" :rules="[{ required: true, message: '请输入分值', trigger: 'blur' }]">
+        <el-input-number v-model="state.ruleItemForm.grade" :precision="0" :min="1" :max="100" placeholder="请输入分值" />
+        <span class="ml10">分</span>
+      </el-form-item>
+      <el-form-item label="扣分内容" prop="content" :rules="[{ required: true, message: '请输入扣分内容', trigger: 'blur' }]">
+        <el-input v-model="state.ruleItemForm.content" placeholder="请输入扣分内容" type="textarea" :autosize="{ minRows: 4, maxRows: 8 }"></el-input>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+			<span class="dialog-footer">
+				<el-button @click="state.dialogVisibleItem = false" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmitItem(ruleItemFormRef)" v-waves="'light'" :loading="state.loading">确 定 </el-button>
+			</span>
+    </template>
+  </el-dialog>
+</template>
+<script setup lang="ts" name="qualityInspection">
+import {computed, reactive, ref, watch} from 'vue';
+import {ElInput, ElMessage, ElMessageBox, FormInstance} from 'element-plus';
+import { formatDate, formatDuration } from '/@/utils/formatTime';
+import { projectList } from '/@/api/quality/project';
+import Other from '/@/utils/other';
+import { qualityUpdate,qualityDetail } from '/@/api/quality';
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+const state = reactive<any>({
+  dialogVisible: false, // 弹窗显示隐藏
+  ruleForm: {
+    name: '', // 违禁词
+    classify: '', // 违禁词分类
+    type: '', // 违禁词属性
+  },
+  loading: false, // 确定按钮loading
+  orderDetail: {},
+  dialogVisibleItem: false,
+  ruleItemForm: {
+    second: 0,
+    name: '', // 扣分时间点
+    grade: 1, // 分值
+    content: '', // 扣分内容
+  },
+  source:1,// 来源
+});
+const dialogTitle = ref<string>('查看受理质检');
+const dialogTitleItem = ref<string>('新增扣分项');
+const projectArray = ref<EmptyArrayType>([]); // 质检项数组
+const tableData = ref<EmptyArrayType>([]); // 表格数据
+const qualityId = ref<string>(''); // 质检ID
+const viewMode = ref<boolean>(false); // 是否查看
+// 打开弹窗
+const openDialog = async (row: any, source: string | number | undefined,isView?:boolean) => {
+  try {
+    const {result} = await qualityDetail(row.id);
+    state.ruleForm = result ?? {};
+    tableData.value = result.qualityDetails ?? [];
+    state.orderDetail = row.order ?? {};
+    qualityId.value = row.id;
+    state.source = source;
+    viewMode.value = isView ?? false;
+    const res = await projectList({ IsEnable: 1 });
+    projectArray.value = res.result?.items ?? [];
+    switch (source) {
+      case 1:
+        dialogTitle.value =  viewMode.value ? '查看受理质检' : '编辑受理质检';
+        break;
+      case 2:
+        dialogTitle.value =  viewMode.value ? '查看派单质检' : '编辑派单质检';
+        break;
+      case 3:
+        dialogTitle.value =  viewMode.value ? '查看回访质检' : '编辑回访质检';
+        break;
+    }
+    state.dialogVisible = true;
+  }catch (e) {
+    console.log(e)
+  }
+};
+// 计算当前得分
+const score = computed(() => {
+  let score = 0;
+  if (tableData.value.length) {
+    tableData.value.forEach((v: any) => {
+      score += v.grade;
+    });
+  }
+  return 100 - score;
+});
+watch(
+    () => score.value,
+    (newVal) => {
+      if(newVal<=0){
+        ElMessage.warning('质检得分不能小于0分');
+      }
+    },
+);
+// 关闭弹窗
+const closeDialog = () => {
+  state.dialogVisible = false;
+};
+const ruleFormRef = ref<FormInstance>();
+const close = () => {
+  ruleFormRef.value?.clearValidate();
+  ruleFormRef.value?.resetFields();
+};
+const closeItem = () => {
+  ruleItemFormRef.value?.clearValidate();
+  ruleItemFormRef.value?.resetFields();
+};
+// 查看录音文件
+const recordFile = (callId: string) => {
+  console.log(callId);
+};
+// 新增质检项内容
+const onAddItem = () => {
+  dialogTitleItem.value = '新增扣分项';
+  state.ruleItemForm = {
+    second: 0,
+    name: '', // 扣分时间点
+    grade: 1, // 分值
+    content: '', // 扣分内容
+  };
+  state.dialogVisibleItem = true;
+  getEnableAcceptType();
+};
+// 选择扣分项
+const changeProject = (val: any) => {
+  const item = projectArray.value.filter((v: any) => v.name === val)[0];
+  state.ruleItemForm.grade = item.grade;
+  state.ruleItemForm.content = item.describe;
+  getEnableAcceptType();
+};
+// 编辑质检内容
+const onEditItem = (row: any) => {
+  dialogTitleItem.value = '编辑扣分项';
+  state.ruleItemForm = Other.deepClone(row);
+  state.ruleItemForm.value = formatDuration(state.ruleItemForm.second,false);
+  state.dialogVisibleItem = true;
+  getEnableAcceptType();
+};
+// 分秒计算成秒
+const formatSecond = (val:string) => {
+  if(!val) return 0;
+  const minute = Number(val.split(':')[0])
+  const second = Number(val.split(':')[1])
+  return minute*60+second;
+};
+// 选择扣分时间点
+const selectSecond = (val:any)=>{
+  state.ruleItemForm.second = formatSecond(val);
+}
+// 扣分项保存
+const ruleItemFormRef = ref<RefType>();
+const onSubmitItem = (formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  formEl.validate((valid: boolean) => {
+    if (!valid) return;
+    state.loading = true;
+    if (dialogTitleItem.value === '新增扣分项') {
+      const data = Other.deepClone(state.ruleItemForm);
+      tableData.value.push(data);
+      state.loading = false;
+      state.dialogVisibleItem = false;
+    } else {
+      const newArray = <EmptyArrayType>[];
+      for (let i of tableData.value) {
+        if (i.name === state.ruleItemForm.name) {
+          newArray.push({
+            ...i,
+            ...state.ruleItemForm,
+          });
+        } else {
+          newArray.push(i);
+        }
+      }
+      tableData.value = newArray;
+      state.loading = false;
+      state.dialogVisibleItem = false;
+    }
+  });
+};
+// 删除质检项内容
+const onDeleteItem = (row: any) => {
+  ElMessageBox.confirm(`您确定要删除:【${row.name}】扣分项,是否继续?`, '提示', {
+    confirmButtonText: '确认',
+    cancelButtonText: '取消',
+    type: 'warning',
+    draggable: true,
+    cancelButtonClass: 'default-button',
+    autofocus: false,
+  })
+      .then(() => {
+        tableData.value = tableData.value.filter((v:any)=>v.name!==row.name);
+        getEnableAcceptType();
+      })
+      .catch(() => {});
+};
+// 获取可用的数组
+const getEnableAcceptType = () => {
+  if (tableData.value.length) {
+    const array = tableData.value.map((v: any) => v.name);
+    projectArray.value.forEach((v: any) => {
+      v.disabled = array.includes(v.name);
+    });
+  }
+};
+// 保存
+const onSubmit = (formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  formEl.validate((valid: boolean) => {
+    if (!valid) return;
+    state.loading = true;
+    const request = {
+      orderId: state.orderDetail.id,// 工单id
+      mode: "人工质检", // 质检模式
+      grade: score.value, // 质检得分
+      content: state.ruleForm.content, // 质检评价
+      source: state.source, // 来源
+      qualityDetails:tableData.value, // 质检详情
+      id:qualityId.value,// 质检id
+    }
+    qualityUpdate(request).then(()=>{
+      ElMessage.success('操作成功');
+      emit('updateList');
+      state.loading = false;
+      state.dialogVisible = false;
+    }).catch(()=>{
+      state.loading = false;
+      state.dialogVisible = false;
+      emit('updateList');
+    })
+  });
+};
+defineExpose({
+  openDialog,
+  closeDialog,
+});
+</script>
+<style lang='scss'>
+//这个应该是隐藏小时的代码
+.noneMinute {
+  .el-scrollbar:nth-of-type(1) {
+    display: none;
+  }
+  //调整样式
+  .el-time-spinner {
+    width: 150%;
+    white-space: nowrap;
+  }
+}
+</style>

+ 185 - 91
src/views/quality/done/index.vue

@@ -1,63 +1,162 @@
 <template>
-  <div class="quality-lexicon-container layout-pd">
+  <div class="quality-done-container layout-pd">
     <el-card shadow="never">
-      <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
-        <el-tab-pane label="User" name="first">User</el-tab-pane>
-        <el-tab-pane label="Config" name="second">Config</el-tab-pane>
-        <el-tab-pane label="Role" name="third">Role</el-tab-pane>
-        <el-tab-pane label="Task" name="fourth">Task</el-tab-pane>
+      <el-tabs v-model="state.queryParams.Source" class="demo-tabs" @tab-change="queryList">
+        <el-tab-pane label="受理已质检" :name="1"></el-tab-pane>
+        <el-tab-pane label="派单已质检" :name="2"></el-tab-pane>
+        <el-tab-pane label="回访已质检" :name="3"></el-tab-pane>
       </el-tabs>
-
       <el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent>
-        <el-form-item label="违禁词分类" prop="Classify">
-          <el-select v-model="state.queryParams.Classify" placeholder="请选择违禁词分类">
-            <el-option v-for="item in prohibitedClassify" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="违禁词属性" prop="Type">
-          <el-select v-model="state.queryParams.Type" placeholder="请选择违禁词属性">
-            <el-option v-for="item in prohibitedType" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName"/>
-          </el-select>
+        <el-form-item label="关键词" prop="Keyword">
+          <el-input v-model="state.queryParams.Keyword" placeholder="关键词" clearable @keyup.enter="queryList" />
         </el-form-item>
-        <el-form-item label="违禁词" prop="Name">
-          <el-input v-model="state.queryParams.Name" placeholder="请输入违禁词" clearable @keyup.enter="queryList" style="width: 250px" />
+        <el-form-item label="创建时间" prop="exTime">
+          <el-date-picker
+              v-model="state.queryParams.exTime"
+              type="datetimerange"
+              unlink-panels
+              range-separator="至"
+              start-placeholder="开始时间"
+              end-placeholder="结束时间"
+              :shortcuts="shortcuts"
+              @change="timeStartChangeCr"
+              value-format="YYYY-MM-DD[T]HH:mm:ss"
+          />
         </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
           <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
         </el-form-item>
       </el-form>
-    </el-card>
-    <el-card shadow="never">
-      <div class="mb20">
-        <el-button type="primary" @click="onLexiconAdd" v-waves v-auth="'quality:lexicon:add'">
-          <SvgIcon name="ele-Plus" class="mr5" />新增
-        </el-button>
-        <el-button type="primary" @click="onLexiconDelete" v-waves v-auth="'quality:lexicon:delete'" :disabled="!multipleSelection.length">
-          <SvgIcon name="ele-Delete" class="mr5" />删除
-        </el-button>
-      </div>
+
       <!-- 表格 -->
       <el-table :data="state.tableData" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" />
-        <el-table-column prop="name" label="违禁词" show-overflow-tooltip width="400"></el-table-column>
-        <el-table-column prop="classify" label="违禁词分类" show-overflow-tooltip width="130"></el-table-column>
-        <el-table-column prop="type" label="违禁词属性" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="creatorName" label="创建人" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="creationTime" label="创建时间" show-overflow-tooltip width="170">
-          <template #default="{ row }">
-            <span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="lastModificationName" label="更新人" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="lastModificationTime" label="更新时间" show-overflow-tooltip width="170">
-          <template #default="{ row }">
-            <span>{{ formatDate(row.lastModificationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-          </template>
-        </el-table-column>
+        <template v-if="state.queryParams.Source === 1">
+          <el-table-column prop="order.no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
+          <el-table-column prop="name" label="质检方式" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
+          <el-table-column label="受理时间" show-overflow-tooltip width="170">
+            <template #default="{ row }">
+              <span>{{ formatDate(row.order?.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="order.acceptType" label="受理类型" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.statusText" label="工单状态" show-overflow-tooltip></el-table-column>
+          <el-table-column label="工单标题" show-overflow-tooltip width="300">
+            <template #default="{ row }">
+              <span class="color-primary">{{ row.order?.title }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="order.hotspotName" label="热点分类" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
+            <template #default="{ row }">
+              <span>{{ row.order?.acceptorName}} <span v-if="row.order?.acceptorStaffNo">[{{row.order?.acceptorStaffNo}}]</span> </span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="order.fromPhone" label="来电电话" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.fromPhone" label="质检人" show-overflow-tooltip></el-table-column>
+          <el-table-column label="质检时间" show-overflow-tooltip width="170">
+            <template #default="{ row }">
+              <span>{{ formatDate(row.order?.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="order.fromPhone" label="质检得分" show-overflow-tooltip></el-table-column>
+        </template>
+        <template v-if="state.queryParams.Source === 2">
+          <el-table-column prop="order.no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
+          <el-table-column prop="name" label="质检方式" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
+          <el-table-column label="受理时间" show-overflow-tooltip width="170">
+            <template #default="{ row }">
+              <span>{{ formatDate(row.order?.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="order.acceptType" label="受理类型" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.statusText" label="工单状态" show-overflow-tooltip></el-table-column>
+          <el-table-column label="工单标题" show-overflow-tooltip width="300">
+            <template #default="{ row }">
+              <span class="color-primary">{{ row.order?.title }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="order.hotspotName" label="热点分类" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
+            <template #default="{ row }">
+              <span>{{ row.order?.acceptorName}} <span v-if="row.order?.acceptorStaffNo">[{{row.order?.acceptorStaffNo}}]</span> </span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="creationTime" label="交办时间" show-overflow-tooltip width="170">
+            <template #default="{ row }">
+              <span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="order.fromPhone" label="来电电话" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.fromPhone" label="质检人" show-overflow-tooltip></el-table-column>
+          <el-table-column label="质检时间" show-overflow-tooltip width="170">
+            <template #default="{ row }">
+              <span>{{ formatDate(row.order?.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="order.fromPhone" label="质检得分" show-overflow-tooltip></el-table-column>
+        </template>
+        <template v-if="state.queryParams.Source === 3">
+          <el-table-column prop="order.no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
+          <el-table-column prop="name" label="质检方式" show-overflow-tooltip></el-table-column>
+          <el-table-column label="工单标题" show-overflow-tooltip width="300">
+            <template #default="{ row }">
+              <span class="color-primary">{{ row.order?.title }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="order.sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="visit.visitStateText" label="回访状态" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="visit.visitTypeText" label="回访方式" show-overflow-tooltip width="100"></el-table-column>
+          <el-table-column prop="order.acceptType" label="受理类型" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.hotspotName" label="热点分类" show-overflow-tooltip width="120"></el-table-column>
+          <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
+            <template #default="{ row }">
+              <span>{{ row.order?.acceptorName}} <span v-if="row.order?.acceptorStaffNo">[{{row.order?.acceptorStaffNo}}]</span> </span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="order.actualHandleOrgName" label="接办部门" show-overflow-tooltip width="170"></el-table-column>
+          <el-table-column label="受理时间" show-overflow-tooltip width="170">
+            <template #default="{ row }">
+              <span>{{ formatDate(row.order?.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="startTime" label="办结时间" show-overflow-tooltip width="170">
+            <template #default="{ row }">
+              <span>{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="startTime" label="发布时间" show-overflow-tooltip width="170">
+            <template #default="{ row }">
+              <span>{{ formatDate(row.visit?.publishTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="回访任务创建时间" show-overflow-tooltip width="170">
+            <template #default="{ row }">
+              <span>{{ formatDate(row.visit?.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="visit.employeeName" label="回访人" show-overflow-tooltip width="170"></el-table-column>
+          <el-table-column label="回访时间" show-overflow-tooltip width="170">
+            <template #default="{ row }">
+              <span>{{ formatDate(row.visit?.visitTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="actualHandleOrgName" label="中心会签" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.fromPhone" label="质检人" show-overflow-tooltip></el-table-column>
+          <el-table-column label="质检时间" show-overflow-tooltip width="170">
+            <template #default="{ row }">
+              <span>{{ formatDate(row.order?.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="order.fromPhone" label="质检得分" show-overflow-tooltip></el-table-column>
+        </template>
         <el-table-column label="操作" width="120" fixed="right" align="center">
           <template #default="{ row }">
-            <el-button link type="primary" @click="onLexiconEdit(row)" v-auth="'quality:lexicon:edit'" title="修改违禁词"> 修改 </el-button>
+            <el-button link type="primary" @click="onQualityView(row)" v-auth="'quality:done:view'" title="查看质检详情"> 查看 </el-button>
+            <el-button link type="primary" @click="onQualityEdit(row)" v-auth="'quality:done:edit'" title="编辑质检"> 编辑 </el-button>
           </template>
         </el-table-column>
         <template #empty>
@@ -72,23 +171,21 @@
           @pagination="queryList"
       />
     </el-card>
-    <!--  违禁词新增  -->
-    <lexicon-add ref="lexiconAddRef" @updateList="queryList" :prohibitedClassify="prohibitedClassify" :prohibitedType="prohibitedType"/>
-    <!--  违禁词编辑  -->
-    <lexicon-edit ref="lexiconEditRef" @updateList="queryList" :prohibitedClassify="prohibitedClassify" :prohibitedType="prohibitedType"/>
+    <!-- 质检 -->
+    <quality-inspection ref="qualityInspectionRef" @updateList="queryList"/>
   </div>
 </template>
 
-<script lang="ts" setup name="quality">
+<script lang="ts" setup name="qualityDone">
 import { reactive, ref, onMounted, defineAsyncComponent } from 'vue';
-import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { ElMessage, FormInstance } from 'element-plus';
 import { formatDate } from '/@/utils/formatTime';
 import {auth} from "/@/utils/authFunction";
-import {lexiconList,lexiconDelete,lexiconBaseData} from '/@/api/quality/lexicon';
+import {qualityBaseData,qualityList} from '/@/api/quality'
+import {shortcuts} from "/@/utils/constants";
 
 // 引入组件
-const LexiconAdd = defineAsyncComponent(() => import('/@/views/quality/lexicon/components/Lexicon-add.vue')); // 违禁词新增
-const LexiconEdit = defineAsyncComponent(() => import('/@/views/quality/lexicon/components/Lexicon-edit.vue')); // 违禁词编辑
+const QualityInspection = defineAsyncComponent(() => import('/@/views/quality/done/components/Quality-inspection.vue')); // 质检
 
 // 定义变量内容
 const state = reactive<any>({
@@ -97,31 +194,47 @@ const state = reactive<any>({
     // 查询参数
     PageIndex: 1,
     PageSize: 10,
-    Classify: null,
-    Type: null,
-    Name:''
+    Source: 1,
+    CreationTimeStart: '', // 创建时间 开始
+    CreationTimeEnd: '', // 创建时间 结束
+    exTime: [], // 办理期限
+    State: 1, // 待质检
+    Keyword:''
   },
   total: 0, // 总条数
   tableData: [], // 表格数据
 });
 const ruleFormRef = ref<RefType>(null); // 表单ref
-const prohibitedClassify = ref<EmptyArrayType>([]); // 违禁词分类
-const prohibitedType = ref<EmptyArrayType>([]); // 违禁词属性
+const qualitySourceOptions = ref<EmptyArrayType>([]); // 违禁词分类
+const qualityStateOptions = ref<EmptyArrayType>([]); // 违禁词属性
 const getBaseData = async ()=>{
   try {
-    const res = await lexiconBaseData();
-    prohibitedClassify.value = res.result?.prohibitedClassify ?? [];
-    prohibitedType.value = res.result?.prohibitedType ?? [];
+    const res = await qualityBaseData();
+    qualitySourceOptions.value = res.result?.qualitySource ?? [];
+    qualityStateOptions.value = res.result?.qualityState ?? [];
   } catch (error) {
     console.log(error);
   }
 }
+const handleTimeChange = (val: string[], startKey: string, endKey: string) => {
+  if (val) {
+    state.queryParams[startKey] = val[0];
+    state.queryParams[endKey] = val[1];
+  } else {
+    state.queryParams[startKey] = '';
+    state.queryParams[endKey] = '';
+  }
+};
+// 甄别时间
+const timeStartChangeCr = (val: string[]) => {
+  handleTimeChange(val, 'CreationTimeStart', 'CreationTimeEnd');
+};
 // 获取参数列表
 const queryList = () => {
   state.loading = true;
   if (!auth('quality:query')) ElMessage.error('抱歉,您没有权限获取质检词库列表!');
   else {
-    lexiconList(state.queryParams)
+    qualityList(state.queryParams)
         .then((res) => {
           state.loading = false;
           state.tableData = res.result.items ?? [];
@@ -136,17 +249,18 @@ const queryList = () => {
 const resetQuery = (formEl: FormInstance | undefined) => {
   if (!formEl) return;
   formEl.resetFields();
+  state.queryParams.CreationTimeStart = '';
+  state.queryParams.CreationTimeEnd = '';
   queryList();
 };
-// 新增意见
-const lexiconAddRef = ref<RefType>(); // 意见新增
-const onLexiconAdd = () => {
-  lexiconAddRef.value.openDialog();
+// 质检查看
+const qualityInspectionRef = ref<RefType>();
+const onQualityView = (row:any) => {
+  qualityInspectionRef.value.openDialog(row,state.queryParams.Source,true);
 };
-// 修改意见
-const lexiconEditRef = ref<RefType>(); // 修改意见
-const onLexiconEdit = (row: any) => {
-  lexiconEditRef.value.openDialog(row);
+// 质检编辑
+const onQualityEdit = (row: any) => {
+  qualityInspectionRef.value.openDialog(row,state.queryParams.Source);
 };
 // 表格多选
 const multipleTableRef = ref<RefType>();
@@ -154,26 +268,6 @@ const multipleSelection = ref<any>([]);
 const handleSelectionChange = (val: any[]) => {
   multipleSelection.value = val;
 };
-// 删除参数
-const onLexiconDelete = () => {
-  const names = multipleSelection.value.map((item: any) => item.name).join('、');
-  const ids = multipleSelection.value.map((item: any) => item.id);
-  ElMessageBox.confirm(`您确定要删除:【${names}】违禁词,是否继续?`, '提示', {
-    confirmButtonText: '确认',
-    cancelButtonText: '取消',
-    type: 'warning',
-    draggable: true,
-    cancelButtonClass: 'default-button',
-    autofocus: false,
-  })
-      .then(() => {
-        lexiconDelete({ids}).then(() => {
-          ElMessage.success('操作成功');
-          queryList();
-        });
-      })
-      .catch(() => {});
-};
 // 页面加载时
 onMounted(() => {
   getBaseData();
@@ -182,7 +276,7 @@ onMounted(() => {
 </script>
 
 <style lang="scss" scoped>
-.quality-lexicon-container {
+.quality-done-container {
 
 }
 </style>

+ 653 - 0
src/views/quality/index/components/Order-detail.vue

@@ -0,0 +1,653 @@
+<template>
+  <el-dialog v-model="state.dialogVisible" class="order-detail-dialog" draggable ref="dialogRef" width="80%" append-to-body destroy-on-close>
+    <template #header>
+      <el-tabs v-model="state.activeName" @tab-change="handleClick">
+        <el-tab-pane :name="item.value" v-for="item in state.tabPaneList" :key="item.value" :label="item.label"></el-tab-pane>
+      </el-tabs>
+    </template>
+
+    <el-collapse v-model="state.collapseArr" v-if="state.activeName === '0'" class="collapse-box" v-loading="state.loading">
+      <el-collapse-item name="1">
+        <template #title>
+          <p class="pl20">
+            <b class="font14">来电人信息</b>
+          </p>
+        </template>
+        <div class="collapse-container pb1">
+          <el-form label-width="100px" ref="ruleFormRef">
+            <el-row :gutter="10">
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.transferPhone">
+                <el-form-item label="转接来源"> {{ state.ruleForm.transferPhone }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.fromPhone">
+                <el-form-item label="来电号码">
+                  {{ state.ruleForm.fromPhone }}
+                  <el-button plain title="录音文件" size="small" type="primary" class="ml8" @click="recordFile(state.ruleForm.callId)"
+                             v-if="state.ruleForm.callId" >录音文件</el-button>
+                  <!-- <el-popover :width="480" trigger="hover">
+                        <template #reference>
+                          <el-button link type="primary" class="ml5" title="播放录音"><SvgIcon name="ele-Headset" size="16px" /></el-button>
+                        </template>
+                        <AudioPlayer ref="AudioPlayerRef" :url="state.ruleForm.url" />
+                      </el-popover> -->
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.callAddress">
+                <el-form-item label="号码归属地">
+                  {{ state.ruleForm.callAddress }}
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="来电人姓名">
+                  {{ state.ruleForm.fromName }} <span class="ml5"> {{ state.ruleForm.fromGenderText }}</span>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="来电人性别">
+                  {{ state.ruleForm.fromGenderText }}
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.contact">
+                <el-form-item label="联系电话">
+                  <span v-if="showMaskNumber"> {{ state.ruleForm.contactMask }}</span>
+                  <span v-else>{{ state.ruleForm.contact }}</span>
+                  <el-button plain title="外呼" size="small" type="primary" class="ml8" @click="callPhone(state.ruleForm.contact)">外呼</el-button>
+                  <el-button plain title="查看号码" size="small" type="primary" class="ml8" @click="showMaskNumber = !showMaskNumber">{{
+                      showMaskNumber ? '查看号码' : '隐藏号码'
+                    }}</el-button>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="来电人身份"> {{ state.ruleForm.identityTypeText }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="受理短信"> {{ state.ruleForm.smsSendedText }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                <el-form-item label="事发地址"> {{ state.ruleForm.address }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.company">
+                <el-form-item label="工作单位"> {{ state.ruleForm.company }} </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+        </div>
+      </el-collapse-item>
+      <el-collapse-item name="2">
+        <template #title>
+          <p class="pl20">
+            <b class="font14">工单信息</b>
+          </p>
+        </template>
+        <div class="collapse-container pb1">
+          <el-form label-width="100px" ref="ruleFormRef">
+            <el-row :gutter="10">
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="来源方式"> {{ state.ruleForm.sourceChannel }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="受理类型"> {{ state.ruleForm.acceptType }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="工单编码"> {{ state.ruleForm.no }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.fromProvinceNo">
+                <el-form-item label="省工单编码"> {{ state.ruleForm.fromProvinceNo }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="工单类型">
+                  {{ state.ruleForm.orderTypeText }}
+                  <!-- 投诉或者建议并且是12315工单才有扩展信息 -->
+                  <el-button
+                      link
+                      type="primary"
+                      v-if="state.ruleForm.orderType === 1 && (state.ruleForm.acceptType === '30' || state.ruleForm.acceptType === '35')"
+                      class="ml10"
+                      @click="showExpandInfo"
+                  ><SvgIcon name="ele-Document" class="mr2" /> 拓展信息</el-button
+                  >
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="是否重复">
+                  {{ state.ruleForm.duplicateIds && state.ruleForm.duplicateIds.length > 0 ? '是(' + state.ruleForm.duplicateIds.length + '次)' : '否' }}
+                  <el-button
+                      plain
+                      title="查看重复工单"
+                      size="small"
+                      type="primary"
+                      class="ml8"
+                      @click="showRepeatInfo"
+                      v-if="state.ruleForm.duplicateIds && state.ruleForm.duplicateIds.length > 0"
+                  >查看重复工单</el-button
+                  >
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="紧急程度"> {{ state.ruleForm.emergencyLevelText }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="热点分类"> {{ state.ruleForm.hotspotSpliceName }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="受理人">
+                  <span>{{ state.ruleForm?.acceptorName}} <span v-if="state.ruleForm?.acceptorStaffNo">[{{state.ruleForm?.acceptorStaffNo}}]</span></span>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.incidentTime">
+                <el-form-item label="受理时间"> {{ formatDate(state.ruleForm.incidentTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.pushType">
+                <el-form-item label="推送分类"> {{ state.ruleForm.pushType }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                <el-form-item label="工单标题">
+                  {{ state.ruleForm.title }} <el-tag class="ml10">{{ state.ruleForm.statusText }}</el-tag>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                <el-form-item label="受理内容">
+                  {{ state.ruleForm.content }}
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-auth="'file:list'">
+                <el-form-item label="附件">
+                  <annex-list name="查看附件" readonly :businessId="state.ruleForm.id"  classify="查看附件" />
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+        </div>
+      </el-collapse-item>
+      <el-collapse-item name="3">
+        <template #title>
+          <p class="pl20">
+            <b class="font14">结果信息</b>
+          </p>
+        </template>
+        <div class="collapse-container pb1">
+          <el-form label-width="100px" ref="ruleFormRef">
+            <el-row :gutter="10">
+              <el-col :xs="24" :sm="24" :md="8" :lg="6" :xl="6">
+                <el-form-item label="交办部门"> 热线中心 </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="交办时间"> {{ formatDate(state.ruleForm.centerToOrgTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="办理部门"> {{ state.ruleForm.actualHandleOrgName  }}</el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="办理时间"> {{ formatDate(state.ruleForm.actualHandleTime , 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="工单办理期限"> {{ state.ruleForm.timeLimit }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="工单期满时间"> {{ formatDate(state.ruleForm.expiredTime , 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                <el-form-item label="办理结果"> {{ state.ruleForm.actualOpinion  }} </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+        </div>
+      </el-collapse-item>
+      <el-collapse-item name="4" v-if="state.supplements && state.supplements.length">
+        <template #title>
+          <p class="pl20">
+            <b class="font14">补充信息</b>
+          </p>
+        </template>
+        <div class="collapse-container">
+          <div v-for="i in state.supplements" :key="i" class="plug-container">
+            <el-form label-width="100px" ref="ruleFormRef" class="pt10 pb10">
+              <el-row :gutter="10">
+                <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                  <el-form-item label="补充部门">
+                    {{ i.creator.organization }}
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                  <el-form-item label="补充时间"> {{ formatDate(i.creationTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                  <el-form-item label="补充人">
+                    {{ i.creator.name }} <span v-if="i.creator.staffNo">[{{ i.creator.staffNo }} ]</span></el-form-item
+                  >
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                  <el-form-item label="补充详情">
+                    {{ i.opinion }}
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form>
+          </div>
+        </div>
+      </el-collapse-item>
+      <el-collapse-item name="5" v-if="state.workflow.assignOrgs">
+        <template #title>
+          <p class="pl20">
+            <b class="font14">回访信息</b>
+          </p>
+        </template>
+        <div class="collapse-container pb1">
+          <el-form label-width="100px" ref="ruleFormRef">
+            <el-row :gutter="10">
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="语音评价"> {{ state.workflow.assignOrgs }}</el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="话务员评价"> {{ formatDate(state.workflow.assignTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="补充人"> {{ state.workflow.timeLimit }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="被回访部门"> {{ formatDate(state.workflow.expiredTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="办件结果"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="办件态度"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                <el-form-item label="回访内容"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="被回访部门"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="办件结果"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="办件态度"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                <el-form-item label="回访内容"> {{ state.workflow.opinion }} </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+        </div>
+      </el-collapse-item>
+      <el-collapse-item name="6" v-if="state.workflow.assignOrgs">
+        <template #title>
+          <p class="pl20">
+            <b class="font14">重办信息</b>
+          </p>
+        </template>
+        <div class="collapse-container pb1">
+          <el-form label-width="100px" ref="ruleFormRef">
+            <el-row :gutter="10">
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="被重办部门"> {{ state.workflow.assignOrgs }}</el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="重办时间"> {{ formatDate(state.workflow.assignTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="重办理由"> {{ state.workflow.timeLimit }} </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                <el-form-item label="重办原因"> {{ state.workflow.opinion }} </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+        </div>
+      </el-collapse-item>
+    </el-collapse>
+
+    <div v-if="state.activeName === '1'" v-loading="state.loading">
+      <process-time-line :data="state.traces" defaultExpandAll />
+    </div>
+
+    <div v-if="state.activeName === '2'" v-loading="state.loading">
+      <p class="pl20">
+        <b class="font14">回访信息</b>
+      </p>
+      <div class="collapse-container pb1">
+        <el-form label-width="100px" ref="ruleFormRef">
+          <el-row :gutter="10">
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="语音评价"> {{ state.workflow.assignOrgs }}</el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="话务员评价"> {{ formatDate(state.workflow.assignTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="补充人"> {{ state.workflow.timeLimit }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="被回访部门"> {{ formatDate(state.workflow.expiredTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="办件结果"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="办件态度"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+              <el-form-item label="回访内容"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="被回访部门"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="办件结果"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="办件态度"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+              <el-form-item label="回访内容"> {{ state.workflow.opinion }} </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+    </div>
+
+    <div v-if="state.activeName === '3'" v-loading="state.loading">
+      <p class="pl20">
+        <b class="font14">发布信息</b>
+      </p>
+      <div class="collapse-container pb1">
+        <el-form label-width="100px" ref="ruleFormRef">
+          <el-row :gutter="10">
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="语音评价"> {{ state.workflow.assignOrgs }}</el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="话务员评价"> {{ formatDate(state.workflow.assignTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="补充人"> {{ state.workflow.timeLimit }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="被回访部门"> {{ formatDate(state.workflow.expiredTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="办件结果"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="办件态度"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+              <el-form-item label="回访内容"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="被回访部门"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="办件结果"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+              <el-form-item label="办件态度"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+              <el-form-item label="回访内容"> {{ state.workflow.opinion }} </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+    </div>
+    <template #footer>
+			<span class="dialog-footer">
+
+			</span>
+    </template>
+  </el-dialog>
+  <!-- 扩展信息 -->
+  <order-expand-detail ref="orderExpandDetailRef" />
+  <!-- 重复工单 -->
+  <order-repeat ref="orderRepeatRef" />
+</template>
+
+<script setup lang="ts" name="orderDetail">
+import { defineAsyncComponent, reactive, ref } from 'vue';
+import { useRouter } from 'vue-router';
+import { throttle } from '/@/utils/tools';
+import { commonEnum } from '/@/utils/constants';
+import { orderDetail } from '/@/api/business/order';
+import { formatDate } from '/@/utils/formatTime';
+import { ElMessage } from 'element-plus';
+import { VoiceInterfaceObject } from '/@/utils/PhoneScript';
+import {workflowTraces} from "/@/api/system/workflow";
+
+// 引入组件
+const OrderExpandDetail = defineAsyncComponent(() => import('/@/views/business/order/components/Order-expand-detail.vue')); // 扩展信息
+const OrderRepeat = defineAsyncComponent(() => import('/@/views/business/order/components/Order-repeat.vue')); // 重复工单
+const AnnexList = defineAsyncComponent(() => import('/@/components/AnnexList/index.vue')); // 附件列表
+
+// 引入组件
+const ProcessTimeLine = defineAsyncComponent(() => import('/@/components/ProcessTimeLine/index.vue'));
+// const AudioPlayer = defineAsyncComponent(() => import('/@/components/AudioPlayer/index.vue'));
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList', 'handle']);
+// 定义变量内容
+const state = reactive<any>({
+  dialogVisible: false, // 弹窗显示隐藏
+  ruleForm: {
+    // 表单数据
+    url: '',
+    fromGenderText: '',
+    channelText: '',
+    identityTypeText: '',
+    licenceNo: '',
+    contactMask: '',
+    company: '',
+    emergencyLevelText: '',
+    incidentTime: '',
+  } as any,
+  activeName: '0', // tab切换
+  tabPaneList: [
+    // tab列表
+    {
+      label: '工单详情',
+      value: '0',
+    },
+    {
+      label: '流程明细',
+      value: '1',
+    },
+    {
+      label: '回访详情',
+      value: '2',
+    },
+    {
+      label: '发布详情',
+      value: '3',
+    }
+  ],
+  collapseArr: ['1', '2','3'], //展开列表
+  loading: false,
+  supplements: [], // 补充内容
+  workflow: {}, // 工单流程内容
+  orderId: '', //工单id
+  traces: [],
+});
+const showMaskNumber = ref<boolean>(true); // 是否展示号码
+const ruleFormRef = ref<RefType>(); // 表单ref
+const router = useRouter(); // 路由
+// 查看工单详情
+const getOrderDetail = async (id: string) => {
+  state.loading = true;
+  try {
+    const res: any = await orderDetail(id);
+    state.ruleForm = res.result;
+    state.workflow = state.ruleForm?.workflow ?? {};
+    state.supplements = res.result?.workflow?.supplements ?? [];
+    state.loading = false;
+  } catch (error) {
+    state.loading = false;
+  }
+};
+const formatTraces = (val: any) => {
+  if (!val || !val.length) return [];
+  val.forEach((item: any) => {
+    switch (item.expiredStatus) {
+      case 0:
+        item.type = 'success';
+        break;
+      case 1:
+        item.type = 'primary';
+        break;
+      case 2:
+        item.type = 'danger';
+        break;
+
+      default:
+        break;
+    }
+    if (item.traces?.length) {
+      formatTraces(item.traces);
+    }
+  });
+  return val;
+};
+// 查看流程明细
+const getWorkflowTraces = async (id: string) => {
+  state.loading = true;
+  try {
+    // 查询审核记录
+    const res = await workflowTraces(id);
+    state.traces = res.result?.traces ?? [];
+    state.traces = formatTraces(state.traces);
+    state.loading = false;
+  } catch (error) {
+    state.loading = false;
+  }
+};
+// 回访详情
+const getVisitDetail = async (id: string) => {
+  state.loading = true;
+  try {
+
+    state.loading = false;
+  } catch (error) {
+    state.loading = false;
+  }
+};
+// 发布详情
+const getPublishDetail = async (id: string) => {
+  state.loading = true;
+  try {
+
+    state.loading = false;
+  } catch (error) {
+    state.loading = false;
+  }
+};
+// 打开弹窗
+const openDialog = (val: any) => {
+  if (!val || !val.id) {
+    ElMessage.error('工单id不能为空');
+    return;
+  }
+  state.orderId = val.id;
+  if(val.activeName) {
+    state.activeName = val.activeName;//传入查询tab
+    handleClick(val.activeName)
+  }else{
+    getOrderDetail(state.orderId);
+  }
+  state.dialogVisible = true;
+};
+// 切换tab 查询列表
+const handleClick = (val: string) => {
+  switch (val) {
+    case '0': //工单详情
+      getOrderDetail(state.orderId);
+      break;
+    case '1': // 流程明细
+      getWorkflowTraces(state.workflow.id)
+      break;
+    case '2':// 回访详情
+      getVisitDetail(state.orderId)
+      break;
+    case '3': // 发布详情
+      getPublishDetail(state.orderId)
+      break;
+    default:
+      getOrderDetail(state.orderId);
+      break;
+  }
+};
+// 关闭弹窗
+const closeDialog = () => {
+  state.dialogVisible = false;
+};
+// 查看录音文件
+const recordFile = (callId:string)=>{
+  console.log(callId)
+}
+// 电话外呼
+const callPhone = (number: number | string) => {
+  VoiceInterfaceObject.DialOut(number); // 呼叫
+};
+const orderRepeatRef = ref<RefType>();
+// 展示重复工单列表
+const showRepeatInfo = () => {
+  orderRepeatRef.value.openDialog(state.ruleForm);
+};
+// 展示扩展表单
+const orderExpandDetailRef = ref<RefType>(); // 扩展信息
+const showExpandInfo = () => {
+  let form: any = {};
+  if (state.ruleForm.acceptType === '30') {
+    // 举报
+    form = state.ruleForm.orderReport;
+    form.orderTypeText = '12315市场监管局受理单';
+    form.acceptTypeText = '举报';
+  } else if (state.ruleForm.acceptType === '35') {
+    //投诉
+    form = state.ruleForm.orderComplain;
+    form.orderTypeText = '12315市场监管局受理单';
+    form.acceptTypeText = '投诉';
+  }
+  orderExpandDetailRef.value.openDialog(form);
+};
+// 暴露变量
+defineExpose({
+  openDialog,
+  closeDialog,
+});
+</script>
+<style lang="scss" scoped>
+.collapse-box {
+  :deep(.el-collapse-item__header) {
+    background-color: var(--hotline-bg-main-color);
+    height: 40px;
+    border-radius: var(--el-border-radius-base);
+  }
+  :deep(.el-collapse-item__content) {
+    padding-bottom: 10px !important;
+    .el-form-item {
+      margin-bottom: 5px;
+      .el-form-item__content {
+        line-height: 24px;
+      }
+    }
+  }
+  .collapse-container {
+    padding: 10px;
+    .plug-container {
+      border: var(--el-border);
+      border-radius: var(--el-border-radius-base);
+      margin-bottom: 15px;
+      &:last-child {
+        margin-bottom: 0;
+      }
+    }
+  }
+}
+:deep(.el-tabs__item) {
+  font-size: var(--el-font-size-base);
+}
+</style>
+<style lang="scss">
+.order-detail-dialog {
+}
+</style>

+ 360 - 0
src/views/quality/index/components/Quality-inspection.vue

@@ -0,0 +1,360 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" :title="dialogTitle" draggable ref="dialogRef" width="50%" append-to-body destroy-on-close @close="close">
+		<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="110px">
+			<el-row :gutter="10">
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="工单编码:"> {{ state.orderDetail.no }} </el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="来电号码:">
+						{{ state.orderDetail.fromPhone }}
+						<el-button
+							plain
+							title="录音文件"
+							size="small"
+							type="primary"
+							class="ml8"
+							@click="recordFile(state.orderDetail.callId)"
+							v-if="state.orderDetail.callId"
+							>录音文件</el-button
+						>
+					</el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="受理人:">
+						<span
+							>{{ state.orderDetail.acceptorName }} <span v-if="state.orderDetail?.acceptorStaffNo">[{{ state.orderDetail?.acceptorStaffNo }}]</span>
+						</span></el-form-item
+					>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="受理时间:"> {{ formatDate(state.orderDetail?.startTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+				</el-col>
+			</el-row>
+			<el-divider content-position="left"><span class="font16"> 质检内容</span></el-divider>
+			<div class="mt20 mb20">
+				<el-button type="primary" class="mb10" @click="onAddItem">新增扣分项</el-button>
+				<!-- 表格 -->
+				<el-table :data="tableData" border row-key="name">
+					<el-table-column label="扣分时间点" show-overflow-tooltip align="center">
+						<template #default="{ row }">
+							{{ formatDuration(row.second,false) }}
+						</template>
+					</el-table-column>
+					<el-table-column prop="name" label="扣分项" show-overflow-tooltip align="center"></el-table-column>
+					<el-table-column prop="content" label="扣分内容" show-overflow-tooltip align="center"></el-table-column>
+					<el-table-column prop="grade" label="分值(分)" show-overflow-tooltip align="center"></el-table-column>
+					<el-table-column label="操作" width="120" fixed="right" align="center">
+						<template #default="{ row }">
+							<el-button link type="primary" @click="onEditItem(row)"> 编辑 </el-button>
+							<el-button link type="primary" @click="onDeleteItem(row)"> 删除 </el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+			</div>
+			<el-row :gutter="10">
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="总分:"> 100 分 </el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="当前质检得分:"> {{ score }} </el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+					<el-form-item label="质检评价:" prop="content" :rules="[{ required: true, message: '请输入质检评价', trigger: 'blur' }]">
+						<el-input
+							v-model="state.ruleForm.content"
+							placeholder="请输入质检评价"
+							clearable
+							type="textarea"
+							:autosize="{ minRows: 4, maxRows: 8 }"
+						></el-input>
+					</el-form-item>
+				</el-col>
+			</el-row>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" v-waves="'light'" :loading="state.loading">确 定 </el-button>
+			</span>
+		</template>
+	</el-dialog>
+	<el-dialog
+		v-model="state.dialogVisibleItem"
+		:title="dialogTitleItem"
+		draggable
+		ref="dialogItemRef"
+		width="600px"
+		append-to-body
+		destroy-on-close
+		@close="closeItem"
+	>
+		<el-form :model="state.ruleItemForm" ref="ruleItemFormRef" label-width="100px">
+			<el-form-item label="扣分时间点" prop="value" :rules="[{ required: true, message: '请输入扣分时间点', trigger: 'change' }]">
+				<el-time-picker
+					v-model="state.ruleItemForm.value"
+					placeholder="请选择扣分时间点"
+					@change="selectSecond"
+					value-format="mm:ss"
+					format="mm:ss"
+					:picker-options="{
+						selectableRange: '00:00:00 - 00:59:59',
+					}"
+					popper-class="noneMinute"
+				/>
+			</el-form-item>
+			<el-form-item label="扣分项" prop="name" :rules="[{ required: true, message: '请选择扣分项', trigger: 'change' }]">
+				<el-select v-model="state.ruleItemForm.name" placeholder="请选择扣分项" class="w100" @change="changeProject">
+					<el-option v-for="item in projectArray" :key="item.id" :label="item.name" :value="item.name" :disabled="item.disabled" />
+				</el-select>
+			</el-form-item>
+			<el-form-item label="分值" prop="grade" :rules="[{ required: true, message: '请输入分值', trigger: 'blur' }]">
+				<el-input-number v-model="state.ruleItemForm.grade" :precision="0" :min="1" :max="100" placeholder="请输入分值" />
+				<span class="ml10">分</span>
+			</el-form-item>
+			<el-form-item label="扣分内容" prop="content" :rules="[{ required: true, message: '请输入扣分内容', trigger: 'blur' }]">
+				<el-input v-model="state.ruleItemForm.content" placeholder="请输入扣分内容" type="textarea" :autosize="{ minRows: 4, maxRows: 8 }"></el-input>
+			</el-form-item>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="state.dialogVisibleItem = false" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmitItem(ruleItemFormRef)" v-waves="'light'" :loading="state.loading">确 定 </el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+<script setup lang="ts" name="qualityInspection">
+import {computed, reactive, ref, watch} from 'vue';
+import {ElInput, ElMessage, ElMessageBox, FormInstance} from 'element-plus';
+import { formatDate, formatDuration } from '/@/utils/formatTime';
+import { templateList } from '/@/api/quality/template';
+import { projectList } from '/@/api/quality/project';
+import Other from '/@/utils/other';
+import { qualityUpdate } from '/@/api/quality';
+
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+const state = reactive<any>({
+	dialogVisible: false, // 弹窗显示隐藏
+	ruleForm: {
+		name: '', // 违禁词
+		classify: '', // 违禁词分类
+		type: '', // 违禁词属性
+	},
+	loading: false, // 确定按钮loading
+	orderDetail: {},
+	dialogVisibleItem: false,
+	ruleItemForm: {
+		second: 0,
+		name: '', // 扣分时间点
+		grade: 1, // 分值
+		content: '', // 扣分内容
+	},
+  source:1,// 来源
+});
+const dialogTitle = ref<string>('受理质检');
+const dialogTitleItem = ref<string>('新增扣分项');
+const projectArray = ref<EmptyArrayType>([]); // 质检项数组
+const tableData = ref<EmptyArrayType>([]); // 表格数据
+const qualityId = ref<string>(''); // 质检ID
+// 打开弹窗
+const openDialog = async (row: any, source?: string | number | undefined) => {
+	state.orderDetail = row.order ?? {};
+  qualityId.value = row.id;
+	if (source) {
+    state.source = source;
+		const { result } = await templateList({ IsEnable: 1, Grouping: source });
+		tableData.value = result.items[0]?.templateDetails;
+		const res = await projectList({ IsEnable: 1 });
+		projectArray.value = res.result?.items ?? [];
+		switch (source) {
+			case 1:
+				dialogTitle.value = '受理质检';
+				break;
+			case 2:
+				dialogTitle.value = '派单质检';
+				break;
+			case 3:
+				dialogTitle.value = '回访质检';
+				break;
+		}
+	}
+
+	state.dialogVisible = true;
+};
+// 计算当前得分
+const score = computed(() => {
+	let score = 0;
+	if (tableData.value.length) {
+		tableData.value.forEach((v: any) => {
+			score += v.grade;
+		});
+	}
+	return 100 - score;
+});
+watch(
+  () => score.value,
+  (newVal) => {
+    if(newVal<=0){
+      ElMessage.warning('质检得分不能小于0分');
+    }
+  },
+);
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const ruleFormRef = ref<FormInstance>();
+const close = () => {
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+};
+const closeItem = () => {
+	ruleItemFormRef.value?.clearValidate();
+	ruleItemFormRef.value?.resetFields();
+};
+// 查看录音文件
+const recordFile = (callId: string) => {
+	console.log(callId);
+};
+// 新增质检项内容
+const onAddItem = () => {
+	dialogTitleItem.value = '新增扣分项';
+	state.ruleItemForm = {
+		second: 0,
+		name: '', // 扣分时间点
+		grade: 1, // 分值
+		content: '', // 扣分内容
+	};
+	state.dialogVisibleItem = true;
+	getEnableAcceptType();
+};
+// 选择扣分项
+const changeProject = (val: any) => {
+	const item = projectArray.value.filter((v: any) => v.name === val)[0];
+	state.ruleItemForm.grade = item.grade;
+	state.ruleItemForm.content = item.describe;
+	getEnableAcceptType();
+};
+// 编辑质检内容
+const onEditItem = (row: any) => {
+	dialogTitleItem.value = '编辑扣分项';
+	state.ruleItemForm = Other.deepClone(row);
+  state.ruleItemForm.value = formatDuration(state.ruleItemForm.second,false);
+	state.dialogVisibleItem = true;
+	getEnableAcceptType();
+};
+// 分秒计算成秒
+const formatSecond = (val:string) => {
+  if(!val) return 0;
+  const minute = Number(val.split(':')[0])
+  const second = Number(val.split(':')[1])
+  return minute*60+second;
+};
+// 选择扣分时间点
+const selectSecond = (val:any)=>{
+  state.ruleItemForm.second = formatSecond(val);
+}
+// 扣分项保存
+const ruleItemFormRef = ref<RefType>();
+const onSubmitItem = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.validate((valid: boolean) => {
+		if (!valid) return;
+
+		state.loading = true;
+		if (dialogTitleItem.value === '新增扣分项') {
+			const data = Other.deepClone(state.ruleItemForm);
+			tableData.value.push(data);
+			state.loading = false;
+			state.dialogVisibleItem = false;
+		} else {
+			const newArray = <EmptyArrayType>[];
+			for (let i of tableData.value) {
+				if (i.name === state.ruleItemForm.name) {
+					newArray.push({
+						...i,
+						...state.ruleItemForm,
+					});
+				} else {
+					newArray.push(i);
+				}
+			}
+			tableData.value = newArray;
+			state.loading = false;
+			state.dialogVisibleItem = false;
+		}
+	});
+};
+// 删除质检项内容
+const onDeleteItem = (row: any) => {
+	ElMessageBox.confirm(`您确定要删除:【${row.name}】扣分项,是否继续?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+		autofocus: false,
+	})
+		.then(() => {
+      tableData.value = tableData.value.filter((v:any)=>v.name!==row.name);
+			getEnableAcceptType();
+		})
+		.catch(() => {});
+};
+// 获取可用的数组
+const getEnableAcceptType = () => {
+	if (tableData.value.length) {
+		const array = tableData.value.map((v: any) => v.name);
+		projectArray.value.forEach((v: any) => {
+			v.disabled = array.includes(v.name);
+		});
+	}
+};
+// 保存
+const onSubmit = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		state.loading = true;
+    const request = {
+      orderId: state.orderDetail.id,// 工单id
+      mode: "人工质检", // 质检模式
+      grade: score.value, // 质检得分
+      content: state.ruleForm.content, // 质检评价
+      source: state.source, // 来源
+      qualityDetails:tableData.value, // 质检详情
+      id:qualityId.value,// 质检id
+    }
+    qualityUpdate(request).then(()=>{
+      ElMessage.success('操作成功');
+      emit('updateList');
+      state.loading = false;
+      state.dialogVisible = false;
+    }).catch(()=>{
+      state.loading = false;
+      state.dialogVisible = false;
+      emit('updateList');
+    })
+	});
+};
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>
+<style lang='scss'>
+//这个应该是隐藏小时的代码
+.noneMinute {
+  .el-scrollbar:nth-of-type(1) {
+    display: none;
+  }
+  //调整样式
+  .el-time-spinner {
+    width: 150%;
+    white-space: nowrap;
+  }
+}
+</style>

+ 59 - 64
src/views/quality/index/index.vue

@@ -5,11 +5,6 @@
         <el-tab-pane :label="item.value" :name="item.key" v-for="item in qualitySourceOptions" :key="item.key"></el-tab-pane>
       </el-tabs>
       <el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent>
-        <el-form-item label="质检状态" prop="State">
-          <el-select v-model="state.queryParams.State" placeholder="请选择质检状态">
-            <el-option v-for="item in qualityStateOptions" :value="item.key" :key="item.key" :label="item.value" />
-          </el-select>
-        </el-form-item>
         <el-form-item label="关键词" prop="Keyword">
           <el-input v-model="state.queryParams.Keyword" placeholder="关键词" clearable @keyup.enter="queryList" />
         </el-form-item>
@@ -35,50 +30,50 @@
       <!-- 表格 -->
       <el-table :data="state.tableData" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" />
-        <template v-if="state.queryParams.Source === 0">
-          <el-table-column prop="name" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
+        <template v-if="state.queryParams.Source === 1">
+          <el-table-column prop="order.no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
           <el-table-column prop="name" label="质检方式" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="name" label="来源方式" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="creationTime" label="受理时间" show-overflow-tooltip width="170">
+          <el-table-column prop="order.sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
+          <el-table-column label="受理时间" show-overflow-tooltip width="170">
             <template #default="{ row }">
-              <span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+              <span>{{ formatDate(row.order?.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="name" label="受理类型" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="name" label="工单状态" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.acceptType" label="受理类型" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.statusText" label="工单状态" show-overflow-tooltip></el-table-column>
           <el-table-column label="工单标题" show-overflow-tooltip width="300">
             <template #default="{ row }">
-              <span class="color-primary">{{ row.title }}</span>
+              <span class="color-primary">{{ row.order?.title }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="name" label="热点分类" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.hotspotName" label="热点分类" show-overflow-tooltip></el-table-column>
           <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
             <template #default="{ row }">
-              <span>{{ row.acceptorName}} <span v-if="row.acceptorStaffNo">[{{row.acceptorStaffNo}}]</span> </span>
+              <span>{{ row.order?.acceptorName}} <span v-if="row.order?.acceptorStaffNo">[{{row.order?.acceptorStaffNo}}]</span> </span>
             </template>
           </el-table-column>
-          <el-table-column prop="name" label="来电电话" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.fromPhone" label="来电电话" show-overflow-tooltip></el-table-column>
         </template>
-        <template v-if="state.queryParams.Source === 1">
-          <el-table-column prop="name" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
+        <template v-if="state.queryParams.Source === 2">
+          <el-table-column prop="order.no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
           <el-table-column prop="name" label="质检方式" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="name" label="来源方式" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="creationTime" label="受理时间" show-overflow-tooltip width="170">
+          <el-table-column prop="order.sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
+          <el-table-column label="受理时间" show-overflow-tooltip width="170">
             <template #default="{ row }">
-              <span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+              <span>{{ formatDate(row.order?.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="name" label="受理类型" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="name" label="工单状态" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.acceptType" label="受理类型" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.statusText" label="工单状态" show-overflow-tooltip></el-table-column>
           <el-table-column label="工单标题" show-overflow-tooltip width="300">
             <template #default="{ row }">
-              <span class="color-primary">{{ row.title }}</span>
+              <span class="color-primary">{{ row.order?.title }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="name" label="热点分类" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.hotspotName" label="热点分类" show-overflow-tooltip></el-table-column>
           <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
             <template #default="{ row }">
-              <span>{{ row.acceptorName}} <span v-if="row.acceptorStaffNo">[{{row.acceptorStaffNo}}]</span> </span>
+              <span>{{ row.order?.acceptorName}} <span v-if="row.order?.acceptorStaffNo">[{{row.order?.acceptorStaffNo}}]</span> </span>
             </template>
           </el-table-column>
           <el-table-column prop="creationTime" label="交办时间" show-overflow-tooltip width="170">
@@ -86,30 +81,30 @@
               <span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="name" label="来电电话" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.fromPhone" label="来电电话" show-overflow-tooltip></el-table-column>
         </template>
-        <template v-if="state.queryParams.Source === 2">
-          <el-table-column prop="name" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
+        <template v-if="state.queryParams.Source === 3">
+          <el-table-column prop="order.no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
           <el-table-column prop="name" label="质检方式" show-overflow-tooltip></el-table-column>
           <el-table-column label="工单标题" show-overflow-tooltip width="300">
             <template #default="{ row }">
-              <span class="color-primary">{{ row.title }}</span>
+              <span class="color-primary">{{ row.order?.title }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="name" label="来源方式" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="name" label="回访状态" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="name" label="回访方式" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="name" label="受理类型" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="name" label="热点分类" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="visit.visitStateText" label="回访状态" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="visit.visitTypeText" label="回访方式" show-overflow-tooltip width="100"></el-table-column>
+          <el-table-column prop="order.acceptType" label="受理类型" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="order.hotspotName" label="热点分类" show-overflow-tooltip width="120"></el-table-column>
           <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
             <template #default="{ row }">
-              <span>{{ row.acceptorName}} <span v-if="row.acceptorStaffNo">[{{row.acceptorStaffNo}}]</span> </span>
+              <span>{{ row.order?.acceptorName}} <span v-if="row.order?.acceptorStaffNo">[{{row.order?.acceptorStaffNo}}]</span> </span>
             </template>
           </el-table-column>
-          <el-table-column prop="actualHandleOrgName" label="接办部门" show-overflow-tooltip width="170"></el-table-column>
-          <el-table-column prop="startTime" label="受理时间" show-overflow-tooltip width="170">
+          <el-table-column prop="order.actualHandleOrgName" label="接办部门" show-overflow-tooltip width="170"></el-table-column>
+          <el-table-column label="受理时间" show-overflow-tooltip width="170">
             <template #default="{ row }">
-              <span>{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+              <span>{{ formatDate(row.order?.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
             </template>
           </el-table-column>
           <el-table-column prop="startTime" label="办结时间" show-overflow-tooltip width="170">
@@ -119,25 +114,26 @@
           </el-table-column>
           <el-table-column prop="startTime" label="发布时间" show-overflow-tooltip width="170">
             <template #default="{ row }">
-              <span>{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+              <span>{{ formatDate(row.visit?.publishTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="startTime" label="回访任务创建时间" show-overflow-tooltip width="170">
+          <el-table-column label="回访任务创建时间" show-overflow-tooltip width="170">
             <template #default="{ row }">
-              <span>{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+              <span>{{ formatDate(row.visit?.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="actualHandleOrgName" label="回访人" show-overflow-tooltip width="170"></el-table-column>
-          <el-table-column prop="startTime" label="回访时间" show-overflow-tooltip width="170">
+          <el-table-column prop="visit.employeeName" label="回访人" show-overflow-tooltip width="170"></el-table-column>
+          <el-table-column label="回访时间" show-overflow-tooltip width="170">
             <template #default="{ row }">
-              <span>{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+              <span>{{ formatDate(row.visit?.visitTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
             </template>
           </el-table-column>
           <el-table-column prop="actualHandleOrgName" label="中心会签" show-overflow-tooltip></el-table-column>
         </template>
-        <el-table-column label="操作" width="120" fixed="right" align="center">
+        <el-table-column label="操作" width="140" fixed="right" align="center">
           <template #default="{ row }">
-            <el-button link type="primary" @click="onLexiconEdit(row)" v-auth="'quality:lexicon:edit'" title="修改违禁词"> 修改 </el-button>
+            <el-button link type="primary" @click="onOrderDetail(row)" v-auth="'quality:orderDetail'" title="查看工单详情"> 工单详情 </el-button>
+            <el-button link type="primary" @click="onQualityInspection(row)" v-auth="'quality:inspection'" title="质检"> 质检 </el-button>
           </template>
         </el-table-column>
         <template #empty>
@@ -152,10 +148,10 @@
           @pagination="queryList"
       />
     </el-card>
-    <!--  违禁词新增  -->
-    <lexicon-add ref="lexiconAddRef" @updateList="queryList" />
-    <!--  违禁词编辑  -->
-    <lexicon-edit ref="lexiconEditRef" @updateList="queryList"/>
+    <!-- 工单详情 -->
+    <order-detail ref="oderDetailRef"/>
+    <!-- 质检 -->
+    <quality-inspection ref="qualityInspectionRef" @updateList="queryList"/>
   </div>
 </template>
 
@@ -168,9 +164,8 @@ import {qualityBaseData,qualityList} from '/@/api/quality'
 import {shortcuts} from "/@/utils/constants";
 
 // 引入组件
-const LexiconAdd = defineAsyncComponent(() => import('/@/views/quality/lexicon/components/Lexicon-add.vue')); // 违禁词新增
-const LexiconEdit = defineAsyncComponent(() => import('/@/views/quality/lexicon/components/Lexicon-edit.vue')); // 违禁词编辑
-
+const OrderDetail = defineAsyncComponent(() => import('/@/views/quality/index/components/Order-detail.vue')); // 工单详情
+const QualityInspection = defineAsyncComponent(() => import('/@/views/quality/index/components/Quality-inspection.vue')); // 质检
 // 定义变量内容
 const state = reactive<any>({
   loading: false, // 加载状态
@@ -178,11 +173,11 @@ const state = reactive<any>({
     // 查询参数
     PageIndex: 1,
     PageSize: 10,
-    Source: 0,
+    Source: 1,// 受理待质检
     CreationTimeStart: '', // 创建时间 开始
     CreationTimeEnd: '', // 创建时间 结束
     exTime: [], // 办理期限
-    State: null,
+    State: 0, // 待质检
     Keyword:''
   },
   total: 0, // 总条数
@@ -237,15 +232,15 @@ const resetQuery = (formEl: FormInstance | undefined) => {
   state.queryParams.CreationTimeEnd = '';
   queryList();
 };
-// 新增意见
-const lexiconAddRef = ref<RefType>(); // 意见新增
-const onLexiconAdd = () => {
-  lexiconAddRef.value.openDialog();
+// 查看工单详情
+const oderDetailRef = ref<RefType>();
+const onOrderDetail = (row:any) => {
+  oderDetailRef.value.openDialog(row.order);
 };
-// 修改意见
-const lexiconEditRef = ref<RefType>(); // 修改意见
-const onLexiconEdit = (row: any) => {
-  lexiconEditRef.value.openDialog(row);
+// 质检
+const qualityInspectionRef = ref<RefType>();
+const onQualityInspection = (row: any) => {
+  qualityInspectionRef.value.openDialog(row,state.queryParams.Source);
 };
 // 表格多选
 const multipleTableRef = ref<RefType>();

+ 2 - 6
src/views/quality/lexicon/components/Lexicon-add.vue

@@ -42,8 +42,8 @@
 		</el-form>
 		<template #footer>
 			<span class="dialog-footer">
-				<el-button @click="onCancel" class="default-button">取 消</el-button>
-				<el-button type="primary" @click="onSubmit(ruleFormRef)" v-waves="'light'" :loading="state.loading">确 定 </el-button>
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确 定 </el-button>
 			</span>
 		</template>
 	</el-dialog>
@@ -111,10 +111,6 @@ const openDialog = async () => {
 const closeDialog = () => {
 	state.dialogVisible = false;
 };
-// 取消
-const onCancel = () => {
-	closeDialog();
-};
 const close = () => {
 	dynamicTags.value = [];
 	ruleFormRef.value?.clearValidate();

+ 2 - 6
src/views/quality/lexicon/components/Lexicon-edit.vue

@@ -42,8 +42,8 @@
 		</el-form>
 		<template #footer>
 			<span class="dialog-footer">
-				<el-button @click="onCancel" class="default-button">取 消</el-button>
-				<el-button type="primary" @click="onSubmit(ruleFormRef)" v-waves="'light'" :loading="state.loading">确 定 </el-button>
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确 定 </el-button>
 			</span>
 		</template>
 	</el-dialog>
@@ -118,10 +118,6 @@ const openDialog = async (row: any) => {
 const closeDialog = () => {
 	state.dialogVisible = false;
 };
-// 取消
-const onCancel = () => {
-	closeDialog();
-};
 const close = () => {
 	dynamicTags.value = [];
 	ruleFormRef.value?.clearValidate();

+ 1 - 1
src/views/quality/lexicon/index.vue

@@ -50,7 +50,7 @@
         </el-table-column>
         <el-table-column label="操作" width="120" fixed="right" align="center">
           <template #default="{ row }">
-            <el-button link type="primary" @click="onLexiconEdit(row)" v-auth="'quality:lexicon:edit'" title="修改违禁词"> 修改 </el-button>
+            <el-button link type="primary" @click="onLexiconEdit(row)" v-auth="'quality:lexicon:edit'" title="编辑违禁词"> 编辑 </el-button>
           </template>
         </el-table-column>
         <template #empty>

+ 3 - 7
src/views/quality/project/components/Project-add.vue

@@ -52,15 +52,15 @@
         </el-col>
         <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
           <el-form-item label="质检项描述" prop="describe" :rules="[{ required: false, message: '请输入质检项描述', trigger: 'blur' }]">
-            <el-input v-model="state.ruleForm.describe" placeholder="请输入质检项描述" type="textarea"></el-input>
+            <el-input v-model="state.ruleForm.describe" placeholder="请输入质检项描述" type="textarea" :autosize="{ minRows: 4, maxRows: 8 }"></el-input>
           </el-form-item>
         </el-col>
       </el-row>
     </el-form>
     <template #footer>
 				<span class="dialog-footer">
-					<el-button @click="onCancel" class="default-button">取 消</el-button>
-					<el-button type="primary" @click="onSubmit(ruleFormRef)" v-waves="'light'" :loading="state.loading">确 定 </el-button>
+					<el-button @click="closeDialog" class="default-button">取 消</el-button>
+					<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确 定 </el-button>
 				</span>
     </template>
   </el-dialog>
@@ -104,10 +104,6 @@ const openDialog = async () => {
 const closeDialog = () => {
   state.dialogVisible = false;
 };
-// 取消
-const onCancel = () => {
-  closeDialog();
-};
 const close = ()=>{
   ruleFormRef.value?.clearValidate();
   ruleFormRef.value?.resetFields();

+ 3 - 3
src/views/quality/project/components/Project-edit.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-dialog title="编辑违禁词" v-model="state.dialogVisible" width="769px" draggable @close="close">
+  <el-dialog title="编辑质检项" v-model="state.dialogVisible" width="769px" draggable @close="close">
     <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="110px">
       <el-row :gutter="10">
         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
@@ -52,7 +52,7 @@
         </el-col>
         <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
           <el-form-item label="质检项描述" prop="describe" :rules="[{ required: false, message: '请输入质检项描述', trigger: 'blur' }]">
-            <el-input v-model="state.ruleForm.describe" placeholder="请输入质检项描述" type="textarea"></el-input>
+            <el-input v-model="state.ruleForm.describe" placeholder="请输入质检项描述" type="textarea" :autosize="{ minRows: 4, maxRows: 8 }"></el-input>
           </el-form-item>
         </el-col>
       </el-row>
@@ -60,7 +60,7 @@
     <template #footer>
 				<span class="dialog-footer">
 					<el-button @click="closeDialog" class="default-button">取 消</el-button>
-					<el-button type="primary" @click="onSubmit(ruleFormRef)" v-waves="'light'" :loading="state.loading">确 定 </el-button>
+					<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确 定 </el-button>
 				</span>
     </template>
   </el-dialog>

+ 1 - 1
src/views/quality/project/index.vue

@@ -64,7 +64,7 @@
 				</el-table-column>
 				<el-table-column label="操作" width="120" fixed="right" align="center">
 					<template #default="{ row }">
-						<el-button link type="primary" @click="onProjectEdit(row)" v-auth="'quality:project:edit'" title="修改质检项目"> 修改 </el-button>
+						<el-button link type="primary" @click="onProjectEdit(row)" v-auth="'quality:project:edit'" title="编辑质检项目"> 编辑 </el-button>
 					</template>
 				</el-table-column>
 				<template #empty>

+ 33 - 8
src/views/quality/template/components/Template-add.vue

@@ -44,7 +44,7 @@
 						:rules="[{ required: true, message: '请选择质检项', trigger: 'change' }]"
 					>
 						<el-select v-model="item.obj" placeholder="请选择质检项" class="w100" value-key="name" @change="changeProject($event, index)">
-							<el-option v-for="items in projectArray" :key="items.id" :label="items.name" :value="items" />
+							<el-option v-for="items in projectArray" :key="items.id" :label="items.name" :value="items" :disabled="items.disabled"/>
 						</el-select>
 					</el-form-item>
 				</el-col>
@@ -56,7 +56,7 @@
 				<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 					<el-form-item label="扣分值"> {{ item.grade }} <span class="ml5">分</span> </el-form-item>
 				</el-col>
-				<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+				<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="index != 0">
 					<el-form-item label="">
 						<el-button link type="primary" @click="deleteProject(index)"> <SvgIcon name="ele-Delete" /> </el-button>
 					</el-form-item>
@@ -66,7 +66,7 @@
 		<template #footer>
 			<span class="dialog-footer">
 				<el-button @click="closeDialog" class="default-button">取 消</el-button>
-				<el-button type="primary" @click="onSubmit(ruleFormRef)" v-waves="'light'" :loading="state.loading">确 定 </el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确 定 </el-button>
 			</span>
 		</template>
 	</el-dialog>
@@ -76,7 +76,7 @@
 import { reactive, ref } from 'vue';
 import { ElInput, ElMessage, ElMessageBox, FormInstance } from 'element-plus';
 import { projectList } from '/@/api/quality/project';
-import { templateAdd, templateDelete } from '/@/api/quality/template';
+import { templateAdd } from '/@/api/quality/template';
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['updateList']);
 
@@ -96,7 +96,12 @@ const state = reactive<any>({
 		grouping: '', // 质检分类
 		content: '', // 模板说明
 		isEnable: 1, // 是否启用
-		templateDetails: [],
+		templateDetails: [{
+      name: '',
+      content: '',
+      grade: 0,
+      isIntelligent: 0,
+    }],
 	},
 	loading: false, // 确定按钮loading
 });
@@ -104,9 +109,10 @@ const projectArray = ref<EmptyArrayType>([]); // 质检项
 // 打开弹窗
 const openDialog = async () => {
 	try {
-		const res = await projectList({ PageIndex: 1, PageSize: 999, IsEnable: 1 });
+		const res = await projectList({  IsEnable: 1 });
 		projectArray.value = res.result?.items ?? [];
 		state.dialogVisible = true;
+    console.log(state.ruleForm)
 	} catch (e) {
 		console.log(e);
 	}
@@ -123,6 +129,7 @@ const addItems = () => {
 		grade: 0,
 		isIntelligent: 0,
 	});
+  getEnableAcceptType();
 };
 // 选择质检项
 const changeProject = (item: any, index: number | string) => {
@@ -130,9 +137,10 @@ const changeProject = (item: any, index: number | string) => {
 	state.ruleForm.templateDetails[index].content = item.describe;
 	state.ruleForm.templateDetails[index].grade = item.grade;
 	state.ruleForm.templateDetails[index].isIntelligent = item.isIntelligent;
+  getEnableAcceptType();
 };
 // 删除质检项
-const deleteProject = (index: number) => {
+const deleteProject = (index: number|string) => {
 	ElMessageBox.confirm(`您确定要删除此质检项,是否继续?`, '提示', {
 		confirmButtonText: '确认',
 		cancelButtonText: '取消',
@@ -143,13 +151,30 @@ const deleteProject = (index: number) => {
 	})
 		.then(() => {
 			state.ruleForm.templateDetails.splice(index, 1);
+      getEnableAcceptType();
 		})
 		.catch(() => {});
 };
+// 获取可用的数组
+const getEnableAcceptType = () => {
+  if (state.ruleForm.templateDetails.length) {
+    const array = state.ruleForm.templateDetails.map((v: any) => v.name);
+    projectArray.value.forEach((v: any) => {
+      v.disabled = array.includes(v.name);
+    });
+  }
+};
 const close = () => {
 	ruleFormRef.value?.clearValidate();
 	ruleFormRef.value?.resetFields();
-  state.ruleForm.templateDetails = [];
+  state.ruleForm.templateDetails = [
+    {
+      name: '',
+      content: '',
+      grade: 0,
+      isIntelligent: 0,
+    }
+  ]
 };
 // 新增
 const onSubmit = (formEl: FormInstance | undefined) => {

+ 70 - 57
src/views/quality/template/components/Template-edit.vue

@@ -44,34 +44,20 @@
 						:rules="[{ required: true, message: '请选择质检项', trigger: 'change' }]"
 					>
 						<el-select v-model="item.obj" placeholder="请选择质检项" class="w100" value-key="name" @change="changeProject($event, index)">
-							<el-option v-for="items in projectArray" :key="items.id" :label="items.name" :value="items" />
+							<el-option v-for="items in projectArray" :key="items.id" :label="items.name" :value="items" :disabled="items.disabled" />
 						</el-select>
 					</el-form-item>
 				</el-col>
 				<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
-					<el-form-item
-						label="AI质检"
-						:prop="`templateDetails.${index}.isIntelligent`"
-						:rules="[{ required: false, message: '请选择是否AI质检', trigger: 'change' }]"
-					>
+					<el-form-item label="AI质检">
 						{{ item.isIntelligent === 1 ? '是' : '否' }}
 					</el-form-item>
 				</el-col>
 				<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
-					<el-form-item
-						label="扣分值"
-						:prop="`templateDetails.${index}.grade`"
-						:rules="[{ required: false, message: '请选择扣分值', trigger: 'change' }]"
-					>
-						{{ item.grade }} <span class="ml5">分</span>
-					</el-form-item>
+					<el-form-item label="扣分值"> {{ item.grade }} <span class="ml5">分</span> </el-form-item>
 				</el-col>
-				<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
-					<el-form-item
-						label=""
-						:prop="`templateDetails.${index}.isIntelligent`"
-						:rules="[{ required: false, message: '请选择是否AI质检', trigger: 'change' }]"
-					>
+				<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="index != 0">
+					<el-form-item label="">
 						<el-button link type="primary" @click="deleteProject(index)"> <SvgIcon name="ele-Delete" /> </el-button>
 					</el-form-item>
 				</el-col>
@@ -80,7 +66,7 @@
 		<template #footer>
 			<span class="dialog-footer">
 				<el-button @click="closeDialog" class="default-button">取 消</el-button>
-				<el-button type="primary" @click="onSubmit(ruleFormRef)" v-waves="'light'" :loading="state.loading">确 定 </el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确 定 </el-button>
 			</span>
 		</template>
 	</el-dialog>
@@ -88,7 +74,7 @@
 
 <script setup lang="ts" name="qualityLexiconEdit">
 import { reactive, ref } from 'vue';
-import {ElInput, ElMessage, ElMessageBox, FormInstance} from 'element-plus';
+import { ElInput, ElMessage, ElMessageBox, FormInstance } from 'element-plus';
 import { templateDetail, templateUpdate } from '/@/api/quality/template';
 import { projectList } from '/@/api/quality/project';
 // 定义子组件向父组件传值/事件
@@ -105,11 +91,18 @@ const ruleFormRef = ref<FormInstance>();
 const state = reactive<any>({
 	dialogVisible: false, // 弹窗显示隐藏
 	ruleForm: {
-    name: '', // 模板名称
-    grouping: '', // 质检分类
-    content: '', // 模板说明
-    isEnable: 1, // 是否启用
-    templateDetails: [],
+		name: '', // 模板名称
+		grouping: '', // 质检分类
+		content: '', // 模板说明
+		isEnable: 1, // 是否启用
+		templateDetails: [
+			{
+				name: '',
+				content: '',
+				grade: 0,
+				isIntelligent: 0,
+			},
+		],
 	},
 	loading: false, // 确定按钮loading
 });
@@ -119,13 +112,13 @@ const openDialog = async (row: any) => {
 	try {
 		const res = await templateDetail(row.id);
 		state.ruleForm = res.result ?? {};
-    if(state.ruleForm.templateDetails && state.ruleForm.templateDetails.length){
-      for(let i of state.ruleForm.templateDetails){
-        i.obj = {...i}
-      }
-    }
-    const response = await projectList({ PageIndex: 1, PageSize: 999, IsEnable: 1 });
-    projectArray.value = response.result?.items ?? [];
+		if (state.ruleForm.templateDetails && state.ruleForm.templateDetails.length) {
+			for (let i of state.ruleForm.templateDetails) {
+				i.obj = { ...i };
+			}
+		}
+		const response = await projectList({  IsEnable: 1 });
+		projectArray.value = response.result?.items ?? [];
 		state.dialogVisible = true;
 	} catch (e) {
 		console.log(e);
@@ -136,40 +129,60 @@ const closeDialog = () => {
 	state.dialogVisible = false;
 };
 const close = () => {
-  state.ruleForm.templateDetails = [];
+	state.ruleForm.templateDetails = [];
 	ruleFormRef.value?.clearValidate();
 	ruleFormRef.value?.resetFields();
+  state.ruleForm.templateDetails = [
+    {
+      name: '',
+      content: '',
+      grade: 0,
+      isIntelligent: 0,
+    }
+  ]
 };
 // 新增质检项
 const addItems = () => {
-  state.ruleForm.templateDetails.push({
-    name: '',
-    content: '',
-    grade: 0,
-    isIntelligent: 0,
-  });
+	state.ruleForm.templateDetails.push({
+		name: '',
+		content: '',
+		grade: 0,
+		isIntelligent: 0,
+	});
+	getEnableAcceptType();
 };
 // 选择质检项
 const changeProject = (item: any, index: number | string) => {
-  state.ruleForm.templateDetails[index].name = item.name;
-  state.ruleForm.templateDetails[index].content = item.describe;
-  state.ruleForm.templateDetails[index].grade = item.grade;
-  state.ruleForm.templateDetails[index].isIntelligent = item.isIntelligent;
+	state.ruleForm.templateDetails[index].name = item.name;
+	state.ruleForm.templateDetails[index].content = item.describe;
+	state.ruleForm.templateDetails[index].grade = item.grade;
+	state.ruleForm.templateDetails[index].isIntelligent = item.isIntelligent;
+	getEnableAcceptType();
+};
+// 获取可用的数组
+const getEnableAcceptType = () => {
+	if (state.ruleForm.templateDetails.length) {
+		const array = state.ruleForm.templateDetails.map((v: any) => v.name);
+		projectArray.value.forEach((v: any) => {
+			v.disabled = array.includes(v.name);
+		});
+	}
 };
 // 删除质检项
-const deleteProject = (index: number) => {
-  ElMessageBox.confirm(`您确定要删除此质检项,是否继续?`, '提示', {
-    confirmButtonText: '确认',
-    cancelButtonText: '取消',
-    type: 'warning',
-    draggable: true,
-    cancelButtonClass: 'default-button',
-    autofocus: false,
-  })
-      .then(() => {
-        state.ruleForm.templateDetails.splice(index, 1);
-      })
-      .catch(() => {});
+const deleteProject = (index: number | string) => {
+	ElMessageBox.confirm(`您确定要删除此质检项,是否继续?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+		autofocus: false,
+	})
+		.then(() => {
+			state.ruleForm.templateDetails.splice(index, 1);
+			getEnableAcceptType();
+		})
+		.catch(() => {});
 };
 // 新增
 const onSubmit = (formEl: FormInstance | undefined) => {

+ 1 - 1
src/views/quality/template/index.vue

@@ -57,7 +57,7 @@
 				</el-table-column>
 				<el-table-column label="操作" width="120" fixed="right" align="center">
 					<template #default="{ row }">
-						<el-button link type="primary" @click="onTemplateEdit(row)" v-auth="'quality:template:edit'" title="修改模板"> 修改 </el-button>
+						<el-button link type="primary" @click="onTemplateEdit(row)" v-auth="'quality:template:edit'" title="编辑模板"> 编辑 </el-button>
 					</template>
 				</el-table-column>
 				<template #empty>