You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3185 lines
95 KiB
3185 lines
95 KiB
<template> |
|
<basic-container v-loading="PageLoading" element-loading-text="数据正在加载中..."> |
|
<!-- 首页表格 --> |
|
<div class="avue-crud"> |
|
<!-- 搜索模块 --> |
|
<div v-h5uShow="search"> |
|
<!-- 查询模块 --> |
|
<el-form :inline="true" :model="TopQuery" class="el-fr-d"> |
|
<el-form-item label="工单号" class="el-times"> |
|
<div class="el_div_input"> |
|
<el-input |
|
type="text" |
|
clearable |
|
v-model="TopQuery.workOrderNumbers" |
|
placeholder="请输入工单号" |
|
/><el-icon |
|
class="el_dy_icon" |
|
@click="MultilineSearch('工单号搜索', TopQuery.workOrderNumbers)" |
|
><CirclePlusFilled |
|
/></el-icon> |
|
</div> |
|
</el-form-item> |
|
<el-form-item label="订单自编号" class="el-times"> |
|
<div class="el_div_input"> |
|
<el-input |
|
clearable |
|
type="text" |
|
v-model="TopQuery.orderCodes" |
|
placeholder="请输入订单自编号" |
|
/><el-icon |
|
class="el_dy_icon" |
|
@click="MultilineSearch('订单自编号搜索', TopQuery.orderCodes)" |
|
><CirclePlusFilled |
|
/></el-icon> |
|
</div> |
|
</el-form-item> |
|
<el-form-item label="创建日期"> |
|
<el-date-picker |
|
v-model="TopQuery.CreateTiem" |
|
type="datetimerange" |
|
unlink-panels |
|
range-separator="至" |
|
start-placeholder="开始时间" |
|
end-placeholder="结束时间" |
|
:shortcuts="shortcuts" |
|
:default-time="defaultTime2" |
|
/> |
|
</el-form-item> |
|
<!-- 查询按钮 --> |
|
<el-form-item class="el-btn"> |
|
<el-button type="primary" icon="el-icon-search" @click="searchChange">搜 索</el-button> |
|
<el-button icon="el-icon-delete" @click="searchReset()">清 空</el-button> |
|
</el-form-item> |
|
</el-form> |
|
</div> |
|
<el-tabs type="border-card" v-model="tabValue" @tab-change="tabChenge" class="el_tabs"> |
|
<div></div> |
|
<template v-for="item in TabList"> |
|
<el-tab-pane v-if="item.state" :name="item.name" :label="item.label" :key="item.name"> |
|
</el-tab-pane> |
|
</template> |
|
</el-tabs> |
|
<!-- 控件模块 --> |
|
<el-row> |
|
<div class="avue-crud__header"> |
|
<!-- 头部左侧按钮模块 --> |
|
<div class="avue-crud__left"> |
|
<el-button |
|
type="primary" |
|
icon="Edit" |
|
v-if="ButtonPermissions.add" |
|
@click="CreateworkOrder" |
|
>创建工单</el-button |
|
> |
|
<el-button |
|
type="primary" |
|
icon="Download" |
|
v-if="ButtonPermissions.export_Report" |
|
@click="ExportSelection" |
|
>Excel导出</el-button |
|
> |
|
<el-button type="primary" icon="Download" v-if="ButtonPermissions.Timed_outexport" |
|
>Excel超时导出</el-button |
|
> |
|
<el-button type="primary" icon="Avatar" v-if="ButtonPermissions.defaultassignments" |
|
>默认指派</el-button |
|
> |
|
<el-button |
|
type="primary" |
|
icon="CloseBold" |
|
v-if="ButtonPermissions.batchReject" |
|
@click="BatchReturnResults" |
|
>结果批量打回</el-button |
|
> |
|
<el-button type="primary" icon="FolderChecked" v-if="ButtonPermissions.ManagerConfirmed" |
|
>完结批量审核</el-button |
|
> |
|
<el-button |
|
@click="ResultConfirmed" |
|
type="primary" |
|
icon="Select" |
|
v-if="ButtonPermissions.Batchdetermination" |
|
>批量处理结果提交</el-button |
|
> |
|
<el-button type="primary" icon="Stamp" v-if="ButtonPermissions.Result_review" |
|
>结果批量审核</el-button |
|
> |
|
<el-button |
|
type="primary" |
|
icon="Pointer" |
|
v-if="ButtonPermissions.assignment" |
|
@click="WorkOrderAssignment" |
|
>工单指派</el-button |
|
> |
|
<el-button |
|
type="primary" |
|
icon="User" |
|
v-if="ButtonPermissions.applyArbitration" |
|
@click="CustomerServiceIntervention" |
|
>客服介入</el-button |
|
> |
|
<el-button |
|
type="primary" |
|
icon="EditPen" |
|
v-if="ButtonPermissions.DingTalkNumber" |
|
@click="DingTalk" |
|
>钉钉号填写</el-button |
|
> |
|
<!-- <el-button type="primary" icon="Stamp" v-if="ButtonPermissions.batchFinish" |
|
>批量完结</el-button |
|
> --> |
|
<el-button type="primary" icon="Stamp" v-if="ButtonPermissions.ArbitrationDetermination" |
|
>批量完结审核</el-button |
|
> |
|
<el-button |
|
type="primary" |
|
icon="Coin" |
|
v-if="ButtonPermissions.Financial_accounting" |
|
@click="Financialfillingbtn" |
|
>财务入账</el-button |
|
> |
|
</div> |
|
<!-- 头部右侧按钮模块 --> |
|
<div class="avue-crud__right"> |
|
<el-tooltip content="刷新数据" placement="top"> |
|
<el-button icon="el-icon-refresh" @click="searchChangeS" circle></el-button> |
|
</el-tooltip> |
|
|
|
<el-tooltip content="重置表格搜索" placement="top"> |
|
<el-button icon="CircleClose" @click="ResetTableSearch" circle></el-button> |
|
</el-tooltip> |
|
|
|
<el-tooltip content="表格设置" placement="bottom"> |
|
<el-button icon="Operation" @click="showdrawer(true)" circle></el-button> |
|
</el-tooltip> |
|
|
|
<el-tooltip content="高级搜索" placement="bottom"> |
|
<el-button icon="Search" @click="searchHide" circle></el-button> |
|
</el-tooltip> |
|
</div> |
|
</div> |
|
</el-row> |
|
|
|
<!-- 首页表格 --> |
|
<el-row> |
|
<!-- 列表模块 --> |
|
<tablecmt |
|
class="tableNode" |
|
:columnList="details.columnListPublic" |
|
:tableData="data" |
|
:loading="loadingObj.list" |
|
@inputTxt="inputsc" |
|
@timeCheck="timesc" |
|
@selectCheck="selectsc" |
|
@selection="selectionChange" |
|
> |
|
<template #default="slotProps"> |
|
<template v-if="slotProps.scope.column.label === '异常工单号'"> |
|
<el-text class="el_textBtn" @click="ViewDetailsRow(slotProps.scope.row)"> |
|
{{ |
|
slotProps.scope.column.label === '异常工单号' |
|
? slotProps.scope.row.workOrderNumber |
|
: '' |
|
}} |
|
</el-text> |
|
</template> |
|
|
|
<template v-if="slotProps.scope.column.label === '操作'"> |
|
<el-text @click="ViewDetails(slotProps.scope.row)">查看</el-text> |
|
|
|
<el-text |
|
@click="WorkOrderAppeal(slotProps.scope.row)" |
|
v-if="PermissionButton.Work_order_appeal(slotProps.scope.row)" |
|
>申诉</el-text |
|
> |
|
<el-text |
|
v-if="PermissionButton.Process_submission_button" |
|
@click="ResultConfirmed(slotProps.scope.row)" |
|
>处理提交</el-text |
|
> |
|
<el-text |
|
@click="CancelWorkOrderAppeal(slotProps.scope.row)" |
|
v-if="PermissionButton.Cancel_appeal_button(slotProps.scope.row)" |
|
>取消申诉</el-text |
|
> |
|
<el-text |
|
v-if="PermissionButton.Appeal_editor_button(slotProps.scope.row)" |
|
@click="WorkOrderAppeal(slotProps.scope.row, 'edit')" |
|
>编辑</el-text |
|
> |
|
<el-text |
|
v-if="PermissionButton.Delete_appeal_button(slotProps.scope.row)" |
|
@click="Deleteappealrecords(slotProps.scope.row, 'edit')" |
|
>删除记录</el-text |
|
> |
|
</template> |
|
</template> |
|
</tablecmt> |
|
</el-row> |
|
|
|
<!-- 分页模块 --> |
|
<el-row class="el-fy"> |
|
<div class="avue-crud__pagination flex-c-sb" style="width: 100%"> |
|
<div></div> |
|
<el-pagination |
|
align="right" |
|
background |
|
@size-change="sizeChange" |
|
@current-change="currentChange" |
|
:current-page="page.currentPage" |
|
:page-sizes="[30, 50, 80, 120]" |
|
:page-size="page.pageSize" |
|
layout="total, sizes, prev, pager, next, jumper" |
|
:total="page.total" |
|
> |
|
</el-pagination> |
|
</div> |
|
</el-row> |
|
</div> |
|
<!-- 申诉弹窗 --> |
|
<el-dialog |
|
v-model="appeal.dialogappeal" |
|
:title="appeal.AppealeditorState ? '工单申述编辑' : '工单申诉'" |
|
width="60%" |
|
> |
|
<el-form ref="appealruleFormRef" :model="appeal" :rules="appealrules"> |
|
<div class="el_appeal" v-loading="appeal.loadingappeal" element-loading-text="Loading..."> |
|
<el-form-item label="选择实际责任方" prop="Appealselection"> |
|
<el-select |
|
v-model="appeal.Appealselection" |
|
clearable |
|
filterable |
|
multiple |
|
placeholder="请选择实际责任方" |
|
> |
|
<el-option |
|
v-for="item in warehouseData" |
|
:key="item.value" |
|
:label="item.label" |
|
:value="item.value" |
|
/> |
|
</el-select> |
|
</el-form-item> |
|
<el-form-item label="申诉原因" prop="Reasonforappeal"> |
|
<el-input |
|
v-model="appeal.Reasonforappeal" |
|
:rows="4" |
|
type="textarea" |
|
placeholder="请输入申诉原因" |
|
/> |
|
</el-form-item> |
|
<el-form-item label="照片(上传一张)"> |
|
<el-upload |
|
v-model:file-list="appeal.AppealAttachment" |
|
list-type="picture-card" |
|
:action="doubledCount" |
|
:before-upload="beforeAvatarUpload" |
|
:headers="headers" |
|
multiple |
|
drag |
|
> |
|
<el-icon><Plus /></el-icon> |
|
</el-upload> |
|
</el-form-item> |
|
|
|
<span class="el_sdialog-footer"> |
|
<el-button @click="appeal.dialogappeal = false">取消</el-button> |
|
<el-button type="primary" @click="Appealbutton"> 确定 </el-button> |
|
</span> |
|
</div> |
|
</el-form> |
|
</el-dialog> |
|
<!-- 处理结果批量打回弹窗 --> |
|
<el-dialog v-model="BatchReturn.dialogReturn" title="批量打回" width="40%" class="plAllret"> |
|
<el-form |
|
v-loading="BatchReturn.repulseloading" |
|
element-loading-text="正在打回中..." |
|
label-position="top" |
|
label-width="100px" |
|
:model="BatchReturn.BatchFrom" |
|
:rules="BatchReturn.rules" |
|
ref="batchReturnForm" |
|
> |
|
<el-form-item label="打回原因" prop="txt"> |
|
<el-input |
|
v-model="BatchReturn.BatchFrom.txt" |
|
type="textarea" |
|
:rows="4" |
|
placeholder="请输入打回原因" |
|
/> |
|
</el-form-item> |
|
|
|
<el-form-item label="流转营业部" prop="businessDepartment"> |
|
<el-select |
|
v-model="BatchReturn.BatchFrom.businessDepartment" |
|
multiple |
|
filterable |
|
default-first-option |
|
:reserve-keyword="false" |
|
placeholder="请选择要打回的营业部" |
|
> |
|
<el-option |
|
v-for="item in warehouseData" |
|
:key="item.value" |
|
:label="item.label" |
|
:value="item.value" |
|
/> |
|
</el-select> |
|
</el-form-item> |
|
</el-form> |
|
<template #footer> |
|
<span class="dialog-footer"> |
|
<el-button @click="BatchReturn.dialogReturn = false">取消</el-button> |
|
<el-button type="primary" @click="ConfirmReturn()" :disabled="BatchReturn.repulseloading"> |
|
提交 |
|
</el-button> |
|
</span> |
|
</template> |
|
</el-dialog> |
|
<!-- 工单指派弹窗 --> |
|
<el-dialog v-model="assignFrom.dialogassign" title="工单指派" width="40%" class="plAllret"> |
|
<el-form |
|
v-loading="assignFrom.AssignLoad" |
|
element-loading-text="正在处理中..." |
|
label-position="top" |
|
label-width="100px" |
|
:model="assignFrom" |
|
:rules="assignFrom.rules" |
|
ref="assignFromForm" |
|
> |
|
<el-form-item label="客服列表" prop="businessDepartment"> |
|
<el-select |
|
v-model="assignFrom.businessDepartment" |
|
filterable |
|
default-first-option |
|
:reserve-keyword="false" |
|
placeholder="请选择指派客服" |
|
> |
|
<el-option |
|
v-for="item in assignFrom.customerService" |
|
:key="item.value" |
|
:label="item.realName" |
|
:value="item.id" |
|
/> |
|
</el-select> |
|
</el-form-item> |
|
</el-form> |
|
<template #footer> |
|
<span class="dialog-footer"> |
|
<el-button @click="assignFrom.dialogassign = false">取消</el-button> |
|
<el-button type="primary" @click="Assignbutton" :disabled="assignFrom.AssignLoad"> |
|
确定 |
|
</el-button> |
|
</span> |
|
</template> |
|
</el-dialog> |
|
|
|
<!-- 客服介入 --> |
|
<el-dialog |
|
v-model="CustomerServiceForm.loadingCustomer" |
|
:close-on-click-modal="false" |
|
title="客服介入" |
|
width="35%" |
|
class="el_Customer" |
|
> |
|
<el-form |
|
:model="CustomerServiceForm" |
|
v-loading="CustomerServiceForm.dialog" |
|
element-loading-text="正在处理中..." |
|
label-position="top" |
|
> |
|
<el-form-item label="介入原因"> |
|
<el-input |
|
v-model="CustomerServiceForm.reasonRemarks" |
|
:autosize="{ minRows: 6, maxRows: 6 }" |
|
type="textarea" |
|
placeholder="请输入介入原因" |
|
/> |
|
</el-form-item> |
|
</el-form> |
|
|
|
<template #footer> |
|
<span class="dialog-footer"> |
|
<el-button @click="CustomerServiceForm.loadingCustomer = false">关闭</el-button> |
|
<el-button |
|
type="primary" |
|
@click="InterventionSubmission" |
|
:disabled="CustomerServiceForm.dialog" |
|
> |
|
提交 |
|
</el-button> |
|
</span> |
|
</template> |
|
</el-dialog> |
|
|
|
<!-- 搜索弹窗 --> |
|
<div class="Searchboxpop-upwindow"> |
|
<el-dialog |
|
v-model="Searchboxpop.dialogSearch" |
|
:title="Searchboxpop.SearchboxpopUpwindowtitle" |
|
:show-close="false" |
|
:fullscreen="Searchboxpop.fullscreen" |
|
:close-on-click-modal="false" |
|
:draggable="true" |
|
:overflow="false" |
|
width="50%" |
|
> |
|
<template #header> |
|
<div class="title"> |
|
<span>{{ Searchboxpop.SearchboxpopUpwindowtitle }}</span> |
|
</div> |
|
<div class="div_icon"> |
|
<el-icon @click="minimize"><Minus /></el-icon> |
|
<el-icon @click="maximize"><FullScreen /></el-icon> |
|
<el-icon @click="close"><CloseBold /></el-icon> |
|
</div> |
|
</template> |
|
<el-input |
|
v-model="TopQuery.inputAll" |
|
style="width: 100%; height: 100%" |
|
:autosize="{ minRows: 24, maxRows: 24 }" |
|
type="textarea" |
|
placeholder="每一行算一个搜索单位“多个请【换行】输入" |
|
/> |
|
<template #footer> |
|
<div class="dialog-footer"> |
|
<el-button type="primary" @click="dialogSearchSubmit"> 确认 </el-button> |
|
</div> |
|
</template> |
|
</el-dialog> |
|
</div> |
|
<!-- 最小化窗口 --> |
|
<div class="minimize_windows" v-if="Searchboxpop.MinimizeState"> |
|
<div class="title"> |
|
<span>{{ Searchboxpop.SearchboxpopUpwindowtitle }}</span> |
|
</div> |
|
<div class="div_icon"> |
|
<el-icon @click="ExpandWindow"><FullScreen /></el-icon> |
|
<el-icon @click="DestroyWindow"><Close /></el-icon> |
|
</div> |
|
</div> |
|
|
|
<Tableexportcomponent |
|
:menuData="details.columnListPublic" |
|
:data="data" |
|
:checkedData="details.selectionList" |
|
:tcTableexport="ExportObjects.tcTableexport" |
|
@update:tcTableexport="updateTcTableexport" |
|
></Tableexportcomponent> |
|
|
|
<el-dialog |
|
v-model="ExportObjects.ExportSelection" |
|
style="width: 30%; height: 150px" |
|
class="el_exportSelection" |
|
> |
|
<el-tooltip |
|
class="box-item" |
|
effect="dark" |
|
content="从服务器导出数据,数据量大时可能会导致卡顿" |
|
placement="top-start" |
|
> |
|
<el-button class="el_title_a" type="primary" @click="NetworkExport"> 全部导出 </el-button> |
|
</el-tooltip> |
|
<el-tooltip |
|
class="box-item" |
|
effect="dark" |
|
content="从本地导出,导出当前页面支持自【定义导出字段】和【自定义表名】" |
|
placement="top-end" |
|
> |
|
<el-button class="el_title_b" type="primary" @click="LocalExport"> 本地导出 </el-button> |
|
</el-tooltip> |
|
</el-dialog> |
|
|
|
<!-- 钉钉号填写 --> |
|
<el-dialog v-model="DingTalkfilling.dialogDingTalk" title="钉钉号填写" width="30%"> |
|
<div |
|
class="el_DingTalk" |
|
v-loading="DingTalkfilling.loading" |
|
element-loading-text="Loading..." |
|
> |
|
<el-form :model="DingTalkfilling" label-width="120px"> |
|
<el-form-item label="钉钉流程号"> |
|
<el-input v-model="DingTalkfilling.processNumber" placeholder="请填写钉钉号" /> |
|
</el-form-item> |
|
<el-form-item label="审核人"> |
|
<el-input v-model="DingTalkfilling.reviewedBy" placeholder="请填写审核人" /> |
|
</el-form-item> |
|
<el-form-item label="审核时间"> |
|
<el-date-picker |
|
v-model="DingTalkfilling.auditTime" |
|
type="datetime" |
|
format="YYYY-MM-DD" |
|
value-format="YYYY-MM-DD HH:mm:ss" |
|
placeholder="请选择审核时间" |
|
/> |
|
</el-form-item> |
|
</el-form> |
|
</div> |
|
<template #footer> |
|
<span class="dialog-footer"> |
|
<el-button @click="DingTalkfilling.dialogDingTalk = false">关闭</el-button> |
|
<el-button type="primary" @click="DingTalkSubmit" :disabled="DingTalkfilling.loading"> |
|
确认 |
|
</el-button> |
|
</span> |
|
</template> |
|
</el-dialog> |
|
<!-- 财务入账弹窗 --> |
|
<el-dialog v-model="FinancialFrom.loadingFinancial" title="财务入账" width="30%"> |
|
<div |
|
class="el_DingTalk" |
|
v-loading="FinancialFrom.loading" |
|
element-loading-text="正在处理中..." |
|
> |
|
<el-form :model="FinancialFrom" label-width="120px"> |
|
<el-form-item label="操作人"> |
|
<el-input v-model="FinancialFrom.operator" placeholder="请填写操作人" /> |
|
</el-form-item> |
|
<el-form-item label="财务入账时间"> |
|
<el-date-picker |
|
v-model="FinancialFrom.entryTime" |
|
type="datetime" |
|
format="YYYY-MM-DD" |
|
value-format="YYYY-MM-DD HH:mm:ss" |
|
placeholder="请选择财务入账时间" |
|
/> |
|
</el-form-item> |
|
</el-form> |
|
</div> |
|
<template #footer> |
|
<span class="dialog-footer"> |
|
<el-button @click="FinancialFrom.loadingFinancial = false">取消</el-button> |
|
<el-button |
|
type="primary" |
|
@click="FinancialfillingSubmit" |
|
:disabled="FinancialFrom.loading" |
|
> |
|
确认 |
|
</el-button> |
|
</span> |
|
</template> |
|
</el-dialog> |
|
</basic-container> |
|
<!-- 列表配置显示 --> |
|
<template v-for="columnList in columnListNames" :key="columnList"> |
|
<edittablehead |
|
v-if="columnListName == columnList" |
|
@closce="showdrawer" |
|
:drawerShow="drawerShow" |
|
:columnList="details.columnListPublic" |
|
v-model="details.columnListPublic" |
|
:columnListName="columnListName" |
|
> |
|
</edittablehead> |
|
</template> |
|
</template> |
|
<script> |
|
export default { |
|
name: '/aftersales/aftersalesWorkOrder', |
|
}; |
|
</script> |
|
<script setup> |
|
import { ref, reactive, toRefs, computed, onMounted, nextTick, watch } from 'vue'; |
|
|
|
import { useStore } from 'vuex'; |
|
import { |
|
processRowPropertyName, |
|
setNodeHeight, |
|
downloadXls, |
|
handleClearTableQuery, |
|
deepClone, |
|
} from '@/utils/util'; |
|
import { ElMessageBox, ElMessage } from 'element-plus'; |
|
import { getDictionaryBiz } from '@/api/system/dict'; |
|
import { getToken } from '@/utils/auth'; |
|
import { setStore, getStore } from 'utils/store'; // 从 'utils/store' 导入 setStore 和 getStore 方法 |
|
import dayjs from 'dayjs'; |
|
import { getDetailWarehouse, getDeptWarehouse } from '@/api/basicdata/basicdataWarehouse'; //处理方 |
|
import { |
|
$_getList, |
|
$_submit, |
|
$_getDetail, |
|
$_remove, |
|
$_getProcessor, |
|
$_AddReply, |
|
$_getExchangeList, |
|
$_getInfo, |
|
$_batchReturn, |
|
$_assignCustomerService, |
|
$_getCustomerServicePersonnel, |
|
$_arbitrate, |
|
$_addCompletionEnd, |
|
$_appealSubmit, |
|
$_listSettlement, |
|
$_listAppeal, |
|
$_listOwn, |
|
$_moneyUpdate, |
|
$_updateWorkList, |
|
$_updateManagerConfirmed, |
|
$_updateWorkOrderStatus, |
|
$_AppealDetails, |
|
$_Cancelappeal, |
|
$_getDetails, |
|
$_settlementUpdate, |
|
$_updateArbitrateStatu, |
|
$_exportAftersalesWorkOrder, |
|
$_aftersalesCustomerMall, |
|
$_aftersalesCustomerMallremove, |
|
$_aftersalesCustomerMallsave, |
|
$_aftersalesCustomerMallsetDefault, |
|
$_updateFinanceTime, |
|
$_basicdataTripartiteMall, |
|
$_aftersalesCustomerMallgetByClientId, |
|
$_exportaftersalesOvertimeFine, |
|
$_exportWorkOrder0, |
|
$_exportWorkOrder1, |
|
$_exportWorkOrder2, |
|
$_exportWorkOrder3, |
|
$_exportWorkOrder4, |
|
} from '@/api/aftersales/aftersalesWorkOrder'; |
|
import { |
|
columnList, |
|
columnList1, |
|
columnList2, |
|
columnList3, |
|
columnList4, |
|
columnList5, |
|
columnList6, |
|
columnList7, |
|
columnList8, |
|
columnList9, |
|
columnList10, |
|
recordList, |
|
Claimsfield, |
|
AppealList, |
|
timeoutList, |
|
CustomerColumnList, |
|
MallassignmentColumnList, |
|
customerserviceColumnList, |
|
} from '@/option/aftersales/vueTvemp.js'; |
|
import { objectKeys } from '@antfu/utils'; |
|
const Tableexportcomponent = defineAsyncComponent(() => |
|
import('@/components/Tableexportcomponent/Tableexportcomponent.vue') |
|
); |
|
|
|
const columnListNames = [ |
|
'columnList', |
|
'columnList1', |
|
'columnList2', |
|
'columnList3', |
|
'columnList4', |
|
'columnList5', |
|
'columnList6', |
|
'columnList7', |
|
'columnList8', |
|
'columnList9', |
|
'columnList10', |
|
]; |
|
// (0, '全部'), |
|
// (8, '待回复'), |
|
// (3, '待处理(新建)'), |
|
// (1, '处理中'), |
|
// (4, '理赔金额未出'), |
|
// (2, '处理完毕'), |
|
// (5, '客服介入'), |
|
// (9, '待审核'), |
|
// (6, '完结'), |
|
// (10, '申诉列表'), |
|
// (7, '超时未处理'), |
|
|
|
const $router = useRouter(); //跳转 |
|
const $useStore = useStore(); //权限 |
|
const $route = useRoute(); //获取地址栏参数 |
|
const tabValue = ref(0); //菜单激活 |
|
const UserPermissions = ref(''); //当前人身份 |
|
const workOrderStatus = ref(30); //工单状态 |
|
const PageLoading = ref(false); //页面loading |
|
const warehouseData = ref([]); //仓库信息 |
|
const UserInfo = ref({}); //登陆人信息 |
|
const assignFromForm = ref(null); //指派客服表单实例 |
|
const dialogSearch = ref(false); //弹窗搜索 |
|
const dialogSearchTitle = ref(''); //弹出搜索记录 |
|
const ExportObjects = ref({ |
|
tcTableexport: false, //本地导出 |
|
ExportSelection: false, //导出选择弹窗 |
|
}); |
|
// 客服介入 |
|
const CustomerServiceForm = ref({ |
|
loadingCustomer: false, |
|
dialog: false, |
|
}); |
|
// 钉钉号 |
|
const DingTalkfilling = ref({ |
|
dialogDingTalk: false, |
|
loading: false, |
|
}); |
|
// 财务入账 |
|
const FinancialFrom = ref({ |
|
loadingFinancial: false, |
|
loading: false, |
|
}); |
|
// 多行搜索 |
|
const Searchboxpop = ref({ |
|
SearchboxpopUpwindowtitle: '', //标题 |
|
dialogSearch: false, ///弹窗是否展开 |
|
fullscreen: false, //是否全屏 |
|
MinimizeState: false, //是否最小化 |
|
}); |
|
const assignFrom = ref({ |
|
dialogassign: false, |
|
AssignLoad: false, |
|
customerService: [], //客服列表 |
|
rules: { |
|
businessDepartment: [{ required: true, message: '请选择要指派的客服', trigger: 'blur' }], |
|
}, |
|
}); //工单指派总部客服 |
|
const batchReturnForm = ref(null); |
|
const BatchReturn = ref({ |
|
//批量打回弹窗 |
|
dialogReturn: false, |
|
// 批量打回loading, |
|
repulseloading: false, |
|
BatchFrom: {}, |
|
rules: { |
|
txt: [{ required: true, message: '请输入打回原因', trigger: 'blur' }], |
|
businessDepartment: [{ required: true, message: '请选择至少一个营业部', trigger: 'change' }], |
|
}, |
|
}); |
|
const appeal = ref({ |
|
dialogappeal: false, //工单申诉弹窗 |
|
AppealeditorState: false, //申诉是否为编辑状态(默认否) |
|
loadingappeal: false, //申诉弹窗loading |
|
Appealselection: [], //申诉弹窗选中数据 |
|
AppealAttachment: [], //申诉照片 |
|
Reasonforappeal: '', //申诉原因 |
|
selectList: [], //申诉列表 |
|
selectionList: [], //要申诉的数据 |
|
}); |
|
const appealruleFormRef = ref(); |
|
const columnListName = ref('columnList'); |
|
/** |
|
* 人身份 |
|
* Warehouse_customer_service 仓库客服 |
|
* Headquarters_customer_service 总部客服 |
|
* Headquarters_Manager 总部客服经理 |
|
*/ |
|
const Useridentity = { |
|
Warehouse_customer_service: '仓库客服', |
|
Headquarters_customer_service: '总部客服', |
|
Headquarters_Manager: '总部客服经理', |
|
}; |
|
const TabPermissions = ref(0); //记录的菜单编号 |
|
const TopQuery = ref({ |
|
CreateTiem: [], |
|
}); |
|
// 必要初始化字典 |
|
const dictionaries = { |
|
pc_work_order: ref([]), ////异常类型 |
|
pc_discovery_node: ref([]), //发现环节 |
|
work_order_status: ref([]), //工单状态 |
|
after_sales_visits: ref([]), //角色部门 |
|
}; |
|
// 菜单标签 |
|
const createTabItem = (name, label) => ({ |
|
name, |
|
label, |
|
state: true, |
|
DataList: [], |
|
total: 0, |
|
request: true, //是否请求 |
|
currentPage: 1, |
|
pageSize: 30, |
|
query: {}, |
|
}); |
|
|
|
const TabList = ref([ |
|
createTabItem(0, '全部'), |
|
createTabItem(8, '待回复'), |
|
createTabItem(3, '待处理(新建)'), |
|
createTabItem(1, '处理中'), |
|
createTabItem(4, '理赔金额未出'), |
|
createTabItem(2, '处理完毕'), |
|
createTabItem(5, '客服介入'), |
|
createTabItem(9, '待审核'), |
|
createTabItem(6, '完结'), |
|
createTabItem(10, '申诉列表'), |
|
createTabItem(7, '超时未处理'), |
|
]); |
|
/** |
|
* @description 申诉按钮的逻辑 |
|
* @returns {boolean} 是否显示申诉按钮 |
|
*/ |
|
const WorkOrderAppealButton = () => row => { |
|
// 如果是仓库客服角色 |
|
if (UserPermissions.value == Useridentity.Warehouse_customer_service) { |
|
// 并且当前标签是申诉列表 |
|
if (TabPermissions.value == 6) { |
|
// 则显示申诉按钮 |
|
if (row.canRepresentations && row.workOrderStatus != 100) { |
|
return true; |
|
} |
|
} |
|
} |
|
// 否则不显示申诉按钮 |
|
return false; |
|
}; |
|
/** |
|
* @description 取消申诉按钮的逻辑 |
|
* @returns {boolean} 是否显示申诉按钮 |
|
*/ |
|
const CancelAppealButton = () => row => { |
|
// 如果是仓库客服角色 |
|
if (UserPermissions.value == Useridentity.Warehouse_customer_service) { |
|
// 并且当前标签是申诉列表 |
|
if (TabPermissions.value == 10) { |
|
if (row.typesOf == '0') { |
|
// 则显示申诉按钮 |
|
return true; |
|
} |
|
} |
|
} |
|
return false; |
|
}; |
|
/** |
|
* @description 编辑申诉按钮的逻辑 |
|
* @returns {boolean} 是否显示申诉编辑按钮 |
|
*/ |
|
const AppealEditorButton = () => row => { |
|
// 如果是仓库客服角色 |
|
if (UserPermissions.value == Useridentity.Warehouse_customer_service) { |
|
// 并且当前标签是申诉列表 |
|
if (TabPermissions.value == 10) { |
|
if (row.typesOf == '0') { |
|
return true; |
|
} |
|
} |
|
} |
|
return false; |
|
}; |
|
/** |
|
* @description 编辑申诉按钮的逻辑 |
|
* @returns {boolean} 是否显示申诉删除按钮 |
|
*/ |
|
const Deleteappealbutton = () => row => { |
|
// 如果是仓库客服角色 |
|
if (UserPermissions.value == Useridentity.Warehouse_customer_service) { |
|
// 并且当前标签是申诉列表 |
|
if (TabPermissions.value == 10) { |
|
// 则显示申诉按钮 |
|
if (row.typesOf == '3') { |
|
return true; |
|
} |
|
} |
|
} |
|
// 否则不显示申诉按钮 |
|
return false; |
|
}; |
|
/** |
|
* @description 处理金额提交按钮的逻辑 |
|
* @returns {boolean} 是否显示理赔金额未出处理提交按钮 |
|
*/ |
|
const ProcessSubmission = () => { |
|
// 如果是仓库客服角色 |
|
if (TabPermissions.value == 4) { |
|
// 则显示申诉按钮 |
|
return true; |
|
} |
|
// 否则不显示申诉按钮 |
|
return false; |
|
}; |
|
|
|
/** |
|
* @description 操作栏按钮权限 |
|
* @returns {boolean} 是否显示相关按钮 |
|
*/ |
|
const PermissionButton = computed(() => ({ |
|
Work_order_appeal: WorkOrderAppealButton(), |
|
Cancel_appeal_button: CancelAppealButton(), |
|
Appeal_editor_button: AppealEditorButton(), |
|
Delete_appeal_button: Deleteappealbutton(), |
|
Process_submission_button: ProcessSubmission(), |
|
})); |
|
const ButtonPermissions = computed(() => { |
|
// 根据 TabPermissions 的状态,决定每个按钮的显示隐藏逻辑 |
|
switch (TabPermissions.value) { |
|
case 0: //全部 |
|
return { |
|
add: true, //新增按钮 |
|
batchReject: false, //批量打回 |
|
assignment: false, //工单指派 |
|
applyArbitration: false, //客服介入 |
|
DingTalkNumber: false, //钉钉号填写 |
|
batchFinish: false, //批量完结 |
|
Batchdetermination: false, //批量确定 |
|
ManagerConfirmed: false, //处理完毕下面的客服经理批量确定 |
|
ArbitrationDetermination: false, //批量完结确定 |
|
Result_review: false, //结果审核(总部审核处理结果) |
|
Financial_accounting: false, //财务入账 |
|
defaultassignments: false, //默认指派 |
|
export_Report: true, //导出报表 |
|
Timed_outexport: false, //超时导出 |
|
}; |
|
case 1: //处理中 |
|
return { |
|
add: false, //新增按钮 |
|
batchReject: false, //批量打回 |
|
assignment: |
|
UserPermissions.value == Useridentity.Headquarters_Manager || |
|
UserPermissions.value == Useridentity.Headquarters_customer_service, //工单指派 |
|
applyArbitration: UserPermissions.value == Useridentity.Warehouse_customer_service, //客服介入 |
|
DingTalkNumber: false, //钉钉号填写 |
|
batchFinish: false, //批量完结 |
|
Batchdetermination: false, //处理结果批量确定 |
|
ManagerConfirmed: false, //处理完毕下面的客服经理批量确定 |
|
ArbitrationDetermination: false, //批量完结确定 |
|
Financial_accounting: false, //财务入账 |
|
Result_review: UserPermissions.value == Useridentity.Headquarters_customer_service, //结果审核(总部审核处理结果) |
|
defaultassignments: false, //默认指派 |
|
export_Report: true, //导出报表 |
|
Timed_outexport: false, //超时导出 |
|
}; |
|
case 2: //处理完毕 |
|
return { |
|
add: false, //新增按钮 |
|
batchReject: UserPermissions.value == Useridentity.Headquarters_customer_service || UserPermissions.value == Useridentity.Headquarters_Manager, //批量打回 |
|
assignment: |
|
UserPermissions.value == Useridentity.Headquarters_Manager || |
|
UserPermissions.value == Useridentity.Headquarters_customer_service, //工单指派 |
|
applyArbitration: false, //客服介入 |
|
DingTalkNumber: false, //钉钉号填 |
|
batchFinish: false, //批量完结 |
|
Batchdetermination: false, //批量确定 |
|
ManagerConfirmed: false, //处理完毕下面的客服经理批量确定 |
|
ArbitrationDetermination: false, //批量完结确定 |
|
Result_review: false, //结果审核(总部审核处理结果) |
|
Financial_accounting: false, //财务入账 |
|
defaultassignments: false, //默认指派 |
|
export_Report: true, //导出报表 |
|
Timed_outexport: false, //超时导出 |
|
}; |
|
case 3: //待处理 |
|
return { |
|
add: false, //新增按钮 |
|
batchReject: false, //批量打回 |
|
assignment: false, //工单指派 |
|
applyArbitration: false, //客服介入 |
|
batchFinish: false, //批量完结 |
|
Batchdetermination: false, //批量确定 |
|
DingTalkNumber: false, //钉钉号填写 |
|
ManagerConfirmed: false, //处理完毕下面的客服经理批量确定 |
|
ArbitrationDetermination: false, //批量完结确定 |
|
Result_review: false, //结果审核(总部审核处理结果) |
|
Financial_accounting: false, //财务入账 |
|
defaultassignments: false, //默认指派 |
|
export_Report: true, //导出报表 |
|
Timed_outexport: false, //超时导出 |
|
}; |
|
case 4: //理赔金额未出 |
|
return { |
|
add: false, //新增按钮 |
|
batchReject: false, //批量打回 |
|
assignment: false, //工单指派 |
|
applyArbitration: false, //客服介入 |
|
batchFinish: false, //批量完结 |
|
DingTalkNumber: false, //钉钉号填写 |
|
Batchdetermination: true, //批量确定 |
|
ManagerConfirmed: false, //处理完毕下面的客服经理批量确定 |
|
ArbitrationDetermination: false, //批量完结确定 |
|
Financial_accounting: false, //财务入账 |
|
Result_review: false, //结果审核(总部审核处理结果) |
|
defaultassignments: false, //默认指派 |
|
export_Report: true, //导出报表 |
|
Timed_outexport: false, //超时导出 |
|
}; |
|
case 5: //客服介入 |
|
return { |
|
add: false, //新增按钮 |
|
batchReject: false, //批量打回 |
|
assignment: false, //工单指派 |
|
applyArbitration: false, //客服介入 |
|
batchFinish: false, //批量完结 |
|
DingTalkNumber: false, //钉钉号填写 |
|
Batchdetermination: false, //批量确定 |
|
ManagerConfirmed: false, //处理完毕下面的客服经理批量确定 |
|
ArbitrationDetermination: |
|
UserPermissions.value == Useridentity.Headquarters_Manager || |
|
UserPermissions.value == Useridentity.Headquarters_customer_service, //批量总裁完结确定 |
|
Financial_accounting: false, //财务入账 |
|
Result_review: false, //结果审核(总部审核处理结果) |
|
defaultassignments: false, //默认指派 |
|
export_Report: true, //导出报表 |
|
Timed_outexport: false, //超时导出 |
|
}; |
|
case 6: //完结 |
|
return { |
|
add: false, //新增按钮 |
|
batchReject: false, //批量打回 |
|
assignment: false, //工单指派 |
|
applyArbitration: false, //客服介入 |
|
batchFinish: false, //批量完结 |
|
DingTalkNumber: |
|
UserPermissions.value == Useridentity.Headquarters_customer_service || |
|
UserPermissions.value == Useridentity.Headquarters_Manager, //钉钉号填写, //钉钉号填写 |
|
Batchdetermination: false, //批量确定 |
|
ManagerConfirmed: false, //处理完毕下面的客服经理批量确定 |
|
ArbitrationDetermination: false, //批量完结确定 |
|
Financial_accounting: |
|
UserPermissions.value == Useridentity.Headquarters_Manager || |
|
UserPermissions.value == Useridentity.Headquarters_customer_service, //财务入账 |
|
defaultassignments: false, //默认指派 |
|
Result_review: false, //结果审核(总部审核处理结果) |
|
export_Report: true, //导出报表 |
|
Timed_outexport: false, //超时导出 |
|
}; |
|
case 7: //超时未处理 |
|
return { |
|
add: false, //新增按钮 |
|
batchReject: false, //批量打回 |
|
assignment: false, //工单指派 |
|
applyArbitration: false, //客服介入 |
|
batchFinish: false, //批量完结 |
|
Batchdetermination: false, //批量确定 |
|
ManagerConfirmed: false, //处理完毕下面的客服经理批量确定 |
|
ArbitrationDetermination: false, //批量完结确定 |
|
Financial_accounting: false, //财务入账 |
|
defaultassignments: false, //默认指派 |
|
export_Report: false, //导出报表 |
|
Result_review: false, //结果审核(总部审核处理结果) |
|
Timed_outexport: true, //超时导出 |
|
}; |
|
case 8: //待回复 |
|
return { |
|
add: false, //新增按钮 |
|
batchReject: false, //批量打回 |
|
assignment: false, //工单指派 |
|
applyArbitration: false, //客服介入 |
|
batchFinish: false, //批量完结 |
|
Batchdetermination: false, //批量确定 |
|
ManagerConfirmed: false, //处理完毕下面的客服经理批量确定 |
|
ArbitrationDetermination: false, //批量完结确定 |
|
Financial_accounting: false, //财务入账 |
|
defaultassignments: false, //默认指派 |
|
export_Report: true, //导出报表 |
|
Result_review: false, //结果审核(总部审核处理结果) |
|
Timed_outexport: false, //超时导出 |
|
}; |
|
case 9: //待审核 |
|
return { |
|
add: false, //新增按钮 |
|
batchReject: false, //批量打回 |
|
assignment: false, //工单指派 |
|
applyArbitration: false, //客服介入 |
|
batchFinish: false, //批量完结 |
|
Batchdetermination: false, //批量确定 |
|
ManagerConfirmed: UserPermissions.value == Useridentity.Headquarters_Manager, //处理完毕下面的客服经理批量确定 |
|
ArbitrationDetermination: false, //批量完结确定 |
|
Financial_accounting: false, //财务入账 |
|
defaultassignments: false, //默认指派 |
|
export_Report: true, //导出报表 |
|
Result_review: false, //结果审核(总部审核处理结果) |
|
Timed_outexport: false, //超时导出 |
|
}; |
|
case 10: //申诉列表 |
|
return { |
|
add: false, //新增按钮 |
|
batchReject: false, //批量打回 |
|
assignment: false, //工单指派 |
|
applyArbitration: false, //客服介入 |
|
batchFinish: false, //批量完结 |
|
Batchdetermination: false, //批量确定 |
|
ManagerConfirmed: false, //处理完毕下面的客服经理批量确定 |
|
ArbitrationDetermination: false, //批量完结确定 |
|
Financial_accounting: false, //财务入账 |
|
defaultassignments: false, //默认指派 |
|
export_Report: false, //导出报表 |
|
Result_review: false, //结果审核(总部审核处理结果) |
|
Timed_outexport: false, //超时导出 |
|
}; |
|
// 其他任何情况下的默认情况 |
|
default: |
|
return { |
|
add: false, |
|
batchReject: false, |
|
assignment: false, |
|
applyArbitration: false, |
|
batchFinish: false, |
|
Batchdetermination: false, //批量确定 |
|
ManagerConfirmed: false, //处理完毕下面的客服经理批量确定 |
|
ArbitrationDetermination: false, //批量完结确定 |
|
Financial_accounting: false, //财务入账 |
|
defaultassignments: false, //默认指派 |
|
export_Report: false, //导出报表 |
|
Result_review: false, //结果审核(总部审核处理结果) |
|
Timed_outexport: false, //超时导出 |
|
}; |
|
} |
|
}); |
|
const details = reactive({ |
|
/** 是否开启搜索 */ |
|
search: false, |
|
/** 表格搜索条件 */ |
|
query: {}, |
|
defaultTime2: [new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)], // '12:00:00', '08:00:00' |
|
/** 时间快捷选择设置 */ |
|
shortcuts: [ |
|
{ |
|
text: '最近一周', |
|
value: () => { |
|
const end = new Date(); |
|
const start = new Date(); |
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); |
|
return [start, end]; |
|
}, |
|
}, |
|
{ |
|
text: '最近一个月', |
|
value: () => { |
|
const end = new Date(); |
|
const start = new Date(); |
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); |
|
return [start, end]; |
|
}, |
|
}, |
|
{ |
|
text: '最近三个月', |
|
value: () => { |
|
const end = new Date(); |
|
const start = new Date(); |
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90); |
|
return [start, end]; |
|
}, |
|
}, |
|
], |
|
/** 时间选择器数据 */ |
|
stockupDate: [], |
|
/** 列表 */ |
|
columnListPublic: columnList, //公共列表 |
|
/** 列表数据 */ |
|
data: [], |
|
/** 页面loading */ |
|
loadingObj: { |
|
/** 列表加载loading */ |
|
list: false, |
|
packageListLoading: false, |
|
}, |
|
/** 列表复选框选中的数据 */ |
|
selectionList: [], |
|
/** 是否显示设置表格 */ |
|
drawerShow: false, |
|
/** 分页参数 */ |
|
page: { |
|
currentPage: 1, |
|
pageSize: 30, |
|
total: 0, |
|
}, |
|
|
|
/** 弹出层显示 */ |
|
popUpShow: { |
|
/** 包件明细 */ |
|
packageOrderListlVisited: false, |
|
/** 二维码 */ |
|
QRCodeVisible: false, |
|
/** 修改客户信息 */ |
|
editClientInfoVisible: false, |
|
}, |
|
/** 列表Dom节点 */ |
|
listNode: '', |
|
form: {}, |
|
/** 全屏 */ |
|
fullscreenObj: { |
|
/** 包明细 */ |
|
packageOrderListlVisited: false, |
|
}, |
|
}); |
|
|
|
const { |
|
search, |
|
query, |
|
shortcuts, |
|
stockupDate, |
|
data, |
|
loadingObj, |
|
selectionList, |
|
drawerShow, |
|
page, |
|
trickleLoadingPage, |
|
zeroAdditionalRecordingInfo, |
|
popUpShow, |
|
recorddata, |
|
defaultTime2, |
|
} = toRefs(details); |
|
watch( |
|
() => $route.fullPath, |
|
(newPath, oldPath) => { |
|
console.log('首页监听'); |
|
|
|
if ($useStore.state.isRefresh.refreshObj.aftersalesWorkOrder) { |
|
TabPermissions.value = $useStore.state.Customer.Customerobj; |
|
tabValue.value = $useStore.state.Customer.Customerobj; //菜单编号 |
|
if ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].includes(TabPermissions.value)) { |
|
updateMenuAndData(); //获取最新数据 |
|
$useStore.commit('Customer_Menu', 0); //设置回初始值 |
|
$useStore.commit('EDIT_REFRESHITEM', { title: 'aftersalesWorkOrder', status: false }); //重新缓存页面 |
|
} |
|
} |
|
}, |
|
{ immediate: true, deep: true } |
|
); |
|
const appealrules = reactive({ |
|
Reasonforappeal: [{ required: true, message: '请选择责任方', trigger: 'blur' }], |
|
Appealselection: [{ required: true, message: '请填写申诉原因', trigger: 'blur' }], |
|
}); |
|
// 图片上传接口 |
|
const doubledCount = computed(() => { |
|
return '/api/blade-resource/oss/endpoint/put-file'; |
|
}); |
|
// 图片上传必须携带TOKEN |
|
const headers = computed(() => { |
|
return { 'Blade-Auth': 'Bearer ' + getToken() }; |
|
}); |
|
/** 展开列表控件 */ |
|
const showdrawer = _flag => { |
|
details.drawerShow = _flag; |
|
}; |
|
/** 表格表头输入框搜索 */ |
|
const inputsc = (index, row) => { |
|
console.log(details.query, 'details.query'); |
|
let _Obj = MatchCurrentMenu(); //匹配出当前菜单 |
|
_Obj.request = true; //更新请求状态 |
|
_Obj.query = details.query; |
|
processRowPropertyName(index, row, _Obj.query); |
|
PublicDataRequest(TabPermissions.value); //获取页面数据 |
|
}; |
|
|
|
/** 表格表头时间选择 */ |
|
const timesc = (index, row) => { |
|
console.log(index, row); |
|
if (!!index) { |
|
index = dayjs(index).format('YYYY-MM-DD'); |
|
} |
|
details.query[row.prop] = index; |
|
if (!index) { |
|
delete details.query[row.prop]; |
|
} |
|
}; |
|
/** 表格表头下拉框选择 */ |
|
const selectsc = async (index, row) => { |
|
console.log(index, row); |
|
let _Obj = MatchCurrentMenu(); //匹配出当前菜单 |
|
_Obj.request = true; //更新请求状态 |
|
_Obj.query = details.query; |
|
processRowPropertyName(index, row, _Obj.query); |
|
PublicDataRequest(TabPermissions.value); //获取页面数据 |
|
}; |
|
/** 表格表头复选框选择 */ |
|
const selectionChange = list => { |
|
console.log(list); |
|
details.selectionList = list; |
|
}; |
|
// 网页顶部搜索按钮 |
|
const searchChange = async () => { |
|
let _Obj = MatchCurrentMenu(); //匹配出当前菜单 |
|
_Obj.currentPage = 1; |
|
await ProcessSearch(); |
|
updateMenuAndData(); //获取最新数据 |
|
}; |
|
|
|
// 刷新按钮 |
|
const searchChangeS = () => { |
|
updateMenuAndData(); //获取最新数据 |
|
}; |
|
// 重置表格搜索 |
|
const ResetTableSearch = async () => { |
|
let _Obj = MatchCurrentMenu(); |
|
_Obj.currentPage = 1; |
|
console.log(TabPermissions.value, '123123123'); |
|
_Obj.request = true; |
|
console.log(_Obj, 'Obj'); |
|
await handleClearTableQuery(details.columnListPublic); |
|
_Obj.query = {}; |
|
PublicDataRequest(TabPermissions.value, true); |
|
}; |
|
//清空 |
|
// const searchReset = () => { |
|
// TopQuery.value = {}; |
|
// let _Obj = MatchCurrentMenu(); |
|
// _Obj.currentPage = 1; |
|
// TabList.value.forEach(item => { |
|
// item.query = {}; |
|
// }); |
|
// const TabcolumnList = [ |
|
// columnList, |
|
// columnList1, |
|
// columnList2, |
|
// columnList3, |
|
// columnList4, |
|
// columnList5, |
|
// columnList6, |
|
// columnList7, |
|
// columnList8, |
|
// columnList9, |
|
// columnList10, |
|
// ]; |
|
|
|
// TabcolumnList.forEach(item => { |
|
// handleClearTableQuery(item); |
|
// }); |
|
// details.search = false; // 关闭搜索 |
|
// updateMenuAndData(); //获取最新数据 |
|
// autoscaling(); |
|
// }; |
|
|
|
const searchReset = () => { |
|
const TabcolumnList = [ |
|
columnList, |
|
columnList1, |
|
columnList2, |
|
columnList3, |
|
columnList4, |
|
columnList5, |
|
columnList6, |
|
columnList7, |
|
columnList8, |
|
columnList9, |
|
columnList10, |
|
]; |
|
TopQuery.value = {}; |
|
let _Obj = MatchCurrentMenu(); |
|
_Obj.currentPage = 1; |
|
const TabListLength = TabList.value.length; |
|
for (let i = 0; i < TabListLength; i++) { |
|
TabList.value[i].query = {}; |
|
handleClearTableQuery(TabcolumnList[i]); |
|
} |
|
details.search = false; // 关闭搜索 |
|
updateMenuAndData(); |
|
autoscaling(); |
|
}; |
|
|
|
// 顶部搜索 |
|
const searchHide = () => { |
|
console.log(details); |
|
details.search = !details.search; |
|
autoscaling(); |
|
}; |
|
// 字典公共函数 |
|
async function updateDictionary(targetArray, dictionaryType) { |
|
await getDictionaryBiz(dictionaryType).then(res => { |
|
console.log(res, '字典'); |
|
res.data.data.forEach(item => { |
|
targetArray.push({ |
|
value: item.dictKey, |
|
label: item.dictValue, |
|
}); |
|
}); |
|
}); |
|
} |
|
//表格自适应高度 |
|
const autoscaling = () => { |
|
const _node = document.querySelector('.tableNode'); |
|
setNodeHeight(_node, '', true); |
|
}; |
|
/** |
|
* 该函数将 columnList - columnList10 等十一个表头对象的 |
|
* checkarr 属性赋值为对应的字典数组 |
|
* @param {Array} columnLists - 一个包含 columnList - columnList10 等十一个对象的数组 |
|
* @param {Object} propToDictionaryMap - 一个对象,键为 columnList 对象的 prop 属性,值为对应的字典数组 |
|
*/ |
|
const SelectionInitialization = () => { |
|
const columnLists = [ |
|
columnList, |
|
columnList1, |
|
columnList2, |
|
columnList3, |
|
columnList4, |
|
columnList5, |
|
columnList6, |
|
columnList7, |
|
columnList8, |
|
columnList9, |
|
columnList10, |
|
]; |
|
|
|
// 定义一个映射对象,用于替代 if-else 判断 |
|
const propToDictionaryMap = { |
|
workOrderTypeNameS: dictionaries.pc_work_order.value, |
|
discoveryNodeNameS: dictionaries.pc_discovery_node.value, |
|
workOrderStatusNameS: dictionaries.work_order_status.value, |
|
}; |
|
|
|
const functionIF = item => { |
|
// 缓存过滤结果 |
|
const filteredData = item.filter(item => item.type === 3); |
|
|
|
filteredData.forEach(item => { |
|
const checkarr = propToDictionaryMap[item.prop]; |
|
if (checkarr) { |
|
item.checkarr = checkarr; |
|
} |
|
}); |
|
}; |
|
|
|
columnLists.forEach(functionIF); |
|
}; |
|
|
|
/** |
|
* 描述: 初始化字典,包含角色信息、异常类型、发现环节、工单状态,。 |
|
*/ |
|
const Dictionaryrequest = async () => { |
|
// Map 生成一个包含所有 Promise 的数组 |
|
const dictionaryPromises = Object.entries(dictionaries).map(([key, refValue]) => { |
|
return updateDictionary(refValue.value, key); |
|
}); |
|
//等待字典请求完成执行页面其余参数防止出现判断错误 |
|
await Promise.all(dictionaryPromises); |
|
}; |
|
|
|
/** |
|
* 描述: 获取用户角色信息并更新界面元素状态。 |
|
* 该函数用于检查用户的角色,并根据角色执行相应的验证和UI更新逻辑。 |
|
*/ |
|
const Roleverification = () => { |
|
const userInfo = localStorage.getItem('TWMS-userInfo'); |
|
if (!userInfo) { |
|
console.error('用户信息未找到'); |
|
return; |
|
} |
|
let roleNames = []; |
|
try { |
|
roleNames = JSON.parse(userInfo).content.role_name.split(','); |
|
} catch (error) { |
|
console.error('解析用户角色信息出错:', error); |
|
return; |
|
} |
|
UserInfo.value = JSON.parse(userInfo); //存储一份登陆人信息 |
|
// 匹配用户角色 |
|
const matchingItem = dictionaries.after_sales_visits.value.find(item => |
|
roleNames.includes(item.label) |
|
); |
|
// 更新用户权限 |
|
if (matchingItem) { |
|
console.log(matchingItem, '匹配出来的角色'); |
|
|
|
UserPermissions.value = matchingItem.label; |
|
} |
|
// 更新TabList的状态 |
|
const updateTabState = (tabName, condition) => { |
|
const tab = TabList.value.find(res => res.name == tabName); |
|
if (tab) { |
|
tab.state = condition; |
|
} |
|
}; |
|
if (UserPermissions.value) { |
|
updateTabState('8', UserPermissions.value == Useridentity.Warehouse_customer_service); |
|
updateTabState('9', UserPermissions.value !== Useridentity.Warehouse_customer_service); |
|
} else { |
|
// 匹配不到角色时,默认为关闭状态(总部经理的审核菜单) |
|
updateTabState('9', false); |
|
} |
|
console.log('内部执行完毕'); |
|
console.log(matchingItem, '匹配出来的角色'); |
|
}; |
|
onMounted(() => { |
|
autoscaling(); |
|
}); |
|
/** |
|
* 获取所有仓库信息 |
|
*/ |
|
const GetWarehouse = () => { |
|
getDeptWarehouse({}).then(res => { |
|
res.data.data.forEach(item => { |
|
warehouseData.value.push({ |
|
value: item.id, |
|
label: item.name, |
|
disabled: item.name == localStorage.getItem('WarehouseName'), |
|
}); |
|
}); |
|
}); |
|
}; |
|
/** |
|
* 获取客服人员 |
|
* |
|
* @returns {Promise<void>} |
|
*/ |
|
const GetCustomerService = async () => { |
|
try { |
|
let _res = await $_getCustomerServicePersonnel(); |
|
const { code, data } = _res.data; |
|
if (code != 200) { |
|
return; |
|
} |
|
assignFrom.value.customerService = data; |
|
} catch (e) { |
|
console.log(e); |
|
} finally { |
|
} |
|
}; |
|
|
|
/** |
|
*页面初始化函数,包含字典,等必要请求 |
|
*/ |
|
const PageOnlaod = async () => { |
|
PageLoading.value = true; |
|
try { |
|
await Dictionaryrequest(), // 初始化字典 |
|
// 并行执行异步请求 |
|
await Promise.all([ |
|
Roleverification(), // 获取角色信息 |
|
SelectionInitialization(), // 下拉框初始化赋值 |
|
GetWarehouse(), //获取仓库 |
|
GetCustomerService(), //获取总部客服列表 |
|
]); |
|
|
|
// 获取页面数据 |
|
await PublicDataRequest(TabPermissions.value); |
|
} catch (error) { |
|
console.log(error); |
|
} finally { |
|
PageLoading.value = false; |
|
} |
|
}; |
|
// 页面初始化 |
|
PageOnlaod(); |
|
|
|
// 切换菜单处理分页数据 |
|
const PagingDataProcessing = () => { |
|
let _Obj = MatchCurrentMenu(); |
|
console.log(_Obj, '匹配出来的公共菜单'); |
|
// 对当前菜单进行缓存还原 |
|
details.data = _Obj.DataList; //数据 |
|
details.page.total = _Obj.total; //总页数 |
|
details.page.currentPage = _Obj.currentPage; //当前页码 |
|
details.page.pageSize = _Obj.pageSize; //每页条数 |
|
// 判断是否需要请求数据 |
|
if (_Obj.request) { |
|
console.log('当前需要加载页面'); |
|
return true; |
|
} |
|
console.log('当前已经加载过了'); |
|
return false; |
|
}; |
|
|
|
/** |
|
* @description: 点击tabBar时,记录当前点击的tab |
|
* @param {number} value 当前点击的tab的value |
|
* @return {void} 无返回值 |
|
*/ |
|
const tabChenge = async (value, Reset) => { |
|
PageLoading.value = true; // 开启loading |
|
let _Obj = await MatchCurrentMenu(); //匹配出上一个菜单 |
|
_Obj.query = await deepClone(details.query); //把上一个菜单的搜索条件缓存起来 |
|
TabPermissions.value = value; //记录最新的菜单 |
|
PublicDataRequest(value, Reset); //请求数据 |
|
}; |
|
|
|
const PublicDataRequest = async (value, Reset) => { |
|
try { |
|
await MenuHeaderProcessing(value); // 处理头部菜单 |
|
await Processingworkorderstatus(value); // 处理工单请求状态 |
|
// 判断是否需要请求数据{_state}返回true表示需要false表示不需要 |
|
let _state = PagingDataProcessing(); |
|
if (!_state) { |
|
PageLoading.value = false; // 关闭oading |
|
return; |
|
} |
|
PageLoading.value = true; // 开启loading |
|
|
|
// 定义一个异步函数映射表(数据处理函数) |
|
const dataProcessingMap = { |
|
0: Publicaccessdata, |
|
1: Publicaccessdata, |
|
2: Publicaccessdata, |
|
3: Publicaccessdata, |
|
4: ClaimAmountData, |
|
5: Publicaccessdata, |
|
6: Publicaccessdata, |
|
7: OverdueUnprocessedData, |
|
8: DataAwaitingReplyData, |
|
9: Publicaccessdata, |
|
10: AppealData, |
|
}; |
|
|
|
// 执行对应的函数 |
|
const processDataFn = dataProcessingMap[value] || Publicaccessdata; |
|
await processDataFn(Reset); // 使用await确保完成 |
|
} catch (error) { |
|
console.error('An error occurred:', error); |
|
} finally { |
|
PageLoading.value = false; // 确保关闭loading |
|
} |
|
}; |
|
|
|
/** |
|
* @description: 菜单状态处理 |
|
* @param {number} value 当前点击的tab的value |
|
* @return {void} 无返回值 |
|
*/ |
|
const Processingworkorderstatus = value => { |
|
console.log(UserPermissions.value, 'UserPermissions.value'); |
|
console.log(Useridentity.Warehouse_customer_service, 'Useridentity.Warehouse_customer_service'); |
|
|
|
switch (value) { |
|
case 0: // 全部 |
|
workOrderStatus.value = |
|
UserPermissions.value === Useridentity.Warehouse_customer_service ? 1000 : null; |
|
break; |
|
case 1: // 处理中 |
|
workOrderStatus.value = 20; |
|
// UserPermissions.value === Useridentity.Warehouse_customer_service ? 20 : 40; |
|
break; |
|
case 2: // 处理完毕 |
|
workOrderStatus.value = 30; |
|
break; |
|
case 3: // 待处理 |
|
workOrderStatus.value = 10; |
|
break; |
|
case 5: // 客服介入 |
|
workOrderStatus.value = 70; |
|
break; |
|
case 6: // 完结 |
|
workOrderStatus.value = 80; |
|
break; |
|
case 9: // 待审核 |
|
workOrderStatus.value = |
|
UserPermissions.value === Useridentity.Headquarters_Manager ? 500 : 40; |
|
break; |
|
default: |
|
workOrderStatus.value = null; |
|
break; |
|
} |
|
}; |
|
// 更新分页信息 |
|
const updatePageDetails = (pageSize, currentPage) => { |
|
details.page.pageSize = pageSize; |
|
details.page.currentPage = currentPage; |
|
}; |
|
const MatchCurrentMenu = (ID = TabPermissions.value) => { |
|
return TabList.value.find(res => res.name == ID); |
|
}; |
|
// 每页多少条 |
|
const sizeChange = value => { |
|
let _Obj = MatchCurrentMenu(); //匹配出当前菜单 |
|
_Obj.request = true; //更新请求状态 |
|
_Obj.pageSize = value; //更新菜单每页条数 |
|
_Obj.currentPage = 1; //切换每页条数的时候重置页码 |
|
updatePageDetails(value, 1); //更新页码 |
|
PublicDataRequest(TabPermissions.value); |
|
}; |
|
|
|
/** 页码改变执行的回调 */ |
|
const currentChange = value => { |
|
const _Obj = MatchCurrentMenu(); // 匹配出当前菜单 |
|
_Obj.request = true; //更新请求状态 |
|
_Obj.currentPage = value; //更新当前菜单页码 |
|
updatePageDetails(_Obj.pageSize, value); //更新分页信息 |
|
PublicDataRequest(TabPermissions.value); //请求数据 |
|
}; |
|
|
|
/** |
|
* @description: 公共菜单数据处理 |
|
* @param {object} data 接收公共菜单数据 |
|
*/ |
|
const PublicDataProcessing = data => { |
|
const { records, total, size, current } = data; |
|
const matchedTab = TabList.value.find(tab => tab.name === TabPermissions.value); |
|
// 更新 details 数据 |
|
details.data = records; |
|
details.page = { |
|
total, |
|
pageSize: size, |
|
currentPage: current, |
|
}; |
|
|
|
// 更新匹配的 TabList 项 |
|
if (matchedTab) { |
|
details.query = matchedTab.query; //重新把缓存的条件赋值给搜索 |
|
console.log(matchedTab.query, '重新把缓存的条件赋值给搜索'); |
|
|
|
Object.assign(matchedTab, { |
|
DataList: records, |
|
total, |
|
pageSize: size, |
|
currentPage: current, |
|
request: !(records?.length > 0), //如果有值状态改为false下次默认不请求,否则true下次继续请求 |
|
}); |
|
console.log(matchedTab, '匹配出来的公共菜单'); |
|
} |
|
|
|
console.log(TabList.value, 'TabList'); |
|
}; |
|
/** |
|
* @description: 菜单表头处理 |
|
* @param {number} value 当前点击的tab的value |
|
* @return {void} 无返回值 |
|
*/ |
|
const MenuHeaderProcessing = value => { |
|
const columnLists = { |
|
columnList, // 0: 全部 |
|
columnList1, // 1: 处理中 |
|
columnList2, // 2: 处理完毕 |
|
columnList3, // 3: 待处理 |
|
columnList4, // 4: 理赔金额未出 |
|
columnList5, // 5: 客服介入 |
|
columnList6, // 6: 完结 |
|
columnList7, // 7: 超时未处理 |
|
columnList8, // 8: 待回复 |
|
columnList9, // 9: 待审核 |
|
columnList10, // 10: 申诉列表 |
|
}; |
|
|
|
const keys = Object.keys(columnLists); |
|
const selectedKey = value >= 0 && value < keys.length ? keys[value] : 'columnList'; |
|
|
|
// 使用深拷贝赋值 |
|
details.columnListPublic = columnLists[selectedKey]; |
|
|
|
// 将变量名字符串赋值给 columnListName.value |
|
columnListName.value = selectedKey; |
|
|
|
console.log(details.columnListPublic, 'details.columnListPublic'); |
|
console.log(columnListName.value, 'columnListName.value'); |
|
}; |
|
// 状态处理 |
|
const DataStateProcessing = data => { |
|
console.log(data, '状态处理'); |
|
console.log(dictionaries, 'dictionaries.pc_work_order.value'); |
|
|
|
// 函数用于查找标签 |
|
const findLabelByValue = (collection, value) => { |
|
const entry = collection.find(res => res.value === value); |
|
return entry ? entry.label : '/'; |
|
}; |
|
|
|
// 对状态进行处理 |
|
if (data.records?.length) { |
|
data.records.forEach(item => { |
|
// 处理工单类型 |
|
item.workOrderTypeNameS = findLabelByValue( |
|
dictionaries.pc_work_order.value, |
|
item.workOrderType |
|
); |
|
|
|
// 处理发现节点 |
|
item.discoveryNodeNameS = findLabelByValue( |
|
dictionaries.pc_discovery_node.value, |
|
item.discoveryNode |
|
); |
|
|
|
// 处理工单状态 |
|
item.workOrderStatusNameS = findLabelByValue( |
|
dictionaries.work_order_status.value, |
|
item.workOrderStatus |
|
); |
|
}); |
|
} |
|
}; |
|
|
|
/** |
|
* @description: 对数据进行处理 |
|
* @return {void} 无返回值 |
|
*/ |
|
const DataAndStateProcessing = data => { |
|
PublicDataProcessing(data); //处理数据 |
|
DataStateProcessing(data); //状态处理 |
|
}; |
|
|
|
/** |
|
* @description: 获取当前菜单的查询条件 |
|
* @return {Object} 返回当前菜单的查询条件对象 |
|
*/ |
|
const getQuery = () => { |
|
// 匹配当前菜单并获取其搜索条件 |
|
let _Obj = MatchCurrentMenu(); |
|
return _Obj.query; |
|
}; |
|
/** |
|
* @description: 更新当前菜单的请求状态并请求数据 |
|
* @return {void} 无返回值 |
|
*/ |
|
const updateMenuAndData = () => { |
|
const currentMenu = MatchCurrentMenu(); // 匹配当前菜单 |
|
if (currentMenu) { |
|
currentMenu.request = true; // 更新请求状态 |
|
} |
|
PublicDataRequest(TabPermissions.value); // 请求数据 |
|
}; |
|
/** |
|
* @description: 处理空白数据 |
|
* @param {object} data - 包含记录的数据对象 |
|
* @returns {array} - 处理后的记录数组 |
|
*/ |
|
const replaceNullWithSlash = data => { |
|
const newRecords = []; |
|
const records = data.records; |
|
|
|
for (let i = 0; i < records.length; i++) { |
|
const newRecord = { ...records[i] }; |
|
for (const key in newRecord) { |
|
if (newRecord[key] === null || newRecord[key] === '') { |
|
newRecord[key] = '/'; |
|
} |
|
} |
|
newRecords.push(newRecord); |
|
} |
|
|
|
return newRecords; |
|
}; |
|
/** |
|
* @description 通用函数用于处理数据请求(包含待回复、理赔金额未出、申诉、超时未处理) |
|
* @param {Function} fetchFunction - 用于执行具体数据请求的函数 |
|
* @param {boolean} [reset=false] - 控制是否重置查询条件的标志,默认值为 false |
|
* @returns {Promise<void>} 不返回任何内容,仅执行数据请求和处理 |
|
*/ |
|
const fetchData = async (fetchFunction, reset) => { |
|
try { |
|
let _submitData = { |
|
current: details.page.currentPage, // 页码 |
|
size: details.page.pageSize, // 条数 |
|
...(reset ? {} : getQuery()), // 查询条件,条件重置根据 reset 标志 |
|
}; |
|
|
|
let _res = await fetchFunction(_submitData); |
|
console.log(_res); |
|
|
|
const { code, data } = _res.data; |
|
if (code !== 200) { |
|
return; |
|
} |
|
DataAndStateProcessing(data); // 对数据和状态处理 |
|
details.data = replaceNullWithSlash(data); |
|
} catch (error) { |
|
console.log(error); |
|
} |
|
}; |
|
|
|
/** |
|
* @description: 待回复菜单数据请求 |
|
*/ |
|
const DataAwaitingReplyData = async Reset => { |
|
await fetchData($_getProcessor, Reset); |
|
}; |
|
/** |
|
* @description: 理赔金额未出菜单数据请求 |
|
*/ |
|
const ClaimAmountData = async Reset => { |
|
await fetchData($_listSettlement, Reset); |
|
}; |
|
/** |
|
* @description: 申诉菜单数据请求 |
|
*/ |
|
const AppealData = async Reset => { |
|
await fetchData($_listAppeal, Reset); |
|
}; |
|
/** |
|
* @description: 超时未处理菜单数据请求 |
|
*/ |
|
const OverdueUnprocessedData = async Reset => { |
|
await fetchData($_listOwn, Reset); |
|
}; |
|
|
|
/** |
|
* @description: 公共数据请求,包含全部、待处理、处理中、处理完毕、客服介入、待审核、完结 |
|
*/ |
|
const Publicaccessdata = async Reset => { |
|
try { |
|
let _submitData = { |
|
workOrderStatus: workOrderStatus.value, //工单状态 |
|
current: details.page.currentPage, //页码 |
|
size: details.page.pageSize, //条数 |
|
...(Reset ? {} : getQuery()), // 查询条件,条件重置根据 reset 标志 |
|
}; |
|
let _res = await $_getList(_submitData); |
|
const { code, data } = _res.data; |
|
if (code !== 200) { |
|
return; |
|
} |
|
DataAndStateProcessing(data); //对数据和状态处理 |
|
details.data = replaceNullWithSlash(data); |
|
|
|
console.log(_res, '公共数据菜单=:' + TabPermissions.value); |
|
console.log(TabList.value, '公共菜单'); |
|
} catch (error) { |
|
console.log(error); |
|
} finally { |
|
} |
|
}; |
|
|
|
/** |
|
* |
|
* @description 创建工单 |
|
*/ |
|
const CreateworkOrder = () => { |
|
$router.push('/aftersales/aftersalesWorkOrderAdd'); |
|
}; |
|
/** |
|
* |
|
* @description 工单申诉 |
|
*/ |
|
const WorkOrderAppeal = async (row, state) => { |
|
appeal.value.selectList = []; |
|
appeal.value.AppealAttachment = []; //清空图片 |
|
appeal.value.Appealselection = []; //清空责任人 |
|
appeal.value.Reasonforappeal = ''; //清空申诉内容 |
|
appeal.value.selectList.push(row); //存储当前申诉的对象 |
|
console.log(appeal.value.selectList, 'appeal.value.selectList'); |
|
|
|
appeal.value.dialogappeal = true; //展开申诉编辑 |
|
if (state == 'edit') { |
|
// 当前是编辑申诉 |
|
appeal.value.AppealeditorState = true; //开启申诉编辑状态 |
|
console.log(row, 'row'); |
|
|
|
let data = { |
|
id: row.id, |
|
}; |
|
await $_AppealDetails(data).then(res => { |
|
console.log(res, '申诉编辑回显'); |
|
appeal.value.Reasonforappeal = res.data.data.reason; //申诉原因 |
|
setTimeout(() => { |
|
if (res.data.data.peopleEntityList) { |
|
appeal.value.Appealselection = res.data.data.peopleEntityList.map( |
|
item => item.actualPersonId |
|
); |
|
} |
|
if (res.data.data.imagePath) { |
|
appeal.value.AppealAttachment.push({ |
|
url: res.data.data.imagePath, |
|
}); |
|
} |
|
}, 0); |
|
}); |
|
return; |
|
} |
|
if (!state) { |
|
appeal.value.AppealeditorState = false; //开启申诉编辑状态 |
|
} |
|
}; |
|
// 工单申诉确认按钮 |
|
const Appealbutton = async state => { |
|
try { |
|
await appealruleFormRef.value.validate(); |
|
} catch (fields) { |
|
return; |
|
} |
|
|
|
const confirmResult = await ElMessageBox.confirm('是否确认发起工单申诉?', '提示', { |
|
confirmButtonText: '确定', |
|
cancelButtonText: '取消', |
|
type: 'warning', |
|
}).catch(() => false); |
|
|
|
if (!confirmResult) { |
|
return; |
|
} |
|
|
|
if (appeal.value.AppealAttachment.length > 1) { |
|
ElMessage({ |
|
message: '只能上传一张图片', |
|
type: 'warning', |
|
}); |
|
return; |
|
} |
|
|
|
appeal.value.loadingappeal = true; |
|
|
|
let data = { |
|
peopleEntityList: [], |
|
imagePath: '', |
|
workOrderId: '', |
|
appealPeopleName: '', |
|
}; |
|
|
|
data.reason = appeal.value.Reasonforappeal; |
|
data.appealPeopleName = warehouseData.value |
|
.filter(item => appeal.value.Appealselection.includes(item.value)) |
|
.map(item => item.label) |
|
.join(','); |
|
|
|
appeal.value.Appealselection.forEach(item => { |
|
const selectedWarehouse = warehouseData.value.find(res => res.value === item); |
|
data.peopleEntityList.push({ |
|
workOrderId: appeal.value.selectList[0].id, |
|
reason: appeal.value.Reasonforappeal, |
|
claimant: UserInfo.value.content.user_name, |
|
actualPersonId: selectedWarehouse.value, |
|
actualPersonName: selectedWarehouse.label, |
|
}); |
|
}); |
|
|
|
data.workOrderId = appeal.value.AppealeditorState |
|
? appeal.value.selectList[0].workOrderId |
|
: appeal.value.selectList[0].id; |
|
|
|
if (appeal.value.AppealeditorState) { |
|
data.id = appeal.value.selectList[0].id; |
|
} |
|
|
|
if (appeal.value.AppealAttachment.length > 0) { |
|
const attachment = appeal.value.AppealAttachment[0]; |
|
data.imagePath = attachment.response ? attachment.response.data.link : attachment.url; |
|
} |
|
|
|
console.log(data, '处理好的值'); |
|
|
|
try { |
|
const { data: response } = await $_appealSubmit(data); |
|
const { code, msg } = response; |
|
|
|
if (code === 200) { |
|
ElMessage({ |
|
message: msg, |
|
type: 'success', |
|
}); |
|
} |
|
|
|
appeal.value.dialogappeal = false; |
|
updateMenuAndData(); //更新菜单数据 |
|
} finally { |
|
appeal.value.loadingappeal = false; |
|
} |
|
}; |
|
|
|
// 删除申诉记录 |
|
const Deleteappealrecords = async row => { |
|
ElMessageBox.confirm('是否删除当前记录?', '提示', { |
|
confirmButtonText: '确定', |
|
cancelButtonText: '取消', |
|
type: 'warning', |
|
}) |
|
.then(async () => { |
|
try { |
|
appeal.value.loadingappeal = true; |
|
let data = { |
|
ids: row.id, |
|
}; |
|
let _res = await $_getDetails(data); |
|
if (_res.data.code == 200) { |
|
ElMessage({ |
|
message: '删除成功', |
|
type: 'success', |
|
}); |
|
updateMenuAndData(); //获取新数据 |
|
} |
|
} catch { |
|
} finally { |
|
appeal.value.loadingappeal = false; |
|
} |
|
}) |
|
.catch(() => {}); |
|
}; |
|
|
|
/** |
|
* |
|
* @description 工单取消申诉 |
|
*/ |
|
const CancelWorkOrderAppeal = row => { |
|
ElMessageBox.confirm('是否取消申诉?', '提示', { |
|
confirmButtonText: '确定', |
|
cancelButtonText: '取消', |
|
type: 'warning', |
|
}) |
|
.then(() => { |
|
let data = { |
|
id: row.id, //取消申诉ID |
|
typesOf: '3', //申诉状态 |
|
workOrderId: row.workOrderId, //异常工单ID |
|
}; |
|
PageLoading.value = true; |
|
$_Cancelappeal(data) |
|
.then(res => { |
|
console.log(res, '取消申诉返回值'); |
|
if (res.data.code == 200) { |
|
updateMenuAndData(); //获取新数据 |
|
ElMessage({ |
|
message: '取消申诉成功', |
|
type: 'success', |
|
}); |
|
} |
|
}) |
|
.catch(error => { |
|
console.log(error); |
|
}) |
|
.finally(() => { |
|
PageLoading.value = false; |
|
}); |
|
}) |
|
.catch(() => {}); |
|
}; |
|
|
|
/** |
|
* @description: [钉钉号填写] - 选择数据后,点击钉钉号填写按钮,出现弹窗 |
|
* @return {void} |
|
*/ |
|
const DingTalk = () => { |
|
if (!details.selectionList.length) { |
|
ElMessage({ |
|
message: '请勾选数据', |
|
type: 'warning', |
|
}); |
|
return; |
|
} |
|
// 开启钉钉号填写弹窗 |
|
DingTalkfilling.value.dialogDingTalk = true; |
|
}; |
|
/** |
|
* @description: [钉钉号填写确认] |
|
* @return {void} |
|
*/ |
|
const DingTalkSubmit = async () => { |
|
const { processNumber, reviewedBy, auditTime } = DingTalkfilling.value; |
|
try { |
|
// 启动加载 |
|
DingTalkfilling.value.loading = true; |
|
|
|
// 构建数据对象 |
|
const data = { |
|
processNumber, // 钉钉号 |
|
reviewedBy, // 审核人 |
|
auditTime, // 审核时间 |
|
assignList: details.selectionList.map(item => item.id), // ID列表 |
|
}; |
|
let res = await $_updateWorkList(data); |
|
if (res.data.code == 200) { |
|
ElMessage({ |
|
message: res.data.msg, |
|
type: 'success', |
|
}); |
|
// 关闭弹窗和加载 |
|
DingTalkfilling.value.dialogDingTalk = false; |
|
// 更新菜单数据 |
|
updateMenuAndData(); |
|
} |
|
} catch (error) { |
|
console.log(error); |
|
} finally { |
|
DingTalkfilling.value.loading = false; |
|
} |
|
}; |
|
/** |
|
* @description: [财务入账] |
|
* @return {void} |
|
*/ |
|
const Financialfillingbtn = () => { |
|
if (!details.selectionList.length) { |
|
ElMessage({ |
|
message: '请勾选数据', |
|
type: 'warning', |
|
}); |
|
return; |
|
} |
|
// 开启钉钉号填写弹窗 |
|
FinancialFrom.value.loadingFinancial = true; |
|
}; |
|
/** |
|
* @description: [财务入账确定] |
|
* @return {void} |
|
*/ |
|
const FinancialfillingSubmit = async () => { |
|
const { operator, entryTime } = FinancialFrom.value; |
|
try { |
|
FinancialFrom.value.dialog = true; //加载 |
|
const data = { |
|
operator, |
|
entryTime, |
|
ids: details.selectionList.map(item => item.id).join(','), |
|
}; |
|
let res = await $_updateFinanceTime(data); |
|
if (res.data.code == 200) { |
|
ElMessage({ |
|
message: res.data.msg, |
|
type: 'success', |
|
}); |
|
FinancialFrom.value.loadingFinancial = false; |
|
// 更新菜单数据 |
|
updateMenuAndData(); |
|
} |
|
} catch (error) { |
|
} finally { |
|
FinancialFrom.value.loading = false; //关闭加载 |
|
} |
|
}; |
|
/** |
|
* @description: [全部]常工单号,跳转到详情信息页面 |
|
* @param {Object} row - 当前行数据 |
|
* @return {void} |
|
*/ |
|
const ViewDetails0 = row => { |
|
console.log(row, '当前行数据'); |
|
const workOrderInfoPath_Info = '/aftersales/aftersalesWorkOrderInfo'; //跳转路径 |
|
const queryParams = { |
|
id: row.id, //异常工单ID |
|
name: `${row.workOrderNumber}-详情信息`, |
|
workOrderNumber: row.workOrderNumber, //异常工单号 |
|
RouteIndexs: TabPermissions.value, //当前菜单编号 |
|
workOrderStatus: row.workOrderStatus, //工单状态 |
|
}; |
|
$router.push({ path: workOrderInfoPath_Info, query: { ...queryParams } }); |
|
}; |
|
|
|
/** |
|
* @description: [待回复]常工单号,跳转到详情信息页面 |
|
* @param {Object} row - 当前行数据 |
|
* @return {void} |
|
*/ |
|
const ViewDetails8 = row => { |
|
console.log(row, '当前行数据'); |
|
const workOrderInfoPath_end = '/aftersales/aftersalesWorkOrderend'; //跳转路径 |
|
const queryParams = { |
|
id: row.id, //异常工单ID |
|
name: `${row.workOrderNumber}-回复信息`, |
|
workOrderNumber: row.workOrderNumber, //异常工单号 |
|
RouteIndexs: TabPermissions.value, //当前菜单编号 |
|
workOrderStatus: row.workOrderStatus, //工单状态 |
|
}; |
|
$router.push({ path: workOrderInfoPath_end, query: { ...queryParams } }); |
|
}; |
|
/** |
|
* @description: [待回复]常工单号,跳转到详情信息页面 |
|
* @param {Object} row - 当前行数据 |
|
* @return {void} |
|
*/ |
|
const ViewDetails3 = row => { |
|
console.log(row, '【待回复】当前行数据'); |
|
const workOrderInfoPath_end = '/aftersales/aftersalesWorkOrderend'; //跳转路径 |
|
const queryParams = { |
|
id: row.id, //异常工单ID |
|
name: `${row.workOrderNumber}-处理结果`, |
|
workOrderNumber: row.workOrderNumber, //异常工单号 |
|
RouteIndexs: TabPermissions.value, //当前菜单编号 |
|
workOrderStatus: row.workOrderStatus, //工单状态 |
|
}; |
|
$router.push({ path: workOrderInfoPath_end, query: { ...queryParams } }); |
|
}; |
|
/** |
|
* @description: [处理中]常工单号,跳转到详情信息页面 |
|
* @param {Object} row - 当前行数据 |
|
* @return {void} |
|
*/ |
|
const ViewDetails1 = row => { |
|
console.log(row, '【处理中】当前行数据'); |
|
const workOrderInfoPath_end = '/aftersales/aftersalesWorkOrderend'; //跳转路径 |
|
const queryParams = { |
|
id: row.id, //异常工单ID |
|
name: `${row.workOrderNumber}-处理结果`, |
|
workOrderNumber: row.workOrderNumber, //异常工单号 |
|
RouteIndexs: TabPermissions.value, //当前菜单编号 |
|
workOrderStatus: row.workOrderStatus, //工单状态 |
|
}; |
|
$router.push({ path: workOrderInfoPath_end, query: { ...queryParams } }); |
|
}; |
|
/** |
|
* @description: [理赔金额未出]常工单号,跳转到详情信息页面 |
|
* @param {Object} row - 当前行数据 |
|
* @return {void} |
|
*/ |
|
const ViewDetails4 = row => { |
|
console.log(row, '【理赔金额未出】当前行数据'); |
|
const workOrderInfoPath_end = '/aftersales/aftersalesWorkOrderend'; //跳转路径 |
|
const queryParams = { |
|
id: row.lawoId, //理赔金额未出的异常ID |
|
subId: row.laprId, //修改处理结果提交需要的ID |
|
name: `${row.workOrderNumber}-处理结果`, |
|
workOrderNumber: row.workOrderNumber, //异常工单号 |
|
RouteIndexs: TabPermissions.value, //当前菜单编号 |
|
workOrderStatus: row.workOrderStatus, //工单状态 |
|
businessId: row.businessId, //客服仲裁完结需要的ID(后期看情况可以删除) |
|
}; |
|
$router.push({ path: workOrderInfoPath_end, query: { ...queryParams } }); |
|
}; |
|
|
|
/** |
|
* @description: [处理完毕]常工单号,跳转到详情信息页面 |
|
* @param {Object} row - 当前行数据 |
|
* @return {void} |
|
*/ |
|
const ViewDetails2 = row => { |
|
console.log(row, '【处理完毕】当前行数据'); |
|
const workOrderInfoPath_end = '/aftersales/aftersalesWorkOrderend'; //跳转路径 |
|
const queryParams = { |
|
id: row.id, //异常工单ID |
|
name: `${row.workOrderNumber}-处理完毕`, |
|
workOrderNumber: row.workOrderNumber, //异常工单号 |
|
RouteIndexs: TabPermissions.value, //当前菜单编号 |
|
workOrderStatus: row.workOrderStatus, //工单状态 |
|
}; |
|
$router.push({ path: workOrderInfoPath_end, query: { ...queryParams } }); |
|
}; |
|
/** |
|
* @description: [客服介入]常工单号,跳转到详情信息页面 |
|
* @param {Object} row - 当前行数据 |
|
* @return {void} |
|
*/ |
|
const ViewDetails5 = row => { |
|
console.log(row, '【客服介入】当前行数据'); |
|
const workOrderInfoPath_end = '/aftersales/aftersalesWorkOrderend'; //跳转路径 |
|
const queryParams = { |
|
id: row.id, //异常工单ID |
|
name: `${row.workOrderNumber}-客服介入`, |
|
workOrderNumber: row.workOrderNumber, //异常工单号 |
|
RouteIndexs: TabPermissions.value, //当前菜单编号 |
|
workOrderStatus: row.workOrderStatus, //工单状态 |
|
}; |
|
$router.push({ path: workOrderInfoPath_end, query: { ...queryParams } }); |
|
}; |
|
/** |
|
* @description: [待审核]常工单号,跳转到详情信息页面 |
|
* @param {Object} row - 当前行数据 |
|
* @return {void} |
|
*/ |
|
const ViewDetails9 = row => { |
|
console.log(row, '【待审核】当前行数据'); |
|
const workOrderInfoPath_end = '/aftersales/aftersalesWorkOrderend'; //跳转路径 |
|
const queryParams = { |
|
id: row.id, //异常工单ID |
|
name: `${row.workOrderNumber}-待审核`, |
|
workOrderNumber: row.workOrderNumber, //异常工单号 |
|
RouteIndexs: TabPermissions.value, //当前菜单编号 |
|
workOrderStatus: row.workOrderStatus, //工单状态 |
|
}; |
|
$router.push({ path: workOrderInfoPath_end, query: { ...queryParams } }); |
|
}; |
|
/** |
|
* @description: [完结]常工单号,跳转到详情信息页面 |
|
* @param {Object} row - 当前行数据 |
|
* @return {void} |
|
*/ |
|
const ViewDetails6 = row => { |
|
console.log(row, '【完结】当前行数据'); |
|
const workOrderInfoPath_end = '/aftersales/aftersalesWorkOrderend'; //跳转路径 |
|
const queryParams = { |
|
id: row.id, //异常工单ID |
|
name: `${row.workOrderNumber}-完结`, |
|
workOrderNumber: row.workOrderNumber, //异常工单号 |
|
RouteIndexs: TabPermissions.value, //当前菜单编号 |
|
workOrderStatus: row.workOrderStatus, //工单状态 |
|
}; |
|
$router.push({ path: workOrderInfoPath_end, query: { ...queryParams } }); |
|
}; |
|
/** |
|
* @description: [申诉列表]常工单号,跳转到详情信息页面 |
|
* @param {Object} row - 当前行数据 |
|
* @return {void} |
|
*/ |
|
const ViewDetails10 = row => { |
|
console.log(row, '【申诉列表】当前行数据'); |
|
const workOrderInfoPath_end = '/aftersales/aftersalesWorkOrderend'; //跳转路径 |
|
const queryParams = { |
|
id: row.workOrderId, //申诉列表查询需要的ID |
|
workOrderId: row.id, //申诉驳回用的ID |
|
name: `${row.workOrderNumber}-申诉`, |
|
typesOf: row.typesOf, |
|
workOrderNumber: row.workOrderNumber, //异常工单号 |
|
RouteIndexs: TabPermissions.value, //当前菜单编号 |
|
workOrderStatus: row.workOrderStatus, //工单状态 |
|
}; |
|
$router.push({ path: workOrderInfoPath_end, query: { ...queryParams } }); |
|
}; |
|
// 全部异常工单号点击查看 |
|
const ViewDetailsRow = row => { |
|
let tagList = getStore({ name: 'tagList' }); |
|
|
|
console.log(row, '异常工单号点击查看详情当前行数据'); |
|
switch (TabPermissions.value) { |
|
case 0: |
|
ViewDetails0(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderInfo'); |
|
break; |
|
case 1: |
|
ViewDetails1(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 2: |
|
ViewDetails2(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 3: |
|
ViewDetails3(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 4: |
|
ViewDetails4(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 5: |
|
ViewDetails5(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 6: |
|
ViewDetails6(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 8: |
|
ViewDetails8(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 9: |
|
ViewDetails9(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 10: |
|
ViewDetails10(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
default: |
|
break; |
|
} |
|
}; |
|
|
|
/** |
|
* @description: 查看按钮 |
|
* @param {Object} row 当前行数据 |
|
* @return {void} 无返回值 |
|
*/ |
|
const ViewDetails = row => { |
|
console.log(row, '点击查看详情当前行数据'); |
|
switch (TabPermissions.value) { |
|
case 0: |
|
ViewDetails0(row); //全部 |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderInfo'); |
|
break; |
|
case 1: |
|
ViewDetails1(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 2: |
|
ViewDetails2(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 3: |
|
ViewDetails3(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 4: |
|
ViewDetails4(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 5: |
|
ViewDetails5(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 6: |
|
ViewDetails6(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 8: |
|
ViewDetails8(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 9: |
|
ViewDetails9(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
case 10: |
|
ViewDetails10(row); |
|
$useStore.commit('DEL_ONCE_TAG', '/aftersales/aftersalesWorkOrderend'); |
|
break; |
|
default: |
|
break; |
|
} |
|
}; |
|
// 理赔金额未出处理结果确定 |
|
const ResultConfirmed = async row => { |
|
console.log(row); |
|
try { |
|
let _submit = { |
|
assignList: [], |
|
}; |
|
if (row.lawoId) { |
|
// 单个 |
|
_submit.assignList.push(row.lawoId); |
|
} else { |
|
// 批量 |
|
if (!details.selectionList.length) { |
|
ElMessage.warning('请勾选要处理的数据'); |
|
return; |
|
} |
|
_submit.assignList = details.selectionList.map(item => item.lawoId); |
|
} |
|
ElMessageBox.confirm(`是否确认${row.lawoId ? '提交' : '批量提交'}处理结果?`, '提示', { |
|
confirmButtonText: '确定', |
|
cancelButtonText: '取消', |
|
type: 'warning', |
|
}) |
|
.then(async () => { |
|
let _res = await $_updateWorkOrderStatus(_submit); |
|
const { code, msg } = _res.data; |
|
if (code == 200) { |
|
console.log(_res, '理赔金额未出处理结果确定'); |
|
ElMessage.success(msg); |
|
updateMenuAndData(); //获取最新数据 |
|
} |
|
}) |
|
.catch(() => {}); |
|
} catch (e) { |
|
console.log(e); |
|
} finally { |
|
} |
|
}; |
|
/** |
|
* @description: 批量处理结果(打回) |
|
* @return {void} 无返回值 |
|
*/ |
|
const BatchReturnResults = () => { |
|
if (!details.selectionList.length) { |
|
ElMessage({ |
|
message: '请勾选要处理的数据', |
|
type: 'warning', |
|
}); |
|
return; |
|
} |
|
BatchReturn.value.BatchFrom.txt = '' |
|
BatchReturn.value.BatchFrom.businessDepartment = [] |
|
BatchReturn.value.dialogReturn = true; //展开弹窗 |
|
}; |
|
const ConfirmReturn = async () => { |
|
const validateAndProcessReturn = async () => { |
|
try { |
|
const selectedObjs = warehouseData.value.filter(obj => |
|
BatchReturn.value.BatchFrom.businessDepartment.includes(obj.value) |
|
); |
|
|
|
const businessId = selectedObjs.map(item => item.value).join(','); |
|
const businessName = selectedObjs.map(item => item.label).join(','); |
|
const processorList = selectedObjs.map(item => ({ id: item.value, name: item.label })); |
|
const workOrderIds = details.selectionList.map(item => item.id); |
|
|
|
const data = { |
|
businessId, |
|
businessName, |
|
processorList, |
|
reasonReturn: BatchReturn.value.BatchFrom.txt, |
|
workOrderIds, |
|
typesOf: '1', |
|
}; |
|
|
|
console.log(data, '处理好的值'); |
|
|
|
const _res = await $_batchReturn(data); |
|
const { code, msg } = _res.data; |
|
|
|
if (code === 200) { |
|
ElMessage.success(msg); |
|
BatchReturn.value.dialogReturn = false; //关闭弹窗 |
|
updateMenuAndData(); //获取最新数据 |
|
} |
|
} catch (e) { |
|
console.error(e); |
|
} |
|
}; |
|
|
|
batchReturnForm.value.validate(async valid => { |
|
if (valid) { |
|
ElMessageBox.confirm('是否确认批量打回营业部?', '提示', { |
|
confirmButtonText: '确认', |
|
cancelButtonText: '取消', |
|
type: 'warning', |
|
}) |
|
.then(async () => { |
|
await validateAndProcessReturn(); |
|
}) |
|
.catch(() => {}); |
|
} |
|
}); |
|
}; |
|
/** |
|
* @description 工单指派 |
|
* @return {void} 无返回值 |
|
*/ |
|
const WorkOrderAssignment = () => { |
|
// 检查是否选中任何工单 |
|
if (!details.selectionList.length) { |
|
// 提示用户选择数据 |
|
ElMessage({ |
|
message: '请勾选要处理的数据', |
|
type: 'warning', |
|
}); |
|
return; |
|
} |
|
// 初始化指派表单并打开指派弹窗 |
|
assignFrom.value = { ...assignFrom.value, businessDepartment: '', dialogassign: true }; |
|
}; |
|
|
|
/** |
|
* @description 客服介入 |
|
* @return {void} 无返回值 |
|
*/ |
|
const CustomerServiceIntervention = () => { |
|
if (!details.selectionList.length) { |
|
// 提示用户选择数据 |
|
ElMessage({ |
|
message: '请勾选要客服介入的数据', |
|
type: 'warning', |
|
}); |
|
return; |
|
} |
|
CustomerServiceForm.value.loadingCustomer = true; |
|
CustomerServiceForm.value.reasonRemarks = ''; |
|
}; |
|
/** |
|
* @description 客服介入提交 |
|
* @return {void} 无返回值 |
|
*/ |
|
const InterventionSubmission = async () => { |
|
CustomerServiceForm.value.loading = true; |
|
|
|
try { |
|
let data = { |
|
assignList: [], |
|
reasonRemarks: CustomerServiceForm.value.reasonRemarks, //客服介入原因 |
|
}; |
|
data['assignList'] = details.selectionList.map(item => { |
|
return item.id; |
|
}); |
|
let res = await $_arbitrate(data); |
|
const { code, msg } = res.data; |
|
if (code == 200) { |
|
CustomerServiceForm.value.loadingCustomer = false; |
|
updateMenuAndData(); //获取最新数据 |
|
ElMessage({ |
|
message: msg, |
|
type: 'success', |
|
}); |
|
} |
|
} catch (error) { |
|
console.log(error); |
|
} finally { |
|
CustomerServiceForm.value.loading = false; |
|
} |
|
// 处理中,待处理可申请 |
|
}; |
|
/** |
|
* 工单指派确定按钮 |
|
* 1.根据选择的客服ID,名称,和选择的工单ID,将其组装成一个data对象 |
|
* 2.然后调用$_assignCustomerService(data)接口, |
|
* 3.成功后关闭加载,关闭弹窗,重新拉取数据 |
|
*/ |
|
const Assignbutton = async () => { |
|
const WorkOrderAssignmentFunction = async () => { |
|
const assignForm = assignFrom.value; |
|
assignForm.AssignLoad = true; // 开启加载 |
|
|
|
try { |
|
// 筛选选择的工单 |
|
const foundObjs = assignForm.customerService.find( |
|
obj => obj.id == assignForm.businessDepartment |
|
); |
|
|
|
if (!foundObjs) { |
|
console.error('未找到对应的工单信息'); |
|
return; |
|
} |
|
|
|
// 构建请求数据 |
|
const data = { |
|
customerServiceId: foundObjs.id, // 归属客服ID |
|
customerServiceName: foundObjs.realName, // 归属客服名称 |
|
assignList: details.selectionList.map(item => item.id), // 异常工单ID/工单ID |
|
}; |
|
|
|
// 发起请求 |
|
const _res = await $_assignCustomerService(data); |
|
const { code, msg } = _res.data; |
|
|
|
if (code !== 200) { |
|
console.error('分配客服失败:', msg); |
|
return; |
|
} |
|
|
|
// 关闭弹窗 |
|
assignForm.dialogassign = false; |
|
|
|
// 更新当前菜单和请求数据 |
|
updateMenuAndData(); |
|
} catch (error) { |
|
console.error('分配客服时发生错误:', error); |
|
} finally { |
|
assignForm.AssignLoad = false; // 关闭加载 |
|
} |
|
}; |
|
|
|
assignFromForm.value.validate(async valid => { |
|
if (valid) { |
|
ElMessageBox.confirm('是否确认指派该客服?', '提示', { |
|
confirmButtonText: '确认', |
|
cancelButtonText: '取消', |
|
type: 'warning', |
|
}).then(async () => { |
|
await WorkOrderAssignmentFunction(); |
|
}); |
|
} else { |
|
ElMessage.warning('请检查表单是否填写否完整'); |
|
} |
|
}); |
|
}; |
|
/** |
|
* 弹窗多行搜索 |
|
* 1.获取当前选中的客户信息 |
|
* 2.然后根据客户信息,去后台查询对应的客服信息 |
|
* 3.将查询到的客服信息显示在弹窗中 |
|
* 4.然后用户可以选择对应的客服 |
|
* 5.最终将选择的客服信息,分配给对应的工单 |
|
*/ |
|
const MultilineSearch = (title, input) => { |
|
dialogSearchTitle.value = title; |
|
console.log(dialogSearchTitle.value, 'dialogSearchTitle.value'); |
|
|
|
if (input) { |
|
const formattedInput = input.split(',').join('\n'); |
|
TopQuery.value.inputAll = formattedInput; // 赋值给 inputAll |
|
} else { |
|
TopQuery.value.inputAll = ''; |
|
} |
|
|
|
Searchboxpop.value.SearchboxpopUpwindowtitle = title; // 设置标题 |
|
|
|
Searchboxpop.value.dialogSearch = true; // 打开对话框 |
|
}; |
|
/** |
|
* @description dialogSearchSubmit |
|
* 1.获取用户输入的所有数据 |
|
* 2.将其拆分成每一行 |
|
* 3.然后将每一行的前后空格去除 |
|
* 4.然后将所有的行连接起来 |
|
* 5.将连接起来的数据重新赋值给workOrderNumber |
|
* @param {void} 无参数 |
|
* @return {void} 无返回值 |
|
*/ |
|
const dialogSearchSubmit = () => { |
|
// 1.获取用户输入的所有数据 |
|
const inputAll = TopQuery.value.inputAll; |
|
|
|
// 2.将其拆分成每一行 |
|
const lines = inputAll |
|
.split('\n') // 按换行分割 |
|
.map(line => line.trim()) // 移除每一行前后的空格 |
|
.filter(line => line !== ''); // 过滤掉空行 |
|
|
|
// 3.然后将每一行的前后空格去除 |
|
|
|
// 4.然后将所有的行连接起来 |
|
const joinedLines = lines.join(','); // 使用逗号连接,无空格 |
|
|
|
// 5.将连接起来的数据重新赋值给workOrderNumber |
|
|
|
if (dialogSearchTitle.value == '工单号搜索') { |
|
TopQuery.value.workOrderNumbers = joinedLines; |
|
} else if (dialogSearchTitle.value == '订单自编号搜索') { |
|
TopQuery.value.orderCodes = joinedLines; |
|
} |
|
Searchboxpop.value.dialogSearch = false; //关闭弹窗 |
|
|
|
console.log(details.query, 'details.query'); |
|
}; |
|
const ProcessSearch = () => { |
|
const { CreateTiem, workOrderNumbers, orderCodes } = TopQuery.value; |
|
|
|
const queryKeys = ['workOrderNumbers', 'orderCodes']; |
|
queryKeys.forEach(key => { |
|
if (TopQuery.value[key]) { |
|
details.query[key] = TopQuery.value[key]; |
|
} else { |
|
delete details.query[key]; |
|
} |
|
}); |
|
|
|
if (CreateTiem?.length) { |
|
details.query.startCreateTime = dayjs(CreateTiem[0]).format('YYYY-MM-DD HH:mm:ss'); |
|
details.query.endCreateTime = dayjs(CreateTiem[1]).format('YYYY-MM-DD HH:mm:ss'); |
|
delete details.query.CreateTiem; |
|
} |
|
|
|
console.log(TopQuery.value, 'TopQuery.value'); |
|
console.log(details.query, 'details.query'); |
|
|
|
delete details.query.inputAll; |
|
}; |
|
// 关闭 |
|
const close = () => { |
|
Searchboxpop.value.dialogSearch = false; //关闭弹窗 |
|
Searchboxpop.value.MinimizeState = false; //销毁最小化 |
|
}; |
|
// 最大化 |
|
const maximize = () => { |
|
Searchboxpop.value.fullscreen = !Searchboxpop.value.fullscreen; //最大化 |
|
}; |
|
|
|
// 最小化 |
|
const minimize = () => { |
|
Searchboxpop.value.dialogSearch = false; //关闭弹窗 |
|
Searchboxpop.value.MinimizeState = true; //最小化 |
|
}; |
|
const ExpandWindow = () => { |
|
Searchboxpop.value.dialogSearch = true; //回复窗口弹窗 |
|
Searchboxpop.value.MinimizeState = false; //销毁最小化 |
|
}; |
|
const DestroyWindow = () => { |
|
Searchboxpop.value.MinimizeState = false; //销毁最小化 |
|
}; |
|
// 导出选择弹出 |
|
const ExportSelection = () => { |
|
ExportObjects.value.ExportSelection = true; |
|
}; |
|
/** |
|
*获取当前时间 |
|
*/ |
|
const getCurrentTime = () => { |
|
const currentDate = new Date(); |
|
const formattedDate = `${currentDate.getFullYear()}${(currentDate.getMonth() + 1) |
|
.toString() |
|
.padStart(2, '0')}${currentDate.getDate().toString().padStart(2, '0')}${currentDate |
|
.getHours() |
|
.toString() |
|
.padStart(2, '0')}${currentDate.getMinutes().toString().padStart(2, '0')}${currentDate |
|
.getSeconds() |
|
.toString() |
|
.padStart(2, '0')}`; |
|
return formattedDate; |
|
}; |
|
// 导出表格 |
|
const exportReport = () => { |
|
if(!details.query.startCreateTime || !details.query.endCreateTime){ |
|
ElMessage.warning('请搜索创建日期'); |
|
return |
|
} |
|
ElMessageBox.confirm('是否确认导出数据?', { |
|
confirmButtonText: '确定', |
|
cancelButtonText: '取消', |
|
type: 'warning', |
|
}) |
|
.then(() => { |
|
PageLoading.value = true; |
|
const dataID = { |
|
workOrderStatus: workOrderStatus.value, |
|
ids: details.selectionList.length |
|
? details.selectionList.map(item => item.id).join(',') |
|
: undefined, |
|
...details.query, |
|
}; |
|
|
|
switch (TabPermissions.value) { |
|
case 0: |
|
exportData(dataID, '导出全部工单数据'); |
|
break; |
|
case 1: |
|
exportData(dataID, '导出处理中工单数据'); |
|
break; |
|
case 2: |
|
exportData(dataID, '导出处理完毕工单数据'); |
|
break; |
|
case 4: |
|
exportData(dataID, '导出理赔金额工单数据'); |
|
break; |
|
case 6: |
|
exportData(dataID, '导出完结工单数据'); |
|
break; |
|
default: |
|
exportData(dataID, '导出全部工单数据'); |
|
break; |
|
} |
|
}) |
|
.catch(() => {}); |
|
}; |
|
/** |
|
*导出数据 |
|
*/ |
|
|
|
const exportData = async (dataID, fileNamePrefix) => { |
|
const exportFunctionMap = { |
|
0: $_exportWorkOrder0, |
|
1: $_exportWorkOrder1, |
|
2: $_exportWorkOrder3, |
|
4: $_exportWorkOrder2, |
|
6: $_exportWorkOrder4, |
|
}; |
|
|
|
try { |
|
const exportFunction = exportFunctionMap[TabPermissions.value] || $_exportWorkOrder0; |
|
const res = await exportFunction(dataID); |
|
downloadXls(res.data, `${fileNamePrefix}${getCurrentTime()}.xlsx`); |
|
ExportObjects.value.ExportSelection = false; |
|
ElMessage.success('导出成功'); |
|
} catch (e) { |
|
console.log(e); |
|
} finally { |
|
PageLoading.value = false; |
|
} |
|
}; |
|
|
|
// 更新本地导出显示状态 |
|
const updateTcTableexport = newValue => { |
|
ExportObjects.value.tcTableexport = newValue; |
|
}; |
|
// 本地导出 |
|
const LocalExport = () => { |
|
ExportObjects.value.tcTableexport = true; |
|
ExportObjects.value.ExportSelection = false; |
|
}; |
|
// 网络导出 |
|
const NetworkExport = () => { |
|
exportReport(); |
|
}; |
|
|
|
// 旧版本导出 |
|
|
|
const JExportAll = async dataID => { |
|
try { |
|
PageLoading.value = true; |
|
let res = await $_exportAftersalesWorkOrder(dataID); |
|
downloadXls(res.data, `导出工单数据${getCurrentTime()}.xlsx`); |
|
PageLoading.value = false; |
|
} catch (e) { |
|
console.log(e); |
|
} finally { |
|
} |
|
}; |
|
</script> |
|
|
|
<style scoped lang="scss"> |
|
:deep(.el-card) { |
|
height: 100%; |
|
} |
|
:deep(.el-card__body) { |
|
height: 100%; |
|
display: flex; |
|
flex-direction: column; |
|
padding: 0 !important; |
|
} |
|
.el-fy { |
|
flex: 1; |
|
display: flex; |
|
align-items: flex-end; |
|
} |
|
.avue-crud { |
|
height: 100%; |
|
display: flex; |
|
flex-direction: column; |
|
} |
|
:deep(.el_tabs) { |
|
.el-tabs__item { |
|
font-family: '黑体'; |
|
border-right: 1px dashed #00000014; |
|
} |
|
.is-active { |
|
font-family: '黑体'; |
|
font-weight: bold; |
|
} |
|
.el-tabs__content { |
|
display: none; |
|
} |
|
} |
|
.avue-crud__header { |
|
min-height: initial; |
|
margin: 4px 0; |
|
padding: 0 4px; |
|
} |
|
.avue-crud__left { |
|
.el-button { |
|
border-radius: 2px; |
|
} |
|
} |
|
:deep(.el_appeal) { |
|
.el-form-item { |
|
flex-direction: column; |
|
align-items: flex-start; |
|
.el-form-item__label { |
|
position: relative; |
|
} |
|
.el-form-item__content { |
|
width: 100% !important; |
|
} |
|
} |
|
.el_sdialog-footer { |
|
width: 100%; |
|
display: flex; |
|
justify-content: flex-end; |
|
} |
|
} |
|
:deep(.plAllret) { |
|
height: 40%; |
|
display: flex; |
|
flex-direction: column; |
|
.el-select { |
|
width: 100%; |
|
} |
|
.el-dialog__footer { |
|
display: flex; |
|
flex: 1; |
|
align-items: flex-end; |
|
justify-content: flex-end; |
|
} |
|
} |
|
:deep(.el_Customer) { |
|
.el-form-item { |
|
flex-direction: column; |
|
} |
|
} |
|
:deep(.el-fr-d) { |
|
display: flex; |
|
.el-form-item { |
|
width: 22%; |
|
margin: 0; |
|
margin: 10px; |
|
} |
|
.el_div_input { |
|
width: 100%; |
|
display: flex; |
|
align-items: center; |
|
.el_dy_icon { |
|
font-size: 1.5em; |
|
} |
|
} |
|
.el-form-item { |
|
} |
|
} |
|
:deep(.Searchboxpop-upwindow) { |
|
.el-overlay { |
|
position: absolute; |
|
|
|
.el-dialog { |
|
min-height: 70%; |
|
} |
|
.el-overlay-dialog { |
|
position: absolute; |
|
} |
|
.el-dialog__header { |
|
display: flex; |
|
justify-content: space-between; |
|
.title { |
|
position: relative; |
|
padding: 0 10px; |
|
} |
|
.title::after { |
|
content: '*'; |
|
color: #172e60; |
|
position: absolute; |
|
font-size: 20px; |
|
top: 0; |
|
left: 0; |
|
} |
|
.div_icon { |
|
width: 100px; |
|
display: flex; |
|
justify-content: space-between; |
|
font-size: 19px; |
|
cursor: pointer; |
|
} |
|
} |
|
|
|
.el-dialog__footer { |
|
display: flex; |
|
justify-content: center; |
|
padding: 6px; |
|
.el-button { |
|
width: 160px; |
|
height: 35px; |
|
} |
|
} |
|
} |
|
} |
|
.minimize_windows { |
|
width: 200px; |
|
height: 49px; |
|
border: 1px solid #cccccc82; |
|
position: absolute; |
|
bottom: 1px; |
|
left: 10px; |
|
box-shadow: 2px -1px 0.15625vw #c1c1c187; |
|
display: flex; |
|
align-items: center; |
|
justify-content: space-around; |
|
.title { |
|
height: 100%; |
|
display: flex; |
|
align-items: center; |
|
span { |
|
font-size: 16px; |
|
} |
|
} |
|
span { |
|
font-size: 14px; |
|
} |
|
.div_icon { |
|
display: flex; |
|
align-items: center; |
|
width: 54px; |
|
justify-content: space-between; |
|
font-size: 20px; |
|
} |
|
} |
|
:deep(.el_exportSelection) { |
|
width: 30%; |
|
height: 150px; |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
flex-direction: column; |
|
.el_title_a, |
|
.el_title_b { |
|
position: relative; |
|
} |
|
.el_title_a::after { |
|
content: '导出全部数据【如果存在“ 勾选 ”数据则默认导出“ 勾选 ”数据】'; |
|
position: absolute; |
|
color: #ff0000; |
|
border: 1px solid #ff0000; |
|
border-top: none; |
|
padding: 4px; |
|
border-radius: 22px; |
|
top: -40px; |
|
left: -50%; |
|
} |
|
.el_title_a::before { |
|
content: '▼'; |
|
position: absolute; |
|
color: #ff0000; |
|
top: -18px; |
|
left: 80px; |
|
} |
|
.el_title_b::after { |
|
content: '目前只支持导出 " 当前页面 " 不会卡顿,速度很快'; |
|
position: absolute; |
|
color: #ff0000; |
|
border: 1px solid #ff0000; |
|
border-bottom: none; |
|
padding: 4px; |
|
border-radius: 10px; |
|
bottom: -40px; |
|
right: -50%; |
|
} |
|
.el_title_b::before { |
|
content: '▲'; |
|
position: absolute; |
|
color: #ff0000; |
|
bottom: -18px; |
|
left: 80px; |
|
} |
|
.el-dialog__body { |
|
width: 100%; |
|
height: 44%; |
|
display: flex; |
|
align-items: center; |
|
justify-content: space-evenly; |
|
border-radius: 12px; |
|
.el-button { |
|
width: 30%; |
|
height: 100%; |
|
} |
|
} |
|
} |
|
|
|
// 钉钉号 |
|
:deep(.el_DingTalk) { |
|
.el-form-item { |
|
flex-direction: column; |
|
.el-form-item__label { |
|
justify-content: flex-start; |
|
} |
|
.el-form-item__content { |
|
.el-input { |
|
width: 100%; |
|
} |
|
} |
|
} |
|
} |
|
</style>
|
|
|